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 */