version 1.109.2.5, 2002/03/09 00:20:44 |
version 1.109.2.6, 2002/06/02 22:56:10 |
|
|
if (buffer_len(&c->output) > 0) { |
if (buffer_len(&c->output) > 0) { |
FD_SET(c->wfd, writeset); |
FD_SET(c->wfd, writeset); |
} else if (c->ostate == CHAN_OUTPUT_WAIT_DRAIN) { |
} else if (c->ostate == CHAN_OUTPUT_WAIT_DRAIN) { |
chan_obuf_empty(c); |
if (CHANNEL_EFD_OUTPUT_ACTIVE(c)) |
|
debug2("channel %d: obuf_empty delayed efd %d/(%d)", |
|
c->self, c->efd, buffer_len(&c->extended)); |
|
else |
|
chan_obuf_empty(c); |
} |
} |
} |
} |
/** XXX check close conditions, too */ |
/** XXX check close conditions, too */ |
|
|
if (c->extended_usage == CHAN_EXTENDED_WRITE && |
if (c->extended_usage == CHAN_EXTENDED_WRITE && |
buffer_len(&c->extended) > 0) |
buffer_len(&c->extended) > 0) |
FD_SET(c->efd, writeset); |
FD_SET(c->efd, writeset); |
else if (c->extended_usage == CHAN_EXTENDED_READ && |
else if (!(c->flags & CHAN_EOF_SENT) && |
|
c->extended_usage == CHAN_EXTENDED_READ && |
buffer_len(&c->extended) < c->remote_window) |
buffer_len(&c->extended) < c->remote_window) |
FD_SET(c->efd, readset); |
FD_SET(c->efd, readset); |
} |
} |
|
|
fatal("cannot happen: istate == INPUT_WAIT_DRAIN for proto 1.3"); |
fatal("cannot happen: istate == INPUT_WAIT_DRAIN for proto 1.3"); |
/* |
/* |
* input-buffer is empty and read-socket shutdown: |
* input-buffer is empty and read-socket shutdown: |
* tell peer, that we will not send more data: send IEOF |
* tell peer, that we will not send more data: send IEOF. |
|
* hack for extended data: delay EOF if EFD still in use. |
*/ |
*/ |
chan_ibuf_empty(c); |
if (CHANNEL_EFD_INPUT_ACTIVE(c)) |
|
debug2("channel %d: ibuf_empty delayed efd %d/(%d)", |
|
c->self, c->efd, buffer_len(&c->extended)); |
|
else |
|
chan_ibuf_empty(c); |
} |
} |
/* Send extended data, i.e. stderr */ |
/* Send extended data, i.e. stderr */ |
if (compat20 && |
if (compat20 && |
|
!(c->flags & CHAN_EOF_SENT) && |
c->remote_window > 0 && |
c->remote_window > 0 && |
(len = buffer_len(&c->extended)) > 0 && |
(len = buffer_len(&c->extended)) > 0 && |
c->extended_usage == CHAN_EXTENDED_READ) { |
c->extended_usage == CHAN_EXTENDED_READ) { |
|
|
log("channel %d: ext data for non open", id); |
log("channel %d: ext data for non open", id); |
return; |
return; |
} |
} |
|
if (c->flags & CHAN_EOF_RCVD) { |
|
if (datafellows & SSH_BUG_EXTEOF) |
|
debug("channel %d: accepting ext data after eof", id); |
|
else |
|
packet_disconnect("Received extended_data after EOF " |
|
"on channel %d.", id); |
|
} |
tcode = packet_get_int(); |
tcode = packet_get_int(); |
if (c->efd == -1 || |
if (c->efd == -1 || |
c->extended_usage != CHAN_EXTENDED_WRITE || |
c->extended_usage != CHAN_EXTENDED_WRITE || |
|
|
const char *address_to_bind = "0.0.0.0"; |
const char *address_to_bind = "0.0.0.0"; |
packet_start(SSH2_MSG_GLOBAL_REQUEST); |
packet_start(SSH2_MSG_GLOBAL_REQUEST); |
packet_put_cstring("tcpip-forward"); |
packet_put_cstring("tcpip-forward"); |
packet_put_char(0); /* boolean: want reply */ |
packet_put_char(1); /* boolean: want reply */ |
packet_put_cstring(address_to_bind); |
packet_put_cstring(address_to_bind); |
packet_put_int(listen_port); |
packet_put_int(listen_port); |
packet_send(); |
packet_send(); |