diff --git a/src/util.cc b/src/util.cc index 942a1df1..a8d354a2 100644 --- a/src/util.cc +++ b/src/util.cc @@ -1265,18 +1265,10 @@ void generateRandomDataRandom(unsigned char* data, size_t length) } // namespace namespace { -void generateRandomDataUrandom(unsigned char* data, size_t length, int fd) +void generateRandomDataUrandom +(unsigned char* data, size_t length, std::ifstream& devUrand) { - while(length > 0) { - ssize_t r; - while((r = read(fd, data, length)) == -1 && errno == EINTR); - if(r <= 0) { - generateRandomDataRandom(data, length); - return; - } - length -= r; - data += r; - } + devUrand.read(reinterpret_cast(data), length); } } // namespace @@ -1286,17 +1278,17 @@ void generateRandomData(unsigned char* data, size_t length) generateRandomDataRandom(data, length); #else // !__MINGW32__ static int method = -1; - static int fd; + static std::ifstream devUrand; if(method == 0) { - generateRandomDataUrandom(data, length, fd); + generateRandomDataUrandom(data, length, devUrand); } else if(method == 1) { generateRandomDataRandom(data, length); } else { - while((fd = open("/dev/urandom", O_RDONLY)) == -1 && errno == EINTR); - if(fd == -1) { - method = 1; - } else { + devUrand.open("/dev/urandom"); + if(devUrand) { method = 0; + } else { + method = 1; } generateRandomData(data, length); }