From: Bo Yang Date: Mon, 5 Jan 2009 11:47:45 +0000 (+0800) Subject: clean event context after child is forked. X-Git-Tag: samba-4.0.0alpha6~280^2~18 X-Git-Url: http://git.samba.org/samba.git/?a=commitdiff_plain;h=022e2f81991f12637ca0eeb3a030d4cec69d6fb9;p=ira%2Fwip.git clean event context after child is forked. Signed-off-by: Stefan Metzmacher --- diff --git a/source3/include/proto.h b/source3/include/proto.h index 6238ba3d008..a361c62f75a 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -534,6 +534,7 @@ bool run_events(struct event_context *event_ctx, struct timeval *get_timed_events_timeout(struct event_context *event_ctx, struct timeval *to_ret); int event_loop_once(struct event_context *ev); +void event_context_reinit(struct event_context *ev); struct event_context *event_context_init(TALLOC_CTX *mem_ctx); int set_event_dispatch_time(struct event_context *event_ctx, const char *event_name, struct timeval when); @@ -1183,6 +1184,7 @@ int set_blocking(int fd, bool set); void smb_msleep(unsigned int t); void become_daemon(bool Fork, bool no_process_group); bool reinit_after_fork(struct messaging_context *msg_ctx, + struct event_context *ev_ctx, bool parent_longlived); bool yesno(const char *p); void *malloc_(size_t size); diff --git a/source3/lib/events.c b/source3/lib/events.c index 8bbc9497ac7..7d4cdc209bd 100644 --- a/source3/lib/events.c +++ b/source3/lib/events.c @@ -369,6 +369,12 @@ static int event_context_destructor(struct event_context *ev) return 0; } +void event_context_reinit(struct event_context *ev) +{ + event_context_destructor(ev); + return; +} + struct event_context *event_context_init(TALLOC_CTX *mem_ctx) { struct event_context *result; diff --git a/source3/lib/util.c b/source3/lib/util.c index d00a764c1d5..08ea5add7a5 100644 --- a/source3/lib/util.c +++ b/source3/lib/util.c @@ -949,6 +949,7 @@ void become_daemon(bool Fork, bool no_process_group) } bool reinit_after_fork(struct messaging_context *msg_ctx, + struct event_context *ev_ctx, bool parent_longlived) { NTSTATUS status; @@ -976,6 +977,8 @@ bool reinit_after_fork(struct messaging_context *msg_ctx, return false; } + event_context_reinit(ev_ctx); + return true; } diff --git a/source3/nmbd/asyncdns.c b/source3/nmbd/asyncdns.c index ab9b1ed740e..baa88bc44b5 100644 --- a/source3/nmbd/asyncdns.c +++ b/source3/nmbd/asyncdns.c @@ -164,7 +164,8 @@ void start_async_dns(void) CatchSignal(SIGHUP, SIG_IGN); CatchSignal(SIGTERM, SIGNAL_CAST sig_term ); - if (!reinit_after_fork(nmbd_messaging_context(), true)) { + if (!reinit_after_fork(nmbd_messaging_context(), + nmbd_event_context(), true)) { DEBUG(0,("reinit_after_fork() failed\n")); smb_panic("reinit_after_fork() failed"); } diff --git a/source3/nmbd/nmbd.c b/source3/nmbd/nmbd.c index d1ab3aaacbd..659db85e69f 100644 --- a/source3/nmbd/nmbd.c +++ b/source3/nmbd/nmbd.c @@ -911,7 +911,8 @@ static bool open_sockets(bool isdaemon, int port) pidfile_create("nmbd"); - if (!reinit_after_fork(nmbd_messaging_context(), false)) { + if (!reinit_after_fork(nmbd_messaging_context(), + nmbd_event_context(), false)) { DEBUG(0,("reinit_after_fork() failed\n")); exit(1); } diff --git a/source3/printing/print_cups.c b/source3/printing/print_cups.c index 5fb1d379a63..d75d635779d 100644 --- a/source3/printing/print_cups.c +++ b/source3/printing/print_cups.c @@ -425,7 +425,8 @@ static bool cups_pcap_load_async(int *pfd) } /* Child. */ - if (!reinit_after_fork(smbd_messaging_context(), true)) { + if (!reinit_after_fork(smbd_messaging_context(), + smbd_event_context(), true)) { DEBUG(0,("cups_pcap_load_async: reinit_after_fork() failed\n")); smb_panic("cups_pcap_load_async: reinit_after_fork() failed"); } diff --git a/source3/printing/printing.c b/source3/printing/printing.c index ba88f8ee566..0f38aeab806 100644 --- a/source3/printing/printing.c +++ b/source3/printing/printing.c @@ -1421,7 +1421,8 @@ void start_background_queue(void) close(pause_pipe[0]); pause_pipe[0] = -1; - if (!reinit_after_fork(smbd_messaging_context(), true)) { + if (!reinit_after_fork(smbd_messaging_context(), + smbd_event_context(), true)) { DEBUG(0,("reinit_after_fork() failed\n")); smb_panic("reinit_after_fork() failed"); } diff --git a/source3/smbd/server.c b/source3/smbd/server.c index 254180ae1ca..a84b58a0528 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -753,7 +753,9 @@ static bool open_sockets_smbd(bool is_daemon, bool interactive, const char *smb_ false); if (!reinit_after_fork( - smbd_messaging_context(), true)) { + smbd_messaging_context(), + smbd_event_context(), + true)) { DEBUG(0,("reinit_after_fork() failed\n")); smb_panic("reinit_after_fork() failed"); } @@ -1327,7 +1329,8 @@ extern void build_options(bool screen); if (is_daemon) pidfile_create("smbd"); - if (!reinit_after_fork(smbd_messaging_context(), false)) { + if (!reinit_after_fork(smbd_messaging_context(), + smbd_event_context(), false)) { DEBUG(0,("reinit_after_fork() failed\n")); exit(1); } diff --git a/source3/winbindd/winbindd.c b/source3/winbindd/winbindd.c index e881ab412ec..b4f3c9c4dc8 100644 --- a/source3/winbindd/winbindd.c +++ b/source3/winbindd/winbindd.c @@ -1191,7 +1191,8 @@ int main(int argc, char **argv, char **envp) TimeInit(); - if (!reinit_after_fork(winbind_messaging_context(), false)) { + if (!reinit_after_fork(winbind_messaging_context(), + winbind_event_context(), false)) { DEBUG(0,("reinit_after_fork() failed\n")); exit(1); } diff --git a/source3/winbindd/winbindd_cm.c b/source3/winbindd/winbindd_cm.c index 3135b6a2a3e..14890683bc0 100644 --- a/source3/winbindd/winbindd_cm.c +++ b/source3/winbindd/winbindd_cm.c @@ -212,7 +212,8 @@ static bool fork_child_dc_connect(struct winbindd_domain *domain) /* Leave messages blocked - we will never process one. */ - if (!reinit_after_fork(winbind_messaging_context(), true)) { + if (!reinit_after_fork(winbind_messaging_context(), + winbind_event_context(), true)) { DEBUG(0,("reinit_after_fork() failed\n")); messaging_send_buf(winbind_messaging_context(), pid_to_procid(parent_pid), diff --git a/source3/winbindd/winbindd_dual.c b/source3/winbindd/winbindd_dual.c index 4f1e92ed7c1..169a80d701b 100644 --- a/source3/winbindd/winbindd_dual.c +++ b/source3/winbindd/winbindd_dual.c @@ -1177,7 +1177,8 @@ static bool fork_domain_child(struct winbindd_child *child) state.sock = fdpair[0]; close(fdpair[1]); - if (!reinit_after_fork(winbind_messaging_context(), true)) { + if (!reinit_after_fork(winbind_messaging_context(), + winbind_event_context(), true)) { DEBUG(0,("reinit_after_fork() failed\n")); _exit(0); } @@ -1219,27 +1220,34 @@ static bool fork_domain_child(struct winbindd_child *child) messaging_register(winbind_messaging_context(), NULL, MSG_DEBUG, debug_message); + primary_domain = find_our_domain(); + + if (primary_domain == NULL) { + smb_panic("no primary domain found"); + } + /* we have destroy all time event in reinit_after_fork() + * set check_online_event to NULL */ + for (domain = domain_list(); domain; domain = domain->next) { + domain->check_online_event = NULL; + } + /* It doesn't matter if we allow cache login, + * try to bring domain online after fork. */ if ( child->domain ) { child->domain->startup = True; child->domain->startup_time = time(NULL); - } - - /* Ensure we have no pending check_online events other - than one for this domain or the primary domain. */ - - for (domain = domain_list(); domain; domain = domain->next) { - if (domain->primary) { - primary_domain = domain; - } - if ((domain != child->domain) && !domain->primary) { - TALLOC_FREE(domain->check_online_event); + /* we can be in primary domain or in trusted domain + * If we are in trusted domain, set the primary domain + * in start-up mode */ + if (!(child->domain->internal)) { + set_domain_online_request(child->domain); + if (!(child->domain->primary)) { + primary_domain->startup = True; + primary_domain->startup_time = time(NULL); + set_domain_online_request(primary_domain); + } } } - if (primary_domain == NULL) { - smb_panic("no primary domain found"); - } - /* Ensure we're not handling an event inherited from our parent. */