commit 0eda085f1e001cb1f2381ffe3ca70299d32632d3 from: Alexander Barton date: Mon Nov 17 22:27:06 2008 UTC 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. commit - 2cc21caf32323ebd778c16c8a7b69cd12d6ff01f commit + 0eda085f1e001cb1f2381ffe3ca70299d32632d3 blob - 7c3360acb088ebf4690f5796fa5287226473a961 blob + 609bbf5b5e976c19a30f2ba7e32103b482ee5cbb --- src/ngircd/channel.c +++ 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 */ @@ -746,6 +754,10 @@ Can_Send_To_Channel(CHANNEL *Chan, CLIENT *From) bool is_member, has_voice, is_op; 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; @@ -1011,8 +1023,28 @@ Channel_ShowInvites( CLIENT *Client, CHANNEL *Channel h = Channel_GetListInvites(Channel); return ShowInvitesBans(h, Client, Channel, true); } + + +/** + * 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 ) { blob - 91cc278e2ffe773609fcc30ca6787ba5f6db6a8e blob + 91d1e21de6e2bea2c1db75c8e09bef2edca09430 --- src/ngircd/channel.h +++ src/ngircd/channel.h @@ -125,6 +125,8 @@ GLOBAL bool Channel_AddBan PARAMS((CHANNEL *c, const c 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] == '&') blob - 5edbf368a53bfbc87b3b9e4e81c2d766610cd324 blob + d450bd0a2ee543e58bd448c10c87f15e04b4beee --- src/ngircd/log.c +++ 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 */