- fatal("Too many bytes to read from EGD");
-
- /* Send blocking read request to EGD */
- egd_message[1] = len;
-
- c = atomicio(write, egd_socket, egd_message, sizeof(egd_message));
- if (c == -1)
- fatal("Couldn't write to EGD socket \"%s\": %s", EGD_SOCKET, strerror(errno));
-
- c = atomicio(read, egd_socket, buf, len);
- if (c <= 0)
- fatal("Couldn't read from EGD socket \"%s\": %s", EGD_SOCKET, strerror(errno));
-
- close(EGD_SOCKET);
+ fatal("Too many bytes to read from PRNGD");
+
+ addr.sun_family = AF_UNIX;
+ strlcpy(addr.sun_path, PRNGD_SOCKET, sizeof(addr.sun_path));
+ addr_len = offsetof(struct sockaddr_un, sun_path) +
+ sizeof(PRNGD_SOCKET);
+#endif
+
+ old_sigpipe = mysignal(SIGPIPE, SIG_IGN);
+
+ errors = rval = 0;
+reopen:
+#ifdef PRNGD_PORT
+ fd = socket(addr.sin_family, SOCK_STREAM, 0);
+ if (fd == -1) {
+ error("Couldn't create AF_INET socket: %s", strerror(errno));
+ goto done;
+ }
+#else
+ fd = socket(addr.sun_family, SOCK_STREAM, 0);
+ if (fd == -1) {
+ error("Couldn't create AF_UNIX socket: %s", strerror(errno));
+ goto done;
+ }
+#endif
+
+ if (connect(fd, (struct sockaddr*)&addr, addr_len) == -1) {
+#ifdef PRNGD_PORT
+ error("Couldn't connect to PRNGD port %d: %s",
+ PRNGD_PORT, strerror(errno));
+#else
+ error("Couldn't connect to PRNGD socket \"%s\": %s",
+ addr.sun_path, strerror(errno));
+#endif
+ goto done;
+ }
+
+ /* Send blocking read request to PRNGD */
+ msg[0] = 0x02;
+ msg[1] = len;
+
+ if (atomicio(write, fd, msg, sizeof(msg)) != sizeof(msg)) {
+ if (errno == EPIPE && errors < 10) {
+ close(fd);
+ errors++;
+ goto reopen;
+ }
+ error("Couldn't write to PRNGD socket: %s",
+ strerror(errno));
+ goto done;
+ }
+
+ if (atomicio(read, fd, buf, len) != len) {
+ if (errno == EPIPE && errors < 10) {
+ close(fd);
+ errors++;
+ goto reopen;
+ }
+ error("Couldn't read from PRNGD socket: %s",
+ strerror(errno));
+ goto done;
+ }
+
+ rval = 1;
+done:
+ mysignal(SIGPIPE, old_sigpipe);
+ if (fd != -1)
+ close(fd);
+ return(rval);