summaryrefslogtreecommitdiff
path: root/net/openntpd/files/patch-src_server.c
blob: 8fde14f996083dcc88b3788bd4c34d8788c0808e (plain) (blame)
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
--- src/server.c.orig	2016-05-30 22:50:02 UTC
+++ src/server.c
@@ -35,8 +35,8 @@ setup_listeners(struct servent *se, stru
 	struct listen_addr	*la, *nla, *lap;
 	struct ifaddrs		*ifa, *ifap;
 	struct sockaddr		*sa;
-#ifdef SO_RTABLE
-	struct if_data		*ifd;
+#ifdef SO_SETFIB
+	struct ifreq		 ifr;
 #endif
 	u_int8_t		*a6;
 	size_t			 sa6len = sizeof(struct in6_addr);
@@ -45,8 +45,8 @@ setup_listeners(struct servent *se, stru
 #ifdef IPV6_V6ONLY
 	int			 on = 1;
 #endif
-#ifdef SO_RTABLE
-	int			 rdomain = 0;
+#ifdef SO_SETFIB
+	int			 rdomain, fd;
 #endif
 
 	TAILQ_FOREACH(lap, &lconf->listen_addrs, entry) {
@@ -59,16 +59,20 @@ 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
+#ifdef SO_SETFIB
+				strlcpy(ifr.ifr_name, ifap->ifa_name,
+				    sizeof(ifr.ifr_name));
+
+				fd = socket(AF_INET, SOCK_DGRAM, 0);
+				if (ioctl(fd, SIOCGIFFIB, (caddr_t)&ifr) == -1)
+					rdomain = 0;
+				else
+					rdomain = ifr.ifr_fib;
+				close(fd);
+
 				if (lap->rtable != -1 && rdomain != lap->rtable)
 					continue;
 #endif
@@ -90,7 +94,7 @@ setup_listeners(struct servent *se, stru
 					fatal("setup_listeners calloc");
 
 				memcpy(&la->sa, sa, SA_LEN(sa));
-#ifdef SO_RTABLE
+#ifdef SO_SETFIB
 				la->rtable = rdomain;
 #endif
 
@@ -143,11 +147,11 @@ setup_listeners(struct servent *se, stru
 			log_warn("setsockopt IPV6_V6ONLY");
 #endif
 
-#ifdef SO_RTABLE
+#ifdef SO_SETFIB
 		if (la->rtable != -1 &&
-		    setsockopt(la->fd, SOL_SOCKET, SO_RTABLE, &la->rtable,
+		    setsockopt(la->fd, SOL_SOCKET, SO_SETFIB, &la->rtable,
 		    sizeof(la->rtable)) == -1)
-			fatal("setup_listeners setsockopt SO_RTABLE");
+			fatal("setup_listeners setsockopt SO_SETFIB");
 #endif
 
 		if (bind(la->fd, (struct sockaddr *)&la->sa,