repo: ngircd action: commit revision: path_from: revision_from: 0eda085f1e001cb1f2381ffe3ca70299d32632d3: path_to: revision_to:
commit 0eda085f1e001cb1f2381ffe3ca70299d32632d3 Author: Alexander BartonDate: Mon Nov 17 23:27:06 2008 +0100 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. diff --git a/src/ngircd/channel.c b/src/ngircd/channel.c
--- 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
--- 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
--- 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 */
-----END OF PAGE-----