* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
- * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
- * E-mail:
- * <brain@chatspike.net>
- * <Craig@chatspike.net>
- *
- * Written by Craig Edwards, Craig McLure, and others.
+ * InspIRCd: (C) 2002-2007 InspIRCd Development Team
+ * See: http://www.inspircd.org/wiki/index.php/Credits
+ *
* This program is free but copyrighted software; see
- * the file COPYING for details.
+ * the file COPYING for details.
*
* ---------------------------------------------------
*/
#include "command_parse.h"
#include "snomasks.h"
-/** Returned by some functions to indicate failure,
- * and the exit code of the program if it terminates.
+/** Returned by some functions to indicate failure.
*/
#define ERROR -1
-/** Crucial defines
+/** Support for librodent -
+ * see http://www.chatspike.net/index.php?z=64
*/
-#define ETIREDGERBILS EAGAIN
+#define ETIREDHAMSTERS EAGAIN
/** Debug levels for use with InspIRCd::Log()
*/
return tmp.str();
}
+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.
+ */
+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;
+}
+
/** This class contains various STATS counters
* It is used by the InspIRCd class, which internally
* has an instance of it.
*/
unsigned long BoundPortCount;
+ /** Cpu usage at last sample
+ */
+ timeval LastCPU;
+
+ /** Time last sample was read
+ */
+ timeval LastSampled;
+
/** The constructor initializes all the counts to zero
*/
serverstats()
/** A list of failed port bindings, used for informational purposes on startup */
typedef std::vector<std::pair<std::string, long> > FailedPortList;
+/** A list of ip addresses cross referenced against clone counts */
+typedef std::map<irc::string, unsigned int> clonemap;
+
class XLineManager;
/** The main class of the irc server.
int time_delta;
public:
+
+ /** Number of unregistered users online right now.
+ * (Unregistered means before USER/NICK/dns)
+ */
+ int unregistered_count;
+
/** List of server names we've seen.
*/
servernamelist servernames;
/** Client list, a hash_map containing all clients, local and remote
*/
- user_hash clientlist;
+ user_hash* clientlist;
/** Channel list, a hash_map containing all channels
*/
- chan_hash chanlist;
+ chan_hash* chanlist;
/** Local client list, a vector containing only local clients
*/
*/
std::vector<userrec*> all_opers;
- /** Whowas container, contains a map of vectors of users tracked by WHOWAS
- */
- irc::whowas::whowas_users whowas;
+ clonemap local_clones;
- /** Whowas container, contains a map of time_t to users tracked by WHOWAS
- */
- irc::whowas::whowas_users_fifo whowas_fifo;
+ clonemap global_clones;
/** DNS class, provides resolver facilities to the core and modules
*/
*/
int SetTimeDelta(int delta);
+ void AddLocalClone(userrec* user);
+
+ void AddGlobalClone(userrec* user);
+
+ /** Number of users with a certain mode set on them
+ */
+ int ModeCount(const char mode);
+
/** Get the time offset in seconds
* @return The current time delta (in seconds)
*/
*/
void OpenLog(char** argv, int argc);
+ void CloseLog();
+
/** Convert a user to a pseudoclient, disconnecting the real user
* @param user The user to convert
* @param message The quit message to display when exiting the user
/** Causes the server to exit immediately
* @param The exit code to give to the operating system
+ * (See the ExitStatus enum for valid values)
*/
static void Exit(int status);
/** Send an error notice to all local users, opered and unopered
* @param s The error string to send
*/
- void SendError(const char *s);
+ void SendError(const std::string &s);
/** For use with Module::Prioritize().
* When the return value of this function is returned from
*/
bool PublishInterface(const std::string &InterfaceName, Module* Mod);
+ /** Return a pair saying how many other modules are currently using the
+ * interfaces provided by module m.
+ * @param m The module to count usage for
+ * @return A pair, where the first value is the number of uses of the interface,
+ * and the second value is the interface name being used.
+ */
+ std::pair<int,std::string> GetInterfaceInstanceCount(Module* m);
+
+ /** Mark your module as using an interface.
+ * If you mark your module as using an interface, then that interface
+ * module may not unload until your module has unloaded first.
+ * This can be used to prevent crashes by ensuring code you depend on
+ * is always in memory while your module is active.
+ * @param InterfaceName The interface to use
+ */
+ void UseInterface(const std::string &InterfaceName);
+
+ /** Mark your module as finished with an interface.
+ * If you used UseInterface() above, you should use this method when
+ * your module is finished with the interface (usually in its destructor)
+ * to allow the modules which implement the given interface to be unloaded.
+ * @param InterfaceName The interface you are finished with using.
+ */
+ void DoneWithInterface(const std::string &InterfaceName);
+
/** Unpublish a 'feature'.
* When your module exits, it must call this method for every feature it
* is providing so that the feature table is cleaned up.
void SendWhoisLine(userrec* user, userrec* dest, int numeric, const char* format, ...);
+ /** Restart the server.
+ * This function will not return. If an error occurs,
+ * it will throw an instance of CoreException.
+ * @param reason The restart reason to show to all clients
+ * @throw CoreException An instance of CoreException indicating the error from execv().
+ */
+ void Restart(const std::string &reason);
+
+ /** Prepare the ircd for restart or shutdown.
+ * This function unloads all modules which can be unloaded,
+ * closes all open sockets, and closes the logfile.
+ */
+ void Cleanup();
+
+ /** This copies the user and channel hash_maps into new hash maps.
+ * This frees memory used by the hash_map allocator (which it neglects
+ * to free, most of the time, using tons of ram)
+ */
+ void RehashUsersAndChans();
+
/** Begin execution of the server.
* NOTE: this function NEVER returns. Internally,
* after performing some initialisation routines,