summaryrefslogtreecommitdiff
path: root/source3/nameserv.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>1996-10-02 15:41:30 +0000
committerAndrew Tridgell <tridge@samba.org>1996-10-02 15:41:30 +0000
commitafd08462ad5ff6b3c4bf621e39c55853a608175e (patch)
treefdbaf287628ee046f0db73dd13611a03089fb47b /source3/nameserv.c
parent5a2f52b79e28530c454cb488a44588147640f061 (diff)
downloadsamba-afd08462ad5ff6b3c4bf621e39c55853a608175e.tar.gz
samba-afd08462ad5ff6b3c4bf621e39c55853a608175e.tar.bz2
samba-afd08462ad5ff6b3c4bf621e39c55853a608175e.zip
backout all the changes to nmbd.
The 1.9.16 tree is now back to 1.9.16p2 as far as nmbd is concerned apart from a small change that fixes the announce type in two places. (This used to be commit 45e66a69d320024877c8b13f12b21bf895e04410)
Diffstat (limited to 'source3/nameserv.c')
-rw-r--r--source3/nameserv.c249
1 files changed, 118 insertions, 131 deletions
diff --git a/source3/nameserv.c b/source3/nameserv.c
index 6bdc95896f..c8bbb52811 100644
--- a/source3/nameserv.c
+++ b/source3/nameserv.c
@@ -51,7 +51,7 @@ extern uint16 nb_type; /* samba's NetBIOS type */
XXXX at present, the name is removed _even_ if a WINS server says keep it.
****************************************************************************/
-void remove_name_entry(struct subnet_record *d, int token, char *name,int type)
+void remove_name_entry(struct subnet_record *d, char *name,int type)
{
/* XXXX BUG: if samba is offering WINS support, it should still broadcast
a de-registration packet to the local subnet before removing the
@@ -80,18 +80,17 @@ void remove_name_entry(struct subnet_record *d, int token, 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))
- {
- /* use WINS. this function can now be used to _either_
- do the release on samba's own database _or_ release
- the name with an arbitrary WINS server */
+ 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,
- token, name, type, SELF, 0, 0,0,NULL,NULL,
+ name, type, 0, 0,0,NULL,NULL,
False, True, ipzero, ipzero);
+ }
} else {
/* local interface: release them on the network */
queue_netbios_packet(d,ClientNMB,NMB_REL,NAME_RELEASE,
- token, name, type, SELF, 0, 0,0,NULL,NULL,
+ name, type, 0, 0,0,NULL,NULL,
True, True, d->bcast_ip, d->bcast_ip);
}
}
@@ -104,8 +103,7 @@ void remove_name_entry(struct subnet_record *d, int token, char *name,int type)
it's just a matter of when this will be done (e.g after a time-out).
****************************************************************************/
-void add_my_name_entry(struct subnet_record *d, int token,
- char *name,int type,int nb_flags)
+void add_my_name_entry(struct subnet_record *d,char *name,int type,int nb_flags)
{
BOOL re_reg = False;
struct nmb_name n;
@@ -117,7 +115,7 @@ void add_my_name_entry(struct subnet_record *d, int token,
make_nmb_name(&n, name, type, scope);
if (find_name(d->namelist, &n, SELF))
- re_reg = True;
+ re_reg = True;
/* XXXX BUG: if samba is offering WINS support, it should still add the
name entry to a local-subnet name database. see rfc1001.txt 15.1.1 p28
@@ -125,7 +123,6 @@ void add_my_name_entry(struct subnet_record *d, int token,
if (ip_equal(d->bcast_ip, ipgrp))
{
-#if 0
if (lp_wins_support())
{
/* we are a WINS server. */
@@ -134,38 +131,26 @@ void add_my_name_entry(struct subnet_record *d, int token,
actually be true
*/
- struct nmb_ip data;
-
- data.nb_flags = nb_flags;
- putip(&data.ip, ipzero);
-
DEBUG(4,("samba as WINS server adding: "));
/* this will call add_netbios_entry() */
-
- name_register_work(d,token,name,type,SELF,&data,GET_TTL(0),ipzero,False);
+ name_register_work(d, name, type, nb_flags,0, ipzero, False);
}
else
{
-#endif
- /* ipzero when not using an arbitrary wins server results in the
- netbios packet being short-circuited to process_nmb()
- */
/* a time-to-live allows us to refresh this name with the WINS server. */
- queue_netbios_pkt_wins(d,ClientNMB,
- re_reg ? NMB_REG_REFRESH : NMB_REG, NAME_REGISTER,
- token, name, type, SELF, nb_flags, GET_TTL(0),0,NULL,NULL,
- False, True, ipzero, ipzero);
-#if 0
+ queue_netbios_pkt_wins(d,ClientNMB,
+ re_reg ? NMB_REG_REFRESH : NMB_REG, NAME_REGISTER,
+ name, type, nb_flags, GET_TTL(0),0,NULL,NULL,
+ False, True, ipzero, ipzero);
}
-#endif
}
else
{
/* broadcast the packet, but it comes from ipzero */
- queue_netbios_packet(d,ClientNMB,
- re_reg ? NMB_REG_REFRESH : NMB_REG, NAME_REGISTER,
- token, name, type, SELF, nb_flags, GET_TTL(0),0,NULL,NULL,
- True, True, d->bcast_ip, ipzero);
+ queue_netbios_packet(d,ClientNMB,
+ re_reg ? NMB_REG_REFRESH : NMB_REG, NAME_REGISTER,
+ name, type, nb_flags, GET_TTL(0),0,NULL,NULL,
+ True, True, d->bcast_ip, ipzero);
}
}
@@ -176,8 +161,6 @@ void add_my_name_entry(struct subnet_record *d, int token,
void add_my_names(void)
{
struct subnet_record *d;
- int token;
-
/* each subnet entry, including WINS pseudo-subnet, has SELF names */
/* XXXX if there was a transport layer added to samba (ipx/spx etc) then
@@ -186,56 +169,32 @@ void add_my_names(void)
for (d = subnetlist; d; d = d->next)
{
- BOOL wins = ip_equal(d->bcast_ip,ipgrp);
-
- for (token = 0; token < get_num_workgroups(); token++)
- {
- char *my_name = conf_browsing_alias(token);
- char *wg_name = conf_workgroup_name(token);
-
- if (my_name)
- {
- add_my_name_entry(d, token, my_name,0x20,nb_type|NB_ACTIVE);
- add_my_name_entry(d, token, my_name,0x03,nb_type|NB_ACTIVE);
- add_my_name_entry(d, token, my_name,0x00,nb_type|NB_ACTIVE);
- add_my_name_entry(d, token, my_name,0x1f,nb_type|NB_ACTIVE);
- }
-
- if (wg_name && conf_should_domain_logon(token))
- {
- /* the 0x1c is to do with domain logons */
- add_my_name_entry(d, token, wg_name,0x1c,nb_type|NB_ACTIVE|NB_GROUP);
- }
- }
+ BOOL wins = lp_wins_support() && ip_equal(d->bcast_ip,ipgrp);
+ add_my_name_entry(d, myname,0x20,nb_type|NB_ACTIVE);
+ add_my_name_entry(d, myname,0x03,nb_type|NB_ACTIVE);
+ add_my_name_entry(d, myname,0x00,nb_type|NB_ACTIVE);
+ add_my_name_entry(d, myname,0x1f,nb_type|NB_ACTIVE);
+
/* these names are added permanently (ttl of zero) and will NOT be
refreshed with the WINS server */
-
add_netbios_entry(d,"*",0x0,nb_type|NB_ACTIVE,0,SELF,d->myip,False,wins);
+ add_netbios_entry(d,"*",0x20,nb_type|NB_ACTIVE,0,SELF,d->myip,False,wins);
add_netbios_entry(d,"__SAMBA__",0x20,nb_type|NB_ACTIVE,0,SELF,d->myip,False,wins);
add_netbios_entry(d,"__SAMBA__",0x00,nb_type|NB_ACTIVE,0,SELF,d->myip,False,wins);
-
+
+ if (lp_domain_logons()) {
+ /* XXXX the 0x1c is apparently something to do with domain logons */
+ add_my_name_entry(d, lp_workgroup(),0x1c,nb_type|NB_ACTIVE|NB_GROUP);
+ }
}
-
- /* check becoming a domain master under all browser aliases */
-
- if ((d = find_subnet(ipgrp)))
+ if (lp_domain_master() && (d = find_subnet(ipgrp)))
{
- for (token = 0; token < get_num_workgroups(); token++)
+ struct work_record *work = find_workgroupstruct(d, lp_workgroup(), True);
+ if (work && work->state == MST_NONE)
{
- if (conf_should_domain_master(token))
- {
- char *work_name = conf_workgroup_name(token);
- if (work_name)
- {
- struct work_record *work = find_workgroupstruct(d,work_name,True);
- if (work && work->state == MST_NONE)
- {
- work->state = MST_DOMAIN_NONE;
- become_master(d, work);
- }
- }
- }
+ work->state = MST_DOMAIN_NONE;
+ become_master(d, work);
}
}
}
@@ -246,24 +205,52 @@ void add_my_names(void)
**************************************************************************/
void remove_my_names()
{
- struct subnet_record *d;
+ struct subnet_record *d;
+
+ for (d = subnetlist; d; d = d->next)
+ {
+ struct name_record *n, *next;
+
+ for (n = d->namelist; n; n = next)
+ {
+ next = n->next;
+ if (n->source == SELF)
+ {
+ /* get all SELF names removed from the WINS server's database */
+ /* XXXX note: problem occurs if this removes the wrong one! */
+
+ remove_name_entry(d,n->name.name, n->name.name_type);
+ }
+ }
+ }
+}
+
+
+/*******************************************************************
+ refresh my own names
+ ******************************************************************/
+void refresh_my_names(time_t t)
+{
+ struct subnet_record *d;
- for (d = subnetlist; d; d = d->next)
+ for (d = subnetlist; d; d = d->next)
+ {
+ struct name_record *n;
+
+ for (n = d->namelist; n; n = n->next)
{
- struct name_record *n, *next;
-
- for (n = d->namelist; n; n = next)
- {
- next = n->next;
- if (n->source == SELF)
- {
- /* get all SELF names removed from the WINS server's database */
- /* XXXX note: problem occurs if this removes the wrong one! */
-
- remove_name_entry(d, -1, n->name.name, n->name.name_type);
- }
- }
+ /* each SELF name has an individual time to be refreshed */
+ if (n->source == SELF && n->refresh_time < time(NULL) &&
+ n->death_time != 0)
+ {
+ add_my_name_entry(d,n->name.name,n->name.name_type,
+ n->ip_flgs[0].nb_flags);
+ /* they get a new lease on life :-) */
+ n->death_time += GET_TTL(0);
+ n->refresh_time += GET_TTL(0);
+ }
}
+ }
}
@@ -278,55 +265,55 @@ void remove_my_names()
******************************************************************/
void query_refresh_names(void)
{
- struct name_record *n;
- struct subnet_record *d = find_subnet(ipgrp);
+ struct name_record *n;
+ struct subnet_record *d = find_subnet(ipgrp);
- static time_t lasttime = 0;
- time_t t = time(NULL);
+ static time_t lasttime = 0;
+ time_t t = time(NULL);
- int count = 0;
- int name_refresh_time = NAME_POLL_REFRESH_TIME;
- int max_count = name_refresh_time * 2 / NAME_POLL_INTERVAL;
- if (max_count > 10) max_count = 10;
+ int count = 0;
+ int name_refresh_time = NAME_POLL_REFRESH_TIME;
+ int max_count = name_refresh_time * 2 / NAME_POLL_INTERVAL;
+ if (max_count > 10) max_count = 10;
- name_refresh_time = NAME_POLL_INTERVAL * max_count / 2;
+ name_refresh_time = NAME_POLL_INTERVAL * max_count / 2;
- /* if (!lp_poll_wins()) return; polling of registered names allowed */
+ /* if (!lp_poll_wins()) return; polling of registered names allowed */
- if (!d) return;
+ if (!d) return;
if (!lasttime) lasttime = t;
- if (t - lasttime < NAME_POLL_INTERVAL) return;
+ if (t - lasttime < NAME_POLL_INTERVAL) return;
lasttime = time(NULL);
- for (n = d->namelist; n; n = n->next)
- {
- /* only do unique, registered names. */
-
- if (n->source != REGISTER) continue;
- if (!NAME_GROUP(n->ip_flgs[0].nb_flags)) continue;
-
- if (n->refresh_time < t)
- {
- DEBUG(3,("Polling name %s\n", namestr(&n->name)));
-
- queue_netbios_packet(d,ClientNMB,NMB_QUERY,NAME_QUERY_CONFIRM,
- -1,n->name.name, n->name.name_type,
- n->source,0,0,0,NULL,NULL,
- False,False,n->ip_flgs[0].ip,n->ip_flgs[0].ip);
- count++;
- }
-
- if (count >= max_count)
- {
- /* don't do too many of these at once, but do enough to
- cover everyone in the list */
- return;
- }
-
- /* this name will be checked on again, if it's not removed */
- n->refresh_time += name_refresh_time;
- }
+ for (n = d->namelist; n; n = n->next)
+ {
+ /* only do unique, registered names */
+
+ if (n->source != REGISTER) continue;
+ if (!NAME_GROUP(n->ip_flgs[0].nb_flags)) continue;
+
+ if (n->refresh_time < t)
+ {
+ DEBUG(3,("Polling name %s\n", namestr(&n->name)));
+
+ queue_netbios_packet(d,ClientNMB,NMB_QUERY,NAME_QUERY_CONFIRM,
+ n->name.name, n->name.name_type,
+ 0,0,0,NULL,NULL,
+ False,False,n->ip_flgs[0].ip,n->ip_flgs[0].ip);
+ count++;
+ }
+
+ if (count >= max_count)
+ {
+ /* don't do too many of these at once, but do enough to
+ cover everyone in the list */
+ return;
+ }
+
+ /* this name will be checked on again, if it's not removed */
+ n->refresh_time += name_refresh_time;
+ }
}