summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/commands.h34
-rw-r--r--include/config.h81
-rw-r--r--include/datafiles.h67
-rw-r--r--include/defs.h40
-rw-r--r--include/encrypt.h16
-rw-r--r--include/extern.h925
-rw-r--r--include/messages.h23
-rw-r--r--include/modules.h233
-rw-r--r--include/pseudo.h20
-rw-r--r--include/services.h1521
-rw-r--r--include/slist.h63
-rw-r--r--include/sysconf.h.in209
-rw-r--r--include/timeout.h50
-rw-r--r--include/version.sh146
14 files changed, 3428 insertions, 0 deletions
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 ****/
+