about summary refs log tree commit diff stats
path: root/tools/iso/kernel.soso/random.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/iso/kernel.soso/random.c')
-rw-r--r--tools/iso/kernel.soso/random.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/tools/iso/kernel.soso/random.c b/tools/iso/kernel.soso/random.c
new file mode 100644
index 00000000..c78501d8
--- /dev/null
+++ b/tools/iso/kernel.soso/random.c
@@ -0,0 +1,55 @@
+#include "random.h"
+#include "devfs.h"
+#include "device.h"
+#include "common.h"
+#include "process.h"
+#include "sleep.h"
+
+static BOOL random_open(File *file, uint32 flags);
+static int32 random_read(File *file, uint32 size, uint8 *buffer);
+
+void initializeRandom() {
+    Device device;
+    memset((uint8*)&device, 0, sizeof(Device));
+    strcpy(device.name, "random");
+    device.deviceType = FT_CharacterDevice;
+    device.open = random_open;
+    device.read = random_read;
+
+    registerDevice(&device);
+}
+
+static BOOL random_open(File *file, uint32 flags) {
+    return TRUE;
+}
+
+static int32 random_read(File *file, uint32 size, uint8 *buffer) {
+    if (size == 0) {
+        return 0;
+    }
+
+    //printkf("random_read: calling sleep\n");
+
+    //sleep(10000);
+
+    //printkf("random_read: returned from sleep\n");
+
+    uint32 number = rand();
+
+    if (size == 1) {
+        *buffer = (uint8)number;
+        return 1;
+    }
+    else if (size == 2 || size == 3) {
+        *((uint16*)buffer) = (uint16)number;
+        return 2;
+    }
+    else if (size >= 4) {
+        //printkf("random_read: buffer is %x, writing %x to buffer\n", buffer, number);
+
+        *((uint32*)buffer) = number;
+        return 4;
+    }
+
+    return 0;
+}