s3-winbind: Return the DC name from DC_PING
authorChristof Schmitt <christof.schmitt@us.ibm.com>
Fri, 10 Aug 2012 15:10:42 +0000 (08:10 -0700)
committerAndrew Bartlett <abartlet@samba.org>
Wed, 15 Aug 2012 01:44:42 +0000 (11:44 +1000)
The DC that was attempted to ping is useful for troubleshooting. Return
the DC name in the response to the wbclient.

Signed-off-by: Andrew Bartlett <abartlet@samba.org>
source3/librpc/idl/wbint.idl
source3/winbindd/winbindd_dual_srv.c
source3/winbindd/winbindd_ping_dc.c

index cb8a4e42a358a61404d43bc3da5674773b2c4234..159af76a82066a603b9368eb628b3d7b3dcc2a6a 100644 (file)
@@ -177,5 +177,6 @@ interface wbint
        );
 
     NTSTATUS wbint_PingDc(
+       [out,string,charset(UTF8)] char **dcname
        );
 }
index e9a964b70b7856e28b3b5f2baeb0550bff54d688..d39454399e5a2e5a252e8da38ba51d8650e21ca6 100644 (file)
@@ -714,6 +714,11 @@ NTSTATUS _wbint_PingDc(struct pipes_struct *p, struct wbint_PingDc *r)
        b = netlogon_pipe->binding_handle;
 
        fstr_sprintf(logon_server, "\\\\%s", domain->dcname);
+       *r->out.dcname = talloc_strdup(p->mem_ctx, domain->dcname);
+       if (r->out.dcname == NULL) {
+               DEBUG(2, ("Could not allocate memory\n"));
+               return NT_STATUS_NO_MEMORY;
+       }
 
        /*
         * This provokes a WERR_NOT_SUPPORTED error message. This is
index 7f52040a04ad88ecc7a6df8eef1fd1b75ba882ed..93b16cda8c3afe8c3eaba5d921843a3ea36d7be7 100644 (file)
@@ -22,6 +22,7 @@
 #include "librpc/gen_ndr/ndr_wbint_c.h"
 
 struct winbindd_ping_dc_state {
+       const char *dcname;
        NTSTATUS result;
 };
 
@@ -61,7 +62,8 @@ struct tevent_req *winbindd_ping_dc_send(TALLOC_CTX *mem_ctx,
                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 +98,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);
 }