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.
This commit is contained in:
Alexander Barton 2008-04-09 19:03:24 +02:00
parent 755f54b150
commit 355828e64f
6 changed files with 101 additions and 0 deletions

View File

@ -1274,4 +1274,26 @@ Destroy_UserOrService(CLIENT *Client, const char *Txt, const char *FwdMsg, bool
} /* Destroy_UserOrService */ } /* 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- */ /* -eof- */

View File

@ -157,6 +157,12 @@ GLOBAL void Client_RegisterWhowas PARAMS(( CLIENT *Client ));
GLOBAL const char *Client_TypeText PARAMS((CLIENT *Client)); GLOBAL const char *Client_TypeText PARAMS((CLIENT *Client));
#ifdef DEBUG
GLOBAL void Client_DebugDump PARAMS((void));
#endif #endif
#endif
/* -eof- */ /* -eof- */

View File

@ -1524,6 +1524,29 @@ va_dcl
} /* Config_Error */ } /* 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 static void
Init_Server_Struct( CONF_SERVER *Server ) Init_Server_Struct( CONF_SERVER *Server )
{ {

View File

@ -191,6 +191,10 @@ GLOBAL bool Conf_IsService PARAMS((int ConfServer, const char *Nick));
/* Password required by WEBIRC command */ /* Password required by WEBIRC command */
GLOBAL char Conf_WebircPwd[CLIENT_PASS_LEN]; GLOBAL char Conf_WebircPwd[CLIENT_PASS_LEN];
#ifdef DEBUG
GLOBAL void Conf_DebugDump PARAMS((void));
#endif
#endif #endif

View File

@ -69,6 +69,7 @@ static void Setup_FDStreams PARAMS(( int fd ));
static bool NGIRCd_Init PARAMS(( bool )); static bool NGIRCd_Init PARAMS(( bool ));
/** /**
* The main() function of ngIRCd. * The main() function of ngIRCd.
* Here all starts: this function is called by the operating system loader, * Here all starts: this function is called by the operating system loader,
@ -723,4 +724,5 @@ NGIRCd_Init( bool NGIRCd_NoDaemon )
return false; return false;
} }
/* -eof- */ /* -eof- */

View File

@ -36,6 +36,22 @@
static int signalpipe[2]; 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) static void Signal_Block(int sig)
{ {
#ifdef HAVE_SIGPROCMASK #ifdef HAVE_SIGPROCMASK
@ -140,6 +156,30 @@ static void Signal_Handler(int Signal)
while (waitpid( -1, NULL, WNOHANG) > 0) while (waitpid( -1, NULL, WNOHANG) > 0)
; ;
return; 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(); NGIRCd_Rehash();
break; break;
#ifdef DEBUG #ifdef DEBUG
case SIGUSR2:
if (NGIRCd_Debug)
Dump_State();
break;
default: default:
Log(LOG_DEBUG, "Got signal %d! Ignored.", Signal); Log(LOG_DEBUG, "Got signal %d! Ignored.", Signal);
#endif #endif