version 1.1.1.3, 2016/11/02 09:57:01
|
version 1.1.1.4, 2021/03/17 00:56:46
|
Line 1
|
Line 1
|
/* dnsmasq is Copyright (c) 2000-2016 Simon Kelley | /* dnsmasq is Copyright (c) 2000-2021 Simon Kelley |
|
|
This program is free software; you can redistribute it and/or modify |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
it under the terms of the GNU General Public License as published by |
Line 31
|
Line 31
|
# include <net/if_var.h> |
# include <net/if_var.h> |
#endif |
#endif |
#include <netinet/in_var.h> |
#include <netinet/in_var.h> |
#ifdef HAVE_IPV6 | #include <netinet6/in6_var.h> |
# include <netinet6/in6_var.h> | |
#endif | |
|
|
#ifndef SA_SIZE |
#ifndef SA_SIZE |
#define SA_SIZE(sa) \ |
#define SA_SIZE(sa) \ |
Line 44
|
Line 42
|
|
|
#ifdef HAVE_BSD_NETWORK |
#ifdef HAVE_BSD_NETWORK |
static int del_family = 0; |
static int del_family = 0; |
static struct all_addr del_addr; | static union all_addr del_addr; |
#endif |
#endif |
|
|
#if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__) |
#if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__) |
Line 105 int arp_enumerate(void *parm, int (*callback)())
|
Line 103 int arp_enumerate(void *parm, int (*callback)())
|
int iface_enumerate(int family, void *parm, int (*callback)()) |
int iface_enumerate(int family, void *parm, int (*callback)()) |
{ |
{ |
struct ifaddrs *head, *addrs; |
struct ifaddrs *head, *addrs; |
int errsav, fd = -1, ret = 0; | int errsave, fd = -1, ret = 0; |
|
|
if (family == AF_UNSPEC) |
if (family == AF_UNSPEC) |
#if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__) |
#if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__) |
Line 121 int iface_enumerate(int family, void *parm, int (*call
|
Line 119 int iface_enumerate(int family, void *parm, int (*call
|
if (getifaddrs(&head) == -1) |
if (getifaddrs(&head) == -1) |
return 0; |
return 0; |
|
|
#if defined(HAVE_BSD_NETWORK) && defined(HAVE_IPV6) | #if defined(HAVE_BSD_NETWORK) |
if (family == AF_INET6) |
if (family == AF_INET6) |
fd = socket(PF_INET6, SOCK_DGRAM, 0); |
fd = socket(PF_INET6, SOCK_DGRAM, 0); |
#endif |
#endif |
Line 141 int iface_enumerate(int family, void *parm, int (*call
|
Line 139 int iface_enumerate(int family, void *parm, int (*call
|
struct in_addr addr, netmask, broadcast; |
struct in_addr addr, netmask, broadcast; |
addr = ((struct sockaddr_in *) addrs->ifa_addr)->sin_addr; |
addr = ((struct sockaddr_in *) addrs->ifa_addr)->sin_addr; |
#ifdef HAVE_BSD_NETWORK |
#ifdef HAVE_BSD_NETWORK |
if (del_family == AF_INET && del_addr.addr.addr4.s_addr == addr.s_addr) | if (del_family == AF_INET && del_addr.addr4.s_addr == addr.s_addr) |
continue; |
continue; |
#endif |
#endif |
netmask = ((struct sockaddr_in *) addrs->ifa_netmask)->sin_addr; |
netmask = ((struct sockaddr_in *) addrs->ifa_netmask)->sin_addr; |
Line 152 int iface_enumerate(int family, void *parm, int (*call
|
Line 150 int iface_enumerate(int family, void *parm, int (*call
|
if (!((*callback)(addr, iface_index, NULL, netmask, broadcast, parm))) |
if (!((*callback)(addr, iface_index, NULL, netmask, broadcast, parm))) |
goto err; |
goto err; |
} |
} |
#ifdef HAVE_IPV6 |
|
else if (family == AF_INET6) |
else if (family == AF_INET6) |
{ |
{ |
struct in6_addr *addr = &((struct sockaddr_in6 *) addrs->ifa_addr)->sin6_addr; |
struct in6_addr *addr = &((struct sockaddr_in6 *) addrs->ifa_addr)->sin6_addr; |
Line 162 int iface_enumerate(int family, void *parm, int (*call
|
Line 159 int iface_enumerate(int family, void *parm, int (*call
|
u32 valid = 0xffffffff, preferred = 0xffffffff; |
u32 valid = 0xffffffff, preferred = 0xffffffff; |
int flags = 0; |
int flags = 0; |
#ifdef HAVE_BSD_NETWORK |
#ifdef HAVE_BSD_NETWORK |
if (del_family == AF_INET6 && IN6_ARE_ADDR_EQUAL(&del_addr.addr.addr6, addr)) | if (del_family == AF_INET6 && IN6_ARE_ADDR_EQUAL(&del_addr.addr6, addr)) |
continue; |
continue; |
#endif |
#endif |
#if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__) |
#if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__) |
struct in6_ifreq ifr6; |
struct in6_ifreq ifr6; |
|
|
memset(&ifr6, 0, sizeof(ifr6)); |
memset(&ifr6, 0, sizeof(ifr6)); |
strncpy(ifr6.ifr_name, addrs->ifa_name, sizeof(ifr6.ifr_name)); | safe_strncpy(ifr6.ifr_name, addrs->ifa_name, sizeof(ifr6.ifr_name)); |
|
|
ifr6.ifr_addr = *((struct sockaddr_in6 *) addrs->ifa_addr); |
ifr6.ifr_addr = *((struct sockaddr_in6 *) addrs->ifa_addr); |
if (fd != -1 && ioctl(fd, SIOCGIFAFLAG_IN6, &ifr6) != -1) |
if (fd != -1 && ioctl(fd, SIOCGIFAFLAG_IN6, &ifr6) != -1) |
Line 219 int iface_enumerate(int family, void *parm, int (*call
|
Line 216 int iface_enumerate(int family, void *parm, int (*call
|
(int) preferred, (int)valid, parm))) |
(int) preferred, (int)valid, parm))) |
goto err; |
goto err; |
} |
} |
#endif /* HAVE_IPV6 */ |
|
|
|
#ifdef HAVE_DHCP6 |
#ifdef HAVE_DHCP6 |
else if (family == AF_LINK) |
else if (family == AF_LINK) |
Line 237 int iface_enumerate(int family, void *parm, int (*call
|
Line 233 int iface_enumerate(int family, void *parm, int (*call
|
ret = 1; |
ret = 1; |
|
|
err: |
err: |
errsav = errno; | errsave = errno; |
freeifaddrs(head); |
freeifaddrs(head); |
if (fd != -1) |
if (fd != -1) |
close(fd); |
close(fd); |
errno = errsav; | errno = errsave; |
|
|
return ret; |
return ret; |
} |
} |
Line 426 void route_sock(void)
|
Line 422 void route_sock(void)
|
{ |
{ |
del_family = sa->sa_family; |
del_family = sa->sa_family; |
if (del_family == AF_INET) |
if (del_family == AF_INET) |
del_addr.addr.addr4 = ((struct sockaddr_in *)sa)->sin_addr; | del_addr.addr4 = ((struct sockaddr_in *)sa)->sin_addr; |
#ifdef HAVE_IPV6 | |
else if (del_family == AF_INET6) |
else if (del_family == AF_INET6) |
del_addr.addr.addr6 = ((struct sockaddr_in6 *)sa)->sin6_addr; | del_addr.addr6 = ((struct sockaddr_in6 *)sa)->sin6_addr; |
#endif | |
else |
else |
del_family = 0; |
del_family = 0; |
} |
} |