Add a new type of name lookup 'ads'. This seperates this from normal
authorAndrew Bartlett <abartlet@samba.org>
Fri, 9 Jan 2004 02:38:58 +0000 (02:38 +0000)
committerAndrew Bartlett <abartlet@samba.org>
Fri, 9 Jan 2004 02:38:58 +0000 (02:38 +0000)
hostname lookups, and ensures that we don't lookup 'short' (ie NetBIOS)
domain names in DNS.

Andrew Bartlett
(This used to be commit 35f6347a73ce7423adb78c7e95492bb6d98f4c40)

source3/libsmb/namequery.c

index c7cc4848b7013b218df436a2d5424f0711717eae..dfc3bcd93f763448d56118e7825c36d610444967 100644 (file)
@@ -680,6 +680,8 @@ BOOL name_resolve_bcast(const char *name, int name_type,
                return False;
        }
 
+       SMB_ASSERT(strchr_m(name, '.') == NULL);
+
        *return_iplist = NULL;
        *return_count = 0;
        
@@ -742,6 +744,8 @@ BOOL resolve_wins(const char *name, int name_type,
                return False;
        }
 
+       SMB_ASSERT(strchr_m(name, '.') == NULL);
+
        *return_iplist = NULL;
        *return_count = 0;
        
@@ -884,6 +888,40 @@ static BOOL resolve_hosts(const char *name, int name_type,
         */
        struct hostent *hp;
        
+       if ( name_type != 0x20 && name_type != 0x0) {
+               DEBUG(5, ("resolve_hosts: not appropriate for name type <0x%x>\n", name_type));
+               return False;
+       }
+
+       *return_iplist = NULL;
+       *return_count = 0;
+
+       DEBUG(3,("resolve_hosts: Attempting host lookup for name %s<0x%x>\n", name, name_type));
+       
+       if (((hp = sys_gethostbyname(name)) != NULL) && (hp->h_addr != NULL)) {
+               struct in_addr return_ip;
+               putip((char *)&return_ip,(char *)hp->h_addr);
+               *return_iplist = (struct ip_service *)malloc(sizeof(struct ip_service));
+               if(*return_iplist == NULL) {
+                       DEBUG(3,("resolve_hosts: malloc fail !\n"));
+                       return False;
+               }
+               (*return_iplist)->ip   = return_ip;
+               (*return_iplist)->port = PORT_NONE;
+               *return_count = 1;
+               return True;
+       }
+       return False;
+}
+
+/********************************************************
+ Resolve via "ADS" method.
+*********************************************************/
+
+static BOOL resolve_ads(const char *name, int name_type,
+                         struct ip_service **return_iplist, int *return_count)
+{
+       
 #ifdef HAVE_ADS
        if ( name_type == 0x1c ) {
                int                     count, i = 0;
@@ -895,6 +933,8 @@ static BOOL resolve_hosts(const char *name, int name_type,
                if ( lp_security() != SEC_ADS )
                        return False;
                        
+               SMB_ASSERT(strchr_m(name, '.') != NULL);
+
                DEBUG(5,("resolve_hosts: Attempting to resolve DC's for %s using DNS\n",
                        name));
                        
@@ -935,28 +975,11 @@ static BOOL resolve_hosts(const char *name, int name_type,
                *return_count = i;
                                
                return True;
-       }
+       } else 
 #endif         /* HAVE_ADS */
-
-       *return_iplist = NULL;
-       *return_count = 0;
-
-       DEBUG(3,("resolve_hosts: Attempting host lookup for name %s<0x20>\n", name));
-       
-       if (((hp = sys_gethostbyname(name)) != NULL) && (hp->h_addr != NULL)) {
-               struct in_addr return_ip;
-               putip((char *)&return_ip,(char *)hp->h_addr);
-               *return_iplist = (struct ip_service *)malloc(sizeof(struct ip_service));
-               if(*return_iplist == NULL) {
-                       DEBUG(3,("resolve_hosts: malloc fail !\n"));
-                       return False;
-               }
-               (*return_iplist)->ip   = return_ip;
-               (*return_iplist)->port = PORT_NONE;
-               *return_count = 1;
-               return True;
+       { 
+               return False;
        }
-       return False;
 }
 
 /*******************************************************************
@@ -1034,14 +1057,17 @@ static BOOL internal_resolve_name(const char *name, int name_type,
   
   while (next_token(&ptr, tok, LIST_SEP, sizeof(tok))) {
          if((strequal(tok, "host") || strequal(tok, "hosts"))) {
-                  /* deal with 0x20 & 0x1c names here.  The latter will result
-                    in a SRV record lookup for _ldap._tcp.<domain> if we are using 
-                    'security = ads' */
-                 if ( name_type==0x20 || name_type == 0x1c ) {
-                         if (resolve_hosts(name, name_type, return_iplist, return_count)) {
-                                 result = True;
-                                 goto done;
-                         }
+                 if (resolve_hosts(name, name_type, return_iplist, return_count)) {
+                         result = True;
+                         goto done;
+                 }
+         } else if(strequal( tok, "ads")) {
+                  /* deal with 0x1c names here.  This will result in a
+                    SRV record lookup for _ldap._tcp.<domain> if we
+                    are using 'security = ads' */
+                 if (resolve_ads(name, name_type, return_iplist, return_count)) {
+                   result = True;
+                   goto done;
                  }
          } else if(strequal( tok, "lmhosts")) {
                  if (resolve_lmhosts(name, name_type, return_iplist, return_count)) {
@@ -1207,14 +1233,14 @@ BOOL get_pdc_ip(const char *domain, struct in_addr *ip)
 /*********************************************************************
  small wrapper function to get the DC list and sort it if neccessary 
 *********************************************************************/
-BOOL get_sorted_dc_list( const char *domain, struct ip_service **ip_list, int *count, BOOL dns_only )
+BOOL get_sorted_dc_list( const char *domain, struct ip_service **ip_list, int *count, BOOL ads_only )
 {
        BOOL ordered;
        
        DEBUG(8,("get_sorted_dc_list: attempting lookup using [%s]\n",
-               (dns_only ? "hosts" : lp_name_resolve_order())));
+               (ads_only ? "ads" : lp_name_resolve_order())));
        
-       if ( !get_dc_list(domain, ip_list, count, dns_only, &ordered) )
+       if ( !get_dc_list(domain, ip_list, count, ads_only, &ordered) )
                return False;
                
        /* only sort if we don't already have an ordered list */
@@ -1230,11 +1256,11 @@ BOOL get_sorted_dc_list( const char *domain, struct ip_service **ip_list, int *c
 *********************************************************/
 
 BOOL get_dc_list(const char *domain, struct ip_service **ip_list, 
-                 int *count, BOOL dns_only, int *ordered)
+                 int *count, BOOL ads_only, int *ordered)
 {
        /* defined the name resolve order to internal_name_resolve() 
           only used for looking up 0x1c names */
-       const char *resolve_oder = (dns_only ? "hosts" : lp_name_resolve_order());
+       const char *resolve_oder = (ads_only ? "ads" : lp_name_resolve_order());
        
        *ordered = False;