source: trunk/third/openssh/channels.h @ 22570

Revision 22570, 8.8 KB checked in by ghudson, 17 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r22569, which included commits to RCS files with non-trunk default branches.
Line 
1/*      $OpenBSD: channels.h,v 1.79 2005/07/17 06:49:04 djm Exp $       */
2
3/*
4 * Author: Tatu Ylonen <ylo@cs.hut.fi>
5 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
6 *                    All rights reserved
7 *
8 * As far as I am concerned, the code I have written for this software
9 * can be used freely for any purpose.  Any derived versions of this
10 * software must be clearly marked as such, and if the derived work is
11 * incompatible with the protocol description in the RFC file, it must be
12 * called by a name other than "ssh" or "Secure Shell".
13 */
14/*
15 * Copyright (c) 1999, 2000, 2001, 2002 Markus Friedl.  All rights reserved.
16 *
17 * Redistribution and use in source and binary forms, with or without
18 * modification, are permitted provided that the following conditions
19 * are met:
20 * 1. Redistributions of source code must retain the above copyright
21 *    notice, this list of conditions and the following disclaimer.
22 * 2. Redistributions in binary form must reproduce the above copyright
23 *    notice, this list of conditions and the following disclaimer in the
24 *    documentation and/or other materials provided with the distribution.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
27 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
28 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
29 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
30 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
31 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
35 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 */
37
38#ifndef CHANNEL_H
39#define CHANNEL_H
40
41#include "buffer.h"
42
43/* Definitions for channel types. */
44#define SSH_CHANNEL_X11_LISTENER        1       /* Listening for inet X11 conn. */
45#define SSH_CHANNEL_PORT_LISTENER       2       /* Listening on a port. */
46#define SSH_CHANNEL_OPENING             3       /* waiting for confirmation */
47#define SSH_CHANNEL_OPEN                4       /* normal open two-way channel */
48#define SSH_CHANNEL_CLOSED              5       /* waiting for close confirmation */
49#define SSH_CHANNEL_AUTH_SOCKET         6       /* authentication socket */
50#define SSH_CHANNEL_X11_OPEN            7       /* reading first X11 packet */
51#define SSH_CHANNEL_INPUT_DRAINING      8       /* sending remaining data to conn */
52#define SSH_CHANNEL_OUTPUT_DRAINING     9       /* sending remaining data to app */
53#define SSH_CHANNEL_LARVAL              10      /* larval session */
54#define SSH_CHANNEL_RPORT_LISTENER      11      /* Listening to a R-style port  */
55#define SSH_CHANNEL_CONNECTING          12
56#define SSH_CHANNEL_DYNAMIC             13
57#define SSH_CHANNEL_ZOMBIE              14      /* Almost dead. */
58#define SSH_CHANNEL_MAX_TYPE            15
59
60#define SSH_CHANNEL_PATH_LEN            256
61
62struct Channel;
63typedef struct Channel Channel;
64
65typedef void channel_callback_fn(int, void *);
66typedef int channel_filter_fn(struct Channel *, char *, int);
67
68struct Channel {
69        int     type;           /* channel type/state */
70        int     self;           /* my own channel identifier */
71        int     remote_id;      /* channel identifier for remote peer */
72        u_int   istate;         /* input from channel (state of receive half) */
73        u_int   ostate;         /* output to channel  (state of transmit half) */
74        int     flags;          /* close sent/rcvd */
75        int     rfd;            /* read fd */
76        int     wfd;            /* write fd */
77        int     efd;            /* extended fd */
78        int     sock;           /* sock fd */
79        int     ctl_fd;         /* control fd (client sharing) */
80        int     isatty;         /* rfd is a tty */
81        int     wfd_isatty;     /* wfd is a tty */
82        int     client_tty;     /* (client) TTY has been requested */
83        int     force_drain;    /* force close on iEOF */
84        int     delayed;                /* fdset hack */
85        Buffer  input;          /* data read from socket, to be sent over
86                                 * encrypted connection */
87        Buffer  output;         /* data received over encrypted connection for
88                                 * send on socket */
89        Buffer  extended;
90        char    path[SSH_CHANNEL_PATH_LEN];
91                /* path for unix domain sockets, or host name for forwards */
92        int     listening_port; /* port being listened for forwards */
93        int     host_port;      /* remote port to connect for forwards */
94        char   *remote_name;    /* remote hostname */
95
96        u_int   remote_window;
97        u_int   remote_maxpacket;
98        u_int   local_window;
99        u_int   local_window_max;
100        u_int   local_consumed;
101        u_int   local_maxpacket;
102        int     extended_usage;
103        int     single_connection;
104
105        char   *ctype;          /* type */
106
107        /* callback */
108        channel_callback_fn     *confirm;
109        channel_callback_fn     *detach_user;
110        void                    *confirm_ctx;
111
112        /* filter */
113        channel_filter_fn       *input_filter;
114};
115
116#define CHAN_EXTENDED_IGNORE            0
117#define CHAN_EXTENDED_READ              1
118#define CHAN_EXTENDED_WRITE             2
119
120/* default window/packet sizes for tcp/x11-fwd-channel */
121#define CHAN_SES_PACKET_DEFAULT (32*1024)
122#define CHAN_SES_WINDOW_DEFAULT (4*CHAN_SES_PACKET_DEFAULT)
123#define CHAN_TCP_PACKET_DEFAULT (32*1024)
124#define CHAN_TCP_WINDOW_DEFAULT (4*CHAN_TCP_PACKET_DEFAULT)
125#define CHAN_X11_PACKET_DEFAULT (16*1024)
126#define CHAN_X11_WINDOW_DEFAULT (4*CHAN_X11_PACKET_DEFAULT)
127
128/* possible input states */
129#define CHAN_INPUT_OPEN                 0
130#define CHAN_INPUT_WAIT_DRAIN           1
131#define CHAN_INPUT_WAIT_OCLOSE          2
132#define CHAN_INPUT_CLOSED               3
133
134/* possible output states */
135#define CHAN_OUTPUT_OPEN                0
136#define CHAN_OUTPUT_WAIT_DRAIN          1
137#define CHAN_OUTPUT_WAIT_IEOF           2
138#define CHAN_OUTPUT_CLOSED              3
139
140#define CHAN_CLOSE_SENT                 0x01
141#define CHAN_CLOSE_RCVD                 0x02
142#define CHAN_EOF_SENT                   0x04
143#define CHAN_EOF_RCVD                   0x08
144
145/* check whether 'efd' is still in use */
146#define CHANNEL_EFD_INPUT_ACTIVE(c) \
147        (compat20 && c->extended_usage == CHAN_EXTENDED_READ && \
148        (c->efd != -1 || \
149        buffer_len(&c->extended) > 0))
150#define CHANNEL_EFD_OUTPUT_ACTIVE(c) \
151        (compat20 && c->extended_usage == CHAN_EXTENDED_WRITE && \
152        c->efd != -1 && (!(c->flags & (CHAN_EOF_RCVD|CHAN_CLOSE_RCVD)) || \
153        buffer_len(&c->extended) > 0))
154
155/* channel management */
156
157Channel *channel_lookup(int);
158Channel *channel_new(char *, int, int, int, int, u_int, u_int, int, char *, int);
159void     channel_set_fds(int, int, int, int, int, int, u_int);
160void     channel_free(Channel *);
161void     channel_free_all(void);
162void     channel_stop_listening(void);
163
164void     channel_send_open(int);
165void     channel_request_start(int, char *, int);
166void     channel_register_cleanup(int, channel_callback_fn *);
167void     channel_register_confirm(int, channel_callback_fn *, void *);
168void     channel_register_filter(int, channel_filter_fn *);
169void     channel_cancel_cleanup(int);
170int      channel_close_fd(int *);
171void     channel_send_window_changes(void);
172
173/* protocol handler */
174
175void     channel_input_close(int, u_int32_t, void *);
176void     channel_input_close_confirmation(int, u_int32_t, void *);
177void     channel_input_data(int, u_int32_t, void *);
178void     channel_input_extended_data(int, u_int32_t, void *);
179void     channel_input_ieof(int, u_int32_t, void *);
180void     channel_input_oclose(int, u_int32_t, void *);
181void     channel_input_open_confirmation(int, u_int32_t, void *);
182void     channel_input_open_failure(int, u_int32_t, void *);
183void     channel_input_port_open(int, u_int32_t, void *);
184void     channel_input_window_adjust(int, u_int32_t, void *);
185
186/* file descriptor handling (read/write) */
187
188void     channel_prepare_select(fd_set **, fd_set **, int *, u_int*, int);
189void     channel_after_select(fd_set *, fd_set *);
190void     channel_output_poll(void);
191
192int      channel_not_very_much_buffered_data(void);
193void     channel_close_all(void);
194int      channel_still_open(void);
195char    *channel_open_message(void);
196int      channel_find_open(void);
197
198/* tcp forwarding */
199void     channel_set_af(int af);
200void     channel_permit_all_opens(void);
201void     channel_add_permitted_opens(char *, int);
202void     channel_clear_permitted_opens(void);
203void     channel_input_port_forward_request(int, int);
204int      channel_connect_to(const char *, u_short);
205int      channel_connect_by_listen_address(u_short);
206void     channel_request_remote_forwarding(const char *, u_short,
207             const char *, u_short);
208int      channel_setup_local_fwd_listener(const char *, u_short,
209             const char *, u_short, int);
210void     channel_request_rforward_cancel(const char *host, u_short port);
211int      channel_setup_remote_fwd_listener(const char *, u_short, int);
212int      channel_cancel_rport_listener(const char *, u_short);
213
214/* x11 forwarding */
215
216int      x11_connect_display(void);
217int      x11_create_display_inet(int, int, int, u_int *, int **);
218void     x11_input_open(int, u_int32_t, void *);
219void     x11_request_forwarding_with_spoofing(int, const char *, const char *,
220            const char *);
221void     deny_input_open(int, u_int32_t, void *);
222
223/* agent forwarding */
224
225void     auth_request_forwarding(void);
226
227/* channel close */
228
229int      chan_is_dead(Channel *, int);
230void     chan_mark_dead(Channel *);
231
232/* channel events */
233
234void     chan_rcvd_oclose(Channel *);
235void     chan_read_failed(Channel *);
236void     chan_ibuf_empty(Channel *);
237
238void     chan_rcvd_ieof(Channel *);
239void     chan_write_failed(Channel *);
240void     chan_obuf_empty(Channel *);
241
242#endif
Note: See TracBrowser for help on using the repository browser.