From bf0b1863713a24d6daa01038b4ab82ca75bb83d3 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Thu, 22 Jun 2017 16:25:34 +0200 Subject: [PATCH] Ignore ENOPROTOOPT on SO_REUSEPORT for RedHat --- common/socket.c | 7 +++++-- configure.ac-base | 10 ++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/common/socket.c b/common/socket.c index e8851b4cf..779fc02ef 100644 --- a/common/socket.c +++ b/common/socket.c @@ -219,11 +219,14 @@ if_register_socket(struct interface_info *info, int family, * respective interfaces. This does not (and should not) affect * DHCPv4 sockets; we can't yet support BSD sockets well, much * less multiple sockets. Make sense only with multicast. + * RedHat defines SO_REUSEPORT with a kernel which does not support + * it and returns ENOPROTOOPT so in this case ignore the error. */ if ((local_family == AF_INET6) && *do_multicast) { flag = 1; - if (setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, - (char *)&flag, sizeof(flag)) < 0) { + if ((setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, + (char *)&flag, sizeof(flag)) < 0) && + (errno != ENOPROTOOPT)) { log_fatal("Can't set SO_REUSEPORT option on dhcp " "socket: %m"); } diff --git a/configure.ac-base b/configure.ac-base index 284011e67..a189247a4 100644 --- a/configure.ac-base +++ b/configure.ac-base @@ -626,6 +626,16 @@ AC_CHECK_FUNCS(strlcat) # For HP/UX we need -lipv6 for if_nametoindex, perhaps others. AC_SEARCH_LIBS(if_nametoindex, [ipv6]) +# For some Solaris nanosleep is found by BIND in librt +have_nanosleep="no" +AC_CHECK_FUNC(nanosleep, have_nanosleep="yes") +if test "$have_nanosleep" = "no"; then + AC_CHECK_LIB(rt, nanosleep, have_nanosleep="rt") +fi +if test "$have_nanosleep" = "rt"; then + LIBS="-lrt $LIBS" +fi + # check for /dev/random (declares HAVE_DEV_RANDOM) AC_MSG_CHECKING(for random device) AC_ARG_WITH(randomdev, -- 2.47.2