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)
timeout.tv_sec = (run_election||num_response_packets) ? 1:NMBD_SELECT_LOOP;
timeout.tv_usec = 0;
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);
selrtn = sys_select(&fds,&timeout);
+ BlockSignals(True, SIGTERM);
if (FD_ISSET(ClientNMB,&fds))
{
if (FD_ISSET(ClientNMB,&fds))
{
a de-registration packet to the local subnet before removing the
name from its local-subnet name database. */
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);
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))
{
/* check name isn't already being de-registered */
if (NAME_DEREG(n2->ip_flgs[0].nb_flags))
+ /* 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
/* 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
search, ip);
/* XXXX under what conditions should we reject the removal?? */
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)))
+ 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;
}
remove_name(d,n);
n = NULL;
}
DEBUG(3,("Dumped names\n"));
DEBUG(3,("Dumped names\n"));
+ /* We can only take sigterm signals in the select. */
+ BlockSignals(True,SIGTERM);
process();
close_sockets();
process();
close_sockets();