1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00

Now we have reliable signals take SIGTERM inband.

Jeremy.
(This used to be commit cad82926a8)
This commit is contained in:
Jeremy Allison 2002-03-14 02:15:08 +00:00
parent 57bd576445
commit 840279f342
3 changed files with 62 additions and 50 deletions

View File

@ -649,13 +649,14 @@ struct winbindd_state server_state; /* Server state information */
int main(int argc, char **argv)
{
extern BOOL AllowDebugChange;
extern pstring global_myname;
extern fstring global_myworkgroup;
extern BOOL append_log;
pstring logfile;
int accept_sock;
BOOL interactive = False;
int opt, new_debuglevel = -1;
int opt;
/* glibc (?) likes to print "User defined signal 1" and exit if a
SIGUSR2 is received before a handler is installed */
@ -698,7 +699,8 @@ int main(int argc, char **argv)
/* Run with specified debug level */
case 'd':
new_debuglevel = atoi(optarg);
DEBUGLEVEL = atoi(optarg);
AllowDebugChange = False;
break;
/* Load a different smb.conf file */
@ -740,9 +742,6 @@ int main(int argc, char **argv)
fstrcpy(global_myworkgroup, lp_workgroup());
if (new_debuglevel != -1)
DEBUGLEVEL = new_debuglevel;
if (!interactive)
become_daemon();

View File

@ -43,6 +43,7 @@ extern int global_oplock_break;
extern userdom_struct current_user_info;
extern int smb_read_error;
extern VOLATILE sig_atomic_t reload_after_sighup;
extern VOLATILE sig_atomic_t got_sig_term;
extern BOOL global_machine_password_needs_changing;
extern fstring global_myworkgroup;
extern pstring global_myname;
@ -104,9 +105,10 @@ BOOL push_oplock_pending_smb_message(char *buf, int msg_len)
}
/****************************************************************************
do all async processing in here. This includes UDB oplock messages, kernel
oplock messages, change notify events etc.
Do all async processing in here. This includes UDB oplock messages, kernel
oplock messages, change notify events etc.
****************************************************************************/
static void async_processing(fd_set *fds, char *buffer, int buffer_len)
{
/* check for oplock messages (both UDP and kernel) */
@ -114,6 +116,10 @@ static void async_processing(fd_set *fds, char *buffer, int buffer_len)
process_local_message(buffer, buffer_len);
}
if (got_sig_term) {
exit_server("Caught TERM signal");
}
/* check for async change notify events */
process_pending_change_notify_queue(0);
@ -122,7 +128,7 @@ static void async_processing(fd_set *fds, char *buffer, int buffer_len)
change_to_root_user();
DEBUG(1,("Reloading services after SIGHUP\n"));
reload_services(False);
reload_after_sighup = False;
reload_after_sighup = 0;
}
}

View File

