4 * \brief EXT2 Filesystem Driver
\r
10 \name Inode Flag Values
\r
13 #define EXT2_S_IFMT 0xF000 //!< Format Mask
\r
14 #define EXT2_S_IFSOCK 0xC000 //!< Socket
\r
15 #define EXT2_S_IFLNK 0xA000 //!< Symbolic Link
\r
16 #define EXT2_S_IFREG 0x8000 //!< Regular File
\r
17 #define EXT2_S_IFBLK 0x6000 //!< Block Device
\r
18 #define EXT2_S_IFDIR 0x4000 //!< Directory
\r
19 #define EXT2_S_IFCHR 0x2000 //!< Character Device
\r
20 #define EXT2_S_IFIFO 0x1000 //!< FIFO
\r
21 #define EXT2_S_ISUID 0x0800 //!< SUID
\r
22 #define EXT2_S_ISGID 0x0400 //!< SGID
\r
23 #define EXT2_S_ISVTX 0x0200 //!< sticky bit
\r
24 #define EXT2_S_IRWXU 0700 //!< user access rights mask
\r
25 #define EXT2_S_IRUSR 0400 //!< Owner Read
\r
26 #define EXT2_S_IWUSR 0200 //!< Owner Write
\r
27 #define EXT2_S_IXUSR 0100 //!< Owner Execute
\r
28 #define EXT2_S_IRWXG 0070 //!< Group Access rights mask
\r
29 #define EXT2_S_IRGRP 0040 //!< Group Read
\r
30 #define EXT2_S_IWGRP 0020 //!< Group Write
\r
31 #define EXT2_S_IXGRP 0010 //!< Group Execute
\r
32 #define EXT2_S_IRWXO 0007 //!< Global Access rights mask
\r
33 #define EXT2_S_IROTH 0004 //!< Global Read
\r
34 #define EXT2_S_IWOTH 0002 //!< Global Write
\r
35 #define EXT2_S_IXOTH 0001 //!< Global Execute
\r
38 #define EXT2_NAME_LEN 255 //!< Maximum Name Length
\r
41 typedef struct ext2_inode_s tExt2_Inode; //!< Inode Type
\r
42 typedef struct ext2_super_block_s tExt2_SuperBlock; //!< Superblock Type
\r
43 typedef struct ext2_group_desc_s tExt2_Group; //!< Group Descriptor Type
\r
44 typedef struct ext2_dir_entry_s tExt2_DirEnt; //!< Directory Entry Type
\r
46 // === STRUCTURES ===
\r
48 * \brief EXT2 Superblock Structure
\r
50 struct ext2_super_block_s {
\r
51 Uint32 s_inodes_count; //!< Inodes count
\r
52 Uint32 s_blocks_count; //!< Blocks count
\r
53 Uint32 s_r_blocks_count; //!< Reserved blocks count
\r
54 Uint32 s_free_blocks_count; //!< Free blocks count
\r
56 Uint32 s_free_inodes_count; //!< Free inodes count
\r
57 Uint32 s_first_data_block; //!< First Data Block
\r
58 Uint32 s_log_block_size; //!< Block size
\r
59 Sint32 s_log_frag_size; //!< Fragment size
\r
61 Uint32 s_blocks_per_group; //!< Number Blocks per group
\r
62 Uint32 s_frags_per_group; //!< Number Fragments per group
\r
63 Uint32 s_inodes_per_group; //!< Number Inodes per group
\r
64 Uint32 s_mtime; //!< Mount time
\r
66 Uint32 s_wtime; //!< Write time
\r
67 Uint16 s_mnt_count; //!< Mount count
\r
68 Sint16 s_max_mnt_count; //!< Maximal mount count
\r
69 Uint16 s_magic; //!< Magic signature
\r
70 Uint16 s_state; //!< File system state
\r
71 Uint16 s_errors; //!< Behaviour when detecting errors
\r
72 Uint16 s_pad; //!< Padding
\r
74 Uint32 s_lastcheck; //!< time of last check
\r
75 Uint32 s_checkinterval; //!< max. time between checks
\r
76 Uint32 s_creator_os; //!< Formatting OS
\r
77 Uint32 s_rev_level; //!< Revision level
\r
79 Uint16 s_def_resuid; //!< Default uid for reserved blocks
\r
80 Uint16 s_def_resgid; //!< Default gid for reserved blocks
\r
81 Uint32 s_reserved[235]; //!< Padding to the end of the block
\r
85 * \struct ext2_inode_s
\r
86 * \brief EXT2 Inode Definition
\r
88 struct ext2_inode_s {
\r
89 Uint16 i_mode; //!< File mode
\r
90 Uint16 i_uid; //!< Owner Uid
\r
91 Uint32 i_size; //!< Size in bytes
\r
92 Uint32 i_atime; //!< Access time
\r
93 Uint32 i_ctime; //!< Creation time
\r
94 Uint32 i_mtime; //!< Modification time
\r
95 Uint32 i_dtime; //!< Deletion Time
\r
96 Uint16 i_gid; //!< Group Id
\r
97 Uint16 i_links_count; //!< Links count
\r
98 Uint32 i_blocks; //!< Number of blocks allocated for the file
\r
99 Uint32 i_flags; //!< File flags
\r
101 Uint32 linux_reserved1; //!< Linux: Reserved
\r
102 Uint32 hurd_translator; //!< HURD: Translator
\r
103 Uint32 masix_reserved1; //!< Masix: Reserved
\r
104 } osd1; //!< OS dependent 1
\r
105 Uint32 i_block[15]; //!< Pointers to blocks
\r
106 Uint32 i_version; //!< File version (for NFS)
\r
107 Uint32 i_file_acl; //!< File ACL
\r
108 Uint32 i_dir_acl; //!< Directory ACL / Extended File Size
\r
109 Uint32 i_faddr; //!< Fragment address
\r
112 Uint8 l_i_frag; //!< Fragment number
\r
113 Uint8 l_i_fsize; //!< Fragment size
\r
114 Uint16 i_pad1; //!< Padding
\r
115 Uint32 l_i_reserved2[2]; //!< Reserved
\r
118 Uint8 h_i_frag; //!< Fragment number
\r
119 Uint8 h_i_fsize; //!< Fragment size
\r
120 Uint16 h_i_mode_high; //!< Mode High Bits
\r
121 Uint16 h_i_uid_high; //!< UID High Bits
\r
122 Uint16 h_i_gid_high; //!< GID High Bits
\r
123 Uint32 h_i_author; //!< Creator ID
\r
126 Uint8 m_i_frag; //!< Fragment number
\r
127 Uint8 m_i_fsize; //!< Fragment size
\r
128 Uint16 m_pad1; //!< Padding
\r
129 Uint32 m_i_reserved2[2]; //!< reserved
\r
131 } osd2; //!< OS dependent 2
\r
135 * \struct ext2_group_desc_s
\r
136 * \brief EXT2 Group Descriptor
\r
138 struct ext2_group_desc_s {
\r
139 Uint32 bg_block_bitmap; //!< Blocks bitmap block
\r
140 Uint32 bg_inode_bitmap; //!< Inodes bitmap block
\r
141 Uint32 bg_inode_table; //!< Inodes table block
\r
142 Uint16 bg_free_blocks_count; //!< Free blocks count
\r
143 Uint16 bg_free_inodes_count; //!< Free inodes count
\r
144 Uint16 bg_used_dirs_count; //!< Directories count
\r
145 Uint16 bg_pad; //!< Padding
\r
146 Uint32 bg_reserved[3]; //!< Reserved
\r
150 * \brief EXT2 Directory Entry
\r
151 * \note The name may take up less than 255 characters
\r
153 struct ext2_dir_entry_s {
\r
154 Uint32 inode; //!< Inode number
\r
155 Uint16 rec_len; //!< Directory entry length
\r
156 Uint8 name_len; //!< Short Name Length
\r
157 Uint8 type; //!< File Type (Duplicate of ext2_inode_s.i_mode)
\r
158 char name[EXT2_NAME_LEN+1]; //!< File name
\r
160 #define EXT2_DIRENT_SIZE (sizeof(struct ext2_dir_entry_s)-EXT2_NAME_LEN+1)
\r