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

Kernel: Add Device base class for CharacterDevice.

..to prepare for adding a BlockDevice class.
This commit is contained in:
Andreas Kling 2019-02-16 00:47:20 +01:00
parent c6ca6522fc
commit 994279d56c
11 changed files with 113 additions and 94 deletions

View file

@ -122,7 +122,7 @@ void VFS::traverse_directory_inode(Inode& dir_inode, Function<bool(const FS::Dir
});
}
RetainPtr<FileDescriptor> VFS::open(RetainPtr<CharacterDevice>&& device, int& error, int options)
RetainPtr<FileDescriptor> VFS::open(RetainPtr<Device>&& device, int& error, int options)
{
// FIXME: Respect options.
(void) options;
@ -146,9 +146,9 @@ RetainPtr<FileDescriptor> VFS::open(const String& path, int& error, int options,
return nullptr;
auto metadata = inode->metadata();
if (!(options & O_DONT_OPEN_DEVICE) && metadata.is_character_device()) {
auto it = m_character_devices.find(encoded_device(metadata.major_device, metadata.minor_device));
if (it == m_character_devices.end()) {
kprintf("VFS::open: no such character device %u,%u\n", metadata.major_device, metadata.minor_device);
auto it = m_devices.find(encoded_device(metadata.major_device, metadata.minor_device));
if (it == m_devices.end()) {
kprintf("VFS::open: no such device %u,%u\n", metadata.major_device, metadata.minor_device);
return nullptr;
}
auto descriptor = (*it).value->open(error, options);
@ -516,20 +516,20 @@ VFS::Mount::Mount(InodeIdentifier host, RetainPtr<FS>&& guest_fs)
{
}
void VFS::register_character_device(CharacterDevice& device)
void VFS::register_device(Device& device)
{
m_character_devices.set(encoded_device(device.major(), device.minor()), &device);
m_devices.set(encoded_device(device.major(), device.minor()), &device);
}
void VFS::unregister_character_device(CharacterDevice& device)
void VFS::unregister_device(Device& device)
{
m_character_devices.remove(encoded_device(device.major(), device.minor()));
m_devices.remove(encoded_device(device.major(), device.minor()));
}
CharacterDevice* VFS::get_device(unsigned major, unsigned minor)
Device* VFS::get_device(unsigned major, unsigned minor)
{
auto it = m_character_devices.find(encoded_device(major, minor));
if (it == m_character_devices.end())
auto it = m_devices.find(encoded_device(major, minor));
if (it == m_devices.end())
return nullptr;
return (*it).value;
}