1/* 2 Unix SMB/CIFS implementation. 3 4 Command backend for setpwent 5 6 Copyright (C) Kai Blin 2007 7 8 This program is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 3 of the License, or 11 (at your option) any later version. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program. If not, see <http://www.gnu.org/licenses/>. 20*/ 21 22#include "includes.h" 23#include "libcli/composite/composite.h" 24#include "winbind/wb_server.h" 25#include "winbind/wb_async_helpers.h" 26#include "winbind/wb_helper.h" 27#include "smbd/service_task.h" 28#include "libnet/libnet_proto.h" 29 30struct cmd_setpwent_state { 31 struct composite_context *ctx; 32 struct wbsrv_service *service; 33 struct libnet_context *libnet_ctx; 34 35 struct wbsrv_pwent *result; 36}; 37 38static void cmd_setpwent_recv_domain(struct composite_context *ctx); 39static void cmd_setpwent_recv_user_list(struct composite_context *ctx); 40 41struct composite_context *wb_cmd_setpwent_send(TALLOC_CTX *mem_ctx, 42 struct wbsrv_service *service) 43{ 44 struct composite_context *ctx, *result; 45 struct cmd_setpwent_state *state; 46 47 DEBUG(5, ("wb_cmd_setpwent_send called\n")); 48 49 result = composite_create(mem_ctx, service->task->event_ctx); 50 if (!result) return NULL; 51 52 state = talloc(mem_ctx, struct cmd_setpwent_state); 53 if (composite_nomem(state, result)) return result; 54 55 state->ctx = result; 56 result->private_data = state; 57 state->service = service; 58 59 state->result = talloc(state, struct wbsrv_pwent); 60 if (composite_nomem(state->result, state->ctx)) return result; 61 62 ctx = wb_sid2domain_send(state, service, service->primary_sid); 63 if (composite_nomem(ctx, state->ctx)) return result; 64 65 composite_continue(state->ctx, ctx, cmd_setpwent_recv_domain, state); 66 return result; 67} 68 69static void cmd_setpwent_recv_domain(struct composite_context *ctx) 70{ 71 struct cmd_setpwent_state *state = talloc_get_type( 72 ctx->async.private_data, struct cmd_setpwent_state); 73 struct wbsrv_domain *domain; 74 struct libnet_UserList *user_list; 75 76 DEBUG(5, ("cmd_setpwent_recv_domain called\n")); 77 78 state->ctx->status = wb_sid2domain_recv(ctx, &domain); 79 if (!composite_is_ok(state->ctx)) return; 80 81 state->libnet_ctx = domain->libnet_ctx; 82 83 user_list = talloc(state->result, struct libnet_UserList); 84 if (composite_nomem(user_list, state->ctx)) return; 85 86 user_list->in.domain_name = talloc_strdup(state, 87 domain->libnet_ctx->samr.name); 88 if (composite_nomem(user_list->in.domain_name, state->ctx)) return; 89 90 /* Page size recommended by Rafal */ 91 user_list->in.page_size = 128; 92 93 /* Always get the start of the list */ 94 user_list->in.resume_index = 0; 95 96 ctx = libnet_UserList_send(domain->libnet_ctx, state->result, user_list, 97 NULL); 98 99 composite_continue(state->ctx, ctx, cmd_setpwent_recv_user_list, state); 100} 101 102static void cmd_setpwent_recv_user_list(struct composite_context *ctx) 103{ 104 struct cmd_setpwent_state *state = talloc_get_type( 105 ctx->async.private_data, struct cmd_setpwent_state); 106 struct libnet_UserList *user_list; 107 108 DEBUG(5, ("cmd_setpwent_recv_user_list called\n")); 109 110 user_list = talloc(state->result, struct libnet_UserList); 111 if (composite_nomem(user_list, state->ctx)) return; 112 113 state->ctx->status = libnet_UserList_recv(ctx, state->result, 114 user_list); 115 if (!composite_is_ok(state->ctx)) return; 116 117 state->result->user_list = user_list; 118 state->result->page_index = 0; 119 state->result->libnet_ctx = state->libnet_ctx; 120 121 composite_done(state->ctx); 122} 123 124NTSTATUS wb_cmd_setpwent_recv(struct composite_context *ctx, 125 TALLOC_CTX *mem_ctx, struct wbsrv_pwent **pwent) 126{ 127 NTSTATUS status = composite_wait(ctx); 128 129 DEBUG(5, ("wb_cmd_setpwent_recv called\n")); 130 131 if (NT_STATUS_IS_OK(status)) { 132 struct cmd_setpwent_state *state = 133 talloc_get_type(ctx->private_data, 134 struct cmd_setpwent_state); 135 136 *pwent = talloc_steal(mem_ctx, state->result); 137 } 138 139 talloc_free(ctx); 140 return status; 141} 142 143