svn commit: samba r13505 - in branches/SAMBA_4_0/source: lib/netif libcli/resolve nbt_server utils

tridge at samba.org tridge at samba.org
Wed Feb 15 04:18:12 GMT 2006


Author: tridge
Date: 2006-02-15 04:18:11 +0000 (Wed, 15 Feb 2006)
New Revision: 13505

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=13505

Log:

allow servers to bind to non-broadcast interfaces. Servers now
specifically ask for iface_n_bcast() and have to check if it returns
NULL, in which case it is a non-broadcast interface


Modified:
   branches/SAMBA_4_0/source/lib/netif/interface.c
   branches/SAMBA_4_0/source/libcli/resolve/bcast.c
   branches/SAMBA_4_0/source/nbt_server/interfaces.c
   branches/SAMBA_4_0/source/utils/nmblookup.c


Changeset:
Modified: branches/SAMBA_4_0/source/lib/netif/interface.c
===================================================================
--- branches/SAMBA_4_0/source/lib/netif/interface.c	2006-02-15 02:56:31 UTC (rev 13504)
+++ branches/SAMBA_4_0/source/lib/netif/interface.c	2006-02-15 04:18:11 UTC (rev 13505)
@@ -29,7 +29,6 @@
 struct interface {
 	struct interface *next, *prev;
 	struct ipv4_addr ip;
-	struct ipv4_addr bcast;
 	struct ipv4_addr nmask;
 	const char *ip_s;
 	const char *bcast_s;
@@ -75,16 +74,12 @@
 static void add_interface(struct in_addr ip, struct in_addr nmask)
 {
 	struct interface *iface;
+	struct ipv4_addr bcast;
 	if (iface_find(ip, False)) {
 		DEBUG(3,("not adding duplicate interface %s\n",inet_ntoa(ip)));
 		return;
 	}
 
-	if (nmask.s_addr == ~0) {
-		DEBUG(3,("not adding non-broadcast interface %s\n",inet_ntoa(ip)));
-		return;
-	}
-
 	iface = talloc(local_interfaces, struct interface);
 	if (!iface) return;
 	
@@ -92,18 +87,20 @@
 
 	iface->ip = tov4(ip);
 	iface->nmask = tov4(nmask);
-	iface->bcast.addr = MKBCADDR(iface->ip.addr, iface->nmask.addr);
+	bcast.addr = MKBCADDR(iface->ip.addr, iface->nmask.addr);
 
 	/* keep string versions too, to avoid people tripping over the implied
 	   static in sys_inet_ntoa() */
 	iface->ip_s = talloc_strdup(iface, sys_inet_ntoa(iface->ip));
-	iface->bcast_s = talloc_strdup(iface, sys_inet_ntoa(iface->bcast));
 	iface->nmask_s = talloc_strdup(iface, sys_inet_ntoa(iface->nmask));
+	
+	if (nmask.s_addr != ~0) {
+		iface->bcast_s = talloc_strdup(iface, sys_inet_ntoa(bcast));
+	}
 
 	DLIST_ADD_END(local_interfaces, iface, struct interface *);
 
-	DEBUG(2,("added interface ip=%s bcast=%s nmask=%s\n", 
-		 iface->ip_s, iface->bcast_s, iface->nmask_s));
+	DEBUG(2,("added interface ip=%s nmask=%s\n", iface->ip_s, iface->nmask_s));
 }
 
 
@@ -149,8 +146,7 @@
 		}
 		ip.s_addr = interpret_addr2(token).addr;
 		for (i=0;i<total_probed;i++) {
-			if (ip.s_addr == probed_ifaces[i].ip.s_addr &&
-			    probed_ifaces[i].netmask.s_addr != ~0) {
+			if (ip.s_addr == probed_ifaces[i].ip.s_addr) {
 				add_interface(probed_ifaces[i].ip,
 					      probed_ifaces[i].netmask);
 				return;
@@ -209,15 +205,14 @@
 	/* probe the kernel for interfaces */
 	total_probed = get_interfaces(ifaces, MAX_INTERFACES);
 
-	/* if we don't have a interfaces line then use all broadcast capable 
-	   interfaces except loopback */
+	/* if we don't have a interfaces line then use all interfaces
+	   except loopback */
 	if (!ptr || !*ptr || !**ptr) {
 		if (total_probed <= 0) {
 			DEBUG(0,("ERROR: Could not determine network interfaces, you must use a interfaces config line\n"));
 		}
 		for (i=0;i<total_probed;i++) {
-			if (ifaces[i].netmask.s_addr != ~0 &&
-			    ifaces[i].ip.s_addr != loopback_ip.addr) {
+			if (ifaces[i].ip.s_addr != loopback_ip.addr) {
 				add_interface(ifaces[i].ip, 
 					      ifaces[i].netmask);
 			}

Modified: branches/SAMBA_4_0/source/libcli/resolve/bcast.c
===================================================================
--- branches/SAMBA_4_0/source/libcli/resolve/bcast.c	2006-02-15 02:56:31 UTC (rev 13504)
+++ branches/SAMBA_4_0/source/libcli/resolve/bcast.c	2006-02-15 04:18:11 UTC (rev 13505)
@@ -31,19 +31,22 @@
 	int num_interfaces = iface_count();
 	const char **address_list;
 	struct composite_context *c;
-	int i;
+	int i, count=0;
 
 	address_list = talloc_array(NULL, const char *, num_interfaces+1);
 	if (address_list == NULL) return NULL;
 
 	for (i=0;i<num_interfaces;i++) {
-		address_list[i] = talloc_strdup(address_list, iface_n_bcast(i));
-		if (address_list[i] == NULL) {
+		const char *bcast = iface_n_bcast(i);
+		if (bcast == NULL) continue;
+		address_list[count] = talloc_strdup(address_list, bcast);
+		if (address_list[count] == NULL) {
 			talloc_free(address_list);
 			return NULL;
 		}
+		count++;
 	}
-	address_list[i] = NULL;
+	address_list[count] = NULL;
 
 	c = resolve_name_nbtlist_send(name, event_ctx, address_list, True, False);
 	talloc_free(address_list);

Modified: branches/SAMBA_4_0/source/nbt_server/interfaces.c
===================================================================
--- branches/SAMBA_4_0/source/nbt_server/interfaces.c	2006-02-15 02:56:31 UTC (rev 13504)
+++ branches/SAMBA_4_0/source/nbt_server/interfaces.c	2006-02-15 04:18:11 UTC (rev 13505)
@@ -245,10 +245,16 @@
 	}
 
 	for (i=0; i<num_interfaces; i++) {
-		const char *address = talloc_strdup(tmp_ctx, iface_n_ip(i));
-		const char *bcast   = talloc_strdup(tmp_ctx, iface_n_bcast(i));
-		const char *netmask = talloc_strdup(tmp_ctx, iface_n_netmask(i));
+		const char *bcast = iface_n_bcast(i);
+		const char *address, *netmask;
 
+		/* we can't assume every interface is broadcast capable */
+		if (bcast == NULL) continue;
+
+		address = talloc_strdup(tmp_ctx, iface_n_ip(i));
+		bcast   = talloc_strdup(tmp_ctx, bcast);
+		netmask = talloc_strdup(tmp_ctx, iface_n_netmask(i));
+
 		status = nbtd_add_socket(nbtsrv, address, address, bcast, netmask);
 		NT_STATUS_NOT_OK_RETURN(status);
 	}

Modified: branches/SAMBA_4_0/source/utils/nmblookup.c
===================================================================
--- branches/SAMBA_4_0/source/utils/nmblookup.c	2006-02-15 02:56:31 UTC (rev 13504)
+++ branches/SAMBA_4_0/source/utils/nmblookup.c	2006-02-15 04:18:11 UTC (rev 13505)
@@ -236,6 +236,7 @@
 		int i, num_interfaces = iface_count();
 		for (i=0;i<num_interfaces;i++) {
 			const char *bcast = iface_n_bcast(i);
+			if (bcast == NULL) continue;
 			status = do_node_query(nbtsock, bcast, node_name, node_type, True);
 			if (NT_STATUS_IS_OK(status)) break;
 		}



More information about the samba-cvs mailing list