summaryrefslogtreecommitdiff
path: root/db/nonce.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'db/nonce.cpp')
-rw-r--r--db/nonce.cpp54
1 files changed, 31 insertions, 23 deletions
diff --git a/db/nonce.cpp b/db/nonce.cpp
index 519cfaa..6f35c79 100644
--- a/db/nonce.cpp
+++ b/db/nonce.cpp
@@ -17,22 +17,25 @@
#include "pch.h"
#include "nonce.h"
+#include "../util/time_support.h"
extern int do_md5_test(void);
namespace mongo {
-
- Security::Security() {
- static int n;
- massert( 10352 , "Security is a singleton class", ++n == 1);
- init();
- }
- void Security::init(){
- if( _initialized ) return;
- _initialized = true;
+ BOOST_STATIC_ASSERT( sizeof(nonce) == 8 );
-#if defined(__linux__) || defined(__sunos__)
+ Security::Security() {
+ static int n;
+ massert( 10352 , "Security is a singleton class", ++n == 1);
+ init();
+ }
+
+ void Security::init() {
+ if( _initialized ) return;
+ _initialized = true;
+
+#if defined(__linux__) || defined(__sunos__) || defined(__APPLE__)
_devrandom = new ifstream("/dev/urandom", ios::binary|ios::in);
massert( 10353 , "can't open dev/urandom", _devrandom->is_open() );
#elif defined(_WIN32)
@@ -40,36 +43,41 @@ namespace mongo {
#else
srandomdev();
#endif
- assert( sizeof(nonce) == 8 );
-
+
#ifndef NDEBUG
if ( do_md5_test() )
- massert( 10354 , "md5 unit test fails", false);
+ massert( 10354 , "md5 unit test fails", false);
#endif
}
-
- nonce Security::getNonce(){
+
+ nonce Security::getNonce() {
static mongo::mutex m("getNonce");
scoped_lock lk(m);
+
+ if ( ! _initialized )
+ init();
- /* question/todo: /dev/random works on OS X. is it better
- to use that than random() / srandom()?
- */
+ /* question/todo: /dev/random works on OS X. is it better
+ to use that than random() / srandom()?
+ */
nonce n;
-#if defined(__linux__) || defined(__sunos__)
+#if defined(__linux__) || defined(__sunos__) || defined(__APPLE__)
_devrandom->read((char*)&n, sizeof(n));
massert( 10355 , "devrandom failed", !_devrandom->fail());
#elif defined(_WIN32)
- n = (((unsigned long long)rand())<<32) | rand();
+ unsigned a=0, b=0;
+ assert( rand_s(&a) == 0 );
+ assert( rand_s(&b) == 0 );
+ n = (((unsigned long long)a)<<32) | b;
#else
n = (((unsigned long long)random())<<32) | random();
#endif
return n;
}
unsigned getRandomNumber() { return (unsigned) security.getNonce(); }
-
- bool Security::_initialized;
+
+ bool Security::_initialized;
Security security;
-
+
} // namespace mongo