| typedef struct Super Super; |
| typedef struct Group Group; |
| typedef struct Inode Inode; |
| typedef struct Dirent Dirent; |
| typedef struct Ext2 Ext2; |
| |
| enum |
| { |
| BYTESPERSEC = 512, |
| |
| SBOFF = 1024, |
| SBSIZE = 1024, |
| |
| SUPERMAGIC = 0xEF53, |
| MINBLOCKSIZE = 1024, |
| MAXBLOCKSIZE = 4096, |
| ROOTINODE = 2, |
| FIRSTINODE = 11, |
| VALIDFS = 0x0001, |
| ERRORFS = 0x0002, |
| |
| NDIRBLOCKS = 12, |
| INDBLOCK = NDIRBLOCKS, |
| DINDBLOCK = INDBLOCK+1, |
| TINDBLOCK = DINDBLOCK+1, |
| NBLOCKS = TINDBLOCK+1, |
| |
| NAMELEN = 255, |
| |
| /* permissions in Inode.mode */ |
| IEXEC = 00100, |
| IWRITE = 0200, |
| IREAD = 0400, |
| ISVTX = 01000, |
| ISGID = 02000, |
| ISUID = 04000, |
| |
| /* type in Inode.mode */ |
| IFMT = 0170000, |
| IFIFO = 0010000, |
| IFCHR = 0020000, |
| IFDIR = 0040000, |
| IFBLK = 0060000, |
| IFREG = 0100000, |
| IFLNK = 0120000, |
| IFSOCK = 0140000, |
| IFWHT = 0160000 |
| }; |
| |
| #define DIRLEN(namlen) (((namlen)+8+3)&~3) |
| |
| |
| /* |
| * Super block |
| */ |
| struct Super |
| { |
| u32int ninode; /* Inodes count */ |
| u32int nblock; /* Blocks count */ |
| u32int rblockcount; /* Reserved blocks count */ |
| u32int freeblockcount; /* Free blocks count */ |
| u32int freeinodecount; /* Free inodes count */ |
| u32int firstdatablock; /* First Data Block */ |
| u32int logblocksize; /* Block size */ |
| u32int logfragsize; /* Fragment size */ |
| u32int blockspergroup; /* # Blocks per group */ |
| u32int fragpergroup; /* # Fragments per group */ |
| u32int inospergroup; /* # Inodes per group */ |
| u32int mtime; /* Mount time */ |
| u32int wtime; /* Write time */ |
| u16int mntcount; /* Mount count */ |
| u16int maxmntcount; /* Maximal mount count */ |
| u16int magic; /* Magic signature */ |
| u16int state; /* File system state */ |
| u16int errors; /* Behaviour when detecting errors */ |
| u16int pad; |
| u32int lastcheck; /* time of last check */ |
| u32int checkinterval; /* max. time between checks */ |
| u32int creatoros; /* OS */ |
| u32int revlevel; /* Revision level */ |
| u16int defresuid; /* Default uid for reserved blocks */ |
| u16int defresgid; /* Default gid for reserved blocks */ |
| |
| /* the following are only available with revlevel = 1 */ |
| u32int firstino; /* First non-reserved inode */ |
| u16int inosize; /* size of inode structure */ |
| u16int blockgroupnr; /* block group # of this super block */ |
| u32int reserved[233]; /* Padding to the end of the block */ |
| }; |
| |
| /* |
| * Block group |
| */ |
| struct Group |
| { |
| u32int bitblock; /* Blocks bitmap block */ |
| u32int inodebitblock; /* Inodes bitmap block */ |
| u32int inodeaddr; /* Inodes table block */ |
| u16int freeblockscount; /* Free blocks count */ |
| u16int freeinodescount; /* Free inodes count */ |
| u16int useddirscount; /* Directories count */ |
| }; |
| enum |
| { |
| GroupSize = 32 |
| }; |
| |
| /* |
| * Inode |
| */ |
| struct Inode |
| { |
| u16int mode; /* File mode */ |
| u16int uid; /* Owner Uid */ |
| u32int size; /* Size in bytes */ |
| u32int atime; /* Access time */ |
| u32int ctime; /* Creation time */ |
| u32int mtime; /* Modification time */ |
| u32int dtime; /* Deletion Time */ |
| u16int gid; /* Group Id */ |
| u16int nlink; /* Links count */ |
| u32int nblock; /* Blocks count */ |
| u32int flags; /* File flags */ |
| u32int block[NBLOCKS];/* Pointers to blocks */ |
| u32int version; /* File version (for NFS) */ |
| u32int fileacl; /* File ACL */ |
| u32int diracl; /* Directory ACL or high size bits */ |
| u32int faddr; /* Fragment address */ |
| }; |
| |
| /* |
| * Directory entry |
| */ |
| struct Dirent |
| { |
| u32int ino; /* Inode number */ |
| u16int reclen; /* Directory entry length */ |
| u8int namlen; /* Name length */ |
| char *name; /* File name */ |
| }; |
| enum |
| { |
| MinDirentSize = 4+2+1+1 |
| }; |
| |
| /* |
| * In-core fs info. |
| */ |
| struct Ext2 |
| { |
| uint blocksize; |
| uint nblock; |
| uint ngroup; |
| uint inospergroup; |
| uint blockspergroup; |
| uint inosperblock; |
| uint inosize; |
| uint groupaddr; |
| uint descperblock; |
| uint firstblock; |
| Disk *disk; |
| Fsys *fsys; |
| }; |
| |