From 098f7bac23e6e63e1ef0bfc12e7581ffd93ea89c Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sun, 21 Jun 2009 14:15:14 +0200 Subject: Bugfix: Correctly handle SIGPIPE to avoid unnecessary zombie processes Negative return value of printf() is not used when write() returns a negative value, instead, SIGPIPE is sent. --- i3status.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'i3status.c') diff --git a/i3status.c b/i3status.c index fd781cb..bec4c81 100644 --- a/i3status.c +++ b/i3status.c @@ -54,6 +54,7 @@ #include #include #include +#include #include "queue.h" @@ -693,6 +694,16 @@ static int load_configuration(const char *configfile) { return result; } +/* + * Exit upon SIGPIPE because when we have nowhere to write to, gathering + * system information is pointless. + * + */ +void sigpipe(int signum) { + fprintf(stderr, "Received SIGPIPE, exiting\n"); + exit(1); +} + int main(int argc, char *argv[]) { char part[512], pathbuf[512]; @@ -706,6 +717,11 @@ int main(int argc, char *argv[]) { {0, 0, 0, 0} }; + struct sigaction action; + memset(&action, 0, sizeof(struct sigaction)); + action.sa_handler = sigpipe; + sigaction(SIGPIPE, &action, NULL); + SIMPLEQ_INIT(&batteries); while ((o = getopt_long(argc, argv, "c:h", long_options, &option_index)) != -1) -- cgit v1.2.3