aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2019-08-21 12:23:01 +0200
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2019-08-21 12:24:06 +0200
commite14ffcf8e092758bc21d0d5c795b58ea0b1773f2 (patch)
tree3359d1e5939982a9695330c2dbf74e1609f28728
parenta7d22b83cf70eb500f52edb625e9c719a35b0134 (diff)
Merge functionality of file on disk and file in sqfs compare functions
Moving towards unified sqfs vs sqfs, sqfs vs dir, dir vs sqfs comparisions. Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
-rw-r--r--difftool/Makemodule.am2
-rw-r--r--difftool/compare_file.c78
-rw-r--r--difftool/compare_files.c97
-rw-r--r--difftool/compare_files_sqfs.c54
-rw-r--r--difftool/difftool.h2
-rw-r--r--difftool/extract.c4
-rw-r--r--difftool/sqfsdiff.c2
7 files changed, 104 insertions, 135 deletions
diff --git a/difftool/Makemodule.am b/difftool/Makemodule.am
index 8d0a4e7..293143e 100644
--- a/difftool/Makemodule.am
+++ b/difftool/Makemodule.am
@@ -1,6 +1,6 @@
sqfsdiff_SOURCES = difftool/sqfsdiff.c difftool/difftool.h difftool/util.c
sqfsdiff_SOURCES += difftool/compare_dir.c difftool/node_compare.c
-sqfsdiff_SOURCES += difftool/compare_files_sqfs.c difftool/super.c
+sqfsdiff_SOURCES += difftool/compare_files.c difftool/super.c
sqfsdiff_SOURCES += difftool/extract.c
sqfsdiff_LDADD = libsquashfs.a libfstree.a libcompress.a libutil.a
sqfsdiff_LDADD += $(XZ_LIBS) $(ZLIB_LIBS) $(LZO_LIBS) $(LZ4_LIBS) $(ZSTD_LIBS)
diff --git a/difftool/compare_file.c b/difftool/compare_file.c
deleted file mode 100644
index c427f38..0000000
--- a/difftool/compare_file.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/* SPDX-License-Identifier: GPL-3.0-or-later */
-/*
- * compare_file.c
- *
- * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at>
- */
-#include "difftool.h"
-
-int compare_files(file_info_t *a, file_info_t *b, const char *path)
-{
- uint64_t offset, size, diff;
- int ret = 0, afd, bfd;
- void *aptr, *bptr;
-
- if (a->size != b->size)
- return 1;
-
- if (pushd(first_path))
- return -1;
- afd = open(path, O_RDONLY);
- if (afd < 0) {
- fprintf(stderr, "%s/%s: %s\n", first_path, path,
- strerror(errno));
- return -1;
- }
- if (popd())
- goto fail_afd;
-
- if (pushd(second_path))
- goto fail_afd;
- bfd = open(path, O_RDONLY);
- if (bfd < 0) {
- fprintf(stderr, "%s/%s: %s\n", second_path, path,
- strerror(errno));
- goto fail_afd;
- }
- if (popd())
- goto fail_bfd;
-
- size = a->size;
-
- for (offset = 0; offset < size; offset += diff) {
- diff = size - offset;
- if (diff > MAX_WINDOW_SIZE)
- diff = MAX_WINDOW_SIZE;
-
- aptr = mmap(NULL, diff, PROT_READ, MAP_SHARED, afd, offset);
- if (aptr == MAP_FAILED) {
- fprintf(stderr, "mmap %s/%s: %s\n", first_path, path,
- strerror(errno));
- goto fail_bfd;
- }
-
- bptr = mmap(NULL, diff, PROT_READ, MAP_SHARED, bfd, offset);
- if (bptr == MAP_FAILED) {
- fprintf(stderr, "mmap %s/%s: %s\n", second_path, path,
- strerror(errno));
- munmap(aptr, diff);
- goto fail_bfd;
- }
-
- ret = memcmp(aptr, bptr, diff);
- munmap(aptr, diff);
- munmap(bptr, diff);
-
- if (ret != 0)
- break;
- }
-
- close(afd);
- close(bfd);
- return ret;
-fail_bfd:
- close(bfd);
-fail_afd:
- close(afd);
- return -1;
-}
diff --git a/difftool/compare_files.c b/difftool/compare_files.c
new file mode 100644
index 0000000..89c5f5c
--- /dev/null
+++ b/difftool/compare_files.c
@@ -0,0 +1,97 @@
+/* SPDX-License-Identifier: GPL-3.0-or-later */
+/*
+ * compare_files.c
+ *
+ * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at>
+ */
+#include "difftool.h"
+
+static unsigned char a_buf[MAX_WINDOW_SIZE];
+static unsigned char b_buf[MAX_WINDOW_SIZE];
+
+int compare_files(file_info_t *a, file_info_t *b, const char *path)
+{
+ char second_name[strlen(second_path) + strlen(path) + 2];
+ char first_name[strlen(first_path) + strlen(path) + 2];
+ int afd = -1, bfd = -1, status = 0;
+ uint64_t offset, diff;
+ ssize_t ret;
+
+ if (a->size != b->size)
+ goto out_different;
+
+ if (compare_flags & COMPARE_NO_CONTENTS)
+ return 0;
+
+ if (a_is_dir) {
+ sprintf(first_name, "%s/%s", first_path, path);
+
+ afd = open(first_name, O_RDONLY);
+ if (afd < 0) {
+ perror(first_name);
+ goto fail;
+ }
+ }
+
+ if (b_is_dir) {
+ sprintf(second_name, "%s/%s", second_path, path);
+
+ bfd = open(second_name, O_RDONLY);
+ if (bfd < 0) {
+ perror(second_name);
+ goto fail;
+ }
+ }
+
+ for (offset = 0; offset < a->size; offset += diff) {
+ diff = a->size - offset;
+
+ if (diff > MAX_WINDOW_SIZE)
+ diff = MAX_WINDOW_SIZE;
+
+ if (a_is_dir) {
+ if (read_data_at(first_name, offset, afd, a_buf, diff))
+ goto out;
+ } else {
+ ret = data_reader_read(sqfs_a.data, a, offset,
+ a_buf, diff);
+ if (ret < 0 || (size_t)ret < diff) {
+ fprintf(stderr, "Failed to read %s from %s\n",
+ path, first_path);
+ return -1;
+ }
+ }
+
+ if (b_is_dir) {
+ if (read_data_at(second_name, offset, bfd, b_buf, diff))
+ goto out;
+ } else {
+ ret = data_reader_read(sqfs_b.data, b, offset,
+ b_buf, diff);
+ if (ret < 0 || (size_t)ret < diff) {
+ fprintf(stderr, "Failed to read %s from %s\n",
+ path, second_path);
+ return -1;
+ }
+ }
+
+ if (memcmp(a_buf, b_buf, diff) != 0)
+ goto out_different;
+ }
+out:
+ if (afd >= 0)
+ close(afd);
+ if (bfd >= 0)
+ close(bfd);
+ return status;
+fail:
+ status = -1;
+ goto out;
+out_different:
+ if (compare_flags & COMPARE_EXTRACT_FILES) {
+ if (extract_files(a, b, path))
+ goto fail;
+ }
+ status = 1;
+ goto out;
+}
diff --git a/difftool/compare_files_sqfs.c b/difftool/compare_files_sqfs.c
deleted file mode 100644
index 32b97b1..0000000
--- a/difftool/compare_files_sqfs.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/* SPDX-License-Identifier: GPL-3.0-or-later */
-/*
- * compare_file_sfqs.c
- *
- * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at>
- */
-#include "difftool.h"
-
-static unsigned char a_buf[MAX_WINDOW_SIZE];
-static unsigned char b_buf[MAX_WINDOW_SIZE];
-
-int compare_files(file_info_t *a, file_info_t *b, const char *path)
-{
- uint64_t offset, diff;
- ssize_t ret;
-
- if (a->size != b->size)
- goto out_different;
-
- if (compare_flags & COMPARE_NO_CONTENTS)
- return 0;
-
- for (offset = 0; offset < a->size; offset += diff) {
- diff = a->size - offset;
-
- if (diff > MAX_WINDOW_SIZE)
- diff = MAX_WINDOW_SIZE;
-
- ret = data_reader_read(sqfs_a.data, a, offset, a_buf, diff);
- if (ret < 0 || (size_t)ret < diff) {
- fprintf(stderr, "Failed to read %s from %s\n",
- path, first_path);
- return -1;
- }
-
- ret = data_reader_read(sqfs_b.data, b, offset, b_buf, diff);
- if (ret < 0 || (size_t)ret < diff) {
- fprintf(stderr, "Failed to read %s from %s\n",
- path, second_path);
- return -1;
- }
-
- if (memcmp(a_buf, b_buf, diff) != 0)
- goto out_different;
- }
-
- return 0;
-out_different:
- if (compare_flags & COMPARE_EXTRACT_FILES) {
- if (extract_files(a, b, path))
- return -1;
- }
- return 1;
-}
diff --git a/difftool/difftool.h b/difftool/difftool.h
index bd04fd2..56f727a 100644
--- a/difftool/difftool.h
+++ b/difftool/difftool.h
@@ -28,6 +28,8 @@ extern const char *second_path;
extern int compare_flags;
extern sqfs_reader_t sqfs_a;
extern sqfs_reader_t sqfs_b;
+extern bool a_is_dir;
+extern bool b_is_dir;
enum {
COMPARE_NO_PERM = 0x01,
diff --git a/difftool/extract.c b/difftool/extract.c
index 9d84265..9fee46d 100644
--- a/difftool/extract.c
+++ b/difftool/extract.c
@@ -39,12 +39,12 @@ static int extract(data_reader_t *data, file_info_t *fi,
int extract_files(file_info_t *a, file_info_t *b, const char *path)
{
- if (a != NULL) {
+ if (a != NULL && !a_is_dir) {
if (extract(sqfs_a.data, a, path, 'a'))
return -1;
}
- if (b != NULL) {
+ if (b != NULL && !b_is_dir) {
if (extract(sqfs_b.data, b, path, 'b'))
return -1;
}
diff --git a/difftool/sqfsdiff.c b/difftool/sqfsdiff.c
index baebc25..9197430 100644
--- a/difftool/sqfsdiff.c
+++ b/difftool/sqfsdiff.c
@@ -65,6 +65,8 @@ const char *first_path;
const char *second_path;
sqfs_reader_t sqfs_a;
sqfs_reader_t sqfs_b;
+bool a_is_dir;
+bool b_is_dir;
static bool compare_super = false;
static const char *extract_dir;