]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/inspircd.h
Floating-point math should have no place in an ircd
[user/henk/code/inspircd.git] / include / inspircd.h
index 9f7d07f5d1bec200d3b0c9410291d90960302371..16281f2cc8f2668f0d6cf63d1d44ddba3404cca3 100644 (file)
@@ -2,7 +2,7 @@
  *       | Inspire Internet Relay Chat Daemon |
  *       +------------------------------------+
  *
- *  InspIRCd: (C) 2002-2009 InspIRCd Development Team
+ *  InspIRCd: (C) 2002-2010 InspIRCd Development Team
  * See: http://wiki.inspircd.org/Credits
  *
  * This program is free but copyrighted software; see
@@ -26,7 +26,6 @@
 #else
 #include "inspircd_win32wrapper.h"
 /** Windows defines these already */
-#undef DELETE
 #undef ERROR
 #endif
 
 #include <map>
 #include <bitset>
 #include <set>
+#include <time.h>
+#include "inspircd_config.h"
+#include "inspircd_version.h"
+#include "typedefs.h"
 
-/** A list of failed port bindings, used for informational purposes on startup */
-typedef std::vector<std::pair<std::string, std::string> > FailedPortList;
-
-class InspIRCd;
 CoreExport extern InspIRCd* ServerInstance;
 
-#include "inspircd_config.h"
-#include "inspircd_version.h"
 #include "caller.h"
 #include "cull_list.h"
 #include "extensible.h"
@@ -71,7 +68,6 @@ CoreExport extern InspIRCd* ServerInstance;
 #include "channels.h"
 #include "timer.h"
 #include "hashcomp.h"
-#include "typedefs.h"
 #include "logger.h"
 #include "usermanager.h"
 #include "socket.h"
@@ -83,11 +79,10 @@ CoreExport extern InspIRCd* ServerInstance;
 #include "filelogger.h"
 #include "caller.h"
 #include "modules.h"
+#include "threadengine.h"
 #include "configreader.h"
 #include "inspstring.h"
 #include "protocol.h"
-#include "threadengine.h"
-#include "fakeuser.h"
 
 #ifndef PATH_MAX
 #warning Potentially broken system, PATH_MAX undefined
@@ -179,29 +174,7 @@ template<typename T> inline long ConvToInt(const T &in)
 {
        std::stringstream tmp;
        if (!(tmp << in)) return 0;
-       return atoi(tmp.str().c_str());
-}
-
-/** Template function to convert integer to char, storing result in *res and
- * also returning the pointer to res. Based on Stuart Lowe's C/C++ Pages.
- * @param T input value
- * @param V result value
- * @param R base to convert to
- */
-template<typename T, typename V, typename R> inline char* itoa(const T &in, V *res, R base)
-{
-       if (base < 2 || base > 16) { *res = 0; return res; }
-       char* out = res;
-       int quotient = in;
-       while (quotient) {
-               *out = "0123456789abcdef"[ std::abs( quotient % base ) ];
-               ++out;
-               quotient /= base;
-       }
-       if ( in < 0 && base == 10) *out++ = '-';
-       std::reverse( res, out );
-       *out = 0;
-       return res;
+       return atol(tmp.str().c_str());
 }
 
 /** This class contains various STATS counters
@@ -241,16 +214,16 @@ class serverstats
        unsigned long statsConnects;
        /** Total bytes of data transmitted
         */
-       double statsSent;
+       unsigned long statsSent;
        /** Total bytes of data received
         */
-       double statsRecv;
+       unsigned long statsRecv;
        /** Cpu usage at last sample
         */
        timeval LastCPU;
        /** Time last sample was read
         */
-       timeval LastSampled;
+       timespec LastSampled;
        /** The constructor initializes all the counts to zero
         */
        serverstats()
@@ -260,43 +233,14 @@ class serverstats
        }
 };
 
-class InspIRCd;
-
 DEFINE_HANDLER2(IsNickHandler, bool, const char*, size_t);
+DEFINE_HANDLER2(GenRandomHandler, void, char*, size_t);
 DEFINE_HANDLER1(IsIdentHandler, bool, const char*);
 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;
-
-/** The background thread for config reading, so that reading from executable includes
- * does not block.
- */
-class CoreExport ConfigReaderThread : public Thread
-{
-       ServerConfig* Config;
-       bool done;
- public:
-       std::string TheUserUID;
-       ConfigReaderThread(const std::string &useruid)
-               : Thread(), done(false), TheUserUID(useruid)
-       {
-       }
-
-       virtual ~ConfigReaderThread()
-       {
-       }
-
-       void Run();
-       /** Run in the main thread to apply the configuration */
-       void Finish();
-       bool IsDone() { return done; }
-};
-
 /** The main class of the irc server.
  * This class contains instances of all the other classes in this software.
  * Amongst other things, it contains a ModeParser, a DNS object, a CommandParser
@@ -336,19 +280,11 @@ class CoreExport InspIRCd
         * @param user The user to verify
         * @return True if all modules have finished checking this user
         */
