1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 04:27:45 +00:00

Kernel: Make File::write() and File::read() return KResultOr<size_t>

Instead of returning a ssize_t where negative values mean error,
we now return KResultOr<size_t> and use the error state to report
errors exclusively.
This commit is contained in:
Andreas Kling 2020-08-04 18:02:23 +02:00
parent 58feebeed2
commit 7a3ab6c517
58 changed files with 223 additions and 229 deletions

View file

@ -47,8 +47,8 @@ private:
virtual const char* class_name() const override { return "BXVGA"; }
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 ssize_t read(FileDescription&, size_t, u8*, ssize_t) override { return -EINVAL; }
virtual ssize_t write(FileDescription&, size_t, const u8*, ssize_t) override { return -EINVAL; }
virtual KResultOr<size_t> read(FileDescription&, size_t, u8*, size_t) override { return -EINVAL; }
virtual KResultOr<size_t> write(FileDescription&, size_t, const u8*, size_t) override { return -EINVAL; }
virtual bool read_blocks(unsigned, u16, u8*) override { return false; }
virtual bool write_blocks(unsigned, u16, const u8*) override { return false; }

View file

@ -48,7 +48,7 @@ DiskPartition::~DiskPartition()
{
}
ssize_t DiskPartition::read(FileDescription& fd, size_t offset, u8* outbuf, ssize_t len)
KResultOr<size_t> DiskPartition::read(FileDescription& fd, size_t offset, u8* outbuf, size_t len)
{
unsigned adjust = m_block_offset * block_size();
@ -70,7 +70,7 @@ bool DiskPartition::can_read(const FileDescription& fd, size_t offset) const
return m_device->can_read(fd, offset + adjust);
}
ssize_t DiskPartition::write(FileDescription& fd, size_t offset, const u8* inbuf, ssize_t len)
KResultOr<size_t> DiskPartition::write(FileDescription& fd, size_t offset, const u8* inbuf, size_t len)
{
unsigned adjust = m_block_offset * block_size();

View file

@ -40,9 +40,9 @@ public:
virtual bool write_blocks(unsigned index, u16 count, const u8*) override;
// ^BlockDevice
virtual ssize_t read(FileDescription&, size_t, u8*, ssize_t) override;
virtual KResultOr<size_t> read(FileDescription&, size_t, u8*, size_t) override;
virtual bool can_read(const FileDescription&, size_t) const override;
virtual ssize_t write(FileDescription&, size_t, const u8*, ssize_t) override;
virtual KResultOr<size_t> write(FileDescription&, size_t, const u8*, size_t) override;
virtual bool can_write(const FileDescription&, size_t) const override;
private:

View file

@ -46,18 +46,18 @@ bool FullDevice::can_read(const FileDescription&, size_t) const
return true;
}
ssize_t FullDevice::read(FileDescription&, size_t, u8* buffer, ssize_t size)
KResultOr<size_t> FullDevice::read(FileDescription&, size_t, u8* buffer, size_t size)
{
ssize_t count = min(static_cast<ssize_t>(PAGE_SIZE), size);
memset(buffer, 0, (size_t)count);
ssize_t count = min(static_cast<size_t>(PAGE_SIZE), size);
memset(buffer, 0, count);
return count;
}
ssize_t FullDevice::write(FileDescription&, size_t, const u8*, ssize_t size)
KResultOr<size_t> FullDevice::write(FileDescription&, size_t, const u8*, size_t size)
{
if (size == 0)
return 0;
return -ENOSPC;
return KResult(-ENOSPC);
}
}

View file

@ -38,8 +38,8 @@ public:
private:
// ^CharacterDevice
virtual ssize_t read(FileDescription&, size_t, u8*, ssize_t) override;
virtual ssize_t write(FileDescription&, size_t, const u8*, ssize_t) override;
virtual KResultOr<size_t> read(FileDescription&, size_t, u8*, size_t) override;
virtual KResultOr<size_t> write(FileDescription&, size_t, const u8*, 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 const char* class_name() const override { return "FullDevice"; }

View file

@ -366,9 +366,9 @@ bool KeyboardDevice::can_read(const FileDescription&, size_t) const
return !m_queue.is_empty();
}
ssize_t KeyboardDevice::read(FileDescription&, size_t, u8* buffer, ssize_t size)
KResultOr<size_t> KeyboardDevice::read(FileDescription&, size_t, u8* buffer, size_t size)
{
ssize_t nread = 0;
size_t nread = 0;
while (nread < size) {
if (m_queue.is_empty())
break;
@ -382,7 +382,7 @@ ssize_t KeyboardDevice::read(FileDescription&, size_t, u8* buffer, ssize_t size)
return nread;
}
ssize_t KeyboardDevice::write(FileDescription&, size_t, const u8*, ssize_t)
KResultOr<size_t> KeyboardDevice::write(FileDescription&, size_t, const u8*, size_t)
{
return 0;
}

View file

@ -54,9 +54,9 @@ public:
void set_maps(Keyboard::CharacterMapData character_map);
// ^CharacterDevice
virtual ssize_t read(FileDescription&, size_t, u8* buffer, ssize_t) override;
virtual KResultOr<size_t> read(FileDescription&, size_t, u8*, size_t) override;
virtual bool can_read(const FileDescription&, size_t) const override;
virtual ssize_t write(FileDescription&, size_t, const u8* buffer, ssize_t) override;
virtual KResultOr<size_t> write(FileDescription&, size_t, const u8*, size_t) override;
virtual bool can_write(const FileDescription&, size_t) const override { return true; }
virtual const char* purpose() const override { return class_name(); }

View file

@ -47,8 +47,8 @@ private:
virtual const char* class_name() const override { return "MBVGA"; }
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 ssize_t read(FileDescription&, size_t, u8*, ssize_t) override { return -EINVAL; }
virtual ssize_t write(FileDescription&, size_t, const u8*, ssize_t) override { return -EINVAL; }
virtual KResultOr<size_t> read(FileDescription&, size_t, u8*, size_t) override { return -EINVAL; }
virtual KResultOr<size_t> write(FileDescription&, size_t, const u8*, size_t) override { return -EINVAL; }
virtual bool read_blocks(unsigned, u16, u8*) override { return false; }
virtual bool write_blocks(unsigned, u16, const u8*) override { return false; }

View file

@ -52,14 +52,14 @@ bool NullDevice::can_read(const FileDescription&, size_t) const
return true;
}
ssize_t NullDevice::read(FileDescription&, size_t, u8*, ssize_t)
KResultOr<size_t> NullDevice::read(FileDescription&, size_t, u8*, size_t)
{
return 0;
}
ssize_t NullDevice::write(FileDescription&, size_t, const u8*, ssize_t buffer_size)
KResultOr<size_t> NullDevice::write(FileDescription&, size_t, const u8*, size_t buffer_size)
{
return min(static_cast<ssize_t>(PAGE_SIZE), buffer_size);
return min(static_cast<size_t>(PAGE_SIZE), buffer_size);
}
}

View file

