removed getdomainname() stuff and appending a '.' to the name in
[samba.git] / source3 / namedbname.c
index 746353dd97648a820cd5932e1056d8a37055cc0d..208fa956640290e364f59021cecf2b8a6be12eb8 100644 (file)
@@ -140,8 +140,7 @@ void remove_name(struct subnet_record *d, struct name_record *n)
   find a name in a namelist.
   **************************************************************************/
 struct name_record *find_name(struct name_record *n,
-                       struct nmb_name *name,
-                       int search)
+                       struct nmb_name *name, int search)
 {
        struct name_record *ret;
   
@@ -151,8 +150,10 @@ struct name_record *find_name(struct name_record *n,
                {
                        /* self search: self names only */
                        if ((search&FIND_SELF) == FIND_SELF && ret->source != SELF)
+                       {
                                continue;
-         
+                       }
+
                        return ret;
                }
        }
@@ -173,27 +174,25 @@ struct name_record *find_name_search(struct subnet_record **d,
 {
        if (d == NULL) return NULL; /* bad error! */
        
-    if ((search & FIND_LOCAL) == FIND_LOCAL)
-       {
-               if (*d != NULL)
-        {
-                       struct name_record *n = find_name((*d)->namelist, name, search);
-                       DEBUG(4,("find_name on local: %s %s search %x\n",
-                                               namestr(name),inet_ntoa(ip), search));
-                       if (n) return n;
-               }
-       }
-
-       if ((search & FIND_WINS) != FIND_WINS) return NULL;
-
-       /* find WINS subnet record. */
-       *d = find_subnet(ipgrp);
+    if (search & FIND_LOCAL) {
+      if (*d != NULL) {
+       struct name_record *n = find_name((*d)->namelist, name, search);
+       DEBUG(4,("find_name on local: %s %s search %x\n",
+                namestr(name),inet_ntoa(ip), search));
+       if (n) return n;
+      }
+    }
 
-       if (*d == NULL) return NULL;
+    if (!(search & FIND_WINS)) return NULL;
 
-       DEBUG(4,("find_name on WINS: %s %s search %x\n",
-                                               namestr(name),inet_ntoa(ip), search));
-       return find_name((*d)->namelist, name, search);
+    /* find WINS subnet record. */
+    *d = find_subnet(ipgrp);
+    
+    if (*d == NULL) return NULL;
+    
+    DEBUG(4,("find_name on WINS: %s %s search %x\n",
+            namestr(name),inet_ntoa(ip), search));
+    return find_name((*d)->namelist, name, search);
 }
 
 
@@ -238,9 +237,9 @@ void dump_names(void)
 
         for (i = 0; i < n->num_ips; i++)
         {
-           DEBUG(3,("%15s NB=%2x ",
-                                               inet_ntoa(n->ip_flgs[i].ip),
-                                               n->ip_flgs[i].nb_flags));
+           DEBUG(3,("%15s NB=%2x source=%d",
+                   inet_ntoa(n->ip_flgs[i].ip),
+                   n->ip_flgs[i].nb_flags,n->source));
 
         }
                DEBUG(3,("\n"));
@@ -486,13 +485,17 @@ void expire_names(time_t t)
        for (d = subnetlist; d; d = d->next)
        {
          for (n = d->namelist; n; n = next)
+           {
+             next = n->next;
+             if (n->death_time && n->death_time < t)
                {
-                 if (n->death_time && n->death_time < t)
-               {
+                 if (n->source == SELF) {
+                   DEBUG(3,("not expiring SELF name %s\n", namestr(&n->name)));
+                   n->death_time += 300;
+                   continue;
+                 }
                  DEBUG(3,("Removing dead name %s\n", namestr(&n->name)));
                  
-                 next = n->next;
-                 
                  if (n->prev) n->prev->next = n->next;
                  if (n->next) n->next->prev = n->prev;
                  
@@ -501,89 +504,50 @@ void expire_names(time_t t)
                  free(n->ip_flgs);
                  free(n);
                }
-                 else
-               {
-                 next = n->next;
-               }
-               }
+           }
        }
 }
 
 
 /***************************************************************************
-  reply to a name query
+  assume a WINS name is a dns name, and do a gethostbyname() on it.
   ****************************************************************************/
-struct name_record *search_for_name(struct subnet_record **d,
-                                       struct nmb_name *question,
-                                   struct in_addr ip, int Time, int search)
+struct name_record *dns_name_search(struct nmb_name *question, int Time)
 {
-  int name_type = question->name_type;
-  char *qname = question->name;
-  BOOL dns_type = name_type == 0x20 || name_type == 0;
-  
-  struct name_record *n;
-  
-  DEBUG(3,("Search for %s from %s - ", namestr(question), inet_ntoa(ip)));
-  
-  /* first look up name in cache */
-  n = find_name_search(d,question,search,ip);
-  
-  if (*d == NULL) return NULL;
+       int name_type = question->name_type;
+       char *qname = question->name;
+       char *r;
+       BOOL dns_type = (name_type == 0x20 || name_type == 0);
+       struct in_addr dns_ip;
+       struct subnet_record *d = find_subnet(ipgrp);
 
-  DEBUG(4,("subnet %s ", inet_ntoa((*d)->bcast_ip)));
+       if (d == NULL) return NULL;
 
-  /* now try DNS lookup. */
-  if (!n)
-    {
-      struct in_addr dns_ip;
-      uint32 a;
-      
-      /* only do DNS lookups if the query is for type 0x20 or type 0x0 */
-      if (!dns_type && name_type != 0x1b)
+       DEBUG(3,("Search for %s - ", namestr(question)));
+
+       /* only do DNS lookups if the query is for type 0x20 or type 0x0 */
+       if (!dns_type && name_type != 0x1b)
        {
-         DEBUG(3,("types 0x20 0x1b 0x0 only: name not found\n"));
-         return NULL;
+               DEBUG(3,("types 0x20 0x1b 0x0 only: name not found\n"));
+               return NULL;
        }
-      
-      /* look it up with DNS */      
-      a = interpret_addr(qname);
-      
-      putip((char *)&dns_ip,(char *)&a);
-      
-      if (!a)
+
+       /* look it up with DNS */      
+       dns_ip.s_addr = interpret_addr(qname);
+
+       if (!dns_ip.s_addr)
        {
-         /* no luck with DNS. We could possibly recurse here XXXX */
-         DEBUG(3,("no recursion.\n"));
-      /* add the fail to our WINS cache of names. give it 1 hour in the cache */
-         add_netbios_entry(*d,qname,name_type,NB_ACTIVE,60*60,DNSFAIL,dns_ip,
-                                               True, True);
-         return NULL;
+               /* no luck with DNS. We could possibly recurse here XXXX */
+               DEBUG(3,("not found. no recursion.\n"));
+               /* add the fail to WINS cache of names. give it 1 hour in the cache */
+               add_netbios_entry(d,qname,name_type,NB_ACTIVE,60*60,DNSFAIL,dns_ip,
+                                 True, True);
+               return NULL;
        }
-      
-      /* add it to our WINS cache of names. give it 2 hours in the cache */
-      n = add_netbios_entry(*d,qname,name_type,NB_ACTIVE,2*60*60,DNS,dns_ip,
-                                               True,True);
-      
-      /* failed to add it? yikes! */
-      if (!n) return NULL;
-    }
-  
-  /* is our entry already dead? */
-  if (n->death_time)
-    {
-      if (n->death_time < Time) return False;
-    }
-  
-  /* it may have been an earlier failure */
-  if (n->source == DNSFAIL)
-    {
-      DEBUG(3,("DNSFAIL\n"));
-      return NULL;
-    }
-  
-  DEBUG(3,("OK %s\n",inet_ntoa(n->ip_flgs[0].ip)));      
-  
-  return n;
-}
 
+       DEBUG(3,("found with DNS: %s\n", inet_ntoa(dns_ip)));
 
+       /* add it to our WINS cache of names. give it 2 hours in the cache */
+       return add_netbios_entry(d,qname,name_type,NB_ACTIVE,2*60*60,DNS,dns_ip,
+                                True,True);
+}