mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 17:52: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 \
 | ||||
|     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…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling