| @@ -144,6 +144,7 @@ check_include_file(stdint.h HAVE_STDINT_H) | |||||
| check_include_file(stdlib.h HAVE_STDLIB_H) | check_include_file(stdlib.h HAVE_STDLIB_H) | ||||
| check_include_file(sys/cdefs.h HAVE_SYS_CDEFS_H) | check_include_file(sys/cdefs.h HAVE_SYS_CDEFS_H) | ||||
| check_include_file(sys/param.h HAVE_SYS_PARAM_H) | check_include_file(sys/param.h HAVE_SYS_PARAM_H) | ||||
| check_include_file(sys/random.h HAVE_SYS_RANDOM_H) | |||||
| check_include_file(sys/stat.h HAVE_SYS_STAT_H) | check_include_file(sys/stat.h HAVE_SYS_STAT_H) | ||||
| check_include_file(xlocale.h HAVE_XLOCALE_H) | check_include_file(xlocale.h HAVE_XLOCALE_H) | ||||
| @@ -190,6 +191,9 @@ endif() | |||||
| if (HAVE_SYSLOG_H) | if (HAVE_SYSLOG_H) | ||||
| check_symbol_exists(vsyslog "syslog.h" HAVE_VSYSLOG) | check_symbol_exists(vsyslog "syslog.h" HAVE_VSYSLOG) | ||||
| endif() | endif() | ||||
| if (HAVE_SYS_RANDOM_H) | |||||
| check_symbol_exists(getrandom "sys/random.h" HAVE_GETRANDOM) | |||||
| endif() | |||||
| if (HAVE_SYS_RESOURCE_H) | if (HAVE_SYS_RESOURCE_H) | ||||
| check_symbol_exists(getrusage "sys/resource.h" HAVE_GETRUSAGE) | check_symbol_exists(getrusage "sys/resource.h" HAVE_GETRUSAGE) | ||||
| endif() | endif() | ||||
| @@ -56,6 +56,9 @@ | |||||
| /* Define to 1 if you have the <sys/param.h> header file. */ | /* Define to 1 if you have the <sys/param.h> header file. */ | ||||
| #cmakedefine HAVE_SYS_PARAM_H @HAVE_SYS_PARAM_H@ | #cmakedefine HAVE_SYS_PARAM_H @HAVE_SYS_PARAM_H@ | ||||
| /* Define to 1 if you have the <sys/random.h> header file. */ | |||||
| #cmakedefine HAVE_SYS_RANDOM_H | |||||
| /* Define to 1 if you have the <sys/resource.h> header file. */ | /* Define to 1 if you have the <sys/resource.h> header file. */ | ||||
| #cmakedefine HAVE_SYS_RESOURCE_H | #cmakedefine HAVE_SYS_RESOURCE_H | ||||
| @@ -140,6 +143,9 @@ | |||||
| /* Define to 1 if you have the `vsyslog' function. */ | /* Define to 1 if you have the `vsyslog' function. */ | ||||
| #cmakedefine HAVE_VSYSLOG @HAVE_VSYSLOG@ | #cmakedefine HAVE_VSYSLOG @HAVE_VSYSLOG@ | ||||
| /* Define if you have the `getrandom' function. */ | |||||
| #cmakedefine HAVE_GETRANDOM | |||||
| /* Define if you have the `getrusage' function. */ | /* Define if you have the `getrusage' function. */ | ||||
| #cmakedefine HAVE_GETRUSAGE | #cmakedefine HAVE_GETRUSAGE | ||||
| @@ -155,6 +155,40 @@ retry: | |||||
| #endif /* defined ENABLE_RDRAND */ | #endif /* defined ENABLE_RDRAND */ | ||||
| #ifdef HAVE_GETRANDOM | |||||
| #include <stdlib.h> | |||||
| #ifdef HAVE_SYS_RANDOM_H | |||||
| #include <sys/random.h> | |||||
| #endif | |||||
| static int get_getrandom_seed(void) | |||||
| { | |||||
| DEBUG_SEED("get_dev_random_seed"); | |||||
| int r; | |||||
| ssize_t ret; | |||||
| do { | |||||
| ret = getrandom(&r, sizeof(r), 0); | |||||
| } while ((ret == -1) && (errno == EINTR)); | |||||
| if (ret == -1) | |||||
| { | |||||
| if (errno == ENOSYS) /* syscall not available in kernel */ | |||||
| return -1; | |||||
| fprintf(stderr, "error from getrandom(): %s", strerror(errno)); | |||||
| exit(1); | |||||
| } | |||||
| if (ret != sizeof(r)) | |||||
| return -1; | |||||
| return r; | |||||
| } | |||||
| #endif /* defined HAVE_GETRANDOM */ | |||||
| /* has_dev_urandom */ | /* has_dev_urandom */ | ||||
| #if defined(__APPLE__) || defined(__unix__) || defined(__linux__) | #if defined(__APPLE__) || defined(__unix__) || defined(__linux__) | ||||
| @@ -283,6 +317,13 @@ 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_GETRANDOM | |||||
| { | |||||
| int seed = get_getrandom_seed(); | |||||
| if (seed != -1) | |||||
| return seed; | |||||
| } | |||||
| #endif | |||||
| #if defined HAVE_DEV_RANDOM && HAVE_DEV_RANDOM | #if defined HAVE_DEV_RANDOM && HAVE_DEV_RANDOM | ||||
| if (has_dev_urandom()) | if (has_dev_urandom()) | ||||
| return get_dev_random_seed(); | return get_dev_random_seed(); | ||||