The change
f2a037fb7b153954d5d34cca48182b6d8832fcfa had unfavorable
effect of making hexdump to return non-zero exit value always.
This happen because oversight when 'exitval' gets to be set. By clance,
one might expect main() to call next() which will return value for
'exitval'. That assessment misses later call chain main() -> display()
-> get() -> next(), which in reverse should return correct value for
'exitval'.
It was mentioned in util-linux maillist that Ondrej Oprala is working on
major renewal of the hexdump . That in mind it seems best to simply to
revert the global 'exitval' and avoid conflict with Ondrej's work.
Reference: http://markmail.org/message/sbnvuhkboreujj5p
Reported-by: Dave Reisner <d@falconindy.com>
CC: Ondrej Oprala <ooprala@redhat.com>
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
int next(char **argv)
{
static int done;
- int statok, exitval = 0;
+ int statok;
if (argv) {
_argv = argv;
if (*_argv) {
if (!(freopen(*_argv, "r", stdin))) {
warn("%s", *_argv);
- exitval = 1;
+ exitval = EXIT_FAILURE;
++_argv;
continue;
}
statok = done = 1;
} else {
if (done++)
- return(exitval);
+ return(0);
statok = 0;
}
if (skip)
FS *fshead; /* head of format strings */
ssize_t blocksize; /* data block size */
+int exitval; /* final exit value */
ssize_t length = -1; /* max bytes to read */
int main(int argc, char **argv)
{
- int exitval; /* final exit value */
FS *tfs;
char *p;
for (tfs = fshead; tfs; tfs = tfs->nextfs)
rewrite(tfs);
- exitval = next(argv);
+ (void)next(argv);
display();
return exitval;
}
extern FU *endfu;
extern FS *fshead; /* head of format strings list */
extern ssize_t blocksize; /* data block size */
+extern int exitval; /* final exit value */
extern ssize_t length; /* max bytes to read */
extern off_t skip; /* bytes to skip */