summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/chanserv.c38
1 files changed, 26 insertions, 12 deletions
diff --git a/src/chanserv.c b/src/chanserv.c
index b9784522f..5c70edfb9 100644
--- a/src/chanserv.c
+++ b/src/chanserv.c
@@ -1082,10 +1082,10 @@ void save_cs_rdb_dbase(void)
void check_modes(Channel * c)
{
char modebuf[64], argbuf[BUFSIZE], *end = modebuf, *end2 = argbuf;
- uint32 modes;
+ uint32 modes = 0;
ChannelInfo *ci;
- CBModeInfo *cbmi;
- CBMode *cbm;
+ CBModeInfo *cbmi = NULL;
+ CBMode *cbm = NULL;
if (!c) {
if (debug) {
@@ -1122,13 +1122,15 @@ void check_modes(Channel * c)
anope_cmd_mode(whosends(ci), c->name, "-r");
}
}
- return;
+ /* Channels that are not regged also need the defcon modes.. ~ Viper */
+ /* return; */
}
- /* Initialize te modes-var to set all modes not set yet but which should
+ /* Initialize the modes-var to set all modes not set yet but which should
* be set as by mlock and defcon.
*/
- modes = ~c->mode & ci->mlock_on;
+ if (ci)
+ modes = ~c->mode & ci->mlock_on;
if (DefConModesSet)
modes |= (~c->mode & DefConModesOn);
@@ -1147,8 +1149,13 @@ void check_modes(Channel * c)
/* Check if it's a defcon or mlock mode */
if (DefConModesOn & cbmi->flag)
value = cbmi->csgetvalue(&DefConModesCI);
- else
+ else if (ci)
value = cbmi->csgetvalue(ci);
+ else {
+ value = NULL;
+ if (debug)
+ alog ("Warning: setting modes with unknown origin.");
+ }
cbm = &cbmodes[(int) cbmi->mode];
cbm->setvalue(c, value);
@@ -1160,7 +1167,7 @@ void check_modes(Channel * c)
}
}
} else if (cbmi->getvalue && cbmi->csgetvalue
- && ((ci->mlock_on & cbmi->flag)
+ && ((ci && (ci->mlock_on & cbmi->flag))
|| (DefConModesOn & cbmi->flag))
&& (c->mode & cbmi->flag)) {
char *value = cbmi->getvalue(c);
@@ -1169,8 +1176,13 @@ void check_modes(Channel * c)
/* Check if it's a defcon or mlock mode */
if (DefConModesOn & cbmi->flag)
csvalue = cbmi->csgetvalue(&DefConModesCI);
- else
+ else if (ci)
csvalue = cbmi->csgetvalue(ci);
+ else {
+ csvalue = NULL;
+ if (debug)
+ alog ("Warning: setting modes with unknown origin.");
+ }
/* Lock and actual values don't match, so fix the mode */
if (value && csvalue && strcmp(value, csvalue)) {
@@ -1189,9 +1201,11 @@ void check_modes(Channel * c)
if (*(end - 1) == '+')
end--;
- modes = c->mode & ci->mlock_off;
+ modes = 0;
+ if (ci)
+ modes = c->mode & ci->mlock_off;
if (DefConModesSet)
- modes |= (~c->mode & DefConModesOff);
+ modes |= c->mode & DefConModesOff;
if (modes) {
*end++ = '-';
@@ -1228,7 +1242,7 @@ void check_modes(Channel * c)
*end = 0;
*end2 = 0;
- anope_cmd_mode(whosends(ci), c->name, "%s%s", modebuf,
+ anope_cmd_mode((ci ? whosends(ci) : s_OperServ), c->name, "%s%s", modebuf,
(end2 == argbuf ? "" : argbuf));
}