static void wb_next_pwent_fetch_done(struct tevent_req *subreq);
static void wb_next_pwent_fill_done(struct tevent_req *subreq);
-struct tevent_req *wb_next_pwent_send(TALLOC_CTX *mem_ctx,
- struct tevent_context *ev,
- struct getpwent_state *gstate,
- struct winbindd_pw *pw)
+static void wb_next_pwent_send_do(struct tevent_req *req,
+ struct wb_next_pwent_state *state)
{
- struct tevent_req *req, *subreq;
- struct wb_next_pwent_state *state;
-
- req = tevent_req_create(mem_ctx, &state, struct wb_next_pwent_state);
- if (req == NULL) {
- return NULL;
- }
- state->ev = ev;
- state->gstate = gstate;
- state->pw = pw;
+ struct tevent_req *subreq;
if (state->gstate->next_user >= state->gstate->num_users) {
TALLOC_FREE(state->gstate->users);
state->gstate->domain = wb_next_domain(state->gstate->domain);
if (state->gstate->domain == NULL) {
tevent_req_nterror(req, NT_STATUS_NO_MORE_ENTRIES);
- return tevent_req_post(req, ev);
+ return;
}
+
subreq = wb_query_user_list_send(state, state->ev,
state->gstate->domain);
if (tevent_req_nomem(subreq, req)) {
- return tevent_req_post(req, ev);
+ return;
}
+
tevent_req_set_callback(subreq, wb_next_pwent_fetch_done, req);
- return req;
+ return;
}
- subreq = wb_fill_pwent_send(
- state, state->ev,
- &state->gstate->users[state->gstate->next_user],
- state->pw);
+ subreq = wb_fill_pwent_send(state, state->ev,
+ &state->gstate->users[state->gstate->next_user],
+ state->pw);
if (tevent_req_nomem(subreq, req)) {
- return tevent_req_post(req, ev);
+ return;
}
+
tevent_req_set_callback(subreq, wb_next_pwent_fill_done, req);
+}
+
+struct tevent_req *wb_next_pwent_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct getpwent_state *gstate,
+ struct winbindd_pw *pw)
+{
+ struct tevent_req *req;
+ struct wb_next_pwent_state *state;
+
+ req = tevent_req_create(mem_ctx, &state, struct wb_next_pwent_state);
+ if (req == NULL) {
+ return NULL;
+ }
+ state->ev = ev;
+ state->gstate = gstate;
+ state->pw = pw;
+
+ wb_next_pwent_send_do(req, state);
+ if (!tevent_req_is_in_progress(req)) {
+ return tevent_req_post(req, ev);
+ }
+
return req;
}
state->gstate->next_user = 0;
- if (state->gstate->num_users == 0) {
- state->gstate->domain = wb_next_domain(state->gstate->domain);
- if (state->gstate->domain == NULL) {
- tevent_req_nterror(req, NT_STATUS_NO_MORE_ENTRIES);
- return;
- }
- subreq = wb_query_user_list_send(state, state->ev,
- state->gstate->domain);
- if (tevent_req_nomem(subreq, req)) {
- return;
- }
- tevent_req_set_callback(subreq, wb_next_pwent_fetch_done, req);
- return;
- }
-
- subreq = wb_fill_pwent_send(
- state, state->ev,
- &state->gstate->users[state->gstate->next_user],
- state->pw);
- if (tevent_req_nomem(subreq, req)) {
- return;
- }
- tevent_req_set_callback(subreq, wb_next_pwent_fill_done, req);
+ wb_next_pwent_send_do(req, state);
}
static void wb_next_pwent_fill_done(struct tevent_req *subreq)
if (NT_STATUS_EQUAL(status, NT_STATUS_NONE_MAPPED)) {
state->gstate->next_user += 1;
- if (state->gstate->next_user >= state->gstate->num_users) {
- TALLOC_FREE(state->gstate->users);
-
- state->gstate->domain = wb_next_domain(state->gstate->domain);
- if (state->gstate->domain == NULL) {
- tevent_req_nterror(req, NT_STATUS_NO_MORE_ENTRIES);
- return;
- }
-
- subreq = wb_query_user_list_send(state, state->ev,
- state->gstate->domain);
- if (tevent_req_nomem(subreq, req)) {
- return;
- }
- tevent_req_set_callback(subreq, wb_next_pwent_fetch_done, req);
- return;
- }
-
- subreq = wb_fill_pwent_send(state,
- state->ev,
- &state->gstate->users[state->gstate->next_user],
- state->pw);
- if (tevent_req_nomem(subreq, req)) {
- return;
- }
- tevent_req_set_callback(subreq, wb_next_pwent_fill_done, req);
+ wb_next_pwent_send_do(req, state);
return;
} else if (tevent_req_nterror(req, status)) {