2007-07-16 17:30:04 +00:00
/* +------------------------------------+
* | Inspire Internet Relay Chat Daemon |
* + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
*
2008-01-10 13:27:07 +00:00
* InspIRCd : ( C ) 2002 - 2008 InspIRCd Development Team
2007-07-16 17:30:04 +00:00
* See : http : //www.inspircd.org/wiki/index.php/Credits
*
* This program is free but copyrighted software ; see
* the file COPYING for details .
*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
# ifndef __INSPIRCD_H__
# define __INSPIRCD_H__
# ifndef WIN32
# define DllExport
# define CoreExport
# define printf_c printf
# else
# include "inspircd_win32wrapper.h"
/** Windows defines these already */
# undef DELETE
# undef ERROR
# endif
# include <time.h>
# include <string>
# include <sstream>
2007-09-26 23:49:15 +00:00
# include <list>
2007-07-16 17:30:04 +00:00
# include "inspircd_config.h"
2007-08-26 23:07:06 +00:00
# include "uid.h"
2007-07-16 17:30:04 +00:00
# include "users.h"
2008-01-13 03:37:25 +00:00
# include "usermanager.h"
2007-07-16 17:30:04 +00:00
# include "channels.h"
# include "socket.h"
# include "mode.h"
# include "socketengine.h"
# include "command_parse.h"
# include "snomasks.h"
# include "cull_list.h"
2007-07-25 11:53:07 +00:00
# include "filelogger.h"
2007-07-25 16:58:56 +00:00
# include "caller.h"
2007-07-16 17:30:04 +00:00
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 ;
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 .
* @ param T input value
* @ param V result value
* @ param R base to convert to
*/
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 .
*/
class serverstats : public classbase
{
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
*/
timeval LastSampled ;
/** 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 )
{
}
} ;
/** A list of failed port bindings, used for informational purposes on startup */
typedef std : : vector < std : : pair < std : : string , long > > FailedPortList ;
2007-07-25 16:58:56 +00:00
class InspIRCd ;
2007-10-15 20:59:05 +00:00
DEFINE_HANDLER1 ( ProcessUserHandler , void , User * ) ;
2007-07-25 17:36:13 +00:00
DEFINE_HANDLER1 ( IsNickHandler , bool , const char * ) ;
DEFINE_HANDLER1 ( IsIdentHandler , bool , const char * ) ;
2007-10-15 20:59:05 +00:00
DEFINE_HANDLER1 ( FindDescriptorHandler , User * , int ) ;
DEFINE_HANDLER1 ( FloodQuitUserHandler , void , User * ) ;
2007-07-25 16:58:56 +00:00
2007-07-16 17:30:04 +00:00
/* Forward declaration - required */
class XLineManager ;
2007-11-04 13:23:15 +00:00
class BanCacheManager ;
2007-07-16 17:30:04 +00:00
/** The main class of the irc server.
* This class contains instances of all the other classes
* in this software , with the exception of the base class ,
* classbase . 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 . You should
* NEVER attempt to instantiate a class of type InspIRCd
* yourself . If you do , this is equivalent to spawning a second
* IRC server , and could have catastrophic consequences for the
* program in terms of ram usage ( basically , you could create
* an obese forkbomb built from recursively spawning irc servers ! )
*/
class CoreExport InspIRCd : public classbase
{
private :
2007-08-26 23:07:06 +00:00
/** Holds the current UID. Used to generate the next one.
*/
char current_uid [ UUID_LENGTH ] ;
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 ) ;
2007-08-31 19:37:22 +00:00
/** Sets up UID subsystem
*/
void InitialiseUID ( ) ;
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
*/
2007-10-15 20:59:05 +00:00
bool AllModulesReportReady ( User * user ) ;
2007-07-16 17:30:04 +00:00
/** Logfile pathname specified on the commandline, or empty string
*/
char LogFileName [ MAXBUF ] ;
/** The current time, updated in the mainloop
*/
time_t TIME ;
/** The time that was recorded last time around the mainloop
*/
time_t OLDTIME ;
/** A 64k buffer used to read client lines into
*/
char ReadBuffer [ 65535 ] ;
/** Used when connecting clients
*/
insp_sockaddr client , server ;
/** Used when connecting clients
*/
socklen_t length ;
/** Nonblocking file writer
*/
FileLogger * Logger ;
/** Time offset in seconds
* This offset is added to all calls to Time ( ) . Use SetTimeDelta ( ) to update
*/
int time_delta ;
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 ;
/**** Functors ****/
2007-07-26 16:36:37 +00:00
ProcessUserHandler HandleProcessUser ;
2007-07-25 17:21:30 +00:00
IsNickHandler HandleIsNick ;
IsIdentHandler HandleIsIdent ;
2007-07-25 17:36:13 +00:00
FindDescriptorHandler HandleFindDescriptor ;
2007-07-26 16:36:37 +00:00
FloodQuitUserHandler HandleFloodQuitUser ;
2007-07-25 16:58:56 +00:00
2007-10-15 21:04:32 +00:00
/** BufferedSocket classes pending deletion after being closed.
2007-07-16 17:30:04 +00:00
* We don ' t delete these immediately as this may cause a segmentation fault .
*/
2007-10-15 21:04:32 +00:00
std : : map < BufferedSocket * , BufferedSocket * > SocketCull ;
2007-07-16 17:30:04 +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
*/
2007-10-15 20:59:05 +00:00
User * 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
*/
2007-10-15 20:59:05 +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
*/
2007-10-15 20:59:05 +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 ( ) ;
/** 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 ;
/** Time this ircd was booted
*/
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 ;
/** Command parser, handles client to server commands
*/
CommandParser * Parser ;
/** Socket engine, handles socket activity events
*/
SocketEngine * SE ;
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 ;
/** Client list, a hash_map containing all clients, local and remote
*/
user_hash * clientlist ;
2007-08-27 11:24:43 +00:00
/** Client list stored by UUID. Contains all clients, and is updated
2007-10-15 20:59:05 +00:00
* automatically by the constructor and destructor of User .
2007-08-27 11:24:43 +00:00
*/
user_hash * uuidlist ;
2007-07-16 17:30:04 +00:00
/** Channel list, a hash_map containing all channels
*/
chan_hash * chanlist ;
/** Local client list, a vector containing only local clients
*/
2007-10-15 20:59:05 +00:00
std : : vector < User * > local_users ;
2007-07-16 17:30:04 +00:00
/** Oper list, a vector containing all local and remote opered users
*/
2007-10-15 20:59:05 +00:00
std : : list < User * > all_opers ;
2007-07-16 17:30:04 +00:00
/** 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 ;
2007-07-25 19:46:25 +00:00
/** Set to the current signal recieved
*/
int s_signal ;
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 .
* @ param delta True to use the delta as an offset , false otherwise
* @ return The current time as an epoch value ( time_t )
*/
time_t Time ( bool delta = false ) ;
/** Set the time offset in seconds
* This offset is added to Time ( ) to offset the system time by the specified
* number of seconds .
* @ param delta The number of seconds to offset
* @ return The old time delta
*/
int SetTimeDelta ( int delta ) ;
2007-08-28 23:32:41 +00:00
2007-07-16 17:30:04 +00:00
/** 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 )
*/
int GetTimeDelta ( ) ;
/** Process a user whos socket has been flagged as active
* @ param cu The user to process
* @ return There is no actual return value , however upon exit , the user ' cu ' may have been
* marked for deletion in the global CullList .
*/
2007-10-15 20:59:05 +00:00
caller1 < void , User * > ProcessUser ;
2007-07-16 17:30:04 +00:00
/** Bind all ports specified in the configuration file.
* @ param bail True if the function should bail back to the shell on failure
* @ param found_ports The actual number of ports found in the config , as opposed to the number actually bound
* @ return The number of ports actually bound without error
*/
int BindPorts ( bool bail , int & found_ports , FailedPortList & failed_ports ) ;
/** 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
*/
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
*/
void AddServerName ( const std : : string & servername ) ;
/** Finds a cached char* pointer of a server name,
2007-10-15 20:59:05 +00:00
* This is used to optimize User by storing only the pointer to the name
2007-07-16 17:30:04 +00:00
* @ param The servername to find
* @ return A pointer to this name , gauranteed to never become invalid
*/
const char * FindServerNamePtr ( const std : : string & servername ) ;
/** Returns true if we've seen the given server name before
* @ param The servername to find
* @ return True if we ' ve seen this server name before
*/
bool FindServerName ( const std : : string & servername ) ;
/** 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
*/
std : : string GetServerDescription ( const char * servername ) ;
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 for a 'die' tag in the config file, and abort if found
* @ return Depending on the configuration , this function may never return
*/
void CheckDie ( ) ;
/** 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
/** Close the currently open log file
*/
void CloseLog ( ) ;
/** Send a server notice to all local users
* @ param text The text format string to send
* @ param . . . The format arguments
*/
void ServerNoticeAll ( char * text , . . . ) ;
/** Send a server message (PRIVMSG) to all local users
* @ param text The text format string to send
* @ param . . . The format arguments
*/
void ServerPrivmsgAll ( char * text , . . . ) ;
/** 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
* 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
* @ param . . . The format arguments
*/
void WriteMode ( const char * modes , int flags , const char * text , . . . ) ;
/** Return true if a channel name is valid
* @ param chname A channel name to verify
* @ return True if the name is valid
*/
bool IsChannel ( const char * chname ) ;
2008-01-16 21:36:07 +00:00
/** Return true if str looks like a server ID
* @ param string to check against
*/
bool IsSID ( const std : : string & str ) ;
2007-07-16 17:30:04 +00:00
/** Rehash the local server
*/
2007-07-25 19:46:25 +00:00
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 ) ;
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
*/
2007-07-25 16:58:56 +00:00
caller1 < bool , const char * > 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
/** 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
*/
2007-10-15 20:59:05 +00:00
caller1 < User * , int > FindDescriptor ;
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
*/
2007-10-15 20:55:55 +00:00
void AddCommand ( Command * 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 pcnt The number of items you have given in the first parameter
* @ param user The user to send error messages to
*/
2007-10-15 20:59:05 +00:00
void SendMode ( const char * * parameters , int pcnt , User * user ) ;
2007-07-16 17:30:04 +00:00
/** Match two strings using pattern matching.
* This operates identically to the global function match ( ) ,
* except for that it takes std : : string arguments rather than
* const char * ones .
* @ param sliteral The literal string to match against
* @ param spattern The pattern to match against . CIDR and globs are supported .
*/
bool MatchText ( const std : : string & sliteral , const std : : string & spattern ) ;
/** 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
*/
2007-10-15 20:59:05 +00:00
CmdResult CallCommandHandler ( const std : : string & commandname , const char * * parameters , int pcnt , 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 ( ) ;
/** Return the channel whos index number matches that provided
* @ param The index number of the channel to fetch
* @ return A channel record , or NUll if index < 0 or index > = InspIRCd : : ChannelCount ( )
*/
2007-10-15 20:59:05 +00:00
Channel * GetChannelIndex ( long index ) ;
2007-07-16 17:30:04 +00:00
/** Dump text to a user target, splitting it appropriately to fit
* @ param User the user to dump the text to
* @ param LinePrefix text to prefix each complete line with
* @ param TextStream the text to send to the user
*/
2007-10-15 20:59:05 +00:00
void DumpText ( User * User , const std : : string & LinePrefix , stringstream & TextStream ) ;
2007-07-16 17:30:04 +00:00
/** 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-01-27 00:12:11 +00:00
int PassCompare ( Extensible * ex , const char * data , const char * input , const char * 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
*/
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
*/
std : : string GetRevision ( ) ;
/** 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 ) ;
/** Output a log message to the ircd.log file
* The text will only be output if the current loglevel
* is less than or equal to the level you provide
* @ param level A log level from the DebugLevel enum
* @ param text Format string of to write to the log
* @ param . . . Format arguments of text to write to the log
*/
void Log ( int level , const char * text , . . . ) ;
/** Output a log message to the ircd.log file
* The text will only be output if the current loglevel
* is less than or equal to the level you provide
* @ param level A log level from the DebugLevel enum
* @ param text Text to write to the log
*/
void Log ( int level , const std : : string & text ) ;
/** 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
*/
2007-10-15 20:59:05 +00:00
void SendWhoisLine ( User * user , User * dest , int numeric , const char * format , . . . ) ;
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
2007-10-15 21:04:32 +00:00
/** Force all BufferedSockets to be removed which are due to
2007-07-23 23:10:16 +00:00
* be culled .
*/
2007-10-15 21:04:32 +00:00
void BufferedSocketCull ( ) ;
2007-07-26 16:36:37 +00:00
char * GetReadBuffer ( )
{
return this - > ReadBuffer ;
}
2007-07-16 17:30:04 +00:00
} ;
# endif