mirror of
				https://github.com/samba-team/samba.git
				synced 2025-10-31 12:23:52 +03:00 
			
		
		
		
	r12531: 'make quicktest' was taking 15 minutes on my system due to failing DNS
lookups in load_interfaces(). The reason was my eth0 interface was down, and it was being interpreted as a DNS name. This patch changes load_interfaces() to happening automatically when interfaces are first needed instead of on the startup of every samba binary. This means that (for example) ldbadd doesn't call load_interfaces(), which means no slow DNS lookups. I also reduced the number of static globals in interface.c to 1, and changed from malloc to talloc When you want to force a reload of the interfaces list, you now call unload_interfaces(), which means the next call that needs the interfaces list will reload it
This commit is contained in:
		
				
					committed by
					
						 Gerald (Jerry) Carter
						Gerald (Jerry) Carter
					
				
			
			
				
	
			
			
			
						parent
						
							90129b081e
						
					
				
				
					commit
					f79d90bd13
				
			| @@ -915,7 +915,6 @@ static void parse_mount_smb(int argc, char **argv) | ||||
| 		pstrcpy(workgroup,lp_workgroup()); | ||||
| 	} | ||||
|  | ||||
| 	load_interfaces(); | ||||
| 	if (!*my_netbios_name) { | ||||
| 		pstrcpy(my_netbios_name, myhostname()); | ||||
| 	} | ||||
|   | ||||
| @@ -185,8 +185,6 @@ static int		smb_print(struct smbcli_state *, char *, FILE *); | ||||
|   if (workgroup == NULL) | ||||
|     workgroup = lp_workgroup(); | ||||
|  | ||||
|   load_interfaces(); | ||||
|  | ||||
|   do | ||||
|   { | ||||
|     if ((cli = smb_connect(workgroup, server, printer, username, password)) == NULL) | ||||
|   | ||||
| @@ -464,7 +464,6 @@ int main(int argc, char **argv) | ||||
| { | ||||
| 	gepdump_init_subsystems; | ||||
| 	lp_load(); | ||||
| 	load_interfaces(); | ||||
| 	setup_logging(argv[0], DEBUG_STDERR); | ||||
|  | ||||
| 	gtk_init(&argc, &argv); | ||||
|   | ||||
| @@ -969,7 +969,6 @@ int main(int argc, char *argv[]) | ||||
| 	gregedit_init_subsystems; | ||||
| 	registry_init(); | ||||
| 	lp_load(); | ||||
| 	load_interfaces(); | ||||
| 	setup_logging(argv[0], DEBUG_STDERR); | ||||
|  | ||||
| 	mem_ctx = talloc_init("gregedit"); | ||||
|   | ||||
| @@ -495,7 +495,6 @@ static GtkWidget*create_new_job_dialog (void) | ||||
| { | ||||
| 	gwcrontab_init_subsystems; | ||||
| 	lp_load(); | ||||
| 	load_interfaces(); | ||||
| 	setup_logging(argv[0], DEBUG_STDERR); | ||||
|  | ||||
| 	gtk_init(&argc, &argv); | ||||
|   | ||||
| @@ -404,7 +404,6 @@ static GtkWidget* create_mainwindow (void) | ||||
| { | ||||
| 	gwsam_init_subsystems; | ||||
| 	lp_load(); | ||||
| 	load_interfaces(); | ||||
| 	setup_logging(argv[0], DEBUG_STDERR); | ||||
|  | ||||
| 	gtk_init(&argc, &argv); | ||||
|   | ||||
| @@ -52,7 +52,6 @@ static void popt_common_callback(poptContext con, | ||||
| 		/* Hook any 'every Samba program must do this, after | ||||
| 		 * the smb.conf is setup' functions here */ | ||||
| 		lp_load(); | ||||
| 		load_interfaces(); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
|   | ||||
| @@ -25,12 +25,6 @@ | ||||
| #include "lib/netif/netif.h" | ||||
| #include "dlinklist.h" | ||||
|  | ||||
| static struct iface_struct *probed_ifaces; | ||||
| static int total_probed; | ||||
|  | ||||
| static struct ipv4_addr allones_ip; | ||||
| struct ipv4_addr loopback_ip; | ||||
|  | ||||
| /* used for network interfaces */ | ||||
| struct interface { | ||||
| 	struct interface *next, *prev; | ||||
| @@ -80,12 +74,12 @@ static void add_interface(struct in_addr ip, struct in_addr nmask) | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	if (nmask.s_addr == allones_ip.addr) { | ||||
| 	if (nmask.s_addr == ~0) { | ||||
| 		DEBUG(3,("not adding non-broadcast interface %s\n",inet_ntoa(ip))); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	iface = malloc_p(struct interface); | ||||
| 	iface = talloc(local_interfaces, struct interface); | ||||
| 	if (!iface) return; | ||||
| 	 | ||||
| 	ZERO_STRUCTPN(iface); | ||||
| @@ -114,7 +108,9 @@ This handles the following different forms: | ||||
| 4) ip/mask | ||||
| 5) bcast/mask | ||||
| ****************************************************************************/ | ||||
| static void interpret_interface(TALLOC_CTX *mem_ctx, const char *token) | ||||
| static void interpret_interface(const char *token,  | ||||
| 				struct iface_struct *probed_ifaces,  | ||||
| 				int total_probed) | ||||
| { | ||||
| 	struct in_addr ip, nmask; | ||||
| 	char *p; | ||||
| @@ -143,7 +139,7 @@ static void interpret_interface(TALLOC_CTX *mem_ctx, const char *token) | ||||
| 		ip.s_addr = interpret_addr2(token).addr; | ||||
| 		for (i=0;i<total_probed;i++) { | ||||
| 			if (ip.s_addr == probed_ifaces[i].ip.s_addr && | ||||
| 			    allones_ip.addr != probed_ifaces[i].netmask.s_addr) { | ||||
| 			    probed_ifaces[i].netmask.s_addr != ~0) { | ||||
| 				add_interface(probed_ifaces[i].ip, | ||||
| 					      probed_ifaces[i].netmask); | ||||
| 				return; | ||||
| @@ -184,40 +180,24 @@ static void interpret_interface(TALLOC_CTX *mem_ctx, const char *token) | ||||
| /**************************************************************************** | ||||
| load the list of network interfaces | ||||
| ****************************************************************************/ | ||||
| void load_interfaces(void) | ||||
| static void load_interfaces(void) | ||||
| { | ||||
| 	const char **ptr; | ||||
| 	int i; | ||||
| 	struct iface_struct ifaces[MAX_INTERFACES]; | ||||
| 	TALLOC_CTX *mem_ctx; | ||||
| 	struct ipv4_addr loopback_ip; | ||||
| 	int total_probed; | ||||
|  | ||||
| 	ptr = lp_interfaces(); | ||||
| 	mem_ctx = talloc_init("load_interfaces"); | ||||
| 	if (!mem_ctx) { | ||||
| 		DEBUG(2,("no memory to load interfaces \n")); | ||||
| 	if (local_interfaces != NULL) { | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	allones_ip = interpret_addr2("255.255.255.255"); | ||||
| 	ptr = lp_interfaces(); | ||||
| 	loopback_ip = interpret_addr2("127.0.0.1"); | ||||
|  | ||||
| 	SAFE_FREE(probed_ifaces); | ||||
|  | ||||
| 	/* dump the current interfaces if any */ | ||||
| 	while (local_interfaces) { | ||||
| 		struct interface *iface = local_interfaces; | ||||
| 		DLIST_REMOVE(local_interfaces, local_interfaces); | ||||
| 		ZERO_STRUCTPN(iface); | ||||
| 		SAFE_FREE(iface); | ||||
| 	} | ||||
|  | ||||
| 	/* probe the kernel for interfaces */ | ||||
| 	total_probed = get_interfaces(ifaces, MAX_INTERFACES); | ||||
|  | ||||
| 	if (total_probed > 0) { | ||||
| 		probed_ifaces = memdup(ifaces, sizeof(ifaces[0])*total_probed); | ||||
| 	} | ||||
|  | ||||
| 	/* if we don't have a interfaces line then use all broadcast capable  | ||||
| 	   interfaces except loopback */ | ||||
| 	if (!ptr || !*ptr || !**ptr) { | ||||
| @@ -225,56 +205,43 @@ void load_interfaces(void) | ||||
| 			DEBUG(0,("ERROR: Could not determine network interfaces, you must use a interfaces config line\n")); | ||||
| 		} | ||||
| 		for (i=0;i<total_probed;i++) { | ||||
| 			if (probed_ifaces[i].netmask.s_addr != allones_ip.addr && | ||||
| 			    probed_ifaces[i].ip.s_addr != loopback_ip.addr) { | ||||
| 				add_interface(probed_ifaces[i].ip,  | ||||
| 					      probed_ifaces[i].netmask); | ||||
| 			if (ifaces[i].netmask.s_addr != ~0 && | ||||
| 			    ifaces[i].ip.s_addr != loopback_ip.addr) { | ||||
| 				add_interface(ifaces[i].ip,  | ||||
| 					      ifaces[i].netmask); | ||||
| 			} | ||||
| 		} | ||||
| 		goto exit; | ||||
| 	} | ||||
|  | ||||
| 	if (ptr) { | ||||
| 		while (*ptr) { | ||||
| 			interpret_interface(mem_ctx, *ptr); | ||||
| 	while (ptr && *ptr) { | ||||
| 		interpret_interface(*ptr, ifaces, total_probed); | ||||
| 		ptr++; | ||||
| 	} | ||||
| 	} | ||||
|  | ||||
| 	if (!local_interfaces) { | ||||
| 		DEBUG(0,("WARNING: no network interfaces found\n")); | ||||
| 	} | ||||
| 	 | ||||
| exit: | ||||
| 	talloc_free(mem_ctx); | ||||
| } | ||||
|  | ||||
|  | ||||
| /**************************************************************************** | ||||
| return True if the list of probed interfaces has changed | ||||
| ****************************************************************************/ | ||||
| BOOL interfaces_changed(void) | ||||
| /* | ||||
|   unload the interfaces list, so it can be reloaded when needed | ||||
| */ | ||||
| void unload_interfaces(void) | ||||
| { | ||||
| 	int n; | ||||
| 	struct iface_struct ifaces[MAX_INTERFACES]; | ||||
|  | ||||
| 	n = get_interfaces(ifaces, MAX_INTERFACES); | ||||
|  | ||||
| 	if ((n > 0 )&& (n != total_probed || | ||||
| 	    memcmp(ifaces, probed_ifaces, sizeof(ifaces[0])*n))) { | ||||
| 		return True; | ||||
| 	talloc_free(local_interfaces); | ||||
| 	local_interfaces = NULL; | ||||
| } | ||||
|  | ||||
| 	return False; | ||||
| } | ||||
|  | ||||
|  | ||||
| /**************************************************************************** | ||||
|   check if an IP is one of mine | ||||
|   **************************************************************************/ | ||||
| BOOL ismyip(struct ipv4_addr ip) | ||||
| { | ||||
| 	struct interface *i; | ||||
|  | ||||
| 	load_interfaces(); | ||||
|  | ||||
| 	for (i=local_interfaces;i;i=i->next) { | ||||
| 		if (i->ip.addr == ip.addr) return True; | ||||
| 	} | ||||
| @@ -289,6 +256,8 @@ int iface_count(void) | ||||
| 	int ret = 0; | ||||
| 	struct interface *i; | ||||
|  | ||||
| 	load_interfaces(); | ||||
|  | ||||
| 	for (i=local_interfaces;i;i=i->next) | ||||
| 		ret++; | ||||
| 	return ret; | ||||
| @@ -301,6 +270,8 @@ const char *iface_n_ip(int n) | ||||
| { | ||||
| 	struct interface *i; | ||||
|    | ||||
| 	load_interfaces(); | ||||
|  | ||||
| 	for (i=local_interfaces;i && n;i=i->next) | ||||
| 		n--; | ||||
|  | ||||
| @@ -317,6 +288,8 @@ const char *iface_n_bcast(int n) | ||||
| { | ||||
| 	struct interface *i; | ||||
|    | ||||
| 	load_interfaces(); | ||||
|  | ||||
| 	for (i=local_interfaces;i && n;i=i->next) | ||||
| 		n--; | ||||
|  | ||||
| @@ -333,6 +306,8 @@ const char *iface_n_netmask(int n) | ||||
| { | ||||
| 	struct interface *i; | ||||
|    | ||||
| 	load_interfaces(); | ||||
|  | ||||
| 	for (i=local_interfaces;i && n;i=i->next) | ||||
| 		n--; | ||||
|  | ||||
| @@ -350,6 +325,9 @@ const char *iface_best_ip(const char *dest) | ||||
| { | ||||
| 	struct interface *iface; | ||||
| 	struct in_addr ip; | ||||
|  | ||||
| 	load_interfaces(); | ||||
|  | ||||
| 	ip.s_addr = interpret_addr(dest); | ||||
| 	iface = iface_find(ip, True); | ||||
| 	if (iface) { | ||||
| @@ -364,6 +342,9 @@ const char *iface_best_ip(const char *dest) | ||||
| BOOL iface_is_local(const char *dest) | ||||
| { | ||||
| 	struct in_addr ip; | ||||
|  | ||||
| 	load_interfaces(); | ||||
|  | ||||
| 	ip.s_addr = interpret_addr(dest); | ||||
| 	if (iface_find(ip, True)) { | ||||
| 		return True; | ||||
|   | ||||
| @@ -188,7 +188,7 @@ static int ejs_lpReload(MprVarHandle eid, int argc, char **argv) | ||||
| { | ||||
| 	BOOL ret = lp_load(); | ||||
| 	if (ret) { | ||||
| 		load_interfaces(); | ||||
| 		unload_interfaces(); | ||||
| 	} | ||||
| 	mpr_Return(eid, mprCreateBoolVar(ret)); | ||||
| 	return 0; | ||||
|   | ||||
| @@ -2149,7 +2149,6 @@ static void usage(void) | ||||
| 	argv += NSERVERS; | ||||
|  | ||||
| 	lp_load(); | ||||
| 	load_interfaces(); | ||||
|  | ||||
| 	servers[0].credentials = cli_credentials_init(talloc_autofree_context()); | ||||
| 	servers[1].credentials = cli_credentials_init(talloc_autofree_context()); | ||||
|   | ||||
| @@ -478,7 +478,6 @@ static void usage(void) | ||||
| 	argv += NSERVERS; | ||||
|  | ||||
| 	lp_load(); | ||||
| 	load_interfaces(); | ||||
|  | ||||
| 	servers[0] = cli_credentials_init(talloc_autofree_context()); | ||||
| 	servers[1] = cli_credentials_init(talloc_autofree_context()); | ||||
|   | ||||
| @@ -485,7 +485,6 @@ static void usage(void) | ||||
| 	argv += 4; | ||||
|  | ||||
| 	lp_load(); | ||||
| 	load_interfaces(); | ||||
|  | ||||
| 	if (getenv("USER")) { | ||||
| 		fstrcpy(username,getenv("USER")); | ||||
|   | ||||
| @@ -298,7 +298,6 @@ static void usage(void) | ||||
| 	argv += 1; | ||||
|  | ||||
| 	lp_load(); | ||||
| 	load_interfaces(); | ||||
|  | ||||
| 	credentials = cli_credentials_init(talloc_autofree_context()); | ||||
| 	cli_credentials_guess(credentials); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user