From 355828e64f6fa07eb96bc6b27eef964b529d8778 Mon Sep 17 00:00:00 2001 From: Alexander Barton Date: Wed, 9 Apr 2008 19:03:24 +0200 Subject: [PATCH] Enable the daemon to dump its internal state in debug-mode. This patch allows ngIRCd to dump its internal state (connected clients, actual configuration) when compiled with --enable-debug. The daemon catches two more signals: - SIGUSR1: toggle debug mode (on/off), - SIGUSR2: dump internal state to console/syslog. --- src/ngircd/client.c | 22 ++++++++++++++++++++ src/ngircd/client.h | 6 ++++++ src/ngircd/conf.c | 23 +++++++++++++++++++++ src/ngircd/conf.h | 4 ++++ src/ngircd/ngircd.c | 2 ++ src/ngircd/sighandlers.c | 44 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 101 insertions(+) diff --git a/src/ngircd/client.c b/src/ngircd/client.c index f73a2d1e..d53dc969 100644 --- a/src/ngircd/client.c +++ b/src/ngircd/client.c @@ -1274,4 +1274,26 @@ Destroy_UserOrService(CLIENT *Client, const char *Txt, const char *FwdMsg, bool } /* Destroy_UserOrService */ +#ifdef DEBUG + +GLOBAL void +Client_DebugDump(void) +{ + CLIENT *c; + + Log(LOG_DEBUG, "Client status:"); + c = My_Clients; + while (c) { + Log(LOG_DEBUG, + " - %s, type=%d, host=%s, user=%s, conn=%d, start=%ld, flags=%s", + Client_ID(c), Client_Type(c), Client_Hostname(c), + Client_User(c), Client_Conn(c), Client_StartTime(c), + Client_Flags(c)); + c = (CLIENT *)c->next; + } +} /* Client_DumpClients */ + +#endif + + /* -eof- */ diff --git a/src/ngircd/client.h b/src/ngircd/client.h index 98a0d1a4..42036c4e 100644 --- a/src/ngircd/client.h +++ b/src/ngircd/client.h @@ -157,6 +157,12 @@ GLOBAL void Client_RegisterWhowas PARAMS(( CLIENT *Client )); GLOBAL const char *Client_TypeText PARAMS((CLIENT *Client)); +#ifdef DEBUG +GLOBAL void Client_DebugDump PARAMS((void)); #endif + +#endif + + /* -eof- */ diff --git a/src/ngircd/conf.c b/src/ngircd/conf.c index a70973e7..5619a6c7 100644 --- a/src/ngircd/conf.c +++ b/src/ngircd/conf.c @@ -1524,6 +1524,29 @@ va_dcl } /* Config_Error */ +#ifdef DEBUG + +GLOBAL void +Conf_DebugDump(void) +{ + int i; + + Log(LOG_DEBUG, "Configured servers:"); + for (i = 0; i < MAX_SERVERS; i++) { + if (! Conf_Server[i].name[0]) + continue; + Log(LOG_DEBUG, + " - %s: %s:%d, last=%ld, group=%d, flags=%d, conn=%d", + Conf_Server[i].name, Conf_Server[i].host, + Conf_Server[i].port, Conf_Server[i].lasttry, + Conf_Server[i].group, Conf_Server[i].flags, + Conf_Server[i].conn_id); + } +} /* Conf_DebugDump */ + +#endif + + static void Init_Server_Struct( CONF_SERVER *Server ) { diff --git a/src/ngircd/conf.h b/src/ngircd/conf.h index e7b84d2e..5cf5f6b1 100644 --- a/src/ngircd/conf.h +++ b/src/ngircd/conf.h @@ -191,6 +191,10 @@ GLOBAL bool Conf_IsService PARAMS((int ConfServer, const char *Nick)); /* Password required by WEBIRC command */ GLOBAL char Conf_WebircPwd[CLIENT_PASS_LEN]; +#ifdef DEBUG +GLOBAL void Conf_DebugDump PARAMS((void)); +#endif + #endif diff --git a/src/ngircd/ngircd.c b/src/ngircd/ngircd.c index 2fd60ef8..d4d4d5f9 100644 --- a/src/ngircd/ngircd.c +++ b/src/ngircd/ngircd.c @@ -69,6 +69,7 @@ static void Setup_FDStreams PARAMS(( int fd )); static bool NGIRCd_Init PARAMS(( bool )); + /** * The main() function of ngIRCd. * Here all starts: this function is called by the operating system loader, @@ -723,4 +724,5 @@ NGIRCd_Init( bool NGIRCd_NoDaemon ) return false; } + /* -eof- */ diff --git a/src/ngircd/sighandlers.c b/src/ngircd/sighandlers.c index 7d65510e..688a8f02 100644 --- a/src/ngircd/sighandlers.c +++ b/src/ngircd/sighandlers.c @@ -36,6 +36,22 @@ static int signalpipe[2]; + +#ifdef DEBUG + +static void +Dump_State(void) +{ + Log(LOG_DEBUG, "--- Internal server state: ---"); + Log(LOG_DEBUG, "time()=%ld", time(NULL)); + Conf_DebugDump(); + Client_DebugDump(); + Log(LOG_DEBUG, "--- End of state dump ---"); +} /* Dump_State */ + +#endif + + static void Signal_Block(int sig) { #ifdef HAVE_SIGPROCMASK @@ -140,6 +156,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 } /* @@ -169,6 +209,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 -- 2.39.2