-       bool AllModulesReportReady(User* user);
-
-       /** Logfile pathname specified on the commandline, or empty string
-        */
-       char LogFileName[MAXBUF];
+       bool AllModulesReportReady(LocalUser* user);
 
        /** The current time, updated in the mainloop
         */
-       time_t TIME;
-
-       /** The time that was recorded last time around the mainloop
-        */
-       time_t OLDTIME;
+       struct timespec TIME;
 
        /** A 64k buffer used to read socket data into
         * NOTE: update ValidateNetBufferSize if you change this
@@ -375,6 +311,7 @@ class CoreExport InspIRCd
        IsChannelHandler HandleIsChannel;
        IsSIDHandler HandleIsSID;
        RehashHandler HandleRehash;
+       GenRandomHandler HandleGenRandom;
 
        /** Globally accessible fake user record. This is used to force mode changes etc across s2s, etc.. bit ugly, but.. better than how this was done in 1.1
         * Reason for it:
@@ -485,7 +422,7 @@ class CoreExport InspIRCd
 
        /** List of the open ports
         */
-       std::vector<ListenSocketBase *> ports;
+       std::vector<ListenSocket*> ports;
 
        /** Set to the current signal recieved
         */
@@ -508,7 +445,25 @@ class CoreExport InspIRCd
         * it is much faster than calling time() directly.
         * @return The current time as an epoch value (time_t)
         */
-       time_t Time();
+       inline time_t Time() { return TIME.tv_sec; }
+       /** The fractional time at the start of this mainloop iteration (nanoseconds) */
+       inline long Time_ns() { return TIME.tv_nsec; }
+       /** Update the current time. Don't call this unless you have reason to do so. */
+       void UpdateTime();
+
+       /** Generate a random string with the given length
+        * @param length The length in bytes
+        * @param printable if false, the string will use characters 0-255; otherwise,
+        * it will be limited to 0x30-0x7E ('0'-'~', nonspace printable characters)
+        */
+       std::string GenRandomStr(int length, bool printable = true);
+       /** Generate a random integer.
+        * This is generally more secure than rand()
+        */
+       unsigned long GenRandomInt(unsigned long max);
+
+       /** Fill a buffer with random bits */
+       caller2<void, char*, size_t> GenRandom;
 
        /** Bind all ports specified in the configuration file.
         * @return The number of ports bound without error
@@ -660,7 +615,10 @@ class CoreExport InspIRCd
         * @param f A Command command handler object to add
         * @throw ModuleException Will throw ModuleExcption if the command already exists
         */
-       void AddCommand(Command *f);
+       inline void AddCommand(Command *f)
+       {
+               Modules->AddService(*f);
+       }
 
        /** Send a modechange.
         * The parameters provided are identical to that sent to the
@@ -670,6 +628,14 @@ class CoreExport InspIRCd
         */
        void SendMode(const std::vector<std::string>& parameters, User *user);
 
+       /** Send a modechange and route it to the network.
+        * The parameters provided are identical to that sent to the
+        * handler for class cmd_mode.
+        * @param parameters The mode parameters
+        * @param user The user to send error messages to
+        */
+       void SendGlobalMode(const std::vector<std::string>& parameters, User *user);
+
        /** Match two strings using pattern matching, optionally, with a map
         * to check case against (may be NULL). If map is null, match will be case insensitive.
         * @param str The literal string to match against
@@ -714,25 +680,6 @@ class CoreExport InspIRCd
         */
        void RehashServer();
 
-       /** Dump text to a user target, splitting it appropriately to fit
-        * @param User the user to dump the text to
-        * @param LinePrefix text to prefix each complete line with
-        * @param TextStream the text to send to the user
-        */
-       void DumpText(User* user, const std::string &LinePrefix, std::stringstream &TextStream);
-
-       /** Dump text to a user target (local or remote)
-        * @param user the user to dump the text to
-        * @param text the full line of text
-        */
-       void DumpText(User* user, const std::string &text);
-
-       /** Dump text to a user target (local or remote)
-        * @param user the user to dump the text to
-        * @param format the printf format string for the text to send
-        */
-       void DumpText(User* user, const char* format, ...) CUSTOM_PRINTF(3, 4);
-
        /** Check if the given nickmask matches too many users, send errors to the given user
         * @param nick A nickmask to match against
         * @param user A user to send error text to
@@ -784,11 +731,6 @@ class CoreExport InspIRCd
         */
        bool SilentULine(const std::string& server);
 
-       /** Returns the subversion revision ID of this ircd
-        * @return The revision ID or an empty string
-        */
-       std::string GetRevision();
-
        /** Returns the full version string of this ircd
         * @return The version string
         */
@@ -895,12 +837,16 @@ class CommandModule : public Module
  public:
        CommandModule() : cmd(this)
        {
-               ServerInstance->AddCommand(&cmd);
+       }
+
+       void init()
+       {
+               ServerInstance->Modules->AddService(cmd);
        }
 
        Version GetVersion()
        {
-               return Version(cmd.command, VF_VENDOR|VF_CORE);
+               return Version(cmd.name, VF_VENDOR|VF_CORE);
        }
 };