//
#include <Security/devrandom.h>
+using namespace UnixPlusPlus;
+
namespace Security {
+//
+// The common (shared) open file descriptor to /dev/random
+//
+ModuleNexus<FileDesc> DevRandomGenerator::mDevRandom;
+
+
//
// DevRandomGenerator objects immediately open their file descriptors
//
DevRandomGenerator::DevRandomGenerator(bool writable)
{
- mDevRandom.open("/dev/random", writable ? O_RDWR : O_RDONLY);
+ FileDesc &fd = mDevRandom();
+ if (!fd) {
+ fd.open("/dev/random", writable ? O_RDWR : O_RDONLY);
+ } else if (writable && !fd.isWritable()) {
+ FileDesc newFd("/dev/random", O_RDWR);
+ fd.close();
+ fd = newFd;
+ }
}
//
void DevRandomGenerator::random(void *data, size_t length)
{
- mDevRandom.read(data, length);
+ mDevRandom().read(data, length);
}
//
void DevRandomGenerator::addEntropy(const void *data, size_t length)
{
- mDevRandom.write(data, length);
+ mDevRandom().write(data, length);
}