diff options
| author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2020-04-27 11:59:02 +0200 | 
|---|---|---|
| committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2020-04-27 11:59:02 +0200 | 
| commit | 20b0d509f67dea802706cd6b80b5e20d14988931 (patch) | |
| tree | 3a87ea358b1206f6823777693d109896d6908283 /difftool | |
| parent | 9e332a2d3eddcc262476ac263e03df021b3c44b4 (diff) | |
Cleanup directory structure of the binary programs
Instead of having the binary programs in randomly named subdirectories,
move all of them to a "bin" subdirectory, similar to the utility
libraries that have subdirectories within "lib" and give the
subdirectories the propper names (e.g. have gensquashfs source in a
directory *actually* named "gensquashfs").
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'difftool')
| -rw-r--r-- | difftool/Makemodule.am | 9 | ||||
| -rw-r--r-- | difftool/compare_dir.c | 94 | ||||
| -rw-r--r-- | difftool/compare_files.c | 72 | ||||
| -rw-r--r-- | difftool/extract.c | 57 | ||||
| -rw-r--r-- | difftool/node_compare.c | 203 | ||||
| -rw-r--r-- | difftool/options.c | 131 | ||||
| -rw-r--r-- | difftool/sqfsdiff.c | 168 | ||||
| -rw-r--r-- | difftool/sqfsdiff.h | 69 | ||||
| -rw-r--r-- | difftool/super.c | 125 | ||||
| -rw-r--r-- | difftool/util.c | 25 | 
10 files changed, 0 insertions, 953 deletions
| diff --git a/difftool/Makemodule.am b/difftool/Makemodule.am deleted file mode 100644 index ba597b3..0000000 --- a/difftool/Makemodule.am +++ /dev/null @@ -1,9 +0,0 @@ -sqfsdiff_SOURCES = difftool/sqfsdiff.c difftool/sqfsdiff.h difftool/util.c -sqfsdiff_SOURCES += difftool/compare_dir.c difftool/node_compare.c -sqfsdiff_SOURCES += difftool/compare_files.c difftool/super.c -sqfsdiff_SOURCES += difftool/extract.c difftool/options.c -sqfsdiff_CFLAGS = $(AM_CFLAGS) $(PTHREAD_CFLAGS) -sqfsdiff_LDADD = libcommon.a libsquashfs.la libcompat.a $(LZO_LIBS) libfstree.a -sqfsdiff_LDADD += $(PTHREAD_LIBS) - -bin_PROGRAMS += sqfsdiff diff --git a/difftool/compare_dir.c b/difftool/compare_dir.c deleted file mode 100644 index 1a4c800..0000000 --- a/difftool/compare_dir.c +++ /dev/null @@ -1,94 +0,0 @@ -/* SPDX-License-Identifier: GPL-3.0-or-later */ -/* - * compare_dir.c - * - * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> - */ -#include "sqfsdiff.h" - -static int print_omitted(sqfsdiff_t *sd, bool is_old, sqfs_tree_node_t *n) -{ -	char *path = node_path(n); - -	if (path == NULL) -		return -1; - -	fprintf(stdout, "%c %s\n", is_old ? '<' : '>', path); - -	if ((sd->compare_flags & COMPARE_EXTRACT_FILES) && -	    S_ISREG(n->inode->base.mode)) { -		if (extract_files(sd, is_old ? n->inode : NULL, -				  is_old ? NULL : n->inode, path)) { -			free(path); -			return -1; -		} -	} - -	free(path); - -	for (n = n->children; n != NULL; n = n->next) { -		if (print_omitted(sd, is_old, n)) -			return -1; -	} - -	return 0; -} - -int compare_dir_entries(sqfsdiff_t *sd, sqfs_tree_node_t *old, -			sqfs_tree_node_t *new) -{ -	sqfs_tree_node_t *old_it = old->children, *old_prev = NULL; -	sqfs_tree_node_t *new_it = new->children, *new_prev = NULL; -	int ret, result = 0; - -	while (old_it != NULL || new_it != NULL) { -		if (old_it != NULL && new_it != NULL) { -			ret = strcmp((const char *)old_it->name, -				     (const char *)new_it->name); -		} else if (old_it == NULL) { -			ret = 1; -		} else { -			ret = -1; -		} - -		if (ret < 0) { -			result = 1; - -			if (print_omitted(sd, true, old_it)) -				return -1; - -			if (old_prev == NULL) { -				old->children = old_it->next; -				sqfs_dir_tree_destroy(old_it); -				old_it = old->children; -			} else { -				old_prev->next = old_it->next; -				sqfs_dir_tree_destroy(old_it); -				old_it = old_prev->next; -			} -		} else if (ret > 0) { -			result = 1; - -			if (print_omitted(sd, false, new_it)) -				return -1; - -			if (new_prev == NULL) { -				new->children = new_it->next; -				sqfs_dir_tree_destroy(new_it); -				new_it = new->children; -			} else { -				new_prev->next = new_it->next; -				sqfs_dir_tree_destroy(new_it); -				new_it = new_prev->next; -			} -		} else { -			old_prev = old_it; -			old_it = old_it->next; - -			new_prev = new_it; -			new_it = new_it->next; -		} -	} - -	return result; -} diff --git a/difftool/compare_files.c b/difftool/compare_files.c deleted file mode 100644 index 51b66bb..0000000 --- a/difftool/compare_files.c +++ /dev/null @@ -1,72 +0,0 @@ -/* SPDX-License-Identifier: GPL-3.0-or-later */ -/* - * compare_files.c - * - * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> - */ -#include "sqfsdiff.h" - -static unsigned char old_buf[MAX_WINDOW_SIZE]; -static unsigned char new_buf[MAX_WINDOW_SIZE]; - -static int read_blob(const char *prefix, const char *path, -		     sqfs_data_reader_t *rd, const sqfs_inode_generic_t *inode, -		     void *buffer, sqfs_u64 offset, size_t size) -{ -	ssize_t ret; - -	ret = sqfs_data_reader_read(rd, inode, offset, buffer, size); -	ret = (ret < 0 || (size_t)ret < size) ? -1 : 0; - -	if (ret) { -		fprintf(stderr, "Failed to read %s from %s\n", -			path, prefix); -		return -1; -	} - -	return 0; -} - -int compare_files(sqfsdiff_t *sd, const sqfs_inode_generic_t *old, -		  const sqfs_inode_generic_t *new, const char *path) -{ -	sqfs_u64 offset, diff, oldsz, newsz; -	int status = 0, ret; - -	sqfs_inode_get_file_size(old, &oldsz); -	sqfs_inode_get_file_size(new, &newsz); - -	if (oldsz != newsz) -		goto out_different; - -	if (sd->compare_flags & COMPARE_NO_CONTENTS) -		return 0; - -	for (offset = 0; offset < oldsz; offset += diff) { -		diff = oldsz - offset; - -		if (diff > MAX_WINDOW_SIZE) -			diff = MAX_WINDOW_SIZE; - -		ret = read_blob(sd->old_path, path, -				sd->sqfs_old.data, old, old_buf, offset, diff); -		if (ret) -			return -1; - -		ret = read_blob(sd->new_path, path, -				sd->sqfs_new.data, new, new_buf, offset, diff); -		if (ret) -			return -1; - -		if (memcmp(old_buf, new_buf, diff) != 0) -			goto out_different; -	} - -	return status; -out_different: -	if (sd->compare_flags & COMPARE_EXTRACT_FILES) { -		if (extract_files(sd, old, new, path)) -			return -1; -	} -	return 1; -} diff --git a/difftool/extract.c b/difftool/extract.c deleted file mode 100644 index 979572a..0000000 --- a/difftool/extract.c +++ /dev/null @@ -1,57 +0,0 @@ -/* SPDX-License-Identifier: GPL-3.0-or-later */ -/* - * extract.c - * - * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> - */ -#include "sqfsdiff.h" - -static int extract(sqfs_data_reader_t *data, const sqfs_inode_generic_t *inode, -		   const char *prefix, const char *path, size_t block_size) -{ -	char *ptr, *temp; -	FILE *fp; - -	temp = alloca(strlen(prefix) + strlen(path) + 2); -	sprintf(temp, "%s/%s", prefix, path); - -	ptr = strrchr(temp, '/'); -	*ptr = '\0'; -	if (mkdir_p(temp)) -		return -1; -	*ptr = '/'; - -	fp = fopen(temp, "wb"); -	if (fp == NULL) { -		perror(temp); -		return -1; -	} - -	if (sqfs_data_reader_dump(path, data, inode, fp, block_size, true)) { -		fclose(fp); -		return -1; -	} - -	fflush(fp); -	fclose(fp); -	return 0; -} - -int extract_files(sqfsdiff_t *sd, const sqfs_inode_generic_t *old, -		  const sqfs_inode_generic_t *new, -		  const char *path) -{ -	if (old != NULL) { -		if (extract(sd->sqfs_old.data, old, "old", -			    path, sd->sqfs_old.super.block_size)) -			return -1; -	} - -	if (new != NULL) { -		if (extract(sd->sqfs_new.data, new, "new", -			    path, sd->sqfs_new.super.block_size)) -			return -1; -	} - -	return 0; -} diff --git a/difftool/node_compare.c b/difftool/node_compare.c deleted file mode 100644 index 59d1831..0000000 --- a/difftool/node_compare.c +++ /dev/null @@ -1,203 +0,0 @@ -/* SPDX-License-Identifier: GPL-3.0-or-later */ -/* - * node_compare.c - * - * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> - */ -#include "sqfsdiff.h" - -int node_compare(sqfsdiff_t *sd, sqfs_tree_node_t *a, sqfs_tree_node_t *b) -{ -	char *path = sqfs_tree_node_get_path(a); -	sqfs_tree_node_t *ait, *bit; -	bool promoted, demoted; -	int ret, status = 0; - -	if (path == NULL) { -		perror("constructing absolute file path"); -		return -1; -	} - -	if (a->inode->base.type != b->inode->base.type) { -		promoted = demoted = false; - -		switch (a->inode->base.type) { -		case SQFS_INODE_DIR: -			if (b->inode->base.type == SQFS_INODE_EXT_DIR) -				promoted = true; -			break; -		case SQFS_INODE_FILE: -			if (b->inode->base.type == SQFS_INODE_EXT_FILE) -				promoted = true; -			break; -		case SQFS_INODE_SLINK: -			if (b->inode->base.type == SQFS_INODE_EXT_SLINK) -				promoted = true; -			break; -		case SQFS_INODE_BDEV: -			if (b->inode->base.type == SQFS_INODE_EXT_BDEV) -				promoted = true; -			break; -		case SQFS_INODE_CDEV: -			if (b->inode->base.type == SQFS_INODE_EXT_CDEV) -				promoted = true; -			break; -		case SQFS_INODE_FIFO: -			if (b->inode->base.type == SQFS_INODE_EXT_FIFO) -				promoted = true; -			break; -		case SQFS_INODE_SOCKET: -			if (b->inode->base.type == SQFS_INODE_EXT_SOCKET) -				promoted = true; -			break; -		case SQFS_INODE_EXT_DIR: -			if (b->inode->base.type == SQFS_INODE_DIR) -				demoted = true; -			break; -		case SQFS_INODE_EXT_FILE: -			if (b->inode->base.type == SQFS_INODE_FILE) -				demoted = true; -			break; -		case SQFS_INODE_EXT_SLINK: -			if (b->inode->base.type == SQFS_INODE_SLINK) -				demoted = true; -			break; -		case SQFS_INODE_EXT_BDEV: -			if (b->inode->base.type == SQFS_INODE_BDEV) -				demoted = true; -			break; -		case SQFS_INODE_EXT_CDEV: -			if (b->inode->base.type == SQFS_INODE_CDEV) -				demoted = true; -			break; -		case SQFS_INODE_EXT_FIFO: -			if (b->inode->base.type == SQFS_INODE_FIFO) -				demoted = true; -			break; -		case SQFS_INODE_EXT_SOCKET: -			if (b->inode->base.type == SQFS_INODE_SOCKET) -				demoted = true; -			break; -		} - -		if (promoted) { -			fprintf(stdout, "%s has an extended type\n", path); -			status = 1; -		} else if (demoted) { -			fprintf(stdout, "%s has a basic type\n", path); -			status = 1; -		} else { -			fprintf(stdout, "%s has a different type\n", path); -			free(path); -			return 1; -		} -	} - -	if (!(sd->compare_flags & COMPARE_NO_PERM)) { -		if ((a->inode->base.mode & ~S_IFMT) != -		    (b->inode->base.mode & ~S_IFMT)) { -			fprintf(stdout, "%s has different permissions\n", -				path); -			status = 1; -		} -	} - -	if (!(sd->compare_flags & COMPARE_NO_OWNER)) { -		if (a->uid != b->uid || a->gid != b->gid) { -			fprintf(stdout, "%s has different ownership\n", path); -			status = 1; -		} -	} - -	if (sd->compare_flags & COMPARE_TIMESTAMP) { -		if (a->inode->base.mod_time != b->inode->base.mod_time) { -			fprintf(stdout, "%s has a different timestamp\n", path); -			status = 1; -		} -	} - -	if (sd->compare_flags & COMPARE_INODE_NUM) { -		if (a->inode->base.inode_number != -		    b->inode->base.inode_number) { -			fprintf(stdout, "%s has a different inode number\n", -				path); -			status = 1; -		} -	} - -	switch (a->inode->base.type) { -	case SQFS_INODE_SOCKET: -	case SQFS_INODE_EXT_SOCKET: -	case SQFS_INODE_FIFO: -	case SQFS_INODE_EXT_FIFO: -		break; -	case SQFS_INODE_BDEV: -	case SQFS_INODE_CDEV: -		if (a->inode->data.dev.devno != b->inode->data.dev.devno) { -			fprintf(stdout, "%s has different device number\n", -				path); -			status = 1; -		} -		break; -	case SQFS_INODE_EXT_BDEV: -	case SQFS_INODE_EXT_CDEV: -		if (a->inode->data.dev_ext.devno != -		    b->inode->data.dev_ext.devno) { -			fprintf(stdout, "%s has different device number\n", -				path); -			status = 1; -		} -		break; -	case SQFS_INODE_SLINK: -	case SQFS_INODE_EXT_SLINK: -		if (strcmp((const char *)a->inode->extra, -			   (const char *)b->inode->extra)) { -			fprintf(stdout, "%s has a different link target\n", -				path); -		} -		break; -	case SQFS_INODE_DIR: -	case SQFS_INODE_EXT_DIR: -		ret = compare_dir_entries(sd, a, b); -		if (ret < 0) { -			status = -1; -			break; -		} -		if (ret > 0) -			status = 1; - -		free(path); -		path = NULL; - -		ait = a->children; -		bit = b->children; - -		while (ait != NULL && bit != NULL) { -			ret = node_compare(sd, ait, bit); -			if (ret < 0) -				return -1; -			if (ret > 0) -				status = 1; - -			ait = ait->next; -			bit = bit->next; -		} -		break; -	case SQFS_INODE_FILE: -	case SQFS_INODE_EXT_FILE: -		ret = compare_files(sd, a->inode, b->inode, path); -		if (ret < 0) { -			status = -1; -		} else if (ret > 0) { -			fprintf(stdout, "regular file %s differs\n", path); -			status = 1; -		} -		break; -	default: -		fprintf(stdout, "%s has unknown type, ignoring\n", path); -		break; -	} - -	free(path); -	return status; -} diff --git a/difftool/options.c b/difftool/options.c deleted file mode 100644 index b8ce7f0..0000000 --- a/difftool/options.c +++ /dev/null @@ -1,131 +0,0 @@ -/* SPDX-License-Identifier: GPL-3.0-or-later */ -/* - * sqfsdiff.c - * - * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> - */ -#include "sqfsdiff.h" - -static struct option long_opts[] = { -	{ "old", required_argument, NULL, 'a' }, -	{ "new", required_argument, NULL, 'b' }, -	{ "no-owner", no_argument, NULL, 'O' }, -	{ "no-permissions", no_argument, NULL, 'P' }, -	{ "no-contents", no_argument, NULL, 'C' }, -	{ "timestamps", no_argument, NULL, 'T' }, -	{ "inode-num", no_argument, NULL, 'I' }, -	{ "super", no_argument, NULL, 'S' }, -	{ "extract", required_argument, NULL, 'e' }, -	{ "help", no_argument, NULL, 'h' }, -	{ "version", no_argument, NULL, 'V' }, -	{ NULL, 0, NULL, 0 }, -}; - -static const char *short_opts = "a:b:OPCTISe:hV"; - -static const char *usagestr = -"Usage: sqfsdiff [OPTIONS...] --old,-a <first> --new,-b <second>\n" -"\n" -"Compare two squashfs images. In contrast to doing a direct diff of the\n" -"images, this actually parses the filesystems and generates a more\n" -"meaningful difference report.\n" -"\n" -"If only contents are compared, any differences in packed file layout,\n" -"ordering, compression, inode meta data and so on is ignored and the two\n" -"images are considered equal if each directory contains the same entries,\n" -"symlink with the same paths have the same targets, device nodes the same\n" -"device number and files the same size and contents.\n" -"\n" -"A report of any difference is printed to stdout. The exit status is similar\n" -"that of diff(1): 0 means equal, 1 means different, 2 means problem.\n" -"\n" -"Possible options:\n" -"\n" -"  --old, -a <first>           The first of the two filesystems to compare.\n" -"  --new, -b <second>          The second of the two filesystems to compare.\n" -"\n" -"  --no-contents, -C           Do not compare file contents.\n" -"  --no-owner, -O              Do not compare file owners.\n" -"  --no-permissions, -P        Do not compare permission bits.\n" -"\n" -"  --timestamps, -T            Compare file timestamps.\n" -"  --inode-num, -I             Compare inode numbers of all files.\n" -"  --super, -S                 Also compare meta data in super blocks.\n" -"\n" -"  --extract, -e <path>        Extract files that differ to the specified\n" -"                              directory. Contents of the first filesystem\n" -"                              end up in a subdirectory 'old' and of the\n" -"                              second filesystem in a subdirectory 'new'.\n" -"\n" -"  --help, -h                  Print help text and exit.\n" -"  --version, -V               Print version information and exit.\n" -"\n"; - -void process_options(sqfsdiff_t *sd, int argc, char **argv) -{ -	int i; - -	for (;;) { -		i = getopt_long(argc, argv, short_opts, long_opts, NULL); -		if (i == -1) -			break; - -		switch (i) { -		case 'a': -			sd->old_path = optarg; -			break; -		case 'b': -			sd->new_path = optarg; -			break; -		case 'O': -			sd->compare_flags |= COMPARE_NO_OWNER; -			break; -		case 'P': -			sd->compare_flags |= COMPARE_NO_PERM; -			break; -		case 'C': -			sd->compare_flags |= COMPARE_NO_CONTENTS; -			break; -		case 'T': -			sd->compare_flags |= COMPARE_TIMESTAMP; -			break; -		case 'I': -			sd->compare_flags |= COMPARE_INODE_NUM; -			break; -		case 'S': -			sd->compare_super = true; -			break; -		case 'e': -			sd->compare_flags |= COMPARE_EXTRACT_FILES; -			sd->extract_dir = optarg; -			break; -		case 'h': -			fputs(usagestr, stdout); -			exit(0); -		case 'V': -			print_version("sqfsdiff"); -			exit(0); -		default: -			goto fail_arg; -		} -	} - -	if (sd->old_path == NULL) { -		fputs("Missing arguments: first filesystem\n", stderr); -		goto fail_arg; -	} - -	if (sd->new_path == NULL) { -		fputs("Missing arguments: second filesystem\n", stderr); -		goto fail_arg; -	} - -	if (optind < argc) { -		fputs("Unknown extra arguments\n", stderr); -		goto fail_arg; -	} -	return; -fail_arg: -	fprintf(stderr, "Try `sqfsdiff --help' for more information.\n"); -	exit(2); -} diff --git a/difftool/sqfsdiff.c b/difftool/sqfsdiff.c deleted file mode 100644 index 2871322..0000000 --- a/difftool/sqfsdiff.c +++ /dev/null @@ -1,168 +0,0 @@ -/* SPDX-License-Identifier: GPL-3.0-or-later */ -/* - * sqfsdiff.c - * - * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> - */ -#include "sqfsdiff.h" - -static int open_sfqs(sqfs_state_t *state, const char *path) -{ -	int ret; - -	state->file = sqfs_open_file(path, SQFS_FILE_OPEN_READ_ONLY); -	if (state->file == NULL) { -		perror(path); -		return -1; -	} - -	ret = sqfs_super_read(&state->super, state->file); -	if (ret) { -		sqfs_perror(path, "reading super block", ret); -		goto fail_file; -	} - -	sqfs_compressor_config_init(&state->cfg, state->super.compression_id, -				    state->super.block_size, -				    SQFS_COMP_FLAG_UNCOMPRESS); - -	ret = sqfs_compressor_create(&state->cfg, &state->cmp); - -#ifdef WITH_LZO -	if (state->super.compression_id == SQFS_COMP_LZO && ret != 0) -		ret = lzo_compressor_create(&state->cfg, &state->cmp); -#endif - -	if (ret != 0) { -		sqfs_perror(path, "creating compressor", ret); -		goto fail_file; -	} - -	if (state->super.flags & SQFS_FLAG_COMPRESSOR_OPTIONS) { -		ret = state->cmp->read_options(state->cmp, state->file); -		if (ret) { -			sqfs_perror(path, "reading compressor options", ret); -			goto fail_cmp; -		} -	} - -	state->idtbl = sqfs_id_table_create(0); -	if (state->idtbl == NULL) { -		sqfs_perror(path, "creating ID table", SQFS_ERROR_ALLOC); -		goto fail_cmp; -	} - -	ret = sqfs_id_table_read(state->idtbl, state->file, -				 &state->super, state->cmp); -	if (ret) { -		sqfs_perror(path, "loading ID table", ret); -		goto fail_id; -	} - -	state->dr = sqfs_dir_reader_create(&state->super, state->cmp, -					   state->file); -	if (state->dr == NULL) { -		sqfs_perror(path, "creating directory reader", -			    SQFS_ERROR_ALLOC); -		goto fail_id; -	} - -	ret = sqfs_dir_reader_get_full_hierarchy(state->dr, state->idtbl, -						 NULL, 0, &state->root); -	if (ret) { -		sqfs_perror(path, "loading filesystem tree", ret); -		goto fail_dr; -	} - -	state->data = sqfs_data_reader_create(state->file, -					      state->super.block_size, -					      state->cmp); -	if (state->data == NULL) { -		sqfs_perror(path, "creating data reader", SQFS_ERROR_ALLOC); -		goto fail_tree; -	} - -	ret = sqfs_data_reader_load_fragment_table(state->data, &state->super); -	if (ret) { -		sqfs_perror(path, "loading fragment table", ret); -		goto fail_data; -	} - -	return 0; -fail_data: -	sqfs_destroy(state->data); -fail_tree: -	sqfs_dir_tree_destroy(state->root); -fail_dr: -	sqfs_destroy(state->dr); -fail_id: -	sqfs_destroy(state->idtbl); -fail_cmp: -	sqfs_destroy(state->cmp); -fail_file: -	sqfs_destroy(state->file); -	return -1; -} - -static void close_sfqs(sqfs_state_t *state) -{ -	sqfs_destroy(state->data); -	sqfs_dir_tree_destroy(state->root); -	sqfs_destroy(state->dr); -	sqfs_destroy(state->idtbl); -	sqfs_destroy(state->cmp); -	sqfs_destroy(state->file); -} - -int main(int argc, char **argv) -{ -	int status, ret = 0; -	sqfsdiff_t sd; - -	memset(&sd, 0, sizeof(sd)); -	process_options(&sd, argc, argv); - -	if (sd.extract_dir != NULL) { -		if (mkdir_p(sd.extract_dir)) -			return 2; -	} - -	if (open_sfqs(&sd.sqfs_old, sd.old_path)) -		return 2; - -	if (open_sfqs(&sd.sqfs_new, sd.new_path)) { -		status = 2; -		goto out_sqfs_old; -	} - -	if (sd.extract_dir != NULL) { -		if (chdir(sd.extract_dir)) { -			perror(sd.extract_dir); -			ret = -1; -			goto out; -		} -	} - -	ret = node_compare(&sd, sd.sqfs_old.root, sd.sqfs_new.root); -	if (ret != 0) -		goto out; - -	if (sd.compare_super) { -		ret = compare_super_blocks(&sd.sqfs_old.super, -					   &sd.sqfs_new.super); -		if (ret != 0) -			goto out; -	} -out: -	if (ret < 0) { -		status = 2; -	} else if (ret > 0) { -		status = 1; -	} else { -		status = 0; -	} -	close_sfqs(&sd.sqfs_new); -out_sqfs_old: -	close_sfqs(&sd.sqfs_old); -	return status; -} diff --git a/difftool/sqfsdiff.h b/difftool/sqfsdiff.h deleted file mode 100644 index 94fce93..0000000 --- a/difftool/sqfsdiff.h +++ /dev/null @@ -1,69 +0,0 @@ -/* SPDX-License-Identifier: GPL-3.0-or-later */ -/* - * sqfsdiff.h - * - * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> - */ -#ifndef DIFFTOOL_H -#define DIFFTOOL_H - -#include "config.h" -#include "common.h" -#include "fstree.h" - -#include <stdlib.h> -#include <getopt.h> -#include <string.h> -#include <errno.h> - -#define MAX_WINDOW_SIZE (1024 * 1024 * 4) - -typedef struct { -	sqfs_compressor_config_t cfg; -	sqfs_compressor_t *cmp; -	sqfs_super_t super; -	sqfs_file_t *file; -	sqfs_id_table_t *idtbl; -	sqfs_dir_reader_t *dr; -	sqfs_tree_node_t *root; -	sqfs_data_reader_t *data; -} sqfs_state_t; - -typedef struct { -	const char *old_path; -	const char *new_path; -	int compare_flags; -	sqfs_state_t sqfs_old; -	sqfs_state_t sqfs_new; -	bool compare_super; -	const char *extract_dir; -} sqfsdiff_t; - -enum { -	COMPARE_NO_PERM = 0x01, -	COMPARE_NO_OWNER = 0x02, -	COMPARE_NO_CONTENTS = 0x04, -	COMPARE_TIMESTAMP = 0x08, -	COMPARE_INODE_NUM = 0x10, -	COMPARE_EXTRACT_FILES = 0x20, -}; - -int compare_dir_entries(sqfsdiff_t *sd, sqfs_tree_node_t *old, -			sqfs_tree_node_t *new); - -char *node_path(const sqfs_tree_node_t *n); - -int compare_files(sqfsdiff_t *sd, const sqfs_inode_generic_t *old, -		  const sqfs_inode_generic_t *new, const char *path); - -int node_compare(sqfsdiff_t *sd, sqfs_tree_node_t *a, sqfs_tree_node_t *b); - -int compare_super_blocks(const sqfs_super_t *a, const sqfs_super_t *b); - -int extract_files(sqfsdiff_t *sd, const sqfs_inode_generic_t *old, -		  const sqfs_inode_generic_t *new, -		  const char *path); - -void process_options(sqfsdiff_t *sd, int argc, char **argv); - -#endif /* DIFFTOOL_H */ diff --git a/difftool/super.c b/difftool/super.c deleted file mode 100644 index 111412a..0000000 --- a/difftool/super.c +++ /dev/null @@ -1,125 +0,0 @@ -/* SPDX-License-Identifier: GPL-3.0-or-later */ -/* - * super.c - * - * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> - */ -#include "sqfsdiff.h" - -static const struct { -	sqfs_u16 mask; -	const char *name; -} sqfs_flags[] = { -	{ SQFS_FLAG_UNCOMPRESSED_INODES, "uncompressed inodes" }, -	{ SQFS_FLAG_UNCOMPRESSED_DATA, "uncompressed data" }, -	{ SQFS_FLAG_UNCOMPRESSED_FRAGMENTS, "uncompressed fragments" }, -	{ SQFS_FLAG_NO_FRAGMENTS, "no fragments" }, -	{ SQFS_FLAG_ALWAYS_FRAGMENTS, "always fragments" }, -	{ SQFS_FLAG_DUPLICATES, "duplicates" }, -	{ SQFS_FLAG_EXPORTABLE, "exportable" }, -	{ SQFS_FLAG_UNCOMPRESSED_XATTRS, "uncompressed xattrs" }, -	{ SQFS_FLAG_NO_XATTRS, "no xattrs" }, -	{ SQFS_FLAG_COMPRESSOR_OPTIONS, "compressor options" }, -	{ SQFS_FLAG_UNCOMPRESSED_IDS, "uncompressed ids" }, -}; - -static void print_value_difference(const char *name, sqfs_u64 a, sqfs_u64 b) -{ -	sqfs_u64 diff; -	char c; - -	if (a != b) { -		if (a < b) { -			c = '+'; -			diff = b - a; -		} else { -			c = '-'; -			diff = a - b; -		} -		fprintf(stdout, "%s: %c%lu\n", name, c, -			(unsigned long)diff); -	} -} - -static void print_offset_diff(const char *name, sqfs_u64 a, sqfs_u64 b) -{ -	if (a != b) -		fprintf(stdout, "Location of %s differs\n", name); -} - -static void print_flag_diff(sqfs_u16 a, sqfs_u16 b) -{ -	sqfs_u16 diff = a ^ b, mask; -	size_t i; -	char c; - -	if (diff == 0) -		return; - -	fputs("flags:\n", stdout); - -	for (i = 0; i < sizeof(sqfs_flags) / sizeof(sqfs_flags[0]); ++i) { -		if (diff & sqfs_flags[i].mask) { -			c = a & sqfs_flags[i].mask ? '<' : '>'; - -			fprintf(stdout, "\t%c%s\n", c, sqfs_flags[i].name); -		} - -		a &= ~sqfs_flags[i].mask; -		b &= ~sqfs_flags[i].mask; -		diff &= ~sqfs_flags[i].mask; -	} - -	for (i = 0, mask = 0x01; i < 16; ++i, mask <<= 1) { -		if (diff & mask) { -			fprintf(stdout, "\t%c additional unknown\n", -				a & mask ? '<' : '>'); -		} -	} -} - -int compare_super_blocks(const sqfs_super_t *a, const sqfs_super_t *b) -{ -	if (memcmp(a, b, sizeof(*a)) == 0) -		return 0; - -	fputs("======== super blocks are different ========\n", stdout); - -	/* TODO: if a new magic number or squashfs version is introduced, -	   compare them. */ - -	print_value_difference("inode count", a->inode_count, b->inode_count); -	print_value_difference("modification time", a->modification_time, -			       b->modification_time); -	print_value_difference("block size", a->block_size, b->block_size); -	print_value_difference("block log", a->block_log, b->block_log); -	print_value_difference("fragment table entries", -			       a->fragment_entry_count, -			       b->fragment_entry_count); -	print_value_difference("ID table entries", a->id_count, b->id_count); - -	if (a->compression_id != b->compression_id) { -		fprintf(stdout, "compressor: %s vs %s\n", -			sqfs_compressor_name_from_id(a->compression_id), -			sqfs_compressor_name_from_id(b->compression_id)); -	} - -	print_flag_diff(a->flags, b->flags); - -	print_value_difference("total bytes used", a->bytes_used, -			       b->bytes_used); - -	print_offset_diff("root inode", a->root_inode_ref, b->root_inode_ref); -	print_offset_diff("ID table", a->id_table_start, b->id_table_start); -	print_offset_diff("xattr ID table", a->xattr_id_table_start, -			  b->xattr_id_table_start); -	print_offset_diff("inode table", a->inode_table_start, -			  b->inode_table_start); -	print_offset_diff("directory table", a->directory_table_start, -			  b->directory_table_start); -	print_offset_diff("fragment table", a->fragment_table_start, -			  b->fragment_table_start); -	print_offset_diff("export table", a->export_table_start, -			  b->export_table_start); -	return 1; -} diff --git a/difftool/util.c b/difftool/util.c deleted file mode 100644 index 5e9161a..0000000 --- a/difftool/util.c +++ /dev/null @@ -1,25 +0,0 @@ -/* SPDX-License-Identifier: GPL-3.0-or-later */ -/* - * util.c - * - * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> - */ -#include "sqfsdiff.h" - -char *node_path(const sqfs_tree_node_t *n) -{ -	char *path = sqfs_tree_node_get_path(n); - -	if (path == NULL) { -		perror("get path"); -		return NULL; -	} - -	if (canonicalize_name(path)) { -		fprintf(stderr, "failed to canonicalization '%s'\n", path); -		free(path); -		return NULL; -	} - -	return path; -} | 
