From 4dd332c95e0c439ae9532ffa391cd13eb769af01 Mon Sep 17 00:00:00 2001 From: Tiago Cunha Date: Wed, 23 Sep 2009 15:10:37 +0000 Subject: [PATCH] Sync OpenBSD patchset 349: On SIGTERM, just abandon any suspended/locked clients and leave them to it, otherwise the server will hang around (refusing new connections) until they exit properly. --- server.c | 58 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/server.c b/server.c index c2971c7a..cd5acc22 100644 --- a/server.c +++ b/server.c @@ -1,4 +1,4 @@ -/* $Id: server.c,v 1.192 2009-09-23 15:00:08 tcunha Exp $ */ +/* $Id: server.c,v 1.193 2009-09-23 15:10:37 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -48,6 +48,7 @@ void server_create_client(int); int server_create_socket(void); int server_main(int); void server_shutdown(void); +int server_should_shutdown(void); void server_child_signal(void); void server_fill_windows(struct pollfd **); void server_handle_windows(struct pollfd **); @@ -247,7 +248,7 @@ server_main(int srv_fd) struct window *w; struct pollfd *pfds, *pfd; int nfds, xtimeout; - u_int i, n; + u_int i; time_t now, last; siginit(); @@ -261,6 +262,10 @@ server_main(int srv_fd) if (sigterm) server_shutdown(); + /* Stop if no sessions or clients left. */ + if (server_should_shutdown()) + break; + /* Handle child exit. */ if (sigchld) { server_child_signal(); @@ -340,22 +345,6 @@ server_main(int srv_fd) /* Collect dead clients and sessions. */ server_clean_dead(); - - /* - * If we have no sessions and clients left, let's get out - * of here... - */ - n = 0; - for (i = 0; i < ARRAY_LENGTH(&sessions); i++) { - if (ARRAY_ITEM(&sessions, i) != NULL) - n++; - } - for (i = 0; i < ARRAY_LENGTH(&clients); i++) { - if (ARRAY_ITEM(&clients, i) != NULL) - n++; - } - if (n == 0) - break; } if (pfds != NULL) xfree(pfds); @@ -394,6 +383,16 @@ server_shutdown(void) struct client *c; u_int i, j; + for (i = 0; i < ARRAY_LENGTH(&clients); i++) { + c = ARRAY_ITEM(&clients, i); + if (c != NULL) { + if (c->flags & (CLIENT_BAD|CLIENT_SUSPENDED)) + server_lost_client(c); + else + server_write_client(c, MSG_SHUTDOWN, NULL, 0); + } + } + for (i = 0; i < ARRAY_LENGTH(&sessions); i++) { s = ARRAY_ITEM(&sessions, i); for (j = 0; j < ARRAY_LENGTH(&clients); j++) { @@ -406,16 +405,23 @@ server_shutdown(void) if (s != NULL) session_destroy(s); } +} - for (i = 0; i < ARRAY_LENGTH(&clients); i++) { - c = ARRAY_ITEM(&clients, i); - if (c != NULL) { - if (c->flags & CLIENT_BAD) - server_lost_client(c); - else - server_write_client(c, MSG_SHUTDOWN, NULL, 0); - } +/* Check if the server should be shutting down (no more clients or windows). */ +int +server_should_shutdown(void) +{ + u_int i; + + for (i = 0; i < ARRAY_LENGTH(&sessions); i++) { + if (ARRAY_ITEM(&sessions, i) != NULL) + return (0); } + for (i = 0; i < ARRAY_LENGTH(&clients); i++) { + if (ARRAY_ITEM(&clients, i) != NULL) + return (0); + } + return (1); } /* Handle SIGCHLD. */