summaryrefslogtreecommitdiff
path: root/source4/winbind/wb_cmd_setpwent.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/winbind/wb_cmd_setpwent.c')
-rw-r--r--source4/winbind/wb_cmd_setpwent.c56
1 files changed, 44 insertions, 12 deletions
diff --git a/source4/winbind/wb_cmd_setpwent.c b/source4/winbind/wb_cmd_setpwent.c
index 50ab2fdff6..8164d6f199 100644
--- a/source4/winbind/wb_cmd_setpwent.c
+++ b/source4/winbind/wb_cmd_setpwent.c
@@ -22,10 +22,7 @@
#include "includes.h"
#include "libcli/composite/composite.h"
#include "winbind/wb_server.h"
-#include "winbind/wb_async_helpers.h"
-#include "winbind/wb_helper.h"
#include "smbd/service_task.h"
-#include "libnet/libnet_proto.h"
struct cmd_setpwent_state {
struct composite_context *ctx;
@@ -33,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);
@@ -83,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;
@@ -96,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);
}
@@ -104,21 +105,52 @@ 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);
if (composite_nomem(user_list, state->ctx)) return;
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);
+ user_list);
+ 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, cnt = state->result->user_list->out.count
+ + user_list->out.count;
+ struct userlist *tmp;
+ tmp = state->result->user_list->out.users;
+ state->result->user_list->out.users = talloc_realloc(state->result,
+ tmp, struct userlist,
+ cnt);
+ tmp = state->result->user_list->out.users;
+ for(i=0;i<user_list->out.count;i++ ) {
+ tmp[state->result->user_list->out.count + i].username
+ = talloc_strdup(state->result, user_list->out.users[i].username);
+ }
+ state->result->user_list->out.count = cnt;
+ 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,