]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/inspircd.h
Combine IP+port in a failed port list, show (the more helpful) error string so the...
[user/henk/code/inspircd.git] / include / inspircd.h
index 71a809be9e12b9f5fc49f0ec4c2b13aa1fd0974e..9ef5dbcfb932f80587852d6481db4fa43b093c1a 100644 (file)
@@ -15,8 +15,8 @@
 #define __INSPIRCD_H__
 
 #ifndef WIN32
-#define DllExport 
-#define CoreExport 
+#define DllExport
+#define CoreExport
 #define printf_c printf
 #else
 #include "inspircd_win32wrapper.h"
 #undef ERROR
 #endif
 
-// Required system headers.
-#include <time.h>
-#include <stdarg.h>
+#ifdef __GNUC__
+#define CUSTOM_PRINTF(STRING, FIRST) __attribute__((format(printf, STRING, FIRST)))
+#else
+#define CUSTOM_PRINTF(STRING, FIRST)
+#endif
 
+// Required system headers.
+#include <ctime>
+#include <cstdarg>
+#include <algorithm>
+#include <cmath>
+#include <cstring>
+#include <climits>
 
-//#include <string>
-//#include <sstream>
 #include "inspircd_config.h"
+#include "numerics.h"
 #include "uid.h"
 #include "users.h"
 #include "channels.h"
 #include "timer.h"
 #include "hashcomp.h"
 #include "typedefs.h"
+#include "logger.h"
 #include "usermanager.h"
 #include "socket.h"
 #include "ctables.h"
 #include "cull_list.h"
 #include "filelogger.h"
 #include "caller.h"
-//#include "inspsocket.h"
 #include "modules.h"
 #include "configreader.h"
 #include "inspstring.h"
+#include "protocol.h"
+
+#ifndef PATH_MAX
+#warning Potentially broken system, PATH_MAX undefined
+#define PATH_MAX 4096
+#endif
 
 /**
  * Used to define the maximum number of parameters a command may have.
@@ -221,32 +235,47 @@ class serverstats : public classbase
 };
 
 /** A list of failed port bindings, used for informational purposes on startup */
-typedef std::vector<std::pair<std::string, long> > FailedPortList;
+typedef std::vector<std::pair<std::string, std::string> > FailedPortList;
 
 class InspIRCd;
 
 DEFINE_HANDLER1(ProcessUserHandler, void, User*);
-DEFINE_HANDLER1(IsNickHandler, bool, const char*);
+DEFINE_HANDLER2(IsNickHandler, bool, const char*, size_t);
 DEFINE_HANDLER1(IsIdentHandler, bool, const char*);
 DEFINE_HANDLER1(FindDescriptorHandler, User*, int);
 DEFINE_HANDLER1(FloodQuitUserHandler, void, User*);
+DEFINE_HANDLER2(IsChannelHandler, bool, const char*, size_t);
+DEFINE_HANDLER1(IsSIDHandler, bool, const std::string&);
+DEFINE_HANDLER1(RehashHandler, void, const std::string&);
 
 /* Forward declaration - required */
 class XLineManager;
 class BanCacheManager;
 
+class CoreExport ConfigReaderThread : public Thread
+{
+       InspIRCd* ServerInstance;
+       bool do_bail;
+       User* TheUser;
+ public:
+       ConfigReaderThread(InspIRCd* Instance, bool bail, User* user) : Thread(), ServerInstance(Instance), do_bail(bail), TheUser(user)
+       {
+       }
+
+       virtual ~ConfigReaderThread()
+       {
+       }
+
+       void Run();
+};
+
 /** The main class of the irc server.
  * This class contains instances of all the other classes
  * in this software, with the exception of the base class,
  * classbase. Amongst other things, it contains a ModeParser,
  * a DNS object, a CommandParser object, and a list of active
  * Module objects, and facilities for Module objects to
- * interact with the core system it implements. You should
- * NEVER attempt to instantiate a class of type InspIRCd
- * yourself. If you do, this is equivalent to spawning a second
- * IRC server, and could have catastrophic consequences for the
- * program in terms of ram usage (basically, you could create
- * an obese forkbomb built from recursively spawning irc servers!)
+ * interact with the core system it implements.
  */
 class CoreExport InspIRCd : public classbase
 {
@@ -269,9 +298,9 @@ class CoreExport InspIRCd : public classbase
         */
        void DoSocketTimeouts(time_t TIME);
 
-       /** Sets up UID subsystem
+       /** Increments the current UID by one.
         */
-       void InitialiseUID();
+       void IncrementUID(int pos);
 
        /** Perform background user events such as PING checks
         */
@@ -307,15 +336,6 @@ class CoreExport InspIRCd : public classbase
         */
        socklen_t length;
 
-       /** Nonblocking file writer
-        */
-       FileLogger* Logger;
-
-       /** Time offset in seconds
-        * This offset is added to all calls to Time(). Use SetTimeDelta() to update
-        */
-       int time_delta;
-
 #ifdef WIN32
        IPC* WindowsIPC;
 #endif
@@ -333,6 +353,9 @@ class CoreExport InspIRCd : public classbase
        IsIdentHandler HandleIsIdent;
        FindDescriptorHandler HandleFindDescriptor;
        FloodQuitUserHandler HandleFloodQuitUser;
+       IsChannelHandler HandleIsChannel;
+       IsSIDHandler HandleIsSID;
+       RehashHandler HandleRehash;
 
        /** BufferedSocket classes pending deletion after being closed.
         * We don't delete these immediately as this may cause a segmentation fault.
@@ -392,7 +415,19 @@ class CoreExport InspIRCd : public classbase
        /** Socket engine, handles socket activity events
         */
        SocketEngine* SE;
-       
+
+       /** Thread engine, Handles threading where required
+        */
+       ThreadEngine* Threads;
+
+       /** The thread/class used to read config files in REHASH and on startup
+        */
+       ConfigReaderThread* ConfigThread;
+
+       /** LogManager handles logging.
+        */
+       LogManager *Logs;
+
        /** ModuleManager contains everything related to loading/unloading
         * modules.
         */
@@ -440,26 +475,16 @@ class CoreExport InspIRCd : public classbase
         */
        int s_signal;
 
+       /** Protocol interface, overridden by server protocol modules
+        */
+       ProtocolInterface* PI;
+
        /** Get the current time
         * Because this only calls time() once every time around the mainloop,
         * it is much faster than calling time() directly.
-        * @param delta True to use the delta as an offset, false otherwise
         * @return The current time as an epoch value (time_t)
         */
-       time_t Time(bool delta = false);
-
-       /** Set the time offset in seconds
-        * This offset is added to Time() to offset the system time by the specified
-        * number of seconds.
-        * @param delta The number of seconds to offset
-        * @return The old time delta
-        */
-       int SetTimeDelta(int delta);
-
-       /** Get the time offset in seconds
-        * @return The current time delta (in seconds)
-        */
-       int GetTimeDelta();
+       time_t Time();
 
        /** Process a user whos socket has been flagged as active
         * @param cu The user to process
@@ -481,7 +506,7 @@ class CoreExport InspIRCd : public classbase
         * @param addr The address to bind to (IP only)
         * @return True if the port was bound successfully
         */
-       bool BindSocket(int sockfd, int port, char* addr, bool dolisten = true);
+       bool BindSocket(int sockfd, int port, const char* addr, bool dolisten = true);
 
        /** Adds a server name to the list of servers we've seen
         * @param The servername to add
@@ -561,31 +586,27 @@ class CoreExport InspIRCd : public classbase
         */
        bool OpenLog(char** argv, int argc);
 
-       /** Close the currently open log file
-        */
-       void CloseLog();
-
        /** Return true if a channel name is valid
         * @param chname A channel name to verify
         * @return True if the name is valid
         */
-       bool IsChannel(const char *chname);
+       caller2<bool, const char*, size_t> IsChannel;
 
        /** Return true if str looks like a server ID
         * @param string to check against
         */
-       bool IsSID(const std::string &str);
+       caller1<bool, const std::string&> IsSID;
 
        /** Rehash the local server
         */
-       void Rehash();
+       caller1<void, const std::string&> Rehash;
 
        /** Handles incoming signals after being set
         * @param signal the signal recieved
         */
        void SignalHandler(int signal);
 
-       /** Sets the signal recieved    
+       /** Sets the signal recieved
         * @param signal the signal recieved
         */
        static void SetSignal(int signal);
@@ -617,7 +638,7 @@ class CoreExport InspIRCd : public classbase
         * @param n A nickname to verify
         * @return True if the nick is valid
         */
-       caller1<bool, const char*> IsNick;
+       caller2<bool, const char*, size_t> IsNick;
 
        /** Return true if an ident is valid
         * @param An ident to verify
@@ -663,7 +684,7 @@ class CoreExport InspIRCd : public classbase
         * @param pcnt The number of items you have given in the first parameter
         * @param user The user to send error messages to
         */
-       void SendMode(const char **parameters, int pcnt, User *user);
+       void SendMode(const std::vector<std::string>& parameters, User *user);
 
        /** Match two strings using pattern matching.
         * This operates identically to the global function match(),
@@ -681,7 +702,7 @@ class CoreExport InspIRCd : public classbase
         * @param user The user to execute the command as
         * @return True if the command handler was called successfully
         */
-       CmdResult CallCommandHandler(const std::string &commandname, const char** parameters, int pcnt, User* user);
+       CmdResult CallCommandHandler(const std::string &commandname, const std::vector<std::string>& parameters, User* user);
 
        /** Return true if the command is a module-implemented command and the given parameters are valid for it
         * @param parameters The mode parameters
@@ -751,7 +772,7 @@ class CoreExport InspIRCd : public classbase
         * @param hashtype The hash from the config file
         * @return 0 if the strings match, 1 or -1 if they do not
         */
-       int PassCompare(Extensible* ex, const char* data,const char* input, const char* hashtype);
+       int PassCompare(Extensible* ex, const std::string &data, const std::string &input, const std::string &hashtype);
 
        /** Check if a given server is a uline.
         * An empty string returns true, this is by design.
@@ -790,23 +811,6 @@ class CoreExport InspIRCd : public classbase
         */
        InspIRCd(int argc, char** argv);
 
-       /** Output a log message to the ircd.log file
-        * The text will only be output if the current loglevel
-        * is less than or equal to the level you provide
-        * @param level A log level from the DebugLevel enum
-        * @param text Format string of to write to the log
-        * @param ... Format arguments of text to write to the log
-        */
-       void Log(int level, const char* text, ...);
-
-       /** Output a log message to the ircd.log file
-        * The text will only be output if the current loglevel
-        * is less than or equal to the level you provide
-        * @param level A log level from the DebugLevel enum
-        * @param text Text to write to the log
-        */
-       void Log(int level, const std::string &text);
-
        /** Send a line of WHOIS data to a user.
         * @param user user to send the line to
         * @param dest user being WHOISed
@@ -822,7 +826,7 @@ class CoreExport InspIRCd : public classbase
         * @param format Format string for the numeric
         * @param ... Parameters for the format string
         */
-       void SendWhoisLine(User* user, User* dest, int numeric, const char* format, ...);
+       void SendWhoisLine(User* user, User* dest, int numeric, const char* format, ...) CUSTOM_PRINTF(5, 6);
 
        /** Quit a user for excess flood, and if they are not
         * fully registered yet, temporarily zline their IP.
@@ -871,6 +875,10 @@ class CoreExport InspIRCd : public classbase
         */
        void BufferedSocketCull();
 
+       /** Adds an extban char to the 005 token.
+        */
+       void AddExtBanChar(char c);
+
        char* GetReadBuffer()
        {
                return this->ReadBuffer;