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.
This commit is contained in:
apio 2022-10-14 20:14:49 +02:00
parent faaf930a14
commit 91d76a2ee4
4 changed files with 70 additions and 1 deletions

View File

@ -117,9 +117,29 @@ int main()
if (fclose(config) < 0) { perror("fclose"); }
FILE* fp = fopen("/dev/random", "rw");
if (!fp)
{
perror("fopen");
return 1;
}
long int random = 0;
fread(&random, sizeof(random), 1, fp);
if (ferror(fp))
{
perror("fread");
return 1;
}
fclose(fp);
printf("\n\nGot random number %ld\n\n", random);
sleep(2);
printf("\n\nPress any key to restart.\n\n");
printf("Press any key to restart.\n\n");
return 0;
}

View File

@ -0,0 +1,9 @@
#pragma once
#include "fs/VFS.h"
namespace RandomDevice
{
VFS::Node* create_new(const char* devname);
ssize_t read(VFS::Node* node, size_t offset, size_t size, char* buffer);
}

View File

@ -1,5 +1,6 @@
#include "fs/devices/DeviceFS.h"
#include "fs/devices/Console.h"
#include "fs/devices/Random.h"
#include "fs/devices/Serial.h"
#include "fs/devices/Version.h"
#include "std/stdlib.h"
@ -25,6 +26,7 @@ VFS::Node* DeviceFS::get()
devfs_files[devfs_file_count++] = VersionDevice::create_new("version");
devfs_files[devfs_file_count++] = ConsoleDevice::create_new("console");
devfs_files[devfs_file_count++] = SerialDevice::create_new("serial");
devfs_files[devfs_file_count++] = RandomDevice::create_new("random");
return devfs_root;
}

View File

@ -0,0 +1,38 @@
#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;
}