summaryrefslogtreecommitdiff
path: root/source3/nmbd/nmbd_browserdb.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>1997-12-13 14:16:07 +0000
committerJeremy Allison <jra@samba.org>1997-12-13 14:16:07 +0000
commit64f0348a3f994334abe64a4d4896109c3c8c9039 (patch)
tree50867cc9ccbc060ceb46ea1e8f8bd8ec2a8ca05e /source3/nmbd/nmbd_browserdb.c
parent164c9db4de87ea851a631f1c9d431e0a4525802e (diff)
downloadsamba-64f0348a3f994334abe64a4d4896109c3c8c9039.tar.gz
samba-64f0348a3f994334abe64a4d4896109c3c8c9039.tar.bz2
samba-64f0348a3f994334abe64a4d4896109c3c8c9039.zip
This is it ! The mega-merge of the JRA_NMBD_REWRITE branch
back into the main tree. For the cvs logs of all the files starting nmbd_*.c, look in the JRA_NMBD_REWRITE branch. That branch has now been discontinued. Jeremy. (This used to be commit d80b0cb645f81d16734929a0b27a91c6650499bb)
Diffstat (limited to 'source3/nmbd/nmbd_browserdb.c')
-rw-r--r--source3/nmbd/nmbd_browserdb.c184
1 files changed, 184 insertions, 0 deletions
diff --git a/source3/nmbd/nmbd_browserdb.c b/source3/nmbd/nmbd_browserdb.c
new file mode 100644
index 0000000000..b2db744370
--- /dev/null
+++ b/source3/nmbd/nmbd_browserdb.c
@@ -0,0 +1,184 @@
+/*
+ Unix SMB/Netbios implementation.
+ Version 1.9.
+ NBT netbios routines and daemon - version 2
+ Copyright (C) Andrew Tridgell 1994-1997
+ Copyright (C) Luke Kenneth Casson Leighton 1994-1997
+ Copyright (C) Jeremy Allison 1994-1997
+
+ 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
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include "includes.h"
+#include "smb.h"
+
+extern int DEBUGLEVEL;
+
+/* This is our local master browser list database. */
+struct browse_cache_record *lmb_browserlist = NULL;
+
+/***************************************************************************
+Add a browser into the lmb list.
+**************************************************************************/
+
+static void add_to_lmb_browse_cache(struct browse_cache_record *browc)
+{
+ struct browse_cache_record *browc2;
+
+ if (lmb_browserlist == NULL)
+ {
+ lmb_browserlist = browc;
+ browc->prev = NULL;
+ browc->next = NULL;
+ return;
+ }
+
+ for (browc2 = lmb_browserlist; browc2->next; browc2 = browc2->next)
+ ;
+
+ browc2->next = browc;
+ browc->next = NULL;
+ browc->prev = browc2;
+}
+
+/*******************************************************************
+Remove a lmb browser entry.
+******************************************************************/
+
+void remove_lmb_browser_entry(struct browse_cache_record *browc)
+{
+ if (browc->prev)
+ browc->prev->next = browc->next;
+ if (browc->next)
+ browc->next->prev = browc->prev;
+
+ if (lmb_browserlist == browc)
+ lmb_browserlist = browc->next;
+
+ free((char *)browc);
+}
+
+/****************************************************************************
+Update a browser death time.
+****************************************************************************/
+
+void update_browser_death_time(struct browse_cache_record *browc)
+{
+ /* Allow the new lmb to miss an announce period before we remove it. */
+ browc->death_time = time(NULL) + (CHECK_TIME_MST_ANNOUNCE + 2)*60;
+}
+
+/****************************************************************************
+Create a browser entry.
+****************************************************************************/
+
+struct browse_cache_record *create_browser_in_lmb_cache(char *work_name, char *browser_name,
+ struct in_addr ip)
+{
+ struct browse_cache_record *browc;
+ time_t now = time(NULL);
+
+ browc = (struct browse_cache_record *)malloc(sizeof(*browc));
+
+ if (browc == NULL)
+ {
+ DEBUG(0,("create_browser_in_lmb_cache: malloc fail !\n"));
+ return(NULL);
+ }
+
+ bzero((char *)browc,sizeof(*browc));
+
+ /* For a new lmb entry we want to sync with it after one minute. This
+ will allow it time to send out a local announce and build its
+ browse list. */
+
+ browc->sync_time = now + 60;
+
+ /* Allow the new lmb to miss an announce period before we remove it. */
+ browc->death_time = now + (CHECK_TIME_MST_ANNOUNCE + 2)*60;
+
+ StrnCpy(browc->lmb_name, browser_name,sizeof(browc->lmb_name)-1);
+ StrnCpy(browc->work_group,work_name,sizeof(browc->work_group)-1);
+ strupper(browc->lmb_name);
+ strupper(browc->work_group);
+
+ browc->ip = ip;
+
+ add_to_lmb_browse_cache(browc);
+
+ DEBUG(3,("create_browser_in_lmb_cache: Added lmb cache entry for workgroup %s name %s IP %s ttl %d\n",
+ browc->work_group, browc->lmb_name, inet_ntoa(ip), browc->death_time));
+
+ return(browc);
+}
+
+/****************************************************************************
+Find a browser entry.
+****************************************************************************/
+
+struct browse_cache_record *find_browser_in_lmb_cache( char *browser_name )
+{
+ struct browse_cache_record *browc = NULL;
+
+ for( browc = lmb_browserlist; browc; browc = browc->next)
+ if(strequal( browser_name, browc->lmb_name))
+ break;
+
+ return browc;
+}
+
+/*******************************************************************
+ Expire timed out browsers in the browserlist.
+******************************************************************/
+
+void expire_lmb_browsers(time_t t)
+{
+ struct browse_cache_record *browc;
+ struct browse_cache_record *nextbrowc;
+
+ for (browc = lmb_browserlist; browc; browc = nextbrowc)
+ {
+ nextbrowc = browc->next;
+
+ if (browc->death_time < t)
+ {
+ DEBUG(3,("expire_lmb_browsers: Removing timed out lmb entry %s\n",browc->lmb_name));
+ remove_lmb_browser_entry(browc);
+ }
+ }
+}
+
+/*******************************************************************
+ Remove browsers from a named workgroup in the browserlist.
+******************************************************************/
+
+void remove_workgroup_lmb_browsers(char *work_group)
+{
+ struct browse_cache_record *browc;
+ struct browse_cache_record *nextbrowc;
+
+ for (browc = lmb_browserlist; browc; browc = nextbrowc)
+ {
+ nextbrowc = browc->next;
+
+ if (strequal(work_group, browc->work_group))
+ {
+ DEBUG(3,("remove_workgroup_browsers: Removing lmb entry %s\n",browc->lmb_name));
+ remove_lmb_browser_entry(browc);
+ }
+ }
+}
+