/* GPLv2 or OpenIB.org BSD (MIT) See COPYING file */ #include #include #include #include #include #include #include #include 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; }