mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 17:02:45 +00:00 
			
		
		
		
	Add a simple /dev/random.
This commit is contained in:
		
							parent
							
								
									9528edab92
								
							
						
					
					
						commit
						05b088ee2f
					
				
					 5 changed files with 65 additions and 1 deletions
				
			
		|  | @ -22,6 +22,7 @@ VFS_OBJS = \ | ||||||
|     ZeroDevice.o \
 |     ZeroDevice.o \
 | ||||||
|     NullDevice.o \
 |     NullDevice.o \
 | ||||||
|     FullDevice.o \
 |     FullDevice.o \
 | ||||||
|  |     RandomDevice.o \
 | ||||||
|     test.o |     test.o | ||||||
| 
 | 
 | ||||||
| OBJS = $(AK_OBJS) $(VFS_OBJS) | 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 "ZeroDevice.h" | ||||||
| #include "NullDevice.h" | #include "NullDevice.h" | ||||||
| #include "FullDevice.h" | #include "FullDevice.h" | ||||||
|  | #include "RandomDevice.h" | ||||||
| #include <cstring> | #include <cstring> | ||||||
| #include <AK/SimpleMalloc.h> | #include <AK/SimpleMalloc.h> | ||||||
| #include <AK/kmalloc.h> | #include <AK/kmalloc.h> | ||||||
|  | @ -29,6 +30,9 @@ int main(int c, char** v) | ||||||
|     auto full = make<FullDevice>(); |     auto full = make<FullDevice>(); | ||||||
|     vfs.registerCharacterDevice(1, 7, *full); |     vfs.registerCharacterDevice(1, 7, *full); | ||||||
| 
 | 
 | ||||||
|  |     auto random = make<RandomDevice>(); | ||||||
|  |     vfs.registerCharacterDevice(1, 8, *random); | ||||||
|  | 
 | ||||||
|     if (!vfs.mountRoot(makeFileSystem(filename))) { |     if (!vfs.mountRoot(makeFileSystem(filename))) { | ||||||
|         printf("Failed to mount root :(\n"); |         printf("Failed to mount root :(\n"); | ||||||
|         return 1; |         return 1; | ||||||
|  | @ -187,7 +191,6 @@ int main(int c, char** v) | ||||||
|             byte buffer[512]; |             byte buffer[512]; | ||||||
|             for (;;) { |             for (;;) { | ||||||
|                 nread = handle->read(buffer, sizeof(buffer)); |                 nread = handle->read(buffer, sizeof(buffer)); | ||||||
|                 printf("read() returned %d\n", nread); |  | ||||||
|                 if (nread <= 0) |                 if (nread <= 0) | ||||||
|                     break; |                     break; | ||||||
|                 fwrite(buffer, 1, nread, stdout); |                 fwrite(buffer, 1, nread, stdout); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling