summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamba Release Account <samba-bugs@samba.org>1997-05-31 01:11:40 +0000
committerSamba Release Account <samba-bugs@samba.org>1997-05-31 01:11:40 +0000
commitd98bea900ee694cdba83149620c65bd7f8765f26 (patch)
tree23d2ee7a6fc586dbfbbc2961c3214455f645cc61
parent5c4776f496d814b0ab5b75b5d029dc0998236365 (diff)
downloadsamba-d98bea900ee694cdba83149620c65bd7f8765f26.tar.gz
samba-d98bea900ee694cdba83149620c65bd7f8765f26.tar.bz2
samba-d98bea900ee694cdba83149620c65bd7f8765f26.zip
namepacket.c: Block SIGTERM correctly - we can only take them at defined points.
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)
-rw-r--r--source3/namepacket.c3
-rw-r--r--source3/nameserv.c16
-rw-r--r--source3/nameservreply.c5
-rw-r--r--source3/nmbd/nmbd.c2
4 files changed, 24 insertions, 2 deletions
diff --git a/source3/namepacket.c b/source3/namepacket.c
index 31cad92791..418155bbd8 100644
--- a/source3/namepacket.c
+++ b/source3/namepacket.c
@@ -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))
{
diff --git a/source3/nameserv.c b/source3/nameserv.c
index 93111eb268..aba7ddadb6 100644
--- a/source3/nameserv.c
+++ b/source3/nameserv.c
@@ -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
diff --git a/source3/nameservreply.c b/source3/nameservreply.c
index a4888b04d4..9f7b3da70b 100644
--- a/source3/nameservreply.c
+++ b/source3/nameservreply.c
@@ -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;
}
diff --git a/source3/nmbd/nmbd.c b/source3/nmbd/nmbd.c
index 99d65d551a..dc3f642cd6 100644
--- a/source3/nmbd/nmbd.c
+++ b/source3/nmbd/nmbd.c
@@ -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();