s3:winbind:pwent: refactor duplication into wb_next_pwent_send_do()
authorMichael Adam <obnox@samba.org>
Mon, 19 Jan 2015 12:51:39 +0000 (13:51 +0100)
committerGünther Deschner <gd@samba.org>
Mon, 16 Mar 2015 19:26:51 +0000 (20:26 +0100)
Signed-off-by: Michael Adam <obnox@samba.org>
Reviewed-by: Guenther Deschner <gd@samba.org>
source3/winbindd/wb_next_pwent.c

index a6159def5f3c6d92227a2bf61f9af8d4e6467896..af5e8d9f9aaf9e14d90d133f3d3cdfa1f18c53a6 100644 (file)
@@ -31,21 +31,10 @@ struct wb_next_pwent_state {
 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);
@@ -53,25 +42,50 @@ struct tevent_req *wb_next_pwent_send(TALLOC_CTX *mem_ctx,
                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;
 }
 
@@ -97,29 +111,7 @@ static void wb_next_pwent_fetch_done(struct tevent_req *subreq)
 
        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)
@@ -139,32 +131,7 @@ 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)) {