/* e2fs.h */ #ifndef E2FS_H #define E2FS_H /* * This code is a complete rewrite of the read-only part of E2FS * library, done to reduce code size and memory requirements, and * also increase speed in my particular conditions. * * So I need to include this for the common structure description: * * Copyright (C) 1992, 1993, 1994, 1995 * Remy Card (card@masi.ibp.fr) * Laboratoire MASI - Institut Blaise Pascal * Universite Pierre et Marie Curie (Paris VI) * * from * * linux/include/linux/minix_fs.h * * Copyright (C) 1991, 1992 Linus Torvalds * * And I also have to point to the complete e2fsprogs suite * at: http://sourceforge.net/projects/e2fsprogs/ * or: http://e2fsprogs.sourceforge.net * by Theodore Ts'o (http://thunk.org/tytso/) (tytso@mit.edu). * * This rewrite is based on the structure found in e2fsprogs-1.26. * * Note that some parts of e2fsprogs may be available under LGPL, * my added work is only available under the GPL - not LGPL. */ /* Gujin is a bootloader, it loads a Linux kernel from cold boot or DOS. * Copyright (C) 1999-2003 Etienne Lorrain, fingerprint (2D3AF3EA): * 2471 DF64 9DEE 41D4 C8DB 9667 E448 FF8C 2D3A F3EA * E-Mail: etienne.lorrain@masroudeau.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ typedef unsigned char __u8; typedef short __s16; typedef unsigned short __u16; typedef int __s32; typedef unsigned int __u32; /* * Where the master copy of the superblock is located, and how big * superblocks are supposed to be. We define SUPERBLOCK_SIZE because * the size of the superblock structure is not necessarily trustworthy * (some versions have the padding set up so that the superblock is * 1032 bytes long). */ #define SUPERBLOCK_OFFSET 1024 #define SUPERBLOCK_SIZE 1024 #define EXT2_MIN_BLOCK_SIZE 1024 #define EXT2_MAX_BLOCK_SIZE 4096 /* * Special inodes numbers */ #define EXT2_BAD_INO 1 /* Bad blocks inode */ #define EXT2_ROOT_INO 2 /* Root inode */ #define EXT2_ACL_IDX_INO 3 /* ACL inode */ #define EXT2_ACL_DATA_INO 4 /* ACL inode */ #define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */ #define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */ #define EXT2_RESIZE_INO 7 /* Reserved group descriptors inode */ #define EXT2_JOURNAL_INO 8 /* Journal inode */ /* * First non-reserved inode for old ext2 filesystems */ #define EXT2_GOOD_OLD_FIRST_INO 11 /* * The second extended file system magic number */ #define EXT2_SUPER_MAGIC 0xEF53 /* * Revision levels */ #define EXT2_GOOD_OLD_REV 0 /* The good old (original) format */ #define EXT2_DYNAMIC_REV 1 /* V2 format w/ dynamic inode sizes */ #define EXT2_CURRENT_REV EXT2_GOOD_OLD_REV #define EXT2_MAX_SUPP_REV EXT2_DYNAMIC_REV #define EXT2_GOOD_OLD_INODE_SIZE 128 #define EXT2_NAME_LEN 255 /* * Structure of the super block */ typedef struct { __u32 s_inodes_count; /* Inodes count */ __u32 s_blocks_count; /* Blocks count */ __u32 s_r_blocks_count; /* Reserved blocks count */ __u32 s_free_blocks_count; /* Free blocks count */ __u32 s_free_inodes_count; /* Free inodes count */ __u32 s_first_data_block; /* First Data Block */ __u32 s_log_block_size; /* Block size */ __s32 s_log_frag_size; /* Fragment size */ __u32 s_blocks_per_group; /* # Blocks per group */ __u32 s_frags_per_group; /* # Fragments per group */ __u32 s_inodes_per_group; /* # Inodes per group */ __u32 s_mtime; /* Mount time */ __u32 s_wtime; /* Write time */ __u16 s_mnt_count; /* Mount count */ __s16 s_max_mnt_count; /* Maximal mount count */ __u16 s_magic; /* Magic signature */ __u16 s_state; /* File system state */ __u16 s_errors; /* Behaviour when detecting errors */ __u16 s_minor_rev_level; /* minor revision level */ __u32 s_lastcheck; /* time of last check */ __u32 s_checkinterval; /* max. time between checks */ __u32 s_creator_os; /* OS */ __u32 s_rev_level; /* Revision level */ __u16 s_def_resuid; /* Default uid for reserved blocks */ __u16 s_def_resgid; /* Default gid for reserved blocks */ /* * These fields are for EXT2_DYNAMIC_REV superblocks only. * * Note: the difference between the compatible feature set and * the incompatible feature set is that if there is a bit set * in the incompatible feature set that the kernel doesn't * know about, it should refuse to mount the filesystem. * * e2fsck's requirements are more strict; if it doesn't know * about a feature in either the compatible or incompatible * feature set, it must abort and not try to meddle with * things it doesn't understand... */ __u32 s_first_ino; /* First non-reserved inode */ __u16 s_inode_size; /* size of inode structure */ __u16 s_block_group_nr; /* block group # of this superblock */ struct feature_compat_str { unsigned dir_prealloc : 1; unsigned imagic_inode : 1; unsigned has_journal : 1; unsigned ext_attr : 1; unsigned resize_inode : 1; unsigned dir_index : 1; unsigned reserved : 26; } __attribute__ ((packed)) s_feature_compat; /* compatible feature set */ struct feature_incompat_str { unsigned compression : 1; unsigned filetype : 1; unsigned recover : 1; unsigned journal_dev : 1; unsigned reserved : 28; } __attribute__ ((packed)) s_feature_incompat; /* incompatible feature set */ struct feature_ro_compat_str { unsigned sparse_super : 1; unsigned large_file : 1; unsigned btree_dir : 1; unsigned reserved : 27; } __attribute__ ((packed)) s_feature_ro_compat; /* readonly-compatible feature set */ __u8 s_uuid[16]; /* 128-bit uuid for volume */ char s_volume_name[16]; /* volume name */ char s_last_mounted[64]; /* directory where last mounted */ __u32 s_algorithm_usage_bitmap; /* For compression */ /* * Performance hints. Directory preallocation should only * happen if the EXT2_FEATURE_COMPAT_DIR_PREALLOC flag is on. */ __u8 s_prealloc_blocks; /* Nr of blocks to try to preallocate*/ __u8 s_prealloc_dir_blocks; /* Nr to preallocate for dirs */ __u16 s_padding1; /* * Journaling support valid if EXT2_FEATURE_COMPAT_HAS_JOURNAL set. */ __u8 s_journal_uuid[16]; /* uuid of journal superblock */ __u32 s_journal_inum; /* inode number of journal file */ __u32 s_journal_dev; /* device number of journal file */ __u32 s_last_orphan; /* start of list of inodes to delete */ __u32 s_reserved[197]; /* Padding to the end of the block */ } E2FS_super_block; /* * Structure of an inode on the disk */ typedef struct { struct i_mode_str { #if 0 struct { unsigned short execute : 1; unsigned short write : 1; unsigned short read : 1; } __attribute__ ((packed)) other, group, user; #else unsigned short execute_other : 1; unsigned short write_other : 1; unsigned short read_other : 1; unsigned short execute_group : 1; unsigned short write_group : 1; unsigned short read_group : 1; unsigned short execute_user : 1; unsigned short write_user : 1; unsigned short read_user : 1; #endif unsigned short vtx : 1; unsigned short gid : 1; unsigned short uid : 1; enum { fmt_fifo = 1, fmt_chr = 2, fmt_dir = 4, fmt_blk = 6, fmt_reg = 8, fmt_lnk = 10, fmt_sock = 12 } fmt : 4; } __attribute__ ((packed)) i_mode; /* File mode */ __u16 i_uid; /* Low 16 bits of Owner Uid */ __u32 i_size; /* Size in bytes */ __u32 i_atime; /* Access time */ __u32 i_ctime; /* Creation time */ __u32 i_mtime; /* Modification time */ __u32 i_dtime; /* Deletion Time */ __u16 i_gid; /* Low 16 bits of Group Id */ __u16 i_links_count; /* Links count */ __u32 i_blocks; /* Blocks count */ __u32 i_flags; /* File flags */ /* OS dependent 1: */ __u32 i_translator; /* Only HURD, else reserved */ /* end OS dependent 1 */ __u32 i_direct_block[12]; __u32 i_simple_indirect_block; __u32 i_double_indirect_block; __u32 i_triple_indirect_block; __u32 i_generation; /* File version (for NFS) */ __u32 i_file_acl; /* File ACL */ __u32 i_size_high; /* was i_dir_acl, i.e. Directory ACL */ __u32 i_faddr; /* Fragment address */ /* OS dependent 2: */ __u8 i_frag; /* Fragment number */ __u8 i_fsize; /* Fragment size */ __u16 i_mode_high; /* Only HURD, else padding */ /* Following is reserved for masix: */ __u16 i_uid_high; __u16 i_gid_high; __u32 i_author; /* Only HURD, else reserved */ /* end OS dependent 2 */ } __attribute__ ((packed)) E2FS_inode; typedef struct { __u32 bg_block_bitmap; /* Blocks bitmap block */ __u32 bg_inode_bitmap; /* Inodes bitmap block */ __u32 bg_inode_table; /* Inodes table block */ __u16 bg_free_blocks_count; /* Free blocks count */ __u16 bg_free_inodes_count; /* Free inodes count */ __u16 bg_used_dirs_count; /* Directories count */ __u16 bg_pad; __u32 bg_reserved[3]; } E2FS_group_desc; typedef struct { __u32 inode; /* Inode number */ __u16 rec_len; /* Directory entry length */ __u8 name_len; /* Name length */ enum E2FS_file_type { e2fs_ft_unknown = 0, e2fs_ft_reg_file = 1, e2fs_ft_dir = 2, e2fs_ft_chrdev = 3, e2fs_ft_blkdev = 4, e2fs_ft_fifo = 5, e2fs_ft_sock = 6, e2fs_ft_symlink = 7 } file_type : 8; char name[EXT2_NAME_LEN]; /* File name (variable array) */ } E2FS_dir_entry; #endif /* E2FS_H */