Browse Source

Add a simple /dev/full.

Andreas Kling 6 năm trước cách đây
mục cha
commit
9f9b4a2382

+ 30 - 0
VirtualFileSystem/FullDevice.cpp

@@ -0,0 +1,30 @@
+#include "FullDevice.h"
+#include "Limits.h"
+#include "sys-errno.h"
+#include <AK/StdLib.h>
+#include <cstring>
+#include <cstdio>
+
+FullDevice::FullDevice()
+{
+}
+
+FullDevice::~FullDevice()
+{
+}
+
+ssize_t FullDevice::read(byte* buffer, size_t bufferSize)
+{
+    printf("read from full device\n");
+    size_t count = min(GoodBufferSize, bufferSize);
+    memset(buffer, 0, count);
+    return count;
+}
+
+ssize_t FullDevice::write(const byte*, size_t bufferSize)
+{
+    if (bufferSize == 0)
+        return 0;
+    return -ENOSPC;
+}
+

+ 13 - 0
VirtualFileSystem/FullDevice.h

@@ -0,0 +1,13 @@
+#pragma once
+
+#include "CharacterDevice.h"
+
+class FullDevice final : public CharacterDevice {
+public:
+    FullDevice();
+    virtual ~FullDevice();
+
+    ssize_t read(byte* buffer, size_t bufferSize) override;
+    ssize_t write(const byte* buffer, size_t bufferSize) override;
+};
+

+ 1 - 0
VirtualFileSystem/Makefile

@@ -21,6 +21,7 @@ VFS_OBJS = \
     CharacterDevice.o \
     ZeroDevice.o \
     NullDevice.o \
+    FullDevice.o \
     test.o
 
 OBJS = $(AK_OBJS) $(VFS_OBJS)

BIN
VirtualFileSystem/small.fs


+ 37 - 0
VirtualFileSystem/sys-errno.h

@@ -0,0 +1,37 @@
+#pragma once
+
+#define EPERM    1    // Operation not permitted
+#define ENOENT   2    // No such file or directory
+#define ESRCH    3    // No such process
+#define EINTR    4    // Interrupted system call
+#define EIO      5    // I/O error
+#define ENXIO    6    // No such device or address
+#define E2BIG    7    // Argument list too long
+#define ENOEXEC  8    // Exec format error
+#define EBADF    9    // Bad file number
+#define ECHILD  10    // No child processes
+#define EAGAIN  11    // Try again
+#define ENOMEM  12    // Out of memory
+#define EACCES  13    // Permission denied
+#define EFAULT  14    // Bad address
+#define ENOTBLK 15    // Block device required
+#define EBUSY   16    // Device or resource busy
+#define EEXIST  17    // File exists
+#define EXDEV   18    // Cross-device link
+#define ENODEV  19    // No such device
+#define ENOTDIR 20    // Not a directory
+#define EISDIR  21    // Is a directory
+#define EINVAL  22    // Invalid argument
+#define ENFILE  23    // File table overflow
+#define EMFILE  24    // Too many open files
+#define ENOTTY  25    // Not a typewriter
+#define ETXTBSY 26    // Text file busy
+#define EFBIG   27    // File too large
+#define ENOSPC  28    // No space left on device
+#define ESPIPE  29    // Illegal seek
+#define EROFS   30    // Read-only file system
+#define EMLINK  31    // Too many links
+#define EPIPE   32    // Broken pipe
+#define EDOM    33    // Math argument out of domain of func
+#define ERANGE  34    // Math result not representable
+

+ 4 - 0
VirtualFileSystem/test.cpp

@@ -5,6 +5,7 @@
 #include "SyntheticFileSystem.h"
 #include "ZeroDevice.h"
 #include "NullDevice.h"
+#include "FullDevice.h"
 #include <cstring>
 #include <AK/SimpleMalloc.h>
 #include <AK/kmalloc.h>
@@ -25,6 +26,9 @@ int main(int c, char** v)
     auto null = make<NullDevice>();
     vfs.registerCharacterDevice(1, 3, *null);
 
+    auto full = make<FullDevice>();
+    vfs.registerCharacterDevice(1, 7, *full);
+
     if (!vfs.mountRoot(makeFileSystem(filename))) {
         printf("Failed to mount root :(\n");
         return 1;