]> git.sur5r.net Git - i3/i3status/commitdiff
Bugfix: Correctly handle SIGPIPE to avoid unnecessary zombie processes 1.2
authorMichael Stapelberg <michael@stapelberg.de>
Sun, 21 Jun 2009 12:15:14 +0000 (14:15 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 21 Jun 2009 12:15:14 +0000 (14:15 +0200)
Negative return value of printf() is not used when write() returns
a negative value, instead, SIGPIPE is sent.

i3status.c

index fd781cb344423f5a3db5ae96850dfe08ad514c20..bec4c81bef10f38e21d7ed0c09b713cd66d113bc 100644 (file)
@@ -54,6 +54,7 @@
 #include <glob.h>
 #include <dirent.h>
 #include <getopt.h>
+#include <signal.h>
 
 #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)