summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorAlexander Barton <alex@barton.de>2008-11-17 23:27:06 +0100
committerAlexander Barton <alex@barton.de>2008-11-17 23:27:06 +0100
commit0eda085f1e001cb1f2381ffe3ca70299d32632d3 (patch)
tree72b113ecff5a02e7c25d9d20e2cb4b50ccb8e1e9 /src
parent2cc21caf32323ebd778c16c8a7b69cd12d6ff01f (diff)
downloadngircd-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.c32
-rw-r--r--src/ngircd/channel.h2
-rw-r--r--src/ngircd/log.c15
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 */