| @@ -170,6 +170,17 @@ check_symbol_exists(vasprintf "stdio.h" HAVE_VASPRINTF) | |||||
| check_symbol_exists(vsnprintf "stdio.h" HAVE_VSNPRINTF) | check_symbol_exists(vsnprintf "stdio.h" HAVE_VSNPRINTF) | ||||
| check_symbol_exists(vprintf "stdio.h" HAVE_VPRINTF) | check_symbol_exists(vprintf "stdio.h" HAVE_VPRINTF) | ||||
| check_symbol_exists(arc4random "stdlib.h" HAVE_ARC4RANDOM) | |||||
| if (NOT HAVE_ARC4RANDOM) | |||||
| check_include_file(bsd/stdlib.h HAVE_BSD_STDLIB_H) | |||||
| if (HAVE_BSD_STDLIB_H) | |||||
| list(APPEND CMAKE_REQUIRED_LIBRARIES "-lbsd") | |||||
| link_libraries(bsd) | |||||
| unset(HAVE_ARC4RANDOM CACHE) | |||||
| check_symbol_exists(arc4random "bsd/stdlib.h" HAVE_ARC4RANDOM) | |||||
| endif() | |||||
| endif() | |||||
| if (HAVE_FCNTL_H) | if (HAVE_FCNTL_H) | ||||
| check_symbol_exists(open "fcntl.h" HAVE_OPEN) | check_symbol_exists(open "fcntl.h" HAVE_OPEN) | ||||
| endif() | endif() | ||||
| @@ -74,6 +74,12 @@ | |||||
| /* Define to 1 if you have the <xlocale.h> header file. */ | /* Define to 1 if you have the <xlocale.h> header file. */ | ||||
| #cmakedefine HAVE_XLOCALE_H | #cmakedefine HAVE_XLOCALE_H | ||||
| /* Define to 1 if you have the <bsd/stdlib.h> header file. */ | |||||
| #cmakedefine HAVE_BSD_STDLIB_H | |||||
| /* Define to 1 if you have `arc4random' */ | |||||
| #cmakedefine HAVE_ARC4RANDOM | |||||
| /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ | /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ | ||||
| #cmakedefine HAVE_DOPRNT | #cmakedefine HAVE_DOPRNT | ||||
| @@ -13,6 +13,10 @@ | |||||
| #include "config.h" | #include "config.h" | ||||
| #include "strerror_override.h" | #include "strerror_override.h" | ||||
| #include <stdio.h> | #include <stdio.h> | ||||
| #include <stdlib.h> | |||||
| #ifdef HAVE_BSD_STDLIB_H | |||||
| #include <bsd/stdlib.h> | |||||
| #endif | |||||
| #define DEBUG_SEED(s) | #define DEBUG_SEED(s) | ||||
| @@ -168,7 +172,8 @@ static int get_getrandom_seed(int *seed) | |||||
| ssize_t ret; | ssize_t ret; | ||||
| do { | |||||
| do | |||||
| { | |||||
| ret = getrandom(seed, sizeof(*seed), GRND_NONBLOCK); | ret = getrandom(seed, sizeof(*seed), GRND_NONBLOCK); | ||||
| } while ((ret == -1) && (errno == EINTR)); | } while ((ret == -1) && (errno == EINTR)); | ||||
| @@ -273,7 +278,7 @@ static int get_cryptgenrandom_seed(int *seed) | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| BOOL ret = CryptGenRandom(hProvider, sizeof(*seed), (BYTE*)seed); | |||||
| BOOL ret = CryptGenRandom(hProvider, sizeof(*seed), (BYTE *)seed); | |||||
| CryptReleaseContext(hProvider, 0); | CryptReleaseContext(hProvider, 0); | ||||
| if (!ret) | if (!ret) | ||||
| { | { | ||||
| @@ -310,6 +315,10 @@ int json_c_get_random_seed(void) | |||||
| if (has_rdrand()) | if (has_rdrand()) | ||||
| return get_rdrand_seed(); | return get_rdrand_seed(); | ||||
| #endif | #endif | ||||
| #ifdef HAVE_ARC4RANDOM | |||||
| /* arc4random never fails, so use it if it's available */ | |||||
| return arc4random(); | |||||
| #endif | |||||
| #ifdef HAVE_GETRANDOM | #ifdef HAVE_GETRANDOM | ||||
| if (get_getrandom_seed(&seed) == 0) | if (get_getrandom_seed(&seed) == 0) | ||||
| return seed; | return seed; | ||||