# HG changeset patch # User Michael Spacefalcon # Date 1390696462 0 # Node ID ffaa033e7643d6a18fbe709d8f4e47551c3896eb # Parent 24ed817dd25da554f70a3941c32a1d4638196546 tiffs IVA: find_inode_block() integrated diff -r 24ed817dd25d -r ffaa033e7643 ffstools/tiffs-rd/basics.c --- a/ffstools/tiffs-rd/basics.c Sat Jan 25 23:56:47 2014 +0000 +++ b/ffstools/tiffs-rd/basics.c Sun Jan 26 00:34:22 2014 +0000 @@ -24,7 +24,7 @@ extern int index_blk_num, root_node_no; extern int verbose; -u_char *image; +u8 *image, *inode_block; read_ffs_image() { @@ -72,3 +72,76 @@ } exit(0); } + +find_inode_block() +{ + int i, abcnt; + u8 *ptr; + + if (index_blk_num >= 0) { + if (index_blk_num >= total_blocks) { + fprintf(stderr, + "invalid block # given with the -a option\n"); + exit(1); + } + ptr = image + index_blk_num * eraseblk_size; + if (bcmp(ptr, tiffs_header, sizeof tiffs_header)) { + fprintf(stderr, + "error: block specified with -a has no TIFFS header\n"); + exit(1); + } + if (ptr[8] != 0xAB) { + fprintf(stderr, + "error: block specified with -a is not an AB block\n"); + exit(1); + } + inode_block = ptr; + return(0); + } + abcnt = 0; + for (ptr = image, i = 0; i < total_blocks; i++, ptr += eraseblk_size) { + if (bcmp(ptr, tiffs_header, sizeof tiffs_header)) { + fprintf(stderr, + "warning: no TIFFS signature in erase block #%d (offset %x)\n", + i, ptr - image); + continue; + } + switch (ptr[8]) { + case 0xAB: + if (verbose) + printf( + "Found AB index in erase block #%d (offset %x)\n", + i, ptr - image); + index_blk_num = i; + inode_block = ptr; + abcnt++; + continue; + case 0xBD: + case 0xBF: + continue; + } + fprintf(stderr, + "warning: unexpected block type/status %02X at offset %x\n", + ptr[8], ptr - image); + } + if (!inode_block) { + fprintf(stderr, + "error: could not find an active inode block in %s\n", + imgfile); + exit(1); + } + if (abcnt > 1) { + fprintf(stderr, + "error: found more than one AB block; use -a\n"); + exit(1); + } + return(0); +} + +cmd_fsinfo() +{ + read_ffs_image(); + find_inode_block(); + printf("Active inode block (AB) is block #%d\n", index_blk_num); + exit(0); +} diff -r 24ed817dd25d -r ffaa033e7643 ffstools/tiffs-rd/main.c --- a/ffstools/tiffs-rd/main.c Sat Jan 25 23:56:47 2014 +0000 +++ b/ffstools/tiffs-rd/main.c Sun Jan 26 00:34:22 2014 +0000 @@ -59,6 +59,7 @@ } extern int cmd_blkhdr(); +extern int cmd_fsinfo(); static struct cmdtab { char *cmd; @@ -67,6 +68,7 @@ {"blkhdr", cmd_blkhdr}, {"cat", NULL}, {"fsck", NULL}, + {"fsinfo", cmd_fsinfo}, {"ls", NULL}, {"xtr", NULL}, {NULL, NULL}