blob: 7e5f00c3aea52421e083ba1463e70e8c25e1a3d4 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
$FreeBSD$
--- stun.cxx
+++ stun.cxx
@@ -648,55 +648,13 @@
stunRand()
{
// return 32 bits of random stuff
- assert( sizeof(int) == 4 );
static bool init=false;
- if ( !init )
- {
+ if ( !init ) {
+ srandomdev();
init = true;
-
- UInt64 tick;
-
-#if defined(WIN32)
- volatile unsigned int lowtick=0,hightick=0;
- __asm
- {
- rdtsc
- mov lowtick, eax
- mov hightick, edx
- }
- tick = hightick;
- tick <<= 32;
- tick |= lowtick;
-#elif defined(__GNUC__) && ( defined(__i686__) || defined(__i386__) )
- asm("rdtsc" : "=A" (tick));
-#elif defined (__SUNPRO_CC) || defined( __sparc__ )
- tick = gethrtime();
-#elif defined(__MACH__)
- int fd=open("/dev/random",O_RDONLY);
- read(fd,&tick,sizeof(tick));
- closesocket(fd);
-#else
-# error Need some way to seed the random number generator
-#endif
- int seed = int(tick);
-#ifdef WIN32
- srand(seed);
-#else
- srandom(seed);
-#endif
}
-
-#ifdef WIN32
- assert( RAND_MAX == 0x7fff );
- int r1 = rand();
- int r2 = rand();
-
- int ret = (r1<<16) + r2;
-
- return ret;
-#else
- return random();
-#endif
+ /* random() is described as returning 0...2**31-1 */
+ return 0xffffffff & ( ( random() << 31 ) | random() );
}
|