From cc20e4c83593f1fc5f6616b944a30a51afe94730 Mon Sep 17 00:00:00 2001
From: Brent Cook <busterb@gmail.com>
Date: Tue, 30 Dec 2014 09:05:46 -0600
Subject: [PATCH 04/12] check if rdomain support is available.

Handle FreeBSD's calling rdomain 'FIB'.
 - from naddy@openbsd.org
---
 src/usr.sbin/ntpd/ntpd.h   |  6 ++++++
 src/usr.sbin/ntpd/parse.y  |  2 ++
 src/usr.sbin/ntpd/server.c | 15 ++++++++++++++-
 3 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/src/usr.sbin/ntpd/ntpd.h b/src/usr.sbin/ntpd/ntpd.h
index 3089c14..1d46c6c 100644
--- a/src/usr.sbin/ntpd/ntpd.h
+++ b/src/usr.sbin/ntpd/ntpd.h
@@ -40,6 +40,12 @@
 #define DRIFTFILE	"/var/db/ntpd.drift"
 #define	CTLSOCKET	"/var/run/ntpd.sock"
 
+#if defined(SO_SETFIB)
+#define	SO_RTABLE	SO_SETFIB
+#define	SIOCGIFRDOMAIN	SIOCGIFFIB
+#define	ifr_rdomainid	ifr_fib
+#endif
+
 #define	INTERVAL_QUERY_NORMAL		30	/* sync to peers every n secs */
 #define	INTERVAL_QUERY_PATHETIC		60
 #define	INTERVAL_QUERY_AGGRESSIVE	5
diff --git a/src/usr.sbin/ntpd/parse.y b/src/usr.sbin/ntpd/parse.y
index 6d50795..33fe13d 100644
--- a/src/usr.sbin/ntpd/parse.y
+++ b/src/usr.sbin/ntpd/parse.y
@@ -404,11 +404,13 @@ weight		: WEIGHT NUMBER	{
 			opts.weight = $2;
 		}
 rtable		: RTABLE NUMBER {
+#ifdef RT_TABLEID_MAX
 			if ($2 < 0 || $2 > RT_TABLEID_MAX) {
 				yyerror("rtable must be between 1"
 				    " and RT_TABLEID_MAX");
 				YYERROR;
 			}
+#endif
 			opts.rtable = $2;
 		}
 		;
diff --git a/src/usr.sbin/ntpd/server.c b/src/usr.sbin/ntpd/server.c
index fb297d7..2e28b9b 100644
--- a/src/usr.sbin/ntpd/server.c
+++ b/src/usr.sbin/ntpd/server.c
@@ -35,11 +35,16 @@ setup_listeners(struct servent *se, struct ntpd_conf *lconf, u_int *cnt)
 	struct listen_addr	*la, *nla, *lap;
 	struct ifaddrs		*ifa, *ifap;
 	struct sockaddr		*sa;
+#ifdef SO_RTABLE
 	struct if_data		*ifd;
+#endif
 	u_int8_t		*a6;
 	size_t			 sa6len = sizeof(struct in6_addr);
 	u_int			 new_cnt = 0;
-	int			 tos = IPTOS_LOWDELAY, rdomain = 0;
+	int			 tos = IPTOS_LOWDELAY;
+#ifdef SO_RTABLE
+	int			 rdomain = 0;
+#endif
 
 	TAILQ_FOREACH(lap, &lconf->listen_addrs, entry) {
 		switch (lap->sa.ss_family) {
@@ -51,15 +56,19 @@ setup_listeners(struct servent *se, struct ntpd_conf *lconf, u_int *cnt)
 				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
 				if (lap->rtable != -1 && rdomain != lap->rtable)
 					continue;
+#endif
 
 				if (sa->sa_family == AF_INET &&
 				    ((struct sockaddr_in *)sa)->sin_addr.s_addr ==
@@ -78,7 +87,9 @@ setup_listeners(struct servent *se, struct ntpd_conf *lconf, u_int *cnt)
 					fatal("setup_listeners calloc");
 
 				memcpy(&la->sa, sa, SA_LEN(sa));
+#ifdef SO_RTABLE
 				la->rtable = rdomain;
+#endif
 
 				TAILQ_INSERT_TAIL(&lconf->listen_addrs, la, entry);
 			}
@@ -123,10 +134,12 @@ setup_listeners(struct servent *se, struct ntpd_conf *lconf, u_int *cnt)
 		    IPPROTO_IP, IP_TOS, &tos, sizeof(tos)) == -1)
 			log_warn("setsockopt IPTOS_LOWDELAY");
 
+#ifdef SO_RTABLE
 		if (la->rtable != -1 &&
 		    setsockopt(la->fd, SOL_SOCKET, SO_RTABLE, &la->rtable,
 		    sizeof(la->rtable)) == -1)
 			fatal("setup_listeners setsockopt SO_RTABLE");
+#endif
 
 		if (bind(la->fd, (struct sockaddr *)&la->sa,
 		    SA_LEN((struct sockaddr *)&la->sa)) == -1) {
-- 
2.7.0