/* * ---------------------------------------------------------------- * Night Light IRC Proxy - Configuration Functions * ---------------------------------------------------------------- * Copyright (C) 2006-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 (25.11.2007) * */ #define CONF_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 0 /* 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 */ #include "includes.h" #include "conf.h" /* VARIABLES - JONAS (15.11.2006) */ struct Conf_Struct ConfS = { 0 }; extern struct PrintFile_Struct PrintFileS[]; /* CONF_READ FUNCTION - JONAS (15.11.2006) */ signed long int conf_read(void) { char File[FILELEN+1] = ""; FILE *FilePT = NULL; unsigned short int Count = 0; conf_init(); if (ConfS.File[0] != '/') { char *PathPT = NULL; PathPT = getenv("HOME"); if (PathPT != NULL) { strncpy(File, PathPT, FILELEN); if (File[strlen(File)] != '/') { strncat(File, "/", (FILELEN - strlen(File))); } strncat(File, ".ircproxy/", (FILELEN - strlen(File))); strncat(File, ConfS.File, (FILELEN - strlen(File))); FilePT = fopen(File, "r"); } if (FilePT == NULL) { strcpy(File, "/usr/share/ircproxy/"); strncat(File, ConfS.File, (FILELEN - strlen(File))); FilePT = fopen(File, "r"); if (FilePT == NULL) { strcpy(File, "/etc"); strncat(File, ConfS.File, (FILELEN - strlen(File))); FilePT = fopen(File, "r"); if (FilePT == NULL) { printf("Unable to locate configuration file, run ircproxyd -c to specify configuration file.\n"); exit(1); } } } ConfS.File = strrealloc(ConfS.File, File); } else { FilePT = fopen(ConfS.File, "r"); if (FilePT == NULL) { printf("Unable to open configuration file %s: [%d] %s\n", ConfS.File, errno, strerror(errno)); exit(1); } } FOREVERLOOP { char Line[LINELEN+1] = ""; char *LinePT = NULL; char *TempPT = NULL; char *EntryPT = NULL; char *DataPT = NULL; unsigned short int Skip = FALSE; memset(&Line, 0, LINELEN+1); TempPT = fgets(Line, LINELEN, FilePT); if (TempPT == NULL) { break; } ++Count; LinePT = Line; while ((TempPT = strchr(LinePT, '\r')) != NULL) { *TempPT = '\0'; } while ((TempPT = strchr(LinePT, '\n')) != NULL) { *TempPT = '\0'; } while ((TempPT = strchr(LinePT, '\t')) != NULL) { *TempPT = ' '; } while ((LinePT[0] == ' ') || (LinePT[0] == '\t')) { ++LinePT; } if ((LinePT[0] == '#') || (LinePT[0] == ';') || (LinePT[0] == '\0')) { continue; } if (strchr(LinePT, '=') == NULL) { /* This isn't a main configuration file entry */ EntryPT = LinePT; StrMovePastToken(LinePT, ' '); if (strcasecmp(EntryPT, "CONNECTION") == FALSE) { Skip = TRUE; continue; } if (EntryPT[0] == '}') { Skip = FALSE; continue; } continue; } if (Skip == TRUE) { continue; } EntryPT = LinePT; StrMovePastToken(LinePT, '='); DataPT = LinePT; if ((DataPT == NULL) || (DataPT[0] == '\0')) { printf("Configuration error in file %s line %d: Expecting more data.\n", File, Count); exit(1); } while ((TempPT = strchr(DataPT, '\"')) != NULL) { if (TempPT == DataPT) { DataPT++; } *TempPT = '\0'; } if ((DataPT == NULL) || (DataPT[0] == '\0')) { printf("Configuration error in file %s line %d: Expecting more data.\n", File, Count); exit(1); } if (strcasecmp(EntryPT, "EUSER") == FALSE) { ConfS.EUser = strrealloc(ConfS.EUser, DataPT); } else if (strcasecmp(EntryPT, "EGROUP") == FALSE) { ConfS.EGroup = strrealloc(ConfS.EGroup, DataPT); } else if (strcasecmp(EntryPT, "CHDIR") == FALSE) { if ((strcasecmp(DataPT, "y") == FALSE) || (strcasecmp(DataPT, "yes") == FALSE)) { ConfS.ChDir = TRUE; } else { ConfS.ChDir = FALSE; } } else if (strcasecmp(EntryPT, "CHDIRPATH") == FALSE) { ConfS.ChDirPath = strrealloc(ConfS.ChDirPath, DataPT); } else if (strcasecmp(EntryPT, "DATAPATH") == FALSE) { ConfS.DataPath = strrealloc(ConfS.DataPath, DataPT); } else if (strcasecmp(EntryPT, "LOGPATH") == FALSE) { ConfS.LogPath = strrealloc(ConfS.LogPath, DataPT); } else if (strcasecmp(EntryPT, "PIDFILE") == FALSE) { ConfS.PIDFile = strrealloc(ConfS.PIDFile, DataPT); } else if (strcasecmp(EntryPT, "MAXCLIENTS") == FALSE) { ConfS.MaxClients = atoi(DataPT); } else if (strcasecmp(EntryPT, "CLIENT_SHOWDENYREASON") == FALSE) { if ((strcasecmp(DataPT, "y") == FALSE) || (strcasecmp(DataPT, "yes") == FALSE) || (strcasecmp(DataPT, "1") == FALSE)) { ConfS.ClientShowDenyReason = TRUE; } else { ConfS.ClientShowDenyReason = FALSE; } } else if (strcasecmp(EntryPT, "CLIENT_MAXSENDQ") == FALSE) { ConfS.ClientMaxSendQ = atoi(DataPT); } else if (strcasecmp(EntryPT, "CLIENT_MAXLINESPERSEC") == FALSE) { TempPT = DataPT; StrMovePastToken(DataPT, ':'); if (DataPT == NULL) { DataPT = "10"; } ConfS.ClientMaxLines = atoi(TempPT); ConfS.ClientLineFloodTTL = atoi(DataPT); } else if (strcasecmp(EntryPT, "ACCESS_CONFFILE") == FALSE) { ConfS.AccessConfFile = strrealloc(ConfS.AccessConfFile, DataPT); } else if (strcasecmp(EntryPT, "LISTEN_CONFFILE") == FALSE) { ConfS.ListenConfFile = strrealloc(ConfS.ListenConfFile, DataPT); } else if (strcasecmp(EntryPT, "USER_CONFFILE") == FALSE) { ConfS.UserConfFile = strrealloc(ConfS.UserConfFile, DataPT); } else if (strcasecmp(EntryPT, "CONN_CONFFILE") == FALSE) { ConfS.ConnConfFile = strrealloc(ConfS.ConnConfFile, DataPT); } else if (strcasecmp(EntryPT, "AUTOOP_CONFFILE") == FALSE) { ConfS.AutoOPConfFile = strrealloc(ConfS.AutoOPConfFile, DataPT); } else if (strcasecmp(EntryPT, "IDENT_CONFFILE") == FALSE) { ConfS.IdentConfFile = strrealloc(ConfS.IdentConfFile, DataPT); } else if (strcasecmp(EntryPT, "MAINLOGFILE") == FALSE) { ConfS.MainLogFile = strrealloc(ConfS.MainLogFile, DataPT); } else if (strcasecmp(EntryPT, "ERRORLOGFILE") == FALSE) { ConfS.ErrorLogFile = strrealloc(ConfS.ErrorLogFile, DataPT); } else if (strcasecmp(EntryPT, "DEBUGLOGFILE") == FALSE) { ConfS.DebugLogFile = strrealloc(ConfS.DebugLogFile, DataPT); } else if (strcasecmp(EntryPT, "SSLSUPPORT") == FALSE) { if ((strcasecmp(DataPT, "y") == FALSE) || (strcasecmp(DataPT, "yes") == FALSE) || (strcasecmp(DataPT, "1") == FALSE)) { ConfS.SSLSupport = TRUE; #if !SSL_SUPPORT printf("Configuration error in file %s line %d: %s is not compiled with SSL support.\n", File, Count, PACKAGE); exit(1); #endif } else { ConfS.SSLSupport = FALSE; } } else if (strcasecmp(EntryPT, "SSLSERVERCERTIFICATE") == FALSE) { ConfS.SSLServerCertificate = strrealloc(ConfS. SSLServerCertificate, DataPT); } else if (strcasecmp(EntryPT, "SSLSERVERPRIVATEKEY") == FALSE) { ConfS.SSLServerPrivateKey = strrealloc(ConfS.SSLServerPrivateKey, DataPT); } else if (strcasecmp(EntryPT, "SSLCLIENTCERTIFICATE") == FALSE) { ConfS.SSLClientCertificate = strrealloc(ConfS. SSLClientCertificate, DataPT); } else if (strcasecmp(EntryPT, "SSLCLIENTPRIVATEKEY") == FALSE) { ConfS.SSLClientPrivateKey = strrealloc(ConfS.SSLClientPrivateKey, DataPT); } else if (strcasecmp(EntryPT, "SSLSERVERCIPHERS") == FALSE) { ConfS.SSLServerCiphers = strrealloc(ConfS.SSLServerCiphers, DataPT); } else if (strcasecmp(EntryPT, "SSLCLIENTCIPHERS") == FALSE) { ConfS.SSLClientCiphers = strrealloc(ConfS.SSLClientCiphers, DataPT); } else if (strcasecmp(EntryPT, "CRYPTPASS") == FALSE) { if ((strcasecmp(DataPT, "y") == FALSE) || (strcasecmp(DataPT, "yes") == FALSE) || (strcasecmp(DataPT, "1") == FALSE)) { ConfS.CryptPass = TRUE; } else { ConfS.CryptPass = FALSE; } } else if (strcasecmp(EntryPT, "UNIXPASSWD") == FALSE) { if ((strcasecmp(DataPT, "y") == FALSE) || (strcasecmp(DataPT, "yes") == FALSE) || (strcasecmp(DataPT, "1") == FALSE)) { ConfS.UnixPasswd = TRUE; } else { ConfS.UnixPasswd = FALSE; } } else { continue; } } fclose(FilePT); PrintFileS[1].Name = strrealloc(PrintFileS[1].Name, ConfS.MainLogFile); PrintFileS[2].Name = strrealloc(PrintFileS[2].Name, ConfS.ErrorLogFile); #if DEBUG PrintFileS[3].Name = strrealloc(PrintFileS[3].Name, ConfS.DebugLogFile); #endif return(SUCCESS); } /* CONF_INIT FUNCTION - JONAS (15.11.2006) */ void conf_init(void) { /* ConfS.File is set in main.c */ if (ConfS.File == NULL) ConfS.File = strdup(CONFFILE); ConfS.EUser = strrealloc(ConfS.EUser, EUSER); ConfS.EGroup = strrealloc(ConfS.EGroup, EGROUP); ConfS.ChDir = FALSE; ConfS.ChDirPath = strrealloc(ConfS.ChDirPath, CHDIRPATH); ConfS.DataPath = strrealloc(ConfS.DataPath, DATAPATH); ConfS.LogPath = strrealloc(ConfS.LogPath, LOGPATH); ConfS.PIDFile = strrealloc(ConfS.PIDFile, PIDFILE); ConfS.MaxClients = MAXCLIENTS; ConfS.ClientShowDenyReason = CLIENT_SHOWDENYREASON; ConfS.ClientMaxSendQ = CLIENT_MAXSENDQ; ConfS.ClientMaxLines = CLIENT_MAXLINES; ConfS.ClientLineFloodTTL = CLIENT_LINEFLOODTTL; ConfS.AccessConfFile = strrealloc(ConfS.AccessConfFile, ACCESS_CONFFILE); ConfS.ListenConfFile = strrealloc(ConfS.ListenConfFile, LISTEN_CONFFILE); ConfS.UserConfFile = strrealloc(ConfS.UserConfFile, USER_CONFFILE); ConfS.ConnConfFile = strrealloc(ConfS.ConnConfFile, CONN_CONFFILE); ConfS.AutoOPConfFile = strrealloc(ConfS.AutoOPConfFile, AUTOOP_CONFFILE); ConfS.IdentConfFile = strrealloc(ConfS.IdentConfFile, IDENT_CONFFILE); ConfS.MainLogFile = strrealloc(ConfS.MainLogFile, MAINLOGFILE); ConfS.ErrorLogFile = strrealloc(ConfS.ErrorLogFile, ERRORLOGFILE); ConfS.DebugLogFile = strrealloc(ConfS.DebugLogFile, DEBUGLOGFILE); ConfS.CryptPass = CRYPTPASS; ConfS.UnixPasswd = UNIXPASSWD; ConfS.SSLSupport = SSLSUPPORT; ConfS.SSLServerCertificate = strrealloc(ConfS.SSLServerCertificate, SSLSERVERCERTIFICATE); ConfS.SSLServerPrivateKey = strrealloc(ConfS.SSLServerPrivateKey, SSLSERVERPRIVATEKEY); ConfS.SSLClientCertificate = strrealloc(ConfS.SSLClientCertificate, SSLCLIENTCERTIFICATE); ConfS.SSLClientPrivateKey = strrealloc(ConfS.SSLClientPrivateKey, SSLCLIENTPRIVATEKEY); ConfS.SSLServerCiphers = strrealloc(ConfS.SSLServerCiphers, SSLSERVERCIPHERS); ConfS.SSLClientCiphers = strrealloc(ConfS.SSLClientCiphers, SSLCLIENTCIPHERS); } /* CONF_DESTROY FUNCTION - JONAS (15.11.2006) */ void conf_destroy(void) { FREE(ConfS.File); FREE(ConfS.EUser); FREE(ConfS.EGroup); FREE(ConfS.ChDirPath); FREE(ConfS.DataPath); FREE(ConfS.LogPath); FREE(ConfS.PIDFile); FREE(ConfS.AccessConfFile); FREE(ConfS.ListenConfFile); FREE(ConfS.UserConfFile); FREE(ConfS.ConnConfFile); FREE(ConfS.AutoOPConfFile); FREE(ConfS.IdentConfFile); FREE(ConfS.MainLogFile); FREE(ConfS.ErrorLogFile); FREE(ConfS.DebugLogFile); FREE(ConfS.SSLServerCertificate); FREE(ConfS.SSLServerPrivateKey); FREE(ConfS.SSLClientCertificate); FREE(ConfS.SSLClientPrivateKey); FREE(ConfS.SSLServerCiphers); FREE(ConfS.SSLClientCiphers); }