[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] Terminate zgrep gracefully when a pipeline is interrupted by
Dmitry V. Levin
Re: [PATCH] Terminate zgrep gracefully when a pipeline is interrupted by a signal
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
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
@@ -110,6 +110,7 @@ TESTS = \
+ tests/zgrep-signal \
EXTRA_DIST += $(TESTS)
diff --git a/tests/zgrep-signal b/tests/zgrep-signal
new file mode 100644
@@ -0,0 +1,38 @@
+# 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
+echo a | gzip -c > f.gz || framework_failure
+status=$(exec 3>&1; (zgrep a f.gz f.gz; echo $? >&3) | :) ||
+test "$status" = 141 || fail=1
diff --git a/zgrep.in b/zgrep.in
index 358c1f8..5d9e6d1 100644
@@ -213,11 +213,16 @@ do
(eval "$grep" 4>&-; echo $? >&4) 3>&- | sed "$sed_script" >&3 4>&-
- ) || r=2
- exit $r
+ ) && exit $r
+ test $r -gt 128 && test $r -le 143 && exit $r || exit 2
fi >&3 5>&-
+ if test $r -gt 128 && test $r -le 143; then
+ kill -$(($r-128)) $$
+ exit $r
test "$gzip_status" -eq 0 || test "$gzip_status" -eq 2 || r=2
test $res -lt $r && res=$r
Description: PGP signature