@ -60,26 +60,43 @@ void smbd_set_server_fd(int fd)
}
/****************************************************************************
when exiting, take the whole family
Terminate signal.
****************************************************************************/
static void *dflt_sig(void)
VOLATILE sig_atomic_t got_sig_term = 0;
static void sig_term(void)
{
exit_server("caught signal");
return NULL;
got_sig_term = 1;
sys_select_signal();
}
/****************************************************************************
Catch a sighup.
****************************************************************************/
VOLATILE sig_atomic_t reload_after_sighup = 0;
static void sig_hup(int sig)
{
reload_after_sighup = 1;
sys_select_signal();
}
/****************************************************************************
Send a SIGTERM to our process group.
*****************************************************************************/
static void killkids(void)
{
if(am_parent) kill(0,SIGTERM);
}
/****************************************************************************
process a sam sync message - not sure whether to do this here or
somewhere else
Process a sam sync message - not sure whether to do this here or
somewhere else.
****************************************************************************/
static void msg_sam_sync(int UNUSED(msg_type), pid_t UNUSED(pid),
void *UNUSED(buf), size_t UNUSED(len))
{
@ -87,9 +104,10 @@ static void msg_sam_sync(int UNUSED(msg_type), pid_t UNUSED(pid),
}
/****************************************************************************
process a sam sync replicate message - not sure whether to do this here or
somewhere else
Process a sam sync replicate message - not sure whether to do this here or
somewhere else.
****************************************************************************/
static void msg_sam_repl(int msg_type, pid_t pid, void *buf, size_t len)
{
uint32 low_serial;
@ -104,8 +122,9 @@ static void msg_sam_repl(int msg_type, pid_t pid, void *buf, size_t len)
}
/****************************************************************************
open the socket communication
Open the socket communication - inetd.
****************************************************************************/
static BOOL open_sockets_inetd(void)
{
/* Started from inetd. fd 0 is the socket. */
@ -124,8 +143,9 @@ static BOOL open_sockets_inetd(void)
/****************************************************************************
open the socket communication
Open the socket communication.
****************************************************************************/
static BOOL open_sockets(BOOL is_daemon,int port)
{
int num_interfaces = iface_count();
@ -242,14 +262,16 @@ max can be %d\n",
num = sys_select(FD_SETSIZE,&lfds,NULL,NULL,NULL);
if (num == -1 && errno == EINTR) {
extern VOLATILE sig_atomic_t reload_after_sighup;
if (got_sig_term) {
exit_server("Caught TERM signal");
}
/* check for sighup processing */
if (reload_after_sighup) {
change_to_root_user();
DEBUG(1,("Reloading services after SIGHUP\n"));
reload_services(False);
reload_after_sighup = False;
reload_after_sighup = 0;
}
continue;
@ -347,8 +369,9 @@ max can be %d\n",
}
/****************************************************************************
reload the services file
**************************************************************************/
Reload the services file.
**************************************************************************/
BOOL reload_services(BOOL test)
{
BOOL ret;
@ -398,26 +421,6 @@ BOOL reload_services(BOOL test)
return(ret);
}
/****************************************************************************
Catch a sighup.
****************************************************************************/
VOLATILE sig_atomic_t reload_after_sighup = False;
static void sig_hup(int sig)
{
BlockSignals(True,SIGHUP);
DEBUG(0,("Got SIGHUP\n"));
sys_select_signal();
reload_after_sighup = True;
BlockSignals(False,SIGHUP);
}
#if DUMP_CORE
/*******************************************************************
prepare to dump a core file - carefully!
@ -472,8 +475,9 @@ static void decrement_smbd_process_count(void)
}
/****************************************************************************
exit the server
Exit the server.
****************************************************************************/
void exit_server(char *reason)
{
static int firsttime=1;
@ -527,8 +531,9 @@ void exit_server(char *reason)
}
/****************************************************************************
initialise connect, service and file structs
Initialise connect, service and file structs.
****************************************************************************/
static void init_structs(void )
{
/*
@ -560,8 +565,9 @@ static void init_structs(void )
}
/****************************************************************************
usage on the program
Usage on the program.
****************************************************************************/
static void usage(char *pname)
{
@ -584,8 +590,9 @@ static void usage(char *pname)
}
/****************************************************************************
main program
main program.
****************************************************************************/
int main(int argc,char *argv[])
{
extern BOOL append_log;
@ -704,8 +711,9 @@ static void usage(char *pname)
gain_root_group_privilege();
fault_setup((void (*)(void *))exit_server);
CatchSignal(SIGTERM , SIGNAL_CAST dflt_sig);
CatchSignal(SIGTERM , SIGNAL_CAST sig_term);
CatchSignal(SIGHUP,SIGNAL_CAST sig_hup);
/* we are never interested in SIGPIPE */
BlockSignals(True,SIGPIPE);
@ -723,6 +731,7 @@ static void usage(char *pname)
* these signals masked, we will have problems, as we won't recieve them. */
BlockSignals(False, SIGHUP);
BlockSignals(False, SIGUSR1);
BlockSignals(False, SIGTERM);
/* we want total control over the permissions on created files,
so set our umask to 0 */
@ -778,8 +787,6 @@ static void usage(char *pname)
fstrcpy(global_myworkgroup, lp_workgroup());
CatchSignal(SIGHUP,SIGNAL_CAST sig_hup);
DEBUG(3,( "loaded services\n"));
if (!is_daemon && !is_a_socket(0)) {