1/* 2 Unix SMB/CIFS implementation. 3 async implementation of WINBINDD_GETPWUID 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 23struct winbindd_getpwuid_state { 24 struct tevent_context *ev; 25 struct dom_sid sid; 26 struct winbindd_pw pw; 27}; 28 29static void winbindd_getpwuid_uid2sid_done(struct tevent_req *subreq); 30static void winbindd_getpwuid_done(struct tevent_req *subreq); 31 32struct tevent_req *winbindd_getpwuid_send(TALLOC_CTX *mem_ctx, 33 struct tevent_context *ev, 34 struct winbindd_cli_state *cli, 35 struct winbindd_request *request) 36{ 37 struct tevent_req *req, *subreq; 38 struct winbindd_getpwuid_state *state; 39 40 req = tevent_req_create(mem_ctx, &state, 41 struct winbindd_getpwuid_state); 42 if (req == NULL) { 43 return NULL; 44 } 45 state->ev = ev; 46 47 DEBUG(3, ("getpwuid %d\n", (int)request->data.uid)); 48 49 subreq = wb_uid2sid_send(state, ev, request->data.uid); 50 if (tevent_req_nomem(subreq, req)) { 51 return tevent_req_post(req, ev); 52 } 53 tevent_req_set_callback(subreq, winbindd_getpwuid_uid2sid_done, 54 req); 55 return req; 56} 57 58static void winbindd_getpwuid_uid2sid_done(struct tevent_req *subreq) 59{ 60 struct tevent_req *req = tevent_req_callback_data( 61 subreq, struct tevent_req); 62 struct winbindd_getpwuid_state *state = tevent_req_data( 63 req, struct winbindd_getpwuid_state); 64 NTSTATUS status; 65 66 status = wb_uid2sid_recv(subreq, &state->sid); 67 TALLOC_FREE(subreq); 68 if (!NT_STATUS_IS_OK(status)) { 69 tevent_req_nterror(req, status); 70 return; 71 } 72 73 subreq = wb_getpwsid_send(state, state->ev, &state->sid, &state->pw); 74 if (tevent_req_nomem(subreq, req)) { 75 return; 76 } 77 tevent_req_set_callback(subreq, winbindd_getpwuid_done, req); 78} 79 80static void winbindd_getpwuid_done(struct tevent_req *subreq) 81{ 82 struct tevent_req *req = tevent_req_callback_data( 83 subreq, struct tevent_req); 84 NTSTATUS status; 85 86 status = wb_getpwsid_recv(subreq); 87 TALLOC_FREE(subreq); 88 if (!NT_STATUS_IS_OK(status)) { 89 tevent_req_nterror(req, status); 90 return; 91 } 92 tevent_req_done(req); 93} 94 95NTSTATUS winbindd_getpwuid_recv(struct tevent_req *req, 96 struct winbindd_response *response) 97{ 98 struct winbindd_getpwuid_state *state = tevent_req_data( 99 req, struct winbindd_getpwuid_state); 100 NTSTATUS status; 101 102 if (tevent_req_is_nterror(req, &status)) { 103 DEBUG(5, ("Could not convert sid %s: %s\n", 104 sid_string_dbg(&state->sid), nt_errstr(status))); 105 return status; 106 } 107 response->data.pw = state->pw; 108 return NT_STATUS_OK; 109} 110