From: Josef 'Jeff' Sipek Date: Mon, 18 Sep 2017 10:55:08 +0000 (+0300) Subject: lib: introduce i_rand_limit() and i_rand_minmax() X-Git-Tag: 2.3.0.rc1~993 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=747bf5bf77512daeac551a762f6a7669769f6ca1;p=thirdparty%2Fdovecot%2Fcore.git lib: introduce i_rand_limit() and i_rand_minmax() --- diff --git a/src/lib/lib.h b/src/lib/lib.h index e795101e4d..a02fbb1f7c 100644 --- a/src/lib/lib.h +++ b/src/lib/lib.h @@ -90,5 +90,14 @@ bool lib_is_initialized(void); void lib_deinit(void); uint32_t i_rand(void); +/* Returns a random integer < upper_bound. */ +uint32_t i_rand_limit(uint32_t upper_bound); + +/* Returns a random integer >= min_val, and <= max_val. */ +static inline uint32_t i_rand_minmax(uint32_t min_val, uint32_t max_val) +{ + i_assert(min_val <= max_val); + return min_val + i_rand_limit(max_val - min_val + 1); +} #endif diff --git a/src/lib/rand.c b/src/lib/rand.c index 781a38f6bc..e9f3cfad7a 100644 --- a/src/lib/rand.c +++ b/src/lib/rand.c @@ -12,6 +12,11 @@ uint32_t i_rand(void) { return arc4random(); } + +uint32_t i_rand_limit(uint32_t upper_bound) +{ + return arc4random_uniform(upper_bound); +} #else uint32_t i_rand(void) { @@ -19,4 +24,10 @@ uint32_t i_rand(void) random_fill(&value, sizeof(value)); return value; } + +uint32_t i_rand_limit(uint32_t upper_bound) +{ + /* FIXME: This simple implementation suffers from modulo-bias. */ + return i_rand() % upper_bound; +} #endif