#include "socketengine.h"
#include "command_parse.h"
#include "snomasks.h"
+#include "cull_list.h"
/** Returned by some functions to indicate failure.
*/
};
/**
- * This define is used in place of strcmp when we
+ * 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.
x = NULL;
}
-/** Template function to convert any input type to std::string
+/** Template functions to convert any input type to std::string
*/
-template<typename T> inline std::string ConvToStr(const T &in)
+template<typename T> inline std::string ConvNumeric(const T &in)
+{
+ if (in == 0) return "0";
+ char res[MAXBUF];
+ char* out = res;
+ T quotient = in;
+ while (quotient) {
+ *out = "0123456789"[ std::abs( (long)quotient % 10 ) ];
+ ++out;
+ quotient /= 10;
+ }
+ if ( in < 0)
+ *out++ = '-';
+ *out = 0;
+ std::reverse(res,out);
+ return res;
+}
+
+inline std::string ConvToStr(const int in)
+{
+ return ConvNumeric(in);
+}
+
+inline std::string ConvToStr(const long in)
+{
+ return ConvNumeric(in);
+}
+
+inline std::string ConvToStr(const unsigned long in)
+{
+ return ConvNumeric(in);
+}
+
+inline std::string ConvToStr(const char* in)
+{
+ return in;
+}
+
+inline std::string ConvToStr(const bool in)
+{
+ return (in ? "1" : "0");
+}
+
+inline std::string ConvToStr(char in)
+{
+ return std::string(in,1);
+}
+
+template <class T> inline std::string ConvToStr(const T &in)
{
std::stringstream tmp;
if (!(tmp << in)) return std::string();
/** Holds a string describing the last module error to occur
*/
char MODERR[MAXBUF];
-
+
/** Remove a ModuleFactory pointer
* @param j Index number of the ModuleFactory to remove
*/
*/
void EraseModule(int j);
- /** Build the ISUPPORT string by triggering all modules On005Numeric events
- */
- void BuildISupport();
-
/** Move a given module to a specific slot in the list
* @param modulename The module name to relocate
* @param slot The slot to move the module into
public:
+ std::map<InspSocket*,InspSocket*> SocketCull;
+
+ /** Build the ISUPPORT string by triggering all modules On005Numeric events
+ */
+ void BuildISupport();
+
/** Number of unregistered users online right now.
* (Unregistered means before USER/NICK/dns)
*/
*/
time_t startup_time;
+ /** Config file pathname specified on the commandline or via ./configure
+ */
+ char ConfigFileName[MAXBUF];
+
/** Mode handler, handles mode setting and removal
*/
ModeParser* Modes;
*/
time_t next_call;
+ /** Global cull list, will be processed on next iteration
+ */
+ CullList GlobalCulls;
+
/** Get the current time
* Because this only calls time() once every time around the mainloop,
* it is much faster than calling time() directly.
/** Binds a socket on an already open file descriptor
* @param sockfd A valid file descriptor of an open socket
- * @param client A sockaddr to use as temporary storage
- * @param server A sockaddr to use as temporary storage
* @param port The port number to bind to
* @param addr The address to bind to (IP only)
* @return True if the port was bound successfully
*/
- bool BindSocket(int sockfd, insp_sockaddr client, insp_sockaddr server, int port, char* addr);
+ bool BindSocket(int sockfd, int port, char* addr, bool dolisten = true);
/** Adds a server name to the list of servers we've seen
* @param The servername to add
* @param text The text to send
*/
void WriteOpers(const std::string &text);
-
+
/** Find a nickname in the nick hash
* @param nick The nickname to find
* @return A pointer to the user, or NULL if the user does not exist
/** Send text to all users with a specific set of modes
* @param modes The modes to check against, without a +, e.g. 'og'
- * @param flags one of WM_OR or WM_AND. If you specify WM_OR, any one of the
+ * @param flags one of WM_OR or WM_AND. If you specify WM_OR, any one of the
* mode characters in the first parameter causes receipt of the message, and
* if you specify WM_OR, all the modes must be present.
* @param text The text format string to send
*/
static void Rehash(int status);
- /** Causes the server to exit immediately
+ /** 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);
+ /** Causes the server to exit immediately with exit code 0.
+ * The status code is required for signal handlers, and ignored.
+ */
+ static void QuickExit(int status);
+
/** Return a count of users, unknown and known connections
* @return The number of users
*/
* on if cached results are available and haven't expired. It is
* however safe to force this value to false, forcing a remote DNS
* lookup, but not an update of the cache.
- * @return True if the resolver was added
+ * @return True if the operation completed successfully. Note that
+ * if this method returns true, you should not attempt to access
+ * the resolver class you pass it after this call, as depending upon
+ * the request given, the object may be deleted!
*/
bool AddResolver(Resolver* r, bool cached);
bool DelELine(const std::string &hostmask);
/** Return true if the given parameter is a valid nick!user\@host mask
- * @param mask A nick!user\@host masak to match against
+ * @param mask A nick!user\@host masak to match against
* @return True i the mask is valid
*/
bool IsValidMask(const std::string &mask);
*/
bool ULine(const char* server);
+ /** Returns true if the uline is 'silent' (doesnt generate
+ * remote connect notices etc).
+ */
+ bool SilentULine(const char* server);
+
/** Returns the subversion revision ID of this ircd
* @return The revision ID or an empty string
*/
*/
void RehashUsersAndChans();
+ /** Resets the cached max bans value on all channels.
+ * Called by rehash.
+ */
+ void ResetMaxBans();
+
+ /** Return a time_t as a human-readable string.
+ */
+ std::string TimeString(time_t curtime);
+
/** Begin execution of the server.
* NOTE: this function NEVER returns. Internally,
* after performing some initialisation routines,