/* Completely removes a channel. * * This includes the removal of all channel-bans, -exempts and -invites, as * well as all user flags related to the channel. */ static void remove_channel(struct chanset_t *chan) { int i; module_entry *me; /* Remove the channel from the list, so that noone can pull it * away from under our feet during the check_tcl_part() call. */ (void) chanset_unlink(chan); if ((me = module_find("irc", 1, 3)) != NULL) (me->funcs[IRC_DO_CHANNEL_PART]) (chan); clear_channel(chan, 0); noshare = 1; /* Remove channel-bans */ while (chan->bans) u_delban(chan, chan->bans->mask, 1); /* Remove channel-exempts */ while (chan->exempts) u_delexempt(chan, chan->exempts->mask, 1); /* Remove channel-invites */ while (chan->invites) u_delinvite(chan, chan->invites->mask, 1); /* Remove channel specific user flags */ user_del_chan(chan->dname); noshare = 0; nfree(chan->channel.key); for (i = 0; i < MODES_PER_LINE_MAX && chan->cmode[i].op; i++) nfree(chan->cmode[i].op); if (chan->key) nfree(chan->key); if (chan->rmkey) nfree(chan->rmkey); nfree(chan); }
/* Check for expired timed-invites. */ static void check_expired_invites(void) { maskrec *u, *u2; struct chanset_t *chan; masklist *b; if (!use_invites) return; for (u = global_invites; u; u = u2) { u2 = u->next; if (!(u->flags & MASKREC_PERM) && (now >= u->expire)) { putlog(LOG_MISC, "*", "%s %s (%s)", INVITES_NOLONGER, u->mask, MISC_EXPIRED); for (chan = chanset; chan; chan = chan->next) if (!(chan->channel.mode & CHANINV)) for (b = chan->channel.invite; b->mask[0]; b = b->next) if (!rfc_casecmp(b->mask, u->mask) && expired_mask(chan, b->who) && b->timer != now) { add_mode(chan, '-', 'I', u->mask); b->timer = now; } u_delinvite(NULL, u->mask, 1); } } /* Check for specific channel-domain invites expiring */ for (chan = chanset; chan; chan = chan->next) { for (u = chan->invites; u; u = u2) { u2 = u->next; if (!(u->flags & MASKREC_PERM) && (now >= u->expire)) { putlog(LOG_MISC, "*", "%s %s %s %s (%s)", INVITES_NOLONGER, u->mask, MISC_ONLOCALE, chan->dname, MISC_EXPIRED); if (!(chan->channel.mode & CHANINV)) for (b = chan->channel.invite; b->mask[0]; b = b->next) if (!rfc_casecmp(b->mask, u->mask) && expired_mask(chan, b->who) && b->timer != now) { add_mode(chan, '-', 'I', u->mask); b->timer = now; } u_delinvite(chan, u->mask, 1); } } } }
/* Completely removes a channel. * This includes the removal of all channel-bans, -exempts and -invites, as * well as all user flags related to the channel. */ static void remove_channel(struct chanset_t *chan) { clear_channel(chan, 0); noshare = 1; /* Remove channel-bans */ while (chan->bans) u_delban(chan, chan->bans->mask, 1); /* Remove channel-exempts */ while (chan->exempts) u_delexempt(chan, chan->exempts->mask, 1); /* Remove channel-invites */ while (chan->invites) u_delinvite(chan, chan->invites->mask, 1); /* Remove channel specific user flags */ user_del_chan(chan->name); noshare = 0; killchanset(chan); }