--- openssh-2.3.0p1-orig/clientloop.c Sat Feb 17 22:48:00 2001 +++ openssh-2.3.0p1/clientloop.c Sat Feb 17 22:45:52 2001 @@ -364,6 +364,9 @@ void client_wait_until_can_do_something(fd_set * readset, fd_set * writeset) { + struct timeval tv = {0}; + tv.tv_sec = 180; /* Send a noop message every three minutes as a keepalive. */ + /* Initialize select masks. */ FD_ZERO(readset); FD_ZERO(writeset); @@ -411,7 +414,8 @@ * SSH_MSG_IGNORE packet when the timeout expires. */ - if (select(max_fd + 1, readset, writeset, NULL, NULL) < 0) { + switch (select(max_fd + 1, readset, writeset, NULL, &tv)) { + case -1: { char buf[100]; /* Some systems fail to clear these automatically. */ FD_ZERO(readset); @@ -423,7 +427,21 @@ buffer_append(&stderr_buffer, buf, strlen(buf)); stderr_bytes += strlen(buf); quit_pending = 1; - } + + } + break; + + case 0: + /* Send a keepalive packet (not SSH_MSG_IGNORE as this crashes + * some servers...). + */ + packet_start(SSH_MSG_NONE); + packet_send(); + break; + + default: + break; + } } void