X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Fchannel.c;h=386aaa2a1ad7f5166a31490746b822356e32f56c;hp=5e4d11be7fd9453d7fcc9cccf5be5ffe7dfe0c8b;hb=e907816380d02f913cc1f9c463f7835fc70fc0c0;hpb=04162c3944d24beb05bca573595cac74a470b0ec diff --git a/src/ngircd/channel.c b/src/ngircd/channel.c index 5e4d11be..386aaa2a 100644 --- a/src/ngircd/channel.c +++ b/src/ngircd/channel.c @@ -2,16 +2,13 @@ * ngIRCd -- The Next Generation IRC Daemon * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de) * - * Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen - * der GNU General Public License (GPL), wie von der Free Software Foundation - * herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2 - * der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version. - * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste - * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: channel.c,v 1.27 2002/06/02 17:13:07 alex Exp $ - * - * channel.c: Management der Channels + * Channel management */ @@ -20,6 +17,8 @@ #include "portab.h" +static char UNUSED id[] = "$Id: channel.c,v 1.37 2002/12/14 13:21:56 alex Exp $"; + #include "imp.h" #include #include @@ -36,6 +35,7 @@ #include "resolve.h" #include "conf.h" #include "hash.h" +#include "lists.h" #include "log.h" #include "messages.h" @@ -51,7 +51,6 @@ LOCAL CHANNEL *My_Channels; LOCAL CL2CHAN *My_Cl2Chan; -LOCAL CHANNEL *New_Chan PARAMS(( CHAR *Name )); LOCAL CL2CHAN *Get_Cl2Chan PARAMS(( CHANNEL *Chan, CLIENT *Client )); LOCAL CL2CHAN *Add_Client PARAMS(( CHANNEL *Chan, CLIENT *Client )); LOCAL BOOLEAN Remove_Client PARAMS(( INT Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Reason, BOOLEAN InformServer )); @@ -80,7 +79,7 @@ Channel_InitPredefined( VOID ) for( i = 0; i < Conf_Channel_Count; i++ ) { /* Ist ein Name konfiguriert? */ - if( ! Conf_Channel[i].name ) continue; + if( ! Conf_Channel[i].name[0] ) continue; /* Gueltiger Channel-Name? */ if( ! Channel_IsValidName( Conf_Channel[i].name )) @@ -88,14 +87,19 @@ Channel_InitPredefined( VOID ) Log( LOG_ERR, "Can't create pre-defined channel: invalid name: \"%s\"!", Conf_Channel[i].name ); continue; } + + /* Gibt es den Channel bereits? */ + chan = Channel_Search( Conf_Channel[i].name ); + if( chan ) + { + Log( LOG_INFO, "Can't create pre-defined channel \"%s\": name already in use.", Conf_Channel[i].name ); + continue; + } /* Channel anlegen */ - chan = New_Chan( Conf_Channel[i].name ); + chan = Channel_Create( Conf_Channel[i].name ); if( chan ) { - /* Verketten */ - chan->next = My_Channels; - My_Channels = chan; Channel_ModeAdd( chan, 'P' ); Channel_SetTopic( chan, Conf_Channel[i].topic ); c = Conf_Channel[i].modes; @@ -158,12 +162,8 @@ Channel_Join( CLIENT *Client, CHAR *Name ) else { /* Gibt es noch nicht? Dann neu anlegen: */ - chan = New_Chan( Name ); + chan = Channel_Create( Name ); if( ! chan ) return FALSE; - - /* Verketten */ - chan->next = My_Channels; - My_Channels = chan; } /* User dem Channel hinzufuegen */ @@ -256,11 +256,11 @@ Channel_Quit( CLIENT *Client, CHAR *Reason ) } /* Channel_Quit */ -GLOBAL INT +GLOBAL LONG Channel_Count( VOID ) { CHANNEL *c; - INT count; + LONG count; count = 0; c = My_Channels; @@ -273,11 +273,11 @@ Channel_Count( VOID ) } /* Channel_Count */ -GLOBAL INT +GLOBAL LONG Channel_MemberCount( CHANNEL *Chan ) { CL2CHAN *cl2chan; - INT count; + LONG count; assert( Chan != NULL ); @@ -292,6 +292,48 @@ Channel_MemberCount( CHANNEL *Chan ) } /* Channel_MemberCount */ +GLOBAL INT +Channel_CountForUser( CLIENT *Client ) +{ + /* Count number of channels a user is member of. */ + + CL2CHAN *cl2chan; + INT count; + + assert( Client != NULL ); + + count = 0; + cl2chan = My_Cl2Chan; + while( cl2chan ) + { + if( cl2chan->client == Client ) count++; + cl2chan = cl2chan->next; + } + + return count; +} /* Channel_CountForUser */ + + +GLOBAL INT +Channel_PCount( VOID ) +{ + /* Count the number of persistent (mode 'P') channels */ + + CHANNEL *chan; + INT count; + + count = 0; + chan = My_Channels; + while( chan ) + { + if( strchr( chan->modes, 'P' )) count++; + chan = chan->next; + } + + return count; +} /* Channel_PCount */ + + GLOBAL CHAR * Channel_Name( CHANNEL *Chan ) { @@ -576,6 +618,18 @@ Channel_SetTopic( CHANNEL *Chan, CHAR *Topic ) } /* Channel_SetTopic */ +GLOBAL VOID +Channel_SetModes( CHANNEL *Chan, CHAR *Modes ) +{ + assert( Chan != NULL ); + assert( Modes != NULL ); + + strncpy( Chan->modes, Modes, CHANNEL_MODE_LEN - 1 ); + Chan->topic[CHANNEL_MODE_LEN - 1] = '\0'; +} /* Channel_SetModes */ + + + GLOBAL BOOLEAN Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR *Text ) { @@ -603,9 +657,8 @@ Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR *Text ) } /* Channel_Write */ - -LOCAL CHANNEL * -New_Chan( CHAR *Name ) +GLOBAL CHANNEL * +Channel_Create( CHAR *Name ) { /* Neue Channel-Struktur anlegen */ @@ -616,7 +669,7 @@ New_Chan( CHAR *Name ) c = malloc( sizeof( CHANNEL )); if( ! c ) { - Log( LOG_EMERG, "Can't allocate memory!" ); + Log( LOG_EMERG, "Can't allocate memory! [New_Chan]" ); return NULL; } c->next = NULL; @@ -626,10 +679,14 @@ New_Chan( CHAR *Name ) strcpy( c->topic, "" ); c->hash = Hash( c->name ); + /* Verketten */ + c->next = My_Channels; + My_Channels = c; + Log( LOG_DEBUG, "Created new channel structure for \"%s\".", Name ); return c; -} /* New_Chan */ +} /* Channel_Create */ LOCAL CL2CHAN * @@ -662,7 +719,7 @@ Add_Client( CHANNEL *Chan, CLIENT *Client ) cl2chan = malloc( sizeof( CL2CHAN )); if( ! cl2chan ) { - Log( LOG_EMERG, "Can't allocate memory!" ); + Log( LOG_EMERG, "Can't allocate memory! [Add_Client]" ); return NULL; } cl2chan->channel = Chan; @@ -787,6 +844,9 @@ Delete_Channel( CHANNEL *Chan ) Log( LOG_DEBUG, "Freed channel structure for \"%s\".", Chan->name ); + /* Invite- und Ban-Lists aufraeumen */ + Lists_DeleteChannel( chan ); + /* Neu verketten und freigeben */ if( last_chan ) last_chan->next = chan->next; else My_Channels = chan->next;