mturk / rpms / openssl

Forked from rpms/openssl 3 years ago
Clone
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
 			}