/* 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); }
/* 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. */ void remove_channel(struct chanset_t *chan) { if (chan != chanset_default) { irc_log(chan, "Parting"); /* Remove the channel from the list, so that noone can pull it away from under our feet during the check_part() call. */ chanset_unlink(chan); /* Using chan->name is important here, especially for !chans <cybah> */ if (!conf.bot->hub && shouldjoin(chan) && chan->name[0]) dprintf(DP_SERVER, "PART %s\n", chan->name); clear_channel(chan, 0); noshare = 1; /* Remove channel-bans */ while (chan->bans) u_delmask('b', chan, chan->bans->mask, 1); /* Remove channel-exempts */ while (chan->exempts) u_delmask('e', chan, chan->exempts->mask, 1); /* Remove channel-invites */ while (chan->invites) u_delmask('I', chan, chan->invites->mask, 1); /* Remove channel specific user flags */ user_del_chan(chan->dname); noshare = 0; } free(chan->channel.key); if (chan->key) free(chan->key); if (chan->rmkey) free(chan->rmkey); free(chan); }