dont have glib reap children, we shall reap them instead to avoid zombies from proces...
authorDana Jansens <danakj@orodu.net>
Mon, 22 Dec 2003 18:37:12 +0000 (18:37 +0000)
committerDana Jansens <danakj@orodu.net>
Mon, 22 Dec 2003 18:37:12 +0000 (18:37 +0000)
openbox/action.c
openbox/openbox.c

index 8eccb6b..2251715 100644 (file)
@@ -979,14 +979,23 @@ void action_run_string(const gchar *name, struct _ObClient *c)
 void action_execute(union ActionData *data)
 {
     GError *e = NULL;
-    gchar *cmd;
+    gchar *cmd, **argv = 0;
     if (data->execute.path) {
         cmd = g_filename_from_utf8(data->execute.path, -1, NULL, NULL, NULL);
         if (cmd) {
-            if (!g_spawn_command_line_async(cmd, &e)) {
+            if (!g_shell_parse_argv (cmd, NULL, &argv, &e)) {
                 g_warning("failed to execute '%s': %s",
                           cmd, e->message);
                 g_error_free(e);
+            } else {
+                if (!g_spawn_async(NULL, argv, NULL, G_SPAWN_SEARCH_PATH |
+                                   G_SPAWN_DO_NOT_REAP_CHILD,
+                                   NULL, NULL, NULL, &e)) {
+                    g_warning("failed to execute '%s': %s",
+                              cmd, e->message);
+                    g_error_free(e);
+                }
+                g_strfreev(argv);
             }
             g_free(cmd);
         } else {
index b688296..ef3f8ac 100644 (file)
 #  include <sys/stat.h>
 #  include <sys/types.h>
 #endif
+#ifdef HAVE_SYS_WAIT_H
+#  include <sys/types.h>
+#  include <sys/wait.h>
+#endif
 #ifdef HAVE_UNISTD_H
 #  include <unistd.h>
 #endif
@@ -128,6 +132,7 @@ gint main(gint argc, gchar **argv)
     ob_main_loop_signal_add(ob_main_loop, SIGINT, signal_handler, NULL, NULL);
     ob_main_loop_signal_add(ob_main_loop, SIGHUP, signal_handler, NULL, NULL);
     ob_main_loop_signal_add(ob_main_loop, SIGPIPE, signal_handler, NULL, NULL);
+    ob_main_loop_signal_add(ob_main_loop, SIGCHLD, signal_handler, NULL, NULL);
 
     ob_screen = DefaultScreen(ob_display);
 
@@ -328,13 +333,20 @@ gint main(gint argc, gchar **argv)
 
 static void signal_handler(gint signal, gpointer data)
 {
-    if (signal == SIGUSR1) {
+    switch (signal) {
+    case SIGUSR1:
         ob_debug("Caught signal %d. Restarting.\n", signal);
         ob_restart();
-    } else if (signal == SIGUSR2) {
+        break;
+    case SIGUSR2:
         ob_debug("Caught signal %d. Reconfiguring.\n", signal);
-        ob_reconfigure();
-    } else {
+        ob_reconfigure(); 
+        break;
+    case SIGCHLD:
+        /* reap children */
+        while (waitpid(-1, NULL, WNOHANG) > 0);
+        break;
+    default:
         ob_debug("Caught signal %d. Exiting.\n", signal);
         /* TERM and INT return a 0 code */
         ob_exit(!(signal == SIGTERM || signal == SIGINT));