summaryrefslogtreecommitdiff
path: root/xpcom/base/nsUUIDGenerator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xpcom/base/nsUUIDGenerator.cpp')
-rw-r--r--xpcom/base/nsUUIDGenerator.cpp18
1 files changed, 15 insertions, 3 deletions
diff --git a/xpcom/base/nsUUIDGenerator.cpp b/xpcom/base/nsUUIDGenerator.cpp
index e3974b5fca..645b34b87e 100644
--- a/xpcom/base/nsUUIDGenerator.cpp
+++ b/xpcom/base/nsUUIDGenerator.cpp
@@ -6,6 +6,8 @@
#if defined(XP_WIN)
#include <windows.h>
#include <objbase.h>
+#elif defined(XP_MACOSX)
+#include <CoreFoundation/CoreFoundation.h>
#else
#include <stdlib.h>
#include "prrng.h"
@@ -32,7 +34,7 @@ nsUUIDGenerator::Init()
// We're a service, so we're guaranteed that Init() is not going
// to be reentered while we're inside Init().
-#if !defined(XP_WIN) && !defined(HAVE_ARC4RANDOM)
+#if !defined(XP_WIN) && !defined(XP_MACOSX) && !defined(HAVE_ARC4RANDOM)
/* initialize random number generator using NSPR random noise */
unsigned int seed;
@@ -69,7 +71,7 @@ nsUUIDGenerator::Init()
}
#endif
-#endif /* non XP_WIN and non ARC4RANDOM */
+#endif /* non XP_WIN and non XP_MACOSX and non ARC4RANDOM */
return NS_OK;
}
@@ -104,7 +106,17 @@ nsUUIDGenerator::GenerateUUIDInPlace(nsID* aId)
if (FAILED(hr)) {
return NS_ERROR_FAILURE;
}
-#else /* not windows; generate randomness using random(). */
+#elif defined(XP_MACOSX)
+ CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);
+ if (!uuid) {
+ return NS_ERROR_FAILURE;
+ }
+
+ CFUUIDBytes bytes = CFUUIDGetUUIDBytes(uuid);
+ memcpy(aId, &bytes, sizeof(nsID));
+
+ CFRelease(uuid);
+#else /* not windows or OS X; generate randomness using random(). */
/* XXX we should be saving the return of setstate here and switching
* back to it; instead, we use the value returned when we called
* initstate, since older glibc's have broken setstate() return values