diff options
Diffstat (limited to 'source3/nmbd/nmbd_subnetdb.c')
-rw-r--r-- | source3/nmbd/nmbd_subnetdb.c | 71 |
1 files changed, 50 insertions, 21 deletions
diff --git a/source3/nmbd/nmbd_subnetdb.c b/source3/nmbd/nmbd_subnetdb.c index e68fc1589c..6c6e7adbb8 100644 --- a/source3/nmbd/nmbd_subnetdb.c +++ b/source3/nmbd/nmbd_subnetdb.c @@ -233,17 +233,12 @@ BOOL create_subnets(void) struct in_addr unicast_ip, ipzero; extern struct in_addr loopback_ip; - if(num_interfaces == 0) { - DEBUG(0,("create_subnets: No local interfaces !\n")); - DEBUG(0,("create_subnets: Waiting for an interface to appear ...\n")); - while (iface_count() == 0) { - sleep(5); - load_interfaces(); - } + if(num_interfaces == 0) + { + DEBUG(0,("create_subnets: No local interfaces !\n")); + return False; } - num_interfaces = iface_count(); - /* * Create subnets from all the local interfaces and thread them onto * the linked list. @@ -267,14 +262,45 @@ BOOL create_subnets(void) if (!make_normal_subnet(iface)) return False; } - if (lp_we_are_a_wins_server()) { - /* Pick the first interface ip address as the WINS server ip. */ - unicast_ip = *iface_n_ip(0); - } else { - /* note that we do not set the wins server IP here. We just - set it at zero and let the wins registration code cope - with getting the IPs right for each packet */ - zero_ip(&unicast_ip); + /* + * If we have been configured to use a WINS server, then try and + * get the ip address of it here. If we are the WINS server then + * set the unicast subnet address to be the first of our own real + * addresses. + * + * NOTE: I'm not sure of the implications of WINS server failover + * on this bit of code. Because of failover, the WINS + * server address can change. crh + */ + + if( wins_srv_count() ) + { + struct in_addr real_wins_ip; + real_wins_ip = wins_srv_ip(); + + if (!is_zero_ip(real_wins_ip)) + { + unicast_ip = real_wins_ip; + } + else + { + /* wins_srv_ip() can return a zero IP if all servers are + * either down or incorrectly entered in smb.conf. crh + */ + DEBUG(0,("No 'live' WINS servers found. Check 'wins server' parameter.\n")); + return False; + } + } + else if(lp_we_are_a_wins_server()) + { + /* Pick the first interface ip address as the WINS server ip. */ + unicast_ip = *iface_n_ip(0); + } + else + { + /* We should not be using a WINS server at all. Set the + ip address of the subnet to be zero. */ + zero_ip(&unicast_ip); } /* @@ -315,13 +341,16 @@ BOOL create_subnets(void) /******************************************************************* Function to tell us if we can use the unicast subnet. ******************************************************************/ + BOOL we_are_a_wins_client(void) { - if (wins_srv_count() > 0) { - return True; - } + static int cache_we_are_a_wins_client = -1; + + if(cache_we_are_a_wins_client == -1) + cache_we_are_a_wins_client = (is_zero_ip(unicast_subnet->myip) ? + False : True); - return False; + return cache_we_are_a_wins_client; } /******************************************************************* |