mirror of
https://github.com/samba-team/samba.git
synced 2025-03-27 22:50:26 +03:00
Fix bug 5681: Do not limit the number of network interfaces
Jeremy as far as I can see there is no real technical reason to limit the number of interfaces. If you like this patch, can you please merge it to 3.4? If you don't please tell me :-) Thanks, Volker
This commit is contained in:
parent
67a2e62991
commit
bbbf9f13ad
@ -27,8 +27,6 @@
|
||||
#include "../replace/replace.h"
|
||||
#include "../replace/system/network.h"
|
||||
|
||||
#define MAX_INTERFACES 128
|
||||
|
||||
struct iface_struct {
|
||||
char name[16];
|
||||
int flags;
|
||||
@ -46,6 +44,6 @@ void make_bcast(struct sockaddr_storage *pss_out,
|
||||
void make_net(struct sockaddr_storage *pss_out,
|
||||
const struct sockaddr_storage *pss_in,
|
||||
const struct sockaddr_storage *nmask);
|
||||
int get_interfaces(struct iface_struct *ifaces, int max_interfaces);
|
||||
int get_interfaces(TALLOC_CTX *mem_ctx, struct iface_struct **pifaces);
|
||||
|
||||
#endif
|
||||
|
@ -492,7 +492,7 @@ static void interpret_interface(char *token)
|
||||
|
||||
void load_interfaces(void)
|
||||
{
|
||||
struct iface_struct ifaces[MAX_INTERFACES];
|
||||
struct iface_struct *ifaces = NULL;
|
||||
const char **ptr = lp_interfaces();
|
||||
int i;
|
||||
|
||||
@ -507,7 +507,7 @@ void load_interfaces(void)
|
||||
}
|
||||
|
||||
/* Probe the kernel for interfaces */
|
||||
total_probed = get_interfaces(ifaces, MAX_INTERFACES);
|
||||
total_probed = get_interfaces(talloc_tos(), &ifaces);
|
||||
|
||||
if (total_probed > 0) {
|
||||
probed_ifaces = (struct iface_struct *)memdup(ifaces,
|
||||
@ -517,6 +517,7 @@ void load_interfaces(void)
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
TALLOC_FREE(ifaces);
|
||||
|
||||
/* if we don't have a interfaces line then use all broadcast capable
|
||||
interfaces except loopback */
|
||||
@ -569,15 +570,17 @@ void gfree_interfaces(void)
|
||||
|
||||
bool interfaces_changed(void)
|
||||
{
|
||||
bool ret = false;
|
||||
int n;
|
||||
struct iface_struct ifaces[MAX_INTERFACES];
|
||||
struct iface_struct *ifaces = NULL;
|
||||
|
||||
n = get_interfaces(ifaces, MAX_INTERFACES);
|
||||
n = get_interfaces(talloc_tos(), &ifaces);
|
||||
|
||||
if ((n > 0 )&& (n != total_probed ||
|
||||
memcmp(ifaces, probed_ifaces, sizeof(ifaces[0])*n))) {
|
||||
return true;
|
||||
ret = true;
|
||||
}
|
||||
|
||||
return false;
|
||||
TALLOC_FREE(ifaces);
|
||||
return ret;
|
||||
}
|
||||
|
@ -123,10 +123,12 @@ void make_net(struct sockaddr_storage *pss_out,
|
||||
Get the netmask address for a local interface.
|
||||
****************************************************************************/
|
||||
|
||||
static int _get_interfaces(struct iface_struct *ifaces, int max_interfaces)
|
||||
static int _get_interfaces(TALLOC_CTX *mem_ctx, struct iface_struct **pifaces)
|
||||
{
|
||||
struct iface_struct *ifaces;
|
||||
struct ifaddrs *iflist = NULL;
|
||||
struct ifaddrs *ifptr = NULL;
|
||||
int count;
|
||||
int total = 0;
|
||||
size_t copy_size;
|
||||
|
||||
@ -134,10 +136,25 @@ static int _get_interfaces(struct iface_struct *ifaces, int max_interfaces)
|
||||
return -1;
|
||||
}
|
||||
|
||||
count = 0;
|
||||
for (ifptr = iflist; ifptr != NULL; ifptr = ifptr->ifa_next) {
|
||||
if (!ifptr->ifa_addr || !ifptr->ifa_netmask) {
|
||||
continue;
|
||||
}
|
||||
if (!(ifptr->ifa_flags & IFF_UP)) {
|
||||
continue;
|
||||
}
|
||||
count += 1;
|
||||
}
|
||||
|
||||
ifaces = talloc_array(mem_ctx, struct iface_struct, count);
|
||||
if (ifaces == NULL) {
|
||||
errno = ENOMEM;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Loop through interfaces, looking for given IP address */
|
||||
for (ifptr = iflist, total = 0;
|
||||
ifptr != NULL && total < max_interfaces;
|
||||
ifptr = ifptr->ifa_next) {
|
||||
for (ifptr = iflist; ifptr != NULL; ifptr = ifptr->ifa_next) {
|
||||
|
||||
memset(&ifaces[total], '\0', sizeof(ifaces[total]));
|
||||
|
||||
@ -147,13 +164,13 @@ static int _get_interfaces(struct iface_struct *ifaces, int max_interfaces)
|
||||
continue;
|
||||
}
|
||||
|
||||
ifaces[total].flags = ifptr->ifa_flags;
|
||||
|
||||
/* Check the interface is up. */
|
||||
if (!(ifaces[total].flags & IFF_UP)) {
|
||||
if (!(ifptr->ifa_flags & IFF_UP)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ifaces[total].flags = ifptr->ifa_flags;
|
||||
|
||||
#if defined(HAVE_IPV6)
|
||||
if (ifptr->ifa_addr->sa_family == AF_INET6) {
|
||||
copy_size = sizeof(struct sockaddr_in6);
|
||||
@ -183,6 +200,7 @@ static int _get_interfaces(struct iface_struct *ifaces, int max_interfaces)
|
||||
|
||||
freeifaddrs(iflist);
|
||||
|
||||
*pifaces = ifaces;
|
||||
return total;
|
||||
}
|
||||
|
||||
@ -250,14 +268,14 @@ static int iface_comp(struct iface_struct *i1, struct iface_struct *i2)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_interfaces(struct iface_struct *ifaces, int max_interfaces);
|
||||
/* this wrapper is used to remove duplicates from the interface list generated
|
||||
above */
|
||||
int get_interfaces(struct iface_struct *ifaces, int max_interfaces)
|
||||
int get_interfaces(TALLOC_CTX *mem_ctx, struct iface_struct **pifaces)
|
||||
{
|
||||
struct iface_struct *ifaces;
|
||||
int total, i, j;
|
||||
|
||||
total = _get_interfaces(ifaces, max_interfaces);
|
||||
total = _get_interfaces(mem_ctx, &ifaces);
|
||||
if (total <= 0) return total;
|
||||
|
||||
/* now we need to remove duplicates */
|
||||
@ -274,6 +292,7 @@ int get_interfaces(struct iface_struct *ifaces, int max_interfaces)
|
||||
}
|
||||
}
|
||||
|
||||
*pifaces = ifaces;
|
||||
return total;
|
||||
}
|
||||
|
||||
|
@ -1948,12 +1948,7 @@ bool is_myname_or_ipaddr(const char *s)
|
||||
return false;
|
||||
}
|
||||
|
||||
nics = TALLOC_ARRAY(ctx, struct iface_struct,
|
||||
MAX_INTERFACES);
|
||||
if (!nics) {
|
||||
return false;
|
||||
}
|
||||
n = get_interfaces(nics, MAX_INTERFACES);
|
||||
n = get_interfaces(talloc_tos(), &nics);
|
||||
for (i=0; i<n; i++) {
|
||||
if (sockaddr_equal((struct sockaddr *)&nics[i].ip, (struct sockaddr *)&ss)) {
|
||||
TALLOC_FREE(nics);
|
||||
|
Loading…
x
Reference in New Issue
Block a user