aboutsummaryrefslogtreecommitdiff
path: root/networking/udhcp/clientpacket.c
diff options
context:
space:
mode:
Diffstat (limited to 'networking/udhcp/clientpacket.c')
-rw-r--r--networking/udhcp/clientpacket.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/networking/udhcp/clientpacket.c b/networking/udhcp/clientpacket.c
index ecbd7953f..86faec925 100644
--- a/networking/udhcp/clientpacket.c
+++ b/networking/udhcp/clientpacket.c
@@ -35,6 +35,10 @@
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
#include "dhcpd.h"
@@ -49,7 +53,17 @@ unsigned long random_xid(void)
{
static int initialized;
if (!initialized) {
- srand(time(0));
+ int fd;
+ unsigned long seed;
+
+ fd = open("/dev/urandom", 0);
+ if (fd < 0 || read(fd, &seed, sizeof(seed)) < 0) {
+ LOG(LOG_WARNING, "Could not load seed from /dev/urandom: %s",
+ strerror(errno));
+ seed = time(0);
+ }
+ if (fd >= 0) close(fd);
+ srand(seed);
initialized++;
}
return rand();