diff options
author | Ben Lindstrom <mouring@eviladmin.org> | 2001-06-09 03:27:31 +0200 |
---|---|---|
committer | Ben Lindstrom <mouring@eviladmin.org> | 2001-06-09 03:27:31 +0200 |
commit | ec46e0b5fd2299f7f1449240894fa36d1745587e (patch) | |
tree | a571d4696c04304a7ddbfa6a829c70444915783f /clientloop.c | |
parent | - markus@cvs.openbsd.org 2001/06/04 21:59:43 (diff) | |
download | openssh-ec46e0b5fd2299f7f1449240894fa36d1745587e.tar.xz openssh-ec46e0b5fd2299f7f1449240894fa36d1745587e.zip |
- 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@
Diffstat (limited to 'clientloop.c')
-rw-r--r-- | clientloop.c | 40 |
1 files changed, 21 insertions, 19 deletions
diff --git a/clientloop.c b/clientloop.c index 70abee8fd..3a1b43dda 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 @@ extern char *host; * 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 @@ window_change_handler(int sig) 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 @@ client_loop(int have_pty, int escape_char_arg, int ssh2_chan_id) /* 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 @@ client_loop(int have_pty, int escape_char_arg, int ssh2_chan_id) 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 @@ client_loop(int have_pty, int escape_char_arg, int ssh2_chan_id) stderr_bytes += len; } - if (have_pty) - leave_raw_mode(); - /* Clear and free any buffers. */ memset(buf, 0, sizeof(buf)); buffer_free(&stdin_buffer); |