ext2.h (4324B)
1 typedef struct Super Super; 2 typedef struct Group Group; 3 typedef struct Inode Inode; 4 typedef struct Dirent Dirent; 5 typedef struct Ext2 Ext2; 6 7 enum 8 { 9 BYTESPERSEC = 512, 10 11 SBOFF = 1024, 12 SBSIZE = 1024, 13 14 SUPERMAGIC = 0xEF53, 15 MINBLOCKSIZE = 1024, 16 MAXBLOCKSIZE = 4096, 17 ROOTINODE = 2, 18 FIRSTINODE = 11, 19 VALIDFS = 0x0001, 20 ERRORFS = 0x0002, 21 22 NDIRBLOCKS = 12, 23 INDBLOCK = NDIRBLOCKS, 24 DINDBLOCK = INDBLOCK+1, 25 TINDBLOCK = DINDBLOCK+1, 26 NBLOCKS = TINDBLOCK+1, 27 28 NAMELEN = 255, 29 30 /* some systems have these defined */ 31 #undef IEXEC 32 #undef IWRITE 33 #undef IREAD 34 #undef ISVTX 35 #undef ISGID 36 #undef ISUID 37 #undef IFMT 38 #undef IFIFO 39 #undef IFCHR 40 #undef IFDIR 41 #undef IFBLK 42 #undef IFREG 43 #undef IFLNK 44 #undef IFSOCK 45 #undef IFWHT 46 47 #define IEXEC EXT2_IEXEC 48 #define IWRITE EXT2_IWRITE 49 #define IREAD EXT2_IREAD 50 #define ISVTX EXT2_ISVTX 51 #define ISGID EXT2_ISGID 52 #define ISUID EXT2_ISUID 53 #define IFMT EXT2_IFMT 54 #define IFIFO EXT2_IFIFO 55 #define IFCHR EXT2_IFCHR 56 #define IFDIR EXT2_IFDIR 57 #define IFBLK EXT2_IFBLK 58 #define IFREG EXT2_IFREG 59 #define IFLNK EXT2_IFLNK 60 #define IFSOCK EXT2_IFSOCK 61 #define IFWHT EXT2_IFWHT 62 63 /* permissions in Inode.mode */ 64 IEXEC = 00100, 65 IWRITE = 0200, 66 IREAD = 0400, 67 ISVTX = 01000, 68 ISGID = 02000, 69 ISUID = 04000, 70 71 /* type in Inode.mode */ 72 IFMT = 0170000, 73 IFIFO = 0010000, 74 IFCHR = 0020000, 75 IFDIR = 0040000, 76 IFBLK = 0060000, 77 IFREG = 0100000, 78 IFLNK = 0120000, 79 IFSOCK = 0140000, 80 IFWHT = 0160000 81 }; 82 83 #define DIRLEN(namlen) (((namlen)+8+3)&~3) 84 85 86 /* 87 * Super block 88 */ 89 struct Super 90 { 91 u32int ninode; /* Inodes count */ 92 u32int nblock; /* Blocks count */ 93 u32int rblockcount; /* Reserved blocks count */ 94 u32int freeblockcount; /* Free blocks count */ 95 u32int freeinodecount; /* Free inodes count */ 96 u32int firstdatablock; /* First Data Block */ 97 u32int logblocksize; /* Block size */ 98 u32int logfragsize; /* Fragment size */ 99 u32int blockspergroup; /* # Blocks per group */ 100 u32int fragpergroup; /* # Fragments per group */ 101 u32int inospergroup; /* # Inodes per group */ 102 u32int mtime; /* Mount time */ 103 u32int wtime; /* Write time */ 104 u16int mntcount; /* Mount count */ 105 u16int maxmntcount; /* Maximal mount count */ 106 u16int magic; /* Magic signature */ 107 u16int state; /* File system state */ 108 u16int errors; /* Behaviour when detecting errors */ 109 u16int pad; 110 u32int lastcheck; /* time of last check */ 111 u32int checkinterval; /* max. time between checks */ 112 u32int creatoros; /* OS */ 113 u32int revlevel; /* Revision level */ 114 u16int defresuid; /* Default uid for reserved blocks */ 115 u16int defresgid; /* Default gid for reserved blocks */ 116 117 /* the following are only available with revlevel = 1 */ 118 u32int firstino; /* First non-reserved inode */ 119 u16int inosize; /* size of inode structure */ 120 u16int blockgroupnr; /* block group # of this super block */ 121 u32int reserved[233]; /* Padding to the end of the block */ 122 }; 123 124 /* 125 * Block group 126 */ 127 struct Group 128 { 129 u32int bitblock; /* Blocks bitmap block */ 130 u32int inodebitblock; /* Inodes bitmap block */ 131 u32int inodeaddr; /* Inodes table block */ 132 u16int freeblockscount; /* Free blocks count */ 133 u16int freeinodescount; /* Free inodes count */ 134 u16int useddirscount; /* Directories count */ 135 }; 136 enum 137 { 138 GroupSize = 32 139 }; 140 141 /* 142 * Inode 143 */ 144 struct Inode 145 { 146 u16int mode; /* File mode */ 147 u16int uid; /* Owner Uid */ 148 u32int size; /* Size in bytes */ 149 u32int atime; /* Access time */ 150 u32int ctime; /* Creation time */ 151 u32int mtime; /* Modification time */ 152 u32int dtime; /* Deletion Time */ 153 u16int gid; /* Group Id */ 154 u16int nlink; /* Links count */ 155 u32int nblock; /* Blocks count */ 156 u32int flags; /* File flags */ 157 u32int block[NBLOCKS];/* Pointers to blocks */ 158 u32int version; /* File version (for NFS) */ 159 u32int fileacl; /* File ACL */ 160 u32int diracl; /* Directory ACL or high size bits */ 161 u32int faddr; /* Fragment address */ 162 }; 163 164 /* 165 * Directory entry 166 */ 167 struct Dirent 168 { 169 u32int ino; /* Inode number */ 170 u16int reclen; /* Directory entry length */ 171 u8int namlen; /* Name length */ 172 char *name; /* File name */ 173 }; 174 enum 175 { 176 MinDirentSize = 4+2+1+1 177 }; 178 179 /* 180 * In-core fs info. 181 */ 182 struct Ext2 183 { 184 uint blocksize; 185 uint nblock; 186 uint ngroup; 187 uint inospergroup; 188 uint blockspergroup; 189 uint inosperblock; 190 uint inosize; 191 uint groupaddr; 192 uint descperblock; 193 uint firstblock; 194 Disk *disk; 195 Fsys *fsys; 196 };