]> xenbits.xensource.com Git - libvirt.git/commitdiff
use the gnulib random_r function
authorDaniel P. Berrange <berrange@redhat.com>
Thu, 22 Jan 2009 20:27:01 +0000 (20:27 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Thu, 22 Jan 2009 20:27:01 +0000 (20:27 +0000)
ChangeLog
Makefile.maint
src/libvirt.c
src/util.c
src/util.h
src/uuid.c

index 26186d2cc7b03719740a869b88cbcb648acbd38b..25e8d05cec4901db9c07ba7d0421eab8f2295f62 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,13 @@
-Thu Jan 21 19:04:12 GMT 2009 Daniel P. Berrange <berrange@redhat.com>
+Thu Jan 21 19:44:12 GMT 2009 Daniel P. Berrange <berrange@redhat.com>
+
+       Use the GNULIB random_r function
+       * Makefile.maint: print 4 lines of context when complaining
+       about prohibited POSIX apis
+       * src/libvirt.c: Initialize random number generator
+       * src/util.c, src/util.h: Generate API for random number gen
+       * src/uuid.: Use generic random number generator API
+
+Thu Jan 21 19:41:12 GMT 2009 Daniel P. Berrange <berrange@redhat.com>
 
        Remove use of non-reentrant POSIX api calls
        * configure.in: Check for  strtok_r getmntent_r getgrnam_r getpwuid_r
index ee80fcf0f85ba6625a0fdb4157febd760197e489..43675f6582ec88bdc9fd1549ff02177d11a7c833 100644 (file)
@@ -117,7 +117,7 @@ sc_prohibit_nonreentrant:
        @fail=0 ; \
        for i in $(NON_REENTRANT) ; \
        do \
-          grep -nE "\<$$i\>[:space:]*\(" $$($(VC_LIST_EXCEPT)) && \
+          grep --before 2 --after 1 -nE "\<$$i\>[:space:]*\(" $$($(VC_LIST_EXCEPT)) && \
             fail=1 && echo "$(ME): use $${i}_r, not $${i}" || : ; \
        done ; \
        exit $$fail
index 2bb46e4ba2a2ac6f3ec68d58b281e44ae8cd6c5e..95f33b4dd9947237146010e20b6062287b96b456 100644 (file)
@@ -21,6 +21,7 @@
 #ifdef HAVE_SYS_WAIT_H
 #include <sys/wait.h>
 #endif
+#include <time.h>
 
 #include <libxml/parser.h>
 #include <libxml/xpath.h>
@@ -257,7 +258,8 @@ virInitialize(void)
     initialized = 1;
 
     if (virThreadInitialize() < 0 ||
-        virErrorInitialize() < 0)
+        virErrorInitialize() < 0 ||
+        virRandomInitialize(time(NULL) ^ getpid()))
         return -1;
 
 #ifdef ENABLE_DEBUG
@@ -332,23 +334,19 @@ DllMain (HINSTANCE instance ATTRIBUTE_UNUSED,
 {
     switch (reason) {
     case DLL_PROCESS_ATTACH:
-        fprintf(stderr, "Initializing DLL\n");
         virInitialize();
         break;
 
     case DLL_THREAD_ATTACH:
-        fprintf(stderr, "Thread start\n");
         /* Nothing todo in libvirt yet */
         break;
 
     case DLL_THREAD_DETACH:
-        fprintf(stderr, "Thread exit\n");
         /* Release per-thread local data */
         virThreadOnExit();
         break;
 
     case DLL_PROCESS_DETACH:
-        fprintf(stderr, "Process exit\n");
         /* Don't bother releasing per-thread data
            since (hopefully) windows cleans up
            everything on process exit */
index e4524d9517722755f243edc96ae844da86024516..b51355918a1373b48361ade2982098657648fa7e 100644 (file)
@@ -32,6 +32,7 @@
 #include <fcntl.h>
 #include <errno.h>
 #include <poll.h>
+#include <time.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/ioctl.h>
@@ -59,6 +60,7 @@
 #include "buf.h"
 #include "util.h"
 #include "memory.h"
+#include "threads.h"
 
 #ifndef NSIG
 # define NSIG 32
@@ -1285,9 +1287,9 @@ void virGenerateMacAddr(const unsigned char *prefix,
     addr[0] = prefix[0];
     addr[1] = prefix[1];
     addr[2] = prefix[2];
-    addr[3] = (int)(256*(rand()/(RAND_MAX+1.0)));
-    addr[4] = (int)(256*(rand()/(RAND_MAX+1.0)));
-    addr[5] = (int)(256*(rand()/(RAND_MAX+1.0)));
+    addr[3] = virRandom(256);
+    addr[4] = virRandom(256);
+    addr[5] = virRandom(256);
 }
 
 
@@ -1436,6 +1438,36 @@ int virKillProcess(pid_t pid, int sig)
 }
 
 
+static char randomState[128];
+static struct random_data randomData;
+static virMutex randomLock;
+
+int virRandomInitialize(unsigned int seed)
+{
+    if (virMutexInit(&randomLock) < 0)
+        return -1;
+
+    if (initstate_r(seed,
+                    randomState,
+                    sizeof(randomState),
+                    &randomData) < 0)
+        return -1;
+
+    return 0;
+}
+
+int virRandom(int max)
+{
+    int32_t ret;
+
+    virMutexLock(&randomLock);
+    random_r(&randomData, &ret);
+    virMutexUnlock(&randomLock);
+
+    return (int) ((double)max * ((double)ret / (double)RAND_MAX));
+}
+
+
 #ifdef HAVE_GETPWUID_R
 char *virGetUserDirectory(virConnectPtr conn,
                           uid_t uid)
index a94212e016fa8fead0299d4d117b00b50eef923b..e731ba49b451807017d7140983e5bf9771646149 100644 (file)
@@ -177,4 +177,7 @@ char *virGetUserDirectory(virConnectPtr conn,
                           uid_t uid);
 #endif
 
+int virRandomInitialize(unsigned int seed);
+int virRandom(int max);
+
 #endif /* __VIR_UTIL_H__ */
index 95d4bbcb968124cf5e00ba12ab4c37cea45a2fef..9d263de4266cd7381f8b510b81ecef875c5e284b 100644 (file)
@@ -35,6 +35,7 @@
 
 #include "c-ctype.h"
 #include "internal.h"
+#include "util.h"
 
 #define qemudLog(level, msg...) fprintf(stderr, msg)
 
@@ -74,9 +75,8 @@ static int
 virUUIDGeneratePseudoRandomBytes(unsigned char *buf,
                                  int buflen)
 {
-    srand(time(NULL));
     while (buflen > 0) {
-        *buf = (int) (255.0 * (rand() / (double) RAND_MAX));
+        *buf = virRandom(256);
         buflen--;
     }