]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: introduce i_rand_limit() and i_rand_minmax()
authorJosef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
Mon, 18 Sep 2017 10:55:08 +0000 (13:55 +0300)
committerAki Tuomi <aki.tuomi@dovecot.fi>
Tue, 19 Sep 2017 09:37:41 +0000 (12:37 +0300)
src/lib/lib.h
src/lib/rand.c

index e795101e4dbe8e2f2ab046c5e6ff4e53586a7dec..a02fbb1f7c0ef90bfa3f2f378af7dd5dc5b8541f 100644 (file)
@@ -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
index 781a38f6bc47cbb13df8d1bd3dbcbbf51f82e618..e9f3cfad7adcf4c640e4381260067334637d6173 100644 (file)
@@ -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