summaryrefslogtreecommitdiffstats
path: root/helper.c
diff options
context:
space:
mode:
authorDamien Miller <djm@mindrot.org>1999-11-19 12:05:01 +1100
committerDamien Miller <djm@mindrot.org>1999-11-19 12:05:01 +1100
commit58fc473907bce8d4c8b3f01cdc618f755c3f914d (patch)
tree1508d1d576b8b70e22051a07726c864aa1f60eb2 /helper.c
parent23b783952a3b9c3daadff0b97b9f8e312c3a72be (diff)
- EGD uses a socket, not a named pipe. Duh.
- Fix includes in fingerprint.c
Diffstat (limited to 'helper.c')
-rw-r--r--helper.c39
1 files changed, 34 insertions, 5 deletions
diff --git a/helper.c b/helper.c
index 6d77759d..efb7a463 100644
--- a/helper.c
+++ b/helper.c
@@ -41,6 +41,8 @@
#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/socket.h>
+#include <sys/un.h>
#include <fcntl.h>
#include "rc4.h"
@@ -49,6 +51,10 @@
#include "config.h"
#include "helper.h"
+#ifndef offsetof
+#define offsetof(type, member) ((size_t) &((type *)0)->member)
+#endif
+
#ifndef HAVE_ARC4RANDOM
void get_random_bytes(unsigned char *buf, int len);
@@ -80,17 +86,33 @@ void arc4random_stir(void)
void get_random_bytes(unsigned char *buf, int len)
{
- int random_pool;
+ static int random_pool;
int c;
#ifdef HAVE_EGD
char egd_message[2] = { 0x02, 0x00 };
-#endif /* HAVE_EGD */
+ struct sockaddr_un addr;
+ int addr_len;
+
+ memset(&addr, '\0', sizeof(addr));
+ addr.sun_family = AF_UNIX;
+
+ /* FIXME: compile time check? */
+ if (sizeof(RANDOM_POOL) > sizeof(addr.sun_path))
+ fatal("Random pool path is too long");
+
+ strncpy(addr.sun_path, RANDOM_POOL, sizeof(addr.sun_path - 1));
+ addr.sun_path[sizeof(addr.sun_path - 1)] = '\0';
+
+ addr_len = offsetof(struct sockaddr_un, sun_path) + sizeof(RANDOM_POOL);
+
+ random_pool = socket(AF_UNIX, SOCK_STREAM, 0);
- random_pool = open(RANDOM_POOL, O_RDONLY);
if (random_pool == -1)
- fatal("Couldn't open random pool \"%s\": %s", RANDOM_POOL, strerror(errno));
+ fatal("Couldn't create AF_UNIX socket: %s", strerror(errno));
-#ifdef HAVE_EGD
+ if (connect(random_pool, (struct sockaddr*)&addr, addr_len) == -1)
+ fatal("Couldn't connect to EGD socket \"%s\": %s", RANDOM_POOL, strerror(errno));
+
if (len > 255)
fatal("Too many bytes to read from EGD");
@@ -99,6 +121,13 @@ void get_random_bytes(unsigned char *buf, int len)
c = write(random_pool, egd_message, sizeof(egd_message));
if (c == -1)
fatal("Couldn't write to EGD socket \"%s\": %s", RANDOM_POOL, strerror(errno));
+
+#else /* HAVE_EGD */
+
+ random_pool = open(RANDOM_POOL, O_RDONLY);
+ if (random_pool == -1)
+ fatal("Couldn't open random pool \"%s\": %s", RANDOM_POOL, strerror(errno));
+
#endif /* HAVE_EGD */
c = read(random_pool, buf, len);