- if( arg_arg > mode_arg )
- {
- if( modeok )
- {
- 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 ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
- Req->argv[arg_arg][0] = '\0';
- arg_arg++;
+ Req->argv[arg_arg][0] = '\0';
+ arg_arg++;
+ } else {
+#ifdef STRICT_RFC
+ /* Only send error message in "strict" mode,
+ * this is how ircd2.11 and others behave ... */
+ connected = IRC_WriteErrClient(Origin,
+ ERR_NEEDMOREPARAMS_MSG,
+ Client_ID(Origin), Req->command);
+#endif
+ goto chan_exit;
+ }
+ break;
+ case 'O': /* IRC operators only */
+ if (set) {
+ /* Only IRC operators are allowed to
+ * set the 'O' channel mode! */
+ if(is_oper || is_machine)
+ x[0] = 'O';
+ else
+ connected = IRC_WriteErrClient(Origin,
+ ERR_NOPRIVILEGES_MSG,
+ Client_ID(Origin));
+ } else if(is_oper || is_machine || is_owner ||
+ is_admin || is_op)
+ x[0] = 'O';
+ else
+ connected = IRC_WriteErrClient(Origin,
+ ERR_CHANOPRIVSNEEDED_MSG,
+ Client_ID(Origin),
+ Channel_Name(Channel));
+ break;
+ case 'P': /* Persistent channel */
+ if (set) {
+ /* Only IRC operators are allowed to
+ * set the 'P' channel mode! */
+ if(is_oper || is_machine)
+ x[0] = 'P';
+ else
+ connected = IRC_WriteErrClient(Origin,
+ ERR_NOPRIVILEGES_MSG,
+ Client_ID(Origin));
+ } else if(is_oper || is_machine || is_owner ||
+ is_admin || is_op)
+ x[0] = 'P';
+ else
+ connected = IRC_WriteErrClient(Origin,
+ ERR_CHANOPRIVSNEEDED_MSG,
+ Client_ID(Origin),
+ Channel_Name(Channel));
+ break;
+ /* --- Channel user modes --- */
+ case 'q': /* Owner */
+ case 'a': /* Channel admin */
+ if(!is_oper && !is_machine && !is_owner && !is_admin) {
+ connected = IRC_WriteErrClient(Origin,
+ ERR_CHANOPPRIVTOOLOW_MSG,
+ Client_ID(Origin),
+ Channel_Name(Channel));
+ goto chan_exit;
+ }
+ case 'o': /* Channel operator */
+ if(!is_oper && !is_machine && !is_owner &&
+ !is_admin && !is_op) {
+ connected = IRC_WriteErrClient(Origin,
+ ERR_CHANOPRIVSNEEDED_MSG,
+ Client_ID(Origin),
+ Channel_Name(Channel));
+ goto chan_exit;
+ }
+ case 'h': /* Half Op */
+ if(!is_oper && !is_machine && !is_owner &&
+ !is_admin && !is_op) {
+ connected = IRC_WriteErrClient(Origin,
+ ERR_CHANOPRIVSNEEDED_MSG,
+ Client_ID(Origin),
+ Channel_Name(Channel));
+ goto chan_exit;
+ }
+ case 'v': /* Voice */
+ if (arg_arg > mode_arg) {
+ if (is_oper || is_machine || is_owner ||
+ is_admin || is_op || is_halfop) {
+ client = Client_Search(Req->argv[arg_arg]);
+ if (client)
+ x[0] = *mode_ptr;
+ else
+ connected = IRC_WriteErrClient(Origin,
+ ERR_NOSUCHNICK_MSG,
+ Client_ID(Origin),
+ Req->argv[arg_arg]);
+ } else {
+ connected = IRC_WriteErrClient(Origin,
+ ERR_CHANOPRIVSNEEDED_MSG,
+ Client_ID(Origin),
+ Channel_Name(Channel));