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; -} |