diff options
Diffstat (limited to 'source3/nmbd/nmbd_browserdb.c')
-rw-r--r-- | source3/nmbd/nmbd_browserdb.c | 184 |
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); + } + } +} + |