s3:winbindd: use find_domain_from_name_noinit() in winbindd_ping_dc_send()
[obnox/samba/samba-obnox.git] / source3 / winbindd / winbindd_ping_dc.c
index e06e5896c2504a6d733524daa0bc14d7274e94f9..05e840206251fc2b7f7a97ec6b020c3c0241d75e 100644 (file)
 
 #include "includes.h"
 #include "winbindd.h"
-#include "librpc/gen_ndr/cli_wbint.h"
+#include "librpc/gen_ndr/ndr_winbind_c.h"
 
 struct winbindd_ping_dc_state {
-       uint8_t dummy;
+       const char *dcname;
+       NTSTATUS result;
 };
 
 static void winbindd_ping_dc_done(struct tevent_req *subreq);
@@ -46,22 +47,45 @@ struct tevent_req *winbindd_ping_dc_send(TALLOC_CTX *mem_ctx,
                /* preserve old behavior, when no domain name is given */
                domain = find_our_domain();
        } else {
-               domain = find_domain_from_name(request->domain_name);
+               domain = find_domain_from_name_noinit(request->domain_name);
        }
        if (domain == NULL) {
                tevent_req_nterror(req, NT_STATUS_NO_SUCH_DOMAIN);
                return tevent_req_post(req, ev);
        }
        if (domain->internal) {
+               const char *d = lp_dnsdomain();
+               const char *n = lp_netbios_name();
+
                /*
                 * Internal domains are passdb based, we can always
                 * contact them.
                 */
+
+               if (d != NULL) {
+                       char *h;
+                       h = strlower_talloc(mem_ctx, n);
+                       if (tevent_req_nomem(h, req)) {
+                               return tevent_req_post(req, ev);
+                       }
+
+                       state->dcname = talloc_asprintf(state, "%s.%s", h, d);
+                       if (tevent_req_nomem(state->dcname, req)) {
+                               return tevent_req_post(req, ev);
+                       }
+               } else {
+                       state->dcname = talloc_strdup(state, n);
+                       if (tevent_req_nomem(state->dcname, req)) {
+                               return tevent_req_post(req, ev);
+                       }
+               }
+
                tevent_req_done(req);
                return tevent_req_post(req, ev);
        }
 
-       subreq = rpccli_wbint_PingDc_send(state, ev, domain->child.rpccli);
+       subreq = dcerpc_wbint_PingDc_send(state, ev, dom_child_handle(domain),
+                                         &state->dcname);
        if (tevent_req_nomem(subreq, req)) {
                return tevent_req_post(req, ev);
        }
@@ -77,20 +101,29 @@ static void winbindd_ping_dc_done(struct tevent_req *subreq)
                req, struct winbindd_ping_dc_state);
        NTSTATUS status, result;
 
-       status = rpccli_wbint_PingDc_recv(subreq, state, &result);
-       if (!NT_STATUS_IS_OK(status)) {
+       status = dcerpc_wbint_PingDc_recv(subreq, state, &result);
+       state->result = result;
+       if (any_nt_status_not_ok(status, result, &status)) {
                tevent_req_nterror(req, status);
                return;
        }
-       if (!NT_STATUS_IS_OK(result)) {
-               tevent_req_nterror(req, result);
-               return;
-       }
        tevent_req_done(req);
 }
 
 NTSTATUS winbindd_ping_dc_recv(struct tevent_req *req,
                               struct winbindd_response *presp)
 {
+       struct winbindd_ping_dc_state *state = tevent_req_data(
+               req, struct winbindd_ping_dc_state);
+
+       if (!NT_STATUS_IS_OK(state->result)) {
+               set_auth_errors(presp, state->result);
+       }
+
+       if (state->dcname) {
+               presp->extra_data.data = talloc_strdup(presp, state->dcname);
+               presp->length += strlen((char *)presp->extra_data.data) + 1;
+       }
+
        return tevent_req_simple_recv_ntstatus(req);
 }