aboutsummaryrefslogtreecommitdiff
path: root/src/libdiskfs/ext2.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libdiskfs/ext2.h')
-rw-r--r--src/libdiskfs/ext2.h167
1 files changed, 167 insertions, 0 deletions
diff --git a/src/libdiskfs/ext2.h b/src/libdiskfs/ext2.h
new file mode 100644
index 00000000..29bf60b5
--- /dev/null
+++ b/src/libdiskfs/ext2.h
@@ -0,0 +1,167 @@
+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 on-disk format.
+ */
+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 */
+ u32int reserved[235]; /* Padding to the end of the block */
+};
+
+/*
+ * Blcok group on-disk format.
+ */
+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 */
+ u16int pad;
+ u32int reserved[3];
+};
+enum
+{
+ GroupSize = 32
+};
+
+/*
+ * Structure of an inode on the disk
+ */
+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 osd1;
+ u32int block[NBLOCKS];/* Pointers to blocks */
+ u32int version; /* File version (for NFS) */
+ u32int fileacl; /* File ACL */
+ u32int diracl; /* Directory ACL */
+ u32int faddr; /* Fragment address */
+ uchar osd2[12];
+};
+enum
+{
+ InodeSize = 128
+};
+
+/*
+ * Directory entry on-disk structure.
+ */
+struct Dirent
+{
+ u32int ino; /* Inode number */
+ u16int reclen; /* Directory entry length */
+ u8int namlen; /* Name length */
+ u8int pad;
+ char name[NAMELEN]; /* 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 groupaddr;
+ uint descperblock;
+ uint firstblock;
+ Disk *disk;
+ Fsys *fsys;
+};
+