Bläddra i källkod

Use std::ifstream instead of file descriptor for generateRandomDataUrandom()

Usually required random bytes are short, it is advantageous to use
std::ifstream which is buffered I/O rather than read() syscall.
Tatsuhiro Tsujikawa 13 år sedan
förälder
incheckning
b6f8a3dbb3
1 ändrade filer med 10 tillägg och 18 borttagningar
  1. 10 18
      src/util.cc

+ 10 - 18
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)
-{
-  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);
   }