summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2005-12-28 03:04:40 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:47:52 -0500
commite4dbcc0d5d6c9c68a7f3c437611b726f9f0211cf (patch)
treecc0456ffcb6dbb4627dd84048f2a22c5efe2a162
parent1f700876633c1f96bfc38d366dd0d5571aaa8696 (diff)
downloadsamba-e4dbcc0d5d6c9c68a7f3c437611b726f9f0211cf.tar.gz
samba-e4dbcc0d5d6c9c68a7f3c437611b726f9f0211cf.tar.bz2
samba-e4dbcc0d5d6c9c68a7f3c437611b726f9f0211cf.zip
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)
-rw-r--r--source4/client/smbmount.c1
-rw-r--r--source4/client/smbspool.c2
-rw-r--r--source4/gtk/tools/gepdump.c1
-rw-r--r--source4/gtk/tools/gregedit.c1
-rw-r--r--source4/gtk/tools/gwcrontab.c1
-rw-r--r--source4/gtk/tools/gwsam.c1
-rw-r--r--source4/lib/cmdline/popt_common.c1
-rw-r--r--source4/lib/netif/interface.c101
-rw-r--r--source4/scripting/ejs/smbcalls_config.c2
-rw-r--r--source4/torture/gentest.c1
-rw-r--r--source4/torture/locktest.c1
-rw-r--r--source4/torture/locktest2.c1
-rw-r--r--source4/torture/masktest.c1
13 files changed, 42 insertions, 73 deletions
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<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);
- 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;
- }
-
- 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);