- else ok = IRC_WriteStrClient( Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID( Origin ), Req->command );
- break;
- case 'l':
- /* Member limit */
- if( ! set )
- {
- if( modeok ) x[0] = *mode_ptr;
- else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
- break;
- }
- 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++;
- }
- else ok = IRC_WriteStrClient( Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID( Origin ), Req->command );
- break;
-
- /* Channel lists */
- case 'I':
- /* Invite lists */
- if( arg_arg > mode_arg )
- {
- /* modify list */
- if( modeok )
- {
- if( set ) Add_Invite( Origin, Client, Channel, Req->argv[arg_arg] );
- else Del_Invite( Origin, Client, Channel, Req->argv[arg_arg] );
- }
- else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
- Req->argv[arg_arg][0] = '\0';
- arg_arg++;
- }
- else Lists_ShowInvites( Origin, Channel );
- break;
- case 'b':
- /* Ban lists */
- if( arg_arg > mode_arg )
- {
- /* modify list */
- if( modeok )
- {
- if( set ) Add_Ban( Origin, Client, Channel, Req->argv[arg_arg] );
- else Del_Ban( Origin, Client, Channel, Req->argv[arg_arg] );
- }
- 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 {
+ connected = IRC_WriteStrClient(Origin,
+ ERR_NEEDMOREPARAMS_MSG,
+ Client_ID(Origin), Req->command);
+ goto chan_exit;
+ }
+ break;
+ case 'P': /* Persistent channel */
+ if (modeok) {
+ /* Only IRC operators are allowed to
+ * set the 'P' channel mode! */
+ if (set && !(Client_OperByMe(Client)
+ || Client_Type(Client) == CLIENT_SERVER))
+ connected = IRC_WriteStrClient(Origin,
+ ERR_NOPRIVILEGES_MSG,
+ Client_ID(Origin));
+ else
+ x[0] = 'P';
+ } else
+ connected = IRC_WriteStrClient(Origin,
+ ERR_CHANOPRIVSNEEDED_MSG,
+ Client_ID(Origin),
+ Channel_Name(Channel));
+ break;
+ /* --- Channel user modes --- */
+ case 'o': /* Channel operator */
+ case 'v': /* Voice */
+ if (arg_arg > mode_arg) {
+ if (modeok) {
+ client = Client_Search(Req->argv[arg_arg]);
+ if (client)
+ x[0] = *mode_ptr;
+ else
+ connected = IRC_WriteStrClient(Client,
+ ERR_NOSUCHNICK_MSG,
+ Client_ID(Client),
+ Req->argv[arg_arg]);
+ } else {
+ connected = IRC_WriteStrClient(Origin,
+ ERR_CHANOPRIVSNEEDED_MSG,
+ Client_ID(Origin),
+ Channel_Name(Channel));