summaryrefslogtreecommitdiff
path: root/source/a/pkgtools
diff options
context:
space:
mode:
Diffstat (limited to 'source/a/pkgtools')
-rwxr-xr-xsource/a/pkgtools/pkgtools.SlackBuild2
-rw-r--r--source/a/pkgtools/scripts/installpkg23
2 files changed, 23 insertions, 2 deletions
diff --git a/source/a/pkgtools/pkgtools.SlackBuild b/source/a/pkgtools/pkgtools.SlackBuild
index 74964133..18451d5f 100755
--- a/source/a/pkgtools/pkgtools.SlackBuild
+++ b/source/a/pkgtools/pkgtools.SlackBuild
@@ -30,7 +30,7 @@ PKGNAM=pkgtools
# *** UPDATE THESE WITH EACH BUILD:
VERSION=15.0
ARCH=${ARCH:-noarch}
-BUILD=${BUILD:-21}
+BUILD=${BUILD:-22}
# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
# the name of the created package would be, and then exit. This information
diff --git a/source/a/pkgtools/scripts/installpkg b/source/a/pkgtools/scripts/installpkg
index 0d82f89c..9e75ef03 100644
--- a/source/a/pkgtools/scripts/installpkg
+++ b/source/a/pkgtools/scripts/installpkg
@@ -493,7 +493,28 @@ for package in $* ; do
fi
# The stray cat reduces the frequency of the lack of reported size.
# If it still fails, we hit it with a bigger hammer down below.
- cat $package | $packagecompression -dc | LC_ALL=C dd 2> $TMP/tmpsize${MCOOKIE} | cat | tar tf - 2> /dev/null 1> $TMP/tmplist${MCOOKIE}
+ #
+ # SeB's proposed fix for this. Untested.
+ #cat $package | $packagecompression -dc | LC_ALL=C dd 2> $TMP/tmpsize${MCOOKIE} | ( tar tf - ; cat > /dev/null ) 2> /dev/null 1> $TMP/tmplist${MCOOKIE}
+ # Some background info from SeB's email:
+ # As you can see, when dd doesn't print anything, it returns 141,
+ # which means it has got a SIGPIPE. The problem is hence some tar
+ # archives cause tar to exit before having emptied stdin. That's
+ # why adding a cat before tar sometimes makes things better (tar
+ # causes it to get a SIGPIPE some ms before it causes itself dd to
+ # get one)
+ #
+ # A fix is then to replace:
+ #
+ # cat ... | $decompressor ... | ... dd ... | cat ... | tar tf - >...
+ #
+ # with:
+ #
+ # $decompressor ... | ... dd ... | ( tar tf -; cat >/dev/null ) >...
+ #
+ # This way the last cat will either exit because there's nothing on
+ # stdin or purge this one properly so dd gets the EOF it needs.
+ cat $package | $packagecompression -dc | LC_ALL=C dd 2> $TMP/tmpsize${MCOOKIE} | cat 2> /dev/null | tar tf - 2> /dev/null 1> $TMP/tmplist${MCOOKIE}
TARERROR=$?
if [ ! "$TARERROR" = "0" ]; then
EXITSTATUS=1 # tar file corrupt