summaryrefslogtreecommitdiffstats
path: root/toolbox/toolbox.c
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2015-04-25 11:49:04 -0700
committerElliott Hughes <enh@google.com>2015-04-25 12:03:41 -0700
commit5976018b4ab0b22082592db871613f42253850cd (patch)
tree9395a48a48100f8f895a924bf8021fa6f55de4d6 /toolbox/toolbox.c
parent9798023e9f646a51222b5fd4683c91bfbfc5167f (diff)
downloadsystem_core-5976018b4ab0b22082592db871613f42253850cd.tar.gz
system_core-5976018b4ab0b22082592db871613f42253850cd.tar.bz2
system_core-5976018b4ab0b22082592db871613f42253850cd.zip
Improve toolbox SIGPIPE behavior.
None of our tools -- except for top, which I'd fixed previously -- handles SIGPIE correctly. Let's just handle SIGPIPE in the driver. Bug: https://code.google.com/p/android/issues/detail?id=157920 Change-Id: I322ea411f53c71585a64118c217d54389f675d4e
Diffstat (limited to 'toolbox/toolbox.c')
-rw-r--r--toolbox/toolbox.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/toolbox/toolbox.c b/toolbox/toolbox.c
index 0eac390e4..915da440c 100644
--- a/toolbox/toolbox.c
+++ b/toolbox/toolbox.c
@@ -1,6 +1,8 @@
+#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
int main(int, char **);
@@ -31,11 +33,24 @@ static struct
{ 0, 0 },
};
+static void SIGPIPE_handler(int signal) {
+ // Those desktop Linux tools that catch SIGPIPE seem to agree that it's
+ // a successful way to exit, not a failure. (Which makes sense --- we were
+ // told to stop by a reader, rather than failing to continue ourselves.)
+ _exit(0);
+}
+
int main(int argc, char **argv)
{
int i;
char *name = argv[0];
+ // Let's assume that none of this code handles broken pipes. At least ls,
+ // ps, and top were broken (though I'd previously added this fix locally
+ // to top). We exit rather than use SIG_IGN because tools like top will
+ // just keep on writing to nowhere forever if we don't stop them.
+ signal(SIGPIPE, SIGPIPE_handler);
+
if((argc > 1) && (argv[1][0] == '@')) {
name = argv[1] + 1;
argc--;