channel.h 10.3 KB
Newer Older
Niels Möller's avatar
Niels Möller committed
1
2
/* channel.h
 *
3
4
5
 * Information about ssh channels.
 *
 * $Id$
Niels Möller's avatar
Niels Möller committed
6
7
 */

Niels Möller's avatar
Niels Möller committed
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/* lsh, an implementation of the ssh protocol
 *
 * Copyright (C) 1998 Niels Möller
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

Niels Möller's avatar
Niels Möller committed
27
28
29
#ifndef LSH_CHANNEL_H_INCLUDED
#define LSH_CHANNEL_H_INCLUDED

Niels Möller's avatar
Niels Möller committed
30
#include "alist.h"
31
#include "command.h"
Niels Möller's avatar
Niels Möller committed
32
33
#include "connection.h"
#include "parse.h"
Niels Möller's avatar
Niels Möller committed
34
#include "server_pty.h"
Niels Möller's avatar
Niels Möller committed
35

36
#define GABA_DECLARE
37
#include "channel.h.x"
38
#undef GABA_DECLARE
39

Niels Möller's avatar
Niels Möller committed
40
41
42
43
44
45
46
47
/* Channels are indexed by local channel number in some array. This
 * index is not stored in the channel struct. When sending messages on
 * the channel, it is identified by the *remote* sides index number,
 * and this number must be stored. */

#define CHANNEL_DATA 0
#define CHANNEL_STDERR_DATA 1

48
#define CHANNEL_SENT_CLOSE 1
49
#define CHANNEL_RECEIVED_CLOSE 2
50
#define CHANNEL_SENT_EOF 4
51
#define CHANNEL_RECEIVED_EOF 8
52

53
/* Means that we should send close when we have both sent and received EOF. */
54
#define CHANNEL_CLOSE_AT_EOF 0x10
55

56

57
/* GABA:
58
59
   (class
     (name ssh_channel)
60
     (super flow_controlled)
61
62
     (vars
       ; Remote channel number 
Niels Möller's avatar
Niels Möller committed
63
       (channel_number . UINT32)
64

Niels Möller's avatar
Niels Möller committed
65
66
67
68
69
70
71
       ; Somewhat redundant. Makes it easier to locate
       ; the channel_table entry for the channel, which
       ; is needed for deallocating it.
       ;; (local_number . UINT32)
       
       ; Where to pass errors
       (e object exception_handler)
72
73
74
75

       ; Resources associated with the channel. This object is also
       ; put onto the connections resource list.
       (resources object resource_list)
Niels Möller's avatar
Niels Möller committed
76
       
77
       ; We try to keep the rec_window_size between max_window / 2
78
79
80
81
82
83
84
85
86
87
88
       ; and max_window.
       (max_window simple UINT32)       

       (rec_window_size simple UINT32)
       (rec_max_packet simple UINT32)

       (send_window_size simple UINT32)
       (send_max_packet simple UINT32)

       ; FIXME: Perhaps this should be moved to the channel_table, and
       ; a pointer to that table be stored here instead?
89
90
       ; Now that we pass the connection pointer to most functions,
       ; is this field needed at all?
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
       (write object abstract_write)
  
       (request_types object alist)

       (flags simple int)

       ; Number of files connected to this channel. For instance,
       ; stdout and stderr can be multiplexed on the same channel. We
       ; should not close the channel until we have got an EOF on both
       ; sources.
       (sources simple int)

       ; FIXME: What about return values from these functions? A
       ; channel may fail to process it's data. Is there some way to
       ; propagate a channel broken message to the other end? 

       ; Type is CHANNEL_DATA or CHANNEL_STDERR_DATA
Niels Möller's avatar
Niels Möller committed
108
       (receive method void "int type" "struct lsh_string *data")
109
110

       ; Called when we are allowed to send data on the channel. 
111
       (send method void "struct ssh_connection *connection")
112

Niels Möller's avatar
Niels Möller committed
113
114
       ; Called when the channel is closed
       ; FIXME: Is this needed for anything?
Niels Möller's avatar
Niels Möller committed
115
       (close method void)
116

117
       ; Called when eof is received on the channel (or when it is
118
       ; closed, whatever happens first).
Niels Möller's avatar
Niels Möller committed
119
       (eof method void)
120
121
  
       ; Reply from SSH_MSG_CHANNEL_OPEN_REQUEST
122
123
124
       ;; (open_confirm method int)
       ;; (open_failure method int)
       (open_continuation object command_continuation)
125

126
       ; Queue of channel requests that we expect replies on
127
128
       (pending_requests struct object_queue)))
       
129
       ; Reply from SSH_MSG_CHANNEL_REQUEST 
130
131
132
       ;; (channel_success method int)
       ;; (channel_failure method int)))
*/
133

