mirror of https://github.com/aria2/aria2
Use /dev/urandom in generateRandomData() if available.
parent
dbb08c08ed
commit
2d6e087f58
42
src/util.cc
42
src/util.cc
|
@ -1393,13 +1393,53 @@ std::map<size_t, std::string> createIndexPathMap(std::istream& i)
|
||||||
return indexPathMap;
|
return indexPathMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
void generateRandomData(unsigned char* data, size_t length)
|
namespace {
|
||||||
|
void generateRandomDataRandom(unsigned char* data, size_t length)
|
||||||
{
|
{
|
||||||
const SharedHandle<SimpleRandomizer>& rd = SimpleRandomizer::getInstance();
|
const SharedHandle<SimpleRandomizer>& rd = SimpleRandomizer::getInstance();
|
||||||
for(size_t i = 0; i < length; ++i) {
|
for(size_t i = 0; i < length; ++i) {
|
||||||
data[i] = static_cast<unsigned long>(rd->getRandomNumber(256));
|
data[i] = static_cast<unsigned long>(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
|
bool saveAs
|
||||||
(const std::string& filename, const std::string& data, bool overwrite)
|
(const std::string& filename, const std::string& data, bool overwrite)
|
||||||
|
|
Loading…
Reference in New Issue