Skip to content

Commit 3d3d834

Browse files
committed
Merge #18359: build: fix sysctl() detection on macOS
e90e3e6 build: fix sysctl() detection on macOS (fanquake) Pull request description: [`sysctl()` on *BSD](https://www.unix.com/man-page/FreeBSD/3/sysctl/) takes a "const int *name", whereas [`sysctl()` on macOS](https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/sysctl.3.html) it takes an "int *name". So our configure check and `sysctl()` detection on macOS currently fails: ```bash /usr/include/sys/sysctl.h:759:9: note: candidate function not viable: no known conversion from 'const int [2]' to 'int *' for 1st argument int sysctl(int *, u_int, void *, size_t *, void *, size_t); ``` The simplest change seems to be to change the param to a "int *name", which will work during configure on macOS and *BSD systems. For consistency I've changed both calls, but note that macOS doesn't have `KERN_ARND`, so that check will always fail regardless. We can revert/add documentation if preferred. ACKs for top commit: laanwj: Re-ACK e90e3e6 Tree-SHA512: 29e9348136fc72882f63079bf10d2490e845d7656aae2c003e282bea49dd2778204a7776a67086bd88c2852af9a07dd04ba358eede7e37029e1c10f73c85d6a5
2 parents 67de1ee + e90e3e6 commit 3d3d834

File tree

2 files changed

+8
-6
lines changed

2 files changed

+8
-6
lines changed

configure.ac

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -935,19 +935,21 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <unistd.h>
935935
AC_MSG_CHECKING(for sysctl)
936936
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
937937
#include <sys/sysctl.h>]],
938-
[[ static const int name[2] = {CTL_KERN, KERN_VERSION};
939-
#ifdef __linux__
938+
[[ #ifdef __linux__
940939
#error "Don't use sysctl on Linux, it's deprecated even when it works"
941940
#endif
942-
sysctl(name, 2, nullptr, nullptr, nullptr, 0); ]])],
941+
sysctl(nullptr, 2, nullptr, nullptr, nullptr, 0); ]])],
943942
[ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_SYSCTL, 1,[Define this symbol if the BSD sysctl() is available]) ],
944943
[ AC_MSG_RESULT(no)]
945944
)
946945

947946
AC_MSG_CHECKING(for sysctl KERN_ARND)
948947
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
949948
#include <sys/sysctl.h>]],
950-
[[ static const int name[2] = {CTL_KERN, KERN_ARND};
949+
[[ #ifdef __linux__
950+
#error "Don't use sysctl on Linux, it's deprecated even when it works"
951+
#endif
952+
static int name[2] = {CTL_KERN, KERN_ARND};
951953
sysctl(name, 2, nullptr, nullptr, nullptr, 0); ]])],
952954
[ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_SYSCTL_ARND, 1,[Define this symbol if the BSD sysctl(KERN_ARND) is available]) ],
953955
[ AC_MSG_RESULT(no)]

src/random.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -321,10 +321,10 @@ void GetOSRand(unsigned char *ent32)
321321
RandFailure();
322322
}
323323
#elif defined(HAVE_SYSCTL_ARND)
324-
/* FreeBSD and similar. It is possible for the call to return less
324+
/* FreeBSD, NetBSD and similar. It is possible for the call to return less
325325
* bytes than requested, so need to read in a loop.
326326
*/
327-
static const int name[2] = {CTL_KERN, KERN_ARND};
327+
static int name[2] = {CTL_KERN, KERN_ARND};
328328
int have = 0;
329329
do {
330330
size_t len = NUM_OS_RANDOM_BYTES - have;

0 commit comments

Comments
 (0)