From a0902fe51010645f779e4d02cd46f35e488b8bd2 Mon Sep 17 00:00:00 2001 From: Adam Spragg Date: Mon, 23 May 2022 15:29:11 +0100 Subject: Return non-zero exit status if "compare" finds differences This makes `metastore` more useful in scripts, just to check if it found anything, in the same way as `diff` and `grep`. Note that POSIX requires that EXIT_SUCCESS is 0, and EXIT_FAILURE is 1, so I've defined EXIT_DIFFERENCES as 2 which, while different from the values `diff` and `grep` use (1 for finding something, 2 for errors), maintains a certain amount of backwards compatibility with previous versions of metastore. --- src/metaentry.c | 20 +++++++++++++++----- src/metaentry.h | 2 +- src/metastore.c | 3 ++- src/metastore.h | 3 +++ 4 files changed, 21 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/metaentry.c b/src/metaentry.c index 7e90290..37069b0 100644 --- a/src/metaentry.c +++ b/src/metaentry.c @@ -875,7 +875,7 @@ mentry_compare(struct metaentry *left, struct metaentry *right, msettings *st) } /* Compares lists of real and stored metadata and calls pfunc for each */ -void +int mentries_compare(struct metahash *mhashreal, struct metahash *mhashstored, void (*pfunc) @@ -884,10 +884,11 @@ mentries_compare(struct metahash *mhashreal, { struct metaentry *real, *stored; int key; + int cmp, diffs = 0; if (!mhashreal || !mhashstored) { msg(MSG_ERROR, "%s called with empty list\n", __func__); - return; + return -1; } for (key = 0; key < HASH_INDEXES; key++) { @@ -895,18 +896,27 @@ mentries_compare(struct metahash *mhashreal, stored = mentry_find(real->path, mhashstored); if (!stored) - pfunc(real, NULL, DIFF_ADDED); + cmp = DIFF_ADDED; else - pfunc(real, stored, mentry_compare(real, stored, st)); + cmp = mentry_compare(real, stored, st); + + if (cmp > 0) + ++diffs; + + pfunc(real, stored, cmp); } for (stored = mhashstored->bucket[key]; stored; stored = stored->next) { real = mentry_find(stored->path, mhashreal); - if (!real) + if (!real) { + ++diffs; pfunc(NULL, stored, DIFF_DELE); + } } } + + return diffs; } /* Dumps given metadata */ diff --git a/src/metaentry.h b/src/metaentry.h index fd28c17..497cbc2 100644 --- a/src/metaentry.h +++ b/src/metaentry.h @@ -87,7 +87,7 @@ int mentry_compare(struct metaentry *left, msettings *st); /* Compares lists of real and stored metadata and calls pfunc for each */ -void mentries_compare(struct metahash *mhashreal, +int mentries_compare(struct metahash *mhashreal, struct metahash *mhashstored, void (*pfunc)(struct metaentry *real, struct metaentry *stored, diff --git a/src/metastore.c b/src/metastore.c index 2f6d9bc..fb70834 100644 --- a/src/metastore.c +++ b/src/metastore.c @@ -572,7 +572,8 @@ main(int argc, char **argv) switch (action) { case ACTION_DIFF: - mentries_compare(real, stored, compare_print, &settings); + if (mentries_compare(real, stored, compare_print, &settings) > 0) + exit(EXIT_DIFFERENCES); break; case ACTION_SAVE: mentries_tofile(real, settings.metafile, settings.format); diff --git a/src/metastore.h b/src/metastore.h index de51292..b7d588e 100644 --- a/src/metastore.h +++ b/src/metastore.h @@ -46,6 +46,9 @@ #define ACTIONS_READING 0x07 #define ACTIONS_WRITING 0x70 +/* Exit statuses (statii?) other than SUCCESS (0) and FAILURE (1) */ +#define EXIT_DIFFERENCES 2 + /* Possible build defines */ #ifndef NO_XATTR # define NO_XATTR 0 -- cgit v1.2.1