mirror of
https://github.com/SerenityOS/serenity
synced 2024-09-06 17:06:31 +00:00
Kernel: Rename FileDescription => OpenFileDescription
Dr. POSIX really calls these "open file description", not just "file description", so let's call them exactly that. :^)
This commit is contained in:
parent
dbd639a2d8
commit
4a9c18afb9
|
@ -31,7 +31,7 @@ UNMAP_AFTER_INIT NonnullRefPtr<ACPISysFSComponent> ACPISysFSComponent::create(St
|
|||
return adopt_ref(*new (nothrow) ACPISysFSComponent(name, paddr, table_size));
|
||||
}
|
||||
|
||||
KResultOr<size_t> ACPISysFSComponent::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, FileDescription*) const
|
||||
KResultOr<size_t> ACPISysFSComponent::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, OpenFileDescription*) const
|
||||
{
|
||||
auto blob = try_to_generate_buffer();
|
||||
if (!blob)
|
||||
|
|
|
@ -28,7 +28,7 @@ class ACPISysFSComponent : public SysFSComponent {
|
|||
public:
|
||||
static NonnullRefPtr<ACPISysFSComponent> create(String name, PhysicalAddress, size_t table_size);
|
||||
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer&, FileDescription*) const override;
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const override;
|
||||
|
||||
protected:
|
||||
OwnPtr<KBuffer> try_to_generate_buffer() const;
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
#include <AK/StringView.h>
|
||||
#include <Kernel/Arch/PC/BIOS.h>
|
||||
#include <Kernel/FileSystem/FileDescription.h>
|
||||
#include <Kernel/FileSystem/OpenFileDescription.h>
|
||||
#include <Kernel/KBufferBuilder.h>
|
||||
#include <Kernel/Memory/MemoryManager.h>
|
||||
#include <Kernel/Memory/TypedMapping.h>
|
||||
|
@ -29,7 +29,7 @@ UNMAP_AFTER_INIT BIOSSysFSComponent::BIOSSysFSComponent(String name)
|
|||
{
|
||||
}
|
||||
|
||||
KResultOr<size_t> BIOSSysFSComponent::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, FileDescription*) const
|
||||
KResultOr<size_t> BIOSSysFSComponent::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, OpenFileDescription*) const
|
||||
{
|
||||
auto blob = try_to_generate_buffer();
|
||||
if (!blob)
|
||||
|
|
|
@ -60,7 +60,7 @@ Memory::MappedROM map_ebda();
|
|||
|
||||
class BIOSSysFSComponent : public SysFSComponent {
|
||||
public:
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer&, FileDescription*) const override;
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const override;
|
||||
|
||||
protected:
|
||||
virtual OwnPtr<KBuffer> try_to_generate_buffer() const = 0;
|
||||
|
|
|
@ -60,7 +60,7 @@ PCIDeviceAttributeSysFSComponent::PCIDeviceAttributeSysFSComponent(String name,
|
|||
{
|
||||
}
|
||||
|
||||
KResultOr<size_t> PCIDeviceAttributeSysFSComponent::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, FileDescription*) const
|
||||
KResultOr<size_t> PCIDeviceAttributeSysFSComponent::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, OpenFileDescription*) const
|
||||
{
|
||||
auto blob = try_to_generate_buffer();
|
||||
if (!blob)
|
||||
|
|
|
@ -37,7 +37,7 @@ class PCIDeviceAttributeSysFSComponent : public SysFSComponent {
|
|||
public:
|
||||
static NonnullRefPtr<PCIDeviceAttributeSysFSComponent> create(String name, const PCIDeviceSysFSDirectory& device, size_t offset, size_t field_bytes_width);
|
||||
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer&, FileDescription*) const override;
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const override;
|
||||
virtual ~PCIDeviceAttributeSysFSComponent() {};
|
||||
|
||||
protected:
|
||||
|
|
|
@ -47,7 +47,7 @@ KResult SysFSUSBDeviceInformation::try_generate(KBufferBuilder& builder)
|
|||
return KSuccess;
|
||||
}
|
||||
|
||||
KResult SysFSUSBDeviceInformation::refresh_data(FileDescription& description) const
|
||||
KResult SysFSUSBDeviceInformation::refresh_data(OpenFileDescription& description) const
|
||||
{
|
||||
MutexLocker lock(m_lock);
|
||||
auto& cached_data = description.data();
|
||||
|
@ -63,7 +63,7 @@ KResult SysFSUSBDeviceInformation::refresh_data(FileDescription& description) co
|
|||
return KSuccess;
|
||||
}
|
||||
|
||||
KResultOr<size_t> SysFSUSBDeviceInformation::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, FileDescription* description) const
|
||||
KResultOr<size_t> SysFSUSBDeviceInformation::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, OpenFileDescription* description) const
|
||||
{
|
||||
dbgln_if(PROCFS_DEBUG, "SysFSUSBDeviceInformation @ {}: read_bytes offset: {} count: {}", name(), offset, count);
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ public:
|
|||
protected:
|
||||
explicit SysFSUSBDeviceInformation(USB::Device& device);
|
||||
|
||||
virtual KResultOr<size_t> read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, FileDescription*) const override;
|
||||
virtual KResultOr<size_t> read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, OpenFileDescription*) const override;
|
||||
|
||||
IntrusiveListNode<SysFSUSBDeviceInformation, RefPtr<SysFSUSBDeviceInformation>> m_list_node;
|
||||
|
||||
|
@ -34,7 +34,7 @@ protected:
|
|||
|
||||
private:
|
||||
KResult try_generate(KBufferBuilder&);
|
||||
virtual KResult refresh_data(FileDescription& description) const override;
|
||||
virtual KResult refresh_data(OpenFileDescription& description) const override;
|
||||
mutable Mutex m_lock { "SysFSUSBDeviceInformation" };
|
||||
};
|
||||
|
||||
|
|
|
@ -86,12 +86,12 @@ void ConsolePort::handle_queue_update(Badge<VirtIO::Console>, u16 queue_index)
|
|||
}
|
||||
}
|
||||
|
||||
bool ConsolePort::can_read(const FileDescription&, size_t) const
|
||||
bool ConsolePort::can_read(const OpenFileDescription&, size_t) const
|
||||
{
|
||||
return m_receive_buffer->used_bytes() > 0;
|
||||
}
|
||||
|
||||
KResultOr<size_t> ConsolePort::read(FileDescription& desc, u64, UserOrKernelBuffer& buffer, size_t size)
|
||||
KResultOr<size_t> ConsolePort::read(OpenFileDescription& desc, u64, UserOrKernelBuffer& buffer, size_t size)
|
||||
{
|
||||
if (!size)
|
||||
return 0;
|
||||
|
@ -119,12 +119,12 @@ KResultOr<size_t> ConsolePort::read(FileDescription& desc, u64, UserOrKernelBuff
|
|||
return bytes_copied;
|
||||
}
|
||||
|
||||
bool ConsolePort::can_write(const FileDescription&, size_t) const
|
||||
bool ConsolePort::can_write(const OpenFileDescription&, size_t) const
|
||||
{
|
||||
return m_console.get_queue(m_transmit_queue).has_free_slots() && m_transmit_buffer->has_space();
|
||||
}
|
||||
|
||||
KResultOr<size_t> ConsolePort::write(FileDescription& desc, u64, const UserOrKernelBuffer& data, size_t size)
|
||||
KResultOr<size_t> ConsolePort::write(OpenFileDescription& desc, u64, const UserOrKernelBuffer& data, size_t size)
|
||||
{
|
||||
if (!size)
|
||||
return 0;
|
||||
|
@ -163,7 +163,7 @@ String ConsolePort::device_name() const
|
|||
return String::formatted("hvc{}p{}", m_console.device_id(), m_port);
|
||||
}
|
||||
|
||||
KResultOr<NonnullRefPtr<FileDescription>> ConsolePort::open(int options)
|
||||
KResultOr<NonnullRefPtr<OpenFileDescription>> ConsolePort::open(int options)
|
||||
{
|
||||
if (!m_open)
|
||||
m_console.send_open_control_message(m_port, true);
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
|
||||
#include <Kernel/Bus/VirtIO/Device.h>
|
||||
#include <Kernel/Devices/CharacterDevice.h>
|
||||
#include <Kernel/FileSystem/FileDescription.h>
|
||||
#include <Kernel/FileSystem/OpenFileDescription.h>
|
||||
#include <Kernel/Memory/RingBuffer.h>
|
||||
|
||||
namespace Kernel::VirtIO {
|
||||
|
@ -34,11 +34,11 @@ private:
|
|||
|
||||
virtual StringView class_name() const override { return "VirtIOConsolePort"; }
|
||||
|
||||
virtual bool can_read(const FileDescription&, size_t) const override;
|
||||
virtual KResultOr<size_t> read(FileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_write(const FileDescription&, size_t) const override;
|
||||
virtual KResultOr<size_t> write(FileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
|
||||
virtual KResultOr<NonnullRefPtr<FileDescription>> open(int options) override;
|
||||
virtual bool can_read(const OpenFileDescription&, size_t) const override;
|
||||
virtual KResultOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_write(const OpenFileDescription&, size_t) const override;
|
||||
virtual KResultOr<size_t> write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
|
||||
virtual KResultOr<NonnullRefPtr<OpenFileDescription>> open(int options) override;
|
||||
|
||||
mode_t required_mode() const override { return 0666; }
|
||||
|
||||
|
|
|
@ -115,13 +115,13 @@ set(KERNEL_SOURCES
|
|||
FileSystem/FIFO.cpp
|
||||
FileSystem/File.cpp
|
||||
FileSystem/FileBackedFileSystem.cpp
|
||||
FileSystem/FileDescription.cpp
|
||||
FileSystem/FileSystem.cpp
|
||||
FileSystem/Inode.cpp
|
||||
FileSystem/InodeFile.cpp
|
||||
FileSystem/InodeWatcher.cpp
|
||||
FileSystem/ISO9660FileSystem.cpp
|
||||
FileSystem/Mount.cpp
|
||||
FileSystem/OpenFileDescription.cpp
|
||||
FileSystem/Plan9FileSystem.cpp
|
||||
FileSystem/ProcFS.cpp
|
||||
FileSystem/SysFS.cpp
|
||||
|
@ -420,7 +420,7 @@ if (ENABLE_KERNEL_COVERAGE_COLLECTION)
|
|||
../Kernel/Devices/KCOVDevice.cpp
|
||||
../Kernel/Devices/KCOVInstance.cpp
|
||||
../Kernel/FileSystem/File.cpp
|
||||
../Kernel/FileSystem/FileDescription.cpp
|
||||
../Kernel/FileSystem/OpenFileDescription.cpp
|
||||
../Kernel/Heap/SlabAllocator.cpp
|
||||
../Kernel/init.cpp
|
||||
../Kernel/SanCov.cpp
|
||||
|
|
|
@ -41,19 +41,19 @@ UNMAP_AFTER_INIT ConsoleDevice::~ConsoleDevice()
|
|||
{
|
||||
}
|
||||
|
||||
bool ConsoleDevice::can_read(const Kernel::FileDescription&, size_t) const
|
||||
bool ConsoleDevice::can_read(const Kernel::OpenFileDescription&, size_t) const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
Kernel::KResultOr<size_t> ConsoleDevice::read(FileDescription&, u64, Kernel::UserOrKernelBuffer&, size_t)
|
||||
Kernel::KResultOr<size_t> ConsoleDevice::read(OpenFileDescription&, u64, Kernel::UserOrKernelBuffer&, size_t)
|
||||
{
|
||||
// FIXME: Implement reading from the console.
|
||||
// Maybe we could use a ring buffer for this device?
|
||||
return 0;
|
||||
}
|
||||
|
||||
Kernel::KResultOr<size_t> ConsoleDevice::write(FileDescription&, u64, const Kernel::UserOrKernelBuffer& data, size_t size)
|
||||
Kernel::KResultOr<size_t> ConsoleDevice::write(OpenFileDescription&, u64, const Kernel::UserOrKernelBuffer& data, size_t size)
|
||||
{
|
||||
if (!size)
|
||||
return 0;
|
||||
|
|
|
@ -23,10 +23,10 @@ public:
|
|||
virtual ~ConsoleDevice() override;
|
||||
|
||||
// ^CharacterDevice
|
||||
virtual bool can_read(const Kernel::FileDescription&, size_t) const override;
|
||||
virtual bool can_write(const Kernel::FileDescription&, size_t) const override { return true; }
|
||||
virtual Kernel::KResultOr<size_t> read(FileDescription&, u64, Kernel::UserOrKernelBuffer&, size_t) override;
|
||||
virtual Kernel::KResultOr<size_t> write(FileDescription&, u64, const Kernel::UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_read(const Kernel::OpenFileDescription&, size_t) const override;
|
||||
virtual bool can_write(const Kernel::OpenFileDescription&, size_t) const override { return true; }
|
||||
virtual Kernel::KResultOr<size_t> read(OpenFileDescription&, u64, Kernel::UserOrKernelBuffer&, size_t) override;
|
||||
virtual Kernel::KResultOr<size_t> write(OpenFileDescription&, u64, const Kernel::UserOrKernelBuffer&, size_t) override;
|
||||
virtual StringView class_name() const override { return "Console"; }
|
||||
|
||||
void put_char(char);
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
#include <AK/JsonObjectSerializer.h>
|
||||
#include <Kernel/Coredump.h>
|
||||
#include <Kernel/FileSystem/Custody.h>
|
||||
#include <Kernel/FileSystem/FileDescription.h>
|
||||
#include <Kernel/FileSystem/OpenFileDescription.h>
|
||||
#include <Kernel/FileSystem/VirtualFileSystem.h>
|
||||
#include <Kernel/KLexicalPath.h>
|
||||
#include <Kernel/Locking/Spinlock.h>
|
||||
|
@ -34,14 +34,14 @@ KResultOr<NonnullOwnPtr<Coredump>> Coredump::try_create(NonnullRefPtr<Process> p
|
|||
return adopt_nonnull_own_or_enomem(new (nothrow) Coredump(move(process), move(description)));
|
||||
}
|
||||
|
||||
Coredump::Coredump(NonnullRefPtr<Process> process, NonnullRefPtr<FileDescription> description)
|
||||
Coredump::Coredump(NonnullRefPtr<Process> process, NonnullRefPtr<OpenFileDescription> description)
|
||||
: m_process(move(process))
|
||||
, m_description(move(description))
|
||||
, m_num_program_headers(m_process->address_space().region_count() + 1) // +1 for NOTE segment
|
||||
{
|
||||
}
|
||||
|
||||
KResultOr<NonnullRefPtr<FileDescription>> Coredump::try_create_target_file(Process const& process, StringView output_path)
|
||||
KResultOr<NonnullRefPtr<OpenFileDescription>> Coredump::try_create_target_file(Process const& process, StringView output_path)
|
||||
{
|
||||
auto output_directory = KLexicalPath::dirname(output_path);
|
||||
auto dump_directory = TRY(VirtualFileSystem::the().open_directory(output_directory, VirtualFileSystem::the().root_custody()));
|
||||
|
|
|
@ -21,8 +21,8 @@ public:
|
|||
KResult write();
|
||||
|
||||
private:
|
||||
Coredump(NonnullRefPtr<Process>, NonnullRefPtr<FileDescription>);
|
||||
static KResultOr<NonnullRefPtr<FileDescription>> try_create_target_file(Process const&, StringView output_path);
|
||||
Coredump(NonnullRefPtr<Process>, NonnullRefPtr<OpenFileDescription>);
|
||||
static KResultOr<NonnullRefPtr<OpenFileDescription>> try_create_target_file(Process const&, StringView output_path);
|
||||
|
||||
KResult write_elf_header();
|
||||
KResult write_program_headers(size_t notes_size);
|
||||
|
@ -36,7 +36,7 @@ private:
|
|||
KResult create_notes_metadata_data(auto&) const;
|
||||
|
||||
NonnullRefPtr<Process> m_process;
|
||||
NonnullRefPtr<FileDescription> m_description;
|
||||
NonnullRefPtr<OpenFileDescription> m_description;
|
||||
const size_t m_num_program_headers;
|
||||
};
|
||||
|
||||
|
|
|
@ -55,7 +55,7 @@ String Device::absolute_path() const
|
|||
return String::formatted("/dev/{}", device_name());
|
||||
}
|
||||
|
||||
String Device::absolute_path(const FileDescription&) const
|
||||
String Device::absolute_path(const OpenFileDescription&) const
|
||||
{
|
||||
return absolute_path();
|
||||
}
|
||||
|
|
|
@ -31,7 +31,7 @@ public:
|
|||
unsigned major() const { return m_major; }
|
||||
unsigned minor() const { return m_minor; }
|
||||
|
||||
virtual String absolute_path(const FileDescription&) const override;
|
||||
virtual String absolute_path(const OpenFileDescription&) const override;
|
||||
virtual String absolute_path() const;
|
||||
|
||||
UserID uid() const { return m_uid; }
|
||||
|
|
|
@ -25,18 +25,18 @@ UNMAP_AFTER_INIT FullDevice::~FullDevice()
|
|||
{
|
||||
}
|
||||
|
||||
bool FullDevice::can_read(const FileDescription&, size_t) const
|
||||
bool FullDevice::can_read(const OpenFileDescription&, size_t) const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
KResultOr<size_t> FullDevice::read(FileDescription&, u64, UserOrKernelBuffer& buffer, size_t size)
|
||||
KResultOr<size_t> FullDevice::read(OpenFileDescription&, u64, UserOrKernelBuffer& buffer, size_t size)
|
||||
{
|
||||
TRY(buffer.memset(0, size));
|
||||
return size;
|
||||
}
|
||||
|
||||
KResultOr<size_t> FullDevice::write(FileDescription&, u64, const UserOrKernelBuffer&, size_t size)
|
||||
KResultOr<size_t> FullDevice::write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t size)
|
||||
{
|
||||
if (size == 0)
|
||||
return 0;
|
||||
|
|
|
@ -24,10 +24,10 @@ private:
|
|||
FullDevice();
|
||||
|
||||
// ^CharacterDevice
|
||||
virtual KResultOr<size_t> read(FileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual KResultOr<size_t> write(FileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_read(const FileDescription&, size_t) const override;
|
||||
virtual bool can_write(const FileDescription&, size_t) const override { return true; }
|
||||
virtual KResultOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual KResultOr<size_t> write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_read(const OpenFileDescription&, size_t) const override;
|
||||
virtual bool can_write(const OpenFileDescription&, size_t) const override { return true; }
|
||||
virtual StringView class_name() const override { return "FullDevice"; }
|
||||
};
|
||||
|
||||
|
|
|
@ -273,12 +273,12 @@ UNMAP_AFTER_INIT KeyboardDevice::~KeyboardDevice()
|
|||
{
|
||||
}
|
||||
|
||||
bool KeyboardDevice::can_read(const FileDescription&, size_t) const
|
||||
bool KeyboardDevice::can_read(const OpenFileDescription&, size_t) const
|
||||
{
|
||||
return !m_queue.is_empty();
|
||||
}
|
||||
|
||||
KResultOr<size_t> KeyboardDevice::read(FileDescription&, u64, UserOrKernelBuffer& buffer, size_t size)
|
||||
KResultOr<size_t> KeyboardDevice::read(OpenFileDescription&, u64, UserOrKernelBuffer& buffer, size_t size)
|
||||
{
|
||||
size_t nread = 0;
|
||||
SpinlockLocker lock(m_queue_lock);
|
||||
|
@ -306,12 +306,12 @@ KResultOr<size_t> KeyboardDevice::read(FileDescription&, u64, UserOrKernelBuffer
|
|||
return nread;
|
||||
}
|
||||
|
||||
KResultOr<size_t> KeyboardDevice::write(FileDescription&, u64, const UserOrKernelBuffer&, size_t)
|
||||
KResultOr<size_t> KeyboardDevice::write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
KResult KeyboardDevice::ioctl(FileDescription&, unsigned request, Userspace<void*> arg)
|
||||
KResult KeyboardDevice::ioctl(OpenFileDescription&, unsigned request, Userspace<void*> arg)
|
||||
{
|
||||
switch (request) {
|
||||
case KEYBOARD_IOCTL_GET_NUM_LOCK: {
|
||||
|
|
|
@ -25,10 +25,10 @@ public:
|
|||
virtual ~KeyboardDevice() override;
|
||||
|
||||
// ^CharacterDevice
|
||||
virtual KResultOr<size_t> read(FileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_read(const FileDescription&, size_t) const override;
|
||||
virtual KResultOr<size_t> write(FileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_write(const FileDescription&, size_t) const override { return true; }
|
||||
virtual KResultOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_read(const OpenFileDescription&, size_t) const override;
|
||||
virtual KResultOr<size_t> write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_write(const OpenFileDescription&, size_t) const override { return true; }
|
||||
|
||||
// ^HIDDevice
|
||||
virtual Type instrument_type() const override { return Type::Keyboard; }
|
||||
|
@ -37,7 +37,7 @@ public:
|
|||
virtual mode_t required_mode() const override { return 0440; }
|
||||
|
||||
// ^File
|
||||
virtual KResult ioctl(FileDescription&, unsigned request, Userspace<void*> arg) override;
|
||||
virtual KResult ioctl(OpenFileDescription&, unsigned request, Userspace<void*> arg) override;
|
||||
|
||||
virtual String device_name() const override { return String::formatted("keyboard{}", minor()); }
|
||||
|
||||
|
|
|
@ -18,13 +18,13 @@ MouseDevice::~MouseDevice()
|
|||
{
|
||||
}
|
||||
|
||||
bool MouseDevice::can_read(const FileDescription&, size_t) const
|
||||
bool MouseDevice::can_read(const OpenFileDescription&, size_t) const
|
||||
{
|
||||
SpinlockLocker lock(m_queue_lock);
|
||||
return !m_queue.is_empty();
|
||||
}
|
||||
|
||||
KResultOr<size_t> MouseDevice::read(FileDescription&, u64, UserOrKernelBuffer& buffer, size_t size)
|
||||
KResultOr<size_t> MouseDevice::read(OpenFileDescription&, u64, UserOrKernelBuffer& buffer, size_t size)
|
||||
{
|
||||
VERIFY(size > 0);
|
||||
size_t nread = 0;
|
||||
|
@ -48,7 +48,7 @@ KResultOr<size_t> MouseDevice::read(FileDescription&, u64, UserOrKernelBuffer& b
|
|||
return nread;
|
||||
}
|
||||
|
||||
KResultOr<size_t> MouseDevice::write(FileDescription&, u64, const UserOrKernelBuffer&, size_t)
|
||||
KResultOr<size_t> MouseDevice::write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -23,10 +23,10 @@ public:
|
|||
virtual ~MouseDevice() override;
|
||||
|
||||
// ^CharacterDevice
|
||||
virtual KResultOr<size_t> read(FileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_read(const FileDescription&, size_t) const override;
|
||||
virtual KResultOr<size_t> write(FileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_write(const FileDescription&, size_t) const override { return true; }
|
||||
virtual KResultOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_read(const OpenFileDescription&, size_t) const override;
|
||||
virtual KResultOr<size_t> write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_write(const OpenFileDescription&, size_t) const override { return true; }
|
||||
|
||||
// ^HIDDevice
|
||||
virtual Type instrument_type() const override { return Type::Mouse; }
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
#include <AK/NonnullOwnPtr.h>
|
||||
#include <Kernel/Devices/KCOVDevice.h>
|
||||
#include <Kernel/Devices/KCOVInstance.h>
|
||||
#include <Kernel/FileSystem/FileDescription.h>
|
||||
#include <Kernel/FileSystem/OpenFileDescription.h>
|
||||
#include <LibC/sys/ioctl_numbers.h>
|
||||
|
||||
#include <Kernel/Panic.h>
|
||||
|
@ -61,7 +61,7 @@ void KCOVDevice::free_process()
|
|||
delete kcov_instance;
|
||||
}
|
||||
|
||||
KResultOr<NonnullRefPtr<FileDescription>> KCOVDevice::open(int options)
|
||||
KResultOr<NonnullRefPtr<OpenFileDescription>> KCOVDevice::open(int options)
|
||||
{
|
||||
auto pid = Process::current().pid();
|
||||
if (proc_instance->get(pid).has_value())
|
||||
|
@ -73,7 +73,7 @@ KResultOr<NonnullRefPtr<FileDescription>> KCOVDevice::open(int options)
|
|||
return File::open(options);
|
||||
}
|
||||
|
||||
KResult KCOVDevice::ioctl(FileDescription&, unsigned request, Userspace<void*> arg)
|
||||
KResult KCOVDevice::ioctl(OpenFileDescription&, unsigned request, Userspace<void*> arg)
|
||||
{
|
||||
KResult return_value = KSuccess;
|
||||
auto thread = Thread::current();
|
||||
|
@ -127,7 +127,7 @@ KResult KCOVDevice::ioctl(FileDescription&, unsigned request, Userspace<void*> a
|
|||
return return_value;
|
||||
}
|
||||
|
||||
KResultOr<Memory::Region*> KCOVDevice::mmap(Process& process, FileDescription&, Memory::VirtualRange const& range, u64 offset, int prot, bool shared)
|
||||
KResultOr<Memory::Region*> KCOVDevice::mmap(Process& process, OpenFileDescription&, Memory::VirtualRange const& range, u64 offset, int prot, bool shared)
|
||||
{
|
||||
auto pid = process.pid();
|
||||
auto maybe_kcov_instance = proc_instance->get(pid);
|
||||
|
|
|
@ -22,8 +22,8 @@ public:
|
|||
static void free_process();
|
||||
|
||||
// ^File
|
||||
KResultOr<Memory::Region*> mmap(Process&, FileDescription&, Memory::VirtualRange const&, u64 offset, int prot, bool shared) override;
|
||||
KResultOr<NonnullRefPtr<FileDescription>> open(int options) override;
|
||||
KResultOr<Memory::Region*> mmap(Process&, OpenFileDescription&, Memory::VirtualRange const&, u64 offset, int prot, bool shared) override;
|
||||
KResultOr<NonnullRefPtr<OpenFileDescription>> open(int options) override;
|
||||
|
||||
// ^Device
|
||||
virtual mode_t required_mode() const override { return 0660; }
|
||||
|
@ -32,12 +32,12 @@ public:
|
|||
protected:
|
||||
virtual StringView class_name() const override { return "KCOVDevice"; }
|
||||
|
||||
virtual bool can_read(const FileDescription&, size_t) const override final { return true; }
|
||||
virtual bool can_write(const FileDescription&, size_t) const override final { return true; }
|
||||
virtual bool can_read(const OpenFileDescription&, size_t) const override final { return true; }
|
||||
virtual bool can_write(const OpenFileDescription&, size_t) const override final { return true; }
|
||||
virtual void start_request(AsyncBlockDeviceRequest& request) override final { request.complete(AsyncDeviceRequest::Failure); }
|
||||
virtual KResultOr<size_t> read(FileDescription&, u64, UserOrKernelBuffer&, size_t) override { return EINVAL; }
|
||||
virtual KResultOr<size_t> write(FileDescription&, u64, const UserOrKernelBuffer&, size_t) override { return EINVAL; }
|
||||
virtual KResult ioctl(FileDescription&, unsigned request, Userspace<void*> arg) override;
|
||||
virtual KResultOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override { return EINVAL; }
|
||||
virtual KResultOr<size_t> write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t) override { return EINVAL; }
|
||||
virtual KResult ioctl(OpenFileDescription&, unsigned request, Userspace<void*> arg) override;
|
||||
|
||||
private:
|
||||
KCOVDevice();
|
||||
|
|
|
@ -27,17 +27,17 @@ UNMAP_AFTER_INIT MemoryDevice::~MemoryDevice()
|
|||
{
|
||||
}
|
||||
|
||||
KResultOr<size_t> MemoryDevice::read(FileDescription&, u64, UserOrKernelBuffer&, size_t)
|
||||
KResultOr<size_t> MemoryDevice::read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t)
|
||||
{
|
||||
TODO();
|
||||
}
|
||||
|
||||
void MemoryDevice::did_seek(FileDescription&, off_t)
|
||||
void MemoryDevice::did_seek(OpenFileDescription&, off_t)
|
||||
{
|
||||
TODO();
|
||||
}
|
||||
|
||||
KResultOr<Memory::Region*> MemoryDevice::mmap(Process& process, FileDescription&, Memory::VirtualRange const& range, u64 offset, int prot, bool shared)
|
||||
KResultOr<Memory::Region*> MemoryDevice::mmap(Process& process, OpenFileDescription&, Memory::VirtualRange const& range, u64 offset, int prot, bool shared)
|
||||
{
|
||||
auto viewed_address = PhysicalAddress(offset);
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ public:
|
|||
static NonnullRefPtr<MemoryDevice> must_create();
|
||||
~MemoryDevice();
|
||||
|
||||
virtual KResultOr<Memory::Region*> mmap(Process&, FileDescription&, Memory::VirtualRange const&, u64 offset, int prot, bool shared) override;
|
||||
virtual KResultOr<Memory::Region*> mmap(Process&, OpenFileDescription&, Memory::VirtualRange const&, u64 offset, int prot, bool shared) override;
|
||||
|
||||
// ^Device
|
||||
virtual mode_t required_mode() const override { return 0660; }
|
||||
|
@ -28,13 +28,13 @@ public:
|
|||
private:
|
||||
MemoryDevice();
|
||||
virtual StringView class_name() const override { return "MemoryDevice"; }
|
||||
virtual bool can_read(const FileDescription&, size_t) const override { return true; }
|
||||
virtual bool can_write(const FileDescription&, size_t) const override { return false; }
|
||||
virtual bool can_read(const OpenFileDescription&, size_t) const override { return true; }
|
||||
virtual bool can_write(const OpenFileDescription&, size_t) const override { return false; }
|
||||
virtual bool is_seekable() const override { return true; }
|
||||
virtual KResultOr<size_t> read(FileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual KResultOr<size_t> write(FileDescription&, u64, const UserOrKernelBuffer&, size_t) override { return EINVAL; }
|
||||
virtual KResultOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual KResultOr<size_t> write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t) override { return EINVAL; }
|
||||
|
||||
virtual void did_seek(FileDescription&, off_t) override;
|
||||
virtual void did_seek(OpenFileDescription&, off_t) override;
|
||||
|
||||
bool is_allowed_range(PhysicalAddress, Memory::VirtualRange const&) const;
|
||||
};
|
||||
|
|
|
@ -31,17 +31,17 @@ UNMAP_AFTER_INIT NullDevice::~NullDevice()
|
|||
{
|
||||
}
|
||||
|
||||
bool NullDevice::can_read(const FileDescription&, size_t) const
|
||||
bool NullDevice::can_read(const OpenFileDescription&, size_t) const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
KResultOr<size_t> NullDevice::read(FileDescription&, u64, UserOrKernelBuffer&, size_t)
|
||||
KResultOr<size_t> NullDevice::read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
KResultOr<size_t> NullDevice::write(FileDescription&, u64, const UserOrKernelBuffer&, size_t buffer_size)
|
||||
KResultOr<size_t> NullDevice::write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t buffer_size)
|
||||
{
|
||||
return buffer_size;
|
||||
}
|
||||
|
|
|
@ -25,10 +25,10 @@ public:
|
|||
|
||||
private:
|
||||
// ^CharacterDevice
|
||||
virtual KResultOr<size_t> read(FileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual KResultOr<size_t> write(FileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_write(const FileDescription&, size_t) const override { return true; }
|
||||
virtual bool can_read(const FileDescription&, size_t) const override;
|
||||
virtual KResultOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual KResultOr<size_t> write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_write(const OpenFileDescription&, size_t) const override { return true; }
|
||||
virtual bool can_read(const OpenFileDescription&, size_t) const override;
|
||||
virtual StringView class_name() const override { return "NullDevice"; }
|
||||
virtual bool is_seekable() const override { return true; }
|
||||
};
|
||||
|
|
|
@ -24,12 +24,12 @@ UNMAP_AFTER_INIT RandomDevice::~RandomDevice()
|
|||
{
|
||||
}
|
||||
|
||||
bool RandomDevice::can_read(const FileDescription&, size_t) const
|
||||
bool RandomDevice::can_read(const OpenFileDescription&, size_t) const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
KResultOr<size_t> RandomDevice::read(FileDescription&, u64, UserOrKernelBuffer& buffer, size_t size)
|
||||
KResultOr<size_t> RandomDevice::read(OpenFileDescription&, u64, UserOrKernelBuffer& buffer, size_t size)
|
||||
{
|
||||
return buffer.write_buffered<256>(size, [&](Bytes bytes) {
|
||||
get_good_random_bytes(bytes);
|
||||
|
@ -37,7 +37,7 @@ KResultOr<size_t> RandomDevice::read(FileDescription&, u64, UserOrKernelBuffer&
|
|||
});
|
||||
}
|
||||
|
||||
KResultOr<size_t> RandomDevice::write(FileDescription&, u64, const UserOrKernelBuffer&, size_t size)
|
||||
KResultOr<size_t> RandomDevice::write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t size)
|
||||
{
|
||||
// FIXME: Use input for entropy? I guess that could be a neat feature?
|
||||
return size;
|
||||
|
|
|
@ -24,10 +24,10 @@ private:
|
|||
RandomDevice();
|
||||
|
||||
// ^CharacterDevice
|
||||
virtual KResultOr<size_t> read(FileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual KResultOr<size_t> write(FileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_read(const FileDescription&, size_t) const override;
|
||||
virtual bool can_write(const FileDescription&, size_t) const override { return true; }
|
||||
virtual KResultOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual KResultOr<size_t> write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_read(const OpenFileDescription&, size_t) const override;
|
||||
virtual bool can_write(const OpenFileDescription&, size_t) const override { return true; }
|
||||
virtual StringView class_name() const override { return "RandomDevice"; }
|
||||
};
|
||||
|
||||
|
|
|
@ -122,7 +122,7 @@ UNMAP_AFTER_INIT void SB16::initialize()
|
|||
set_sample_rate(m_sample_rate);
|
||||
}
|
||||
|
||||
KResult SB16::ioctl(FileDescription&, unsigned request, Userspace<void*> arg)
|
||||
KResult SB16::ioctl(OpenFileDescription&, unsigned request, Userspace<void*> arg)
|
||||
{
|
||||
switch (request) {
|
||||
case SOUNDCARD_IOCTL_GET_SAMPLE_RATE: {
|
||||
|
@ -190,12 +190,12 @@ void SB16::set_irq_line(u8 irq_number)
|
|||
change_irq_number(irq_number);
|
||||
}
|
||||
|
||||
bool SB16::can_read(FileDescription const&, size_t) const
|
||||
bool SB16::can_read(OpenFileDescription const&, size_t) const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
KResultOr<size_t> SB16::read(FileDescription&, u64, UserOrKernelBuffer&, size_t)
|
||||
KResultOr<size_t> SB16::read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
@ -255,7 +255,7 @@ void SB16::wait_for_irq()
|
|||
disable_irq();
|
||||
}
|
||||
|
||||
KResultOr<size_t> SB16::write(FileDescription&, u64, UserOrKernelBuffer const& data, size_t length)
|
||||
KResultOr<size_t> SB16::write(OpenFileDescription&, u64, UserOrKernelBuffer const& data, size_t length)
|
||||
{
|
||||
if (!m_dma_region) {
|
||||
auto page = MM.allocate_supervisor_physical_page();
|
||||
|
|
|
@ -27,10 +27,10 @@ public:
|
|||
static SB16& the();
|
||||
|
||||
// ^CharacterDevice
|
||||
virtual bool can_read(const FileDescription&, size_t) const override;
|
||||
virtual KResultOr<size_t> read(FileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual KResultOr<size_t> write(FileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_write(const FileDescription&, size_t) const override { return true; }
|
||||
virtual bool can_read(const OpenFileDescription&, size_t) const override;
|
||||
virtual KResultOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual KResultOr<size_t> write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_write(const OpenFileDescription&, size_t) const override { return true; }
|
||||
|
||||
virtual StringView purpose() const override { return class_name(); }
|
||||
|
||||
|
@ -38,7 +38,7 @@ public:
|
|||
virtual mode_t required_mode() const override { return 0220; }
|
||||
virtual String device_name() const override { return "audio"; }
|
||||
|
||||
virtual KResult ioctl(FileDescription&, unsigned, Userspace<void*>) override;
|
||||
virtual KResult ioctl(OpenFileDescription&, unsigned, Userspace<void*>) override;
|
||||
|
||||
private:
|
||||
// ^IRQHandler
|
||||
|
|
|
@ -49,12 +49,12 @@ UNMAP_AFTER_INIT SerialDevice::~SerialDevice()
|
|||
{
|
||||
}
|
||||
|
||||
bool SerialDevice::can_read(const FileDescription&, size_t) const
|
||||
bool SerialDevice::can_read(const OpenFileDescription&, size_t) const
|
||||
{
|
||||
return (get_line_status() & DataReady) != 0;
|
||||
}
|
||||
|
||||
KResultOr<size_t> SerialDevice::read(FileDescription&, u64, UserOrKernelBuffer& buffer, size_t size)
|
||||
KResultOr<size_t> SerialDevice::read(OpenFileDescription&, u64, UserOrKernelBuffer& buffer, size_t size)
|
||||
{
|
||||
if (!size)
|
||||
return 0;
|
||||
|
@ -70,12 +70,12 @@ KResultOr<size_t> SerialDevice::read(FileDescription&, u64, UserOrKernelBuffer&
|
|||
});
|
||||
}
|
||||
|
||||
bool SerialDevice::can_write(const FileDescription&, size_t) const
|
||||
bool SerialDevice::can_write(const OpenFileDescription&, size_t) const
|
||||
{
|
||||
return (get_line_status() & EmptyTransmitterHoldingRegister) != 0;
|
||||
}
|
||||
|
||||
KResultOr<size_t> SerialDevice::write(FileDescription& description, u64, const UserOrKernelBuffer& buffer, size_t size)
|
||||
KResultOr<size_t> SerialDevice::write(OpenFileDescription& description, u64, const UserOrKernelBuffer& buffer, size_t size)
|
||||
{
|
||||
if (!size)
|
||||
return 0;
|
||||
|
|
|
@ -19,10 +19,10 @@ public:
|
|||
virtual ~SerialDevice() override;
|
||||
|
||||
// ^CharacterDevice
|
||||
virtual bool can_read(const FileDescription&, size_t) const override;
|
||||
virtual KResultOr<size_t> read(FileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_write(const FileDescription&, size_t) const override;
|
||||
virtual KResultOr<size_t> write(FileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_read(const OpenFileDescription&, size_t) const override;
|
||||
virtual KResultOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_write(const OpenFileDescription&, size_t) const override;
|
||||
virtual KResultOr<size_t> write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
|
||||
|
||||
void put_char(char);
|
||||
|
||||
|
|
|
@ -24,18 +24,18 @@ UNMAP_AFTER_INIT ZeroDevice::~ZeroDevice()
|
|||
{
|
||||
}
|
||||
|
||||
bool ZeroDevice::can_read(const FileDescription&, size_t) const
|
||||
bool ZeroDevice::can_read(const OpenFileDescription&, size_t) const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
KResultOr<size_t> ZeroDevice::read(FileDescription&, u64, UserOrKernelBuffer& buffer, size_t size)
|
||||
KResultOr<size_t> ZeroDevice::read(OpenFileDescription&, u64, UserOrKernelBuffer& buffer, size_t size)
|
||||
{
|
||||
TRY(buffer.memset(0, size));
|
||||
return size;
|
||||
}
|
||||
|
||||
KResultOr<size_t> ZeroDevice::write(FileDescription&, u64, const UserOrKernelBuffer&, size_t size)
|
||||
KResultOr<size_t> ZeroDevice::write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t size)
|
||||
{
|
||||
return size;
|
||||
}
|
||||
|
|
|
@ -23,10 +23,10 @@ public:
|
|||
private:
|
||||
ZeroDevice();
|
||||
// ^CharacterDevice
|
||||
virtual KResultOr<size_t> read(FileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual KResultOr<size_t> write(FileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_read(const FileDescription&, size_t) const override;
|
||||
virtual bool can_write(const FileDescription&, size_t) const override { return true; }
|
||||
virtual KResultOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual KResultOr<size_t> write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_read(const OpenFileDescription&, size_t) const override;
|
||||
virtual bool can_write(const OpenFileDescription&, size_t) const override { return true; }
|
||||
virtual StringView class_name() const override { return "ZeroDevice"; }
|
||||
};
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ AnonymousFile::~AnonymousFile()
|
|||
{
|
||||
}
|
||||
|
||||
KResultOr<Memory::Region*> AnonymousFile::mmap(Process& process, FileDescription&, Memory::VirtualRange const& range, u64 offset, int prot, bool shared)
|
||||
KResultOr<Memory::Region*> AnonymousFile::mmap(Process& process, OpenFileDescription&, Memory::VirtualRange const& range, u64 offset, int prot, bool shared)
|
||||
{
|
||||
if (offset != 0)
|
||||
return EINVAL;
|
||||
|
|
|
@ -20,15 +20,15 @@ public:
|
|||
|
||||
virtual ~AnonymousFile() override;
|
||||
|
||||
virtual KResultOr<Memory::Region*> mmap(Process&, FileDescription&, Memory::VirtualRange const&, u64 offset, int prot, bool shared) override;
|
||||
virtual KResultOr<Memory::Region*> mmap(Process&, OpenFileDescription&, Memory::VirtualRange const&, u64 offset, int prot, bool shared) override;
|
||||
|
||||
private:
|
||||
virtual StringView class_name() const override { return "AnonymousFile"; }
|
||||
virtual String absolute_path(const FileDescription&) const override { return ":anonymous-file:"; }
|
||||
virtual bool can_read(const FileDescription&, size_t) const override { return false; }
|
||||
virtual bool can_write(const FileDescription&, size_t) const override { return false; }
|
||||
virtual KResultOr<size_t> read(FileDescription&, u64, UserOrKernelBuffer&, size_t) override { return ENOTSUP; }
|
||||
virtual KResultOr<size_t> write(FileDescription&, u64, const UserOrKernelBuffer&, size_t) override { return ENOTSUP; }
|
||||
virtual String absolute_path(const OpenFileDescription&) const override { return ":anonymous-file:"; }
|
||||
virtual bool can_read(const OpenFileDescription&, size_t) const override { return false; }
|
||||
virtual bool can_write(const OpenFileDescription&, size_t) const override { return false; }
|
||||
virtual KResultOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override { return ENOTSUP; }
|
||||
virtual KResultOr<size_t> write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t) override { return ENOTSUP; }
|
||||
|
||||
explicit AnonymousFile(NonnullRefPtr<Memory::AnonymousVMObject>);
|
||||
|
||||
|
|
|
@ -104,7 +104,7 @@ private:
|
|||
bool m_dirty { false };
|
||||
};
|
||||
|
||||
BlockBasedFileSystem::BlockBasedFileSystem(FileDescription& file_description)
|
||||
BlockBasedFileSystem::BlockBasedFileSystem(OpenFileDescription& file_description)
|
||||
: FileBackedFileSystem(file_description)
|
||||
{
|
||||
VERIFY(file_description.file().is_seekable());
|
||||
|
|
|
@ -24,7 +24,7 @@ public:
|
|||
void flush_writes_impl();
|
||||
|
||||
protected:
|
||||
explicit BlockBasedFileSystem(FileDescription&);
|
||||
explicit BlockBasedFileSystem(OpenFileDescription&);
|
||||
|
||||
KResult read_block(BlockIndex, UserOrKernelBuffer*, size_t count, size_t offset = 0, bool allow_cache = true) const;
|
||||
KResult read_blocks(BlockIndex, unsigned count, UserOrKernelBuffer&, bool allow_cache = true) const;
|
||||
|
|
|
@ -80,7 +80,7 @@ DevFSInode::DevFSInode(DevFS& fs)
|
|||
{
|
||||
}
|
||||
|
||||
KResultOr<size_t> DevFSInode::read_bytes(off_t, size_t, UserOrKernelBuffer&, FileDescription*) const
|
||||
KResultOr<size_t> DevFSInode::read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const
|
||||
{
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
@ -99,7 +99,7 @@ void DevFSInode::flush_metadata()
|
|||
{
|
||||
}
|
||||
|
||||
KResultOr<size_t> DevFSInode::write_bytes(off_t, size_t, const UserOrKernelBuffer&, FileDescription*)
|
||||
KResultOr<size_t> DevFSInode::write_bytes(off_t, size_t, const UserOrKernelBuffer&, OpenFileDescription*)
|
||||
{
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
@ -149,7 +149,7 @@ DevFSLinkInode::DevFSLinkInode(DevFS& fs, NonnullOwnPtr<KString> name)
|
|||
{
|
||||
}
|
||||
|
||||
KResultOr<size_t> DevFSLinkInode::read_bytes(off_t offset, size_t, UserOrKernelBuffer& buffer, FileDescription*) const
|
||||
KResultOr<size_t> DevFSLinkInode::read_bytes(off_t offset, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const
|
||||
{
|
||||
MutexLocker locker(m_inode_lock);
|
||||
VERIFY(offset == 0);
|
||||
|
@ -170,7 +170,7 @@ InodeMetadata DevFSLinkInode::metadata() const
|
|||
return metadata;
|
||||
}
|
||||
|
||||
KResultOr<size_t> DevFSLinkInode::write_bytes(off_t offset, size_t count, UserOrKernelBuffer const& buffer, FileDescription*)
|
||||
KResultOr<size_t> DevFSLinkInode::write_bytes(off_t offset, size_t count, UserOrKernelBuffer const& buffer, OpenFileDescription*)
|
||||
{
|
||||
auto new_string = TRY(buffer.try_copy_into_kstring(count));
|
||||
|
||||
|
@ -326,7 +326,7 @@ StringView DevFSDeviceInode::name() const
|
|||
return m_name->view();
|
||||
}
|
||||
|
||||
KResultOr<size_t> DevFSDeviceInode::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, FileDescription* description) const
|
||||
KResultOr<size_t> DevFSDeviceInode::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, OpenFileDescription* description) const
|
||||
{
|
||||
MutexLocker locker(m_inode_lock);
|
||||
VERIFY(!!description);
|
||||
|
@ -352,7 +352,7 @@ InodeMetadata DevFSDeviceInode::metadata() const
|
|||
metadata.minor_device = m_attached_device->minor();
|
||||
return metadata;
|
||||
}
|
||||
KResultOr<size_t> DevFSDeviceInode::write_bytes(off_t offset, size_t count, const UserOrKernelBuffer& buffer, FileDescription* description)
|
||||
KResultOr<size_t> DevFSDeviceInode::write_bytes(off_t offset, size_t count, const UserOrKernelBuffer& buffer, OpenFileDescription* description)
|
||||
{
|
||||
MutexLocker locker(m_inode_lock);
|
||||
VERIFY(!!description);
|
||||
|
|
|
@ -53,11 +53,11 @@ public:
|
|||
|
||||
protected:
|
||||
DevFSInode(DevFS&);
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override;
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override;
|
||||
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
||||
virtual void flush_metadata() override;
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override;
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, OpenFileDescription*) override;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
|
||||
virtual KResult add_child(Inode&, const StringView& name, mode_t) override;
|
||||
virtual KResult remove_child(const StringView& name) override;
|
||||
|
@ -77,9 +77,9 @@ public:
|
|||
private:
|
||||
DevFSDeviceInode(DevFS&, Device const&, NonnullOwnPtr<KString> name);
|
||||
// ^Inode
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override;
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override;
|
||||
virtual InodeMetadata metadata() const override;
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override;
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, OpenFileDescription*) override;
|
||||
virtual KResult chown(UserID, GroupID) override;
|
||||
|
||||
NonnullRefPtr<Device> m_attached_device;
|
||||
|
@ -100,9 +100,9 @@ public:
|
|||
protected:
|
||||
DevFSLinkInode(DevFS&, NonnullOwnPtr<KString>);
|
||||
// ^Inode
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override;
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override;
|
||||
virtual InodeMetadata metadata() const override;
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override;
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, OpenFileDescription*) override;
|
||||
|
||||
NonnullOwnPtr<KString> m_name;
|
||||
OwnPtr<KString> m_link;
|
||||
|
|
|
@ -84,12 +84,12 @@ DevPtsFSInode::~DevPtsFSInode()
|
|||
{
|
||||
}
|
||||
|
||||
KResultOr<size_t> DevPtsFSInode::read_bytes(off_t, size_t, UserOrKernelBuffer&, FileDescription*) const
|
||||
KResultOr<size_t> DevPtsFSInode::read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const
|
||||
{
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
KResultOr<size_t> DevPtsFSInode::write_bytes(off_t, size_t, const UserOrKernelBuffer&, FileDescription*)
|
||||
KResultOr<size_t> DevPtsFSInode::write_bytes(off_t, size_t, const UserOrKernelBuffer&, OpenFileDescription*)
|
||||
{
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
|
|
@ -47,12 +47,12 @@ private:
|
|||
DevPtsFSInode(DevPtsFS&, InodeIndex, SlavePTY*);
|
||||
|
||||
// ^Inode
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override;
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override;
|
||||
virtual InodeMetadata metadata() const override;
|
||||
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
||||
virtual void flush_metadata() override;
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override;
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, OpenFileDescription*) override;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
|
||||
virtual KResult add_child(Inode&, const StringView& name, mode_t) override;
|
||||
virtual KResult remove_child(const StringView& name) override;
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#include <Kernel/Debug.h>
|
||||
#include <Kernel/Devices/BlockDevice.h>
|
||||
#include <Kernel/FileSystem/Ext2FileSystem.h>
|
||||
#include <Kernel/FileSystem/FileDescription.h>
|
||||
#include <Kernel/FileSystem/OpenFileDescription.h>
|
||||
#include <Kernel/FileSystem/ext2_fs.h>
|
||||
#include <Kernel/Process.h>
|
||||
#include <Kernel/UnixTypes.h>
|
||||
|
@ -54,12 +54,12 @@ static unsigned divide_rounded_up(unsigned a, unsigned b)
|
|||
return (a / b) + (a % b != 0);
|
||||
}
|
||||
|
||||
KResultOr<NonnullRefPtr<Ext2FS>> Ext2FS::try_create(FileDescription& file_description)
|
||||
KResultOr<NonnullRefPtr<Ext2FS>> Ext2FS::try_create(OpenFileDescription& file_description)
|
||||
{
|
||||
return adopt_nonnull_ref_or_enomem(new (nothrow) Ext2FS(file_description));
|
||||
}
|
||||
|
||||
Ext2FS::Ext2FS(FileDescription& file_description)
|
||||
Ext2FS::Ext2FS(OpenFileDescription& file_description)
|
||||
: BlockBasedFileSystem(file_description)
|
||||
{
|
||||
}
|
||||
|
@ -827,7 +827,7 @@ KResultOr<NonnullRefPtr<Inode>> Ext2FS::get_inode(InodeIdentifier inode) const
|
|||
return new_inode;
|
||||
}
|
||||
|
||||
KResultOr<size_t> Ext2FSInode::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, FileDescription* description) const
|
||||
KResultOr<size_t> Ext2FSInode::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, OpenFileDescription* description) const
|
||||
{
|
||||
MutexLocker inode_locker(m_inode_lock);
|
||||
VERIFY(offset >= 0);
|
||||
|
@ -965,7 +965,7 @@ KResult Ext2FSInode::resize(u64 new_size)
|
|||
return KSuccess;
|
||||
}
|
||||
|
||||
KResultOr<size_t> Ext2FSInode::write_bytes(off_t offset, size_t count, const UserOrKernelBuffer& data, FileDescription* description)
|
||||
KResultOr<size_t> Ext2FSInode::write_bytes(off_t offset, size_t count, const UserOrKernelBuffer& data, OpenFileDescription* description)
|
||||
{
|
||||
VERIFY(offset >= 0);
|
||||
|
||||
|
|
|
@ -38,12 +38,12 @@ public:
|
|||
|
||||
private:
|
||||
// ^Inode
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override;
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override;
|
||||
virtual InodeMetadata metadata() const override;
|
||||
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
||||
virtual void flush_metadata() override;
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& data, FileDescription*) override;
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& data, OpenFileDescription*) override;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
|
||||
virtual KResult add_child(Inode& child, const StringView& name, mode_t) override;
|
||||
virtual KResult remove_child(const StringView& name) override;
|
||||
|
@ -89,7 +89,7 @@ public:
|
|||
FileSize64bits = 1 << 1,
|
||||
};
|
||||
|
||||
static KResultOr<NonnullRefPtr<Ext2FS>> try_create(FileDescription&);
|
||||
static KResultOr<NonnullRefPtr<Ext2FS>> try_create(OpenFileDescription&);
|
||||
|
||||
virtual ~Ext2FS() override;
|
||||
virtual KResult initialize() override;
|
||||
|
@ -110,7 +110,7 @@ public:
|
|||
private:
|
||||
TYPEDEF_DISTINCT_ORDERED_ID(unsigned, GroupIndex);
|
||||
|
||||
explicit Ext2FS(FileDescription&);
|
||||
explicit Ext2FS(OpenFileDescription&);
|
||||
|
||||
const ext2_super_block& super_block() const { return m_super_block; }
|
||||
const ext2_group_desc& group_descriptor(GroupIndex) const;
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
#include <AK/Atomic.h>
|
||||
#include <AK/StdLibExtras.h>
|
||||
#include <Kernel/FileSystem/FIFO.h>
|
||||
#include <Kernel/FileSystem/FileDescription.h>
|
||||
#include <Kernel/FileSystem/OpenFileDescription.h>
|
||||
#include <Kernel/Locking/Mutex.h>
|
||||
#include <Kernel/Process.h>
|
||||
#include <Kernel/Thread.h>
|
||||
|
@ -24,15 +24,15 @@ RefPtr<FIFO> FIFO::try_create(UserID uid)
|
|||
return {};
|
||||
}
|
||||
|
||||
KResultOr<NonnullRefPtr<FileDescription>> FIFO::open_direction(FIFO::Direction direction)
|
||||
KResultOr<NonnullRefPtr<OpenFileDescription>> FIFO::open_direction(FIFO::Direction direction)
|
||||
{
|
||||
auto description = TRY(FileDescription::try_create(*this));
|
||||
auto description = TRY(OpenFileDescription::try_create(*this));
|
||||
attach(direction);
|
||||
description->set_fifo_direction({}, direction);
|
||||
return description;
|
||||
}
|
||||
|
||||
KResultOr<NonnullRefPtr<FileDescription>> FIFO::open_direction_blocking(FIFO::Direction direction)
|
||||
KResultOr<NonnullRefPtr<OpenFileDescription>> FIFO::open_direction_blocking(FIFO::Direction direction)
|
||||
{
|
||||
MutexLocker locker(m_open_lock);
|
||||
|
||||
|
@ -101,17 +101,17 @@ void FIFO::detach(Direction direction)
|
|||
evaluate_block_conditions();
|
||||
}
|
||||
|
||||
bool FIFO::can_read(const FileDescription&, size_t) const
|
||||
bool FIFO::can_read(const OpenFileDescription&, size_t) const
|
||||
{
|
||||
return !m_buffer->is_empty() || !m_writers;
|
||||
}
|
||||
|
||||
bool FIFO::can_write(const FileDescription&, size_t) const
|
||||
bool FIFO::can_write(const OpenFileDescription&, size_t) const
|
||||
{
|
||||
return m_buffer->space_for_writing() || !m_readers;
|
||||
}
|
||||
|
||||
KResultOr<size_t> FIFO::read(FileDescription& fd, u64, UserOrKernelBuffer& buffer, size_t size)
|
||||
KResultOr<size_t> FIFO::read(OpenFileDescription& fd, u64, UserOrKernelBuffer& buffer, size_t size)
|
||||
{
|
||||
if (m_buffer->is_empty()) {
|
||||
if (!m_writers)
|
||||
|
@ -122,7 +122,7 @@ KResultOr<size_t> FIFO::read(FileDescription& fd, u64, UserOrKernelBuffer& buffe
|
|||
return m_buffer->read(buffer, size);
|
||||
}
|
||||
|
||||
KResultOr<size_t> FIFO::write(FileDescription& fd, u64, const UserOrKernelBuffer& buffer, size_t size)
|
||||
KResultOr<size_t> FIFO::write(OpenFileDescription& fd, u64, const UserOrKernelBuffer& buffer, size_t size)
|
||||
{
|
||||
if (!m_readers) {
|
||||
Thread::current()->send_signal(SIGPIPE, &Process::current());
|
||||
|
@ -134,7 +134,7 @@ KResultOr<size_t> FIFO::write(FileDescription& fd, u64, const UserOrKernelBuffer
|
|||
return m_buffer->write(buffer, size);
|
||||
}
|
||||
|
||||
String FIFO::absolute_path(const FileDescription&) const
|
||||
String FIFO::absolute_path(const OpenFileDescription&) const
|
||||
{
|
||||
return String::formatted("fifo:{}", m_fifo_id);
|
||||
}
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
namespace Kernel {
|
||||
|
||||
class FileDescription;
|
||||
class OpenFileDescription;
|
||||
|
||||
class FIFO final : public File {
|
||||
public:
|
||||
|
@ -29,8 +29,8 @@ public:
|
|||
|
||||
UserID uid() const { return m_uid; }
|
||||
|
||||
KResultOr<NonnullRefPtr<FileDescription>> open_direction(Direction);
|
||||
KResultOr<NonnullRefPtr<FileDescription>> open_direction_blocking(Direction);
|
||||
KResultOr<NonnullRefPtr<OpenFileDescription>> open_direction(Direction);
|
||||
KResultOr<NonnullRefPtr<OpenFileDescription>> open_direction_blocking(Direction);
|
||||
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Woverloaded-virtual"
|
||||
|
@ -40,12 +40,12 @@ public:
|
|||
|
||||
private:
|
||||
// ^File
|
||||
virtual KResultOr<size_t> write(FileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
|
||||
virtual KResultOr<size_t> read(FileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual KResultOr<size_t> write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
|
||||
virtual KResultOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual KResult stat(::stat&) const override;
|
||||
virtual bool can_read(const FileDescription&, size_t) const override;
|
||||
virtual bool can_write(const FileDescription&, size_t) const override;
|
||||
virtual String absolute_path(const FileDescription&) const override;
|
||||
virtual bool can_read(const OpenFileDescription&, size_t) const override;
|
||||
virtual bool can_write(const OpenFileDescription&, size_t) const override;
|
||||
virtual String absolute_path(const OpenFileDescription&) const override;
|
||||
virtual StringView class_name() const override { return "FIFO"; }
|
||||
virtual bool is_fifo() const override { return true; }
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
#include <AK/StringView.h>
|
||||
#include <AK/Userspace.h>
|
||||
#include <Kernel/FileSystem/File.h>
|
||||
#include <Kernel/FileSystem/FileDescription.h>
|
||||
#include <Kernel/FileSystem/OpenFileDescription.h>
|
||||
#include <Kernel/Process.h>
|
||||
|
||||
namespace Kernel {
|
||||
|
@ -28,9 +28,9 @@ bool File::unref() const
|
|||
return true;
|
||||
}
|
||||
|
||||
KResultOr<NonnullRefPtr<FileDescription>> File::open(int options)
|
||||
KResultOr<NonnullRefPtr<OpenFileDescription>> File::open(int options)
|
||||
{
|
||||
auto description = FileDescription::try_create(*this);
|
||||
auto description = OpenFileDescription::try_create(*this);
|
||||
if (!description.is_error()) {
|
||||
description.value()->set_rw_mode(options);
|
||||
description.value()->set_file_flags(options);
|
||||
|
@ -43,23 +43,23 @@ KResult File::close()
|
|||
return KSuccess;
|
||||
}
|
||||
|
||||
KResult File::ioctl(FileDescription&, unsigned, Userspace<void*>)
|
||||
KResult File::ioctl(OpenFileDescription&, unsigned, Userspace<void*>)
|
||||
{
|
||||
return ENOTTY;
|
||||
}
|
||||
|
||||
KResultOr<Memory::Region*> File::mmap(Process&, FileDescription&, Memory::VirtualRange const&, u64, int, bool)
|
||||
KResultOr<Memory::Region*> File::mmap(Process&, OpenFileDescription&, Memory::VirtualRange const&, u64, int, bool)
|
||||
{
|
||||
return ENODEV;
|
||||
}
|
||||
|
||||
KResult File::attach(FileDescription&)
|
||||
KResult File::attach(OpenFileDescription&)
|
||||
{
|
||||
m_attach_count++;
|
||||
return KSuccess;
|
||||
}
|
||||
|
||||
void File::detach(FileDescription&)
|
||||
void File::detach(OpenFileDescription&)
|
||||
{
|
||||
m_attach_count--;
|
||||
}
|
||||
|
|
|
@ -43,7 +43,7 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
// File is the base class for anything that can be referenced by a FileDescription.
|
||||
// File is the base class for anything that can be referenced by a OpenFileDescription.
|
||||
//
|
||||
// The most important functions in File are:
|
||||
//
|
||||
|
@ -77,26 +77,26 @@ public:
|
|||
virtual bool unref() const;
|
||||
virtual ~File();
|
||||
|
||||
virtual KResultOr<NonnullRefPtr<FileDescription>> open(int options);
|
||||
virtual KResultOr<NonnullRefPtr<OpenFileDescription>> open(int options);
|
||||
virtual KResult close();
|
||||
|
||||
virtual bool can_read(const FileDescription&, size_t) const = 0;
|
||||
virtual bool can_write(const FileDescription&, size_t) const = 0;
|
||||
virtual bool can_read(const OpenFileDescription&, size_t) const = 0;
|
||||
virtual bool can_write(const OpenFileDescription&, size_t) const = 0;
|
||||
|
||||
virtual KResult attach(FileDescription&);
|
||||
virtual void detach(FileDescription&);
|
||||
virtual void did_seek(FileDescription&, off_t) { }
|
||||
virtual KResultOr<size_t> read(FileDescription&, u64, UserOrKernelBuffer&, size_t) = 0;
|
||||
virtual KResultOr<size_t> write(FileDescription&, u64, const UserOrKernelBuffer&, size_t) = 0;
|
||||
virtual KResult ioctl(FileDescription&, unsigned request, Userspace<void*> arg);
|
||||
virtual KResultOr<Memory::Region*> mmap(Process&, FileDescription&, Memory::VirtualRange const&, u64 offset, int prot, bool shared);
|
||||
virtual KResult attach(OpenFileDescription&);
|
||||
virtual void detach(OpenFileDescription&);
|
||||
virtual void did_seek(OpenFileDescription&, off_t) { }
|
||||
virtual KResultOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) = 0;
|
||||
virtual KResultOr<size_t> write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t) = 0;
|
||||
virtual KResult ioctl(OpenFileDescription&, unsigned request, Userspace<void*> arg);
|
||||
virtual KResultOr<Memory::Region*> mmap(Process&, OpenFileDescription&, Memory::VirtualRange const&, u64 offset, int prot, bool shared);
|
||||
virtual KResult stat(::stat&) const { return EBADF; }
|
||||
|
||||
virtual String absolute_path(const FileDescription&) const = 0;
|
||||
virtual String absolute_path(const OpenFileDescription&) const = 0;
|
||||
|
||||
virtual KResult truncate(u64) { return EINVAL; }
|
||||
virtual KResult chown(FileDescription&, UserID, GroupID) { return EBADF; }
|
||||
virtual KResult chmod(FileDescription&, mode_t) { return EBADF; }
|
||||
virtual KResult chown(OpenFileDescription&, UserID, GroupID) { return EBADF; }
|
||||
virtual KResult chmod(OpenFileDescription&, mode_t) { return EBADF; }
|
||||
|
||||
virtual StringView class_name() const = 0;
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
namespace Kernel {
|
||||
|
||||
FileBackedFileSystem::FileBackedFileSystem(FileDescription& file_description)
|
||||
FileBackedFileSystem::FileBackedFileSystem(OpenFileDescription& file_description)
|
||||
: m_file_description(file_description)
|
||||
{
|
||||
}
|
||||
|
|
|
@ -6,8 +6,8 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include <Kernel/FileSystem/FileDescription.h>
|
||||
#include <Kernel/FileSystem/FileSystem.h>
|
||||
#include <Kernel/FileSystem/OpenFileDescription.h>
|
||||
|
||||
namespace Kernel {
|
||||
|
||||
|
@ -16,17 +16,17 @@ public:
|
|||
virtual ~FileBackedFileSystem() override;
|
||||
|
||||
File& file() { return m_file_description->file(); }
|
||||
FileDescription& file_description() { return *m_file_description; }
|
||||
OpenFileDescription& file_description() { return *m_file_description; }
|
||||
const File& file() const { return m_file_description->file(); }
|
||||
FileDescription& file_description() const { return *m_file_description; }
|
||||
OpenFileDescription& file_description() const { return *m_file_description; }
|
||||
|
||||
protected:
|
||||
explicit FileBackedFileSystem(FileDescription&);
|
||||
explicit FileBackedFileSystem(OpenFileDescription&);
|
||||
|
||||
private:
|
||||
virtual bool is_file_backed() const override { return true; }
|
||||
|
||||
mutable NonnullRefPtr<FileDescription> m_file_description;
|
||||
mutable NonnullRefPtr<OpenFileDescription> m_file_description;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -171,12 +171,12 @@ private:
|
|||
Vector<DirectoryState> m_directory_stack;
|
||||
};
|
||||
|
||||
KResultOr<NonnullRefPtr<ISO9660FS>> ISO9660FS::try_create(FileDescription& description)
|
||||
KResultOr<NonnullRefPtr<ISO9660FS>> ISO9660FS::try_create(OpenFileDescription& description)
|
||||
{
|
||||
return adopt_nonnull_ref_or_enomem(new (nothrow) ISO9660FS(description));
|
||||
}
|
||||
|
||||
ISO9660FS::ISO9660FS(FileDescription& description)
|
||||
ISO9660FS::ISO9660FS(OpenFileDescription& description)
|
||||
: BlockBasedFileSystem(description)
|
||||
{
|
||||
set_block_size(logical_sector_size);
|
||||
|
@ -415,7 +415,7 @@ u32 ISO9660FS::calculate_directory_entry_cache_key(ISO::DirectoryRecordHeader co
|
|||
return LittleEndian { record.extent_location.little };
|
||||
}
|
||||
|
||||
KResultOr<size_t> ISO9660Inode::read_bytes(off_t offset, size_t size, UserOrKernelBuffer& buffer, FileDescription*) const
|
||||
KResultOr<size_t> ISO9660Inode::read_bytes(off_t offset, size_t size, UserOrKernelBuffer& buffer, OpenFileDescription*) const
|
||||
{
|
||||
MutexLocker inode_locker(m_inode_lock);
|
||||
|
||||
|
@ -514,7 +514,7 @@ void ISO9660Inode::flush_metadata()
|
|||
{
|
||||
}
|
||||
|
||||
KResultOr<size_t> ISO9660Inode::write_bytes(off_t, size_t, const UserOrKernelBuffer&, FileDescription*)
|
||||
KResultOr<size_t> ISO9660Inode::write_bytes(off_t, size_t, const UserOrKernelBuffer&, OpenFileDescription*)
|
||||
{
|
||||
return EROFS;
|
||||
}
|
||||
|
|
|
@ -305,7 +305,7 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
static KResultOr<NonnullRefPtr<ISO9660FS>> try_create(FileDescription&);
|
||||
static KResultOr<NonnullRefPtr<ISO9660FS>> try_create(OpenFileDescription&);
|
||||
|
||||
virtual ~ISO9660FS() override;
|
||||
virtual KResult initialize() override;
|
||||
|
@ -320,7 +320,7 @@ public:
|
|||
KResultOr<NonnullRefPtr<DirectoryEntry>> directory_entry_for_record(Badge<ISO9660DirectoryIterator>, ISO::DirectoryRecordHeader const* record);
|
||||
|
||||
private:
|
||||
ISO9660FS(FileDescription&);
|
||||
ISO9660FS(OpenFileDescription&);
|
||||
|
||||
KResult parse_volume_set();
|
||||
KResult create_root_inode();
|
||||
|
@ -347,12 +347,12 @@ public:
|
|||
ISO9660FS const& fs() const { return static_cast<ISO9660FS const&>(Inode::fs()); }
|
||||
|
||||
// ^Inode
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override;
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override;
|
||||
virtual InodeMetadata metadata() const override;
|
||||
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
||||
virtual void flush_metadata() override;
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override;
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, OpenFileDescription*) override;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
|
||||
virtual KResult add_child(Inode&, const StringView& name, mode_t) override;
|
||||
virtual KResult remove_child(const StringView& name) override;
|
||||
|
|
|
@ -11,9 +11,9 @@
|
|||
#include <AK/StringView.h>
|
||||
#include <Kernel/API/InodeWatcherEvent.h>
|
||||
#include <Kernel/FileSystem/Custody.h>
|
||||
#include <Kernel/FileSystem/FileDescription.h>
|
||||
#include <Kernel/FileSystem/Inode.h>
|
||||
#include <Kernel/FileSystem/InodeWatcher.h>
|
||||
#include <Kernel/FileSystem/OpenFileDescription.h>
|
||||
#include <Kernel/FileSystem/VirtualFileSystem.h>
|
||||
#include <Kernel/KBufferBuilder.h>
|
||||
#include <Kernel/Memory/SharedInodeVMObject.h>
|
||||
|
@ -45,7 +45,7 @@ void Inode::sync()
|
|||
}
|
||||
}
|
||||
|
||||
KResultOr<NonnullOwnPtr<KBuffer>> Inode::read_entire(FileDescription* description) const
|
||||
KResultOr<NonnullOwnPtr<KBuffer>> Inode::read_entire(OpenFileDescription* description) const
|
||||
{
|
||||
KBufferBuilder builder;
|
||||
|
||||
|
@ -267,7 +267,7 @@ static inline bool range_overlap(T start1, T len1, T start2, T len2)
|
|||
return ((start1 < start2 + len2) || len2 == 0) && ((start2 < start1 + len1) || len1 == 0);
|
||||
}
|
||||
|
||||
static inline KResult normalize_flock(FileDescription const& description, flock& lock)
|
||||
static inline KResult normalize_flock(OpenFileDescription const& description, flock& lock)
|
||||
{
|
||||
off_t start;
|
||||
switch (lock.l_whence) {
|
||||
|
@ -287,7 +287,7 @@ static inline KResult normalize_flock(FileDescription const& description, flock&
|
|||
return KSuccess;
|
||||
}
|
||||
|
||||
KResult Inode::can_apply_flock(FileDescription const& description, flock const& new_lock) const
|
||||
KResult Inode::can_apply_flock(OpenFileDescription const& description, flock const& new_lock) const
|
||||
{
|
||||
VERIFY(new_lock.l_whence == SEEK_SET);
|
||||
|
||||
|
@ -314,7 +314,7 @@ KResult Inode::can_apply_flock(FileDescription const& description, flock const&
|
|||
return KSuccess;
|
||||
}
|
||||
|
||||
KResult Inode::apply_flock(Process const& process, FileDescription const& description, Userspace<flock const*> input_lock)
|
||||
KResult Inode::apply_flock(Process const& process, OpenFileDescription const& description, Userspace<flock const*> input_lock)
|
||||
{
|
||||
flock new_lock = {};
|
||||
TRY(copy_from_user(&new_lock, input_lock));
|
||||
|
@ -338,7 +338,7 @@ KResult Inode::apply_flock(Process const& process, FileDescription const& descri
|
|||
return KSuccess;
|
||||
}
|
||||
|
||||
KResult Inode::get_flock(FileDescription const& description, Userspace<flock*> reference_lock) const
|
||||
KResult Inode::get_flock(OpenFileDescription const& description, Userspace<flock*> reference_lock) const
|
||||
{
|
||||
flock lookup = {};
|
||||
TRY(copy_from_user(&lookup, reference_lock));
|
||||
|
@ -360,7 +360,7 @@ KResult Inode::get_flock(FileDescription const& description, Userspace<flock*> r
|
|||
return copy_to_user(reference_lock, &lookup);
|
||||
}
|
||||
|
||||
void Inode::remove_flocks_for_description(FileDescription const& description)
|
||||
void Inode::remove_flocks_for_description(OpenFileDescription const& description)
|
||||
{
|
||||
MutexLocker locker(m_inode_lock);
|
||||
|
||||
|
|
|
@ -46,15 +46,15 @@ public:
|
|||
InodeIdentifier identifier() const { return { fsid(), index() }; }
|
||||
virtual InodeMetadata metadata() const = 0;
|
||||
|
||||
KResultOr<NonnullOwnPtr<KBuffer>> read_entire(FileDescription* = nullptr) const;
|
||||
KResultOr<NonnullOwnPtr<KBuffer>> read_entire(OpenFileDescription* = nullptr) const;
|
||||
|
||||
virtual KResult attach(FileDescription&) { return KSuccess; }
|
||||
virtual void detach(FileDescription&) { }
|
||||
virtual void did_seek(FileDescription&, off_t) { }
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const = 0;
|
||||
virtual KResult attach(OpenFileDescription&) { return KSuccess; }
|
||||
virtual void detach(OpenFileDescription&) { }
|
||||
virtual void did_seek(OpenFileDescription&, off_t) { }
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const = 0;
|
||||
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const = 0;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) = 0;
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& data, FileDescription*) = 0;
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& data, OpenFileDescription*) = 0;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) = 0;
|
||||
virtual KResult add_child(Inode&, const StringView& name, mode_t) = 0;
|
||||
virtual KResult remove_child(const StringView& name) = 0;
|
||||
|
@ -70,7 +70,7 @@ public:
|
|||
bool bind_socket(LocalSocket&);
|
||||
bool unbind_socket();
|
||||
|
||||
virtual FileDescription* preopen_fd() { return nullptr; };
|
||||
virtual OpenFileDescription* preopen_fd() { return nullptr; };
|
||||
|
||||
bool is_metadata_dirty() const { return m_metadata_dirty; }
|
||||
|
||||
|
@ -96,10 +96,10 @@ public:
|
|||
|
||||
NonnullRefPtr<FIFO> fifo();
|
||||
|
||||
KResult can_apply_flock(FileDescription const&, flock const&) const;
|
||||
KResult apply_flock(Process const&, FileDescription const&, Userspace<flock const*>);
|
||||
KResult get_flock(FileDescription const&, Userspace<flock*>) const;
|
||||
void remove_flocks_for_description(FileDescription const&);
|
||||
KResult can_apply_flock(OpenFileDescription const&, flock const&) const;
|
||||
KResult apply_flock(Process const&, OpenFileDescription const&, Userspace<flock const*>);
|
||||
KResult get_flock(OpenFileDescription const&, Userspace<flock*>) const;
|
||||
void remove_flocks_for_description(OpenFileDescription const&);
|
||||
|
||||
protected:
|
||||
Inode(FileSystem&, InodeIndex);
|
||||
|
@ -127,7 +127,7 @@ private:
|
|||
short type;
|
||||
off_t start;
|
||||
off_t len;
|
||||
FileDescription const* owner;
|
||||
OpenFileDescription const* owner;
|
||||
pid_t pid;
|
||||
};
|
||||
|
||||
|
|
|
@ -5,9 +5,9 @@
|
|||
*/
|
||||
|
||||
#include <AK/StringView.h>
|
||||
#include <Kernel/FileSystem/FileDescription.h>
|
||||
#include <Kernel/FileSystem/Inode.h>
|
||||
#include <Kernel/FileSystem/InodeFile.h>
|
||||
#include <Kernel/FileSystem/OpenFileDescription.h>
|
||||
#include <Kernel/FileSystem/VirtualFileSystem.h>
|
||||
#include <Kernel/Memory/PrivateInodeVMObject.h>
|
||||
#include <Kernel/Memory/SharedInodeVMObject.h>
|
||||
|
@ -26,7 +26,7 @@ InodeFile::~InodeFile()
|
|||
{
|
||||
}
|
||||
|
||||
KResultOr<size_t> InodeFile::read(FileDescription& description, u64 offset, UserOrKernelBuffer& buffer, size_t count)
|
||||
KResultOr<size_t> InodeFile::read(OpenFileDescription& description, u64 offset, UserOrKernelBuffer& buffer, size_t count)
|
||||
{
|
||||
if (Checked<off_t>::addition_would_overflow(offset, count))
|
||||
return EOVERFLOW;
|
||||
|
@ -39,7 +39,7 @@ KResultOr<size_t> InodeFile::read(FileDescription& description, u64 offset, User
|
|||
return nread;
|
||||
}
|
||||
|
||||
KResultOr<size_t> InodeFile::write(FileDescription& description, u64 offset, const UserOrKernelBuffer& data, size_t count)
|
||||
KResultOr<size_t> InodeFile::write(OpenFileDescription& description, u64 offset, const UserOrKernelBuffer& data, size_t count)
|
||||
{
|
||||
if (Checked<off_t>::addition_would_overflow(offset, count))
|
||||
return EOVERFLOW;
|
||||
|
@ -55,7 +55,7 @@ KResultOr<size_t> InodeFile::write(FileDescription& description, u64 offset, con
|
|||
return nwritten;
|
||||
}
|
||||
|
||||
KResult InodeFile::ioctl(FileDescription& description, unsigned request, Userspace<void*> arg)
|
||||
KResult InodeFile::ioctl(OpenFileDescription& description, unsigned request, Userspace<void*> arg)
|
||||
{
|
||||
switch (request) {
|
||||
case FIBMAP: {
|
||||
|
@ -81,7 +81,7 @@ KResult InodeFile::ioctl(FileDescription& description, unsigned request, Userspa
|
|||
}
|
||||
}
|
||||
|
||||
KResultOr<Memory::Region*> InodeFile::mmap(Process& process, FileDescription& description, Memory::VirtualRange const& range, u64 offset, int prot, bool shared)
|
||||
KResultOr<Memory::Region*> InodeFile::mmap(Process& process, OpenFileDescription& description, Memory::VirtualRange const& range, u64 offset, int prot, bool shared)
|
||||
{
|
||||
// FIXME: If PROT_EXEC, check that the underlying file system isn't mounted noexec.
|
||||
RefPtr<Memory::InodeVMObject> vmobject;
|
||||
|
@ -92,7 +92,7 @@ KResultOr<Memory::Region*> InodeFile::mmap(Process& process, FileDescription& de
|
|||
return process.address_space().allocate_region_with_vmobject(range, vmobject.release_nonnull(), offset, description.absolute_path(), prot, shared);
|
||||
}
|
||||
|
||||
String InodeFile::absolute_path(const FileDescription& description) const
|
||||
String InodeFile::absolute_path(const OpenFileDescription& description) const
|
||||
{
|
||||
VERIFY_NOT_REACHED();
|
||||
VERIFY(description.custody());
|
||||
|
@ -106,14 +106,14 @@ KResult InodeFile::truncate(u64 size)
|
|||
return KSuccess;
|
||||
}
|
||||
|
||||
KResult InodeFile::chown(FileDescription& description, UserID uid, GroupID gid)
|
||||
KResult InodeFile::chown(OpenFileDescription& description, UserID uid, GroupID gid)
|
||||
{
|
||||
VERIFY(description.inode() == m_inode);
|
||||
VERIFY(description.custody());
|
||||
return VirtualFileSystem::the().chown(*description.custody(), uid, gid);
|
||||
}
|
||||
|
||||
KResult InodeFile::chmod(FileDescription& description, mode_t mode)
|
||||
KResult InodeFile::chmod(OpenFileDescription& description, mode_t mode)
|
||||
{
|
||||
VERIFY(description.inode() == m_inode);
|
||||
VERIFY(description.custody());
|
||||
|
|
|
@ -27,20 +27,20 @@ public:
|
|||
const Inode& inode() const { return *m_inode; }
|
||||
Inode& inode() { return *m_inode; }
|
||||
|
||||
virtual bool can_read(const FileDescription&, size_t) const override { return true; }
|
||||
virtual bool can_write(const FileDescription&, size_t) const override { return true; }
|
||||
virtual bool can_read(const OpenFileDescription&, size_t) const override { return true; }
|
||||
virtual bool can_write(const OpenFileDescription&, size_t) const override { return true; }
|
||||
|
||||
virtual KResultOr<size_t> read(FileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual KResultOr<size_t> write(FileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
|
||||
virtual KResult ioctl(FileDescription&, unsigned request, Userspace<void*> arg) override;
|
||||
virtual KResultOr<Memory::Region*> mmap(Process&, FileDescription&, Memory::VirtualRange const&, u64 offset, int prot, bool shared) override;
|
||||
virtual KResultOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual KResultOr<size_t> write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
|
||||
virtual KResult ioctl(OpenFileDescription&, unsigned request, Userspace<void*> arg) override;
|
||||
virtual KResultOr<Memory::Region*> mmap(Process&, OpenFileDescription&, Memory::VirtualRange const&, u64 offset, int prot, bool shared) override;
|
||||
virtual KResult stat(::stat& buffer) const override { return inode().metadata().stat(buffer); }
|
||||
|
||||
virtual String absolute_path(const FileDescription&) const override;
|
||||
virtual String absolute_path(const OpenFileDescription&) const override;
|
||||
|
||||
virtual KResult truncate(u64) override;
|
||||
virtual KResult chown(FileDescription&, UserID, GroupID) override;
|
||||
virtual KResult chmod(FileDescription&, mode_t) override;
|
||||
virtual KResult chown(OpenFileDescription&, UserID, GroupID) override;
|
||||
virtual KResult chmod(OpenFileDescription&, mode_t) override;
|
||||
|
||||
virtual StringView class_name() const override { return "InodeFile"; }
|
||||
|
||||
|
|
|
@ -22,13 +22,13 @@ InodeWatcher::~InodeWatcher()
|
|||
(void)close();
|
||||
}
|
||||
|
||||
bool InodeWatcher::can_read(const FileDescription&, size_t) const
|
||||
bool InodeWatcher::can_read(const OpenFileDescription&, size_t) const
|
||||
{
|
||||
MutexLocker locker(m_lock);
|
||||
return !m_queue.is_empty();
|
||||
}
|
||||
|
||||
KResultOr<size_t> InodeWatcher::read(FileDescription&, u64, UserOrKernelBuffer& buffer, size_t buffer_size)
|
||||
KResultOr<size_t> InodeWatcher::read(OpenFileDescription&, u64, UserOrKernelBuffer& buffer, size_t buffer_size)
|
||||
{
|
||||
MutexLocker locker(m_lock);
|
||||
if (m_queue.is_empty())
|
||||
|
@ -81,7 +81,7 @@ KResult InodeWatcher::close()
|
|||
return KSuccess;
|
||||
}
|
||||
|
||||
String InodeWatcher::absolute_path(const FileDescription&) const
|
||||
String InodeWatcher::absolute_path(const OpenFileDescription&) const
|
||||
{
|
||||
return String::formatted("InodeWatcher:({})", m_wd_to_watches.size());
|
||||
}
|
||||
|
|
|
@ -43,14 +43,14 @@ public:
|
|||
static KResultOr<NonnullRefPtr<InodeWatcher>> try_create();
|
||||
virtual ~InodeWatcher() override;
|
||||
|
||||
virtual bool can_read(const FileDescription&, size_t) const override;
|
||||
virtual KResultOr<size_t> read(FileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_read(const OpenFileDescription&, size_t) const override;
|
||||
virtual KResultOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
// Can't write to an inode watcher.
|
||||
virtual bool can_write(const FileDescription&, size_t) const override { return true; }
|
||||
virtual KResultOr<size_t> write(FileDescription&, u64, const UserOrKernelBuffer&, size_t) override { return EIO; }
|
||||
virtual bool can_write(const OpenFileDescription&, size_t) const override { return true; }
|
||||
virtual KResultOr<size_t> write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t) override { return EIO; }
|
||||
virtual KResult close() override;
|
||||
|
||||
virtual String absolute_path(const FileDescription&) const override;
|
||||
virtual String absolute_path(const OpenFileDescription&) const override;
|
||||
virtual StringView class_name() const override { return "InodeWatcher"; };
|
||||
virtual bool is_inode_watcher() const override { return true; }
|
||||
|
||||
|
|
|
@ -10,10 +10,10 @@
|
|||
#include <Kernel/Devices/BlockDevice.h>
|
||||
#include <Kernel/FileSystem/Custody.h>
|
||||
#include <Kernel/FileSystem/FIFO.h>
|
||||
#include <Kernel/FileSystem/FileDescription.h>
|
||||
#include <Kernel/FileSystem/FileSystem.h>
|
||||
#include <Kernel/FileSystem/InodeFile.h>
|
||||
#include <Kernel/FileSystem/InodeWatcher.h>
|
||||
#include <Kernel/FileSystem/OpenFileDescription.h>
|
||||
#include <Kernel/Memory/MemoryManager.h>
|
||||
#include <Kernel/Net/Socket.h>
|
||||
#include <Kernel/Process.h>
|
||||
|
@ -24,24 +24,24 @@
|
|||
|
||||
namespace Kernel {
|
||||
|
||||
KResultOr<NonnullRefPtr<FileDescription>> FileDescription::try_create(Custody& custody)
|
||||
KResultOr<NonnullRefPtr<OpenFileDescription>> OpenFileDescription::try_create(Custody& custody)
|
||||
{
|
||||
auto inode_file = TRY(InodeFile::create(custody.inode()));
|
||||
auto description = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) FileDescription(move(inode_file))));
|
||||
auto description = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) OpenFileDescription(move(inode_file))));
|
||||
|
||||
description->m_custody = custody;
|
||||
TRY(description->attach());
|
||||
return description;
|
||||
}
|
||||
|
||||
KResultOr<NonnullRefPtr<FileDescription>> FileDescription::try_create(File& file)
|
||||
KResultOr<NonnullRefPtr<OpenFileDescription>> OpenFileDescription::try_create(File& file)
|
||||
{
|
||||
auto description = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) FileDescription(file)));
|
||||
auto description = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) OpenFileDescription(file)));
|
||||
TRY(description->attach());
|
||||
return description;
|
||||
}
|
||||
|
||||
FileDescription::FileDescription(File& file)
|
||||
OpenFileDescription::OpenFileDescription(File& file)
|
||||
: m_file(file)
|
||||
{
|
||||
if (file.is_inode())
|
||||
|
@ -50,7 +50,7 @@ FileDescription::FileDescription(File& file)
|
|||
m_is_directory = metadata().is_directory();
|
||||
}
|
||||
|
||||
FileDescription::~FileDescription()
|
||||
OpenFileDescription::~OpenFileDescription()
|
||||
{
|
||||
m_file->detach(*this);
|
||||
if (is_fifo())
|
||||
|
@ -64,14 +64,14 @@ FileDescription::~FileDescription()
|
|||
m_inode->remove_flocks_for_description(*this);
|
||||
}
|
||||
|
||||
KResult FileDescription::attach()
|
||||
KResult OpenFileDescription::attach()
|
||||
{
|
||||
if (m_inode)
|
||||
TRY(m_inode->attach(*this));
|
||||
return m_file->attach(*this);
|
||||
}
|
||||
|
||||
Thread::FileBlocker::BlockFlags FileDescription::should_unblock(Thread::FileBlocker::BlockFlags block_flags) const
|
||||
Thread::FileBlocker::BlockFlags OpenFileDescription::should_unblock(Thread::FileBlocker::BlockFlags block_flags) const
|
||||
{
|
||||
using BlockFlags = Thread::FileBlocker::BlockFlags;
|
||||
BlockFlags unblock_flags = BlockFlags::None;
|
||||
|
@ -92,7 +92,7 @@ Thread::FileBlocker::BlockFlags FileDescription::should_unblock(Thread::FileBloc
|
|||
return unblock_flags;
|
||||
}
|
||||
|
||||
KResult FileDescription::stat(::stat& buffer)
|
||||
KResult OpenFileDescription::stat(::stat& buffer)
|
||||
{
|
||||
MutexLocker locker(m_lock);
|
||||
// FIXME: This is due to the Device class not overriding File::stat().
|
||||
|
@ -101,7 +101,7 @@ KResult FileDescription::stat(::stat& buffer)
|
|||
return m_file->stat(buffer);
|
||||
}
|
||||
|
||||
KResultOr<off_t> FileDescription::seek(off_t offset, int whence)
|
||||
KResultOr<off_t> OpenFileDescription::seek(off_t offset, int whence)
|
||||
{
|
||||
MutexLocker locker(m_lock);
|
||||
if (!m_file->is_seekable())
|
||||
|
@ -142,21 +142,21 @@ KResultOr<off_t> FileDescription::seek(off_t offset, int whence)
|
|||
return m_current_offset;
|
||||
}
|
||||
|
||||
KResultOr<size_t> FileDescription::read(UserOrKernelBuffer& buffer, u64 offset, size_t count)
|
||||
KResultOr<size_t> OpenFileDescription::read(UserOrKernelBuffer& buffer, u64 offset, size_t count)
|
||||
{
|
||||
if (Checked<u64>::addition_would_overflow(offset, count))
|
||||
return EOVERFLOW;
|
||||
return m_file->read(*this, offset, buffer, count);
|
||||
}
|
||||
|
||||
KResultOr<size_t> FileDescription::write(u64 offset, UserOrKernelBuffer const& data, size_t data_size)
|
||||
KResultOr<size_t> OpenFileDescription::write(u64 offset, UserOrKernelBuffer const& data, size_t data_size)
|
||||
{
|
||||
if (Checked<u64>::addition_would_overflow(offset, data_size))
|
||||
return EOVERFLOW;
|
||||
return m_file->write(*this, offset, data, data_size);
|
||||
}
|
||||
|
||||
KResultOr<size_t> FileDescription::read(UserOrKernelBuffer& buffer, size_t count)
|
||||
KResultOr<size_t> OpenFileDescription::read(UserOrKernelBuffer& buffer, size_t count)
|
||||
{
|
||||
MutexLocker locker(m_lock);
|
||||
if (Checked<off_t>::addition_would_overflow(m_current_offset, count))
|
||||
|
@ -168,7 +168,7 @@ KResultOr<size_t> FileDescription::read(UserOrKernelBuffer& buffer, size_t count
|
|||
return nread;
|
||||
}
|
||||
|
||||
KResultOr<size_t> FileDescription::write(const UserOrKernelBuffer& data, size_t size)
|
||||
KResultOr<size_t> OpenFileDescription::write(const UserOrKernelBuffer& data, size_t size)
|
||||
{
|
||||
MutexLocker locker(m_lock);
|
||||
if (Checked<off_t>::addition_would_overflow(m_current_offset, size))
|
||||
|
@ -180,17 +180,17 @@ KResultOr<size_t> FileDescription::write(const UserOrKernelBuffer& data, size_t
|
|||
return nwritten;
|
||||
}
|
||||
|
||||
bool FileDescription::can_write() const
|
||||
bool OpenFileDescription::can_write() const
|
||||
{
|
||||
return m_file->can_write(*this, offset());
|
||||
}
|
||||
|
||||
bool FileDescription::can_read() const
|
||||
bool OpenFileDescription::can_read() const
|
||||
{
|
||||
return m_file->can_read(*this, offset());
|
||||
}
|
||||
|
||||
KResultOr<NonnullOwnPtr<KBuffer>> FileDescription::read_entire_file()
|
||||
KResultOr<NonnullOwnPtr<KBuffer>> OpenFileDescription::read_entire_file()
|
||||
{
|
||||
// HACK ALERT: (This entire function)
|
||||
VERIFY(m_file->is_inode());
|
||||
|
@ -198,7 +198,7 @@ KResultOr<NonnullOwnPtr<KBuffer>> FileDescription::read_entire_file()
|
|||
return m_inode->read_entire(this);
|
||||
}
|
||||
|
||||
KResultOr<size_t> FileDescription::get_dir_entries(UserOrKernelBuffer& output_buffer, size_t size)
|
||||
KResultOr<size_t> OpenFileDescription::get_dir_entries(UserOrKernelBuffer& output_buffer, size_t size)
|
||||
{
|
||||
MutexLocker locker(m_lock, Mutex::Mode::Shared);
|
||||
if (!is_directory())
|
||||
|
@ -261,90 +261,90 @@ KResultOr<size_t> FileDescription::get_dir_entries(UserOrKernelBuffer& output_bu
|
|||
return size - remaining;
|
||||
}
|
||||
|
||||
bool FileDescription::is_device() const
|
||||
bool OpenFileDescription::is_device() const
|
||||
{
|
||||
return m_file->is_device();
|
||||
}
|
||||
|
||||
const Device* FileDescription::device() const
|
||||
const Device* OpenFileDescription::device() const
|
||||
{
|
||||
if (!is_device())
|
||||
return nullptr;
|
||||
return static_cast<const Device*>(m_file.ptr());
|
||||
}
|
||||
|
||||
Device* FileDescription::device()
|
||||
Device* OpenFileDescription::device()
|
||||
{
|
||||
if (!is_device())
|
||||
return nullptr;
|
||||
return static_cast<Device*>(m_file.ptr());
|
||||
}
|
||||
|
||||
bool FileDescription::is_tty() const
|
||||
bool OpenFileDescription::is_tty() const
|
||||
{
|
||||
return m_file->is_tty();
|
||||
}
|
||||
|
||||
const TTY* FileDescription::tty() const
|
||||
const TTY* OpenFileDescription::tty() const
|
||||
{
|
||||
if (!is_tty())
|
||||
return nullptr;
|
||||
return static_cast<const TTY*>(m_file.ptr());
|
||||
}
|
||||
|
||||
TTY* FileDescription::tty()
|
||||
TTY* OpenFileDescription::tty()
|
||||
{
|
||||
if (!is_tty())
|
||||
return nullptr;
|
||||
return static_cast<TTY*>(m_file.ptr());
|
||||
}
|
||||
|
||||
bool FileDescription::is_inode_watcher() const
|
||||
bool OpenFileDescription::is_inode_watcher() const
|
||||
{
|
||||
return m_file->is_inode_watcher();
|
||||
}
|
||||
|
||||
const InodeWatcher* FileDescription::inode_watcher() const
|
||||
const InodeWatcher* OpenFileDescription::inode_watcher() const
|
||||
{
|
||||
if (!is_inode_watcher())
|
||||
return nullptr;
|
||||
return static_cast<const InodeWatcher*>(m_file.ptr());
|
||||
}
|
||||
|
||||
InodeWatcher* FileDescription::inode_watcher()
|
||||
InodeWatcher* OpenFileDescription::inode_watcher()
|
||||
{
|
||||
if (!is_inode_watcher())
|
||||
return nullptr;
|
||||
return static_cast<InodeWatcher*>(m_file.ptr());
|
||||
}
|
||||
|
||||
bool FileDescription::is_master_pty() const
|
||||
bool OpenFileDescription::is_master_pty() const
|
||||
{
|
||||
return m_file->is_master_pty();
|
||||
}
|
||||
|
||||
const MasterPTY* FileDescription::master_pty() const
|
||||
const MasterPTY* OpenFileDescription::master_pty() const
|
||||
{
|
||||
if (!is_master_pty())
|
||||
return nullptr;
|
||||
return static_cast<const MasterPTY*>(m_file.ptr());
|
||||
}
|
||||
|
||||
MasterPTY* FileDescription::master_pty()
|
||||
MasterPTY* OpenFileDescription::master_pty()
|
||||
{
|
||||
if (!is_master_pty())
|
||||
return nullptr;
|
||||
return static_cast<MasterPTY*>(m_file.ptr());
|
||||
}
|
||||
|
||||
KResult FileDescription::close()
|
||||
KResult OpenFileDescription::close()
|
||||
{
|
||||
if (m_file->attach_count() > 0)
|
||||
return KSuccess;
|
||||
return m_file->close();
|
||||
}
|
||||
|
||||
KResultOr<NonnullOwnPtr<KString>> FileDescription::try_serialize_absolute_path()
|
||||
KResultOr<NonnullOwnPtr<KString>> OpenFileDescription::try_serialize_absolute_path()
|
||||
{
|
||||
if (m_custody)
|
||||
return m_custody->try_serialize_absolute_path();
|
||||
|
@ -352,64 +352,64 @@ KResultOr<NonnullOwnPtr<KString>> FileDescription::try_serialize_absolute_path()
|
|||
return KString::try_create(m_file->absolute_path(*this));
|
||||
}
|
||||
|
||||
String FileDescription::absolute_path() const
|
||||
String OpenFileDescription::absolute_path() const
|
||||
{
|
||||
if (m_custody)
|
||||
return m_custody->absolute_path();
|
||||
return m_file->absolute_path(*this);
|
||||
}
|
||||
|
||||
InodeMetadata FileDescription::metadata() const
|
||||
InodeMetadata OpenFileDescription::metadata() const
|
||||
{
|
||||
if (m_inode)
|
||||
return m_inode->metadata();
|
||||
return {};
|
||||
}
|
||||
|
||||
KResultOr<Memory::Region*> FileDescription::mmap(Process& process, Memory::VirtualRange const& range, u64 offset, int prot, bool shared)
|
||||
KResultOr<Memory::Region*> OpenFileDescription::mmap(Process& process, Memory::VirtualRange const& range, u64 offset, int prot, bool shared)
|
||||
{
|
||||
MutexLocker locker(m_lock);
|
||||
return m_file->mmap(process, *this, range, offset, prot, shared);
|
||||
}
|
||||
|
||||
KResult FileDescription::truncate(u64 length)
|
||||
KResult OpenFileDescription::truncate(u64 length)
|
||||
{
|
||||
MutexLocker locker(m_lock);
|
||||
return m_file->truncate(length);
|
||||
}
|
||||
|
||||
bool FileDescription::is_fifo() const
|
||||
bool OpenFileDescription::is_fifo() const
|
||||
{
|
||||
return m_file->is_fifo();
|
||||
}
|
||||
|
||||
FIFO* FileDescription::fifo()
|
||||
FIFO* OpenFileDescription::fifo()
|
||||
{
|
||||
if (!is_fifo())
|
||||
return nullptr;
|
||||
return static_cast<FIFO*>(m_file.ptr());
|
||||
}
|
||||
|
||||
bool FileDescription::is_socket() const
|
||||
bool OpenFileDescription::is_socket() const
|
||||
{
|
||||
return m_file->is_socket();
|
||||
}
|
||||
|
||||
Socket* FileDescription::socket()
|
||||
Socket* OpenFileDescription::socket()
|
||||
{
|
||||
if (!is_socket())
|
||||
return nullptr;
|
||||
return static_cast<Socket*>(m_file.ptr());
|
||||
}
|
||||
|
||||
const Socket* FileDescription::socket() const
|
||||
const Socket* OpenFileDescription::socket() const
|
||||
{
|
||||
if (!is_socket())
|
||||
return nullptr;
|
||||
return static_cast<const Socket*>(m_file.ptr());
|
||||
}
|
||||
|
||||
void FileDescription::set_file_flags(u32 flags)
|
||||
void OpenFileDescription::set_file_flags(u32 flags)
|
||||
{
|
||||
MutexLocker locker(m_lock);
|
||||
m_is_blocking = !(flags & O_NONBLOCK);
|
||||
|
@ -418,24 +418,24 @@ void FileDescription::set_file_flags(u32 flags)
|
|||
m_file_flags = flags;
|
||||
}
|
||||
|
||||
KResult FileDescription::chmod(mode_t mode)
|
||||
KResult OpenFileDescription::chmod(mode_t mode)
|
||||
{
|
||||
MutexLocker locker(m_lock);
|
||||
return m_file->chmod(*this, mode);
|
||||
}
|
||||
|
||||
KResult FileDescription::chown(UserID uid, GroupID gid)
|
||||
KResult OpenFileDescription::chown(UserID uid, GroupID gid)
|
||||
{
|
||||
MutexLocker locker(m_lock);
|
||||
return m_file->chown(*this, uid, gid);
|
||||
}
|
||||
|
||||
FileBlockerSet& FileDescription::blocker_set()
|
||||
FileBlockerSet& OpenFileDescription::blocker_set()
|
||||
{
|
||||
return m_file->blocker_set();
|
||||
}
|
||||
|
||||
KResult FileDescription::apply_flock(Process const& process, Userspace<flock const*> lock)
|
||||
KResult OpenFileDescription::apply_flock(Process const& process, Userspace<flock const*> lock)
|
||||
{
|
||||
if (!m_inode)
|
||||
return EBADF;
|
||||
|
@ -443,7 +443,7 @@ KResult FileDescription::apply_flock(Process const& process, Userspace<flock con
|
|||
return m_inode->apply_flock(process, *this, lock);
|
||||
}
|
||||
|
||||
KResult FileDescription::get_flock(Userspace<flock*> lock) const
|
||||
KResult OpenFileDescription::get_flock(Userspace<flock*> lock) const
|
||||
{
|
||||
if (!m_inode)
|
||||
return EBADF;
|
|
@ -18,17 +18,17 @@
|
|||
|
||||
namespace Kernel {
|
||||
|
||||
class FileDescriptionData {
|
||||
class OpenFileDescriptionData {
|
||||
public:
|
||||
virtual ~FileDescriptionData() = default;
|
||||
virtual ~OpenFileDescriptionData() = default;
|
||||
};
|
||||
|
||||
class FileDescription : public RefCounted<FileDescription> {
|
||||
MAKE_SLAB_ALLOCATED(FileDescription)
|
||||
class OpenFileDescription : public RefCounted<OpenFileDescription> {
|
||||
MAKE_SLAB_ALLOCATED(OpenFileDescription)
|
||||
public:
|
||||
static KResultOr<NonnullRefPtr<FileDescription>> try_create(Custody&);
|
||||
static KResultOr<NonnullRefPtr<FileDescription>> try_create(File&);
|
||||
~FileDescription();
|
||||
static KResultOr<NonnullRefPtr<OpenFileDescription>> try_create(Custody&);
|
||||
static KResultOr<NonnullRefPtr<OpenFileDescription>> try_create(File&);
|
||||
~OpenFileDescription();
|
||||
|
||||
Thread::FileBlocker::BlockFlags should_unblock(Thread::FileBlocker::BlockFlags) const;
|
||||
|
||||
|
@ -116,7 +116,7 @@ public:
|
|||
FIFO::Direction fifo_direction() const { return m_fifo_direction; }
|
||||
void set_fifo_direction(Badge<FIFO>, FIFO::Direction direction) { m_fifo_direction = direction; }
|
||||
|
||||
OwnPtr<FileDescriptionData>& data() { return m_data; }
|
||||
OwnPtr<OpenFileDescriptionData>& data() { return m_data; }
|
||||
|
||||
void set_original_inode(Badge<VirtualFileSystem>, NonnullRefPtr<Inode>&& inode) { m_inode = move(inode); }
|
||||
|
||||
|
@ -133,7 +133,7 @@ public:
|
|||
|
||||
private:
|
||||
friend class VirtualFileSystem;
|
||||
explicit FileDescription(File&);
|
||||
explicit OpenFileDescription(File&);
|
||||
|
||||
KResult attach();
|
||||
|
||||
|
@ -148,7 +148,7 @@ private:
|
|||
|
||||
off_t m_current_offset { 0 };
|
||||
|
||||
OwnPtr<FileDescriptionData> m_data;
|
||||
OwnPtr<OpenFileDescriptionData> m_data;
|
||||
|
||||
u32 m_file_flags { 0 };
|
||||
|
||||
|
@ -160,7 +160,7 @@ private:
|
|||
bool m_direct : 1 { false };
|
||||
FIFO::Direction m_fifo_direction { FIFO::Direction::Neither };
|
||||
|
||||
Mutex m_lock { "FileDescription" };
|
||||
Mutex m_lock { "OpenFileDescription" };
|
||||
};
|
||||
|
||||
}
|
|
@ -9,12 +9,12 @@
|
|||
|
||||
namespace Kernel {
|
||||
|
||||
KResultOr<NonnullRefPtr<Plan9FS>> Plan9FS::try_create(FileDescription& file_description)
|
||||
KResultOr<NonnullRefPtr<Plan9FS>> Plan9FS::try_create(OpenFileDescription& file_description)
|
||||
{
|
||||
return adopt_nonnull_ref_or_enomem(new (nothrow) Plan9FS(file_description));
|
||||
}
|
||||
|
||||
Plan9FS::Plan9FS(FileDescription& file_description)
|
||||
Plan9FS::Plan9FS(OpenFileDescription& file_description)
|
||||
: FileBackedFileSystem(file_description)
|
||||
, m_completion_blocker(*this)
|
||||
{
|
||||
|
@ -720,7 +720,7 @@ KResult Plan9FSInode::ensure_open_for_mode(int mode)
|
|||
}
|
||||
}
|
||||
|
||||
KResultOr<size_t> Plan9FSInode::read_bytes(off_t offset, size_t size, UserOrKernelBuffer& buffer, FileDescription*) const
|
||||
KResultOr<size_t> Plan9FSInode::read_bytes(off_t offset, size_t size, UserOrKernelBuffer& buffer, OpenFileDescription*) const
|
||||
{
|
||||
TRY(const_cast<Plan9FSInode&>(*this).ensure_open_for_mode(O_RDONLY));
|
||||
|
||||
|
@ -752,7 +752,7 @@ KResultOr<size_t> Plan9FSInode::read_bytes(off_t offset, size_t size, UserOrKern
|
|||
return nread;
|
||||
}
|
||||
|
||||
KResultOr<size_t> Plan9FSInode::write_bytes(off_t offset, size_t size, const UserOrKernelBuffer& data, FileDescription*)
|
||||
KResultOr<size_t> Plan9FSInode::write_bytes(off_t offset, size_t size, const UserOrKernelBuffer& data, OpenFileDescription*)
|
||||
{
|
||||
TRY(ensure_open_for_mode(O_WRONLY));
|
||||
size = fs().adjust_buffer_size(size);
|
||||
|
|
|
@ -20,7 +20,7 @@ class Plan9FS final : public FileBackedFileSystem {
|
|||
|
||||
public:
|
||||
virtual ~Plan9FS() override;
|
||||
static KResultOr<NonnullRefPtr<Plan9FS>> try_create(FileDescription&);
|
||||
static KResultOr<NonnullRefPtr<Plan9FS>> try_create(OpenFileDescription&);
|
||||
|
||||
virtual KResult initialize() override;
|
||||
|
||||
|
@ -46,7 +46,7 @@ public:
|
|||
class Message;
|
||||
|
||||
private:
|
||||
Plan9FS(FileDescription&);
|
||||
Plan9FS(OpenFileDescription&);
|
||||
|
||||
class Blocker;
|
||||
|
||||
|
@ -156,8 +156,8 @@ public:
|
|||
// ^Inode
|
||||
virtual InodeMetadata metadata() const override;
|
||||
virtual void flush_metadata() override;
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override;
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& data, FileDescription*) override;
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override;
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& data, OpenFileDescription*) override;
|
||||
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
#include <AK/Singleton.h>
|
||||
#include <Kernel/Debug.h>
|
||||
#include <Kernel/FileSystem/Custody.h>
|
||||
#include <Kernel/FileSystem/FileDescription.h>
|
||||
#include <Kernel/FileSystem/OpenFileDescription.h>
|
||||
#include <Kernel/FileSystem/ProcFS.h>
|
||||
#include <Kernel/FileSystem/VirtualFileSystem.h>
|
||||
#include <Kernel/Heap/kmalloc.h>
|
||||
|
@ -115,7 +115,7 @@ ProcFSGlobalInode::ProcFSGlobalInode(const ProcFS& fs, const ProcFSExposedCompon
|
|||
{
|
||||
}
|
||||
|
||||
void ProcFSGlobalInode::did_seek(FileDescription& description, off_t new_offset)
|
||||
void ProcFSGlobalInode::did_seek(OpenFileDescription& description, off_t new_offset)
|
||||
{
|
||||
if (new_offset != 0)
|
||||
return;
|
||||
|
@ -126,12 +126,12 @@ void ProcFSGlobalInode::did_seek(FileDescription& description, off_t new_offset)
|
|||
}
|
||||
}
|
||||
|
||||
KResult ProcFSGlobalInode::attach(FileDescription& description)
|
||||
KResult ProcFSGlobalInode::attach(OpenFileDescription& description)
|
||||
{
|
||||
return m_associated_component->refresh_data(description);
|
||||
}
|
||||
|
||||
KResultOr<size_t> ProcFSGlobalInode::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, FileDescription* fd) const
|
||||
KResultOr<size_t> ProcFSGlobalInode::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, OpenFileDescription* fd) const
|
||||
{
|
||||
return m_associated_component->read_bytes(offset, count, buffer, fd);
|
||||
}
|
||||
|
@ -164,7 +164,7 @@ InodeMetadata ProcFSGlobalInode::metadata() const
|
|||
return metadata;
|
||||
}
|
||||
|
||||
KResultOr<size_t> ProcFSGlobalInode::write_bytes(off_t offset, size_t count, const UserOrKernelBuffer& buffer, FileDescription* fd)
|
||||
KResultOr<size_t> ProcFSGlobalInode::write_bytes(off_t offset, size_t count, const UserOrKernelBuffer& buffer, OpenFileDescription* fd)
|
||||
{
|
||||
return m_associated_component->write_bytes(offset, count, buffer, fd);
|
||||
}
|
||||
|
@ -236,7 +236,7 @@ ProcFSProcessAssociatedInode::ProcFSProcessAssociatedInode(const ProcFS& fs, Pro
|
|||
{
|
||||
}
|
||||
|
||||
KResultOr<size_t> ProcFSProcessAssociatedInode::write_bytes(off_t, size_t, const UserOrKernelBuffer&, FileDescription*)
|
||||
KResultOr<size_t> ProcFSProcessAssociatedInode::write_bytes(off_t, size_t, const UserOrKernelBuffer&, OpenFileDescription*)
|
||||
{
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
@ -251,7 +251,7 @@ ProcFSProcessDirectoryInode::ProcFSProcessDirectoryInode(const ProcFS& procfs, P
|
|||
{
|
||||
}
|
||||
|
||||
KResult ProcFSProcessDirectoryInode::attach(FileDescription&)
|
||||
KResult ProcFSProcessDirectoryInode::attach(OpenFileDescription&)
|
||||
{
|
||||
return KSuccess;
|
||||
}
|
||||
|
@ -274,7 +274,7 @@ InodeMetadata ProcFSProcessDirectoryInode::metadata() const
|
|||
return metadata;
|
||||
}
|
||||
|
||||
KResultOr<size_t> ProcFSProcessDirectoryInode::read_bytes(off_t, size_t, UserOrKernelBuffer&, FileDescription*) const
|
||||
KResultOr<size_t> ProcFSProcessDirectoryInode::read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const
|
||||
{
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
@ -295,7 +295,7 @@ KResultOr<NonnullRefPtr<Inode>> ProcFSProcessDirectoryInode::lookup(StringView n
|
|||
if (!process)
|
||||
return ESRCH;
|
||||
if (name == "fd"sv)
|
||||
return TRY(ProcFSProcessSubDirectoryInode::try_create(procfs(), SegmentedProcFSIndex::ProcessSubDirectory::FileDescriptions, associated_pid()));
|
||||
return TRY(ProcFSProcessSubDirectoryInode::try_create(procfs(), SegmentedProcFSIndex::ProcessSubDirectory::OpenFileDescriptions, associated_pid()));
|
||||
if (name == "stacks"sv)
|
||||
return TRY(ProcFSProcessSubDirectoryInode::try_create(procfs(), SegmentedProcFSIndex::ProcessSubDirectory::Stacks, associated_pid()));
|
||||
if (name == "unveil"sv)
|
||||
|
@ -303,7 +303,7 @@ KResultOr<NonnullRefPtr<Inode>> ProcFSProcessDirectoryInode::lookup(StringView n
|
|||
if (name == "pledge"sv)
|
||||
return TRY(ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::Pledge, associated_pid()));
|
||||
if (name == "fds"sv)
|
||||
return TRY(ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::FileDescriptions, associated_pid()));
|
||||
return TRY(ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::OpenFileDescriptions, associated_pid()));
|
||||
if (name == "exe"sv)
|
||||
return TRY(ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::BinaryLink, associated_pid()));
|
||||
if (name == "cwd"sv)
|
||||
|
@ -326,17 +326,17 @@ ProcFSProcessSubDirectoryInode::ProcFSProcessSubDirectoryInode(const ProcFS& pro
|
|||
{
|
||||
}
|
||||
|
||||
KResultOr<size_t> ProcFSProcessSubDirectoryInode::read_bytes(off_t, size_t, UserOrKernelBuffer&, FileDescription*) const
|
||||
KResultOr<size_t> ProcFSProcessSubDirectoryInode::read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const
|
||||
{
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
KResult ProcFSProcessSubDirectoryInode::attach(FileDescription&)
|
||||
KResult ProcFSProcessSubDirectoryInode::attach(OpenFileDescription&)
|
||||
{
|
||||
return KSuccess;
|
||||
}
|
||||
|
||||
void ProcFSProcessSubDirectoryInode::did_seek(FileDescription&, off_t)
|
||||
void ProcFSProcessSubDirectoryInode::did_seek(OpenFileDescription&, off_t)
|
||||
{
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
@ -366,7 +366,7 @@ KResult ProcFSProcessSubDirectoryInode::traverse_as_directory(Function<bool(File
|
|||
if (!process)
|
||||
return EINVAL;
|
||||
switch (m_sub_directory_type) {
|
||||
case SegmentedProcFSIndex::ProcessSubDirectory::FileDescriptions:
|
||||
case SegmentedProcFSIndex::ProcessSubDirectory::OpenFileDescriptions:
|
||||
return process->traverse_file_descriptions_directory(procfs().fsid(), move(callback));
|
||||
case SegmentedProcFSIndex::ProcessSubDirectory::Stacks:
|
||||
return process->traverse_stacks_directory(procfs().fsid(), move(callback));
|
||||
|
@ -383,7 +383,7 @@ KResultOr<NonnullRefPtr<Inode>> ProcFSProcessSubDirectoryInode::lookup(StringVie
|
|||
if (!process)
|
||||
return ESRCH;
|
||||
switch (m_sub_directory_type) {
|
||||
case SegmentedProcFSIndex::ProcessSubDirectory::FileDescriptions:
|
||||
case SegmentedProcFSIndex::ProcessSubDirectory::OpenFileDescriptions:
|
||||
return process->lookup_file_descriptions_directory(procfs(), name);
|
||||
case SegmentedProcFSIndex::ProcessSubDirectory::Stacks:
|
||||
return process->lookup_stacks_directory(procfs(), name);
|
||||
|
@ -414,7 +414,7 @@ ProcFSProcessPropertyInode::ProcFSProcessPropertyInode(const ProcFS& procfs, Seg
|
|||
|
||||
ProcFSProcessPropertyInode::ProcFSProcessPropertyInode(const ProcFS& procfs, unsigned file_description_index, ProcessID pid)
|
||||
: ProcFSProcessAssociatedInode(procfs, pid, SegmentedProcFSIndex::build_segmented_index_for_file_description(pid, file_description_index))
|
||||
, m_parent_sub_directory_type(SegmentedProcFSIndex::ProcessSubDirectory::FileDescriptions)
|
||||
, m_parent_sub_directory_type(SegmentedProcFSIndex::ProcessSubDirectory::OpenFileDescriptions)
|
||||
{
|
||||
m_possible_data.property_index = file_description_index;
|
||||
}
|
||||
|
@ -426,11 +426,11 @@ ProcFSProcessPropertyInode::ProcFSProcessPropertyInode(const ProcFS& procfs, Thr
|
|||
m_possible_data.property_index = thread_stack_index.value();
|
||||
}
|
||||
|
||||
KResult ProcFSProcessPropertyInode::attach(FileDescription& description)
|
||||
KResult ProcFSProcessPropertyInode::attach(OpenFileDescription& description)
|
||||
{
|
||||
return refresh_data(description);
|
||||
}
|
||||
void ProcFSProcessPropertyInode::did_seek(FileDescription& description, off_t offset)
|
||||
void ProcFSProcessPropertyInode::did_seek(OpenFileDescription& description, off_t offset)
|
||||
{
|
||||
if (offset != 0)
|
||||
return;
|
||||
|
@ -439,7 +439,7 @@ void ProcFSProcessPropertyInode::did_seek(FileDescription& description, off_t of
|
|||
|
||||
static mode_t determine_procfs_process_inode_mode(SegmentedProcFSIndex::ProcessSubDirectory parent_sub_directory_type, SegmentedProcFSIndex::MainProcessProperty main_property)
|
||||
{
|
||||
if (parent_sub_directory_type == SegmentedProcFSIndex::ProcessSubDirectory::FileDescriptions)
|
||||
if (parent_sub_directory_type == SegmentedProcFSIndex::ProcessSubDirectory::OpenFileDescriptions)
|
||||
return S_IFLNK | 0400;
|
||||
if (parent_sub_directory_type == SegmentedProcFSIndex::ProcessSubDirectory::Stacks)
|
||||
return S_IFREG | 0400;
|
||||
|
@ -472,7 +472,7 @@ KResult ProcFSProcessPropertyInode::traverse_as_directory(Function<bool(FileSyst
|
|||
{
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
KResultOr<size_t> ProcFSProcessPropertyInode::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, FileDescription* description) const
|
||||
KResultOr<size_t> ProcFSProcessPropertyInode::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, OpenFileDescription* description) const
|
||||
{
|
||||
dbgln_if(PROCFS_DEBUG, "ProcFS ProcessInformation: read_bytes offset: {} count: {}", offset, count);
|
||||
|
||||
|
@ -526,7 +526,7 @@ static KResult build_from_cached_data(KBufferBuilder& builder, ProcFSInodeData&
|
|||
KResult ProcFSProcessPropertyInode::try_to_acquire_data(Process& process, KBufferBuilder& builder) const
|
||||
{
|
||||
// FIXME: Verify process is already ref-counted
|
||||
if (m_parent_sub_directory_type == SegmentedProcFSIndex::ProcessSubDirectory::FileDescriptions) {
|
||||
if (m_parent_sub_directory_type == SegmentedProcFSIndex::ProcessSubDirectory::OpenFileDescriptions) {
|
||||
TRY(process.procfs_get_file_description_link(m_possible_data.property_index, builder));
|
||||
return KSuccess;
|
||||
}
|
||||
|
@ -541,7 +541,7 @@ KResult ProcFSProcessPropertyInode::try_to_acquire_data(Process& process, KBuffe
|
|||
return process.procfs_get_unveil_stats(builder);
|
||||
case SegmentedProcFSIndex::MainProcessProperty::Pledge:
|
||||
return process.procfs_get_pledge_stats(builder);
|
||||
case SegmentedProcFSIndex::MainProcessProperty::FileDescriptions:
|
||||
case SegmentedProcFSIndex::MainProcessProperty::OpenFileDescriptions:
|
||||
return process.procfs_get_fds_stats(builder);
|
||||
case SegmentedProcFSIndex::MainProcessProperty::BinaryLink:
|
||||
return process.procfs_get_binary_link(builder);
|
||||
|
@ -556,7 +556,7 @@ KResult ProcFSProcessPropertyInode::try_to_acquire_data(Process& process, KBuffe
|
|||
}
|
||||
}
|
||||
|
||||
KResult ProcFSProcessPropertyInode::refresh_data(FileDescription& description)
|
||||
KResult ProcFSProcessPropertyInode::refresh_data(OpenFileDescription& description)
|
||||
{
|
||||
// For process-specific inodes, hold the process's ptrace lock across refresh
|
||||
// and refuse to load data if the process is not dumpable.
|
||||
|
|
|
@ -54,8 +54,8 @@ protected:
|
|||
ProcFS const& procfs() const { return static_cast<ProcFS const&>(Inode::fs()); }
|
||||
|
||||
// ^Inode
|
||||
virtual KResult attach(FileDescription& description) = 0;
|
||||
virtual void did_seek(FileDescription&, off_t) = 0;
|
||||
virtual KResult attach(OpenFileDescription& description) = 0;
|
||||
virtual void did_seek(OpenFileDescription&, off_t) = 0;
|
||||
virtual void flush_metadata() override final;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override final;
|
||||
virtual KResult add_child(Inode&, const StringView& name, mode_t) override final;
|
||||
|
@ -77,10 +77,10 @@ protected:
|
|||
ProcFSGlobalInode(const ProcFS&, const ProcFSExposedComponent&);
|
||||
|
||||
// ^Inode
|
||||
virtual KResult attach(FileDescription& description) override final;
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override final;
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override final;
|
||||
virtual void did_seek(FileDescription&, off_t) override final;
|
||||
virtual KResult attach(OpenFileDescription& description) override final;
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override final;
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, OpenFileDescription*) override final;
|
||||
virtual void did_seek(OpenFileDescription&, off_t) override final;
|
||||
virtual InodeMetadata metadata() const override;
|
||||
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView) override;
|
||||
|
@ -122,7 +122,7 @@ protected:
|
|||
ProcessID associated_pid() const { return m_pid; }
|
||||
|
||||
// ^Inode
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override final;
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, OpenFileDescription*) override final;
|
||||
|
||||
private:
|
||||
const ProcessID m_pid;
|
||||
|
@ -137,11 +137,11 @@ public:
|
|||
private:
|
||||
ProcFSProcessDirectoryInode(const ProcFS&, ProcessID);
|
||||
// ^Inode
|
||||
virtual KResult attach(FileDescription& description) override;
|
||||
virtual void did_seek(FileDescription&, off_t) override { }
|
||||
virtual KResult attach(OpenFileDescription& description) override;
|
||||
virtual void did_seek(OpenFileDescription&, off_t) override { }
|
||||
virtual InodeMetadata metadata() const override;
|
||||
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override final;
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override final;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
||||
};
|
||||
|
||||
|
@ -154,11 +154,11 @@ public:
|
|||
private:
|
||||
ProcFSProcessSubDirectoryInode(const ProcFS&, SegmentedProcFSIndex::ProcessSubDirectory, ProcessID);
|
||||
// ^Inode
|
||||
virtual KResult attach(FileDescription& description) override;
|
||||
virtual void did_seek(FileDescription&, off_t) override;
|
||||
virtual KResult attach(OpenFileDescription& description) override;
|
||||
virtual void did_seek(OpenFileDescription&, off_t) override;
|
||||
virtual InodeMetadata metadata() const override;
|
||||
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override final;
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override final;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
||||
|
||||
const SegmentedProcFSIndex::ProcessSubDirectory m_sub_directory_type;
|
||||
|
@ -177,14 +177,14 @@ private:
|
|||
ProcFSProcessPropertyInode(const ProcFS&, ThreadID, ProcessID);
|
||||
ProcFSProcessPropertyInode(const ProcFS&, unsigned, ProcessID);
|
||||
// ^Inode
|
||||
virtual KResult attach(FileDescription& description) override;
|
||||
virtual void did_seek(FileDescription&, off_t) override;
|
||||
virtual KResult attach(OpenFileDescription& description) override;
|
||||
virtual void did_seek(OpenFileDescription&, off_t) override;
|
||||
virtual InodeMetadata metadata() const override;
|
||||
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override final;
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override final;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override final;
|
||||
|
||||
KResult refresh_data(FileDescription& description);
|
||||
KResult refresh_data(OpenFileDescription& description);
|
||||
KResult try_to_acquire_data(Process& process, KBufferBuilder& builder) const;
|
||||
|
||||
const SegmentedProcFSIndex::ProcessSubDirectory m_parent_sub_directory_type;
|
||||
|
|
|
@ -96,7 +96,7 @@ SysFSInode::SysFSInode(SysFS const& fs, SysFSComponent const& component)
|
|||
{
|
||||
}
|
||||
|
||||
void SysFSInode::did_seek(FileDescription& description, off_t new_offset)
|
||||
void SysFSInode::did_seek(OpenFileDescription& description, off_t new_offset)
|
||||
{
|
||||
if (new_offset != 0)
|
||||
return;
|
||||
|
@ -107,12 +107,12 @@ void SysFSInode::did_seek(FileDescription& description, off_t new_offset)
|
|||
}
|
||||
}
|
||||
|
||||
KResult SysFSInode::attach(FileDescription& description)
|
||||
KResult SysFSInode::attach(OpenFileDescription& description)
|
||||
{
|
||||
return m_associated_component->refresh_data(description);
|
||||
}
|
||||
|
||||
KResultOr<size_t> SysFSInode::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, FileDescription* fd) const
|
||||
KResultOr<size_t> SysFSInode::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, OpenFileDescription* fd) const
|
||||
{
|
||||
return m_associated_component->read_bytes(offset, count, buffer, fd);
|
||||
}
|
||||
|
@ -144,7 +144,7 @@ void SysFSInode::flush_metadata()
|
|||
{
|
||||
}
|
||||
|
||||
KResultOr<size_t> SysFSInode::write_bytes(off_t offset, size_t count, UserOrKernelBuffer const& buffer, FileDescription* fd)
|
||||
KResultOr<size_t> SysFSInode::write_bytes(off_t offset, size_t count, UserOrKernelBuffer const& buffer, OpenFileDescription* fd)
|
||||
{
|
||||
return m_associated_component->write_bytes(offset, count, buffer, fd);
|
||||
}
|
||||
|
|
|
@ -83,12 +83,12 @@ public:
|
|||
|
||||
protected:
|
||||
SysFSInode(SysFS const&, SysFSComponent const&);
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override;
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override;
|
||||
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
||||
virtual void flush_metadata() override;
|
||||
virtual InodeMetadata metadata() const override;
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, UserOrKernelBuffer const&, FileDescription*) override;
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, UserOrKernelBuffer const&, OpenFileDescription*) override;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
|
||||
virtual KResult add_child(Inode&, StringView const& name, mode_t) override;
|
||||
virtual KResult remove_child(StringView const& name) override;
|
||||
|
@ -96,8 +96,8 @@ protected:
|
|||
virtual KResult chown(UserID, GroupID) override;
|
||||
virtual KResult truncate(u64) override;
|
||||
|
||||
virtual KResult attach(FileDescription& description) override final;
|
||||
virtual void did_seek(FileDescription&, off_t) override final;
|
||||
virtual KResult attach(OpenFileDescription& description) override final;
|
||||
virtual void did_seek(OpenFileDescription&, off_t) override final;
|
||||
|
||||
NonnullRefPtr<SysFSComponent> m_associated_component;
|
||||
};
|
||||
|
|
|
@ -13,24 +13,24 @@
|
|||
#include <AK/Types.h>
|
||||
#include <Kernel/API/KResult.h>
|
||||
#include <Kernel/FileSystem/File.h>
|
||||
#include <Kernel/FileSystem/FileDescription.h>
|
||||
#include <Kernel/FileSystem/FileSystem.h>
|
||||
#include <Kernel/FileSystem/OpenFileDescription.h>
|
||||
#include <Kernel/Forward.h>
|
||||
|
||||
namespace Kernel {
|
||||
|
||||
struct SysFSInodeData : public FileDescriptionData {
|
||||
struct SysFSInodeData : public OpenFileDescriptionData {
|
||||
OwnPtr<KBuffer> buffer;
|
||||
};
|
||||
|
||||
class SysFSComponent : public RefCounted<SysFSComponent> {
|
||||
public:
|
||||
virtual StringView name() const { return m_name->view(); }
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer&, FileDescription*) const { VERIFY_NOT_REACHED(); }
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const { VERIFY_NOT_REACHED(); }
|
||||
virtual KResult traverse_as_directory(unsigned, Function<bool(FileSystem::DirectoryEntryView const&)>) const { VERIFY_NOT_REACHED(); }
|
||||
virtual RefPtr<SysFSComponent> lookup(StringView) { VERIFY_NOT_REACHED(); };
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, UserOrKernelBuffer const&, FileDescription*) { return EROFS; }
|
||||
virtual KResult refresh_data(FileDescription&) const { return KSuccess; }
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, UserOrKernelBuffer const&, OpenFileDescription*) { return EROFS; }
|
||||
virtual KResult refresh_data(OpenFileDescription&) const { return KSuccess; }
|
||||
|
||||
virtual KResultOr<NonnullRefPtr<SysFSInode>> to_inode(SysFS const&) const;
|
||||
|
||||
|
|
|
@ -123,7 +123,7 @@ KResult TmpFSInode::traverse_as_directory(Function<bool(FileSystem::DirectoryEnt
|
|||
return KSuccess;
|
||||
}
|
||||
|
||||
KResultOr<size_t> TmpFSInode::read_bytes(off_t offset, size_t size, UserOrKernelBuffer& buffer, FileDescription*) const
|
||||
KResultOr<size_t> TmpFSInode::read_bytes(off_t offset, size_t size, UserOrKernelBuffer& buffer, OpenFileDescription*) const
|
||||
{
|
||||
MutexLocker locker(m_inode_lock, Mutex::Mode::Shared);
|
||||
VERIFY(!is_directory());
|
||||
|
@ -142,7 +142,7 @@ KResultOr<size_t> TmpFSInode::read_bytes(off_t offset, size_t size, UserOrKernel
|
|||
return size;
|
||||
}
|
||||
|
||||
KResultOr<size_t> TmpFSInode::write_bytes(off_t offset, size_t size, const UserOrKernelBuffer& buffer, FileDescription*)
|
||||
KResultOr<size_t> TmpFSInode::write_bytes(off_t offset, size_t size, const UserOrKernelBuffer& buffer, OpenFileDescription*)
|
||||
{
|
||||
MutexLocker locker(m_inode_lock);
|
||||
VERIFY(!is_directory());
|
||||
|
|
|
@ -52,12 +52,12 @@ public:
|
|||
const TmpFS& fs() const { return static_cast<const TmpFS&>(Inode::fs()); }
|
||||
|
||||
// ^Inode
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override;
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override;
|
||||
virtual InodeMetadata metadata() const override;
|
||||
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
||||
virtual void flush_metadata() override;
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override;
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, OpenFileDescription*) override;
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
|
||||
virtual KResult add_child(Inode&, const StringView& name, mode_t) override;
|
||||
virtual KResult remove_child(const StringView& name) override;
|
||||
|
|
|
@ -11,8 +11,8 @@
|
|||
#include <Kernel/Devices/BlockDevice.h>
|
||||
#include <Kernel/FileSystem/Custody.h>
|
||||
#include <Kernel/FileSystem/FileBackedFileSystem.h>
|
||||
#include <Kernel/FileSystem/FileDescription.h>
|
||||
#include <Kernel/FileSystem/FileSystem.h>
|
||||
#include <Kernel/FileSystem/OpenFileDescription.h>
|
||||
#include <Kernel/FileSystem/VirtualFileSystem.h>
|
||||
#include <Kernel/KLexicalPath.h>
|
||||
#include <Kernel/KSyms.h>
|
||||
|
@ -203,7 +203,7 @@ KResultOr<InodeMetadata> VirtualFileSystem::lookup_metadata(StringView path, Cus
|
|||
return custody->inode().metadata();
|
||||
}
|
||||
|
||||
KResultOr<NonnullRefPtr<FileDescription>> VirtualFileSystem::open(StringView path, int options, mode_t mode, Custody& base, Optional<UidAndGid> owner)
|
||||
KResultOr<NonnullRefPtr<OpenFileDescription>> VirtualFileSystem::open(StringView path, int options, mode_t mode, Custody& base, Optional<UidAndGid> owner)
|
||||
{
|
||||
if ((options & O_CREAT) && (options & O_DIRECTORY))
|
||||
return EINVAL;
|
||||
|
@ -288,7 +288,7 @@ KResultOr<NonnullRefPtr<FileDescription>> VirtualFileSystem::open(StringView pat
|
|||
TRY(inode.truncate(0));
|
||||
TRY(inode.set_mtime(kgettimeofday().to_truncated_seconds()));
|
||||
}
|
||||
auto description = TRY(FileDescription::try_create(custody));
|
||||
auto description = TRY(OpenFileDescription::try_create(custody));
|
||||
description->set_rw_mode(options);
|
||||
description->set_file_flags(options);
|
||||
return description;
|
||||
|
@ -319,7 +319,7 @@ KResult VirtualFileSystem::mknod(StringView path, mode_t mode, dev_t dev, Custod
|
|||
return parent_inode.create_child(basename, mode, dev, current_process.euid(), current_process.egid()).result();
|
||||
}
|
||||
|
||||
KResultOr<NonnullRefPtr<FileDescription>> VirtualFileSystem::create(StringView path, int options, mode_t mode, Custody& parent_custody, Optional<UidAndGid> owner)
|
||||
KResultOr<NonnullRefPtr<OpenFileDescription>> VirtualFileSystem::create(StringView path, int options, mode_t mode, Custody& parent_custody, Optional<UidAndGid> owner)
|
||||
{
|
||||
auto basename = KLexicalPath::basename(path);
|
||||
auto parent_path = TRY(parent_custody.try_serialize_absolute_path());
|
||||
|
@ -345,7 +345,7 @@ KResultOr<NonnullRefPtr<FileDescription>> VirtualFileSystem::create(StringView p
|
|||
auto inode = TRY(parent_inode.create_child(basename, mode, 0, uid, gid));
|
||||
auto custody = TRY(Custody::try_create(&parent_custody, basename, inode, parent_custody.mount_flags()));
|
||||
|
||||
auto description = TRY(FileDescription::try_create(move(custody)));
|
||||
auto description = TRY(OpenFileDescription::try_create(move(custody)));
|
||||
description->set_rw_mode(options);
|
||||
description->set_file_flags(options);
|
||||
return description;
|
||||
|
|
|
@ -48,8 +48,8 @@ public:
|
|||
KResult remount(Custody& mount_point, int new_flags);
|
||||
KResult unmount(Inode& guest_inode);
|
||||
|
||||
KResultOr<NonnullRefPtr<FileDescription>> open(StringView path, int options, mode_t mode, Custody& base, Optional<UidAndGid> = {});
|
||||
KResultOr<NonnullRefPtr<FileDescription>> create(StringView path, int options, mode_t mode, Custody& parent_custody, Optional<UidAndGid> = {});
|
||||
KResultOr<NonnullRefPtr<OpenFileDescription>> open(StringView path, int options, mode_t mode, Custody& base, Optional<UidAndGid> = {});
|
||||
KResultOr<NonnullRefPtr<OpenFileDescription>> create(StringView path, int options, mode_t mode, Custody& parent_custody, Optional<UidAndGid> = {});
|
||||
KResult mkdir(StringView path, mode_t mode, Custody& base);
|
||||
KResult link(StringView old_path, StringView new_path, Custody& base);
|
||||
KResult unlink(StringView path, Custody& base);
|
||||
|
@ -77,7 +77,7 @@ public:
|
|||
KResultOr<NonnullRefPtr<Custody>> resolve_path_without_veil(StringView path, Custody& base, RefPtr<Custody>* out_parent = nullptr, int options = 0, int symlink_recursion_level = 0);
|
||||
|
||||
private:
|
||||
friend class FileDescription;
|
||||
friend class OpenFileDescription;
|
||||
|
||||
UnveilNode const& find_matching_unveiled_path(StringView path);
|
||||
KResult validate_path_against_process_veil(Custody const& path, int options);
|
||||
|
|
|
@ -24,7 +24,7 @@ class Device;
|
|||
class DiskCache;
|
||||
class DoubleBuffer;
|
||||
class File;
|
||||
class FileDescription;
|
||||
class OpenFileDescription;
|
||||
class FileSystem;
|
||||
class FutexQueue;
|
||||
class IPv4Socket;
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
#include <Kernel/Devices/HID/HIDManagement.h>
|
||||
#include <Kernel/FileSystem/Custody.h>
|
||||
#include <Kernel/FileSystem/FileBackedFileSystem.h>
|
||||
#include <Kernel/FileSystem/FileDescription.h>
|
||||
#include <Kernel/FileSystem/OpenFileDescription.h>
|
||||
#include <Kernel/Heap/kmalloc.h>
|
||||
#include <Kernel/Interrupts/GenericInterruptHandler.h>
|
||||
#include <Kernel/Interrupts/InterruptManagement.h>
|
||||
|
|
|
@ -25,7 +25,7 @@ NonnullRefPtr<FramebufferDevice> FramebufferDevice::create(const GraphicsDevice&
|
|||
return adopt_ref(*new FramebufferDevice(adapter, output_port_index, paddr, width, height, pitch));
|
||||
}
|
||||
|
||||
KResultOr<Memory::Region*> FramebufferDevice::mmap(Process& process, FileDescription&, Memory::VirtualRange const& range, u64 offset, int prot, bool shared)
|
||||
KResultOr<Memory::Region*> FramebufferDevice::mmap(Process& process, OpenFileDescription&, Memory::VirtualRange const& range, u64 offset, int prot, bool shared)
|
||||
{
|
||||
SpinlockLocker lock(m_activation_lock);
|
||||
REQUIRE_PROMISE(video);
|
||||
|
@ -123,7 +123,7 @@ size_t FramebufferDevice::framebuffer_size_in_bytes() const
|
|||
return m_framebuffer_pitch * m_framebuffer_height;
|
||||
}
|
||||
|
||||
KResult FramebufferDevice::ioctl(FileDescription&, unsigned request, Userspace<void*> arg)
|
||||
KResult FramebufferDevice::ioctl(OpenFileDescription&, unsigned request, Userspace<void*> arg)
|
||||
{
|
||||
REQUIRE_PROMISE(video);
|
||||
switch (request) {
|
||||
|
|
|
@ -22,8 +22,8 @@ class FramebufferDevice : public BlockDevice {
|
|||
public:
|
||||
static NonnullRefPtr<FramebufferDevice> create(const GraphicsDevice&, size_t, PhysicalAddress, size_t, size_t, size_t);
|
||||
|
||||
virtual KResult ioctl(FileDescription&, unsigned request, Userspace<void*> arg) override;
|
||||
virtual KResultOr<Memory::Region*> mmap(Process&, FileDescription&, Memory::VirtualRange const&, u64 offset, int prot, bool shared) override;
|
||||
virtual KResult ioctl(OpenFileDescription&, unsigned request, Userspace<void*> arg) override;
|
||||
virtual KResultOr<Memory::Region*> mmap(Process&, OpenFileDescription&, Memory::VirtualRange const&, u64 offset, int prot, bool shared) override;
|
||||
|
||||
// ^Device
|
||||
virtual mode_t required_mode() const override { return 0660; }
|
||||
|
@ -40,11 +40,11 @@ private:
|
|||
// ^File
|
||||
virtual StringView class_name() const override { return "FramebufferDevice"; }
|
||||
|
||||
virtual bool can_read(const FileDescription&, size_t) const override final { return true; }
|
||||
virtual bool can_write(const FileDescription&, size_t) const override final { return true; }
|
||||
virtual bool can_read(const OpenFileDescription&, size_t) const override final { return true; }
|
||||
virtual bool can_write(const OpenFileDescription&, size_t) const override final { return true; }
|
||||
virtual void start_request(AsyncBlockDeviceRequest& request) override final { request.complete(AsyncDeviceRequest::Failure); }
|
||||
virtual KResultOr<size_t> read(FileDescription&, u64, UserOrKernelBuffer&, size_t) override { return EINVAL; }
|
||||
virtual KResultOr<size_t> write(FileDescription&, u64, const UserOrKernelBuffer&, size_t) override { return EINVAL; }
|
||||
virtual KResultOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override { return EINVAL; }
|
||||
virtual KResultOr<size_t> write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t) override { return EINVAL; }
|
||||
|
||||
FramebufferDevice(const GraphicsDevice&, size_t, PhysicalAddress, size_t, size_t, size_t);
|
||||
|
||||
|
|
|
@ -148,7 +148,7 @@ void FrameBufferDevice::set_buffer(int buffer_index)
|
|||
buffer.dirty_rect = {};
|
||||
}
|
||||
|
||||
KResult FrameBufferDevice::ioctl(FileDescription&, unsigned request, Userspace<void*> arg)
|
||||
KResult FrameBufferDevice::ioctl(OpenFileDescription&, unsigned request, Userspace<void*> arg)
|
||||
{
|
||||
REQUIRE_PROMISE(video);
|
||||
switch (request) {
|
||||
|
@ -237,7 +237,7 @@ KResult FrameBufferDevice::ioctl(FileDescription&, unsigned request, Userspace<v
|
|||
};
|
||||
}
|
||||
|
||||
KResultOr<Memory::Region*> FrameBufferDevice::mmap(Process& process, FileDescription&, Memory::VirtualRange const& range, u64 offset, int prot, bool shared)
|
||||
KResultOr<Memory::Region*> FrameBufferDevice::mmap(Process& process, OpenFileDescription&, Memory::VirtualRange const& range, u64 offset, int prot, bool shared)
|
||||
{
|
||||
REQUIRE_PROMISE(video);
|
||||
if (!shared)
|
||||
|
|
|
@ -60,12 +60,12 @@ private:
|
|||
void create_buffer(Buffer&, size_t, size_t);
|
||||
void set_buffer(int);
|
||||
|
||||
virtual KResult ioctl(FileDescription&, unsigned request, Userspace<void*> arg) override;
|
||||
virtual KResultOr<Memory::Region*> mmap(Process&, FileDescription&, Memory::VirtualRange const&, u64 offset, int prot, bool shared) override;
|
||||
virtual bool can_read(const FileDescription&, size_t) const override { return true; }
|
||||
virtual KResultOr<size_t> read(FileDescription&, u64, UserOrKernelBuffer&, size_t) override { return EINVAL; }
|
||||
virtual bool can_write(const FileDescription&, size_t) const override { return true; }
|
||||
virtual KResultOr<size_t> write(FileDescription&, u64, const UserOrKernelBuffer&, size_t) override { return EINVAL; };
|
||||
virtual KResult ioctl(OpenFileDescription&, unsigned request, Userspace<void*> arg) override;
|
||||
virtual KResultOr<Memory::Region*> mmap(Process&, OpenFileDescription&, Memory::VirtualRange const&, u64 offset, int prot, bool shared) override;
|
||||
virtual bool can_read(const OpenFileDescription&, size_t) const override { return true; }
|
||||
virtual KResultOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override { return EINVAL; }
|
||||
virtual bool can_write(const OpenFileDescription&, size_t) const override { return true; }
|
||||
virtual KResultOr<size_t> write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t) override { return EINVAL; };
|
||||
virtual void start_request(AsyncBlockDeviceRequest& request) override { request.complete(AsyncDeviceRequest::Failure); }
|
||||
|
||||
virtual mode_t required_mode() const override { return 0666; }
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
#include <AK/TemporaryChange.h>
|
||||
#include <Kernel/Arch/x86/SmapDisabler.h>
|
||||
#include <Kernel/FileSystem/FileDescription.h>
|
||||
#include <Kernel/FileSystem/OpenFileDescription.h>
|
||||
#include <Kernel/KSyms.h>
|
||||
#include <Kernel/Process.h>
|
||||
#include <Kernel/Scheduler.h>
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
#include <AK/Singleton.h>
|
||||
#include <AK/StringBuilder.h>
|
||||
#include <Kernel/Debug.h>
|
||||
#include <Kernel/FileSystem/FileDescription.h>
|
||||
#include <Kernel/FileSystem/OpenFileDescription.h>
|
||||
#include <Kernel/Net/ARP.h>
|
||||
#include <Kernel/Net/ICMP.h>
|
||||
#include <Kernel/Net/IPv4.h>
|
||||
|
@ -28,7 +28,7 @@ namespace Kernel {
|
|||
|
||||
static Singleton<MutexProtected<IPv4Socket::List>> s_all_sockets;
|
||||
|
||||
using BlockFlags = Thread::FileDescriptionBlocker::BlockFlags;
|
||||
using BlockFlags = Thread::OpenFileDescriptionBlocker::BlockFlags;
|
||||
|
||||
MutexProtected<IPv4Socket::List>& IPv4Socket::all_sockets()
|
||||
{
|
||||
|
@ -141,7 +141,7 @@ KResult IPv4Socket::listen(size_t backlog)
|
|||
return protocol_listen(result.did_allocate);
|
||||
}
|
||||
|
||||
KResult IPv4Socket::connect(FileDescription& description, Userspace<const sockaddr*> address, socklen_t address_size, ShouldBlock should_block)
|
||||
KResult IPv4Socket::connect(OpenFileDescription& description, Userspace<const sockaddr*> address, socklen_t address_size, ShouldBlock should_block)
|
||||
{
|
||||
if (address_size != sizeof(sockaddr_in))
|
||||
return set_so_error(EINVAL);
|
||||
|
@ -166,7 +166,7 @@ KResult IPv4Socket::connect(FileDescription& description, Userspace<const sockad
|
|||
return protocol_connect(description, should_block);
|
||||
}
|
||||
|
||||
bool IPv4Socket::can_read(const FileDescription&, size_t) const
|
||||
bool IPv4Socket::can_read(const OpenFileDescription&, size_t) const
|
||||
{
|
||||
if (m_role == Role::Listener)
|
||||
return can_accept();
|
||||
|
@ -175,7 +175,7 @@ bool IPv4Socket::can_read(const FileDescription&, size_t) const
|
|||
return m_can_read;
|
||||
}
|
||||
|
||||
bool IPv4Socket::can_write(const FileDescription&, size_t) const
|
||||
bool IPv4Socket::can_write(const OpenFileDescription&, size_t) const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
@ -192,7 +192,7 @@ PortAllocationResult IPv4Socket::allocate_local_port_if_needed()
|
|||
return { m_local_port, true };
|
||||
}
|
||||
|
||||
KResultOr<size_t> IPv4Socket::sendto(FileDescription&, const UserOrKernelBuffer& data, size_t data_length, [[maybe_unused]] int flags, Userspace<const sockaddr*> addr, socklen_t addr_length)
|
||||
KResultOr<size_t> IPv4Socket::sendto(OpenFileDescription&, const UserOrKernelBuffer& data, size_t data_length, [[maybe_unused]] int flags, Userspace<const sockaddr*> addr, socklen_t addr_length)
|
||||
{
|
||||
MutexLocker locker(mutex());
|
||||
|
||||
|
@ -251,7 +251,7 @@ KResultOr<size_t> IPv4Socket::sendto(FileDescription&, const UserOrKernelBuffer&
|
|||
return nsent_or_error;
|
||||
}
|
||||
|
||||
KResultOr<size_t> IPv4Socket::receive_byte_buffered(FileDescription& description, UserOrKernelBuffer& buffer, size_t buffer_length, int flags, Userspace<sockaddr*>, Userspace<socklen_t*>)
|
||||
KResultOr<size_t> IPv4Socket::receive_byte_buffered(OpenFileDescription& description, UserOrKernelBuffer& buffer, size_t buffer_length, int flags, Userspace<sockaddr*>, Userspace<socklen_t*>)
|
||||
{
|
||||
MutexLocker locker(mutex());
|
||||
if (m_receive_buffer->is_empty()) {
|
||||
|
@ -287,7 +287,7 @@ KResultOr<size_t> IPv4Socket::receive_byte_buffered(FileDescription& description
|
|||
return nreceived_or_error;
|
||||
}
|
||||
|
||||
KResultOr<size_t> IPv4Socket::receive_packet_buffered(FileDescription& description, UserOrKernelBuffer& buffer, size_t buffer_length, int flags, Userspace<sockaddr*> addr, Userspace<socklen_t*> addr_length, Time& packet_timestamp)
|
||||
KResultOr<size_t> IPv4Socket::receive_packet_buffered(OpenFileDescription& description, UserOrKernelBuffer& buffer, size_t buffer_length, int flags, Userspace<sockaddr*> addr, Userspace<socklen_t*> addr_length, Time& packet_timestamp)
|
||||
{
|
||||
MutexLocker locker(mutex());
|
||||
ReceivedPacket packet;
|
||||
|
@ -379,7 +379,7 @@ KResultOr<size_t> IPv4Socket::receive_packet_buffered(FileDescription& descripti
|
|||
return protocol_receive(ReadonlyBytes { packet.data.value().data(), packet.data.value().size() }, buffer, buffer_length, flags);
|
||||
}
|
||||
|
||||
KResultOr<size_t> IPv4Socket::recvfrom(FileDescription& description, UserOrKernelBuffer& buffer, size_t buffer_length, int flags, Userspace<sockaddr*> user_addr, Userspace<socklen_t*> user_addr_length, Time& packet_timestamp)
|
||||
KResultOr<size_t> IPv4Socket::recvfrom(OpenFileDescription& description, UserOrKernelBuffer& buffer, size_t buffer_length, int flags, Userspace<sockaddr*> user_addr, Userspace<socklen_t*> user_addr_length, Time& packet_timestamp)
|
||||
{
|
||||
if (user_addr_length) {
|
||||
socklen_t addr_length;
|
||||
|
@ -450,7 +450,7 @@ bool IPv4Socket::did_receive(const IPv4Address& source_address, u16 source_port,
|
|||
return true;
|
||||
}
|
||||
|
||||
String IPv4Socket::absolute_path(const FileDescription&) const
|
||||
String IPv4Socket::absolute_path(const OpenFileDescription&) const
|
||||
{
|
||||
if (m_role == Role::None)
|
||||
return "socket";
|
||||
|
@ -536,7 +536,7 @@ KResult IPv4Socket::setsockopt(int level, int option, Userspace<const void*> use
|
|||
}
|
||||
}
|
||||
|
||||
KResult IPv4Socket::getsockopt(FileDescription& description, int level, int option, Userspace<void*> value, Userspace<socklen_t*> value_size)
|
||||
KResult IPv4Socket::getsockopt(OpenFileDescription& description, int level, int option, Userspace<void*> value, Userspace<socklen_t*> value_size)
|
||||
{
|
||||
if (level != IPPROTO_IP)
|
||||
return Socket::getsockopt(description, level, option, value, value_size);
|
||||
|
@ -563,7 +563,7 @@ KResult IPv4Socket::getsockopt(FileDescription& description, int level, int opti
|
|||
}
|
||||
}
|
||||
|
||||
KResult IPv4Socket::ioctl(FileDescription&, unsigned request, Userspace<void*> arg)
|
||||
KResult IPv4Socket::ioctl(OpenFileDescription&, unsigned request, Userspace<void*> arg)
|
||||
{
|
||||
REQUIRE_PROMISE(inet);
|
||||
|
||||
|
|
|
@ -33,18 +33,18 @@ public:
|
|||
|
||||
virtual KResult close() override;
|
||||
virtual KResult bind(Userspace<const sockaddr*>, socklen_t) override;
|
||||
virtual KResult connect(FileDescription&, Userspace<const sockaddr*>, socklen_t, ShouldBlock = ShouldBlock::Yes) override;
|
||||
virtual KResult connect(OpenFileDescription&, Userspace<const sockaddr*>, socklen_t, ShouldBlock = ShouldBlock::Yes) override;
|
||||
virtual KResult listen(size_t) override;
|
||||
virtual void get_local_address(sockaddr*, socklen_t*) override;
|
||||
virtual void get_peer_address(sockaddr*, socklen_t*) override;
|
||||
virtual bool can_read(const FileDescription&, size_t) const override;
|
||||
virtual bool can_write(const FileDescription&, size_t) const override;
|
||||
virtual KResultOr<size_t> sendto(FileDescription&, const UserOrKernelBuffer&, size_t, int, Userspace<const sockaddr*>, socklen_t) override;
|
||||
virtual KResultOr<size_t> recvfrom(FileDescription&, UserOrKernelBuffer&, size_t, int flags, Userspace<sockaddr*>, Userspace<socklen_t*>, Time&) override;
|
||||
virtual bool can_read(const OpenFileDescription&, size_t) const override;
|
||||
virtual bool can_write(const OpenFileDescription&, size_t) const override;
|
||||
virtual KResultOr<size_t> sendto(OpenFileDescription&, const UserOrKernelBuffer&, size_t, int, Userspace<const sockaddr*>, socklen_t) override;
|
||||
virtual KResultOr<size_t> recvfrom(OpenFileDescription&, UserOrKernelBuffer&, size_t, int flags, Userspace<sockaddr*>, Userspace<socklen_t*>, Time&) override;
|
||||
virtual KResult setsockopt(int level, int option, Userspace<const void*>, socklen_t) override;
|
||||
virtual KResult getsockopt(FileDescription&, int level, int option, Userspace<void*>, Userspace<socklen_t*>) override;
|
||||
virtual KResult getsockopt(OpenFileDescription&, int level, int option, Userspace<void*>, Userspace<socklen_t*>) override;
|
||||
|
||||
virtual KResult ioctl(FileDescription&, unsigned request, Userspace<void*> arg) override;
|
||||
virtual KResult ioctl(OpenFileDescription&, unsigned request, Userspace<void*> arg) override;
|
||||
|
||||
bool did_receive(const IPv4Address& peer_address, u16 peer_port, ReadonlyBytes, const Time&);
|
||||
|
||||
|
@ -61,7 +61,7 @@ public:
|
|||
|
||||
IPv4SocketTuple tuple() const { return IPv4SocketTuple(m_local_address, m_local_port, m_peer_address, m_peer_port); }
|
||||
|
||||
String absolute_path(const FileDescription& description) const override;
|
||||
String absolute_path(const OpenFileDescription& description) const override;
|
||||
|
||||
u8 ttl() const { return m_ttl; }
|
||||
|
||||
|
@ -81,7 +81,7 @@ protected:
|
|||
virtual KResult protocol_listen([[maybe_unused]] bool did_allocate_port) { return KSuccess; }
|
||||
virtual KResultOr<size_t> protocol_receive(ReadonlyBytes /* raw_ipv4_packet */, UserOrKernelBuffer&, size_t, int) { return ENOTIMPL; }
|
||||
virtual KResultOr<size_t> protocol_send(const UserOrKernelBuffer&, size_t) { return ENOTIMPL; }
|
||||
virtual KResult protocol_connect(FileDescription&, ShouldBlock) { return KSuccess; }
|
||||
virtual KResult protocol_connect(OpenFileDescription&, ShouldBlock) { return KSuccess; }
|
||||
virtual KResultOr<u16> protocol_allocate_local_port() { return ENOPROTOOPT; }
|
||||
virtual bool protocol_is_disconnected() const { return false; }
|
||||
|
||||
|
@ -95,8 +95,8 @@ protected:
|
|||
private:
|
||||
virtual bool is_ipv4() const override { return true; }
|
||||
|
||||
KResultOr<size_t> receive_byte_buffered(FileDescription&, UserOrKernelBuffer& buffer, size_t buffer_length, int flags, Userspace<sockaddr*>, Userspace<socklen_t*>);
|
||||
KResultOr<size_t> receive_packet_buffered(FileDescription&, UserOrKernelBuffer& buffer, size_t buffer_length, int flags, Userspace<sockaddr*>, Userspace<socklen_t*>, Time&);
|
||||
KResultOr<size_t> receive_byte_buffered(OpenFileDescription&, UserOrKernelBuffer& buffer, size_t buffer_length, int flags, Userspace<sockaddr*>, Userspace<socklen_t*>);
|
||||
KResultOr<size_t> receive_packet_buffered(OpenFileDescription&, UserOrKernelBuffer& buffer, size_t buffer_length, int flags, Userspace<sockaddr*>, Userspace<socklen_t*>, Time&);
|
||||
|
||||
void set_can_read(bool);
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
#include <AK/Singleton.h>
|
||||
#include <AK/StringBuilder.h>
|
||||
#include <Kernel/Debug.h>
|
||||
#include <Kernel/FileSystem/FileDescription.h>
|
||||
#include <Kernel/FileSystem/OpenFileDescription.h>
|
||||
#include <Kernel/FileSystem/VirtualFileSystem.h>
|
||||
#include <Kernel/Locking/Mutex.h>
|
||||
#include <Kernel/Locking/MutexProtected.h>
|
||||
|
@ -51,7 +51,7 @@ KResultOr<NonnullRefPtr<LocalSocket>> LocalSocket::try_create(int type)
|
|||
KResultOr<SocketPair> LocalSocket::try_create_connected_pair(int type)
|
||||
{
|
||||
auto socket = TRY(LocalSocket::try_create(type));
|
||||
auto description1 = TRY(FileDescription::try_create(*socket));
|
||||
auto description1 = TRY(OpenFileDescription::try_create(*socket));
|
||||
|
||||
TRY(socket->try_set_path("[socketpair]"sv));
|
||||
|
||||
|
@ -60,7 +60,7 @@ KResultOr<SocketPair> LocalSocket::try_create_connected_pair(int type)
|
|||
socket->set_connect_side_role(Role::Connected);
|
||||
socket->set_role(Role::Accepted);
|
||||
|
||||
auto description2 = TRY(FileDescription::try_create(*socket));
|
||||
auto description2 = TRY(OpenFileDescription::try_create(*socket));
|
||||
|
||||
return SocketPair { move(description1), move(description2) };
|
||||
}
|
||||
|
@ -155,7 +155,7 @@ KResult LocalSocket::bind(Userspace<const sockaddr*> user_address, socklen_t add
|
|||
return KSuccess;
|
||||
}
|
||||
|
||||
KResult LocalSocket::connect(FileDescription& description, Userspace<const sockaddr*> address, socklen_t address_size, ShouldBlock)
|
||||
KResult LocalSocket::connect(OpenFileDescription& description, Userspace<const sockaddr*> address, socklen_t address_size, ShouldBlock)
|
||||
{
|
||||
VERIFY(!m_bound);
|
||||
if (address_size != sizeof(sockaddr_un))
|
||||
|
@ -212,7 +212,7 @@ KResult LocalSocket::connect(FileDescription& description, Userspace<const socka
|
|||
return KSuccess;
|
||||
}
|
||||
|
||||
auto unblock_flags = Thread::FileDescriptionBlocker::BlockFlags::None;
|
||||
auto unblock_flags = Thread::OpenFileDescriptionBlocker::BlockFlags::None;
|
||||
if (Thread::current()->block<Thread::ConnectBlocker>({}, description, unblock_flags).was_interrupted()) {
|
||||
set_connect_side_role(Role::None);
|
||||
return set_so_error(EINTR);
|
||||
|
@ -220,7 +220,7 @@ KResult LocalSocket::connect(FileDescription& description, Userspace<const socka
|
|||
|
||||
dbgln_if(LOCAL_SOCKET_DEBUG, "LocalSocket({}) connect({}) status is {}", this, *m_path, to_string(setup_state()));
|
||||
|
||||
if (!has_flag(unblock_flags, Thread::FileDescriptionBlocker::BlockFlags::Connect)) {
|
||||
if (!has_flag(unblock_flags, Thread::OpenFileDescriptionBlocker::BlockFlags::Connect)) {
|
||||
set_connect_side_role(Role::None);
|
||||
return set_so_error(ECONNREFUSED);
|
||||
}
|
||||
|
@ -243,7 +243,7 @@ KResult LocalSocket::listen(size_t backlog)
|
|||
return KSuccess;
|
||||
}
|
||||
|
||||
KResult LocalSocket::attach(FileDescription& description)
|
||||
KResult LocalSocket::attach(OpenFileDescription& description)
|
||||
{
|
||||
VERIFY(!m_accept_side_fd_open);
|
||||
if (m_connect_side_role == Role::None) {
|
||||
|
@ -258,7 +258,7 @@ KResult LocalSocket::attach(FileDescription& description)
|
|||
return KSuccess;
|
||||
}
|
||||
|
||||
void LocalSocket::detach(FileDescription& description)
|
||||
void LocalSocket::detach(OpenFileDescription& description)
|
||||
{
|
||||
if (m_connect_side_fd == &description) {
|
||||
m_connect_side_fd = nullptr;
|
||||
|
@ -270,7 +270,7 @@ void LocalSocket::detach(FileDescription& description)
|
|||
evaluate_block_conditions();
|
||||
}
|
||||
|
||||
bool LocalSocket::can_read(const FileDescription& description, size_t) const
|
||||
bool LocalSocket::can_read(const OpenFileDescription& description, size_t) const
|
||||
{
|
||||
auto role = this->role(description);
|
||||
if (role == Role::Listener)
|
||||
|
@ -282,7 +282,7 @@ bool LocalSocket::can_read(const FileDescription& description, size_t) const
|
|||
return false;
|
||||
}
|
||||
|
||||
bool LocalSocket::has_attached_peer(const FileDescription& description) const
|
||||
bool LocalSocket::has_attached_peer(const OpenFileDescription& description) const
|
||||
{
|
||||
auto role = this->role(description);
|
||||
if (role == Role::Accepted)
|
||||
|
@ -292,7 +292,7 @@ bool LocalSocket::has_attached_peer(const FileDescription& description) const
|
|||
return false;
|
||||
}
|
||||
|
||||
bool LocalSocket::can_write(const FileDescription& description, size_t) const
|
||||
bool LocalSocket::can_write(const OpenFileDescription& description, size_t) const
|
||||
{
|
||||
auto role = this->role(description);
|
||||
if (role == Role::Accepted)
|
||||
|
@ -302,7 +302,7 @@ bool LocalSocket::can_write(const FileDescription& description, size_t) const
|
|||
return false;
|
||||
}
|
||||
|
||||
KResultOr<size_t> LocalSocket::sendto(FileDescription& description, const UserOrKernelBuffer& data, size_t data_size, int, Userspace<const sockaddr*>, socklen_t)
|
||||
KResultOr<size_t> LocalSocket::sendto(OpenFileDescription& description, const UserOrKernelBuffer& data, size_t data_size, int, Userspace<const sockaddr*>, socklen_t)
|
||||
{
|
||||
if (!has_attached_peer(description))
|
||||
return set_so_error(EPIPE);
|
||||
|
@ -315,7 +315,7 @@ KResultOr<size_t> LocalSocket::sendto(FileDescription& description, const UserOr
|
|||
return nwritten_or_error;
|
||||
}
|
||||
|
||||
DoubleBuffer* LocalSocket::receive_buffer_for(FileDescription& description)
|
||||
DoubleBuffer* LocalSocket::receive_buffer_for(OpenFileDescription& description)
|
||||
{
|
||||
auto role = this->role(description);
|
||||
if (role == Role::Accepted)
|
||||
|
@ -325,7 +325,7 @@ DoubleBuffer* LocalSocket::receive_buffer_for(FileDescription& description)
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
DoubleBuffer* LocalSocket::send_buffer_for(FileDescription& description)
|
||||
DoubleBuffer* LocalSocket::send_buffer_for(OpenFileDescription& description)
|
||||
{
|
||||
auto role = this->role(description);
|
||||
if (role == Role::Connected)
|
||||
|
@ -335,7 +335,7 @@ DoubleBuffer* LocalSocket::send_buffer_for(FileDescription& description)
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
KResultOr<size_t> LocalSocket::recvfrom(FileDescription& description, UserOrKernelBuffer& buffer, size_t buffer_size, int, Userspace<sockaddr*>, Userspace<socklen_t*>, Time&)
|
||||
KResultOr<size_t> LocalSocket::recvfrom(OpenFileDescription& description, UserOrKernelBuffer& buffer, size_t buffer_size, int, Userspace<sockaddr*>, Userspace<socklen_t*>, Time&)
|
||||
{
|
||||
auto* socket_buffer = receive_buffer_for(description);
|
||||
if (!socket_buffer)
|
||||
|
@ -347,7 +347,7 @@ KResultOr<size_t> LocalSocket::recvfrom(FileDescription& description, UserOrKern
|
|||
return set_so_error(EAGAIN);
|
||||
}
|
||||
} else if (!can_read(description, 0)) {
|
||||
auto unblock_flags = Thread::FileDescriptionBlocker::BlockFlags::None;
|
||||
auto unblock_flags = Thread::OpenFileDescriptionBlocker::BlockFlags::None;
|
||||
if (Thread::current()->block<Thread::ReadBlocker>({}, description, unblock_flags).was_interrupted())
|
||||
return set_so_error(EINTR);
|
||||
}
|
||||
|
@ -367,7 +367,7 @@ StringView LocalSocket::socket_path() const
|
|||
return m_path->view();
|
||||
}
|
||||
|
||||
String LocalSocket::absolute_path(const FileDescription& description) const
|
||||
String LocalSocket::absolute_path(const OpenFileDescription& description) const
|
||||
{
|
||||
StringBuilder builder;
|
||||
builder.append("socket:");
|
||||
|
@ -393,7 +393,7 @@ String LocalSocket::absolute_path(const FileDescription& description) const
|
|||
return builder.to_string();
|
||||
}
|
||||
|
||||
KResult LocalSocket::getsockopt(FileDescription& description, int level, int option, Userspace<void*> value, Userspace<socklen_t*> value_size)
|
||||
KResult LocalSocket::getsockopt(OpenFileDescription& description, int level, int option, Userspace<void*> value, Userspace<socklen_t*> value_size)
|
||||
{
|
||||
if (level != SOL_SOCKET)
|
||||
return Socket::getsockopt(description, level, option, value, value_size);
|
||||
|
@ -432,7 +432,7 @@ KResult LocalSocket::getsockopt(FileDescription& description, int level, int opt
|
|||
}
|
||||
}
|
||||
|
||||
KResult LocalSocket::ioctl(FileDescription& description, unsigned request, Userspace<void*> arg)
|
||||
KResult LocalSocket::ioctl(OpenFileDescription& description, unsigned request, Userspace<void*> arg)
|
||||
{
|
||||
switch (request) {
|
||||
case FIONREAD: {
|
||||
|
@ -444,7 +444,7 @@ KResult LocalSocket::ioctl(FileDescription& description, unsigned request, Users
|
|||
return ENOTTY;
|
||||
}
|
||||
|
||||
KResult LocalSocket::chmod(FileDescription&, mode_t mode)
|
||||
KResult LocalSocket::chmod(OpenFileDescription&, mode_t mode)
|
||||
{
|
||||
if (m_file)
|
||||
return m_file->chmod(mode);
|
||||
|
@ -453,7 +453,7 @@ KResult LocalSocket::chmod(FileDescription&, mode_t mode)
|
|||
return KSuccess;
|
||||
}
|
||||
|
||||
KResult LocalSocket::chown(FileDescription&, UserID uid, GroupID gid)
|
||||
KResult LocalSocket::chown(OpenFileDescription&, UserID uid, GroupID gid)
|
||||
{
|
||||
if (m_file)
|
||||
return m_file->chown(uid, gid);
|
||||
|
@ -467,7 +467,7 @@ KResult LocalSocket::chown(FileDescription&, UserID uid, GroupID gid)
|
|||
return KSuccess;
|
||||
}
|
||||
|
||||
NonnullRefPtrVector<FileDescription>& LocalSocket::recvfd_queue_for(const FileDescription& description)
|
||||
NonnullRefPtrVector<OpenFileDescription>& LocalSocket::recvfd_queue_for(const OpenFileDescription& description)
|
||||
{
|
||||
auto role = this->role(description);
|
||||
if (role == Role::Connected)
|
||||
|
@ -477,7 +477,7 @@ NonnullRefPtrVector<FileDescription>& LocalSocket::recvfd_queue_for(const FileDe
|
|||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
NonnullRefPtrVector<FileDescription>& LocalSocket::sendfd_queue_for(const FileDescription& description)
|
||||
NonnullRefPtrVector<OpenFileDescription>& LocalSocket::sendfd_queue_for(const OpenFileDescription& description)
|
||||
{
|
||||
auto role = this->role(description);
|
||||
if (role == Role::Connected)
|
||||
|
@ -487,7 +487,7 @@ NonnullRefPtrVector<FileDescription>& LocalSocket::sendfd_queue_for(const FileDe
|
|||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
KResult LocalSocket::sendfd(const FileDescription& socket_description, FileDescription& passing_description)
|
||||
KResult LocalSocket::sendfd(const OpenFileDescription& socket_description, OpenFileDescription& passing_description)
|
||||
{
|
||||
MutexLocker locker(mutex());
|
||||
auto role = this->role(socket_description);
|
||||
|
@ -502,7 +502,7 @@ KResult LocalSocket::sendfd(const FileDescription& socket_description, FileDescr
|
|||
return KSuccess;
|
||||
}
|
||||
|
||||
KResultOr<NonnullRefPtr<FileDescription>> LocalSocket::recvfd(const FileDescription& socket_description)
|
||||
KResultOr<NonnullRefPtr<OpenFileDescription>> LocalSocket::recvfd(const OpenFileDescription& socket_description)
|
||||
{
|
||||
MutexLocker locker(mutex());
|
||||
auto role = this->role(socket_description);
|
||||
|
|
|
@ -12,11 +12,11 @@
|
|||
|
||||
namespace Kernel {
|
||||
|
||||
class FileDescription;
|
||||
class OpenFileDescription;
|
||||
|
||||
struct SocketPair {
|
||||
NonnullRefPtr<FileDescription> description0;
|
||||
NonnullRefPtr<FileDescription> description1;
|
||||
NonnullRefPtr<OpenFileDescription> description0;
|
||||
NonnullRefPtr<OpenFileDescription> description1;
|
||||
};
|
||||
|
||||
class LocalSocket final : public Socket {
|
||||
|
@ -26,40 +26,40 @@ public:
|
|||
static KResultOr<SocketPair> try_create_connected_pair(int type);
|
||||
virtual ~LocalSocket() override;
|
||||
|
||||
KResult sendfd(const FileDescription& socket_description, FileDescription& passing_description);
|
||||
KResultOr<NonnullRefPtr<FileDescription>> recvfd(const FileDescription& socket_description);
|
||||
KResult sendfd(const OpenFileDescription& socket_description, OpenFileDescription& passing_description);
|
||||
KResultOr<NonnullRefPtr<OpenFileDescription>> recvfd(const OpenFileDescription& socket_description);
|
||||
|
||||
static void for_each(Function<void(const LocalSocket&)>);
|
||||
|
||||
StringView socket_path() const;
|
||||
String absolute_path(const FileDescription& description) const override;
|
||||
String absolute_path(const OpenFileDescription& description) const override;
|
||||
|
||||
// ^Socket
|
||||
virtual KResult bind(Userspace<const sockaddr*>, socklen_t) override;
|
||||
virtual KResult connect(FileDescription&, Userspace<const sockaddr*>, socklen_t, ShouldBlock = ShouldBlock::Yes) override;
|
||||
virtual KResult connect(OpenFileDescription&, Userspace<const sockaddr*>, socklen_t, ShouldBlock = ShouldBlock::Yes) override;
|
||||
virtual KResult listen(size_t) override;
|
||||
virtual void get_local_address(sockaddr*, socklen_t*) override;
|
||||
virtual void get_peer_address(sockaddr*, socklen_t*) override;
|
||||
virtual KResult attach(FileDescription&) override;
|
||||
virtual void detach(FileDescription&) override;
|
||||
virtual bool can_read(const FileDescription&, size_t) const override;
|
||||
virtual bool can_write(const FileDescription&, size_t) const override;
|
||||
virtual KResultOr<size_t> sendto(FileDescription&, const UserOrKernelBuffer&, size_t, int, Userspace<const sockaddr*>, socklen_t) override;
|
||||
virtual KResultOr<size_t> recvfrom(FileDescription&, UserOrKernelBuffer&, size_t, int flags, Userspace<sockaddr*>, Userspace<socklen_t*>, Time&) override;
|
||||
virtual KResult getsockopt(FileDescription&, int level, int option, Userspace<void*>, Userspace<socklen_t*>) override;
|
||||
virtual KResult ioctl(FileDescription&, unsigned request, Userspace<void*> arg) override;
|
||||
virtual KResult chown(FileDescription&, UserID, GroupID) override;
|
||||
virtual KResult chmod(FileDescription&, mode_t) override;
|
||||
virtual KResult attach(OpenFileDescription&) override;
|
||||
virtual void detach(OpenFileDescription&) override;
|
||||
virtual bool can_read(const OpenFileDescription&, size_t) const override;
|
||||
virtual bool can_write(const OpenFileDescription&, size_t) const override;
|
||||
virtual KResultOr<size_t> sendto(OpenFileDescription&, const UserOrKernelBuffer&, size_t, int, Userspace<const sockaddr*>, socklen_t) override;
|
||||
virtual KResultOr<size_t> recvfrom(OpenFileDescription&, UserOrKernelBuffer&, size_t, int flags, Userspace<sockaddr*>, Userspace<socklen_t*>, Time&) override;
|
||||
virtual KResult getsockopt(OpenFileDescription&, int level, int option, Userspace<void*>, Userspace<socklen_t*>) override;
|
||||
virtual KResult ioctl(OpenFileDescription&, unsigned request, Userspace<void*> arg) override;
|
||||
virtual KResult chown(OpenFileDescription&, UserID, GroupID) override;
|
||||
virtual KResult chmod(OpenFileDescription&, mode_t) override;
|
||||
|
||||
private:
|
||||
explicit LocalSocket(int type, NonnullOwnPtr<DoubleBuffer> client_buffer, NonnullOwnPtr<DoubleBuffer> server_buffer);
|
||||
virtual StringView class_name() const override { return "LocalSocket"; }
|
||||
virtual bool is_local() const override { return true; }
|
||||
bool has_attached_peer(const FileDescription&) const;
|
||||
DoubleBuffer* receive_buffer_for(FileDescription&);
|
||||
DoubleBuffer* send_buffer_for(FileDescription&);
|
||||
NonnullRefPtrVector<FileDescription>& sendfd_queue_for(const FileDescription&);
|
||||
NonnullRefPtrVector<FileDescription>& recvfd_queue_for(const FileDescription&);
|
||||
bool has_attached_peer(const OpenFileDescription&) const;
|
||||
DoubleBuffer* receive_buffer_for(OpenFileDescription&);
|
||||
DoubleBuffer* send_buffer_for(OpenFileDescription&);
|
||||
NonnullRefPtrVector<OpenFileDescription>& sendfd_queue_for(const OpenFileDescription&);
|
||||
NonnullRefPtrVector<OpenFileDescription>& recvfd_queue_for(const OpenFileDescription&);
|
||||
|
||||
void set_connect_side_role(Role connect_side_role, bool force_evaluate_block_conditions = false)
|
||||
{
|
||||
|
@ -72,7 +72,7 @@ private:
|
|||
KResult try_set_path(StringView);
|
||||
|
||||
// An open socket file on the filesystem.
|
||||
RefPtr<FileDescription> m_file;
|
||||
RefPtr<OpenFileDescription> m_file;
|
||||
|
||||
UserID m_prebind_uid { 0 };
|
||||
GroupID m_prebind_gid { 0 };
|
||||
|
@ -83,9 +83,9 @@ private:
|
|||
// an additional role for the connect side and differentiate
|
||||
// between them.
|
||||
Role m_connect_side_role { Role::None };
|
||||
FileDescription* m_connect_side_fd { nullptr };
|
||||
OpenFileDescription* m_connect_side_fd { nullptr };
|
||||
|
||||
virtual Role role(const FileDescription& description) const override
|
||||
virtual Role role(const OpenFileDescription& description) const override
|
||||
{
|
||||
if (m_connect_side_fd == &description)
|
||||
return m_connect_side_role;
|
||||
|
@ -99,8 +99,8 @@ private:
|
|||
NonnullOwnPtr<DoubleBuffer> m_for_client;
|
||||
NonnullOwnPtr<DoubleBuffer> m_for_server;
|
||||
|
||||
NonnullRefPtrVector<FileDescription> m_fds_for_client;
|
||||
NonnullRefPtrVector<FileDescription> m_fds_for_server;
|
||||
NonnullRefPtrVector<OpenFileDescription> m_fds_for_client;
|
||||
NonnullRefPtrVector<OpenFileDescription> m_fds_for_server;
|
||||
|
||||
IntrusiveListNode<LocalSocket> m_list_node;
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
#include <AK/StringView.h>
|
||||
#include <Kernel/Debug.h>
|
||||
#include <Kernel/FileSystem/FileDescription.h>
|
||||
#include <Kernel/FileSystem/OpenFileDescription.h>
|
||||
#include <Kernel/Net/IPv4Socket.h>
|
||||
#include <Kernel/Net/LocalSocket.h>
|
||||
#include <Kernel/Net/NetworkingManagement.h>
|
||||
|
@ -133,7 +133,7 @@ KResult Socket::setsockopt(int level, int option, Userspace<const void*> user_va
|
|||
}
|
||||
}
|
||||
|
||||
KResult Socket::getsockopt(FileDescription&, int level, int option, Userspace<void*> value, Userspace<socklen_t*> value_size)
|
||||
KResult Socket::getsockopt(OpenFileDescription&, int level, int option, Userspace<void*> value, Userspace<socklen_t*> value_size)
|
||||
{
|
||||
socklen_t size;
|
||||
TRY(copy_from_user(&size, value_size.unsafe_userspace_ptr()));
|
||||
|
@ -199,7 +199,7 @@ KResult Socket::getsockopt(FileDescription&, int level, int option, Userspace<vo
|
|||
}
|
||||
}
|
||||
|
||||
KResultOr<size_t> Socket::read(FileDescription& description, u64, UserOrKernelBuffer& buffer, size_t size)
|
||||
KResultOr<size_t> Socket::read(OpenFileDescription& description, u64, UserOrKernelBuffer& buffer, size_t size)
|
||||
{
|
||||
if (is_shut_down_for_reading())
|
||||
return 0;
|
||||
|
@ -207,7 +207,7 @@ KResultOr<size_t> Socket::read(FileDescription& description, u64, UserOrKernelBu
|
|||
return recvfrom(description, buffer, size, 0, {}, 0, t);
|
||||
}
|
||||
|
||||
KResultOr<size_t> Socket::write(FileDescription& description, u64, const UserOrKernelBuffer& data, size_t size)
|
||||
KResultOr<size_t> Socket::write(OpenFileDescription& description, u64, const UserOrKernelBuffer& data, size_t size)
|
||||
{
|
||||
if (is_shut_down_for_writing())
|
||||
return set_so_error(EPIPE);
|
||||
|
|
|
@ -23,7 +23,7 @@ enum class ShouldBlock {
|
|||
Yes = 1
|
||||
};
|
||||
|
||||
class FileDescription;
|
||||
class OpenFileDescription;
|
||||
|
||||
class Socket : public File {
|
||||
public:
|
||||
|
@ -68,7 +68,7 @@ public:
|
|||
SetupState setup_state() const { return m_setup_state; }
|
||||
void set_setup_state(SetupState setup_state);
|
||||
|
||||
virtual Role role(const FileDescription&) const { return m_role; }
|
||||
virtual Role role(const OpenFileDescription&) const { return m_role; }
|
||||
|
||||
bool is_connected() const { return m_connected; }
|
||||
void set_connected(bool);
|
||||
|
@ -79,17 +79,17 @@ public:
|
|||
KResult shutdown(int how);
|
||||
|
||||
virtual KResult bind(Userspace<const sockaddr*>, socklen_t) = 0;
|
||||
virtual KResult connect(FileDescription&, Userspace<const sockaddr*>, socklen_t, ShouldBlock) = 0;
|
||||
virtual KResult connect(OpenFileDescription&, Userspace<const sockaddr*>, socklen_t, ShouldBlock) = 0;
|
||||
virtual KResult listen(size_t) = 0;
|
||||
virtual void get_local_address(sockaddr*, socklen_t*) = 0;
|
||||
virtual void get_peer_address(sockaddr*, socklen_t*) = 0;
|
||||
virtual bool is_local() const { return false; }
|
||||
virtual bool is_ipv4() const { return false; }
|
||||
virtual KResultOr<size_t> sendto(FileDescription&, const UserOrKernelBuffer&, size_t, int flags, Userspace<const sockaddr*>, socklen_t) = 0;
|
||||
virtual KResultOr<size_t> recvfrom(FileDescription&, UserOrKernelBuffer&, size_t, int flags, Userspace<sockaddr*>, Userspace<socklen_t*>, Time&) = 0;
|
||||
virtual KResultOr<size_t> sendto(OpenFileDescription&, const UserOrKernelBuffer&, size_t, int flags, Userspace<const sockaddr*>, socklen_t) = 0;
|
||||
virtual KResultOr<size_t> recvfrom(OpenFileDescription&, UserOrKernelBuffer&, size_t, int flags, Userspace<sockaddr*>, Userspace<socklen_t*>, Time&) = 0;
|
||||
|
||||
virtual KResult setsockopt(int level, int option, Userspace<const void*>, socklen_t);
|
||||
virtual KResult getsockopt(FileDescription&, int level, int option, Userspace<void*>, Userspace<socklen_t*>);
|
||||
virtual KResult getsockopt(OpenFileDescription&, int level, int option, Userspace<void*>, Userspace<socklen_t*>);
|
||||
|
||||
ProcessID origin_pid() const { return m_origin.pid; }
|
||||
UserID origin_uid() const { return m_origin.uid; }
|
||||
|
@ -102,10 +102,10 @@ public:
|
|||
Mutex& mutex() { return m_mutex; }
|
||||
|
||||
// ^File
|
||||
virtual KResultOr<size_t> read(FileDescription&, u64, UserOrKernelBuffer&, size_t) override final;
|
||||
virtual KResultOr<size_t> write(FileDescription&, u64, const UserOrKernelBuffer&, size_t) override final;
|
||||
virtual KResultOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override final;
|
||||
virtual KResultOr<size_t> write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t) override final;
|
||||
virtual KResult stat(::stat&) const override;
|
||||
virtual String absolute_path(const FileDescription&) const override = 0;
|
||||
virtual String absolute_path(const OpenFileDescription&) const override = 0;
|
||||
|
||||
bool has_receive_timeout() const { return m_receive_timeout != Time::zero(); }
|
||||
const Time& receive_timeout() const { return m_receive_timeout; }
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
#include <AK/Time.h>
|
||||
#include <Kernel/Debug.h>
|
||||
#include <Kernel/Devices/RandomDevice.h>
|
||||
#include <Kernel/FileSystem/FileDescription.h>
|
||||
#include <Kernel/FileSystem/OpenFileDescription.h>
|
||||
#include <Kernel/Locking/MutexProtected.h>
|
||||
#include <Kernel/Net/EthernetFrameHeader.h>
|
||||
#include <Kernel/Net/IPv4.h>
|
||||
|
@ -394,7 +394,7 @@ KResult TCPSocket::protocol_listen(bool did_allocate_port)
|
|||
return KSuccess;
|
||||
}
|
||||
|
||||
KResult TCPSocket::protocol_connect(FileDescription& description, ShouldBlock should_block)
|
||||
KResult TCPSocket::protocol_connect(OpenFileDescription& description, ShouldBlock should_block)
|
||||
{
|
||||
MutexLocker locker(mutex());
|
||||
|
||||
|
@ -597,7 +597,7 @@ void TCPSocket::retransmit_packets()
|
|||
});
|
||||
}
|
||||
|
||||
bool TCPSocket::can_write(const FileDescription& file_description, size_t size) const
|
||||
bool TCPSocket::can_write(const OpenFileDescription& file_description, size_t size) const
|
||||
{
|
||||
if (!IPv4Socket::can_write(file_description, size))
|
||||
return false;
|
||||
|
|
|
@ -157,7 +157,7 @@ public:
|
|||
|
||||
virtual KResult close() override;
|
||||
|
||||
virtual bool can_write(const FileDescription&, size_t) const override;
|
||||
virtual bool can_write(const OpenFileDescription&, size_t) const override;
|
||||
|
||||
static NetworkOrdered<u16> compute_tcp_checksum(IPv4Address const& source, IPv4Address const& destination, TCPPacket const&, u16 payload_size);
|
||||
|
||||
|
@ -172,7 +172,7 @@ private:
|
|||
|
||||
virtual KResultOr<size_t> protocol_receive(ReadonlyBytes raw_ipv4_packet, UserOrKernelBuffer& buffer, size_t buffer_size, int flags) override;
|
||||
virtual KResultOr<size_t> protocol_send(const UserOrKernelBuffer&, size_t) override;
|
||||
virtual KResult protocol_connect(FileDescription&, ShouldBlock) override;
|
||||
virtual KResult protocol_connect(OpenFileDescription&, ShouldBlock) override;
|
||||
virtual KResultOr<u16> protocol_allocate_local_port() override;
|
||||
virtual bool protocol_is_disconnected() const override;
|
||||
virtual KResult protocol_bind() override;
|
||||
|
|
|
@ -95,7 +95,7 @@ KResultOr<size_t> UDPSocket::protocol_send(const UserOrKernelBuffer& data, size_
|
|||
return data_length;
|
||||
}
|
||||
|
||||
KResult UDPSocket::protocol_connect(FileDescription&, ShouldBlock)
|
||||
KResult UDPSocket::protocol_connect(OpenFileDescription&, ShouldBlock)
|
||||
{
|
||||
set_role(Role::Connected);
|
||||
set_connected(true);
|
||||
|
|
|
@ -27,7 +27,7 @@ private:
|
|||
|
||||
virtual KResultOr<size_t> protocol_receive(ReadonlyBytes raw_ipv4_packet, UserOrKernelBuffer& buffer, size_t buffer_size, int flags) override;
|
||||
virtual KResultOr<size_t> protocol_send(const UserOrKernelBuffer&, size_t) override;
|
||||
virtual KResult protocol_connect(FileDescription&, ShouldBlock) override;
|
||||
virtual KResult protocol_connect(OpenFileDescription&, ShouldBlock) override;
|
||||
virtual KResultOr<u16> protocol_allocate_local_port() override;
|
||||
virtual KResult protocol_bind() override;
|
||||
};
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
#endif
|
||||
#include <Kernel/Devices/NullDevice.h>
|
||||
#include <Kernel/FileSystem/Custody.h>
|
||||
#include <Kernel/FileSystem/FileDescription.h>
|
||||
#include <Kernel/FileSystem/OpenFileDescription.h>
|
||||
#include <Kernel/FileSystem/VirtualFileSystem.h>
|
||||
#include <Kernel/KBufferBuilder.h>
|
||||
#include <Kernel/KSyms.h>
|
||||
|
@ -415,7 +415,7 @@ RefPtr<Process> Process::from_pid(ProcessID pid)
|
|||
});
|
||||
}
|
||||
|
||||
const Process::FileDescriptionAndFlags* Process::FileDescriptions::get_if_valid(size_t i) const
|
||||
const Process::OpenFileDescriptionAndFlags* Process::OpenFileDescriptions::get_if_valid(size_t i) const
|
||||
{
|
||||
SpinlockLocker lock(m_fds_lock);
|
||||
if (m_fds_metadatas.size() <= i)
|
||||
|
@ -426,7 +426,7 @@ const Process::FileDescriptionAndFlags* Process::FileDescriptions::get_if_valid(
|
|||
|
||||
return nullptr;
|
||||
}
|
||||
Process::FileDescriptionAndFlags* Process::FileDescriptions::get_if_valid(size_t i)
|
||||
Process::OpenFileDescriptionAndFlags* Process::OpenFileDescriptions::get_if_valid(size_t i)
|
||||
{
|
||||
SpinlockLocker lock(m_fds_lock);
|
||||
if (m_fds_metadatas.size() <= i)
|
||||
|
@ -438,20 +438,20 @@ Process::FileDescriptionAndFlags* Process::FileDescriptions::get_if_valid(size_t
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
const Process::FileDescriptionAndFlags& Process::FileDescriptions::at(size_t i) const
|
||||
const Process::OpenFileDescriptionAndFlags& Process::OpenFileDescriptions::at(size_t i) const
|
||||
{
|
||||
SpinlockLocker lock(m_fds_lock);
|
||||
VERIFY(m_fds_metadatas[i].is_allocated());
|
||||
return m_fds_metadatas[i];
|
||||
}
|
||||
Process::FileDescriptionAndFlags& Process::FileDescriptions::at(size_t i)
|
||||
Process::OpenFileDescriptionAndFlags& Process::OpenFileDescriptions::at(size_t i)
|
||||
{
|
||||
SpinlockLocker lock(m_fds_lock);
|
||||
VERIFY(m_fds_metadatas[i].is_allocated());
|
||||
return m_fds_metadatas[i];
|
||||
}
|
||||
|
||||
KResultOr<NonnullRefPtr<FileDescription>> Process::FileDescriptions::file_description(int fd) const
|
||||
KResultOr<NonnullRefPtr<OpenFileDescription>> Process::OpenFileDescriptions::file_description(int fd) const
|
||||
{
|
||||
SpinlockLocker lock(m_fds_lock);
|
||||
if (fd < 0)
|
||||
|
@ -464,7 +464,7 @@ KResultOr<NonnullRefPtr<FileDescription>> Process::FileDescriptions::file_descri
|
|||
return description.release_nonnull();
|
||||
}
|
||||
|
||||
void Process::FileDescriptions::enumerate(Function<void(const FileDescriptionAndFlags&)> callback) const
|
||||
void Process::OpenFileDescriptions::enumerate(Function<void(const OpenFileDescriptionAndFlags&)> callback) const
|
||||
{
|
||||
SpinlockLocker lock(m_fds_lock);
|
||||
for (auto& file_description_metadata : m_fds_metadatas) {
|
||||
|
@ -472,7 +472,7 @@ void Process::FileDescriptions::enumerate(Function<void(const FileDescriptionAnd
|
|||
}
|
||||
}
|
||||
|
||||
void Process::FileDescriptions::change_each(Function<void(FileDescriptionAndFlags&)> callback)
|
||||
void Process::OpenFileDescriptions::change_each(Function<void(OpenFileDescriptionAndFlags&)> callback)
|
||||
{
|
||||
SpinlockLocker lock(m_fds_lock);
|
||||
for (auto& file_description_metadata : m_fds_metadatas) {
|
||||
|
@ -480,7 +480,7 @@ void Process::FileDescriptions::change_each(Function<void(FileDescriptionAndFlag
|
|||
}
|
||||
}
|
||||
|
||||
size_t Process::FileDescriptions::open_count() const
|
||||
size_t Process::OpenFileDescriptions::open_count() const
|
||||
{
|
||||
size_t count = 0;
|
||||
enumerate([&](auto& file_description_metadata) {
|
||||
|
@ -490,7 +490,7 @@ size_t Process::FileDescriptions::open_count() const
|
|||
return count;
|
||||
}
|
||||
|
||||
KResultOr<Process::ScopedDescriptionAllocation> Process::FileDescriptions::allocate(int first_candidate_fd)
|
||||
KResultOr<Process::ScopedDescriptionAllocation> Process::OpenFileDescriptions::allocate(int first_candidate_fd)
|
||||
{
|
||||
SpinlockLocker lock(m_fds_lock);
|
||||
for (size_t i = first_candidate_fd; i < max_open(); ++i) {
|
||||
|
@ -764,14 +764,14 @@ RefPtr<Thread> Process::create_kernel_thread(void (*entry)(void*), void* entry_d
|
|||
return thread;
|
||||
}
|
||||
|
||||
void Process::FileDescriptionAndFlags::clear()
|
||||
void Process::OpenFileDescriptionAndFlags::clear()
|
||||
{
|
||||
// FIXME: Verify Process::m_fds_lock is locked!
|
||||
m_description = nullptr;
|
||||
m_flags = 0;
|
||||
}
|
||||
|
||||
void Process::FileDescriptionAndFlags::set(NonnullRefPtr<FileDescription>&& description, u32 flags)
|
||||
void Process::OpenFileDescriptionAndFlags::set(NonnullRefPtr<OpenFileDescription>&& description, u32 flags)
|
||||
{
|
||||
// FIXME: Verify Process::m_fds_lock is locked!
|
||||
m_description = move(description);
|
||||
|
|
|
@ -19,8 +19,8 @@
|
|||
#include <AK/Weakable.h>
|
||||
#include <Kernel/API/Syscall.h>
|
||||
#include <Kernel/AtomicEdgeAction.h>
|
||||
#include <Kernel/FileSystem/FileDescription.h>
|
||||
#include <Kernel/FileSystem/InodeMetadata.h>
|
||||
#include <Kernel/FileSystem/OpenFileDescription.h>
|
||||
#include <Kernel/FileSystem/UnveilNode.h>
|
||||
#include <Kernel/Forward.h>
|
||||
#include <Kernel/FutexQueue.h>
|
||||
|
@ -120,7 +120,7 @@ public:
|
|||
|
||||
friend class Thread;
|
||||
friend class Coredump;
|
||||
friend class ProcFSProcessFileDescriptions;
|
||||
friend class ProcFSProcessOpenFileDescriptions;
|
||||
|
||||
// Helper class to temporarily unprotect a process's protected data so you can write to it.
|
||||
class ProtectedDataMutationScope {
|
||||
|
@ -443,7 +443,7 @@ public:
|
|||
|
||||
KResult exec(NonnullOwnPtr<KString> path, Vector<String> arguments, Vector<String> environment, int recusion_depth = 0);
|
||||
|
||||
KResultOr<LoadResult> load(NonnullRefPtr<FileDescription> main_program_description, RefPtr<FileDescription> interpreter_description, const ElfW(Ehdr) & main_program_header);
|
||||
KResultOr<LoadResult> load(NonnullRefPtr<OpenFileDescription> main_program_description, RefPtr<OpenFileDescription> interpreter_description, const ElfW(Ehdr) & main_program_header);
|
||||
|
||||
bool is_superuser() const { return euid() == 0; }
|
||||
|
||||
|
@ -533,12 +533,12 @@ private:
|
|||
bool create_perf_events_buffer_if_needed();
|
||||
void delete_perf_events_buffer();
|
||||
|
||||
KResult do_exec(NonnullRefPtr<FileDescription> main_program_description, Vector<String> arguments, Vector<String> environment, RefPtr<FileDescription> interpreter_description, Thread*& new_main_thread, u32& prev_flags, const ElfW(Ehdr) & main_program_header);
|
||||
KResultOr<FlatPtr> do_write(FileDescription&, const UserOrKernelBuffer&, size_t);
|
||||
KResult do_exec(NonnullRefPtr<OpenFileDescription> main_program_description, Vector<String> arguments, Vector<String> environment, RefPtr<OpenFileDescription> interpreter_description, Thread*& new_main_thread, u32& prev_flags, const ElfW(Ehdr) & main_program_header);
|
||||
KResultOr<FlatPtr> do_write(OpenFileDescription&, const UserOrKernelBuffer&, size_t);
|
||||
|
||||
KResultOr<FlatPtr> do_statvfs(StringView path, statvfs* buf);
|
||||
|
||||
KResultOr<RefPtr<FileDescription>> find_elf_interpreter_for_executable(StringView path, ElfW(Ehdr) const& main_executable_header, size_t main_executable_header_size, size_t file_size);
|
||||
KResultOr<RefPtr<OpenFileDescription>> find_elf_interpreter_for_executable(StringView path, ElfW(Ehdr) const& main_executable_header, size_t main_executable_header_size, size_t file_size);
|
||||
|
||||
KResult do_kill(Process&, int signal);
|
||||
KResult do_killpg(ProcessGroupID pgrp, int signal);
|
||||
|
@ -554,7 +554,7 @@ private:
|
|||
|
||||
void clear_futex_queues_on_exec();
|
||||
|
||||
void setup_socket_fd(int fd, NonnullRefPtr<FileDescription> description, int type);
|
||||
void setup_socket_fd(int fd, NonnullRefPtr<OpenFileDescription> description, int type);
|
||||
|
||||
public:
|
||||
NonnullRefPtr<ProcessProcFSTraits> procfs_traits() const { return *m_procfs_traits; }
|
||||
|
@ -599,7 +599,7 @@ private:
|
|||
OwnPtr<ThreadTracer> m_tracer;
|
||||
|
||||
public:
|
||||
class FileDescriptionAndFlags {
|
||||
class OpenFileDescriptionAndFlags {
|
||||
public:
|
||||
bool is_valid() const { return !m_description.is_null(); }
|
||||
bool is_allocated() const { return m_is_allocated; }
|
||||
|
@ -616,30 +616,30 @@ public:
|
|||
m_is_allocated = false;
|
||||
}
|
||||
|
||||
FileDescription* description() { return m_description; }
|
||||
const FileDescription* description() const { return m_description; }
|
||||
OpenFileDescription* description() { return m_description; }
|
||||
const OpenFileDescription* description() const { return m_description; }
|
||||
u32 flags() const { return m_flags; }
|
||||
void set_flags(u32 flags) { m_flags = flags; }
|
||||
|
||||
void clear();
|
||||
void set(NonnullRefPtr<FileDescription>&&, u32 flags = 0);
|
||||
void set(NonnullRefPtr<OpenFileDescription>&&, u32 flags = 0);
|
||||
|
||||
private:
|
||||
RefPtr<FileDescription> m_description;
|
||||
RefPtr<OpenFileDescription> m_description;
|
||||
bool m_is_allocated { false };
|
||||
u32 m_flags { 0 };
|
||||
};
|
||||
|
||||
class ScopedDescriptionAllocation;
|
||||
class FileDescriptions {
|
||||
AK_MAKE_NONCOPYABLE(FileDescriptions);
|
||||
class OpenFileDescriptions {
|
||||
AK_MAKE_NONCOPYABLE(OpenFileDescriptions);
|
||||
friend class Process;
|
||||
|
||||
public:
|
||||
ALWAYS_INLINE const FileDescriptionAndFlags& operator[](size_t i) const { return at(i); }
|
||||
ALWAYS_INLINE FileDescriptionAndFlags& operator[](size_t i) { return at(i); }
|
||||
ALWAYS_INLINE const OpenFileDescriptionAndFlags& operator[](size_t i) const { return at(i); }
|
||||
ALWAYS_INLINE OpenFileDescriptionAndFlags& operator[](size_t i) { return at(i); }
|
||||
|
||||
KResult try_clone(const Kernel::Process::FileDescriptions& other)
|
||||
KResult try_clone(const Kernel::Process::OpenFileDescriptions& other)
|
||||
{
|
||||
SpinlockLocker lock_other(other.m_fds_lock);
|
||||
if (!try_resize(other.m_fds_metadatas.size()))
|
||||
|
@ -651,14 +651,14 @@ public:
|
|||
return KSuccess;
|
||||
}
|
||||
|
||||
const FileDescriptionAndFlags& at(size_t i) const;
|
||||
FileDescriptionAndFlags& at(size_t i);
|
||||
const OpenFileDescriptionAndFlags& at(size_t i) const;
|
||||
OpenFileDescriptionAndFlags& at(size_t i);
|
||||
|
||||
FileDescriptionAndFlags const* get_if_valid(size_t i) const;
|
||||
FileDescriptionAndFlags* get_if_valid(size_t i);
|
||||
OpenFileDescriptionAndFlags const* get_if_valid(size_t i) const;
|
||||
OpenFileDescriptionAndFlags* get_if_valid(size_t i);
|
||||
|
||||
void enumerate(Function<void(const FileDescriptionAndFlags&)>) const;
|
||||
void change_each(Function<void(FileDescriptionAndFlags&)>);
|
||||
void enumerate(Function<void(const OpenFileDescriptionAndFlags&)>) const;
|
||||
void change_each(Function<void(OpenFileDescriptionAndFlags&)>);
|
||||
|
||||
KResultOr<ScopedDescriptionAllocation> allocate(int first_candidate_fd = 0);
|
||||
size_t open_count() const;
|
||||
|
@ -676,13 +676,13 @@ public:
|
|||
m_fds_metadatas.clear();
|
||||
}
|
||||
|
||||
KResultOr<NonnullRefPtr<FileDescription>> file_description(int fd) const;
|
||||
KResultOr<NonnullRefPtr<OpenFileDescription>> file_description(int fd) const;
|
||||
|
||||
private:
|
||||
FileDescriptions() = default;
|
||||
OpenFileDescriptions() = default;
|
||||
static constexpr size_t m_max_open_file_descriptors { FD_SETSIZE };
|
||||
mutable Spinlock m_fds_lock;
|
||||
Vector<FileDescriptionAndFlags> m_fds_metadatas;
|
||||
Vector<OpenFileDescriptionAndFlags> m_fds_metadatas;
|
||||
};
|
||||
|
||||
class ScopedDescriptionAllocation {
|
||||
|
@ -690,7 +690,7 @@ public:
|
|||
|
||||
public:
|
||||
ScopedDescriptionAllocation() = default;
|
||||
ScopedDescriptionAllocation(int tracked_fd, FileDescriptionAndFlags* description)
|
||||
ScopedDescriptionAllocation(int tracked_fd, OpenFileDescriptionAndFlags* description)
|
||||
: fd(tracked_fd)
|
||||
, m_description(description)
|
||||
{
|
||||
|
@ -713,7 +713,7 @@ public:
|
|||
const int fd { -1 };
|
||||
|
||||
private:
|
||||
FileDescriptionAndFlags* m_description { nullptr };
|
||||
OpenFileDescriptionAndFlags* m_description { nullptr };
|
||||
};
|
||||
|
||||
class ProcessProcFSTraits : public ProcFSExposedComponent {
|
||||
|
@ -742,8 +742,8 @@ public:
|
|||
WeakPtr<Process> m_process;
|
||||
};
|
||||
|
||||
FileDescriptions& fds() { return m_fds; }
|
||||
const FileDescriptions& fds() const { return m_fds; }
|
||||
OpenFileDescriptions& fds() { return m_fds; }
|
||||
const OpenFileDescriptions& fds() const { return m_fds; }
|
||||
|
||||
private:
|
||||
SpinlockProtected<Thread::ListInProcess>& thread_list() { return m_thread_list; }
|
||||
|
@ -751,7 +751,7 @@ private:
|
|||
|
||||
SpinlockProtected<Thread::ListInProcess> m_thread_list;
|
||||
|
||||
FileDescriptions m_fds;
|
||||
OpenFileDescriptions m_fds;
|
||||
|
||||
const bool m_is_kernel_process;
|
||||
Atomic<State> m_state { State::Running };
|
||||
|
|
|
@ -64,7 +64,7 @@ InodeIndex build_segmented_index_for_thread_stack(ProcessID pid, ThreadID thread
|
|||
|
||||
InodeIndex build_segmented_index_for_file_description(ProcessID pid, unsigned fd)
|
||||
{
|
||||
return build_segmented_index_with_unknown_property(pid, ProcessSubDirectory::FileDescriptions, fd);
|
||||
return build_segmented_index_with_unknown_property(pid, ProcessSubDirectory::OpenFileDescriptions, fd);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -107,7 +107,7 @@ ProcFSExposedLink::ProcFSExposedLink(StringView name)
|
|||
: ProcFSExposedComponent(name)
|
||||
{
|
||||
}
|
||||
KResultOr<size_t> ProcFSGlobalInformation::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, FileDescription* description) const
|
||||
KResultOr<size_t> ProcFSGlobalInformation::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, OpenFileDescription* description) const
|
||||
{
|
||||
dbgln_if(PROCFS_DEBUG, "ProcFSGlobalInformation @ {}: read_bytes offset: {} count: {}", name(), offset, count);
|
||||
|
||||
|
@ -135,7 +135,7 @@ KResultOr<size_t> ProcFSGlobalInformation::read_bytes(off_t offset, size_t count
|
|||
return nread;
|
||||
}
|
||||
|
||||
KResult ProcFSGlobalInformation::refresh_data(FileDescription& description) const
|
||||
KResult ProcFSGlobalInformation::refresh_data(OpenFileDescription& description) const
|
||||
{
|
||||
MutexLocker lock(m_refresh_lock);
|
||||
auto& cached_data = description.data();
|
||||
|
@ -153,7 +153,7 @@ KResult ProcFSGlobalInformation::refresh_data(FileDescription& description) cons
|
|||
return KSuccess;
|
||||
}
|
||||
|
||||
KResultOr<size_t> ProcFSExposedLink::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, FileDescription*) const
|
||||
KResultOr<size_t> ProcFSExposedLink::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, OpenFileDescription*) const
|
||||
{
|
||||
VERIFY(offset == 0);
|
||||
MutexLocker locker(m_lock);
|
||||
|
|
|
@ -14,8 +14,8 @@
|
|||
#include <Kernel/API/KResult.h>
|
||||
#include <Kernel/Arch/x86/CPU.h>
|
||||
#include <Kernel/FileSystem/File.h>
|
||||
#include <Kernel/FileSystem/FileDescription.h>
|
||||
#include <Kernel/FileSystem/FileSystem.h>
|
||||
#include <Kernel/FileSystem/OpenFileDescription.h>
|
||||
#include <Kernel/KBufferBuilder.h>
|
||||
#include <Kernel/UserOrKernelBuffer.h>
|
||||
|
||||
|
@ -26,7 +26,7 @@ enum class MainProcessProperty {
|
|||
Reserved = 0,
|
||||
Unveil = 1,
|
||||
Pledge = 2,
|
||||
FileDescriptions = 3,
|
||||
OpenFileDescriptions = 3,
|
||||
BinaryLink = 4,
|
||||
CurrentWorkDirectoryLink = 5,
|
||||
PerformanceEvents = 6,
|
||||
|
@ -35,7 +35,7 @@ enum class MainProcessProperty {
|
|||
|
||||
enum class ProcessSubDirectory {
|
||||
Reserved = 0,
|
||||
FileDescriptions = 1,
|
||||
OpenFileDescriptions = 1,
|
||||
Stacks = 2,
|
||||
};
|
||||
|
||||
|
@ -66,10 +66,10 @@ private:
|
|||
class ProcFSExposedComponent : public RefCounted<ProcFSExposedComponent> {
|
||||
public:
|
||||
StringView name() const { return m_name->view(); }
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer&, FileDescription*) const { VERIFY_NOT_REACHED(); }
|
||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const { VERIFY_NOT_REACHED(); }
|
||||
virtual KResult traverse_as_directory(unsigned, Function<bool(FileSystem::DirectoryEntryView const&)>) const { VERIFY_NOT_REACHED(); }
|
||||
virtual KResultOr<NonnullRefPtr<ProcFSExposedComponent>> lookup(StringView) { VERIFY_NOT_REACHED(); };
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer&, FileDescription*) { return KResult(EROFS); }
|
||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer&, OpenFileDescription*) { return KResult(EROFS); }
|
||||
|
||||
virtual mode_t required_mode() const { return 0444; }
|
||||
virtual UserID owner_user() const { return 0; }
|
||||
|
@ -77,7 +77,7 @@ public:
|
|||
time_t modified_time() const { return TimeManagement::now().to_timeval().tv_sec; }
|
||||
|
||||
virtual void prepare_for_deletion() { }
|
||||
virtual KResult refresh_data(FileDescription&) const
|
||||
virtual KResult refresh_data(OpenFileDescription&) const
|
||||
{
|
||||
return KSuccess;
|
||||
}
|
||||
|
@ -128,7 +128,7 @@ class ProcFSExposedLink : public ProcFSExposedComponent {
|
|||
public:
|
||||
virtual KResultOr<NonnullRefPtr<Inode>> to_inode(const ProcFS& procfs_instance) const override final;
|
||||
|
||||
virtual KResultOr<size_t> read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, FileDescription* description) const override;
|
||||
virtual KResultOr<size_t> read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, OpenFileDescription* description) const override;
|
||||
|
||||
protected:
|
||||
virtual bool acquire_link(KBufferBuilder& builder) = 0;
|
||||
|
@ -149,7 +149,7 @@ private:
|
|||
ProcFSRootDirectory();
|
||||
};
|
||||
|
||||
struct ProcFSInodeData : public FileDescriptionData {
|
||||
struct ProcFSInodeData : public OpenFileDescriptionData {
|
||||
OwnPtr<KBuffer> buffer;
|
||||
};
|
||||
|
||||
|
@ -157,7 +157,7 @@ class ProcFSGlobalInformation : public ProcFSExposedComponent {
|
|||
public:
|
||||
virtual ~ProcFSGlobalInformation() override {};
|
||||
|
||||
virtual KResultOr<size_t> read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, FileDescription* description) const override;
|
||||
virtual KResultOr<size_t> read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, OpenFileDescription* description) const override;
|
||||
|
||||
virtual mode_t required_mode() const override { return 0444; }
|
||||
|
||||
|
@ -166,7 +166,7 @@ protected:
|
|||
: ProcFSExposedComponent(name)
|
||||
{
|
||||
}
|
||||
virtual KResult refresh_data(FileDescription&) const override;
|
||||
virtual KResult refresh_data(OpenFileDescription&) const override;
|
||||
virtual KResult try_generate(KBufferBuilder&) = 0;
|
||||
|
||||
mutable Mutex m_refresh_lock;
|
||||
|
|
|
@ -53,11 +53,11 @@ KResult Process::ProcessProcFSTraits::traverse_as_directory(unsigned fsid, Funct
|
|||
|
||||
callback({ ".", { fsid, SegmentedProcFSIndex::build_segmented_index_for_pid_directory(process->pid()) }, DT_DIR });
|
||||
callback({ "..", { fsid, ProcFSComponentRegistry::the().root_directory().component_index() }, DT_DIR });
|
||||
callback({ "fd", { fsid, SegmentedProcFSIndex::build_segmented_index_for_sub_directory(process->pid(), SegmentedProcFSIndex::ProcessSubDirectory::FileDescriptions) }, DT_DIR });
|
||||
callback({ "fd", { fsid, SegmentedProcFSIndex::build_segmented_index_for_sub_directory(process->pid(), SegmentedProcFSIndex::ProcessSubDirectory::OpenFileDescriptions) }, DT_DIR });
|
||||
callback({ "stacks", { fsid, SegmentedProcFSIndex::build_segmented_index_for_sub_directory(process->pid(), SegmentedProcFSIndex::ProcessSubDirectory::Stacks) }, DT_DIR });
|
||||
callback({ "unveil", { fsid, SegmentedProcFSIndex::build_segmented_index_for_main_property_in_pid_directory(process->pid(), SegmentedProcFSIndex::MainProcessProperty::Unveil) }, DT_REG });
|
||||
callback({ "pledge", { fsid, SegmentedProcFSIndex::build_segmented_index_for_main_property_in_pid_directory(process->pid(), SegmentedProcFSIndex::MainProcessProperty::Pledge) }, DT_REG });
|
||||
callback({ "fds", { fsid, SegmentedProcFSIndex::build_segmented_index_for_main_property_in_pid_directory(process->pid(), SegmentedProcFSIndex::MainProcessProperty::FileDescriptions) }, DT_DIR });
|
||||
callback({ "fds", { fsid, SegmentedProcFSIndex::build_segmented_index_for_main_property_in_pid_directory(process->pid(), SegmentedProcFSIndex::MainProcessProperty::OpenFileDescriptions) }, DT_DIR });
|
||||
callback({ "exe", { fsid, SegmentedProcFSIndex::build_segmented_index_for_main_property_in_pid_directory(process->pid(), SegmentedProcFSIndex::MainProcessProperty::BinaryLink) }, DT_LNK });
|
||||
callback({ "cwd", { fsid, SegmentedProcFSIndex::build_segmented_index_for_main_property_in_pid_directory(process->pid(), SegmentedProcFSIndex::MainProcessProperty::CurrentWorkDirectoryLink) }, DT_LNK });
|
||||
callback({ "perf_events", { fsid, SegmentedProcFSIndex::build_segmented_index_for_main_property_in_pid_directory(process->pid(), SegmentedProcFSIndex::MainProcessProperty::PerformanceEvents) }, DT_REG });
|
||||
|
|
|
@ -184,7 +184,7 @@ KResult Process::procfs_get_fds_stats(KBufferBuilder& builder) const
|
|||
return;
|
||||
}
|
||||
bool cloexec = file_description_metadata.flags() & FD_CLOEXEC;
|
||||
RefPtr<FileDescription> description = file_description_metadata.description();
|
||||
RefPtr<OpenFileDescription> description = file_description_metadata.description();
|
||||
auto description_object = array.add_object();
|
||||
description_object.add("fd", count);
|
||||
description_object.add("absolute_path", description->absolute_path());
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*/
|
||||
|
||||
#include <AK/StringView.h>
|
||||
#include <Kernel/FileSystem/FileDescription.h>
|
||||
#include <Kernel/FileSystem/OpenFileDescription.h>
|
||||
#include <Kernel/Sections.h>
|
||||
#include <Kernel/Storage/IDEChannel.h>
|
||||
#include <Kernel/Storage/IDEController.h>
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*/
|
||||
|
||||
#include <Kernel/Debug.h>
|
||||
#include <Kernel/FileSystem/FileDescription.h>
|
||||
#include <Kernel/FileSystem/OpenFileDescription.h>
|
||||
#include <Kernel/Storage/Partition/DiskPartition.h>
|
||||
|
||||
namespace Kernel {
|
||||
|
@ -37,28 +37,28 @@ void DiskPartition::start_request(AsyncBlockDeviceRequest& request)
|
|||
request.block_index() + m_metadata.start_block(), request.block_count(), request.buffer(), request.buffer_size()));
|
||||
}
|
||||
|
||||
KResultOr<size_t> DiskPartition::read(FileDescription& fd, u64 offset, UserOrKernelBuffer& outbuf, size_t len)
|
||||
KResultOr<size_t> DiskPartition::read(OpenFileDescription& fd, u64 offset, UserOrKernelBuffer& outbuf, size_t len)
|
||||
{
|
||||
unsigned adjust = m_metadata.start_block() * block_size();
|
||||
dbgln_if(OFFD_DEBUG, "DiskPartition::read offset={}, adjust={}, len={}", fd.offset(), adjust, len);
|
||||
return m_device->read(fd, offset + adjust, outbuf, len);
|
||||
}
|
||||
|
||||
bool DiskPartition::can_read(const FileDescription& fd, size_t offset) const
|
||||
bool DiskPartition::can_read(const OpenFileDescription& fd, size_t offset) const
|
||||
{
|
||||
unsigned adjust = m_metadata.start_block() * block_size();
|
||||
dbgln_if(OFFD_DEBUG, "DiskPartition::can_read offset={}, adjust={}", offset, adjust);
|
||||
return m_device->can_read(fd, offset + adjust);
|
||||
}
|
||||
|
||||
KResultOr<size_t> DiskPartition::write(FileDescription& fd, u64 offset, const UserOrKernelBuffer& inbuf, size_t len)
|
||||
KResultOr<size_t> DiskPartition::write(OpenFileDescription& fd, u64 offset, const UserOrKernelBuffer& inbuf, size_t len)
|
||||
{
|
||||
unsigned adjust = m_metadata.start_block() * block_size();
|
||||
dbgln_if(OFFD_DEBUG, "DiskPartition::write offset={}, adjust={}, len={}", offset, adjust, len);
|
||||
return m_device->write(fd, offset + adjust, inbuf, len);
|
||||
}
|
||||
|
||||
bool DiskPartition::can_write(const FileDescription& fd, size_t offset) const
|
||||
bool DiskPartition::can_write(const OpenFileDescription& fd, size_t offset) const
|
||||
{
|
||||
unsigned adjust = m_metadata.start_block() * block_size();
|
||||
dbgln_if(OFFD_DEBUG, "DiskPartition::can_write offset={}, adjust={}", offset, adjust);
|
||||
|
|
|
@ -20,10 +20,10 @@ public:
|
|||
virtual void start_request(AsyncBlockDeviceRequest&) override;
|
||||
|
||||
// ^BlockDevice
|
||||
virtual KResultOr<size_t> read(FileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_read(const FileDescription&, size_t) const override;
|
||||
virtual KResultOr<size_t> write(FileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_write(const FileDescription&, size_t) const override;
|
||||
virtual KResultOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_read(const OpenFileDescription&, size_t) const override;
|
||||
virtual KResultOr<size_t> write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
|
||||
virtual bool can_write(const OpenFileDescription&, size_t) const override;
|
||||
|
||||
// ^Device
|
||||
virtual mode_t required_mode() const override { return 0600; }
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue