summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam <Adam@drink-coca-cola.info>2010-05-08 13:46:13 -0400
committerAdam <Adam@anope.org>2010-06-18 21:00:02 -0400
commite78a055c2b5c9fe3a4e4ef32058f161eceb3df1c (patch)
treecf3b3e94a5408f54cfd79ffdb4ae06f19d6fb142
parentaf805e5b45f75dec7f4ce16ffc322c8880f9859c (diff)
Removed old config.h and moved configreader.h to config.h
-rw-r--r--include/config.h920
-rw-r--r--include/configreader.h903
-rw-r--r--include/services.h5
-rw-r--r--include/sockets.h2
-rw-r--r--src/config.c2
-rw-r--r--src/main.c2
6 files changed, 899 insertions, 935 deletions
diff --git a/include/config.h b/include/config.h
index 825cc9af4..c6dbbefb8 100644
--- a/include/config.h
+++ b/include/config.h
@@ -1,39 +1,903 @@
-/* Services configuration.
- *
- * (C) 2003-2010 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for furhter details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- *
- *
+#ifndef _CONFIGREADER_H_
+#define _CONFIGREADER_H_
+
+#include <string>
+#include <fstream>
+#include <sstream>
+#include <vector>
+#include <map>
+#include <deque>
+
+/** A configuration key and value pair
+ */
+typedef std::pair<std::string, std::string> KeyVal;
+
+/** A list of related configuration keys and values
+ */
+typedef std::vector<KeyVal> KeyValList;
+
+/** An entire config file, built up of KeyValLists
+ */
+typedef std::multimap<std::string, KeyValList> ConfigDataHash;
+
+// Required forward definitions
+class ServerConfig;
+
+/** Types of data in the core config
+ */
+enum ConfigDataType {
+ DT_NOTHING, // No data
+ DT_INTEGER, // Integer
+ DT_UINTEGER, // Unsigned Integer
+ DT_LUINTEGER, // Long Unsigned Integer
+ DT_CHARPTR, // Char pointer
+ DT_STRING, // std::string
+ DT_BOOLEAN, // Boolean
+ DT_HOSTNAME, // Hostname syntax
+ DT_NOSPACES, // No spaces
+ DT_IPADDRESS, // IP address (v4, v6)
+ DT_TIME, // Time value
+ DT_NORELOAD = 32, // Item can't be reloaded after startup
+ DT_ALLOW_WILD = 64, // Allow wildcards/CIDR in DT_IPADDRESS
+ DT_ALLOW_NEWLINE = 128 // New line characters allowed in DT_CHARPTR
+};
+
+/** Holds a config value, either string, integer or boolean.
+ * Callback functions receive one or more of these, either on
+ * their own as a reference, or in a reference to a deque of them.
+ * The callback function can then alter the values of the ValueItem
+ * classes to validate the settings.
+ */
+class ValueItem
+{
+ /** Actual data */
+ std::string v;
+ public:
+ /** Initialize with an int */
+ ValueItem(int);
+ /** Initialize with a bool */
+ ValueItem(bool);
+ /** Initialize with a char pointer */
+ ValueItem(const char *);
+ /** Initialize with an std::string */
+ ValueItem(const std::string &);
+ /** Initialize with a long */
+ ValueItem(long);
+ /** Change value to a char pointer */
+ //void Set(char *);
+ /** Change value to a const char pointer */
+ void Set(const char *);
+ /** Change value to an std::string */
+ void Set(const std::string &);
+ /** Change value to an int */
+ void Set(int);
+ /** Get value as an int */
+ int GetInteger();
+ /** Get value as a string */
+ const char *GetString() const;
+ /** Get value as a string */
+ inline const std::string &GetValue() const { return v; }
+ /** Get value as a bool */
+ bool GetBool();
+};
+
+/** The base class of the container 'ValueContainer'
+ * used internally by the core to hold core values.
+ */
+class ValueContainerBase
+{
+ public:
+ /** Constructor */
+ ValueContainerBase() { }
+ /** Destructor */
+ virtual ~ValueContainerBase() { }
+};
+
+/** ValueContainer is used to contain pointers to different
+ * core values such as the server name, maximum number of
+ * clients etc.
+ * It is specialized to hold a data type, then pointed at
+ * a value in the ServerConfig class. When the value has been
+ * read and validated, the Set method is called to write the
+ * value safely in a type-safe manner.
+ */
+template<typename T> class ValueContainer : public ValueContainerBase
+{
+ /** Contained item */
+ T val;
+ public:
+ /** Initialize with nothing */
+ ValueContainer() : ValueContainerBase(), val(NULL) { }
+ /** Initialize with a value of type T */
+ ValueContainer(T Val) : ValueContainerBase(), val(Val) { }
+ /** Initialize with a copy */
+ ValueContainer(const ValueContainer &Val) : ValueContainerBase(), val(Val.val) { }
+ ValueContainer &operator=(const ValueContainer &Val)
+ {
+ val = Val.val;
+ return *this;
+ }
+ /** Change value to type T of size s */
+ void Set(const T newval, size_t s)
+ {
+ memcpy(val, newval, s);
+ }
+};
+
+/** This a specific version of ValueContainer to handle character arrays specially
+ */
+template<> class ValueContainer<char **> : public ValueContainerBase
+{
+ /** Contained item */
+ char **val;
+ public:
+ /** Initialize with nothing */
+ ValueContainer() : ValueContainerBase(), val(NULL) { }
+ /** Initialize with a value of type T */
+ ValueContainer(char **Val) : ValueContainerBase(), val(Val) { }
+ /** Initialize with a copy */
+ ValueContainer(const ValueContainer &Val) : ValueContainerBase(), val(Val.val) { }
+ ValueContainer &operator=(const ValueContainer &Val)
+ {
+ val = Val.val;
+ return *this;
+ }
+ /** Change value to type T of size s */
+ void Set(const char *newval, size_t s)
+ {
+ if (*val) delete [] *val;
+ if (!*newval) {
+ *val = NULL;
+ return;
+ }
+ *val = new char[s];
+ strlcpy(*val, newval, s);
+ }
+};
+
+/** This a specific version of ValueContainer to handle std::string specially
+ */
+template<> class ValueContainer<std::string *> : public ValueContainerBase
+{
+ /** Contained item */
+ std::string *val;
+ public:
+ /** Initialize with nothing */
+ ValueContainer() : ValueContainerBase(), val(NULL) { }
+ /** Initialize with an std::string */
+ ValueContainer(std::string *Val) : ValueContainerBase(), val(Val) { }
+ /** Initialize with a copy */
+ ValueContainer(const ValueContainer &Val) : ValueContainerBase(), val(Val.val) { }
+ ValueContainer &operator=(const ValueContainer &Val)
+ {
+ val = Val.val;
+ return *this;
+ }
+ /** Change value to given std::string */
+ void Set(const std::string &newval)
+ {
+ *val = newval;
+ }
+ /** Change value to given char pointer */
+ void Set(const char *newval)
+ {
+ *val = newval;
+ }
+};
+
+/** A specialization of ValueContainer to hold a pointer to a bool
+ */
+typedef ValueContainer<bool *> ValueContainerBool;
+
+/** A specialization of ValueContainer to hold a pointer to
+ * an unsigned int
+ */
+typedef ValueContainer<unsigned *> ValueContainerUInt;
+
+/** A specialization of ValueContainer to hold a pointer to
+ * a long unsigned int
+ */
+typedef ValueContainer<long unsigned *> ValueContainerLUInt;
+
+/** A specialization of ValueContainer to hold a pointer to
+ * a char array.
+ */
+typedef ValueContainer<char **> ValueContainerChar;
+
+/** A specialization of ValueContainer to hold a pointer to
+ * an int
+ */
+typedef ValueContainer<int *> ValueContainerInt;
+
+/** A specialization of ValueContainer to hold a pointer to
+ * a time_t
+ */
+typedef ValueContainer<time_t *> ValueContainerTime;
+
+/** A specialization of ValueContainer to hold a pointer to
+ * an std::string
+ */
+typedef ValueContainer<std::string *> ValueContainerString;
+
+/** A set of ValueItems used by multi-value validator functions
+ */
+typedef std::deque<ValueItem> ValueList;
+
+/** A callback for validating a single value
+ */
+typedef bool (*Validator)(ServerConfig *, const char *, const char *, ValueItem &);
+/** A callback for validating multiple value entries
+ */
+typedef bool (*MultiValidator)(ServerConfig *, const char *, const char **, ValueList &, int *, bool);
+/** A callback indicating the end of a group of entries
+ */
+typedef bool (*MultiNotify)(ServerConfig *, const char *, bool);
+
+/** Holds a core configuration item and its callbacks
+ */
+struct InitialConfig
+{
+ /** Tag name */
+ const char *tag;
+ /** Value name */
+ const char *value;
+ /** Default, if not defined */
+ const char *default_value;
+ /** Value containers */
+ ValueContainerBase *val;
+ /** Data types */
+ int datatype;
+ /** Validation function */
+ Validator validation_function;
+};
+
+/** Holds a core configuration item and its callbacks
+ * where there may be more than one item
+ */
+struct MultiConfig
+{
+ /** Tag name */
+ const char *tag;
+ /** One or more items within tag */
+ const char *items[17];
+ /** One or more defaults for items within tags */
+ const char *items_default[17];
+ /** One or more data types */
+ int datatype[17];
+ /** Initialization function */
+ MultiNotify init_function;
+ /** Validation function */
+ MultiValidator validation_function;
+ /** Completion function */
+ MultiNotify finish_function;
+};
+
+/** This class holds the bulk of the runtime configuration for the ircd.
+ * It allows for reading new config values, accessing configuration files,
+ * and storage of the configuration data needed to run the ircd, such as
+ * the servername, connect classes, /ADMIN data, MOTDs and filenames etc.
*/
+class ServerConfig
+{
+ private:
+ /** This variable holds the names of all
+ * files included from the main one. This
+ * is used to make sure that no files are
+ * recursively included.
+ */
+ std::vector<std::string> include_stack;
+ /** Check that there is only one of each configuration item
+ */
+ bool CheckOnce(const char *);
+ public:
+ std::ostringstream errstr;
+ ConfigDataHash newconfig;
+ /** This holds all the information in the config file,
+ * it's indexed by tag name to a vector of key/values.
+ */
+ ConfigDataHash config_data;
+ /** Construct a new ServerConfig
+ */
+ ServerConfig();
+ /** Clears the include stack in preperation for a Read() call.
+ */
+ void ClearStack();
+ /** Read the entire configuration into memory
+ * and initialize this class. All other methods
+ * should be used only by the core.
+ */
+ int Read(bool);
+ /** Report a configuration error given in errormessage.
+ * @param bail If this is set to true, the error is sent to the console, and the program exits
+ * @param connection If this is set to a non-null value, and bail is false, the errors are spooled to
+ * this connection as SNOTICEs.
+ * If the parameter is NULL, the messages are spooled to all connections via WriteOpers as SNOTICEs.
+ */
+ void ReportConfigError(const std::string &, bool);
+ /** Load 'filename' into 'target', with the new config parser everything is parsed into
+ * tag/key/value at load-time rather than at read-value time.
+ */
+ bool LoadConf(ConfigDataHash &, const char *, std::ostringstream &);
+ /** Load 'filename' into 'target', with the new config parser everything is parsed into
+ * tag/key/value at load-time rather than at read-value time.
+ */
+ bool LoadConf(ConfigDataHash &, const std::string &, std::ostringstream &);
+ // Both these return true if the value existed or false otherwise
+ /** Writes 'length' chars into 'result' as a string
+ */
+ bool ConfValue(ConfigDataHash &, const char *, const char *, int, char *, int, bool = false);
+ /** Writes 'length' chars into 'result' as a string
+ */
+ bool ConfValue(ConfigDataHash &, const char *, const char *, const char *, int, char *, int, bool = false);
+ /** Writes 'length' chars into 'result' as a string
+ */
+ bool ConfValue(ConfigDataHash &, const std::string &, const std::string &, int, std::string &, bool = false);
+ /** Writes 'length' chars into 'result' as a string
+ */
+ bool ConfValue(ConfigDataHash &, const std::string &, const std::string &, const std::string &, int, std::string &, bool = false);
+ /** Tries to convert the value to an integer and write it to 'result'
+ */
+ bool ConfValueInteger(ConfigDataHash &, const char *, const char *, int, int &);
+ /** Tries to convert the value to an integer and write it to 'result'
+ */
+ bool ConfValueInteger(ConfigDataHash &, const char *, const char *, const char *, int, int &);
+ /** Tries to convert the value to an integer and write it to 'result'
+ */
+ bool ConfValueInteger(ConfigDataHash &, const std::string &, const std::string &, int, int &);
+ /** Tries to convert the value to an integer and write it to 'result'
+ */
+ bool ConfValueInteger(ConfigDataHash &, const std::string &, const std::string &, const std::string &, int, int &);
+ /** Returns true if the value exists and has a true value, false otherwise
+ */
+ bool ConfValueBool(ConfigDataHash &, const char *, const char *, int);
+ /** Returns true if the value exists and has a true value, false otherwise
+ */
+ bool ConfValueBool(ConfigDataHash &, const char *, const char *, const char *, int);
+ /** Returns true if the value exists and has a true value, false otherwise
+ */
+ bool ConfValueBool(ConfigDataHash &, const std::string &, const std::string &, int);
+ /** Returns true if the value exists and has a true value, false otherwise
+ */
+ bool ConfValueBool(ConfigDataHash &, const std::string &, const std::string &, const std::string &, int);
+ /** Returns the number of occurences of tag in the config file
+ */
+ int ConfValueEnum(ConfigDataHash &, const char *);
+ /** Returns the number of occurences of tag in the config file
+ */
+ int ConfValueEnum(ConfigDataHash &, const std::string &);
+ /** Returns the numbers of vars inside the index'th 'tag in the config file
+ */
+ int ConfVarEnum(ConfigDataHash &, const char *, int);
+ /** Returns the numbers of vars inside the index'th 'tag in the config file
+ */
+ int ConfVarEnum(ConfigDataHash &, const std::string &, int);
+ void ValidateHostname(const char *, const std::string &, const std::string &);
+ void ValidateIP(const char *p, const std::string &, const std::string &, bool);
+ void ValidateNoSpaces(const char *, const std::string &, const std::string &);
+
+
+
+ /** Below here is a list of variables which contain the config files values
+ */
+ /* IRCd module in use */
+ char *IRCDModule;
-#ifndef CONFIG_H
-#define CONFIG_H
+ /* Host to connect to **/
+ char *LocalHost;
+ /* List of uplink servers to try and connect to */
+ std::list<Uplink *> Uplinks;
-/* Note that most of the options which used to be here have been moved to
- * services.conf. */
+ /* Our server name */
+ char *ServerName;
+ /* Our servers description */
+ char *ServerDesc;
+ /* The username/ident of services clients */
+ char *ServiceUser;
+ /* The hostname if services clients */
+ char *ServiceHost;
-/*************************************************************************/
+ /* Help channel, ops here get usermode +h **/
+ char *HelpChannel;
+ /* Log channel */
+ char *LogChannel;
+ /* Name of the network were on */
+ char *NetworkName;
+ /* The max legnth of nicks */
+ unsigned NickLen;
+ /* Max length of idents */
+ unsigned UserLen;
+ /* Max lenght of hostnames */
+ unsigned HostLen;
-/******* General configuration *******/
+ /* Max length of passwords */
+ unsigned PassLen;
-/* Name of log file (in Services directory) */
-#define LOG_FILENAME "services.log"
+ /* NickServ Name */
+ char *s_NickServ;
+ /* ChanServ Name */
+ char *s_ChanServ;
+ /* MemoServ Name */
+ char *s_MemoServ;
+ /* BotServ Name */
+ char *s_BotServ;
+ /* OperServ name */
+ char *s_OperServ;
+ /* Global name */
+ char *s_GlobalNoticer;
+ /* NickServs realname */
+ char *desc_NickServ;
+ /* ChanServ realname */
+ char *desc_ChanServ;
+ /* MemoServ relname */
+ char *desc_MemoServ;
+ /* BotServ realname */
+ char *desc_BotServ;
+ /* OperServ realname */
+ char *desc_OperServ;
+ /* Global realname */
+ char *desc_GlobalNoticer;
-/******************* END OF USER-CONFIGURABLE SECTION ********************/
+ /* HostServ Name */
+ char *s_HostServ;
+ /* HostServ realname */
+ char *desc_HostServ;
-/* Size of input buffer (note: this is different from BUFSIZ)
- * This must be big enough to hold at least one full IRC message, or messy
- * things will happen. */
-#define BUFSIZE 1024
+ /* Filename for the PID file */
+ char *PIDFilename;
+ /* MOTD filename */
+ char *MOTDFilename;
-/* Maximum amount of data from/to the network to buffer (bytes). */
-#define NET_BUFSIZE 65536
+ /* True if its ok to not be able to save backs */
+ bool NoBackupOkay;
+ /* Do password checking when new people register */
+ bool StrictPasswords;
+ /* How many times you're allowed to give a bad password before being killed */
+ unsigned BadPassLimit;
+ /* How long before bad passwords are forgotten */
+ time_t BadPassTimeout;
+ /* Delay between automatic database updates */
+ time_t UpdateTimeout;
+ /* Delay between checks for expired nicks and channels */
+ time_t ExpireTimeout;
+ /* How long to wait for something from the uplink, this is passed to select() */
+ time_t ReadTimeout;
+ /* How often to send program errors */
+ time_t WarningTimeout;
+ /* How long to process things such as timers to see if there is anything to calll */
+ time_t TimeoutCheck;
+ /* Num of days logfiles are kept */
+ int KeepLogs;
+ /* Number of days backups are kept */
+ int KeepBackups;
+ /* Forbidding requires a reason */
+ bool ForceForbidReason;
+ /* Services should use privmsgs instead of notices */
+ bool UsePrivmsg;
+ /* Services only respond to full PRIVMSG client@services.server.name messages */
+ bool UseStrictPrivMsg;
+ /* Dump a core file if we crash */
+ bool DumpCore;
+ /* Log users connecting/existing/changing nicks */
+ bool LogUsers;
+ /* Number of seconds between consecutive uses of the REGISTER command
+ * Not to be confused with NSRegDelay */
+ unsigned NickRegDelay;
+ /* Max number if news items allowed in the list */
+ unsigned NewsCount;
+ /* Default mlock modes */
+ std::string MLock;
+ /* Default botmodes on channels, defaults to ao */
+ std::string BotModes;
+ /* How many times to try and reconnect to the uplink before giving up */
+ unsigned MaxRetries;
+ /* How long to wait between connection attempts */
+ int RetryWait;
-/**************************************************************************/
+ /* Services can use email */
+ bool UseMail;
+ /* Path to the sendmail executable */
+ char *SendMailPath;
+ /* Address to send from */
+ char *SendFrom;
+ /* Only opers can have services send mail */
+ bool RestrictMail;
+ /* Delay between sending mail */
+ time_t MailDelay;
+ /* Don't quote the To: address */
+ bool DontQuoteAddresses;
+
+ /* Prefix of guest nicks when a user gets forced off of a nick */
+ char *NSGuestNickPrefix;
+ /* Allow users to set kill immed on */
+ bool NSAllowKillImmed;
+ /* Don't allow nicks to use /ns group to regroup nicks */
+ bool NSNoGroupChange;
+ /* Default flags for newly registered nicks */
+ Flags<NickCoreFlag> NSDefFlags;
+ /* Default language used by services */
+ unsigned NSDefLanguage;
+ /* Users must be connected this long before they can register
+ * Not to be confused with NickRegDelay */
+ time_t NSRegDelay;
+ /* Time before the registering mail will be resent */
+ time_t NSResendDelay;
+ /* How long before nicks expir */
+ time_t NSExpire;
+ /* Time before NickRequests expire */
+ time_t NSRExpire;
+ /* Force email when registering */
+ bool NSForceEmail;
+ /* Max number of nicks in a group */
+ int NSMaxAliases;
+ /* Max number of allowed strings on the access list */
+ unsigned NSAccessMax;
+ /* Enforcer client user name */
+ char *NSEnforcerUser;
+ /* Enforcer client hostname */
+ char *NSEnforcerHost;
+ /* How long before recovered nicks are released */
+ time_t NSReleaseTimeout;
+ /* /nickserv list is oper only */
+ bool NSListOpersOnly;
+ /* Max number of entries that can be returned from the list command */
+ unsigned NSListMax;
+ /* Only allow usermode +a etc on real services admins */
+ bool NSSecureAdmins;
+ /* Services opers must be /operd on the ircd aswell */
+ bool NSStrictPrivileges;
+ /* Use email to verify new users registering */
+ bool NSEmailReg;
+ /* Set the proper channel modes on users when they identify */
+ bool NSModeOnID;
+ /* Add the users hostnask their access list when they register */
+ bool NSAddAccessOnReg;
+
+ /* Default flags for newly registered channels */
+ Flags<ChannelInfoFlag> CSDefFlags;
+ /* Max number of channels a user can own */
+ unsigned CSMaxReg;
+ /* Time before a channel expires */
+ time_t CSExpire;
+ /* Default ban type to use for channels */
+ int CSDefBantype;
+ /* Max number of entries allowed on channel access lists */
+ unsigned CSAccessMax;
+ /* Max number of entries allowed on autokick lists */
+ unsigned CSAutokickMax;
+ /* Default autokick reason */
+ char *CSAutokickReason;
+ /* Time ChanServ should stay in the channel to hold it to keep users from getting in */
+ time_t CSInhabit;
+ /* ChanServ's LIST command is oper only */
+ bool CSListOpersOnly;
+ /* Max number of entries allowed to be returned from the LIST command */
+ unsigned CSListMax;
+ /* true to make ChanServ oper only */
+ bool CSOpersOnly;
+
+ /* Max number of memos allowed */
+ unsigned MSMaxMemos;
+ /* Time you must wait between sending memos */
+ time_t MSSendDelay;
+ /* Notify all of the aliases of the core the memo was sent to */
+ bool MSNotifyAll;
+ /* Who can use memos reciepts */
+ unsigned MSMemoReceipt;
+
+ /* Defai;t BotServ flags */
+ Flags<BotServFlag> BSDefFlags;
+ /* How long before botserv forgets a user. This is used for flood kickers etc */
+ time_t BSKeepData;
+ /* Min number of users to have in the channel before the service bot joins */
+ unsigned BSMinUsers;
+ /* Max number of words allowed on the badwordslist */
+ unsigned BSBadWordsMax;
+ /* BotServ bot only joins if it would normally allowed to, abides by bans etc */
+ bool BSSmartJoin;
+ /* Dont tell users what badword they used */
+ bool BSGentleBWReason;
+ /* Case sensitive badwords matching */
+ bool BSCaseSensitive;
+ /* Char to use for the fantasy char, eg ! */
+ char *BSFantasyCharacter;
+
+ /* Only show /stats o to opers */
+ bool HideStatsO;
+ /* Send out a global when services shut down or restart */
+ bool GlobalOnCycle;
+ /* Don't include the opers name in globals */
+ bool AnonymousGlobal;
+ /* Dont allow users to register nicks with oper names in them */
+ bool RestrictOperNicks;
+ /* Message to send when shutting down */
+ char *GlobalOnCycleMessage;
+ /* Message to send when starting up */
+ char *GlobalOnCycleUP;
+ /* Super admin is allowed */
+ bool SuperAdmin;
+ /* Log things said through ACT/SAY */
+ bool LogBot;
+ /* Log when new user max is reached */
+ bool LogMaxUsers;
+ /* Default expiry time for akills */
+ time_t AutokillExpiry;
+ /* Default expiry time for chan kills */
+ time_t ChankillExpiry;
+ /* Default expiry time for SGLine Expire */
+ time_t SGLineExpiry;
+ /* Default expiry time for SQLines */
+ time_t SQLineExpiry;
+ /* Default expiry time for SZLine */
+ time_t SZLineExpiry;
+ /* Actually akill the user when the akill is added */
+ bool AkillOnAdd;
+ /* Kill users on SGline */
+ bool KillonSGline;
+ /* Kill users on SQline */
+ bool KillonSQline;
+ /* Send a WALLOPS/GLOBOPS when a user opers */
+ bool WallOper;
+ /* Send a WALLOPS/GLOBOPS when a nonoper tries to use OperServ */
+ bool WallBadOS;
+ /* Send a WALLOPS/GLOBOPS when someone uses the GLOBAL command */
+ bool WallOSGlobal;
+ /* Send a WALLOPS/GLOBOPS when someone uses the MODE command */
+ bool WallOSMode;
+ /* Send a WALLOPS/GLOBOPS when someone uses the CLEARMODES command */
+ bool WallOSClearmodes;
+ /* Send a WALLOPS/GLOBOPS when someone uses the KICK command */
+ bool WallOSKick;
+ /* Send a WALLOPS/GLOBOPS when someone uses the AKILL command */
+ bool WallOSAkill;
+ /* Send a WALLOPS/GLOBOPS when someone uses the SGLINE command */
+ bool WallOSSGLine;
+ /* Send a WALLOPS/GLOBOPS when someone uses the SQLINE command */
+ bool WallOSSQLine;
+ /* Send a WALLOPS/GLOBOPS when someone uses the SZLINE command */
+ bool WallOSSZLine;
+ /* Send a WALLOPS/GLOBOPS when someone uses the NOOP command */
+ bool WallOSNoOp;
+ /* Send a WALLOPS/GLOBOPS when when someone uses the JUPE command */
+ bool WallOSJupe;
+ /* Send a WALLOPS/GLOBOPS when an akill expires */
+ bool WallAkillExpire;
+ /* Send a WALLOPS/GLOBOPS when SGLines expire */
+ bool WallSGLineExpire;
+ /* Send a WALLOPS/GLOBOPS when SQLines expire */
+ bool WallSQLineExpire;
+ /* Send a WALLOPS/GLOBOPS when SZLines expire */
+ bool WallSZLineExpire;
+ /* Send a WALLOPS/GLOBOPS when exceptions expire */
+ bool WallExceptionExpire;
+ /* Send a WALLOPS/GLOBOPS when DROP is used */
+ bool WallDrop;
+ /* Send a WALLOPS/GLOBOPS when FORBID is used */
+ bool WallForbid;
+ /* Send a WALLOPS/GLOBOPS when GETPASS is used */
+ bool WallGetpass;
+ /* Send a WALLOPS/GLOBOPS when SETPASS is used */
+ bool WallSetpass;
+ /* Add the akillers nick to the akill reason */
+ bool AddAkiller;
+
+ /* Limit sessions */
+ bool LimitSessions;
+ /* The default session limit */
+ unsigned DefSessionLimit;
+ /* How long before exceptions expire */
+ time_t ExceptionExpiry;
+ /* How many times to kill before adding an KILL */
+ int MaxSessionKill;
+ /* Max limit that can be used for exceptions */
+ unsigned MaxSessionLimit;
+ /* How long session akills should last */
+ time_t SessionAutoKillExpiry;
+ /* Reason to use for session kills */
+ char *SessionLimitExceeded;
+ /* Optional second reason */
+ char *SessionLimitDetailsLoc;
+ /* OperServ requires you to be an operator */
+ bool OSOpersOnly;
+
+ /* List of modules to autoload */
+ std::list<std::string> ModulesAutoLoad;
+ /* Encryption modules */
+ std::list<std::string> EncModuleList;
+ /* Database modules */
+ std::list<std::string> DBModuleList;
+ /* HostServ Core Modules */
+ std::list<std::string> HostServCoreModules;
+ /* MemoServ Core Modules */
+ std::list<std::string> MemoServCoreModules;
+ /* BotServ Core Modules */
+ std::list<std::string> BotServCoreModules;
+ /* OperServ Core Modules */
+ std::list<std::string> OperServCoreModules;
+ /* NickServ Core Modules */
+ std::list<std::string> NickServCoreModules;
+ /* ChanServ Core Modules */
+ std::list<std::string> ChanServCoreModules;
+
+ /* Default defcon level */
+ int DefConLevel;
+ /* Timeout before defcon is reset */
+ time_t DefConTimeOut;
+ /* Session limiit to use when using defcon */
+ int DefConSessionLimit;
+ /* How long to add akills for defcon */
+ time_t DefConAKILL;
+ /* Chan modes for defcon */
+ char *DefConChanModes;
+ /* Should we global on defcon */
+ bool GlobalOnDefcon;
+ /* Should we send DefconMessage aswell? */
+ bool GlobalOnDefconMore;
+ /* Message to send when defcon is off */
+ char *DefConOffMessage;
+ /* Message to send when defcon is on*/
+ char *DefconMessage;
+ /* Reason to akill clients for defcon */
+ char *DefConAkillReason;
+
+ /* User keys to use for generating random hashes for pass codes etc */
+ long unsigned int UserKey1;
+ long unsigned int UserKey2;
+ long unsigned int UserKey3;
+
+ /* Numeric */
+ char *Numeric;
+ /* Array of ulined servers */
+ char **Ulines;
+ /* Number of ulines */
+ int NumUlines;
+
+ /* List of available opertypes */
+ std::list<OperType *> MyOperTypes;
+ /* List of pairs of opers and their opertype from the config */
+ std::list<std::pair<std::string, std::string> > Opers;
+};
+
+/** This class can be used on its own to represent an exception, or derived to represent a module-specific exception.
+ * When a module whishes to abort, e.g. within a constructor, it should throw an exception using ModuleException or
+ * a class derived from ModuleException. If a module throws an exception during its constructor, the module will not
+ * be loaded. If this happens, the error message returned by ModuleException::GetReason will be displayed to the user
+ * attempting to load the module, or dumped to the console if the ircd is currently loading for the first time.
+ */
+class ConfigException : public CoreException
+{
+ public:
+ /** Default constructor, just uses the error mesage 'Config threw an exception'.
+ */
+ ConfigException() : CoreException("Config threw an exception", "Config Parser") {}
+ /** This constructor can be used to specify an error message before throwing.
+ */
+ ConfigException(const std::string &message) : CoreException(message, "Config Parser") {}
+ /** This destructor solves world hunger, cancels the world debt, and causes the world to end.
+ * Actually no, it does nothing. Never mind.
+ * @throws Nothing!
+ */
+ virtual ~ConfigException() throw() { };
+};
+
+#define CONF_NO_ERROR 0x000000
+#define CONF_NOT_A_NUMBER 0x000010
+#define CONF_INT_NEGATIVE 0x000080
+#define CONF_VALUE_NOT_FOUND 0x000100
+#define CONF_FILE_NOT_FOUND 0x000200
+
+/** Allows reading of values from configuration files
+ * This class allows a module to read from either the main configuration file (inspircd.conf) or from
+ * a module-specified configuration file. It may either be instantiated with one parameter or none.
+ * Constructing the class using one parameter allows you to specify a path to your own configuration
+ * file, otherwise, inspircd.conf is read.
+ */
+class CoreExport ConfigReader
+{
+ protected:
+ /** The contents of the configuration file
+ * This protected member should never be accessed by a module (and cannot be accessed unless the
+ * core is changed). It will contain a pointer to the configuration file data with unneeded data
+ * (such as comments) stripped from it.
+ */
+ ConfigDataHash *data;
+ /** Used to store errors
+ */
+ std::ostringstream *errorlog;
+ /** If we're using our own config data hash or not
+ */
+ bool privatehash;
+ /** True if an error occured reading the config file
+ */
+ bool readerror;
+ /** Error code
+ */
+ long error;
+ public:
+ /** Default constructor.
+ * This constructor initialises the ConfigReader class to read services.conf.
+ */
+ ConfigReader();
+ /** Overloaded constructor.
+ * This constructor initialises the ConfigReader class to read a user-specified config file
+ */
+ ConfigReader(const std::string &);
+ /** Default destructor.
+ * This method destroys the ConfigReader class.
+ */
+ ~ConfigReader();
+ /** Retrieves a value from the config file.
+ * This method retrieves a value from the config file. Where multiple copies of the tag
+ * exist in the config file, index indicates which of the values to retrieve.
+ */
+ std::string ReadValue(const std::string &, const std::string &, int, bool = false);
+ /** Retrieves a value from the config file.
+ * This method retrieves a value from the config file. Where multiple copies of the tag
+ * exist in the config file, index indicates which of the values to retrieve. If the
+ * tag is not found the default value is returned instead.
+ */
+ std::string ReadValue(const std::string &, const std::string &, const std::string &, int, bool = false);
+ /** Retrieves a boolean value from the config file.
+ * This method retrieves a boolean value from the config file. Where multiple copies of the tag
+ * exist in the config file, index indicates which of the values to retrieve. The values "1", "yes"
+ * and "true" in the config file count as true to ReadFlag, and any other value counts as false.
+ */
+ bool ReadFlag(const std::string &, const std::string &, int);
+ /** Retrieves a boolean value from the config file.
+ * This method retrieves a boolean value from the config file. Where multiple copies of the tag
+ * exist in the config file, index indicates which of the values to retrieve. The values "1", "yes"
+ * and "true" in the config file count as true to ReadFlag, and any other value counts as false.
+ * If the tag is not found, the default value is used instead.
+ */
+ bool ReadFlag(const std::string &, const std::string &, const std::string &, int);
+ /** Retrieves an integer value from the config file.
+ * This method retrieves an integer value from the config file. Where multiple copies of the tag
+ * exist in the config file, index indicates which of the values to retrieve. Any invalid integer
+ * values in the tag will cause the objects error value to be set, and any call to GetError() will
+ * return CONF_INVALID_NUMBER to be returned. need_positive is set if the number must be non-negative.
+ * If a negative number is placed into a tag which is specified positive, 0 will be returned and GetError()
+ * will return CONF_INT_NEGATIVE. Note that need_positive is not suitable to get an unsigned int - you
+ * should cast the result to achieve that effect.
+ */
+ int ReadInteger(const std::string &, const std::string &, int, bool);
+ /** Retrieves an integer value from the config file.
+ * This method retrieves an integer value from the config file. Where multiple copies of the tag
+ * exist in the config file, index indicates which of the values to retrieve. Any invalid integer
+ * values in the tag will cause the objects error value to be set, and any call to GetError() will
+ * return CONF_INVALID_NUMBER to be returned. needs_unsigned is set if the number must be unsigned.
+ * If a signed number is placed into a tag which is specified unsigned, 0 will be returned and GetError()
+ * will return CONF_NOT_UNSIGNED. If the tag is not found, the default value is used instead.
+ */
+ int ReadInteger(const std::string &, const std::string &, const std::string &, int, bool);
+ /** Returns the last error to occur.
+ * Valid errors can be found by looking in modules.h. Any nonzero value indicates an error condition.
+ * A call to GetError() resets the error flag back to 0.
+ */
+ long GetError();
+ /** Counts the number of times a given tag appears in the config file.
+ * This method counts the number of times a tag appears in a config file, for use where
+ * there are several tags of the same kind, e.g. with opers and connect types. It can be
+ * used with the index value of ConfigReader::ReadValue to loop through all copies of a
+ * multiple instance tag.
+ */
+ int Enumerate(const std::string &);
+ /** Returns true if a config file is valid.
+ * This method is partially implemented and will only return false if the config
+ * file does not exist or could not be opened.
+ */
+ bool Verify();
+ /** Dumps the list of errors in a config file to an output location. If bail is true,
+ * then the program will abort. If bail is false and user points to a valid user
+ * record, the error report will be spooled to the given user by means of NOTICE.
+ * if bool is false AND user is false, the error report will be spooled to all opers
+ * by means of a NOTICE to all opers.
+ */
+ void DumpErrors(bool);
+ /** Returns the number of items within a tag.
+ * For example if the tag was &lt;test tag="blah" data="foo"&gt; then this
+ * function would return 2. Spaces and newlines both qualify as valid seperators
+ * between values.
+ */
+ int EnumerateValues(const std::string &, int);
+};
-#endif /* CONFIG_H */
+#endif
diff --git a/include/configreader.h b/include/configreader.h
deleted file mode 100644
index 7015eab99..000000000
--- a/include/configreader.h
+++ /dev/null
@@ -1,903 +0,0 @@
-#ifndef _CONFIGREADER_H_
-#define _CONFIGREADER_H_
-
-#include <string>
-#include <fstream>
-#include <sstream>
-#include <vector>
-#include <map>
-#include <deque>
-
-/** A configuration key and value pair
- */
-typedef std::pair<std::string, std::string> KeyVal;
-
-/** A list of related configuration keys and values
- */
-typedef std::vector<KeyVal> KeyValList;
-
-/** An entire config file, built up of KeyValLists
- */
-typedef std::multimap<std::string, KeyValList> ConfigDataHash;
-
-// Required forward definitions
-class ServerConfig;
-
-/** Types of data in the core config
- */
-enum ConfigDataType {
- DT_NOTHING, // No data
- DT_INTEGER, // Integer
- DT_UINTEGER, // Unsigned Integer
- DT_LUINTEGER, // Long Unsigned Integer
- DT_CHARPTR, // Char pointer
- DT_STRING, // std::string
- DT_BOOLEAN, // Boolean
- DT_HOSTNAME, // Hostname syntax
- DT_NOSPACES, // No spaces
- DT_IPADDRESS, // IP address (v4, v6)
- DT_TIME, // Time value
- DT_NORELOAD = 32, // Item can't be reloaded after startup
- DT_ALLOW_WILD = 64, // Allow wildcards/CIDR in DT_IPADDRESS
- DT_ALLOW_NEWLINE = 128 // New line characters allowed in DT_CHARPTR
-};
-
-/** Holds a config value, either string, integer or boolean.
- * Callback functions receive one or more of these, either on
- * their own as a reference, or in a reference to a deque of them.
- * The callback function can then alter the values of the ValueItem
- * classes to validate the settings.
- */
-class ValueItem
-{
- /** Actual data */
- std::string v;
- public:
- /** Initialize with an int */
- ValueItem(int);
- /** Initialize with a bool */
- ValueItem(bool);
- /** Initialize with a char pointer */
- ValueItem(const char *);
- /** Initialize with an std::string */
- ValueItem(const std::string &);
- /** Initialize with a long */
- ValueItem(long);
- /** Change value to a char pointer */
- //void Set(char *);
- /** Change value to a const char pointer */
- void Set(const char *);
- /** Change value to an std::string */
- void Set(const std::string &);
- /** Change value to an int */
- void Set(int);
- /** Get value as an int */
- int GetInteger();
- /** Get value as a string */
- const char *GetString() const;
- /** Get value as a string */
- inline const std::string &GetValue() const { return v; }
- /** Get value as a bool */
- bool GetBool();
-};
-
-/** The base class of the container 'ValueContainer'
- * used internally by the core to hold core values.
- */
-class ValueContainerBase
-{
- public:
- /** Constructor */
- ValueContainerBase() { }
- /** Destructor */
- virtual ~ValueContainerBase() { }
-};
-
-/** ValueContainer is used to contain pointers to different
- * core values such as the server name, maximum number of
- * clients etc.
- * It is specialized to hold a data type, then pointed at
- * a value in the ServerConfig class. When the value has been
- * read and validated, the Set method is called to write the
- * value safely in a type-safe manner.
- */
-template<typename T> class ValueContainer : public ValueContainerBase
-{
- /** Contained item */
- T val;
- public:
- /** Initialize with nothing */
- ValueContainer() : ValueContainerBase(), val(NULL) { }
- /** Initialize with a value of type T */
- ValueContainer(T Val) : ValueContainerBase(), val(Val) { }
- /** Initialize with a copy */
- ValueContainer(const ValueContainer &Val) : ValueContainerBase(), val(Val.val) { }
- ValueContainer &operator=(const ValueContainer &Val)
- {
- val = Val.val;
- return *this;
- }
- /** Change value to type T of size s */
- void Set(const T newval, size_t s)
- {
- memcpy(val, newval, s);
- }
-};
-
-/** This a specific version of ValueContainer to handle character arrays specially
- */
-template<> class ValueContainer<char **> : public ValueContainerBase
-{
- /** Contained item */
- char **val;
- public:
- /** Initialize with nothing */
- ValueContainer() : ValueContainerBase(), val(NULL) { }
- /** Initialize with a value of type T */
- ValueContainer(char **Val) : ValueContainerBase(), val(Val) { }
- /** Initialize with a copy */
- ValueContainer(const ValueContainer &Val) : ValueContainerBase(), val(Val.val) { }
- ValueContainer &operator=(const ValueContainer &Val)
- {
- val = Val.val;
- return *this;
- }
- /** Change value to type T of size s */
- void Set(const char *newval, size_t s)
- {
- if (*val) delete [] *val;
- if (!*newval) {
- *val = NULL;
- return;
- }
- *val = new char[s];
- strlcpy(*val, newval, s);
- }
-};
-
-/** This a specific version of ValueContainer to handle std::string specially
- */
-template<> class ValueContainer<std::string *> : public ValueContainerBase
-{
- /** Contained item */
- std::string *val;
- public:
- /** Initialize with nothing */
- ValueContainer() : ValueContainerBase(), val(NULL) { }
- /** Initialize with an std::string */
- ValueContainer(std::string *Val) : ValueContainerBase(), val(Val) { }
- /** Initialize with a copy */
- ValueContainer(const ValueContainer &Val) : ValueContainerBase(), val(Val.val) { }
- ValueContainer &operator=(const ValueContainer &Val)
- {
- val = Val.val;
- return *this;
- }
- /** Change value to given std::string */
- void Set(const std::string &newval)
- {
- *val = newval;
- }
- /** Change value to given char pointer */
- void Set(const char *newval)
- {
- *val = newval;
- }
-};
-
-/** A specialization of ValueContainer to hold a pointer to a bool
- */
-typedef ValueContainer<bool *> ValueContainerBool;
-
-/** A specialization of ValueContainer to hold a pointer to
- * an unsigned int
- */
-typedef ValueContainer<unsigned *> ValueContainerUInt;
-
-/** A specialization of ValueContainer to hold a pointer to
- * a long unsigned int
- */
-typedef ValueContainer<long unsigned *> ValueContainerLUInt;
-
-/** A specialization of ValueContainer to hold a pointer to
- * a char array.
- */
-typedef ValueContainer<char **> ValueContainerChar;
-
-/** A specialization of ValueContainer to hold a pointer to
- * an int
- */
-typedef ValueContainer<int *> ValueContainerInt;
-
-/** A specialization of ValueContainer to hold a pointer to
- * a time_t
- */
-typedef ValueContainer<time_t *> ValueContainerTime;
-
-/** A specialization of ValueContainer to hold a pointer to
- * an std::string
- */
-typedef ValueContainer<std::string *> ValueContainerString;
-
-/** A set of ValueItems used by multi-value validator functions
- */
-typedef std::deque<ValueItem> ValueList;
-
-/** A callback for validating a single value
- */
-typedef bool (*Validator)(ServerConfig *, const char *, const char *, ValueItem &);
-/** A callback for validating multiple value entries
- */
-typedef bool (*MultiValidator)(ServerConfig *, const char *, const char **, ValueList &, int *, bool);
-/** A callback indicating the end of a group of entries
- */
-typedef bool (*MultiNotify)(ServerConfig *, const char *, bool);
-
-/** Holds a core configuration item and its callbacks
- */
-struct InitialConfig
-{
- /** Tag name */
- const char *tag;
- /** Value name */
- const char *value;
- /** Default, if not defined */
- const char *default_value;
- /** Value containers */
- ValueContainerBase *val;
- /** Data types */
- int datatype;
- /** Validation function */
- Validator validation_function;
-};
-
-/** Holds a core configuration item and its callbacks
- * where there may be more than one item
- */
-struct MultiConfig
-{
- /** Tag name */
- const char *tag;
- /** One or more items within tag */
- const char *items[17];
- /** One or more defaults for items within tags */
- const char *items_default[17];
- /** One or more data types */
- int datatype[17];
- /** Initialization function */
- MultiNotify init_function;
- /** Validation function */
- MultiValidator validation_function;
- /** Completion function */
- MultiNotify finish_function;
-};
-
-/** This class holds the bulk of the runtime configuration for the ircd.
- * It allows for reading new config values, accessing configuration files,
- * and storage of the configuration data needed to run the ircd, such as
- * the servername, connect classes, /ADMIN data, MOTDs and filenames etc.
- */
-class ServerConfig
-{
- private:
- /** This variable holds the names of all
- * files included from the main one. This
- * is used to make sure that no files are
- * recursively included.
- */
- std::vector<std::string> include_stack;
- /** Check that there is only one of each configuration item
- */
- bool CheckOnce(const char *);
- public:
- std::ostringstream errstr;
- ConfigDataHash newconfig;
- /** This holds all the information in the config file,
- * it's indexed by tag name to a vector of key/values.
- */
- ConfigDataHash config_data;
- /** Construct a new ServerConfig
- */
- ServerConfig();
- /** Clears the include stack in preperation for a Read() call.
- */
- void ClearStack();
- /** Read the entire configuration into memory
- * and initialize this class. All other methods
- * should be used only by the core.
- */
- int Read(bool);
- /** Report a configuration error given in errormessage.
- * @param bail If this is set to true, the error is sent to the console, and the program exits
- * @param connection If this is set to a non-null value, and bail is false, the errors are spooled to
- * this connection as SNOTICEs.
- * If the parameter is NULL, the messages are spooled to all connections via WriteOpers as SNOTICEs.
- */
- void ReportConfigError(const std::string &, bool);
- /** Load 'filename' into 'target', with the new config parser everything is parsed into
- * tag/key/value at load-time rather than at read-value time.
- */
- bool LoadConf(ConfigDataHash &, const char *, std::ostringstream &);
- /** Load 'filename' into 'target', with the new config parser everything is parsed into
- * tag/key/value at load-time rather than at read-value time.
- */
- bool LoadConf(ConfigDataHash &, const std::string &, std::ostringstream &);
- // Both these return true if the value existed or false otherwise
- /** Writes 'length' chars into 'result' as a string
- */
- bool ConfValue(ConfigDataHash &, const char *, const char *, int, char *, int, bool = false);
- /** Writes 'length' chars into 'result' as a string
- */
- bool ConfValue(ConfigDataHash &, const char *, const char *, const char *, int, char *, int, bool = false);
- /** Writes 'length' chars into 'result' as a string
- */
- bool ConfValue(ConfigDataHash &, const std::string &, const std::string &, int, std::string &, bool = false);
- /** Writes 'length' chars into 'result' as a string
- */
- bool ConfValue(ConfigDataHash &, const std::string &, const std::string &, const std::string &, int, std::string &, bool = false);
- /** Tries to convert the value to an integer and write it to 'result'
- */
- bool ConfValueInteger(ConfigDataHash &, const char *, const char *, int, int &);
- /** Tries to convert the value to an integer and write it to 'result'
- */
- bool ConfValueInteger(ConfigDataHash &, const char *, const char *, const char *, int, int &);
- /** Tries to convert the value to an integer and write it to 'result'
- */
- bool ConfValueInteger(ConfigDataHash &, const std::string &, const std::string &, int, int &);
- /** Tries to convert the value to an integer and write it to 'result'
- */
- bool ConfValueInteger(ConfigDataHash &, const std::string &, const std::string &, const std::string &, int, int &);
- /** Returns true if the value exists and has a true value, false otherwise
- */
- bool ConfValueBool(ConfigDataHash &, const char *, const char *, int);
- /** Returns true if the value exists and has a true value, false otherwise
- */
- bool ConfValueBool(ConfigDataHash &, const char *, const char *, const char *, int);
- /** Returns true if the value exists and has a true value, false otherwise
- */
- bool ConfValueBool(ConfigDataHash &, const std::string &, const std::string &, int);
- /** Returns true if the value exists and has a true value, false otherwise
- */
- bool ConfValueBool(ConfigDataHash &, const std::string &, const std::string &, const std::string &, int);
- /** Returns the number of occurences of tag in the config file
- */
- int ConfValueEnum(ConfigDataHash &, const char *);
- /** Returns the number of occurences of tag in the config file
- */
- int ConfValueEnum(ConfigDataHash &, const std::string &);
- /** Returns the numbers of vars inside the index'th 'tag in the config file
- */
- int ConfVarEnum(ConfigDataHash &, const char *, int);
- /** Returns the numbers of vars inside the index'th 'tag in the config file
- */
- int ConfVarEnum(ConfigDataHash &, const std::string &, int);
- void ValidateHostname(const char *, const std::string &, const std::string &);
- void ValidateIP(const char *p, const std::string &, const std::string &, bool);
- void ValidateNoSpaces(const char *, const std::string &, const std::string &);
-
-
-
- /** Below here is a list of variables which contain the config files values
- */
- /* IRCd module in use */
- char *IRCDModule;
-
- /* Host to connect to **/
- char *LocalHost;
- /* List of uplink servers to try and connect to */
- std::list<Uplink *> Uplinks;
-
- /* Our server name */
- char *ServerName;
- /* Our servers description */
- char *ServerDesc;
- /* The username/ident of services clients */
- char *ServiceUser;
- /* The hostname if services clients */
- char *ServiceHost;
-
- /* Help channel, ops here get usermode +h **/
- char *HelpChannel;
- /* Log channel */
- char *LogChannel;
- /* Name of the network were on */
- char *NetworkName;
- /* The max legnth of nicks */
- unsigned NickLen;
- /* Max length of idents */
- unsigned UserLen;
- /* Max lenght of hostnames */
- unsigned HostLen;
-
- /* Max length of passwords */
- unsigned PassLen;
-
- /* NickServ Name */
- char *s_NickServ;
- /* ChanServ Name */
- char *s_ChanServ;
- /* MemoServ Name */
- char *s_MemoServ;
- /* BotServ Name */
- char *s_BotServ;
- /* OperServ name */
- char *s_OperServ;
- /* Global name */
- char *s_GlobalNoticer;
- /* NickServs realname */
- char *desc_NickServ;
- /* ChanServ realname */
- char *desc_ChanServ;
- /* MemoServ relname */
- char *desc_MemoServ;
- /* BotServ realname */
- char *desc_BotServ;
- /* OperServ realname */
- char *desc_OperServ;
- /* Global realname */
- char *desc_GlobalNoticer;
-
- /* HostServ Name */
- char *s_HostServ;
- /* HostServ realname */
- char *desc_HostServ;
-
- /* Filename for the PID file */
- char *PIDFilename;
- /* MOTD filename */
- char *MOTDFilename;
-
- /* True if its ok to not be able to save backs */
- bool NoBackupOkay;
- /* Do password checking when new people register */
- bool StrictPasswords;
- /* How many times you're allowed to give a bad password before being killed */
- unsigned BadPassLimit;
- /* How long before bad passwords are forgotten */
- time_t BadPassTimeout;
- /* Delay between automatic database updates */
- time_t UpdateTimeout;
- /* Delay between checks for expired nicks and channels */
- time_t ExpireTimeout;
- /* How long to wait for something from the uplink, this is passed to select() */
- time_t ReadTimeout;
- /* How often to send program errors */
- time_t WarningTimeout;
- /* How long to process things such as timers to see if there is anything to calll */
- time_t TimeoutCheck;
- /* Num of days logfiles are kept */
- int KeepLogs;
- /* Number of days backups are kept */
- int KeepBackups;
- /* Forbidding requires a reason */
- bool ForceForbidReason;
- /* Services should use privmsgs instead of notices */
- bool UsePrivmsg;
- /* Services only respond to full PRIVMSG client@services.server.name messages */
- bool UseStrictPrivMsg;
- /* Dump a core file if we crash */
- bool DumpCore;
- /* Log users connecting/existing/changing nicks */
- bool LogUsers;
- /* Number of seconds between consecutive uses of the REGISTER command
- * Not to be confused with NSRegDelay */
- unsigned NickRegDelay;
- /* Max number if news items allowed in the list */
- unsigned NewsCount;
- /* Default mlock modes */
- std::string MLock;
- /* Default botmodes on channels, defaults to ao */
- std::string BotModes;
- /* How many times to try and reconnect to the uplink before giving up */
- unsigned MaxRetries;
- /* How long to wait between connection attempts */
- int RetryWait;
-
- /* Services can use email */
- bool UseMail;
- /* Path to the sendmail executable */
- char *SendMailPath;
- /* Address to send from */
- char *SendFrom;
- /* Only opers can have services send mail */
- bool RestrictMail;
- /* Delay between sending mail */
- time_t MailDelay;
- /* Don't quote the To: address */
- bool DontQuoteAddresses;
-
- /* Prefix of guest nicks when a user gets forced off of a nick */
- char *NSGuestNickPrefix;
- /* Allow users to set kill immed on */
- bool NSAllowKillImmed;
- /* Don't allow nicks to use /ns group to regroup nicks */
- bool NSNoGroupChange;
- /* Default flags for newly registered nicks */
- Flags<NickCoreFlag> NSDefFlags;
- /* Default language used by services */
- unsigned NSDefLanguage;
- /* Users must be connected this long before they can register
- * Not to be confused with NickRegDelay */
- time_t NSRegDelay;
- /* Time before the registering mail will be resent */
- time_t NSResendDelay;
- /* How long before nicks expir */
- time_t NSExpire;
- /* Time before NickRequests expire */
- time_t NSRExpire;
- /* Force email when registering */
- bool NSForceEmail;
- /* Max number of nicks in a group */
- int NSMaxAliases;
- /* Max number of allowed strings on the access list */
- unsigned NSAccessMax;
- /* Enforcer client user name */
- char *NSEnforcerUser;
- /* Enforcer client hostname */
- char *NSEnforcerHost;
- /* How long before recovered nicks are released */
- time_t NSReleaseTimeout;
- /* /nickserv list is oper only */
- bool NSListOpersOnly;
- /* Max number of entries that can be returned from the list command */
- unsigned NSListMax;
- /* Only allow usermode +a etc on real services admins */
- bool NSSecureAdmins;
- /* Services opers must be /operd on the ircd aswell */
- bool NSStrictPrivileges;
- /* Use email to verify new users registering */
- bool NSEmailReg;
- /* Set the proper channel modes on users when they identify */
- bool NSModeOnID;
- /* Add the users hostnask their access list when they register */
- bool NSAddAccessOnReg;
-
- /* Default flags for newly registered channels */
- Flags<ChannelInfoFlag> CSDefFlags;
- /* Max number of channels a user can own */
- unsigned CSMaxReg;
- /* Time before a channel expires */
- time_t CSExpire;
- /* Default ban type to use for channels */
- int CSDefBantype;
- /* Max number of entries allowed on channel access lists */
- unsigned CSAccessMax;
- /* Max number of entries allowed on autokick lists */
- unsigned CSAutokickMax;
- /* Default autokick reason */
- char *CSAutokickReason;
- /* Time ChanServ should stay in the channel to hold it to keep users from getting in */
- time_t CSInhabit;
- /* ChanServ's LIST command is oper only */
- bool CSListOpersOnly;
- /* Max number of entries allowed to be returned from the LIST command */
- unsigned CSListMax;
- /* true to make ChanServ oper only */
- bool CSOpersOnly;
-
- /* Max number of memos allowed */
- unsigned MSMaxMemos;
- /* Time you must wait between sending memos */
- time_t MSSendDelay;
- /* Notify all of the aliases of the core the memo was sent to */
- bool MSNotifyAll;
- /* Who can use memos reciepts */
- unsigned MSMemoReceipt;
-
- /* Defai;t BotServ flags */
- Flags<BotServFlag> BSDefFlags;
- /* How long before botserv forgets a user. This is used for flood kickers etc */
- time_t BSKeepData;
- /* Min number of users to have in the channel before the service bot joins */
- unsigned BSMinUsers;
- /* Max number of words allowed on the badwordslist */
- unsigned BSBadWordsMax;
- /* BotServ bot only joins if it would normally allowed to, abides by bans etc */
- bool BSSmartJoin;
- /* Dont tell users what badword they used */
- bool BSGentleBWReason;
- /* Case sensitive badwords matching */
- bool BSCaseSensitive;
- /* Char to use for the fantasy char, eg ! */
- char *BSFantasyCharacter;
-
- /* Only show /stats o to opers */
- bool HideStatsO;
- /* Send out a global when services shut down or restart */
- bool GlobalOnCycle;
- /* Don't include the opers name in globals */
- bool AnonymousGlobal;
- /* Dont allow users to register nicks with oper names in them */
- bool RestrictOperNicks;
- /* Message to send when shutting down */
- char *GlobalOnCycleMessage;
- /* Message to send when starting up */
- char *GlobalOnCycleUP;
- /* Super admin is allowed */
- bool SuperAdmin;
- /* Log things said through ACT/SAY */
- bool LogBot;
- /* Log when new user max is reached */
- bool LogMaxUsers;
- /* Default expiry time for akills */
- time_t AutokillExpiry;
- /* Default expiry time for chan kills */
- time_t ChankillExpiry;
- /* Default expiry time for SGLine Expire */
- time_t SGLineExpiry;
- /* Default expiry time for SQLines */
- time_t SQLineExpiry;
- /* Default expiry time for SZLine */
- time_t SZLineExpiry;
- /* Actually akill the user when the akill is added */
- bool AkillOnAdd;
- /* Kill users on SGline */
- bool KillonSGline;
- /* Kill users on SQline */
- bool KillonSQline;
- /* Send a WALLOPS/GLOBOPS when a user opers */
- bool WallOper;
- /* Send a WALLOPS/GLOBOPS when a nonoper tries to use OperServ */
- bool WallBadOS;
- /* Send a WALLOPS/GLOBOPS when someone uses the GLOBAL command */
- bool WallOSGlobal;
- /* Send a WALLOPS/GLOBOPS when someone uses the MODE command */
- bool WallOSMode;
- /* Send a WALLOPS/GLOBOPS when someone uses the CLEARMODES command */
- bool WallOSClearmodes;
- /* Send a WALLOPS/GLOBOPS when someone uses the KICK command */
- bool WallOSKick;
- /* Send a WALLOPS/GLOBOPS when someone uses the AKILL command */
- bool WallOSAkill;
- /* Send a WALLOPS/GLOBOPS when someone uses the SGLINE command */
- bool WallOSSGLine;
- /* Send a WALLOPS/GLOBOPS when someone uses the SQLINE command */
- bool WallOSSQLine;
- /* Send a WALLOPS/GLOBOPS when someone uses the SZLINE command */
- bool WallOSSZLine;
- /* Send a WALLOPS/GLOBOPS when someone uses the NOOP command */
- bool WallOSNoOp;
- /* Send a WALLOPS/GLOBOPS when when someone uses the JUPE command */
- bool WallOSJupe;
- /* Send a WALLOPS/GLOBOPS when an akill expires */
- bool WallAkillExpire;
- /* Send a WALLOPS/GLOBOPS when SGLines expire */
- bool WallSGLineExpire;
- /* Send a WALLOPS/GLOBOPS when SQLines expire */
- bool WallSQLineExpire;
- /* Send a WALLOPS/GLOBOPS when SZLines expire */
- bool WallSZLineExpire;
- /* Send a WALLOPS/GLOBOPS when exceptions expire */
- bool WallExceptionExpire;
- /* Send a WALLOPS/GLOBOPS when DROP is used */
- bool WallDrop;
- /* Send a WALLOPS/GLOBOPS when FORBID is used */
- bool WallForbid;
- /* Send a WALLOPS/GLOBOPS when GETPASS is used */
- bool WallGetpass;
- /* Send a WALLOPS/GLOBOPS when SETPASS is used */
- bool WallSetpass;
- /* Add the akillers nick to the akill reason */
- bool AddAkiller;
-
- /* Limit sessions */
- bool LimitSessions;
- /* The default session limit */
- unsigned DefSessionLimit;
- /* How long before exceptions expire */
- time_t ExceptionExpiry;
- /* How many times to kill before adding an KILL */
- int MaxSessionKill;
- /* Max limit that can be used for exceptions */
- unsigned MaxSessionLimit;
- /* How long session akills should last */
- time_t SessionAutoKillExpiry;
- /* Reason to use for session kills */
- char *SessionLimitExceeded;
- /* Optional second reason */
- char *SessionLimitDetailsLoc;
- /* OperServ requires you to be an operator */
- bool OSOpersOnly;
-
- /* List of modules to autoload */
- std::list<std::string> ModulesAutoLoad;
- /* Encryption modules */
- std::list<std::string> EncModuleList;
- /* Database modules */
- std::list<std::string> DBModuleList;
- /* HostServ Core Modules */
- std::list<std::string> HostServCoreModules;
- /* MemoServ Core Modules */
- std::list<std::string> MemoServCoreModules;
- /* BotServ Core Modules */
- std::list<std::string> BotServCoreModules;
- /* OperServ Core Modules */
- std::list<std::string> OperServCoreModules;
- /* NickServ Core Modules */
- std::list<std::string> NickServCoreModules;
- /* ChanServ Core Modules */
- std::list<std::string> ChanServCoreModules;
-
- /* Default defcon level */
- int DefConLevel;
- /* Timeout before defcon is reset */
- time_t DefConTimeOut;
- /* Session limiit to use when using defcon */
- int DefConSessionLimit;
- /* How long to add akills for defcon */
- time_t DefConAKILL;
- /* Chan modes for defcon */
- char *DefConChanModes;
- /* Should we global on defcon */
- bool GlobalOnDefcon;
- /* Should we send DefconMessage aswell? */
- bool GlobalOnDefconMore;
- /* Message to send when defcon is off */
- char *DefConOffMessage;
- /* Message to send when defcon is on*/
- char *DefconMessage;
- /* Reason to akill clients for defcon */
- char *DefConAkillReason;
-
- /* User keys to use for generating random hashes for pass codes etc */
- long unsigned int UserKey1;
- long unsigned int UserKey2;
- long unsigned int UserKey3;
-
- /* Numeric */
- char *Numeric;
- /* Array of ulined servers */
- char **Ulines;
- /* Number of ulines */
- int NumUlines;
-
- /* List of available opertypes */
- std::list<OperType *> MyOperTypes;
- /* List of pairs of opers and their opertype from the config */
- std::list<std::pair<std::string, std::string> > Opers;
-};
-
-/** This class can be used on its own to represent an exception, or derived to represent a module-specific exception.
- * When a module whishes to abort, e.g. within a constructor, it should throw an exception using ModuleException or
- * a class derived from ModuleException. If a module throws an exception during its constructor, the module will not
- * be loaded. If this happens, the error message returned by ModuleException::GetReason will be displayed to the user
- * attempting to load the module, or dumped to the console if the ircd is currently loading for the first time.
- */
-class ConfigException : public CoreException
-{
- public:
- /** Default constructor, just uses the error mesage 'Config threw an exception'.
- */
- ConfigException() : CoreException("Config threw an exception", "Config Parser") {}
- /** This constructor can be used to specify an error message before throwing.
- */
- ConfigException(const std::string &message) : CoreException(message, "Config Parser") {}
- /** This destructor solves world hunger, cancels the world debt, and causes the world to end.
- * Actually no, it does nothing. Never mind.
- * @throws Nothing!
- */
- virtual ~ConfigException() throw() { }
-};
-
-#define CONF_NO_ERROR 0x000000
-#define CONF_NOT_A_NUMBER 0x000010
-#define CONF_INT_NEGATIVE 0x000080
-#define CONF_VALUE_NOT_FOUND 0x000100
-#define CONF_FILE_NOT_FOUND 0x000200
-
-/** Allows reading of values from configuration files
- * This class allows a module to read from either the main configuration file (inspircd.conf) or from
- * a module-specified configuration file. It may either be instantiated with one parameter or none.
- * Constructing the class using one parameter allows you to specify a path to your own configuration
- * file, otherwise, inspircd.conf is read.
- */
-class CoreExport ConfigReader
-{
- protected:
- /** The contents of the configuration file
- * This protected member should never be accessed by a module (and cannot be accessed unless the
- * core is changed). It will contain a pointer to the configuration file data with unneeded data
- * (such as comments) stripped from it.
- */
- ConfigDataHash *data;
- /** Used to store errors
- */
- std::ostringstream *errorlog;
- /** If we're using our own config data hash or not
- */
- bool privatehash;
- /** True if an error occured reading the config file
- */
- bool readerror;
- /** Error code
- */
- long error;
- public:
- /** Default constructor.
- * This constructor initialises the ConfigReader class to read services.conf.
- */
- ConfigReader();
- /** Overloaded constructor.
- * This constructor initialises the ConfigReader class to read a user-specified config file
- */
- ConfigReader(const std::string &);
- /** Default destructor.
- * This method destroys the ConfigReader class.
- */
- ~ConfigReader();
- /** Retrieves a value from the config file.
- * This method retrieves a value from the config file. Where multiple copies of the tag
- * exist in the config file, index indicates which of the values to retrieve.
- */
- std::string ReadValue(const std::string &, const std::string &, int, bool = false);
- /** Retrieves a value from the config file.
- * This method retrieves a value from the config file. Where multiple copies of the tag
- * exist in the config file, index indicates which of the values to retrieve. If the
- * tag is not found the default value is returned instead.
- */
- std::string ReadValue(const std::string &, const std::string &, const std::string &, int, bool = false);
- /** Retrieves a boolean value from the config file.
- * This method retrieves a boolean value from the config file. Where multiple copies of the tag
- * exist in the config file, index indicates which of the values to retrieve. The values "1", "yes"
- * and "true" in the config file count as true to ReadFlag, and any other value counts as false.
- */
- bool ReadFlag(const std::string &, const std::string &, int);
- /** Retrieves a boolean value from the config file.
- * This method retrieves a boolean value from the config file. Where multiple copies of the tag
- * exist in the config file, index indicates which of the values to retrieve. The values "1", "yes"
- * and "true" in the config file count as true to ReadFlag, and any other value counts as false.
- * If the tag is not found, the default value is used instead.
- */
- bool ReadFlag(const std::string &, const std::string &, const std::string &, int);
- /** Retrieves an integer value from the config file.
- * This method retrieves an integer value from the config file. Where multiple copies of the tag
- * exist in the config file, index indicates which of the values to retrieve. Any invalid integer
- * values in the tag will cause the objects error value to be set, and any call to GetError() will
- * return CONF_INVALID_NUMBER to be returned. need_positive is set if the number must be non-negative.
- * If a negative number is placed into a tag which is specified positive, 0 will be returned and GetError()
- * will return CONF_INT_NEGATIVE. Note that need_positive is not suitable to get an unsigned int - you
- * should cast the result to achieve that effect.
- */
- int ReadInteger(const std::string &, const std::string &, int, bool);
- /** Retrieves an integer value from the config file.
- * This method retrieves an integer value from the config file. Where multiple copies of the tag
- * exist in the config file, index indicates which of the values to retrieve. Any invalid integer
- * values in the tag will cause the objects error value to be set, and any call to GetError() will
- * return CONF_INVALID_NUMBER to be returned. needs_unsigned is set if the number must be unsigned.
- * If a signed number is placed into a tag which is specified unsigned, 0 will be returned and GetError()
- * will return CONF_NOT_UNSIGNED. If the tag is not found, the default value is used instead.
- */
- int ReadInteger(const std::string &, const std::string &, const std::string &, int, bool);
- /** Returns the last error to occur.
- * Valid errors can be found by looking in modules.h. Any nonzero value indicates an error condition.
- * A call to GetError() resets the error flag back to 0.
- */
- long GetError();
- /** Counts the number of times a given tag appears in the config file.
- * This method counts the number of times a tag appears in a config file, for use where
- * there are several tags of the same kind, e.g. with opers and connect types. It can be
- * used with the index value of ConfigReader::ReadValue to loop through all copies of a
- * multiple instance tag.
- */
- int Enumerate(const std::string &);
- /** Returns true if a config file is valid.
- * This method is partially implemented and will only return false if the config
- * file does not exist or could not be opened.
- */
- bool Verify();
- /** Dumps the list of errors in a config file to an output location. If bail is true,
- * then the program will abort. If bail is false and user points to a valid user
- * record, the error report will be spooled to the given user by means of NOTICE.
- * if bool is false AND user is false, the error report will be spooled to all opers
- * by means of a NOTICE to all opers.
- */
- void DumpErrors(bool);
- /** Returns the number of items within a tag.
- * For example if the tag was &lt;test tag="blah" data="foo"&gt; then this
- * function would return 2. Spaces and newlines both qualify as valid seperators
- * between values.
- */
- int EnumerateValues(const std::string &, int);
-};
-
-#endif
diff --git a/include/services.h b/include/services.h
index ae36f8dbd..9b660f3a2 100644
--- a/include/services.h
+++ b/include/services.h
@@ -17,7 +17,8 @@
/*************************************************************************/
#include "sysconf.h"
-#include "config.h"
+
+#define BUFSIZE 1024
/* Some SUN fixs */
#ifdef __sun
@@ -901,7 +902,7 @@ class ServerConfig;
#include "extern.h"
#include "servers.h"
-#include "configreader.h"
+#include "config.h"
class CoreExport IRCDProto
{
diff --git a/include/sockets.h b/include/sockets.h
index 3277c1b9f..0da19f951 100644
--- a/include/sockets.h
+++ b/include/sockets.h
@@ -20,6 +20,8 @@
#define CloseSocket close
#endif
+#define NET_BUFSIZE 65536
+
class SocketException : public CoreException
{
public:
diff --git a/src/config.c b/src/config.c
index 82a2fcac6..82a92bc70 100644
--- a/src/config.c
+++ b/src/config.c
@@ -12,7 +12,7 @@
*/
#include "services.h"
-#include "configreader.h"
+#include "config.h"
#include "hashcomp.h" // If this gets added to services.h or someplace else later, remove it from here -- CyberBotX
/*************************************************************************/
diff --git a/src/main.c b/src/main.c
index 68423e4ec..c5974f029 100644
--- a/src/main.c
+++ b/src/main.c
@@ -43,7 +43,7 @@
std::string services_dir; /* -dir dirname */
std::string services_bin; /* Binary as specified by the user */
std::string orig_cwd; /* Original current working directory */
-std::string log_filename = LOG_FILENAME; /* -log filename */
+std::string log_filename = "services.log"; /* -log filename */
int debug = 0; /* -debug */
int readonly = 0; /* -readonly */
bool LogChan = false; /* -logchan */