diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2012-01-08 01:21:42 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2012-01-08 01:21:42 +0900 |
| commit | b6f8a3dbb35c353b3cdeed853214ca74cbb548af (patch) | |
| tree | 5547f986476fcf8b495b3663dada584ef32dc3b6 /src | |
| parent | 46e59c4cc34b35f0cbbba1b9afbaf6f59bad7f62 (diff) | |
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.
Diffstat (limited to 'src')
| -rw-r--r-- | src/util.cc | 28 |
1 files changed, 10 insertions, 18 deletions
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) -{ - 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); } |
