repo: ngircd
action: commit
revision: 
path_from: 
revision_from: 81b81c818cb60abe8bcfb1cd22769ae831b942e7:
path_to: 
revision_to: 
git.thebackupbox.net
ngircd
git clone git://git.thebackupbox.net/ngircd
commit 81b81c818cb60abe8bcfb1cd22769ae831b942e7
Author: Alexander Barton 
Date:   Sun Apr 12 19:35:39 2015 +0200

    MODE command: Always report channel creation time

    Up to now when receiving a MODE command, ngIRCd only reported the channel
    creation time to clients that were members of the channel. This patch
    reports the channel creation time to all clients, regardless if they are
    joined to that channel or not.

    At least ircd-seven behaves like this.

    This closes #188. Thanks Cahata!

diff --git a/src/ngircd/irc-mode.c b/src/ngircd/irc-mode.c
index 79ab2ebe94beaa41b904b01b1493a83d125e5e25..
index ..cde573bf83faa98db98e9702bdd234f5fbe21203 100644
--- a/src/ngircd/irc-mode.c
+++ b/src/ngircd/irc-mode.c
@@ -378,37 +378,44 @@ Channel_Mode_Answer_Request(CLIENT *Origin, CHANNEL *Channel)
 	char the_modes[COMMAND_LEN], the_args[COMMAND_LEN], argadd[CLIENT_PASS_LEN];
 	const char *mode_ptr;

-	/* Member or not? -- That's the question! */
-	if (!Channel_IsMemberOf(Channel, Origin))
-		return IRC_WriteStrClient(Origin, RPL_CHANNELMODEIS_MSG,
-			Client_ID(Origin), Channel_Name(Channel), Channel_Modes(Channel));
-
-	/* The sender is a member: generate extended reply */
-	strlcpy(the_modes, Channel_Modes(Channel), sizeof(the_modes));
-	mode_ptr = the_modes;
-	the_args[0] = '\0';
-
-	while(*mode_ptr) {
-		switch(*mode_ptr) {
-		case 'l':
-			snprintf(argadd, sizeof(argadd), " %lu", Channel_MaxUsers(Channel));
-			strlcat(the_args, argadd, sizeof(the_args));
-			break;
-		case 'k':
-			strlcat(the_args, " ", sizeof(the_args));
-			strlcat(the_args, Channel_Key(Channel), sizeof(the_args));
-			break;
+	if (!Channel_IsMemberOf(Channel, Origin)) {
+		/* Not a member: "simple" mode reply */
+		if (!IRC_WriteStrClient(Origin, RPL_CHANNELMODEIS_MSG,
+					Client_ID(Origin), Channel_Name(Channel),
+					Channel_Modes(Channel)))
+			return DISCONNECTED;
+	} else {
+		/* The sender is a member: generate extended reply */
+		strlcpy(the_modes, Channel_Modes(Channel), sizeof(the_modes));
+		mode_ptr = the_modes;
+		the_args[0] = '\0';
+
+		while(*mode_ptr) {
+			switch(*mode_ptr) {
+			case 'l':
+				snprintf(argadd, sizeof(argadd), " %lu",
+					 Channel_MaxUsers(Channel));
+				strlcat(the_args, argadd, sizeof(the_args));
+				break;
+			case 'k':
+				strlcat(the_args, " ", sizeof(the_args));
+				strlcat(the_args, Channel_Key(Channel),
+					sizeof(the_args));
+				break;
+			}
+			mode_ptr++;
 		}
-		mode_ptr++;
+		if (the_args[0])
+			strlcat(the_modes, the_args, sizeof(the_modes));
+
+		if (!IRC_WriteStrClient(Origin, RPL_CHANNELMODEIS_MSG,
+					Client_ID(Origin), Channel_Name(Channel),
+					the_modes))
+			return DISCONNECTED;
 	}
-	if (the_args[0])
-		strlcat(the_modes, the_args, sizeof(the_modes));

-	if (!IRC_WriteStrClient(Origin, RPL_CHANNELMODEIS_MSG,
-				Client_ID(Origin), Channel_Name(Channel),
-				the_modes))
-		return DISCONNECTED;
 #ifndef STRICT_RFC
+	/* Channel creation time */
 	if (!IRC_WriteStrClient(Origin, RPL_CREATIONTIME_MSG,
 				  Client_ID(Origin), Channel_Name(Channel),
 				  Channel_CreationTime(Channel)))

-----END OF PAGE-----