Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /********* super.c code ***************/
- #include <stdio.h>
- #include <stdlib.h>
- #include <fcntl.h>
- #include <ext2fs/ext2_fs.h>
- typedef unsigned char u8;
- typedef unsigned short u16;
- typedef unsigned int u32;
- // define shorter TYPES, save typing efforts
- typedef struct ext2_group_desc GD;
- typedef struct ext2_super_block SUPER;
- typedef struct ext2_inode INODE;
- typedef struct ext2_dir_entry_2 DIR; // need this for new version of e2fs
- GD *gp;
- SUPER *sp;
- INODE *ip;
- DIR *dp;
- #define BLKSIZE 1024
- /******************* in <ext2fs/ext2_fs.h>*******************************
- struct ext2_super_block {
- u32 s_inodes_count; // total number of inodes
- u32 s_blocks_count; // total number of blocks
- u32 s_r_blocks_count;
- u32 s_free_blocks_count; // current number of free blocks
- u32 s_free_inodes_count; // current number of free inodes
- u32 s_first_data_block; // first data block in this group
- u32 s_log_block_size; // 0 for 1KB block size
- u32 s_log_frag_size;
- u32 s_blocks_per_group; // 8192 blocks per group
- u32 s_frags_per_group;
- u32 s_inodes_per_group;
- u32 s_mtime;
- u32 s_wtime;
- u16 s_mnt_count; // number of times mounted
- u16 s_max_mnt_count; // mount limit
- u16 s_magic; // 0xEF53
- // A FEW MORE non-essential fields
- };
- **********************************************************************/
- char buf[BLKSIZE];
- int fd;
- int iblock;
- int get_block(int fd, int blk, char buf[ ])
- {
- lseek(fd, (long)blk*BLKSIZE, 0);
- read(fd, buf, BLKSIZE);
- }
- super()
- {
- // read SUPER block
- get_block(fd, 1, buf);
- sp = (SUPER *)buf;
- // check for EXT2 magic number:
- printf("\n*******super*******\n");
- printf("s_magic = %x\n", sp->s_magic);
- if (sp->s_magic != 0xEF53){
- printf("NOT an EXT2 FS\n");
- exit(1);
- }
- printf("EXT2 FS OK\n");
- printf("s_inodes_count = %d\n", sp->s_inodes_count);
- printf("s_blocks_count = %d\n", sp->s_blocks_count);
- printf("s_free_inodes_count = %d\n", sp->s_free_inodes_count);
- printf("s_free_blocks_count = %d\n", sp->s_free_blocks_count);
- printf("s_first_data_blcok = %d\n", sp->s_first_data_block);
- printf("s_log_block_size = %d\n", sp->s_log_block_size);
- // printf("s_log_frag_size = %d\n", sp->s_log_frag_size);
- printf("s_blocks_per_group = %d\n", sp->s_blocks_per_group);
- // printf("s_frags_per_group = %d\n", sp->s_frags_per_group);
- printf("s_inodes_per_group = %d\n", sp->s_inodes_per_group);
- printf("s_mnt_count = %d\n", sp->s_mnt_count);
- printf("s_max_mnt_count = %d\n", sp->s_max_mnt_count);
- printf("s_magic = %x\n", sp->s_magic);
- printf("s_mtime = %s", ctime(&sp->s_mtime));
- printf("s_wtime = %s", ctime(&sp->s_wtime));
- }
- char *disk = "mydisk";
- main(int argc, char *argv[ ])
- {
- if (argc > 1)
- disk = argv[1];
- fd = open(disk, O_RDONLY);
- if (fd < 0){
- printf("open failed\n");
- exit(1);
- }
- super();
- gd();
- bmap();
- inode();
- }
- /***** SAMPLE OUTPUTs of super.c ****************
- s_inodes_count = 184
- s_blocks_count = 1440
- s_free_inodes_count = 174
- s_free_blocks_count = 1411
- s_log_block_size = 0
- s_blocks_per_group = 8192
- s_inodes_per_group = 184
- s_mnt_count = 1
- s_max_mnt_count = 34
- s_magic = ef53
- s_mtime = Mon Feb 9 07:08:22 2004
- s_inode_size = 128
- ************************************************
- 2. WRITE YOUR OWN gd.c to print information of Group Descriptor 0
- * calculate number of block groups on the disk
- unsigned int group_count = 1 + (super.s_blocks_count-1) / super.s_blocks_per_group;
- /* calculate size of the group descriptor list in bytes
- unsigned int descr_list_size = group_count * sizeof(struct ext2_group_descr);
- */
- gd()
- {
- // read SUPER block
- get_block(fd, 2, buf);
- gp = (GD *)buf;
- printf("\n*******GD*******\n");
- printf("bg_block_bitmap = %d\n", gp->bg_block_bitmap);
- printf("bg_inode_bitmap = %d\n", gp->bg_inode_bitmap);
- printf("bg_inode_table = %d\n", gp->bg_inode_table);
- printf("bg_free_blocks_count = %u\n", gp->bg_free_blocks_count);
- printf("bg_free_inodes_count = %u\n", gp->bg_free_inodes_count);
- printf("bp->bg_used_dirs_count = %u\n", gp->bg_used_dirs_count);
- }
- /**** imap.c ***/
- int tst_bit(char *buf, int bit)
- {
- int i, j;
- i = bit / 8; j = bit % 8;
- if (buf[i] & (1 << j))
- return 1;
- return 0;
- }
- imap()
- {
- char buf[BLKSIZE];
- int imap, ninodes;
- int i;
- // read SUPER block
- get_block(fd, 1, buf);
- sp = (SUPER *)buf;
- ninodes = sp->s_inodes_count;
- printf("ninodes = %d\n", ninodes);
- // read Group Descriptor 0
- get_block(fd, 2, buf);
- gp = (GD *)buf;
- imap = gp->bg_inode_bitmap;
- printf("bmap = %d\n", imap);
- // read inode_bitmap block
- get_block(fd, imap, buf);
- for (i=0; i < ninodes; i++){
- (tst_bit(buf, i)) ? putchar('1') : putchar('0');
- if (i && (i % 8)==0)
- printf(" ");
- }
- printf("\n");
- }
- /**** bmap.c ***/
- bmap()
- {
- // read SUPER block
- char buf[BLKSIZE];
- int bmap, nblocks;
- int i;
- // read SUPER block
- get_block(fd, 1, buf);
- sp = (SUPER *)buf;
- nblocks = sp->s_blocks_count;
- printf("\n********bmap*********\n");
- printf("nblocks = %d\n", nblocks);
- // read Group Descriptor 0
- get_block(fd, 2, buf);
- gp = (GD *)buf;
- bmap = gp->bg_block_bitmap;
- printf("block bmap = %d\n", bmap);
- get_block(fd, bmap, buf);
- for (i=1; i < nblocks; i++){
- (tst_bit(buf, i)) ? putchar('1') : putchar('0');
- if (i && (i % 8)==0)
- printf(" ");
- if(i && (i%80) == 0)
- printf("\n");
- }
- printf("\n");
- }
- inode()
- {
- char buf[BLKSIZE];
- // read GD
- get_block(fd, 2, buf);
- gp = (GD *)buf;
- /****************
- printf("%8d %8d %8d %8d %8d %8d\n",
- gp->bg_block_bitmap,
- gp->bg_inode_bitmap,
- gp->bg_inode_table,
- gp->bg_free_blocks_count,
- gp->bg_free_inodes_count,
- gp->bg_used_dirs_count);
- ****************/
- iblock = gp->bg_inode_table; // get inode start block#
- printf("\n********inode********\n");
- printf("inode_block=%d\n", iblock);
- // get inode start block
- get_block(fd, iblock, buf);
- ip = (INODE *)buf + 1; // ip points at 2nd INODE
- printf("mode=%4x ", ip->i_mode);
- printf("uid=%d gid=%d\n", ip->i_uid, ip->i_gid);
- printf("size=%d\n", ip->i_size);
- printf("time=%s", ctime(&ip->i_ctime));
- printf("link=%d\n", ip->i_links_count);
- printf("i_block[0]=%d\n", ip->i_block[0]);
- }
- /*****************************
- u16 i_mode; // same as st_imode in stat() syscall
- u16 i_uid; // ownerID
- u32 i_size; // file size in bytes
- u32 i_atime; // time fields
- u32 i_ctime;
- u32 i_mtime;
- u32 i_dtime;
- u16 i_gid; // groupID
- u16 i_links_count; // link count
- u32 i_blocks; // IGNORE
- u32 i_flags; // IGNORE
- u32 i_reserved1; // IGNORE
- u32 i_block[15]; // IMPORTANT, but later
- ***************************/
- /******************************
- inode_block = 10
- mode= 41ed
- uid=0
- gid=0
- size=1024
- time=Mon Feb 9 07:32:16 2014
- link=3
- i_block[0]=33
- ******************************/
- unsigned long search(INODE *inodePtr, char *name)
- {
- DIR *dp = (DIR *) buff;
- int i,j;
- char *cp, tmp[256];
- for (i = 0; i < 12; i++) {
- cp = buff;
- dp = (DIR *) buff;
- lseek(fd, inodePtr->i_block[i]*BLOCK_SIZE, SEEK_SET);
- read(fd, buff, 1024);
- while(cp < buff + 1024){
- for (j = 0; j < dp->name_len; j++) {
- tmp[j]=(char)dp->name[j];
- }
- tmp[j] = 0;
- if(strcmp(name, tmp) == 0 ) {
- return dp->inode;
- }else{
- cp += dp->rec_len;
- dp = (DIR *)cp;
- if((dp->inode == 0) && (inodePtr->i_block[i+1] == 0))
- return 0;
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement