| 1 |
/* ext2.h - Read-only ext2 filesystem driver for Pactor64 */ |
| 2 |
#ifndef _EXT2_H |
| 3 |
#define _EXT2_H |
| 4 |
|
| 5 |
#include "pactor64.h" |
| 6 |
|
| 7 |
/* ext2 magic number */ |
| 8 |
#define EXT2_SUPER_MAGIC 0xEF53 |
| 9 |
|
| 10 |
/* ext2 superblock (at byte offset 1024 from start of partition) */ |
| 11 |
typedef struct { |
| 12 |
uint32_t s_inodes_count; |
| 13 |
uint32_t s_blocks_count; |
| 14 |
uint32_t s_r_blocks_count; |
| 15 |
uint32_t s_free_blocks_count; |
| 16 |
uint32_t s_free_inodes_count; |
| 17 |
uint32_t s_first_data_block; |
| 18 |
uint32_t s_log_block_size; |
| 19 |
uint32_t s_log_frag_size; |
| 20 |
uint32_t s_blocks_per_group; |
| 21 |
uint32_t s_frags_per_group; |
| 22 |
uint32_t s_inodes_per_group; |
| 23 |
uint32_t s_mtime; |
| 24 |
uint32_t s_wtime; |
| 25 |
uint16_t s_mnt_count; |
| 26 |
uint16_t s_max_mnt_count; |
| 27 |
uint16_t s_magic; |
| 28 |
uint16_t s_state; |
| 29 |
uint16_t s_errors; |
| 30 |
uint16_t s_minor_rev_level; |
| 31 |
uint32_t s_lastcheck; |
| 32 |
uint32_t s_checkinterval; |
| 33 |
uint32_t s_creator_os; |
| 34 |
uint32_t s_rev_level; |
| 35 |
uint16_t s_def_resuid; |
| 36 |
uint16_t s_def_resgid; |
| 37 |
/* Extended fields (rev >= 1) */ |
| 38 |
uint32_t s_first_ino; |
| 39 |
uint16_t s_inode_size; |
| 40 |
uint16_t s_block_group_nr; |
| 41 |
uint32_t s_feature_compat; |
| 42 |
uint32_t s_feature_incompat; |
| 43 |
uint32_t s_feature_ro_compat; |
| 44 |
uint8_t s_uuid[16]; |
| 45 |
char s_volume_name[16]; |
| 46 |
char s_last_mounted[64]; |
| 47 |
uint32_t s_algo_usage_bitmap; |
| 48 |
} __attribute__((packed)) ext2_superblock_t; |
| 49 |
|
| 50 |
/* Block group descriptor */ |
| 51 |
typedef struct { |
| 52 |
uint32_t bg_block_bitmap; |
| 53 |
uint32_t bg_inode_bitmap; |
| 54 |
uint32_t bg_inode_table; |
| 55 |
uint16_t bg_free_blocks_count; |
| 56 |
uint16_t bg_free_inodes_count; |
| 57 |
uint16_t bg_used_dirs_count; |
| 58 |
uint16_t bg_pad; |
| 59 |
uint8_t bg_reserved[12]; |
| 60 |
} __attribute__((packed)) ext2_bgd_t; |
| 61 |
|
| 62 |
/* Inode */ |
| 63 |
typedef struct { |
| 64 |
uint16_t i_mode; |
| 65 |
uint16_t i_uid; |
| 66 |
uint32_t i_size; |
| 67 |
uint32_t i_atime; |
| 68 |
uint32_t i_ctime; |
| 69 |
uint32_t i_mtime; |
| 70 |
uint32_t i_dtime; |
| 71 |
uint16_t i_gid; |
| 72 |
uint16_t i_links_count; |
| 73 |
uint32_t i_blocks; |
| 74 |
uint32_t i_flags; |
| 75 |
uint32_t i_osd1; |
| 76 |
uint32_t i_block[15]; /* 0-11 direct, 12 indirect, 13 double, 14 triple */ |
| 77 |
uint32_t i_generation; |
| 78 |
uint32_t i_file_acl; |
| 79 |
uint32_t i_dir_acl; |
| 80 |
uint32_t i_faddr; |
| 81 |
uint8_t i_osd2[12]; |
| 82 |
} __attribute__((packed)) ext2_inode_t; |
| 83 |
|
| 84 |
/* Directory entry */ |
| 85 |
typedef struct { |
| 86 |
uint32_t inode; |
| 87 |
uint16_t rec_len; |
| 88 |
uint8_t name_len; |
| 89 |
uint8_t file_type; |
| 90 |
char name[]; |
| 91 |
} __attribute__((packed)) ext2_dirent_t; |
| 92 |
|
| 93 |
/* Directory entry file types */ |
| 94 |
#define EXT2_FT_UNKNOWN 0 |
| 95 |
#define EXT2_FT_REG_FILE 1 |
| 96 |
#define EXT2_FT_DIR 2 |
| 97 |
#define EXT2_FT_CHRDEV 3 |
| 98 |
#define EXT2_FT_BLKDEV 4 |
| 99 |
#define EXT2_FT_FIFO 5 |
| 100 |
#define EXT2_FT_SOCK 6 |
| 101 |
#define EXT2_FT_SYMLINK 7 |
| 102 |
|
| 103 |
/* Inode mode bits */ |
| 104 |
#define EXT2_S_IFREG 0x8000 |
| 105 |
#define EXT2_S_IFDIR 0x4000 |
| 106 |
#define EXT2_S_IFLNK 0xA000 |
| 107 |
|
| 108 |
/* Root inode */ |
| 109 |
#define EXT2_ROOT_INO 2 |
| 110 |
|
| 111 |
/* Maximum path component length */ |
| 112 |
#define EXT2_NAME_LEN 255 |
| 113 |
|
| 114 |
/* Block device read function type */ |
| 115 |
typedef int (*block_read_fn)(uint64_t lba, uint32_t count, void *buf); |
| 116 |
|
| 117 |
/* ext2 filesystem context */ |
| 118 |
typedef struct { |
| 119 |
block_read_fn read_block; |
| 120 |
ext2_superblock_t sb; |
| 121 |
ext2_bgd_t *bgdt; /* Block group descriptor table */ |
| 122 |
uint32_t block_size; |
| 123 |
uint32_t inodes_per_group; |
| 124 |
uint32_t inode_size; |
| 125 |
uint32_t groups_count; |
| 126 |
} ext2_fs_t; |
| 127 |
|
| 128 |
/* File handle */ |
| 129 |
typedef struct { |
| 130 |
ext2_fs_t *fs; |
| 131 |
ext2_inode_t inode; |
| 132 |
uint32_t inode_num; |
| 133 |
uint32_t size; |
| 134 |
uint32_t position; |
| 135 |
} ext2_file_t; |
| 136 |
|
| 137 |
/* Directory entry callback */ |
| 138 |
typedef void (*ext2_dirent_cb)(const char *name, uint8_t name_len, |
| 139 |
uint32_t inode, uint8_t file_type, void *ctx); |
| 140 |
|
| 141 |
/* Initialize ext2 filesystem from block device */ |
| 142 |
int ext2_init(ext2_fs_t *fs, block_read_fn read_fn); |
| 143 |
|
| 144 |
/* Open a file by path (returns 0 on success) */ |
| 145 |
int ext2_open(ext2_fs_t *fs, const char *path, ext2_file_t *file); |
| 146 |
|
| 147 |
/* Read from an open file */ |
| 148 |
int ext2_read(ext2_file_t *file, void *buf, uint32_t size); |
| 149 |
|
| 150 |
/* Close an open file */ |
| 151 |
void ext2_close(ext2_file_t *file); |
| 152 |
|
| 153 |
/* Read directory entries (callback-based) */ |
| 154 |
int ext2_readdir(ext2_fs_t *fs, uint32_t dir_inode, ext2_dirent_cb cb, void *ctx); |
| 155 |
|
| 156 |
/* Read a raw inode by number */ |
| 157 |
int ext2_read_inode(ext2_fs_t *fs, uint32_t inode_num, ext2_inode_t *inode); |
| 158 |
|
| 159 |
/* Mount ext2 from ATA disk at given partition LBA offset */ |
| 160 |
int ext2_mount(ext2_fs_t *fs, uint32_t part_lba); |
| 161 |
|
| 162 |
#endif /* _EXT2_H */ |
| 163 |
|