ext2.h

Commit: cf5aa961 Author: jokerz Raw Copy
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