#include <string>
#include <sstream>
#include "inspircd_config.h"
+#include "uid.h"
#include "users.h"
#include "channels.h"
#include "socket.h"
#include "command_parse.h"
#include "snomasks.h"
#include "cull_list.h"
+#include "filelogger.h"
+#include "caller.h"
+
+/**
+ * Used to define the maximum number of parameters a command may have.
+ */
+#define MAXPARAMETERS 127
/** Returned by some functions to indicate failure.
*/
*/
#define ETIREDHAMSTERS EAGAIN
-/** Debug levels for use with InspIRCd::Log()
- */
-enum DebugLevel
-{
- DEBUG = 10,
- VERBOSE = 20,
- DEFAULT = 30,
- SPARSE = 40,
- NONE = 50
-};
-
-/**
- * This define is used in place of strcmp when we
- * want to check if a char* string contains only one
- * letter. Pretty fast, its just two compares and an
- * addition.
- */
-#define IS_SINGLE(x,y) ( (*x == y) && (*(x+1) == 0) )
-
/** Delete a pointer, and NULL its value
*/
template<typename T> inline void DELETE(T* x)
}
};
-/* Forward declaration -- required */
-class InspIRCd;
-
-/** This class implements a nonblocking log-writer.
- * Most people writing an ircd give little thought to their disk
- * i/o. On a congested system, disk writes can block for long
- * periods of time (e.g. if the system is busy and/or swapping
- * a lot). If we just use a blocking fprintf() call, this could
- * block for undesirable amounts of time (half of a second through
- * to whole seconds). We DO NOT want this, so we make our logfile
- * nonblocking and hook it into the SocketEngine.
- * NB: If the operating system does not support nonblocking file
- * I/O (linux seems to, as does freebsd) this will default to
- * blocking behaviour.
- */
-class CoreExport FileLogger : public EventHandler
-{
- protected:
- /** The creator/owner of this object
- */
- InspIRCd* ServerInstance;
- /** The log file (fd is inside this somewhere,
- * we get it out with fileno())
- */
- FILE* log;
- /** Buffer of pending log lines to be written
- */
- std::string buffer;
- /** Number of write operations that have occured
- */
- int writeops;
- public:
- /** The constructor takes an already opened logfile.
- */
- FileLogger(InspIRCd* Instance, FILE* logfile);
- /** This returns false, logfiles are writeable.
- */
- virtual bool Readable();
- /** Handle pending write events.
- * This will flush any waiting data to disk.
- * If any data remains after the fprintf call,
- * another write event is scheduled to write
- * the rest of the data when possible.
- */
- virtual void HandleEvent(EventType et, int errornum = 0);
- /** Write one or more preformatted log lines.
- * If the data cannot be written immediately,
- * this class will insert itself into the
- * SocketEngine, and register a write event,
- * and when the write event occurs it will
- * attempt again to write the data.
- */
- void WriteLogLine(const std::string &line);
- /** Close the log file and cancel any events.
- */
- virtual void Close();
- /** Close the log file and cancel any events.
- * (indirectly call Close()
- */
- virtual ~FileLogger();
-};
-
/** 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 InspIRCd;
+
+DEFINE_HANDLER1(ProcessUserHandler, void, userrec*);
+DEFINE_HANDLER1(IsNickHandler, bool, const char*);
+DEFINE_HANDLER1(IsIdentHandler, bool, const char*);
+DEFINE_HANDLER1(FindDescriptorHandler, userrec*, int);
+DEFINE_HANDLER1(FloodQuitUserHandler, void, userrec*);
+
/* Forward declaration - required */
class XLineManager;
class CoreExport InspIRCd : public classbase
{
private:
+ /** Holds the current UID. Used to generate the next one.
+ */
+ char current_uid[UUID_LENGTH];
+
/** Holds a string describing the last module error to occur
*/
char MODERR[MAXBUF];
*/
void MoveTo(std::string modulename,int slot);
- /** Display the startup banner
- */
- void Start();
-
/** Set up the signal handlers
*/
void SetSignals();
*/
int time_delta;
+#ifdef WIN32
+ IPC* WindowsIPC;
+#endif
+
public:
+ /** Global cull list, will be processed on next iteration
+ */
+ CullList GlobalCulls;
+
+
+ /**** Functors ****/
+
+ ProcessUserHandler HandleProcessUser;
+ IsNickHandler HandleIsNick;
+ IsIdentHandler HandleIsIdent;
+ FindDescriptorHandler HandleFindDescriptor;
+ FloodQuitUserHandler HandleFloodQuitUser;
+
/** InspSocket classes pending deletion after being closed.
* We don't delete these immediately as this may cause a segmentation fault.
*/
std::map<InspSocket*,InspSocket*> SocketCull;
+ /** Returns the next available UID for this server.
+ */
+ std::string GetUID();
+
+ /** 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
+ */
+ userrec *FindUUID(const std::string &);
+
+ /** 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
+ */
+ userrec *FindUUID(const char *);
+
/** Build the ISUPPORT string by triggering all modules On005Numeric events
*/
void BuildISupport();
*/
user_hash* clientlist;
+ /** Client list stored by UUID. Contains all clients, and is updated
+ * automatically by the constructor and destructor of userrec.
+ */
+ user_hash* uuidlist;
+
/** Channel list, a hash_map containing all channels
*/
chan_hash* chanlist;
*/
time_t next_call;
- /** Global cull list, will be processed on next iteration
+ /** Set to the current signal recieved
*/
- CullList GlobalCulls;
+ int s_signal;
/** Get the current time
* Because this only calls time() once every time around the mainloop,
* @return There is no actual return value, however upon exit, the user 'cu' may have been
* marked for deletion in the global CullList.
*/
- void ProcessUser(userrec* cu);
+ caller1<void, userrec*> ProcessUser;
/** Get the total number of currently loaded modules
* @return The number of loaded modules
*/
void WriteOpers(const std::string &text);
- /** Find a nickname in the nick hash
+ /** Find a user in the nick hash.
+ * If the user cant be found in the nick hash check the uuid hash
* @param nick The nickname to find
* @return A pointer to the user, or NULL if the user does not exist
*/
userrec* FindNick(const std::string &nick);
- /** Find a nickname in the nick hash
+ /** Find a user in the nick hash.
+ * If the user cant be found in the nick hash check the uuid hash
* @param nick The nickname to find
* @return A pointer to the user, or NULL if the user does not exist
*/
userrec* FindNick(const char* nick);
+ /** Find a user in the nick hash ONLY
+ */
+ userrec* FindNickOnly(const char* nick);
+
+ /** Find a user in the nick hash ONLY
+ */
+ userrec* FindNickOnly(const std::string &nick);
+
/** Find a channel in the channels hash
* @param chan The channel to find
* @return A pointer to the channel, or NULL if the channel does not exist
/** Determine the right path for, and open, the logfile
* @param argv The argv passed to main() initially, used to calculate program path
* @param argc The argc passed to main() initially, used to calculate program path
+ * @return True if the log could be opened, false if otherwise
*/
- void OpenLog(char** argv, int argc);
+ bool OpenLog(char** argv, int argc);
/** Close the currently open log file
*/
bool IsChannel(const char *chname);
/** Rehash the local server
- * @param status This value is unused, and required for signal handler functions
*/
- static void Rehash(int status);
+ void Rehash();
+
+ /** Handles incoming signals after being set
+ * @param signal the signal recieved
+ */
+ void SignalHandler(int signal);
+
+ /** Sets the signal recieved
+ * @param signal the signal recieved
+ */
+ static void SetSignal(int signal);
/** Causes the server to exit after unloading modules and
* closing all open file descriptors.
* @param The exit code to give to the operating system
* (See the ExitStatus enum for valid values)
*/
- static void Exit(int status);
+ void Exit(int status);
/** Causes the server to exit immediately with exit code 0.
* The status code is required for signal handlers, and ignored.
* @param n A nickname to verify
* @return True if the nick is valid
*/
- bool IsNick(const char* n);
+ caller1<bool, const char*> IsNick;
/** Return true if an ident is valid
* @param An ident to verify
* @return True if the ident is valid
*/
- bool IsIdent(const char* n);
+ caller1<bool, const char*> IsIdent;
/** Find a username by their file descriptor.
* It is preferred to use this over directly accessing the fd_ref_table array.
* @param socket The file descriptor of a user
* @return A pointer to the user if the user exists locally on this descriptor
*/
- userrec* FindDescriptor(int socket);
+ caller1<userrec*, int> FindDescriptor;
/** Add a new mode to this server's mode parser
* @param mh The modehandler to add
* fully registered yet, temporarily zline their IP.
* @param current user to quit
*/
- void FloodQuitUser(userrec* current);
+ caller1<void, userrec*> FloodQuitUser;
/** Restart the server.
* This function will not return. If an error occurs,
* @return The return value for this function is undefined.
*/
int Run();
+
+ /** Force all InspSockets to be removed which are due to
+ * be culled.
+ */
+ void InspSocketCull();
+
+ char* GetReadBuffer()
+ {
+ return this->ReadBuffer;
+ }
};
#endif