134
135
#define CHANNEL_RECEIVE(s, t, d) \
((s)->receive((s), (t), (d)))
Niels Möller's avatar
Niels Möller committed
136

137
#define CHANNEL_SEND(s, c) ((s)->send((s), (c)))
138
139
140
     
#define CHANNEL_CLOSE(s) \
((s)->close((s)))
Niels Möller's avatar
Niels Möller committed
141

142
143
#define CHANNEL_EOF(s) \
((s)->eof((s)))
Niels Möller's avatar
Niels Möller committed
144

145
146
#define CHANNEL_OPEN_CONFIRM(s) \
((s)->open_confirm((s)))
147

148
149
#define CHANNEL_OPEN_FAILURE(s) \
((s)->open_failure((s)))
Niels Möller's avatar
Niels Möller committed
150

151
/* GABA:
152
153
   (class
     (name channel_table)
Niels Möller's avatar
Niels Möller committed
154
     ;; (super exception_handler)
155
156
157
158
159
160
161
     (vars
       ; FIXME: This is relevant only for the server side. It's
       ; probably better to store this in the connection struct.

       ;; uid_t user;  ; Authenticated user 

       ; Channels are indexed by local number
Niels Möller's avatar
Niels Möller committed
162
163
       (channels space (object ssh_channel) used_channels)
       
164
165
166
167
168
       ; Global requests that we support
       (global_requests object alist)
       ; Channel types that we can open
       (channel_types object alist)
       
169
170
171
172
       ; Allocation of local channel numbers is managed using the same
       ; method as is traditionally used for allocation of unix file 
       ; descriptors.

Niels Möller's avatar
Niels Möller committed
173
174
175
176
177
       ; Channel numbers can be reserved before there is any actual channel
       ; assigned to them. So the channels table is not enough for keeping track of which
       ; numbers are in use.
       (in_use space UINT8)
       
178
179
180
181
182
183
       (allocated_channels simple UINT32)
       (next_channel simple UINT32)
     
       (used_channels simple UINT32)
       (max_channels simple UINT32) ; Max number of channels allowed 

184
185
186
187
       ; Forwarded TCP ports
       (local_ports struct object_queue)
       (remote_ports struct object_queue)
       
188
189
       ; Global requests that we have received, and should reply to
       ; in the right order
190
       (active_global_requests struct object_queue)
191
192

       ; Queue of global requests that we expect replies on.
193
       (pending_global_requests struct object_queue)
194
       
195
196
197
198
199
200
201
202
       ; If non-zero, close connection after all active channels have
       ; died.
       (pending_close simple int)

       ; FIXME: Perhaps we should use an flag to indicate whether or
       ; not new channels can be opened?
       ))
*/
Niels Möller's avatar
Niels Möller committed
203

Niels Möller's avatar
Niels Möller committed
204

Niels Möller's avatar
Niels Möller committed
205
/* SSH_MSG_GLOBAL_REQUEST */
206
207
208
209
210

/* GABA:
   (class
     (name global_request_callback)
     (vars
Niels Möller's avatar
Niels Möller committed
211
       (response method void "int success")
212
213
214
215
       (connection object ssh_connection)))
*/

#define GLOBAL_REQUEST_CALLBACK(c, s) \
Niels Möller's avatar
Niels Möller committed
216
((c)->response((c), (s)))
217

218
/* GABA:
219
220
221
   (class
     (name global_request)
     (vars
Niels Möller's avatar
Niels Möller committed
222
223
224
       (handler method void "struct ssh_connection *connection"
                            "struct simple_buffer *args"
			    "struct global_request_callback *response")))
225
226
*/

227
#define GLOBAL_REQUEST(r, c, a, n) ((r)->handler((r), (c), (a), (n)))
Niels Möller's avatar
Niels Möller committed
228
229

/* SSH_MSG_CHANNEL_OPEN */
Niels Möller's avatar
Niels Möller committed
230

Niels Möller's avatar
Niels Möller committed
231
232
/* Raised if opening of a channel fails. Used both on the client and
 * the server side.*/
Niels Möller's avatar
Niels Möller committed
233
234
235
236
237
238
239
240
/* GABA:
   (class
     (name channel_open_exception)
     (super exception)
     (vars
       (error_code . UINT32)))
*/

Niels Möller's avatar
Niels Möller committed
241
242
struct exception *make_channel_open_exception(UINT32 error_code, char *msg);

243

244
/* GABA:
245
246
247
   (class
     (name channel_open)
     (vars
Niels Möller's avatar
Niels Möller committed
248
       (handler method void
249
                "struct ssh_connection *connection"
250
                "struct simple_buffer *data"
Niels Möller's avatar
Niels Möller committed
251
252
                "struct command_continuation *c"
		"struct exception_handler *e")))
253
254
*/

