mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-22 07:30:19 +00:00
Add a simple /dev/random.
This commit is contained in:
parent
9528edab92
commit
05b088ee2f
Notes:
sideshowbarker
2024-07-19 18:48:00 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/05b088ee2f0
5 changed files with 65 additions and 1 deletions
|
@ -22,6 +22,7 @@ VFS_OBJS = \
|
|||
ZeroDevice.o \
|
||||
NullDevice.o \
|
||||
FullDevice.o \
|
||||
RandomDevice.o \
|
||||
test.o
|
||||
|
||||
OBJS = $(AK_OBJS) $(VFS_OBJS)
|
||||
|
|
47
VirtualFileSystem/RandomDevice.cpp
Normal file
47
VirtualFileSystem/RandomDevice.cpp
Normal file
|
@ -0,0 +1,47 @@
|
|||
#include "RandomDevice.h"
|
||||
#include "Limits.h"
|
||||
#include <AK/StdLib.h>
|
||||
#include <cstring>
|
||||
#include <cstdio>
|
||||
|
||||
RandomDevice::RandomDevice()
|
||||
{
|
||||
}
|
||||
|
||||
RandomDevice::~RandomDevice()
|
||||
{
|
||||
}
|
||||
|
||||
// Simple rand() and srand() borrowed from the POSIX standard:
|
||||
|
||||
static unsigned long next = 1;
|
||||
|
||||
#define MY_RAND_MAX 32767
|
||||
static int myrand()
|
||||
{
|
||||
next = next * 1103515245 + 12345;
|
||||
return((unsigned)(next/((MY_RAND_MAX + 1) * 2)) % (MY_RAND_MAX + 1));
|
||||
}
|
||||
|
||||
static void mysrand(unsigned seed)
|
||||
{
|
||||
next = seed;
|
||||
}
|
||||
|
||||
Unix::ssize_t RandomDevice::read(byte* buffer, Unix::size_t bufferSize)
|
||||
{
|
||||
const int range = 'z' - 'a';
|
||||
Unix::ssize_t nread = min(bufferSize, GoodBufferSize);
|
||||
for (Unix::ssize_t i = 0; i < nread; ++i) {
|
||||
double r = ((double)myrand() / (double)MY_RAND_MAX) * (double)range;
|
||||
buffer[i] = 'a' + r;
|
||||
}
|
||||
return nread;
|
||||
}
|
||||
|
||||
Unix::ssize_t RandomDevice::write(const byte*, Unix::size_t bufferSize)
|
||||
{
|
||||
// FIXME: Use input for entropy? I guess that could be a neat feature?
|
||||
return min(GoodBufferSize, bufferSize);
|
||||
}
|
||||
|
13
VirtualFileSystem/RandomDevice.h
Normal file
13
VirtualFileSystem/RandomDevice.h
Normal file
|
@ -0,0 +1,13 @@
|
|||
#pragma once
|
||||
|
||||
#include "CharacterDevice.h"
|
||||
|
||||
class RandomDevice final : public CharacterDevice {
|
||||
public:
|
||||
RandomDevice();
|
||||
virtual ~RandomDevice();
|
||||
|
||||
Unix::ssize_t read(byte* buffer, Unix::size_t bufferSize) override;
|
||||
Unix::ssize_t write(const byte* buffer, Unix::size_t bufferSize) override;
|
||||
};
|
||||
|
Binary file not shown.
|
@ -6,6 +6,7 @@
|
|||
#include "ZeroDevice.h"
|
||||
#include "NullDevice.h"
|
||||
#include "FullDevice.h"
|
||||
#include "RandomDevice.h"
|
||||
#include <cstring>
|
||||
#include <AK/SimpleMalloc.h>
|
||||
#include <AK/kmalloc.h>
|
||||
|
@ -29,6 +30,9 @@ int main(int c, char** v)
|
|||
auto full = make<FullDevice>();
|
||||
vfs.registerCharacterDevice(1, 7, *full);
|
||||
|
||||
auto random = make<RandomDevice>();
|
||||
vfs.registerCharacterDevice(1, 8, *random);
|
||||
|
||||
if (!vfs.mountRoot(makeFileSystem(filename))) {
|
||||
printf("Failed to mount root :(\n");
|
||||
return 1;
|
||||
|
@ -187,7 +191,6 @@ int main(int c, char** v)
|
|||
byte buffer[512];
|
||||
for (;;) {
|
||||
nread = handle->read(buffer, sizeof(buffer));
|
||||
printf("read() returned %d\n", nread);
|
||||
if (nread <= 0)
|
||||
break;
|
||||
fwrite(buffer, 1, nread, stdout);
|
||||
|
|
Loading…
Reference in a new issue