@ -40,8 +40,8 @@ public:
private:
// ^CharacterDevice
virtual ssize_t read(FileDescription&, size_t, u8*, ssize_t) override;
virtual ssize_t write(FileDescription&, size_t, const u8*, ssize_t) override;
virtual KResultOr<size_t> read(FileDescription&, size_t, u8*, size_t) override;
virtual KResultOr<size_t> write(FileDescription&, size_t, const u8*, 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 const char* class_name() const override { return "NullDevice"; }

View file

@ -80,7 +80,7 @@ void PATADiskDevice::set_drive_geometry(u16 cyls, u16 heads, u16 spt)
m_sectors_per_track = spt;
}
ssize_t PATADiskDevice::read(FileDescription&, size_t offset, u8* outbuf, ssize_t len)
KResultOr<size_t> PATADiskDevice::read(FileDescription&, size_t offset, u8* outbuf, size_t len)
{
unsigned index = offset / block_size();
u16 whole_blocks = len / block_size();
@ -121,7 +121,7 @@ bool PATADiskDevice::can_read(const FileDescription&, size_t offset) const
return offset < (m_cylinders * m_heads * m_sectors_per_track * block_size());
}
ssize_t PATADiskDevice::write(FileDescription&, size_t offset, const u8* inbuf, ssize_t len)
KResultOr<size_t> PATADiskDevice::write(FileDescription&, size_t offset, const u8* inbuf, size_t len)
{
unsigned index = offset / block_size();
u16 whole_blocks = len / block_size();

View file

@ -61,9 +61,9 @@ public:
void set_drive_geometry(u16, u16, u16);
// ^BlockDevice
virtual ssize_t read(FileDescription&, size_t, u8*, ssize_t) override;
virtual KResultOr<size_t> read(FileDescription&, size_t, u8*, size_t) override;
virtual bool can_read(const FileDescription&, size_t) const override;
virtual ssize_t write(FileDescription&, size_t, const u8*, ssize_t) override;
virtual KResultOr<size_t> write(FileDescription&, size_t, const u8*, size_t) override;
virtual bool can_write(const FileDescription&, size_t) const override;
protected:

View file

@ -324,7 +324,7 @@ bool PS2MouseDevice::can_read(const FileDescription&, size_t) const
return !m_queue.is_empty();
}
ssize_t PS2MouseDevice::read(FileDescription&, size_t, u8* buffer, ssize_t size)
KResultOr<size_t> PS2MouseDevice::read(FileDescription&, size_t, u8* buffer, size_t size)
{
ASSERT(size > 0);
size_t nread = 0;
@ -344,7 +344,7 @@ ssize_t PS2MouseDevice::read(FileDescription&, size_t, u8* buffer, ssize_t size)
return nread;
}
ssize_t PS2MouseDevice::write(FileDescription&, size_t, const u8*, ssize_t)
KResultOr<size_t> PS2MouseDevice::write(FileDescription&, size_t, const u8*, size_t)
{
return 0;
}

View file

@ -44,8 +44,8 @@ public:
// ^CharacterDevice
virtual bool can_read(const FileDescription&, size_t) const override;
virtual ssize_t read(FileDescription&, size_t, u8*, ssize_t) override;
virtual ssize_t write(FileDescription&, size_t, const u8*, ssize_t) override;
virtual KResultOr<size_t> read(FileDescription&, size_t, u8*, size_t) override;
virtual KResultOr<size_t> write(FileDescription&, size_t, const u8*, size_t) override;
virtual bool can_write(const FileDescription&, size_t) const override { return true; }
virtual const char* purpose() const override { return class_name(); }

View file

@ -43,16 +43,16 @@ bool RandomDevice::can_read(const FileDescription&, size_t) const
return true;
}
ssize_t RandomDevice::read(FileDescription&, size_t, u8* buffer, ssize_t size)
KResultOr<size_t> RandomDevice::read(FileDescription&, size_t, u8* buffer, size_t size)
{
get_good_random_bytes(buffer, size);
return size;
}
ssize_t RandomDevice::write(FileDescription&, size_t, const u8*, ssize_t size)
KResultOr<size_t> RandomDevice::write(FileDescription&, size_t, const u8*, size_t size)
{
// FIXME: Use input for entropy? I guess that could be a neat feature?
return min(static_cast<ssize_t>(PAGE_SIZE), size);
return min(static_cast<size_t>(PAGE_SIZE), size);
}
}

View file

