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 |
|
|