|
@@ -1265,18 +1265,10 @@ void generateRandomDataRandom(unsigned char* data, size_t length)
|
|
|
} // namespace
|
|
|
|
|
|
namespace {
|
|
|
-void generateRandomDataUrandom(unsigned char* data, size_t length, int fd)
|
|
|
-{
|
|
|
- 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;
|
|
|
- }
|
|
|
+void generateRandomDataUrandom
|
|
|
+(unsigned char* data, size_t length, std::ifstream& devUrand)
|
|
|
+{
|
|
|
+ devUrand.read(reinterpret_cast<char*>(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);
|
|
|
}
|