Niels Möller's avatar
Niels Möller committed
255
256
#define CHANNEL_OPEN(o, c, d, r, e) \
((o)->handler((o), (c), (d), (r), (e)))
Niels Möller's avatar
Niels Möller committed
257

Niels Möller's avatar
Niels Möller committed
258
/* SSH_MSG_CHANNEL_REQUEST */
259
/* GABA:
260
261
262
   (class
     (name channel_request)
     (vars
Niels Möller's avatar
Niels Möller committed
263
       (handler method void
264
		"struct ssh_channel *channel"
265
		"struct ssh_connection *connection"
266
267
268
269
		"int want_reply"
		"struct simple_buffer *args")))
*/

270
271
#define CHANNEL_REQUEST(s, c, conn, w, a) \
((s)->handler((s), (c), (conn), (w), (a)))
Niels Möller's avatar
Niels Möller committed
272

273
/* ;;GABA:
274
275
276
277
   (class
     (name connection_startup)
     (vars
       (start method int
278
	      "struct ssh_connection *connection")))
279
280
*/

281
/* #define CONNECTION_START(c, s) ((c)->start((c), (s))) */
282

283
284
void init_channel(struct ssh_channel *channel);

285
286
287
struct channel_table *make_channel_table(void);
int alloc_channel(struct channel_table *table);
void dealloc_channel(struct channel_table *table, int i);
Niels Möller's avatar
Niels Möller committed
288

289
void register_channel(struct ssh_connection *connection,
Niels Möller's avatar
Niels Möller committed
290
291
292
		      UINT32 local_channel_number,
		      struct ssh_channel *channel);

293
struct ssh_channel *lookup_channel(struct channel_table *table, UINT32 i);
Niels Möller's avatar
Niels Möller committed
294

295
296
297
298
struct abstract_write *make_channel_write(struct ssh_channel *channel);
struct abstract_write *make_channel_write_extended(struct ssh_channel *channel,
						   UINT32 type);

Niels Möller's avatar
Niels Möller committed
299
300
struct io_read_callback *make_channel_read_data(struct ssh_channel *channel);
struct io_read_callback *make_channel_read_stderr(struct ssh_channel *channel);
301

Niels Möller's avatar
Niels Möller committed
302
struct lsh_string *format_global_failure(void);
303
struct lsh_string *format_global_success(void);
304

Niels Möller's avatar
Niels Möller committed
305
struct lsh_string *format_open_failure(UINT32 channel, UINT32 reason,
306
				       const char *msg, const char *language);
307
308
struct lsh_string *format_open_confirmation(struct ssh_channel *channel,
					    UINT32 channel_number,
309
					    const char *format, ...);
310
311

struct lsh_string *format_channel_success(UINT32 channel);
Niels Möller's avatar
Niels Möller committed
312
313
struct lsh_string *format_channel_failure(UINT32 channel);

Niels Möller's avatar
Niels Möller committed
314
315
316
struct lsh_string *prepare_window_adjust(struct ssh_channel *channel,
					 UINT32 add);

Niels Möller's avatar
Niels Möller committed
317
void channel_start_receive(struct ssh_channel *channel);
318

319
struct lsh_string *prepare_channel_open(struct ssh_connection *connection,
320
321
					int type,
					struct ssh_channel *channel,
322
					const char *format, ...);
323

324
325
326
327
struct lsh_string *format_channel_request(int type,
					  struct ssh_channel *channel,
					  int want_reply,
					  const char *format, ...);
328

329
330
struct lsh_string *format_channel_close(struct ssh_channel *channel);
struct lsh_string *format_channel_eof(struct ssh_channel *channel);
331

Niels Möller's avatar
Niels Möller committed
332
333
void channel_close(struct ssh_channel *channel);
void channel_eof(struct ssh_channel *channel);
334

Niels Möller's avatar
Niels Möller committed
335
struct close_callback *
336
337
338
339
340
341
make_channel_read_close_callback(struct ssh_channel *channel);

struct exception_handler *
make_channel_io_exception_handler(struct ssh_channel *channel,
				  const char *prefix,
				  struct exception_handler *parent);
342

343
344
struct lsh_string *channel_transmit_data(struct ssh_channel *channel,
					 struct lsh_string *data);
345

346
347
348
struct lsh_string *channel_transmit_extended(struct ssh_channel *channel,
					     UINT32 type,
					     struct lsh_string *data);
349

350
351
extern struct command connection_service;

Niels Möller's avatar
Niels Möller committed
352

Niels Möller's avatar
Niels Möller committed
353
#endif /* LSH_CHANNEL_H_INCLUDED */