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:
parent
68c7ca7d3b
commit
a3edeb5868
45 changed files with 199 additions and 183 deletions
|
@ -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);
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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"; };
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue