mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 05:17:35 +00:00
Kernel: Have File virtuals take a FileDescriptor& rather than a Process&.
This will allow us to implement different behaviors depending on the role of the descriptor a File is being accessed through.
This commit is contained in:
parent
3761bc3ed7
commit
8cbb7f101f
39 changed files with 156 additions and 155 deletions
|
@ -103,7 +103,7 @@ KResultOr<Region*> BXVGADevice::mmap(Process& process, LinearAddress preferred_l
|
|||
return region;
|
||||
}
|
||||
|
||||
int BXVGADevice::ioctl(Process& process, unsigned request, unsigned arg)
|
||||
int BXVGADevice::ioctl(FileDescriptor&, unsigned request, unsigned arg)
|
||||
{
|
||||
switch (request) {
|
||||
case BXVGA_DEV_IOCTL_SET_Y_OFFSET:
|
||||
|
@ -113,7 +113,7 @@ int BXVGADevice::ioctl(Process& process, unsigned request, unsigned arg)
|
|||
return 0;
|
||||
case BXVGA_DEV_IOCTL_SET_RESOLUTION: {
|
||||
auto* resolution = (const BXVGAResolution*)arg;
|
||||
if (!process.validate_read_typed(resolution))
|
||||
if (!current->process().validate_read_typed(resolution))
|
||||
return -EFAULT;
|
||||
set_resolution(resolution->width, resolution->height);
|
||||
return 0;
|
||||
|
@ -123,22 +123,22 @@ int BXVGADevice::ioctl(Process& process, unsigned request, unsigned arg)
|
|||
};
|
||||
}
|
||||
|
||||
bool BXVGADevice::can_read(Process&) const
|
||||
bool BXVGADevice::can_read(FileDescriptor&) const
|
||||
{
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
bool BXVGADevice::can_write(Process&) const
|
||||
bool BXVGADevice::can_write(FileDescriptor&) const
|
||||
{
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
ssize_t BXVGADevice::read(Process&, byte*, ssize_t)
|
||||
ssize_t BXVGADevice::read(FileDescriptor&, byte*, ssize_t)
|
||||
{
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
ssize_t BXVGADevice::write(Process&, const byte*, ssize_t)
|
||||
ssize_t BXVGADevice::write(FileDescriptor&, const byte*, ssize_t)
|
||||
{
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@ public:
|
|||
void set_resolution(int width, int height);
|
||||
void set_y_offset(int);
|
||||
|
||||
virtual int ioctl(Process&, unsigned request, unsigned arg) override;
|
||||
virtual int ioctl(FileDescriptor&, unsigned request, unsigned arg) override;
|
||||
virtual KResultOr<Region*> mmap(Process&, LinearAddress preferred_laddr, size_t offset, size_t) override;
|
||||
|
||||
size_t framebuffer_size_in_bytes() const { return m_framebuffer_size.area() * sizeof(dword) * 2; }
|
||||
|
@ -25,10 +25,10 @@ public:
|
|||
|
||||
private:
|
||||
virtual const char* class_name() const override { return "BXVGA"; }
|
||||
virtual bool can_read(Process&) const override;
|
||||
virtual bool can_write(Process&) const override;
|
||||
virtual ssize_t read(Process&, byte*, ssize_t) override;
|
||||
virtual ssize_t write(Process&, const byte*, ssize_t) override;
|
||||
virtual bool can_read(FileDescriptor&) const override;
|
||||
virtual bool can_write(FileDescriptor&) const override;
|
||||
virtual ssize_t read(FileDescriptor&, byte*, ssize_t) override;
|
||||
virtual ssize_t write(FileDescriptor&, const byte*, ssize_t) override;
|
||||
|
||||
void set_register(word index, word value);
|
||||
dword find_framebuffer_address();
|
||||
|
|
|
@ -19,7 +19,7 @@ DebugLogDevice::~DebugLogDevice()
|
|||
{
|
||||
}
|
||||
|
||||
ssize_t DebugLogDevice::write(Process&, const byte* data, ssize_t data_size)
|
||||
ssize_t DebugLogDevice::write(FileDescriptor&, const byte* data, ssize_t data_size)
|
||||
{
|
||||
for (int i = 0; i < data_size; ++i)
|
||||
IO::out8(0xe9, data[i]);
|
||||
|
|
|
@ -9,9 +9,9 @@ public:
|
|||
|
||||
private:
|
||||
// ^CharacterDevice
|
||||
virtual ssize_t read(Process&, byte*, ssize_t) override { return 0; }
|
||||
virtual ssize_t write(Process&, const byte*, ssize_t) override;
|
||||
virtual bool can_write(Process&) const override { return true; }
|
||||
virtual bool can_read(Process&) const override { return true; }
|
||||
virtual ssize_t read(FileDescriptor&, byte*, ssize_t) override { return 0; }
|
||||
virtual ssize_t write(FileDescriptor&, const byte*, ssize_t) override;
|
||||
virtual bool can_write(FileDescriptor&) const override { return true; }
|
||||
virtual bool can_read(FileDescriptor&) const override { return true; }
|
||||
virtual const char* class_name() const override { return "DebugLogDevice"; }
|
||||
};
|
||||
|
|
|
@ -12,19 +12,19 @@ FullDevice::~FullDevice()
|
|||
{
|
||||
}
|
||||
|
||||
bool FullDevice::can_read(Process&) const
|
||||
bool FullDevice::can_read(FileDescriptor&) const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
ssize_t FullDevice::read(Process&, byte* buffer, ssize_t size)
|
||||
ssize_t FullDevice::read(FileDescriptor&, byte* buffer, ssize_t size)
|
||||
{
|
||||
ssize_t count = min(PAGE_SIZE, size);
|
||||
memset(buffer, 0, (size_t)count);
|
||||
return count;
|
||||
}
|
||||
|
||||
ssize_t FullDevice::write(Process&, const byte*, ssize_t size)
|
||||
ssize_t FullDevice::write(FileDescriptor&, const byte*, ssize_t size)
|
||||
{
|
||||
if (size == 0)
|
||||
return 0;
|
||||
|
|
|
@ -10,10 +10,10 @@ public:
|
|||
|
||||
private:
|
||||
// ^CharacterDevice
|
||||
virtual ssize_t read(Process&, byte*, ssize_t) override;
|
||||
virtual ssize_t write(Process&, const byte*, ssize_t) override;
|
||||
virtual bool can_read(Process&) const override;
|
||||
virtual bool can_write(Process&) const override { return true; }
|
||||
virtual ssize_t read(FileDescriptor&, byte*, ssize_t) override;
|
||||
virtual ssize_t write(FileDescriptor&, const byte*, ssize_t) override;
|
||||
virtual bool can_read(FileDescriptor&) const override;
|
||||
virtual bool can_write(FileDescriptor&) const override { return true; }
|
||||
virtual const char* class_name() const override { return "FullDevice"; }
|
||||
};
|
||||
|
||||
|
|
|
@ -208,12 +208,12 @@ KeyboardDevice::~KeyboardDevice()
|
|||
{
|
||||
}
|
||||
|
||||
bool KeyboardDevice::can_read(Process&) const
|
||||
bool KeyboardDevice::can_read(FileDescriptor&) const
|
||||
{
|
||||
return !m_queue.is_empty();
|
||||
}
|
||||
|
||||
ssize_t KeyboardDevice::read(Process&, byte* buffer, ssize_t size)
|
||||
ssize_t KeyboardDevice::read(FileDescriptor&, byte* buffer, ssize_t size)
|
||||
{
|
||||
ssize_t nread = 0;
|
||||
while (nread < size) {
|
||||
|
@ -229,7 +229,7 @@ ssize_t KeyboardDevice::read(Process&, byte* buffer, ssize_t size)
|
|||
return nread;
|
||||
}
|
||||
|
||||
ssize_t KeyboardDevice::write(Process&, const byte*, ssize_t)
|
||||
ssize_t KeyboardDevice::write(FileDescriptor&, const byte*, ssize_t)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -22,10 +22,10 @@ public:
|
|||
void set_client(KeyboardClient* client) { m_client = client; }
|
||||
|
||||
// ^CharacterDevice
|
||||
virtual ssize_t read(Process&, byte* buffer, ssize_t) override;
|
||||
virtual bool can_read(Process&) const override;
|
||||
virtual ssize_t write(Process&, const byte* buffer, ssize_t) override;
|
||||
virtual bool can_write(Process&) const override { return true; }
|
||||
virtual ssize_t read(FileDescriptor&, byte* buffer, ssize_t) override;
|
||||
virtual bool can_read(FileDescriptor&) const override;
|
||||
virtual ssize_t write(FileDescriptor&, const byte* buffer, ssize_t) override;
|
||||
virtual bool can_write(FileDescriptor&) const override { return true; }
|
||||
|
||||
private:
|
||||
// ^IRQHandler
|
||||
|
|
|
@ -20,17 +20,17 @@ NullDevice::~NullDevice()
|
|||
{
|
||||
}
|
||||
|
||||
bool NullDevice::can_read(Process&) const
|
||||
bool NullDevice::can_read(FileDescriptor&) const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
ssize_t NullDevice::read(Process&, byte*, ssize_t)
|
||||
ssize_t NullDevice::read(FileDescriptor&, byte*, ssize_t)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
ssize_t NullDevice::write(Process&, const byte*, ssize_t buffer_size)
|
||||
ssize_t NullDevice::write(FileDescriptor&, const byte*, ssize_t buffer_size)
|
||||
{
|
||||
return min(PAGE_SIZE, buffer_size);
|
||||
}
|
||||
|
|
|
@ -12,10 +12,10 @@ public:
|
|||
|
||||
private:
|
||||
// ^CharacterDevice
|
||||
virtual ssize_t read(Process&, byte*, ssize_t) override;
|
||||
virtual ssize_t write(Process&, const byte*, ssize_t) override;
|
||||
virtual bool can_write(Process&) const override { return true; }
|
||||
virtual bool can_read(Process&) const override;
|
||||
virtual ssize_t read(FileDescriptor&, byte*, ssize_t) override;
|
||||
virtual ssize_t write(FileDescriptor&, const byte*, ssize_t) override;
|
||||
virtual bool can_write(FileDescriptor&) const override { return true; }
|
||||
virtual bool can_read(FileDescriptor&) const override;
|
||||
virtual const char* class_name() const override { return "NullDevice"; }
|
||||
};
|
||||
|
||||
|
|
|
@ -160,12 +160,12 @@ byte PS2MouseDevice::mouse_read()
|
|||
return IO::in8(0x60);
|
||||
}
|
||||
|
||||
bool PS2MouseDevice::can_read(Process&) const
|
||||
bool PS2MouseDevice::can_read(FileDescriptor&) const
|
||||
{
|
||||
return !m_queue.is_empty();
|
||||
}
|
||||
|
||||
ssize_t PS2MouseDevice::read(Process&, byte* buffer, ssize_t size)
|
||||
ssize_t PS2MouseDevice::read(FileDescriptor&, byte* buffer, ssize_t size)
|
||||
{
|
||||
ssize_t nread = 0;
|
||||
while (nread < size) {
|
||||
|
@ -181,7 +181,7 @@ ssize_t PS2MouseDevice::read(Process&, byte* buffer, ssize_t size)
|
|||
return nread;
|
||||
}
|
||||
|
||||
ssize_t PS2MouseDevice::write(Process&, const byte*, ssize_t)
|
||||
ssize_t PS2MouseDevice::write(FileDescriptor&, const byte*, ssize_t)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -13,10 +13,10 @@ public:
|
|||
static PS2MouseDevice& the();
|
||||
|
||||
// ^CharacterDevice
|
||||
virtual bool can_read(Process&) const override;
|
||||
virtual ssize_t read(Process&, byte*, ssize_t) override;
|
||||
virtual ssize_t write(Process&, const byte*, ssize_t) override;
|
||||
virtual bool can_write(Process&) const override { return true; }
|
||||
virtual bool can_read(FileDescriptor&) const override;
|
||||
virtual ssize_t read(FileDescriptor&, byte*, ssize_t) override;
|
||||
virtual ssize_t write(FileDescriptor&, const byte*, ssize_t) override;
|
||||
virtual bool can_write(FileDescriptor&) const override { return true; }
|
||||
|
||||
private:
|
||||
// ^IRQHandler
|
||||
|
|
|
@ -26,12 +26,12 @@ static void mysrand(unsigned seed)
|
|||
}
|
||||
#endif
|
||||
|
||||
bool RandomDevice::can_read(Process&) const
|
||||
bool RandomDevice::can_read(FileDescriptor&) const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
ssize_t RandomDevice::read(Process&, byte* buffer, ssize_t size)
|
||||
ssize_t RandomDevice::read(FileDescriptor&, byte* buffer, ssize_t size)
|
||||
{
|
||||
const int range = 'z' - 'a';
|
||||
ssize_t nread = min(size, PAGE_SIZE);
|
||||
|
@ -42,7 +42,7 @@ ssize_t RandomDevice::read(Process&, byte* buffer, ssize_t size)
|
|||
return nread;
|
||||
}
|
||||
|
||||
ssize_t RandomDevice::write(Process&, const byte*, ssize_t size)
|
||||
ssize_t RandomDevice::write(FileDescriptor&, const byte*, ssize_t size)
|
||||
{
|
||||
// FIXME: Use input for entropy? I guess that could be a neat feature?
|
||||
return min(PAGE_SIZE, size);
|
||||
|
|
|
@ -12,10 +12,10 @@ public:
|
|||
|
||||
private:
|
||||
// ^CharacterDevice
|
||||
virtual ssize_t read(Process&, byte*, ssize_t) override;
|
||||
virtual ssize_t write(Process&, const byte*, ssize_t) override;
|
||||
virtual bool can_read(Process&) const override;
|
||||
virtual bool can_write(Process&) const override { return true; }
|
||||
virtual ssize_t read(FileDescriptor&, byte*, ssize_t) override;
|
||||
virtual ssize_t write(FileDescriptor&, const byte*, ssize_t) override;
|
||||
virtual bool can_read(FileDescriptor&) const override;
|
||||
virtual bool can_write(FileDescriptor&) const override { return true; }
|
||||
virtual const char* class_name() const override { return "RandomDevice"; }
|
||||
};
|
||||
|
||||
|
|
|
@ -11,19 +11,19 @@ ZeroDevice::~ZeroDevice()
|
|||
{
|
||||
}
|
||||
|
||||
bool ZeroDevice::can_read(Process&) const
|
||||
bool ZeroDevice::can_read(FileDescriptor&) const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
ssize_t ZeroDevice::read(Process&, byte* buffer, ssize_t size)
|
||||
ssize_t ZeroDevice::read(FileDescriptor&, byte* buffer, ssize_t size)
|
||||
{
|
||||
ssize_t count = min(PAGE_SIZE, size);
|
||||
memset(buffer, 0, (size_t)count);
|
||||
return count;
|
||||
}
|
||||
|
||||
ssize_t ZeroDevice::write(Process&, const byte*, ssize_t size)
|
||||
ssize_t ZeroDevice::write(FileDescriptor&, const byte*, ssize_t size)
|
||||
{
|
||||
return min(PAGE_SIZE, size);
|
||||
}
|
||||
|
|
|
@ -10,10 +10,10 @@ public:
|
|||
|
||||
private:
|
||||
// ^CharacterDevice
|
||||
virtual ssize_t read(Process&, byte*, ssize_t) override;
|
||||
virtual ssize_t write(Process&, const byte*, ssize_t) override;
|
||||
virtual bool can_read(Process&) const override;
|
||||
virtual bool can_write(Process&) const override { return true; }
|
||||
virtual ssize_t read(FileDescriptor&, byte*, ssize_t) override;
|
||||
virtual ssize_t write(FileDescriptor&, const byte*, ssize_t) override;
|
||||
virtual bool can_read(FileDescriptor&) const override;
|
||||
virtual bool can_write(FileDescriptor&) const override { return true; }
|
||||
virtual const char* class_name() const override { return "ZeroDevice"; }
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue