=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/ssh/clientloop.c,v retrieving revision 1.74 retrieving revision 1.75 diff -u -r1.74 -r1.75 --- src/usr.bin/ssh/clientloop.c 2001/05/31 10:30:15 1.74 +++ src/usr.bin/ssh/clientloop.c 2001/06/04 23:07:20 1.75 @@ -59,7 +59,7 @@ */ #include "includes.h" -RCSID("$OpenBSD: clientloop.c,v 1.74 2001/05/31 10:30:15 markus Exp $"); +RCSID("$OpenBSD: clientloop.c,v 1.75 2001/06/04 23:07:20 markus Exp $"); #include "ssh.h" #include "ssh1.h" @@ -102,6 +102,7 @@ * because this is updated in a signal handler. */ static volatile int received_window_change_signal = 0; +static volatile int received_signal = 0; /* Flag indicating whether the user\'s terminal is in non-blocking mode. */ static int in_non_blocking_mode = 0; @@ -171,13 +172,8 @@ void signal_handler(int sig) { - if (in_raw_mode()) - leave_raw_mode(); - if (in_non_blocking_mode) - leave_non_blocking(); - channel_stop_listening(); - packet_close(); - fatal("Killed by signal %d.", sig); + received_signal = sig; + quit_pending = 1; } /* @@ -933,14 +929,8 @@ /* Stop listening for connections. */ channel_stop_listening(); - /* - * In interactive mode (with pseudo tty) display a message indicating - * that the connection has been closed. - */ - if (have_pty && options.log_level != SYSLOG_LEVEL_QUIET) { - snprintf(buf, sizeof buf, "Connection to %.64s closed.\r\n", host); - buffer_append(&stderr_buffer, buf, strlen(buf)); - } + if (have_pty) + leave_raw_mode(); /* restore blocking io */ if (!isatty(fileno(stdin))) @@ -950,6 +940,21 @@ if (!isatty(fileno(stderr))) unset_nonblock(fileno(stderr)); + if (received_signal) { + if (in_non_blocking_mode) /* XXX */ + leave_non_blocking(); + fatal("Killed by signal %d.", received_signal); + } + + /* + * In interactive mode (with pseudo tty) display a message indicating + * that the connection has been closed. + */ + if (have_pty && options.log_level != SYSLOG_LEVEL_QUIET) { + snprintf(buf, sizeof buf, "Connection to %.64s closed.\r\n", host); + buffer_append(&stderr_buffer, buf, strlen(buf)); + } + /* Output any buffered data for stdout. */ while (buffer_len(&stdout_buffer) > 0) { len = write(fileno(stdout), buffer_ptr(&stdout_buffer), @@ -973,9 +978,6 @@ buffer_consume(&stderr_buffer, len); stderr_bytes += len; } - - if (have_pty) - leave_raw_mode(); /* Clear and free any buffers. */ memset(buf, 0, sizeof(buf));