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:
parent
58feebeed2
commit
7a3ab6c517
58 changed files with 223 additions and 229 deletions
|
@ -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; }
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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"; }
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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(); }
|
||||
|
|
|
@ -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; }
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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"; }
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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(); }
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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"; }
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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(); }
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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"; }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue