*/
#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);
# 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;
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);
}