1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 17:47:44 +00:00

Kernel: Add explicit offset parameter to File::read etc

This commit is contained in:
Conrad Pankoff 2020-04-10 19:44:42 +10:00 committed by Andreas Kling
parent 68c7ca7d3b
commit a3edeb5868
45 changed files with 199 additions and 183 deletions

View file

@ -106,17 +106,17 @@ void FIFO::detach(Direction direction)
}
}
bool FIFO::can_read(const FileDescription&) const
bool FIFO::can_read(const FileDescription&, size_t) const
{
return !m_buffer.is_empty() || !m_writers;
}
bool FIFO::can_write(const FileDescription&) const
bool FIFO::can_write(const FileDescription&, size_t) const
{
return m_buffer.space_for_writing() || !m_readers;
}
ssize_t FIFO::read(FileDescription&, u8* buffer, ssize_t size)
ssize_t FIFO::read(FileDescription&, size_t, u8* buffer, ssize_t size)
{
if (!m_writers && m_buffer.is_empty())
return 0;
@ -130,7 +130,7 @@ ssize_t FIFO::read(FileDescription&, u8* buffer, ssize_t size)
return nread;
}
ssize_t FIFO::write(FileDescription&, const u8* buffer, ssize_t size)
ssize_t FIFO::write(FileDescription&, size_t, const u8* buffer, ssize_t size)
{
if (!m_readers) {
Thread::current->send_signal(SIGPIPE, Process::current);

View file

@ -54,10 +54,10 @@ public:
private:
// ^File
virtual ssize_t write(FileDescription&, const u8*, ssize_t) override;
virtual ssize_t read(FileDescription&, u8*, ssize_t) override;
virtual bool can_read(const FileDescription&) const override;
virtual bool can_write(const FileDescription&) const override;
virtual ssize_t write(FileDescription&, size_t, const u8*, ssize_t) override;
virtual ssize_t read(FileDescription&, size_t, u8*, ssize_t) 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 const char* class_name() const override { return "FIFO"; }
virtual bool is_fifo() const override { return true; }

View file

@ -71,11 +71,11 @@ public:
virtual KResultOr<NonnullRefPtr<FileDescription>> open(int options);
virtual void close();
virtual bool can_read(const FileDescription&) const = 0;
virtual bool can_write(const FileDescription&) const = 0;
virtual bool can_read(const FileDescription&, size_t) const = 0;
virtual bool can_write(const FileDescription&, size_t) const = 0;
virtual ssize_t read(FileDescription&, u8*, ssize_t) = 0;
virtual ssize_t write(FileDescription&, const u8*, ssize_t) = 0;
virtual ssize_t read(FileDescription&, size_t, u8*, ssize_t) = 0;
virtual ssize_t write(FileDescription&, size_t, const u8*, ssize_t) = 0;
virtual int ioctl(FileDescription&, unsigned request, unsigned arg);
virtual KResultOr<Region*> mmap(Process&, FileDescription&, VirtualAddress preferred_vaddr, size_t offset, size_t size, int prot, bool shared);

View file

@ -130,7 +130,7 @@ ssize_t FileDescription::read(u8* buffer, ssize_t count)
if ((m_current_offset + count) < 0)
return -EOVERFLOW;
SmapDisabler disabler;
int nread = m_file->read(*this, buffer, count);
int nread = m_file->read(*this, offset(), buffer, count);
if (nread > 0 && m_file->is_seekable())
m_current_offset += nread;
return nread;
@ -142,7 +142,7 @@ ssize_t FileDescription::write(const u8* data, ssize_t size)
if ((m_current_offset + size) < 0)
return -EOVERFLOW;
SmapDisabler disabler;
int nwritten = m_file->write(*this, data, size);
int nwritten = m_file->write(*this, offset(), data, size);
if (nwritten > 0 && m_file->is_seekable())
m_current_offset += nwritten;
return nwritten;
@ -150,12 +150,12 @@ ssize_t FileDescription::write(const u8* data, ssize_t size)
bool FileDescription::can_write() const
{
return m_file->can_write(*this);
return m_file->can_write(*this, offset());
}
bool FileDescription::can_read() const
{
return m_file->can_read(*this);
return m_file->can_read(*this, offset());
}
ByteBuffer FileDescription::read_entire_file()

View file

@ -44,17 +44,17 @@ InodeFile::~InodeFile()
{
}
ssize_t InodeFile::read(FileDescription& description, u8* buffer, ssize_t count)
ssize_t InodeFile::read(FileDescription& description, size_t offset, u8* buffer, ssize_t count)
{
ssize_t nread = m_inode->read_bytes(description.offset(), count, buffer, &description);
ssize_t nread = m_inode->read_bytes(offset, count, buffer, &description);
if (nread > 0)
Thread::current->did_file_read(nread);
return nread;
}
ssize_t InodeFile::write(FileDescription& description, const u8* data, ssize_t count)
ssize_t InodeFile::write(FileDescription& description, size_t offset, const u8* data, ssize_t count)
{
ssize_t nwritten = m_inode->write_bytes(description.offset(), count, data, &description);
ssize_t nwritten = m_inode->write_bytes(offset, count, data, &description);
if (nwritten > 0) {
m_inode->set_mtime(kgettimeofday().tv_sec);
Thread::current->did_file_write(nwritten);

View file

@ -44,11 +44,11 @@ public:
const Inode& inode() const { return *m_inode; }
Inode& inode() { return *m_inode; }
virtual bool can_read(const FileDescription&) const override { return true; }
virtual bool can_write(const FileDescription&) const override { return true; }
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&, u8*, ssize_t) override;
virtual ssize_t write(FileDescription&, const u8*, ssize_t) 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<Region*> mmap(Process&, FileDescription&, VirtualAddress preferred_vaddr, size_t offset, size_t size, int prot, bool shared) override;
virtual String absolute_path(const FileDescription&) const override;

View file

@ -47,17 +47,17 @@ InodeWatcher::~InodeWatcher()
safe_inode->unregister_watcher({}, *this);
}
bool InodeWatcher::can_read(const FileDescription&) const
bool InodeWatcher::can_read(const FileDescription&, size_t) const
{
return !m_queue.is_empty() || !m_inode;
}
bool InodeWatcher::can_write(const FileDescription&) const
bool InodeWatcher::can_write(const FileDescription&, size_t) const
{
return true;
}
ssize_t InodeWatcher::read(FileDescription&, u8* buffer, ssize_t buffer_size)
ssize_t InodeWatcher::read(FileDescription&, size_t, u8* buffer, ssize_t buffer_size)
{
ASSERT(!m_queue.is_empty() || !m_inode);
@ -71,7 +71,7 @@ ssize_t InodeWatcher::read(FileDescription&, u8* buffer, ssize_t buffer_size)
return sizeof(event);
}
ssize_t InodeWatcher::write(FileDescription&, const u8*, ssize_t)
ssize_t InodeWatcher::write(FileDescription&, size_t, const u8*, ssize_t)
{
return -EIO;
}

View file

@ -49,10 +49,10 @@ public:
Type type { Type::Invalid };
};
virtual bool can_read(const FileDescription&) const override;
virtual bool can_write(const FileDescription&) const override;
virtual ssize_t read(FileDescription&, u8*, ssize_t) override;
virtual ssize_t write(FileDescription&, const u8*, ssize_t) override;
virtual bool can_read(const FileDescription&, size_t) const override;
virtual bool can_write(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 String absolute_path(const FileDescription&) const override;
virtual const char* class_name() const override { return "InodeWatcher"; };