summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthieu Patou <mat@matws.net>2010-02-25 20:41:57 +0300
committerAndrew Bartlett <abartlet@samba.org>2010-02-26 21:38:43 +1100
commitb792e5575c8dcd1ec4f5a572561a48ea5744000c (patch)
treebd501e204389b220c0e56517d2b03294eb0ede23
parent25723914c5f5b18a25f758f1098ddded3c5aa074 (diff)
downloadsamba-b792e5575c8dcd1ec4f5a572561a48ea5744000c.tar.gz
samba-b792e5575c8dcd1ec4f5a572561a48ea5744000c.tar.bz2
samba-b792e5575c8dcd1ec4f5a572561a48ea5744000c.zip
s4: Winbind allow to behave more correctly when we have more than a few users
-rw-r--r--source4/winbind/wb_cmd_setpwent.c49
1 files changed, 41 insertions, 8 deletions
diff --git a/source4/winbind/wb_cmd_setpwent.c b/source4/winbind/wb_cmd_setpwent.c
index 7fb1889be5..9384849075 100644
--- a/source4/winbind/wb_cmd_setpwent.c
+++ b/source4/winbind/wb_cmd_setpwent.c
@@ -30,6 +30,7 @@ struct cmd_setpwent_state {
struct libnet_context *libnet_ctx;
struct wbsrv_pwent *result;
+ char *domain_name;
};
static void cmd_setpwent_recv_domain(struct composite_context *ctx);
@@ -80,6 +81,8 @@ static void cmd_setpwent_recv_domain(struct composite_context *ctx)
user_list = talloc(state->result, struct libnet_UserList);
if (composite_nomem(user_list, state->ctx)) return;
+ state->domain_name = talloc_strdup(state,
+ domain->libnet_ctx->samr.name);
user_list->in.domain_name = talloc_strdup(state,
domain->libnet_ctx->samr.name);
if (composite_nomem(user_list->in.domain_name, state->ctx)) return;
@@ -93,6 +96,7 @@ static void cmd_setpwent_recv_domain(struct composite_context *ctx)
ctx = libnet_UserList_send(domain->libnet_ctx, state->result, user_list,
NULL);
+ state->result->page_index = -1;
composite_continue(state->ctx, ctx, cmd_setpwent_recv_user_list, state);
}
@@ -101,7 +105,7 @@ static void cmd_setpwent_recv_user_list(struct composite_context *ctx)
struct cmd_setpwent_state *state = talloc_get_type(
ctx->async.private_data, struct cmd_setpwent_state);
struct libnet_UserList *user_list;
-
+ struct libnet_UserList *user_list_send;
DEBUG(5, ("cmd_setpwent_recv_user_list called\n"));
user_list = talloc(state->result, struct libnet_UserList);
@@ -109,13 +113,42 @@ static void cmd_setpwent_recv_user_list(struct composite_context *ctx)
state->ctx->status = libnet_UserList_recv(ctx, state->result,
user_list);
- if (!composite_is_ok(state->ctx)) return;
-
- state->result->user_list = user_list;
- state->result->page_index = 0;
- state->result->libnet_ctx = state->libnet_ctx;
-
- composite_done(state->ctx);
+ if (NT_STATUS_IS_OK(state->ctx->status) ||
+ NT_STATUS_EQUAL(state->ctx->status, STATUS_MORE_ENTRIES)) {
+ if( state->result->page_index == -1) { /* First run*/
+ state->result->user_list = user_list;
+ state->result->page_index = 0;
+ state->result->libnet_ctx = state->libnet_ctx;
+ } else {
+ int i;
+ struct userlist *tmp;
+ tmp = state->result->user_list->out.users;
+ state->result->user_list->out.users = talloc_realloc(state->result,tmp,struct userlist,
+ state->result->user_list->out.count+user_list->out.count);
+ tmp = state->result->user_list->out.users;
+ for(i=0;i<user_list->out.count;i++ ) {
+ tmp[i+state->result->user_list->out.count].username = talloc_steal(state->result,user_list->out.users[i].username);
+ }
+ state->result->user_list->out.count += user_list->out.count;
+ talloc_free(user_list);
+ }
+
+
+ if (NT_STATUS_IS_OK(state->ctx->status) ) {
+ composite_done(state->ctx);
+ } else {
+ user_list_send = talloc(state->result, struct libnet_UserList);
+ if (composite_nomem(user_list_send, state->ctx)) return;
+ user_list_send->in.domain_name = talloc_strdup(state, state->domain_name);
+ user_list_send->in.resume_index = user_list->out.resume_index;
+ user_list_send->in.page_size = 128;
+ ctx = libnet_UserList_send(state->libnet_ctx, state->result, user_list_send, NULL);
+ composite_continue(state->ctx, ctx, cmd_setpwent_recv_user_list, state);
+ }
+ } else {
+ composite_error(state->ctx, state->ctx->status);
+ }
+ return;
}
NTSTATUS wb_cmd_setpwent_recv(struct composite_context *ctx,