- markus@cvs.openbsd.org 2002/01/13 21:31:20
     [channels.h nchan.c]
     add chan_set_[io]state(), order states, state is now an u_int,
     simplifies debugging messages; ok provos@
diff --git a/nchan.c b/nchan.c
index 905379b..04266d3 100644
--- a/nchan.c
+++ b/nchan.c
@@ -23,7 +23,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: nchan.c,v 1.36 2002/01/10 12:47:59 markus Exp $");
+RCSID("$OpenBSD: nchan.c,v 1.37 2002/01/13 21:31:20 markus Exp $");
 
 #include "ssh1.h"
 #include "ssh2.h"
@@ -83,6 +83,28 @@
 static void	chan_shutdown_write(Channel *);
 static void	chan_shutdown_read(Channel *);
 
+static char *ostates[] = { "open", "drain", "wait_ieof", "closed" };
+static char *istates[] = { "open", "drain", "wait_oclose", "closed" };
+
+static void
+chan_set_istate(Channel *c, u_int next)
+{
+	if (c->istate > CHAN_INPUT_CLOSED || next > CHAN_INPUT_CLOSED)
+		fatal("chan_set_istate: bad state %d -> %d", c->istate, next);
+	debug("channel %d: input %s -> %s", c->self, istates[c->istate],
+	    istates[next]);
+	c->istate = next;
+}
+static void
+chan_set_ostate(Channel *c, u_int next)
+{
+	if (c->ostate > CHAN_OUTPUT_CLOSED || next > CHAN_OUTPUT_CLOSED)
+		fatal("chan_set_ostate: bad state %d -> %d", c->ostate, next);
+	debug("channel %d: output %s -> %s", c->self, ostates[c->ostate],
+	    ostates[next]);
+	c->ostate = next;
+}
+
 /*
  * SSH1 specific implementation of event functions
  */
