int main(int argc, char *argv[]) { int fd, len, rc = EXIT_SUCCESS; struct stat s; char *filename = NULL; uint8_t *image; int argflag; uint8_t *digest = NULL; while ((argflag = getopt_long(argc, argv, "d:hlv", long_options, NULL)) > 0) { switch (argflag) { case 'v': printf("fmap suite version: %d.%d\n", VERSION_MAJOR, VERSION_MINOR);; goto do_exit_1; case 'h': print_help(); goto do_exit_1; default: print_help(); rc = EXIT_FAILURE; goto do_exit_1; } } /* quit if filename not specified */ if (argv[optind]) { filename = argv[optind]; } else { print_help(); rc = EXIT_FAILURE; goto do_exit_1; } fd = open(filename, O_RDONLY); if (fd < 0) { fprintf(stderr, "unable to open file \"%s\": %s\n", filename, strerror(errno)); rc = EXIT_FAILURE; goto do_exit_1; } if (fstat(fd, &s) < 0) { fprintf(stderr, "unable to stat file \"%s\": %s\n", filename, strerror(errno)); rc = EXIT_FAILURE; goto do_exit_2; } image = mmap(NULL, s.st_size, PROT_READ, MAP_PRIVATE, fd, 0); if (image == MAP_FAILED) { fprintf(stderr, "unable to map file \"%s\": %s\n", filename, strerror(errno)); rc = EXIT_FAILURE; goto do_exit_2; } if ((len = fmap_get_csum(image, s.st_size, &digest)) < 0) { fprintf(stderr, "unable to obtain checksum\n"); rc = EXIT_FAILURE; goto do_exit_3; } print_csum(digest, len); do_exit_3: munmap(image, s.st_size); free(digest); do_exit_2: close(fd); do_exit_1: exit(rc); }
int main(int argc, char **argv) { struct ext2_super_block param; errcode_t retval; ext2_filsys fs; int i; __u16 csum1, csum2, csum_known = 0xd3a4; memset(¶m, 0, sizeof(param)); param.s_blocks_count = 32768; retval = ext2fs_initialize("test fs", 0, ¶m, test_io_manager, &fs); if (retval) { com_err("setup", retval, "While initializing filesystem"); exit(1); } memcpy(fs->super->s_uuid, sb_uuid, 16); fs->super->s_feature_ro_compat = EXT4_FEATURE_RO_COMPAT_GDT_CSUM; for (i=0; i < fs->group_desc_count; i++) { fs->group_desc[i].bg_block_bitmap = 124; fs->group_desc[i].bg_inode_bitmap = 125; fs->group_desc[i].bg_inode_table = 126; fs->group_desc[i].bg_free_blocks_count = 31119; fs->group_desc[i].bg_free_inodes_count = 15701; fs->group_desc[i].bg_used_dirs_count = 2; fs->group_desc[i].bg_flags = 0; }; csum1 = ext2fs_group_desc_csum(fs, 0); print_csum("csum0000", fs, 0); if (csum1 != csum_known) { printf("checksum for group 0 should be %04x\n", csum_known); exit(1); } csum2 = ext2fs_group_desc_csum(fs, 1); print_csum("csum0001", fs, 1); if (csum1 == csum2) { printf("checksums for different groups shouldn't match\n"); exit(1); } csum2 = ext2fs_group_desc_csum(fs, 2); print_csum("csumffff", fs, 2); if (csum1 == csum2) { printf("checksums for different groups shouldn't match\n"); exit(1); } fs->group_desc[0].bg_checksum = csum1; csum2 = ext2fs_group_desc_csum(fs, 0); print_csum("csum_set", fs, 0); if (csum1 != csum2) { printf("checksums should not depend on checksum field\n"); exit(1); } if (!ext2fs_group_desc_csum_verify(fs, 0)) { printf("checksums should verify against gd_checksum\n"); exit(1); } memset(fs->super->s_uuid, 0x30, sizeof(fs->super->s_uuid)); print_csum("new_uuid", fs, 0); if (ext2fs_group_desc_csum_verify(fs, 0) != 0) { printf("checksums for different filesystems shouldn't match\n"); exit(1); } csum1 = fs->group_desc[0].bg_checksum = ext2fs_group_desc_csum(fs, 0); print_csum("csum_new", fs, 0); fs->group_desc[0].bg_free_blocks_count = 1; csum2 = ext2fs_group_desc_csum(fs, 0); print_csum("csum_blk", fs, 0); if (csum1 == csum2) { printf("checksums for different data shouldn't match\n"); exit(1); } return 0; }