Add automatic query of EGD sockets to RAND_poll(). The EGD sockets are
[openssl.git] / crypto / rand / rand_egd.c
index 02a0d86fa330aa0504d76e863d1eee9f9767bb73..28fb1f2c600b284f271b6be13daebb2b4478d942 100644 (file)
  */
 
 #if defined(WIN32) || defined(VMS) || defined(__VMS)
+int RAND_query_egd_bytes(const char *path, unsigned char *buf, int bytes)
+       {
+       return(-1);
+       }
 int RAND_egd(const char *path)
        {
        return(-1);
@@ -81,13 +85,13 @@ int RAND_egd_bytes(const char *path,int bytes)
 #  define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
 #endif
 
-int RAND_egd(const char *path)
+int RAND_query_egd_bytes(const char *path, unsigned char *buf, int bytes)
        {
-       int ret = -1;
+       int ret = 0;
        struct sockaddr_un addr;
        int len, num;
        int fd = -1;
-       unsigned char buf[256];
+       unsigned char egdbuf[2];
 
        memset(&addr, 0, sizeof(addr));
        addr.sun_family = AF_UNIX;
@@ -98,18 +102,44 @@ int RAND_egd(const char *path)
        fd = socket(AF_UNIX, SOCK_STREAM, 0);
        if (fd == -1) return (-1);
        if (connect(fd, (struct sockaddr *)&addr, len) == -1) goto err;
-       buf[0] = 1;
-       buf[1] = 255;
-       write(fd, buf, 2);
-       if (read(fd, buf, 1) != 1) goto err;
-       if (buf[0] == 0) goto err;
-       num = read(fd, buf, 255);
+
+       while(bytes > 0)
+           {
+           egdbuf[0] = 1;
+           egdbuf[1] = bytes < 255 ? bytes : 255;
+           write(fd, egdbuf, 2);
+           if (read(fd, egdbuf, 1) != 1)
+               {
+               ret=-1;
+               goto err;
+               }
+           if(egdbuf[0] == 0)
+               goto err;
+           num = read(fd, buf + ret, egdbuf[0]);
+           if (num < 1)
+               {
+               ret=-1;
+               goto err;
+               }
+           ret += num;
+           bytes-=num;
+           }
+ err:
+       if (fd != -1) close(fd);
+       return(ret);
+       }
+
+int RAND_egd(const char *path)
+       {
+       int num, ret;
+       unsigned char buf[256];
+
+       num = RAND_query_egd_bytes(path, buf, 255);
        if (num < 1) goto err;
        RAND_seed(buf, num);
        if (RAND_status() == 1)
                ret = num;
  err:
-       if (fd != -1) close(fd);
        return(ret);
        }