summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKarel Zak2016-09-06 10:19:52 +0200
committerKarel Zak2016-09-06 10:19:52 +0200
commita55d646bd3986937cd3a8488b6abaf74b2b9e28a (patch)
tree1876ccdc638c24b8411b9825b8b844084b2a264d
parentsfdisk: add --no-tell-kernel (diff)
downloadkernel-qcow2-util-linux-a55d646bd3986937cd3a8488b6abaf74b2b9e28a.tar.gz
kernel-qcow2-util-linux-a55d646bd3986937cd3a8488b6abaf74b2b9e28a.tar.xz
kernel-qcow2-util-linux-a55d646bd3986937cd3a8488b6abaf74b2b9e28a.zip
lib/randutils: add xsrand() and rand_get_number()
Signed-off-by: Karel Zak <kzak@redhat.com>
-rw-r--r--include/randutils.h5
-rw-r--r--lib/randutils.c18
2 files changed, 20 insertions, 3 deletions
diff --git a/include/randutils.h b/include/randutils.h
index 17e2a02fa..7094a4c74 100644
--- a/include/randutils.h
+++ b/include/randutils.h
@@ -6,6 +6,11 @@
#define rand() random()
#endif
+/* rand() based */
+extern void xsrand(void);
+extern int rand_get_number(int low_n, int high_n);
+
+/* /dev/urandom based with fallback to rand() */
extern int random_get_fd(void);
extern void random_get_bytes(void *buf, size_t nbytes);
extern const char *random_tell_source(void);
diff --git a/lib/randutils.c b/lib/randutils.c
index 684ac0ac1..2e124bcb6 100644
--- a/lib/randutils.c
+++ b/lib/randutils.c
@@ -30,12 +30,24 @@
THREAD_LOCAL unsigned short ul_jrand_seed[3];
#endif
+void xsrand(void)
+{
+ struct timeval tv;
+
+ gettimeofday(&tv, 0);
+ srand((getpid() << 16) ^ getuid() ^ tv.tv_sec ^ tv.tv_usec);
+}
+
+int rand_get_number(int low_n, int high_n)
+{
+ return rand() % (high_n - low_n + 1) + low_n;
+}
+
int random_get_fd(void)
{
int i, fd;
- struct timeval tv;
+ struct timeval tv;
- gettimeofday(&tv, 0);
fd = open("/dev/urandom", O_RDONLY | O_CLOEXEC);
if (fd == -1)
fd = open("/dev/random", O_RDONLY | O_NONBLOCK | O_CLOEXEC);
@@ -44,7 +56,7 @@ int random_get_fd(void)
if (i >= 0)
fcntl(fd, F_SETFD, i | FD_CLOEXEC);
}
- srand((getpid() << 16) ^ getuid() ^ tv.tv_sec ^ tv.tv_usec);
+ xsrand();
#ifdef DO_JRAND_MIX
ul_jrand_seed[0] = getpid() ^ (tv.tv_sec & 0xFFFF);