uint32 ElectionCriterion;
};
-/* a domain structure. it contains a list of workgroups */
-struct domain_record
+/* a subnet structure. it contains a list of workgroups */
+struct subnet_record
{
- struct domain_record *next;
- struct domain_record *prev;
+ struct subnet_record *next;
+ struct subnet_record *prev;
struct work_record *workgrouplist;
struct in_addr bcast_ip;
struct in_addr mask_ip;
struct in_addr myip;
+
+ BOOL my_interface;
};
/* a resource record */
extern int ClientNMB;
/* this is our domain/workgroup/server database */
-extern struct domain_record *domainlist;
+extern struct subnet_record *subnetlist;
/* machine comment for host announcements */
extern pstring ServerComment;
time_t t = time(NULL);
pstring outbuf;
char *p;
- struct domain_record *d1;
+ struct subnet_record *d1;
int tok;
if (!lastrun) lastrun = t;
for (tok = 0; tok <= workgroup_count; tok++)
{
- for (d1 = domainlist; d1; d1 = d1->next)
+ for (d1 = subnetlist; d1; d1 = d1->next)
{
struct work_record *work;
- struct domain_record *d;
+ struct subnet_record *d;
/* search for unique workgroup: only the name matters */
for (work = d1->workgrouplist;
if (!work) continue;
/* found one: announce it across all domains */
- for (d = domainlist; d; d = d->next)
+ for (d = subnetlist; d; d = d->next)
{
int type=0;
char *commentp;
pstring comment;
char *my_name;
- struct domain_record *d;
+ struct subnet_record *d;
StrnCpy(comment, *ServerComment ? ServerComment : "NoComment", 43);
my_name = *myname ? myname : "NoName";
- for (d = domainlist; d; d = d->next)
+ for (d = subnetlist; d; d = d->next)
{
struct work_record *work;
- if (!ismybcast(d->bcast_ip))
+ if (!d->my_interface)
continue;
for (work = d->workgrouplist; work; work = work->next)
work->lastannounce_time = t;
- if (!ismybcast(d->bcast_ip)) {
+ if (!d->my_interface) {
stype &= ~(SV_TYPE_POTENTIAL_BROWSER | SV_TYPE_MASTER_BROWSER |
SV_TYPE_DOMAIN_MASTER | SV_TYPE_BACKUP_BROWSER |
SV_TYPE_DOMAIN_CTRL | SV_TYPE_DOMAIN_MEMBER);
p = p+31;
p = skip_string(p,1);
- if (ismybcast(d->bcast_ip))
+ if (d->my_interface)
{
if (AM_MASTER(work))
{
**************************************************************************/
void announce_master(void)
{
- struct domain_record *d;
+ struct subnet_record *d;
static time_t last=0;
time_t t = time(NULL);
BOOL am_master = False; /* are we a master of some sort? :-) */
last = t;
- for (d = domainlist; d; d = d->next)
+ for (d = subnetlist; d; d = d->next)
{
struct work_record *work;
for (work = d->workgrouplist; work; work = work->next)
if (!am_master) return; /* only proceed if we are a master browser */
- for (d = domainlist; d; d = d->next)
+ for (d = subnetlist; d; d = d->next)
{
struct work_record *work;
for (work = d->workgrouplist; work; work = work->next)
}
else
{
- struct domain_record *d2;
- for (d2 = domainlist; d2; d2 = d2->next)
+ struct subnet_record *d2;
+ for (d2 = subnetlist; d2; d2 = d2->next)
{
queue_netbios_packet(ClientNMB,NMB_QUERY,
MASTER_SERVER_CHECK,
struct browse_cache_record *browserlist = NULL;
/* this is our domain/workgroup/server database */
-struct domain_record *domainlist = NULL;
+struct subnet_record *subnetlist = NULL;
static BOOL updatedlists = True;
int updatecount=0;
/****************************************************************************
add a workgroup into the domain list
**************************************************************************/
-static void add_workgroup(struct work_record *work, struct domain_record *d)
+static void add_workgroup(struct work_record *work, struct subnet_record *d)
{
struct work_record *w2;
static struct work_record *make_workgroup(char *name)
{
struct work_record *work;
- struct domain_record *d;
+ struct subnet_record *d;
int t = -1;
if (!name || !name[0]) return NULL;
/* make sure all token representations of workgroups are unique */
- for (d = domainlist; d && t == -1; d = d->next)
+ for (d = subnetlist; d && t == -1; d = d->next)
{
struct work_record *w;
for (w = d->workgrouplist; w && t == -1; w = w->next)
/*******************************************************************
remove workgroups
******************************************************************/
-struct work_record *remove_workgroup(struct domain_record *d,
+struct work_record *remove_workgroup(struct subnet_record *d,
struct work_record *work)
{
struct work_record *ret_work = NULL;
/****************************************************************************
add a domain into the list
**************************************************************************/
-static void add_domain(struct domain_record *d)
+static void add_subnet(struct subnet_record *d)
{
- struct domain_record *d2;
+ struct subnet_record *d2;
- if (!domainlist)
+ if (!subnetlist)
{
- domainlist = d;
+ subnetlist = d;
d->prev = NULL;
d->next = NULL;
return;
}
- for (d2 = domainlist; d2->next; d2 = d2->next);
+ for (d2 = subnetlist; d2->next; d2 = d2->next);
d2->next = d;
d->next = NULL;
that it get created/added anyway. this allows us to force entries in
lmhosts file to be added.
**************************************************************************/
-struct work_record *find_workgroupstruct(struct domain_record *d,
+struct work_record *find_workgroupstruct(struct subnet_record *d,
fstring name, BOOL add)
{
struct work_record *ret, *work;
{
if (lp_preferred_master() &&
strequal(lp_workgroup(), name) &&
- ismybcast(d->bcast_ip))
+ d->my_interface)
{
DEBUG(3, ("preferred master startup for %s\n", work->work_group));
work->needelection = True;
work->ElectionCriterion |= (1<<3);
}
- if (!ismybcast(d->bcast_ip))
+ if (!d->my_interface)
{
work->needelection = False;
}
}
/****************************************************************************
- find a domain in the domainlist
+ find a domain in the subnetlist
**************************************************************************/
-struct domain_record *find_domain(struct in_addr source_ip)
+struct subnet_record *find_domain(struct in_addr ip)
{
- struct domain_record *d;
+ struct subnet_record *d;
/* search through domain list for broadcast/netmask that matches
the source ip address */
- for (d = domainlist; d; d = d->next)
+ for (d = subnetlist; d; d = d->next)
{
- if (same_net(source_ip, d->bcast_ip, d->mask_ip))
- {
- return(d);
- }
+ if (same_net(ip, d->bcast_ip, d->mask_ip))
+ return(d);
}
return (NULL);
**************************************************************************/
void dump_workgroups(void)
{
- struct domain_record *d;
+ struct subnet_record *d;
- for (d = domainlist; d; d = d->next)
+ for (d = subnetlist; d; d = d->next)
{
if (d->workgrouplist)
{
/****************************************************************************
create a domain entry
****************************************************************************/
-static struct domain_record *make_domain(struct in_addr ip, struct in_addr mask)
+static struct subnet_record *make_subnet(struct in_addr bcast_ip,
+ struct in_addr mask)
{
- struct domain_record *d;
- d = (struct domain_record *)malloc(sizeof(*d));
+ struct subnet_record *d;
+ d = (struct subnet_record *)malloc(sizeof(*d));
if (!d) return(NULL);
bzero((char *)d,sizeof(*d));
- DEBUG(4, ("making domain %s ", inet_ntoa(ip)));
- DEBUG(4, ("%s\n", inet_ntoa(mask)));
+ DEBUG(4,("making subnet %s ", inet_ntoa(bcast_ip)));
+ DEBUG(4,("%s\n", inet_ntoa(mask)));
- d->bcast_ip = ip;
+ d->bcast_ip = bcast_ip;
d->mask_ip = mask;
d->workgrouplist = NULL;
-
- add_domain(d);
+ d->my_interface = ismybcast(d->bcast_ip);
+
+ add_subnet(d);
return d;
}
add a domain entry. creates a workgroup, if necessary, and adds the domain
to the named a workgroup.
****************************************************************************/
-struct domain_record *add_domain_entry(struct in_addr source_ip,
+struct subnet_record *add_subnet_entry(struct in_addr source_ip,
struct in_addr source_mask,
char *name, BOOL add)
{
- struct domain_record *d;
+ struct subnet_record *d;
struct in_addr ip;
ip = ipgrp;
/* add the domain into our domain database */
if ((d = find_domain(source_ip)) ||
- (d = make_domain(source_ip, source_mask)))
+ (d = make_subnet(source_ip, source_mask)))
{
struct work_record *w = find_workgroupstruct(d, name, add);
/****************************************************************************
add a server entry
****************************************************************************/
-struct server_record *add_server_entry(struct domain_record *d,
+struct server_record *add_server_entry(struct subnet_record *d,
struct work_record *work,
char *name,int servertype,
int ttl,char *comment,
bzero((char *)s,sizeof(*s));
}
- if (ismybcast(d->bcast_ip) &&
+ if (d->my_interface &&
strequal(lp_workgroup(),work->work_group))
{
if (servertype)
******************************************************************/
void write_browse_list(void)
{
- struct domain_record *d;
+ struct subnet_record *d;
pstring fname,fnamenew;
FILE *f;
return;
}
- for (d = domainlist; d ; d = d->next)
+ for (d = subnetlist; d ; d = d->next)
{
struct work_record *work;
for (work = d->workgrouplist; work ; work = work->next)
******************************************************************/
void expire_servers(time_t t)
{
- struct domain_record *d;
+ struct subnet_record *d;
- for (d = domainlist ; d ; d = d->next)
+ for (d = subnetlist ; d ; d = d->next)
{
struct work_record *work;
#define BROWSE_MAILSLOT "\\MAILSLOT\\BROWSE"
-extern struct domain_record *domainlist;
+extern struct subnet_record *subnetlist;
/*******************************************************************
{
static time_t lastrun=0;
time_t t = time(NULL);
- struct domain_record *d;
+ struct subnet_record *d;
if (!lastrun) lastrun = t;
if (t < lastrun + CHECK_TIME_MST_BROWSE * 60)
dump_workgroups();
- for (d = domainlist; d; d = d->next)
+ for (d = subnetlist; d; d = d->next)
{
struct work_record *work;
******************************************************************/
void browser_gone(char *work_name, struct in_addr ip)
{
- struct domain_record *d = find_domain(ip);
+ struct subnet_record *d = find_domain(ip);
struct work_record *work = find_workgroupstruct(d, work_name, False);
if (!work || !d) return;
if (strequal(work->work_group, lp_workgroup()) &&
- ismybcast(d->bcast_ip))
+ d->my_interface)
{
DEBUG(2,("Forcing election on %s %s\n",
/****************************************************************************
send an election packet
**************************************************************************/
-void send_election(struct domain_record *d, char *group,uint32 criterion,
+void send_election(struct subnet_record *d, char *group,uint32 criterion,
int timeup,char *name)
{
pstring outbuf;
/*******************************************************************
become the master browser
******************************************************************/
-static void become_master(struct domain_record *d, struct work_record *work)
+static void become_master(struct subnet_record *d, struct work_record *work)
{
uint32 domain_type = SV_TYPE_DOMAIN_ENUM | SV_TYPE_SERVER_UNIX | 0x00400000;
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 (ismybcast(d->bcast_ip))
+ if (d->my_interface)
{
/* ask all servers on our local net to announce to us */
announce_request(work, d->bcast_ip);
/*******************************************************************
unbecome the master browser
******************************************************************/
-void become_nonmaster(struct domain_record *d, struct work_record *work)
+void become_nonmaster(struct subnet_record *d, struct work_record *work)
{
DEBUG(2,("Becoming non-master for %s\n",work->work_group));
time_t t = time(NULL);
static time_t lastime = 0;
- struct domain_record *d;
+ struct subnet_record *d;
/* send election packets once a second */
if (lastime && t-lastime <= 0) return;
lastime = t;
- for (d = domainlist; d; d = d->next)
+ for (d = subnetlist; d; d = d->next)
{
struct work_record *work;
for (work = d->workgrouplist; work; work = work->next)
{
struct dgram_packet *dgram = &p->packet.dgram;
struct in_addr ip = dgram->header.source_ip;
- struct domain_record *d = find_domain(ip);
+ struct subnet_record *d = find_domain(ip);
int version = CVAL(buf,0);
uint32 criterion = IVAL(buf,1);
int timeup = IVAL(buf,5)/1000;
{
if (listening_name(work, &dgram->dest_name) &&
strequal(work->work_group, lp_workgroup()) &&
- ismybcast(d->bcast_ip))
+ d->my_interface)
{
if (win_election(work, version,criterion,timeup,name))
{
***************************************************************************/
BOOL check_elections(void)
{
- struct domain_record *d;
+ struct subnet_record *d;
BOOL run_any_election = False;
- for (d = domainlist; d; d = d->next)
+ for (d = subnetlist; d; d = d->next)
{
struct work_record *work;
for (work = d->workgrouplist; work; work = work->next)
extern struct browse_cache_record *browserlist;
/* this is our domain/workgroup/server database */
-extern struct domain_record *domainlist;
+extern struct subnet_record *subnetlist;
/* machine comment for host announcements */
extern pstring ServerComment;
**************************************************************************/
void tell_become_backup(void)
{
- struct domain_record *d;
- for (d = domainlist; d; d = d->next)
+ struct subnet_record *d;
+ for (d = subnetlist; d; d = d->next)
{
struct work_record *work;
for (work = d->workgrouplist; work; work = work->next)
**************************************************************************/
static BOOL sync_browse_entry(struct browse_cache_record *b)
{
- struct domain_record *d;
+ struct subnet_record *d;
struct work_record *work;
/*
if (!strequal(serv_name, b->name))
if (type >= 0x1b && type <= 0x1e)
{
struct work_record *work;
- struct domain_record *d;
+ struct subnet_record *d;
if (!(d = find_domain(ip))) return;
if (!(work = find_workgroupstruct(d, name, False))) return;
/* request the server to announce if on our subnet */
- if (ismybcast(d->bcast_ip)) announce_request(work, ip);
+ if (d->my_interface) announce_request(work, ip);
/* domain master type or master browser type */
if (type == 0x1b || type == 0x1d)
for (i=0;i<n;i++) {
ip = iface_n_ip(i);
if (!ip) return;
- add_domain_entry(*iface_bcast(*ip),*iface_nmask(*ip),lp_workgroup(),True);
+ add_subnet_entry(*iface_bcast(*ip),*iface_nmask(*ip),lp_workgroup(),True);
}
}
int info_count, int token, int info,
int name_type, struct in_addr ip)
{
- struct domain_record *d;
+ struct subnet_record *d;
char outbuf[1024];
char *p, *countptr, *nameptr;
int count = 0;
nameptr = p;
- for (d = domainlist; d; d = d->next)
+ for (d = subnetlist; d; d = d->next)
{
struct work_record *work;
{
struct dgram_packet *dgram = &p->packet.dgram;
struct in_addr ip = dgram->header.source_ip;
- struct domain_record *d = find_domain(ip);
+ struct subnet_record *d = find_domain(ip);
int update_count = CVAL(buf,0);
int ttl = IVAL(buf,1)/1000;
char *name = buf+5;
{
struct dgram_packet *dgram = &p->packet.dgram;
struct in_addr ip = dgram->header.source_ip;
- struct domain_record *d = find_domain(ip);
- struct domain_record *mydomain = find_domain(*iface_bcast(ip));
+ struct subnet_record *d = find_domain(ip);
+ struct subnet_record *mydomain = find_domain(*iface_bcast(ip));
char *name = buf;
struct work_record *work;
name[15] = 0;
for (buf1 = buf+5; *buf1 && count; buf1 = skip_string(buf1, 1), --count)
{
struct in_addr back_ip;
- struct domain_record *d;
+ struct subnet_record *d;
DEBUG(4,("Searching for backup browser %s at %s...\n",
buf1, inet_ntoa(ip)));
if ((d = find_domain(back_ip)))
{
- struct domain_record *d1;
- for (d1 = domainlist; d1; d1 = d1->next)
+ struct subnet_record *d1;
+ for (d1 = subnetlist; d1; d1 = d1->next)
{
struct work_record *work;
for (work = d1->workgrouplist; work; work = work->next)
{
struct dgram_packet *dgram = &p->packet.dgram;
struct in_addr ip = dgram->header.source_ip;
- struct domain_record *d;
+ struct subnet_record *d;
struct work_record *work;
int count = CVAL(buf,0);
return;
}
- for (d = domainlist; d; d = d->next)
+ for (d = subnetlist; d; d = d->next)
{
for (work = d->workgrouplist; work; work = work->next)
{
/* stop being a master but still deal with being a backup browser */
if (state & 0x1)
{
- struct domain_record *d;
- for (d = domainlist; d; d = d->next)
+ struct subnet_record *d;
+ for (d = subnetlist; d; d = d->next)
{
struct work_record *work;
for (work = d->workgrouplist; work; work = work->next)
/* totally delete all servers and start afresh */
if (state & 0x2)
{
- struct domain_record *d;
- for (d = domainlist; d; d = d->next)
+ struct subnet_record *d;
+ for (d = subnetlist; d; d = d->next)
{
struct work_record *work;
for (work=d->workgrouplist;work;work=remove_workgroup(d,work));
struct dgram_packet *dgram = &p->packet.dgram;
struct work_record *work;
struct in_addr ip = dgram->header.source_ip;
- struct domain_record *d = find_domain(ip);
+ struct subnet_record *d = find_domain(ip);
int token = CVAL(buf,0);
char *name = buf+1;
if (!d) return;
- if (!ismybcast(d->bcast_ip)) return;
+ if (!d->my_interface) return;
for (work = d->workgrouplist; work; work = work->next)
{
{
struct dgram_packet *dgram = &p->packet.dgram;
struct in_addr ip = dgram->header.source_ip;
- struct domain_record *d = find_domain(ip);
+ struct subnet_record *d = find_domain(ip);
char *logname,*q;
char *reply_name;
BOOL add_slashes = False;
ipmask = *iface_nmask(ipaddr);
if (group) {
- add_domain_entry(ipaddr, ipmask, name, True);
+ add_subnet_entry(ipaddr, ipmask, name, True);
} else {
add_netbios_entry(name,0x20,NB_ACTIVE,0,source,ipaddr,True);
}
/****************************************************************************
adds information retrieved from a NetServerEnum call
****************************************************************************/
-static BOOL add_info(struct domain_record *d, struct work_record *work, int servertype)
+static BOOL add_info(struct subnet_record *d, struct work_record *work, int servertype)
{
char *rparam = NULL;
char *rdata = NULL;
/* creates workgroup on remote subnet */
if ((w = find_workgroupstruct(d,sname, True)))
{
- if (ismybcast(d->bcast_ip))
+ if (d->my_interface)
{
announce_request(w, d->bcast_ip);
}
void sync_browse_lists(struct work_record *work, char *name, int nm_type,
struct in_addr ip)
{
- struct domain_record *d;
+ struct subnet_record *d;
pid = getpid();
uid = getuid();
gid = getgid();