added signal handler
[NeonServV5.git] / src / main.c
index b86633e7e01536e4df08fa7fb657f429dca994fc..7e1839f1c9ca27127ef907388c861e19c4a3ac3d 100644 (file)
@@ -16,6 +16,7 @@
  */
 
 #include "main.h"
+#include "signal.h"
 #include "ClientSocket.h"
 #include "UserNode.h"
 #include "ChanNode.h"
@@ -44,6 +45,8 @@ static int statistics_requested_lusers = 0;
 int statistics_enabled;
 TIMEQ_CALLBACK(main_statistics);
 TIMEQ_CALLBACK(main_checkauths);
+static int process_argc;
+static char **process_argv;
 #ifdef HAVE_THREADS
 int running_threads;
 pthread_mutex_t cache_sync;
@@ -136,6 +139,15 @@ int getCurrentThreadID() {
 
 int main(int argc, char *argv[]) {
 main:
+    process_argv = argv;
+    process_argc = argc;
+    
+    signal(SIGABRT, sighandler);
+    signal(SIGFPE, sighandler);
+    signal(SIGILL, sighandler);
+    signal(SIGINT, sighandler);
+    signal(SIGSEGV, sighandler);
+    signal(SIGTERM, sighandler);
     
     start_time = time(0);
     
@@ -225,20 +237,23 @@ main:
     #endif
     cleanup();
     if(hard_restart) {
-        /* Append a NULL to the end of argv[]. */
-        char **restart_argv = (char **)alloca((argc + 1) * sizeof(char *));
-        memcpy(restart_argv, argv, argc * sizeof(char *));
-        restart_argv[argc] = NULL;
-        
-        #ifdef WIN32
-        execv(argv[0], (const char * const*)restart_argv);
-        #else
-        execv(argv[0], restart_argv);
-        #endif
+        restart_process();
     }
     goto main;
 }
 
+void restart_process() {
+    /* Append a NULL to the end of argv[]. */
+    char **restart_argv = (char **)alloca((process_argc + 1) * sizeof(char *));
+    memcpy(restart_argv, process_argv, process_argc * sizeof(char *));
+    restart_argv[process_argc] = NULL;
+    #ifdef WIN32
+    execv(process_argv[0], (const char * const*)restart_argv);
+    #else
+    execv(process_argv[0], restart_argv);
+    #endif
+}
+
 int stricmp (const char *s1, const char *s2)
 {
    if (s1 == NULL) return s2 == NULL ? 0 : -(*s2);