#include "socketengine.h"
#include "command_parse.h"
#include "snomasks.h"
+#include "cull_list.h"
/** 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()
*/
};
/**
- * 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();
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.
/** 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
*/
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
*/
clonemap global_clones;
- /** Whowas container, contains a map of vectors of users tracked by WHOWAS
- */
- irc::whowas::whowas_users whowas;
-
- /** Whowas container, contains a map of time_t to users tracked by WHOWAS
- */
- irc::whowas::whowas_users_fifo whowas_fifo;
-
/** DNS class, provides resolver facilities to the core and modules
*/
DNS* Res;
*/
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.
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)
*/
/** 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
*/
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
/** 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
/** Add a dns Resolver class to this server's active set
* @param r The resolver to add
- * @return True if the resolver was added
- */
- bool AddResolver(Resolver* r);
+ * @param cached If this value is true, then the cache will
+ * be searched for the DNS result, immediately. If the value is
+ * false, then a request will be sent to the nameserver, and the
+ * result will not be immediately available. You should usually
+ * use the boolean value which you passed to the Resolver
+ * constructor, which Resolver will set appropriately depending
+ * 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 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);
/** Add a command to this server's command parser
* @param f A command_t command handler object to add
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);
*/
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();
+
+ /** Resets the cached max bans value on all channels.
+ * Called by rehash.
+ */
+ void ResetMaxBans();
+
/** Begin execution of the server.
* NOTE: this function NEVER returns. Internally,
* after performing some initialisation routines,