summaryrefslogtreecommitdiff
path: root/source3/nameserv.c
diff options
context:
space:
mode:
authorSamba Release Account <samba-bugs@samba.org>1997-03-12 20:21:11 +0000
committerSamba Release Account <samba-bugs@samba.org>1997-03-12 20:21:11 +0000
commit5f178fc18ac07eeeb579a23c6cbf8519ce44b60b (patch)
tree0ef094d1205cfeedec09fb09edbba0ef796dd069 /source3/nameserv.c
parent35de5ef34343d546ce7269308871d7da55991861 (diff)
downloadsamba-5f178fc18ac07eeeb579a23c6cbf8519ce44b60b.tar.gz
samba-5f178fc18ac07eeeb579a23c6cbf8519ce44b60b.tar.bz2
samba-5f178fc18ac07eeeb579a23c6cbf8519ce44b60b.zip
added code that checks whether the DOMAIN<1b> name is claimed on the
local subnet _before_ going and registering it. the reason for this is that i don't want to cause chaos by registering the name twice. it's ok to register DOMAIN<1b> with the WINS server, because the WINS server's job is to check a) _if_ there's a current owner of the name b) if the current owner exists c) if the current owner still wants the name. if they don't, the WINS server responds by saying, 'yes, you can have it'. lkcl (This used to be commit 0d51899b59204b99d5aeb9542c8adfff42167fec)
Diffstat (limited to 'source3/nameserv.c')
-rw-r--r--source3/nameserv.c44
1 files changed, 38 insertions, 6 deletions
diff --git a/source3/nameserv.c b/source3/nameserv.c
index 7f1c0fadee..77c3906242 100644
--- a/source3/nameserv.c
+++ b/source3/nameserv.c
@@ -80,14 +80,18 @@ void remove_name_entry(struct subnet_record *d, char *name,int type)
don't really own */
remove_netbios_name(d,name,type,SELF,n2->ip_flgs[0].ip);
- if (ip_equal(d->bcast_ip, ipgrp)) {
- if (!lp_wins_support()) {
+ if (ip_equal(d->bcast_ip, ipgrp))
+ {
+ if (!lp_wins_support())
+ {
/* not a WINS server: we have to release them on the network */
queue_netbios_pkt_wins(d,ClientNMB,NMB_REL,NAME_RELEASE,
name, type, 0, 0,0,NULL,NULL,
False, True, ipzero, ipzero);
}
- } else {
+ }
+ else
+ {
/* local interface: release them on the network */
queue_netbios_packet(d,ClientNMB,NMB_REL,NAME_RELEASE,
name, type, 0, 0,0,NULL,NULL,
@@ -181,19 +185,47 @@ void add_domain_names(time_t t)
make_nmb_name(&n,lp_workgroup(),0x1c,scope);
if (!find_name(d->namelist, &n, FIND_SELF))
{
+ /* logon servers are group names - we don't expect this to fail. */
DEBUG(0,("%s attempting to become logon server for %s %s\n",
timestring(), lp_workgroup(), inet_ntoa(d->bcast_ip)));
become_logon_server(d, work);
}
}
+
if (lp_domain_master() && work && work->dom_state == DOMAIN_NONE)
{
make_nmb_name(&n,lp_workgroup(),0x1b,scope);
if (!find_name(d->namelist, &n, FIND_SELF))
{
- DEBUG(1,("%s attempting to become logon server for %s %s\n",
- timestring(), lp_workgroup(), inet_ntoa(d->bcast_ip)));
- become_domain_master(d, work);
+ if (ip_equal(d->bcast_ip,ipgrp))
+ {
+ if (lp_wins_support())
+ {
+ /* use the wins server's capabilities (indirectly). if
+ someone has already register the domain<1b> name with
+ the WINS server, then the WINS server's job is to _check_
+ that the owner still wants it, before giving it away.
+ */
+
+ DEBUG(1,("%s initiating becoming logon server for %s %s\n",
+ timestring(), lp_workgroup(), inet_ntoa(d->bcast_ip)));
+ become_domain_master(d, work);
+ }
+ }
+ else
+ {
+ /* send out a query to establish whether there's a
+ domain controller on the local subnet. if not,
+ we can become a domain controller on that subnet.
+ it's only polite that we check, before claiming the
+ NetBIOS name 0x1b.
+ */
+
+ queue_netbios_packet(d,ClientNMB,NMB_QUERY,NAME_QUERY_DOMAIN,
+ lp_workgroup(), 0x1b,
+ 0, 0,0,NULL,NULL,
+ True, True, d->bcast_ip, d->bcast_ip);
+ }
}
}
}