summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2012-01-08 01:21:42 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2012-01-08 01:21:42 +0900
commitb6f8a3dbb35c353b3cdeed853214ca74cbb548af (patch)
tree5547f986476fcf8b495b3663dada584ef32dc3b6 /src
parent46e59c4cc34b35f0cbbba1b9afbaf6f59bad7f62 (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.cc28
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);
}