grep: Avoid EPIPE error messages

This commit is contained in:
Fredrik Fornwall 2016-04-23 07:21:45 -04:00
parent 24cdd7d1fc
commit 493cb5606b
2 changed files with 37 additions and 0 deletions

View File

@ -2,4 +2,5 @@ TERMUX_PKG_HOMEPAGE=http://www.gnu.org/software/grep/
TERMUX_PKG_DESCRIPTION="Command which searches one or more input files for lines containing a match to a specified pattern"
TERMUX_PKG_DEPENDS="pcre"
TERMUX_PKG_VERSION=2.25
TERMUX_PKG_BUILD_REVISION=1
TERMUX_PKG_SRCURL=http://ftp.gnu.org/gnu/grep/grep-${TERMUX_PKG_VERSION}.tar.xz

View File

@ -0,0 +1,36 @@
When writing to a closed pipe, which happens with simple
seq 99999 | grep -v xxx | head -1
the write() function will return an EPIPE error. The kernel also sends
SIGPIPE to the process, which by default kills it.
As the signal delivery is not immediate, grep may see EPIPE and report
it as an error, which is annoying, especially on Android where this
timing issue is encountered a lot more.
See http://debbugs.gnu.org/cgi/bugreport.cgi?bug=23267 where it has
been suggested to silently ignore EPIPE. That was in the context of
SIGPIPE being ignored, but this should probably also been done to
avoid timing issues. Feedback has been sent to the above issue and
is awaiting mailing list approval.
diff -u -r ../grep-2.25/src/grep.c ./src/grep.c
--- ../grep-2.25/src/grep.c 2016-04-02 20:45:51.000000000 -0400
+++ ./src/grep.c 2016-04-23 06:41:54.419351897 -0400
@@ -1234,8 +1234,13 @@
if (line_buffered)
fflush_errno ();
- if (stdout_errno)
- error (EXIT_TROUBLE, stdout_errno, _("write error"));
+ if (stdout_errno) {
+ if (stdout_errno == EPIPE) {
+ exit (EXIT_SUCCESS);
+ } else {
+ error (EXIT_TROUBLE, stdout_errno, _("write error"));
+ }
+ }
lastout = lim;
}