diff --git a/VirtualFileSystem/Ext2FileSystem.cpp b/VirtualFileSystem/Ext2FileSystem.cpp index f8fb4f1732..0c5e7c08ae 100644 --- a/VirtualFileSystem/Ext2FileSystem.cpp +++ b/VirtualFileSystem/Ext2FileSystem.cpp @@ -186,6 +186,12 @@ InodeMetadata Ext2FileSystem::inodeMetadata(InodeIdentifier inode) const metadata.ctime = e2inode->i_ctime; metadata.mtime = e2inode->i_mtime; metadata.dtime = e2inode->i_dtime; + + if (isBlockDevice(e2inode->i_mode) || isCharacterDevice(e2inode->i_mode)) { + unsigned dev = e2inode->i_block[0]; + metadata.majorDevice = (dev & 0xfff00) >> 8; + metadata.minorDevice= (dev & 0xff) | ((dev >> 12) & 0xfff00); + } return metadata; } diff --git a/VirtualFileSystem/InodeMetadata.h b/VirtualFileSystem/InodeMetadata.h index 4bbf95483a..4d164254ac 100644 --- a/VirtualFileSystem/InodeMetadata.h +++ b/VirtualFileSystem/InodeMetadata.h @@ -37,6 +37,8 @@ struct InodeMetadata { time_t ctime { 0 }; time_t mtime { 0 }; time_t dtime { 0 }; + unsigned majorDevice { 0 }; + unsigned minorDevice { 0 }; }; diff --git a/VirtualFileSystem/Makefile b/VirtualFileSystem/Makefile index dab96e0a2c..06feb36de0 100644 --- a/VirtualFileSystem/Makefile +++ b/VirtualFileSystem/Makefile @@ -18,6 +18,8 @@ VFS_OBJS = \ DeviceBackedFileSystem.o \ SyntheticFileSystem.o \ InodeIdentifier.o \ + CharacterDevice.o \ + ZeroDevice.o \ test.o OBJS = $(AK_OBJS) $(VFS_OBJS) diff --git a/VirtualFileSystem/VirtualFileSystem.cpp b/VirtualFileSystem/VirtualFileSystem.cpp index c8302028f2..293a3884c8 100644 --- a/VirtualFileSystem/VirtualFileSystem.cpp +++ b/VirtualFileSystem/VirtualFileSystem.cpp @@ -199,6 +199,10 @@ void VirtualFileSystem::listDirectory(const String& path) nameColorBegin = "\033[42;30m"; nameColorEnd = "\033[0m"; } + if (metadata.isCharacterDevice() || metadata.isBlockDevice()) { + nameColorBegin = "\033[33;1m"; + nameColorEnd = "\033[0m"; + } printf("%02u:%08u ", metadata.inode.fileSystemID(), metadata.inode.index()); @@ -236,7 +240,13 @@ void VirtualFileSystem::listDirectory(const String& path) else printf("%c", metadata.mode & 00001 ? 'x' : '-'); - printf("%12u ", metadata.size); + if (metadata.isCharacterDevice() || metadata.isBlockDevice()) { + char buf[16]; + sprintf(buf, "%u, %u", metadata.majorDevice, metadata.minorDevice); + printf("%12s ", buf); + } else { + printf("%12u ", metadata.size); + } printf("\033[30;1m"); auto tm = *localtime(&metadata.mtime);