2007-07-16 17:30:04 +00:00
/* +------------------------------------+
* | Inspire Internet Relay Chat Daemon |
* + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
*
2010-01-11 03:07:32 +00:00
* InspIRCd : ( C ) 2002 - 2010 InspIRCd Development Team
2009-03-15 12:42:35 +00:00
* See : http : //wiki.inspircd.org/Credits
2007-07-16 17:30:04 +00:00
*
* This program is free but copyrighted software ; see
* the file COPYING for details .
*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
# ifndef __INSPIRCD_H__
# define __INSPIRCD_H__
2009-02-06 23:48:25 +00:00
# define _FILE_OFFSET_BITS 64
# ifndef _LARGEFILE_SOURCE
# define _LARGEFILE_SOURCE
2009-02-14 21:14:36 +00:00
# endif
2009-02-06 23:48:25 +00:00
2007-07-16 17:30:04 +00:00
# ifndef WIN32
2008-06-12 21:00:48 +00:00
# define DllExport
# define CoreExport
2007-07-16 17:30:04 +00:00
# define printf_c printf
# else
# include "inspircd_win32wrapper.h"
/** Windows defines these already */
# undef ERROR
# endif
2008-03-30 02:48:54 +00:00
# ifdef __GNUC__
# define CUSTOM_PRINTF(STRING, FIRST) __attribute__((format(printf, STRING, FIRST)))
# else
# define CUSTOM_PRINTF(STRING, FIRST)
# endif
2008-02-02 20:55:16 +00:00
// Required system headers.
2008-06-12 21:04:10 +00:00
# include <ctime>
# include <cstdarg>
2008-06-12 19:29:42 +00:00
# include <algorithm>
# include <cmath>
2008-06-12 21:04:10 +00:00
# include <cstring>
2008-07-01 18:04:35 +00:00
# include <climits>
2009-03-25 05:08:58 +00:00
# include <cstdio>
2008-07-20 08:53:56 +00:00
# include <sstream>
2008-07-19 21:56:01 +00:00
# include <string>
2008-07-19 20:34:14 +00:00
# include <vector>
2008-12-28 03:27:28 +00:00
# include <list>
2008-07-19 20:34:14 +00:00
# include <deque>
# include <map>
# include <bitset>
2008-10-18 16:52:46 +00:00
# include <set>
2010-01-18 19:36:41 +00:00
# include <time.h>
2009-10-24 20:03:53 +00:00
# include "inspircd_config.h"
# include "inspircd_version.h"
# include "typedefs.h"
2008-07-19 20:34:14 +00:00
2009-10-11 15:23:33 +00:00
CoreExport extern InspIRCd * ServerInstance ;
2009-09-13 20:32:27 +00:00
2009-10-14 22:12:55 +00:00
# include "caller.h"
# include "cull_list.h"
2009-09-13 20:30:25 +00:00
# include "extensible.h"
2008-07-13 19:01:17 +00:00
# include "numerics.h"
2007-08-26 23:07:06 +00:00
# include "uid.h"
2007-07-16 17:30:04 +00:00
# include "users.h"
# include "channels.h"
2008-02-03 23:20:20 +00:00
# include "timer.h"
2008-02-02 20:55:16 +00:00
# include "hashcomp.h"
2008-02-09 11:35:27 +00:00
# include "logger.h"
2008-02-02 20:55:16 +00:00
# include "usermanager.h"
2007-07-16 17:30:04 +00:00
# include "socket.h"
2008-02-03 23:20:20 +00:00
# include "ctables.h"
# include "command_parse.h"
2007-07-16 17:30:04 +00:00
# include "mode.h"
# include "socketengine.h"
# include "snomasks.h"
2007-07-25 11:53:07 +00:00
# include "filelogger.h"
2007-07-25 16:58:56 +00:00
# include "caller.h"
2008-02-03 23:20:20 +00:00
# include "modules.h"
2009-10-25 15:21:45 +00:00
# include "threadengine.h"
2008-02-03 23:20:20 +00:00
# include "configreader.h"
# include "inspstring.h"
2008-04-04 12:30:38 +00:00
# include "protocol.h"
2008-07-12 21:49:45 +00:00
2008-06-15 11:57:01 +00:00
# ifndef PATH_MAX
2008-07-11 15:37:31 +00:00
# warning Potentially broken system, PATH_MAX undefined
2008-06-15 11:57:01 +00:00
# define PATH_MAX 4096
# endif
2007-07-24 20:21:29 +00:00
/**
* Used to define the maximum number of parameters a command may have .
*/
# define MAXPARAMETERS 127
2007-07-16 17:30:04 +00:00
/** Returned by some functions to indicate failure.
*/
# define ERROR -1
/** Support for librodent -
* see http : //www.chatspike.net/index.php?z=64
*/
# define ETIREDHAMSTERS EAGAIN
/** Template function to convert any input type to std::string
*/
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 ;
}
2007-10-23 19:28:41 +00:00
if ( in < 0 )
2007-07-16 17:30:04 +00:00
* out + + = ' - ' ;
* out = 0 ;
std : : reverse ( res , out ) ;
return res ;
}
/** Template function to convert any input type to std::string
*/
inline std : : string ConvToStr ( const int in )
{
return ConvNumeric ( in ) ;
}
/** Template function to convert any input type to std::string
*/
inline std : : string ConvToStr ( const long in )
{
return ConvNumeric ( in ) ;
}
/** Template function to convert any input type to std::string
*/
inline std : : string ConvToStr ( const char * in )
{
return in ;
}
/** Template function to convert any input type to std::string
*/
inline std : : string ConvToStr ( const bool in )
{
return ( in ? " 1 " : " 0 " ) ;
}
/** Template function to convert any input type to std::string
*/
inline std : : string ConvToStr ( char in )
{
return std : : string ( in , 1 ) ;
}
/** Template function to convert any input type to std::string
*/
template < class T > inline std : : string ConvToStr ( const T & in )
{
std : : stringstream tmp ;
if ( ! ( tmp < < in ) ) return std : : string ( ) ;
return tmp . str ( ) ;
}
/** Template function to convert any input type to any other type
* ( usually an integer or numeric type )
*/
template < typename T > inline long ConvToInt ( const T & in )
{
std : : stringstream tmp ;
if ( ! ( tmp < < in ) ) return 0 ;
2009-10-21 23:44:27 +00:00
return atol ( tmp . str ( ) . c_str ( ) ) ;
2007-07-16 17:30:04 +00:00
}
/** This class contains various STATS counters
* It is used by the InspIRCd class , which internally
* has an instance of it .
*/
2009-10-18 16:18:44 +00:00
class serverstats
2007-07-16 17:30:04 +00:00
{
public :
/** Number of accepted connections
*/
unsigned long statsAccept ;
/** Number of failed accepts
*/
unsigned long statsRefused ;
/** Number of unknown commands seen
*/
unsigned long statsUnknown ;
/** Number of nickname collisions handled
*/
unsigned long statsCollisions ;
/** Number of DNS queries sent out
*/
unsigned long statsDns ;
/** Number of good DNS replies received
* NOTE : This may not tally to the number sent out ,
* due to timeouts and other latency issues .
*/
unsigned long statsDnsGood ;
/** Number of bad (negative) DNS replies received
* NOTE : This may not tally to the number sent out ,
* due to timeouts and other latency issues .
*/
unsigned long statsDnsBad ;
/** Number of inbound connections seen
*/
unsigned long statsConnects ;
/** Total bytes of data transmitted
*/
double statsSent ;
/** Total bytes of data received
*/
double statsRecv ;
/** Cpu usage at last sample
*/
timeval LastCPU ;
/** Time last sample was read
*/
2010-01-18 19:36:41 +00:00
timespec LastSampled ;
2007-07-16 17:30:04 +00:00
/** 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 )
{
}
} ;
2008-05-25 17:30:43 +00:00
DEFINE_HANDLER2 ( IsNickHandler , bool , const char * , size_t ) ;
2010-02-09 02:22:27 +00:00
DEFINE_HANDLER2 ( GenRandomHandler , void , char * , size_t ) ;
2007-07-25 17:36:13 +00:00
DEFINE_HANDLER1 ( IsIdentHandler , bool , const char * ) ;
2007-10-15 20:59:05 +00:00
DEFINE_HANDLER1 ( FloodQuitUserHandler , void , User * ) ;
2008-05-25 17:30:43 +00:00
DEFINE_HANDLER2 ( IsChannelHandler , bool , const char * , size_t ) ;
2008-04-13 03:28:56 +00:00
DEFINE_HANDLER1 ( IsSIDHandler , bool , const std : : string & ) ;
DEFINE_HANDLER1 ( RehashHandler , void , const std : : string & ) ;
2007-07-25 16:58:56 +00:00
2007-07-16 17:30:04 +00:00
/** The main class of the irc server.
2009-10-18 16:18:44 +00:00
* This class contains instances of all the other classes in this software .
* Amongst other things , it contains a ModeParser , a DNS object , a CommandParser
* object , and a list of active Module objects , and facilities for Module
* objects to interact with the core system it implements .
2007-07-16 17:30:04 +00:00
*/
2009-10-18 16:18:44 +00:00
class CoreExport InspIRCd
2007-07-16 17:30:04 +00:00
{
private :
2007-08-26 23:07:06 +00:00
/** Holds the current UID. Used to generate the next one.
*/
2008-04-02 08:54:43 +00:00
char current_uid [ UUID_LENGTH ] ;
2007-08-26 23:07:06 +00:00
2007-07-16 17:30:04 +00:00
/** Set up the signal handlers
*/
void SetSignals ( ) ;
/** Daemonize the ircd and close standard input/output streams
* @ return True if the program daemonized succesfully
*/
bool DaemonSeed ( ) ;
2007-10-15 21:04:32 +00:00
/** Iterate the list of BufferedSocket objects, removing ones which have timed out
2007-07-16 17:30:04 +00:00
* @ param TIME the current time
*/
void DoSocketTimeouts ( time_t TIME ) ;
2008-04-02 11:48:54 +00:00
/** Increments the current UID by one.
2007-08-31 19:37:22 +00:00
*/
2008-04-02 11:48:54 +00:00
void IncrementUID ( int pos ) ;
2007-08-31 19:37:22 +00:00
2007-07-16 17:30:04 +00:00
/** Perform background user events such as PING checks
*/
2007-10-21 12:22:39 +00:00
void DoBackgroundUserStuff ( ) ;
2007-07-16 17:30:04 +00:00
/** Returns true when all modules have done pre-registration checks on a user
* @ param user The user to verify
* @ return True if all modules have finished checking this user
*/
2009-10-21 23:45:19 +00:00
bool AllModulesReportReady ( LocalUser * user ) ;
2007-07-16 17:30:04 +00:00
/** The current time, updated in the mainloop
*/
2010-01-18 19:36:41 +00:00
struct timespec TIME ;
2007-07-16 17:30:04 +00:00
2008-07-20 09:15:01 +00:00
/** A 64k buffer used to read socket data into
* NOTE : update ValidateNetBufferSize if you change this
2007-07-16 17:30:04 +00:00
*/
char ReadBuffer [ 65535 ] ;
2007-07-27 16:45:03 +00:00
# ifdef WIN32
IPC * WindowsIPC ;
# endif
2007-07-16 17:30:04 +00:00
public :
2007-07-25 16:58:56 +00:00
/** Global cull list, will be processed on next iteration
*/
CullList GlobalCulls ;
2009-10-14 22:12:55 +00:00
/** Actions that must happen outside of the current call stack */
ActionList AtomicActions ;
2007-07-25 16:58:56 +00:00
/**** Functors ****/
2007-07-25 17:21:30 +00:00
IsNickHandler HandleIsNick ;
IsIdentHandler HandleIsIdent ;
2007-07-26 16:36:37 +00:00
FloodQuitUserHandler HandleFloodQuitUser ;
2008-04-13 03:28:56 +00:00
IsChannelHandler HandleIsChannel ;
IsSIDHandler HandleIsSID ;
RehashHandler HandleRehash ;
2010-02-09 02:22:27 +00:00
GenRandomHandler HandleGenRandom ;
2007-07-25 16:58:56 +00:00
2007-08-28 13:23:47 +00:00
/** 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
2007-08-28 13:50:04 +00:00
* Reason for it :
* kludge alert !
2007-10-15 20:59:05 +00:00
* SendMode expects a User * to send the numeric replies
2007-08-28 13:50:04 +00:00
* back to , so we create it a fake user that isnt in the user
* hash and set its descriptor to FD_MAGIC_NUMBER so the data
* falls into the abyss : p
2007-08-28 13:23:47 +00:00
*/
2009-05-13 05:27:39 +00:00
FakeUser * FakeClient ;
2007-08-28 13:23:47 +00:00
2007-08-26 23:07:06 +00:00
/** Returns the next available UID for this server.
*/
std : : string GetUID ( ) ;
2007-08-27 01:01:20 +00:00
/** 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
*/
2008-11-22 16:54:32 +00:00
User * FindUUID ( const std : : string & ) ;
2007-08-27 01:01:20 +00:00
/** 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
*/
2008-11-22 16:54:32 +00:00
User * FindUUID ( const char * ) ;
2007-08-27 01:01:20 +00:00
2007-07-16 17:30:04 +00:00
/** Build the ISUPPORT string by triggering all modules On005Numeric events
*/
void BuildISupport ( ) ;
/** Time this ircd was booted
*/
time_t startup_time ;
/** Config file pathname specified on the commandline or via ./configure
*/
2009-09-24 01:44:29 +00:00
std : : string ConfigFileName ;
2007-07-16 17:30:04 +00:00
2009-10-14 18:39:38 +00:00
ExtensionManager Extensions ;
2007-07-16 17:30:04 +00:00
/** Mode handler, handles mode setting and removal
*/
ModeParser * Modes ;
/** Command parser, handles client to server commands
*/
CommandParser * Parser ;
/** Socket engine, handles socket activity events
*/
SocketEngine * SE ;
2008-02-09 11:43:25 +00:00
2008-02-24 14:09:02 +00:00
/** Thread engine, Handles threading where required
*/
ThreadEngine * Threads ;
/** The thread/class used to read config files in REHASH and on startup
*/
ConfigReaderThread * ConfigThread ;
2008-02-09 11:43:25 +00:00
/** LogManager handles logging.
*/
LogManager * Logs ;
2008-06-12 21:00:48 +00:00
2007-08-28 23:32:41 +00:00
/** ModuleManager contains everything related to loading/unloading
* modules .
*/
ModuleManager * Modules ;
2007-07-16 17:30:04 +00:00
2007-11-04 13:23:15 +00:00
/** BanCacheManager is used to speed up checking of restrictions on connection
* to the IRCd .
*/
BanCacheManager * BanCache ;
2007-07-16 17:30:04 +00:00
/** Stats class, holds miscellaneous stats counters
*/
serverstats * stats ;
/** Server Config class, holds configuration file data
*/
ServerConfig * Config ;
/** Snomask manager - handles routing of snomask messages
* to opers .
*/
SnomaskManager * SNO ;
/** DNS class, provides resolver facilities to the core and modules
*/
DNS * Res ;
2007-10-15 21:03:30 +00:00
/** Timer manager class, triggers Timer timer events
2007-07-16 17:30:04 +00:00
*/
TimerManager * Timers ;
/** X-Line manager. Handles G/K/Q/E line setting, removal and matching
*/
XLineManager * XLines ;
2008-01-13 03:37:25 +00:00
/** User manager. Various methods and data associated with users.
*/
UserManager * Users ;
2008-02-02 20:55:16 +00:00
/** Channel list, a hash_map containing all channels XXX move to channel manager class
*/
chan_hash * chanlist ;
2009-07-01 22:55:39 +00:00
/** List of the open ports
*/
2009-10-21 23:46:33 +00:00
std : : vector < ListenSocket * > ports ;
2009-07-01 22:55:39 +00:00
2007-07-25 19:46:25 +00:00
/** Set to the current signal recieved
*/
int s_signal ;
2008-04-04 12:30:38 +00:00
/** Protocol interface, overridden by server protocol modules
*/
ProtocolInterface * PI ;
2009-10-11 18:03:17 +00:00
/** Holds extensible for user nickforced
*/
LocalIntExt NICKForced ;
/** Holds extensible for user operquit
*/
LocalStringExt OperQuit ;
2007-07-16 17:30:04 +00:00
/** Get the current time
* Because this only calls time ( ) once every time around the mainloop ,
* it is much faster than calling time ( ) directly .
* @ return The current time as an epoch value ( time_t )
*/
2010-01-18 19:36:41 +00:00
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 ( ) ;
2007-07-16 17:30:04 +00:00
2010-02-09 02:22:27 +00:00
/** 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 ;
2007-07-16 17:30:04 +00:00
/** Bind all ports specified in the configuration file.
2009-07-01 22:55:46 +00:00
* @ return The number of ports bound without error
2007-07-16 17:30:04 +00:00
*/
2009-07-01 22:55:46 +00:00
int BindPorts ( FailedPortList & failed_ports ) ;
2007-07-16 17:30:04 +00:00
/** Binds a socket on an already open file descriptor
* @ param sockfd A valid file descriptor of an open socket
* @ 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
*/
2008-02-13 18:22:19 +00:00
bool BindSocket ( int sockfd , int port , const char * addr , bool dolisten = true ) ;
2007-07-16 17:30:04 +00:00
/** Gets the GECOS (description) field of the given server.
* If the servername is not that of the local server , the name
* is passed to handling modules which will attempt to determine
* the GECOS that bleongs to the given servername .
* @ param servername The servername to find the description of
* @ return The description of this server , or of the local server
*/
2009-10-02 03:15:46 +00:00
std : : string GetServerDescription ( const std : : string & servername ) ;
2007-07-16 17:30:04 +00:00
2007-08-27 13:54:15 +00:00
/** Find a user in the nick hash.
* If the user cant be found in the nick hash check the uuid hash
2007-07-16 17:30:04 +00:00
* @ param nick The nickname to find
* @ return A pointer to the user , or NULL if the user does not exist
*/
2007-10-15 20:59:05 +00:00
User * FindNick ( const std : : string & nick ) ;
2007-07-16 17:30:04 +00:00
2007-08-27 13:54:15 +00:00
/** Find a user in the nick hash.
* If the user cant be found in the nick hash check the uuid hash
2007-07-16 17:30:04 +00:00
* @ param nick The nickname to find
* @ return A pointer to the user , or NULL if the user does not exist
*/
2007-10-15 20:59:05 +00:00
User * FindNick ( const char * nick ) ;
2007-07-16 17:30:04 +00:00
2007-08-27 13:54:15 +00:00
/** Find a user in the nick hash ONLY
*/
2007-10-15 20:59:05 +00:00
User * FindNickOnly ( const char * nick ) ;
2007-08-27 13:54:15 +00:00
/** Find a user in the nick hash ONLY
*/
2007-10-15 20:59:05 +00:00
User * FindNickOnly ( const std : : string & nick ) ;
2007-08-27 13:54:15 +00:00
2007-07-16 17:30:04 +00:00
/** 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
*/
2007-10-15 20:59:05 +00:00
Channel * FindChan ( const std : : string & chan ) ;
2007-07-16 17:30:04 +00:00
/** 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
*/
2007-10-15 20:59:05 +00:00
Channel * FindChan ( const char * chan ) ;
2007-07-16 17:30:04 +00:00
/** Check we aren't running as root, and exit if we are
* @ return Depending on the configuration , this function may never return
*/
void CheckRoot ( ) ;
/** 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
2007-08-23 19:57:02 +00:00
* @ return True if the log could be opened , false if otherwise
2007-07-16 17:30:04 +00:00
*/
2007-08-23 19:57:02 +00:00
bool OpenLog ( char * * argv , int argc ) ;
2007-07-16 17:30:04 +00:00
/** Return true if a channel name is valid
* @ param chname A channel name to verify
* @ return True if the name is valid
*/
2008-05-25 17:30:43 +00:00
caller2 < bool , const char * , size_t > IsChannel ;
2007-07-16 17:30:04 +00:00
2008-01-16 21:36:07 +00:00
/** Return true if str looks like a server ID
* @ param string to check against
*/
2008-04-13 03:28:56 +00:00
caller1 < bool , const std : : string & > IsSID ;
2008-01-16 21:36:07 +00:00
2007-07-16 17:30:04 +00:00
/** Rehash the local server
*/
2008-04-13 03:28:56 +00:00
caller1 < void , const std : : string & > Rehash ;
2007-07-25 19:46:25 +00:00
/** Handles incoming signals after being set
* @ param signal the signal recieved
*/
void SignalHandler ( int signal ) ;
2008-06-12 21:00:48 +00:00
/** Sets the signal recieved
2007-07-25 19:46:25 +00:00
* @ param signal the signal recieved
*/
static void SetSignal ( int signal ) ;
2007-07-16 17:30:04 +00:00
/** 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 )
*/
2007-07-25 20:23:18 +00:00
void Exit ( int status ) ;
2007-07-16 17:30:04 +00:00
/** 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 channels on the network
* @ return The number of channels
*/
long ChannelCount ( ) ;
/** Send an error notice to all local users, opered and unopered
* @ param s The error string to send
*/
void SendError ( const std : : string & s ) ;
/** Return true if a nickname is valid
* @ param n A nickname to verify
* @ return True if the nick is valid
*/
2008-05-25 17:30:43 +00:00
caller2 < bool , const char * , size_t > IsNick ;
2007-07-16 17:30:04 +00:00
/** Return true if an ident is valid
* @ param An ident to verify
* @ return True if the ident is valid
*/
2007-07-25 17:21:30 +00:00
caller1 < bool , const char * > IsIdent ;
2007-07-16 17:30:04 +00:00
/** Add a dns Resolver class to this server's active set
* @ param r The resolver to add
* @ 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
2007-10-15 20:55:55 +00:00
* @ param f A Command command handler object to add
2007-07-16 17:30:04 +00:00
* @ throw ModuleException Will throw ModuleExcption if the command already exists
*/
2010-01-17 16:00:14 +00:00
inline void AddCommand ( Command * f )
{
Modules - > AddService ( * f ) ;
}
2007-07-16 17:30:04 +00:00
/** Send a modechange.
* 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
*/
2008-05-04 21:37:36 +00:00
void SendMode ( const std : : vector < std : : string > & parameters , User * user ) ;
2007-07-16 17:30:04 +00:00
2010-01-28 20:16:31 +00:00
/** 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 ) ;
2008-08-21 20:56:16 +00:00
/** Match two strings using pattern matching, optionally, with a map
2008-08-22 16:14:36 +00:00
* to check case against ( may be NULL ) . If map is null , match will be case insensitive .
2008-08-21 20:56:16 +00:00
* @ param str The literal string to match against
* @ param mask The glob pattern to match against .
*/
2008-08-22 16:14:36 +00:00
static bool Match ( const std : : string & str , const std : : string & mask , unsigned const char * map = NULL ) ;
static bool Match ( const char * str , const char * mask , unsigned const char * map = NULL ) ;
2008-08-21 20:56:16 +00:00
/** Match two strings using pattern matching, optionally, with a map
2008-08-22 16:14:36 +00:00
* to check case against ( may be NULL ) . If map is null , match will be case insensitive .
* Supports CIDR patterns as well as globs .
2008-08-21 20:56:16 +00:00
* @ param str The literal string to match against
* @ param mask The glob or CIDR pattern to match against .
*/
2008-08-22 16:14:36 +00:00
static bool MatchCIDR ( const std : : string & str , const std : : string & mask , unsigned const char * map = NULL ) ;
static bool MatchCIDR ( const char * str , const char * mask , unsigned const char * map = NULL ) ;
2007-07-16 17:30:04 +00:00
/** Call the handler for a given command.
* @ param commandname The command whos handler you wish to call
* @ param parameters The mode parameters
* @ param pcnt The number of items you have given in the first parameter
* @ param user The user to execute the command as
* @ return True if the command handler was called successfully
*/
2008-05-04 21:37:36 +00:00
CmdResult CallCommandHandler ( const std : : string & commandname , const std : : vector < std : : string > & parameters , User * user ) ;
2007-07-16 17:30:04 +00:00
/** Return true if the command is a module-implemented command and the given parameters are valid for it
* @ param parameters The mode parameters
* @ param pcnt The number of items you have given in the first parameter
* @ param user The user to test - execute the command as
* @ return True if the command handler is a module command , and there are enough parameters and the user has permission to the command
*/
2007-10-15 20:59:05 +00:00
bool IsValidModuleCommand ( const std : : string & commandname , int pcnt , User * user ) ;
2007-07-16 17:30:04 +00:00
/** Return true if the given parameter is a valid nick!user\@host mask
* @ param mask A nick ! user \ @ host masak to match against
* @ return True i the mask is valid
*/
bool IsValidMask ( const std : : string & mask ) ;
/** Rehash the local server
*/
void RehashServer ( ) ;
/** Check if the given nickmask matches too many users, send errors to the given user
* @ param nick A nickmask to match against
* @ param user A user to send error text to
* @ return True if the nick matches too many users
*/
2007-10-15 20:59:05 +00:00
bool NickMatchesEveryone ( const std : : string & nick , User * user ) ;
2007-07-16 17:30:04 +00:00
/** Check if the given IP mask matches too many users, send errors to the given user
* @ param ip An ipmask to match against
* @ param user A user to send error text to
* @ return True if the ip matches too many users
*/
2007-10-15 20:59:05 +00:00
bool IPMatchesEveryone ( const std : : string & ip , User * user ) ;
2007-07-16 17:30:04 +00:00
/** Check if the given hostmask matches too many users, send errors to the given user
* @ param mask A hostmask to match against
* @ param user A user to send error text to
* @ return True if the host matches too many users
*/
2007-10-15 20:59:05 +00:00
bool HostMatchesEveryone ( const std : : string & mask , User * user ) ;
2007-07-16 17:30:04 +00:00
/** Calculate a duration in seconds from a string in the form 1y2w3d4h6m5s
* @ param str A string containing a time in the form 1 y2w3d4h6m5s
* ( one year , two weeks , three days , four hours , six minutes and five seconds )
* @ return The total number of seconds
*/
long Duration ( const std : : string & str ) ;
2008-01-27 00:12:11 +00:00
/** Attempt to compare a password to a string from the config file.
2007-07-16 17:30:04 +00:00
* This will be passed to handling modules which will compare the data
* against possible hashed equivalents in the input string .
2008-01-27 00:12:11 +00:00
* @ param ex The object ( user , server , whatever ) causing the comparison .
2007-07-16 17:30:04 +00:00
* @ param data The data from the config file
* @ param input The data input by the oper
2008-01-27 00:12:11 +00:00
* @ param hashtype The hash from the config file
2007-07-16 17:30:04 +00:00
* @ return 0 if the strings match , 1 or - 1 if they do not
*/
2008-05-20 15:34:10 +00:00
int PassCompare ( Extensible * ex , const std : : string & data , const std : : string & input , const std : : string & hashtype ) ;
2007-07-16 17:30:04 +00:00
/** Check if a given server is a uline.
* An empty string returns true , this is by design .
* @ param server The server to check for uline status
* @ return True if the server is a uline OR the string is empty
*/
2009-10-02 03:15:46 +00:00
bool ULine ( const std : : string & server ) ;
2007-07-16 17:30:04 +00:00
/** Returns true if the uline is 'silent' (doesnt generate
* remote connect notices etc ) .
*/
2009-10-02 03:15:46 +00:00
bool SilentULine ( const std : : string & server ) ;
2007-07-16 17:30:04 +00:00
/** Returns the full version string of this ircd
* @ return The version string
*/
std : : string GetVersionString ( ) ;
/** Attempt to write the process id to a given file
* @ param filename The PID file to attempt to write to
* @ return This function may bail if the file cannot be written
*/
void WritePID ( const std : : string & filename ) ;
/** This constructor initialises all the subsystems and reads the config file.
* @ param argc The argument count passed to main ( )
* @ param argv The argument list passed to main ( )
* @ throw < anything > If anything is thrown from here and makes it to
* you , you should probably just give up and go home . Yes , really .
* It ' s that bad . Higher level classes should catch any non - fatal exceptions .
*/
InspIRCd ( int argc , char * * argv ) ;
/** Send a line of WHOIS data to a user.
* @ param user user to send the line to
* @ param dest user being WHOISed
* @ param numeric Numeric to send
* @ param text Text of the numeric
*/
2007-10-15 20:59:05 +00:00
void SendWhoisLine ( User * user , User * dest , int numeric , const std : : string & text ) ;
2007-07-16 17:30:04 +00:00
/** Send a line of WHOIS data to a user.
* @ param user user to send the line to
* @ param dest user being WHOISed
* @ param numeric Numeric to send
* @ param format Format string for the numeric
* @ param . . . Parameters for the format string
*/
2008-03-30 02:48:54 +00:00
void SendWhoisLine ( User * user , User * dest , int numeric , const char * format , . . . ) CUSTOM_PRINTF ( 5 , 6 ) ;
2007-07-16 17:30:04 +00:00
2009-09-03 02:30:12 +00:00
/** Handle /STATS
*/
void DoStats ( char statschar , User * user , string_list & results ) ;
/** Handle /WHOIS
*/
void DoWhois ( User * user , User * dest , unsigned long signon , unsigned long idle , const char * nick ) ;
2007-07-16 17:30:04 +00:00
/** Quit a user for excess flood, and if they are not
* fully registered yet , temporarily zline their IP .
* @ param current user to quit
*/
2007-10-15 20:59:05 +00:00
caller1 < void , User * > FloodQuitUser ;
2007-07-16 17:30:04 +00:00
/** 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 ( ) ;
/** 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 ,
2007-09-23 19:19:14 +00:00
* it will repeatedly loop .
2007-07-16 17:30:04 +00:00
* @ return The return value for this function is undefined .
*/
int Run ( ) ;
2007-07-23 23:10:16 +00:00
2008-07-14 11:53:07 +00:00
/** Adds an extban char to the 005 token.
*/
2008-07-16 09:50:23 +00:00
void AddExtBanChar ( char c ) ;
2008-07-14 11:53:07 +00:00
2007-07-26 16:36:37 +00:00
char * GetReadBuffer ( )
{
return this - > ReadBuffer ;
}
2007-07-16 17:30:04 +00:00
} ;
2008-08-21 11:01:51 +00:00
ENTRYPOINT ;
2009-09-03 02:30:12 +00:00
template < class Cmd >
class CommandModule : public Module
{
Cmd cmd ;
public :
2009-09-26 14:13:13 +00:00
CommandModule ( ) : cmd ( this )
2009-09-03 02:30:12 +00:00
{
2010-01-19 15:16:41 +00:00
}
void init ( )
{
ServerInstance - > Modules - > AddService ( cmd ) ;
2009-09-03 02:30:12 +00:00
}
Version GetVersion ( )
{
2009-11-15 18:26:53 +00:00
return Version ( cmd . name , VF_VENDOR | VF_CORE ) ;
2009-09-03 02:30:12 +00:00
}
} ;
2007-07-16 17:30:04 +00:00
# endif