diff options
author | Andrew Tridgell <tridge@samba.org> | 1996-06-10 06:08:50 +0000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 1996-06-10 06:08:50 +0000 |
commit | 292b2f1d13c64aaa40dbf543139bb125af1aabf7 (patch) | |
tree | 9b8e12ff7c3808fc2e984649e86b386725a6fb46 /source3 | |
parent | 53409e5e34fce56bc18880ba59b3caf60dcbc3be (diff) | |
download | samba-292b2f1d13c64aaa40dbf543139bb125af1aabf7.tar.gz samba-292b2f1d13c64aaa40dbf543139bb125af1aabf7.tar.bz2 samba-292b2f1d13c64aaa40dbf543139bb125af1aabf7.zip |
minor patch to allow host announcements to remote subnets
(This used to be commit e264a670e917102cfdbfce9ae76fbc4d548ddae4)
Diffstat (limited to 'source3')
-rw-r--r-- | source3/nameannounce.c | 106 | ||||
-rw-r--r-- | source3/namedb.c | 6 | ||||
-rw-r--r-- | source3/nameelect.c | 4 |
3 files changed, 57 insertions, 59 deletions
diff --git a/source3/nameannounce.c b/source3/nameannounce.c index bb09a5d433..9b0ef7067f 100644 --- a/source3/nameannounce.c +++ b/source3/nameannounce.c @@ -201,9 +201,6 @@ void announce_host(void) { struct work_record *work; - if (!d->my_interface) - continue; - for (work = d->workgrouplist; work; work = work->next) { uint32 stype = work->ServerType; @@ -228,6 +225,9 @@ void announce_host(void) work->lastannounce_time = t; + /* when announcing to remote networks we make sure we don't + claim to be any sort of special server, otherwise we may + stuff up their browsing */ if (!d->my_interface) { stype &= ~(SV_TYPE_POTENTIAL_BROWSER | SV_TYPE_MASTER_BROWSER | SV_TYPE_DOMAIN_MASTER | SV_TYPE_BACKUP_BROWSER | @@ -263,62 +263,58 @@ void announce_host(void) p = p+31; p = skip_string(p,1); - if (d->my_interface) + if (d->my_interface && AM_MASTER(work)) { - if (AM_MASTER(work)) - { - SIVAL(stypep,0,work->ServerType); - - DEBUG(2,("sending local master announce to %s for %s\n", - inet_ntoa(d->bcast_ip),work->work_group)); - - CVAL(outbuf,0) = ANN_LocalMasterAnnouncement; - - send_mailslot_reply(BROWSE_MAILSLOT,ClientDGRAM,outbuf, - PTR_DIFF(p,outbuf), - my_name,work->work_group,0, - 0x1e,d->bcast_ip, - *iface_ip(d->bcast_ip)); - - DEBUG(2,("sending domain announce to %s for %s\n", - inet_ntoa(d->bcast_ip),work->work_group)); - - CVAL(outbuf,0) = ANN_DomainAnnouncement; - - StrnCpy(namep,work->work_group,15); - strupper(namep); - StrnCpy(commentp,myname,15); - strupper(commentp); - - SIVAL(stypep,0,(unsigned)0x80000000); - p = commentp + strlen(commentp) + 1; - - send_mailslot_reply(BROWSE_MAILSLOT,ClientDGRAM,outbuf, - PTR_DIFF(p,outbuf), - my_name,MSBROWSE,0,0x01,d->bcast_ip, - *iface_ip(d->bcast_ip)); - } - else - { - DEBUG(2,("sending host announce to %s for %s\n", - inet_ntoa(d->bcast_ip),work->work_group)); - - CVAL(outbuf,0) = ANN_HostAnnouncement; - - send_mailslot_reply(BROWSE_MAILSLOT,ClientDGRAM,outbuf, - PTR_DIFF(p,outbuf), - my_name,work->work_group,0,0x1d, - d->bcast_ip,*iface_ip(d->bcast_ip)); - } + SIVAL(stypep,0,work->ServerType); + + DEBUG(2,("sending local master announce to %s for %s\n", + inet_ntoa(d->bcast_ip),work->work_group)); + + CVAL(outbuf,0) = ANN_LocalMasterAnnouncement; + + send_mailslot_reply(BROWSE_MAILSLOT,ClientDGRAM,outbuf, + PTR_DIFF(p,outbuf), + my_name,work->work_group,0, + 0x1e,d->bcast_ip, + *iface_ip(d->bcast_ip)); + + DEBUG(2,("sending domain announce to %s for %s\n", + inet_ntoa(d->bcast_ip),work->work_group)); + + CVAL(outbuf,0) = ANN_DomainAnnouncement; + + StrnCpy(namep,work->work_group,15); + strupper(namep); + StrnCpy(commentp,myname,15); + strupper(commentp); + + SIVAL(stypep,0,(unsigned)0x80000000); + p = commentp + strlen(commentp) + 1; + + send_mailslot_reply(BROWSE_MAILSLOT,ClientDGRAM,outbuf, + PTR_DIFF(p,outbuf), + my_name,MSBROWSE,0,0x01,d->bcast_ip, + *iface_ip(d->bcast_ip)); + } + else + { + DEBUG(2,("sending host announce to %s for %s\n", + inet_ntoa(d->bcast_ip),work->work_group)); + + CVAL(outbuf,0) = ANN_HostAnnouncement; + + send_mailslot_reply(BROWSE_MAILSLOT,ClientDGRAM,outbuf, + PTR_DIFF(p,outbuf), + my_name,work->work_group,0,0x1d, + d->bcast_ip,*iface_ip(d->bcast_ip)); } } - if (work->needannounce) - { - work->needannounce = False; - break; - /* sorry: can't do too many announces. do some more later */ - } + if (work->needannounce) { + work->needannounce = False; + break; + /* sorry: can't do too many announces. do some more later */ + } } } } diff --git a/source3/namedb.c b/source3/namedb.c index 11eea6976d..ea5b13a800 100644 --- a/source3/namedb.c +++ b/source3/namedb.c @@ -339,6 +339,8 @@ struct work_record *find_workgroupstruct(struct subnet_record *d, if ((work = make_workgroup(name))) { + work->needelection = False; + if (lp_preferred_master() && strequal(lp_workgroup(), name) && d->my_interface) @@ -347,10 +349,6 @@ struct work_record *find_workgroupstruct(struct subnet_record *d, work->needelection = True; work->ElectionCriterion |= (1<<3); } - if (!d->my_interface) - { - work->needelection = False; - } add_workgroup(work, d); return(work); } diff --git a/source3/nameelect.c b/source3/nameelect.c index 4479f660c9..1832240a11 100644 --- a/source3/nameelect.c +++ b/source3/nameelect.c @@ -355,6 +355,10 @@ BOOL check_elections(void) for (d = subnetlist; d; d = d->next) { struct work_record *work; + + /* we only want to run elections on our own interfaces */ + if (!d->my_interface) continue; + for (work = d->workgrouplist; work; work = work->next) { run_any_election |= work->RunningElection; |