Line data Source code
1 : /*
2 : Unix SMB/CIFS implementation.
3 : async implementation of WINBINDD_GETDCNAME
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/ndr_winbind_c.h"
23 : #include "lib/util/string_wrappers.h"
24 :
25 : struct winbindd_getdcname_state {
26 : struct netr_DsRGetDCNameInfo *dcinfo;
27 : };
28 :
29 : static void winbindd_getdcname_done(struct tevent_req *subreq);
30 :
31 6 : struct tevent_req *winbindd_getdcname_send(TALLOC_CTX *mem_ctx,
32 : struct tevent_context *ev,
33 : struct winbindd_cli_state *cli,
34 : struct winbindd_request *request)
35 : {
36 : struct tevent_req *req, *subreq;
37 : struct winbindd_getdcname_state *state;
38 :
39 6 : req = tevent_req_create(mem_ctx, &state,
40 : struct winbindd_getdcname_state);
41 6 : if (req == NULL) {
42 0 : return NULL;
43 : }
44 :
45 6 : request->domain_name[sizeof(request->domain_name)-1] = '\0';
46 :
47 6 : D_NOTICE("[%s (%u)] Winbind external command GETDCNAME start.\n"
48 : "Search DCNAME for domain %s.\n",
49 : cli->client_name,
50 : (unsigned int)cli->pid,
51 : request->domain_name);
52 :
53 6 : subreq = wb_dsgetdcname_send(state, ev, request->domain_name, NULL,
54 : NULL, 0);
55 6 : if (tevent_req_nomem(subreq, req)) {
56 0 : return tevent_req_post(req, ev);
57 : }
58 6 : tevent_req_set_callback(subreq, winbindd_getdcname_done, req);
59 6 : return req;
60 : }
61 :
62 6 : static void winbindd_getdcname_done(struct tevent_req *subreq)
63 : {
64 6 : struct tevent_req *req = tevent_req_callback_data(
65 : subreq, struct tevent_req);
66 6 : struct winbindd_getdcname_state *state = tevent_req_data(
67 : req, struct winbindd_getdcname_state);
68 : NTSTATUS status;
69 :
70 6 : status = wb_dsgetdcname_recv(subreq, state, &state->dcinfo);
71 6 : TALLOC_FREE(subreq);
72 6 : if (tevent_req_nterror(req, status)) {
73 2 : return;
74 : }
75 4 : tevent_req_done(req);
76 : }
77 :
78 6 : NTSTATUS winbindd_getdcname_recv(struct tevent_req *req,
79 : struct winbindd_response *response)
80 : {
81 6 : struct winbindd_getdcname_state *state = tevent_req_data(
82 : req, struct winbindd_getdcname_state);
83 : NTSTATUS status;
84 :
85 6 : if (tevent_req_is_nterror(req, &status)) {
86 2 : D_WARNING("getdcname failed: %s\n", nt_errstr(status));
87 2 : return status;
88 : }
89 4 : fstrcpy(response->data.dc_name, strip_hostname(state->dcinfo->dc_unc));
90 :
91 4 : D_NOTICE("Winbind external command GETDCNAME end.\n"
92 : "Got DCNAME '%s'.\n",
93 : response->data.dc_name);
94 4 : return NT_STATUS_OK;
95 : }
|