@@ -93,20 +115,17 @@
 	debug("channel %d: rcvd oclose", c->self);
 	switch (c->istate) {
 	case CHAN_INPUT_WAIT_OCLOSE:
-		debug("channel %d: input wait_oclose -> closed", c->self);
-		c->istate = CHAN_INPUT_CLOSED;
+		chan_set_istate(c, CHAN_INPUT_CLOSED);
 		break;
 	case CHAN_INPUT_OPEN:
-		debug("channel %d: input open -> closed", c->self);
 		chan_shutdown_read(c);
 		chan_send_ieof1(c);
-		c->istate = CHAN_INPUT_CLOSED;
+		chan_set_istate(c, CHAN_INPUT_CLOSED);
 		break;
 	case CHAN_INPUT_WAIT_DRAIN:
 		/* both local read_failed and remote write_failed  */
-		log("channel %d: input drain -> closed", c->self);
 		chan_send_ieof1(c);
-		c->istate = CHAN_INPUT_CLOSED;
+		chan_set_istate(c, CHAN_INPUT_CLOSED);
 		break;
 	default:
 		error("channel %d: protocol error: rcvd_oclose for istate %d",
@@ -120,9 +139,8 @@
 	debug("channel %d: read failed", c->self);
 	switch (c->istate) {
 	case CHAN_INPUT_OPEN:
-		debug("channel %d: input open -> drain", c->self);
 		chan_shutdown_read(c);
-		c->istate = CHAN_INPUT_WAIT_DRAIN;
+		chan_set_istate(c, CHAN_INPUT_WAIT_DRAIN);
 		break;
 	default:
 		error("channel %d: chan_read_failed for istate %d",
@@ -141,9 +159,8 @@
 	}
 	switch (c->istate) {
 	case CHAN_INPUT_WAIT_DRAIN:
-		debug("channel %d: input drain -> wait_oclose", c->self);
 		chan_send_ieof1(c);
-		c->istate = CHAN_INPUT_WAIT_OCLOSE;
+		chan_set_istate(c, CHAN_INPUT_WAIT_OCLOSE);
 		break;
 	default:
 		error("channel %d: chan_ibuf_empty for istate %d",
@@ -157,12 +174,10 @@
 	debug("channel %d: rcvd ieof", c->self);
 	switch (c->ostate) {
 	case CHAN_OUTPUT_OPEN:
-		debug("channel %d: output open -> drain", c->self);
-		c->ostate = CHAN_OUTPUT_WAIT_DRAIN;
+		chan_set_ostate(c, CHAN_OUTPUT_WAIT_DRAIN);
 		break;
 	case CHAN_OUTPUT_WAIT_IEOF:
-		debug("channel %d: output wait_ieof -> closed", c->self);
-		c->ostate = CHAN_OUTPUT_CLOSED;
+		chan_set_ostate(c, CHAN_OUTPUT_CLOSED);
 		break;
 	default:
 		error("channel %d: protocol error: rcvd_ieof for ostate %d",
@@ -176,14 +191,12 @@
 	debug("channel %d: write failed", c->self);
 	switch (c->ostate) {
 	case CHAN_OUTPUT_OPEN:
-		debug("channel %d: output open -> wait_ieof", c->self);
 		chan_send_oclose1(c);
-		c->ostate = CHAN_OUTPUT_WAIT_IEOF;
+		chan_set_ostate(c, CHAN_OUTPUT_WAIT_IEOF);
 		break;
 	case CHAN_OUTPUT_WAIT_DRAIN:
-		debug("channel %d: output wait_drain -> closed", c->self);
 		chan_send_oclose1(c);
-		c->ostate = CHAN_OUTPUT_CLOSED;
+		chan_set_ostate(c, CHAN_OUTPUT_CLOSED);
 		break;
 	default:
 		error("channel %d: chan_write_failed for ostate %d",
@@ -202,9 +215,8 @@
 	}
 	switch (c->ostate) {
 	case CHAN_OUTPUT_WAIT_DRAIN:
-		debug("channel %d: output drain -> closed", c->self);
 		chan_send_oclose1(c);
-		c->ostate = CHAN_OUTPUT_CLOSED;
+		chan_set_ostate(c, CHAN_OUTPUT_CLOSED);
 		break;
 	default:
 		error("channel %d: internal error: obuf_empty for ostate %d",
@@ -261,8 +273,8 @@
 	c->flags |= CHAN_CLOSE_RCVD;
 	if (c->type == SSH_CHANNEL_LARVAL) {
 		/* tear down larval channels immediately */
-		c->ostate = CHAN_OUTPUT_CLOSED;
-		c->istate = CHAN_INPUT_CLOSED;
+		chan_set_ostate(c, CHAN_OUTPUT_CLOSED);
+		chan_set_istate(c, CHAN_INPUT_CLOSED);
 		return;
 	}
 	switch (c->ostate) {
@@ -271,21 +283,18 @@
 		 * wait until a data from the channel is consumed if a CLOSE
 		 * is received
 		 */
-		debug("channel %d: output open -> drain", c->self);
-		c->ostate = CHAN_OUTPUT_WAIT_DRAIN;
+		chan_set_ostate(c, CHAN_OUTPUT_WAIT_DRAIN);
 		break;
 	}
 	switch (c->istate) {
 	case CHAN_INPUT_OPEN:
-		debug("channel %d: input open -> closed", c->self);
 		chan_shutdown_read(c);
 		break;
 	case CHAN_INPUT_WAIT_DRAIN:
-		debug("channel %d: input drain -> closed", c->self);
 		chan_send_eof2(c);
 		break;
 	}
-	c->istate = CHAN_INPUT_CLOSED;
+	chan_set_istate(c, CHAN_INPUT_CLOSED);
 }
 static void
 chan_ibuf_empty2(Channel *c)
@@ -298,10 +307,9 @@
 	}
 	switch (c->istate) {
 	case CHAN_INPUT_WAIT_DRAIN:
-		debug("channel %d: input drain -> closed", c->self);
 		if (!(c->flags & CHAN_CLOSE_SENT))
 			chan_send_eof2(c);
-		c->istate = CHAN_INPUT_CLOSED;
+		chan_set_istate(c, CHAN_INPUT_CLOSED);
 		break;
 	default:
 		error("channel %d: chan_ibuf_empty for istate %d",
@@ -313,10 +321,8 @@
 chan_rcvd_ieof2(Channel *c)
 {
 	debug("channel %d: rcvd eof", c->self);
-	if (c->ostate == CHAN_OUTPUT_OPEN) {
-		debug("channel %d: output open -> drain", c->self);
-		c->ostate = CHAN_OUTPUT_WAIT_DRAIN;
-	}
+	if (c->ostate == CHAN_OUTPUT_OPEN)
+		chan_set_ostate(c, CHAN_OUTPUT_WAIT_DRAIN);
 }
 static void
 chan_write_failed2(Channel *c)
@@ -324,14 +330,12 @@
 	debug("channel %d: write failed", c->self);
 	switch (c->ostate) {
 	case CHAN_OUTPUT_OPEN:
-		debug("channel %d: output open -> closed", c->self);
 		chan_shutdown_write(c); /* ?? */
-		c->ostate = CHAN_OUTPUT_CLOSED;
+		chan_set_ostate(c, CHAN_OUTPUT_CLOSED);
 		break;
 	case CHAN_OUTPUT_WAIT_DRAIN:
-		debug("channel %d: output drain -> closed", c->self);
 		chan_shutdown_write(c);
-		c->ostate = CHAN_OUTPUT_CLOSED;
+		chan_set_ostate(c, CHAN_OUTPUT_CLOSED);
 		break;
 	default:
 		error("channel %d: chan_write_failed for ostate %d",
@@ -350,9 +354,8 @@
 	}
 	switch (c->ostate) {
 	case CHAN_OUTPUT_WAIT_DRAIN:
-		debug("channel %d: output drain -> closed", c->self);
 		chan_shutdown_write(c);
-		c->ostate = CHAN_OUTPUT_CLOSED;
+		chan_set_ostate(c, CHAN_OUTPUT_CLOSED);
 		break;
 	default:
 		error("channel %d: chan_obuf_empty for ostate %d",