summaryrefslogtreecommitdiff
path: root/include/services.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/services.h')
-rw-r--r--include/services.h1389
1 files changed, 1389 insertions, 0 deletions
diff --git a/include/services.h b/include/services.h
new file mode 100644
index 000000000..f350d0d2a
--- /dev/null
+++ b/include/services.h
@@ -0,0 +1,1389 @@
+/*
+ *
+ * (C) 2003-2008 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(). */
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+/* Some SUN fixs */
+#ifdef __sun
+/* Solaris specific code, types that do not exist in Solaris'
+ * sys/types.h
+ **/
+#undef u_int8_t
+#undef u_int16_t
+#undef u_int32_t
+#undef u_int_64_t
+#define u_int8_t uint8_t
+#define u_int16_t uint16_t
+#define u_int32_t uint32_t
+#define u_int64_t uint64_t
+
+#ifndef INADDR_NONE
+#define INADDR_NONE (-1)
+#endif
+
+#endif
+
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Windows does not have:
+ * unistd.h, grp.h,
+ * netdb.h, netinet/in.h,
+ * sys/socket.h, sys/time.h
+ * Windows requires:
+ * winsock.h
+ * -- codemastr
+ */
+
+#ifndef _WIN32
+#include <unistd.h>
+#endif
+
+#include <signal.h>
+#include <time.h>
+#include <errno.h>
+
+#ifndef _WIN32
+#include <grp.h>
+#endif
+
+#include <limits.h>
+
+#ifndef _WIN32
+#include <netdb.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/socket.h>
+#else
+#include <winsock.h>
+#include <windows.h>
+#endif
+
+#include <sys/stat.h> /* for umask() on some systems */
+#include <sys/types.h>
+
+#ifndef _WIN32
+#include <sys/time.h>
+#endif
+
+#ifdef _WIN32
+#include <sys/timeb.h>
+#include <direct.h>
+#include <io.h>
+#endif
+
+#include <fcntl.h>
+
+#ifndef _WIN32
+#ifdef HAVE_BACKTRACE
+#include <execinfo.h>
+#endif
+#endif
+
+#ifndef _WIN32
+#include <dirent.h>
+#endif
+
+#ifdef _WIN32
+/* VS2008 hates having this define before its own */
+#define vsnprintf _vsnprintf
+#endif
+
+#ifdef USE_RDB
+# define MAX_SQL_BUF 4096
+#endif
+
+#ifdef USE_MYSQL
+# define MYSQL_WARNING 2
+# define MYSQL_ERROR 4
+# define MYSQL_DEFAULT_PORT 3306
+#ifdef MYSQL_HEADER_PREFIX
+# include <mysql/mysql.h>
+# include <mysql/errmsg.h>
+#else
+# include <mysql.h>
+# include <errmsg.h>
+#endif
+#endif
+
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+
+#if HAVE_SYS_SELECT_H
+# include <sys/select.h>
+#endif
+
+#include "sockets.h"
+
+#ifndef va_copy
+# ifdef __va_copy
+# define VA_COPY(DEST,SRC) __va_copy((DEST),(SRC))
+# else
+# define VA_COPY(DEST, SRC) memcpy ((&DEST), (&SRC), sizeof(va_list))
+# endif
+#else
+# ifdef HAVE_VA_LIST_AS_ARRAY
+# define VA_COPY(DEST,SRC) (*(DEST) = *(SRC))
+# else
+# define VA_COPY(DEST, SRC) va_copy(DEST, SRC)
+# endif
+#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 <ctype.h>
+#undef tolower
+#undef toupper
+#define tolower tolower_
+#define toupper toupper_
+
+/* We also have our own encrypt(). */
+#define encrypt encrypt_
+
+
+#ifdef __WINS__
+#ifndef BKCHECK
+#define BKCHECK
+ extern "C" void __pfnBkCheck() {}
+#endif
+#endif
+
+
+#if INTTYPE_WORKAROUND
+# undef int16
+# undef int32
+#endif
+
+
+/* Miscellaneous definitions. */
+#include "defs.h"
+#include "slist.h"
+#include "events.h"
+
+/*************************************************************************/
+
+typedef struct server_ Server;
+typedef struct user_ User;
+typedef struct channel_ Channel;
+typedef struct c_elist EList;
+typedef struct c_elist_entry Entry;
+typedef struct ModuleData_ ModuleData; /* ModuleData struct */
+typedef struct memo_ Memo;
+typedef struct nickrequest_ NickRequest;
+typedef struct nickalias_ NickAlias;
+typedef struct nickcore_ NickCore;
+typedef struct botinfo_ BotInfo;
+typedef struct chaninfo_ ChannelInfo;
+typedef struct badword_ BadWord;
+typedef struct bandata_ BanData;
+typedef struct userdata_ UserData;
+typedef struct mailinfo_ MailInfo;
+typedef struct akill_ Akill;
+typedef struct sxline_ SXLine;
+typedef struct hostcore_ HostCore;
+typedef struct newsitem_ NewsItem;
+typedef struct exception_ Exception;
+typedef struct cbmode_ CBMode;
+typedef struct cbmodeinfo_ CBModeInfo;
+typedef struct cmmode_ CMMode;
+typedef struct csmode_ CSMode;
+typedef struct cumode_ CUMode;
+typedef struct csmodeutil_ CSModeUtil;
+typedef struct session_ Session;
+typedef struct uid_ Uid;
+
+/*************************************************************************/
+
+/* Windows defines a boolean type as an
+ * unsigned char. It does however need
+ * true/false. -- codemastr
+ */
+#ifndef _WIN32
+typedef enum { false, true } boolean;
+#else
+ #ifndef true
+ #define true 1
+ #endif
+ #ifndef false
+ #define false 0
+ #endif
+#endif /* _WIN32 */
+
+/*************************************************************************/
+
+/* Protocol tweaks */
+
+typedef struct ircdvars_ IRCDVar;
+typedef struct ircdcapab_ IRCDCAPAB;
+
+struct ircdvars_ {
+ char *name; /* Name of the ChanServ command */
+ char *nickservmode; /* Mode used by NickServ */
+ char *chanservmode; /* Mode used by ChanServ */
+ char *memoservmode; /* Mode used by MemoServ */
+ char *hostservmode; /* Mode used by HostServ */
+ char *operservmode; /* Mode used by OperServ */
+ char *botservmode; /* Mode used by BotServ */
+ char *helpservmode; /* Mode used by HelpServ */
+ char *devnullmode; /* Mode used by Dev/Null */
+ char *globalmode; /* Mode used by Global */
+ char *nickservaliasmode; /* Mode used by NickServ Alias */
+ char *chanservaliasmode; /* Mode used by ChanServ Alias */
+ char *memoservaliasmode; /* Mode used by MemoServ Alias */
+ char *hostservaliasmode; /* Mode used by HostServ Alias */
+ char *operservaliasmode; /* Mode used by OperServ Alias */
+ char *botservaliasmode; /* Mode used by BotServ Alias */
+ char *helpservaliasmode; /* Mode used by HelpServ Alias */
+ char *devnullvaliasmode; /* Mode used by Dev/Null Alias */
+ char *globalaliasmode; /* Mode used by Global Alias */
+ char *botserv_bot_mode; /* Mode used by BotServ Bots */
+ int max_symbols; /* Chan Max Symbols */
+ char *modestoremove; /* Channel Modes to remove */
+ char *botchanumode; /* Modes set when botserv joins a channel */
+ int svsnick; /* Supports SVSNICK */
+ int vhost; /* Supports vhost */
+ int owner; /* Supports Owner */
+ char *ownerset; /* Mode to set for owner */
+ char *ownerunset; /* Mode to unset for a owner */
+ char *adminset; /* Mode to set for admin */
+ char *adminunset; /* Mode to unset for admin */
+ char *modeonreg; /* Mode on Register */
+ char *rootmodeonid; /* Mode on ID for ROOTS */
+ char *adminmodeonid; /* Mode on ID for ADMINS */
+ char *opermodeonid; /* Mode on ID for OPERS */
+ char *modeonunreg; /* Mode on Unregister */
+ char *modeonnick; /* Mode on nick change */
+ int sgline; /* Supports SGline */
+ int sqline; /* Supports SQline */
+ int szline; /* Supports SZline */
+ int halfop; /* Supports HalfOp */
+ int numservargs; /* Number of Server Args */
+ int join2set; /* Join 2 Set Modes */
+ int join2msg; /* Join 2 Message */
+ int except; /* exception +e */
+ int topictsforward; /* TS on Topics Forward */
+ int topictsbackward; /* TS on Topics Backward */
+ uint32 protectedumode; /* What is the Protected Umode */
+ int admin; /* Has Admin */
+ int chansqline; /* Supports Channel Sqlines */
+ int quitonkill; /* IRCD sends QUIT when kill */
+ int svsmode_unban; /* svsmode can be used to unban */
+ int protect; /* Has protect modes */
+ int reversekickcheck; /* Can reverse ban check */
+ int chanreg; /* channel mode +r for register */
+ uint32 regmode; /* Mode to use for +r */
+ int vident; /* Supports vidents */
+ int svshold; /* Supports svshold */
+ int tsonmode; /* Timestamp on mode changes */
+ int nickip; /* Sends IP on NICK */
+ int omode; /* On the fly o:lines */
+ int umode; /* change user modes */
+ int nickvhost; /* Users vhost sent during NICK */
+ int chgreal; /* Change RealName */
+ uint32 noknock; /* Channel Mode for no knock */
+ uint32 adminmode; /* Admin Only Channel Mode */
+ uint32 defmlock; /* Default mlock modes */
+ uint32 vhostmode; /* Vhost mode */
+ int fmode; /* +f */
+ int Lmode; /* +L */
+ uint32 chan_fmode; /* Mode */
+ uint32 chan_lmode; /* Mode */
+ int check_nick_id; /* On nick change check if they could be identified */
+ int knock_needs_i; /* Check if we needed +i when setting NOKNOCK */
+ char *chanmodes; /* If the ircd sends CHANMODE in CAPAB this is where we store it */
+ int token; /* Does Anope support the tokens for the ircd */
+ int tokencaseless; /* TOKEN are not case senstive - most its Unreal that is case senstive */
+ int sjb64; /* Base 64 encode TIMESTAMP */
+ int invitemode; /* +I */
+ int sjoinbanchar; /* use single quotes to define it */
+ int sjoinexchar; /* use single quotes to define it */
+ int sjoininvchar; /* use single quotes to define it */
+ int svsmode_ucmode; /* Can remove User Channel Modes with SVSMODE */
+ int sglineenforce;
+ char *vhostchar; /* char used for vhosting */
+ int ts6; /* ircd is TS6 */
+ int supporthelper; /* +h helper umodes */
+ int p10; /* ircd is P10 */
+ char *nickchars; /* character set */
+ int sync; /* reports sync state */
+ int cidrchanbei; /* channel bans/excepts/invites support CIDR (syntax: +b *!*@192.168.0.0/15)
+ * 0 for no support, 1 for strict cidr support, anything else
+ * for ircd specific support (nefarious only cares about first /mask) */
+};
+
+struct ircdcapab_ {
+ uint32 noquit;
+ uint32 tsmode;
+ uint32 unconnect;
+ uint32 nickip;
+ uint32 nsjoin;
+ uint32 zip;
+ uint32 burst;
+ uint32 ts5;
+ uint32 ts3;
+ uint32 dkey;
+ uint32 pt4;
+ uint32 scs;
+ uint32 qs;
+ uint32 uid;
+ uint32 knock;
+ uint32 client;
+ uint32 ipv6;
+ uint32 ssj5;
+ uint32 sn2;
+ uint32 token;
+ uint32 vhost;
+ uint32 ssj3;
+ uint32 nick2;
+ uint32 umode2;
+ uint32 vl;
+ uint32 tlkext;
+ uint32 dodkey;
+ uint32 dozip;
+ uint32 chanmodes;
+ uint32 sjb64;
+ uint32 nickchars;
+};
+
+/* tiny struct needed for P10 and other UID servers so we can track
+ services UID
+*/
+struct uid_ {
+ Uid *next, *prev;
+ char nick[NICKMAX];
+ char *uid;
+};
+
+/*************************************************************************/
+/* Config Details */
+/*************************************************************************/
+
+#define MAXPARAMS 8
+
+/* Configuration directives */
+
+typedef struct {
+ char *name;
+ struct {
+ int type; /* PARAM_* below */
+ int flags; /* Same */
+ void *ptr; /* Pointer to where to store the value */
+ } params[MAXPARAMS];
+} Directive;
+
+#define PARAM_NONE 0
+#define PARAM_INT 1
+#define PARAM_POSINT 2 /* Positive integer only */
+#define PARAM_PORT 3 /* 1..65535 only */
+#define PARAM_STRING 4
+#define PARAM_TIME 5
+#define PARAM_STRING_ARRAY 6 /* Array of string */
+#define PARAM_SET -1 /* Not a real parameter; just set the
+ * given integer variable to 1 */
+#define PARAM_DEPRECATED -2 /* Set for deprecated directives; `ptr'
+ * is a function pointer to call */
+
+/* Flags: */
+#define PARAM_OPTIONAL 0x01
+#define PARAM_FULLONLY 0x02 /* Directive only allowed if !STREAMLINED */
+#define PARAM_RELOAD 0x04 /* Directive is reloadable */
+
+/*************************************************************************/
+
+/* 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 14
+#define PRE_NICK_VERSION 2
+#define OPER_VERSION 13
+#define HELP_VERSION 1
+#define HOST_VERSION 3
+
+/*************************************************************************/
+
+
+/**
+ * ModuleData strucs used to allow modules to add / delete module Data from existing structs
+ */
+
+struct ModuleData_ {
+ char *moduleName; /* Which module we belong to */
+ char *key; /* The key */
+ char *value; /* The Value */
+ ModuleData *next; /* The next ModuleData record */
+};
+
+ /*************************************************************************/
+
+/* Memo info structures. Since both nicknames and channels can have memos,
+ * we encapsulate memo data in a MemoList to make it easier to handle. */
+
+struct memo_ {
+ uint32 number; /* Index number -- not necessarily array position! */
+ uint16 flags;
+ time_t time; /* When it was sent */
+ char sender[NICKMAX];
+ char *text;
+ ModuleData *moduleData; /* Module saved data attached to the Memo */
+#ifdef USE_MYSQL
+ uint32 id; /* Database ID; see mysql.c */
+#endif
+};
+
+typedef struct {
+ int16 memocount, memomax;
+ Memo *memos;
+} MemoInfo;
+
+/*************************************************************************/
+
+/* NickServ nickname structures. */
+
+
+struct nickrequest_ {
+ NickRequest *next, *prev;
+ char *nick;
+ char *passcode;
+ char password[PASSMAX];
+ 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 */
+ uint16 status; /* See NS_* below */
+ NickCore *nc; /* I'm an alias of this */
+ /* Not saved */
+ ModuleData *moduleData; /* 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[PASSMAX]; /* 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 */
+ uint32 flags; /* See NI_* below */
+ uint16 language; /* Language selected by nickname owner (LANG_*) */
+ uint16 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; /* Module saved data attached to the NickCore */
+ time_t lastmail; /* Last time this nick record got a mail */
+ SList aliases; /* List of aliases */
+};
+
+
+/*************************************************************************/
+
+/* Bot info structures. Note that since there won't be many bots,
+ * they're not in a hash list.
+ * --lara
+ */
+
+struct botinfo_ {
+ BotInfo *next, *prev;
+
+ char *nick; /* Nickname of the bot */
+ char *user; /* Its user name */
+ char *host; /* Its hostname */
+ char *real; /* Its real name */
+ int16 flags; /* Bot flags -- see BI_* below */
+ time_t created; /* Birth date ;) */
+ int16 chancount; /* Number of channels that use the bot. */
+ /* Dynamic data */
+ time_t lastmsg; /* Last time we said something */
+};
+
+
+
+/* Channel info structures. Stored similarly to the nicks, except that
+ * the second character of the channel name, not the first, is used to
+ * determine the list. (Hashing based on the first character of the name
+ * wouldn't get very far. ;) ) */
+
+/* Access levels for users. */
+typedef struct {
+ uint16 in_use; /* 1 if this entry is in use, else 0 */
+ int16 level;
+ NickCore *nc; /* Guaranteed to be non-NULL if in use, NULL if not */
+ time_t last_seen;
+} ChanAccess;
+
+/* Note that these two levels also serve as exclusive boundaries for valid
+ * access levels. ACCESS_FOUNDER may be assumed to be strictly greater
+ * than any valid access level, and ACCESS_INVALID may be assumed to be
+ * strictly less than any valid access level. Also read below.
+ */
+#define ACCESS_FOUNDER 10000 /* Numeric level indicating founder access */
+#define ACCESS_INVALID -10000 /* Used in levels[] for disabled settings */
+/* There is one exception to the above access levels: SuperAdmins will have
+ * access level 10001. This level is never stored, however; it is only used
+ * in comparison and to let SuperAdmins win from founders where needed
+ */
+#define ACCESS_SUPERADMIN 10001
+
+/* Levels for xOP */
+
+#define ACCESS_VOP 3
+#define ACCESS_HOP 4
+#define ACCESS_AOP 5
+#define ACCESS_SOP 10
+
+/* AutoKick data. */
+typedef struct {
+ int16 in_use; /* Always 0 if not in use */
+ int16 is_nick; /* 1 if a regged nickname, 0 if a nick!user@host mask */
+ uint16 flags;
+ union {
+ char *mask; /* Guaranteed to be non-NULL if in use, NULL if not */
+ NickCore *nc; /* Same */
+ } u;
+ char *reason;
+
+ char *creator;
+ time_t addtime;
+} AutoKick;
+
+#define AK_USED 0x0001
+#define AK_ISNICK 0x0002
+#define AK_STUCK 0x0004
+
+/* Structure used to contain bad words. */
+
+struct badword_ {
+ uint16 in_use;
+ char *word;
+ uint16 type; /* BW_* below */
+};
+
+#define BW_ANY 0
+#define BW_SINGLE 1
+#define BW_START 2
+#define BW_END 3
+
+
+struct chaninfo_ {
+ ChannelInfo *next, *prev;
+ char name[CHANMAX];
+ NickCore *founder;
+ NickCore *successor; /* Who gets the channel if the founder
+ * nick is dropped or expires */
+ char founderpass[PASSMAX];
+ char *desc;
+ char *url;
+ char *email;
+
+ time_t time_registered;
+ time_t last_used;
+ char *last_topic; /* Last topic on the channel */
+ char last_topic_setter[NICKMAX]; /* Who set the last topic */
+ time_t last_topic_time; /* When the last topic was set */
+
+ uint32 flags; /* See below */
+ char *forbidby;
+ char *forbidreason;
+
+ int16 bantype;
+ int16 *levels; /* Access levels for commands */
+
+ uint16 accesscount;
+ ChanAccess *access; /* List of authorized users */
+ uint16 akickcount;
+ AutoKick *akick; /* List of users to kickban */
+
+ uint32 mlock_on, mlock_off; /* See channel modes below */
+ uint32 mlock_limit; /* 0 if no limit */
+ char *mlock_key; /* NULL if no key */
+ char *mlock_flood; /* NULL if no +f */
+ char *mlock_redirect; /* NULL if no +L */
+
+ char *entry_message; /* Notice sent on entering channel */
+
+ MemoInfo memos;
+
+ struct channel_ *c; /* Pointer to channel record (if *
+ * channel is currently in use) */
+
+ ModuleData *moduleData; /* Module saved data attached to the ChannelInfo */
+
+ /* For BotServ */
+
+ BotInfo *bi; /* Bot used on this channel */
+ uint32 botflags; /* BS_* below */
+ int16 *ttb; /* Times to ban for each kicker */
+
+ uint16 bwcount;
+ BadWord *badwords; /* For BADWORDS kicker */
+ int16 capsmin, capspercent; /* For CAPS kicker */
+ int16 floodlines, floodsecs; /* For FLOOD kicker */
+ int16 repeattimes; /* For REPEAT kicker */
+};
+
+/* Retain topic even after last person leaves channel */
+#define CI_KEEPTOPIC 0x00000001
+/* Don't allow non-authorized users to be opped */
+#define CI_SECUREOPS 0x00000002
+/* Hide channel from ChanServ LIST command */
+#define CI_PRIVATE 0x00000004
+/* Topic can only be changed by SET TOPIC */
+#define CI_TOPICLOCK 0x00000008
+/* Those not allowed ops are kickbanned */
+#define CI_RESTRICTED 0x00000010
+/* Don't allow ChanServ and BotServ commands to do bad things to bigger levels */
+#define CI_PEACE 0x00000020
+/* Don't allow any privileges unless a user is IDENTIFY'd with NickServ */
+#define CI_SECURE 0x00000040
+/* Don't allow the channel to be registered or used */
+#define CI_VERBOTEN 0x00000080
+/* Channel password is encrypted */
+#define CI_ENCRYPTEDPW 0x00000100
+/* Channel does not expire */
+#define CI_NO_EXPIRE 0x00000200
+/* Channel memo limit may not be changed */
+#define CI_MEMO_HARDMAX 0x00000400
+/* Send notice to channel on use of OP/DEOP */
+#define CI_OPNOTICE 0x00000800
+/* Stricter control of channel founder status */
+#define CI_SECUREFOUNDER 0x00001000
+/* Always sign kicks */
+#define CI_SIGNKICK 0x00002000
+/* Sign kicks if level is < than the one defined by the SIGNKICK level */
+#define CI_SIGNKICK_LEVEL 0x00004000
+/* Use the xOP lists */
+#define CI_XOP 0x00008000
+/* Channel is suspended */
+#define CI_SUSPENDED 0x00010000
+
+/* TEMPORARY - ChanServ is on the channel. */
+#define CI_INHABIT 0x80000000
+
+/* Indices for cmd_access[]: */
+#define CA_INVITE 0
+#define CA_AKICK 1
+#define CA_SET 2 /* but not FOUNDER or PASSWORD */
+#define CA_UNBAN 3
+#define CA_AUTOOP 4
+#define CA_AUTODEOP 5 /* Maximum, not minimum */
+#define CA_AUTOVOICE 6
+#define CA_OPDEOP 7 /* ChanServ commands OP and DEOP */
+#define CA_ACCESS_LIST 8
+#define CA_CLEAR 9
+#define CA_NOJOIN 10 /* Maximum */
+#define CA_ACCESS_CHANGE 11
+#define CA_MEMO 12
+#define CA_ASSIGN 13 /* BotServ ASSIGN command */
+#define CA_BADWORDS 14 /* BotServ BADWORDS command */
+#define CA_NOKICK 15 /* Not kicked by the bot */
+#define CA_FANTASIA 16
+#define CA_SAY 17
+#define CA_GREET 18
+#define CA_VOICEME 19
+#define CA_VOICE 20
+#define CA_GETKEY 21
+#define CA_AUTOHALFOP 22
+#define CA_AUTOPROTECT 23
+#define CA_OPDEOPME 24
+#define CA_HALFOPME 25
+#define CA_HALFOP 26
+#define CA_PROTECTME 27
+#define CA_PROTECT 28
+#define CA_KICKME 29
+#define CA_KICK 30
+#define CA_SIGNKICK 31
+/* #define CA_AUTOADMIN 32
+#define CA_ADMINME 33
+#define CA_ADMIN 34 */
+ /* Why are these commented out and not removed? -GD */
+#define CA_BANME 32
+#define CA_BAN 33
+#define CA_TOPIC 34
+#define CA_INFO 35
+
+#define CA_SIZE 36
+
+/* BotServ SET flags */
+#define BS_DONTKICKOPS 0x00000001
+#define BS_DONTKICKVOICES 0x00000002
+#define BS_FANTASY 0x00000004
+#define BS_SYMBIOSIS 0x00000008
+#define BS_GREET 0x00000010
+#define BS_NOBOT 0x00000020
+
+/* BotServ Kickers flags */
+#define BS_KICK_BOLDS 0x80000000
+#define BS_KICK_COLORS 0x40000000
+#define BS_KICK_REVERSES 0x20000000
+#define BS_KICK_UNDERLINES 0x10000000
+#define BS_KICK_BADWORDS 0x08000000
+#define BS_KICK_CAPS 0x04000000
+#define BS_KICK_FLOOD 0x02000000
+#define BS_KICK_REPEAT 0x01000000
+
+/* Indices for TTB (Times To Ban) */
+#define TTB_BOLDS 0
+#define TTB_COLORS 1
+#define TTB_REVERSES 2
+#define TTB_UNDERLINES 3
+#define TTB_BADWORDS 4
+#define TTB_CAPS 5
+#define TTB_FLOOD 6
+#define TTB_REPEAT 7
+#define TTB_SIZE 8
+
+/*************************************************************************/
+
+/* ChanServ mode utilities commands */
+
+struct csmodeutil_ {
+ char *name; /* Name of the ChanServ command */
+ char *bsname; /* Name of the BotServ fantasy command */
+ char *mode; /* Mode (ie. +o) */
+ int32 notice; /* Notice flag (for the damn OPNOTICE) */
+ int level; /* Level required to use the command */
+ int levelself; /* Level required to use the command for himself */
+};
+
+typedef struct {
+ int what;
+ char *name;
+ int desc;
+} LevelInfo;
+
+
+/*************************************************************************/
+
+/* Server data */
+
+typedef enum {
+ SSYNC_UNKNOWN = 0, /* We can't get the sync state */
+ SSYNC_IN_PROGRESS = 1, /* Sync is currently in progress */
+ SSYNC_DONE = 2 /* We're in sync */
+} SyncState;
+
+struct server_ {
+ Server *next, *prev;
+
+ char *name; /* Server name */
+ uint16 hops; /* Hops between services and server */
+ char *desc; /* Server description */
+ uint16 flags; /* Some info flags, as defined below */
+ char *suid; /* Server Univeral ID */
+ SyncState sync; /* Server sync state (see above) */
+
+ Server *links; /* Linked list head for linked servers */
+ Server *uplink; /* Server which pretends to be the uplink */
+};
+
+#define SERVER_ISME 0x0001
+#define SERVER_JUPED 0x0002
+
+/*************************************************************************/
+
+/* Online user and channel data. */
+struct user_ {
+ User *next, *prev;
+
+ char nick[NICKMAX];
+
+ char *username; /* ident */
+ char *host; /* User's real hostname */
+ char *hostip; /* User's IP number */
+ char *vhost; /* User's virtual hostname */
+ char *vident; /* User's virtual ident */
+ char *realname; /* Realname */
+ Server *server; /* Server user is connected to */
+ char *nickTrack; /* Nick Tracking */
+ time_t timestamp; /* Timestamp of the nick */
+ time_t my_signon; /* When did _we_ see the user? */
+ uint32 svid; /* Services ID */
+ uint32 mode; /* See below */
+ char *uid; /* Univeral ID */
+
+ NickAlias *na;
+
+ ModuleData *moduleData; /* defined for it, it should allow the module Add/Get */
+
+ int isSuperAdmin; /* is SuperAdmin on or off? */
+
+ struct u_chanlist {
+ struct u_chanlist *next, *prev;
+ Channel *chan;
+ int16 status; /* Associated flags; see CSTATUS_* below. */
+ } *chans; /* Channels user has joined */
+
+ struct u_chaninfolist {
+ struct u_chaninfolist *next, *prev;
+ ChannelInfo *chan;
+ } *founder_chans; /* Channels user has identified for */
+
+ short invalid_pw_count; /* # of invalid password attempts */
+ time_t invalid_pw_time; /* Time of last invalid password */
+
+ time_t lastmemosend; /* Last time MS SEND command used */
+ time_t lastnickreg; /* Last time NS REGISTER cmd used */
+ time_t lastmail; /* Last time this user sent a mail */
+};
+
+
+
+struct cbmode_ {
+ uint32 flag; /* Long value that represents the mode */
+ uint16 flags; /* Flags applying to this mode (CBM_* below) */
+
+ /* Function to associate a value with the mode */
+ void (*setvalue) (Channel *chan, char *value);
+ void (*cssetvalue) (ChannelInfo *ci, char *value);
+};
+
+#define CBM_MINUS_NO_ARG 0x0001 /* No argument for unset */
+#define CBM_NO_MLOCK 0x0002 /* Can't be MLOCKed */
+#define CBM_NO_USER_MLOCK 0x0004 /* Can't be MLOCKed by non-opers */
+
+struct cbmodeinfo_ {
+ char mode; /* The mode */
+ uint32 flag; /* Long value that represents the mode */
+ uint16 flags; /* CBM_* above */
+
+ /* Function to retrieve the value associated to the mode (optional) */
+ char * (*getvalue) (Channel *chan);
+ char * (*csgetvalue) (ChannelInfo *ci);
+};
+
+struct cmmode_ {
+ void (*addmask) (Channel *chan, char *mask);
+ void (*delmask) (Channel *chan, char *mask);
+};
+
+struct cumode_ {
+ int16 status; /* CUS_* below */
+ int16 flags; /* CUF_* below */
+
+ int (*is_valid) (User *user, Channel *chan, int servermode);
+};
+
+/* Channel user mode flags */
+
+#define CUF_PROTECT_BOTSERV 0x0001
+
+/* This structure stocks ban data since it must not be removed when
+ * user is kicked.
+ */
+
+struct bandata_ {
+ BanData *next, *prev;
+
+ char *mask; /* Since a nick is unsure and a User structure
+ is unsafe */
+ time_t last_use; /* Since time is the only way to check
+ whether it's still useful */
+ int16 ttb[TTB_SIZE];
+};
+
+/* This structure stocks information on every user that will be used by
+ * BotServ. */
+
+struct userdata_ {
+ /* Data validity */
+ time_t last_use;
+
+ /* for flood kicker */
+ int16 lines;
+ time_t last_start;
+
+ /* for repeat kicker */
+ char *lastline;
+ int16 times;
+};
+
+/* Channelban type flags */
+#define ENTRYTYPE_NONE 0x00000000
+#define ENTRYTYPE_CIDR4 0x00000001
+#define ENTRYTYPE_NICK_WILD 0x00000004
+#define ENTRYTYPE_NICK 0x00000008
+#define ENTRYTYPE_USER_WILD 0x00000010
+#define ENTRYTYPE_USER 0x00000020
+#define ENTRYTYPE_HOST_WILD 0x00000040
+#define ENTRYTYPE_HOST 0x00000080
+
+struct channel_ {
+ Channel *next, *prev;
+ char name[CHANMAX];
+ ChannelInfo *ci; /* Corresponding ChannelInfo */
+ time_t creation_time; /* When channel was created */
+ char *topic;
+ char topic_setter[NICKMAX]; /* Who set the topic */
+ time_t topic_time; /* When topic was set */
+ uint32 mode; /* Binary modes only */
+ uint32 limit; /* 0 if none */
+ char *key; /* NULL if none */
+ char *redirect; /* +L; NULL if none */
+ char *flood; /* +f; NULL if none */
+ EList *bans;
+ EList *excepts;
+ EList *invites;
+ struct c_userlist {
+ struct c_userlist *next, *prev;
+ User *user;
+ UserData *ud;
+ } *users;
+ int16 usercount;
+
+ BanData *bd;
+
+ time_t server_modetime; /* Time of last server MODE */
+ time_t chanserv_modetime; /* Time of last check_modes() */
+ int16 server_modecount; /* Number of server MODEs this second */
+ int16 chanserv_modecount; /* Number of check_mode()'s this sec */
+ int16 bouncy_modes; /* Did we fail to set modes here? */
+ int16 topic_sync; /* Is the topic in sync? */
+};
+
+struct c_elist {
+ Entry *entries;
+ int32 count;
+};
+
+struct c_elist_entry {
+ Entry *next, *prev;
+ uint32 type;
+ uint32 cidr_ip; /* IP mask for CIDR matching */
+ uint32 cidr_mask; /* Netmask for CIDR matching */
+ char *nick, *user, *host, *mask;
+};
+
+/*************************************************************************/
+
+/* Constants for news types. */
+
+#define NEWS_LOGON 0
+#define NEWS_OPER 1
+#define NEWS_RANDOM 2
+
+/*************************************************************************/
+
+/* Ignorance list data. */
+
+typedef struct ignore_data {
+ struct ignore_data *prev, *next;
+ char *mask;
+ time_t time; /* When do we stop ignoring them? */
+} IgnoreData;
+
+/*************************************************************************/
+
+/* Mail data */
+
+struct mailinfo_ {
+ FILE *pipe;
+ User *sender;
+ NickCore *recipient;
+ NickRequest *recip;
+};
+
+/*************************************************************************/
+
+struct akill_ {
+ char *user; /* User part of the AKILL */
+ char *host; /* Host part of the AKILL */
+
+ char *by; /* Who set the akill */
+ char *reason; /* Why they got akilled */
+
+ time_t seton; /* When it was set */
+ time_t expires; /* When it expires */
+};
+
+/*************************************************************************/
+
+/* Structure for OperServ SGLINE and SZLINE commands */
+
+struct sxline_ {
+ char *mask;
+ char *by;
+ char *reason;
+ time_t seton;
+ time_t expires;
+};
+
+
+/************************************************************************/
+
+/* Host serv structures */
+
+struct hostcore_ {
+ HostCore *next;
+ char *nick; /* Owner of the vHost */
+ char *vIdent; /* vIdent for the user */
+ char *vHost; /* Vhost for this user */
+ char *creator; /* Oper Nick of the oper who set the vhost */
+ time_t time; /* Date/Time vHost was set */
+};
+
+/*************************************************************************/
+
+struct newsitem_ {
+ uint16 type;
+ uint32 num; /* Numbering is separate for login and oper news */
+ char *text;
+ char who[NICKMAX];
+ time_t time;
+};
+
+/*************************************************************************/
+
+
+struct exception_ {
+ char *mask; /* Hosts to which this exception applies */
+ int limit; /* Session limit for exception */
+ char who[NICKMAX]; /* Nick of person who added the exception */
+ char *reason; /* Reason for exception's addition */
+ time_t time; /* When this exception was added */
+ time_t expires; /* Time when it expires. 0 == no expiry */
+ int num; /* Position in exception list; used to track
+ * positions when deleting entries. It is
+ * symbolic and used internally. It is
+ * calculated at load time and never saved. */
+};
+
+/*************************************************************************/
+
+struct session_ {
+ Session *prev, *next;
+ char *host;
+ int count; /* Number of clients with this host */
+ int hits; /* Number of subsequent kills for a host */
+};
+
+/*************************************************************************/
+/**
+ * IRCD Protocol module support struct.
+ * protocol modules register the command they want touse for function X with our set
+ * functions, we then call the correct function for the anope_ commands.
+ **/
+typedef struct ircd_proto_ {
+ void (*ircd_set_mod_current_buffer)(int ac, char **av);
+ void (*ircd_cmd_svsnoop)(char *server, int set);
+ void (*ircd_cmd_remove_akill)(char *user, char *host);
+ void (*ircd_cmd_topic)(char *whosets, char *chan, char *whosetit, char *topic, time_t when);
+ void (*ircd_cmd_vhost_off)(User * u);
+ void (*ircd_cmd_akill)(char *user, char *host, char *who, time_t when,time_t expires, char *reason);
+ void (*ircd_cmd_svskill)(char *source, char *user, char *buf);
+ void (*ircd_cmd_svsmode)(User * u, int ac, char **av);
+ void (*ircd_cmd_372)(char *source, char *msg);
+ void (*ircd_cmd_372_error)(char *source);
+ void (*ircd_cmd_375)(char *source);
+ void (*ircd_cmd_376)(char *source);
+ void (*ircd_cmd_nick)(char *nick, char *name, char *modes);
+ void (*ircd_cmd_guest_nick)(char *nick, char *user, char *host, char *real, char *modes);
+ void (*ircd_cmd_mode)(char *source, char *dest, char *buf);
+ void (*ircd_cmd_bot_nick)(char *nick, char *user, char *host, char *real, char *modes);
+ void (*ircd_cmd_kick)(char *source, char *chan, char *user, char *buf);
+ void (*ircd_cmd_notice_ops)(char *source, char *dest, char *buf);
+ void (*ircd_cmd_notice)(char *source, char *dest, char *buf);
+ void (*ircd_cmd_notice2)(char *source, char *dest, char *msg);
+ void (*ircd_cmd_privmsg)(char *source, char *dest, char *buf);
+ void (*ircd_cmd_privmsg2)(char *source, char *dest, char *msg);
+ void (*ircd_cmd_serv_notice)(char *source, char *dest, char *msg);
+ void (*ircd_cmd_serv_privmsg)(char *source, char *dest, char *msg);
+ void (*ircd_cmd_bot_chan_mode)(char *nick, char *chan);
+ void (*ircd_cmd_351)(char *source);
+ void (*ircd_cmd_quit)(char *source, char *buf);
+ void (*ircd_cmd_pong)(char *servname, char *who);
+ void (*ircd_cmd_join)(char *user, char *channel, time_t chantime);
+ void (*ircd_cmd_unsqline)(char *user);
+ void (*ircd_cmd_invite)(char *source, char *chan, char *nick);
+ void (*ircd_cmd_part)(char *nick, char *chan, char *buf);
+ void (*ircd_cmd_391)(char *source, char *timestr);
+ void (*ircd_cmd_250)(char *buf);
+ void (*ircd_cmd_307)(char *buf);
+ void (*ircd_cmd_311)(char *buf);
+ void (*ircd_cmd_312)(char *buf);
+ void (*ircd_cmd_317)(char *buf);
+ void (*ircd_cmd_219)(char *source, char *letter);
+ void (*ircd_cmd_401)(char *source, char *who);
+ void (*ircd_cmd_318)(char *source, char *who);
+ void (*ircd_cmd_242)(char *buf);
+ void (*ircd_cmd_243)(char *buf);
+ void (*ircd_cmd_211)(char *buf);
+ void (*ircd_cmd_global)(char *source, char *buf);
+ void (*ircd_cmd_global_legacy)(char *source, char *fmt);
+ void (*ircd_cmd_sqline)(char *mask, char *reason);
+ void (*ircd_cmd_squit)(char *servname, char *message);
+ void (*ircd_cmd_svso)(char *source, char *nick, char *flag);
+ void (*ircd_cmd_chg_nick)(char *oldnick, char *newnick);
+ void (*ircd_cmd_svsnick)(char *source, char *guest, time_t when);
+ void (*ircd_cmd_vhost_on)(char *nick, char *vIdent, char *vhost);
+ void (*ircd_cmd_connect)(int servernum);
+ void (*ircd_cmd_svshold)(char *nick);
+ void (*ircd_cmd_release_svshold)(char *nick);
+ void (*ircd_cmd_unsgline)(char *mask);
+ void (*ircd_cmd_unszline)(char *mask);
+ void (*ircd_cmd_szline)(char *mask, char *reason, char *whom);
+ void (*ircd_cmd_sgline)(char *mask, char *reason);
+ void (*ircd_cmd_unban)(char *name, char *nick);
+ void (*ircd_cmd_svsmode_chan)(char *name, char *mode, char *nick);
+ void (*ircd_cmd_svid_umode)(char *nick, time_t ts);
+ void (*ircd_cmd_nc_change)(User * u);
+ void (*ircd_cmd_svid_umode2)(User * u, char *ts);
+ void (*ircd_cmd_svid_umode3)(User * u, char *ts);
+ void (*ircd_cmd_ctcp)(char *source, char *dest, char *buf);
+ void (*ircd_cmd_svsjoin)(char *source, char *nick, char *chan, char *param);
+ void (*ircd_cmd_svspart)(char *source, char *nick, char *chan);
+ void (*ircd_cmd_swhois)(char *source, char *who, char *mask);
+ void (*ircd_cmd_eob)();
+ void (*ircd_cmd_jupe)(char *jserver, char *who, char *reason);
+ void (*ircd_set_umode)(User *user, int ac, char **av);
+ int (*ircd_valid_nick)(char *nick);
+ int (*ircd_valid_chan)(char *chan);
+ int (*ircd_flood_mode_check)(char *value);
+} IRCDProto;
+
+typedef struct ircd_modes_ {
+ int user_invis;
+ int user_oper;
+ int chan_invite;
+ int chan_secret;
+ int chan_private;
+ int chan_key;
+ int chan_limit;
+} IRCDModes;
+
+
+
+/*************************************************************************/
+/**
+ * DEFCON Defines
+ **/
+#define DEFCON_NO_NEW_CHANNELS 1 /* No New Channel Registrations */
+#define DEFCON_NO_NEW_NICKS 2 /* No New Nick Registrations */
+#define DEFCON_NO_MLOCK_CHANGE 4 /* No MLOCK changes */
+#define DEFCON_FORCE_CHAN_MODES 8 /* Force Chan Mode */
+#define DEFCON_REDUCE_SESSION 16 /* Reduce Session Limit */
+#define DEFCON_NO_NEW_CLIENTS 32 /* Kill any NEW clients */
+#define DEFCON_OPER_ONLY 64 /* Restrict services to oper's only */
+#define DEFCON_SILENT_OPER_ONLY 128 /* Silently ignore non-opers */
+#define DEFCON_AKILL_NEW_CLIENTS 256 /* AKILL any new clients */
+#define DEFCON_NO_NEW_MEMOS 512 /* No New Memos Sent */
+
+/*************************************************************************/
+
+/* Memo Flags */
+#define MF_UNREAD 0x0001 /* Memo has not yet been read */
+#define MF_RECEIPT 0x0002 /* Sender requested receipt */
+#define MF_NOTIFYS 0x0004 /* Memo is a notification of receitp */
+
+/* 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 */
+#define NI_SUSPENDED 0x00040000 /* Nickname is suspended */
+#define NI_AUTOOP 0x00080000 /* Autoop nickname in channels */
+/* 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 13 /* Russian */
+#define LANG_HUN 14 /* Hungarian */
+#define LANG_PL 15 /* Polish */
+
+#define NUM_LANGS 16 /* Number of languages */
+#define USED_LANGS 13 /* Number of languages provided */
+
+
+#define DEF_LANGUAGE LANG_EN_US
+
+#define BI_PRIVATE 0x0001
+
+#define CUS_OP 0x0001
+#define CUS_VOICE 0x0002
+#define CUS_HALFOP 0x0004 /* Halfop (+h) */
+#define CUS_OWNER 0x0008 /* Owner/Founder (+q) */
+#define CUS_PROTECT 0x0010 /* Protected users (+a) */
+#define CUS_DEOPPED 0x0080 /* User has been specifically deopped */
+
+#define MUT_DEOP 0
+#define MUT_OP 1
+#define MUT_DEVOICE 2
+#define MUT_VOICE 3
+#define MUT_DEHALFOP 4
+#define MUT_HALFOP 5
+#define MUT_DEPROTECT 6
+#define MUT_PROTECT 7
+
+/*************************************************************************/
+/* CAPAB stuffs */
+
+typedef struct capabinfo_ CapabInfo;
+struct capabinfo_ {
+ char *token;
+ uint32 flag;
+};
+
+#define CAPAB_NOQUIT 0x00000001
+#define CAPAB_TSMODE 0x00000002
+#define CAPAB_UNCONNECT 0x00000004
+#define CAPAB_NICKIP 0x00000008
+#define CAPAB_NSJOIN 0x00000010
+#define CAPAB_ZIP 0x00000020
+#define CAPAB_BURST 0x00000040
+#define CAPAB_TS3 0x00000080
+#define CAPAB_TS5 0x00000100
+#define CAPAB_DKEY 0x00000200
+#define CAPAB_DOZIP 0x00000400
+#define CAPAB_DODKEY 0x00000800
+#define CAPAB_QS 0x00001000
+#define CAPAB_SCS 0x00002000
+#define CAPAB_PT4 0x00004000
+#define CAPAB_UID 0x00008000
+#define CAPAB_KNOCK 0x00010000
+#define CAPAB_CLIENT 0x00020000
+#define CAPAB_IPV6 0x00040000
+#define CAPAB_SSJ5 0x00080000
+#define CAPAB_SN2 0x00100000
+#define CAPAB_VHOST 0x00200000
+#define CAPAB_TOKEN 0x00400000
+#define CAPAB_SSJ3 0x00800000
+#define CAPAB_NICK2 0x01000000
+#define CAPAB_UMODE2 0x02000000
+#define CAPAB_VL 0x04000000
+#define CAPAB_TLKEXT 0x08000000
+#define CAPAB_CHANMODE 0x10000000
+#define CAPAB_SJB64 0x20000000
+#define CAPAB_NICKCHARS 0x40000000
+
+/*************************************************************************/
+
+/**
+ * RFC: defination of a valid nick
+ * nickname = ( letter / special ) *8( letter / digit / special / "-" )
+ * letter = %x41-5A / %x61-7A ; A-Z / a-z
+ * digit = %x30-39 ; 0-9
+ * special = %x5B-60 / %x7B-7D ; "[", "]", "\", "`", "_", "^", "{", "|", "}"
+ **/
+#define isvalidnick(c) ( isalnum(c) || ((c) >='\x5B' && (c) <='\x60') || ((c) >='\x7B' && (c) <='\x7D') || (c)=='-' )
+
+/*************************************************************************/
+
+#include "extern.h"
+
+/*************************************************************************/
+
+#endif /* SERVICES_H */