- markus@cvs.openbsd.org 2001/06/04 23:07:21
     [clientloop.c serverloop.c sshd.c]
     set flags in the signal handlers, do real work in the main loop,
     ok provos@
diff --git a/clientloop.c b/clientloop.c
index 70abee8..3a1b43d 100644
--- a/clientloop.c
+++ b/clientloop.c
@@ -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),
@@ -974,9 +979,6 @@
 		stderr_bytes += len;
 	}
 
-	if (have_pty)
-		leave_raw_mode();
-
 	/* Clear and free any buffers. */
 	memset(buf, 0, sizeof(buf));
 	buffer_free(&stdin_buffer);