diff options
author | Andrew Tridgell <tridge@samba.org> | 2005-02-16 01:48:11 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:10:43 -0500 |
commit | 4c7c38e930805b84789cfb2472776d6939fc23f6 (patch) | |
tree | 4f7174c83760be60d1b65cd654a624b7b1b19c7c | |
parent | e284054f655a430769fb02e4927256495338ff66 (diff) | |
download | samba-4c7c38e930805b84789cfb2472776d6939fc23f6.tar.gz samba-4c7c38e930805b84789cfb2472776d6939fc23f6.tar.bz2 samba-4c7c38e930805b84789cfb2472776d6939fc23f6.zip |
r5411: make network interface selection a bit saner
- if we have no configured network interfaces, then don't start nbtd (when I add dynamic
interface loading this will change to a delay until a network interface comes up)
- choose the best interface by netmask for torture tests that need a
specific IP (such as the WINS test). Added iface_best_ip() for that.
- if specific interfaces are chosen in smb.conf, then keep that ordering, and
default to the first one listed
(This used to be commit 4d08c114079ef6d1d10a96195046fe43631aefa2)
-rw-r--r-- | source4/lib/netif/interface.c | 17 | ||||
-rw-r--r-- | source4/nbt_server/nbt_server.c | 5 | ||||
-rw-r--r-- | source4/smbd/process_single.c | 1 | ||||
-rw-r--r-- | source4/smbd/service_task.c | 1 | ||||
-rw-r--r-- | source4/torture/nbt/register.c | 4 | ||||
-rw-r--r-- | source4/torture/nbt/wins.c | 2 | ||||
-rw-r--r-- | source4/torture/nbt/winsbench.c | 2 |
7 files changed, 27 insertions, 5 deletions
diff --git a/source4/lib/netif/interface.c b/source4/lib/netif/interface.c index 2d90df43cf..78f4456cd8 100644 --- a/source4/lib/netif/interface.c +++ b/source4/lib/netif/interface.c @@ -94,7 +94,7 @@ static void add_interface(struct in_addr ip, struct in_addr nmask) iface->nmask = tov4(nmask); iface->bcast.addr = MKBCADDR(iface->ip.addr, iface->nmask.addr); - DLIST_ADD(local_interfaces, iface); + DLIST_ADD_END(local_interfaces, iface, struct interface *); DEBUG(2,("added interface ip=%s ",sys_inet_ntoa(iface->ip))); DEBUG(2,("bcast=%s ",sys_inet_ntoa(iface->bcast))); @@ -339,3 +339,18 @@ const char *iface_n_netmask(int n) return NULL; } +/* + return the local IP address that best matches a destination IP, or + our first interface if none match +*/ +const char *iface_best_ip(const char *dest) +{ + struct interface *iface; + struct in_addr ip; + ip.s_addr = interpret_addr(dest); + iface = iface_find(ip, True); + if (iface) { + return sys_inet_ntoa(iface->ip); + } + return iface_n_ip(0); +} diff --git a/source4/nbt_server/nbt_server.c b/source4/nbt_server/nbt_server.c index d939482d2f..2c76152160 100644 --- a/source4/nbt_server/nbt_server.c +++ b/source4/nbt_server/nbt_server.c @@ -34,6 +34,11 @@ static void nbtd_task_init(struct task_server *task) struct nbtd_server *nbtsrv; NTSTATUS status; + if (iface_count() == 0) { + task_terminate(task, "nbtd: no network interfaces configured"); + return; + } + nbtsrv = talloc(task, struct nbtd_server); if (nbtsrv == NULL) { task_terminate(task, "nbtd: out of memory"); diff --git a/source4/smbd/process_single.c b/source4/smbd/process_single.c index 0a1e2a6103..8d26481a95 100644 --- a/source4/smbd/process_single.c +++ b/source4/smbd/process_single.c @@ -74,6 +74,7 @@ static void single_new_task(struct event_context *ev, /* called when a task goes down */ static void single_terminate(struct event_context *ev, const char *reason) { + DEBUG(2,("single_terminate: reason[%s]\n",reason)); } static const struct model_ops single_ops = { diff --git a/source4/smbd/service_task.c b/source4/smbd/service_task.c index 8f2255cf3e..68aba69019 100644 --- a/source4/smbd/service_task.c +++ b/source4/smbd/service_task.c @@ -32,6 +32,7 @@ void task_terminate(struct task_server *task, const char *reason) { struct event_context *event_ctx = task->event_ctx; const struct model_ops *model_ops = task->model_ops; + DEBUG(0,("task_terminate: [%s]\n", reason)); talloc_free(task); model_ops->terminate(event_ctx, reason); } diff --git a/source4/torture/nbt/register.c b/source4/torture/nbt/register.c index 40b8a587fe..e9b98663a5 100644 --- a/source4/torture/nbt/register.c +++ b/source4/torture/nbt/register.c @@ -49,7 +49,7 @@ static BOOL nbt_register_own(TALLOC_CTX *mem_ctx, struct nbt_name *name, NTSTATUS status; struct nbt_name_socket *nbtsock = nbt_name_socket_init(mem_ctx, NULL); BOOL ret = True; - const char *myaddress = iface_n_ip(0); + const char *myaddress = iface_best_ip(address); socket_listen(nbtsock->sock, myaddress, 0, 0, 0); @@ -114,7 +114,7 @@ static BOOL nbt_refresh_own(TALLOC_CTX *mem_ctx, struct nbt_name *name, NTSTATUS status; struct nbt_name_socket *nbtsock = nbt_name_socket_init(mem_ctx, NULL); BOOL ret = True; - const char *myaddress = iface_n_ip(0); + const char *myaddress = iface_best_ip(address); socket_listen(nbtsock->sock, myaddress, 0, 0, 0); diff --git a/source4/torture/nbt/wins.c b/source4/torture/nbt/wins.c index 3f8b361a93..f92a23f732 100644 --- a/source4/torture/nbt/wins.c +++ b/source4/torture/nbt/wins.c @@ -60,7 +60,7 @@ static BOOL nbt_test_wins_name(TALLOC_CTX *mem_ctx, const char *address, NTSTATUS status; struct nbt_name_socket *nbtsock = nbt_name_socket_init(mem_ctx, NULL); BOOL ret = True; - const char *myaddress = talloc_strdup(mem_ctx, iface_n_ip(0)); + const char *myaddress = talloc_strdup(mem_ctx, iface_best_ip(address)); /* we do the listen here to ensure the WINS server receives the packets from the right IP */ diff --git a/source4/torture/nbt/winsbench.c b/source4/torture/nbt/winsbench.c index f6a6283dd2..54f730ce84 100644 --- a/source4/torture/nbt/winsbench.c +++ b/source4/torture/nbt/winsbench.c @@ -231,7 +231,7 @@ static BOOL bench_wins(TALLOC_CTX *mem_ctx, struct nbt_name *name, const char *a state->num_names = torture_entries; state->registered = talloc_zero_array(state, BOOL, state->num_names); state->wins_server = address; - state->my_ip = talloc_strdup(mem_ctx, iface_n_ip(0)); + state->my_ip = talloc_strdup(mem_ctx, iface_best_ip(address)); state->ttl = timelimit; socket_listen(nbtsock->sock, state->my_ip, 0, 0, 0); |