static enum {
SSH_STATE_BEFORE_SIZE,
SSH_STATE_INTERMED,
- SSH_STATE_SESSION
+ SSH_STATE_SESSION,
+ SSH_STATE_CLOSED
} ssh_state = SSH_STATE_BEFORE_SIZE;
static int size_needed = FALSE;
len = (len << 8) + pktin.body[i];
c_write(pktin.body+4, len);
} else if (pktin.type == 1) {
- /* SSH_MSG_DISCONNECT: do nothing */
+ /* SSH_MSG_DISCONNECT */
+ ssh_state = SSH_STATE_CLOSED;
} else if (pktin.type == 14) {
/* SSH_MSG_SUCCESS: may be from EXEC_SHELL on some servers */
} else if (pktin.type == 15) {
return 1;
case FD_CLOSE:
s = INVALID_SOCKET;
+ ssh_state = SSH_STATE_CLOSED;
return 0;
}
return 1; /* shouldn't happen, but WTF */
static void ssh_size(void) {
switch (ssh_state) {
case SSH_STATE_BEFORE_SIZE:
+ case SSH_STATE_CLOSED:
break; /* do nothing */
case SSH_STATE_INTERMED:
size_needed = TRUE; /* buffer for later */