1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 06:48:12 +00:00
serenity/Kernel/File.h
Andreas Kling 5e1c7cb32c Kernel: Memory-mapped files now have the absolute path as their name.
It's generated when the mapping is first created, so it won't update if
the file moves. Maybe that's something we should support, too.
2019-06-02 10:14:28 +02:00

77 lines
2.7 KiB
C++

#pragma once
#include <AK/AKString.h>
#include <AK/Retainable.h>
#include <AK/Retained.h>
#include <AK/Types.h>
#include <Kernel/KResult.h>
#include <Kernel/LinearAddress.h>
#include <Kernel/UnixTypes.h>
class FileDescriptor;
class Process;
class Region;
// File is the base class for anything that can be referenced by a FileDescriptor.
//
// 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 Retainable<File> {
public:
virtual ~File();
virtual KResultOr<Retained<FileDescriptor>> open(int options);
virtual void close();
virtual bool can_read(FileDescriptor&) const = 0;
virtual bool can_write(FileDescriptor&) const = 0;
virtual ssize_t read(FileDescriptor&, byte*, ssize_t) = 0;
virtual ssize_t write(FileDescriptor&, const byte*, ssize_t) = 0;
virtual int ioctl(FileDescriptor&, unsigned request, unsigned arg);
virtual KResultOr<Region*> mmap(Process&, FileDescriptor&, LinearAddress preferred_laddr, size_t offset, size_t size, int prot);
virtual String absolute_path(const FileDescriptor&) 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();
};