diff options
| author | Stefan Metzmacher <metze@samba.org> | 2009-01-22 16:17:23 +0100 | 
|---|---|---|
| committer | Stefan Metzmacher <metze@samba.org> | 2009-01-27 15:28:09 +0100 | 
| commit | d361e332a86075c5c1f76e334b869da8aaa34b01 (patch) | |
| tree | 04d649afa580a144fc210dedac648fa72595e195 | |
| parent | 2630d4a2523894386f4e1a37cfb3a312f4e8fdf5 (diff) | |
| download | samba-d361e332a86075c5c1f76e334b869da8aaa34b01.tar.gz samba-d361e332a86075c5c1f76e334b869da8aaa34b01.tar.bz2 samba-d361e332a86075c5c1f76e334b869da8aaa34b01.zip  | |
s3:nmbd: handle SIG_TERM and SIGHUP via tevent
metze
| -rw-r--r-- | source3/nmbd/nmbd.c | 115 | 
1 files changed, 67 insertions, 48 deletions
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();  }  /**************************************************************************** ** @@ -452,15 +491,6 @@ static void process(void)  		}  		/* -		 * Handle termination inband. -		 */ - -		if (got_sig_term) { -			got_sig_term = 0; -			terminate(); -		} - -		/*  		 * Process all incoming packets  		 * read above. This calls the success and  		 * failure functions registered when response @@ -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);  | 
