Beispiel #1
0
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);
}
Beispiel #2
0
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(&param, 0, sizeof(param));
	param.s_blocks_count = 32768;

	retval = ext2fs_initialize("test fs", 0, &param,
				   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;
}