X-Git-Url: http://andersk.mit.edu/gitweb/openssh.git/blobdiff_plain/9c08d6ce311692f6dad205a223476cf072825f9f..5260325f3150ad441f310d31239beeb765f716ed:/nchan.c diff --git a/nchan.c b/nchan.c index 227e52f7..97101e36 100644 --- a/nchan.c +++ b/nchan.c @@ -15,122 +15,131 @@ static void chan_shutdown_read(Channel *c); static void chan_delele_if_full_closed(Channel *c); /* - * EVENTS: update channel input/output states - * execute ACTIONS + * EVENTS update channel input/output states execute ACTIONS */ + /* events concerning the INPUT from socket for channel (istate) */ void -chan_rcvd_oclose(Channel *c){ - switch(c->istate){ +chan_rcvd_oclose(Channel *c) +{ + switch (c->istate) { case CHAN_INPUT_WAIT_OCLOSE: debug("channel %d: INPUT_WAIT_OCLOSE -> INPUT_CLOSED [rcvd OCLOSE]", c->self); - c->istate=CHAN_INPUT_CLOSED; + c->istate = CHAN_INPUT_CLOSED; chan_delele_if_full_closed(c); break; case CHAN_INPUT_OPEN: debug("channel %d: INPUT_OPEN -> INPUT_CLOSED [rvcd OCLOSE, send IEOF]", c->self); chan_shutdown_read(c); chan_send_ieof(c); - c->istate=CHAN_INPUT_CLOSED; + c->istate = CHAN_INPUT_CLOSED; chan_delele_if_full_closed(c); break; default: - debug("protocol error: chan_rcvd_oclose %d for istate %d",c->self,c->istate); + debug("protocol error: chan_rcvd_oclose %d for istate %d", c->self, c->istate); break; } } void -chan_read_failed(Channel *c){ - switch(c->istate){ +chan_read_failed(Channel *c) +{ + switch (c->istate) { case CHAN_INPUT_OPEN: debug("channel %d: INPUT_OPEN -> INPUT_WAIT_DRAIN [read failed]", c->self); chan_shutdown_read(c); - c->istate=CHAN_INPUT_WAIT_DRAIN; + c->istate = CHAN_INPUT_WAIT_DRAIN; break; default: debug("internal error: we do not read, but chan_read_failed %d for istate %d", - c->self,c->istate); + c->self, c->istate); break; } } void -chan_ibuf_empty(Channel *c){ - if(buffer_len(&c->input)){ - debug("internal error: chan_ibuf_empty %d for non empty buffer",c->self); +chan_ibuf_empty(Channel *c) +{ + if (buffer_len(&c->input)) { + debug("internal error: chan_ibuf_empty %d for non empty buffer", c->self); return; } - switch(c->istate){ + switch (c->istate) { case CHAN_INPUT_WAIT_DRAIN: debug("channel %d: INPUT_WAIT_DRAIN -> INPUT_WAIT_OCLOSE [inbuf empty, send IEOF]", c->self); chan_send_ieof(c); - c->istate=CHAN_INPUT_WAIT_OCLOSE; + c->istate = CHAN_INPUT_WAIT_OCLOSE; break; default: - debug("internal error: chan_ibuf_empty %d for istate %d",c->self,c->istate); + debug("internal error: chan_ibuf_empty %d for istate %d", c->self, c->istate); break; } } + /* events concerning the OUTPUT from channel for socket (ostate) */ void -chan_rcvd_ieof(Channel *c){ - switch(c->ostate){ +chan_rcvd_ieof(Channel *c) +{ + switch (c->ostate) { case CHAN_OUTPUT_OPEN: debug("channel %d: OUTPUT_OPEN -> OUTPUT_WAIT_DRAIN [rvcd IEOF]", c->self); - c->ostate=CHAN_OUTPUT_WAIT_DRAIN; + c->ostate = CHAN_OUTPUT_WAIT_DRAIN; break; case CHAN_OUTPUT_WAIT_IEOF: debug("channel %d: OUTPUT_WAIT_IEOF -> OUTPUT_CLOSED [rvcd IEOF]", c->self); - c->ostate=CHAN_OUTPUT_CLOSED; + c->ostate = CHAN_OUTPUT_CLOSED; chan_delele_if_full_closed(c); break; default: - debug("protocol error: chan_rcvd_ieof %d for ostate %d", c->self,c->ostate); + debug("protocol error: chan_rcvd_ieof %d for ostate %d", c->self, c->ostate); break; } } void -chan_write_failed(Channel *c){ - switch(c->ostate){ +chan_write_failed(Channel *c) +{ + switch (c->ostate) { case CHAN_OUTPUT_OPEN: debug("channel %d: OUTPUT_OPEN -> OUTPUT_WAIT_IEOF [write failed]", c->self); chan_send_oclose(c); - c->ostate=CHAN_OUTPUT_WAIT_IEOF; + c->ostate = CHAN_OUTPUT_WAIT_IEOF; break; case CHAN_OUTPUT_WAIT_DRAIN: debug("channel %d: OUTPUT_WAIT_DRAIN -> OUTPUT_CLOSED [write failed]", c->self); chan_send_oclose(c); - c->ostate=CHAN_OUTPUT_CLOSED; + c->ostate = CHAN_OUTPUT_CLOSED; chan_delele_if_full_closed(c); break; default: - debug("internal error: chan_write_failed %d for ostate %d",c->self,c->ostate); + debug("internal error: chan_write_failed %d for ostate %d", c->self, c->ostate); break; } } void -chan_obuf_empty(Channel *c){ - if(buffer_len(&c->output)){ - debug("internal error: chan_obuf_empty %d for non empty buffer",c->self); +chan_obuf_empty(Channel *c) +{ + if (buffer_len(&c->output)) { + debug("internal error: chan_obuf_empty %d for non empty buffer", c->self); return; } - switch(c->ostate){ + switch (c->ostate) { case CHAN_OUTPUT_WAIT_DRAIN: debug("channel %d: OUTPUT_WAIT_DRAIN -> OUTPUT_CLOSED [obuf empty, send OCLOSE]", c->self); chan_send_oclose(c); - c->ostate=CHAN_OUTPUT_CLOSED; + c->ostate = CHAN_OUTPUT_CLOSED; chan_delele_if_full_closed(c); break; default: - debug("internal error: chan_obuf_empty %d for ostate %d",c->self,c->ostate); + debug("internal error: chan_obuf_empty %d for ostate %d", c->self, c->ostate); break; } } + /* - * ACTIONS: should never update c->istate or c->ostate + * ACTIONS: should never update the channel states: c->istate or c->ostate */ static void -chan_send_ieof(Channel *c){ - switch(c->istate){ +chan_send_ieof(Channel *c) +{ + switch (c->istate) { case CHAN_INPUT_OPEN: case CHAN_INPUT_WAIT_DRAIN: packet_start(SSH_MSG_CHANNEL_INPUT_EOF); @@ -138,13 +147,14 @@ chan_send_ieof(Channel *c){ packet_send(); break; default: - debug("internal error: channel %d: cannot send IEOF for istate %d",c->self,c->istate); + debug("internal error: channel %d: cannot send IEOF for istate %d", c->self, c->istate); break; } } static void -chan_send_oclose(Channel *c){ - switch(c->ostate){ +chan_send_oclose(Channel *c) +{ + switch (c->ostate) { case CHAN_OUTPUT_OPEN: case CHAN_OUTPUT_WAIT_DRAIN: chan_shutdown_write(c); @@ -154,34 +164,39 @@ chan_send_oclose(Channel *c){ packet_send(); break; default: - debug("internal error: channel %d: cannot send OCLOSE for ostate %d",c->self,c->istate); + debug("internal error: channel %d: cannot send OCLOSE for ostate %d", c->self, c->istate); break; } } + /* helper */ static void -chan_shutdown_write(Channel *c){ +chan_shutdown_write(Channel *c) +{ debug("channel %d: shutdown_write", c->self); - if(shutdown(c->sock, SHUT_WR)<0) + if (shutdown(c->sock, SHUT_WR) < 0) error("chan_shutdown_write failed for #%d/fd%d: %.100s", - c->self, c->sock, strerror(errno)); + c->self, c->sock, strerror(errno)); } static void -chan_shutdown_read(Channel *c){ +chan_shutdown_read(Channel *c) +{ debug("channel %d: shutdown_read", c->self); - if(shutdown(c->sock, SHUT_RD)<0) + if (shutdown(c->sock, SHUT_RD) < 0) error("chan_shutdown_read failed for #%d/fd%d: %.100s", - c->self, c->sock, strerror(errno)); + c->self, c->sock, strerror(errno)); } static void -chan_delele_if_full_closed(Channel *c){ - if(c->istate==CHAN_INPUT_CLOSED && c->ostate==CHAN_OUTPUT_CLOSED){ +chan_delele_if_full_closed(Channel *c) +{ + if (c->istate == CHAN_INPUT_CLOSED && c->ostate == CHAN_OUTPUT_CLOSED) { debug("channel %d: closing", c->self); channel_free(c->self); } } void -chan_init_iostates(Channel *c){ - c->ostate=CHAN_OUTPUT_OPEN; - c->istate=CHAN_INPUT_OPEN; +chan_init_iostates(Channel *c) +{ + c->ostate = CHAN_OUTPUT_OPEN; + c->istate = CHAN_INPUT_OPEN; }