1/* 2 Unix SMB/CIFS implementation. 3 async implementation of WINBINDD_CHECK_MACHINE_ACCT 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 winbindd_check_machine_acct_state { 25 uint8_t dummy; 26}; 27 28static void winbindd_check_machine_acct_done(struct tevent_req *subreq); 29 30struct tevent_req *winbindd_check_machine_acct_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_check_machine_acct_state *state; 37 struct winbindd_domain *domain; 38 39 req = tevent_req_create(mem_ctx, &state, 40 struct winbindd_check_machine_acct_state); 41 if (req == NULL) { 42 return NULL; 43 } 44 45 if (request->domain_name[0] == '\0') { 46 /* preserve old behavior, when no domain name is given */ 47 domain = find_our_domain(); 48 } else { 49 domain = find_domain_from_name(request->domain_name); 50 } 51 if (domain == NULL) { 52 tevent_req_nterror(req, NT_STATUS_NO_SUCH_DOMAIN); 53 return tevent_req_post(req, ev); 54 } 55 if (domain->internal) { 56 /* 57 * Internal domains are passdb based, we can always 58 * contact them. 59 */ 60 tevent_req_done(req); 61 return tevent_req_post(req, ev); 62 } 63 64 subreq = rpccli_wbint_CheckMachineAccount_send(state, ev, 65 domain->child.rpccli); 66 if (tevent_req_nomem(subreq, req)) { 67 return tevent_req_post(req, ev); 68 } 69 tevent_req_set_callback(subreq, winbindd_check_machine_acct_done, req); 70 return req; 71} 72 73static void winbindd_check_machine_acct_done(struct tevent_req *subreq) 74{ 75 struct tevent_req *req = tevent_req_callback_data( 76 subreq, struct tevent_req); 77 struct winbindd_check_machine_acct_state *state = tevent_req_data( 78 req, struct winbindd_check_machine_acct_state); 79 NTSTATUS status, result; 80 81 status = rpccli_wbint_CheckMachineAccount_recv(subreq, state, &result); 82 if (!NT_STATUS_IS_OK(status)) { 83 tevent_req_nterror(req, status); 84 return; 85 } 86 if (!NT_STATUS_IS_OK(result)) { 87 tevent_req_nterror(req, result); 88 return; 89 } 90 tevent_req_done(req); 91} 92 93NTSTATUS winbindd_check_machine_acct_recv(struct tevent_req *req, 94 struct winbindd_response *presp) 95{ 96 return tevent_req_simple_recv_ntstatus(req); 97} 98