From 90f20063727b0fd73d78a4dbeff6dd04a1995f9d Mon Sep 17 00:00:00 2001 From: Guangyuan Yang Date: Fri, 14 Jan 2022 05:48:46 -0500 Subject: [PATCH] Fix build on FreeBSD The include directive of `netinet/in.h` must be before `resolv.h` on FreeBSD, otherwise, the following errors will occur: ``` In file included from dns.c:265: /usr/include/resolv.h:159:14: error: array has incomplete element type 'struct sockaddr_in' nsaddr_list[MAXNS]; /*%< address of name server */ ^ /usr/include/resolv.h:158:9: note: forward declaration of 'struct sockaddr_in' struct sockaddr_in ^ /usr/include/resolv.h:173:18: error: field has incomplete type 'struct in_addr' struct in_addr addr; ^ /usr/include/resolv.h:173:10: note: forward declaration of 'struct in_addr' struct in_addr addr; ^ /usr/include/resolv.h:198:21: error: field has incomplete type 'struct sockaddr_in' struct sockaddr_in sin; ^ /usr/include/resolv.h:158:9: note: forward declaration of 'struct sockaddr_in' struct sockaddr_in ^ 3 errors generated. ``` The reason is that the `resolv.h` on FreeBSD is not yet self-contained, see this bug report: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=182466 This fix was committed with the FreeBSD port `net/R-cran-pingr` in https://cgit.freebsd.org/ports/commit/?id=fce80f530301d0079d84bc4b818ba957ad29617b. --- src/dns.c | 2 +- src/rping.c | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/dns.c b/src/dns.c index aebc86e..52dde2f 100644 --- a/src/dns.c +++ b/src/dns.c @@ -262,8 +262,8 @@ SEXP r_nsl(SEXP hostname, SEXP server, SEXP class, SEXP type) { #else +#include // This needs to be before resolv.h for FreeBSD, see #19 #include -#include #include #include #include diff --git a/src/rping.c b/src/rping.c index 4ee6fa4..7d15a0d 100644 --- a/src/rping.c +++ b/src/rping.c @@ -40,6 +40,10 @@ void usleep(__int64 usec) { # define WINCLEANUP() #endif +#ifdef __FreeBSD__ +#include // This needs to be before resolv.h for FreeBSD, see #19 +#endif + #include #include #include