summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/lib/socket/interface.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/source4/lib/socket/interface.c b/source4/lib/socket/interface.c
index 3737f57f9b..00550a9ed4 100644
--- a/source4/lib/socket/interface.c
+++ b/source4/lib/socket/interface.c
@@ -75,7 +75,8 @@ static struct interface *iface_list_find(struct interface *interfaces,
/****************************************************************************
add an interface to the linked list of interfaces
****************************************************************************/
-static void add_interface(TALLOC_CTX *mem_ctx, const struct iface_struct *ifs, struct interface **interfaces)
+static void add_interface(TALLOC_CTX *mem_ctx, const struct iface_struct *ifs, struct interface **interfaces,
+ bool enable_ipv6)
{
char addr[INET6_ADDRSTRLEN];
struct interface *iface;
@@ -92,6 +93,10 @@ static void add_interface(TALLOC_CTX *mem_ctx, const struct iface_struct *ifs, s
return;
}
+ if (!enable_ipv6 && ifs->ip.ss_family != AF_INET) {
+ return;
+ }
+
iface = talloc(*interfaces == NULL ? mem_ctx : *interfaces, struct interface);
if (iface == NULL)
return;
@@ -147,7 +152,8 @@ static void interpret_interface(TALLOC_CTX *mem_ctx,
const char *token,
struct iface_struct *probed_ifaces,
int total_probed,
- struct interface **local_interfaces)
+ struct interface **local_interfaces,
+ bool enable_ipv6)
{
struct sockaddr_storage ss;
struct sockaddr_storage ss_mask;
@@ -163,7 +169,7 @@ static void interpret_interface(TALLOC_CTX *mem_ctx,
for (i=0;i<total_probed;i++) {
if (gen_fnmatch(token, probed_ifaces[i].name) == 0) {
add_interface(mem_ctx, &probed_ifaces[i],
- local_interfaces);
+ local_interfaces, enable_ipv6);
added = true;
}
}
@@ -183,7 +189,7 @@ static void interpret_interface(TALLOC_CTX *mem_ctx,
for (i=0;i<total_probed;i++) {
if (sockaddr_equal((struct sockaddr *)&ss, (struct sockaddr *)&probed_ifaces[i].ip)) {
add_interface(mem_ctx, &probed_ifaces[i],
- local_interfaces);
+ local_interfaces, enable_ipv6);
return;
}
}
@@ -253,7 +259,7 @@ static void interpret_interface(TALLOC_CTX *mem_ctx,
p,
probed_ifaces[i].name));
add_interface(mem_ctx, &probed_ifaces[i],
- local_interfaces);
+ local_interfaces, enable_ipv6);
probed_ifaces[i].netmask = saved_mask;
return;
}
@@ -276,19 +282,20 @@ static void interpret_interface(TALLOC_CTX *mem_ctx,
ifs.netmask = ss_mask;
ifs.bcast = ss_bcast;
add_interface(mem_ctx, &ifs,
- local_interfaces);
+ local_interfaces, enable_ipv6);
}
/**
load the list of network interfaces
**/
-void load_interface_list(TALLOC_CTX *mem_ctx, const char **interfaces, struct interface **local_interfaces)
+void load_interface_list(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx, struct interface **local_interfaces)
{
- const char **ptr = interfaces;
+ const char **ptr = lpcfg_interfaces(lp_ctx);
int i;
struct iface_struct *ifaces;
int total_probed;
+ bool enable_ipv6 = lpcfg_parm_bool(lp_ctx, NULL, "ipv6", "enable", false);
*local_interfaces = NULL;
@@ -303,13 +310,13 @@ void load_interface_list(TALLOC_CTX *mem_ctx, const char **interfaces, struct in
}
for (i=0;i<total_probed;i++) {
if (!is_loopback_addr((struct sockaddr *)&ifaces[i].ip)) {
- add_interface(mem_ctx, &ifaces[i], local_interfaces);
+ add_interface(mem_ctx, &ifaces[i], local_interfaces, enable_ipv6);
}
}
}
while (ptr && *ptr) {
- interpret_interface(mem_ctx, *ptr, ifaces, total_probed, local_interfaces);
+ interpret_interface(mem_ctx, *ptr, ifaces, total_probed, local_interfaces, enable_ipv6);
ptr++;
}
@@ -478,7 +485,9 @@ const char **iface_list_wildcard(TALLOC_CTX *mem_ctx, struct loadparm_context *l
if (ret == NULL) return NULL;
#ifdef HAVE_IPV6
- return str_list_add(ret, "::");
+ if (lpcfg_parm_bool(lp_ctx, NULL, "ipv6", "enable", false)) {
+ return str_list_add(ret, "::");
+ }
#endif
return ret;