summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortrystan trystan@31f1291d-b8d6-0310-a050-a5561fc1590b <trystan trystan@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>2005-03-04 03:44:07 +0000
committertrystan trystan@31f1291d-b8d6-0310-a050-a5561fc1590b <trystan trystan@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>2005-03-04 03:44:07 +0000
commita22d9ec3b0ba71f4b1493c2ececd27777a42f65d (patch)
treece3f72607d458a18ef7b35f0162ba9081a98eca6
parent1a1781fd0c4ef763db1ed0c85e797f2e22cf339e (diff)
BUILD : 1.7.8 (595) BUGS : N/A NOTES : ShadowIRCD, and cleaned up Numeric
git-svn-id: svn://svn.anope.org/anope/trunk@595 31f1291d-b8d6-0310-a050-a5561fc1590b git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@444 5417fbe8-f217-4b02-8779-1006273d7864
-rw-r--r--Changes3
-rw-r--r--Changes.conf6
-rwxr-xr-xConfig6
-rwxr-xr-xconfigure9
-rw-r--r--configure.in5
-rw-r--r--data/example.conf5
-rw-r--r--include/extern.h2
-rw-r--r--include/services.h1
-rw-r--r--include/shadowircd.h86
-rw-r--r--include/sysconf.h.in3
-rw-r--r--makefile.inc.win325
-rw-r--r--makefile.win324
-rw-r--r--src/chanserv.c8
-rw-r--r--src/config.c12
-rw-r--r--src/rageircd.c8
-rw-r--r--src/ratbox.c10
-rw-r--r--src/shadowircd.c1811
-rw-r--r--src/unreal32.c16
-rw-r--r--version.log6
19 files changed, 1973 insertions, 33 deletions
diff --git a/Changes b/Changes
index a894cfc9e..3fdbaf2e4 100644
--- a/Changes
+++ b/Changes
@@ -1,11 +1,12 @@
Anope Version S V N
-------------------
Provided by Anope Dev. <dev@anope.org> - 2005
+03/03 A ShadowIRCD 4.0 beta 7 support added. [ #00]
02/27 A Added multi-file module support. [ #00]
02/13 A Internal Event support, see EVENTS in the doc folder for help [ #00]
02/05 A Support for Unreal 3.2 +I channel mode. [ #00]
02/03 A Merged anope-win32 branch into the main, now Win32 ready. [ #00]
-03/03 F ircd admin/ower mode handling. [#307]
+03/03 F Numeric in the config is now a string not an int [ #00]
03/02 F Fixed LogUser message, normalizes the "realname" on nick change. [#306]
03/02 F ircd protocol support for owner and admin taken from proto. files.[ #00]
03/02 F /ns alist output. [#288]
diff --git a/Changes.conf b/Changes.conf
index 2da76a4e9..39a272caa 100644
--- a/Changes.conf
+++ b/Changes.conf
@@ -19,6 +19,12 @@ Anope Version S V N
# UserKey2 <your_second_random_number_here>
# UserKey3 <you_third_random_number_here>
+# Numeric [OPTIONAL]
+# Many ircd identify themselves with a Numeric ID when using this option
+# consult your ircds documentation before using this.
+#Numeric "3AX"
+#Numeric "4"
+
** DELETED CONFIGURATION DIRECTIVES **
Anope Version 1.7.8
diff --git a/Config b/Config
index 2914058ca..c93b2c8ff 100755
--- a/Config
+++ b/Config
@@ -225,6 +225,7 @@ echo " 10) Unreal 3.2 [Unreal 3.2 beta19 or later]"
echo " 11) Solid IRCD 3.4.x [Solid IRCD 3.4.6 or later]"
echo " 12) Plexus 2.0 [or later]"
echo " 13) Ratbox 2.0.6 [or later]"
+echo " 14) ShadowIRCD 4.0x [beta 7 or later]"
while [ $ok -eq 0 ] ; do
echo2 "[$IRCTYPE] "
@@ -291,6 +292,11 @@ while [ $ok -eq 0 ] ; do
IRCTYPE_DEF="IRC_RATBOX"
ok=1;
;;
+ 14)
+ IRCTYPE_DEF="IRC_SHADOWIRCD"
+ ok=1;
+ ;;
+
*)
echo "Please enter a valid option number."
diff --git a/configure b/configure
index d988b25e4..596c84459 100755
--- a/configure
+++ b/configure
@@ -8639,6 +8639,15 @@ _ACEOF
IRCDFILE=" ratbox.c "
+ elif test "$withval" = "IRC_SHADOWIRCD"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define IRC_SHADOWIRCD 1
+_ACEOF
+
+ IRCDFILE=" shadowircd.c "
+
+
fi
diff --git a/configure.in b/configure.in
index ff560766a..201871519 100644
--- a/configure.in
+++ b/configure.in
@@ -267,6 +267,11 @@ AC_ARG_WITH(ircd, [ --with-ircd=ircd Specify the first ircd type], [
AC_DEFINE(IRC_RATBOX,1,"First IRCD type")
IRCDFILE=" ratbox.c "
AC_SUBST(IRCDFILE)
+ elif test "$withval" = "IRC_SHADOWIRCD"; then
+ AC_DEFINE(IRC_SHADOWIRCD,1,"First IRCD type")
+ IRCDFILE=" shadowircd.c "
+ AC_SUBST(IRCDFILE)
+
fi
])
diff --git a/data/example.conf b/data/example.conf
index 6c117aa7e..f25f274f6 100644
--- a/data/example.conf
+++ b/data/example.conf
@@ -240,9 +240,8 @@ NetworkName "LocalNet"
# Numeric [OPTIONAL]
# Many ircd identify themselves with a Numeric ID when using this option
# consult your ircds documentation before using this
-# - With TS6 ircd this must be 2 numbers, Anope will append X to this to
-# make the numeric ##X
-#Numeric 0
+#Numeric "3AX"
+#Numeric "4"
###########################################################################
#
diff --git a/include/extern.h b/include/extern.h
index e83df10d7..4305595f7 100644
--- a/include/extern.h
+++ b/include/extern.h
@@ -312,7 +312,7 @@ E int UseSVS2MODE;
E int RestrictOperNicks;
E int UseTokens;
E int NewsCount;
-E int Numeric;
+E char *Numeric;
E int UnRestrictSAdmin;
E int UseTS6;
diff --git a/include/services.h b/include/services.h
index 1c9473a8f..ef0671aec 100644
--- a/include/services.h
+++ b/include/services.h
@@ -245,6 +245,7 @@ typedef enum { false, true } boolean;
#include "solidircd.h"
#include "plexus.h"
#include "ratbox.h"
+#include "shadowircd.h"
typedef struct ircdvars_ IRCDVar;
typedef struct ircdcapab_ IRCDCAPAB;
diff --git a/include/shadowircd.h b/include/shadowircd.h
new file mode 100644
index 000000000..4af7889af
--- /dev/null
+++ b/include/shadowircd.h
@@ -0,0 +1,86 @@
+/* Ratbox IRCD functions
+ *
+ * (C) 2003-2005 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.
+ *
+ *
+ */
+
+#ifdef IRC_SHADOWIRCD
+
+/* The protocol revision. */
+#define PROTOCOL_REVISION 3402
+
+#define PROTECT_SET_MODE "+a"
+#define PROTECT_UNSET_MODE "-a"
+#define CS_CMD_PROTECT "PROTECT"
+#define CS_CMD_DEPROTECT "DEPROTECT"
+#define FANT_PROTECT_ADD "!protect"
+#define FANT_PROTECT_DEL "!deprotect"
+#define LEVEL_PROTECT_WORD "AUTOPROTECT"
+#define LEVELINFO_PROTECT_WORD "PROTECT"
+#define LEVELINFO_PROTECTME_WORD "PROTECTME"
+
+#define UMODE_a 0x00000001
+#define UMODE_C 0x00000002
+#define UMODE_i 0x00000004
+#define UMODE_o 0x00000008
+#define UMODE_z 0x00000010
+#define UMODE_w 0x00000020
+#define UMODE_s 0x00000040
+#define UMODE_c 0x00000080
+#define UMODE_r 0x00000100
+#define UMODE_k 0x00000200
+#define UMODE_f 0x00000400
+#define UMODE_y 0x00000800
+#define UMODE_d 0x00001000
+#define UMODE_n 0x00002000
+#define UMODE_x 0x00004000
+#define UMODE_u 0x00008000
+#define UMODE_b 0x00010000
+#define UMODE_l 0x00020000
+#define UMODE_g 0x00040000
+#define UMODE_v 0x00080000
+#define UMODE_A 0x00100000
+#define UMODE_E 0x00200000
+#define UMODE_G 0x00400000
+#define UMODE_R 0x00800000
+#define UMODE_e 0x01000000
+#define UMODE_O 0x02000000
+#define UMODE_H 0x04000000
+
+#define CMODE_i 0x00000001
+#define CMODE_m 0x00000002
+#define CMODE_n 0x00000004
+#define CMODE_p 0x00000008
+#define CMODE_s 0x00000010
+#define CMODE_t 0x00000020
+#define CMODE_k 0x00000040
+#define CMODE_l 0x00000080
+#define CMODE_K 0x00000100
+#define CMODE_A 0x00000200
+#define CMODE_r 0x00000400
+#define CMODE_z 0x00000800
+#define CMODE_S 0x00001000
+#define CMODE_c 0x00002000
+#define CMODE_E 0x00004000
+#define CMODE_F 0x00008000
+#define CMODE_G 0x00010000
+#define CMODE_L 0x00020000
+#define CMODE_N 0x00040000
+#define CMODE_O 0x00080000
+#define CMODE_P 0x00100000
+#define CMODE_R 0x00200000
+#define CMODE_T 0x00400000
+#define CMODE_V 0x00800000
+
+#define DEFAULT_MLOCK CMODE_n | CMODE_t | CMODE_r
+
+#endif
+
+
diff --git a/include/sysconf.h.in b/include/sysconf.h.in
index 4ee53f115..47ab8e6d4 100644
--- a/include/sysconf.h.in
+++ b/include/sysconf.h.in
@@ -129,6 +129,9 @@
/* "First IRCD type" */
#undef IRC_RATBOX
+/* "First IRCD type" */
+#undef IRC_SHADOWIRCD
+
/* "Module dir" */
#undef MODULE_PATH
diff --git a/makefile.inc.win32 b/makefile.inc.win32
index ca6cc65a9..df9b7bfbe 100644
--- a/makefile.inc.win32
+++ b/makefile.inc.win32
@@ -26,6 +26,7 @@
# 11 Solid IRCD 3.4.x [Solid IRCD 3.4.6 or later]
# 12 Plexus 2.0 [or later]
# 13 Ratbox 2.0.6 [or later]
+# 14 ShadowIRCD 4.0x [beta 7 or later]
IRCD=10
@@ -128,6 +129,10 @@ CAPAB_O=plexus.obj
IRCTYPE=/D IRC_RATBOX
CAPAB_C=ratbox.c
CAPAB_O=ratbox.obj
+!ELSEIF $(IRCD) == 14
+IRCTYPE=/D IRC_SHADOWIRCD
+CAPAB_C=shadowircd.c
+CAPAB_O=shadowircd.obj
!ELSE
!ERROR Invalid IRCd
!ENDIF
diff --git a/makefile.win32 b/makefile.win32
index ee0e9fa19..4d2a6419c 100644
--- a/makefile.win32
+++ b/makefile.win32
@@ -114,6 +114,10 @@ dist:
echo Compiling Ratbox IRCd build
$(MAKE) IRCTYPE=/DIRC_RATBOX CAPAB_C=ratbox.c CAPAB_O=ratbox.obj
-@copy src\$(PROGRAM) services-ratbox.exe
+#Compile ShadowIRCD
+ echo Compiling Shadow IRCd build
+ $(MAKE) IRCTYPE=/DIRC_SHADOWIRCD CAPAB_C=shadowircd.c CAPAB_O=shadwoircd.obj
+ -@copy src\$(PROGRAM) services-shadowircd.exe
#Compile mypasql
$(MYPASQL_BUILD)
diff --git a/src/chanserv.c b/src/chanserv.c
index 521345057..e011eb077 100644
--- a/src/chanserv.c
+++ b/src/chanserv.c
@@ -1558,6 +1558,7 @@ int check_should_halfop(User * user, char *chan)
int check_should_owner(User * user, char *chan)
{
+ char *tmp;
ChannelInfo *ci = cs_findchan(chan);
if (!ci || (ci->flags & CI_VERBOTEN) || *chan == '+')
@@ -1565,7 +1566,8 @@ int check_should_owner(User * user, char *chan)
if (((ci->flags & CI_SECUREFOUNDER) && is_real_founder(user, ci))
|| (!(ci->flags & CI_SECUREFOUNDER) && is_founder(user, ci))) {
- anope_cmd_mode(whosends(ci), chan, "+oq %s %s", user->nick,
+ tmp = stripModePrefix(ircd->ownerset);
+ anope_cmd_mode(whosends(ci), chan, "+o%s %s %s", tmp, user->nick,
user->nick);
return 1;
}
@@ -1577,13 +1579,15 @@ int check_should_owner(User * user, char *chan)
int check_should_protect(User * user, char *chan)
{
+ char *tmp;
ChannelInfo *ci = cs_findchan(chan);
if (!ci || (ci->flags & CI_VERBOTEN) || *chan == '+')
return 0;
if (check_access(user, ci, CA_AUTOPROTECT)) {
- anope_cmd_mode(whosends(ci), chan, "+oa %s %s", user->nick,
+ tmp = stripModePrefix(ircd->adminset);
+ anope_cmd_mode(whosends(ci), chan, "+o%s %s %s", tmp, user->nick,
user->nick);
return 1;
}
diff --git a/src/config.c b/src/config.c
index 82bd4904a..4176faedb 100644
--- a/src/config.c
+++ b/src/config.c
@@ -324,7 +324,7 @@ long unsigned int UserKey1;
long unsigned int UserKey2;
long unsigned int UserKey3;
-int Numeric;
+char *Numeric;
int UnRestrictSAdmin;
@@ -519,7 +519,7 @@ Directive directives[] = {
{"NewsCount", {{PARAM_POSINT, PARAM_RELOAD, &NewsCount}}},
{"NewsDB", {{PARAM_STRING, PARAM_RELOAD, &NewsDBName}}},
{"NickservDB", {{PARAM_STRING, PARAM_RELOAD, &NickDBName}}},
- {"Numeric", {{PARAM_POSINT, PARAM_RELOAD, &Numeric}}},
+ {"Numeric", {{PARAM_STRING, PARAM_RELOAD, &Numeric}}},
{"PreNickServDB", {{PARAM_STRING, PARAM_RELOAD, &PreNickDBName}}},
{"NSEmailReg", {{PARAM_SET, PARAM_RELOAD, &NSEmailReg}}},
{"NickRegDelay", {{PARAM_POSINT, PARAM_RELOAD, &NickRegDelay}}},
@@ -1438,6 +1438,14 @@ int read_config(int reload)
}
}
+ if (UseTS6 && ircd->ts6) {
+ if (!Numeric) {
+ error(0,
+ "UseTS6 requires the setting of Numeric to be enabled.");
+ retval = 0;
+ }
+ }
+
/**
* If they try to enable any email registration option,
* make sure they have everything else they need too...
diff --git a/src/rageircd.c b/src/rageircd.c
index 182a911ef..800b04104 100644
--- a/src/rageircd.c
+++ b/src/rageircd.c
@@ -748,13 +748,9 @@ void anope_cmd_pong(char *servname, char *who)
void anope_cmd_connect(int servernum)
{
- char buf[16];
- *buf = '\0';
-
if (Numeric) {
- snprintf(buf, sizeof(buf), "%d", Numeric);
me_server =
- new_server(NULL, ServerName, ServerDesc, SERVER_ISME, buf);
+ new_server(NULL, ServerName, ServerDesc, SERVER_ISME, Numeric);
} else {
me_server =
new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL);
@@ -768,7 +764,7 @@ void anope_cmd_connect(int servernum)
anope_cmd_pass(RemotePassword3);
anope_cmd_capab();
if (Numeric) {
- send_cmd(NULL, "MYID !%d", Numeric);
+ send_cmd(NULL, "MYID !%s", Numeric);
}
anope_cmd_server(ServerName, 1, ServerDesc);
anope_cmd_svinfo();
diff --git a/src/ratbox.c b/src/ratbox.c
index 19010ecce..47a36d7f3 100644
--- a/src/ratbox.c
+++ b/src/ratbox.c
@@ -727,13 +727,9 @@ int anope_event_436(char *source, int ac, char **av)
void moduleAddIRCDMsgs(void)
{
Message *m;
- char buf[BUFSIZE];
-
- *buf = '\0';
if (UseTS6) {
- snprintf(buf, BUFSIZE - 1, "%dX", Numeric);
- TS6SID = sstrdup(buf);
+ TS6SID = sstrdup(Numeric);
UseTSMODE = 1; /* TMODE */
}
@@ -998,7 +994,7 @@ void anope_cmd_bot_nick(char *nick, char *user, char *host, char *real,
char nicknumbuf[10];
EnforceQlinedNick(nick, NULL);
if (UseTS6) {
- snprintf(nicknumbuf, 10, "%dXAAAAA%c", Numeric,
+ snprintf(nicknumbuf, 10, "%sAAAAA%c", Numeric,
(ts6nickcount + 'A'));
send_cmd(TS6SID, "UID %s 1 %ld %s %s %s 0 %s :%s", nick,
(long int) time(NULL), modes, user, host, nicknumbuf,
@@ -1463,7 +1459,7 @@ void anope_cmd_nick(char *nick, char *name, char *mode)
char nicknumbuf[10];
EnforceQlinedNick(nick, NULL);
if (UseTS6) {
- snprintf(nicknumbuf, 10, "%dXAAAAA%c", Numeric,
+ snprintf(nicknumbuf, 10, "%sAAAAA%c", Numeric,
(ts6nickcount + 'A'));
send_cmd(TS6SID, "UID %s 1 %ld %s %s %s 0 %s :%s", nick,
(long int) time(NULL), mode, ServiceUser, ServiceHost,
diff --git a/src/shadowircd.c b/src/shadowircd.c
new file mode 100644
index 000000000..b454dc618
--- /dev/null
+++ b/src/shadowircd.c
@@ -0,0 +1,1811 @@
+/* ShadowIRCd functions
+ *
+ * (C) 2003-2005 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.
+ *
+ * Provided by the ShadowIRCd development group. See
+ * http://www.shadowircd.net for details.
+ */
+
+#include "services.h"
+#include "pseudo.h"
+
+#ifdef IRC_SHADOWIRCD
+
+const char version_protocol[] = "ShadowIRCd 4.0+";
+
+/* Not all ircds use +f for their flood/join throttle system */
+const char flood_mode_char_set[] = ""; /* mode char for FLOOD mode on set */
+const char flood_mode_char_remove[] = ""; /* mode char for FLOOD mode on remove */
+int UseTSMODE = 1;
+
+int ts6nickcount = 0;
+
+IRCDVar ircd[] = {
+ {"ShadowIRCd 4.0+", /* ircd name */
+ "+oiqSK", /* nickserv mode */
+ "+oiqSK", /* chanserv mode */
+ "+oiqSK", /* memoserv mode */
+ "+oiqSK", /* hostserv mode */
+ "+oiqSK", /* operserv mode */
+ "+oiqSK", /* botserv mode */
+ "+oiqSK", /* helpserv mode */
+ "+oiqSK", /* Dev/Null mode */
+ "+oiqSK", /* Global mode */
+ "+oiqSK", /* nickserv alias mode */
+ "+oiqSK", /* chanserv alias mode */
+ "+oiqSK", /* memoserv alias mode */
+ "+oiqSK", /* hostserv alias mode */
+ "+oiqSK", /* operserv alias mode */
+ "+oiqSK", /* botserv alias mode */
+ "+oiqSK", /* helpserv alias mode */
+ "+oiqSK", /* Dev/Null alias mode */
+ "+oiqSK", /* Global alias mode */
+ "+oiqSK", /* Used by BotServ Bots */
+ 4, /* Chan Max Symbols */
+ "-cimnprstvzAEFGKLNOPRSTV", /* Modes to Remove */
+ "+o", /* Channel Umode used by Botserv bots */
+ 1, /* SVSNICK */
+ 1, /* Vhost */
+ 0, /* Has Owner */
+ NULL, /* Mode to set for an owner */
+ NULL, /* Mode to unset for an owner */
+ "+a", /* Mode to set for channel admin */
+ "-a", /* Mode to unset for channel admin */
+ "+e", /* Mode On Reg */
+ "-e", /* Mode on UnReg */
+ "-e", /* Mode on Nick Change */
+ 0, /* Supports SGlines */
+ 1, /* Supports SQlines */
+ 0, /* Supports SZlines */
+ 1, /* Supports Halfop +h */
+ 4, /* Number of server args */
+ 0, /* Join 2 Set */
+ 0, /* Join 2 Message */
+ 1, /* Has exceptions +e */
+ 0, /* TS Topic Forward */
+ 0, /* TS Topci Backward */
+ 0, /* Protected Umode */
+ 1, /* Has Admin */
+ 1, /* Chan SQlines */
+ 1, /* Quit on Kill */
+ 0, /* SVSMODE unban */
+ 0, /* Has Protect */
+ 0, /* Reverse */
+ 1, /* Chan Reg */
+ 1, /* Channel Mode */
+ 1, /* vidents */
+ 0, /* svshold */
+ 0, /* time stamp on mode */
+ 0, /* NICKIP */
+ 1, /* UMODE */
+ 0, /* O:LINE */
+ 1, /* VHOST ON NICK */
+ 1, /* Change RealName */
+ 0, /* ChanServ extra */
+ CMODE_K, /* No Knock */
+ CMODE_A, /* Admin Only */
+ DEFAULT_MLOCK, /* Default MLOCK */
+ UMODE_v, /* Vhost Mode */
+ 0, /* +f */
+ 0, /* +L */
+ 0, /* +f Mode */
+ 0, /* +L Mode */
+ 1, /* On nick change check if they could be identified */
+ 0, /* No Knock requires +i */
+ NULL, /* CAPAB Chan Modes */
+ 0, /* We support TOKENS */
+ 1, /* TOKENS are CASE inSensitive */
+ 0, /* TIME STAMPS are BASE64 */
+ 1, /* +I support */
+ 0, /* SJOIN ban char */
+ 0, /* SJOIN except char */
+ 0, /* SJOIN invite char */
+ 0, /* Can remove User Channel Modes with SVSMODE */
+ 0, /* Sglines are not enforced until user reconnects */
+ "v", /* vhost char */
+ 1, /* ts6 */
+ 0, /* support helper umode */
+ 0, /* p10 */
+ NULL, /* character set */
+ }
+ ,
+ {NULL}
+};
+
+/* ShadowIRCd does not use CAPAB */
+IRCDCAPAB ircdcap[] = {
+ {
+ 0, /* NOQUIT */
+ 0, /* TSMODE */
+ 0, /* UNCONNECT */
+ 0, /* NICKIP */
+ 0, /* SJOIN */
+ 0, /* ZIP */
+ 0, /* BURST */
+ 0, /* TS5 */
+ 0, /* TS3 */
+ 0, /* DKEY */
+ 0, /* PT4 */
+ 0, /* SCS */
+ 0, /* QS */
+ 0, /* UID */
+ 0, /* KNOCK */
+ 0, /* CLIENT */
+ 0, /* IPV6 */
+ 0, /* SSJ5 */
+ 0, /* SN2 */
+ 0, /* TOKEN */
+ 0, /* VHOST */
+ 0, /* SSJ3 */
+ 0, /* NICK2 */
+ 0, /* UMODE2 */
+ 0, /* VL */
+ 0, /* TLKEXT */
+ 0, /* DODKEY */
+ 0, /* DOZIP */
+ 0, 0, 0}
+};
+
+void anope_set_umode(User * user, int ac, char **av)
+{
+ int add = 1; /* 1 if adding modes, 0 if deleting */
+ char *modes = av[0];
+
+ ac--;
+
+ if (debug)
+ alog("debug: Changing mode for %s to %s", user->nick, modes);
+
+ while (*modes) {
+
+ add ? (user->mode |= umodes[(int) *modes]) : (user->mode &=
+ ~umodes[(int)
+ *modes]);
+
+ switch (*modes++) {
+ case '+':
+ add = 1;
+ break;
+ case '-':
+ add = 0;
+ break;
+ case 'o':
+ if (add) {
+ opcnt++;
+
+ if (WallOper)
+ anope_cmd_global(s_OperServ,
+ "\2%s\2 is now an IRC operator.",
+ user->nick);
+ display_news(user, NEWS_OPER);
+
+ } else {
+ opcnt--;
+ }
+ break;
+ }
+ }
+}
+
+unsigned long umodes[128] = {
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Horzontal Tab */
+ 0, 0, 0, /* Line Feed, Unused, Unused */
+ 0, 0, 0, /* Carriage Return, Unused, Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Space */
+ 0, 0, 0, /* ! " # */
+ 0, 0, 0, /* $ % & */
+ 0, 0, 0, /* ! ( ) */
+ 0, 0, 0, /* * + , */
+ 0, 0, 0, /* - . / */
+ 0, 0, /* 0 1 */
+ 0, 0, /* 2 3 */
+ 0, 0, /* 4 5 */
+ 0, 0, /* 6 7 */
+ 0, 0, /* 8 9 */
+ 0, 0, /* : ; */
+ 0, 0, 0, /* < = > */
+ 0, 0, /* ? @ */
+ UMODE_A, 0, 0, /* A B C */
+ 0, UMODE_E, 0, /* D E F */
+ UMODE_G, 0, 0, /* G H I */
+ 0, 0, 0, /* J K L */
+ 0, 0, UMODE_O, /* M N O */
+ 0, 0, UMODE_R, /* P Q R */
+ 0, 0, 0, /* S T U */
+ 0, 0, 0, /* V W X */
+ 0, /* Y */
+ 0, /* Z */
+ 0, 0, 0, /* [ \ ] */
+ 0, 0, 0, /* ^ _ ` */
+ UMODE_a, UMODE_b, 0, /* a b c */
+ UMODE_d, UMODE_e, 0, /* d e f */
+ 0, 0, UMODE_i, /* g h i */
+ 0, 0, UMODE_l, /* j k l */
+ UMODE_g, UMODE_n, UMODE_o, /* m n o */
+ 0, 0, 0, /* p q r */
+ 0, 0, UMODE_u, /* s t u */
+ UMODE_v, UMODE_w, UMODE_x, /* v w x */
+ 0, /* y */
+ 0, /* z */
+ 0, 0, 0, /* { | } */
+ 0, 0 /* ~ ‚ */
+};
+
+
+char csmodes[128] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0,
+ 'a',
+ 0, 0, 0,
+ 'h',
+ 0, 0, 0, 0,
+ 0,
+
+ 'v', 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 'o', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+CMMode cmmodes[128] = {
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL}, /* BCD */
+ {NULL}, {NULL}, {NULL}, /* EFG */
+ {NULL}, /* H */
+ {add_invite, del_invite},
+ {NULL}, /* J */
+ {NULL}, {NULL}, {NULL}, /* KLM */
+ {NULL}, {NULL}, {NULL}, /* NOP */
+ {NULL}, {NULL}, {NULL}, /* QRS */
+ {NULL}, {NULL}, {NULL}, /* TUV */
+ {NULL}, {NULL}, {NULL}, /* WXY */
+ {NULL}, /* Z */
+ {NULL}, {NULL}, /* (char 91 - 92) */
+ {NULL}, {NULL}, {NULL}, /* (char 93 - 95) */
+ {NULL}, /* ` (char 96) */
+ {NULL}, /* a (char 97) */
+ {add_ban, del_ban},
+ {NULL},
+ {NULL},
+ {add_exception, del_exception},
+ {NULL},
+ {NULL},
+ {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}
+};
+
+
+CBMode cbmodes[128] = {
+ {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0},
+ {0},
+ {CMODE_A, 0, NULL, NULL}, /* A */
+ {0}, /* B */
+ {0}, /* C */
+ {0}, /* D */
+ {CMODE_E, 0, NULL, NULL}, /* E */
+ {CMODE_F, 0, NULL, NULL}, /* F */
+ {CMODE_G, 0, NULL, NULL}, /* G */
+ {0}, /* H */
+ {0}, /* I */
+ {0}, /* J */
+ {CMODE_K, 0, NULL, NULL}, /* K */
+ {CMODE_L, 0, NULL, NULL}, /* L */
+ {0}, /* M */
+ {CMODE_N, 0, NULL, NULL}, /* N */
+ {CMODE_O, 0, NULL, NULL}, /* O */
+ {CMODE_P, 0, NULL, NULL}, /* P */
+ {0}, /* Q */
+ {CMODE_R, 0, NULL, NULL}, /* R */
+ {CMODE_S, 0, NULL, NULL}, /* S */
+ {CMODE_T, 0, NULL, NULL}, /* T */
+ {0}, /* U */
+ {CMODE_V, 0, NULL, NULL}, /* V */
+ {0}, /* W */
+ {0}, /* X */
+ {0}, /* Y */
+ {0}, /* Z */
+ {0}, {0}, {0}, {0}, {0}, {0},
+ {0},
+ {0}, /* b */
+ {CMODE_c, 0, NULL, NULL},
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {0}, /* h */
+ {CMODE_i, 0, NULL, NULL},
+ {0}, /* j */
+ {CMODE_k, 0, set_key, cs_set_key},
+ {CMODE_l, CBM_MINUS_NO_ARG, set_limit, cs_set_limit},
+ {CMODE_m, 0, NULL, NULL},
+ {CMODE_n, 0, NULL, NULL},
+ {0}, /* o */
+ {CMODE_p, 0, NULL, NULL},
+ {0}, /* q */
+ {CMODE_r, 0, NULL, NULL},
+ {CMODE_s, 0, NULL, NULL},
+ {CMODE_t, 0, NULL, NULL},
+ {0},
+ {0}, /* v */
+ {0}, /* w */
+ {0}, /* x */
+ {0}, /* y */
+ {CMODE_z, 0, NULL, NULL}, /* z */
+ {0}, {0}, {0}, {0}
+};
+
+CBModeInfo cbmodeinfos[] = {
+ {'c', CMODE_c, 0, NULL, NULL},
+ {'i', CMODE_i, 0, NULL, NULL},
+ {'k', CMODE_k, 0, get_key, cs_get_key},
+ {'l', CMODE_l, CBM_MINUS_NO_ARG, get_limit, cs_get_limit},
+ {'m', CMODE_m, 0, NULL, NULL},
+ {'n', CMODE_n, 0, NULL, NULL},
+ {'p', CMODE_p, 0, NULL, NULL},
+ {'r', CMODE_r, 0, NULL, NULL},
+ {'s', CMODE_s, 0, NULL, NULL},
+ {'t', CMODE_t, 0, NULL, NULL},
+ {'z', CMODE_z, 0, NULL, NULL},
+ {'A', CMODE_A, 0, NULL, NULL},
+ {'E', CMODE_E, 0, NULL, NULL},
+ {'F', CMODE_F, 0, NULL, NULL},
+ {'G', CMODE_G, 0, NULL, NULL},
+ {'K', CMODE_K, 0, NULL, NULL},
+ {'L', CMODE_L, 0, NULL, NULL},
+ {'N', CMODE_N, 0, NULL, NULL},
+ {'O', CMODE_O, 0, NULL, NULL},
+ {'P', CMODE_P, 0, NULL, NULL},
+ {'S', CMODE_S, 0, NULL, NULL},
+ {'T', CMODE_T, 0, NULL, NULL},
+ {'V', CMODE_V, 0, NULL, NULL},
+ {0}
+};
+
+
+CUMode cumodes[128] = {
+ {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0},
+
+ {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0},
+
+ {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0},
+
+ {0},
+
+ {CUS_PROTECT, CUF_PROTECT_BOTSERV, check_valid_admin}, /* a */
+ {0}, /* b */
+ {0}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {CUS_HALFOP, 0, check_valid_op},
+ {0}, /* i */
+ {0}, /* j */
+ {0}, /* k */
+ {0}, /* l */
+ {0}, /* m */
+ {0}, /* n */
+ {CUS_OP, CUF_PROTECT_BOTSERV, check_valid_op},
+ {0}, /* p */
+ {0}, /* q */
+ {0}, /* r */
+ {0}, /* s */
+ {0}, /* t */
+ {0}, /* u */
+ {CUS_VOICE, 0, NULL},
+ {0}, /* w */
+ {0}, /* x */
+ {0}, /* y */
+ {0}, /* z */
+ {0}, {0}, {0}, {0}, {0}
+};
+
+
+
+void anope_cmd_notice(char *source, char *dest, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ Uid *ud;
+ User *u;
+
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ if (UsePrivmsg) {
+ anope_cmd_privmsg2(source, dest, buf);
+ } else {
+ ud = find_uid(source);
+ u = finduser(dest);
+ send_cmd((ud ? ud->uid : source), "NOTICE %s :%s",
+ (u ? u->uid : dest), buf);
+ }
+}
+
+void anope_cmd_notice2(char *source, char *dest, char *msg)
+{
+ Uid *ud;
+ User *u;
+
+ ud = find_uid(source);
+ u = finduser(dest);
+ send_cmd((ud ? ud->uid : source), "NOTICE %s :%s", (u ? u->uid : dest),
+ msg);
+}
+
+void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ Uid *ud, *ud2;
+
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+ ud = find_uid(source);
+ ud2 = find_uid(dest);
+
+ send_cmd((ud ? ud->uid : source), "PRIVMSG %s :%s", ud2->uid, buf);
+}
+
+void anope_cmd_privmsg2(char *source, char *dest, char *msg)
+{
+ Uid *ud, *ud2;
+
+ ud = find_uid(source);
+ ud2 = find_uid(dest);
+
+ send_cmd((ud ? ud->uid : source), "PRIVMSG %s :%s", ud2->uid, msg);
+}
+
+void anope_cmd_serv_notice(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE $$%s :%s", dest, msg);
+}
+
+void anope_cmd_serv_privmsg(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG $$%s :%s", dest, msg);
+}
+
+
+void anope_cmd_global(char *source, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ Uid *u;
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ if (source) {
+ u = find_uid(source);
+ if (u) {
+ send_cmd((u ? u->uid : source), "OPERWALL :%s", buf);
+ } else {
+ send_cmd(TS6SID, "OPERWALL :%s", buf);
+ }
+ } else {
+ send_cmd(TS6SID, "OPERWALL :%s", buf);
+ }
+}
+
+/* GLOBOPS - to handle old WALLOPS */
+void anope_cmd_global_legacy(char *source, char *fmt)
+{
+ Uid *u;
+
+ if (source) {
+ u = find_uid(source);
+ if (u) {
+ send_cmd((u ? u->uid : source), "OPERWALL :%s", fmt);
+ } else {
+ send_cmd(TS6SID, "OPERWALL :%s", fmt);
+ }
+ } else {
+ send_cmd(TS6SID, "OPERWALL :%s", fmt);
+ }
+
+ send_cmd(source ? source : ServerName, "OPERWALL :%s", fmt);
+}
+
+int anope_event_sjoin(char *source, int ac, char **av)
+{
+ do_sjoin(source, ac, av);
+ return MOD_CONT;
+}
+
+/*
+ Non TS6
+
+ av[0] = nick
+ av[1] = hop
+ av[2] = ts
+ av[3] = modes
+ av[4] = user
+ av[5] = host
+ av[6] = server
+ av[7] = info
+
+ TS6
+ av[0] = nick
+ av[1] = hop
+ av[2] = ts
+ av[3] = modes
+ av[4] = user
+ av[5] = host
+ av[6] = IP
+ av[7] = UID
+ av[8] = vhost
+ av[9] = info
+
+*/
+int anope_event_nick(char *source, int ac, char **av)
+{
+ Server *s;
+ User *user;
+
+ if (ac == 10) {
+ s = findserver_uid(servlist, source);
+ /* Source is always the server */
+ *source = '\0';
+ user = do_nick(source, av[0], av[4], av[5], s->name, av[9],
+ strtoul(av[2], NULL, 10), 0, 0, av[8], av[7]);
+ if (user) {
+ anope_set_umode(user, 1, &av[3]);
+ }
+ } else {
+ do_nick(source, av[0], NULL, NULL, NULL, NULL,
+ strtoul(av[1], NULL, 10), 0, 0, NULL, NULL);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_topic(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac == 4) {
+ do_topic(source, ac, av);
+ } else {
+ Channel *c = findchan(av[0]);
+ time_t topic_time = time(NULL);
+
+ if (!c) {
+ alog("channel: TOPIC %s for nonexistent channel %s",
+ merge_args(ac - 1, av + 1), av[0]);
+ return MOD_CONT;
+ }
+
+ if (check_topiclock(c, topic_time))
+ return MOD_CONT;
+
+ if (c->topic) {
+ free(c->topic);
+ c->topic = NULL;
+ }
+ if (ac > 1 && *av[1])
+ c->topic = sstrdup(av[1]);
+
+ u = find_byuid(source);
+ if (u) {
+ strscpy(c->topic_setter, u->nick, sizeof(c->topic_setter));
+ } else {
+ strscpy(c->topic_setter, source, sizeof(c->topic_setter));
+ }
+ c->topic_time = topic_time;
+
+ record_topic(av[0]);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_tburst(char *source, int ac, char **av)
+{
+ char *setter;
+ Channel *c;
+ time_t topic_time;
+
+ if (ac != 4) {
+ return MOD_CONT;
+ }
+
+ setter = myStrGetToken(av[2], '!', 0);
+
+ c = findchan(av[0]);
+ topic_time = strtol(av[1], NULL, 10);
+
+ if (!c) {
+ alog("channel: TOPIC %s for nonexistent channel %s",
+ merge_args(ac - 1, av + 1), av[0]);
+ return MOD_CONT;
+ }
+
+ if (check_topiclock(c, topic_time))
+ return MOD_CONT;
+
+ if (c->topic) {
+ free(c->topic);
+ c->topic = NULL;
+ }
+ if (ac > 1 && *av[3])
+ c->topic = sstrdup(av[3]);
+
+ strscpy(c->topic_setter, setter, sizeof(c->topic_setter));
+ c->topic_time = topic_time;
+
+ record_topic(av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_436(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+
+ m_nickcoll(av[0]);
+ return MOD_CONT;
+}
+
+
+/* *INDENT-OFF* */
+void moduleAddIRCDMsgs(void)
+{
+ Message *m;
+
+ TS6SID = sstrdup(Numeric);
+ UseTS6 = 1;
+
+ m = createMessage("401", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("402", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("436", anope_event_436); addCoreMessage(IRCD,m);
+ m = createMessage("AWAY", anope_event_away); addCoreMessage(IRCD,m);
+ m = createMessage("INVITE", anope_event_invite); addCoreMessage(IRCD,m);
+ m = createMessage("JOIN", anope_event_join); addCoreMessage(IRCD,m);
+ m = createMessage("KICK", anope_event_kick); addCoreMessage(IRCD,m);
+ m = createMessage("KILL", anope_event_kill); addCoreMessage(IRCD,m);
+ m = createMessage("MODE", anope_event_mode); addCoreMessage(IRCD,m);
+ m = createMessage("TMODE", anope_event_tmode); addCoreMessage(IRCD,m);
+ m = createMessage("MOTD", anope_event_motd); addCoreMessage(IRCD,m);
+ m = createMessage("NICK", anope_event_nick); addCoreMessage(IRCD,m);
+ m = createMessage("BMASK", anope_event_bmask); addCoreMessage(IRCD,m);
+ m = createMessage("UID", anope_event_nick); addCoreMessage(IRCD,m);
+ m = createMessage("NOTICE", anope_event_notice); addCoreMessage(IRCD,m);
+ m = createMessage("PART", anope_event_part); addCoreMessage(IRCD,m);
+ m = createMessage("PASS", anope_event_pass); addCoreMessage(IRCD,m);
+ m = createMessage("PING", anope_event_ping); addCoreMessage(IRCD,m);
+ m = createMessage("PRIVMSG", anope_event_privmsg); addCoreMessage(IRCD,m);
+ m = createMessage("QUIT", anope_event_quit); addCoreMessage(IRCD,m);
+ m = createMessage("SERVER", anope_event_server); addCoreMessage(IRCD,m);
+ m = createMessage("SQUIT", anope_event_squit); addCoreMessage(IRCD,m);
+ m = createMessage("TOPIC", anope_event_topic); addCoreMessage(IRCD,m);
+ m = createMessage("TB", anope_event_tburst); addCoreMessage(IRCD,m);
+ m = createMessage("USER", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("WALLOPS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("WHOIS", anope_event_whois); addCoreMessage(IRCD,m);
+ m = createMessage("SVSMODE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSNICK", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("CAPAB", anope_event_capab); addCoreMessage(IRCD,m);
+ m = createMessage("SJOIN", anope_event_sjoin); addCoreMessage(IRCD,m);
+ m = createMessage("SVINFO", anope_event_svinfo); addCoreMessage(IRCD,m);
+ m = createMessage("ADMIN", anope_event_admin); addCoreMessage(IRCD,m);
+ m = createMessage("ERROR", anope_event_error); addCoreMessage(IRCD,m);
+ m = createMessage("421", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("ENCAP", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SID", anope_event_sid); addCoreMessage(IRCD,m);
+ m = createMessage("EOB", anope_event_eos); addCoreMessage(IRCD,m);
+ m = createMessage("TSSYNC", anope_event_null); addCoreMessage(IRCD,m);
+
+}
+
+/* *INDENT-ON* */
+
+
+void anope_cmd_sqline(char *mask, char *reason)
+{
+ send_cmd(NULL, "RESV * %s :%s", mask, reason);
+}
+
+void anope_cmd_unsgline(char *mask)
+{
+ /* Does not support */
+}
+
+void anope_cmd_unszline(char *mask)
+{
+ /* Does not support */
+}
+
+void anope_cmd_szline(char *mask, char *reason, char *whom)
+{
+ /* Does not support */
+}
+
+void anope_cmd_svsnoop(char *server, int set)
+{
+ /* does not support */
+}
+
+void anope_cmd_svsadmin(char *server, int set)
+{
+ anope_cmd_svsnoop(server, set);
+}
+
+void anope_cmd_sgline(char *mask, char *reason)
+{
+ /* does not support */
+}
+
+void anope_cmd_remove_akill(char *user, char *host)
+{
+ Uid *ud;
+
+ ud = find_uid(s_OperServ);
+ send_cmd((ud ? ud->uid : s_OperServ), "UNKLINE * %s %s", user, host);
+}
+
+void anope_cmd_topic(char *whosets, char *chan, char *whosetit,
+ char *topic, time_t when)
+{
+ Uid *ud;
+
+ ud = find_uid(whosets);
+ send_cmd((ud ? ud->uid : whosets), "TOPIC %s :%s", chan, topic);
+}
+
+void anope_cmd_vhost_off(User * u)
+{
+ send_cmd(NULL, "MODE %s -v", u->uid);
+}
+
+void anope_cmd_vhost_on(char *nick, char *vIdent, char *vhost)
+{
+ send_cmd(NULL, "SVSCLOAK %s %s", nick, vhost);
+
+ if (vIdent)
+ send_cmd(NULL, "SVSIDENT %s %s", nick, vIdent);
+}
+
+void anope_cmd_unsqline(char *user)
+{
+ send_cmd(NULL, "UNRESV * %s", user);
+}
+
+void anope_cmd_join(char *user, char *channel, time_t chantime)
+{
+ Uid *ud;
+
+ ud = find_uid(user);
+ send_cmd(NULL, "SJOIN %ld %s + :%s", (long int) time(NULL),
+ channel, (ud ? ud->uid : user));
+}
+
+/*
+oper: the nick of the oper performing the kline
+target.server: the server(s) this kline is destined for
+duration: the duration if a tkline, 0 if permanent.
+user: the 'user' portion of the kline
+host: the 'host' portion of the kline
+reason: the reason for the kline.
+*/
+
+void anope_cmd_akill(char *user, char *host, char *who, time_t when,
+ time_t expires, char *reason)
+{
+ Uid *ud;
+
+ ud = find_uid(s_OperServ);
+
+ send_cmd((ud ? ud->uid : s_OperServ), "KLINE * %ld %s %s :%s",
+ (long int) (expires - (long) time(NULL)), user, host, reason);
+}
+
+void anope_cmd_svskill(char *source, char *user, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ Uid *ud;
+
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ if (!source || !user) {
+ return;
+ }
+
+ ud = find_uid(user);
+ send_cmd(NULL, "SVSKILL %s :%s", (ud ? ud->uid : user), buf);
+}
+
+void anope_cmd_svsmode(User * u, int ac, char **av)
+{
+ send_cmd(TS6SID, "MODE %s %s", u->uid, av[0]);
+}
+
+void anope_cmd_connect(int servernum)
+{
+ me_server =
+ new_server(NULL, ServerName, ServerDesc, SERVER_ISME, TS6SID);
+ if (servernum == 1)
+ anope_cmd_pass(RemotePassword);
+ else if (servernum == 2)
+ anope_cmd_pass(RemotePassword2);
+ else if (servernum == 3)
+ anope_cmd_pass(RemotePassword3);
+
+ anope_cmd_capab();
+ anope_cmd_server(ServerName, 1, ServerDesc);
+ anope_cmd_svinfo();
+}
+
+void anope_cmd_svsinfo()
+{
+ /* not used */
+}
+
+/*
+ * SVINFO
+ * parv[0] = sender prefix
+ * parv[1] = TS_CURRENT for the server
+ * parv[2] = TS_MIN for the server
+ * parv[3] = server is standalone or connected to non-TS only
+ * parv[4] = server's idea of UTC time
+ */
+void anope_cmd_svinfo()
+{
+ send_cmd(NULL, "SVINFO 6 3 0 :%ld", (long int) time(NULL));
+}
+
+void anope_cmd_capab()
+{
+ /* ShadowIRCd does not use CAPAB */
+}
+
+/* PASS */
+void anope_cmd_pass(char *pass)
+{
+ send_cmd(NULL, "PASS %s TS 6 %s", pass, TS6SID);
+}
+
+/* SERVER name protocol hop descript */
+void anope_cmd_server(char *servname, int hop, char *descript)
+{
+ send_cmd(NULL, "SERVER %s %d %d :%s", servname, hop, PROTOCOL_REVISION,
+ descript);
+}
+
+void anope_cmd_bot_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ char nicknumbuf[10];
+ EnforceQlinedNick(nick, NULL);
+ snprintf(nicknumbuf, 10, "%sAAAAA%c", Numeric, (ts6nickcount + 'A'));
+ send_cmd(TS6SID, "UID %s 1 %ld %s %s %s 0.0.0.0 %s %s :%s", nick,
+ (long int) time(NULL), modes, user, host, nicknumbuf, host,
+ real);
+ new_uid(nick, nicknumbuf);
+ ts6nickcount++;
+ anope_cmd_sqline(nick, "Reserved for services");
+}
+
+void anope_cmd_part(char *nick, char *chan, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ Uid *ud;
+
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+
+ ud = find_uid(nick);
+
+ if (buf) {
+ send_cmd((ud ? ud->uid : nick), "PART %s :%s", chan, buf);
+ } else {
+ send_cmd((ud ? ud->uid : nick), "PART %s", chan);
+ }
+}
+
+int anope_event_ping(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ anope_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_away(char *source, int ac, char **av)
+{
+ User *u = NULL;
+
+ if (ac) {
+ return MOD_CONT;
+ }
+
+ u = find_byuid(source);
+
+ m_away(u->nick, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_kill(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+
+ m_kill(av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_kick(char *source, int ac, char **av)
+{
+ if (ac != 3)
+ return MOD_CONT;
+ do_kick(source, ac, av);
+ return MOD_CONT;
+}
+
+void anope_cmd_eob()
+{
+ send_cmd(TS6SID, "EOB");
+}
+
+int anope_event_join(char *source, int ac, char **av)
+{
+ if (ac != 1) {
+ do_sjoin(source, ac, av);
+ return MOD_CONT;
+ } else {
+ do_join(source, ac, av);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_motd(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+
+ m_motd(source);
+ return MOD_CONT;
+}
+
+int anope_event_privmsg(char *source, int ac, char **av)
+{
+ User *u;
+ Uid *ud;
+
+ if (ac != 2) {
+ return MOD_CONT;
+ }
+
+ u = find_byuid(source);
+ ud = find_nickuid(av[0]);
+
+ m_privmsg((u ? u->nick : source), (ud ? ud->nick : av[0]), av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_part(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac < 1 || ac > 2) {
+ return MOD_CONT;
+ }
+
+ u = find_byuid(source);
+ do_part(u->nick, ac, av);
+
+ return MOD_CONT;
+}
+
+int anope_event_whois(char *source, int ac, char **av)
+{
+ Uid *ud;
+
+ if (source && ac >= 1) {
+ ud = find_nickuid(av[0]);
+ m_whois(source, (ud ? ud->nick : source));
+ }
+ return MOD_CONT;
+}
+
+/* EVENT: SERVER */
+int anope_event_server(char *source, int ac, char **av)
+{
+ if (!stricmp(av[1], "1") && !stricmp(av[2], "1")) {
+ uplink = sstrdup(av[0]);
+ if (TS6UPLINK) {
+ do_server(source, av[0], av[1], av[2], TS6UPLINK);
+ } else {
+ do_server(source, av[0], av[1], av[2], NULL);
+ }
+ } else {
+ do_server(source, av[0], av[1], av[2], NULL);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_sid(char *source, int ac, char **av)
+{
+ Server *s;
+
+ /* :42X SID trystan.nomadirc.net 2 43X :ircd-ratbox test server */
+
+ s = findserver_uid(servlist, source);
+
+ do_server(s->name, av[0], av[1], av[3], av[2]);
+ return MOD_CONT;
+}
+
+int anope_event_eos(char *source, int ac, char **av)
+{
+ Server *s;
+ s = findserver_uid(servlist, source);
+ if (s) {
+ s->sync = 1;
+ }
+ return MOD_CONT;
+}
+
+int anope_event_squit(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ do_squit(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_quit(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1) {
+ return MOD_CONT;
+ }
+
+ u = find_byuid(source);
+
+ do_quit(u->nick, ac, av);
+ return MOD_CONT;
+}
+
+void anope_cmd_372(char *source, char *msg)
+{
+ send_cmd(TS6SID, "372 %s :- %s", source, msg);
+}
+
+void anope_cmd_372_error(char *source)
+{
+ send_cmd(TS6SID,
+ "372 %s :- MOTD file not found! Please "
+ "contact your IRC administrator.", source);
+}
+
+void anope_cmd_375(char *source)
+{
+ send_cmd(TS6SID,
+ "375 %s :- %s Message of the Day", source, ServerName);
+}
+
+void anope_cmd_376(char *source)
+{
+ send_cmd(TS6SID, "376 %s :End of /MOTD command.", source);
+}
+
+/* 391 */
+void anope_cmd_391(char *source, char *timestr)
+{
+ if (!timestr) {
+ return;
+ }
+ send_cmd(NULL, "391 :%s %s :%s", source, ServerName, timestr);
+}
+
+/* 250 */
+void anope_cmd_250(const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "250 %s ", buf);
+}
+
+/* 307 */
+void anope_cmd_307(const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(TS6SID, "307 %s ", buf);
+}
+
+/* 311 */
+void anope_cmd_311(const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(TS6SID, "311 %s ", buf);
+}
+
+/* 312 */
+void anope_cmd_312(const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(TS6SID, "312 %s ", buf);
+}
+
+/* 317 */
+void anope_cmd_317(const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(TS6SID, "317 %s ", buf);
+}
+
+/* 219 */
+void anope_cmd_219(char *source, char *letter)
+{
+ if (!source) {
+ return;
+ }
+
+ if (letter) {
+ send_cmd(NULL, "219 %s %c :End of /STATS report.", source,
+ *letter);
+ } else {
+ send_cmd(NULL, "219 %s l :End of /STATS report.", source);
+ }
+}
+
+/* 401 */
+void anope_cmd_401(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+ send_cmd(TS6SID, "401 %s %s :No such service.", source, who);
+}
+
+/* 318 */
+void anope_cmd_318(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+
+ send_cmd(TS6SID, "318 %s %s :End of /WHOIS list.", source, who);
+}
+
+/* 242 */
+void anope_cmd_242(const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "242 %s ", buf);
+}
+
+/* 243 */
+void anope_cmd_243(const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "243 %s ", buf);
+}
+
+/* 211 */
+void anope_cmd_211(const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "211 %s ", buf);
+}
+
+void anope_cmd_mode(char *source, char *dest, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ Uid *ud;
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ if (source) {
+ ud = find_uid(source);
+ send_cmd((ud ? ud->uid : source), "MODE %s %s", dest, buf);
+ } else {
+ send_cmd(source, "MODE %s %s", dest, buf);
+ }
+}
+
+void anope_cmd_tmode(char *source, char *dest, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "MODE %s %s", dest, buf);
+}
+
+void anope_cmd_nick(char *nick, char *name, char *mode)
+{
+ char nicknumbuf[10];
+ EnforceQlinedNick(nick, NULL);
+ snprintf(nicknumbuf, 10, "%sAAAAA%c", TS6SID, (ts6nickcount + 'A'));
+ send_cmd(TS6SID, "UID %s 1 %ld %s %s %s 0.0.0.0 %s %s :%s", nick,
+ (long int) time(NULL), mode, ServiceUser, ServiceHost,
+ nicknumbuf, ServiceHost, name);
+ new_uid(nick, nicknumbuf);
+ ts6nickcount++;
+ anope_cmd_sqline(nick, "Reserved for services");
+}
+
+void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt,
+ ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ Uid *ud;
+ User *u;
+ *buf = '\0';
+
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+
+ ud = find_uid(source);
+ u = finduser(user);
+
+ if (buf) {
+ send_cmd((ud ? ud->uid : source), "KICK %s %s :%s", chan,
+ (u ? u->uid : user), buf);
+ } else {
+ send_cmd((ud ? ud->uid : source), "KICK %s %s", chan,
+ (u ? u->uid : user));
+ }
+}
+
+void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "NOTICE @%s :%s", dest, buf);
+}
+
+void anope_cmd_bot_chan_mode(char *nick, char *chan)
+{
+ Uid *u;
+
+ u = find_uid(nick);
+ anope_cmd_tmode(nick, chan, "%s %s", ircd->botchanumode,
+ (u ? u->uid : nick));
+}
+
+/* QUIT */
+void anope_cmd_quit(char *source, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ Uid *ud;
+
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+
+ ud = find_uid(source);
+
+ if (buf) {
+ send_cmd((ud ? ud->uid : source), "QUIT :%s", buf);
+ } else {
+ send_cmd((ud ? ud->uid : source), "QUIT");
+ }
+}
+
+/* PONG */
+void anope_cmd_pong(char *servname, char *who)
+{
+ send_cmd(TS6SID, "PONG %s", who);
+}
+
+/* INVITE */
+void anope_cmd_invite(char *source, char *chan, char *nick)
+{
+ Uid *ud;
+ User *u;
+
+ if (!source || !chan || !nick) {
+ return;
+ }
+
+ ud = find_uid(source);
+ u = finduser(nick);
+
+ send_cmd((ud ? ud->uid : source), "INVITE %s %s",
+ (u ? u->uid : nick), chan);
+}
+
+/* SQUIT */
+void anope_cmd_squit(char *servname, char *message)
+{
+ if (!servname || !message) {
+ return;
+ }
+
+ send_cmd(NULL, "SQUIT %s :%s", servname, message);
+}
+
+int anope_event_mode(char *source, int ac, char **av)
+{
+ User *u, *u2;
+
+ if (ac < 2 || *av[0] == '&') {
+ return MOD_CONT;
+ }
+
+ if (*av[0] == '#') {
+ do_cmode(source, ac, av);
+ } else {
+ u = find_byuid(source);
+ u2 = find_byuid(av[0]);
+ av[0] = u2->nick;
+ do_umode(u->nick, ac, av);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_tmode(char *source, int ac, char **av)
+{
+ if (*av[1] == '#' || *av[1] == '&') {
+ do_cmode(source, ac, av);
+ }
+ return MOD_CONT;
+}
+
+void anope_cmd_351(char *source)
+{
+ send_cmd(TS6SID,
+ "351 %s Anope-%s %s :%s (ShadowProtocol %d) - %s -- %s",
+ source, version_number, ServerName, ircd->name,
+ PROTOCOL_REVISION, version_flags, version_build);
+}
+
+/* Event: PROTOCTL */
+int anope_event_capab(char *source, int ac, char **av)
+{
+ /* Not supported by ShadowIRCd. */
+ return MOD_CONT;
+}
+
+/* SVSHOLD - set */
+void anope_cmd_svshold(char *nick)
+{
+ /* Not supported by this IRCD */
+}
+
+/* SVSHOLD - release */
+void anope_cmd_release_svshold(char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSNICK */
+void anope_cmd_svsnick(char *nick, char *newnick, time_t when)
+{
+ if (!nick || !newnick) {
+ return;
+ }
+ send_cmd(NULL, "SVSNICK %s %s %ld", nick, newnick, when);
+}
+
+void anope_cmd_guest_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ /* not supported */
+}
+
+void anope_cmd_svso(char *source, char *nick, char *flag)
+{
+ /* Not Supported by this IRCD */
+}
+
+void anope_cmd_unban(char *name, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSMODE channel modes */
+
+void anope_cmd_svsmode_chan(char *name, char *mode, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSMODE +d */
+/* sent if svid is something weird */
+void anope_cmd_svid_umode(char *nick, time_t ts)
+{
+ /* not supported */
+}
+
+/* SVSMODE +d */
+/* nc_change was = 1, and there is no na->status */
+void anope_cmd_nc_change(User * u)
+{
+ /* not supported */
+}
+
+/* SVSMODE +d */
+void anope_cmd_svid_umode2(User * u, char *ts)
+{
+ /* not supported */
+}
+
+void anope_cmd_svid_umode3(User * u, char *ts)
+{
+ /* not used */
+}
+
+/* NICK <newnick> */
+void anope_cmd_chg_nick(char *oldnick, char *newnick)
+{
+ if (!oldnick || !newnick) {
+ return;
+ }
+
+ send_cmd(oldnick, "NICK %s", newnick);
+}
+
+/*
+ * SVINFO
+ * parv[0] = sender prefix
+ * parv[1] = TS_CURRENT for the server
+ * parv[2] = TS_MIN for the server
+ * parv[3] = server is standalone or connected to non-TS only
+ * parv[4] = server's idea of UTC time
+ */
+int anope_event_svinfo(char *source, int ac, char **av)
+{
+ /* currently not used but removes the message : unknown message from server */
+ return MOD_CONT;
+}
+
+int anope_event_pass(char *source, int ac, char **av)
+{
+ TS6UPLINK = sstrdup(av[3]);
+ return MOD_CONT;
+}
+
+void anope_cmd_svsjoin(char *source, char *nick, char *chan)
+{
+ /* Not Supported by this IRCD */
+}
+
+void anope_cmd_svspart(char *source, char *nick, char *chan)
+{
+ /* Not Supported by this IRCD */
+}
+
+void anope_cmd_swhois(char *source, char *who, char *mask)
+{
+ /* not supported */
+}
+
+int anope_event_notice(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_admin(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_invite(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_bmask(char *source, int ac, char **av)
+{
+ Channel *c;
+ char *bans;
+ char *b;
+ int count, i;
+
+ /* :42X BMASK 1106409026 #ircops b :*!*@*.aol.com */
+ /* 0 1 2 3 */
+ c = findchan(av[1]);
+
+ if (c) {
+ bans = sstrdup(av[3]);
+ count = myNumToken(bans, ' ');
+ for (i = 0; i <= count - 1; i++) {
+ b = myStrGetToken(bans, ' ', i);
+ if (!stricmp(av[2], "b")) {
+ add_ban(c, b);
+ }
+ if (!stricmp(av[2], "e")) {
+ add_exception(c, b);
+ }
+ if (!stricmp(av[2], "I")) {
+ add_invite(c, b);
+ }
+ }
+ }
+ return MOD_CONT;
+}
+
+int anope_flood_mode_check(char *value)
+{
+ return 0;
+}
+
+int anope_event_error(char *source, int ac, char **av)
+{
+ if (ac >= 1) {
+ if (debug) {
+ alog("ERROR: %s", av[0]);
+ }
+ }
+ return MOD_CONT;
+}
+
+void anope_cmd_jupe(char *jserver, char *who, char *reason)
+{
+ char rbuf[256];
+
+ snprintf(rbuf, sizeof(rbuf), "Juped by %s%s%s", who,
+ reason ? ": " : "", reason ? reason : "");
+
+ anope_cmd_squit(jserver, rbuf);
+ anope_cmd_server(jserver, 2, rbuf);
+ new_server(me_server, jserver, rbuf, SERVER_JUPED, NULL);
+}
+
+/*
+ 1 = valid nick
+ 0 = nick is in valid
+*/
+int anope_valid_nick(char *nick)
+{
+ /* no hard coded invalid nicks */
+ return 1;
+}
+
+void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ char *s;
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ } else {
+ s = normalizeBuffer(buf);
+ }
+
+ send_cmd(source, "NOTICE %s :\1%s \1", dest, s);
+}
+
+#endif
diff --git a/src/unreal32.c b/src/unreal32.c
index 3b617c3f8..eff1c4469 100644
--- a/src/unreal32.c
+++ b/src/unreal32.c
@@ -1094,7 +1094,7 @@ void anope_cmd_pass(char *pass)
void anope_cmd_server(char *servname, int hop, char *descript)
{
if (Numeric) {
- send_cmd(NULL, "SERVER %s %d :U0-*-%d %s", servname, hop, Numeric,
+ send_cmd(NULL, "SERVER %s %d :U0-*-%s %s", servname, hop, Numeric,
descript);
} else {
send_cmd(NULL, "SERVER %s %d :%s", servname, hop, descript);
@@ -1489,13 +1489,9 @@ void anope_cmd_vhost_on(char *nick, char *vIdent, char *vhost)
void anope_cmd_connect(int servernum)
{
- char buf[16];
- *buf = '\0';
-
if (Numeric) {
- snprintf(buf, sizeof(buf), "%d", Numeric);
me_server =
- new_server(NULL, ServerName, ServerDesc, SERVER_ISME, buf);
+ new_server(NULL, ServerName, ServerDesc, SERVER_ISME, Numeric);
} else {
me_server =
new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL);
@@ -1887,17 +1883,17 @@ int anope_event_server(char *source, int ac, char **av)
{
char *desc;
char *vl;
- char *numeric;
+ char *upnumeric;
if (!stricmp(av[1], "1")) {
uplink = sstrdup(av[0]);
vl = myStrGetToken(av[2], ' ', 0);
- numeric = myStrGetToken(vl, '-', 2);
+ upnumeric = myStrGetToken(vl, '-', 2);
desc = myStrGetTokenRemainder(av[2], ' ', 1);
- do_server(source, av[0], av[1], desc, numeric);
+ do_server(source, av[0], av[1], desc, upnumeric);
Anope_Free(vl);
Anope_Free(desc);
- Anope_Free(numeric);
+ Anope_Free(upnumeric);
} else {
do_server(source, av[0], av[1], av[2], NULL);
}
diff --git a/version.log b/version.log
index 1c8fc617e..104cd7945 100644
--- a/version.log
+++ b/version.log
@@ -8,10 +8,14 @@
VERSION_MAJOR="1"
VERSION_MINOR="7"
VERSION_PATCH="8"
-VERSION_BUILD="594"
+VERSION_BUILD="595"
# $Log$
#
+# BUILD : 1.7.8 (595)
+# BUGS : N/A
+# NOTES : ShadowIRCD, and cleaned up Numeric
+#
# BUILD : 1.7.8 (594)
# BUGS : N/A
# NOTES : Changes strdup to sstrdup - doh!