From 0ec5710f4872d4feb8ff96b61d4d4a7ca0fa7b09 Mon Sep 17 00:00:00 2001 From: Brent Cook Date: Tue, 30 Dec 2014 09:05:46 -0600 Subject: [PATCH 07/12] check if rdomain support is available --- src/usr.sbin/ntpd/client.c | 4 ++++ src/usr.sbin/ntpd/parse.y | 2 ++ src/usr.sbin/ntpd/server.c | 11 ++++++++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/usr.sbin/ntpd/client.c b/src/usr.sbin/ntpd/client.c index e59112a..9b9b522 100644 --- a/src/usr.sbin/ntpd/client.c +++ b/src/usr.sbin/ntpd/client.c @@ -142,10 +142,12 @@ client_query(struct ntp_peer *p) 0)) == -1) fatal("client_query socket"); +#ifdef SO_RTABLE if (p->rtable != -1 && setsockopt(p->query->fd, SOL_SOCKET, SO_RTABLE, &p->rtable, sizeof(p->rtable)) == -1) fatal("client_query setsockopt SO_RTABLE"); +#endif if (connect(p->query->fd, sa, SA_LEN(sa)) == -1) { if (errno == ECONNREFUSED || errno == ENETUNREACH || errno == EHOSTUNREACH || errno == EADDRNOTAVAIL) { @@ -248,10 +250,12 @@ client_dispatch(struct ntp_peer *p, u_int8_t settime) return (0); } +#ifdef SO_RTABLE if (p->rtable != -1 && setsockopt(p->query->fd, SOL_SOCKET, SO_RTABLE, &p->rtable, sizeof(p->rtable)) == -1) fatal("client_dispatch setsockopt SO_RTABLE"); +#endif for (cmsg = CMSG_FIRSTHDR(&somsg); cmsg != NULL; cmsg = CMSG_NXTHDR(&somsg, cmsg)) { diff --git a/src/usr.sbin/ntpd/parse.y b/src/usr.sbin/ntpd/parse.y index fb6e2f1..3f4065f 100644 --- a/src/usr.sbin/ntpd/parse.y +++ b/src/usr.sbin/ntpd/parse.y @@ -313,10 +313,12 @@ 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 2dbb01f..3c74c24 100644 --- a/src/usr.sbin/ntpd/server.c +++ b/src/usr.sbin/ntpd/server.c @@ -39,7 +39,10 @@ setup_listeners(struct servent *se, struct ntpd_conf *lconf, u_int *cnt) u_int8_t *a6; size_t sa6len = sizeof(struct in6_addr); u_int new_cnt = 0; - int tos = IPTOS_LOWDELAY, rdomain, fd; + int tos = IPTOS_LOWDELAY; +#ifdef SO_RTABLE + int rdomain, fd; +#endif TAILQ_FOREACH(lap, &lconf->listen_addrs, entry) { switch (lap->sa.ss_family) { @@ -59,6 +62,7 @@ setup_listeners(struct servent *se, struct ntpd_conf *lconf, u_int *cnt) strlcpy(ifr.ifr_name, ifap->ifa_name, sizeof(ifr.ifr_name)); +#ifdef SO_RTABLE fd = socket(AF_INET, SOCK_DGRAM, 0); if (ioctl(fd, SIOCGIFRDOMAIN, (caddr_t)&ifr) == -1) @@ -69,6 +73,7 @@ setup_listeners(struct servent *se, struct ntpd_conf *lconf, u_int *cnt) if (lap->rtable != -1 && rdomain != lap->rtable) continue; +#endif if (sa->sa_family == AF_INET && ((struct sockaddr_in *)sa)->sin_addr.s_addr == @@ -87,7 +92,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); } @@ -132,10 +139,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) { -- 1.9.1