X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Flists.c;h=f6e710c687927f16a49bbfc1c9789c6a3cfd1a08;hb=0f3e84f4154676dc05a09bd0b1ad9d3d43574d48;hp=ec0ed701b426118eba48eab04d0f4dd6dd9a20b3;hpb=592565aef58544813d9a8acda683398e1e566195;p=ngircd-alex.git diff --git a/src/ngircd/lists.c b/src/ngircd/lists.c index ec0ed701..f6e710c6 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.11 2002/12/26 16:25:43 alex Exp $"; + #include "imp.h" #include @@ -54,6 +53,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 +101,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 +188,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 +316,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 +331,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 +349,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 +377,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 +424,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- */