summaryrefslogtreecommitdiff
path: root/Kernel/FileSystem
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2019-07-09 14:46:23 +0200
committerAndreas Kling <awesomekling@gmail.com>2019-07-09 15:04:45 +0200
commitf4cec2f11086a355f01c616ba9cb092d56c0319f (patch)
tree9c08cca195f01bafa0da81a15c13fd6c12837688 /Kernel/FileSystem
parent6c87d3afa95121cdecb41552b9571253b3dca31b (diff)
downloadserenity-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.h2
-rw-r--r--Kernel/FileSystem/File.cpp30
-rw-r--r--Kernel/FileSystem/File.h77
-rw-r--r--Kernel/FileSystem/InodeFile.h2
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;