From 0eda085f1e001cb1f2381ffe3ca70299d32632d3 Mon Sep 17 00:00:00 2001 From: Alexander Barton Date: Mon, 17 Nov 2008 23:27:06 +0100 Subject: [PATCH] Create local &SERVER channel and log server messages to it ngIRCd now creates a server-local channel &SERVER with channel modes +mnPt (moderated, no messages from outside the channel, persistent and with the topic locked) and logs all the messages to it that a user with mode +s ("server messages") receives. If an IRC operator withdraws the +P ("persistent") mode and the &SERVER channel is freed because of no members, nothing special happens. The channel can be recerated any time later and ngIRCd would begin logging to it again. --- src/ngircd/channel.c | 32 ++++++++++++++++++++++++++++++++ src/ngircd/channel.h | 2 ++ src/ngircd/log.c | 15 ++++++++------- 3 files changed, 42 insertions(+), 7 deletions(-) diff --git a/src/ngircd/channel.c b/src/ngircd/channel.c index 7c3360ac..609bbf5b 100644 --- a/src/ngircd/channel.c +++ b/src/ngircd/channel.c @@ -63,8 +63,16 @@ static bool Delete_Channel PARAMS(( CHANNEL *Chan )); GLOBAL void Channel_Init( void ) { + CHANNEL *sc; + My_Channels = NULL; My_Cl2Chan = NULL; + + sc = Channel_Create("&SERVER"); + if (sc) { + Channel_SetModes(sc, "mnPt"); + Channel_SetTopic(sc, Client_ThisServer(), "Server Messages"); + } } /* Channel_Init */ @@ -747,6 +755,10 @@ Can_Send_To_Channel(CHANNEL *Chan, CLIENT *From) is_member = has_voice = is_op = false; + /* The server itself always can send messages :-) */ + if (Client_ThisServer() == From) + return true; + if (Channel_IsMemberOf(Chan, From)) { is_member = true; if (strchr(Channel_UserModes(Chan, From), 'v')) @@ -1013,6 +1025,26 @@ Channel_ShowInvites( CLIENT *Client, CHANNEL *Channel ) } +/** + * Log a message to the local &SERVER channel, if it exists. + */ +GLOBAL void +Channel_LogServer(char *msg) +{ + CHANNEL *sc; + CLIENT *c; + + assert(msg != NULL); + + sc = Channel_Search("&SERVER"); + if (!sc) + return; + + c = Client_ThisServer(); + Channel_Write(sc, c, c, "PRIVMSG", false, msg); +} /* Channel_LogServer */ + + static CL2CHAN * Get_First_Cl2Chan( CLIENT *Client, CHANNEL *Chan ) { diff --git a/src/ngircd/channel.h b/src/ngircd/channel.h index 91cc278e..91d1e21d 100644 --- a/src/ngircd/channel.h +++ b/src/ngircd/channel.h @@ -125,6 +125,8 @@ GLOBAL bool Channel_AddBan PARAMS((CHANNEL *c, const char *Mask )); GLOBAL bool Channel_ShowBans PARAMS((CLIENT *client, CHANNEL *c)); GLOBAL bool Channel_ShowInvites PARAMS((CLIENT *client, CHANNEL *c)); +GLOBAL void Channel_LogServer PARAMS((char *msg)); + #define Channel_IsLocal(c) (Channel_Name(c)[0] == '&') diff --git a/src/ngircd/log.c b/src/ngircd/log.c index 5edbf368..d450bd0a 100644 --- a/src/ngircd/log.c +++ b/src/ngircd/log.c @@ -61,7 +61,7 @@ Log_Init( bool Daemon_Mode ) Is_Daemon = Daemon_Mode; #ifdef SYSLOG -#ifndef LOG_CONS /* Kludge: mips-dec-ultrix4.5 has no LOG_CONS/LOG_LOCAL5 */ +#ifndef LOG_CONS /* Kludge: mips-dec-ultrix4.5 has no LOG_CONS/LOG_LOCAL5 */ #define LOG_CONS 0 #endif #ifndef LOG_LOCAL5 @@ -202,6 +202,8 @@ va_dcl * Logging function of ngIRCd. * This function logs messages to the console and/or syslog, whichever is * suitable for the mode ngIRCd is running in (daemon vs. non-daemon). + * If LOG_snotice is set, the log messages goes to all user with the mode +s + * set and the local &SERVER channel, too. * Please note: you sould use LogDebug(...) for debug messages! * @param Level syslog level (LOG_xxx) * @param Format Format string like printf(). @@ -218,7 +220,6 @@ const char *Format; va_dcl #endif { - /* Eintrag in Logfile(s) schreiben */ char msg[MAX_LOG_MSG_LEN]; bool snotice; va_list ap; @@ -239,7 +240,6 @@ va_dcl if( Level == LOG_DEBUG ) return; #endif - /* String mit variablen Argumenten zusammenbauen ... */ #ifdef PROTOTYPES va_start( ap, Format ); #else @@ -269,10 +269,11 @@ va_dcl fflush( stderr ); } - if( snotice ) - { - /* NOTICE an lokale User mit "s"-Mode */ - Wall_ServerNotice( msg ); + if (snotice) { + /* Send NOTICE to all local users with mode +s and to the + * local &SERVER channel */ + Wall_ServerNotice(msg); + Channel_LogServer(msg); } } /* Log */ -- 2.39.2