diff options
author | Samba Release Account <samba-bugs@samba.org> | 1997-04-09 01:19:25 +0000 |
---|---|---|
committer | Samba Release Account <samba-bugs@samba.org> | 1997-04-09 01:19:25 +0000 |
commit | 20b5dea237916902437ce3dcdb7c253fd1ad3585 (patch) | |
tree | e68a033a708efed2c93c95a73da978ebf9221c34 /source3/namebrowse.c | |
parent | 02e610b927c9038cf498f726d807ee95a14714be (diff) | |
download | samba-20b5dea237916902437ce3dcdb7c253fd1ad3585.tar.gz samba-20b5dea237916902437ce3dcdb7c253fd1ad3585.tar.bz2 samba-20b5dea237916902437ce3dcdb7c253fd1ad3585.zip |
Large changes from jra@cygnus.com. Mainly browser updates.
access.c: Fixed crash if yp domain unavailable.
includes.h: Moved ifdefs for minor platform.
interface.c: Changed name of ipgrp to wins_ip to make it clearer.
loadparm.c: Changed default of wins support to 'no'.
nameannounce.c: Many changes to fix cross subnet browsing.
namebrowse.c: Many changes to fix cross subnet browsing.
namedbname.c: Many changes to fix cross subnet browsing.
namedbresp.c: Many changes to fix cross subnet browsing.
namedbsubnet.c: Many changes to fix cross subnet browsing.
namedbwork.c: Many changes to fix cross subnet browsing.
nameelect.c: Many changes to fix cross subnet browsing.
namelogon.c: Many changes to fix cross subnet browsing.
namepacket.c: Many changes to fix cross subnet browsing.
nameresp.c: Many changes to fix cross subnet browsing.
nameserv.c: Many changes to fix cross subnet browsing.
nameserv.h: Many changes to fix cross subnet browsing.
nameservreply.c: Many changes to fix cross subnet browsing.
nameservresp.c: Many changes to fix cross subnet browsing.
namework.c: Many changes to fix cross subnet browsing.
nmbd.c: Change to search wins subnet.
nmbsync.c: Change to check if we are any master before proceeding.
proto.h: Added find_subnet_all() and check_work_servertype().
util.c: Moved 'done' settings on name resolution.
(This used to be commit a82476eee2c521e5eed092bc367da0a7cef23de1)
Diffstat (limited to 'source3/namebrowse.c')
-rw-r--r-- | source3/namebrowse.c | 66 |
1 files changed, 52 insertions, 14 deletions
diff --git a/source3/namebrowse.c b/source3/namebrowse.c index 3bc4f9f82a..b87ea9fec3 100644 --- a/source3/namebrowse.c +++ b/source3/namebrowse.c @@ -32,6 +32,8 @@ extern int ClientNMB; extern int DEBUGLEVEL; +extern struct in_addr wins_ip; + /* this is our browse master/backup cache database */ static struct browse_cache_record *browserlist = NULL; @@ -89,7 +91,6 @@ void expire_browse_cache(time_t t) } } - /**************************************************************************** add a browser entry ****************************************************************************/ @@ -166,21 +167,48 @@ static void start_sync_browse_entry(struct browse_cache_record *b) struct subnet_record *d; struct work_record *work; - if (!(d = find_subnet(b->ip))) return; + /* Look for the workgroup first on the local subnet. If this + fails try WINS - we may need to sync with the domain master, + or we may be the domain master and need to sync with subnet + masters. + */ + + if (!(d = find_subnet_all(b->ip))) { + DEBUG(0, ("start_sync_browse_entry: failed to get a \ +subnet for a browse cache entry workgroup %s, server %s\n", + b->group, b->name)); + return; + } - if (!(work = find_workgroupstruct(d, b->group, False))) return; + if (!(work = find_workgroupstruct(d, b->group, False))) { + DEBUG(0, ("start_sync_browse_entry: failed to get a \ +workgroup for a browse cache entry workgroup %s, server %s\n", + b->group, b->name)); + return; + } - /* only sync if we are the master */ - if (AM_MASTER(work)) { + /* only sync if we are a subnet master or domain master - but + we sync if we are a master for this workgroup on *any* + of our interfaces. */ + if (AM_MASTER(work) || AM_DOMMST(work) || AM_ANY_MASTER(work)) { - /* first check whether the group we intend to sync with exists. if it - doesn't, the server must have died. o dear. */ + DEBUG(4, ("start_sync_browse_entry: Initiating %s sync with %s<0x20>, \ +workgroup %s\n", + b->local ? "local" : "remote", b->name, b->group)); - /* see response_netbios_packet() or expire_netbios_response_entries() */ - queue_netbios_packet(d,ClientNMB,NMB_QUERY, - b->local?NAME_QUERY_SYNC_LOCAL:NAME_QUERY_SYNC_REMOTE, - b->group,0x20,0,0,0,NULL,NULL, - False,False,b->ip,b->ip); + /* first check whether the server we intend to sync with exists. if it + doesn't, the server must have died. o dear. */ + + /* see response_netbios_packet() or expire_netbios_response_entries() */ + /* We cheat here by using the my_comment field of the response_record + struct as the workgroup name we are going to do the sync for. + This is because the reply packet doesn't include the workgroup, but + we need it when the reply comes back. + */ + queue_netbios_packet(d,ClientNMB,NMB_QUERY, + b->local?NAME_QUERY_SYNC_LOCAL:NAME_QUERY_SYNC_REMOTE, + b->name,0x20,0,0,0,NULL,b->group, + False,False,b->ip,b->ip); } b->synced = True; @@ -195,10 +223,14 @@ void do_browser_lists(time_t t) struct browse_cache_record *b; static time_t last = 0; - if (t-last < 20) return; /* don't do too many of these at once! */ + if (t-last < 20) + { + DEBUG(9,("do_browser_lists: returning due to t(%d) - last(%d) < 20\n", + t, last)); + return; /* don't do too many of these at once! */ /* XXXX equally this period should not be too long the server may die in the intervening gap */ - + } last = t; /* pick any entry in the list, preferably one whose time is up */ @@ -210,9 +242,15 @@ void do_browser_lists(time_t t) if (b && !b->synced) { /* sync with the selected entry then remove some dead entries */ + DEBUG(4,("do_browser_lists: Initiating sync with %s, workgroup %s\n", + b->name, b->group)); start_sync_browse_entry(b); expire_browse_cache(t - 60); } + else + { + DEBUG(9, ("do_browser_lists: no entries to sync.\n")); + } } |