X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Fchannel.c;h=8caa81a02971baaa4add589857e3b69b0a0d3eb3;hb=a11e895045a52f4b57cfc69a8f051af6f0c25997;hp=6958831ad79ce678db1c3c58366cf54b328dd75a;hpb=18efc7469c5923a298a218ee2d17f518cff184fa;p=ngircd-alex.git diff --git a/src/ngircd/channel.c b/src/ngircd/channel.c index 6958831a..8caa81a0 100644 --- a/src/ngircd/channel.c +++ b/src/ngircd/channel.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2008 by Alexander Barton (alex@barton.de) + * Copyright (c)2001-2009 Alexander Barton (alex@barton.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -57,7 +57,8 @@ static CL2CHAN *Add_Client PARAMS(( CHANNEL *Chan, CLIENT *Client )); static bool Remove_Client PARAMS(( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, const char *Reason, bool InformServer )); static CL2CHAN *Get_First_Cl2Chan PARAMS(( CLIENT *Client, CHANNEL *Chan )); static CL2CHAN *Get_Next_Cl2Chan PARAMS(( CL2CHAN *Start, CLIENT *Client, CHANNEL *Chan )); -static bool Delete_Channel PARAMS(( CHANNEL *Chan )); +static void Delete_Channel PARAMS(( CHANNEL *Chan )); +static void Free_Channel PARAMS(( CHANNEL *Chan )); GLOBAL void @@ -146,6 +147,17 @@ Channel_InitPredefined( void ) } /* Channel_InitPredefined */ +static void +Free_Channel(CHANNEL *chan) +{ + array_free(&chan->topic); + Lists_Free(&chan->list_bans); + Lists_Free(&chan->list_invites); + + free(chan); +} + + GLOBAL void Channel_Exit( void ) { @@ -154,20 +166,17 @@ Channel_Exit( void ) /* free struct Channel */ c = My_Channels; - while( c ) - { + while (c) { c_next = c->next; - array_free(&c->topic); - free( c ); + Free_Channel(c); c = c_next; } /* Free Channel allocation table */ cl2chan = My_Cl2Chan; - while( c ) - { + while (cl2chan) { cl2chan_next = cl2chan->next; - free( cl2chan ); + free(cl2chan); cl2chan = cl2chan_next; } } /* Channel_Exit */ @@ -1067,35 +1076,36 @@ Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Channel ) } /* Get_Next_Cl2Chan */ -static bool -Delete_Channel( CHANNEL *Chan ) +/** + * Remove a channel and free all of its data structures. + */ +static void +Delete_Channel(CHANNEL *Chan) { - /* delete channel structure */ - CHANNEL *chan, *last_chan; last_chan = NULL; chan = My_Channels; - while( chan ) - { - if( chan == Chan ) break; + while (chan) { + if (chan == Chan) + break; last_chan = chan; chan = chan->next; } - if( ! chan ) return false; - - Log( LOG_DEBUG, "Freed channel structure for \"%s\".", Chan->name ); - array_free(&chan->topic); - Lists_Free(&chan->list_bans); - Lists_Free(&chan->list_invites); + assert(chan != NULL); + if (!chan) + return; /* maintain channel list */ - if( last_chan ) last_chan->next = chan->next; - else My_Channels = chan->next; - free( chan ); + if (last_chan) + last_chan->next = chan->next; + else + My_Channels = chan->next; - return true; + LogDebug("Freed channel structure for \"%s\".", Chan->name); + Free_Channel(Chan); } /* Delete_Channel */ + /* -eof- */