161 lines
3.2 KiB
C
161 lines
3.2 KiB
C
#ifndef EXT2_H
|
|
#define EXT2_h
|
|
|
|
#ifdef _KERNEL_
|
|
# include <types.h>
|
|
#else
|
|
# ifdef BOOTLOADER
|
|
# include <types.h>
|
|
# else
|
|
# include <stdint.h>
|
|
# endif
|
|
#endif
|
|
|
|
#define EXT2_SUPER_MAGIC 0xEF53
|
|
|
|
struct ext2_superblock {
|
|
uint32_t inodes_count;
|
|
uint32_t blocks_count;
|
|
uint32_t r_blocks_count;
|
|
uint32_t free_blocks_count;
|
|
uint32_t free_inodes_count;
|
|
uint32_t first_data_block;
|
|
uint32_t log_block_size;
|
|
uint32_t log_frag_size;
|
|
uint32_t blocks_per_group;
|
|
uint32_t frags_per_group;
|
|
uint32_t inodes_per_group;
|
|
uint32_t mtime;
|
|
uint32_t wtime;
|
|
|
|
uint16_t mnt_count;
|
|
uint16_t max_mnt_count;
|
|
uint16_t magic;
|
|
uint16_t state;
|
|
uint16_t errors;
|
|
uint16_t minor_rev_level;
|
|
|
|
uint32_t lastcheck;
|
|
uint32_t checkinterval;
|
|
uint32_t creator_os;
|
|
uint32_t rev_level;
|
|
|
|
uint16_t def_resuid;
|
|
uint16_t def_resgid;
|
|
|
|
/* EXT2_DYNAMIC_REV */
|
|
uint32_t first_ino;
|
|
uint16_t inode_size;
|
|
uint16_t block_group_nr;
|
|
uint32_t feature_compat;
|
|
uint32_t feature_incompat;
|
|
uint32_t feature_ro_compat;
|
|
|
|
uint8_t uuid[16];
|
|
uint8_t volume_name[16];
|
|
|
|
uint8_t last_mounted[16];
|
|
|
|
uint32_t algo_bitmap;
|
|
|
|
/* Performance Hints */
|
|
uint8_t prealloc_blocks;
|
|
uint8_t prealloc_dir_blocks;
|
|
uint16_t _padding;
|
|
|
|
/* Journaling Support */
|
|
uint8_t journal_uuid[16];
|
|
uint32_t journal_inum;
|
|
uint32_t jounral_dev;
|
|
uint32_t last_orphan;
|
|
|
|
/* Directory Indexing Support */
|
|
uint32_t hash_seed[4];
|
|
uint8_t def_hash_version;
|
|
uint16_t _padding_a;
|
|
uint8_t _padding_b;
|
|
|
|
/* Other Options */
|
|
uint32_t default_mount_options;
|
|
uint32_t first_meta_bg;
|
|
uint8_t _unused[760];
|
|
|
|
} __attribute__ ((packed));
|
|
|
|
typedef struct ext2_superblock ext2_superblock_t;
|
|
|
|
struct ext2_bgdescriptor {
|
|
uint32_t block_bitmap;
|
|
uint32_t inode_bitmap;
|
|
uint32_t inode_table;
|
|
uint16_t free_blocks_count;
|
|
uint16_t free_inodes_count;
|
|
uint16_t used_dirs_count;
|
|
uint16_t pad;
|
|
uint8_t reserved[12];
|
|
} __attribute__ ((packed));
|
|
|
|
typedef struct ext2_bgdescriptor ext2_bgdescriptor_t;
|
|
|
|
/* File Types */
|
|
#define EXT2_S_IFSOCK 0xC000
|
|
#define EXT2_S_IFLNK 0xA000
|
|
#define EXT2_S_IFREG 0x8000
|
|
#define EXT2_S_IFBLK 0x6000
|
|
#define EXT2_S_IFDIR 0x4000
|
|
#define EXT2_S_IFCHR 0x2000
|
|
#define EXT2_S_IFIFO 0x1000
|
|
|
|
/* setuid, etc. */
|
|
#define EXT2_S_ISUID 0x0800
|
|
#define EXT2_S_ISGID 0x0400
|
|
#define EXT2_S_ISVTX 0x0200
|
|
|
|
/* rights */
|
|
#define EXT2_S_IRUSR 0x0100
|
|
#define EXT2_S_IWUSR 0x0080
|
|
#define EXT2_S_IXUSR 0x0040
|
|
#define EXT2_S_IRGRP 0x0020
|
|
#define EXT2_S_IWGRP 0x0010
|
|
#define EXT2_S_IXGRP 0x0008
|
|
#define EXT2_S_IROTH 0x0004
|
|
#define EXT2_S_IWOTH 0x0002
|
|
#define EXT2_S_IXOTH 0x0001
|
|
|
|
struct ext2_inodetable {
|
|
uint16_t mode;
|
|
uint16_t uid;
|
|
uint32_t size;
|
|
uint32_t atime;
|
|
uint32_t ctime;
|
|
uint32_t mtime;
|
|
uint32_t dtime;
|
|
uint16_t gid;
|
|
uint16_t links_count;
|
|
uint32_t blocks;
|
|
uint32_t flags;
|
|
uint32_t osd1;
|
|
uint32_t block[15];
|
|
uint32_t generation;
|
|
uint32_t file_acl;
|
|
uint32_t dir_acl;
|
|
uint32_t faddr;
|
|
uint8_t osd2[12];
|
|
} __attribute__ ((packed));
|
|
|
|
typedef struct ext2_inodetable ext2_inodetable_t;
|
|
|
|
struct ext2_dir {
|
|
uint32_t inode;
|
|
uint16_t rec_len;
|
|
uint8_t name_len;
|
|
uint8_t file_type;
|
|
char name; /* Actually a set of characters, at most 255 bytes */
|
|
} __attribute__ ((packed));
|
|
|
|
typedef struct ext2_dir ext2_dir_t;
|
|
|
|
void initrd_mount(uint32_t mem_head, uint32_t mem_top);
|
|
|
|
#endif
|