Commit Diff


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 */