2 * ngIRCd -- The Next Generation IRC Daemon
3 * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
5 * Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
6 * der GNU General Public License (GPL), wie von der Free Software Foundation
7 * herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
8 * der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
9 * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
10 * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
12 * $Id: lists.c,v 1.7 2002/09/08 00:55:45 alex Exp $
14 * lists.c: Verwaltung der "IRC-Listen": Ban, Invite, ...
30 #include "irc-write.h"
39 #define MASK_LEN 2*CLIENT_HOST_LEN
51 LOCAL C2C *My_Invites, *My_Bans;
54 LOCAL C2C *New_C2C PARAMS(( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce ));
56 LOCAL BOOLEAN Check_List PARAMS(( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan ));
63 /* Modul initialisieren */
65 My_Invites = My_Bans = NULL;
76 /* Invite-Lists freigeben */
85 /* Ban-Lists freigeben */
97 Lists_CheckInvited( CLIENT *Client, CHANNEL *Chan )
99 return Check_List( &My_Invites, Client, Chan );
100 } /* Lists_CheckInvited */
104 Lists_AddInvited( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce )
108 assert( Mask != NULL );
109 assert( Chan != NULL );
111 c2c = New_C2C( Mask, Chan, OnlyOnce );
114 Log( LOG_ERR, "Can't add new invite list entry!" );
119 c2c->next = My_Invites;
122 Log( LOG_DEBUG, "Added \"%s\" to invite list for \"%s\".", Mask, Channel_Name( Chan ));
124 } /* Lists_AddInvited */
128 Lists_DelInvited( CHAR *Mask, CHANNEL *Chan )
130 C2C *c2c, *last, *next;
132 assert( Mask != NULL );
133 assert( Chan != NULL );
140 if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 ))
142 /* dieser Eintrag muss geloescht werden */
143 Log( LOG_DEBUG, "Deleted \"%s\" from invite list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
144 if( last ) last->next = next;
145 else My_Invites = next;
151 } /* Lists_DelInvited */
155 Lists_ShowInvites( CLIENT *Client, CHANNEL *Channel )
159 assert( Client != NULL );
160 assert( Channel != NULL );
165 if( c2c->channel == Channel )
167 /* Eintrag fuer Channel gefunden; ausgeben: */
168 if( ! IRC_WriteStrClient( Client, RPL_INVITELIST_MSG, Client_ID( Client ), Channel_Name( Channel ), c2c->mask )) return DISCONNECTED;
172 return IRC_WriteStrClient( Client, RPL_ENDOFINVITELIST_MSG, Client_ID( Client ), Channel_Name( Channel ));
173 } /* Lists_ShowInvites */
177 Lists_CheckBanned( CLIENT *Client, CHANNEL *Chan )
179 return Check_List( &My_Bans, Client, Chan );
180 } /* Lists_CheckBanned */
184 Lists_AddBanned( CHAR *Mask, CHANNEL *Chan )
188 assert( Mask != NULL );
189 assert( Chan != NULL );
191 c2c = New_C2C( Mask, Chan, FALSE );
194 Log( LOG_ERR, "Can't add new ban list entry!" );
202 Log( LOG_DEBUG, "Added \"%s\" to ban list for \"%s\".", Mask, Channel_Name( Chan ));
204 } /* Lists_AddBanned */
208 Lists_DelBanned( CHAR *Mask, CHANNEL *Chan )
210 C2C *c2c, *last, *next;
212 assert( Mask != NULL );
213 assert( Chan != NULL );
220 if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 ))
222 /* dieser Eintrag muss geloescht werden */
223 Log( LOG_DEBUG, "Deleted \"%s\" from ban list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
224 if( last ) last->next = next;
231 } /* Lists_DelBanned */
235 Lists_ShowBans( CLIENT *Client, CHANNEL *Channel )
239 assert( Client != NULL );
240 assert( Channel != NULL );
245 if( c2c->channel == Channel )
247 /* Eintrag fuer Channel gefunden; ausgeben: */
248 if( ! IRC_WriteStrClient( Client, RPL_BANLIST_MSG, Client_ID( Client ), Channel_Name( Channel ), c2c->mask )) return DISCONNECTED;
252 return IRC_WriteStrClient( Client, RPL_ENDOFBANLIST_MSG, Client_ID( Client ), Channel_Name( Channel ));
253 } /* Lists_ShowBans */
257 Lists_DeleteChannel( CHANNEL *Chan )
259 /* Channel wurde geloescht, Invite- und Ban-Lists aufraeumen */
261 C2C *c2c, *last, *next;
269 if( c2c->channel == Chan )
271 /* dieser Eintrag muss geloescht werden */
272 Log( LOG_DEBUG, "Deleted \"%s\" from invite list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
273 if( last ) last->next = next;
274 else My_Invites = next;
287 if( c2c->channel == Chan )
289 /* dieser Eintrag muss geloescht werden */
290 Log( LOG_DEBUG, "Deleted \"%s\" from ban list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
291 if( last ) last->next = next;
298 } /* Lists_DeleteChannel */
302 Lists_MakeMask( CHAR *Pattern )
304 /* Hier wird aus einem "beliebigen" Pattern eine gueltige IRC-Mask erzeugt.
305 * Diese ist aber nur bis zum naechsten Aufruf von Lists_MakeMask() gueltig,
306 * da ein einziger globaler Puffer verwendet wird. ->Umkopieren!*/
308 STATIC CHAR TheMask[MASK_LEN];
313 excl = strchr( Pattern, '!' );
314 at = strchr( Pattern, '@' );
316 if(( at ) && ( at < excl )) excl = NULL;
318 if(( ! at ) && ( ! excl ))
320 /* weder ! noch @ĂŠvorhanden: als Nick annehmen */
321 strncpy( TheMask, Pattern, MASK_LEN - 5 );
322 TheMask[MASK_LEN - 5] = '\0';
323 strcat( TheMask, "!*@*" );
327 if(( ! at ) && ( excl ))
330 strncpy( TheMask, Pattern, MASK_LEN - 3 );
331 TheMask[MASK_LEN - 3] = '\0';
332 strcat( TheMask, "@*" );
336 if(( at ) && ( ! excl ))
340 strncpy( TheMask, Pattern, MASK_LEN - 4 );
341 TheMask[MASK_LEN - 4] = '\0';
342 strcat( TheMask, "!*@" );
343 strncat( TheMask, at, strlen( TheMask ) - MASK_LEN - 1 );
344 TheMask[MASK_LEN - 1] = '\0';
348 /* alle Teile vorhanden */
349 strncpy( TheMask, Pattern, MASK_LEN - 1 );
350 TheMask[MASK_LEN - 1] = '\0';
352 } /* Lists_MakeMask */
356 New_C2C( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce )
360 assert( Mask != NULL );
361 assert( Chan != NULL );
363 /* Speicher fuer Eintrag anfordern */
364 c2c = malloc( sizeof( C2C ));
367 Log( LOG_EMERG, "Can't allocate memory! [New_C2C]" );
371 strncpy( c2c->mask, Mask, MASK_LEN );
373 c2c->onlyonce = OnlyOnce;
380 Check_List( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan )
384 assert( Cl2Chan != NULL );
385 assert( Client != NULL );
386 assert( Chan != NULL );
393 if( c2c->channel == Chan )
395 /* Ok, richtiger Channel. Passt die Maske? */
396 if( Match( c2c->mask, Client_Mask( Client )))
401 /* Eintrag loeschen */
402 Log( LOG_DEBUG, "Deleted \"%s\" from %s list for \"%s\".", c2c->mask, *Cl2Chan == My_Invites ? "invite" : "ban", Channel_Name( Chan ));
403 if( last ) last->next = c2c->next;
404 else *Cl2Chan = c2c->next;