From: Michael Adam Date: Tue, 26 Feb 2013 16:38:14 +0000 (+0100) Subject: TODO- s3:winbindd: use tevent_loop_wait() in the main loop X-Git-Url: http://git.samba.org/?a=commitdiff_plain;h=b8e87dd42a76a01795e1c247eb1fecbdd41d0631;hp=c80ca7967c2d006340530818465a793ed5deb350;p=metze%2Fsamba%2Fwip.git TODO- s3:winbindd: use tevent_loop_wait() in the main loop Pair-Programmed-With: Stefan Metzmacher TODO: also child ... TODO: let winbindd_tevent_trace_state be a stack variable, similar to 1d615ee923a2b46ffd7f943a9ba9e362b6322e5e and 9afc37bef4e60ea4a13db8ae68ba30d73b5b719c --- diff --git a/source3/winbindd/winbindd.c b/source3/winbindd/winbindd.c index f79dc478a77c..5f26b08669f9 100644 --- a/source3/winbindd/winbindd.c +++ b/source3/winbindd/winbindd.c @@ -1508,6 +1508,34 @@ static void winbindd_addr_changed(struct tevent_req *req) tevent_req_set_callback(req, winbindd_addr_changed, state); } + +struct winbindd_tevent_trace_state { + TALLOC_CTX *frame; +}; + +static void winbindd_tevent_trace_callback(enum tevent_trace_point point, + void *private_data) +{ + struct winbindd_tevent_trace_state *state = + talloc_get_type_abort(private_data, + struct winbindd_tevent_trace_state); + + switch (point) { + case TEVENT_TRACE_BEFORE_WAIT: + case TEVENT_TRACE_AFTER_WAIT: + break; + case TEVENT_TRACE_BEFORE_LOOP_ONCE: + TALLOC_FREE(state->frame); + state->frame = talloc_stackframe(); + errno = 0; + break; + case TEVENT_TRACE_AFTER_LOOP_ONCE: + TALLOC_FREE(state->frame); + break; + } +} + + /* Main function */ int main(int argc, const char **argv) @@ -1538,6 +1566,9 @@ int main(int argc, const char **argv) TALLOC_CTX *frame; NTSTATUS status; bool ok; + int ret = 0; + struct tevent_context *ev_ctx = NULL; + struct winbindd_tevent_trace_state *trace_state = NULL; /* * Do this before any other talloc operation @@ -1707,7 +1738,7 @@ int main(int argc, const char **argv) if (!init_names()) exit(1); - load_interfaces(); + load_interfaces(); if (!secrets_init()) { @@ -1803,17 +1834,34 @@ int main(int argc, const char **argv) } /* Loop waiting for requests */ - while (1) { - frame = talloc_stackframe(); - if (tevent_loop_once(winbind_event_context()) == -1) { - DEBUG(1, ("tevent_loop_once() failed: %s\n", - strerror(errno))); - return 1; - } + ev_ctx = winbind_event_context(); + if (ev_ctx == NULL) { + DEBUG(0, ("%s: winbind_event_context() failed\n", + __location__)); + exit(1); + } - TALLOC_FREE(frame); + trace_state = talloc_zero(ev_ctx, struct winbindd_tevent_trace_state); + if (trace_state == NULL) { + DEBUG(0, ("talloc_zero(winbindd_tevent_trace_state).\n")); + exit(1); } + trace_state->frame = frame; + frame = NULL; + + tevent_set_trace_callback(ev_ctx, winbindd_tevent_trace_callback, + trace_state); + + ret = tevent_loop_wait(ev_ctx); + if (ret != 0) { + DEBUG(0, ("tevent_loop_wait failed: %d, %s, exiting\n", + ret, strerror(errno))); + exit(1); + } + + TALLOC_FREE(trace_state->frame); + return 0; } diff --git a/source3/winbindd/winbindd_dual.c b/source3/winbindd/winbindd_dual.c index c16b94e2be34..9bea4b78a4b4 100644 --- a/source3/winbindd/winbindd_dual.c +++ b/source3/winbindd/winbindd_dual.c @@ -1587,7 +1587,6 @@ static bool fork_domain_child(struct winbindd_child *child) while (1) { int ret; - TALLOC_CTX *frame = talloc_stackframe(); ret = tevent_loop_once(winbind_event_context()); if (ret != 0) { @@ -1603,8 +1602,6 @@ static bool fork_domain_child(struct winbindd_child *child) child->domain->name )); child->domain->startup = False; } - - TALLOC_FREE(frame); } }