diff options
author | Andreas Kling <awesomekling@gmail.com> | 2019-07-09 14:46:23 +0200 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-07-09 15:04:45 +0200 |
commit | f4cec2f11086a355f01c616ba9cb092d56c0319f (patch) | |
tree | 9c08cca195f01bafa0da81a15c13fd6c12837688 /Kernel/FileSystem | |
parent | 6c87d3afa95121cdecb41552b9571253b3dca31b (diff) | |
download | serenity-f4cec2f11086a355f01c616ba9cb092d56c0319f.zip |
Kernel: Move File.{cpp,h} into FileSystem/
Also tweak the kernel's Makefile to use -nostdinc and -nostdinc++.
This prevents us from picking up random headers from ../Root, which may
include older versions of kernel headers.
Since we still need <initializer_list> for Vector, we specifically include
the necessary GCC path. This is a bit hackish but it works for now.
Diffstat (limited to 'Kernel/FileSystem')
-rw-r--r-- | Kernel/FileSystem/FIFO.h | 2 | ||||
-rw-r--r-- | Kernel/FileSystem/File.cpp | 30 | ||||
-rw-r--r-- | Kernel/FileSystem/File.h | 77 | ||||
-rw-r--r-- | Kernel/FileSystem/InodeFile.h | 2 |
4 files changed, 109 insertions, 2 deletions
diff --git a/Kernel/FileSystem/FIFO.h b/Kernel/FileSystem/FIFO.h index bd844dc9f0..77c5427ba2 100644 --- a/Kernel/FileSystem/FIFO.h +++ b/Kernel/FileSystem/FIFO.h @@ -1,7 +1,7 @@ #pragma once #include <Kernel/DoubleBuffer.h> -#include <Kernel/File.h> +#include <Kernel/FileSystem/File.h> #include <Kernel/UnixTypes.h> class FileDescription; diff --git a/Kernel/FileSystem/File.cpp b/Kernel/FileSystem/File.cpp new file mode 100644 index 0000000000..6f12224027 --- /dev/null +++ b/Kernel/FileSystem/File.cpp @@ -0,0 +1,30 @@ +#include <Kernel/FileSystem/File.h> +#include <Kernel/FileSystem/FileDescription.h> + +File::File() +{ +} + +File::~File() +{ +} + +KResultOr<NonnullRefPtr<FileDescription>> File::open(int options) +{ + UNUSED_PARAM(options); + return FileDescription::create(this); +} + +void File::close() +{ +} + +int File::ioctl(FileDescription&, unsigned, unsigned) +{ + return -ENOTTY; +} + +KResultOr<Region*> File::mmap(Process&, FileDescription&, VirtualAddress, size_t, size_t, int) +{ + return KResult(-ENODEV); +} diff --git a/Kernel/FileSystem/File.h b/Kernel/FileSystem/File.h new file mode 100644 index 0000000000..0f26eb6ec1 --- /dev/null +++ b/Kernel/FileSystem/File.h @@ -0,0 +1,77 @@ +#pragma once + +#include <AK/AKString.h> +#include <AK/RefCounted.h> +#include <AK/NonnullRefPtr.h> +#include <AK/Types.h> +#include <Kernel/KResult.h> +#include <Kernel/UnixTypes.h> +#include <Kernel/VirtualAddress.h> + +class FileDescription; +class Process; +class Region; + +// File is the base class for anything that can be referenced by a FileDescription. +// +// The most important functions in File are: +// +// read() and write() +// - Implement reading and writing. +// - Return the number of bytes read/written, OR a negative error code. +// +// can_read() and can_write() +// +// - Used to implement blocking I/O, and the select() and poll() syscalls. +// - Return true if read() or write() would succeed, respectively. +// - Note that can_read() should return true in EOF conditions, +// and a subsequent call to read() should return 0. +// +// ioctl() +// +// - Optional. If unimplemented, ioctl() on this File will fail with -ENOTTY. +// - Can be overridden in subclasses to implement arbitrary functionality. +// - Subclasses should take care to validate incoming addresses before dereferencing. +// +// mmap() +// +// - Optional. If unimplemented, mmap() on this File will fail with -ENODEV. +// - Called by mmap() when userspace wants to memory-map this File somewhere. +// - Should create a Region in the Process and return it if successful. + +class File : public RefCounted<File> { +public: + virtual ~File(); + + virtual KResultOr<NonnullRefPtr<FileDescription>> open(int options); + virtual void close(); + + virtual bool can_read(FileDescription&) const = 0; + virtual bool can_write(FileDescription&) const = 0; + + virtual ssize_t read(FileDescription&, u8*, ssize_t) = 0; + virtual ssize_t write(FileDescription&, const u8*, ssize_t) = 0; + virtual int ioctl(FileDescription&, unsigned request, unsigned arg); + virtual KResultOr<Region*> mmap(Process&, FileDescription&, VirtualAddress preferred_vaddr, size_t offset, size_t size, int prot); + + virtual String absolute_path(const FileDescription&) const = 0; + + virtual KResult truncate(off_t) { return KResult(-EINVAL); } + + virtual const char* class_name() const = 0; + + virtual bool is_seekable() const { return false; } + + virtual bool is_inode() const { return false; } + virtual bool is_shared_memory() const { return false; } + virtual bool is_fifo() const { return false; } + virtual bool is_device() const { return false; } + virtual bool is_tty() const { return false; } + virtual bool is_master_pty() const { return false; } + virtual bool is_block_device() const { return false; } + virtual bool is_character_device() const { return false; } + virtual bool is_socket() const { return false; } + +protected: + File(); +}; diff --git a/Kernel/FileSystem/InodeFile.h b/Kernel/FileSystem/InodeFile.h index b7101ff753..b2ee30c196 100644 --- a/Kernel/FileSystem/InodeFile.h +++ b/Kernel/FileSystem/InodeFile.h @@ -1,6 +1,6 @@ #pragma once -#include <Kernel/File.h> +#include <Kernel/FileSystem/File.h> class Inode; |