From a1479a87757fb5e9b48f3c8bb5dd9cc247406f1a Mon Sep 17 00:00:00 2001 From: "rob rob@31f1291d-b8d6-0310-a050-a5561fc1590b" Date: Mon, 19 Jul 2004 14:08:30 +0000 Subject: BUILD : 1.7.4 (264) BUGS : N/A NOTES : Switched to autoconf - try to commit part 1 git-svn-id: svn://svn.anope.org/anope/trunk@264 31f1291d-b8d6-0310-a050-a5561fc1590b git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@169 5417fbe8-f217-4b02-8779-1006273d7864 --- include/commands.h | 34 ++ include/config.h | 81 +++ include/datafiles.h | 67 +++ include/defs.h | 40 ++ include/encrypt.h | 16 + include/extern.h | 925 ++++++++++++++++++++++++++++++ include/messages.h | 23 + include/modules.h | 233 ++++++++ include/pseudo.h | 20 + include/services.h | 1521 ++++++++++++++++++++++++++++++++++++++++++++++++++ include/slist.h | 63 +++ include/sysconf.h.in | 209 +++++++ include/timeout.h | 50 ++ include/version.sh | 146 +++++ 14 files changed, 3428 insertions(+) create mode 100644 include/commands.h create mode 100644 include/config.h create mode 100644 include/datafiles.h create mode 100644 include/defs.h create mode 100644 include/encrypt.h create mode 100644 include/extern.h create mode 100644 include/messages.h create mode 100644 include/modules.h create mode 100644 include/pseudo.h create mode 100644 include/services.h create mode 100644 include/slist.h create mode 100644 include/sysconf.h.in create mode 100644 include/timeout.h create mode 100644 include/version.sh (limited to 'include') diff --git a/include/commands.h b/include/commands.h new file mode 100644 index 000000000..00a866219 --- /dev/null +++ b/include/commands.h @@ -0,0 +1,34 @@ +/* Declarations for command data. + * + * (C) 2003 Anope Team + * Contact us at info@anope.org + * + * Please read COPYING and README for furhter details. + * + * Based on the original code of Epona by Lara. + * Based on the original code of Services by Andy Church. + * + * $Id$ + * + */ + + #include "modules.h" + +/*************************************************************************/ + +/* Routines for looking up commands. Command lists are arrays that must be + * terminated with a NULL name. + */ + +extern Command *lookup_cmd(Command *list, const char *name); +extern void run_cmd(const char *service, User *u, Command *list, + const char *name); +extern void help_cmd(const char *service, User *u, Command *list, + const char *name); +extern void do_run_cmd(const char *service, User * u, Command *c,const char *cmd); +extern void do_help_cmd(const char *service, User * u, Command *c,const char *cmd); +extern void mod_help_cmd(const char *service, User *u, CommandHash *cmdTable[],const char *cmd); +extern void mod_run_cmd(const char *service, User *u, CommandHash *cmdTable[],const char *cmd); + +extern char *mod_current_module_name; +/*************************************************************************/ diff --git a/include/config.h b/include/config.h new file mode 100644 index 000000000..c260b72af --- /dev/null +++ b/include/config.h @@ -0,0 +1,81 @@ +/* Services configuration. + * + * (C) 2003 Anope Team + * Contact us at info@anope.org + * + * Please read COPYING and README for furhter details. + * + * Based on the original code of Epona by Lara. + * Based on the original code of Services by Andy Church. + * + * $Id$ + * + */ + +#ifndef CONFIG_H +#define CONFIG_H + +/* Note that most of the options which used to be here have been moved to + * services.conf. */ + +/*************************************************************************/ + +/******* General configuration *******/ + +/* Name of configuration file (in Services directory) */ +#define SERVICES_CONF "services.conf" + +/* Name of log file (in Services directory) */ +#define LOG_FILENAME "services.log" + +/* Maximum amount of data from/to the network to buffer (bytes). */ +#define NET_BUFSIZE 65536 + +/******* OperServ configuration *******/ + +/* How big a hostname list do we keep for clone detection? On large nets + * (over 500 simultaneous users or so), you may want to increase this if + * you want a good chance of catching clones. */ +#define CLONE_DETECT_SIZE 16 + +/* Define this to enable OperServ's svs commands (superadmin only). */ + #define USE_OSSVS + +/* Define this to enable OperServ's debugging commands (Services root + * only). These commands are undocumented; "use the source, Luke!" */ +/* #define DEBUG_COMMANDS */ + +/******************* END OF USER-CONFIGURABLE SECTION ********************/ + +/* Size of input buffer (note: this is different from BUFSIZ) + * This must be big enough to hold at least one full IRC message, or messy + * things will happen. */ +#define BUFSIZE 1024 + +/* Extra warning: If you change CHANMAX, your ChanServ database will be + * unusable. + */ + +/* Maximum length of a channel name, including the trailing null. Any + * channels with a length longer than (CHANMAX-1) including the leading # + * will not be usable with ChanServ. */ +#define CHANMAX 64 + +/* Maximum length of a nickname, including the trailing null. This MUST be + * at least one greater than the maximum allowable nickname length on your + * network, or people will run into problems using Services! The default + * (32) works with all servers I know of. */ +#define NICKMAX 32 + +/* Maximum length of a password */ +#define PASSMAX 32 + +/* Maximum length of a username */ +#define USERMAX 10 + +/* Maximum length of a domain */ +#define HOSTMAX 64 + +/**************************************************************************/ + +#endif /* CONFIG_H */ diff --git a/include/datafiles.h b/include/datafiles.h new file mode 100644 index 000000000..4312b5af1 --- /dev/null +++ b/include/datafiles.h @@ -0,0 +1,67 @@ +/* Database file descriptor structure and file handling routine prototypes. + * + * (C) 2003 Anope Team + * Contact us at info@anope.org + * + * Please read COPYING and README for furhter details. + * + * Based on the original code of Epona by Lara. + * Based on the original code of Services by Andy Church. + * + * $Id$ + * + */ + +#ifndef DATAFILES_H +#define DATAFILES_H + +/*************************************************************************/ + +typedef struct dbFILE_ dbFILE; +struct dbFILE_ { + int mode; /* 'r' for reading, 'w' for writing */ + FILE *fp; /* The normal file descriptor */ + FILE *backupfp; /* Open file pointer to a backup copy of + * the database file (if non-NULL) */ + char filename[PATH_MAX]; /* Name of the database file */ + char backupname[PATH_MAX]; /* Name of the backup file */ +}; + +/*************************************************************************/ + +/* Prototypes and macros: */ + +E void check_file_version(dbFILE *f); +E int get_file_version(dbFILE *f); +E int write_file_version(dbFILE *f, uint32 version); + +E dbFILE *open_db(const char *service, const char *filename, const char *mode, uint32 version); +E void restore_db(dbFILE *f); /* Restore to state before open_db() */ +E void close_db(dbFILE *f); +E void backup_databases(void); + +#define read_db(f,buf,len) (fread((buf),1,(len),(f)->fp)) +#define write_db(f,buf,len) (fwrite((buf),1,(len),(f)->fp)) +#define getc_db(f) (fgetc((f)->fp)) + +E int read_int16(uint16 *ret, dbFILE *f); +E int write_int16(uint16 val, dbFILE *f); +E int read_int32(uint32 *ret, dbFILE *f); +E int write_int32(uint32 val, dbFILE *f); +E int read_ptr(void **ret, dbFILE *f); +E int write_ptr(const void *ptr, dbFILE *f); +E int read_string(char **ret, dbFILE *f); +E int write_string(const char *s, dbFILE *f); + +#define read_int8(ret,f) ((*(ret)=fgetc((f)->fp))==EOF ? -1 : 0) +#define write_int8(val,f) (fputc((val),(f)->fp)==EOF ? -1 : 0) +#define read_buffer(buf,f) (read_db((f),(buf),sizeof(buf)) == sizeof(buf)) +#define write_buffer(buf,f) (write_db((f),(buf),sizeof(buf)) == sizeof(buf)) +#define read_buflen(buf,len,f) (read_db((f),(buf),(len)) == (len)) +#define write_buflen(buf,len,f) (write_db((f),(buf),(len)) == (len)) +#define read_variable(var,f) (read_db((f),&(var),sizeof(var)) == sizeof(var)) +#define write_variable(var,f) (write_db((f),&(var),sizeof(var)) == sizeof(var)) + +/*************************************************************************/ + +#endif /* DATAFILES_H */ diff --git a/include/defs.h b/include/defs.h new file mode 100644 index 000000000..c2993d270 --- /dev/null +++ b/include/defs.h @@ -0,0 +1,40 @@ +/* Set default values for any constants that should be in include files but + * + * (C) 2003 Anope Team + * Contact us at info@anope.org + * + * Please read COPYING and README for furhter details. + * + * Based on the original code of Epona by Lara. + * Based on the original code of Services by Andy Church. + * + * + * $Id$ + * + */ + +/*************************************************************************/ + +#ifndef NAME_MAX +# define NAME_MAX 255 +#endif + +#ifndef BUFSIZ +# define BUFSIZ 256 +#else +# if BUFSIZ < 256 +# define BUFSIZ 256 +# endif +#endif + +/* Length of an array: */ +#define lenof(a) (sizeof(a) / sizeof(*(a))) + +/* Telling compilers about printf()-like functions: */ +#ifdef __GNUC__ +# define FORMAT(type,fmt,start) __attribute__((format(type,fmt,start))) +#else +# define FORMAT(type,fmt,start) +#endif + +/*************************************************************************/ diff --git a/include/encrypt.h b/include/encrypt.h new file mode 100644 index 000000000..e31e44ea7 --- /dev/null +++ b/include/encrypt.h @@ -0,0 +1,16 @@ +/* Include file for high-level encryption routines. + * + * (C) 2003 Anope Team + * Contact us at info@anope.org + * + * Please read COPYING and README for furhter details. + * + * Based on the original code of Epona by Lara. + * Based on the original code of Services by Andy Church. + * + * $Id$ + * + */ + +extern int encrypt(const char *src, int len, char *dest, int size); +extern int check_password(const char *plaintext, const char *password); diff --git a/include/extern.h b/include/extern.h new file mode 100644 index 000000000..fe02b446b --- /dev/null +++ b/include/extern.h @@ -0,0 +1,925 @@ +/* Prototypes and external variable declarations. + * + * (C) 2003 Anope Team + * Contact us at info@anope.org + * + * Please read COPYING and README for furhter details. + * + * Based on the original code of Epona by Lara. + * Based on the original code of Services by Andy Church. + * + * $Id$ + * + */ + +#ifndef EXTERN_H +#define EXTERN_H + +#include "slist.h" + +#define E extern + + +/**** modules.c ****/ +E void moduleCallBackRun(void); +E void moduleCleanStruct(ModuleData * moduleData[]); + +/**** actions.c ****/ + +E void change_user_mode(User * u, char *modes, char *arg); +E void kill_user(const char *source, const char *user, const char *reason); +E void bad_password(User * u); + +/**** botserv.c ****/ + +E BotInfo *botlists[256]; + +E void get_botserv_stats(long *nrec, long *memuse); + +E void bs_init(void); +E void botserv(User *u, char *buf); +E void botmsgs(User *u, BotInfo *bi, char *buf); +E void botchanmsgs(User *u, ChannelInfo *ci, char *buf); +E void load_bs_dbase(void); +E void save_bs_dbase(void); +E void save_bs_rdb_dbase(void); + +E BotInfo *makebot(char *nick); +E BotInfo *findbot(char *nick); +E void bot_join(ChannelInfo *ci); +E void bot_rejoin_all(BotInfo *bi); + +/**** channels.c ****/ + +E Channel *chanlist[1024]; +E CBMode cbmodes[128]; +E CBModeInfo cbmodeinfos[]; + +E void get_channel_stats(long *nrec, long *memuse); +E Channel *findchan(const char *chan); +E Channel *firstchan(void); +E Channel *nextchan(void); + +E void chan_deluser(User * user, Channel * c); + +E int is_on_chan(Channel * c, User * u); +E User *nc_on_chan(Channel * c, NickCore * nc); + +E char *chan_get_modes(Channel * chan, int complete, int plus); +E void chan_set_modes(const char *source, Channel * chan, int ac, + char **av, int check); + +E int chan_get_user_status(Channel * chan, User * user); +E int chan_has_user_status(Channel * chan, User * user, int16 status); +E void chan_remove_user_status(Channel * chan, User * user, int16 status); +E void chan_set_user_status(Channel * chan, User * user, int16 status); + +E int get_access_level(ChannelInfo * ci, NickAlias * na); +E char *get_xop_level(int level); + +E void do_cmode(const char *source, int ac, char **av); +E void do_join(const char *source, int ac, char **av); +E void do_kick(const char *source, int ac, char **av); +E void do_part(const char *source, int ac, char **av); +E void do_sjoin(const char *source, int ac, char **av); +E void do_topic(const char *source, int ac, char **av); +E void do_mass_mode(char *modes); +#define whosends(ci) ((!(ci) || !((ci)->botflags & BS_SYMBIOSIS) || !(ci)->bi || !(ci)->c || (ci)->c->usercount < BSMinUsers) ? s_ChanServ : (ci)->bi->nick) + +/**** chanserv.c ****/ + +E ChannelInfo *chanlists[256]; +E CSModeUtil csmodeutils[]; + +E void listchans(int count_only, const char *chan); +E void get_chanserv_stats(long *nrec, long *memuse); + +E int delchan(ChannelInfo * ci); +E void alpha_insert_chan(ChannelInfo * ci); +E void reset_levels(ChannelInfo * ci); +E void cs_init(void); +E void chanserv(User * u, char *buf); +E void load_cs_dbase(void); +E void save_cs_dbase(void); +E void save_cs_rdb_dbase(void); +E void expire_chans(void); +E void cs_remove_nick(const NickCore * nc); +E void cs_remove_bot(const BotInfo * bi); + +E void check_modes(Channel * c); +#if defined(IRC_ULTIMATE3) || defined(IRC_RAGE2) +E int check_valid_admin(User * user, Channel * chan, int servermode); +#endif +E int check_valid_op(User * user, Channel * chan, int servermode); +E int check_should_op(User * user, const char *chan); +E int check_should_voice(User * user, const char *chan); +#ifdef HAS_HALFOP +E int check_should_halfop(User * user, const char *chan); +#endif +#if defined(IRC_UNREAL) || defined(IRC_VIAGRA) +E int check_should_owner(User * user, const char *chan); +E int check_should_protect(User * user, const char *chan); +#endif +#if defined(IRC_ULTIMATE3) || defined(IRC_RAGE2) || defined(IRC_PTLINK) +E int check_should_protect(User * user, const char *chan); +#endif +E int check_kick(User * user, char *chan); +E void record_topic(const char *chan); +E void restore_topic(const char *chan); +E int check_topiclock(Channel * c, time_t topic_time); + +E ChannelInfo *cs_findchan(const char *chan); +E int check_access(User * user, ChannelInfo * ci, int what); +E int is_founder(User * user, ChannelInfo * ci); +E int get_access(User * user, ChannelInfo * ci); +E ChanAccess *get_access_entry(NickCore * nc, ChannelInfo * ci); +E void update_cs_lastseen(User * user, ChannelInfo * ci); +E int get_idealban(ChannelInfo * ci, User * u, char *ret, int retlen); +E AutoKick *is_stuck(ChannelInfo * ci, char *mask); +E void stick_mask(ChannelInfo * ci, AutoKick * akick); +E void stick_all(ChannelInfo * ci); + +#ifdef HAS_FMODE +E char *cs_get_flood(ChannelInfo * ci); +E void cs_set_flood(ChannelInfo * ci, char *value); +#endif +E char *cs_get_key(ChannelInfo * ci); +E void cs_set_key(ChannelInfo * ci, char *value); +E char *cs_get_limit(ChannelInfo * ci); +E void cs_set_limit(ChannelInfo * ci, char *value); +#ifdef HAS_LMODE +E char *cs_get_redirect(ChannelInfo * ci); +E void cs_set_redirect(ChannelInfo * ci, char *value); +#endif + +/**** compat.c ****/ + +#if !HAVE_SNPRINTF +# if BAD_SNPRINTF +# define snprintf my_snprintf +# endif +# define vsnprintf my_vsnprintf +E int vsnprintf(char *buf, size_t size, const char *fmt, va_list args); +E int snprintf(char *buf, size_t size, const char *fmt, ...); +#endif +#if !HAVE_STRICMP && !HAVE_STRCASECMP +E int stricmp(const char *s1, const char *s2); +E int strnicmp(const char *s1, const char *s2, size_t len); +#endif +#if !HAVE_STRDUP +E char *strdup(const char *s); +#endif +#if !HAVE_STRSPN +E size_t strspn(const char *s, const char *accept); +#endif +#if !HAVE_STRERROR +E char *strerror(int errnum); +#endif +#if !HAVE_STRSIGNAL +char *strsignal(int signum); +#endif + + +/**** config.c ****/ + +E char *RemoteServer; +E int RemotePort; +E char *RemotePassword; +E char *RemoteServer2; +E int RemotePort2; +E char *RemotePassword2; +E char *RemoteServer3; +E int RemotePort3; +E char *RemotePassword3; +E char *LocalHost; +E int LocalPort; + +E char *ServerName; +E char *ServerDesc; +E char *ServiceUser; +E char *ServiceHost; + +E char *HelpChannel; +E char *LogChannel; +E char **NetworkDomains; +E int DomainNumber; +E char *NetworkName; + +E char *s_NickServ; +E char *s_ChanServ; +E char *s_MemoServ; +E char *s_BotServ; +E char *s_HelpServ; +E char *s_OperServ; +E char *s_GlobalNoticer; +E char *s_IrcIIHelp; +E char *s_DevNull; +E char *desc_NickServ; +E char *desc_ChanServ; +E char *desc_MemoServ; +E char *desc_BotServ; +E char *desc_HelpServ; +E char *desc_OperServ; +E char *desc_GlobalNoticer; +E char *desc_IrcIIHelp; +E char *desc_DevNull; + +E char *HostDBName; +E char *desc_HostServ; +E char *s_HostServ; +E void load_hs_dbase(void); +E void save_hs_dbase(void); +E void save_hs_rdb_dbase(void); +E int do_on_id(User * u); +E void delHostCore(char *nick); +E void hostserv(User * u, char *buf); + +E char *s_NickServAlias; +E char *s_ChanServAlias; +E char *s_MemoServAlias; +E char *s_BotServAlias; +E char *s_HelpServAlias; +E char *s_OperServAlias; +E char *s_GlobalNoticerAlias; +E char *s_DevNullAlias; +E char *s_HostServAlias; +E char *desc_NickServAlias; +E char *desc_ChanServAlias; +E char *desc_MemoServAlias; +E char *desc_BotServAlias; +E char *desc_HelpServAlias; +E char *desc_OperServAlias; +E char *desc_GlobalNoticerAlias; +E char *desc_DevNullAlias; +E char *desc_HostServAlias; + +E char *PIDFilename; +E char *MOTDFilename; +E char *NickDBName; +E char *PreNickDBName; +E char *ChanDBName; +E char *BotDBName; +E char *OperDBName; +E char *AutokillDBName; +E char *NewsDBName; + +E int NoBackupOkay; +E int StrictPasswords; +E int BadPassLimit; +E int BadPassTimeout; +E int UpdateTimeout; +E int ExpireTimeout; +E int ReadTimeout; +E int WarningTimeout; +E int TimeoutCheck; +E int KeepLogs; +E int KeepBackups; +E int ForceForbidReason; +E int UsePrivmsg; +E int DumpCore; +E int LogUsers; +E int NickRegDelay; +E int UseSVSHOLD; + +E char **HostSetters; +E int HostNumber; + +E int UseMail; +E char *SendMailPath; +E char *SendFrom; +E int RestrictMail; +E int MailDelay; +E int DontQuoteAddresses; + +E int ProxyDetect; +E int ProxyThreads; +E char *ProxyMessage[8]; +E int ProxyCheckWingate; +E int ProxyCheckSocks4; +E int ProxyCheckSocks5; +E int ProxyCheckHTTP1; +E int ProxyCheckHTTP2; +E int ProxyCheckHTTP3; +E int ProxyTimeout; +E char *ProxyTestServer; +E int ProxyTestPort; +E int ProxyExpire; +E int ProxyCacheExpire; +E char *ProxyAkillReason; +E int WallProxy; +E int ProxyMax; + +E int NSDefFlags; +E int NSDefLanguage; +E int NSRegDelay; +E int NSExpire; +E int NSRExpire; +E int NSForceEmail; +E int NSMaxAliases; +E int NSAccessMax; +E char *NSEnforcerUser; +E char *NSEnforcerHost; +E int NSReleaseTimeout; +E int NSAllowKillImmed; +E int NSNoGroupChange; +E int NSListOpersOnly; +E int NSListMax; +E char *NSGuestNickPrefix; +E int NSSecureAdmins; +E int NSStrictPrivileges; +E int NSEmailReg; +E int NSModeOnID; +E int NSRestrictGetPass; +E int NSNickTracking; + +E int CSDefFlags; +E int CSMaxReg; +E int CSExpire; +E int CSDefBantype; +E int CSAccessMax; +E int CSAutokickMax; +E char *CSAutokickReason; +E int CSInhabit; +E int CSListOpersOnly; +E int CSListMax; +E int CSRestrictGetPass; +E int CSOpersOnly; + +E int MSMaxMemos; +E int MSSendDelay; +E int MSNotifyAll; +E int MSMemoReceipt; + +E int BSDefFlags; +E int BSKeepData; +E int BSMinUsers; +E int BSBadWordsMax; +E int BSSmartJoin; +E int BSGentleBWReason; +E int BSCaseSensitive; + +E int HideStatsO; +E int GlobalOnCycle; +E int AnonymousGlobal; +E char *GlobalOnCycleMessage; +E char *GlobalOnCycleUP; +E char **ServicesRoots; +E int RootNumber; +E int LogMaxUsers; +E int SuperAdmin; +E int LogBot; +E int AutokillExpiry; +E int ChankillExpiry; +E int SGLineExpiry; +E int SQLineExpiry; +E int SZLineExpiry; +E int AkillOnAdd; +E int DisableRaw; +E int WallOper; +E int WallBadOS; +E int WallOSGlobal; +E int WallOSMode; +E int WallOSClearmodes; +E int WallOSKick; +E int WallOSAkill; +E int WallOSSGLine; +E int WallOSSQLine; +E int WallOSSZLine; +E int WallOSNoOp; +E int WallOSJupe; +E int WallOSRaw; +E int WallAkillExpire; +E int WallSGLineExpire; +E int WallSQLineExpire; +E int WallSZLineExpire; +E int WallExceptionExpire; +E int WallDrop; +E int WallForbid; +E int WallGetpass; +E int WallSetpass; +E int CheckClones; +E int CloneMinUsers; +E int CloneMaxDelay; +E int CloneWarningDelay; +E int KillClones; +E int AddAkiller; + +E char **ModulesAutoload; +E int ModulesNumber; +E char **ModulesDelayedAutoload; +E int ModulesDelayedNumber; + + +E int KillClonesAkillExpire; + +E int LimitSessions; +E int DefSessionLimit; +E int ExceptionExpiry; +E int MaxSessionKill; +E int MaxSessionLimit; +E int SessionAutoKillExpiry; +E char *ExceptionDBName; +E char *SessionLimitDetailsLoc; +E char *SessionLimitExceeded; + +#ifdef USE_RDB +E int rdb_init(); +E int rdb_open(); +E int rdb_close(); +E int rdb_tag_table(char *table); +E int rdb_tag_table(char *table); +E int rdb_clear_table(char *table); +E int rdb_scrub_table(char *table, char *clause); +E int rdb_direct_query(char *query); +E int rdb_ns_set_display(char *newnick, char *oldnick); +E int rdb_cs_set_founder(char *channel, char *founder); +E int rdb_cs_deluser(char *nick); +E int rdb_cs_delchan(ChannelInfo * ci); +E void rdb_save_ns_core(NickCore * nc); +E void rdb_save_ns_alias(NickAlias * na); +E void rdb_save_ns_req(NickRequest * nr); +E void rdb_save_cs_info(ChannelInfo * ci); +E void rdb_save_bs_core(BotInfo * bi); +E void rdb_save_bs_rdb_core(BotInfo * bi); +E void rdb_save_hs_core(HostCore * hc); +E void rdb_save_os_db(unsigned int maxucnt, unsigned int maxutime, + SList * ak, SList * sgl, SList * sql, SList * szl, + HostCache * hc); +E void rdb_save_news(NewsItem * ni); +E void rdb_save_exceptions(Exception * e); +E void rdb_load_bs_dbase(void); +E void rdb_load_hs_dbase(void); +E void rdb_load_ns_dbase(void); +E void rdb_load_dbases(void); +#endif + +#ifdef USE_MYSQL +E char *MysqlHost; +E char *MysqlUser; +E char *MysqlPass; +E char *MysqlName; +E int MysqlPort; +E char *MysqlSock; +E char *MysqlSecure; +E int MysqlRetries; +E int MysqlRetryGap; +E int UseRDB; +#endif + +E int read_config(int reload); + +E int DefConLevel; +E int DefCon[6]; +E int checkDefCon(int level); +E void resetDefCon(int level); +E int DefConSessionLimit; +E char *DefConTimeOut; +E char *DefConAKILL; +E char *DefConChanModes; +E int GlobalOnDefcon; +E int GlobalOnDefconMore; +E char *DefconMessage; +E char *DefConAkillReason; +E char *DefConOffMessage; + +/**** converter.c ****/ + +E int convert_ircservices_44(void); + +/**** init.c ****/ + +E void introduce_user(const char *user); +E int init(int ac, char **av); +E int servernum; + +/**** language.c ****/ + +E char **langtexts[NUM_LANGS]; +E char *langnames[NUM_LANGS]; +E int langlist[NUM_LANGS]; + +E void lang_init(void); +#define getstring(na,index) \ + (langtexts[((na)&&((NickAlias*)na)->nc&&!(((NickAlias*)na)->status & NS_VERBOTEN)?((NickAlias*)na)->nc->language:NSDefLanguage)][(index)]) +#define getstring2(nc,index) \ + (langtexts[((nc)?((NickCore*)nc)->language:NSDefLanguage)][(index)]) +E int strftime_lang(char *buf, int size, User * u, int format, + struct tm *tm); +E void syntax_error(const char *service, User * u, const char *command, + int msgnum); + + +/**** list.c ****/ + +E void do_listnicks(int ac, char **av); +E void do_listchans(int ac, char **av); + + +/**** log.c ****/ + +E int open_log(void); +E void close_log(void); +E void alog(const char *fmt, ...) FORMAT(printf,1,2); +E void log_perror(const char *fmt, ...) FORMAT(printf,1,2); +E void fatal(const char *fmt, ...) FORMAT(printf,1,2); +E void fatal_perror(const char *fmt, ...) FORMAT(printf,1,2); + +/**** mail.c ****/ + +E MailInfo *MailBegin(User *u, NickCore *nc, char *subject, char *service); +E MailInfo *MailRegBegin(User *u, NickRequest *nr, char *subject, char *service); +E MailInfo *MailMemoBegin(NickCore * nc); +E void MailEnd(MailInfo *mail); +E void MailReset(User *u, NickCore *nc); +E int MailValidate(const char *email); + +/**** main.c ****/ + +E const char version_number[]; +E const char version_build[]; +E const char version_protocol[]; +E const char version_flags[]; + +E char *services_dir; +E char *log_filename; +E int debug; +E int readonly; +E int logchan; +E int skeleton; +E int nofork; +E int forceload; +E int noexpire; + +#ifdef USE_RDB +E int do_mysql; +#endif + +E int is44; + +E int quitting; +E int delayed_quit; +E char *quitmsg; +E char inbuf[BUFSIZE]; +E int servsock; +E int save_data; +E int got_alarm; +E time_t start_time; + +E void save_databases(void); + +/**** memory.c ****/ + +E void *smalloc(long size); +E void *scalloc(long elsize, long els); +E void *srealloc(void *oldptr, long newsize); +E char *sstrdup(const char *s); + + +/**** memoserv.c ****/ + +E void ms_init(void); +E void memoserv(User * u, char *buf); +E void check_memos(User * u); + + +/**** misc.c ****/ + +E char *strscpy(char *d, const char *s, size_t len); +E char *stristr(char *s1, char *s2); +E char *strnrepl(char *s, int32 size, const char *old, const char *new); + +E char *merge_args(int argc, char **argv); + +E int match_wild(const char *pattern, const char *str); +E int match_wild_nocase(const char *pattern, const char *str); + +E int dotime(const char *s); +E char *duration(NickAlias * na, char *buf, int bufsize, time_t seconds); +E char *expire_left(NickAlias * na, char *buf, int len, time_t expires); + +typedef int (*range_callback_t) (User * u, int num, va_list args); +E int process_numlist(const char *numstr, int *count_ret, + range_callback_t callback, User * u, ...); + +E int isValidHost(const char *host, int type); +E int isvalidchar(char c); + +E char *myStrGetToken(const char *str, const char dilim, int token_number); +E char *myStrGetOnlyToken(const char *str, const char dilim, + int token_number); +E char *myStrSubString(const char *src, int start, int end); +E char *myStrGetTokenRemainder(const char *str, const char dilim, + int token_number); +E void doCleanBuffer(char *str); +E void EnforceQlinedNick(char *nick, char *killer); +E int nickIsServices(char *nick); + + +/**** news.c ****/ + +E int32 nnews, news_size; +E NewsItem *news; + +E void get_news_stats(long *nrec, long *memuse); +E void load_news(void); +E void save_news(void); +E void save_rdb_news(void); +E void display_news(User * u, int16 type); +E int do_logonnews(User * u); +E int do_opernews(User * u); +E int do_randomnews(User * u); + + +/**** nickserv.c ****/ + +E NickAlias *nalists[1024]; +E NickCore *nclists[1024]; +E NickRequest *nrlists[1024]; + +E unsigned int guestnum; + +E void insert_requestnick(NickRequest * nr); +E void alpha_insert_alias(NickAlias * na); +E void insert_core(NickCore * nc); +E void listnicks(int count_only, const char *nick); +E void get_aliases_stats(long *nrec, long *memuse); +E void get_core_stats(long *nrec, long *memuse); + +E void ns_init(void); +E void nickserv(User * u, char *buf); +E void load_ns_dbase(void); +E void load_ns_req_db(void); +E void save_ns_dbase(void); +E void save_ns_req_dbase(void); +E void save_ns_rdb_dbase(void); +E void save_ns_req_rdb_dbase(void); +E int validate_user(User * u); +E void cancel_user(User * u); +E int nick_identified(User * u); +E int nick_recognized(User * u); +E void expire_nicks(void); +E void expire_requests(void); +E int ns_do_register(User * u); + +E int delnick(NickAlias * na); +E NickAlias *findnick(const char *nick); +E NickCore *findcore(const char *nick); +E void clean_ns_timeouts(NickAlias * na); + +E void nsStartNickTracking(User * u); +E void nsStopNickTracking(User * u); +E int nsCheckNickTracking(User *u); + +/**** helpserv.c ****/ +E void helpserv(User * u, char *buf); +E void helpserv_init(void); + +/**** hostserv.c ****/ +E void hostserv_init(void); +E void addHostCore(char *nick, char *vIdent, char *vhost, char *creator, int32 tmp_time); + +/**** operserv.c ****/ + +E SList akills, sglines, sqlines, szlines; +E SList servadmins; +E SList servopers; + +E void operserv(User *u, char *buf); +E void os_init(void); +E void load_os_dbase(void); +E void save_os_dbase(void); +E void save_os_rdb_dbase(void); + +E void os_remove_nick(NickCore *nc); +E int is_services_root(User *u); +E int is_services_admin(User *u); +E int is_services_oper(User *u); +E int nick_is_services_root(NickCore * nc); +E int nick_is_services_admin(NickCore *nc); +E int nick_is_services_oper(NickCore *nc); + +E int add_akill(User *u, char *mask, const char *by, const time_t expires, const char *reason); +E int check_akill(const char *nick, const char *username, const char *host, const char *vhost, const char *ip); +E void expire_akills(void); +E void oper_global(char *nick, char *fmt, ...); +#ifdef IRC_BAHAMUT +E int add_sgline(User *u, char *mask, const char *by, const time_t expires, const char *reason); +E int check_sgline(const char *nick, const char *realname); +E void expire_sglines(void); +#endif + +E int add_sqline(User *u, char *mask, const char *by, const time_t expires, const char *reason); +E int check_sqline(const char *nick, int nick_change); +#ifdef IRC_BAHAMUT +E int check_chan_sqline(const char *chan); +#endif +E void expire_sqlines(void); + +#ifdef IRC_BAHAMUT +E int add_szline(User * u, char *mask, const char *by, + const time_t expires, const char *reason); +E void expire_szlines(void); +#endif + +E void check_clones(User * user); + +E void delete_ignore(const char *nick); + +/**** process.c ****/ + +E int allow_ignore; +E IgnoreData *ignore[]; + +E void add_ignore(const char *nick, time_t delta); +E IgnoreData *get_ignore(const char *nick); + +E int split_buf(char *buf, char ***argv, int colon_special); +E void process(void); + +/**** protocol.c ****/ + +E void s_akill(char *user, char *host, char *who, time_t when, + time_t expires, char *reason); +E void s_rakill(char *user, char *host); +E void s_sgline(char *mask, char *reason); +E void s_sqline(char *mask, char *reason); +E void s_svsnoop(char *server, int set); +E void s_szline(char *mask, char *reason); +E void s_unsgline(char *mask); +E void s_unsqline(char *mask); +E void s_unszline(char *mask); + +/**** proxy.c ****/ + +E HostCache *hcache[1024]; + +E HostCache *proxy_cache_add(char *host); +E void get_proxy_stats(long *nrec, long *memuse); +E void ntoa(struct in_addr addr, char *ipaddr, int len); +E int proxy_check(char *nick, char *host, uint32 ip); +E void proxy_expire(); +E int proxy_init(void); + +E int do_cache(User *u); + +/**** send.c ****/ + +E void send_cmd(const char *source, const char *fmt, ...) + FORMAT(printf,2,3); +E void vsend_cmd(const char *source, const char *fmt, va_list args) + FORMAT(printf,2,0); + +E void wallops(const char *source, const char *fmt, ...) + FORMAT(printf,2,3); + +E void notice(const char *source, const char *dest, const char *fmt, ...) + FORMAT(printf,3,4); +E void notice_server(const char *source, Server *s, const char *fmt, ...) + FORMAT(printf,3,4); +E void notice_user(const char *source, User *u, const char *fmt, ...) + FORMAT(printf,3,4); + +E void notice_list(const char *source, const char *dest, const char **text); +E void notice_lang(const char *source, User *dest, int message, ...); +E void notice_help(const char *source, User *dest, int message, ...); + +E void privmsg(const char *source, const char *dest, const char *fmt, ...) + FORMAT(printf,3,4); + +E void send_mode(const char *source, const char *on, const char *fmt, ...) + FORMAT(printf,3,4); + +/**** servers.c ****/ + +E Server *servlist; +E Server *me_server; +#ifdef IRC_BAHAMUT +E uint16 uplink_capab; +#endif + +E Server *first_server(int flags); +E Server *next_server(int flags); + +E Server *new_server(Server *uplink, const char *name, const char *desc, + uint16 flags); + +E Server *findserver(Server *s, const char *name); + +E void do_server(const char *source, int ac, char **av); +E void do_squit(const char *source, int ac, char **av); + +/**** sessions.c ****/ + +E Exception *exceptions; +E int16 nexceptions; + +E void get_session_stats(long *nrec, long *memuse); +E void get_exception_stats(long *nrec, long *memuse); + +E int do_session(User *u); +E int add_session(const char *nick, const char *host); +E void del_session(const char *host); + +E void load_exceptions(void); +E void save_exceptions(void); +E void save_rdb_exceptions(void); +E int do_exception(User *u); +E void expire_exceptions(void); + +/**** sockutil.c ****/ + +E int32 total_read, total_written; +E int32 read_buffer_len(void); +E int32 write_buffer_len(void); + +E int sgetc(int s); +E char *sgets(char *buf, int len, int s); +E char *sgets2(char *buf, int len, int s); +E int sread(int s, char *buf, int len); +E int sputs(char *str, int s); +E int sockprintf(int s, char *fmt, ...); +E int conn(const char *host, int port, const char *lhost, int lport); +E void disconn(int s); + +/**** users.c ****/ + +E User *userlist[1024]; + +E int32 usercnt, opcnt, maxusercnt; +E time_t maxusertime; + +E void set_umode(User * user, int ac, char **av); + +E void delete_user(User *user); + +E void get_user_stats(long *nusers, long *memuse); +E User *finduser(const char *nick); +E User *firstuser(void); +E User *nextuser(void); + +#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3) || defined(IRC_VIAGRA) || defined(IRC_PTLINK) || defined(IRC_RAGE2) +E void change_user_host(User * user, const char *host); +#endif +#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3) || defined(IRC_VIAGRA) || defined(IRC_PTLINK) +E void change_user_username(User * user, const char *username); +E void change_user_realname(User * user, const char *realname); +#endif + +E User *do_nick(const char *source, char *nick, char *username, char *host, + char *server, char *realname, time_t ts, uint32 svid, ...); +E void do_umode(const char *source, int ac, char **av); +E void do_quit(const char *source, int ac, char **av); +E void do_kill(const char *source, int ac, char **av); + +E int is_oper(User * user); +E int is_protected(User * user); + +#ifdef HAS_EXCEPT +E int is_excepted(ChannelInfo * ci, User * user); +E int is_excepted_mask(ChannelInfo * ci, char *mask); +#endif + +E int match_usermask(const char *mask, User * user); +E void split_usermask(const char *mask, char **nick, char **user, + char **host); +E char *create_mask(User * u); + +#ifdef USE_MYSQL +/**** mysql.c ****/ +E MYSQL *mysql; +E MYSQL_RES *mysql_res; +E MYSQL_FIELD *mysql_fields; +E MYSQL_ROW mysql_row; + +E int db_mysql_init(); +E int db_mysql_open(); +E int db_mysql_close(); +E int db_mysql_query(char *sql); +E char *db_mysql_quote(char *sql); +E void db_mysql_save_ns_core(NickCore * nc); +E void db_mysql_save_ns_alias(NickAlias * na); +E void db_mysql_save_ns_req(NickRequest * nr); +E void db_mysql_save_cs_info(ChannelInfo * ci); +E void db_mysql_save_os_db(unsigned int maxucnt, unsigned int maxutime, + SList * ak, SList * sgl, SList * sql, + SList * szl, HostCache * hc); +E void db_mysql_save_news(NewsItem * ni); +E void db_mysql_save_exceptions(Exception * e); +E void db_mysql_save_hs_core(HostCore * hc); +E void db_mysql_save_bs_core(BotInfo * bi); +E void db_mysql_load_bs_dbase(void); +E void db_mysql_load_hs_dbase(void); +E void db_mysql_load_ns_dbase(void); +E void db_mysql_load_ns_req_dbase(void); +E void db_mysql_load_cs_dbase(void); +E void db_mysql_load_os_dbase(void); +E void db_mysql_load_exceptions(void); +E void db_mysql_load_news(void); +#endif + +#ifdef USE_ENCRYPTION +extern int encrypt_in_place(char *buf, int size); +#endif + + +#endif /* EXTERN_H */ diff --git a/include/messages.h b/include/messages.h new file mode 100644 index 000000000..f1de39648 --- /dev/null +++ b/include/messages.h @@ -0,0 +1,23 @@ +/* Declarations of IRC message structures, variables, and functions. + * + * (C) 2003 Anope Team + * Contact us at info@anope.org + * + * Please read COPYING and README for furhter details. + * + * Based on the original code of Epona by Lara. + * Based on the original code of Services by Andy Church. + * + * $Id$ + * + */ + +/*************************************************************************/ +#include "modules.h" + +extern Message messages[]; +extern void moduleAddMsgs(void); +extern Message *find_message(const char *name); + + +/*************************************************************************/ diff --git a/include/modules.h b/include/modules.h new file mode 100644 index 000000000..dd92029a4 --- /dev/null +++ b/include/modules.h @@ -0,0 +1,233 @@ +/* Modular support + * + * (C) 2003 Anope Team + * Contact us at info@anope.org + * + * Please read COPYING and README for furhter details. + * + * Based on the original code of Epona by Lara. + * Based on the original code of Services by Andy Church. + * + * $Id$ + */ + +#ifndef MODULES_H +#define MODULES_H + +#include +#include "services.h" +#include + +/*************************************************************************/ +#define CMD_HASH(x) (((x)[0]&31)<<5 | ((x)[1]&31)) /* Will gen a hash from a string :) */ +#define MAX_CMD_HASH 1024 + +#define MOD_STOP 1 +#define MOD_CONT 0 + +#define HOSTSERV HS_cmdTable /* using HOSTSERV etc. looks nicer than HS_cmdTable for modules */ +#define BOTSERV BS_cmdTable +#define MEMOSERV MS_cmdTable +#define NICKSERV NS_cmdTable +#define CHANSERV CS_cmdTable +#define HELPSERV HE_cmdTable +#define OPERSERV OS_cmdTable +#define IRCD IRCD_cmdTable +#define MODULE_HASH Module_table + +/********************************************************************** + * Module Returns + **********************************************************************/ + #define MOD_ERR_OK 0 + #define MOD_ERR_MEMORY 1 + #define MOD_ERR_PARAMS 2 + #define MOD_ERR_EXISTS 3 + #define MOD_ERR_NOEXIST 4 + #define MOD_ERR_NOUSER 5 + #define MOD_ERR_NOLOAD 6 + #define MOD_ERR_NOUNLOAD 7 + #define MOD_ERR_SYNTAX 8 + #define MOD_ERR_NODELETE 9 + #define MOD_ERR_UNKNOWN 10 + #define MOD_ERR_FILE_IO 11 + #define MOD_ERR_NOSERVICE 12 + + /*************************************************************************/ + +/* Structure for information about a *Serv command. */ + +typedef struct Command_ Command; +typedef struct CommandHash_ CommandHash; +typedef struct Module_ Module; +typedef struct ModuleHash_ ModuleHash; +typedef struct Message_ Message; +typedef struct MessageHash_ MessageHash; +typedef struct ModuleCallBack_ ModuleCallBack; + + +extern CommandHash *HOSTSERV[MAX_CMD_HASH]; +extern CommandHash *BOTSERV[MAX_CMD_HASH]; +extern CommandHash *MEMOSERV[MAX_CMD_HASH]; +extern CommandHash *NICKSERV[MAX_CMD_HASH]; +extern CommandHash *CHANSERV[MAX_CMD_HASH]; +extern CommandHash *HELPSERV[MAX_CMD_HASH]; +extern CommandHash *OPERSERV[MAX_CMD_HASH]; +extern MessageHash *IRCD[MAX_CMD_HASH]; + +struct Module_ { + char *name; + char *filename; + void *handle; + time_t time; + char *version; + char *author; + + void (*nickHelp)(User *u); /* service 1 */ + void (*chanHelp)(User *u); /* 2 */ + void (*memoHelp)(User *u); /* 3 */ + void (*botHelp)(User *u); /* 4 */ + void (*operHelp)(User *u); /* 5 */ + void (*hostHelp)(User *u); /* 6 */ + void (*helpHelp)(User *u); /* 7 */ + +// CommandHash *cmdList[MAX_CMD_HASH]; + MessageHash *msgList[MAX_CMD_HASH]; +}; + +struct ModuleHash_ { + char *name; + Module *m; + ModuleHash *next; +}; + +struct Command_ { + char *name; + int (*routine)(User *u); + int (*has_priv)(User *u); /* Returns 1 if user may use command, else 0 */ + + /* Regrettably, these are hard-coded to correspond to current privilege + * levels (v4.0). Suggestions for better ways to do this are + * appreciated. + */ + int helpmsg_all; /* Displayed to all users; -1 = no message */ + int helpmsg_reg; /* Displayed to regular users only */ + int helpmsg_oper; /* Displayed to Services operators only */ + int helpmsg_admin; /* Displayed to Services admins only */ + int helpmsg_root; /* Displayed to Services root only */ + char *help_param1; + char *help_param2; + char *help_param3; + char *help_param4; + + /* Module related stuff */ + int core; /* Can this command be deleted? */ + char *mod_name; /* Name of the module who owns us, NULL for core's */ + char *service; /* Service we provide this command for */ + int (*all_help)(User *u); + int (*regular_help)(User *u); + int (*oper_help)(User *u); + int (*admin_help)(User *u); + int (*root_help)(User *u); + + Command *next; /* Next command responsible for the same command */ +}; + +struct CommandHash_ { + char *name; /* Name of the command */ + Command *c; /* Actual command */ + CommandHash *next; /* Next command */ +}; + +struct Message_ { + char *name; + int (*func)(char *source, int ac, char **av); + int core; + char *mod_name; + Message *next; +}; + +struct MessageHash_ { + char *name; + Message *m; + MessageHash *next; +}; + +struct ModuleCallBack_ { + char *name; + char *owner_name; + time_t when; + int (*func)(int argc, char *argv[]); + int argc; + char **argv; + ModuleCallBack *next; +}; + +/*************************************************************************/ +/* Module Managment Functions */ +Module *createModule(char *filename); /* Create a new module, using the given name */ +int destroyModule(Module *m); /* Delete the module */ +int addModule(Module *m); /* Add a module to the module hash */ +int delModule(Module *m); /* Remove a module from the module hash */ +Module *findModule(char *name); /* Find a module */ +int loadModule(Module *m,User *u); /* Load the given module into the program */ +int unloadModule(Module *m, User *u); /* Unload the given module from the pro */ +int prepForUnload(Module *m); /* Prepare the module for unload */ +void moduleAddVersion(char *version); +void moduleAddAuthor(char *author); +void modules_init(void); +void modules_delayed_init(void); +void moduleCallBackPrepForUnload(char *mod_name); +void moduleCallBackDeleteEntry(ModuleCallBack * prev); +char *moduleGetLastBuffer(void); +void moduleSetHelpHelp(void (*func) (User * u)); +void moduleDisplayHelp(int service, User *u); +void moduleSetHostHelp(void (*func) (User * u)); +void moduleSetOperHelp(void (*func) (User * u)); +void moduleSetBotHelp(void (*func) (User * u)); +void moduleSetMemoHelp(void (*func) (User * u)); +void moduleSetChanHelp(void (*func) (User * u)); +void moduleSetNickHelp(void (*func) (User * u)); +int moduleAddHelp(Command * c, int (*func) (User * u)); +int moduleAddRegHelp(Command * c, int (*func) (User * u)); +int moduleAddOperHelp(Command * c, int (*func) (User * u)); +int moduleAddAdminHelp(Command * c, int (*func) (User * u)); +int moduleAddRootHelp(Command * c, int (*func) (User * u)); +/*************************************************************************/ +/*************************************************************************/ +/* Command Managment Functions */ +Command *createCommand(const char *name,int (*func)(User *u),int (*has_priv)(User *u),int help_all, int help_reg, int help_oper, int help_admin,int help_root); +int destroyCommand(Command *c); /* destroy a command */ +int addCoreCommand(CommandHash *cmdTable[], Command *c); /* Add a command to a command table */ +int moduleAddCommand(CommandHash *cmdTable[], Command *c, int pos); +int addCommand(CommandHash *cmdTable[], Command *c,int pos); +int delCommand(CommandHash *cmdTable[], Command *c,char *mod_name); /* Del a command from a cmd table */ +int moduleDelCommand(CommandHash *cmdTable[],char *name); /* Del a command from a cmd table */ +Command *findCommand(CommandHash *cmdTable[], const char *name); /* Find a command */ +/*************************************************************************/ +/*************************************************************************/ +/* Message Managment Functions */ +Message *createMessage(char *name,int (*func)(char *source, int ac, char **av)); +Message *findMessage(MessageHash *msgTable[], const char *name); /* Find a Message */ +int addMessage(MessageHash *msgTable[], Message *m, int pos); /* Add a Message to a Message table */ +int addCoreMessage(MessageHash *msgTable[], Message *m); /* Add a Message to a Message table */ +int moduleAddMessage(Message *m, int pos); +int delMessage(MessageHash *msgTable[], Message *m, char *mod_name); /* Del a Message from a msg table */ +int moduleDelMessage(char *name); +int destroyMessage(Message *m); /* destroy a Message*/ +Message *findMessage(MessageHash *msgTable[], const char *name); +/*************************************************************************/ +int moduleAddCallback(char *name,time_t when,int (*func)(int argc, char *argv[]),int argc, char **argv); +void moduleDelCallback(char *name); +void moduleCallBackRun(void); + +char *moduleGetData(ModuleData *md[], char *key); /* Get the value for this key from this struct */ +int moduleAddData(ModuleData *md[], char *key, char *value); /* Set the value for this key for this struct */ +void moduleDelData(ModuleData *md[], char *key); /* Delete this key/value pair */ +void moduleDelAllData(ModuleData *md[]); /* Delete all key/value pairs for this module for this struct */ +void moduleCleanStruct(ModuleData * moduleData[]); /* Clean a moduleData hash */ +void moduleDelAllDataMod(Module *m); /* remove all module data from all structs for this module */ + +/*************************************************************************/ + +#endif +/* EOF */ diff --git a/include/pseudo.h b/include/pseudo.h new file mode 100644 index 000000000..f543d8a6c --- /dev/null +++ b/include/pseudo.h @@ -0,0 +1,20 @@ +/* Include extra includes needed by most/all pseudo-clients. + * + * (C) 2003 Anope Team + * Contact us at info@anope.org + * + * Please read COPYING and README for furhter details. + * + * Based on the original code of Epona by Lara. + * Based on the original code of Services by Andy Church. + * + * $Id$ + * + */ + +#include "commands.h" +#include "language.h" +#include "timeout.h" +#include "encrypt.h" +#include "datafiles.h" +#include "slist.h" diff --git a/include/services.h b/include/services.h new file mode 100644 index 000000000..42dc83dfa --- /dev/null +++ b/include/services.h @@ -0,0 +1,1521 @@ +/* + * + * (C) 2003 Anope Team + * Contact us at info@anope.org + * + * Please read COPYING and README for furhter details. + * + * Based on the original code of Epona by Lara. + * Based on the original code of Services by Andy Church. + * + * + */ + +#ifndef SERVICES_H +#define SERVICES_H + +/*************************************************************************/ + +#include "sysconf.h" +#include "config.h" + +#ifndef MAX_CMD_HASH +#define MAX_CMD_HASH 1024 +#endif + +/* Some Linux boxes (or maybe glibc includes) require this for the + * prototype of strsignal(). */ +#define _GNU_SOURCE + +/* Some AIX boxes define int16 and int32 on their own. Blarph. */ +#if INTTYPE_WORKAROUND +# define int16 builtin_int16 +# define int32 builtin_int32 +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* for umask() on some systems */ +#include +#include + +#ifdef USE_RDB +# define MAX_SQL_BUF 4096 +#endif + +#ifdef USE_MYSQL +# define MYSQL_WARNING 2 +# define MYSQL_ERROR 4 + +#ifdef HAVE_MYSQL_MYSQL_H +#ifdef MYSQL_HEADER_PREFIX + #include + #include +#else + #include + #include +#endif +#endif + + +#endif + +#if HAVE_STRINGS_H +# include +#endif + +#if HAVE_SYS_SELECT_H +# include +#endif + +#ifdef USE_THREADS +# include +#endif + +#ifdef _AIX +/* Some AIX boxes seem to have bogus includes that don't have these + * prototypes. */ +extern int strcasecmp(const char *, const char *); +extern int strncasecmp(const char *, const char *, size_t); +# if 0 /* These break on some AIX boxes (4.3.1 reported). */ +extern int gettimeofday(struct timeval *, struct timezone *); +extern int socket(int, int, int); +extern int bind(int, struct sockaddr *, int); +extern int connect(int, struct sockaddr *, int); +extern int shutdown(int, int); +# endif +# undef FD_ZERO +# define FD_ZERO(p) memset((p), 0, sizeof(*(p))) +#endif /* _AIX */ + +/* Alias stricmp/strnicmp to strcasecmp/strncasecmp if we have the latter + * but not the former. */ +#if !HAVE_STRICMP && HAVE_STRCASECMP +# define stricmp strcasecmp +# define strnicmp strncasecmp +#endif + +/* We have our own versions of toupper()/tolower(). */ +#include +#undef tolower +#undef toupper +#define tolower tolower_ +#define toupper toupper_ +extern int toupper(char), tolower(char); + +/* We also have our own encrypt(). */ +#define encrypt encrypt_ + + +#if INTTYPE_WORKAROUND +# undef int16 +# undef int32 +#endif + + +/* Miscellaneous definitions. */ +#include "defs.h" +#include "slist.h" + +/*************************************************************************/ + +typedef struct server_ Server; +typedef struct user_ User; +typedef struct channel_ Channel; + +/*************************************************************************/ +/*************************************************************************/ + +/* Protocol tweaks */ + + + +#ifdef IRC_HYBRID +# define HAS_HALFOP +# define HAS_EXCEPT /* Has +e (chan excepts) */ +# define NICKSERV_MODE "+o" +# define CHANSERV_MODE "+o" +# define MEMOSERV_MODE "+o" +# define BOTSERV_MODE "+o" +# define HELPSERV_MODE "+h" +# define OPERSERV_MODE "+io" +# define DEVNULL_MODE "+i" +# define GLOBAL_MODE "+io" +# define NICKSERV_ALIAS_MODE "+o" +# define CHANSERV_ALIAS_MODE "+o" +# define MEMOSERV_ALIAS_MODE "+o" +# define BOTSERV_ALIAS_MODE "+o" +# define HELPSERV_ALIAS_MODE "+h" +# define OPERSERV_ALIAS_MODE "+io" +# define DEVNULL_ALIAS_MODE "+i" +# define GLOBAL_ALIAS_MODE "+io" +# define BOTSERV_BOTS_MODE "+" +#endif + +#ifdef IRC_VIAGRA +# define HAS_HALFOP +# define HAS_VHOST +# define HAS_VIDENT +# define HAS_EXCEPT +# define NICKSERV_MODE "+oS" +# define CHANSERV_MODE "+oS" +# define HOSTSERV_MODE "+oS" +# define MEMOSERV_MODE "+oS" +# define BOTSERV_MODE "+oS" +# define HELPSERV_MODE "+oS" +# define OPERSERV_MODE "+ioS" +# define DEVNULL_MODE "+i" +# define GLOBAL_MODE "+ioS" +# define NICKSERV_ALIAS_MODE "+oS" +# define CHANSERV_ALIAS_MODE "+oS" +# define MEMOSERV_ALIAS_MODE "+oS" +# define BOTSERV_ALIAS_MODE "+oS" +# define HELPSERV_ALIAS_MODE "+oS" +# define OPERSERV_ALIAS_MODE "+ioS" +# define DEVNULL_ALIAS_MODE "+iS" +# define GLOBAL_ALIAS_MODE "+ioS" +# define HOSTSERV_ALIAS_MODE "+ioS" +# define BOTSERV_BOTS_MODE "+qS" +#endif + +#if defined(IRC_BAHAMUT) && !defined(IRC_ULTIMATE3) && !defined(IRC_VIAGRA) && !defined(IRC_RAGE2) +# define HAS_NICKIP +# define HAS_EXCEPT +# define HAS_SVSHOLD +# define NICKSERV_MODE "+o" +# define CHANSERV_MODE "+o" +# define MEMOSERV_MODE "+o" +# define BOTSERV_MODE "+o" +# define HELPSERV_MODE "+h" +# define OPERSERV_MODE "+io" +# define DEVNULL_MODE "+i" +# define GLOBAL_MODE "+io" +# define NICKSERV_ALIAS_MODE "+o" +# define CHANSERV_ALIAS_MODE "+o" +# define MEMOSERV_ALIAS_MODE "+o" +# define BOTSERV_ALIAS_MODE "+o" +# define HELPSERV_ALIAS_MODE "+h" +# define OPERSERV_ALIAS_MODE "+io" +# define DEVNULL_ALIAS_MODE "+i" +# define GLOBAL_ALIAS_MODE "+io" +# define BOTSERV_BOTS_MODE "+" +#endif + +#ifdef IRC_RAGE2 +# define HAS_HALFOP +# define HAS_EXCEPT +# define HAS_VHOST +# define HAS_NICKVHOST +# define NICKSERV_MODE "+dS" +# define CHANSERV_MODE "+dS" +# define HOSTSERV_MODE "+dS" +# define MEMOSERV_MODE "+dS" +# define BOTSERV_MODE "+dS" +# define HELPSERV_MODE "+dSh" +# define OPERSERV_MODE "+diS" +# define DEVNULL_MODE "+diS" +# define GLOBAL_MODE "+diS" +# define NICKSERV_ALIAS_MODE "+o" +# define CHANSERV_ALIAS_MODE "+o" +# define MEMOSERV_ALIAS_MODE "+o" +# define BOTSERV_ALIAS_MODE "+o" +# define HELPSERV_ALIAS_MODE "+h" +# define OPERSERV_ALIAS_MODE "+io" +# define DEVNULL_ALIAS_MODE "+i" +# define GLOBAL_ALIAS_MODE "+io" +# define HOSTSERV_ALIAS_MODE "+io" +# define BOTSERV_BOTS_MODE "+S" +#endif + +#ifdef IRC_PTLINK +# define HAS_NICKVHOST +# define HAS_VHOST +# define HAS_FMODE +# define HAS_EXCEPT +# define NICKSERV_MODE "+o" +# define CHANSERV_MODE "+o" +# define HOSTSERV_MODE "+o" +# define MEMOSERV_MODE "+o" +# define BOTSERV_MODE "+o" +# define HELPSERV_MODE "+h" +# define OPERSERV_MODE "+io" +# define DEVNULL_MODE "+i" +# define GLOBAL_MODE "+io" +# define NICKSERV_ALIAS_MODE "+o" +# define CHANSERV_ALIAS_MODE "+o" +# define MEMOSERV_ALIAS_MODE "+o" +# define BOTSERV_ALIAS_MODE "+o" +# define HELPSERV_ALIAS_MODE "+h" +# define OPERSERV_ALIAS_MODE "+io" +# define DEVNULL_ALIAS_MODE "+i" +# define GLOBAL_ALIAS_MODE "+io" +# define HOSTSERV_ALIAS_MODE "+io" +# define BOTSERV_BOTS_MODE "+" +#endif + +#ifdef IRC_ULTIMATE +# define HAS_FMODE /* Has +f chan mode */ +# define HAS_HALFOP +# define HAS_LMODE /* Has +L chan mode */ +# define HAS_VHOST +# define HAS_VIDENT /* Can the IRCD Change Idents on the fly */ +# define HAS_EXCEPT +# define NICKSERV_MODE "+S" +# define CHANSERV_MODE "+S" +# define HOSTSERV_MODE "+oS" +# define MEMOSERV_MODE "+S" +# define BOTSERV_MODE "+S" +# define HELPSERV_MODE "+Sh" +# define OPERSERV_MODE "+iS" +# define DEVNULL_MODE "+iS" +# define GLOBAL_MODE "+iS" +# define NICKSERV_ALIAS_MODE "+oS" +# define CHANSERV_ALIAS_MODE "+oS" +# define MEMOSERV_ALIAS_MODE "+oS" +# define BOTSERV_ALIAS_MODE "+oS" +# define HELPSERV_ALIAS_MODE "+oS" +# define OPERSERV_ALIAS_MODE "+ioS" +# define DEVNULL_ALIAS_MODE "+iS" +# define GLOBAL_ALIAS_MODE "+ioS" +# define HOSTSERV_ALIAS_MODE "+ioS" +# define BOTSERV_BOTS_MODE "+pS" +#endif + +#ifdef IRC_UNREAL +# define HAS_FMODE /* Has +f chan mode */ +# define HAS_HALFOP +# define HAS_LMODE /* Has +L chan mode */ +# define HAS_NICKVHOST +# define HAS_VHOST +# define HAS_VIDENT /* Can the IRCD Change Idents on the fly */ +# define HAS_EXCEPT +# define NICKSERV_MODE "+oS" +# define CHANSERV_MODE "+oS" +# define HOSTSERV_MODE "+oS" +# define MEMOSERV_MODE "+oS" +# define BOTSERV_MODE "+oS" +# define HELPSERV_MODE "+oS" +# define OPERSERV_MODE "+ioS" +# define DEVNULL_MODE "+iS" +# define GLOBAL_MODE "+ioS" +# define NICKSERV_ALIAS_MODE "+oS" +# define CHANSERV_ALIAS_MODE "+oS" +# define MEMOSERV_ALIAS_MODE "+oS" +# define BOTSERV_ALIAS_MODE "+oS" +# define HELPSERV_ALIAS_MODE "+oS" +# define OPERSERV_ALIAS_MODE "+ioS" +# define DEVNULL_ALIAS_MODE "+iS" +# define GLOBAL_ALIAS_MODE "+ioS" +# define HOSTSERV_ALIAS_MODE "+ioS" +# define BOTSERV_BOTS_MODE "+qS" +#endif + +#ifdef IRC_ULTIMATE3 +# define HAS_HALFOP +# define HAS_VHOST +# define HAS_NICKVHOST +# define HAS_VIDENT /* Can the IRCD Change Idents on the fly */ +# define HAS_EXCEPT +# define NICKSERV_MODE "+S" +# define CHANSERV_MODE "+S" +# define HOSTSERV_MODE "+o" +# define MEMOSERV_MODE "+S" +# define BOTSERV_MODE "+S" +# define HELPSERV_MODE "+Sh" +# define OPERSERV_MODE "+iS" +# define DEVNULL_MODE "+iS" +# define GLOBAL_MODE "+iS" +# define NICKSERV_ALIAS_MODE "+o" +# define CHANSERV_ALIAS_MODE "+o" +# define MEMOSERV_ALIAS_MODE "+o" +# define BOTSERV_ALIAS_MODE "+o" +# define HELPSERV_ALIAS_MODE "+h" +# define OPERSERV_ALIAS_MODE "+io" +# define DEVNULL_ALIAS_MODE "+i" +# define GLOBAL_ALIAS_MODE "+io" +# define HOSTSERV_ALIAS_MODE "+io" +# define BOTSERV_BOTS_MODE "+S" +#endif + +/* + This gets ugly since serval ircds use both DREAMFORCE and their own define +*/ + +#ifdef IRC_DREAMFORGE + #ifndef NICKSERV_MODE + # define NICKSERV_MODE "+o" + #endif + #ifndef CHANSERV_MODE + # define CHANSERV_MODE "+o" + #endif + #ifndef MEMOSERV_MODE + # define MEMOSERV_MODE "+o" + #endif + #ifndef BOTSERV_MODE + # define BOTSERV_MODE "+o" + #endif + #ifndef HELPSERV_MODE + # define HELPSERV_MODE "+h" + #endif + #ifndef OPERSERV_MODE + # define OPERSERV_MODE "+io" + #endif + #ifndef DEVNULL_MODE + # define DEVNULL_MODE "+i" + #endif + #ifndef GLOBAL_MODE + # define GLOBAL_MODE "+io" + #endif + #ifndef BOTSERV_BOTS_MODE + # define BOTSERV_BOTS_MODE "+" + #endif + #ifndef NICKSERV_ALIAS_MODE + # define NICKSERV_ALIAS_MODE "+o" + #endif + #ifndef CHANSERV_ALIAS_MODE + # define CHANSERV_ALIAS_MODE "+o" + #endif + #ifndef MEMOSERV_ALIAS_MODE + # define MEMOSERV_ALIAS_MODE "+o" + #endif + #ifndef BOTSERV_ALIAS_MODE + # define BOTSERV_ALIAS_MODE "+o" + #endif + #ifndef HELPSERV_ALIAS_MODE + # define HELPSERV_ALIAS_MODE "+h" + #endif + #ifndef OPERSERV_ALIAS_MODE + # define OPERSERV_ALIAS_MODE "+io" + #endif + #ifndef DEVNULL_ALIAS_MODE + # define DEVNULL_ALIAS_MODE "+i" + #endif + #ifndef GLOBAL_ALIAS_MODE + # define GLOBAL_ALIAS_MODE "+io" + #endif +#endif + +/*************************************************************************/ + +/* File version for each database. Was one version for all before but was + changed so they are now easier to maintain. =) */ + +#define BOT_VERSION 10 +#define CHAN_VERSION 16 +#define EXCEPTION_VERSION 9 +#define NEWS_VERSION 9 +#define NICK_VERSION 13 +#define PRE_NICK_VERSION 1 +#define OPER_VERSION 13 + +/** + * ModuleData strucs used to allow modules to add / delete module Data from existing structs + */ +typedef struct ModuleData_ ModuleData; /* ModuleData struct */ +typedef struct ModuleDataItem_ ModuleDataItem; /* A Module Data Item struct */ + +struct ModuleDataItem_ { + char *key; /* The key */ + char *value; /* The Value */ + ModuleDataItem *next; /* The next ModuleDataItem in this list */ +}; + +struct ModuleData_ { + char *moduleName; /* Which module we belong to */ + ModuleDataItem *di; /* The first Item they own */ + ModuleData *next; /* The next ModuleData record */ +}; + + + +typedef enum { false, true } boolean; + +/*************************************************************************/ + +/* Memo info structures. Since both nicknames and channels can have memos, + * we encapsulate memo data in a MemoList to make it easier to handle. */ + +typedef struct memo_ Memo; +struct memo_ { + uint32 number; /* Index number -- not necessarily array position! */ + int16 flags; + time_t time; /* When it was sent */ + char sender[NICKMAX]; + char *text; + ModuleData *moduleData[1024]; /* Module saved data attached to the Memo */ +}; + +#define MF_UNREAD 0x0001 /* Memo has not yet been read */ +#define MF_RECEIPT 0x0002 /* Sender requested receipt */ + +typedef struct { + int16 memocount, memomax; + Memo *memos; +} MemoInfo; + +/*************************************************************************/ + +/* NickServ nickname structures. */ +typedef struct nickrequest_ NickRequest; +typedef struct nickalias_ NickAlias; +typedef struct nickcore_ NickCore; + +struct nickrequest_ { + NickRequest *next, *prev; + char *nick; + char *passcode; + char *password; + char *email; + + time_t requested; + + time_t lastmail; /* Unsaved */ +}; + +struct nickalias_ { + NickAlias *next, *prev; + + char *nick; /* Nickname */ + + char *last_quit; /* Last quit message */ + char *last_realname; /* Last realname */ + char *last_usermask; /* Last usermask */ + + time_t time_registered; /* When the nick was registered */ + time_t last_seen; /* When it was seen online for the last time */ + + int16 status; /* See NS_* below */ + + NickCore *nc; /* I'm an alias of this */ + + /* Not saved */ + ModuleData *moduleData[1024]; /* Module saved data attached to the nick alias */ + User *u; /* Current online user that has me */ +}; + +struct nickcore_ { + NickCore *next, *prev; + + char *display; /* How the nick is displayed */ + char *pass; /* Password of the nicks */ + + char *email; /* E-mail associated to the nick */ + char *greet; /* Greet associated to the nick */ + uint32 icq; /* ICQ # associated to the nick */ + char *url; /* URL associated to the nick */ + + int32 flags; /* See NI_* below */ + uint16 language; /* Language selected by nickname owner (LANG_*) */ + + int16 accesscount; /* # of entries */ + char **access; /* Array of strings */ + + MemoInfo memos; + + uint16 channelcount; /* Number of channels currently registered */ + uint16 channelmax; /* Maximum number of channels allowed */ + + /* Unsaved data */ + ModuleData *moduleData[1024]; /* Module saved data attached to the NickCore */ + time_t lastmail; /* Last time this nick record got a mail */ + SList aliases; /* List of aliases */ +}; + +/* Nickname status flags: */ +#define NS_VERBOTEN 0x0002 /* Nick may not be registered or used */ +#define NS_NO_EXPIRE 0x0004 /* Nick never expires */ +#define NS_IDENTIFIED 0x8000 /* User has IDENTIFY'd */ +#define NS_RECOGNIZED 0x4000 /* ON_ACCESS true && SECURE flag not set */ +#define NS_ON_ACCESS 0x2000 /* User comes from a known address */ +#define NS_KILL_HELD 0x1000 /* Nick is being held after a kill */ +#define NS_GUESTED 0x0100 /* SVSNICK has been sent but nick has not + * yet changed. An enforcer will be + * introduced when it does change. */ +#define NS_MASTER 0x0200 /* Was a master nick; used to import old databases */ +#define NS_TRANSGROUP 0xC000 /* Status flags that can be passed to a nick of the + same group during nick change */ +#define NS_TEMPORARY 0xFF00 /* All temporary status flags */ +/* These two are not used anymore */ +#define NS_OLD_ENCRYPTEDPW 0x0001 /* Nickname password is encrypted */ + +/* Nickname setting flags: */ +#define NI_KILLPROTECT 0x00000001 /* Kill others who take this nick */ +#define NI_SECURE 0x00000002 /* Don't recognize unless IDENTIFY'd */ +#define NI_MSG 0x00000004 /* Use PRIVMSGs instead of NOTICEs */ +#define NI_MEMO_HARDMAX 0x00000008 /* Don't allow user to change memo limit */ +#define NI_MEMO_SIGNON 0x00000010 /* Notify of memos at signon and un-away */ +#define NI_MEMO_RECEIVE 0x00000020 /* Notify of new memos when sent */ +#define NI_PRIVATE 0x00000040 /* Don't show in LIST to non-servadmins */ +#define NI_HIDE_EMAIL 0x00000080 /* Don't show E-mail in INFO */ +#define NI_HIDE_MASK 0x00000100 /* Don't show last seen address in INFO */ +#define NI_HIDE_QUIT 0x00000200 /* Don't show last quit message in INFO */ +#define NI_KILL_QUICK 0x00000400 /* Kill in 20 seconds instead of 60 */ +#define NI_KILL_IMMED 0x00000800 /* Kill immediately instead of in 60 sec */ +#define NI_SERVICES_OPER 0x00001000 /* User is a Services operator */ +#define NI_SERVICES_ADMIN 0x00002000 /* User is a Services admin */ +#define NI_ENCRYPTEDPW 0x00004000 /* Nickname password is encrypted */ +#define NI_SERVICES_ROOT 0x00008000 /* User is a Services root */ +#define NI_MEMO_MAIL 0x00010000 /* User gets email on memo */ +#define NI_HIDE_STATUS 0x00020000 /* Don't show services access status */ + +/* Languages. Never insert anything in the middle of this list, or + * everybody will start getting the wrong language! If you want to change + * the order the languages are displayed in for NickServ HELP SET LANGUAGE, + * do it in language.c. + */ +#define LANG_EN_US 0 /* United States English */ +#define LANG_JA_JIS 1 /* Japanese (JIS encoding) */ +#define LANG_JA_EUC 2 /* Japanese (EUC encoding) */ +#define LANG_JA_SJIS 3 /* Japanese (SJIS encoding) */ +#define LANG_ES 4 /* Spanish */ +#define LANG_PT 5 /* Portugese */ +#define LANG_FR 6 /* French */ +#define LANG_TR 7 /* Turkish */ +#define LANG_IT 8 /* Italian */ +#define LANG_DE 9 /* German */ +#define LANG_CAT 10 /* Catalan */ +#define LANG_GR 11 /* Greek */ +#define LANG_NL 12 /* Dutch */ +#define LANG_RU