diff options
| author | Alexander Barton <alex@barton.de> | 2008-11-17 23:27:06 +0100 |
|---|---|---|
| committer | Alexander Barton <alex@barton.de> | 2008-11-17 23:27:06 +0100 |
| commit | 0eda085f1e001cb1f2381ffe3ca70299d32632d3 (patch) | |
| tree | 72b113ecff5a02e7c25d9d20e2cb4b50ccb8e1e9 /src | |
| parent | 2cc21caf32323ebd778c16c8a7b69cd12d6ff01f (diff) | |
| download | ngircd-0eda085f1e001cb1f2381ffe3ca70299d32632d3.tar.gz ngircd-0eda085f1e001cb1f2381ffe3ca70299d32632d3.zip | |
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.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ngircd/channel.c | 32 | ||||
| -rw-r--r-- | src/ngircd/channel.h | 2 | ||||
| -rw-r--r-- | 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 */ |