Merge of get_dc_list() api change. This was slightly more intrusive
authorTim Potter <tpot@samba.org>
Wed, 6 Nov 2002 01:29:07 +0000 (01:29 +0000)
committerTim Potter <tpot@samba.org>
Wed, 6 Nov 2002 01:29:07 +0000 (01:29 +0000)
than the version in APPLIANCE so watch out for boogs.
(This used to be commit 1e054e3db654801fbb5580211529cdfdea9ed686)

source3/auth/auth_domain.c
source3/libads/ldap.c
source3/libsmb/namequery.c
source3/nsswitch/winbindd_cm.c
source3/rpcclient/samsync.c
source3/smbd/change_trust_pw.c
source3/utils/net.c
source3/utils/net_lookup.c

index 129c486562d2b980016405f8358b006a7846dc4b..e18d809efbf69394d98d0be12ebab3bad7b573bb 100644 (file)
@@ -288,8 +288,23 @@ static NTSTATUS find_connect_pdc(struct cli_state **cli,
        if (time_now - last_change_time < 3600)
                use_pdc_only = True;
 
-       if (!get_dc_list(use_pdc_only, domain, &ip_list, &count))
-               return NT_STATUS_NO_LOGON_SERVERS;
+       if (use_pdc_only) {
+               struct in_addr pdc_ip;
+
+               if (!get_pdc_ip(domain, &pdc_ip))
+                       return NT_STATUS_NO_LOGON_SERVERS;
+
+               if ((ip_list = (struct in_addr *)
+                    malloc(sizeof(struct in_addr))) == NULL) 
+                       return NT_STATUS_NO_MEMORY;
+
+               ip_list[0] = pdc_ip;
+               count = 1;
+
+       } else {
+               if (!get_dc_list(domain, &ip_list, &count))
+                       return NT_STATUS_NO_LOGON_SERVERS;
+       }
 
        /*
         * Firstly try and contact a PDC/BDC who has the same
index 2359dbd7ed8e156f2d5d1c18af40147d4f25e69b..a59b78bf13f4350dcd09b4f39f19a9cd30f7ff2c 100644 (file)
@@ -180,7 +180,7 @@ static BOOL ads_try_dns(ADS_STRUCT *ads)
 /* try connecting to a ldap server via netbios */
 static BOOL ads_try_netbios(ADS_STRUCT *ads)
 {
-       struct in_addr *ip_list;
+       struct in_addr *ip_list, pdc_ip;
        int count;
        int i;
        char *workgroup = ads->server.workgroup;
@@ -192,20 +192,15 @@ static BOOL ads_try_netbios(ADS_STRUCT *ads)
        DEBUG(6,("ads_try_netbios: looking for workgroup '%s'\n", workgroup));
 
        /* try the PDC first */
-       if (get_dc_list(True, workgroup, &ip_list, &count)) { 
-               for (i=0;i<count;i++) {
-                       DEBUG(6,("ads_try_netbios: trying server '%s'\n", 
-                                inet_ntoa(ip_list[i])));
-                       if (ads_try_connect(ads, inet_ntoa(ip_list[i]), LDAP_PORT)) {
-                               free(ip_list);
-                               return True;
-                       }
-               }
-               free(ip_list);
+       if (get_pdc_ip(workgroup, &pdc_ip)) { 
+               DEBUG(6,("ads_try_netbios: trying server '%s'\n", 
+                        inet_ntoa(pdc_ip)));
+               if (ads_try_connect(ads, inet_ntoa(pdc_ip), LDAP_PORT))
+                       return True;
        }
 
        /* now any DC, including backups */
-       if (get_dc_list(False, workgroup, &ip_list, &count)) { 
+       if (get_dc_list(workgroup, &ip_list, &count)) { 
                for (i=0;i<count;i++) {
                        DEBUG(6,("ads_try_netbios: trying server '%s'\n", 
                                 inet_ntoa(ip_list[i])));
index 40a353fa8b62c97f4e0098169cfa4d3ba077a8eb..8fdf145625a2b52f7a193b61c43dcf39e60caeab 100644 (file)
@@ -1206,54 +1206,87 @@ NT GETDC call, UNICODE, NT domain SID and uncle tom cobbley and all...
 #endif /* defined(I_HATE_WINDOWS_REPLY_CODE) */
 }
 
-
 /********************************************************
- Get the IP address list of the PDC/BDC's of a Domain.
+ Get the IP address list of the primary domain controller
+ for a domain.
 *********************************************************/
 
-BOOL get_dc_list(BOOL pdc_only, const char *group, struct in_addr **ip_list, int *count)
+BOOL get_pdc_ip(const char *domain, struct in_addr *ip)
 {
-       int name_type = pdc_only ? 0x1B : 0x1C;
+       struct in_addr *ip_list;
+       int count;
+
+       /* Look up #1B name */
+
+       if (!internal_resolve_name(domain, 0x1b, &ip_list, &count))
+               return False;
+
+       SMB_ASSERT(count == 1);
+
+       *ip = ip_list[0];
+       SAFE_FREE(ip_list);
+
+       return True;
+}
 
+/********************************************************
+ Get the IP address list of the domain controllers for
+ a domain.
+*********************************************************/
+
+BOOL get_dc_list(const char *domain, struct in_addr **ip_list, int *count)
+{
        /*
         * If it's our domain then
         * use the 'password server' parameter.
         */
 
-       if (strequal(group, lp_workgroup())) {
+       if (strequal(domain, lp_workgroup())) {
                char *p;
                char *pserver = lp_passwordserver();
                fstring name;
                int num_adresses = 0;
                struct in_addr *return_iplist = NULL;
 
-               if (! *pserver)
-                       return internal_resolve_name(group, name_type, ip_list, count);
+               if (!*pserver)
+                       return internal_resolve_name(
+                               domain, 0x1C, ip_list, count);
 
                p = pserver;
+
                while (next_token(&p,name,LIST_SEP,sizeof(name))) {
                        if (strequal(name, "*"))
-                               return internal_resolve_name(group, name_type, ip_list, count);
+                               return internal_resolve_name(
+                                       domain, 0x1C, ip_list, count);
                        num_adresses++;
                }
+
                if (num_adresses == 0)
-                       return internal_resolve_name(group, name_type, ip_list, count);
+                       return internal_resolve_name(
+                               domain, 0x1C, ip_list, count);
+
+               return_iplist = (struct in_addr *)malloc(
+                       num_adresses * sizeof(struct in_addr));
 
-               return_iplist = (struct in_addr *)malloc(num_adresses * sizeof(struct in_addr));
-               if(return_iplist == NULL) {
+               if (return_iplist == NULL) {
                        DEBUG(3,("get_dc_list: malloc fail !\n"));
                        return False;
                }
+
                p = pserver;
                *count = 0;
+
                while (next_token(&p,name,LIST_SEP,sizeof(name))) {
                        struct in_addr name_ip;
                        if (resolve_name( name, &name_ip, 0x20) == False)
                                continue;
                        return_iplist[(*count)++] = name_ip;
                }
+
                *ip_list = return_iplist;
+
                return (*count != 0);
-       } else
-               return internal_resolve_name(group, name_type, ip_list, count);
+       }
+       
+       return internal_resolve_name(domain, 0x1C, ip_list, count);
 }
index 0287d2a8669cd517c676729496b0a4993b941933..b4d5a664b2dee5a126645048dfd98358d3d2b75b 100644 (file)
@@ -143,10 +143,22 @@ static BOOL cm_rpc_find_dc(const char *domain, struct in_addr *dc_ip, fstring sr
        struct in_addr *ip_list = NULL;
        int count, i;
 
-       if (!get_dc_list(False, domain, &ip_list, &count) && 
-           !get_dc_list(True, domain, &ip_list, &count)) {
-               DEBUG(3, ("Could not look up dc's for domain %s\n", domain));
-               return False;
+       if (!get_dc_list(domain, &ip_list, &count)) {
+               struct in_addr pdc_ip;
+               
+               if (!get_pdc_ip(domain, &pdc_ip)) {
+                       DEBUG(3, ("Could not look up any DCs for domain %s\n", 
+                                 domain));
+                       return False;
+               }
+
+               ip_list = (struct in_addr *)malloc(sizeof(struct in_addr));
+
+               if (!ip_list)
+                       return False;
+
+               ip_list[0] = pdc_ip;
+               count = 1;
        }
 
        /* Pick a nice close server */
index fb07123b77c3a1136f5e0615a443d0a9ee6ce9bf..cbc3601812421cfcedaf4b7b533e58817a72514f 100644 (file)
@@ -494,8 +494,7 @@ static struct cli_state *init_connection(struct cli_state **cli,
                                          char *password)
 {
         extern pstring global_myname;
-        struct in_addr *dest_ip;
-        int count;
+        struct in_addr pdc_ip;
         fstring dest_host;
 
        /* Initialise myname */
@@ -511,13 +510,13 @@ static struct cli_state *init_connection(struct cli_state **cli,
 
         /* Look up name of PDC controller */
 
-        if (!get_dc_list(True, lp_workgroup(), &dest_ip, &count)) {
+        if (!get_pdc_ip(lp_workgroup(), &pdc_ip)) {
                 DEBUG(0, ("Cannot find domain controller for domain %s\n",
                           lp_workgroup()));
                 return NULL;
         }
 
-        if (!lookup_dc_name(global_myname, lp_workgroup(), dest_ip, 
+        if (!lookup_dc_name(global_myname, lp_workgroup(), pdc_ip, 
                            dest_host)) {
                 DEBUG(0, ("Could not lookup up PDC name for domain %s\n",
                           lp_workgroup()));
@@ -525,7 +524,7 @@ static struct cli_state *init_connection(struct cli_state **cli,
         }
 
        if (NT_STATUS_IS_OK(cli_full_connection(cli, global_myname, dest_host,
-                                               dest_ip, 0,
+                                               pdc_ip, 0,
                                                "IPC$", "IPC",  
                                                username, domain,
                                                password, 0))) {
index 5da735e8751f2eb8c45858fa77e1adf8d93efb0c..4811083c2daf290374e3f920192501bafe62bfdd 100644 (file)
@@ -105,12 +105,11 @@ account password for domain %s.\n", domain));
        * We have been asked to dynamcially determine the IP addresses of the PDC.
        */
 
-      struct in_addr *ip_list = NULL;
-      int count = 0;
-      int i;
+      struct in_addr pdc_ip;
+      fstring dc_name;
 
       /* Use the PDC *only* for this. */
-      if(!get_dc_list(True, domain, &ip_list, &count))
+      if(!get_pdc_ip(domain, &pdc_ip))
         continue;
 
       /*
@@ -118,17 +117,11 @@ account password for domain %s.\n", domain));
        * address used as a string.
        */
 
-      for(i = 0; i < count; i++) {
-        fstring dc_name;
-        if(!lookup_dc_name(global_myname, domain, &ip_list[i], dc_name))
+        if(!lookup_dc_name(global_myname, domain, &pdc_ip, dc_name))
           continue;
         if(NT_STATUS_IS_OK(res = modify_trust_password( domain, dc_name,
                                          old_trust_passwd_hash)))
           break;
-      }
-
-      SAFE_FREE(ip_list);
-
     } else {
            res = modify_trust_password( domain, remote_machine,
                                         old_trust_passwd_hash);
index 704b886d7298333a4b1b9a5d105dff1c4e7ca466..607e47cf710749e1512b0fc7a1c110ced1c69397 100644 (file)
@@ -180,20 +180,15 @@ BOOL net_find_server(unsigned flags, struct in_addr *server_ip, char **server_na
                        return False;
                }
        } else if (flags & NET_FLAGS_PDC) {
-               struct in_addr *ip_list;
-               int addr_count;
-               if (get_dc_list(True /* PDC only*/, opt_target_workgroup, &ip_list, &addr_count)) {
+               struct in_addr pdc_ip;
+
+               if (get_pdc_ip(opt_target_workgroup, &pdc_ip)) {
                        fstring dc_name;
-                       if (addr_count < 1) {
-                               return False;
-                       }
-                       
-                       *server_ip = *ip_list;
                        
-                       if (is_zero_ip(*server_ip))
+                       if (is_zero_ip(pdc_ip))
                                return False;
                        
-                       if (!lookup_dc_name(global_myname, opt_target_workgroup, server_ip, dc_name))
+                       if (!lookup_dc_name(global_myname, opt_target_workgroup, &pdc_ip, dc_name))
                                return False;
                                
                        *server_name = strdup(dc_name);
@@ -236,17 +231,9 @@ BOOL net_find_server(unsigned flags, struct in_addr *server_ip, char **server_na
 
 BOOL net_find_dc(struct in_addr *server_ip, fstring server_name, const char *domain_name)
 {
-       struct in_addr *ip_list;
-       int addr_count;
-
-       if (get_dc_list(True /* PDC only*/, domain_name, &ip_list, &addr_count)) {
+       if (get_pdc_ip(domain_name, server_ip)) {
                fstring dc_name;
-               if (addr_count < 1) {
-                       return False;
-               }
                        
-               *server_ip = *ip_list;
-               
                if (is_zero_ip(*server_ip))
                        return False;
                
index f76b18625187625cad424912764510b1b5dcc667..32921de620f695915846c6ca81b3aabb33646c2e 100644 (file)
@@ -79,8 +79,8 @@ static int net_lookup_ldap(int argc, const char **argv)
 #ifdef HAVE_LDAP
        char *srvlist;
        const char *domain;
-       int rc, count;
-       struct in_addr *addr;
+       int rc;
+       struct in_addr addr;
        struct hostent *hostent;
 
        if (argc > 0)
@@ -96,10 +96,10 @@ static int net_lookup_ldap(int argc, const char **argv)
        }
 
        DEBUG(9, ("Looking up DC for domain %s\n", domain));
-       if (!get_dc_list(True, domain, &addr, &count))
+       if (!get_pdc_ip(domain, &addr))
                return -1;
 
-       hostent = gethostbyaddr((char *) &addr->s_addr, sizeof(addr->s_addr),
+       hostent = gethostbyaddr((char *) &addr.s_addr, sizeof(addr.s_addr),
                                AF_INET);
        if (!hostent)
                return -1;
@@ -124,7 +124,7 @@ static int net_lookup_ldap(int argc, const char **argv)
 
 static int net_lookup_dc(int argc, const char **argv)
 {
-       struct in_addr *ip_list;
+       struct in_addr *ip_list, addr;
        char *pdc_str = NULL;
        const char *domain=opt_target_workgroup;
        int count, i;
@@ -133,13 +133,13 @@ static int net_lookup_dc(int argc, const char **argv)
                domain=argv[0];
 
        /* first get PDC */
-       if (!get_dc_list(True, domain, &ip_list, &count))
+       if (!get_pdc_ip(domain, &addr))
                return -1;
 
-       asprintf(&pdc_str, "%s", inet_ntoa(*ip_list));
+       asprintf(&pdc_str, "%s", inet_ntoa(addr));
        d_printf("%s\n", pdc_str);
 
-       if (!get_dc_list(False, domain, &ip_list, &count)) {
+       if (!get_dc_list(domain, &ip_list, &count)) {
                SAFE_FREE(pdc_str);
                return 0;
        }