s3-libads Pass a struct sockaddr_storage to cldap routines
authorAndrew Bartlett <abartlet@samba.org>
Tue, 26 Apr 2011 07:03:32 +0000 (17:03 +1000)
committerAndrew Bartlett <abartlet@samba.org>
Thu, 28 Apr 2011 03:30:20 +0000 (05:30 +0200)
This avoids these routines doing a DNS lookup that has already been
done, and ensures that the emulated DNS lookup isn't thrown away.

Andrew Bartlett

source3/libads/cldap.c
source3/libads/cldap.h
source3/libads/ldap.c
source3/libsmb/dsgetdcname.c
source3/utils/net_ads.c
source3/winbindd/idmap_adex/gc_util.c

index 5d2e900c05a981aaf802c589b4c9d1673734b4da..03fa17c26fd3e02cbd771cf98f6b31b4e32e7f09 100644 (file)
@@ -30,7 +30,7 @@
 *******************************************************************/
 
 bool ads_cldap_netlogon(TALLOC_CTX *mem_ctx,
-                       const char *server,
+                       struct sockaddr_storage *ss,
                        const char *realm,
                        uint32_t nt_version,
                        struct netlogon_samlogon_response **_reply)
@@ -39,18 +39,12 @@ bool ads_cldap_netlogon(TALLOC_CTX *mem_ctx,
        struct cldap_netlogon io;
        struct netlogon_samlogon_response *reply;
        NTSTATUS status;
-       struct sockaddr_storage ss;
        char addrstr[INET6_ADDRSTRLEN];
        const char *dest_str;
        int ret;
        struct tsocket_address *dest_addr;
 
-       if (!interpret_string_addr_prefer_ipv4(&ss, server, 0)) {
-               DEBUG(2,("Failed to resolve[%s] into an address for cldap\n",
-                       server));
-               return false;
-       }
-       dest_str = print_sockaddr(addrstr, sizeof(addrstr), &ss);
+       dest_str = print_sockaddr(addrstr, sizeof(addrstr), ss);
 
        ret = tsocket_address_inet_from_strings(mem_ctx, "ip",
                                                dest_str, LDAP_PORT,
@@ -113,7 +107,7 @@ failed:
 *******************************************************************/
 
 bool ads_cldap_netlogon_5(TALLOC_CTX *mem_ctx,
-                         const char *server,
+                         struct sockaddr_storage *ss,
                          const char *realm,
                          struct NETLOGON_SAM_LOGON_RESPONSE_EX *reply5)
 {
@@ -121,7 +115,7 @@ bool ads_cldap_netlogon_5(TALLOC_CTX *mem_ctx,
        struct netlogon_samlogon_response *reply = NULL;
        bool ret;
 
-       ret = ads_cldap_netlogon(mem_ctx, server, realm, nt_version, &reply);
+       ret = ads_cldap_netlogon(mem_ctx, ss, realm, nt_version, &reply);
        if (!ret) {
                return false;
        }
index e2d05ce73130afed7fa7b095126c8943077e97ee..36f45889395741c71c6fcd61cf289a1fae422a94 100644 (file)
@@ -2,11 +2,11 @@
 
 /* The following definitions come from libads/cldap.c  */
 bool ads_cldap_netlogon(TALLOC_CTX *mem_ctx,
-                       const char *server,
+                       struct sockaddr_storage *ss,
                        const char *realm,
                        uint32_t nt_version,
                        struct netlogon_samlogon_response **reply);
 bool ads_cldap_netlogon_5(TALLOC_CTX *mem_ctx,
-                         const char *server,
+                         struct sockaddr_storage *ss,
                          const char *realm,
                          struct NETLOGON_SAM_LOGON_RESPONSE_EX *reply5);
index d65e53ee19784fe807015c8caeaca464525a4c9f..793b689361a8354861fe9a3985e33f459ff44690 100644 (file)
@@ -196,45 +196,32 @@ bool ads_closest_dc(ADS_STRUCT *ads)
  */
 static bool ads_try_connect(ADS_STRUCT *ads, const char *server, bool gc)
 {
-       char *srv;
        struct NETLOGON_SAM_LOGON_RESPONSE_EX cldap_reply;
        TALLOC_CTX *frame = talloc_stackframe();
        bool ret = false;
+       struct sockaddr_storage ss;
+       char addr[INET6_ADDRSTRLEN];
 
        if (!server || !*server) {
                TALLOC_FREE(frame);
                return False;
        }
 
-       if (!is_ipaddress(server)) {
-               struct sockaddr_storage ss;
-               char addr[INET6_ADDRSTRLEN];
-
-               if (!resolve_name(server, &ss, 0x20, true)) {
-                       DEBUG(5,("ads_try_connect: unable to resolve name %s\n",
-                               server ));
-                       TALLOC_FREE(frame);
-                       return false;
-               }
-               print_sockaddr(addr, sizeof(addr), &ss);
-               srv = talloc_strdup(frame, addr);
-       } else {
-               /* this copes with inet_ntoa brokenness */
-               srv = talloc_strdup(frame, server);
-       }
-
-       if (!srv) {
+       if (!resolve_name(server, &ss, 0x20, true)) {
+               DEBUG(5,("ads_try_connect: unable to resolve name %s\n",
+                        server ));
                TALLOC_FREE(frame);
                return false;
        }
+       print_sockaddr(addr, sizeof(addr), &ss);
 
        DEBUG(5,("ads_try_connect: sending CLDAP request to %s (realm: %s)\n", 
-               srv, ads->server.realm));
+               addr, ads->server.realm));
 
        ZERO_STRUCT( cldap_reply );
 
-       if ( !ads_cldap_netlogon_5(frame, srv, ads->server.realm, &cldap_reply ) ) {
-               DEBUG(3,("ads_try_connect: CLDAP request %s failed.\n", srv));
+       if ( !ads_cldap_netlogon_5(frame, &ss, ads->server.realm, &cldap_reply ) ) {
+               DEBUG(3,("ads_try_connect: CLDAP request %s failed.\n", addr));
                ret = false;
                goto out;
        }
@@ -243,7 +230,7 @@ static bool ads_try_connect(ADS_STRUCT *ads, const char *server, bool gc)
 
        if ( !(cldap_reply.server_type & NBT_SERVER_LDAP) ) {
                DEBUG(1,("ads_try_connect: %s's CLDAP reply says it is not an LDAP server!\n",
-                       srv));
+                       addr));
                ret = false;
                goto out;
        }
@@ -273,13 +260,7 @@ static bool ads_try_connect(ADS_STRUCT *ads, const char *server, bool gc)
        ads->server.workgroup          = SMB_STRDUP(cldap_reply.domain_name);
 
        ads->ldap.port = gc ? LDAP_GC_PORT : LDAP_PORT;
-       if (!interpret_string_addr(&ads->ldap.ss, srv, 0)) {
-               DEBUG(1,("ads_try_connect: unable to convert %s "
-                       "to an address\n",
-                       srv));
-               ret = false;
-               goto out;
-       }
+       ads->ldap.ss = ss;
 
        /* Store our site name. */
        sitename_store( cldap_reply.domain_name, cldap_reply.client_site);
index 7706994ba369e2957c6d5dc0434649d5259ff783..61a104f65e66c465385e5548ce2f810d81d4623b 100644 (file)
@@ -861,9 +861,10 @@ static NTSTATUS process_dc_dns(TALLOC_CTX *mem_ctx,
 
        for (i=0; i<num_dcs; i++) {
 
+
                DEBUG(10,("LDAP ping to %s\n", dclist[i].hostname));
 
-               if (ads_cldap_netlogon(mem_ctx, dclist[i].hostname,
+               if (ads_cldap_netlogon(mem_ctx, &dclist[i].ss,
                                        domain_name,
                                        nt_version,
                                        &r))
index 4b4b0a8031829d3cbfedbf5cd36cf512358bc4ae..3619ac339b08e06b6c9c9e31b52514ad1a5813e7 100644 (file)
@@ -60,7 +60,8 @@ static int net_ads_cldap_netlogon(struct net_context *c, ADS_STRUCT *ads)
        struct NETLOGON_SAM_LOGON_RESPONSE_EX reply;
 
        print_sockaddr(addr, sizeof(addr), &ads->ldap.ss);
-       if ( !ads_cldap_netlogon_5(talloc_tos(), addr, ads->server.realm, &reply ) ) {
+
+       if ( !ads_cldap_netlogon_5(talloc_tos(), &ads->ldap.ss, ads->server.realm, &reply ) ) {
                d_fprintf(stderr, _("CLDAP query failed!\n"));
                return -1;
        }
@@ -383,7 +384,6 @@ int net_ads_check(struct net_context *c)
 static int net_ads_workgroup(struct net_context *c, int argc, const char **argv)
 {
        ADS_STRUCT *ads;
-       char addr[INET6_ADDRSTRLEN];
        struct NETLOGON_SAM_LOGON_RESPONSE_EX reply;
 
        if (c->display_usage) {
@@ -405,8 +405,7 @@ static int net_ads_workgroup(struct net_context *c, int argc, const char **argv)
                ads->ldap.port = 389;
        }
 
-       print_sockaddr(addr, sizeof(addr), &ads->ldap.ss);
-       if ( !ads_cldap_netlogon_5(talloc_tos(), addr, ads->server.realm, &reply ) ) {
+       if ( !ads_cldap_netlogon_5(talloc_tos(), &ads->ldap.ss, ads->server.realm, &reply ) ) {
                d_fprintf(stderr, _("CLDAP query failed!\n"));
                ads_destroy(&ads);
                return -1;
index 77b318cb2d71f596700fb51ddcdb6ec0b7542e19..e625265be0418659059c087358fa00b4cfe5c1f4 100644 (file)
@@ -107,6 +107,7 @@ done:
        NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL;
        struct NETLOGON_SAM_LOGON_RESPONSE_EX cldap_reply;
        TALLOC_CTX *frame = talloc_stackframe();
+       struct sockaddr_storage ss;
 
        if (!gc || !domain) {
                return NT_STATUS_INVALID_PARAMETER;
@@ -126,8 +127,17 @@ done:
        nt_status = ads_ntstatus(ads_status);
        BAIL_ON_NTSTATUS_ERROR(nt_status);
 
+       if (!resolve_name(ads->config.ldap_server_name, &ss, 0x20, true)) {
+               DEBUG(5,("gc_find_forest_root: unable to resolve name %s\n",
+                        ads->config.ldap_server_name));
+               nt_status = NT_STATUS_IO_TIMEOUT;
+               /* This matches the old code which did the resolve in
+                * ads_cldap_netlogon_5 */
+               BAIL_ON_NTSTATUS_ERROR(nt_status);
+       }
+
        if (!ads_cldap_netlogon_5(frame,
-                                 ads->config.ldap_server_name,
+                                 &ss,
                                  ads->config.realm,
                                  &cldap_reply))
        {