namepacket.c: Block SIGTERM correctly - we can only take them at defined points.
authorSamba Release Account <samba-bugs@samba.org>
Sat, 31 May 1997 01:11:40 +0000 (01:11 +0000)
committerSamba Release Account <samba-bugs@samba.org>
Sat, 31 May 1997 01:11:40 +0000 (01:11 +0000)
nameserv.c: Fixup name release code - used when we are going down.
nameservreply.c: Relaxed check for deleting name - original code never deleted.
nmbd.c: Block SIGTERM signals most of the time - see comment on namepacket above.
Jeremy (jallison@whistle.com)
(This used to be commit 9f4e01224751134c2f7701e2aea87d06a79d77a4)

source3/namepacket.c
source3/nameserv.c
source3/nameservreply.c
source3/nmbd/nmbd.c

index 31cad927911f3e90e1c4cff28ce5115ed8a9be62..418155bbd85b1fa19baa70093f432c3a1e39becc 100644 (file)
@@ -522,7 +522,10 @@ void listen_for_packets(BOOL run_election)
        timeout.tv_sec = (run_election||num_response_packets) ? 1:NMBD_SELECT_LOOP;
        timeout.tv_usec = 0;
 
+        /* We can only take term signals when we are in the select. */
+        BlockSignals(False, SIGTERM);
        selrtn = sys_select(&fds,&timeout);
+        BlockSignals(True, SIGTERM);
 
        if (FD_ISSET(ClientNMB,&fds))
        {
index 93111eb2689fa23aad303138d0d36a06ea1441db..aba7ddadb60eecaadb63bff5814bb88e582b3132 100644 (file)
@@ -62,12 +62,18 @@ void remove_name_entry(struct subnet_record *d, char *name,int type, BOOL direct
       a de-registration packet to the local subnet before removing the
       name from its local-subnet name database. */
 
+  int search = FIND_SELF;
   struct name_record n;
   struct name_record *n2=NULL;
       
   make_nmb_name(&n.name,name,type,scope);
 
-  if ((n2 = find_name_search(&d, &n.name, FIND_SELF, ipzero)))
+  if(d == wins_subnet)
+    search |= FIND_WINS;
+  else
+    search |= FIND_LOCAL;
+
+  if ((n2 = find_name_search(&d, &n.name, search, ipzero)))
   {
     /* check name isn't already being de-registered */
     if (NAME_DEREG(n2->ip_flgs[0].nb_flags))
@@ -79,6 +85,14 @@ void remove_name_entry(struct subnet_record *d, char *name,int type, BOOL direct
 
   if (!n2) return;
 
+  /* Only remove names with non-zero death times. */
+  if(n2->death_time == 0)
+  {
+    DEBUG(5,("remove_name_entry: Name %s(%d) has zero ttl - not removing.\n",
+             name, type));
+    return;
+  }
+
   /* remove the name immediately. even if the spec says we should
      first try to release them, this is too dangerous with our current
      name structures as otherwise we will end up replying to names we
index a4888b04d4d5d2dfd2d49ff1cf44374ca8847265..9f7b3da70ba7cf8a9425f974907773398ad1f7bd 100644 (file)
@@ -135,10 +135,13 @@ void reply_name_release(struct packet_struct *p)
                       search, ip);
   
   /* XXXX under what conditions should we reject the removal?? */
-  if (n && n->ip_flgs[0].nb_flags == nb_flags)
+  /* For now - remove if the names match and the group bit matches. */
+  if (n && (NAME_GROUP(n->ip_flgs[0].nb_flags) == NAME_GROUP(nb_flags)))
     {
       success = True;
       
+      DEBUG(5, ("reply_name_release: Removing name %s on subnet %s\n",
+                namestr(&nmb->question.question_name), inet_ntoa(d->bcast_ip)));
       remove_name(d,n);
       n = NULL;
     }
index 99d65d551aa3f90c3bcf8da7129f8397a96f09fd..dc3f642cd6074944de0eb491e4e70c18616c6fc1 100644 (file)
@@ -571,6 +571,8 @@ static void usage(char *pname)
 
   DEBUG(3,("Dumped names\n"));
 
+  /* We can only take sigterm signals in the select. */
+  BlockSignals(True,SIGTERM);
   process();
   close_sockets();