Skip to content
Snippets Groups Projects
Commit 182d17aa6558 authored by Lasse Collin's avatar Lasse Collin
Browse files

Scripts: Fix exit status of xzdiff/xzcmp.

This is a minor fix since this affects only the situation when
the files differ and the exit status is something else than 0.
In such case there could be SIGPIPE from a decompression tool
and that would result in exit status of 2 from xzdiff/xzcmp
while the correct behavior would be to return 1 or whatever
else diff or cmp may have returned.

This commit omits the -q option from xz/gzip/bzip2/lzop arguments.
I'm not sure why the -q was used in the first place, perhaps it
hides warnings in some situation that I cannot see at the moment.
Hopefully the removal won't introduce a new bug.

With gzip the -q option was harmful because it made gzip return 2
instead of >= 128 with SIGPIPE. Ignoring exit status 2 (warning
from gzip) isn't practical because bzip2 uses exit status 2 to
indicate corrupt input file. It's better if SIGPIPE results in
exit status >= 128.

With bzip2 the removal of -q seems to be good because with -q
it prints nothing if input is corrupt. The other tools aren't
silent in this situation even with -q. On the other hand, if
zstd support is added, it will need -q since otherwise it's
noisy in normal situations.

Thanks to Étienne Mollier and Sebastian Andrzej Siewior.
parent 7329415385a1
No related branches found
No related tags found
No related merge requests found
......@@ -116,8 +116,8 @@
if test "$1$2" = --; then
xz_status=$(
exec 4>&1
($xz1 -cdfq - 4>&-; echo $? >&4) 3>&- |
($xz1 -cdf - 4>&-; echo $? >&4) 3>&- |
eval "$cmp" - - >&3
)
elif # Reject Solaris 8's buggy /bin/bash 2.03.
echo X | (echo X | eval "$cmp" /dev/fd/5 - >/dev/null 2>&1) 5<&0; then
......@@ -120,6 +120,7 @@
eval "$cmp" - - >&3
)
elif # Reject Solaris 8's buggy /bin/bash 2.03.
echo X | (echo X | eval "$cmp" /dev/fd/5 - >/dev/null 2>&1) 5<&0; then
# NOTE: xz_status will contain two numbers.
xz_status=$(
exec 4>&1
......@@ -124,6 +125,6 @@
xz_status=$(
exec 4>&1
($xz1 -cdfq -- "$1" 4>&-; echo $? >&4) 3>&- |
( ($xz2 -cdfq -- "$2" 4>&-; echo $? >&4) 3>&- 5<&- </dev/null |
($xz1 -cdf -- "$1" 4>&-; echo $? >&4) 3>&- |
( ($xz2 -cdf -- "$2" 4>&-; echo $? >&4) 3>&- 5<&- </dev/null |
eval "$cmp" /dev/fd/5 - >&3) 5<&0
)
......@@ -128,11 +129,5 @@
eval "$cmp" /dev/fd/5 - >&3) 5<&0
)
cmp_status=$?
case $xz_status in
*[1-9]*) xz_status=1;;
*) xz_status=0;;
esac
(exit $cmp_status)
else
F=`expr "/$2" : '.*/\(.*\)[-.][ablmotxz2]*$'` || F=$prog
tmp=
......@@ -161,6 +156,6 @@
mkdir -- "${TMPDIR-/tmp}/$prog.$$" || exit 2
tmp="${TMPDIR-/tmp}/$prog.$$"
fi
$xz2 -cdfq -- "$2" > "$tmp/$F" || exit 2
$xz2 -cdf -- "$2" > "$tmp/$F" || exit 2
xz_status=$(
exec 4>&1
......@@ -165,6 +160,6 @@
xz_status=$(
exec 4>&1
($xz1 -cdfq -- "$1" 4>&-; echo $? >&4) 3>&- |
($xz1 -cdf -- "$1" 4>&-; echo $? >&4) 3>&- |
eval "$cmp" - '"$tmp/$F"' >&3
)
cmp_status=$?
......@@ -175,7 +170,7 @@
*)
xz_status=$(
exec 4>&1
($xz1 -cdfq -- "$1" 4>&-; echo $? >&4) 3>&- |
($xz1 -cdf -- "$1" 4>&-; echo $? >&4) 3>&- |
eval "$cmp" - '"$2"' >&3
);;
esac;;
......@@ -184,7 +179,7 @@
*[-.][zZ] | *_z | *[-.][gx]z | *[-.]bz2 | *[-.]lzma | *.t[abglx]z | *.tbz2 | *[-.]lzo | *.tzo | -)
xz_status=$(
exec 4>&1
($xz2 -cdfq -- "$2" 4>&-; echo $? >&4) 3>&- |
($xz2 -cdf -- "$2" 4>&-; echo $? >&4) 3>&- |
eval "$cmp" '"$1"' - >&3
);;
*)
......@@ -197,5 +192,17 @@
fi
cmp_status=$?
test "$xz_status" -eq 0 || exit 2
for num in $xz_status ; do
# 0 from decompressor means successful decompression. SIGPIPE from
# decompressor is possible when diff or cmp exits before the whole file
# has been decompressed. In that case we want to retain the exit status
# from diff or cmp. Note that using "trap '' PIPE" is not possible
# because gzip changes its behavior (including exit status) if SIGPIPE
# is ignored.
test "$num" -eq 0 && continue
test "$num" -ge 128 \
&& test "$(kill -l "$num" 2> /dev/null)" = "PIPE" \
&& continue
exit 2
done
exit $cmp_status
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment