From 908812e98d84bd3eded612cd6f40637997a966ff Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 30 May 2008 17:52:54 -0700 Subject: Fix bug #5504. winbindd children and parent were handing SIGTERM in the same way - deleting the socket! Jeremy. (This used to be commit 3ab5a3883e33eba159152aa02544d71f047c7e45) --- source3/winbindd/winbindd.c | 25 +++++++++++++++---------- source3/winbindd/winbindd_dual.c | 2 +- source3/winbindd/winbindd_proto.h | 2 +- 3 files changed, 17 insertions(+), 12 deletions(-) (limited to 'source3/winbindd') diff --git a/source3/winbindd/winbindd.c b/source3/winbindd/winbindd.c index 57eee20f49..c017916f09 100644 --- a/source3/winbindd/winbindd.c +++ b/source3/winbindd/winbindd.c @@ -131,15 +131,20 @@ static void flush_caches(void) /* Handle the signal by unlinking socket and exiting */ -static void terminate(void) +static void terminate(bool is_parent) { - char *path = NULL; - - /* Remove socket file */ - if (asprintf(&path, "%s/%s", + if (is_parent) { + /* When parent goes away we should + * remove the socket file. Not so + * when children terminate. + */ + char *path = NULL; + + if (asprintf(&path, "%s/%s", get_winbind_pipe_dir(), WINBINDD_SOCKET_NAME) > 0) { - unlink(path); - SAFE_FREE(path); + unlink(path); + SAFE_FREE(path); + } } idmap_close(); @@ -810,10 +815,10 @@ void winbind_check_sighup(void) } /* check if TERM has been received */ -void winbind_check_sigterm(void) +void winbind_check_sigterm(bool is_parent) { if (do_sigterm) - terminate(); + terminate(is_parent); } /* Process incoming clients on listen_sock. We use a tricky non-blocking, @@ -975,7 +980,7 @@ static void process_loop(void) /* Check signal handling things */ - winbind_check_sigterm(); + winbind_check_sigterm(true); winbind_check_sighup(); if (do_sigusr2) { diff --git a/source3/winbindd/winbindd_dual.c b/source3/winbindd/winbindd_dual.c index ae042563ed..b8c0ab9113 100644 --- a/source3/winbindd/winbindd_dual.c +++ b/source3/winbindd/winbindd_dual.c @@ -1097,7 +1097,7 @@ static bool fork_domain_child(struct winbindd_child *child) TALLOC_CTX *frame = talloc_stackframe(); /* check for signals */ - winbind_check_sigterm(); + winbind_check_sigterm(false); winbind_check_sighup(); run_events(winbind_event_context(), 0, NULL, NULL); diff --git a/source3/winbindd/winbindd_proto.h b/source3/winbindd/winbindd_proto.h index f6a0da8fff..356d4aaf79 100644 --- a/source3/winbindd/winbindd_proto.h +++ b/source3/winbindd/winbindd_proto.h @@ -67,7 +67,7 @@ void request_error(struct winbindd_cli_state *state); void request_ok(struct winbindd_cli_state *state); void request_finished_cont(void *private_data, bool success); void winbind_check_sighup(void); -void winbind_check_sigterm(void); +void winbind_check_sigterm(bool in_parent); int main(int argc, char **argv, char **envp); /* The following definitions come from winbindd/winbindd_ads.c */ -- cgit