#ifdef HAVE_DEV_URANDOM
+#define URANDOM_PATH "/dev/urandom"
+
#include "fd-close-on-exec.h"
#include <unistd.h>
#include <fcntl.h>
i_assert(init_refcount > 0);
i_assert(size < SSIZE_T_MAX);
- for (pos = 0; pos < size; pos += ret) {
+ for (pos = 0; pos < size; ) {
ret = read(urandom_fd, (char *) buf + pos, size - pos);
- if (unlikely(ret < 0 && errno != EINTR))
- i_fatal("Error reading from /dev/urandom: %m");
+ if (unlikely(ret <= 0)) {
+ if (ret == 0)
+ i_fatal("EOF when reading from "URANDOM_PATH);
+ else if (errno != EINTR)
+ i_fatal("read("URANDOM_PATH") failed: %m");
+ } else {
+ pos += ret;
+ }
}
}
if (init_refcount++ > 0)
return;
- urandom_fd = open("/dev/urandom", O_RDONLY);
+ urandom_fd = open(URANDOM_PATH, O_RDONLY);
if (urandom_fd == -1) {
if (errno == ENOENT) {
- i_fatal("/dev/urandom doesn't exist, "
+ i_fatal(URANDOM_PATH" doesn't exist, "
"currently we require it");
} else {
- i_fatal("Can't open /dev/urandom: %m");
+ i_fatal("Can't open "URANDOM_PATH": %m");
}
}