diff options
Diffstat (limited to '')
-rw-r--r-- | source3/nmbd/nmbd_browserdb.c | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/source3/nmbd/nmbd_browserdb.c b/source3/nmbd/nmbd_browserdb.c new file mode 100644 index 0000000..b5fdbab --- /dev/null +++ b/source3/nmbd/nmbd_browserdb.c @@ -0,0 +1,180 @@ +/* + Unix SMB/CIFS implementation. + NBT netbios routines and daemon - version 2 + Copyright (C) Andrew Tridgell 1994-1998 + Copyright (C) Luke Kenneth Casson Leighton 1994-1998 + Copyright (C) Jeremy Allison 1994-1998 + Copyright (C) Christopher R. Hertel 1998 + + 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 3 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, see <http://www.gnu.org/licenses/>. + +*/ +/* -------------------------------------------------------------------------- ** + * Modified July 1998 by CRH. + * I converted this module to use the canned doubly-linked lists. I also + * added comments above the functions where possible. + */ + +#include "includes.h" +#include "nmbd/nmbd.h" +#include "lib/util/string_wrappers.h" + +/* -------------------------------------------------------------------------- ** + * Variables... + * + * lmb_browserlist - This is our local master browser list. + */ + +struct browse_cache_record *lmb_browserlist; + +/* -------------------------------------------------------------------------- ** + * Functions... + */ + +/* ************************************************************************** ** + * Remove and free a browser list entry. + * + * Input: browc - A pointer to the entry to be removed from the list and + * freed. + * Output: none. + * + * ************************************************************************** ** + */ +static void remove_lmb_browser_entry( struct browse_cache_record *browc ) +{ + DLIST_REMOVE(lmb_browserlist, browc); + SAFE_FREE(browc); +} + +/* ************************************************************************** ** + * Update a browser death time. + * + * Input: browc - Pointer to the entry to be updated. + * Output: none. + * + * ************************************************************************** ** + */ +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 and add it to the local master browser list. + * + * Input: work_name + * browser_name + * ip + * + * Output: Pointer to the new entry, or NULL if malloc() failed. + * + * ************************************************************************** ** + */ +struct browse_cache_record *create_browser_in_lmb_cache( const char *work_name, + const char *browser_name, + struct in_addr ip ) +{ + struct browse_cache_record *browc; + time_t now = time( NULL ); + + browc = SMB_MALLOC_P(struct browse_cache_record); + + if( NULL == browc ) { + DEBUG( 0, ("create_browser_in_lmb_cache: malloc fail !\n") ); + return( NULL ); + } + + memset( (char *)browc, '\0', 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 ); + + unstrcpy( browc->lmb_name, browser_name); + unstrcpy( browc->work_group, work_name); + if (!strupper_m( browc->lmb_name )) { + SAFE_FREE(browc); + return NULL; + } + if (!strupper_m( browc->work_group )) { + SAFE_FREE(browc); + return NULL; + } + + browc->ip = ip; + + DLIST_ADD_END(lmb_browserlist, browc); + + DEBUG(3, ("nmbd_browserdb:create_browser_in_lmb_cache()\n")); + DEBUGADD(3, (" Added lmb cache entry for workgroup %s name %s IP %s " + "ttl %d\n", browc->work_group, browc->lmb_name, + inet_ntoa(ip), (int)browc->death_time)); + + return( browc ); +} + +/* ************************************************************************** ** + * Find a browser entry in the local master browser list. + * + * Input: browser_name - The name for which to search. + * + * Output: A pointer to the matching entry, or NULL if no match was found. + * + * ************************************************************************** ** + */ +struct browse_cache_record *find_browser_in_lmb_cache( const char *browser_name ) +{ + struct browse_cache_record *browc; + + 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. + * + * Input: t - Expiration time. Entries with death times less than this + * value will be removed from the list. + * Output: none. + * + * ************************************************************************** ** + */ +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, ("nmbd_browserdb:expire_lmb_browsers()\n")); + DEBUGADD(3, (" Removing timed out lmb entry %s\n", + browc->lmb_name)); + remove_lmb_browser_entry( browc ); + } + } +} |