summaryrefslogtreecommitdiffhomepage
path: root/random.c
diff options
context:
space:
mode:
authorMatt Johnston <matt@ucc.asn.au>2005-04-24 15:56:36 +0000
committerMatt Johnston <matt@ucc.asn.au>2005-04-24 15:56:36 +0000
commitb952231df1e7d8f890d7af9d7ce5c81f0e08150d (patch)
tree1f75b6c8163e6abe078af80368f25b092b0ffcdc /random.c
parent51be125ff9b36a5e9309f9f62bf911249b04ef1a (diff)
* warn if we seem to be blocking on /dev/random
--HG-- extra : convert_revision : a160efd238030ac4f7fd8304c5a87928145feccc
Diffstat (limited to 'random.c')
-rw-r--r--random.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/random.c b/random.c
index c69f641..e45f474 100644
--- a/random.c
+++ b/random.c
@@ -50,6 +50,7 @@ static void readrand(unsigned char* buf, unsigned int buflen);
static void readrand(unsigned char* buf, unsigned int buflen) {
+ static int already_blocked = 0;
int readfd;
unsigned int readpos;
int readlen;
@@ -92,6 +93,24 @@ static void readrand(unsigned char* buf, unsigned int buflen) {
/* read the actual random data */
readpos = 0;
do {
+ if (!already_blocked)
+ {
+ int ret;
+ struct timeval timeout;
+ fd_set read_fds;
+
+ timeout.tv_sec = 2; /* two seconds should be enough */
+ timeout.tv_usec = 0;
+
+ FD_ZERO(&read_fds);
+ FD_SET(readfd, &read_fds);
+ ret = select(readfd + 1, &read_fds, NULL, NULL, &timeout);
+ if (ret == 0)
+ {
+ dropbear_log(LOG_INFO, "Warning: Reading the random source seems to have blocked.\nIf you experience problems, you probably need to find a better entropy source.");
+ already_blocked = 1;
+ }
+ }
readlen = read(readfd, &buf[readpos], buflen - readpos);
if (readlen <= 0) {
if (readlen < 0 && errno == EINTR) {