mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-27 23:09:08 +00:00
Add basic character device support. Start with null and zero.
This commit is contained in:
parent
fa3b11ac64
commit
93556d6743
Notes:
sideshowbarker
2024-07-19 18:48:27 +09:00
Author: https://github.com/awesomekling
Commit: 93556d6743
14 changed files with 157 additions and 2 deletions
|
@ -7,6 +7,11 @@
|
|||
|
||||
//#define VFS_DEBUG
|
||||
|
||||
static dword encodedDevice(unsigned major, unsigned minor)
|
||||
{
|
||||
return (minor & 0xff) | (major << 8) | ((minor & ~0xff) << 12);
|
||||
}
|
||||
|
||||
VirtualFileSystem::VirtualFileSystem()
|
||||
{
|
||||
m_maxNodeCount = 16;
|
||||
|
@ -28,6 +33,17 @@ auto VirtualFileSystem::makeNode(InodeIdentifier inode) -> RetainPtr<Node>
|
|||
if (!metadata.isValid())
|
||||
return nullptr;
|
||||
|
||||
CharacterDevice* characterDevice = nullptr;
|
||||
if (metadata.isCharacterDevice()) {
|
||||
auto it = m_characterDevices.find(encodedDevice(metadata.majorDevice, metadata.minorDevice));
|
||||
if (it != m_characterDevices.end()) {
|
||||
characterDevice = (*it).value;
|
||||
} else {
|
||||
printf("[VFS] makeNode() no such character device %u,%u\n", metadata.majorDevice, metadata.minorDevice);
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
auto vnode = allocateNode();
|
||||
ASSERT(vnode);
|
||||
|
||||
|
@ -41,6 +57,7 @@ auto VirtualFileSystem::makeNode(InodeIdentifier inode) -> RetainPtr<Node>
|
|||
#endif
|
||||
|
||||
m_inode2vnode.set(inode, vnode.ptr());
|
||||
vnode->m_characterDevice = characterDevice;
|
||||
return vnode;
|
||||
}
|
||||
|
||||
|
@ -118,6 +135,7 @@ void VirtualFileSystem::freeNode(Node* node)
|
|||
m_inode2vnode.remove(node->inode);
|
||||
node->inode.fileSystem()->release();
|
||||
node->inode = InodeIdentifier();
|
||||
node->m_characterDevice = nullptr;
|
||||
m_nodeFreeList.append(std::move(node));
|
||||
}
|
||||
|
||||
|
@ -415,3 +433,7 @@ VirtualFileSystem::Mount::Mount(InodeIdentifier host, RetainPtr<FileSystem>&& gu
|
|||
{
|
||||
}
|
||||
|
||||
void VirtualFileSystem::registerCharacterDevice(unsigned major, unsigned minor, CharacterDevice& device)
|
||||
{
|
||||
m_characterDevices.set(encodedDevice(major, minor), &device);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue