Merge branch 'master' into IOMultiplexer
[NeonServV5.git] / src / signal.c
index 9ec12f05237433376267fe2556958c4a859d8250..175f61150db18ba33863ba979eef4d3953be9eef 100644 (file)
@@ -1,4 +1,4 @@
-/* signal.c - NeonServ v5.4
+/* signal.c - NeonServ v5.5
  * Copyright (C) 2011-2012  Philipp Kreil (pk910)
  * 
  * This program is free software: you can redistribute it and/or modify
 #include "bots.h"
 #include "ChanNode.h"
 #include "ClientSocket.h"
+#include "IOHandler.h"
 #include "ConfigParser.h"
 
 static void sigcrash();
 static void sigexit();
 
 void sighandler(int signum) {
-    putlog(LOGLEVEL_INFO, "Received Signal %d", signum);
+    putlog(LOGLEVEL_INFO, "Received Signal %d\n", signum);
     signal(signum, SIG_DFL);
     switch(signum) {
         case SIGABRT:
@@ -48,7 +49,8 @@ void sighandler(int signum) {
 }
 
 static void sigcrash(int signum) {
-    char *coregen = "";
+    char coregen[MAXLEN];
+       coregen[0] = 0;
     char *signame;
     switch(signum) {
         case SIGSEGV:
@@ -64,13 +66,13 @@ static void sigcrash(int signum) {
             signame = "SIGUNKNOWN";
             break;
     }
-    putlog(LOGLEVEL_ERROR, "NeonServ process crashed (%s)", signame);
+    putlog(LOGLEVEL_ERROR, "NeonServ process crashed (%s)\n", signame);
     #ifndef WIN32
     char gcore[50];
     sprintf(gcore, "gcore %u", getpid());
-    system(gcore); //generate core file
-    coregen = "core file generated.";
-    putlog(LOGLEVEL_ERROR | LOGLEVEL_INFO, "generated core file.");
+    int sysretn = system(gcore); //generate core file
+    sprintf(coregen, "core file generated. (%d)", sysretn);
+    putlog(LOGLEVEL_ERROR | LOGLEVEL_INFO, "generated core file.\n");
     #endif
     char *alertchan = get_string_field("General.alertchan");
     if(alertchan) {
@@ -84,15 +86,17 @@ static void sigcrash(int signum) {
     struct ClientSocket *bot;
     for(bot = getBots(SOCKET_FLAG_READY, NULL); bot; bot = getBots(SOCKET_FLAG_READY, bot)) {
         if((bot->flags & SOCKET_FLAG_CONNECTED)) {
-            close(bot->sock);
-            bot->flags &= SOCKET_FLAG_CONNECTED;
+            iohandler_close(bot->iofd);
+            bot->flags &= ~(SOCKET_FLAG_CONNECTED | SOCKET_FLAG_READY);
+            bot->iofd = NULL;
         }
     }
-    putlog(LOGLEVEL_INFO, "hard shutdown...");
+    putlog(LOGLEVEL_INFO, "hard shutdown...\n");
     exit_daemon();
-    usleep(1000000);
+    usleep(2000000);
     //hard restart
     restart_process();
+    exit(0);
 }
 
 static void sigexit(int signum) {