blob: ef56212ac50d52cb5ffd61eac9a0f0a3074f2688 [file] [log] [blame]
/* 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;
}