1/* 2 Unix SMB/CIFS implementation. 3 async lookupuseraliases 4 Copyright (C) Volker Lendecke 2009 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program. If not, see <http://www.gnu.org/licenses/>. 18*/ 19 20#include "includes.h" 21#include "winbindd.h" 22#include "librpc/gen_ndr/cli_wbint.h" 23 24struct wb_lookupuseraliases_state { 25 struct tevent_context *ev; 26 struct wbint_SidArray sids; 27 struct wbint_RidArray rids; 28}; 29 30static void wb_lookupuseraliases_done(struct tevent_req *subreq); 31 32struct tevent_req *wb_lookupuseraliases_send(TALLOC_CTX *mem_ctx, 33 struct tevent_context *ev, 34 struct winbindd_domain *domain, 35 int num_sids, 36 const struct dom_sid *sids) 37{ 38 struct tevent_req *req, *subreq; 39 struct wb_lookupuseraliases_state *state; 40 41 req = tevent_req_create(mem_ctx, &state, 42 struct wb_lookupuseraliases_state); 43 if (req == NULL) { 44 return NULL; 45 } 46 state->sids.num_sids = num_sids; 47 state->sids.sids = CONST_DISCARD(struct dom_sid *, sids); 48 49 subreq = rpccli_wbint_LookupUserAliases_send( 50 state, ev, domain->child.rpccli, &state->sids, &state->rids); 51 if (tevent_req_nomem(subreq, req)) { 52 return tevent_req_post(req, ev); 53 } 54 tevent_req_set_callback(subreq, wb_lookupuseraliases_done, req); 55 return req; 56} 57 58static void wb_lookupuseraliases_done(struct tevent_req *subreq) 59{ 60 struct tevent_req *req = tevent_req_callback_data( 61 subreq, struct tevent_req); 62 struct wb_lookupuseraliases_state *state = tevent_req_data( 63 req, struct wb_lookupuseraliases_state); 64 NTSTATUS status, result; 65 66 status = rpccli_wbint_LookupUserAliases_recv(subreq, state, &result); 67 TALLOC_FREE(subreq); 68 if (!NT_STATUS_IS_OK(status)) { 69 tevent_req_nterror(req, status); 70 return; 71 } 72 if (!NT_STATUS_IS_OK(result)) { 73 tevent_req_nterror(req, result); 74 return; 75 } 76 tevent_req_done(req); 77} 78 79NTSTATUS wb_lookupuseraliases_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx, 80 uint32_t *num_aliases, uint32_t **aliases) 81{ 82 struct wb_lookupuseraliases_state *state = tevent_req_data( 83 req, struct wb_lookupuseraliases_state); 84 NTSTATUS status; 85 86 if (tevent_req_is_nterror(req, &status)) { 87 return status; 88 } 89 *num_aliases = state->rids.num_rids; 90 *aliases = talloc_move(mem_ctx, &state->rids.rids); 91 return NT_STATUS_OK; 92} 93