On Fri, Sep 06, 2019 at 11:04:44AM +0200, Tim Düsterhus wrote: > Willy, > Luca, > > Am 06.09.19 um 05:17 schrieb Willy Tarreau: > >> smp->data.type = SMP_T_STR; > >> smp->flags = SMP_F_MAY_CHANGE; > > Comparing this with the time fetches I believe there is 'SMP_F_VOL_TEST' > missing, no?
Yep good point. Also RAND_MAX is not the same on all platforms. We're used to having 31 bits on Linux, it's 15 bits only on others like Windows. I think we'd need to preload 128 bits of random into local variables based on RAND_MAX then use these variables to produce the output. It could be something more or less like this : uint32_t rnd[4] = { 0, 0, 0, 0 }; uint64_t last = 0; int byte = 0; int bits = 0; while (byte < 4) { while (bits < 32) { last |= (uint64_t)random() << bits; bits += my_flsl(RAND_MAX); } rnd[byte++] = last; last >>= 32; bits -= 32; } With something like this (modulo the bugs I wrote) you should end up with 128 bits available in rnd[] regardless of RAND_MAX. Willy