141
141
#elif (defined(LINUX) || defined(FREEBSD) || defined(__FreeBSD_kernel__) \
142
|| defined(NETBSD) || defined(__NetBSD_kernel__) || defined(OPENBSD))
142
|| defined(NETBSD) || defined(__NetBSD_kernel__) || defined(OPENBSD) \
143
144
#include <sys/types.h>
144
145
#include <sys/stat.h>
145
146
#include <fcntl.h>
147
static int fdDevRandom;
148
static PRCallOnceType coOpenDevRandom;
148
static int fdDevURandom;
149
static PRCallOnceType coOpenDevURandom;
150
static PRStatus OpenDevRandom( void )
151
static PRStatus OpenDevURandom( void )
152
fdDevRandom = open( "/dev/random", O_RDONLY );
153
return((-1 == fdDevRandom)? PR_FAILURE : PR_SUCCESS );
154
} /* end OpenDevRandom() */
153
fdDevURandom = open( "/dev/urandom", O_RDONLY );
154
return((-1 == fdDevURandom)? PR_FAILURE : PR_SUCCESS );
155
} /* end OpenDevURandom() */
156
static size_t GetDevRandom( void *buf, size_t size )
157
static size_t GetDevURandom( void *buf, size_t size )
161
rc = PR_CallOnce( &coOpenDevRandom, OpenDevRandom );
162
rc = PR_CallOnce( &coOpenDevURandom, OpenDevURandom );
162
163
if ( PR_FAILURE == rc ) {
163
164
_PR_MD_MAP_OPEN_ERROR( errno );
167
bytesIn = read( fdDevRandom, buf, size );
168
bytesIn = read( fdDevURandom, buf, size );
168
169
if ( -1 == bytesIn ) {
169
170
_PR_MD_MAP_READ_ERROR( errno );
173
174
return( bytesIn );
174
} /* end GetDevRandom() */
175
} /* end GetDevURandom() */
177
178
GetHighResClock(void *buf, size_t maxbytes)
179
return(GetDevRandom( buf, maxbytes ));
180
return(GetDevURandom( buf, maxbytes ));
182
183
#elif defined(NCR)