|
|
e96bebc |
--- openssl-0.9.8a/crypto/rand/rand_unix.c.use-poll 2005-08-29 01:20:48.000000000 +0200
|
|
|
e96bebc |
+++ openssl-0.9.8a/crypto/rand/rand_unix.c 2005-11-08 01:28:35.000000000 +0100
|
|
|
e96bebc |
@@ -125,6 +125,7 @@
|
|
|
e96bebc |
#include <fcntl.h>
|
|
|
e96bebc |
#include <unistd.h>
|
|
|
e96bebc |
#include <time.h>
|
|
|
e96bebc |
+#include <sys/poll.h>
|
|
|
e96bebc |
|
|
|
e96bebc |
#ifdef __OpenBSD__
|
|
|
e96bebc |
int RAND_poll(void)
|
|
|
e96bebc |
@@ -157,6 +158,7 @@
|
|
|
e96bebc |
struct stat randomstats[sizeof(randomfiles)/sizeof(randomfiles[0])];
|
|
|
e96bebc |
int fd;
|
|
|
e96bebc |
size_t i;
|
|
|
e96bebc |
+ struct pollfd pfd;
|
|
|
e96bebc |
#endif
|
|
|
e96bebc |
#ifdef DEVRANDOM_EGD
|
|
|
e96bebc |
static const char *egdsockets[] = { DEVRANDOM_EGD, NULL };
|
|
|
e96bebc |
@@ -184,11 +186,10 @@
|
|
|
e96bebc |
#endif
|
|
|
e96bebc |
)) >= 0)
|
|
|
e96bebc |
{
|
|
|
e96bebc |
- struct timeval t = { 0, 10*1000 }; /* Spend 10ms on
|
|
|
e96bebc |
+ int t = 10; /* Spend 10ms on
|
|
|
e96bebc |
each file. */
|
|
|
e96bebc |
int r;
|
|
|
e96bebc |
size_t j;
|
|
|
e96bebc |
- fd_set fset;
|
|
|
e96bebc |
struct stat *st=&randomstats[i];
|
|
|
e96bebc |
|
|
|
e96bebc |
/* Avoid using same input... Used to be O_NOFOLLOW
|
|
|
e96bebc |
@@ -204,30 +205,25 @@
|
|
|
e96bebc |
|
|
|
e96bebc |
do
|
|
|
e96bebc |
{
|
|
|
e96bebc |
- FD_ZERO(&fset);
|
|
|
e96bebc |
- FD_SET(fd, &fset);
|
|
|
e96bebc |
- r = -1;
|
|
|
e96bebc |
-
|
|
|
e96bebc |
- if (select(fd+1,&fset,NULL,NULL,&t) < 0)
|
|
|
e96bebc |
- t.tv_usec=0;
|
|
|
e96bebc |
- else if (FD_ISSET(fd, &fset))
|
|
|
e96bebc |
+ pfd.fd = fd;
|
|
|
e96bebc |
+ pfd.events = POLLIN;
|
|
|
e96bebc |
+ pfd.revents = 0;
|
|
|
e96bebc |
+
|
|
|
e96bebc |
+ if ((r=poll(&pfd,1,t)) == 0)
|
|
|
e96bebc |
+ t = 0;
|
|
|
e96bebc |
+ else if (r > 0 && (pfd.revents & POLLIN))
|
|
|
e96bebc |
{
|
|
|
e96bebc |
r=read(fd,(unsigned char *)tmpbuf+n,
|
|
|
e96bebc |
ENTROPY_NEEDED-n);
|
|
|
e96bebc |
if (r > 0)
|
|
|
e96bebc |
n += r;
|
|
|
e96bebc |
}
|
|
|
e96bebc |
-
|
|
|
e96bebc |
- /* Some Unixen will update t, some
|
|
|
e96bebc |
- won't. For those who won't, give
|
|
|
e96bebc |
- up here, otherwise, we will do
|
|
|
e96bebc |
- this once again for the remaining
|
|
|
e96bebc |
- time. */
|
|
|
e96bebc |
- if (t.tv_usec == 10*1000)
|
|
|
e96bebc |
- t.tv_usec=0;
|
|
|
e96bebc |
+ /* we don't know how big part of the timeout elapsed
|
|
|
e96bebc |
+ wait half the original timeout next time */
|
|
|
e96bebc |
+ t >>= 1;
|
|
|
e96bebc |
}
|
|
|
e96bebc |
while ((r > 0 || (errno == EINTR || errno == EAGAIN))
|
|
|
e96bebc |
- && t.tv_usec != 0 && n < ENTROPY_NEEDED);
|
|
|
e96bebc |
+ && t != 0 && n < ENTROPY_NEEDED);
|
|
|
e96bebc |
|
|
|
e96bebc |
close(fd);
|
|
|
e96bebc |
}
|