mirror of
https://github.com/samba-team/samba.git
synced 2025-02-14 01:57:53 +03:00
Small changes to get ready for adding WINS failover to smbd and clients.
My plan is to change the lp_wins_server() function to lp_wins_server_list(). My reason being: With WINS failover the 'wins server' parameter may take a list of WINS server names/IPs instead of just one. If it's a list, then calling lp_wins_server() won't give you what you expect (that is, a single WINS server name or IP). Instead, the functions in wins_srv.c should be used. You can get either the name or IP of the 'current' working WINS server in the list. Chris -)-----
This commit is contained in:
parent
3b1454691b
commit
efaa9ef5e7
@ -89,7 +89,7 @@
|
||||
typedef struct
|
||||
{
|
||||
ubi_slNode node; /* Linked list node structure. */
|
||||
time_t mourning; /* If > current time then server is dead, Jim. */
|
||||
time_t mourning; /* If > current time then server is dead, Jim. */
|
||||
char *server; /* DNS name or IP of NBNS server to query. */
|
||||
struct in_addr ip_addr; /* Cache translated IP. */
|
||||
} list_entry;
|
||||
@ -120,6 +120,7 @@ BOOL wins_srv_load_list( char *src )
|
||||
* to the ip_addr field of the entry. Don't bother to to a host
|
||||
* name lookup on all names now. They're done as needed in
|
||||
* wins_srv_ip().
|
||||
* ------------------------------------------------------------------------ **
|
||||
*/
|
||||
{
|
||||
list_entry *entry;
|
||||
@ -148,14 +149,24 @@ BOOL wins_srv_load_list( char *src )
|
||||
else
|
||||
{
|
||||
entry->mourning = 0;
|
||||
/* Create a copy of the server name and store it in the list. */
|
||||
if( NULL == (entry->server = strdup( wins_id_bufr )) )
|
||||
{
|
||||
free( entry );
|
||||
DEBUG( 0, ("wins_srv_load_list(): strdup(\"%s\") failed.\n", wins_id_bufr) );
|
||||
DEBUG( 0,
|
||||
("wins_srv_load_list(): strdup(\"%s\") failed.\n", wins_id_bufr) );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Add server to list. */
|
||||
/* Add server to list.
|
||||
* If the server name was actually an IP address we will store that
|
||||
* too. It it was a DNS name, we will wait until we need to use
|
||||
* the WINS server before doing the DNS lookup. Since this may be
|
||||
* a list, and since we will reload the list whenever smb.conf is
|
||||
* reloaded, there's no point in trying to look up names until we
|
||||
* need them. ...of course, once we do the lookup we will cache
|
||||
* the result. See wins_srv_ip().
|
||||
*/
|
||||
if( is_ipaddress( wins_id_bufr ) )
|
||||
entry->ip_addr = *interpret_addr2( wins_id_bufr );
|
||||
else
|
||||
@ -167,7 +178,8 @@ BOOL wins_srv_load_list( char *src )
|
||||
}
|
||||
|
||||
count = ubi_slCount( wins_srv_list );
|
||||
DEBUGADD( 4, ( "%d WINS server%s listed.\n", (int)count, (1==count)?"":"s" ) );
|
||||
DEBUGADD( 4,
|
||||
( "%d WINS server%s listed.\n", (int)count, (1==count)?"":"s" ) );
|
||||
|
||||
return( (count > 0) ? True : False );
|
||||
} /* wins_srv_load_list */
|
||||
@ -175,6 +187,19 @@ BOOL wins_srv_load_list( char *src )
|
||||
|
||||
struct in_addr wins_srv_ip( void )
|
||||
/* ------------------------------------------------------------------------ **
|
||||
* Return the IP address of an NBNS (WINS) server thought to be active.
|
||||
*
|
||||
* Input: none.
|
||||
*
|
||||
* Output: An IP address in struct in_addr form.
|
||||
*
|
||||
* Notes: This function will return the IP address of the first available
|
||||
* NBNS (WINS) server. The order of the list is determined in
|
||||
* smb.conf. If all of the WINS servers have been marked 'dead'
|
||||
* then the zero IP (0.0.0.0) is returned. The zero IP is not a
|
||||
* valid Unicast address on any system.
|
||||
*
|
||||
* ------------------------------------------------------------------------ **
|
||||
*/
|
||||
{
|
||||
time_t now = time(NULL);
|
||||
@ -202,16 +227,61 @@ struct in_addr wins_srv_ip( void )
|
||||
} /* wins_srv_ip */
|
||||
|
||||
|
||||
char *wins_srv_name( void )
|
||||
/* ------------------------------------------------------------------------ **
|
||||
* Return the name of first live WINS server in the list.
|
||||
*
|
||||
* Input: none.
|
||||
*
|
||||
* Output: A pointer to a string containing either the DNS name or IP
|
||||
* address of the WINS server as given in the WINS SERVER
|
||||
* parameter in smb.conf, or NULL if no (live) WINS servers are
|
||||
* in the list.
|
||||
*
|
||||
* Notes: This function will return the name of the first available
|
||||
* NBNS (WINS) server. The order of the list is determined in
|
||||
* smb.conf. If all of the WINS servers have been marked 'dead'
|
||||
* then NULL is returned.
|
||||
*
|
||||
* - This function does not verify that the name can be mapped to
|
||||
* an IP address, or that the WINS server is running.
|
||||
*
|
||||
* ------------------------------------------------------------------------ **
|
||||
*/
|
||||
{
|
||||
time_t now = time(NULL);
|
||||
list_entry *entry = (list_entry *)ubi_slFirst( wins_srv_list );
|
||||
|
||||
while( NULL != entry )
|
||||
{
|
||||
if( now >= entry->mourning )
|
||||
return( entry->server ); /* Found a live one. */
|
||||
entry = (list_entry *)ubi_slNext( entry );
|
||||
}
|
||||
|
||||
/* If there are no live entries, return NULL. */
|
||||
return( NULL );
|
||||
} /* wins_srv_name */
|
||||
|
||||
|
||||
void wins_srv_died( struct in_addr boothill_ip )
|
||||
/* ------------------------------------------------------------------------ **
|
||||
* Called to indicate that a specific WINS server has died.
|
||||
*
|
||||
* Input: boothill_ip - IP address of an NBNS (WINS) server that has
|
||||
* failed.
|
||||
*
|
||||
* Notes: This function marks the record 'dead' for NECROMANCYCLE
|
||||
* seconds.
|
||||
*
|
||||
* ------------------------------------------------------------------------ **
|
||||
*/
|
||||
{
|
||||
list_entry *entry;
|
||||
|
||||
if( zero_ip( boothill_ip ) )
|
||||
{
|
||||
DEBUG( 4, ("wins_srv_died(): Got request to mark zero IP down.\n") );
|
||||
DEBUG( 4, ("wins_srv_died(): Invalid request to mark zero IP down.\n") );
|
||||
return;
|
||||
}
|
||||
|
||||
@ -242,6 +312,7 @@ void wins_srv_died( struct in_addr boothill_ip )
|
||||
unsigned long wins_srv_count( void )
|
||||
/* ------------------------------------------------------------------------ **
|
||||
* Return the total number of entries in the list, dead or alive.
|
||||
* ------------------------------------------------------------------------ **
|
||||
*/
|
||||
{
|
||||
unsigned long count = ubi_slCount( wins_srv_list );
|
||||
|
Loading…
x
Reference in New Issue
Block a user