Luna/kernel/src/fs/devices/Random.cpp
apio 91d76a2ee4 Devices: Add a new RandomDevice :)
This new device uses the seeded Mersenne PRNG we use in the kernel.
This device is not meant for regular userspace use, but more for userspace to seed their own PRNGs from.

If the DeviceFS is mounted at /dev, this device can be found at /dev/random.
2022-10-14 20:14:49 +02:00

38 lines
917 B
C++

#include "fs/devices/Random.h"
#include "config.h"
#include "rand/Mersenne.h"
#include "render/TextRenderer.h"
#include "std/stdio.h"
#include "std/stdlib.h"
#include "std/string.h"
VFS::Node* RandomDevice::create_new(const char* devname)
{
VFS::Node* dev = new VFS::Node;
dev->read_func = RandomDevice::read;
dev->inode = 0;
dev->length = 0;
dev->type = VFS_DEVICE;
dev->flags = 0;
strncpy(dev->name, devname, sizeof(dev->name));
return dev;
}
ssize_t RandomDevice::read(VFS::Node* node, size_t, size_t size, char* buffer)
{
if (!node) return -1;
size_t nread = size;
while (size >= sizeof(uint64_t))
{
*(uint64_t*)buffer = Mersenne::get();
size -= sizeof(uint64_t);
buffer += sizeof(uint64_t);
}
while (size)
{
*buffer = (char)(Mersenne::get() & 0xFF);
size--;
buffer++;
}
return (ssize_t)nread;
}