@ -38,8 +38,8 @@ public:
private:
// ^CharacterDevice
virtual ssize_t read(FileDescription&, size_t, u8*, ssize_t) override;
virtual ssize_t write(FileDescription&, size_t, const u8*, ssize_t) override;
virtual KResultOr<size_t> read(FileDescription&, size_t, u8*, size_t) override;
virtual KResultOr<size_t> write(FileDescription&, size_t, const u8*, 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 const char* class_name() const override { return "RandomDevice"; }

View file

@ -172,7 +172,7 @@ bool SB16::can_read(const FileDescription&, size_t) const
return false;
}
ssize_t SB16::read(FileDescription&, size_t, u8*, ssize_t)
KResultOr<size_t> SB16::read(FileDescription&, size_t, u8*, size_t)
{
return 0;
}
@ -226,7 +226,7 @@ void SB16::wait_for_irq()
disable_irq();
}
ssize_t SB16::write(FileDescription&, size_t, const u8* data, ssize_t length)
KResultOr<size_t> SB16::write(FileDescription&, size_t, const u8* data, size_t length)
{
if (!m_dma_region) {
auto page = MM.allocate_supervisor_physical_page();

View file

@ -46,8 +46,8 @@ public:
// ^CharacterDevice
virtual bool can_read(const FileDescription&, size_t) const override;
virtual ssize_t read(FileDescription&, size_t, u8*, ssize_t) override;
virtual ssize_t write(FileDescription&, size_t, const u8*, ssize_t) override;
virtual KResultOr<size_t> read(FileDescription&, size_t, u8*, size_t) override;
virtual KResultOr<size_t> write(FileDescription&, size_t, const u8*, size_t) override;
virtual bool can_write(const FileDescription&, size_t) const override { return true; }
virtual const char* purpose() const override { return class_name(); }

View file

@ -45,7 +45,7 @@ bool SerialDevice::can_read(const FileDescription&, size_t) const
return (get_line_status() & DataReady) != 0;
}
ssize_t SerialDevice::read(FileDescription&, size_t, u8* buffer, ssize_t size)
KResultOr<size_t> SerialDevice::read(FileDescription&, size_t, u8* buffer, size_t size)
{
if (!size)
return 0;
@ -63,7 +63,7 @@ bool SerialDevice::can_write(const FileDescription&, size_t) const
return (get_line_status() & EmptyTransmitterHoldingRegister) != 0;
}
ssize_t SerialDevice::write(FileDescription&, size_t, const u8* buffer, ssize_t size)
KResultOr<size_t> SerialDevice::write(FileDescription&, size_t, const u8* buffer, size_t size)
{
if (!size)
return 0;

View file

@ -43,9 +43,9 @@ public:
// ^CharacterDevice
virtual bool can_read(const FileDescription&, size_t) const override;
virtual ssize_t read(FileDescription&, size_t, u8*, ssize_t) override;
virtual KResultOr<size_t> read(FileDescription&, size_t, u8*, size_t) override;
virtual bool can_write(const FileDescription&, size_t) const override;
virtual ssize_t write(FileDescription&, size_t, const u8*, ssize_t) override;
virtual KResultOr<size_t> write(FileDescription&, size_t, const u8*, size_t) override;
enum InterruptEnable {
LowPowerMode = 0x01 << 5,

View file

@ -44,16 +44,16 @@ bool ZeroDevice::can_read(const FileDescription&, size_t) const
return true;
}
ssize_t ZeroDevice::read(FileDescription&, size_t, u8* buffer, ssize_t size)
KResultOr<size_t> ZeroDevice::read(FileDescription&, size_t, u8* buffer, size_t size)
{
ssize_t count = min(static_cast<ssize_t>(PAGE_SIZE), size);
memset(buffer, 0, (size_t)count);
ssize_t count = min(static_cast<size_t>(PAGE_SIZE), size);
memset(buffer, 0, count);
return count;
}
ssize_t ZeroDevice::write(FileDescription&, size_t, const u8*, ssize_t size)
KResultOr<size_t> ZeroDevice::write(FileDescription&, size_t, const u8*, size_t size)
{
return min(static_cast<ssize_t>(PAGE_SIZE), size);
return min(static_cast<size_t>(PAGE_SIZE), size);
}
}

View file

@ -38,8 +38,8 @@ public:
private:
// ^CharacterDevice
virtual ssize_t read(FileDescription&, size_t, u8*, ssize_t) override;
virtual ssize_t write(FileDescription&, size_t, const u8*, ssize_t) override;
virtual KResultOr<size_t> read(FileDescription&, size_t, u8*, size_t) override;
virtual KResultOr<size_t> write(FileDescription&, size_t, const u8*, 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 const char* class_name() const override { return "ZeroDevice"; }