From e4dbcc0d5d6c9c68a7f3c437611b726f9f0211cf Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 28 Dec 2005 03:04:40 +0000 Subject: 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 used to be commit f79d90bd1364b970adb2981b2572e77066431f1e) --- source4/client/smbmount.c | 1 - source4/client/smbspool.c | 2 - source4/gtk/tools/gepdump.c | 1 - source4/gtk/tools/gregedit.c | 1 - source4/gtk/tools/gwcrontab.c | 1 - source4/gtk/tools/gwsam.c | 1 - source4/lib/cmdline/popt_common.c | 1 - source4/lib/netif/interface.c | 101 +++++++++++++------------------- source4/scripting/ejs/smbcalls_config.c | 2 +- source4/torture/gentest.c | 1 - source4/torture/locktest.c | 1 - source4/torture/locktest2.c | 1 - source4/torture/masktest.c | 1 - 13 files changed, 42 insertions(+), 73 deletions(-) (limited to 'source4') diff --git a/source4/client/smbmount.c b/source4/client/smbmount.c index b2e6b9677f..4bfeae1e24 100644 --- a/source4/client/smbmount.c +++ b/source4/client/smbmount.c @@ -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()); } diff --git a/source4/client/smbspool.c b/source4/client/smbspool.c index cb95c0d5a3..26a42cb144 100644 --- a/source4/client/smbspool.c +++ b/source4/client/smbspool.c @@ -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) diff --git a/source4/gtk/tools/gepdump.c b/source4/gtk/tools/gepdump.c index 622d4b99aa..9275bc1ebd 100644 --- a/source4/gtk/tools/gepdump.c +++ b/source4/gtk/tools/gepdump.c @@ -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); diff --git a/source4/gtk/tools/gregedit.c b/source4/gtk/tools/gregedit.c index cb0d927439..f98a366e9b 100644 --- a/source4/gtk/tools/gregedit.c +++ b/source4/gtk/tools/gregedit.c @@ -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"); diff --git a/source4/gtk/tools/gwcrontab.c b/source4/gtk/tools/gwcrontab.c index fd4f41d06f..391110c56d 100644 --- a/source4/gtk/tools/gwcrontab.c +++ b/source4/gtk/tools/gwcrontab.c @@ -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); diff --git a/source4/gtk/tools/gwsam.c b/source4/gtk/tools/gwsam.c index f1cf8d5e85..963397810c 100644 --- a/source4/gtk/tools/gwsam.c +++ b/source4/gtk/tools/gwsam.c @@ -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); diff --git a/source4/lib/cmdline/popt_common.c b/source4/lib/cmdline/popt_common.c index 0aa4a634fc..b1f4563fb1 100644 --- a/source4/lib/cmdline/popt_common.c +++ b/source4/lib/cmdline/popt_common.c @@ -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; } diff --git a/source4/lib/netif/interface.c b/source4/lib/netif/interface.c index 2abb08e090..ce94f482f5 100644 --- a/source4/lib/netif/interface.c +++ b/source4/lib/netif/interface.c @@ -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 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 0 )&& (n != total_probed || - memcmp(ifaces, probed_ifaces, sizeof(ifaces[0])*n))) { - return True; - } - - return False; + talloc_free(local_interfaces); + local_interfaces = NULL; } - /**************************************************************************** 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; diff --git a/source4/scripting/ejs/smbcalls_config.c b/source4/scripting/ejs/smbcalls_config.c index a64d57a359..b0b1420ba2 100644 --- a/source4/scripting/ejs/smbcalls_config.c +++ b/source4/scripting/ejs/smbcalls_config.c @@ -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; diff --git a/source4/torture/gentest.c b/source4/torture/gentest.c index 9f2bb64b60..abd9921569 100644 --- a/source4/torture/gentest.c +++ b/source4/torture/gentest.c @@ -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()); diff --git a/source4/torture/locktest.c b/source4/torture/locktest.c index f302240fa2..a94a6f1ec9 100644 --- a/source4/torture/locktest.c +++ b/source4/torture/locktest.c @@ -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()); diff --git a/source4/torture/locktest2.c b/source4/torture/locktest2.c index 062861a75f..9b1a44e727 100644 --- a/source4/torture/locktest2.c +++ b/source4/torture/locktest2.c @@ -485,7 +485,6 @@ static void usage(void) argv += 4; lp_load(); - load_interfaces(); if (getenv("USER")) { fstrcpy(username,getenv("USER")); diff --git a/source4/torture/masktest.c b/source4/torture/masktest.c index db54a157e1..5e8f973c4c 100644 --- a/source4/torture/masktest.c +++ b/source4/torture/masktest.c @@ -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); -- cgit