Edit

thodg/ext4fs/include/ext4fs.h

Branch :

  • include/ext4fs.h
  • /* ext4fs
     * Copyright 2025 kmx.io <contact@kmx.io>
     *
     * Permission is hereby granted to use this software granted the above
     * copyright notice and this permission paragraph are included in all
     * copies and substantial portions of this software.
     *
     * THIS SOFTWARE IS PROVIDED "AS-IS" WITHOUT ANY GUARANTEE OF
     * PURPOSE AND PERFORMANCE. IN NO EVENT WHATSOEVER SHALL THE
     * AUTHOR BE CONSIDERED LIABLE FOR THE USE AND PERFORMANCE OF
     * THIS SOFTWARE.
     */
    #ifndef EXT4FS_H
    #define EXT4FS_H
    
    #include <stddef.h>
    #include <stdint.h>
    #include <time.h>
    
    typedef struct {
      uint32_t value;
      const char *name;
    } s_value_name;
    
    #define EXT4FS_FUNCTION_MAX  32
    #define EXT4FS_REV_DYNAMIC  1
    #define EXT4FS_REV_MINOR  0
    #define EXT4FS_LAST_MOUNTED_MAX  64
    #define EXT4FS_MAGIC  0xEF53
    #define EXT4FS_MOUNT_OPTS_MAX  64
    #define EXT4FS_SUPER_BLOCK_OFFSET  1024
    #define EXT4FS_SUPER_BLOCK_SIZE  1024
    #define EXT4FS_VOLUME_NAME_MAX  16
    
    #define EXT4FS_CHECKSUM_TYPE_NONE    0x0000
    #define EXT4FS_CHECKSUM_TYPE_CRC32C  0x0001
    
    extern const s_value_name ext4fs_checksum_type_names[];
         
    #define EXT4FS_ENCODING_NONE  0x0000  // No encoding: legacy behavior
    #define EXT4FS_ENCODING_UTF8  0x0001  // UTF-8 encoding, Unicode 12.1.0
    
    extern const s_value_name ext4fs_encoding_names[];
    
    #define EXT4FS_ENCODING_FLAG_NONE         0x0000
    #define EXT4FS_ENCODING_FLAG_STRICT_MODE  0x0001  /* Reject invalid encoding */
    
    extern const s_value_name ext4fs_encoding_flag_names[];
    
    #define EXT4FS_ERRORS_CONTINUE  1  // Log and keep going
    #define EXT4FS_ERRORS_RO        2  // Remount read-only
    #define EXT4FS_ERRORS_PANIC     3  // Kernel panic
    
    extern const char *ext4fs_error_policy_names[];
    
    #define EXT4FS_FEATURE_COMPAT_DIR_PREALLOC   0x0001
    #define EXT4FS_FEATURE_COMPAT_IMAGIC_INODES  0x0002
    #define EXT4FS_FEATURE_COMPAT_HAS_JOURNAL    0x0004
    #define EXT4FS_FEATURE_COMPAT_EXT_ATTR       0x0008
    #define EXT4FS_FEATURE_COMPAT_RESIZE_INODE   0x0010
    #define EXT4FS_FEATURE_COMPAT_DIR_INDEX      0x0020
    
    extern const s_value_name ext4fs_feature_compat_names[];
    
    #define EXT4FS_FEATURE_INCOMPAT_COMPRESSION  0x00001 // Not used
    #define EXT4FS_FEATURE_INCOMPAT_FILETYPE     0x00002 // ftype in dirent
    #define EXT4FS_FEATURE_INCOMPAT_RECOVER      0x00004 // needs journal recovery
    #define EXT4FS_FEATURE_INCOMPAT_JOURNAL_DEV  0x00008 // External journal device
    #define EXT4FS_FEATURE_INCOMPAT_META_BG      0x00010 // Meta block groups
    #define EXT4FS_FEATURE_INCOMPAT_EXTENTS      0x00040 // Extents instead of block map
    #define EXT4FS_FEATURE_INCOMPAT_64BIT        0x00080 // 64-bit block numbers
    #define EXT4FS_FEATURE_INCOMPAT_MMP          0x00100 // Multiple mount protection
    #define EXT4FS_FEATURE_INCOMPAT_FLEX_BG      0x00200 // Flexible block groups
    #define EXT4FS_FEATURE_INCOMPAT_EA_INODE     0x00400 // In-inode xattrs
    #define EXT4FS_FEATURE_INCOMPAT_DIRDATA      0x01000 // Inline dir data
    #define EXT4FS_FEATURE_INCOMPAT_CSUM_SEED    0x02000 // Metadata checksum seed
    #define EXT4FS_FEATURE_INCOMPAT_LARGEDIR     0x04000 // Large dir support
    #define EXT4FS_FEATURE_INCOMPAT_INLINE_DATA  0x08000 // Inline file data
    #define EXT4FS_FEATURE_INCOMPAT_ENCRYPT      0x10000 // File encryption
    
    extern const s_value_name ext4fs_feature_incompat_names[];
    
    #define EXT4FS_FEATURE_RO_COMPAT_SPARSE_SUPER   0x0001
    #define EXT4FS_FEATURE_RO_COMPAT_LARGE_FILE     0x0002
    #define EXT4FS_FEATURE_RO_COMPAT_BTREE_DIR      0x0004  // Not used in ext4
    #define EXT4FS_FEATURE_RO_COMPAT_HUGE_FILE      0x0008
    #define EXT4FS_FEATURE_RO_COMPAT_GDT_CSUM       0x0010
    #define EXT4FS_FEATURE_RO_COMPAT_DIR_NLINK      0x0020
    #define EXT4FS_FEATURE_RO_COMPAT_EXTRA_ISIZE    0x0040
    #define EXT4FS_FEATURE_RO_COMPAT_HAS_SNAPSHOT   0x0080  // Unused
    #define EXT4FS_FEATURE_RO_COMPAT_QUOTA          0x0100
    #define EXT4FS_FEATURE_RO_COMPAT_BIGALLOC       0x0200
    #define EXT4FS_FEATURE_RO_COMPAT_METADATA_CSUM  0x0400
    #define EXT4FS_FEATURE_RO_COMPAT_REPLICA        0x0800  // Unused
    #define EXT4FS_FEATURE_RO_COMPAT_READONLY       0x1000
    #define EXT4FS_FEATURE_RO_COMPAT_PROJECT        0x2000
    
    extern const s_value_name ext4fs_feature_ro_compat_names[];
    
    #define EXT4FS_FLAG_SIGNED_HASH      0x0001  // Legacy hash uses signed ints
    #define EXT4FS_FLAG_UNSIGNED_HASH    0x0002  // Default: unsigned directory hash
    #define EXT4FS_FLAG_TEST_FILESYS     0x0004  // Marked as a test filesystem
    #define EXT4FS_FLAG_64BIT            0x0008  // Uses 64-bit block numbers
    #define EXT4FS_FLAG_MOUNT_OPT_CHECK  0x0010  // Kernel must check mount opts
    
    extern const s_value_name ext4fs_flag_names[];
    
    #define EXT4FS_INODE_BAD_BLOCKS    1
    #define EXT4FS_INODE_ROOT_DIR      2
    #define EXT4FS_INODE_USER_QUOTA    3
    #define EXT4FS_INODE_GROUP_QUOTA   4
    #define EXT4FS_INODE_BOOT_LOADER   5
    #define EXT4FS_INODE_JOURNAL       8
    #define EXT4FS_INODE_FIRST        11
    
    extern const char *ext4fs_inode_names[];
    
    #define EXTFS_INODE_FLAG_SECURE_RM                  0x00000001
    #define EXTFS_INODE_FLAG_UN_RM                      0x00000002
    #define EXTFS_INODE_FLAG_COMPRESSION                0x00000004
    #define EXTFS_INODE_FLAG_SYNC                       0x00000008
    #define EXTFS_INODE_FLAG_IMMUTABLE                  0x00000010
    #define EXTFS_INODE_FLAG_APPEND                     0x00000020
    #define EXTFS_INODE_FLAG_NO_DUMP                    0x00000040
    #define EXTFS_INODE_FLAG_NO_ATIME                   0x00000080
    #define EXTFS_INODE_FLAG_DIRTY                      0x00000100
    #define EXTFS_INODE_FLAG_COMPRESSED_BLOCKS          0x00000200
    #define EXTFS_INODE_FLAG_NO_COMPRESSION             0x00000400
    #define EXTFS_INODE_FLAG_ENCRYPTED                  0x00000800
    #define EXTFS_INODE_FLAG_INDEX                      0x00001000
    #define EXTFS_INODE_FLAG_IMAGIC                     0x00002000
    #define EXTFS_INODE_FLAG_JOURNAL_DATA               0x00004000
    #define EXTFS_INODE_FLAG_NO_TAIL                    0x00008000
    #define EXTFS_INODE_FLAG_DIR_SYNC                   0x00010000
    #define EXTFS_INODE_FLAG_TOP_DIR                    0x00020000
    #define EXTFS_INODE_FLAG_HUGE_FILE                  0x00040000
    #define EXTFS_INODE_FLAG_EXTENTS                    0x00080000
    #define EXTFS_INODE_FLAG_EXTENDED_ATTRIBUTES_INODE  0x00200000
    #define EXTFS_INODE_FLAG_EOF_BLOCKS                 0x00400000
    #define EXTFS_INODE_FLAG_INLINE_DATA                0x10000000
    #define EXTFS_INODE_FLAG_PROJECT_ID_INHERITANCE     0x20000000
    #define EXTFS_INODE_FLAG_CASEFOLD                   0x40000000
    
    extern const s_value_name ext4fs_inode_flag_names[];
    
    #define EXT4FS_MOUNT_READONLY              0x0001
    #define EXT4FS_MOUNT_NO_ATIME              0x0002
    #define EXT4FS_MOUNT_DIRSYNC               0x0004
    #define EXT4FS_MOUNT_DATA_JOURNAL          0x0008
    #define EXT4FS_MOUNT_DATA_ORDERED          0x0010
    #define EXT4FS_MOUNT_DATA_WRITEBACK        0x0020
    #define EXT4FS_MOUNT_ERRORS_CONTINUE       0x0040
    #define EXT4FS_MOUNT_ERRORS_REMOUNT_RO     0x0080
    #define EXT4FS_MOUNT_ERRORS_PANIC          0x0100
    #define EXT4FS_MOUNT_DISCARD               0x0200
    #define EXT4FS_MOUNT_NO_BUFFER_HEADS       0x0400
    #define EXT4FS_MOUNT_SKIP_JOURNAL          0x0800
    #define EXT4FS_MOUNT_NOAUTO_DELAYED_ALLOC  0x1000
    
    extern const s_value_name ext4fs_mount_names[];
    
    #define EXT4FS_OS_LINUX     0
    #define EXT4FS_OS_HURD      1
    #define EXT4FS_OS_MASIX     2
    #define EXT4FS_OS_FREEBSD   3
    #define EXT4FS_OS_LITES     4
    #define EXT4FS_OS_OPENBSD   5
    
    extern const char *ext4fs_os_str[];
    
    #define EXT4FS_STATE_VALID  0x0001  // Clean unmount
    #define EXT4FS_STATE_ERROR  0x0002  // Errors detected (fsck needed)
    
    extern const s_value_name ext4fs_state_names[];
    
    #define EXT4FS_BGD_FLAG_INODE_UNINIT     0x0001
    #define EXT4FS_BGD_FLAG_BLOCK_UNINIT     0x0002
    #define EXT4FS_BGD_FLAG_INODE_ZEROED     0x0004
    #define EXT4FS_BGD_FLAG_DIRTY            0x0008
    #define EXT4FS_BGD_FLAG_BLOCK_ZEROED     0x0010
    #define EXT4FS_BGD_FLAG_READ_ONLY        0x0020
    
    extern const s_value_name ext4fs_bgd_flag_names[];
    
    struct ext4fs_super_block {
      uint32_t sb_inodes_count;
      uint32_t sb_blocks_count_lo;
      uint32_t sb_reserved_blocks_count_lo;
      uint32_t sb_free_blocks_count_lo;
      // 0x10
      uint32_t sb_free_inodes_count;
      uint32_t sb_first_data_block;
      uint32_t sb_log_block_size;       // log2(block size) - 10
      uint32_t sb_log_cluster_size;     // log2(cluster size) - 10
      // 0x20
      uint32_t sb_blocks_per_group;
      uint32_t sb_clusters_per_group;
      uint32_t sb_inodes_per_group;
      uint32_t sb_mount_time_lo;
      // 0x30
      uint32_t sb_write_time_lo;
      uint16_t sb_mount_count;
      int16_t  sb_max_mount_count_before_fsck;
      uint16_t sb_magic;
      uint16_t sb_state;                // EXT4FS_STATE_*
      uint16_t sb_errors;               // EXT4FS_ERRORS_*
      uint16_t sb_revision_level_minor;
      // 0x40
      uint32_t sb_check_time_lo;
      uint32_t sb_check_interval;
      uint32_t sb_creator_os;           // EXT4FS_OS_*
      uint32_t sb_revision_level;
      // 0x50
      uint16_t sb_default_reserved_uid;
      uint16_t sb_default_reserved_gid;
      uint32_t sb_first_non_reserved_inode;
      uint16_t sb_inode_size;
      uint16_t sb_block_group_id;
      uint32_t sb_feature_compat;
      // 0x60
      uint32_t sb_feature_incompat;
      uint32_t sb_feature_ro_compat;
      uint8_t  sb_uuid[16];
      char     sb_volume_name[EXT4FS_VOLUME_NAME_MAX];
      char     sb_last_mounted[EXT4FS_LAST_MOUNTED_MAX];
      uint32_t sb_algorithm_usage_bitmap;
      uint8_t  sb_preallocate_blocks;
      uint8_t  sb_preallocate_dir_blocks;
      uint16_t sb_reserved_bgdt_blocks;
      // 0xD0
      uint8_t  sb_journal_uuid[16];     // UUID of journal superblock
      // 0xE0
      uint32_t sb_journal_inode_number;
      uint32_t sb_journal_device_number;
      uint32_t sb_last_orphan;
      uint32_t sb_hash_seed[4];
      uint8_t  sb_default_hash_version;
      uint8_t  sb_journal_backup_type;
      uint16_t sb_block_group_descriptor_size;
      // 0x100
      uint32_t sb_default_mount_opts;
      uint32_t sb_first_meta_block_group;
      uint32_t sb_newfs_time_lo;
      uint32_t sb_jnl_blocks[17];       // Backup of journal inode
      // 0x150
      uint32_t sb_blocks_count_hi;
      uint32_t sb_reserved_blocks_count_hi;
      uint32_t sb_free_blocks_count_hi;
      uint16_t sb_inode_size_extra_min;
      uint16_t sb_inode_size_extra_want;
      // 0x160
      uint32_t sb_flags;
      uint16_t sb_raid_stride_block_count;
      uint16_t sb_mmp_interval;
      uint64_t sb_mmp_block;
      // 0x170
      uint32_t sb_raid_stripe_width_block_count;
      uint8_t  sb_log_groups_per_flex;
      uint8_t  sb_checksum_type;
      uint16_t sb_reserved_176;
      uint64_t sb_kilobytes_written;
      // 0x180
      uint32_t sb_ext3_snapshot_inode;
      uint32_t sb_ext3_snapshot_id;  
      uint64_t sb_ext3_snapshot_reserved_blocks_count;
      // 0x190
      uint32_t sb_ext3_snapshot_list;
      uint32_t sb_error_count;
      uint32_t sb_first_error_time_lo;
      uint32_t sb_first_error_inode;
      // 0x1A0
      uint64_t sb_first_error_block;
      char     sb_first_error_function[EXT4FS_FUNCTION_MAX];
      uint32_t sb_first_error_line;
      uint32_t sb_last_error_time_lo;
      // 0x1D0
      uint32_t sb_last_error_inode;
      uint32_t sb_last_error_line;
      uint64_t sb_last_error_block;
      // 0x1E0
      char     sb_last_error_function[EXT4FS_FUNCTION_MAX];
      // 0x200
      char     sb_mount_opts[EXT4FS_MOUNT_OPTS_MAX];
      // 0x240
      uint32_t sb_user_quota_inode;
      uint32_t sb_group_quota_inode;
      uint32_t sb_overhead_clusters;
      uint32_t sb_backup_block_groups[2];
      uint8_t  sb_encrypt_algos[4];
      uint8_t  sb_encrypt_pw_salt[16];
      uint32_t sb_lost_and_found_inode;
      uint32_t sb_project_quota_inode;
      // 0x270
      uint32_t sb_checksum_seed;
      uint8_t  sb_write_time_hi;
      uint8_t  sb_mount_time_hi;
      uint8_t  sb_newfs_time_hi;
      uint8_t  sb_check_time_hi;
      uint8_t  sb_first_error_time_hi;
      uint8_t  sb_last_error_time_hi;
      uint8_t  sb_first_error_code;
      uint8_t  sb_last_error_code;
      uint16_t sb_encoding;
      uint16_t sb_encoding_flags;
      // 0x280
      uint16_t sb_orphan_file_inode;
      uint16_t sb_reserved_284;
      uint32_t sb_reserved_288[94];
      uint32_t sb_checksum;
    } __attribute__((packed));
    
    struct ext4fs_block_group_descriptor {
      uint32_t bgd_block_bitmap_block_lo;
      uint32_t bgd_inode_bitmap_block_lo;
      uint32_t bgd_inode_table_block_lo;
      uint16_t bgd_free_blocks_count_lo;
      uint16_t bgd_free_inodes_count_lo;
      // 0x10
      uint16_t bgd_used_dirs_count_lo;
      uint16_t bgd_flags;
      uint32_t bgd_exclude_bitmap_block_lo;
      uint16_t bgd_block_bitmap_checksum_lo;
      uint16_t bgd_inode_bitmap_checksum_lo;
      uint16_t bgd_inode_table_unused_lo;
      uint16_t bgd_checksum;
      // 0x20
      uint32_t bgd_block_bitmap_block_hi;
      uint32_t bgd_inode_bitmap_block_hi;
      uint32_t bgd_inode_table_block_hi;
      uint16_t bgd_free_blocks_count_hi;
      uint16_t bgd_free_inodes_count_hi;
      // 0x30
      uint16_t bgd_used_dirs_count_hi;
      uint16_t bgd_inode_table_unused_hi;
      uint32_t bgd_exclude_bitmap_block_hi;
      uint16_t bgd_block_bitmap_checksum_hi;
      uint16_t bgd_inode_bitmap_checksum_hi;
      uint32_t bgd_reserved_3c;
      // 0x40
    } __attribute__((packed));
    
    #define EXT4FS_EXTENT_HEADER_MAGIC  0xF30A
    
    struct ext4fs_extent_header {
      uint16_t eh_magic;
      uint16_t eh_entries;
      uint16_t eh_max;
      uint16_t eh_depth;
      uint32_t eh_generation;
    } __attribute__((packed));
    
    struct ext4fs_extent {
      uint32_t e_block;
      uint16_t e_len;
      uint16_t e_start_hi;
      uint32_t e_start_lo;
    } __attribute__((packed));
    
    struct ext4fs_extent_idx {
      uint32_t ei_block;
      uint32_t ei_leaf_lo;
      uint16_t ei_leaf_hi;
      uint16_t ei_unused;
    } __attribute__((packed));
    
    struct ext4fs_inode {
      uint16_t i_mode;
      uint16_t i_uid_lo;
      uint32_t i_size_lo;
      uint32_t i_atime;
      uint32_t i_ctime;
      // 0x10
      uint32_t i_mtime;
      uint32_t i_dtime;
      uint16_t i_gid_lo;
      uint16_t i_links_count;
      uint32_t i_blocks_lo;
      // 0x20
      uint32_t i_flags;
      uint32_t i_version;
      union {
        uint32_t i_block[15];
        struct {
          struct ext4fs_extent_header i_extent_header;
          union {
            struct ext4fs_extent i_extent[4];
            struct ext4fs_extent_idx i_extent_idx[4];
          };
        };
      };
      uint32_t i_nfs_generation;
      uint32_t i_extended_attributes_lo;
      uint32_t i_size_hi;
      // 0x70
      uint32_t i_fragment_address;
      uint16_t i_blocks_hi;
      uint16_t i_extended_attributes_hi;
      uint16_t i_uid_hi;
      uint16_t i_gid_hi;
      uint16_t i_checksum_lo;
      uint16_t i_reserved_7e;
      // 0x80
      uint16_t i_extra_isize;
      uint16_t i_checksum_hi;
      uint32_t i_ctime_extra;
      uint32_t i_mtime_extra;
      uint32_t i_atime_extra;
      // 0x90
      uint32_t i_crtime;
      uint32_t i_crtime_extra;
      uint32_t i_version_hi;
      uint32_t i_project_id;
      // 0xA0
    } __attribute__((packed));
    
    struct ext4fs_inode_256 {
      struct ext4fs_inode inode;
      uint8_t extended_attributes[256 - sizeof(struct ext4fs_inode)];
    };
    
    #define EXT4FS_EXTENT_DEPTH_MAX 5
    
    struct ext4fs_extent_cursor {
      const struct ext4fs_super_block *sb;
      uint64_t inode_block;
      uint32_t inode_number;
      uint32_t inode_generation;
      struct {
        uint64_t physical_block;
        struct ext4fs_extent_header hdr;
        uint16_t idx;
        uint64_t block_number;
      } stack[EXT4FS_EXTENT_DEPTH_MAX + 1];
      uint64_t block_offset;
      short depth;
      uint64_t offset;
      int eof;
    };
    
    int
    ext4fs_bgd_block_bitmap_block
    (const struct ext4fs_super_block *sb,
     const struct ext4fs_block_group_descriptor *bgd,
     uint64_t *dest);
    
    int
    ext4fs_bgd_block_bitmap_checksum
    (const struct ext4fs_super_block *sb,
     const struct ext4fs_block_group_descriptor *bgd,
     uint32_t *dest);
    
    int
    ext4fs_bgd_checksum_compute
    (const struct ext4fs_super_block *sb,
     const struct ext4fs_block_group_descriptor *bgd,
     uint32_t block_group_id, uint16_t *dest);
    
    int
    ext4fs_bgd_exclude_bitmap_block
    (const struct ext4fs_super_block *sb,
     const struct ext4fs_block_group_descriptor *bgd,
     uint64_t *dest);
    
    int
    ext4fs_bgd_free_blocks_count
    (const struct ext4fs_super_block *sb,
     const struct ext4fs_block_group_descriptor *bgd,
     uint32_t *dest);
    
    int
    ext4fs_bgd_free_inodes_count
    (const struct ext4fs_super_block *sb,
     const struct ext4fs_block_group_descriptor *bgd,
     uint32_t *dest);
    
    int
    ext4fs_bgd_inode_bitmap_block
    (const struct ext4fs_super_block *sb,
     const struct ext4fs_block_group_descriptor *bgd,
     uint64_t *dest);
    
    int
    ext4fs_bgd_inode_bitmap_checksum
    (const struct ext4fs_super_block *sb,
     const struct ext4fs_block_group_descriptor *bgd,
     uint32_t *dest);
    
    int
    ext4fs_bgd_inode_table_block
    (const struct ext4fs_super_block *sb,
     const struct ext4fs_block_group_descriptor *bgd,
     uint64_t *dest);
    
    int
    ext4fs_bgd_inode_table_unused
    (const struct ext4fs_super_block *sb,
     const struct ext4fs_block_group_descriptor *bgd,
     uint32_t *dest);
    
    int
    ext4fs_bgd_used_dirs_count
    (const struct ext4fs_super_block *sb,
     const struct ext4fs_block_group_descriptor *bgd,
     uint32_t *dest);
    
    #ifdef OpenBSD
    
    struct disklabel *
    ext4fs_disklabel_get
    (struct disklabel *dl, int fd);
    
    #endif // OpenBSD
    
    struct ext4fs_block_group_descriptor *
    ext4fs_block_group_descriptor_read
    (const struct ext4fs_super_block *sb,
     struct ext4fs_block_group_descriptor *bgd,
     uint64_t bgd_count,
     int fd);
    
    int ext4fs_extent_start
    (const struct ext4fs_extent *extent,
     uint64_t *start);
    
    int
    ext4fs_inode_256_checksum_compute
    (const struct ext4fs_super_block *sb,
     const struct ext4fs_inode_256 *inode,
     uint32_t inode_number,
     uint32_t *dest);
    
    struct ext4fs_inode_256 *
    ext4fs_inode_256_read
    (const struct ext4fs_super_block *sb,
     const struct ext4fs_block_group_descriptor *bgd,
     struct ext4fs_inode_256 *inode, 
     uint32_t inode_number,
     int fd);
    
    int
    ext4fs_inode_blocks
    (const struct ext4fs_super_block *sb,
     const struct ext4fs_inode *inode,
     uint64_t *dest);
    
    int
    ext4fs_inode_extended_attributes
    (const struct ext4fs_super_block *sb,
     const struct ext4fs_inode *inode,
     uint64_t *dest);
    
    int
    ext4fs_inode_gid
    (const struct ext4fs_super_block *sb,
     const struct ext4fs_inode *inode,
     uint32_t *dest);
    
    int
    ext4fs_inode_size
    (const struct ext4fs_super_block *sb,
     const struct ext4fs_inode *inode,
     uint64_t *dest);
    
    int
    ext4fs_inode_uid
    (const struct ext4fs_super_block *sb,
     const struct ext4fs_inode *inode,
     uint32_t *dest);
    
    int
    ext4fs_inspect
    (const char *dev,
     int fd);
    
    int
    ext4fs_inspect_block_group_descriptor
    (const struct ext4fs_super_block *sb,
     const struct ext4fs_block_group_descriptor *bgd,
     uint32_t block_group_id);
    
    int
    ext4fs_inspect_block_group_descriptor_hex
    (const struct ext4fs_super_block *sb,
     const struct ext4fs_block_group_descriptor *bgd);
    
    void
    ext4fs_inspect_creator_os
    (uint16_t creator_os);
    
    void
    ext4fs_inspect_errors
    (uint16_t errors);
    
    int
    ext4fs_inspect_extent
    (const struct ext4fs_extent *extent,
     uint8_t indent);
    
    int
    ext4fs_inspect_extent_header
    (const struct ext4fs_extent_header *eh,
     uint8_t indent);
    
    int
    ext4fs_inspect_flag_names
    (uint32_t flags,
     const s_value_name *names);
    
    int
    ext4fs_inspect_inode_256
    (const struct ext4fs_super_block *sb,
     const struct ext4fs_inode_256 *inode,
     uint32_t inode_number);
    
    int
    ext4fs_inspect_super_block
    (const struct ext4fs_super_block *sb);
    
    int
    ext4fs_mode_to_str
    (uint16_t mode,
     char *dest,
     size_t size);
    
    uint64_t
    ext4fs_sb_block_group_count
    (const struct ext4fs_super_block *sb);
    
    int
    ext4fs_sb_checksum_compute
    (const struct ext4fs_super_block *sb,
                                    uint32_t *dest);
    
    int
    ext4fs_sb_last_error_time
    (const struct ext4fs_super_block *sb,
                                uint64_t *dest);
    
    int
    ext4fs_sb_block_size
    (const struct ext4fs_super_block *sb,
                              uint32_t *dest);
    
    int
    ext4fs_sb_blocks_count
    (const struct ext4fs_super_block *sb,
                                uint64_t *dest);
    
    int
    ext4fs_sb_check_time
    (const struct ext4fs_super_block *sb,
                              uint64_t *dest);
    
    int
    ext4fs_sb_first_error_time
    (const struct ext4fs_super_block *sb,
                                    uint64_t *dest);
    
    int
    ext4fs_sb_free_blocks_count
    (const struct ext4fs_super_block *sb,
                                     uint64_t *dest);
    
    int
    ext4fs_sb_inode_size
    (const struct ext4fs_super_block *sb,
                              uint16_t *dest);
    
    int
    ext4fs_sb_mount_time
    (const struct ext4fs_super_block *sb,
                              uint64_t *dest);
    
    int
    ext4fs_sb_newfs_time
    (const struct ext4fs_super_block *sb,
                              uint64_t *dest);
    
    int
    ext4fs_sb_reserved_blocks_count
    (const struct ext4fs_super_block *sb,
                                         uint64_t *dest);
    
    int
    ext4fs_sb_write_time
    (const struct ext4fs_super_block *sb,
                              uint64_t *dest);
    
    int
    ext4fs_size
    (const char *dev,
     int fd,
     uint64_t *dest);
    
    struct ext4fs_super_block *
    ext4fs_super_block_read
    (struct ext4fs_super_block *sb,
                             int fd);
    
    int
    ext4fs_time_to_str
    (time_t time,
     char *str,
     size_t size);
    
    #endif /* EXT4FS_H */