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 7f52040a04ad88ecc7a6df8eef1fd1b75ba882ed..05e840206251fc2b7f7a97ec6b020c3c0241d75e 100644 (file)
 
 #include "includes.h"
 #include "winbindd.h"
-#include "librpc/gen_ndr/ndr_wbint_c.h"
+#include "librpc/gen_ndr/ndr_winbind_c.h"
 
 struct winbindd_ping_dc_state {
+       const char *dcname;
        NTSTATUS result;
 };
 
@@ -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 = dcerpc_wbint_PingDc_send(state, ev, dom_child_handle(domain));
+       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);
        }
@@ -96,5 +120,10 @@ NTSTATUS winbindd_ping_dc_recv(struct tevent_req *req,
                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);
 }