X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Flists.c;h=cc0538e910707a330c7d1864bfe5b96a5d4970d4;hb=57c7e2362284c8c9937f32944ec985b53b1b07d6;hp=ec0ed701b426118eba48eab04d0f4dd6dd9a20b3;hpb=592565aef58544813d9a8acda683398e1e566195;p=ngircd-alex.git diff --git a/src/ngircd/lists.c b/src/ngircd/lists.c index ec0ed701..cc0538e9 100644 --- a/src/ngircd/lists.c +++ b/src/ngircd/lists.c @@ -2,21 +2,20 @@ * 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: lists.c,v 1.7 2002/09/08 00:55:45 alex Exp $ - * - * lists.c: Verwaltung der "IRC-Listen": Ban, Invite, ... + * Management of IRC lists: ban, invite, ... */ #include "portab.h" +static char UNUSED id[] = "$Id: lists.c,v 1.12 2004/01/17 03:17:49 alex Exp $"; + #include "imp.h" #include @@ -31,6 +30,7 @@ #include #include +#include #include "exp.h" #include "lists.h" @@ -54,6 +54,7 @@ LOCAL C2C *My_Invites, *My_Bans; LOCAL C2C *New_C2C PARAMS(( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce )); LOCAL BOOLEAN Check_List PARAMS(( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan )); +LOCAL BOOLEAN Already_Registered PARAMS(( C2C *Cl2Chan, CHAR *Mask, CHANNEL *Chan )); @@ -101,13 +102,20 @@ Lists_CheckInvited( CLIENT *Client, CHANNEL *Chan ) GLOBAL BOOLEAN -Lists_AddInvited( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce ) +Lists_AddInvited( CLIENT *From, CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce ) { C2C *c2c; assert( Mask != NULL ); assert( Chan != NULL ); + if( Already_Registered( My_Invites, Mask, Chan )) + { + /* Eintrag ist bereits vorhanden */ + IRC_WriteStrClient( From, RPL_INVITELIST_MSG, Client_ID( From ), Channel_Name( Chan ), Mask ); + return FALSE; + } + c2c = New_C2C( Mask, Chan, OnlyOnce ); if( ! c2c ) { @@ -181,13 +189,20 @@ Lists_CheckBanned( CLIENT *Client, CHANNEL *Chan ) GLOBAL BOOLEAN -Lists_AddBanned( CHAR *Mask, CHANNEL *Chan ) +Lists_AddBanned( CLIENT *From, CHAR *Mask, CHANNEL *Chan ) { C2C *c2c; assert( Mask != NULL ); assert( Chan != NULL ); + if( Already_Registered( My_Bans, Mask, Chan )) + { + /* Eintrag ist bereits vorhanden */ + IRC_WriteStrClient( From, RPL_BANLIST_MSG, Client_ID( From ), Channel_Name( Chan ), Mask ); + return FALSE; + } + c2c = New_C2C( Mask, Chan, FALSE ); if( ! c2c ) { @@ -302,13 +317,13 @@ GLOBAL CHAR * Lists_MakeMask( CHAR *Pattern ) { /* Hier wird aus einem "beliebigen" Pattern eine gueltige IRC-Mask erzeugt. - * Diese ist aber nur bis zum naechsten Aufruf von Lists_MakeMask() gueltig, - * da ein einziger globaler Puffer verwendet wird. ->Umkopieren!*/ + * Diese ist aber nur bis zum naechsten Aufruf von Lists_MakeMask() gueltig, + * da ein einziger globaler Puffer verwendet wird. ->Umkopieren!*/ STATIC CHAR TheMask[MASK_LEN]; CHAR *excl, *at; - assert( Pattern ); + assert( Pattern != NULL ); excl = strchr( Pattern, '!' ); at = strchr( Pattern, '@' ); @@ -317,19 +332,17 @@ Lists_MakeMask( CHAR *Pattern ) if(( ! at ) && ( ! excl )) { - /* weder ! noch @ĂŠvorhanden: als Nick annehmen */ - strncpy( TheMask, Pattern, MASK_LEN - 5 ); - TheMask[MASK_LEN - 5] = '\0'; - strcat( TheMask, "!*@*" ); + /* weder ! noch @ vorhanden: als Nick annehmen */ + strlcpy( TheMask, Pattern, sizeof( TheMask ) - 5 ); + strlcat( TheMask, "!*@*", sizeof( TheMask )); return TheMask; } if(( ! at ) && ( excl )) { /* Domain fehlt */ - strncpy( TheMask, Pattern, MASK_LEN - 3 ); - TheMask[MASK_LEN - 3] = '\0'; - strcat( TheMask, "@*" ); + strlcpy( TheMask, Pattern, sizeof( TheMask ) - 3 ); + strlcat( TheMask, "@*", sizeof( TheMask )); return TheMask; } @@ -337,17 +350,14 @@ Lists_MakeMask( CHAR *Pattern ) { /* User fehlt */ *at = '\0'; at++; - strncpy( TheMask, Pattern, MASK_LEN - 4 ); - TheMask[MASK_LEN - 4] = '\0'; - strcat( TheMask, "!*@" ); - strncat( TheMask, at, strlen( TheMask ) - MASK_LEN - 1 ); - TheMask[MASK_LEN - 1] = '\0'; + strlcpy( TheMask, Pattern, sizeof( TheMask ) - strlen( at ) - 4 ); + strlcat( TheMask, "!*@", sizeof( TheMask )); + strlcat( TheMask, at, sizeof( TheMask )); return TheMask; } /* alle Teile vorhanden */ - strncpy( TheMask, Pattern, MASK_LEN - 1 ); - TheMask[MASK_LEN - 1] = '\0'; + strlcpy( TheMask, Pattern, sizeof( TheMask )); return TheMask; } /* Lists_MakeMask */ @@ -368,7 +378,7 @@ New_C2C( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce ) return NULL; } - strncpy( c2c->mask, Mask, MASK_LEN ); + strlcpy( c2c->mask, Mask, sizeof( c2c->mask )); c2c->channel = Chan; c2c->onlyonce = OnlyOnce; @@ -415,4 +425,19 @@ Check_List( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan ) } /* Check_List */ +LOCAL BOOLEAN +Already_Registered( C2C *List, CHAR *Mask, CHANNEL *Chan ) +{ + C2C *c2c; + + c2c = List; + while( c2c ) + { + if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 )) return TRUE; + c2c = c2c->next; + } + return FALSE; +} /* Already_Registered */ + + /* -eof- */