Split comparing more fields and consistency checks.
Consistency checks are very strict and it makes sense to check for more fields without it.
diff --git a/man/zipcmp.mdoc b/man/zipcmp.mdoc
index 84866de..c29ee69 100644
--- a/man/zipcmp.mdoc
+++ b/man/zipcmp.mdoc
@@ -29,7 +29,7 @@
.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd December 18, 2017
+.Dd March 4, 2021
.Dt ZIPCMP 1
.Os
.Sh NAME
@@ -37,7 +37,7 @@
.Nd compare contents of zip archives
.Sh SYNOPSIS
.Nm
-.Op Fl hipqtVv
+.Op Fl ChipqtVv
.Ar archive1 archive2
.Sh DESCRIPTION
.Nm
@@ -51,6 +51,10 @@
.Pp
Supported options:
.Bl -tag -width MMM
+.It Fl C
+Check consistency of archives.
+Results in an error if archive is inconsistent or not valid
+according to the zip specification.
.It Fl h
Display a short help message and exit.
.It Fl i
diff --git a/src/zipcmp.c b/src/zipcmp.c
index ecfe24d..2edfc83 100644
--- a/src/zipcmp.c
+++ b/src/zipcmp.c
@@ -94,6 +94,7 @@
char help[] = "\n\
-h display this help message\n\
+ -C check archive consistencies\n\
-i compare names ignoring case distinctions\n\
-p compare as many details as possible\n\
-q be quiet\n\
@@ -107,7 +108,7 @@
Copyright (C) 2003-2020 Dieter Baron and Thomas Klausner\n\
" PACKAGE " comes with ABSOLUTELY NO WARRANTY, to the extent permitted by law.\n";
-#define OPTIONS "hVipqtv"
+#define OPTIONS "hVCipqtv"
#define BOTH_ARE_ZIPS(a) (a[0].za && a[1].za)
@@ -130,7 +131,7 @@
static int list_zip(const char *name, struct archive *a);
static int test_file(zip_t *za, zip_uint64_t idx, const char *zipname, const char *filename, zip_uint64_t size, zip_uint32_t crc);
-int ignore_case, test_files, paranoid, verbose, have_directory;
+int ignore_case, test_files, paranoid, verbose, have_directory, check_consistency;
int header_done;
@@ -142,40 +143,43 @@
ignore_case = 0;
test_files = 0;
+ check_consistency = 0;
paranoid = 0;
have_directory = 0;
verbose = 1;
while ((c = getopt(argc, argv, OPTIONS)) != -1) {
switch (c) {
- case 'i':
- ignore_case = 1;
- break;
- case 'p':
- paranoid = 1;
- break;
- case 'q':
- verbose = 0;
- break;
- case 't':
- test_files = 1;
- break;
- case 'v':
- verbose = 1;
- break;
-
- case 'h':
- fputs(help_head, stdout);
- printf(USAGE, progname);
- fputs(help, stdout);
- exit(0);
- case 'V':
- fputs(version_string, stdout);
- exit(0);
-
- default:
- fprintf(stderr, USAGE, progname);
- exit(2);
+ case 'C':
+ check_consistency = 1;
+ case 'i':
+ ignore_case = 1;
+ break;
+ case 'p':
+ paranoid = 1;
+ break;
+ case 'q':
+ verbose = 0;
+ break;
+ case 't':
+ test_files = 1;
+ break;
+ case 'v':
+ verbose = 1;
+ break;
+
+ case 'h':
+ fputs(help_head, stdout);
+ printf(USAGE, progname);
+ fputs(help, stdout);
+ exit(0);
+ case 'V':
+ fputs(version_string, stdout);
+ exit(0);
+
+ default:
+ fprintf(stderr, USAGE, progname);
+ exit(2);
}
}
@@ -410,7 +414,7 @@
struct zip_stat st;
unsigned int i;
- if ((za = zip_open(name, paranoid ? ZIP_CHECKCONS : 0, &err)) == NULL) {
+ if ((za = zip_open(name, check_consistency ? ZIP_CHECKCONS : 0, &err)) == NULL) {
zip_error_t error;
zip_error_init_with_code(&error, err);
fprintf(stderr, "%s: cannot open zip archive '%s': %s\n", progname, name, zip_error_strerror(&error));