From 27524d9d341eafe535ccc9e60589a38be0278ea4 Mon Sep 17 00:00:00 2001 From: "Nicholas J. Kain" Date: Mon, 27 Jun 2011 15:07:00 -0400 Subject: [PATCH] Use the new libc_random_u32() in ncmlib to replace random_xid(). --- ncmlib/CMakeLists.txt | 14 ++------------ ncmlib/io.h | 2 ++ ncmlib/random.c | 38 ++++++++++++++++++++++++++++++++++++++ ncmlib/random.h | 6 ++++++ ndhc/packet.c | 29 ++--------------------------- ndhc/packet.h | 1 - ndhc/timeout.c | 3 ++- 7 files changed, 52 insertions(+), 41 deletions(-) create mode 100644 ncmlib/random.c create mode 100644 ncmlib/random.h diff --git a/ncmlib/CMakeLists.txt b/ncmlib/CMakeLists.txt index c152341..fe56908 100644 --- a/ncmlib/CMakeLists.txt +++ b/ncmlib/CMakeLists.txt @@ -1,13 +1,3 @@ -set(NCMLIB_SRCS - malloc.c - chroot.c - pidfile.c - signals.c - strlist.c - strl.c - log.c - cap.c - io.c - ) +file(GLOB NCMLIB_SRCS "*.c") -add_library(ncmlib ${NCMLIB_SRCS}) \ No newline at end of file +add_library(ncmlib ${NCMLIB_SRCS}) diff --git a/ncmlib/io.h b/ncmlib/io.h index 74ac169..552907e 100644 --- a/ncmlib/io.h +++ b/ncmlib/io.h @@ -30,6 +30,8 @@ #ifndef NCM_IO_H_ #define NCM_IO_H_ +#include + int safe_read(int fd, char *buf, int len); int safe_write(int fd, const char *buf, int len); int safe_sendto(int fd, const char *buf, int len, int flags, diff --git a/ncmlib/random.c b/ncmlib/random.c new file mode 100644 index 0000000..839f699 --- /dev/null +++ b/ncmlib/random.c @@ -0,0 +1,38 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "log.h" +#include "io.h" + +// Generate a 32-bit pseudorandom number using libc rand() +uint32_t libc_random_u32(void) +{ + static int initialized; + if (initialized) + return rand(); + + uint32_t seed; + int fd = open("/dev/urandom", O_RDONLY); + if (fd != -1) { + int r = safe_read(fd, (char *)&seed, sizeof seed); + if (r == -1) { + log_warning("Could not read /dev/urandom: %s", strerror(errno)); + close(fd); + seed = time(0); + } + } else { + log_warning("Could not open /dev/urandom: %s", strerror(errno)); + seed = time(0); + } + srand(seed); + initialized = 1; + return rand(); +} + + diff --git a/ncmlib/random.h b/ncmlib/random.h new file mode 100644 index 0000000..47ca3fa --- /dev/null +++ b/ncmlib/random.h @@ -0,0 +1,6 @@ +#ifndef NCMLIB_RANDOM__ +#define NCMLIB_RANDOM__ +uint32_t libc_random_u32(void); + +#endif + diff --git a/ndhc/packet.c b/ndhc/packet.c index 4b03531..b1f5425 100644 --- a/ndhc/packet.c +++ b/ndhc/packet.c @@ -46,6 +46,7 @@ #include "io.h" #include "options.h" #include "strl.h" +#include "random.h" // Returns fd of new listen socket bound to @ip:@port on interface @inf // on success, or -1 on failure. @@ -636,32 +637,6 @@ void handle_packet(struct client_state_t *cs) } } -// Generate a 32-bit pseudorandom number -uint32_t random_xid(void) -{ - static int initialized; - if (initialized) - return rand(); - - uint32_t seed; - int fd = open("/dev/urandom", O_RDONLY); - if (fd != -1) { - int r = safe_read(fd, (char *)&seed, sizeof seed); - if (r == -1) { - log_warning("Could not read /dev/urandom: %s", strerror(errno)); - close(fd); - seed = time(0); - } - } else { - log_warning("Could not open /dev/urandom: %s", - strerror(errno)); - seed = time(0); - } - srand(seed); - initialized = 1; - return rand(); -} - // Initialize a DHCP client packet that will be sent to a server static struct dhcpmsg init_packet(char type, uint32_t xid) { @@ -740,7 +715,7 @@ int send_decline(uint32_t xid, uint32_t server, uint32_t requested) // Unicasts a DHCP release message int send_release(uint32_t server, uint32_t ciaddr) { - struct dhcpmsg packet = init_packet(DHCPRELEASE, random_xid()); + struct dhcpmsg packet = init_packet(DHCPRELEASE, libc_random_u32()); packet.ciaddr = ciaddr; add_u32_option(&packet, DHCP_REQUESTED_IP, ciaddr); add_u32_option(&packet, DHCP_SERVER_ID, server); diff --git a/ndhc/packet.h b/ndhc/packet.h index fecf17b..958535f 100644 --- a/ndhc/packet.h +++ b/ndhc/packet.h @@ -77,7 +77,6 @@ struct udp_dhcp_packet { void change_listen_mode(struct client_state_t *cs, int new_mode); void handle_packet(struct client_state_t *cs); -uint32_t random_xid(void); int send_discover(uint32_t xid, uint32_t requested); int send_selecting(uint32_t xid, uint32_t server, uint32_t requested); int send_renew(uint32_t xid, uint32_t server, uint32_t ciaddr); diff --git a/ndhc/timeout.c b/ndhc/timeout.c index 00785ae..fc89a24 100644 --- a/ndhc/timeout.c +++ b/ndhc/timeout.c @@ -27,13 +27,14 @@ #include "packet.h" #include "arp.h" #include "log.h" +#include "random.h" #define DELAY_SEC (((RETRY_DELAY - (RETRY_DELAY / NUMPACKETS)) / NUMPACKETS) + 1) static void init_selecting_timeout(struct client_state_t *cs) { if (cs->packetNum < NUMPACKETS) { if (cs->packetNum == 0) - cs->xid = random_xid(); + cs->xid = libc_random_u32(); /* broadcast */ send_discover(cs->xid, cs->requestedIP); cs->timeout = DELAY_SEC * (cs->packetNum + 1) * 1000;