bug-gzip
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] Terminate zgrep gracefully when a pipeline is interrupted by


From: Dmitry V. Levin
Subject: Re: [PATCH] Terminate zgrep gracefully when a pipeline is interrupted by a signal
Date: Thu, 4 Feb 2010 03:37:36 +0300

On Wed, Feb 03, 2010 at 06:32:52AM +0100, Jim Meyering wrote:
> Dmitry V. Levin wrote:
[...]
> > OK, shall I repost the patch with these changes applied?
> 
> Not required, but would be nice.
> If it's not too much trouble, would you please add a test, too?

From 007c30c35599c1d3a1ef6fd456bca2cd40311379 Mon Sep 17 00:00:00 2001
From: Dmitry V. Levin <address@hidden>
Date: Sat, 30 Jan 2010 22:36:35 +0000
Subject: [PATCH] zgrep: terminate gracefully when a pipeline is interrupted by 
a signal

zgrep is not terminated gracefully when its grep/sed pipeline
is terminated by a signal.  For example, a command like
zgrep -F .TH /usr/share/man/man1/*.gz | head
works long time after the "head" completion.
Another example, a command like
zgrep unmatched-pattern /usr/share/man/man1/*.gz
cannot be interrupted by sending a SIGQUIT with Ctrl-\ key, it outputs
zgrep: line 221: test: : integer expression expected
and goes on.
* zgrep.in: Terminate gracefully when the grep/sed pipeline is
terminated by a signal.
* tests/zgrep-signal: New test.
* Makefile.am (TESTS): Add it.
---
 Makefile.am        |    1 +
 tests/zgrep-signal |   38 ++++++++++++++++++++++++++++++++++++++
 zgrep.in           |    9 +++++++--
 3 files changed, 46 insertions(+), 2 deletions(-)
 create mode 100644 tests/zgrep-signal

diff --git a/Makefile.am b/Makefile.am
index 4263b1d..19ef051 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -110,6 +110,7 @@ TESTS =                                             \
   tests/trailing-nul                           \
   tests/zdiff                                  \
   tests/zgrep-f                                        \
+  tests/zgrep-signal                           \
   tests/znew-k
 
 EXTRA_DIST += $(TESTS)
diff --git a/tests/zgrep-signal b/tests/zgrep-signal
new file mode 100644
index 0000000..9b10b5a
--- /dev/null
+++ b/tests/zgrep-signal
@@ -0,0 +1,38 @@
+#!/bin/sh
+# Check that zgrep is terminated gracefully by signal when
+# its grep/sed pipeline is terminated by a signal.
+
+# Copyright (C) 2010 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# limit so don't run it by default.
+
+if test "$VERBOSE" = yes; then
+  set -x
+  gzip --version
+fi
+
+: ${srcdir=.}
+. "$srcdir/tests/init.sh"
+
+echo a | gzip -c > f.gz || framework_failure
+
+fail=0
+
+status=$(exec 3>&1; (zgrep a f.gz f.gz; echo $? >&3) | :) ||
+       framework_failure
+
+test "$status" = 141 || fail=1
+
+Exit $fail
diff --git a/zgrep.in b/zgrep.in
index 358c1f8..5d9e6d1 100644
--- a/zgrep.in
+++ b/zgrep.in
@@ -213,11 +213,16 @@ do
       r=$(
         exec 4>&1
         (eval "$grep" 4>&-; echo $? >&4) 3>&- | sed "$sed_script" >&3 4>&-
-      ) || r=2
-      exit $r
+      ) && exit $r
+      r=$?
+      test $r -gt 128 && test $r -le 143 && exit $r || exit 2
     fi >&3 5>&-
   )
   r=$?
+  if test $r -gt 128 && test $r -le 143; then
+    kill -$(($r-128)) $$
+    exit $r
+  fi
   test "$gzip_status" -eq 0 || test "$gzip_status" -eq 2 || r=2
   test $res -lt $r && res=$r
 done
-- 
ldv

Attachment: pgpgEOEJM5jVQ.pgp
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]