Author: gd
Date: 2007-08-28 15:20:54 +0000 (Tue, 28 Aug 2007)
New Revision: 24747

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=24747

Log:
Add WINBINDD_DSGETDCNAME call.

Guenther

Modified:
   branches/SAMBA_3_2/source/nsswitch/wbinfo.c
   branches/SAMBA_3_2/source/nsswitch/winbindd.c
   branches/SAMBA_3_2/source/nsswitch/winbindd_dual.c
   branches/SAMBA_3_2/source/nsswitch/winbindd_misc.c
   branches/SAMBA_3_2/source/nsswitch/winbindd_nss.h
   branches/SAMBA_3_2_0/source/nsswitch/wbinfo.c
   branches/SAMBA_3_2_0/source/nsswitch/winbindd.c
   branches/SAMBA_3_2_0/source/nsswitch/winbindd_dual.c
   branches/SAMBA_3_2_0/source/nsswitch/winbindd_misc.c
   branches/SAMBA_3_2_0/source/nsswitch/winbindd_nss.h


Changeset:
Modified: branches/SAMBA_3_2/source/nsswitch/wbinfo.c
===================================================================
--- branches/SAMBA_3_2/source/nsswitch/wbinfo.c 2007-08-28 15:16:42 UTC (rev 
24746)
+++ branches/SAMBA_3_2/source/nsswitch/wbinfo.c 2007-08-28 15:20:54 UTC (rev 
24747)
@@ -500,6 +500,35 @@
        return True;
 }
 
+/* Find a DC */
+static BOOL wbinfo_dsgetdcname(const char *domain_name, uint32_t flags)
+{
+       struct winbindd_request request;
+       struct winbindd_response response;
+
+       ZERO_STRUCT(request);
+       ZERO_STRUCT(response);
+
+       fstrcpy(request.domain_name, domain_name);
+       request.flags = flags;
+
+       request.flags |= DS_DIRECTORY_SERVICE_REQUIRED;
+
+       /* Send request */
+
+       if (winbindd_request_response(WINBINDD_DSGETDCNAME, &request, 
&response) !=
+           NSS_STATUS_SUCCESS) {
+               d_fprintf(stderr, "Could not find dc for %s\n", domain_name);
+               return False;
+       }
+
+       /* Display response */
+
+       d_printf("%s\n", response.data.dc_name);
+
+       return True;
+}
+
 /* Check trust account password */
 
 static BOOL wbinfo_check_secret(void)
@@ -1225,6 +1254,7 @@
        OPT_DOMAIN_NAME,
        OPT_SEQUENCE,
        OPT_GETDCNAME,
+       OPT_DSGETDCNAME,
        OPT_USERDOMGROUPS,
        OPT_USERSIDS,
        OPT_ALLOCATE_UID,
@@ -1284,6 +1314,7 @@
                { "set-auth-user", 0, POPT_ARG_STRING, &string_arg, 
OPT_SET_AUTH_USER, "Store user and password used by winbindd (root only)", 
"user%password" },
                { "getdcname", 0, POPT_ARG_STRING, &string_arg, OPT_GETDCNAME,
                  "Get a DC name for a foreign domain", "domainname" },
+               { "dsgetdcname", 0, POPT_ARG_STRING, &string_arg, 
OPT_DSGETDCNAME, "Find a DC for a domain", "domainname" },
                { "get-auth-user", 0, POPT_ARG_NONE, NULL, OPT_GET_AUTH_USER, 
"Retrieve user and password used by winbindd (root only)", NULL },
                { "ping", 'p', POPT_ARG_NONE, 0, 'p', "Ping winbindd to see if 
it is alive" },
                { "domain", 0, POPT_ARG_STRING, &opt_domain_name, 
OPT_DOMAIN_NAME, "Define to the domain to restrict operation", "domain" },
@@ -1540,6 +1571,11 @@
                                goto done;
                        }
                        break;
+               case OPT_DSGETDCNAME:
+                       if (!wbinfo_dsgetdcname(string_arg, 0)) {
+                               goto done;
+                       }
+                       break;
                case OPT_SEPARATOR: {
                        const char sep = winbind_separator_int(True);
                        if ( !sep ) {

Modified: branches/SAMBA_3_2/source/nsswitch/winbindd.c
===================================================================
--- branches/SAMBA_3_2/source/nsswitch/winbindd.c       2007-08-28 15:16:42 UTC 
(rev 24746)
+++ branches/SAMBA_3_2/source/nsswitch/winbindd.c       2007-08-28 15:20:54 UTC 
(rev 24747)
@@ -282,6 +282,7 @@
        { WINBINDD_PRIV_PIPE_DIR, winbindd_priv_pipe_dir,
          "WINBINDD_PRIV_PIPE_DIR" },
        { WINBINDD_GETDCNAME, winbindd_getdcname, "GETDCNAME" },
+       { WINBINDD_DSGETDCNAME, winbindd_dsgetdcname, "DSGETDCNAME" },
 
        /* Credential cache access */
        { WINBINDD_CCACHE_NTLMAUTH, winbindd_ccache_ntlm_auth, "NTLMAUTH" },

Modified: branches/SAMBA_3_2/source/nsswitch/winbindd_dual.c
===================================================================
--- branches/SAMBA_3_2/source/nsswitch/winbindd_dual.c  2007-08-28 15:16:42 UTC 
(rev 24746)
+++ branches/SAMBA_3_2/source/nsswitch/winbindd_dual.c  2007-08-28 15:20:54 UTC 
(rev 24747)
@@ -423,6 +423,7 @@
        { WINBINDD_LIST_TRUSTDOM,        winbindd_dual_list_trusted_domains,  
"LIST_TRUSTDOM" },
        { WINBINDD_INIT_CONNECTION,      winbindd_dual_init_connection,       
"INIT_CONNECTION" },
        { WINBINDD_GETDCNAME,            winbindd_dual_getdcname,             
"GETDCNAME" },
+       { WINBINDD_DSGETDCNAME,          winbindd_dual_dsgetdcname,           
"DSGETDCNAME" },
        { WINBINDD_SHOW_SEQUENCE,        winbindd_dual_show_sequence,         
"SHOW_SEQUENCE" },
        { WINBINDD_PAM_AUTH,             winbindd_dual_pam_auth,              
"PAM_AUTH" },
        { WINBINDD_PAM_AUTH_CRAP,        winbindd_dual_pam_auth_crap,         
"AUTH_CRAP" },

Modified: branches/SAMBA_3_2/source/nsswitch/winbindd_misc.c
===================================================================
--- branches/SAMBA_3_2/source/nsswitch/winbindd_misc.c  2007-08-28 15:16:42 UTC 
(rev 24746)
+++ branches/SAMBA_3_2/source/nsswitch/winbindd_misc.c  2007-08-28 15:20:54 UTC 
(rev 24747)
@@ -270,6 +270,42 @@
        return WINBINDD_OK;
 }
 
+void winbindd_dsgetdcname(struct winbindd_cli_state *state)
+{
+       state->request.domain_name
+               [sizeof(state->request.domain_name)-1] = '\0';
+
+       DEBUG(3, ("[%5lu]: DsGetDcName for %s\n", (unsigned long)state->pid,
+                 state->request.domain_name));
+
+       sendto_domain(state, find_our_domain());
+}
+
+enum winbindd_result winbindd_dual_dsgetdcname(struct winbindd_domain *domain,
+                                              struct winbindd_cli_state *state)
+{
+       NTSTATUS result;
+       struct DS_DOMAIN_CONTROLLER_INFO *info = NULL;
+
+       state->request.domain_name
+               [sizeof(state->request.domain_name)-1] = '\0';
+
+       DEBUG(3, ("[%5lu]: DsGetDcName for %s\n", (unsigned long)state->pid,
+                 state->request.domain_name));
+
+       result = DsGetDcName(state->mem_ctx, NULL, state->request.domain_name,
+                            NULL, NULL, state->request.flags, &info);
+
+       if (!NT_STATUS_IS_OK(result)) {
+               return WINBINDD_ERROR;
+       }
+
+       fstrcpy(state->response.data.dc_name, info->domain_controller_name);
+
+       return WINBINDD_OK;
+}
+
+
 struct sequence_state {
        TALLOC_CTX *mem_ctx;
        struct winbindd_cli_state *cli_state;

Modified: branches/SAMBA_3_2/source/nsswitch/winbindd_nss.h
===================================================================
--- branches/SAMBA_3_2/source/nsswitch/winbindd_nss.h   2007-08-28 15:16:42 UTC 
(rev 24746)
+++ branches/SAMBA_3_2/source/nsswitch/winbindd_nss.h   2007-08-28 15:20:54 UTC 
(rev 24747)
@@ -123,6 +123,7 @@
        WINBINDD_DOMAIN_INFO,   /* Most of what we know from
                                   struct winbindd_domain */
        WINBINDD_GETDCNAME,     /* Issue a GetDCName Request */
+       WINBINDD_DSGETDCNAME,   /* Issue a DsGetDCName Request */
 
        WINBINDD_SHOW_SEQUENCE, /* display sequence numbers of domains */
 

Modified: branches/SAMBA_3_2_0/source/nsswitch/wbinfo.c
===================================================================
--- branches/SAMBA_3_2_0/source/nsswitch/wbinfo.c       2007-08-28 15:16:42 UTC 
(rev 24746)
+++ branches/SAMBA_3_2_0/source/nsswitch/wbinfo.c       2007-08-28 15:20:54 UTC 
(rev 24747)
@@ -493,6 +493,35 @@
        return True;
 }
 
+/* Find a DC */
+static BOOL wbinfo_dsgetdcname(const char *domain_name, uint32_t flags)
+{
+       struct winbindd_request request;
+       struct winbindd_response response;
+
+       ZERO_STRUCT(request);
+       ZERO_STRUCT(response);
+
+       fstrcpy(request.domain_name, domain_name);
+       request.flags = flags;
+
+       request.flags |= DS_DIRECTORY_SERVICE_REQUIRED;
+
+       /* Send request */
+
+       if (winbindd_request_response(WINBINDD_DSGETDCNAME, &request, 
&response) !=
+           NSS_STATUS_SUCCESS) {
+               d_fprintf(stderr, "Could not find dc for %s\n", domain_name);
+               return False;
+       }
+
+       /* Display response */
+
+       d_printf("%s\n", response.data.dc_name);
+
+       return True;
+}
+
 /* Check trust account password */
 
 static BOOL wbinfo_check_secret(void)
@@ -1218,6 +1247,7 @@
        OPT_DOMAIN_NAME,
        OPT_SEQUENCE,
        OPT_GETDCNAME,
+       OPT_DSGETDCNAME,
        OPT_USERDOMGROUPS,
        OPT_USERSIDS,
        OPT_ALLOCATE_UID,
@@ -1277,6 +1307,7 @@
                { "set-auth-user", 0, POPT_ARG_STRING, &string_arg, 
OPT_SET_AUTH_USER, "Store user and password used by winbindd (root only)", 
"user%password" },
                { "getdcname", 0, POPT_ARG_STRING, &string_arg, OPT_GETDCNAME,
                  "Get a DC name for a foreign domain", "domainname" },
+               { "dsgetdcname", 0, POPT_ARG_STRING, &string_arg, 
OPT_DSGETDCNAME, "Find a DC for a domain", "domainname" },
                { "get-auth-user", 0, POPT_ARG_NONE, NULL, OPT_GET_AUTH_USER, 
"Retrieve user and password used by winbindd (root only)", NULL },
                { "ping", 'p', POPT_ARG_NONE, 0, 'p', "Ping winbindd to see if 
it is alive" },
                { "domain", 0, POPT_ARG_STRING, &opt_domain_name, 
OPT_DOMAIN_NAME, "Define to the domain to restrict operation", "domain" },
@@ -1533,6 +1564,11 @@
                                goto done;
                        }
                        break;
+               case OPT_DSGETDCNAME:
+                       if (!wbinfo_dsgetdcname(string_arg, 0)) {
+                               goto done;
+                       }
+                       break;
                case OPT_SEPARATOR: {
                        const char sep = winbind_separator_int(True);
                        if ( !sep ) {

Modified: branches/SAMBA_3_2_0/source/nsswitch/winbindd.c
===================================================================
--- branches/SAMBA_3_2_0/source/nsswitch/winbindd.c     2007-08-28 15:16:42 UTC 
(rev 24746)
+++ branches/SAMBA_3_2_0/source/nsswitch/winbindd.c     2007-08-28 15:20:54 UTC 
(rev 24747)
@@ -287,6 +287,7 @@
        { WINBINDD_PRIV_PIPE_DIR, winbindd_priv_pipe_dir,
          "WINBINDD_PRIV_PIPE_DIR" },
        { WINBINDD_GETDCNAME, winbindd_getdcname, "GETDCNAME" },
+       { WINBINDD_DSGETDCNAME, winbindd_dsgetdcname, "DSGETDCNAME" },
 
        /* Credential cache access */
        { WINBINDD_CCACHE_NTLMAUTH, winbindd_ccache_ntlm_auth, "NTLMAUTH" },

Modified: branches/SAMBA_3_2_0/source/nsswitch/winbindd_dual.c
===================================================================
--- branches/SAMBA_3_2_0/source/nsswitch/winbindd_dual.c        2007-08-28 
15:16:42 UTC (rev 24746)
+++ branches/SAMBA_3_2_0/source/nsswitch/winbindd_dual.c        2007-08-28 
15:20:54 UTC (rev 24747)
@@ -423,6 +423,7 @@
        { WINBINDD_LIST_TRUSTDOM,        winbindd_dual_list_trusted_domains,  
"LIST_TRUSTDOM" },
        { WINBINDD_INIT_CONNECTION,      winbindd_dual_init_connection,       
"INIT_CONNECTION" },
        { WINBINDD_GETDCNAME,            winbindd_dual_getdcname,             
"GETDCNAME" },
+       { WINBINDD_DSGETDCNAME,          winbindd_dual_dsgetdcname,           
"DSGETDCNAME" },
        { WINBINDD_SHOW_SEQUENCE,        winbindd_dual_show_sequence,         
"SHOW_SEQUENCE" },
        { WINBINDD_PAM_AUTH,             winbindd_dual_pam_auth,              
"PAM_AUTH" },
        { WINBINDD_PAM_AUTH_CRAP,        winbindd_dual_pam_auth_crap,         
"AUTH_CRAP" },

Modified: branches/SAMBA_3_2_0/source/nsswitch/winbindd_misc.c
===================================================================
--- branches/SAMBA_3_2_0/source/nsswitch/winbindd_misc.c        2007-08-28 
15:16:42 UTC (rev 24746)
+++ branches/SAMBA_3_2_0/source/nsswitch/winbindd_misc.c        2007-08-28 
15:20:54 UTC (rev 24747)
@@ -270,6 +270,42 @@
        return WINBINDD_OK;
 }
 
+void winbindd_dsgetdcname(struct winbindd_cli_state *state)
+{
+       state->request.domain_name
+               [sizeof(state->request.domain_name)-1] = '\0';
+
+       DEBUG(3, ("[%5lu]: DsGetDcName for %s\n", (unsigned long)state->pid,
+                 state->request.domain_name));
+
+       sendto_domain(state, find_our_domain());
+}
+
+enum winbindd_result winbindd_dual_dsgetdcname(struct winbindd_domain *domain,
+                                              struct winbindd_cli_state *state)
+{
+       NTSTATUS result;
+       struct DS_DOMAIN_CONTROLLER_INFO *info = NULL;
+
+       state->request.domain_name
+               [sizeof(state->request.domain_name)-1] = '\0';
+
+       DEBUG(3, ("[%5lu]: DsGetDcName for %s\n", (unsigned long)state->pid,
+                 state->request.domain_name));
+
+       result = DsGetDcName(state->mem_ctx, NULL, state->request.domain_name,
+                            NULL, NULL, state->request.flags, &info);
+
+       if (!NT_STATUS_IS_OK(result)) {
+               return WINBINDD_ERROR;
+       }
+
+       fstrcpy(state->response.data.dc_name, info->domain_controller_name);
+
+       return WINBINDD_OK;
+}
+
+
 struct sequence_state {
        TALLOC_CTX *mem_ctx;
        struct winbindd_cli_state *cli_state;

Modified: branches/SAMBA_3_2_0/source/nsswitch/winbindd_nss.h
===================================================================
--- branches/SAMBA_3_2_0/source/nsswitch/winbindd_nss.h 2007-08-28 15:16:42 UTC 
(rev 24746)
+++ branches/SAMBA_3_2_0/source/nsswitch/winbindd_nss.h 2007-08-28 15:20:54 UTC 
(rev 24747)
@@ -116,6 +116,7 @@
        WINBINDD_DOMAIN_INFO,   /* Most of what we know from
                                   struct winbindd_domain */
        WINBINDD_GETDCNAME,     /* Issue a GetDCName Request */
+       WINBINDD_DSGETDCNAME,   /* Issue a DsGetDCName Request */
 
        WINBINDD_SHOW_SEQUENCE, /* display sequence numbers of domains */
 

Reply via email to