1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
--- src/server.c.orig 2016-03-28 13:51:51 UTC
+++ src/server.c
@@ -36,14 +36,14 @@ setup_listeners(struct servent *se, stru
struct ifaddrs *ifa, *ifap;
struct sockaddr *sa;
#ifdef SO_RTABLE
- struct if_data *ifd;
+ struct ifreq ifr;
#endif
u_int8_t *a6;
size_t sa6len = sizeof(struct in6_addr);
u_int new_cnt = 0;
int tos = IPTOS_LOWDELAY;
#ifdef SO_RTABLE
- int rdomain = 0;
+ int rdomain, fd;
#endif
TAILQ_FOREACH(lap, &lconf->listen_addrs, entry) {
@@ -56,16 +56,21 @@ setup_listeners(struct servent *se, stru
sa = ifap->ifa_addr;
if (sa == NULL || SA_LEN(sa) == 0)
continue;
-#ifdef SO_RTABLE
- if (sa->sa_family == AF_LINK) {
- ifd = ifap->ifa_data;
- rdomain = ifd->ifi_rdomain;
- }
-#endif
if (sa->sa_family != AF_INET &&
sa->sa_family != AF_INET6)
continue;
#ifdef SO_RTABLE
+ strlcpy(ifr.ifr_name, ifap->ifa_name,
+ sizeof(ifr.ifr_name));
+
+ fd = socket(AF_INET, SOCK_DGRAM, 0);
+ if (ioctl(fd, SIOCGIFRDOMAIN,
+ (caddr_t)&ifr) == -1)
+ rdomain = 0;
+ else
+ rdomain = ifr.ifr_rdomainid;
+ close(fd);
+
if (lap->rtable != -1 && rdomain != lap->rtable)
continue;
#endif
|