From e663df195c2a6c108e90273b8fa9831abdbc3b1c Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 23 Jan 2009 10:13:29 +0100 Subject: s3:nmbd: install the SIG_DFL handler for SIGTERM while we're waiting for interfaces We should handle all 3 cases where we actively wait for interfaces in the same way. metze --- source3/nmbd/nmbd.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) (limited to 'source3/nmbd/nmbd.c') diff --git a/source3/nmbd/nmbd.c b/source3/nmbd/nmbd.c index 0922e455a3..870b9a1f30 100644 --- a/source3/nmbd/nmbd.c +++ b/source3/nmbd/nmbd.c @@ -282,6 +282,7 @@ static void reload_interfaces(time_t t) /* We need to wait if there are no subnets... */ if (FIRST_SUBNET == NULL) { + void (*saved_handler)(int); if (print_waiting_msg) { DEBUG(0,("reload_interfaces: " @@ -293,29 +294,20 @@ static void reload_interfaces(time_t t) * Whilst we're waiting for an interface, allow SIGTERM to * cause us to exit. */ - - BlockSignals(false, SIGTERM); + saved_handler = CatchSignal( SIGTERM, SIGNAL_CAST SIG_DFL ); /* We only count IPv4, non-loopback interfaces here. */ - while (iface_count_v4_nl() == 0 && !got_sig_term) { + while (iface_count_v4_nl() == 0) { sleep(5); load_interfaces(); } - /* - * Handle termination inband. - */ - - if (got_sig_term) { - got_sig_term = 0; - terminate(); - } + CatchSignal( SIGTERM, SIGNAL_CAST saved_handler ); /* * We got an interface, go back to blocking term. */ - BlockSignals(true, SIGTERM); goto try_again; } } -- cgit From 2630d4a2523894386f4e1a37cfb3a312f4e8fdf5 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 23 Jan 2009 10:15:00 +0100 Subject: s3:nmbd: as the sig_term() handler only sets a flag we don't need to block SIGTERM The arguments of commit d98bea900ee694cdba83149620c65bd7f8765f26 are no longer valid. metze --- source3/nmbd/nmbd.c | 3 --- 1 file changed, 3 deletions(-) (limited to 'source3/nmbd/nmbd.c') diff --git a/source3/nmbd/nmbd.c b/source3/nmbd/nmbd.c index 870b9a1f30..1b26c0a5ad 100644 --- a/source3/nmbd/nmbd.c +++ b/source3/nmbd/nmbd.c @@ -969,9 +969,6 @@ static bool open_sockets(bool isdaemon, int port) exit(1); } - /* We can only take signals in the select. */ - BlockSignals( True, SIGTERM ); - TALLOC_FREE(frame); process(); -- cgit From d361e332a86075c5c1f76e334b869da8aaa34b01 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 22 Jan 2009 16:17:23 +0100 Subject: s3:nmbd: handle SIG_TERM and SIGHUP via tevent metze --- source3/nmbd/nmbd.c | 115 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 67 insertions(+), 48 deletions(-) (limited to 'source3/nmbd/nmbd.c') diff --git a/source3/nmbd/nmbd.c b/source3/nmbd/nmbd.c index 1b26c0a5ad..adefb7d94f 100644 --- a/source3/nmbd/nmbd.c +++ b/source3/nmbd/nmbd.c @@ -85,41 +85,80 @@ static void terminate(void) exit(0); } -/**************************************************************************** ** - Handle a SHUTDOWN message from smbcontrol. - **************************************************************************** */ - -static void nmbd_terminate(struct messaging_context *msg, - void *private_data, - uint32_t msg_type, - struct server_id server_id, - DATA_BLOB *data) +static void nmbd_sig_term_handler(struct tevent_context *ev, + struct tevent_signal *se, + int signum, + int count, + void *siginfo, + void *private_data) { terminate(); } -/**************************************************************************** ** - Catch a SIGTERM signal. - **************************************************************************** */ +static bool nmbd_setup_sig_term_handler(void) +{ + struct tevent_signal *se; + + se = tevent_add_signal(nmbd_event_context(), + nmbd_event_context(), + SIGTERM, 0, + nmbd_sig_term_handler, + NULL); + if (!se) { + DEBUG(0,("failed to setup SIGTERM handler")); + return false; + } + + return true; +} -static SIG_ATOMIC_T got_sig_term; +static void msg_reload_nmbd_services(struct messaging_context *msg, + void *private_data, + uint32_t msg_type, + struct server_id server_id, + DATA_BLOB *data); + +static void nmbd_sig_hup_handler(struct tevent_context *ev, + struct tevent_signal *se, + int signum, + int count, + void *siginfo, + void *private_data) +{ + DEBUG(0,("Got SIGHUP dumping debug info.\n")); + msg_reload_nmbd_services(nmbd_messaging_context(), + NULL, MSG_SMB_CONF_UPDATED, + procid_self(), NULL); +} -static void sig_term(int sig) +static bool nmbd_setup_sig_hup_handler(void) { - got_sig_term = 1; - sys_select_signal(SIGTERM); + struct tevent_signal *se; + + se = tevent_add_signal(nmbd_event_context(), + nmbd_event_context(), + SIGHUP, 0, + nmbd_sig_hup_handler, + NULL); + if (!se) { + DEBUG(0,("failed to setup SIGHUP handler")); + return false; + } + + return true; } /**************************************************************************** ** - Catch a SIGHUP signal. + Handle a SHUTDOWN message from smbcontrol. **************************************************************************** */ -static SIG_ATOMIC_T reload_after_sighup; - -static void sig_hup(int sig) +static void nmbd_terminate(struct messaging_context *msg, + void *private_data, + uint32_t msg_type, + struct server_id server_id, + DATA_BLOB *data) { - reload_after_sighup = 1; - sys_select_signal(SIGHUP); + terminate(); } /**************************************************************************** ** @@ -451,15 +490,6 @@ static void process(void) return; } - /* - * Handle termination inband. - */ - - if (got_sig_term) { - got_sig_term = 0; - terminate(); - } - /* * Process all incoming packets * read above. This calls the success and @@ -629,19 +659,6 @@ static void process(void) clear_unexpected(t); - /* - * Reload the services file if we got a sighup. - */ - - if(reload_after_sighup) { - DEBUG( 0, ( "Got SIGHUP dumping debug info.\n" ) ); - msg_reload_nmbd_services(nmbd_messaging_context(), - NULL, MSG_SMB_CONF_UPDATED, - procid_self(), NULL); - - reload_after_sighup = 0; - } - /* check for new network interfaces */ reload_interfaces(t); @@ -807,10 +824,7 @@ static bool open_sockets(bool isdaemon, int port) BlockSignals(False, SIGHUP); BlockSignals(False, SIGUSR1); BlockSignals(False, SIGTERM); - - CatchSignal( SIGHUP, SIGNAL_CAST sig_hup ); - CatchSignal( SIGTERM, SIGNAL_CAST sig_term ); - + #if defined(SIGFPE) /* we are never interested in SIGFPE */ BlockSignals(True,SIGFPE); @@ -905,6 +919,11 @@ static bool open_sockets(bool isdaemon, int port) exit(1); } + if (!nmbd_setup_sig_term_handler()) + exit(1); + if (!nmbd_setup_sig_hup_handler()) + exit(1); + /* get broadcast messages */ claim_connection(NULL,"",FLAG_MSG_GENERAL|FLAG_MSG_DBWRAP); -- cgit