#include <map>
#include <bitset>
#include <set>
+#include <time.h>
#include "inspircd_config.h"
#include "inspircd_version.h"
#include "typedefs.h"
#include "socketengine.h"
#include "snomasks.h"
#include "filelogger.h"
-#include "caller.h"
#include "modules.h"
#include "threadengine.h"
#include "configreader.h"
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()
: statsAccept(0), statsRefused(0), statsUnknown(0), statsCollisions(0), statsDns(0),
- statsDnsGood(0), statsDnsBad(0), statsConnects(0), statsSent(0.0), statsRecv(0.0)
+ statsDnsGood(0), statsDnsBad(0), statsConnects(0), statsSent(0), statsRecv(0)
{
}
};
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&);
+DEFINE_HANDLER3(OnCheckExemptionHandler, ModResult, User*, Channel*, const std::string&);
/** The main class of the irc server.
* This class contains instances of all the other classes in this software.
/** 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
IsNickHandler HandleIsNick;
IsIdentHandler HandleIsIdent;
FloodQuitUserHandler HandleFloodQuitUser;
+ OnCheckExemptionHandler HandleOnCheckExemption;
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:
*/
std::string GetUID();
+ static const char LogHeader[];
+
/** Find a user in the UUID hash
* @param nick The nickname to find
* @return A pointer to the user, or NULL if the user does not exist
* 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
* @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
*/
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
/** Returns the full version string of this ircd
* @return The version string
*/
- std::string GetVersionString();
+ std::string GetVersionString(bool rawversion = false);
/** Attempt to write the process id to a given file
* @param filename The PID file to attempt to write to
*/
caller1<void, User*> FloodQuitUser;
+ /** Called to check whether a channel restriction mode applies to a user
+ * @param User that is attempting some action
+ * @param Channel that the action is being performed on
+ * @param Action name
+ */
+ caller3<ModResult, User*, Channel*, const std::string&> OnCheckExemption;
+
/** Restart the server.
* This function will not return. If an error occurs,
* it will throw an instance of CoreException.
public:
CommandModule() : cmd(this)
{
- ServerInstance->AddCommand(&cmd);
+ }
+
+ void init()
+ {
+ ServerInstance->Modules->AddService(cmd);
}
Version GetVersion()