AIX (V3) requires <sys/select.h> (included via e_os.h) for fd_set.
[openssl.git] / crypto / rand / rand_unix.c
index c4aae38f1d998cb2798de1f4963a176c35f605f9..1257fa8d96c10e63b778db027e570cc3852aeb6f 100644 (file)
  *
  */
 
+#include "e_os.h"
 #include "cryptlib.h"
 #include <openssl/rand.h>
 #include "rand_lcl.h"
 
-#if !(defined(WINDOWS) || defined(WIN32) || defined(VMS))
+#if !(defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_OS2))
 
 #include <sys/types.h>
 #include <sys/time.h>
 #include <sys/times.h>
 #include <fcntl.h>
 #include <unistd.h>
+#include <time.h>
 
 int RAND_poll(void)
 {
        unsigned long l;
        pid_t curr_pid = getpid();
-#ifdef DEVRANDOM
+#if defined(DEVRANDOM) || defined(DEVRANDOM_EGD)
        unsigned char tmpbuf[ENTROPY_NEEDED];
        int n = 0;
+#endif
+#ifdef DEVRANDOM
        static const char *randomfiles[] = { DEVRANDOM, NULL };
        const char **randomfile = NULL;
        int fd;
 #endif
+#ifdef DEVRANDOM_EGD
+       static const char *egdsockets[] = { DEVRANDOM_EGD, NULL };
+       const char **egdsocket = NULL;
+#endif
 
 #ifdef DEVRANDOM
        /* Use a random entropy pool device. Linux, FreeBSD and OpenBSD
@@ -183,12 +191,33 @@ int RAND_poll(void)
                                && t.tv_usec != 0 && n < ENTROPY_NEEDED);
 
                        close(fd);
-                       RAND_add(tmpbuf,sizeof tmpbuf,n);
-                       memset(tmpbuf,0,n);
                        }
                }
 #endif
 
+#ifdef DEVRANDOM_EGD
+       /* Use an EGD socket to read entropy from an EGD or PRNGD entropy
+        * collecting daemon. */
+
+       for (egdsocket = egdsockets; *egdsocket && n < ENTROPY_NEEDED; egdsocket++)
+               {
+               int r;
+
+               r = RAND_query_egd_bytes(*egdsocket, (unsigned char *)tmpbuf+n,
+                                        ENTROPY_NEEDED-n);
+               if (r > 0)
+                       n += r;
+               }
+#endif
+
+#if defined(DEVRANDOM) || defined(DEVRANDOM_EGD)
+       if (n > 0)
+               {
+               RAND_add(tmpbuf,sizeof tmpbuf,n);
+               memset(tmpbuf,0,n);
+               }
+#endif
+
        /* put in some default random data, we need more than just this */
        l=curr_pid;
        RAND_add(&l,sizeof(l),0);
@@ -198,10 +227,11 @@ int RAND_poll(void)
        l=time(NULL);
        RAND_add(&l,sizeof(l),0);
 
-#ifdef DEVRANDOM
+#if defined(DEVRANDOM) || defined(DEVRANDOM_EGD)
        return 1;
-#endif
+#else
        return 0;
+#endif
 }
 
 #endif