forked from Bananymous/banan-os
Kernel: Implement basic random device to /dev/random
This commit is contained in:
32
kernel/kernel/Device/RandomDevice.cpp
Normal file
32
kernel/kernel/Device/RandomDevice.cpp
Normal file
@@ -0,0 +1,32 @@
|
||||
#include <kernel/Device/DeviceNumbers.h>
|
||||
#include <kernel/Device/RandomDevice.h>
|
||||
#include <kernel/Random.h>
|
||||
|
||||
#include <sys/sysmacros.h>
|
||||
|
||||
namespace Kernel
|
||||
{
|
||||
|
||||
BAN::ErrorOr<BAN::RefPtr<RandomDevice>> RandomDevice::create(mode_t mode, uid_t uid, gid_t gid)
|
||||
{
|
||||
static uint32_t minor = 0;
|
||||
auto* result = new RandomDevice(mode, uid, gid, makedev(DeviceNumber::Random, minor++));
|
||||
if (result == nullptr)
|
||||
return BAN::Error::from_errno(ENOMEM);
|
||||
return BAN::RefPtr<RandomDevice>::adopt(result);
|
||||
}
|
||||
|
||||
BAN::ErrorOr<size_t> RandomDevice::read_impl(off_t, BAN::ByteSpan buffer)
|
||||
{
|
||||
size_t nwritten = 0;
|
||||
while (nwritten < buffer.size())
|
||||
{
|
||||
const uint64_t random = Random::get_u64();
|
||||
const size_t to_copy = BAN::Math::min(buffer.size() - nwritten, sizeof(random));
|
||||
memcpy(buffer.data() + nwritten, &random, to_copy);
|
||||
nwritten += to_copy;
|
||||
}
|
||||
return buffer.size();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -2,6 +2,7 @@
|
||||
#include <kernel/Device/DebugDevice.h>
|
||||
#include <kernel/Device/FramebufferDevice.h>
|
||||
#include <kernel/Device/NullDevice.h>
|
||||
#include <kernel/Device/RandomDevice.h>
|
||||
#include <kernel/Device/ZeroDevice.h>
|
||||
#include <kernel/FS/DevFS/FileSystem.h>
|
||||
#include <kernel/FS/TmpFS/Inode.h>
|
||||
@@ -26,6 +27,7 @@ namespace Kernel
|
||||
MUST(s_instance->TmpFileSystem::initialize(0755, 0, 0));
|
||||
s_instance->add_device(MUST(DebugDevice::create(0666, 0, 0)));
|
||||
s_instance->add_device(MUST(NullDevice::create(0666, 0, 0)));
|
||||
s_instance->add_device(MUST(RandomDevice::create(0666, 0, 0)));
|
||||
s_instance->add_device(MUST(ZeroDevice::create(0666, 0, 0)));
|
||||
s_instance->add_device(MUST(KeyboardDevice::create(0440, 0, 901)));
|
||||
s_instance->add_device(MUST(MouseDevice::create(0440, 0, 901)));
|
||||
|
||||
Reference in New Issue
Block a user