From 0ea1715d00b5112f2c9abc0721164271d77825f6 Mon Sep 17 00:00:00 2001 From: Alexander Barton Date: Mon, 2 Jan 2023 21:25:28 +0100 Subject: [PATCH] Refactor Channel_Mode(), get rid of some nesting No functional changes. --- src/ngircd/irc-mode.c | 73 ++++++++++++++++++++----------------------- 1 file changed, 34 insertions(+), 39 deletions(-) diff --git a/src/ngircd/irc-mode.c b/src/ngircd/irc-mode.c index 239dc167..baca6c10 100644 --- a/src/ngircd/irc-mode.c +++ b/src/ngircd/irc-mode.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2023 Alexander Barton (alex@barton.de) and Contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -609,24 +609,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) Channel_Name(Channel)); break; } - if (arg_arg > mode_arg) { - if (is_oper || is_machine || is_owner || - is_admin || is_op || is_halfop) { - Channel_ModeDel(Channel, 'k'); - Channel_SetKey(Channel, - Req->argv[arg_arg]); - strlcpy(argadd, Channel_Key(Channel), - sizeof(argadd)); - x[0] = *mode_ptr; - } else { - connected = IRC_WriteErrClient(Origin, - ERR_CHANOPRIVSNEEDED_MSG, - Client_ID(Origin), - Channel_Name(Channel)); - } - Req->argv[arg_arg][0] = '\0'; - arg_arg++; - } else { + if (arg_arg <= mode_arg) { #ifdef STRICT_RFC /* Only send error message in "strict" mode, * this is how ircd2.11 and others behave ... */ @@ -636,6 +619,20 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) #endif goto chan_exit; } + if (is_oper || is_machine || is_owner || + is_admin || is_op || is_halfop) { + Channel_ModeDel(Channel, 'k'); + Channel_SetKey(Channel, Req->argv[arg_arg]); + strlcpy(argadd, Channel_Key(Channel), sizeof(argadd)); + x[0] = *mode_ptr; + } else { + connected = IRC_WriteErrClient(Origin, + ERR_CHANOPRIVSNEEDED_MSG, + Client_ID(Origin), + Channel_Name(Channel)); + } + Req->argv[arg_arg][0] = '\0'; + arg_arg++; break; case 'l': /* Member limit */ if (Mode_Limit_Reached(Client, mode_arg_count++)) @@ -651,26 +648,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) Channel_Name(Channel)); break; } - if (arg_arg > mode_arg) { - if (is_oper || is_machine || is_owner || - is_admin || is_op || is_halfop) { - l = atol(Req->argv[arg_arg]); - if (l > 0 && l < 0xFFFF) { - Channel_ModeDel(Channel, 'l'); - Channel_SetMaxUsers(Channel, l); - snprintf(argadd, sizeof(argadd), - "%ld", l); - x[0] = *mode_ptr; - } - } else { - connected = IRC_WriteErrClient(Origin, - ERR_CHANOPRIVSNEEDED_MSG, - Client_ID(Origin), - Channel_Name(Channel)); - } - Req->argv[arg_arg][0] = '\0'; - arg_arg++; - } else { + if (arg_arg <= mode_arg) { #ifdef STRICT_RFC /* Only send error message in "strict" mode, * this is how ircd2.11 and others behave ... */ @@ -680,6 +658,23 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) #endif goto chan_exit; } + if (is_oper || is_machine || is_owner || + is_admin || is_op || is_halfop) { + l = atol(Req->argv[arg_arg]); + if (l > 0 && l < 0xFFFF) { + Channel_ModeDel(Channel, 'l'); + Channel_SetMaxUsers(Channel, l); + snprintf(argadd, sizeof(argadd), "%ld", l); + x[0] = *mode_ptr; + } + } else { + connected = IRC_WriteErrClient(Origin, + ERR_CHANOPRIVSNEEDED_MSG, + Client_ID(Origin), + Channel_Name(Channel)); + } + Req->argv[arg_arg][0] = '\0'; + arg_arg++; break; case 'O': /* IRC operators only */ if (set) { -- 2.39.2