From 94e8fed7c5fca84989711062d5c710f592adb236 Mon Sep 17 00:00:00 2001 From: Sascha Kruse Date: Fri, 21 Dec 2012 13:03:54 +0100 Subject: [PATCH] prevent the zombie apocalypse --- dunst.c | 57 +++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/dunst.c b/dunst.c index cda61db..031db20 100644 --- a/dunst.c +++ b/dunst.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -214,19 +215,27 @@ void context_menu(void) { if (len == 0) return; buf[len - 1] = '\0'; + + int status; + waitpid(pid, &status, 0); } close(parent_io[0]); - int browser_pid = fork(); + int browser_pid1 = fork(); - - if (browser_pid == 0) { - browser = string_append(browser, buf, " "); - char **cmd = string_to_argv(browser); - execvp(cmd[0], cmd); + if (browser_pid1) { + int status; + waitpid(browser_pid1, &status, 0); } else { - return; + int browser_pid2 = fork(); + if (browser_pid2) { + exit(0); + } else { + browser = string_append(browser, buf, " "); + char **cmd = string_to_argv(browser); + execvp(cmd[0], cmd); + } } } @@ -256,21 +265,29 @@ void run_script(notification *n) break; } - int pid = fork(); + int pid1 = fork(); - if (pid == 0) { - execlp(n->script, n->script, - appname, - summary, - body, - icon, - urgency, - (char *) NULL - ); - } else if (pid < 0) { - PERR("Unable to fork", errno); + if (pid1) { + int status; + waitpid(pid1, &status, 0); } else { - return; + int pid2 = fork(); + if (pid2) { + exit(0); + } else { + int ret = execlp(n->script, n->script, + appname, + summary, + body, + icon, + urgency, + (char *) NULL + ); + if (ret != 0) { + PERR("Unable to run script", errno); + exit(EXIT_FAILURE); + } + } } }