From 493cb5606be1ca267f1511e7068e7b1078086187 Mon Sep 17 00:00:00 2001 From: Fredrik Fornwall Date: Sat, 23 Apr 2016 07:21:45 -0400 Subject: [PATCH] grep: Avoid EPIPE error messages --- packages/grep/build.sh | 1 + packages/grep/grep.c.patch | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 packages/grep/grep.c.patch diff --git a/packages/grep/build.sh b/packages/grep/build.sh index e8b60975..11deb7ca 100644 --- a/packages/grep/build.sh +++ b/packages/grep/build.sh @@ -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 diff --git a/packages/grep/grep.c.patch b/packages/grep/grep.c.patch new file mode 100644 index 00000000..b38e55a8 --- /dev/null +++ b/packages/grep/grep.c.patch @@ -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; + } -- 2.11.0