repo: ngircd
action: commit
revision: 
path_from: 
revision_from: 78a3b4c7d64e87845d6babef9a4d1619f9691aba:
path_to: 
revision_to: 
git.thebackupbox.net
ngircd
git clone git://git.thebackupbox.net/ngircd
commit 78a3b4c7d64e87845d6babef9a4d1619f9691aba
Author: Alexander Barton 
Date:   Sun Jan 15 14:33:04 2012 +0100

    Don't enforce MAX_HNDL_MODES_ARG on server and service links

diff --git a/src/ngircd/irc-mode.c b/src/ngircd/irc-mode.c
index 383c4dee288f5a96e3c0ae0b88855ac49e3d9fb7..
index ..82e6a5aef0fb405d23b4bdc61f14174ffc39e9f3 100644
--- a/src/ngircd/irc-mode.c
+++ b/src/ngircd/irc-mode.c
@@ -102,6 +102,27 @@ IRC_MODE( CLIENT *Client, REQUEST *Req )
 } /* IRC_MODE */


+/**
+ * Check if the "mode limit" for a client has been reached.
+ *
+ * This limit doesn't apply for servers or services!
+ *
+ * @param Client The client to check.
+ * @param Count The number of modes already handled.
+ * @return true if the limit has been reached.
+ */
+static bool
+Mode_Limit_Reached(CLIENT *Client, int Count)
+{
+	if (Client_Type(Client) == CLIENT_SERVER
+	    || Client_Type(Client) == CLIENT_SERVICE)
+		return false;
+	if (Count < MAX_HNDL_MODES_ARG)
+		return false;
+	return true;
+}
+
+
 /**
  * Handle client mode requests
  *
@@ -491,7 +512,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
 					Client_ID(Origin), Channel_Name(Channel));
 			break;
 		case 'k': /* Channel key */
-			if (mode_arg_count++ >= MAX_HNDL_MODES_ARG)
+			if (Mode_Limit_Reached(Client, mode_arg_count++))
 				goto chan_exit;
 			if (!set) {
 				if (modeok)
@@ -527,7 +548,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
 			}
 			break;
 		case 'l': /* Member limit */
-			if (mode_arg_count++ >= MAX_HNDL_MODES_ARG)
+			if (Mode_Limit_Reached(Client, mode_arg_count++))
 				goto chan_exit;
 			if (!set) {
 				if (modeok)
@@ -639,7 +660,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
 		/* --- Channel lists --- */
 		case 'I': /* Invite lists */
 		case 'b': /* Ban lists */
-			if (mode_arg_count++ >= MAX_HNDL_MODES_ARG)
+			if (Mode_Limit_Reached(Client, mode_arg_count++))
 				goto chan_exit;
 			if (arg_arg > mode_arg) {
 				/* modify list */

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