提交 c4985e94 编写于 作者: D Daniel P. Berrange

use the gnulib random_r function

上级 1b745219
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 Remove use of non-reentrant POSIX api calls
* configure.in: Check for strtok_r getmntent_r getgrnam_r getpwuid_r * configure.in: Check for strtok_r getmntent_r getgrnam_r getpwuid_r
......
...@@ -117,7 +117,7 @@ sc_prohibit_nonreentrant: ...@@ -117,7 +117,7 @@ sc_prohibit_nonreentrant:
@fail=0 ; \ @fail=0 ; \
for i in $(NON_REENTRANT) ; \ for i in $(NON_REENTRANT) ; \
do \ 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}" || : ; \ fail=1 && echo "$(ME): use $${i}_r, not $${i}" || : ; \
done ; \ done ; \
exit $$fail exit $$fail
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#ifdef HAVE_SYS_WAIT_H #ifdef HAVE_SYS_WAIT_H
#include <sys/wait.h> #include <sys/wait.h>
#endif #endif
#include <time.h>
#include <libxml/parser.h> #include <libxml/parser.h>
#include <libxml/xpath.h> #include <libxml/xpath.h>
...@@ -257,7 +258,8 @@ virInitialize(void) ...@@ -257,7 +258,8 @@ virInitialize(void)
initialized = 1; initialized = 1;
if (virThreadInitialize() < 0 || if (virThreadInitialize() < 0 ||
virErrorInitialize() < 0) virErrorInitialize() < 0 ||
virRandomInitialize(time(NULL) ^ getpid()))
return -1; return -1;
#ifdef ENABLE_DEBUG #ifdef ENABLE_DEBUG
...@@ -332,23 +334,19 @@ DllMain (HINSTANCE instance ATTRIBUTE_UNUSED, ...@@ -332,23 +334,19 @@ DllMain (HINSTANCE instance ATTRIBUTE_UNUSED,
{ {
switch (reason) { switch (reason) {
case DLL_PROCESS_ATTACH: case DLL_PROCESS_ATTACH:
fprintf(stderr, "Initializing DLL\n");
virInitialize(); virInitialize();
break; break;
case DLL_THREAD_ATTACH: case DLL_THREAD_ATTACH:
fprintf(stderr, "Thread start\n");
/* Nothing todo in libvirt yet */ /* Nothing todo in libvirt yet */
break; break;
case DLL_THREAD_DETACH: case DLL_THREAD_DETACH:
fprintf(stderr, "Thread exit\n");
/* Release per-thread local data */ /* Release per-thread local data */
virThreadOnExit(); virThreadOnExit();
break; break;
case DLL_PROCESS_DETACH: case DLL_PROCESS_DETACH:
fprintf(stderr, "Process exit\n");
/* Don't bother releasing per-thread data /* Don't bother releasing per-thread data
since (hopefully) windows cleans up since (hopefully) windows cleans up
everything on process exit */ everything on process exit */
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include <fcntl.h> #include <fcntl.h>
#include <errno.h> #include <errno.h>
#include <poll.h> #include <poll.h>
#include <time.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
...@@ -59,6 +60,7 @@ ...@@ -59,6 +60,7 @@
#include "buf.h" #include "buf.h"
#include "util.h" #include "util.h"
#include "memory.h" #include "memory.h"
#include "threads.h"
#ifndef NSIG #ifndef NSIG
# define NSIG 32 # define NSIG 32
...@@ -1285,9 +1287,9 @@ void virGenerateMacAddr(const unsigned char *prefix, ...@@ -1285,9 +1287,9 @@ void virGenerateMacAddr(const unsigned char *prefix,
addr[0] = prefix[0]; addr[0] = prefix[0];
addr[1] = prefix[1]; addr[1] = prefix[1];
addr[2] = prefix[2]; addr[2] = prefix[2];
addr[3] = (int)(256*(rand()/(RAND_MAX+1.0))); addr[3] = virRandom(256);
addr[4] = (int)(256*(rand()/(RAND_MAX+1.0))); addr[4] = virRandom(256);
addr[5] = (int)(256*(rand()/(RAND_MAX+1.0))); addr[5] = virRandom(256);
} }
...@@ -1436,6 +1438,36 @@ int virKillProcess(pid_t pid, int sig) ...@@ -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 #ifdef HAVE_GETPWUID_R
char *virGetUserDirectory(virConnectPtr conn, char *virGetUserDirectory(virConnectPtr conn,
uid_t uid) uid_t uid)
......
...@@ -177,4 +177,7 @@ char *virGetUserDirectory(virConnectPtr conn, ...@@ -177,4 +177,7 @@ char *virGetUserDirectory(virConnectPtr conn,
uid_t uid); uid_t uid);
#endif #endif
int virRandomInitialize(unsigned int seed);
int virRandom(int max);
#endif /* __VIR_UTIL_H__ */ #endif /* __VIR_UTIL_H__ */
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include "c-ctype.h" #include "c-ctype.h"
#include "internal.h" #include "internal.h"
#include "util.h"
#define qemudLog(level, msg...) fprintf(stderr, msg) #define qemudLog(level, msg...) fprintf(stderr, msg)
...@@ -74,9 +75,8 @@ static int ...@@ -74,9 +75,8 @@ static int
virUUIDGeneratePseudoRandomBytes(unsigned char *buf, virUUIDGeneratePseudoRandomBytes(unsigned char *buf,
int buflen) int buflen)
{ {
srand(time(NULL));
while (buflen > 0) { while (buflen > 0) {
*buf = (int) (255.0 * (rand() / (double) RAND_MAX)); *buf = virRandom(256);
buflen--; buflen--;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册