diff options
author | Bo Yang <boyang@novell.com> | 2009-01-05 19:47:45 +0800 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2009-01-05 15:07:31 +0100 |
commit | 022e2f81991f12637ca0eeb3a030d4cec69d6fb9 (patch) | |
tree | 47f153de1292b5b75d602f0a21428eb75510cac5 | |
parent | 73875cd344608b591fa884ab99b5f3a10550c149 (diff) | |
download | samba-022e2f81991f12637ca0eeb3a030d4cec69d6fb9.tar.gz samba-022e2f81991f12637ca0eeb3a030d4cec69d6fb9.tar.bz2 samba-022e2f81991f12637ca0eeb3a030d4cec69d6fb9.zip |
clean event context after child is forked.
Signed-off-by: Stefan Metzmacher <metze@samba.org>
-rw-r--r-- | source3/include/proto.h | 2 | ||||
-rw-r--r-- | source3/lib/events.c | 6 | ||||
-rw-r--r-- | source3/lib/util.c | 3 | ||||
-rw-r--r-- | source3/nmbd/asyncdns.c | 3 | ||||
-rw-r--r-- | source3/nmbd/nmbd.c | 3 | ||||
-rw-r--r-- | source3/printing/print_cups.c | 3 | ||||
-rw-r--r-- | source3/printing/printing.c | 3 | ||||
-rw-r--r-- | source3/smbd/server.c | 7 | ||||
-rw-r--r-- | source3/winbindd/winbindd.c | 3 | ||||
-rw-r--r-- | source3/winbindd/winbindd_cm.c | 3 | ||||
-rw-r--r-- | source3/winbindd/winbindd_dual.c | 40 |
11 files changed, 52 insertions, 24 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index 6238ba3d00..a361c62f75 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 8bbc9497ac..7d4cdc209b 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 d00a764c1d..08ea5add7a 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 ab9b1ed740..baa88bc44b 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 d1ab3aaacb..659db85e69 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 5fb1d379a6..d75d635779 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 ba88f8ee56..0f38aeab80 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 254180ae1c..a84b58a052 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 e881ab412e..b4f3c9c4dc 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 3135b6a2a3..14890683bc 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 4f1e92ed7c..169a80d701 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. */ |