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

Revision 18759, 8.5 KB checked in by zacheiss, 22 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r18758, which included commits to RCS files with non-trunk default branches.
Line 
1/*      $OpenBSD: channels.h,v 1.70 2002/06/24 14:33:27 markus 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     isatty;         /* rfd is a tty */
80        int     wfd_isatty;     /* wfd is a tty */
81        int     force_drain;    /* force close on iEOF */
82        int     delayed;                /* fdset hack */
83        Buffer  input;          /* data read from socket, to be sent over
84                                 * encrypted connection */
85        Buffer  output;         /* data received over encrypted connection for
86                                 * send on socket */
87        Buffer  extended;
88        char    path[SSH_CHANNEL_PATH_LEN];
89                /* path for unix domain sockets, or host name for forwards */
90        int     listening_port; /* port being listened for forwards */
91        int     host_port;      /* remote port to connect for forwards */
92        char   *remote_name;    /* remote hostname */
93
94        u_int   remote_window;
95        u_int   remote_maxpacket;
96        u_int   local_window;
97        u_int   local_window_max;
98        u_int   local_consumed;
99        u_int   local_maxpacket;
100        int     extended_usage;
101        int     single_connection;
102
103        char   *ctype;          /* type */
104
105        /* callback */
106        channel_callback_fn     *confirm;
107        channel_callback_fn     *detach_user;
108
109        /* filter */
110        channel_filter_fn       *input_filter;
111};
112
113#define CHAN_EXTENDED_IGNORE            0
114#define CHAN_EXTENDED_READ              1
115#define CHAN_EXTENDED_WRITE             2
116
117/* default window/packet sizes for tcp/x11-fwd-channel */
118#define CHAN_SES_PACKET_DEFAULT (32*1024)
119#define CHAN_SES_WINDOW_DEFAULT (4*CHAN_SES_PACKET_DEFAULT)
120#define CHAN_TCP_PACKET_DEFAULT (32*1024)
121#define CHAN_TCP_WINDOW_DEFAULT (4*CHAN_TCP_PACKET_DEFAULT)
122#define CHAN_X11_PACKET_DEFAULT (16*1024)
123#define CHAN_X11_WINDOW_DEFAULT (4*CHAN_X11_PACKET_DEFAULT)
124
125/* possible input states */
126#define CHAN_INPUT_OPEN                 0
127#define CHAN_INPUT_WAIT_DRAIN           1
128#define CHAN_INPUT_WAIT_OCLOSE          2
129#define CHAN_INPUT_CLOSED               3
130
131/* possible output states */
132#define CHAN_OUTPUT_OPEN                0
133#define CHAN_OUTPUT_WAIT_DRAIN          1
134#define CHAN_OUTPUT_WAIT_IEOF           2
135#define CHAN_OUTPUT_CLOSED              3
136
137#define CHAN_CLOSE_SENT                 0x01
138#define CHAN_CLOSE_RCVD                 0x02
139#define CHAN_EOF_SENT                   0x04
140#define CHAN_EOF_RCVD                   0x08
141
142/* check whether 'efd' is still in use */
143#define CHANNEL_EFD_INPUT_ACTIVE(c) \
144        (compat20 && c->extended_usage == CHAN_EXTENDED_READ && \
145        (c->efd != -1 || \
146        buffer_len(&c->extended) > 0))
147#define CHANNEL_EFD_OUTPUT_ACTIVE(c) \
148        (compat20 && c->extended_usage == CHAN_EXTENDED_WRITE && \
149        ((c->efd != -1 && !(c->flags & (CHAN_EOF_RCVD|CHAN_CLOSE_RCVD))) || \
150        buffer_len(&c->extended) > 0))
151
152/* channel management */
153
154Channel *channel_lookup(int);
155Channel *channel_new(char *, int, int, int, int, u_int, u_int, int, char *, int);
156void     channel_set_fds(int, int, int, int, int, int, u_int);
157void     channel_free(Channel *);
158void     channel_free_all(void);
159void     channel_stop_listening(void);
160
161void     channel_send_open(int);
162void     channel_request_start(int, char *, int);
163void     channel_register_cleanup(int, channel_callback_fn *);
164void     channel_register_confirm(int, channel_callback_fn *);
165void     channel_register_filter(int, channel_filter_fn *);
166void     channel_cancel_cleanup(int);
167int      channel_close_fd(int *);
168
169/* protocol handler */
170
171void     channel_input_close(int, u_int32_t, void *);
172void     channel_input_close_confirmation(int, u_int32_t, void *);
173void     channel_input_data(int, u_int32_t, void *);
174void     channel_input_extended_data(int, u_int32_t, void *);
175void     channel_input_ieof(int, u_int32_t, void *);
176void     channel_input_oclose(int, u_int32_t, void *);
177void     channel_input_open_confirmation(int, u_int32_t, void *);
178void     channel_input_open_failure(int, u_int32_t, void *);
179void     channel_input_port_open(int, u_int32_t, void *);
180void     channel_input_window_adjust(int, u_int32_t, void *);
181
182/* file descriptor handling (read/write) */
183
184void     channel_prepare_select(fd_set **, fd_set **, int *, int*, int);
185void     channel_after_select(fd_set *, fd_set *);
186void     channel_output_poll(void);
187
188int      channel_not_very_much_buffered_data(void);
189void     channel_close_all(void);
190int      channel_still_open(void);
191char    *channel_open_message(void);
192int      channel_find_open(void);
193
194/* tcp forwarding */
195void     channel_set_af(int af);
196void     channel_permit_all_opens(void);
197void     channel_add_permitted_opens(char *, int);
198void     channel_clear_permitted_opens(void);
199void     channel_input_port_forward_request(int, int);
200int      channel_connect_to(const char *, u_short);
201int      channel_connect_by_listen_address(u_short);
202void     channel_request_remote_forwarding(u_short, const char *, u_short);
203int      channel_setup_local_fwd_listener(u_short, const char *, u_short, int);
204int      channel_setup_remote_fwd_listener(const char *, u_short, int);
205
206/* x11 forwarding */
207
208int      x11_connect_display(void);
209int      x11_create_display_inet(int, int, int, u_int *);
210void     x11_input_open(int, u_int32_t, void *);
211void     x11_request_forwarding_with_spoofing(int, const char *, const char *);
212void     deny_input_open(int, u_int32_t, void *);
213
214/* agent forwarding */
215
216void     auth_request_forwarding(void);
217void     auth_input_open_request(int, u_int32_t, void *);
218
219/* channel close */
220
221int      chan_is_dead(Channel *, int);
222void     chan_mark_dead(Channel *);
223
224/* channel events */
225
226void     chan_rcvd_oclose(Channel *);
227void     chan_read_failed(Channel *);
228void     chan_ibuf_empty(Channel *);
229
230void     chan_rcvd_ieof(Channel *);
231void     chan_write_failed(Channel *);
232void     chan_obuf_empty(Channel *);
233
234#endif
Note: See TracBrowser for help on using the repository browser.