diff options
Diffstat (limited to 'serverloop.c')
-rw-r--r-- | serverloop.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/serverloop.c b/serverloop.c index 208f7e1e9..03376bacf 100644 --- a/serverloop.c +++ b/serverloop.c | |||
@@ -35,7 +35,7 @@ | |||
35 | */ | 35 | */ |
36 | 36 | ||
37 | #include "includes.h" | 37 | #include "includes.h" |
38 | RCSID("$OpenBSD: serverloop.c,v 1.120 2005/10/30 08:52:17 djm Exp $"); | 38 | RCSID("$OpenBSD: serverloop.c,v 1.121 2005/10/31 11:48:29 djm Exp $"); |
39 | 39 | ||
40 | #include "xmalloc.h" | 40 | #include "xmalloc.h" |
41 | #include "packet.h" | 41 | #include "packet.h" |
@@ -61,6 +61,7 @@ extern ServerOptions options; | |||
61 | /* XXX */ | 61 | /* XXX */ |
62 | extern Kex *xxx_kex; | 62 | extern Kex *xxx_kex; |
63 | extern Authctxt *the_authctxt; | 63 | extern Authctxt *the_authctxt; |
64 | extern int use_privsep; | ||
64 | 65 | ||
65 | static Buffer stdin_buffer; /* Buffer for stdin data. */ | 66 | static Buffer stdin_buffer; /* Buffer for stdin data. */ |
66 | static Buffer stdout_buffer; /* Buffer for stdout data. */ | 67 | static Buffer stdout_buffer; /* Buffer for stdout data. */ |
@@ -90,6 +91,9 @@ static int client_alive_timeouts = 0; | |||
90 | 91 | ||
91 | static volatile sig_atomic_t child_terminated = 0; /* The child has terminated. */ | 92 | static volatile sig_atomic_t child_terminated = 0; /* The child has terminated. */ |
92 | 93 | ||
94 | /* Cleanup on signals (!use_privsep case only) */ | ||
95 | static volatile sig_atomic_t received_sigterm = 0; | ||
96 | |||
93 | /* prototypes */ | 97 | /* prototypes */ |
94 | static void server_init_dispatch(void); | 98 | static void server_init_dispatch(void); |
95 | 99 | ||
@@ -151,6 +155,12 @@ sigchld_handler(int sig) | |||
151 | errno = save_errno; | 155 | errno = save_errno; |
152 | } | 156 | } |
153 | 157 | ||
158 | static void | ||
159 | sigterm_handler(int sig) | ||
160 | { | ||
161 | received_sigterm = sig; | ||
162 | } | ||
163 | |||
154 | /* | 164 | /* |
155 | * Make packets from buffered stderr data, and buffer it for sending | 165 | * Make packets from buffered stderr data, and buffer it for sending |
156 | * to the client. | 166 | * to the client. |
@@ -502,6 +512,12 @@ server_loop(pid_t pid, int fdin_arg, int fdout_arg, int fderr_arg) | |||
502 | child_terminated = 0; | 512 | child_terminated = 0; |
503 | mysignal(SIGCHLD, sigchld_handler); | 513 | mysignal(SIGCHLD, sigchld_handler); |
504 | 514 | ||
515 | if (!use_privsep) { | ||
516 | signal(SIGTERM, sigterm_handler); | ||
517 | signal(SIGINT, sigterm_handler); | ||
518 | signal(SIGQUIT, sigterm_handler); | ||
519 | } | ||
520 | |||
505 | /* Initialize our global variables. */ | 521 | /* Initialize our global variables. */ |
506 | fdin = fdin_arg; | 522 | fdin = fdin_arg; |
507 | fdout = fdout_arg; | 523 | fdout = fdout_arg; |
@@ -629,6 +645,12 @@ server_loop(pid_t pid, int fdin_arg, int fdout_arg, int fderr_arg) | |||
629 | wait_until_can_do_something(&readset, &writeset, &max_fd, | 645 | wait_until_can_do_something(&readset, &writeset, &max_fd, |
630 | &nalloc, max_time_milliseconds); | 646 | &nalloc, max_time_milliseconds); |
631 | 647 | ||
648 | if (received_sigterm) { | ||
649 | logit("Exiting on signal %d", received_sigterm); | ||
650 | /* Clean up sessions, utmp, etc. */ | ||
651 | cleanup_exit(255); | ||
652 | } | ||
653 | |||
632 | /* Process any channel events. */ | 654 | /* Process any channel events. */ |
633 | channel_after_select(readset, writeset); | 655 | channel_after_select(readset, writeset); |
634 | 656 | ||
@@ -749,6 +771,12 @@ server_loop2(Authctxt *authctxt) | |||
749 | connection_in = packet_get_connection_in(); | 771 | connection_in = packet_get_connection_in(); |
750 | connection_out = packet_get_connection_out(); | 772 | connection_out = packet_get_connection_out(); |
751 | 773 | ||
774 | if (!use_privsep) { | ||
775 | signal(SIGTERM, sigterm_handler); | ||
776 | signal(SIGINT, sigterm_handler); | ||
777 | signal(SIGQUIT, sigterm_handler); | ||
778 | } | ||
779 | |||
752 | notify_setup(); | 780 | notify_setup(); |
753 | 781 | ||
754 | max_fd = MAX(connection_in, connection_out); | 782 | max_fd = MAX(connection_in, connection_out); |
@@ -766,6 +794,12 @@ server_loop2(Authctxt *authctxt) | |||
766 | wait_until_can_do_something(&readset, &writeset, &max_fd, | 794 | wait_until_can_do_something(&readset, &writeset, &max_fd, |
767 | &nalloc, 0); | 795 | &nalloc, 0); |
768 | 796 | ||
797 | if (received_sigterm) { | ||
798 | logit("Exiting on signal %d", received_sigterm); | ||
799 | /* Clean up sessions, utmp, etc. */ | ||
800 | cleanup_exit(255); | ||
801 | } | ||
802 | |||
769 | collect_children(); | 803 | collect_children(); |
770 | if (!rekeying) { | 804 | if (!rekeying) { |
771 | channel_after_select(readset, writeset); | 805 | channel_after_select(readset, writeset); |