summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/nameserv.h6
-rw-r--r--source3/include/proto.h8
-rw-r--r--source3/lib/charset.c2
-rw-r--r--source3/namedb.c1
-rw-r--r--source3/nameelect.c206
-rw-r--r--source3/nameresp.c42
-rw-r--r--source3/nameserv.c124
-rw-r--r--source3/nmbd/nmbd.c6
-rw-r--r--source3/nmbsync.c8
-rw-r--r--source3/smbd/ipc.c30
10 files changed, 281 insertions, 152 deletions
diff --git a/source3/include/nameserv.h b/source3/include/nameserv.h
index 9e4145213b..64a71b89ba 100644
--- a/source3/include/nameserv.h
+++ b/source3/include/nameserv.h
@@ -79,6 +79,8 @@
enum name_source {STATUS_QUERY, LMHOSTS, REGISTER, SELF, DNS, DNSFAIL};
enum node_type {B_NODE=0, P_NODE=1, M_NODE=2, NBDD_NODE=3};
enum packet_type {NMB_PACKET, DGRAM_PACKET};
+enum master_state { MST_NONE, MST_WON, MST_MSB, MST_BROWSER, MST_DOMAIN };
+
enum state_type
{
NAME_STATUS_MASTER_CHECK,
@@ -149,6 +151,9 @@ struct work_record
struct server_record *serverlist;
+ /* stage of development from non-master to master browser / domain master */
+ enum master_state state;
+
/* work group info */
fstring work_group;
int token; /* used when communicating with backup browsers */
@@ -159,6 +164,7 @@ struct work_record
int announce_interval;
BOOL needannounce;
+
/* election info */
BOOL RunningElection;
BOOL needelection;
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 3c51382ff7..fa04e284d3 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -1,8 +1,5 @@
/* This file is automatically generated with "make proto". DO NOT EDIT */
-
-/*The following definitions come from - */
-
BOOL check_access(int snum);
BOOL allow_access(char *deny_list,char *allow_list,struct from_host *client);
BOOL fromhost(int sock,struct from_host *f);
@@ -273,6 +270,10 @@ void check_master_browser(void);
void browser_gone(char *work_name, struct in_addr ip);
void send_election(struct subnet_record *d, char *group,uint32 criterion,
int timeup,char *name);
+void name_unregister_work(struct subnet_record *d, char *name, int name_type);
+void name_register_work(struct subnet_record *d, char *name, int name_type,
+ int nb_flags, time_t ttl, struct in_addr ip, BOOL bcast);
+void become_master(struct subnet_record *d, struct work_record *work);
void become_nonmaster(struct subnet_record *d, struct work_record *work,
int remove_type);
void run_elections(void);
@@ -309,6 +310,7 @@ BOOL interpret_node_status(struct subnet_record *d,
BOOL send_mailslot_reply(char *mailslot,int fd,char *buf,int len,char *srcname,
char *dstname,int src_type,int dest_type,
struct in_addr dest_ip,struct in_addr src_ip);
+BOOL special_browser_name(char *name, int type);
void remove_name(struct subnet_record *d, struct name_record *n);
void dump_names(void);
void load_netbios_names(void);
diff --git a/source3/lib/charset.c b/source3/lib/charset.c
index 1180f4ea9c..ada3ef790a 100644
--- a/source3/lib/charset.c
+++ b/source3/lib/charset.c
@@ -3,7 +3,7 @@
Version 1.9.
Character set handling
Copyright (C) Andrew Tridgell 1992-1995
-
+
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
diff --git a/source3/namedb.c b/source3/namedb.c
index 1855103c99..305dfb4476 100644
--- a/source3/namedb.c
+++ b/source3/namedb.c
@@ -108,6 +108,7 @@ static struct work_record *make_workgroup(char *name)
work->ElectionCount = 0;
work->needelection = False;
work->needannounce = True;
+ work->state = MST_NONE;
/* make sure all token representations of workgroups are unique */
diff --git a/source3/nameelect.c b/source3/nameelect.c
index 855ea26348..bb219415b8 100644
--- a/source3/nameelect.c
+++ b/source3/nameelect.c
@@ -34,6 +34,7 @@ extern int DEBUGLEVEL;
extern pstring scope;
extern pstring myname;
+extern struct in_addr ipzero;
/* machine comment for host announcements */
extern pstring ServerComment;
@@ -149,50 +150,182 @@ void send_election(struct subnet_record *d, char *group,uint32 criterion,
}
+/****************************************************************************
+ un-register a SELF name that got rejected.
+
+ if this name happens to be rejected when samba is in the process
+ of becoming a master browser (registering __MSBROWSE__, WORKGROUP(1d)
+ or WORKGROUP(1b)) then we must stop being a master browser. sad.
+
+ **************************************************************************/
+void name_unregister_work(struct subnet_record *d, char *name, int name_type)
+{
+ struct work_record *work;
+
+ remove_netbios_name(d,name,name_type,SELF,ipzero);
+
+ if (!(work = find_workgroupstruct(d, name, False))) return;
+
+ if (special_browser_name(name, name_type) ||
+ (AM_MASTER(work) && strequal(name, lp_workgroup()) == 0 &&
+ (name_type == 0x1d || name_type == 0x1b)))
+ {
+ int remove_type = 0;
+
+ if (special_browser_name(name, name_type))
+ remove_type = SV_TYPE_MASTER_BROWSER|SV_TYPE_DOMAIN_MASTER;
+ if (name_type == 0x1d)
+ remove_type = SV_TYPE_MASTER_BROWSER;
+ if (name_type == 0x1b)
+ remove_type = SV_TYPE_DOMAIN_MASTER;
+
+ become_nonmaster(d, work, remove_type);
+ }
+}
+
+
+/****************************************************************************
+ registers a name.
+
+ if the name being added is a SELF name, we must additionally check
+ whether to proceed to the next stage in samba becoming a master browser.
+
+ **************************************************************************/
+void name_register_work(struct subnet_record *d, char *name, int name_type,
+ int nb_flags, time_t ttl, struct in_addr ip, BOOL bcast)
+{
+ enum name_source source = ismyip(ip) ? SELF : REGISTER;
+
+ if (source == SELF)
+ {
+ struct work_record *work = find_workgroupstruct(d, lp_workgroup(), False);
+
+ if (work && work->state != MST_NONE)
+ {
+ /* samba is in the process of working towards master browser-ness.
+ initiate the next stage.
+ */
+ become_master(d, work);
+ }
+ }
+ add_netbios_entry(d,name,name_type,nb_flags,ttl,source,ip,True,!bcast);
+}
+
+
/*******************************************************************
- become the master browser
+ become the master browser.
+
+ this is done in stages. note that this could take a while,
+ particularly on a broadcast subnet, as we have to wait for
+ the implicit registration of each name to be accepted.
+
+ as each name is successfully registered, become_master() is
+ called again, in order to initiate the next stage. see
+ dead_netbios_entry() - deals with implicit name registration
+ and response_name_reg() - deals with explicit registration
+ with a WINS server.
+
+ stage 1: was MST_NONE - go to MST_NONE and register ^1^2__MSBROWSE__^2^1.
+ stage 2: was MST_WON - go to MST_MSB and register WORKGROUP(0x1d)
+ stage 3: was MST_MSB - go to MST_BROWSER and register WORKGROUP(0x1b)
+ stage 4: was MST_BROWSER - go to MST_DOMAIN (do not pass GO, do not...)
+
+ XXXX note: this code still does not cope with the distinction
+ between different types of nodes, particularly between M and P
+ nodes. that comes later.
+
******************************************************************/
-static void become_master(struct subnet_record *d, struct work_record *work)
+void become_master(struct subnet_record *d, struct work_record *work)
{
- uint32 domain_type = SV_TYPE_DOMAIN_ENUM | SV_TYPE_SERVER_UNIX | 0x00400000;
+ uint32 domain_type = SV_TYPE_DOMAIN_ENUM|SV_TYPE_SERVER_UNIX|0x00400000;
if (!work) return;
- DEBUG(2,("Becoming master for %s\n",work->work_group));
+ DEBUG(2,("Becoming master for %s (stage %d)",work->work_group,work->state));
- work->ServerType |= SV_TYPE_MASTER_BROWSER;
- work->ServerType &= ~SV_TYPE_POTENTIAL_BROWSER;
- work->ElectionCriterion |= 0x5;
+ switch (work->state)
+ {
+ case MST_NONE: /* while we were nothing but a server... */
+ {
+ work->state = MST_WON; /* election win was successful */
+
+ work->ElectionCriterion |= 0x5;
+
+ /* update our server status */
+ work->ServerType &= ~SV_TYPE_POTENTIAL_BROWSER;
+ add_server_entry(d,work,myname,work->ServerType,0,ServerComment,True);
+
+ DEBUG(2,("first stage: register ^1^2__MSBROWSE__^2^1\n"));
+
+ /* add special browser name */
+ add_my_name_entry(d,MSBROWSE ,0x01,NB_ACTIVE|NB_GROUP);
+
+ break;
+ }
+ case MST_WON: /* while nothing had happened except we won an election... */
+ {
+ work->state = MST_MSB; /* registering MSBROWSE was successful */
+
+ /* add server entry on successful registration of MSBROWSE */
+ add_server_entry(d,work,work->work_group,domain_type,0,myname,True);
+
+ DEBUG(2,("second stage: register as master browser\n"));
+
+ /* add master name */
+ add_my_name_entry(d,work->work_group,0x1d,NB_ACTIVE );
- /* add browse, master and general names to database or register with WINS */
- add_my_name_entry(d,MSBROWSE ,0x01,NB_ACTIVE|NB_GROUP);
- add_my_name_entry(d,work->work_group,0x1d,NB_ACTIVE );
+ break;
+ }
+ case MST_MSB: /* while we were still only registered MSBROWSE state */
+ {
+ work->state = MST_BROWSER; /* registering WORKGROUP(1d) was successful */
+
+ /* update our server status */
+ work->ServerType |= SV_TYPE_MASTER_BROWSER;
+ add_server_entry(d,work,myname,work->ServerType,0,ServerComment,True);
+
+ if (d->my_interface && work->serverlist == NULL) /* no servers! */
+ {
+ /* ask all servers on our local net to announce to us */
+ announce_request(work, d->bcast_ip);
+ }
+
+ if (lp_domain_master())
+ {
+ DEBUG(2,("third stage: register as domain master\n"));
+ /* add domain master name */
+ add_my_name_entry(d,work->work_group,0x1b,NB_ACTIVE );
+ }
- if (lp_domain_master())
+ break;
+ }
+ case MST_BROWSER: /* while we were still a master browser... */
{
- DEBUG(4,("Domain master: adding names...\n"));
-
- /* add domain master and domain member names or register with WINS */
- add_my_name_entry(d,work->work_group,0x1b,NB_ACTIVE );
-
- work->ServerType |= SV_TYPE_DOMAIN_MASTER;
+ work->state = MST_DOMAIN; /* registering WORKGROUP(1b) was successful */
+
+ /* update our server status */
+ if (lp_domain_master())
+ {
+ work->ServerType |= SV_TYPE_DOMAIN_MASTER;
- if (lp_domain_logons())
- {
- work->ServerType |= SV_TYPE_DOMAIN_CTRL;
- work->ServerType |= SV_TYPE_DOMAIN_MEMBER;
- }
- }
-
- /* update our server status */
- add_server_entry(d,work,work->work_group,domain_type,0,myname,True);
- add_server_entry(d,work,myname,work->ServerType,0,ServerComment,True);
+ if (lp_domain_logons())
+ {
+ work->ServerType |= SV_TYPE_DOMAIN_CTRL;
+ work->ServerType |= SV_TYPE_DOMAIN_MEMBER;
+ }
+ DEBUG(2,("fourth stage: samba is now a domain master.\n"));
+ add_server_entry(d,work,myname,work->ServerType,0,ServerComment,True);
+ }
- if (d->my_interface)
+ break;
+ }
+ case MST_DOMAIN:
{
- /* ask all servers on our local net to announce to us */
- announce_request(work, d->bcast_ip);
+ /* nothing else to become, at the moment: we are top-dog. */
+ DEBUG(2,("fifth stage: there isn't one yet!\n"));
+ break;
}
+ }
}
@@ -222,6 +355,7 @@ void become_nonmaster(struct subnet_record *d, struct work_record *work,
work->ServerType |= SV_TYPE_POTENTIAL_BROWSER;
work->ElectionCriterion &= ~0x4;
+ work->state = MST_NONE;
/* announce ourselves as no longer active as a master browser. */
announce_server(d, work, work->work_group, myname, 0, 0);
@@ -231,10 +365,19 @@ void become_nonmaster(struct subnet_record *d, struct work_record *work,
work->ServerType = new_server_type;
if (!(work->ServerType & SV_TYPE_DOMAIN_MASTER))
+ {
+ if (work->state == MST_DOMAIN)
+ work->state = MST_BROWSER;
remove_name_entry(d,work->work_group,0x1b);
+
+ }
if (!(work->ServerType & SV_TYPE_DOMAIN_MASTER))
+ {
+ if (work->state >= MST_BROWSER)
+ work->state = MST_NONE;
remove_name_entry(d,work->work_group,0x1d);
+ }
}
@@ -270,6 +413,8 @@ void run_elections(void)
work->work_group,inet_ntoa(d->bcast_ip)));
work->RunningElection = False;
+ work->state = MST_NONE;
+
become_master(d, work);
}
}
@@ -340,6 +485,7 @@ void process_election(struct packet_struct *p,char *buf)
{
work->needelection = True;
work->ElectionCount=0;
+ work->state = MST_NONE;
}
}
else
diff --git a/source3/nameresp.c b/source3/nameresp.c
index c79c30d46f..b153575116 100644
--- a/source3/nameresp.c
+++ b/source3/nameresp.c
@@ -52,7 +52,7 @@ static void update_name_trn_id(void)
/***************************************************************************
- add an initated name query into the list
+ add an expected response record into the list
**************************************************************************/
static void add_response_record(struct subnet_record *d,
struct response_record *n)
@@ -78,6 +78,21 @@ static void add_response_record(struct subnet_record *d,
/***************************************************************************
+ remove an expected response record from the list
+ **************************************************************************/
+static void remove_response_record(struct subnet_record *d,
+ struct response_record *n)
+{
+ if (n->prev) n->prev->next = n->next;
+ if (n->next) n->next->prev = n->prev;
+
+ if (d->responselist == n) d->responselist = n->next;
+
+ free(n);
+}
+
+
+/***************************************************************************
deals with an entry before it dies
**************************************************************************/
static void dead_netbios_entry(struct subnet_record *d,
@@ -138,11 +153,12 @@ static void dead_netbios_entry(struct subnet_record *d,
if (ismyip(n->to_ip))
{
- remove_netbios_name(d,n->name.name,n->name.name_type,SELF,n->to_ip);
+ name_unregister_work(d,n->name.name,n->name.name_type);
}
if (!n->bcast)
{
- DEBUG(1,("WINS server did not respond to name release!\n"));
+ DEBUG(0,("WINS server did not respond to name release!\n"));
+ /* XXXX whoops. we have problems. must deal with this */
}
break;
}
@@ -161,10 +177,8 @@ static void dead_netbios_entry(struct subnet_record *d,
/* IMPORTANT: see response_name_reg() */
- enum name_source source = ismyip(n->to_ip) ? SELF : REGISTER;
-
- add_netbios_entry(d,n->name.name,n->name.name_type,
- n->nb_flags, n->ttl, source,n->to_ip, True,!n->bcast);
+ name_register_work(d,n->name.name,n->name.name_type,
+ n->nb_flags, n->ttl, n->to_ip, n->bcast);
}
else
{
@@ -175,6 +189,7 @@ static void dead_netbios_entry(struct subnet_record *d,
broadcasting. */
DEBUG(1,("WINS server did not respond to name registration!\n"));
+ /* XXXX whoops. we have problems. must deal with this */
}
break;
}
@@ -295,19 +310,12 @@ void expire_netbios_response_entries()
}
else
{
- dead_netbios_entry(d,n);
-
nextn = n->next;
-
- if (n->prev) n->prev->next = n->next;
- if (n->next) n->next->prev = n->prev;
-
- if (d->responselist == n) d->responselist = n->next;
-
- free(n);
-
num_response_packets--;
+ dead_netbios_entry (d,n); /* process the non-response */
+ remove_response_record(d,n); /* remove the non-response */
+
continue;
}
}
diff --git a/source3/nameserv.c b/source3/nameserv.c
index 9025b66429..6ff2167271 100644
--- a/source3/nameserv.c
+++ b/source3/nameserv.c
@@ -70,9 +70,28 @@ static struct subnet_record *find_req_subnet(struct in_addr ip, BOOL bcast)
****************************************************************************/
static BOOL name_equal(struct nmb_name *n1,struct nmb_name *n2)
{
- if (n1->name_type != n2->name_type) return(False);
+ return n1->name_type == n2->name_type &&
+ strequal(n1->name ,n2->name ) &&
+ strequal(n1->scope,n2->scope);
+}
+
+
+/****************************************************************************
+ true if the netbios name is ^1^2__MSBROWSE__^2^1
+
+ note: this name is registered if as a master browser or backup browser
+ you are responsible for a workgroup (when you announce a domain by
+ broadcasting on your local subnet, you announce it as coming from this
+ name: see announce_host()).
+
+ WINS is configured to ignore this 'special browser name', presumably
+ because it's redundant: there's no such thing as an announceable
+ domain when dealing with a wide area network and a WINS server.
- return(strequal(n1->name,n2->name) && strequal(n1->scope,n2->scope));
+ **************************************************************************/
+BOOL special_browser_name(char *name, int type)
+{
+ return strequal(name,MSBROWSE) && type == 0x01;
}
@@ -344,7 +363,7 @@ void load_netbios_names(void)
name,type, inet_ntoa(ipaddr), ttd, nb_flags));
/* add all entries that have 60 seconds or more to live */
- if (ttd - 10 < time(NULL) || ttd == 0)
+ if (ttd - 60 < time(NULL) || ttd == 0)
{
time_t t = (ttd?ttd-time(NULL):0) / 3;
@@ -369,7 +388,7 @@ void remove_netbios_name(struct subnet_record *d,
int search = FIND_LOCAL;
/* if it's not a special browser name, search the WINS database */
- if (type != 0x01 && type != 0x1d && type != 0x1e)
+ if (!special_browser_name(name, type))
search |= FIND_WINS;
make_nmb_name(&nn, name, type, scope);
@@ -409,7 +428,7 @@ struct name_record *add_netbios_entry(struct subnet_record *d,
{
if (wins)
{
- if (type == 0x01 || type == 0x1d || type == 0x1e)
+ if (special_browser_name(name, type))
{
/* XXXX WINS server supposed to ignore special browser names. hm.
but is a primary domain controller supposed to ignore special
@@ -518,7 +537,10 @@ void add_my_name_entry(struct subnet_record *d,char *name,int type,int nb_flags)
re_reg = True;
/* always add our own entries */
- add_netbios_entry(d,name,type,nb_flags,0,SELF,ipzero,False,lp_wins_support());
+ /* a time-to-live allows us to refresh this name with the WINS server. */
+ add_netbios_entry(d,name,type,
+ nb_flags,GET_TTL(0),
+ SELF,ipzero,False,lp_wins_support());
/* 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
@@ -558,11 +580,14 @@ void add_my_names(void)
for (d = subnetlist; d; d = d->next)
{
+ /* these names need to be refreshed with the WINS server */
add_my_name_entry(d, myname,0x20,NB_ACTIVE);
add_my_name_entry(d, myname,0x03,NB_ACTIVE);
add_my_name_entry(d, myname,0x00,NB_ACTIVE);
add_my_name_entry(d, myname,0x1f,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_ACTIVE,0,SELF,ip,False,wins);
add_netbios_entry(d,"__SAMBA__",0x20,NB_ACTIVE,0,SELF,ip,False,wins);
add_netbios_entry(d,"__SAMBA__",0x00,NB_ACTIVE,0,SELF,ip,False,wins);
@@ -615,7 +640,8 @@ void refresh_my_names(time_t t)
for (n = d->namelist; n; n = n->next)
{
/* each SELF name has an individual time to be refreshed */
- if (n->source == SELF && n->refresh_time < time(NULL))
+ 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->nb_flags);
}
@@ -832,44 +858,28 @@ void response_name_reg(struct subnet_record *d, struct packet_struct *p)
DEBUG(4,("response name registration received!\n"));
if (nmb->header.rcode == 0 && nmb->answers->rdata)
- {
+ {
/* IMPORTANT: see expire_netbios_response_entries() */
int nb_flags = nmb->answers->rdata[0];
- struct in_addr found_ip;
int ttl = nmb->answers->ttl;
- enum name_source source = REGISTER;
-
+ struct in_addr found_ip;
+
putip((char*)&found_ip,&nmb->answers->rdata[2]);
- if (ismyip(found_ip)) source = SELF;
-
- add_netbios_entry(d, name,type,nb_flags,ttl,source,found_ip,True,!bcast);
- }
+ name_register_work(d,name,type,nb_flags,ttl,found_ip,bcast);
+ }
else
- {
- struct work_record *work;
-
- DEBUG(1,("name registration for %s rejected!\n",
+ {
+ DEBUG(1,("name registration for %s rejected!\n",
namestr(&nmb->question.question_name)));
- /* XXXX oh dear. we have problems. must deal with our name having
- been rejected: e.g if it was our GROUP(1d) name, we must unbecome
- a master browser. */
+ /* XXXX oh dear. we have problems. must deal with our name having
+ been rejected: e.g if it was our GROUP(1d) name, we must unbecome
+ a master browser. */
- remove_netbios_name(d,name,type,SELF,ipzero);
-
- if (!(work = find_workgroupstruct(d, name, False))) return;
-
- if (AM_MASTER(work) && (type == 0x1d || type == 0x1b))
- {
- int remove_type = 0;
- if (type == 0x1d) remove_type = SV_TYPE_MASTER_BROWSER;
- if (type == 0x1b) remove_type = SV_TYPE_DOMAIN_MASTER;
-
- become_nonmaster(d, work, remove_type);
- }
- }
+ name_unregister_work(d,name,type);
+ }
}
@@ -1253,36 +1263,11 @@ void reply_name_query(struct packet_struct *p)
struct name_record *n;
int search = 0;
- if (name_type == 0x20 || name_type == 0x00 || name_type == 0x1b ||
- name_type == 0x1f || name_type == 0x03 || name_type == 0x01 ||
- name_type == 0x1c)
- {
- /* search for any of the non-'special browser' names, or for a PDC type
- (0x1b) name in the WINS database.
- XXXX should we include name type 0x1c: WINS server type?
- */
- search |= FIND_WINS;
- }
- else
+ if (!(d = find_req_subnet(p->ip, bcast)))
{
- /* special browser name types e.g
- ^1^2__MSBROWSE__^2^1, GROUP(1d) and GROUP(1e)
-
- name_type == 0x01 || name_type == 0x1d || name_type == 0x1e.
-
- XXXX luke reckons we should be able to search for any SELF name
- in the WINS database, if we are a primary domain controller.
- */
-
- if (!(d = find_req_subnet(p->ip, bcast)))
- {
- DEBUG(3,("name query: bcast %s not known\n",
+ DEBUG(3,("name query: bcast %s not known\n",
inet_ntoa(p->ip)));
- success = False;
- }
-
- /* XXXX delete if shouldn't search for SELF names in WINS database */
- search |= FIND_WINS;
+ success = False;
}
if (bcast)
@@ -1290,6 +1275,11 @@ void reply_name_query(struct packet_struct *p)
/* a name query has been made by a non-WINS configured host. search the
local interface database as well */
search |= FIND_LOCAL;
+
+ }
+ else if (!special_browser_name(question->name, name_type))
+ {
+ search |= FIND_WINS;
}
DEBUG(3,("Name query "));
@@ -1574,7 +1564,7 @@ static BOOL response_problem_check(struct response_record *n,
case NAME_QUERY_MST_SRV_CHK:
case NAME_QUERY_SRV_CHK:
case NAME_QUERY_MST_CHK:
- /* don't do case NAME_QUERY_FIND_MST: MSBROWSE isn't a unique name. */
+ /* don't do case NAME_QUERY_FIND_MST */
{
if (!strequal(qname,n->name.name))
{
@@ -1662,8 +1652,8 @@ static BOOL response_compatible(struct response_record *n,
default:
{
- DEBUG(0,("unknown state type received in response_netbios_packet\n"));
- break;
+ DEBUG(1,("unknown state type received in response_netbios_packet\n"));
+ return False;
}
}
return True;
@@ -1724,7 +1714,7 @@ static void response_process(struct subnet_record *d, struct packet_struct *p,
default:
{
- DEBUG(0,("unknown state type received in response_netbios_packet\n"));
+ DEBUG(1,("unknown state type received in response_netbios_packet\n"));
break;
}
}
diff --git a/source3/nmbd/nmbd.c b/source3/nmbd/nmbd.c
index 1d541ea95f..187ef8e7b7 100644
--- a/source3/nmbd/nmbd.c
+++ b/source3/nmbd/nmbd.c
@@ -55,8 +55,8 @@ extern struct in_addr ipzero;
/****************************************************************************
-catch a sigterm
-****************************************************************************/
+ catch a sigterm
+ ****************************************************************************/
static int sig_term()
{
BlockSignals(True);
@@ -457,7 +457,7 @@ static void usage(char *pname)
fault_setup(fault_continue);
- signal(SIGHUP,SIGNAL_CAST sig_hup);
+ signal(SIGHUP ,SIGNAL_CAST sig_hup);
signal(SIGTERM,SIGNAL_CAST sig_term);
while ((opt = getopt(argc, argv, "s:T:I:C:bAi:B:N:Rn:l:d:Dp:hSH:G:")) != EOF)
diff --git a/source3/nmbsync.c b/source3/nmbsync.c
index 2a95c60d59..dd1b8bac0d 100644
--- a/source3/nmbsync.c
+++ b/source3/nmbsync.c
@@ -110,17 +110,17 @@ static BOOL add_info(struct subnet_record *d, struct work_record *work, int serv
if (stype & SV_TYPE_DOMAIN_ENUM)
{
/* creates workgroup on remote subnet */
- if ((w = find_workgroupstruct(d,sname, True)))
+ if ((w = find_workgroupstruct(d,sname,True)))
{
if (d->my_interface)
{
announce_request(w, d->bcast_ip);
}
}
- }
+ }
- if (w)
- add_server_entry(d,w,sname,stype,lp_max_ttl(),cmnt,False);
+ if (w)
+ add_server_entry(d,w,sname,stype,lp_max_ttl(),cmnt,False);
}
}
}
diff --git a/source3/smbd/ipc.c b/source3/smbd/ipc.c
index c5c87ea07f..415c939bf3 100644
--- a/source3/smbd/ipc.c
+++ b/source3/smbd/ipc.c
@@ -747,45 +747,32 @@ struct srv_info_struct
/*******************************************************************
filter out unwanted server info
- This function returns True if the entry is wanted.
******************************************************************/
static BOOL filter_server_info(struct srv_info_struct *server,
BOOL domains,
char *domain, uint32 request)
{
- /* If no domain was specified, */
if (*domain == 0)
{
- /* If entry's domain matches this server's domain,
- accept this entry. */
if (strequal(lp_workgroup(), server->domain)) {
return True;
}
-
- /* If specific domain requested, reject this entry. */
else if (domains)
{
DEBUG(4,("primary domain:reject %8x %s %s\n",request,server->name,server->domain));
return False;
}
-
- /* If the request was for a list of domain enumerators,
- we don't care what domain this entry is in as long
- as it is a domain enumerator. */
else if ((request & SV_TYPE_DOMAIN_ENUM) &&
(server->type & SV_TYPE_DOMAIN_ENUM))
{
- return True;
+ DEBUG(4,("rej:DOM %8x: %s %s\n",server->type,server->name,server->domain));
+ return False;
}
- DEBUG(4,("wrong domain: %8x: %s %s\n",server->type,server->name,server->domain));
- return False;
+ return True;
}
-
- /* If a domain name was specified, */
else
{
- /* If this entry is in the requested domain, */
if (strequal(domain, server->domain))
{
/*
@@ -805,15 +792,11 @@ static BOOL filter_server_info(struct srv_info_struct *server,
return True;
}
-
- /* If the user didn't pick a domain,
- (I don't think this can happen.) */
else if (!domains)
{
DEBUG(4,("domain:%s %s %s\n",domain,server->name,server->domain));
return False;
}
-
return True;
}
}
@@ -888,7 +871,6 @@ static int get_server_info(uint32 servertype,
ok = False;
}
- /* If all server, reject DOMIAN_ENUM entries? */
if ((servertype == ~SV_TYPE_DOMAIN_ENUM) &&
(s->type & SV_TYPE_DOMAIN_ENUM))
{
@@ -896,8 +878,6 @@ static int get_server_info(uint32 servertype,
ok = False;
}
- /* If a domain is specified, reject all except the
- domain enumerators for the specified domain. */
if (domains && !(domain && *domain && strequal(domain, s->domain)))
{
if (!(s->type & SV_TYPE_DOMAIN_ENUM))
@@ -1055,13 +1035,11 @@ static BOOL api_RNetServerEnum(int cnum, int uid, char *param, char *data,
if (strcmp(str1, "WrLehDO") == 0)
{
domains = False;
- DEBUG(4, ("all domains\n"));
}
else if (strcmp(str1, "WrLehDz") == 0)
{
domains = True;
StrnCpy(domain, p, sizeof(fstring)-1);
- DEBUG(4, ("domains must match \"%s\"\n", domains));
}
if (lp_browse_list())
@@ -1073,7 +1051,6 @@ static BOOL api_RNetServerEnum(int cnum, int uid, char *param, char *data,
qsort(servers,total,sizeof(servers[0]),QSORT_CAST srv_comp);
- /* A dry run */
{
char *lastname=NULL;
@@ -1108,7 +1085,6 @@ static BOOL api_RNetServerEnum(int cnum, int uid, char *param, char *data,
f_len = fixed_len;
s_len = string_len;
- /* the real thing */
{
char *lastname=NULL;
int count2 = counted;