1/* 2 Unix SMB/CIFS implementation. 3 async implementation of WINBINDD_GETPWSID 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_getpwsid_state { 24 struct dom_sid sid; 25 struct winbindd_pw pw; 26}; 27 28static void winbindd_getpwsid_done(struct tevent_req *subreq); 29 30struct tevent_req *winbindd_getpwsid_send(TALLOC_CTX *mem_ctx, 31 struct tevent_context *ev, 32 struct winbindd_cli_state *cli, 33 struct winbindd_request *request) 34{ 35 struct tevent_req *req, *subreq; 36 struct winbindd_getpwsid_state *state; 37 38 req = tevent_req_create(mem_ctx, &state, 39 struct winbindd_getpwsid_state); 40 if (req == NULL) { 41 return NULL; 42 } 43 44 /* Ensure null termination */ 45 request->data.sid[sizeof(request->data.sid)-1]='\0'; 46 47 DEBUG(3, ("getpwsid %s\n", request->data.sid)); 48 49 if (!string_to_sid(&state->sid, request->data.sid)) { 50 DEBUG(1, ("Could not get convert sid %s from string\n", 51 request->data.sid)); 52 tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER); 53 return tevent_req_post(req, ev); 54 } 55 56 subreq = wb_getpwsid_send(state, ev, &state->sid, &state->pw); 57 if (tevent_req_nomem(subreq, req)) { 58 return tevent_req_post(req, ev); 59 } 60 tevent_req_set_callback(subreq, winbindd_getpwsid_done, req); 61 return req; 62} 63 64static void winbindd_getpwsid_done(struct tevent_req *subreq) 65{ 66 struct tevent_req *req = tevent_req_callback_data( 67 subreq, struct tevent_req); 68 NTSTATUS status; 69 70 status = wb_getpwsid_recv(subreq); 71 TALLOC_FREE(subreq); 72 if (!NT_STATUS_IS_OK(status)) { 73 tevent_req_nterror(req, status); 74 return; 75 } 76 tevent_req_done(req); 77} 78 79NTSTATUS winbindd_getpwsid_recv(struct tevent_req *req, 80 struct winbindd_response *response) 81{ 82 struct winbindd_getpwsid_state *state = tevent_req_data( 83 req, struct winbindd_getpwsid_state); 84 NTSTATUS status; 85 86 if (tevent_req_is_nterror(req, &status)) { 87 DEBUG(5, ("Could not convert sid %s: %s\n", 88 sid_string_dbg(&state->sid), nt_errstr(status))); 89 return status; 90 } 91 response->data.pw = state->pw; 92 return NT_STATUS_OK; 93} 94