fixed ssl.c bug when ssl backend returns IO_BLOCKED but IO engine doesn't get informe...
[ircu2.10.12-pk.git] / ircd / m_clearmode.c
index 4d0f17924ad13922f88ee67d461fa07a7abf21fc..2e02bb0253ca9acf7baf31c3d313a7eb7e3991f1 100644 (file)
@@ -113,6 +113,7 @@ do_clearmode(struct Client *cptr, struct Client *sptr, struct Channel *chptr,
   static int flags[] = {
     MODE_CHANOP,       'o',
     MODE_VOICE,                'v',
+    MODE_HALFOP,    'h',
     MODE_PRIVATE,      'p',
     MODE_SECRET,       's',
     MODE_MODERATED,    'm',
@@ -127,6 +128,7 @@ do_clearmode(struct Client *cptr, struct Client *sptr, struct Channel *chptr,
     MODE_NOCOLOUR,      'c',
     MODE_NOCTCP,        'C',
     MODE_NOAMSGS,       'M',
+    MODE_BANEXCEPTION,  'e',
     0x0, 0x0
   };
   int *flag_p;
@@ -193,12 +195,12 @@ do_clearmode(struct Client *cptr, struct Client *sptr, struct Channel *chptr,
   }
 
   /* Deal with users on the channel */
-  if (del_mode & (MODE_BAN | MODE_CHANOP | MODE_VOICE))
+  if (del_mode & (MODE_BAN | MODE_BANEXCEPTION | MODE_CHANOP | MODE_HALFOP | MODE_VOICE))
     for (member = chptr->members; member; member = member->next_member) {
       if (IsZombie(member)) /* we ignore zombies */
        continue;
 
-      if (del_mode & MODE_BAN) /* If we cleared bans, clear the valid flags */
+      if (del_mode & (MODE_BAN | MODE_BANEXCEPTION)) /* If we cleared bans, clear the valid flags */
        ClearBanValid(member);
 
       /* Drop channel operator status */
@@ -206,6 +208,12 @@ do_clearmode(struct Client *cptr, struct Client *sptr, struct Channel *chptr,
        modebuf_mode_client(&mbuf, MODE_DEL | MODE_CHANOP, member->user, MAXOPLEVEL + 1);
        member->status &= ~CHFL_CHANOP;
       }
+      
+      /* Drop halfop */
+      if (IsHalfOp(member) && del_mode & MODE_HALFOP) {
+       modebuf_mode_client(&mbuf, MODE_DEL | MODE_HALFOP, member->user, MAXOPLEVEL + 1);
+       member->status &= ~CHFL_HALFOP;
+      }
 
       /* Drop voice */
       if (HasVoice(member) && del_mode & MODE_VOICE) {
@@ -278,7 +286,7 @@ int
 mo_clearmode(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
 {
   struct Channel *chptr;
-  char *control = "ovpsmikbl"; /* default control string */
+  char *control = "ovpsmikble"; /* default control string */
   const char *chname, *qreason;
   int force = 0;