diff options
author | Matt Johnston <matt@ucc.asn.au> | 2005-04-24 15:56:36 +0000 |
---|---|---|
committer | Matt Johnston <matt@ucc.asn.au> | 2005-04-24 15:56:36 +0000 |
commit | b952231df1e7d8f890d7af9d7ce5c81f0e08150d (patch) | |
tree | 1f75b6c8163e6abe078af80368f25b092b0ffcdc /random.c | |
parent | 51be125ff9b36a5e9309f9f62bf911249b04ef1a (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.c | 19 |
1 files changed, 19 insertions, 0 deletions
@@ -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) { |