]> Dogcows Code - chaz/openbox/commitdiff
added signal handling
authorDana Jansens <danakj@orodu.net>
Thu, 11 Jul 2002 02:12:40 +0000 (02:12 +0000)
committerDana Jansens <danakj@orodu.net>
Thu, 11 Jul 2002 02:12:40 +0000 (02:12 +0000)
util/epist/main.cc

index 3d5185350f121ba3d01d8738af03d6bdd47e0d3c..7c7d58407053c95ffc1f8a4fea5a0f54c27047f5 100644 (file)
 // DEALINGS IN THE SOFTWARE.
 
 #ifdef    HAVE_CONFIG_H
-#  include "../config.h"
+#  include "../../config.h"
 #endif // HAVE_CONFIG_H
 
-int main(int, char **) {
+extern "C" {
+#ifdef    HAVE_UNISTD_H
+#  include <sys/types.h>
+#  include <unistd.h>
+#endif // HAVE_UNISTD_H
+
+#ifdef    HAVE_SIGNAL_H
+#  include <signal.h>
+#endif // HAVE_SIGNAL_H
+
+#ifdef    HAVE_SYS_SIGNAL_H
+#  include <sys/signal.h>
+#endif // HAVE_SYS_SIGNAL_H
+
+#ifdef    HAVE_LIBGEN_H
+#  include <libgen.h>
+#endif // HAVE_LIBGEN_H
+}
+
+#include <iostream>
+
+using std::cout;
+using std::endl;
+
+bool _shutdown = false;
+char **_argv;
+
+#ifdef   HAVE_SIGACTION
+static void signalhandler(int sig)
+#else //  HAVE_SIGACTION
+static RETSIGTYPE signalhandler(int sig)
+#endif // HAVE_SIGACTION
+{
+  switch (sig) {
+  case SIGSEGV:
+    cout << "Segmentation fault. Aborting and dumping core.\n";
+    abort();
+  case SIGHUP:
+    cout << "Restarting on request.\n";
+    execvp(_argv[0], _argv);
+    execvp(basename(_argv[0]), _argv);
+  }
+  _shutdown = true;
+
+#ifndef   HAVE_SIGACTION
+  // assume broken, braindead sysv signal semantics
+  signal(sig, (RETSIGTYPE (*)(int)) signalhandler);
+#endif // HAVE_SIGACTION
+}
+
+int main(int, char **argv) {
+  _argv = argv;
+
+#ifdef    HAVE_SIGACTION
+  struct sigaction action;
+
+  action.sa_handler = signalhandler;
+  action.sa_mask = sigset_t();
+  action.sa_flags = SA_NOCLDSTOP | SA_NODEFER;
+
+  sigaction(SIGPIPE, &action, NULL);
+  sigaction(SIGSEGV, &action, NULL);
+  sigaction(SIGFPE, &action, NULL);
+  sigaction(SIGTERM, &action, NULL);
+  sigaction(SIGINT, &action, NULL);
+  sigaction(SIGHUP, &action, NULL);
+#else // !HAVE_SIGACTION
+  signal(SIGPIPE, (RETSIGTYPE (*)(int)) signalhandler);
+  signal(SIGSEGV, (RETSIGTYPE (*)(int)) signalhandler);
+  signal(SIGFPE, (RETSIGTYPE (*)(int)) signalhandler);
+  signal(SIGTERM, (RETSIGTYPE (*)(int)) signalhandler);
+  signal(SIGINT, (RETSIGTYPE (*)(int)) signalhandler);
+  signal(SIGHUP, (RETSIGTYPE (*)(int)) signalhandler);
+#endif // HAVE_SIGACTION
+  
+  while (! _shutdown) {
+    usleep(500);
+  }
   return 0;
 }
This page took 0.023058 seconds and 4 git commands to generate.