diff options
Diffstat (limited to 'package/aboot/src/tools/e2lib.h')
| -rw-r--r-- | package/aboot/src/tools/e2lib.h | 332 |
1 files changed, 332 insertions, 0 deletions
diff --git a/package/aboot/src/tools/e2lib.h b/package/aboot/src/tools/e2lib.h new file mode 100644 index 000000000..7c94ce270 --- /dev/null +++ b/package/aboot/src/tools/e2lib.h @@ -0,0 +1,332 @@ +#ifndef EXT2_LIB_H +#define EXT2_LIB_H + +#include <fcntl.h> + + +/* Definitions cribbed from ext2_fs.h, modified so's to be 64-bit clean + * when cross-compiling on Alpha + */ + +/* + * The second extended filesystem constants/structures + */ + +/* + * Define EXT2FS_DEBUG to produce debug messages + */ +#undef EXT2FS_DEBUG + +/* + * Define EXT2FS_DEBUG_CACHE to produce cache debug messages + */ +#undef EXT2FS_DEBUG_CACHE + +/* + * Define EXT2FS_CHECK_CACHE to add some checks to the name cache code + */ +#undef EXT2FS_CHECK_CACHE + +/* + * Define EXT2FS_PRE_02B_COMPAT to convert ext 2 fs prior to 0.2b + */ +#undef EXT2FS_PRE_02B_COMPAT + +/* + * Define DONT_USE_DCACHE to inhibit the directory cache + */ +#define DONT_USE_DCACHE + +/* + * Define EXT2_PREALLOCATE to preallocate data blocks for expanding files + */ +#define EXT2_PREALLOCATE + +/* + * The second extended file system version + */ +#define EXT2FS_DATE "94/03/10" +#define EXT2FS_VERSION "0.5" + + +/* + * 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_FIRST_INO 11 /* First non reserved inode */ + +/* + * The second extended file system magic number + */ +#define EXT2_PRE_02B_MAGIC 0xEF51 +#define EXT2_SUPER_MAGIC 0xEF53 +#define EXT2_SUPER_BIGMAGIC 0x53EF /* Accessing on big-endian system... */ + +/* + * Maximal count of links to a file + */ +#define EXT2_LINK_MAX 32000 + +/* + * Macro-instructions used to manage several block sizes + */ +#define EXT2_MIN_BLOCK_SIZE 1024 +#define EXT2_MAX_BLOCK_SIZE 4096 +#define EXT2_MIN_BLOCK_LOG_SIZE 10 +# define EXT2_BLOCK_SIZE(s) (EXT2_MIN_BLOCK_SIZE << (s)->s_log_block_size) +#define EXT2_ACLE_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_acl_entry)) +#define EXT2_ADDR_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (unsigned int)) +# define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_log_block_size + 10) +#define EXT2_INODES_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_inode)) + +/* + * Macro-instructions used to manage fragments + */ +#define EXT2_MIN_FRAG_SIZE 1024 +#define EXT2_MAX_FRAG_SIZE 4096 +#define EXT2_MIN_FRAG_LOG_SIZE 10 +# define EXT2_FRAG_SIZE(s) (EXT2_MIN_FRAG_SIZE << (s)->s_log_frag_size) +# define EXT2_FRAGS_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / EXT2_FRAG_SIZE(s)) + +/* + * ACL structures + */ +struct ext2_acl_header /* Header of Access Control Lists */ +{ + unsigned int aclh_size; + unsigned int aclh_file_count; + unsigned int aclh_acle_count; + unsigned int aclh_first_acle; +}; + +struct ext2_acl_entry /* Access Control List Entry */ +{ + unsigned int acle_size; + unsigned short acle_perms; /* Access permissions */ + unsigned short acle_type; /* Type of entry */ + unsigned short acle_tag; /* User or group identity */ + unsigned short acle_pad1; + unsigned int acle_next; /* Pointer on next entry for the */ + /* same inode or on next free entry */ +}; + +/* + * Structure of a blocks group descriptor + */ +struct ext2_old_group_desc +{ + unsigned int bg_block_bitmap; /* Blocks bitmap block */ + unsigned int bg_inode_bitmap; /* Inodes bitmap block */ + unsigned int bg_inode_table; /* Inodes table block */ + unsigned short bg_free_blocks_count; /* Free blocks count */ + unsigned short bg_free_inodes_count; /* Free inodes count */ +}; + +struct ext2_group_desc +{ + unsigned int bg_block_bitmap; /* Blocks bitmap block */ + unsigned int bg_inode_bitmap; /* Inodes bitmap block */ + unsigned int bg_inode_table; /* Inodes table block */ + unsigned short bg_free_blocks_count; /* Free blocks count */ + unsigned short bg_free_inodes_count; /* Free inodes count */ + unsigned short bg_used_dirs_count; /* Directories count */ + unsigned short bg_pad; + unsigned int bg_reserved[3]; +}; + +/* + * Macro-instructions used to manage group descriptors + */ +# define EXT2_BLOCKS_PER_GROUP(s) ((s)->s_blocks_per_group) +# define EXT2_DESC_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_group_desc)) +# define EXT2_INODES_PER_GROUP(s) ((s)->s_inodes_per_group) + +/* + * Constants relative to the data blocks + */ +#define EXT2_NDIR_BLOCKS 12 +#define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS +#define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1) +#define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1) +#define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1) + +/* + * Inode flags + */ +#define EXT2_SECRM_FL 0x0001 /* Secure deletion */ +#define EXT2_UNRM_FL 0x0002 /* Undelete */ +#define EXT2_COMPR_FL 0x0004 /* Compress file */ +#define EXT2_SYNC_FL 0x0008 /* Synchronous updates */ + +/* + * ioctl commands + */ +#define EXT2_IOC_GETFLAGS _IOR('f', 1, int) +#define EXT2_IOC_SETFLAGS _IOW('f', 2, int) +#define EXT2_IOC_GETVERSION _IOR('v', 1, int) +#define EXT2_IOC_SETVERSION _IOW('v', 2, int) + +/* + * Structure of an inode on the disk + */ +struct ext2_inode { + unsigned short i_mode; /* File mode */ + unsigned short i_uid; /* Owner Uid */ + unsigned int i_size; /* Size in bytes */ + unsigned int i_atime; /* Access time */ + unsigned int i_ctime; /* Creation time */ + unsigned int i_mtime; /* Modification time */ + unsigned int i_dtime; /* Deletion Time */ + unsigned short i_gid; /* Group Id */ + unsigned short i_links_count; /* Links count */ + unsigned int i_blocks; /* Blocks count */ + unsigned int i_flags; /* File flags */ + unsigned int i_reserved1; + unsigned int i_block[EXT2_N_BLOCKS];/* Pointers to blocks */ + unsigned int i_version; /* File version (for NFS) */ + unsigned int i_file_acl; /* File ACL */ + unsigned int i_dir_acl; /* Directory ACL */ + unsigned int i_faddr; /* Fragment address */ + unsigned char i_frag; /* Fragment number */ + unsigned char i_fsize; /* Fragment size */ + unsigned short i_pad1; + unsigned int i_reserved2[2]; +}; + +/* + * File system states + */ +#define EXT2_VALID_FS 0x0001 /* Unmounted cleany */ +#define EXT2_ERROR_FS 0x0002 /* Errors detected */ + +/* + * Mount flags + */ +#define EXT2_MOUNT_CHECK_NORMAL 0x0001 /* Do some more checks */ +#define EXT2_MOUNT_CHECK_STRICT 0x0002 /* Do again more checks */ +#define EXT2_MOUNT_CHECK (EXT2_MOUNT_CHECK_NORMAL | \ + EXT2_MOUNT_CHECK_STRICT) +#define EXT2_MOUNT_GRPID 0x0004 /* Create files with directory's group */ +#define EXT2_MOUNT_DEBUG 0x0008 /* Some debugging messages */ +#define EXT2_MOUNT_ERRORS_CONT 0x0010 /* Continue on errors */ +#define EXT2_MOUNT_ERRORS_RO 0x0020 /* Remount fs ro on errors */ +#define EXT2_MOUNT_ERRORS_PANIC 0x0040 /* Panic on errors */ + +#define clear_opt(o, opt) o &= ~EXT2_MOUNT_##opt +#define set_opt(o, opt) o |= EXT2_MOUNT_##opt +#define test_opt(sb, opt) ((sb)->u.ext2_sb.s_mount_opt & \ + EXT2_MOUNT_##opt) +/* + * Maximal mount counts between two filesystem checks + */ +#define EXT2_DFL_MAX_MNT_COUNT 20 /* Allow 20 mounts */ +#define EXT2_DFL_CHECKINTERVAL 0 /* Don't use interval check */ + +/* + * Behaviour when detecting errors + */ +#define EXT2_ERRORS_CONTINUE 1 /* Continue execution */ +#define EXT2_ERRORS_RO 2 /* Remount fs read-only */ +#define EXT2_ERRORS_PANIC 3 /* Panic */ +#define EXT2_ERRORS_DEFAULT EXT2_ERRORS_CONTINUE + +/* + * Structure of the super block + */ +struct ext2_super_block { + unsigned int s_inodes_count; /* 0: Inodes count */ + unsigned int s_blocks_count; /* 4: Blocks count */ + unsigned int s_r_blocks_count;/* 8: Reserved blocks count */ + unsigned int s_free_blocks_count;/* 12: Free blocks count */ + unsigned int s_free_inodes_count;/* 16: Free inodes count */ + unsigned int s_first_data_block;/* 20: First Data Block */ + unsigned int s_log_block_size;/* 24: Block size */ + int s_log_frag_size; /* 28: Fragment size */ + unsigned int s_blocks_per_group;/* 32: # Blocks per group */ + unsigned int s_frags_per_group;/* 36: # Fragments per group */ + unsigned int s_inodes_per_group;/* 40: # Inodes per group */ + unsigned int s_mtime; /* 44: Mount time */ + unsigned int s_wtime; /* 48: Write time */ + unsigned short s_mnt_count; /* 52: Mount count */ + short s_max_mnt_count; /* 54: Maximal mount count */ + unsigned short s_magic; /* 56: Magic signature */ + unsigned short s_state; /* 58: File system state */ + unsigned short s_errors; /* 60: Behaviour when detecting errors */ + unsigned short s_pad; /* 62: */ + unsigned int s_lastcheck; /* 64: time of last check */ + unsigned int s_checkinterval; /* 68: max. time between checks */ + unsigned int s_reserved[238]; /* 72: Padding to the end of the block */ +}; + +/* + * Structure of a directory entry + */ +#define EXT2_NAME_LEN 255 + +struct ext2_dir_entry { + unsigned int inode; /* Inode number */ + unsigned short rec_len; /* Directory entry length */ + unsigned short name_len; /* Name length */ + char name[EXT2_NAME_LEN]; /* File name */ +}; + +/* + * EXT2_DIR_PAD defines the directory entries boundaries + * + * NOTE: It must be a multiple of 4 + */ +#define EXT2_DIR_PAD 4 +#define EXT2_DIR_ROUND (EXT2_DIR_PAD - 1) +#define EXT2_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT2_DIR_ROUND) & \ + ~EXT2_DIR_ROUND) + + +/* These definitions are cribbed from other file system include files, so that + * we can take a stab at identifying non-ext2 file systems as well... + */ +/* + * minix super-block data on disk + */ +struct minix_super_block { + unsigned short s_ninodes; + unsigned short s_nzones; + unsigned short s_imap_blocks; + unsigned short s_zmap_blocks; + unsigned short s_firstdatazone; + unsigned short s_log_zone_size; + unsigned int s_max_size; + unsigned short s_magic; + unsigned short s_state; +}; + +#define MINIX_SUPER_MAGIC 0x137F /* original minix fs */ +#define MINIX_SUPER_MAGIC2 0x138F /* minix fs, 30 char names */ +#define NEW_MINIX_SUPER_MAGIC 0x2468 /* minix V2 - not implemented */ + +extern int ext2_init(char * name, int access); +extern void ext2_close(); +extern struct ext2_inode * ext2_iget(int ino); +extern void ext2_iput(struct ext2_inode *ip); +extern int ext2_balloc(void); +extern int ext2_ialloc(void); +extern int ext2_blocksize(void); +extern int ext2_blkno(struct ext2_inode *ip, int blkoff, + int allocate); +extern void ext2_bread(struct ext2_inode *ip, int blkno, + char * buffer); +extern void ext2_bwrite(struct ext2_inode *ip, int blkno, + char * buffer); +extern struct ext2_inode * ext2_namei(char * name); +extern void ext2_truncate(struct ext2_inode *ip); +extern void ext2_mknod(struct ext2_inode *dip, + char * name, int ino); +extern int ext2_fill_contiguous(struct ext2_inode * ip, + int nblocks); +extern void ext2_write_bootblock(char *bb); + +#endif /* EXT2_LIB_H */ |
