X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Fchannel.c;h=bf3e5a7951f4b439834ac8a50815f6059e961daa;hb=b5d74751b1c9145c8de87f373ebc170f6f717994;hp=31e568ca2b1f41946a25fcdaadc6627f72b4e002;hpb=f22f1cf4f4ed4e6fe0e75dc69154022003bcba78;p=ngircd-alex.git diff --git a/src/ngircd/channel.c b/src/ngircd/channel.c index 31e568ca..bf3e5a79 100644 --- a/src/ngircd/channel.c +++ b/src/ngircd/channel.c @@ -9,7 +9,7 @@ * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * - * $Id: channel.c,v 1.21 2002/04/23 19:51:31 alex Exp $ + * $Id: channel.c,v 1.24 2002/05/30 16:52:21 alex Exp $ * * channel.c: Management der Channels */ @@ -25,37 +25,79 @@ #include #include +#include "conn.h" #include "client.h" -#include "hash.h" + +#include "exp.h" +#include "channel.h" + +#include "imp.h" #include "irc-write.h" +#include "resolve.h" +#include "conf.h" +#include "hash.h" #include "log.h" #include "messages.h" #include "exp.h" -#include "channel.h" LOCAL CHANNEL *My_Channels; LOCAL CL2CHAN *My_Cl2Chan; -LOCAL CHANNEL *New_Chan( CHAR *Name ); -LOCAL CL2CHAN *Get_Cl2Chan( CHANNEL *Chan, CLIENT *Client ); -LOCAL CL2CHAN *Add_Client( CHANNEL *Chan, CLIENT *Client ); -LOCAL BOOLEAN Remove_Client( CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Reason, BOOLEAN ServerPART ); -LOCAL CL2CHAN *Get_First_Cl2Chan( CLIENT *Client, CHANNEL *Chan ); -LOCAL CL2CHAN *Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Chan ); -LOCAL BOOLEAN Delete_Channel( CHANNEL *Chan ); +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(( CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Reason, BOOLEAN ServerPART )); +LOCAL CL2CHAN *Get_First_Cl2Chan PARAMS(( CLIENT *Client, CHANNEL *Chan )); +LOCAL CL2CHAN *Get_Next_Cl2Chan PARAMS(( CL2CHAN *Start, CLIENT *Client, CHANNEL *Chan )); +LOCAL BOOLEAN Delete_Channel PARAMS(( CHANNEL *Chan )); -GLOBAL VOID Channel_Init( VOID ) +GLOBAL VOID +Channel_Init( VOID ) { + CHANNEL *chan; + CHAR *c; + INT i; + My_Channels = NULL; My_Cl2Chan = NULL; + + /* Vordefinierte persistente Channels erzeugen */ + for( i = 0; i < Conf_Channel_Count; i++ ) + { + /* Ist ein Name konfiguriert? */ + if( ! Conf_Channel[i].name ) continue; + + /* Gueltiger Channel-Name? */ + if( ! Channel_IsValidName( Conf_Channel[i].name )) + { + Log( LOG_ERR, "Can't create pre-defined channel: invalid name: \"%s\"!", Conf_Channel[i].name ); + continue; + } + + /* Channel anlegen */ + chan = New_Chan( 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; + while( *c ) Channel_ModeAdd( chan, *c++ ); + Log( LOG_INFO, "Created pre-defined channel \"%s\".", Conf_Channel[i].name ); + } + else Log( LOG_ERR, "Can't create pre-defined channel \"%s\"!", Conf_Channel[i].name ); + } } /* Channel_Init */ -GLOBAL VOID Channel_Exit( VOID ) +GLOBAL VOID +Channel_Exit( VOID ) { CHANNEL *c, *c_next; CL2CHAN *cl2chan, *cl2chan_next; @@ -80,7 +122,8 @@ GLOBAL VOID Channel_Exit( VOID ) } /* Channel_Exit */ -GLOBAL BOOLEAN Channel_Join( CLIENT *Client, CHAR *Name ) +GLOBAL BOOLEAN +Channel_Join( CLIENT *Client, CHAR *Name ) { CHANNEL *chan; @@ -118,7 +161,8 @@ GLOBAL BOOLEAN Channel_Join( CLIENT *Client, CHAR *Name ) } /* Channel_Join */ -GLOBAL BOOLEAN Channel_Part( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason ) +GLOBAL BOOLEAN +Channel_Part( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason ) { CHANNEL *chan; @@ -139,7 +183,8 @@ GLOBAL BOOLEAN Channel_Part( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *R } /* Channel_Part */ -GLOBAL VOID Channel_RemoveClient( CLIENT *Client, CHAR *Reason ) +GLOBAL VOID +Channel_RemoveClient( CLIENT *Client, CHAR *Reason ) { CHANNEL *c, *next_c; @@ -155,7 +200,8 @@ GLOBAL VOID Channel_RemoveClient( CLIENT *Client, CHAR *Reason ) } /* Channel_RemoveClient */ -GLOBAL INT Channel_Count( VOID ) +GLOBAL INT +Channel_Count( VOID ) { CHANNEL *c; INT count; @@ -171,7 +217,8 @@ GLOBAL INT Channel_Count( VOID ) } /* Channel_Count */ -GLOBAL INT Channel_MemberCount( CHANNEL *Chan ) +GLOBAL INT +Channel_MemberCount( CHANNEL *Chan ) { CL2CHAN *cl2chan; INT count; @@ -189,34 +236,39 @@ GLOBAL INT Channel_MemberCount( CHANNEL *Chan ) } /* Channel_MemberCount */ -GLOBAL CHAR *Channel_Name( CHANNEL *Chan ) +GLOBAL CHAR * +Channel_Name( CHANNEL *Chan ) { assert( Chan != NULL ); return Chan->name; } /* Channel_Name */ -GLOBAL CHAR *Channel_Modes( CHANNEL *Chan ) +GLOBAL CHAR * +Channel_Modes( CHANNEL *Chan ) { assert( Chan != NULL ); return Chan->modes; } /* Channel_Modes */ -GLOBAL CHANNEL *Channel_First( VOID ) +GLOBAL CHANNEL * +Channel_First( VOID ) { return My_Channels; } /* Channel_First */ -GLOBAL CHANNEL *Channel_Next( CHANNEL *Chan ) +GLOBAL CHANNEL * +Channel_Next( CHANNEL *Chan ) { assert( Chan != NULL ); return Chan->next; } /* Channel_Next */ -GLOBAL CHANNEL *Channel_Search( CHAR *Name ) +GLOBAL CHANNEL * +Channel_Search( CHAR *Name ) { /* Channel-Struktur suchen */ @@ -240,14 +292,16 @@ GLOBAL CHANNEL *Channel_Search( CHAR *Name ) } /* Channel_Search */ -GLOBAL CL2CHAN *Channel_FirstMember( CHANNEL *Chan ) +GLOBAL CL2CHAN * +Channel_FirstMember( CHANNEL *Chan ) { assert( Chan != NULL ); return Get_First_Cl2Chan( NULL, Chan ); } /* Channel_FirstMember */ -GLOBAL CL2CHAN *Channel_NextMember( CHANNEL *Chan, CL2CHAN *Cl2Chan ) +GLOBAL CL2CHAN * +Channel_NextMember( CHANNEL *Chan, CL2CHAN *Cl2Chan ) { assert( Chan != NULL ); assert( Cl2Chan != NULL ); @@ -255,14 +309,16 @@ GLOBAL CL2CHAN *Channel_NextMember( CHANNEL *Chan, CL2CHAN *Cl2Chan ) } /* Channel_NextMember */ -GLOBAL CL2CHAN *Channel_FirstChannelOf( CLIENT *Client ) +GLOBAL CL2CHAN * +Channel_FirstChannelOf( CLIENT *Client ) { assert( Client != NULL ); return Get_First_Cl2Chan( Client, NULL ); } /* Channel_FirstChannelOf */ -GLOBAL CL2CHAN *Channel_NextChannelOf( CLIENT *Client, CL2CHAN *Cl2Chan ) +GLOBAL CL2CHAN * +Channel_NextChannelOf( CLIENT *Client, CL2CHAN *Cl2Chan ) { assert( Client != NULL ); assert( Cl2Chan != NULL ); @@ -270,31 +326,35 @@ GLOBAL CL2CHAN *Channel_NextChannelOf( CLIENT *Client, CL2CHAN *Cl2Chan ) } /* Channel_NextChannelOf */ -GLOBAL CLIENT *Channel_GetClient( CL2CHAN *Cl2Chan ) +GLOBAL CLIENT * +Channel_GetClient( CL2CHAN *Cl2Chan ) { assert( Cl2Chan != NULL ); return Cl2Chan->client; } /* Channel_GetClient */ -GLOBAL CHANNEL *Channel_GetChannel( CL2CHAN *Cl2Chan ) +GLOBAL CHANNEL * +Channel_GetChannel( CL2CHAN *Cl2Chan ) { assert( Cl2Chan != NULL ); return Cl2Chan->channel; } /* Channel_GetChannel */ -GLOBAL BOOLEAN Channel_IsValidName( CHAR *Name ) +GLOBAL BOOLEAN +Channel_IsValidName( CHAR *Name ) { - /* PrŸfen, ob Name als Channelname gueltig */ + /* Pruefen, ob Name als Channelname gueltig */ - CHAR *ptr, badchars[] = " ,:\x07"; + CHAR *ptr, badchars[10]; assert( Name != NULL ); if(( Name[0] != '#' ) || ( strlen( Name ) >= CHANNEL_NAME_LEN )) return FALSE; ptr = Name; + strcpy( badchars, " ,:\x07" ); while( *ptr ) { if( strchr( badchars, *ptr )) return FALSE; @@ -305,7 +365,8 @@ GLOBAL BOOLEAN Channel_IsValidName( CHAR *Name ) } /* Channel_IsValidName */ -GLOBAL BOOLEAN Channel_ModeAdd( CHANNEL *Chan, CHAR Mode ) +GLOBAL BOOLEAN +Channel_ModeAdd( CHANNEL *Chan, CHAR Mode ) { /* Mode soll gesetzt werden. TRUE wird geliefert, wenn der * Mode neu gesetzt wurde, FALSE, wenn der Channel den Mode @@ -326,7 +387,8 @@ GLOBAL BOOLEAN Channel_ModeAdd( CHANNEL *Chan, CHAR Mode ) } /* Channel_ModeAdd */ -GLOBAL BOOLEAN Channel_ModeDel( CHANNEL *Chan, CHAR Mode ) +GLOBAL BOOLEAN +Channel_ModeDel( CHANNEL *Chan, CHAR Mode ) { /* Mode soll geloescht werden. TRUE wird geliefert, wenn der * Mode entfernt wurde, FALSE, wenn der Channel den Mode @@ -351,7 +413,8 @@ GLOBAL BOOLEAN Channel_ModeDel( CHANNEL *Chan, CHAR Mode ) } /* Channel_ModeDel */ -GLOBAL BOOLEAN Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, CHAR Mode ) +GLOBAL BOOLEAN +Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, CHAR Mode ) { /* Channel-User-Mode soll gesetzt werden. TRUE wird geliefert, * wenn der Mode neu gesetzt wurde, FALSE, wenn der User den @@ -377,7 +440,8 @@ GLOBAL BOOLEAN Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, CHAR Mode ) } /* Channel_UserModeAdd */ -GLOBAL BOOLEAN Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, CHAR Mode ) +GLOBAL BOOLEAN +Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, CHAR Mode ) { /* Channel-User-Mode soll geloescht werden. TRUE wird geliefert, * wenn der Mode entfernt wurde, FALSE, wenn der User den Channel-Mode @@ -407,7 +471,8 @@ GLOBAL BOOLEAN Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, CHAR Mode ) } /* Channel_UserModeDel */ -GLOBAL CHAR *Channel_UserModes( CHANNEL *Chan, CLIENT *Client ) +GLOBAL CHAR * +Channel_UserModes( CHANNEL *Chan, CLIENT *Client ) { /* Channel-Modes eines Users liefern */ @@ -423,7 +488,8 @@ GLOBAL CHAR *Channel_UserModes( CHANNEL *Chan, CLIENT *Client ) } /* Channel_UserModes */ -GLOBAL BOOLEAN Channel_IsMemberOf( CHANNEL *Chan, CLIENT *Client ) +GLOBAL BOOLEAN +Channel_IsMemberOf( CHANNEL *Chan, CLIENT *Client ) { /* Pruefen, ob Client Mitglied in Channel ist */ @@ -435,14 +501,16 @@ GLOBAL BOOLEAN Channel_IsMemberOf( CHANNEL *Chan, CLIENT *Client ) } /* Channel_IsMemberOf */ -GLOBAL CHAR *Channel_Topic( CHANNEL *Chan ) +GLOBAL CHAR * +Channel_Topic( CHANNEL *Chan ) { assert( Chan != NULL ); return Chan->topic; } /* Channel_Topic */ -GLOBAL VOID Channel_SetTopic( CHANNEL *Chan, CHAR *Topic ) +GLOBAL VOID +Channel_SetTopic( CHANNEL *Chan, CHAR *Topic ) { assert( Chan != NULL ); assert( Topic != NULL ); @@ -452,7 +520,8 @@ GLOBAL VOID Channel_SetTopic( CHANNEL *Chan, CHAR *Topic ) } /* Channel_SetTopic */ -GLOBAL BOOLEAN Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR *Text ) +GLOBAL BOOLEAN +Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR *Text ) { BOOLEAN is_member, has_voice, is_op, ok; @@ -479,7 +548,8 @@ GLOBAL BOOLEAN Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR -LOCAL CHANNEL *New_Chan( CHAR *Name ) +LOCAL CHANNEL * +New_Chan( CHAR *Name ) { /* Neue Channel-Struktur anlegen */ @@ -506,7 +576,8 @@ LOCAL CHANNEL *New_Chan( CHAR *Name ) } /* New_Chan */ -LOCAL CL2CHAN *Get_Cl2Chan( CHANNEL *Chan, CLIENT *Client ) +LOCAL CL2CHAN * +Get_Cl2Chan( CHANNEL *Chan, CLIENT *Client ) { CL2CHAN *cl2chan; @@ -523,7 +594,8 @@ LOCAL CL2CHAN *Get_Cl2Chan( CHANNEL *Chan, CLIENT *Client ) } /* Get_Cl2Chan */ -LOCAL CL2CHAN *Add_Client( CHANNEL *Chan, CLIENT *Client ) +LOCAL CL2CHAN * +Add_Client( CHANNEL *Chan, CLIENT *Client ) { CL2CHAN *cl2chan; @@ -551,7 +623,8 @@ LOCAL CL2CHAN *Add_Client( CHANNEL *Chan, CLIENT *Client ) } /* Add_Client */ -LOCAL BOOLEAN Remove_Client( CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Reason, BOOLEAN ServerPART ) +LOCAL BOOLEAN +Remove_Client( CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Reason, BOOLEAN ServerPART ) { CL2CHAN *cl2chan, *last_cl2chan; CHANNEL *c; @@ -585,20 +658,25 @@ LOCAL BOOLEAN Remove_Client( CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR Log( LOG_DEBUG, "User \"%s\" left channel \"%s\" (%s).", Client_Mask( Client ), c->name, Reason ); - /* Wenn Channel nun leer: loeschen */ - if( ! Get_First_Cl2Chan( NULL, Chan )) Delete_Channel( Chan ); + /* Wenn Channel nun leer und nicht pre-defined: loeschen */ + if( ! strchr( Channel_Modes( Chan ), 'P' )) + { + if( ! Get_First_Cl2Chan( NULL, Chan )) Delete_Channel( Chan ); + } return TRUE; } /* Remove_Client */ -LOCAL CL2CHAN *Get_First_Cl2Chan( CLIENT *Client, CHANNEL *Chan ) +LOCAL CL2CHAN * +Get_First_Cl2Chan( CLIENT *Client, CHANNEL *Chan ) { return Get_Next_Cl2Chan( My_Cl2Chan, Client, Chan ); } /* Get_First_Cl2Chan */ -LOCAL CL2CHAN *Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Channel ) +LOCAL CL2CHAN * +Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Channel ) { CL2CHAN *cl2chan; @@ -615,7 +693,8 @@ LOCAL CL2CHAN *Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Channe } /* Get_Next_Cl2Chan */ -LOCAL BOOLEAN Delete_Channel( CHANNEL *Chan ) +LOCAL BOOLEAN +Delete_Channel( CHANNEL *Chan ) { /* Channel-Struktur loeschen */