build: fix sysctl() detection on macOS

sysctl() on *BSD takes a "const int *name", whereas sysctl() on macOS
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);
```

This change removes the name argument from the sysctl() detection check,
meaning we will detect correctly on macOS and *BSD.

For consistency we also switch to using the more generic, non-const
version of the name parameter in the rest of our usage.
This commit is contained in:
fanquake 2020-03-16 17:20:27 +08:00
parent a421e0a22f
commit e90e3e684f
No known key found for this signature in database
GPG key ID: 2EEB9F5CC09526C1
2 changed files with 8 additions and 6 deletions

View file

@ -935,11 +935,10 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <unistd.h>
AC_MSG_CHECKING(for sysctl) AC_MSG_CHECKING(for sysctl)
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h> AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
#include <sys/sysctl.h>]], #include <sys/sysctl.h>]],
[[ static const int name[2] = {CTL_KERN, KERN_VERSION}; [[ #ifdef __linux__
#ifdef __linux__
#error "Don't use sysctl on Linux, it's deprecated even when it works" #error "Don't use sysctl on Linux, it's deprecated even when it works"
#endif #endif
sysctl(name, 2, nullptr, nullptr, nullptr, 0); ]])], sysctl(nullptr, 2, nullptr, nullptr, nullptr, 0); ]])],
[ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_SYSCTL, 1,[Define this symbol if the BSD sysctl() is available]) ], [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_SYSCTL, 1,[Define this symbol if the BSD sysctl() is available]) ],
[ AC_MSG_RESULT(no)] [ AC_MSG_RESULT(no)]
) )
@ -947,7 +946,10 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
AC_MSG_CHECKING(for sysctl KERN_ARND) AC_MSG_CHECKING(for sysctl KERN_ARND)
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h> AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
#include <sys/sysctl.h>]], #include <sys/sysctl.h>]],
[[ static const int name[2] = {CTL_KERN, KERN_ARND}; [[ #ifdef __linux__
#error "Don't use sysctl on Linux, it's deprecated even when it works"
#endif
static int name[2] = {CTL_KERN, KERN_ARND};
sysctl(name, 2, nullptr, nullptr, nullptr, 0); ]])], sysctl(name, 2, nullptr, nullptr, nullptr, 0); ]])],
[ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_SYSCTL_ARND, 1,[Define this symbol if the BSD sysctl(KERN_ARND) is available]) ], [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_SYSCTL_ARND, 1,[Define this symbol if the BSD sysctl(KERN_ARND) is available]) ],
[ AC_MSG_RESULT(no)] [ AC_MSG_RESULT(no)]

View file

@ -321,10 +321,10 @@ void GetOSRand(unsigned char *ent32)
RandFailure(); RandFailure();
} }
#elif defined(HAVE_SYSCTL_ARND) #elif defined(HAVE_SYSCTL_ARND)
/* FreeBSD and similar. It is possible for the call to return less /* FreeBSD, NetBSD and similar. It is possible for the call to return less
* bytes than requested, so need to read in a loop. * bytes than requested, so need to read in a loop.
*/ */
static const int name[2] = {CTL_KERN, KERN_ARND}; static int name[2] = {CTL_KERN, KERN_ARND};
int have = 0; int have = 0;
do { do {
size_t len = NUM_OS_RANDOM_BYTES - have; size_t len = NUM_OS_RANDOM_BYTES - have;