diff --git a/apps/src/init.c b/apps/src/init.c index 6001373b..f6c1f1c7 100644 --- a/apps/src/init.c +++ b/apps/src/init.c @@ -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; } diff --git a/kernel/include/fs/devices/Random.h b/kernel/include/fs/devices/Random.h new file mode 100644 index 00000000..916ba0c4 --- /dev/null +++ b/kernel/include/fs/devices/Random.h @@ -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); +} \ No newline at end of file diff --git a/kernel/src/fs/devices/DeviceFS.cpp b/kernel/src/fs/devices/DeviceFS.cpp index 2557bf4f..e6de7470 100644 --- a/kernel/src/fs/devices/DeviceFS.cpp +++ b/kernel/src/fs/devices/DeviceFS.cpp @@ -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; } diff --git a/kernel/src/fs/devices/Random.cpp b/kernel/src/fs/devices/Random.cpp new file mode 100644 index 00000000..ed309965 --- /dev/null +++ b/kernel/src/fs/devices/Random.cpp @@ -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; +} \ No newline at end of file