ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/branches/8.2.x/modules/core/m_mode.c
(Generate patch)

Comparing ircd-hybrid/branches/8.2.x/modules/core/m_mode.c (file contents):
Revision 4817 by michael, Sat Nov 1 16:05:01 2014 UTC vs.
Revision 5033 by michael, Sat Dec 13 15:38:35 2014 UTC

# Line 88 | Line 88 | set_user_mode(struct Client *source_p, c
88    setmodes = source_p->umodes;
89  
90    /* parse mode change string(s) */
91 <  for (char **p = &parv[2]; p && *p; ++p)
91 >  for (const char *m = parv[2]; *m; ++m)
92    {
93 <    for (const char *m = *p; *m; ++m)
93 >    switch (*m)
94      {
95 <      switch (*m)
96 <      {
97 <        case '+':
98 <          what = MODE_ADD;
99 <          break;
100 <        case '-':
101 <          what = MODE_DEL;
102 <          break;
103 <        case 'o':
104 <          if (what == MODE_ADD)
95 >      case '+':
96 >        what = MODE_ADD;
97 >        break;
98 >      case '-':
99 >        what = MODE_DEL;
100 >        break;
101 >      case 'o':
102 >        if (what == MODE_ADD)
103 >        {
104 >          if (!MyConnect(source_p) && !HasUMode(source_p, UMODE_OPER))
105            {
106 <            if (!MyConnect(source_p) && !HasUMode(source_p, UMODE_OPER))
107 <            {
108 <              ++Count.oper;
109 <              SetOper(source_p);
110 <            }
106 >            ++Count.oper;
107 >            SetOper(source_p);
108            }
109 <          else
109 >        }
110 >        else
111 >        {
112 >          if (!HasUMode(source_p, UMODE_OPER))
113 >            break;
114 >
115 >          ClearOper(source_p);
116 >          --Count.oper;
117 >
118 >          if (MyConnect(source_p))
119            {
120 <            if (!HasUMode(source_p, UMODE_OPER))
115 <              break;
120 >            dlink_node *node = NULL;
121  
122 <            ClearOper(source_p);
123 <            --Count.oper;
122 >            detach_conf(source_p, CONF_OPER);
123 >            ClrOFlag(source_p);
124 >            DelUMode(source_p, ConfigGeneral.oper_only_umodes);
125  
126 <            if (MyConnect(source_p))
127 <            {
122 <              dlink_node *node = NULL;
123 <
124 <              detach_conf(source_p, CONF_OPER);
125 <              ClrOFlag(source_p);
126 <              DelUMode(source_p, ConfigGeneral.oper_only_umodes);
127 <
128 <              if ((node = dlinkFindDelete(&oper_list, source_p)))
129 <                free_dlink_node(node);
130 <            }
126 >            if ((node = dlinkFindDelete(&oper_list, source_p)))
127 >              free_dlink_node(node);
128            }
129 +        }
130  
131 <          break;
134 <
135 <        case 'S':  /* Only servers may set +S in a burst */
136 <        case 'W':  /* Only servers may set +W in a burst */
137 <        case 'r':  /* Only services may set +r */
138 <        case 'x':  /* Only services may set +x */
139 <          break;
131 >        break;
132  
133 <        default:
134 <          if ((mode = user_modes[(unsigned char)*m]))
133 >      case 'S':  /* Only servers may set +S in a burst */
134 >      case 'W':  /* Only servers may set +W in a burst */
135 >      case 'r':  /* Only services may set +r */
136 >      case 'x':  /* Only services may set +x */
137 >        break;
138 >
139 >      default:
140 >        if ((mode = user_modes[(unsigned char)*m]))
141 >        {
142 >          if (MyConnect(source_p) && !HasUMode(source_p, UMODE_OPER) &&
143 >              (ConfigGeneral.oper_only_umodes & mode))
144 >            badmode = 1;
145 >          else
146            {
147 <            if (MyConnect(source_p) && !HasUMode(source_p, UMODE_OPER) &&
148 <                (ConfigGeneral.oper_only_umodes & mode))
146 <              badmode = 1;
147 >            if (what == MODE_ADD)
148 >              AddUMode(source_p, mode);
149              else
150 <            {
149 <              if (what == MODE_ADD)
150 <                AddUMode(source_p, mode);
151 <              else
152 <                DelUMode(source_p, mode);
153 <            }
150 >              DelUMode(source_p, mode);
151            }
152 <          else if (MyConnect(source_p))
153 <            badmode = 1;
152 >        }
153 >        else if (MyConnect(source_p))
154 >          badmode = 1;
155  
156 <          break;
159 <      }
156 >        break;
157      }
158    }
159  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines