diff --git a/VirtualFileSystem/FullDevice.cpp b/VirtualFileSystem/FullDevice.cpp new file mode 100644 index 0000000000..2ef60e6299 --- /dev/null +++ b/VirtualFileSystem/FullDevice.cpp @@ -0,0 +1,30 @@ +#include "FullDevice.h" +#include "Limits.h" +#include "sys-errno.h" +#include +#include +#include + +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; +} + diff --git a/VirtualFileSystem/FullDevice.h b/VirtualFileSystem/FullDevice.h new file mode 100644 index 0000000000..ca1743270a --- /dev/null +++ b/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; +}; + diff --git a/VirtualFileSystem/Makefile b/VirtualFileSystem/Makefile index 035039a658..7b3df94bb4 100644 --- a/VirtualFileSystem/Makefile +++ b/VirtualFileSystem/Makefile @@ -21,6 +21,7 @@ VFS_OBJS = \ CharacterDevice.o \ ZeroDevice.o \ NullDevice.o \ + FullDevice.o \ test.o OBJS = $(AK_OBJS) $(VFS_OBJS) diff --git a/VirtualFileSystem/small.fs b/VirtualFileSystem/small.fs index 2970765b73..0eb8186ea1 100644 Binary files a/VirtualFileSystem/small.fs and b/VirtualFileSystem/small.fs differ diff --git a/VirtualFileSystem/sys-errno.h b/VirtualFileSystem/sys-errno.h new file mode 100644 index 0000000000..2c11307a0d --- /dev/null +++ b/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 + diff --git a/VirtualFileSystem/test.cpp b/VirtualFileSystem/test.cpp index e7ff504563..c7183611ee 100644 --- a/VirtualFileSystem/test.cpp +++ b/VirtualFileSystem/test.cpp @@ -5,6 +5,7 @@ #include "SyntheticFileSystem.h" #include "ZeroDevice.h" #include "NullDevice.h" +#include "FullDevice.h" #include #include #include @@ -25,6 +26,9 @@ int main(int c, char** v) auto null = make(); vfs.registerCharacterDevice(1, 3, *null); + auto full = make(); + vfs.registerCharacterDevice(1, 7, *full); + if (!vfs.mountRoot(makeFileSystem(filename))) { printf("Failed to mount root :(\n"); return 1;