Module: ngircd.git Branch: master Commit: 355828e64f6fa07eb96bc6b27eef964b529d8778 URL: http://ngircd.barton.de/cgi-bin/gitweb.cgi?p=ngircd.git&a=commit;h=35582...
Author: Alexander Barton alex@barton.de Date: Wed Apr 9 19:03:24 2008 +0200
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(+), 0 deletions(-)
diff --git a/src/ngircd/client.c b/src/ngircd/client.c index f73a2d1..d53dc96 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 98a0d1a..42036c4 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 a70973e..5619a6c 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 e7b84d2..5cf5f6b 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 2fd60ef..d4d4d5f 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 7d65510..688a8f0 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