]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/sighandlers.c
Make sighandlers.{c|h} compatible with ansi2knr
[ngircd-alex.git] / src / ngircd / sighandlers.c
index d03692a2e2cc17539b2ec35c44d7a881977f2af2..d472b7fcbb1c165e269c57d9dde761ec65835928 100644 (file)
 
 static int signalpipe[2];
 
-static void Signal_Block(int sig)
+
+#ifdef DEBUG
+
+static void
+Dump_State(void)
+{
+       Log(LOG_DEBUG, "--- Internal server state: %s ---",
+           Client_ID(Client_ThisServer()));
+       Log(LOG_DEBUG, "time()=%ld", time(NULL));
+       Conf_DebugDump();
+       Conn_DebugDump();
+       Client_DebugDump();
+       Log(LOG_DEBUG, "--- End of state dump ---");
+} /* Dump_State */
+
+#endif
+
+
+static void
+Signal_Block(int sig)
 {
 #ifdef HAVE_SIGPROCMASK
        sigset_t set;
@@ -45,11 +64,14 @@ static void Signal_Block(int sig)
        sigaddset(&set, sig);
 
        sigprocmask(SIG_BLOCK, &set, NULL);
+#else
+       sigblock(sig);
 #endif
 }
 
 
-static void Signal_Unblock(int sig)
+static void
+Signal_Unblock(int sig)
 {
 #ifdef HAVE_SIGPROCMASK
        sigset_t set;
@@ -58,6 +80,9 @@ static void Signal_Unblock(int sig)
        sigaddset(&set, sig);
 
        sigprocmask(SIG_UNBLOCK, &set, NULL);
+#else
+       int old = sigblock(0) & ~sig;
+       sigsetmask(old);
 #endif
 }
 
@@ -119,7 +144,8 @@ NGIRCd_Rehash( void )
  * It blocks the signal and queues it for later execution by Signal_Handler_BH.
  * @param Signal Number of the signal to handle.
  */
-static void Signal_Handler(int Signal)
+static void
+Signal_Handler(int Signal)
 {
        switch (Signal) {
        case SIGTERM:
@@ -135,6 +161,30 @@ static void Signal_Handler(int Signal)
                while (waitpid( -1, NULL, WNOHANG) > 0)
                        ;
                return;
+#ifdef DEBUG
+       case SIGUSR1:
+               if (! NGIRCd_Debug) {
+                       Log(LOG_INFO|LOG_snotice,
+                           "Got SIGUSR1, debug mode activated.");
+#ifdef SNIFFER
+                       strcpy(NGIRCd_DebugLevel, "2");
+                       NGIRCd_Debug = true;
+                       NGIRCd_Sniffer = true;
+#else
+                       strcpy(NGIRCd_DebugLevel, "1");
+                       NGIRCd_Debug = true;
+#endif /* SNIFFER */
+               } else {
+                       Log(LOG_INFO|LOG_snotice,
+                           "Got SIGUSR1, debug mode deactivated.");
+                       strcpy(NGIRCd_DebugLevel, "");
+                       NGIRCd_Debug = false;
+#ifdef SNIFFER
+                       NGIRCd_Sniffer = false;
+#endif /* SNIFFER */
+               }
+               return;
+#endif
        }
 
        /*
@@ -156,7 +206,8 @@ static void Signal_Handler(int Signal)
  * thus its not necessary to only use functions that are signal safe.
  * @param Signal Number of the signal that was queued.
  */
-static void Signal_Handler_BH(int Signal)
+static void
+Signal_Handler_BH(int Signal)
 {
        switch (Signal) {
        case SIGHUP:
@@ -164,6 +215,10 @@ static void Signal_Handler_BH(int Signal)
                NGIRCd_Rehash();
                break;
 #ifdef DEBUG
+       case SIGUSR2:
+               if (NGIRCd_Debug)
+                       Dump_State();
+               break;
        default:
                Log(LOG_DEBUG, "Got signal %d! Ignored.", Signal);
 #endif
@@ -171,7 +226,9 @@ static void Signal_Handler_BH(int Signal)
        Signal_Unblock(Signal);
 }
 
-static void Sig_callback(int fd, short UNUSED what)
+
+static void
+Signal_Callback(int fd, short UNUSED what)
 {
        int sig, ret;
        (void) what;
@@ -201,7 +258,8 @@ static const int signals_catch[] = { SIGINT, SIGQUIT, SIGTERM, SIGHUP, SIGCHLD,
  * those signals we are interested in and sets SIGPIPE to be ignored.
  * @return true if initialization was sucessful.
  */
-bool Signals_Init(void)
+bool
+Signals_Init(void)
 {
        size_t i;
 #ifdef HAVE_SIGACTION
@@ -239,9 +297,8 @@ bool Signals_Init(void)
 
        signal(SIGPIPE, SIG_IGN);
 #endif
-       return io_event_create(signalpipe[0], IO_WANTREAD,
-                                       Sig_callback);
-} /* Initialize_Signal_Handler */
+       return io_event_create(signalpipe[0], IO_WANTREAD, Signal_Callback);
+} /* Signals_Init */
 
 
 /**
@@ -251,7 +308,8 @@ bool Signals_Init(void)
  * child prodcess, especially when we are about to call
  * 3rd party code (e.g. PAM).
  */
-void Signals_Exit(void)
+void
+Signals_Exit(void)
 {
        size_t i;
 #ifdef HAVE_SIGACTION