]> Dogcows Code - chaz/openbox/blobdiff - openbox/openbox.c
dont have glib reap children, we shall reap them instead to avoid zombies from proces...
[chaz/openbox] / openbox / openbox.c
index 3ffaded81ce4127ba7493a97ee54058b908fa66a..ef3f8ac533f450f427fa808932c9b7ff641b7591 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
+#include <errno.h>
 
 #include <X11/cursorfont.h>
 
@@ -76,15 +81,15 @@ static ObState   state;
 static gboolean  xsync;
 static gboolean  reconfigure;
 static gboolean  restart;
-static char     *restart_path;
+static gchar    *restart_path;
 static Cursor    cursors[OB_NUM_CURSORS];
 static KeyCode   keys[OB_NUM_KEYS];
 static gint      exitcode = 0;
 
-static void signal_handler(int signal, gpointer data);
-static void parse_args(int argc, char **argv);
+static void signal_handler(gint signal, gpointer data);
+static void parse_args(gint argc, gchar **argv);
 
-int main(int argc, char **argv)
+gint main(gint argc, gchar **argv)
 {
 #ifdef DEBUG
     ob_debug_show_output(TRUE);
@@ -101,7 +106,9 @@ int main(int argc, char **argv)
 
     g_set_prgname(argv[0]);
 
-    chdir(g_get_home_dir());
+    if (chdir(g_get_home_dir()) == -1)
+        g_warning("Unable to change to home directory (%s): %s",
+                  g_get_home_dir(), g_strerror(errno));
      
     parse_paths_startup();
 
@@ -125,6 +132,7 @@ int main(int argc, char **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);
 
@@ -300,8 +308,8 @@ int main(int argc, char **argv)
 
     if (restart) {
         if (restart_path != NULL) {
-            int argcp;
-            char **argvp;
+            gint argcp;
+            gchar **argvp;
             GError *err = NULL;
 
             /* run other shit */
@@ -311,6 +319,7 @@ int main(int argc, char **argv)
             } else {
                 g_warning("failed to execute '%s': %s", restart_path,
                           err->message);
+                g_error_free(err);
             }
         }
 
@@ -322,16 +331,23 @@ int main(int argc, char **argv)
     return exitcode;
 }
 
-static void signal_handler(int signal, gpointer data)
+static void signal_handler(gint signal, gpointer data)
 {
-    if (signal == SIGUSR1) {
-       fprintf(stderr, "Caught signal %d. Restarting.\n", signal);
+    switch (signal) {
+    case SIGUSR1:
+        ob_debug("Caught signal %d. Restarting.\n", signal);
         ob_restart();
-    } else if (signal == SIGUSR2) {
-       fprintf(stderr, "Caught signal %d. Reconfiguring.\n", signal);
-        ob_reconfigure();
-    } else {
-       fprintf(stderr, "Caught signal %d. Exiting.\n", signal);
+        break;
+    case SIGUSR2:
+        ob_debug("Caught signal %d. Reconfiguring.\n", signal);
+        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));
     }
@@ -367,9 +383,9 @@ static void print_help()
     g_print("\nPlease report bugs at %s\n\n", PACKAGE_BUGREPORT);
 }
 
-static void parse_args(int argc, char **argv)
+static void parse_args(gint argc, gchar **argv)
 {
-    int i;
+    gint i;
 
     for (i = 1; i < argc; ++i) {
         if (!strcmp(argv[i], "--version")) {
This page took 0.026388 seconds and 4 git commands to generate.