mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-08-27 02:51:16 +00:00
use the gnulib random_r function
This commit is contained in:
parent
1b745219c7
commit
c4985e9419
11
ChangeLog
11
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
|
||||
|
@ -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
|
||||
|
@ -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 */
|
||||
|
38
src/util.c
38
src/util.c
@ -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)
|
||||
|
@ -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__ */
|
||||
|
@ -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--;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user