Advertisement
Guest User

copypasta2

a guest
Mar 23rd, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.13 KB | None | 0 0
  1. /********* super.c code ***************/
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <fcntl.h>
  5. #include <ext2fs/ext2_fs.h>
  6.  
  7. typedef unsigned char u8;
  8. typedef unsigned short u16;
  9. typedef unsigned int u32;
  10.  
  11. // define shorter TYPES, save typing efforts
  12. typedef struct ext2_group_desc GD;
  13. typedef struct ext2_super_block SUPER;
  14. typedef struct ext2_inode INODE;
  15. typedef struct ext2_dir_entry_2 DIR; // need this for new version of e2fs
  16.  
  17. GD *gp;
  18. SUPER *sp;
  19. INODE *ip;
  20. DIR *dp;
  21.  
  22. #define BLKSIZE 1024
  23.  
  24. /******************* in <ext2fs/ext2_fs.h>*******************************
  25. struct ext2_super_block {
  26. u32 s_inodes_count; // total number of inodes
  27. u32 s_blocks_count; // total number of blocks
  28. u32 s_r_blocks_count;
  29. u32 s_free_blocks_count; // current number of free blocks
  30. u32 s_free_inodes_count; // current number of free inodes
  31. u32 s_first_data_block; // first data block in this group
  32. u32 s_log_block_size; // 0 for 1KB block size
  33. u32 s_log_frag_size;
  34. u32 s_blocks_per_group; // 8192 blocks per group
  35. u32 s_frags_per_group;
  36. u32 s_inodes_per_group;
  37. u32 s_mtime;
  38. u32 s_wtime;
  39. u16 s_mnt_count; // number of times mounted
  40. u16 s_max_mnt_count; // mount limit
  41. u16 s_magic; // 0xEF53
  42. // A FEW MORE non-essential fields
  43. };
  44. **********************************************************************/
  45.  
  46. char buf[BLKSIZE];
  47. int fd;
  48. int iblock;
  49.  
  50. int get_block(int fd, int blk, char buf[ ])
  51. {
  52. lseek(fd, (long)blk*BLKSIZE, 0);
  53. read(fd, buf, BLKSIZE);
  54. }
  55.  
  56. super()
  57. {
  58. // read SUPER block
  59. get_block(fd, 1, buf);
  60. sp = (SUPER *)buf;
  61.  
  62. // check for EXT2 magic number:
  63. printf("\n*******super*******\n");
  64. printf("s_magic = %x\n", sp->s_magic);
  65. if (sp->s_magic != 0xEF53){
  66. printf("NOT an EXT2 FS\n");
  67. exit(1);
  68. }
  69.  
  70. printf("EXT2 FS OK\n");
  71.  
  72. printf("s_inodes_count = %d\n", sp->s_inodes_count);
  73. printf("s_blocks_count = %d\n", sp->s_blocks_count);
  74.  
  75. printf("s_free_inodes_count = %d\n", sp->s_free_inodes_count);
  76. printf("s_free_blocks_count = %d\n", sp->s_free_blocks_count);
  77. printf("s_first_data_blcok = %d\n", sp->s_first_data_block);
  78.  
  79.  
  80. printf("s_log_block_size = %d\n", sp->s_log_block_size);
  81. // printf("s_log_frag_size = %d\n", sp->s_log_frag_size);
  82.  
  83. printf("s_blocks_per_group = %d\n", sp->s_blocks_per_group);
  84. // printf("s_frags_per_group = %d\n", sp->s_frags_per_group);
  85. printf("s_inodes_per_group = %d\n", sp->s_inodes_per_group);
  86.  
  87.  
  88. printf("s_mnt_count = %d\n", sp->s_mnt_count);
  89. printf("s_max_mnt_count = %d\n", sp->s_max_mnt_count);
  90.  
  91. printf("s_magic = %x\n", sp->s_magic);
  92.  
  93. printf("s_mtime = %s", ctime(&sp->s_mtime));
  94. printf("s_wtime = %s", ctime(&sp->s_wtime));
  95.  
  96.  
  97. }
  98.  
  99. char *disk = "mydisk";
  100.  
  101. main(int argc, char *argv[ ])
  102.  
  103. {
  104. if (argc > 1)
  105. disk = argv[1];
  106. fd = open(disk, O_RDONLY);
  107. if (fd < 0){
  108. printf("open failed\n");
  109. exit(1);
  110. }
  111.  
  112. super();
  113. gd();
  114. bmap();
  115. inode();
  116. }
  117.  
  118. /***** SAMPLE OUTPUTs of super.c ****************
  119. s_inodes_count = 184
  120. s_blocks_count = 1440
  121. s_free_inodes_count = 174
  122. s_free_blocks_count = 1411
  123. s_log_block_size = 0
  124. s_blocks_per_group = 8192
  125. s_inodes_per_group = 184
  126. s_mnt_count = 1
  127. s_max_mnt_count = 34
  128. s_magic = ef53
  129. s_mtime = Mon Feb 9 07:08:22 2004
  130. s_inode_size = 128
  131. ************************************************
  132.  
  133. 2. WRITE YOUR OWN gd.c to print information of Group Descriptor 0
  134.  
  135. * calculate number of block groups on the disk
  136. unsigned int group_count = 1 + (super.s_blocks_count-1) / super.s_blocks_per_group;
  137.  
  138. /* calculate size of the group descriptor list in bytes
  139. unsigned int descr_list_size = group_count * sizeof(struct ext2_group_descr);
  140. */
  141.  
  142. gd()
  143. {
  144. // read SUPER block
  145. get_block(fd, 2, buf);
  146. gp = (GD *)buf;
  147. printf("\n*******GD*******\n");
  148. printf("bg_block_bitmap = %d\n", gp->bg_block_bitmap);
  149. printf("bg_inode_bitmap = %d\n", gp->bg_inode_bitmap);
  150. printf("bg_inode_table = %d\n", gp->bg_inode_table);
  151. printf("bg_free_blocks_count = %u\n", gp->bg_free_blocks_count);
  152. printf("bg_free_inodes_count = %u\n", gp->bg_free_inodes_count);
  153. printf("bp->bg_used_dirs_count = %u\n", gp->bg_used_dirs_count);
  154. }
  155.  
  156. /**** imap.c ***/
  157. int tst_bit(char *buf, int bit)
  158. {
  159. int i, j;
  160. i = bit / 8; j = bit % 8;
  161. if (buf[i] & (1 << j))
  162. return 1;
  163. return 0;
  164. }
  165.  
  166. imap()
  167. {
  168. char buf[BLKSIZE];
  169. int imap, ninodes;
  170. int i;
  171.  
  172. // read SUPER block
  173. get_block(fd, 1, buf);
  174. sp = (SUPER *)buf;
  175.  
  176. ninodes = sp->s_inodes_count;
  177. printf("ninodes = %d\n", ninodes);
  178.  
  179. // read Group Descriptor 0
  180. get_block(fd, 2, buf);
  181. gp = (GD *)buf;
  182.  
  183. imap = gp->bg_inode_bitmap;
  184. printf("bmap = %d\n", imap);
  185.  
  186. // read inode_bitmap block
  187. get_block(fd, imap, buf);
  188.  
  189. for (i=0; i < ninodes; i++){
  190. (tst_bit(buf, i)) ? putchar('1') : putchar('0');
  191. if (i && (i % 8)==0)
  192. printf(" ");
  193. }
  194. printf("\n");
  195. }
  196.  
  197. /**** bmap.c ***/
  198. bmap()
  199. {
  200. // read SUPER block
  201. char buf[BLKSIZE];
  202. int bmap, nblocks;
  203. int i;
  204.  
  205. // read SUPER block
  206. get_block(fd, 1, buf);
  207. sp = (SUPER *)buf;
  208.  
  209. nblocks = sp->s_blocks_count;
  210. printf("\n********bmap*********\n");
  211. printf("nblocks = %d\n", nblocks);
  212.  
  213. // read Group Descriptor 0
  214. get_block(fd, 2, buf);
  215. gp = (GD *)buf;
  216.  
  217. bmap = gp->bg_block_bitmap;
  218. printf("block bmap = %d\n", bmap);
  219.  
  220.  
  221. get_block(fd, bmap, buf);
  222.  
  223. for (i=1; i < nblocks; i++){
  224. (tst_bit(buf, i)) ? putchar('1') : putchar('0');
  225. if (i && (i % 8)==0)
  226. printf(" ");
  227. if(i && (i%80) == 0)
  228. printf("\n");
  229. }
  230. printf("\n");
  231.  
  232. }
  233.  
  234. inode()
  235. {
  236. char buf[BLKSIZE];
  237.  
  238. // read GD
  239. get_block(fd, 2, buf);
  240. gp = (GD *)buf;
  241. /****************
  242. printf("%8d %8d %8d %8d %8d %8d\n",
  243. gp->bg_block_bitmap,
  244. gp->bg_inode_bitmap,
  245. gp->bg_inode_table,
  246. gp->bg_free_blocks_count,
  247. gp->bg_free_inodes_count,
  248. gp->bg_used_dirs_count);
  249. ****************/
  250. iblock = gp->bg_inode_table; // get inode start block#
  251. printf("\n********inode********\n");
  252. printf("inode_block=%d\n", iblock);
  253.  
  254. // get inode start block
  255. get_block(fd, iblock, buf);
  256.  
  257. ip = (INODE *)buf + 1; // ip points at 2nd INODE
  258.  
  259. printf("mode=%4x ", ip->i_mode);
  260. printf("uid=%d gid=%d\n", ip->i_uid, ip->i_gid);
  261. printf("size=%d\n", ip->i_size);
  262. printf("time=%s", ctime(&ip->i_ctime));
  263. printf("link=%d\n", ip->i_links_count);
  264. printf("i_block[0]=%d\n", ip->i_block[0]);
  265. }
  266.  
  267. /*****************************
  268. u16 i_mode; // same as st_imode in stat() syscall
  269. u16 i_uid; // ownerID
  270. u32 i_size; // file size in bytes
  271. u32 i_atime; // time fields
  272. u32 i_ctime;
  273. u32 i_mtime;
  274. u32 i_dtime;
  275. u16 i_gid; // groupID
  276. u16 i_links_count; // link count
  277. u32 i_blocks; // IGNORE
  278. u32 i_flags; // IGNORE
  279. u32 i_reserved1; // IGNORE
  280. u32 i_block[15]; // IMPORTANT, but later
  281. ***************************/
  282.  
  283.  
  284. /******************************
  285. inode_block = 10
  286. mode= 41ed
  287. uid=0
  288. gid=0
  289. size=1024
  290. time=Mon Feb 9 07:32:16 2014
  291. link=3
  292. i_block[0]=33
  293. ******************************/
  294.  
  295. unsigned long search(INODE *inodePtr, char *name)
  296. {
  297. DIR *dp = (DIR *) buff;
  298. int i,j;
  299. char *cp, tmp[256];
  300. for (i = 0; i < 12; i++) {
  301. cp = buff;
  302. dp = (DIR *) buff;
  303. lseek(fd, inodePtr->i_block[i]*BLOCK_SIZE, SEEK_SET);
  304. read(fd, buff, 1024);
  305.  
  306. while(cp < buff + 1024){
  307. for (j = 0; j < dp->name_len; j++) {
  308. tmp[j]=(char)dp->name[j];
  309. }
  310. tmp[j] = 0;
  311. if(strcmp(name, tmp) == 0 ) {
  312. return dp->inode;
  313. }else{
  314. cp += dp->rec_len;
  315. dp = (DIR *)cp;
  316. if((dp->inode == 0) && (inodePtr->i_block[i+1] == 0))
  317. return 0;
  318. }
  319. }
  320. }
  321. return 0;
  322. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement