summaryrefslogtreecommitdiff
path: root/package/aboot/src/tools/e2lib.h
diff options
context:
space:
mode:
Diffstat (limited to 'package/aboot/src/tools/e2lib.h')
-rw-r--r--package/aboot/src/tools/e2lib.h332
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 */