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:
parent
faaf930a14
commit
91d76a2ee4
@ -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;
|
||||
}
|
||||
|
9
kernel/include/fs/devices/Random.h
Normal file
9
kernel/include/fs/devices/Random.h
Normal 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);
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
|
38
kernel/src/fs/devices/Random.cpp
Normal file
38
kernel/src/fs/devices/Random.cpp
Normal 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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user