Add listing to EXT2
diff --git a/include/kernel/dri/fs/ext2/ext2.h b/include/kernel/dri/fs/ext2/ext2.h
index 4205c4b..0ffeaac 100644
--- a/include/kernel/dri/fs/ext2/ext2.h
+++ b/include/kernel/dri/fs/ext2/ext2.h
@@ -4,55 +4,79 @@
struct ext2_superblock
{
- // Total number of inodes
+ /// Total number of inodes
uint total_inodes;
- // Total number of blocks
+
+ /// Total number of blocks
uint total_blocks;
- // Number of blocks reserved for superuser
+
+ /// Number of blocks reserved for superuser
uint blocks_reserved_for_superuser;
- // Number of unallocated blocks
+
+ /// Number of unallocated blocks
uint unallocated_blocks;
- // Number of unallocated inodes
+
+ /// Number of unallocated inodes
uint unallocated_inodes;
- // Block number containing the superblock
+
+ /// Block number containing the superblock
uint superblock_block_number;
- // the number to shift 1024 to the left by to get the block size
+
+ /// the number to shift 1024 to the left by to get the block size
uint block_size_shift;
- // the number to shift 1024 to the left by to get the fragment size
+
+ /// the number to shift 1024 to the left by to get the fragment size
uint fragment_size_shift;
- // Number of blocks in one block group
+
+ /// Number of blocks in one block group
uint blocks_per_block_group;
- // Number of fragments in one block group
+
+ /// Number of fragments in one block group
uint fragments_per_block_group;
- // Number of inodse in one block group
+
+ /// Number of inodse in one block group
uint inodes_per_block_group;
- // UNIX time of last mount
+
+ /// UNIX time of last mount
uint last_mount_time;
- // UNIX time of last write
+
+ /// UNIX time of last write
uint last_write_time;
- // Number of mounts since last consistency check
+
+ /// Number of mounts since last consistency check
ushort mounts_since_last_fsck;
- // Number of mounts allowed between consistency checks
+
+ /// Number of mounts allowed between consistency checks
ushort mounts_allowed_before_fsck;
- // EXT2 signature, should be 0xef53
+
+ /// EXT2 signature, should be 0xef53
ushort signature;
- // File system state, see enum ext2_fs_state
+
+ /// File system state, see enum ext2_fs_state
ushort state;
- // What to do in case of an error, see enum ext2_error_case
+
+ /// What to do in case of an error, see enum ext2_error_case
ushort error_case;
- // Minor portion of version
+
+ /// Minor portion of version
ushort version_minor;
- // UNIX time of last consistency check
+
+ /// UNIX time of last consistency check
uint last_fsck_time;
- // Max time between consistency checks
+
+ /// Max time between consistency checks
uint fsck_time_interval;
- // Operating system ID of creator
+
+ /// Operating system ID of creator
uint creator_os_id;
- // Major portion of version
+
+ /// Major portion of version
uint version_major;
- // User ID that can use reserved blocks
+
+ /// User ID that can use reserved blocks
ushort reserved_blocks_uid;
- // Group ID that can use reserved blocks
+
+ /// Group ID that can use reserved blocks
ushort reserved_blocks_gid;
};
@@ -80,6 +104,177 @@
#define EXT2_SIGNATURE 0xef53
+struct ext2_block_group_descriptor
+{
+ /// Address of block usage bitmap
+ uint block_bitmap; // 4
+
+ /// Address of inode usage bitmap
+ uint inode_bitmap; // 8
+
+ /// Starting block address of inode table
+ uint inode_table_start_block; // 12
+
+ /// Number of unallocated blocks in this group
+ ushort unallocated_blocks; // 14
+
+ /// Number of unallocated inodes in this group
+ ushort unallocated_inodes; // 16
+
+ /// Number of directories in this group
+ ushort num_dirs; // 18
+
+ ushort padding;
+
+ uchar reserved[12]; // 32
+};
+
+struct ext2_inode
+{
+ /// The format and permissions of the file, see EXT2_S_*
+ ushort mode;
+
+ /// The user id of the owner
+ ushort uid;
+
+ /// The lower 32 bits of the file size
+ uint size;
+
+ /// Last time this was accessed in UNIX time
+ uint access_time;
+
+ /// Time this was created in UNIX time
+ uint created_time;
+
+ /// Time this was last modified in UNIX time
+ uint modified_time;
+
+ /// Time this was deleted in UNIX time
+ uint deleted_time;
+
+ /// Owner group id
+ ushort gid;
+
+ /// Reference count for hard links
+ ushort links_count;
+
+ /// Number of 512 byte blocks storing this files data, NOT EXT2 blocks!
+ uint num_blocks;
+
+ /// Flags describing how this file can be accessed
+ uint flags;
+
+ /// First field reserved for the operating system
+ uint os_reserved_1;
+
+ union
+ {
+ /// The blocks of this file
+ uint blocks[15];
+
+ struct
+ {
+ /// The direct blocks
+ uint direct_blocks[12];
+
+ /// The single indirect block
+ uint ind_block;
+
+ /// The double indirect block
+ uint ind2_block;
+
+ /// The triple indirect block
+ uint ind3_block;
+ };
+ };
+
+ /// Used by NFS to version files
+ uint generation;
+
+ /// File attributes, unused
+ uint file_acl;
+
+ /// Directory attributes, unused
+ uint dir_acl;
+
+ /// Location of file fragment, unused
+ uint faddr;
+
+ /// Second field reserved for the operating system
+ uchar os_reserved_2[12];
+};
+
+enum
+{
+ // File types
+ EXT2_S_IFSOCK = 0xc000,
+ EXT2_S_IFLINK = 0xa000,
+ EXT2_S_IFREG = 0x8000,
+ EXT2_S_IFBLK = 0x6000,
+ EXT2_S_IFDIR = 0x4000,
+ EXT2_S_IFCHR = 0x2000,
+ EXT2_S_IFIFO = 0x1000,
+
+ /// Set UID
+ EXT2_S_ISUID = 0x0800,
+ /// Set GUID
+ EXT2_S_ISGID = 0x0400,
+ /// Sticky
+ EXT2_S_ISVTX = 0x0200,
+
+ // Normal UNIX file permissions
+ EXT2_S_IRUSR = 0x0100,
+ EXT2_S_IWUSR = 0x0080,
+ EXT2_S_IXUSR = 0x0040,
+ EXT2_S_IRGRP = 0x0020,
+ EXT2_S_IWGRP = 0x0010,
+ EXT2_S_IXGRP = 0x0008,
+ EXT2_S_IROTH = 0x0004,
+ EXT2_S_IWOTH = 0x0002,
+ EXT2_S_IXOTH = 0x0001,
+};
+
+struct ext2_dirent
+{
+ uint inode;
+ ushort rec_len;
+ uchar name_len;
+ uchar file_type;
+ char name[];
+};
+
+/// Read a file system block (0-indexed), if necessary multiple disk blocks
+/// will be read automatically
+void ext2_read_block(struct ext2_superblock *sb, void *buffer, uint block);
+
struct ext2_superblock ext2_read_superblock();
+
+void ext2_write_superblock(struct ext2_superblock *sb);
+
+// Just for fun, corrupt the superblock (obviously don't actually do this)
+void ext2_corrupt_superblock_for_fun();
+
void ext2_mount(struct fs_node *where);
+
bool ext2_valid_filesystem();
+
+bool ext2_find_inode(struct ext2_superblock *sb, uint number, struct ext2_inode *inode);
+
+/// Load a block group descriptor for a certain block group
+struct ext2_block_group_descriptor ext2_load_block_group_descriptor(
+ struct ext2_superblock *sb, uint block_group);
+
+/// List the contents of a directory dir. Calls `cb` for each item. If `dir` is
+/// not a directory, returns false. Otherwise returns true.
+bool ext2_dir_ls(struct ext2_superblock *sb,
+ struct ext2_inode *dir,
+ void (*cb)(uint inode,
+ const char *name,
+ void *data),
+ void *data);
+
+/// Read a data block for the inode, 0 being the first block of the file.
+bool ext2_read_inode_block(struct ext2_superblock *sb,
+ struct ext2_inode *inode,
+ void *buffer,
+ uint block);
diff --git a/include/kernel/log.h b/include/kernel/log.h
index 3365474..a4ae42b 100644
--- a/include/kernel/log.h
+++ b/include/kernel/log.h
@@ -5,6 +5,7 @@
#define RESET "\033[0m"
#define INFO "[\033[96m INFO " RESET "] "
#define OKAY "[\033[92m OK " RESET "] "
+#define WARN "[\033[93m WARN " RESET "] "
#define ERROR "[\033[91m ERROR " RESET "] "
#define DEBUG "[\033[93m DEBUG " RESET "] "