diff --git a/src/util.cc b/src/util.cc index e31b29fb..09c11425 100644 --- a/src/util.cc +++ b/src/util.cc @@ -1393,13 +1393,53 @@ std::map createIndexPathMap(std::istream& i) return indexPathMap; } -void generateRandomData(unsigned char* data, size_t length) +namespace { +void generateRandomDataRandom(unsigned char* data, size_t length) { const SharedHandle& rd = SimpleRandomizer::getInstance(); for(size_t i = 0; i < length; ++i) { data[i] = static_cast(rd->getRandomNumber(256)); } } +} // 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; + } +} +} // namespace + +void generateRandomData(unsigned char* data, size_t length) +{ +#ifdef __MINGW32__ + generateRandomDataRandom(data, length); +#else // !__MINGW32__ + static int method = -1; + static int fd; + if(method == 0) { + generateRandomDataUrandom(data, length, fd); + } else if(method == 1) { + generateRandomDataRandom(data, length); + } else { + while((fd = open("/dev/urandom", O_RDONLY)) == -1 && errno == EINTR); + if(fd == -1) { + method = 1; + } else { + method = 0; + } + } +#endif // !__MINGW32__ +} bool saveAs (const std::string& filename, const std::string& data, bool overwrite)