mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-25 02:33:24 -03:00
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:
parent
a421e0a22f
commit
e90e3e684f
2 changed files with 8 additions and 6 deletions
10
configure.ac
10
configure.ac
|
@ -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)]
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue