| /* GPLv2 or OpenIB.org BSD (MIT) See COPYING file */ | |
| #include <stdlib.h> | |
| #include <string.h> | |
| #include <sys/random.h> | |
| #include <sys/types.h> | |
| #include <time.h> | |
| #include <util/util.h> | |
| #include <unistd.h> | |
| #include <fcntl.h> | |
| int set_fd_nonblock(int fd, bool nonblock) | |
| { | |
| int val; | |
| val = fcntl(fd, F_GETFL); | |
| if (val == -1) | |
| return -1; | |
| if (nonblock) | |
| val |= O_NONBLOCK; | |
| else | |
| val &= ~(unsigned int)(O_NONBLOCK); | |
| if (fcntl(fd, F_SETFL, val) == -1) | |
| return -1; | |
| return 0; | |
| } | |
| #ifndef GRND_INSECURE | |
| #define GRND_INSECURE 0x0004 | |
| #endif | |
| unsigned int get_random(void) | |
| { | |
| static unsigned int seed; | |
| ssize_t sz; | |
| if (!seed) { | |
| sz = getrandom(&seed, sizeof(seed), | |
| GRND_NONBLOCK | GRND_INSECURE); | |
| if (sz < 0) | |
| sz = getrandom(&seed, sizeof(seed), GRND_NONBLOCK); | |
| if (sz != sizeof(seed)) | |
| seed = time(NULL); | |
| } | |
| return rand_r(&seed); | |
| } | |
| bool check_env(const char *var) | |
| { | |
| const char *env_value = getenv(var); | |
| return env_value && (strcmp(env_value, "0") != 0); | |
| } | |
| /* Xorshift random number generator */ | |
| uint32_t xorshift32(struct xorshift32_state *state) | |
| { | |
| /* Algorithm "xor" from p. 4 of Marsaglia, "Xorshift RNGs" */ | |
| uint32_t x = state->seed;; | |
| x ^= x << 13; | |
| x ^= x >> 17; | |
| x ^= x << 5; | |
| return state->seed = x; | |
| } |