/* * ---------------------------------------------------------------- * Night Light IRC Proxy - Listen Functions * ---------------------------------------------------------------- * Copyright (C) 1997-2007 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 (24.11.2007) * */ #define LISTEN_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 1 /* 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 1 /* 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 "listen.h" #include "client.h" /* VARIABLES - JONAS (06.10.2000) */ struct Listen_Struct *Listen_Head = NULL; struct Listen_Struct *Listen_Tail = NULL; unsigned long int G_Listens = 0; extern struct Client_Struct *Client_Head; /* LISTEN_ADD FUNCTION - JONAS (22.07.2001) */ struct Listen_Struct *listen_add(const char *const HostPT, const unsigned long int Port) { struct Listen_Struct *ListenS = NULL; struct Listen_Struct *Listen_NEW = NULL; assert(HostPT != NULL); ListenS = listen_get(HostPT, Port); if (ListenS != NULL) { aerrno = AEEXISTS; return(ListenS); } Listen_NEW = malloc(sizeof(struct Listen_Struct)); if (Listen_NEW == NULL) { aerrno = AEMALLOC; return(NULL); } memset(Listen_NEW, 0, sizeof(struct Listen_Struct)); listen_init(Listen_NEW); Listen_NEW->Host = strdup(HostPT); if (Listen_NEW->Host == NULL) { free(Listen_NEW); aerrno = AEMALLOC; return(NULL); } Listen_NEW->PortH = Port; Listen_NEW->PortN = htons(Port); if (Listen_Head == NULL) { Listen_Head = Listen_NEW; Listen_Tail = Listen_NEW; } else { ListenS = Listen_Tail; ListenS->Next = Listen_NEW; Listen_NEW->Prev = ListenS; Listen_Tail = Listen_NEW; } G_Listens++; aerrno = AESUCCESS; return(Listen_NEW); } /* LISTEN_REM FUNCTION - JONAS (01.08.2001) */ void listen_rem(struct Listen_Struct *ListenS) { struct Client_Struct *ClientS = NULL; assert(ListenS != NULL); if (ListenS->Prev == NULL) { Listen_Head = ListenS->Next; } else { ListenS->Prev->Next = ListenS->Next; } if (ListenS->Next == NULL) { Listen_Tail = ListenS->Prev; } else { ListenS->Next->Prev = ListenS->Prev; } FREE(ListenS->Host); FREE(ListenS->HostIPS); free(ListenS); G_Listens--; for (ClientS = Client_Head ; ClientS != NULL ; ClientS = ClientS->Next) { if (ClientS->ListenS != ListenS) { continue; } ClientS->ListenS = NULL; } } /* LISTEN_INIT FUNCTION - JONAS (01.08.2001) */ void listen_init(struct Listen_Struct *ListenS) { assert(ListenS != NULL); ListenS->Flags = 0; FREE(ListenS->HostIPS); ListenS->PortH = 0; ListenS->PortN = 0; ListenS->FD = FD_NONE; } /* LISTEN_GET - JONAS (06.10.2000) */ struct Listen_Struct *listen_get(const char *const HostPT, const unsigned long int Port) { struct Listen_Struct *ListenS = NULL; assert(HostPT != NULL); for (ListenS = Listen_Head ; ListenS != NULL ; ListenS = ListenS->Next) { if ((strcasecmp(ListenS->Host, HostPT) == FALSE) && (ListenS->PortH == Port)) { aerrno = AESUCCESS; return(ListenS); } } aerrno = AENOMATCH; return(NULL); }