/* * ---------------------------------------------------------------- * Night Light IRC Proxy - Connection Ignore * ---------------------------------------------------------------- * Copyright (C) 1997-2003 Jonas Kvinge * All rights reserved. * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * Last modified by: * Jonas Kvinge (07.07.2003) * */ #define CONN_IGNORE_C #define NEED_SYS_TYPES_H 1 /* Extra types */ #define NEED_SYS_PARAM_H 1 /* Some systems need this */ #define NEED_LIMITS_H 0 /* Kernel limits */ #define NEED_STDARG_H 1 /* va_list, etc */ #define NEED_ERRNO_H 1 /* errno */ #define NEED_CTYPE_H 1 /* isdigit(), etc */ #define NEED_NETINET_IN_H 1 /* in_addr, sockaddr_in, etc */ #define NEED_ARPA_INET_H 0 /* inet_ntoa(), inet_aton(), etc */ #define NEED_STDIO_H 1 /* Standard C UNIX functions */ #define NEED_STDLIB_H 1 /* malloc(), exit(), atoi(), etc */ #define NEED_TIME_H 1 /* time(), etc */ #define NEED_SYSCTL_H 0 /* sysctl(), etc */ #define NEED_SYS_STAT_H 0 /* chmod(), mkdir(), etc */ #define NEED_SYS_UIO_H 0 /* iovec, etc */ #define NEED_FCNTL_H 1 /* open(), creat(), fcntl(), etc */ #define NEED_SYS_IOCTL_H 0 /* ioctl(), etc */ #define NEED_SYS_FILIO_H 0 /* Solaris need this for ioctl(), etc */ #define NEED_UNISTD_H 1 /* Unix standard functions */ #define NEED_STRING_H 1 /* C string functions */ #define NEED_SIGNAL_H 0 /* Signal functions */ #define NEED_SYS_SOCKET_H 0 /* Socket functions */ #define NEED_NETDB_H 0 /* Network database functions */ #define NEED_ARPA_NAMESER_H 0 /* Nameserver definitions */ #define NEED_GETUSERPW_HEADERS 0 /* Functions to retrive system passwords */ #define NEED_ARES 0 /* Functions needed for ares */ #define NEED_SSL 1 /* Needed for SSL support */ #include "includes.h" #include "irc.h" #include "conn.h" #include "conn_ignore.h" /* CONN_ADDIGNORE FUNCTION - JONAS (22.07.2001) */ struct Ignore_Struct *conn_addignore(struct Conn_Struct *ConnS, const char *const NUHPT) { struct Ignore_Struct *IgnoreS = NULL; struct Ignore_Struct *Ignore_NEW = NULL; assert(ConnS != NULL); assert(NUHPT != NULL); IgnoreS = conn_getignore(ConnS, NUHPT); if (IgnoreS != NULL) { aerrno = AEEXISTS; return(IgnoreS); } Ignore_NEW = malloc(sizeof(struct Ignore_Struct)); if (Ignore_NEW == NULL) { aerrno = AEMALLOC; return(NULL); } memset(Ignore_NEW, 0, sizeof(struct Ignore_Struct)); Ignore_NEW->NUH = strdup(NUHPT); if (Ignore_NEW->NUH == NULL) { free(Ignore_NEW); aerrno = AEMALLOC; return(NULL); } Ignore_NEW->ExpireTime = NOW + CONN_IGNORETTL; if (ConnS->Ignore_Head == NULL) { ConnS->Ignore_Head = Ignore_NEW; ConnS->Ignore_Tail = Ignore_NEW; } else { IgnoreS = ConnS->Ignore_Tail; IgnoreS->Next = Ignore_NEW; Ignore_NEW->Prev = IgnoreS; ConnS->Ignore_Tail = Ignore_NEW; } ConnS->NumIgnores++; aerrno = AESUCCESS; return(Ignore_NEW); } /* CONN_REMIGNORE FUNCTION - JONAS (01.08.2001) */ void conn_remignore(struct Conn_Struct *ConnS, struct Ignore_Struct *IgnoreS) { assert(ConnS != NULL); assert(IgnoreS != NULL); if (IgnoreS->Prev == NULL) { ConnS->Ignore_Head = IgnoreS->Next; } else { IgnoreS->Prev->Next = IgnoreS->Next; } if (IgnoreS->Next == NULL) { ConnS->Ignore_Tail = IgnoreS->Prev; } else { IgnoreS->Next->Prev = IgnoreS->Prev; } free(IgnoreS->NUH); free(IgnoreS); ConnS->NumIgnores--; } /* CONN_GETIGNORE - JONAS (06.10.2000) */ struct Ignore_Struct *conn_getignore(struct Conn_Struct *ConnS, const char *const NUHPT) { struct Ignore_Struct *IgnoreS = NULL; assert(ConnS != NULL); assert(NUHPT != NULL); for (IgnoreS = ConnS->Ignore_Head ; IgnoreS != NULL ; IgnoreS = IgnoreS->Next) { if (strwm(IgnoreS->NUH, NUHPT) == TRUE) { aerrno = AESUCCESS; return(IgnoreS); } } aerrno = AENOMATCH; return(NULL); } /* CONN_IGNOREEXPIRE - JONAS (06.10.2000) */ void conn_ignoreexpire(struct Conn_Struct *ConnS) { struct Ignore_Struct *IgnoreS = NULL; struct Ignore_Struct *Ignore_DEL = NULL; assert(ConnS != NULL); ConnS->IgnoreExpireTime = (NOW + CONN_IGNOREEXPIRETIME); for (IgnoreS = ConnS->Ignore_Head ; IgnoreS != NULL ;) { if (IgnoreS->ExpireTime < NOW) { Ignore_DEL = IgnoreS; IgnoreS = IgnoreS->Next; conn_remignore(ConnS, Ignore_DEL); continue; } IgnoreS = IgnoreS->Next; } } /* CONN_DESTROYIGNORES - JONAS (06.10.2000) */ void conn_destroyignores(struct Conn_Struct *ConnS) { assert(ConnS != NULL); while (ConnS->Ignore_Head != NULL) { conn_remignore(ConnS, ConnS->Ignore_Head); } assert(ConnS->NumIgnores == 0); }