diff options
Diffstat (limited to 'nchan.c')
-rw-r--r-- | nchan.c | 32 |
1 files changed, 31 insertions, 1 deletions
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: nchan.c,v 1.57 2006/08/03 03:34:42 deraadt Exp $ */ | 1 | /* $OpenBSD: nchan.c,v 1.60 2008/06/30 12:16:02 djm Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 1999, 2000, 2001, 2002 Markus Friedl. All rights reserved. | 3 | * Copyright (c) 1999, 2000, 2001, 2002 Markus Friedl. All rights reserved. |
4 | * | 4 | * |
@@ -32,6 +32,7 @@ | |||
32 | #include <string.h> | 32 | #include <string.h> |
33 | #include <stdarg.h> | 33 | #include <stdarg.h> |
34 | 34 | ||
35 | #include "openbsd-compat/sys-queue.h" | ||
35 | #include "ssh1.h" | 36 | #include "ssh1.h" |
36 | #include "ssh2.h" | 37 | #include "ssh2.h" |
37 | #include "buffer.h" | 38 | #include "buffer.h" |
@@ -77,6 +78,7 @@ static void chan_send_ieof1(Channel *); | |||
77 | static void chan_send_oclose1(Channel *); | 78 | static void chan_send_oclose1(Channel *); |
78 | static void chan_send_close2(Channel *); | 79 | static void chan_send_close2(Channel *); |
79 | static void chan_send_eof2(Channel *); | 80 | static void chan_send_eof2(Channel *); |
81 | static void chan_send_eow2(Channel *); | ||
80 | 82 | ||
81 | /* helper */ | 83 | /* helper */ |
82 | static void chan_shutdown_write(Channel *); | 84 | static void chan_shutdown_write(Channel *); |
@@ -305,6 +307,17 @@ chan_rcvd_close2(Channel *c) | |||
305 | break; | 307 | break; |
306 | } | 308 | } |
307 | } | 309 | } |
310 | void | ||
311 | chan_rcvd_eow(Channel *c) | ||
312 | { | ||
313 | debug2("channel %d: rcvd eow", c->self); | ||
314 | switch (c->istate) { | ||
315 | case CHAN_INPUT_OPEN: | ||
316 | chan_shutdown_read(c); | ||
317 | chan_set_istate(c, CHAN_INPUT_CLOSED); | ||
318 | break; | ||
319 | } | ||
320 | } | ||
308 | static void | 321 | static void |
309 | chan_rcvd_eof2(Channel *c) | 322 | chan_rcvd_eof2(Channel *c) |
310 | { | 323 | { |
@@ -321,6 +334,8 @@ chan_write_failed2(Channel *c) | |||
321 | case CHAN_OUTPUT_OPEN: | 334 | case CHAN_OUTPUT_OPEN: |
322 | case CHAN_OUTPUT_WAIT_DRAIN: | 335 | case CHAN_OUTPUT_WAIT_DRAIN: |
323 | chan_shutdown_write(c); | 336 | chan_shutdown_write(c); |
337 | if (strcmp(c->ctype, "session") == 0) | ||
338 | chan_send_eow2(c); | ||
324 | chan_set_ostate(c, CHAN_OUTPUT_CLOSED); | 339 | chan_set_ostate(c, CHAN_OUTPUT_CLOSED); |
325 | break; | 340 | break; |
326 | default: | 341 | default: |
@@ -363,6 +378,21 @@ chan_send_close2(Channel *c) | |||
363 | c->flags |= CHAN_CLOSE_SENT; | 378 | c->flags |= CHAN_CLOSE_SENT; |
364 | } | 379 | } |
365 | } | 380 | } |
381 | static void | ||
382 | chan_send_eow2(Channel *c) | ||
383 | { | ||
384 | debug2("channel %d: send eow", c->self); | ||
385 | if (c->ostate == CHAN_OUTPUT_CLOSED) { | ||
386 | error("channel %d: must not sent eow on closed output", | ||
387 | c->self); | ||
388 | return; | ||
389 | } | ||
390 | packet_start(SSH2_MSG_CHANNEL_REQUEST); | ||
391 | packet_put_int(c->remote_id); | ||
392 | packet_put_cstring("eow@openssh.com"); | ||
393 | packet_put_char(0); | ||
394 | packet_send(); | ||
395 | } | ||
366 | 396 | ||
367 | /* shared */ | 397 | /* shared */ |
368 | 398 | ||