X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flib%2Frandom.c;fp=src%2Flib%2Frandom.c;h=d4ffa6df216d0b43c56101ea85839020512e4d61;hb=cf2f40d622b3d18afaf03142dc234de3b6a40c81;hp=39452a99666246ae33ccd96da58eaf62aefe7b97;hpb=aec1ddcd754c778a713b8cd5593c0a304db9d50b;p=pintos-anon diff --git a/src/lib/random.c b/src/lib/random.c index 39452a9..d4ffa6d 100644 --- a/src/lib/random.c +++ b/src/lib/random.c @@ -1,9 +1,11 @@ #include "random.h" +#include #include /* RC4-based pseudo-random state. */ static uint8_t s[256]; static uint8_t s_i, s_j; +static bool inited; static inline void swap_byte (uint8_t *a, uint8_t *b) @@ -13,27 +15,26 @@ swap_byte (uint8_t *a, uint8_t *b) *b = t; } -static uint8_t -key_byte (int idx) -{ - return idx ^ 0xff; -} - void -random_init (void) +random_init (unsigned seed) { + uint8_t *seedp = (uint8_t *) &seed; int i; uint8_t j; + if (inited) + return; + for (i = 0; i < 256; i++) s[i] = i; for (i = j = 0; i < 256; i++) { - j += s[i] + key_byte (i); + j += s[i] + seedp[i % sizeof seed]; swap_byte (s + i, s + j); } s_i = s_j = 0; + inited = true; } void