summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changes10
-rw-r--r--Changes.lang7
-rwxr-xr-xConfig7
-rw-r--r--Makefile.in1
-rwxr-xr-xconfigure159
-rw-r--r--configure.in9
-rw-r--r--include/extern.h5
-rw-r--r--include/services.h11
-rw-r--r--include/solidircd.h78
-rw-r--r--include/sysconf.h.in6
-rw-r--r--lang/cat.l12
-rw-r--r--lang/de.l12
-rw-r--r--lang/en_us.l18
-rw-r--r--lang/es.l12
-rw-r--r--lang/fr.l12
-rw-r--r--lang/gr.l12
-rw-r--r--lang/hun.l12
-rw-r--r--lang/it.l12
-rw-r--r--lang/nl.l12
-rw-r--r--lang/pl.l12
-rw-r--r--lang/pt.l12
-rw-r--r--lang/ru.l12
-rw-r--r--lang/tr.l12
-rw-r--r--src/Makefile6
-rw-r--r--src/botserv.c33
-rw-r--r--src/chanserv.c2
-rw-r--r--src/hostserv.c4
-rw-r--r--src/language.c2
-rw-r--r--src/main.c35
-rw-r--r--src/memoserv.c7
-rw-r--r--src/news.c2
-rw-r--r--src/nickserv.c6
-rw-r--r--src/operserv.c38
-rw-r--r--src/ptlink.c15
-rw-r--r--src/sessions.c35
-rw-r--r--src/solidircd.c1710
-rw-r--r--src/unreal32.c12
-rw-r--r--src/users.c20
-rw-r--r--version.log17
39 files changed, 2321 insertions, 78 deletions
diff --git a/Changes b/Changes
index a7821044b..9249e8988 100644
--- a/Changes
+++ b/Changes
@@ -7,9 +7,18 @@ Provided by Anope Dev. <dev@anope.org> - 2004
11/19 F Wrong string and missing registered nick check in bot change. [#221]
Provided by Trystan <trystan@nomadirc.net> - 2004
+11/27 A Solid IRCD support (Solid IRCD 3.4.6 or later) [ #00]
+11/27 A Exceptions now update if the limit is different [ #00]
+11/27 A Segfaults logged to the services log when DumpCore is disabled [ #00]
+11/27 A OperServ SET SQL [on|off] disable/enable SQL during run time [ #00]
11/21 A Opened SGLINE to all ircd that support GEOS bans [ #00]
11/21 A Opened SZLINE to all ircd that support ZLINE's [ #00]
11/19 A Added anope_cmd_ctcp() to code API, for sending CTCP messages. [ #00]
+11/27 F Compiles and Runs under CYGWIN again [ #00]
+11/27 F bot_raw_mode() would cause a TSMODE warning [#234]
+11/27 F do_kil() not removing users from the user list [#222]
+11/27 F Unreal3.2 supports SVSMODE -b on clearing bans [ #00]
+11/27 F Removed +d references from the PTlink protocol file [ #00]
11/23 F Rage 2 updated to support BETA 7 [#226]
11/23 F PTLink anope_cmd_server() message [ #00]
11/20 F Disables UseRDB if there is an error duing SQL init [ #00]
@@ -21,6 +30,7 @@ Provided by Trystan <trystan@nomadirc.net> - 2004
11/16 F NickTracking could allow usage of forbidden nick in some cases. [ #00]
Provided by DrStein <gacevedo@anope.org> - 2004
+11/26 F Memos sent as notification of receipt can't be cancelled. [#192]
11/23 F Moving Services Operators to Services Admins and vice-versa [#230]
11/22 F HelpChan +h mode not being given if status was greater then op. [#223]
diff --git a/Changes.lang b/Changes.lang
index 3a713e46c..d6b5adfcb 100644
--- a/Changes.lang
+++ b/Changes.lang
@@ -5,6 +5,13 @@ Anope Version S V N
NICK_REGISTERED_NO_MASK
OPER_ADMIN_MOVED
OPER_OPER_MOVED
+ OPER_HELP_SET_SQL
+ OPER_SET_SQL_ON
+ OPER_SET_SQL_OFF
+ OPER_SET_SQL_ERROR
+ OPER_SET_SQL_ERROR_INIT
+ OPER_EXCEPTION_EXISTS
+ OPER_EXCEPTION_CHANGED
*** Mod Strings:
diff --git a/Config b/Config
index 990a70335..387e379fb 100755
--- a/Config
+++ b/Config
@@ -222,7 +222,7 @@ echo " 7) ViagraIRCd 1.3.x [or later]"
echo " 8) PTlink 6.15.0 [experimental]"
echo " 9) RageIRCd 2.0.0 [beta-6 or later]"
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]"
while [ $ok -eq 0 ] ; do
echo2 "[$IRCTYPE] "
@@ -277,6 +277,11 @@ while [ $ok -eq 0 ] ; do
ok=1;
;;
+ 11)
+ IRCTYPE_DEF="IRC_SOLID"
+ ok=1;
+ ;;
+
*)
echo "Please enter a valid option number."
diff --git a/Makefile.in b/Makefile.in
index 910b5d557..cf5aa6e1c 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -15,6 +15,7 @@ MODULE_PATH=@MODULE_PATH@
MYSQL=@MYSQL@
RDB=@RDB@
LDFLAGS=@LDFLAGS@
+RUNGROUP=@RUNGROUP@
all: language headers build modules
strict: language headers strict_build strict_modules
diff --git a/configure b/configure
index 871d693b6..b53440450 100755
--- a/configure
+++ b/configure
@@ -309,7 +309,7 @@ ac_includes_default="\
# include <unistd.h>
#endif"
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT RM CP TOUCH INSTALL CPP EGREP MYSQL RDB MYSQLCLIENT_LDFLAGS MYSQLCLIENT_CFLAGS MYSQLCLIENT_LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os acx_pthread_config PTHREAD_CC PTHREAD_LIBS PTHREAD_CFLAGS ANOPELIBS BINDEST DATDEST MODULE_PATH LIBOBJS LTLIBOBJS'
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT RM CP TOUCH INSTALL CPP EGREP MYSQL RDB MYSQLCLIENT_LDFLAGS MYSQLCLIENT_CFLAGS MYSQLCLIENT_LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os acx_pthread_config PTHREAD_CC PTHREAD_LIBS PTHREAD_CFLAGS ANOPELIBS RUNGROUP BINDEST DATDEST MODULE_PATH LIBOBJS LTLIBOBJS'
ac_subst_files=''
# Initialize some variables set by options.
@@ -6815,6 +6815,152 @@ _ACEOF
fi
+if test "${ac_cv_header_execinfo_h+set}" = set; then
+ echo "$as_me:$LINENO: checking for execinfo.h" >&5
+echo $ECHO_N "checking for execinfo.h... $ECHO_C" >&6
+if test "${ac_cv_header_execinfo_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_execinfo_h" >&5
+echo "${ECHO_T}$ac_cv_header_execinfo_h" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking execinfo.h usability" >&5
+echo $ECHO_N "checking execinfo.h usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <execinfo.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking execinfo.h presence" >&5
+echo $ECHO_N "checking execinfo.h presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <execinfo.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: execinfo.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: execinfo.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: execinfo.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: execinfo.h: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: execinfo.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: execinfo.h: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: execinfo.h: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: execinfo.h: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: execinfo.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: execinfo.h: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: execinfo.h: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: execinfo.h: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: execinfo.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: execinfo.h: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: execinfo.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: execinfo.h: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------------ ##
+## Report this to the AC_PACKAGE_NAME lists. ##
+## ------------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for execinfo.h" >&5
+echo $ECHO_N "checking for execinfo.h... $ECHO_C" >&6
+if test "${ac_cv_header_execinfo_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_header_execinfo_h=$ac_header_preproc
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_execinfo_h" >&5
+echo "${ECHO_T}$ac_cv_header_execinfo_h" >&6
+
+fi
+if test $ac_cv_header_execinfo_h = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_BACKTRACE 1
+_ACEOF
+
+fi
+
+
for ac_func in strerror
@@ -8293,14 +8439,18 @@ done
if test "${with_rungroup+set}" = set; then
withval="$with_rungroup"
+
cat >>confdefs.h <<_ACEOF
#define RUNGROUP "$withval"
_ACEOF
+ RUNGROUP=$withval
+
fi;
+
# Check whether --with-permissions or --without-permissions was given.
if test "${with_permissions+set}" = set; then
withval="$with_permissions"
@@ -8423,6 +8573,12 @@ cat >>confdefs.h <<\_ACEOF
#define IRC_UNREAL32 1
_ACEOF
+ elif test "$withval" = "IRC_SOLID"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define IRC_SOLID 1
+_ACEOF
+
fi
@@ -9088,6 +9244,7 @@ s,@PTHREAD_CC@,$PTHREAD_CC,;t t
s,@PTHREAD_LIBS@,$PTHREAD_LIBS,;t t
s,@PTHREAD_CFLAGS@,$PTHREAD_CFLAGS,;t t
s,@ANOPELIBS@,$ANOPELIBS,;t t
+s,@RUNGROUP@,$RUNGROUP,;t t
s,@BINDEST@,$BINDEST,;t t
s,@DATDEST@,$DATDEST,;t t
s,@MODULE_PATH@,$MODULE_PATH,;t t
diff --git a/configure.in b/configure.in
index 65200f69e..f821a414e 100644
--- a/configure.in
+++ b/configure.in
@@ -145,6 +145,7 @@ unreal_CHECK_TYPE_SIZES
AC_CHECK_HEADER(strings.h,AC_DEFINE(HAVE_STRINGS_H,1,""))
AC_CHECK_HEADER(sys/select.h,AC_DEFINE(HAVE_SYS_SELECT_H,1,""))
+AC_CHECK_HEADER(execinfo.h,AC_DEFINE(HAVE_BACKTRACE,1,""))
AC_CHECK_FUNCS(strerror,AC_DEFINE(HAVE_STRERROR,1))
AC_CHECK_FUNCS(sys_errlist,AC_DEFINE(HAVE_SYS_ERRLIST,1))
@@ -162,7 +163,11 @@ AC_CHECK_FUNCS(gethostbyname,AC_DEFINE(HAVE_GETHOSTBYNAME,1))
AC_CHECK_FUNCS(gethostbyname_r,AC_DEFINE(HAVE_GETHOSTBYNAME_R,1))
-AC_ARG_WITH(rungroup, [ --with-rungroup=group Specify the rungroup for anope], AC_DEFINE_UNQUOTED(RUNGROUP,"$withval","Run group"))
+AC_ARG_WITH(rungroup, [ --with-rungroup=group Specify the rungroup for anope], [
+ AC_DEFINE_UNQUOTED(RUNGROUP,"$withval","Run group")
+ RUNGROUP=$withval
+])
+AC_SUBST(RUNGROUP)
dnl AC_DEFINE_UNQUOTED(MYOSNAME,"`uname -a`","uname")
@@ -208,6 +213,8 @@ AC_ARG_WITH(ircd, [ --with-ircd=ircd Specify the first ircd type], [
AC_DEFINE(IRC_RAGE2,1,"First IRCD type")
elif test "$withval" = "IRC_UNREAL32"; then
AC_DEFINE(IRC_UNREAL32,1,"First IRCD type")
+ elif test "$withval" = "IRC_SOLID"; then
+ AC_DEFINE(IRC_SOLID,1,"First IRCD type")
fi
])
diff --git a/include/extern.h b/include/extern.h
index 31b37a8cf..a3e6da887 100644
--- a/include/extern.h
+++ b/include/extern.h
@@ -609,6 +609,8 @@ E time_t start_time;
E void save_databases(void);
E void expire_all(void);
+E void do_backtrace(void);
+E void sighandler(int signum);
/**** memory.c ****/
@@ -871,7 +873,8 @@ E void disconn(int s);
E User *userlist[1024];
-E int32 usercnt, opcnt, maxusercnt;
+E int32 usercnt, opcnt;
+E uint32 maxusercnt;
E time_t maxusertime;
E void delete_user(User *user);
diff --git a/include/services.h b/include/services.h
index 9002789ae..2d6aae05f 100644
--- a/include/services.h
+++ b/include/services.h
@@ -50,6 +50,10 @@
#include <sys/types.h>
#include <sys/time.h>
+#ifdef HAVE_BACKTRACE
+#include <execinfo.h>
+#endif
+
#ifdef USE_RDB
# define MAX_SQL_BUF 4096
#endif
@@ -171,6 +175,7 @@ typedef enum { false, true } boolean;
#include "ultimate3.h"
#include "dreamforge.h"
#include "unreal32.h"
+#include "solidircd.h"
typedef struct ircdvars_ IRCDVar;
typedef struct ircdcapab_ IRCDCAPAB;
@@ -372,7 +377,7 @@ struct nickcore_ {
char *greet; /* Greet associated to the nick */
uint32 icq; /* ICQ # associated to the nick */
char *url; /* URL associated to the nick */
- int32 flags; /* See NI_* below */
+ uint32 flags; /* See NI_* below */
uint16 language; /* Language selected by nickname owner (LANG_*) */
int16 accesscount; /* # of entries */
char **access; /* Array of strings */
@@ -899,7 +904,7 @@ struct hostcore_ {
struct newsitem_ {
int16 type;
- int32 num; /* Numbering is separate for login and oper news */
+ uint32 num; /* Numbering is separate for login and oper news */
char *text;
char who[NICKMAX];
time_t time;
@@ -968,7 +973,7 @@ struct hostcache_ {
/* 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 */
diff --git a/include/solidircd.h b/include/solidircd.h
new file mode 100644
index 000000000..6225885ea
--- /dev/null
+++ b/include/solidircd.h
@@ -0,0 +1,78 @@
+/* Bahamut functions
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ *
+ */
+
+/*************************************************************************/
+
+#ifdef IRC_SOLID
+
+#define PROTECT_SET_MODE "+"
+#define PROTECT_UNSET_MODE "-"
+#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 /* umode +a - Services Admin */
+#define UMODE_h 0x00000002 /* umode +h - Helper */
+#define UMODE_i 0x00000004 /* umode +i - Invisible */
+#define UMODE_o 0x00000008 /* umode +o - Oper */
+#define UMODE_r 0x00000010 /* umode +r - registered nick */
+#define UMODE_w 0x00000020 /* umode +w - Get wallops */
+#define UMODE_A 0x00000040 /* umode +A - Server Admin */
+#define UMODE_x 0x00000080 /* umode +x - Squelch with notice */
+#define UMODE_X 0x00000100 /* umode +X - Squelch without notice */
+#define UMODE_F 0x00000200 /* umode +F - no cptr->since message rate throttle */
+#define UMODE_j 0x00000400 /* umode +j - client rejection notices */
+#define UMODE_K 0x00000800 /* umode +K - U: lined server kill messages */
+#define UMODE_O 0x00001000 /* umode +O - Local Oper */
+#define UMODE_s 0x00002000 /* umode +s - Server notices */
+#define UMODE_c 0x00004000 /* umode +c - Client connections/exits */
+#define UMODE_k 0x00008000 /* umode +k - Server kill messages */
+#define UMODE_f 0x00010000 /* umode +f - Server flood messages */
+#define UMODE_y 0x00020000 /* umode +y - Stats/links */
+#define UMODE_d 0x00040000 /* umode +d - Debug info */
+#define UMODE_g 0x00080000 /* umode +g - Globops */
+#define UMODE_b 0x00100000 /* umode +b - Chatops */
+#define UMODE_n 0x00200000 /* umode +n - Routing Notices */
+#define UMODE_m 0x00400000 /* umode +m - spambot notices */
+#define UMODE_e 0x00800000 /* umode +e - oper notices for the above +D */
+#define UMODE_D 0x01000000 /* umode +D - Hidden dccallow umode */
+#define UMODE_I 0x02000000 /* umode +I - invisible oper (masked) */
+#define UMODE_C 0x04000000 /* umode +C - conops */
+#define UMODE_v 0x10000000 /* umode +v - hostmasking */
+#define UMODE_H 0x20000000 /* umode +H - Oper Hiding */
+#define UMODE_z 0x40000000 /* umode +z - SSL */
+#define UMODE_R 0x80000000 /* umode +R - No non registered msgs */
+
+#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 /* These two used only by ChanServ */
+#define CMODE_l 0x00000080
+#define CMODE_R 0x00000100 /* Only identified users can join */
+#define CMODE_r 0x00000200 /* Set for all registered channels */
+#define CMODE_c 0x00000400 /* Colors can't be used */
+#define CMODE_M 0x00000800 /* Non-regged nicks can't send messages */
+#define CMODE_j 0x00001000 /* join throttle */
+#define CMODE_O 0x00008000 /* Only opers can join */
+
+#define DEFAULT_MLOCK CMODE_n | CMODE_t | CMODE_r
+
+#endif
+
diff --git a/include/sysconf.h.in b/include/sysconf.h.in
index 8d8a0e292..472075577 100644
--- a/include/sysconf.h.in
+++ b/include/sysconf.h.in
@@ -75,6 +75,9 @@
/* "" */
#undef HAVE_SYS_SELECT_H
+/* "" */
+#undef HAVE_BACKTRACE
+
/* Define to 1 if you have the <sys/stat.h> header file. */
#undef HAVE_SYS_STAT_H
@@ -117,6 +120,9 @@
/* "First IRCD type" */
#undef IRC_VIAGRA
+/* "First IRCD type" */
+#undef IRC_SOLID
+
/* "Module dir" */
#undef MODULE_PATH
diff --git a/lang/cat.l b/lang/cat.l
index 49d242b39..d2bc618d6 100644
--- a/lang/cat.l
+++ b/lang/cat.l
@@ -2679,6 +2679,14 @@ OPER_SET_NOEXPIRE_ERROR
Establiment per a NOEXPIRE ha de ser ON o OFF.
OPER_SET_UNKNOWN_OPTION
Opció %s desconeguda.
+OPER_SET_SQL_ON
+ SQL code will be used.
+OPER_SET_SQL_OFF
+ SQL code will not be used.
+OPER_SET_SQL_ERROR
+ Setting for SQL must be ON or OFF.
+OPER_SET_SQL_ERROR_INIT
+ Error during init of SQL, check your logs to correct.
# NOOP responses
OPER_NOOP_SYNTAX
@@ -2949,6 +2957,10 @@ OPER_EXCEPTION_INVALID_LIMIT
Límit de sessió invàlid. Ha de ser un sencer vàlido més gran o igual a zero i mes petit que %d.
OPER_EXCEPTION_INVALID_HOSTMASK
Mascara invalida. Nomès mascares reals son valides ja que excepcions no son comparades a nicks o usernames.
+OPER_EXCEPTION_EXISTS
+ %s already exists on the EXCEPTION list.
+OPER_EXCEPTION_CHANGED
+ Exception for %s has been updated to %d.
# SESSION responses
OPER_SESSION_SYNTAX
diff --git a/lang/de.l b/lang/de.l
index fdc32ff69..32d71bec5 100644
--- a/lang/de.l
+++ b/lang/de.l
@@ -2669,6 +2669,14 @@ OPER_SET_NOEXPIRE_ERROR
Die Einstellung von NOEXPIRE kann nur ON oder OFF sein.
OPER_SET_UNKNOWN_OPTION
Unbekannte Option %s.
+OPER_SET_SQL_ON
+ SQL code will be used.
+OPER_SET_SQL_OFF
+ SQL code will not be used.
+OPER_SET_SQL_ERROR
+ Setting for SQL must be ON or OFF.
+OPER_SET_SQL_ERROR_INIT
+ Error during init of SQL, check your logs to correct.
# NOOP responses
OPER_NOOP_SYNTAX
@@ -2942,6 +2950,10 @@ OPER_EXCEPTION_INVALID_LIMIT
Null aber kleiner als %d.
OPER_EXCEPTION_INVALID_HOSTMASK
Ungültige Hostmask. Nur echte Hostmasken sind gültig als Einträge (ohne Nicknamen und Idents).
+OPER_EXCEPTION_EXISTS
+ %s already exists on the EXCEPTION list.
+OPER_EXCEPTION_CHANGED
+ Exception for %s has been updated to %d.
# SESSION responses
OPER_SESSION_SYNTAX
diff --git a/lang/en_us.l b/lang/en_us.l
index b9915434f..70b12fc6f 100644
--- a/lang/en_us.l
+++ b/lang/en_us.l
@@ -2610,6 +2610,14 @@ OPER_SET_NOEXPIRE_ERROR
Setting for NOEXPIRE must be ON or OFF.
OPER_SET_UNKNOWN_OPTION
Unknown option %s.
+OPER_SET_SQL_ON
+ SQL code will be used.
+OPER_SET_SQL_OFF
+ SQL code will not be used.
+OPER_SET_SQL_ERROR
+ Setting for SQL must be ON or OFF.
+OPER_SET_SQL_ERROR_INIT
+ Error during init of SQL, check your logs to correct.
# NOOP responses
OPER_NOOP_SYNTAX
@@ -2841,6 +2849,10 @@ OPER_EXCEPTION_INVALID_LIMIT
Invalid session limit. It must be a valid integer greater than or equal to zero and less than %d.
OPER_EXCEPTION_INVALID_HOSTMASK
Invalid hostmask. Only real hostmasks are valid as exceptions are not matched against nicks or usernames.
+OPER_EXCEPTION_EXISTS
+ %s already exists on the EXCEPTION list.
+OPER_EXCEPTION_CHANGED
+ Exception for %s has been updated to %d.
# SESSION responses
OPER_SESSION_SYNTAX
@@ -5394,6 +5406,12 @@ OPER_HELP_SET_SUPERADMIN
This option is not persistant, and should only be used when
needed, and set back to OFF when no longer needed.
+OPER_HELP_SET_SQL
+ Syntax: SET SQL {ON | OFF}
+
+ Setting this will toggle Anope's from usage of SQL, this should
+ be used to disable and enable SQL should your SQL server go down
+ while services are running.
OPER_HELP_NOOP
Syntax: NOOP SET server
diff --git a/lang/es.l b/lang/es.l
index 441a81f0f..22f376b7d 100644
--- a/lang/es.l
+++ b/lang/es.l
@@ -2658,6 +2658,14 @@ OPER_SET_NOEXPIRE_ERROR
Seteo para NOEXPIRE debe ser ON u OFF.
OPER_SET_UNKNOWN_OPTION
Opcion %s desconocida.
+OPER_SET_SQL_ON
+ SQL code will be used.
+OPER_SET_SQL_OFF
+ SQL code will not be used.
+OPER_SET_SQL_ERROR
+ Setting for SQL must be ON or OFF.
+OPER_SET_SQL_ERROR_INIT
+ Error during init of SQL, check your logs to correct.
# NOOP responses
OPER_NOOP_SYNTAX
@@ -2929,6 +2937,10 @@ OPER_EXCEPTION_INVALID_LIMIT
Limite de sesion invalido. Debe ser un entero valido mayor o igual a cero y menor a %d.
OPER_EXCEPTION_INVALID_HOSTMASK
Mascara invalida. Solo mascaras reales son validas ya que excepciones no son comparadas a nicks o usernames.
+OPER_EXCEPTION_EXISTS
+ %s already exists on the EXCEPTION list.
+OPER_EXCEPTION_CHANGED
+ Exception for %s has been updated to %d.
# SESSION responses
OPER_SESSION_SYNTAX
diff --git a/lang/fr.l b/lang/fr.l
index a721a6fbf..2934f91d7 100644
--- a/lang/fr.l
+++ b/lang/fr.l
@@ -2690,6 +2690,14 @@ OPER_SET_NOEXPIRE_ERROR
La valeur de NOEXPIRE doit être ON ou OFF.
OPER_SET_UNKNOWN_OPTION
Option inconnue %s.
+OPER_SET_SQL_ON
+ SQL code will be used.
+OPER_SET_SQL_OFF
+ SQL code will not be used.
+OPER_SET_SQL_ERROR
+ Setting for SQL must be ON or OFF.
+OPER_SET_SQL_ERROR_INIT
+ Error during init of SQL, check your logs to correct.
# NOOP responses
OPER_NOOP_SYNTAX
@@ -2962,6 +2970,10 @@ OPER_EXCEPTION_INVALID_LIMIT
Limite de session invalide. Elle doit être un entier valide supérieur ou égal à zero et plus petit que %d.
OPER_EXCEPTION_INVALID_HOSTMASK
Hostmask invalide. Seuls les hostmasks réels sont valides puisque les exceptions ne sont pas comparés aux nicks et usernames.
+OPER_EXCEPTION_EXISTS
+ %s already exists on the EXCEPTION list.
+OPER_EXCEPTION_CHANGED
+ Exception for %s has been updated to %d.
# SESSION responses
OPER_SESSION_SYNTAX
diff --git a/lang/gr.l b/lang/gr.l
index 553b64ca4..f941d5706 100644
--- a/lang/gr.l
+++ b/lang/gr.l
@@ -2668,6 +2668,14 @@ OPER_SET_NOEXPIRE_ERROR
Ç åðéëïãÞ ãéá NOEXPIRE ðñÝðåé íá åßíáé ON Þ OFF.
OPER_SET_UNKNOWN_OPTION
¢ãíùóôç åðéëïãÞ %s.
+OPER_SET_SQL_ON
+ SQL code will be used.
+OPER_SET_SQL_OFF
+ SQL code will not be used.
+OPER_SET_SQL_ERROR
+ Setting for SQL must be ON or OFF.
+OPER_SET_SQL_ERROR_INIT
+ Error during init of SQL, check your logs to correct.
# NOOP responses
OPER_NOOP_SYNTAX
@@ -2938,6 +2946,10 @@ OPER_EXCEPTION_INVALID_LIMIT
ËÜèïò session limit. ÐñÝðåé íá åßíáé ëÜèïò ï integer greater Þ ðñÝðåé íá åßíáé ìåôáîý ìçäÝí êáé %d.
OPER_EXCEPTION_INVALID_HOSTMASK
ËÜèïò hostmask. Ìüíï ðñáãìáôéêÜ hostmasks ÷ñçóéìïðïéïýíôáé êáé ü÷é øåõäþíõìá Þ usernames.
+OPER_EXCEPTION_EXISTS
+ %s already exists on the EXCEPTION list.
+OPER_EXCEPTION_CHANGED
+ Exception for %s has been updated to %d.
# SESSION responses
OPER_SESSION_SYNTAX
diff --git a/lang/hun.l b/lang/hun.l
index 766fb319e..4d67fb930 100644
--- a/lang/hun.l
+++ b/lang/hun.l
@@ -2631,6 +2631,14 @@ OPER_SET_NOEXPIRE_ERROR
Az NOEXPIRE beállításhoz kell ON vagy OFF.
OPER_SET_UNKNOWN_OPTION
Ismeretlen beállítás %s.
+OPER_SET_SQL_ON
+ SQL code will be used.
+OPER_SET_SQL_OFF
+ SQL code will not be used.
+OPER_SET_SQL_ERROR
+ Setting for SQL must be ON or OFF.
+OPER_SET_SQL_ERROR_INIT
+ Error during init of SQL, check your logs to correct.
# NOOP válaszok
OPER_NOOP_SYNTAX
@@ -2868,6 +2876,10 @@ OPER_EXCEPTION_INVALID_LIMIT
OPER_EXCEPTION_INVALID_HOSTMASK
Érvénytelen hosztmaszk. Csak érvényes hosztmaszk lehet,
a kivétel nem lehet nick vagy usernév.
+OPER_EXCEPTION_EXISTS
+ %s already exists on the EXCEPTION list.
+OPER_EXCEPTION_CHANGED
+ Exception for %s has been updated to %d.
# SESSION válaszok
OPER_SESSION_SYNTAX
diff --git a/lang/it.l b/lang/it.l
index 50d6c8943..e7291d62b 100644
--- a/lang/it.l
+++ b/lang/it.l
@@ -2675,6 +2675,14 @@ OPER_SET_NOEXPIRE_ERROR
Il parametro dell'opzione NOEXPIRE deve essere ON o OFF.
OPER_SET_UNKNOWN_OPTION
Opzione %s sconosciuta.
+OPER_SET_SQL_ON
+ SQL code will be used.
+OPER_SET_SQL_OFF
+ SQL code will not be used.
+OPER_SET_SQL_ERROR
+ Setting for SQL must be ON or OFF.
+OPER_SET_SQL_ERROR_INIT
+ Error during init of SQL, check your logs to correct.
# NOOP responses
OPER_NOOP_SYNTAX
@@ -2942,6 +2950,10 @@ OPER_EXCEPTION_INVALID_LIMIT
Limite delle sessioni non valido. Deve essere un numero intero maggiore o uguale a zero e minore di %d.
OPER_EXCEPTION_INVALID_HOSTMASK
Hostmask non valida. Solo le hostmask reali sono valide; le eccezioni non vengono confrontate con i nick o con gli username (ident).
+OPER_EXCEPTION_EXISTS
+ %s already exists on the EXCEPTION list.
+OPER_EXCEPTION_CHANGED
+ Exception for %s has been updated to %d.
# SESSION responses
OPER_SESSION_SYNTAX
diff --git a/lang/nl.l b/lang/nl.l
index 4c7766c88..2cfe9e88f 100644
--- a/lang/nl.l
+++ b/lang/nl.l
@@ -2645,6 +2645,14 @@ OPER_SET_NOEXPIRE_ERROR
Instelling voor NOEXPIRE moet ON of OFF zijn.
OPER_SET_UNKNOWN_OPTION
Onbekende optie %s.
+OPER_SET_SQL_ON
+ SQL code will be used.
+OPER_SET_SQL_OFF
+ SQL code will not be used.
+OPER_SET_SQL_ERROR
+ Setting for SQL must be ON or OFF.
+OPER_SET_SQL_ERROR_INIT
+ Error during init of SQL, check your logs to correct.
# NOOP responses
OPER_NOOP_SYNTAX
@@ -2895,6 +2903,10 @@ OPER_EXCEPTION_INVALID_LIMIT
Ongeldige sessie limiet. Het moet een geldige integer groter dan of gelijk aan nul en kleiner dan %d.
OPER_EXCEPTION_INVALID_HOSTMASK
Ongeldige hostmask. Alleen echte hostmasks zijn geldig als uitzondering omdat deze niet worden vergeleken met nicks of usernames.
+OPER_EXCEPTION_EXISTS
+ %s already exists on the EXCEPTION list.
+OPER_EXCEPTION_CHANGED
+ Exception for %s has been updated to %d.
# SESSION responses
OPER_SESSION_SYNTAX
diff --git a/lang/pl.l b/lang/pl.l
index fc10e3701..5afd564f3 100644
--- a/lang/pl.l
+++ b/lang/pl.l
@@ -2859,6 +2859,14 @@ OPER_SET_NOEXPIRE_ERROR
ON lub OFF.
OPER_SET_UNKNOWN_OPTION
Nieznana opcja %s.
+OPER_SET_SQL_ON
+ SQL code will be used.
+OPER_SET_SQL_OFF
+ SQL code will not be used.
+OPER_SET_SQL_ERROR
+ Setting for SQL must be ON or OFF.
+OPER_SET_SQL_ERROR_INIT
+ Error during init of SQL, check your logs to correct.
# NOOP responses
OPER_NOOP_SYNTAX
@@ -3105,6 +3113,10 @@ OPER_EXCEPTION_INVALID_LIMIT
OPER_EXCEPTION_INVALID_HOSTMASK
Nieprawid³owa maska. Tylko rzeczywiste maski s±
prawid³owe jako wyj±tki.
+OPER_EXCEPTION_EXISTS
+ %s already exists on the EXCEPTION list.
+OPER_EXCEPTION_CHANGED
+ Exception for %s has been updated to %d.
# SESSION responses
OPER_SESSION_SYNTAX
diff --git a/lang/pt.l b/lang/pt.l
index ba5b462ac..a81e897f3 100644
--- a/lang/pt.l
+++ b/lang/pt.l
@@ -2670,6 +2670,14 @@ OPER_SET_NOEXPIRE_ERROR
Opção NOEXPIRE deve ser ON ou OFF.
OPER_SET_UNKNOWN_OPTION
Opção desconhecida: %s.
+OPER_SET_SQL_ON
+ SQL code will be used.
+OPER_SET_SQL_OFF
+ SQL code will not be used.
+OPER_SET_SQL_ERROR
+ Setting for SQL must be ON or OFF.
+OPER_SET_SQL_ERROR_INIT
+ Error during init of SQL, check your logs to correct.
# NOOP responses
OPER_NOOP_SYNTAX
@@ -2946,6 +2954,10 @@ OPER_EXCEPTION_INVALID_LIMIT
Limite de sessão inválida. O limite deve ser um número inteiro maior ou igual a zero e menor que %d.
OPER_EXCEPTION_INVALID_HOSTMASK
Máscara inválida. Apenas máscaras (hosts) são válidas como exceções aos limites de sessões. Nick ou username não são válidos.
+OPER_EXCEPTION_EXISTS
+ %s already exists on the EXCEPTION list.
+OPER_EXCEPTION_CHANGED
+ Exception for %s has been updated to %d.
# SESSION responses
OPER_SESSION_SYNTAX
diff --git a/lang/ru.l b/lang/ru.l
index 0a142d853..7387d87e9 100644
--- a/lang/ru.l
+++ b/lang/ru.l
@@ -2642,6 +2642,14 @@ OPER_SET_NOEXPIRE_ERROR
Îïöèÿ NOEXPIRE äîëæíà èìåòü çíà÷åíèÿ òîëüêî ON èëè OFF.
OPER_SET_UNKNOWN_OPTION
Íåèçâåñòíàÿ îïöèÿ %s.
+OPER_SET_SQL_ON
+ SQL code will be used.
+OPER_SET_SQL_OFF
+ SQL code will not be used.
+OPER_SET_SQL_ERROR
+ Setting for SQL must be ON or OFF.
+OPER_SET_SQL_ERROR_INIT
+ Error during init of SQL, check your logs to correct.
# NOOP responses
OPER_NOOP_SYNTAX
@@ -2876,6 +2884,10 @@ OPER_EXCEPTION_INVALID_LIMIT
Íåêîððåêòíûé ëèìèò ñåññèé. Îí äîëæåí áûòü öåëûì ÷èñëîì áîëüøå èëè ðàâíûì íóëÿ è ìåíüøå %d.
OPER_EXCEPTION_INVALID_HOSTMASK
Íåêîððåêòíàÿ õîñòìàñêà. Òîëüêî ðåàëüíàÿ õîñòìàñêà ìîæåò áûòü äîáàâëåíà â èñêëþ÷åíèÿ, îíà íå äîëæíà ñîäåðæàòü íèêîâ èëè èìåí ïîëüçîâàòåëåé.
+OPER_EXCEPTION_EXISTS
+ %s already exists on the EXCEPTION list.
+OPER_EXCEPTION_CHANGED
+ Exception for %s has been updated to %d.
# SESSION responses
OPER_SESSION_SYNTAX
diff --git a/lang/tr.l b/lang/tr.l
index 323675e44..fdbca8c97 100644
--- a/lang/tr.l
+++ b/lang/tr.l
@@ -2673,6 +2673,14 @@ OPER_SET_NOEXPIRE_ERROR
NOEXPIRE ayarý ON yada OFF olmalýdýr.
OPER_SET_UNKNOWN_OPTION
Varolmayan özellik %s.
+OPER_SET_SQL_ON
+ SQL code will be used.
+OPER_SET_SQL_OFF
+ SQL code will not be used.
+OPER_SET_SQL_ERROR
+ Setting for SQL must be ON or OFF.
+OPER_SET_SQL_ERROR_INIT
+ Error during init of SQL, check your logs to correct.
# NOOP responses
OPER_NOOP_SYNTAX
@@ -2943,6 +2951,10 @@ OPER_EXCEPTION_INVALID_LIMIT
Geçersiz session limiti. Sýfýrdan büyük yada eþit ve %d den az bir geçerli tamsayý olmalýdýr.
OPER_EXCEPTION_INVALID_HOSTMASK
Geçersiz hostmask. Sadece gerçek hostmasklar exception olarak geçerlidir.
+OPER_EXCEPTION_EXISTS
+ %s already exists on the EXCEPTION list.
+OPER_EXCEPTION_CHANGED
+ Exception for %s has been updated to %d.
# SESSION responses
OPER_SESSION_SYNTAX
diff --git a/src/Makefile b/src/Makefile
index dd672c721..54929bf50 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -5,14 +5,14 @@ OBJS = actions.o base64.o botserv.o channels.o chanserv.o commands.o compat.o c
memory.o memoserv.o messages.o misc.o modules.o news.o nickserv.o operserv.o \
process.o proxy.o send.o servers.o sessions.o slist.o sockutil.o \
timeout.o users.o dreamforge.o bahamut.o unreal31.o ultimate2.o ultimate3.o \
- hybrid.o ptlink.o viagra.o rageircd.o unreal32.o \
+ hybrid.o ptlink.o viagra.o rageircd.o unreal32.o solidircd.o \
$(VSNPRINTF_O) $(RDB_OBJ) $(MYSQL_OBJ)
SRCS = actions.c base64.c botserv.c channels.c chanserv.c commands.c compat.c converter.c \
config.c datafiles.c encrypt.c helpserv.c hostserv.c init.c language.c list.c log.c mail.c main.c \
memory.c memoserv.c messages.c misc.c modules.c news.c nickserv.c operserv.c \
process.c proxy.c send.c servers.c sessions.c slist.c sockutil.c \
dreamforge.c bahamut.c unreal31.c ultimate2.c ultimate3.c \
- hybrid.c ptlink.c viagra.c rageircd.c unreal32.c \
+ hybrid.c ptlink.c viagra.c rageircd.c unreal32.c solidircd.c \
timeout.c users.c \
$(VSNPRINTF_C) $(RDB) $(MYSQL)
@@ -23,7 +23,7 @@ INCLUDES = ../include/commands.h ../include/defs.h ../include/language.h \
../include/modules.h ../include/slist.h \
../include/dreamforge.h ../include/bahamut.h ../include/ultimate2.h \
../include/ultimate3.h ../include/hybrid.h ../include/ptlink.h ../include/unreal31.h \
- ../include/viagra.h ../include/rageircd.h ../include/unreal32.h
+ ../include/viagra.h ../include/rageircd.h ../include/unreal32.h ../include/solidircd.h
MAKEARGS = 'CFLAGS=${CFLAGS}' 'CC=${CC}' 'ANOPELIBS=${ANOPELIBS}' \
diff --git a/src/botserv.c b/src/botserv.c
index 0c23c4c68..17f922133 100644
--- a/src/botserv.c
+++ b/src/botserv.c
@@ -612,7 +612,7 @@ void load_bs_dbase(void)
dbFILE *f;
int c, ver;
int16 tmp16;
- int32 tmp32;
+ uint32 tmp32;
BotInfo *bi;
int failed = 0;
@@ -1148,12 +1148,19 @@ static void bot_raw_kick(User * requester, ChannelInfo * ci, char *nick,
static void bot_raw_mode(User * requester, ChannelInfo * ci, char *mode,
char *nick)
{
- char *av[3];
- User *u = finduser(nick);
+ char *av[4];
+ int ac;
+ char buf[BUFSIZE];
+ *buf = '\0';
+ User *u;
+
+ u = finduser(nick);
if (!u || !is_on_chan(ci->c, u))
return;
+ snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL));
+
if (ircd->protectedumode) {
if (is_protected(u) && *mode == '-' && (requester != u)) {
anope_cmd_privmsg(ci->bi->nick, ci->name, "%s",
@@ -1167,12 +1174,22 @@ static void bot_raw_mode(User * requester, ChannelInfo * ci, char *mode,
&& (get_access(u, ci) >= get_access(requester, ci)))
return;
- av[0] = ci->name;
- av[1] = mode;
- av[2] = nick;
+ if (ircdcap->tsmode) {
+ av[0] = ci->name;
+ av[1] = buf;
+ av[2] = mode;
+ av[3] = nick;
+ ac = 4;
+ anope_cmd_mode(ci->bi->nick, av[0], "%s %s", av[2], av[3]);
+ } else {
+ av[0] = ci->name;
+ av[1] = mode;
+ av[2] = nick;
+ ac = 3;
+ anope_cmd_mode(ci->bi->nick, av[0], "%s %s", av[1], av[2]);
+ }
- anope_cmd_mode(ci->bi->nick, av[0], "%s %s", av[1], av[2]);
- do_cmode(ci->bi->nick, 3, av);
+ do_cmode(ci->bi->nick, ac, av);
}
/*************************************************************************/
diff --git a/src/chanserv.c b/src/chanserv.c
index 48da2e4b1..e6b4522e2 100644
--- a/src/chanserv.c
+++ b/src/chanserv.c
@@ -636,7 +636,7 @@ void load_cs_dbase(void)
for (i = 0; i < 256 && !failed; i++) {
int16 tmp16;
- int32 tmp32;
+ uint32 tmp32;
int n_levels;
char *s;
NickAlias *na;
diff --git a/src/hostserv.c b/src/hostserv.c
index 1dcb087d0..11ee42984 100644
--- a/src/hostserv.c
+++ b/src/hostserv.c
@@ -535,7 +535,7 @@ void load_hs_dbase_v2(dbFILE * f)
char *nick;
char *vHost;
char *creator;
- int32 time;
+ uint32 time;
while (!failed && (c = getc_db(f)) == 1) {
@@ -563,7 +563,7 @@ void load_hs_dbase_v3(dbFILE * f)
char *vHost;
char *creator;
char *vIdent;
- int32 time;
+ uint32 time;
while (!failed && (c = getc_db(f)) == 1) {
if (c == 1) {
diff --git a/src/language.c b/src/language.c
index 01e7f00d3..cfde0184d 100644
--- a/src/language.c
+++ b/src/language.c
@@ -66,7 +66,7 @@ static void load_lang(int index, const char *filename)
{
char buf[256];
FILE *f;
- int num, i;
+ int32 num, i;
if (debug) {
alog("debug: Loading language %d from file `languages/%s'",
diff --git a/src/main.c b/src/main.c
index 46d03a0ab..f7b4089b7 100644
--- a/src/main.c
+++ b/src/main.c
@@ -397,13 +397,20 @@ void sighandler(int signum)
signum);
#endif
}
+
+ if (signum == SIGSEGV) {
+ do_backtrace();
+ }
+
if (started) {
services_shutdown();
exit(0);
} else {
- alog("%s", quitmsg);
- if (isatty(2))
+ if (isatty(2)) {
fprintf(stderr, "%s\n", quitmsg);
+ } else {
+ alog("%s", quitmsg);
+ }
exit(1);
}
}
@@ -554,3 +561,27 @@ int main(int ac, char **av, char **envp)
}
/*************************************************************************/
+
+void do_backtrace(void)
+{
+#ifdef HAVE_BACKTRACE
+ void *array[50];
+ size_t size;
+ char **strings;
+ int i;
+
+ alog("Backtrace: Segmentation fault detected");
+ alog("Backtrace: report the following lines");
+ alog("Backtrace: Anope version %s %s %s", version_number,
+ version_build, version_flags);
+ size = backtrace(array, 10);
+ strings = backtrace_symbols(array, size);
+ for (i = 1; i < size; i++) {
+ alog("Backtrace(%d): %s", i, strings[i]);
+ }
+ free(strings);
+ alog("Backtrace: complete");
+#else
+ alog("Backtrace: not available on this platform");
+#endif
+}
diff --git a/src/memoserv.c b/src/memoserv.c
index f2da8bab2..a1255f5bc 100644
--- a/src/memoserv.c
+++ b/src/memoserv.c
@@ -361,6 +361,10 @@ void memo_send(User * u, char *name, char *text, int z)
m->time = time(NULL);
m->text = sstrdup(text);
m->flags = MF_UNREAD;
+ /* Set notify sent flag - DrStein */
+ if (z == 2) {
+ m->flags |= MF_NOTIFYS;
+ }
/* Set receipt request flag */
if (z == 3)
m->flags |= MF_RECEIPT;
@@ -446,7 +450,8 @@ static int do_cancel(User * u)
for (i = mi->memocount - 1; i >= 0; i--) {
if ((mi->memos[i].flags & MF_UNREAD)
- && !stricmp(mi->memos[i].sender, u->na->nc->display)) {
+ && !stricmp(mi->memos[i].sender, u->na->nc->display)
+ && (!(mi->memos[i].flags & MF_NOTIFYS))) {
delmemo(mi, mi->memos[i].number);
notice_lang(s_MemoServ, u, MEMO_CANCELLED, name);
return MOD_CONT;
diff --git a/src/news.c b/src/news.c
index 9dc4c0adb..7a2b5a898 100644
--- a/src/news.c
+++ b/src/news.c
@@ -156,7 +156,7 @@ void load_news()
dbFILE *f;
int i;
int16 n;
- int32 tmp32;
+ uint32 tmp32;
if (!(f = open_db(s_OperServ, NewsDBName, "r", NEWS_VERSION)))
return;
diff --git a/src/nickserv.c b/src/nickserv.c
index 773a1282b..e025b8f75 100644
--- a/src/nickserv.c
+++ b/src/nickserv.c
@@ -374,7 +374,7 @@ void load_old_ns_dbase(void)
int failed = 0;
int16 tmp16;
- int32 tmp32;
+ uint32 tmp32;
char bufn[NICKMAX], bufp[PASSMAX];
char *email, *greet, *url, *forbidby, *forbidreason;
@@ -632,7 +632,7 @@ void load_ns_req_db(void)
dbFILE *f;
int i, c, ver;
NickRequest *nr;
- int32 tmp32;
+ uint32 tmp32;
int failed = 0;
if (!(f = open_db(s_NickServ, PreNickDBName, "r", PRE_NICK_VERSION)))
@@ -663,7 +663,7 @@ void load_ns_dbase(void)
NickCore *nc, **nclast, *ncprev;
int failed = 0;
int16 tmp16;
- int32 tmp32;
+ uint32 tmp32;
char *s;
if (!(f = open_db(s_NickServ, NickDBName, "r", NICK_VERSION)))
diff --git a/src/operserv.c b/src/operserv.c
index 025005d44..fcc567541 100644
--- a/src/operserv.c
+++ b/src/operserv.c
@@ -168,12 +168,15 @@ void moduleAddOperServCmds(void) {
c = createCommand("SZLINE", do_szline, is_services_oper,OPER_HELP_SZLINE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
/* Commands for Services admins: */
- c = createCommand("SET", do_set, is_services_admin,OPER_HELP_SET, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
- c = createCommand("SET READONLY", NULL, NULL,OPER_HELP_SET_READONLY, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
- c = createCommand("SET LOGCHAN",NULL, NULL,OPER_HELP_SET_LOGCHAN, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
- c = createCommand("SET DEBUG", NULL, NULL,OPER_HELP_SET_DEBUG, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
- c = createCommand("SET NOEXPIRE",NULL, NULL,OPER_HELP_SET_NOEXPIRE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
- c = createCommand("SET SUPERADMIN",NULL, NULL,OPER_HELP_SET_SUPERADMIN, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("SET", do_set, is_services_admin,OPER_HELP_SET, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("SET READONLY", NULL, NULL,OPER_HELP_SET_READONLY, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("SET LOGCHAN", NULL, NULL,OPER_HELP_SET_LOGCHAN, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("SET DEBUG", NULL, NULL,OPER_HELP_SET_DEBUG, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("SET NOEXPIRE", NULL, NULL,OPER_HELP_SET_NOEXPIRE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("SET SUPERADMIN", NULL, NULL,OPER_HELP_SET_SUPERADMIN, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+#ifdef USE_MYSQL
+ c = createCommand("SET SQL", NULL, NULL,OPER_HELP_SET_SQL, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+#endif
c = createCommand("SVSNICK", do_svsnick, is_services_admin,OPER_HELP_SVSNICK, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
c = createCommand("UMODE", do_operumodes, is_services_admin,OPER_HELP_UMODE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
c = createCommand("NOOP", do_noop, is_services_admin,OPER_HELP_NOOP, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
@@ -377,7 +380,7 @@ static void load_old_akill(void)
dbFILE *f;
int i, j;
int16 tmp16;
- int32 tmp32;
+ uint32 tmp32;
char buf[NICKMAX], mask2[BUFSIZE], *mask, *s;
Akill *ak, *entry;
@@ -491,7 +494,7 @@ void load_os_dbase(void)
int16 i, n, ver, c;
HostCache *hc, **hclast, *hcprev;
int16 tmp16;
- int32 tmp32;
+ uint32 tmp32;
char *s;
int failed = 0;
@@ -533,7 +536,7 @@ void load_os_dbase(void)
}
if (ver >= 7) {
- int32 tmp32;
+ uint32 tmp32;
SAFE(read_int32(&maxusercnt, f));
SAFE(read_int32(&tmp32, f));
maxusertime = tmp32;
@@ -4466,7 +4469,22 @@ static int do_set(User * u)
} else {
notice_lang(s_OperServ, u, OPER_SET_IGNORE_ERROR);
}
-
+#ifdef USE_MYSQL
+ } else if (stricmp(option, "SQL") == 0) {
+ if (stricmp(setting, "on") == 0) {
+ if (rdb_init()) {
+ notice_lang(s_OperServ, u, OPER_SET_SQL_ON);
+ } else {
+ notice_lang(s_OperServ, u, OPER_SET_SQL_ERROR_INIT);
+ }
+ } else if (stricmp(setting, "off") == 0) {
+ /* could call rdb_close() but that does nothing - TSL */
+ do_mysql = 0;
+ notice_lang(s_OperServ, u, OPER_SET_SQL_OFF);
+ } else {
+ notice_lang(s_OperServ, u, OPER_SET_SQL_ERROR);
+ }
+#endif
} else if (stricmp(option, "READONLY") == 0) {
if (stricmp(setting, "on") == 0) {
readonly = 1;
diff --git a/src/ptlink.c b/src/ptlink.c
index 5f6ea4220..4689fdbef 100644
--- a/src/ptlink.c
+++ b/src/ptlink.c
@@ -54,7 +54,7 @@ IRCDVar ircd[] = {
NULL, /* Mode to unset for an owner */
"+r", /* Mode On Reg */
"-r", /* Mode on UnReg */
- "+d", /* Mode on Nick Change */
+ NULL, /* Mode on Nick Change */
1, /* Supports SGlines */
1, /* Supports SQlines */
1, /* Supports SZlines */
@@ -1378,17 +1378,6 @@ void anope_set_umode(User * user, int ac, char **av)
case '-':
add = 0;
break;
- case 'd':
- if (ac == 0) {
- alog("user: umode +d with no parameter (?) for user %s",
- user->nick);
- break;
- }
-
- ac--;
- av++;
- user->svid = strtoul(*av, NULL, 0);
- break;
case 'o':
if (add) {
opcnt++;
@@ -1560,7 +1549,7 @@ void anope_cmd_svid_umode(char *nick, time_t ts)
/* nc_change was = 1, and there is no na->status */
void anope_cmd_nc_change(User * u)
{
- common_svsmode(u, "+d", "1");
+ /* Not Supported by this ircd */
}
/* SVSMODE +d */
diff --git a/src/sessions.c b/src/sessions.c
index 30edad494..939c92afb 100644
--- a/src/sessions.c
+++ b/src/sessions.c
@@ -76,7 +76,7 @@ int16 nexceptions = 0;
static Session *findsession(const char *host);
static Exception *find_host_exception(const char *host);
-static int exception_add(const char *mask, const int limit,
+static int exception_add(User * u, const char *mask, const int limit,
const char *reason, const char *who,
const time_t expires);
@@ -380,7 +380,7 @@ void load_exceptions()
int i;
int16 n;
int16 tmp16;
- int32 tmp32;
+ uint32 tmp32;
if (!
(f = open_db(s_OperServ, ExceptionDBName, "r", EXCEPTION_VERSION)))
@@ -479,16 +479,29 @@ void save_rdb_exceptions()
/************************ Exception Manipulation *************************/
/*************************************************************************/
-static int exception_add(const char *mask, const int limit,
+static int exception_add(User * u, const char *mask, const int limit,
const char *reason, const char *who,
const time_t expires)
{
int i;
/* Check if an exception already exists for this mask */
- for (i = 0; i < nexceptions; i++)
- if (stricmp(mask, exceptions[i].mask) == 0)
- return 0;
+ for (i = 0; i < nexceptions; i++) {
+ if (!stricmp(mask, exceptions[i].mask)) {
+ if (exceptions[i].limit != limit) {
+ exceptions[i].limit = limit;
+ if (u)
+ notice_lang(s_OperServ, u, OPER_EXCEPTION_CHANGED,
+ mask, exceptions[i].limit);
+ return -2;
+ } else {
+ if (u)
+ notice_lang(s_OperServ, u, OPER_EXCEPTION_EXISTS,
+ mask);
+ return -1;
+ }
+ }
+ }
nexceptions++;
exceptions = srealloc(exceptions, sizeof(Exception) * nexceptions);
@@ -626,6 +639,7 @@ int do_exception(User * u)
char *mask, *reason, *expiry, *limitstr;
int limit, expires;
int i;
+ int x;
if (!LimitSessions) {
notice_lang(s_OperServ, u, OPER_EXCEPTION_DISABLED);
@@ -679,12 +693,13 @@ int do_exception(User * u)
return MOD_CONT;
}
- if (exception_add(mask, limit, reason, u->nick, expires))
+ x = exception_add(u, mask, limit, reason, u->nick, expires);
+
+ if (x == 1) {
notice_lang(s_OperServ, u, OPER_EXCEPTION_ADDED, mask,
limit);
- else
- notice_lang(s_OperServ, u, OPER_EXCEPTION_ALREADY_PRESENT,
- mask, limit);
+ }
+
if (readonly)
notice_lang(s_OperServ, u, READ_ONLY_MODE);
}
diff --git a/src/solidircd.c b/src/solidircd.c
new file mode 100644
index 000000000..4dd736d28
--- /dev/null
+++ b/src/solidircd.c
@@ -0,0 +1,1710 @@
+/* Solid-IRCD functions
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ *
+ */
+
+/*************************************************************************/
+
+#include "services.h"
+#include "pseudo.h"
+
+#ifdef IRC_SOLID
+
+const char version_protocol[] = "Solid-IRCd 3.4.*";
+
+/* Not all ircds use +f for their flood/join throttle system */
+const char flood_mode_char_set[] = "+j"; /* mode char for FLOOD mode on set */
+const char flood_mode_char_remove[] = "-j"; /* mode char for FLOOD mode on remove */
+int UseTSMODE = 0; /* does send TSMODE but if it doesn't means it won't so this is disabled */
+
+IRCDVar ircd[] = {
+ {"Solid-IRCd 3.4.*", /* ircd name */
+ "+o", /* nickserv mode */
+ "+o", /* chanserv mode */
+ "+o", /* memoserv mode */
+ "+o", /* hostserv mode */
+ "+io", /* operserv mode */
+ "+o", /* botserv mode */
+ "+h", /* helpserv mode */
+ "+i", /* Dev/Null mode */
+ "+io", /* Global mode */
+ "+o", /* nickserv alias mode */
+ "+o", /* chanserv alias mode */
+ "+o", /* memoserv alias mode */
+ "+io", /* hostserv alias mode */
+ "+io", /* operserv alias mode */
+ "+o", /* botserv alias mode */
+ "+h", /* helpserv alias mode */
+ "+i", /* Dev/Null alias mode */
+ "+io", /* Global alias mode */
+ "+", /* Used by BotServ Bots */
+ 2, /* Chan Max Symbols */
+ "-cilmnpstOR", /* 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 */
+ "+rd", /* Mode On Reg */
+ "-r+d", /* Mode on UnReg */
+ "+d", /* Mode on Nick Change */
+ 1, /* Supports SGlines */
+ 1, /* Supports SQlines */
+ 1, /* Supports SZlines */
+ 0, /* Supports Halfop +h */
+ 3, /* 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 */
+ 0, /* Has Admin */
+ 1, /* Chan SQlines */
+ 1, /* Quit on Kill */
+ 1, /* SVSMODE unban */
+ 0, /* Has Protect */
+ 0, /* Reverse */
+ 1, /* Chan Reg */
+ CMODE_r, /* Channel Mode */
+ 0, /* vidents */
+ 1, /* svshold */
+ 1, /* time stamp on mode */
+ 1, /* NICKIP */
+ 0, /* O:LINE */
+ 1, /* UMODE */
+ 0, /* VHOST ON NICK */
+ 0, /* Change RealName */
+ 0, /* ChanServ extra */
+ 0, /* No Knock */
+ 0, /* Admin Only */
+ DEFAULT_MLOCK, /* Default MLOCK */
+ UMODE_v, /* Vhost Mode */
+ 1, /* +f */
+ 0, /* +L */
+ CMODE_j, /* Mode */
+ 0, /* Mode */
+ 1,
+ 1, /* 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 */
+ }
+ ,
+ {NULL}
+};
+
+IRCDCAPAB ircdcap[] = {
+ {
+ CAPAB_NOQUIT, /* NOQUIT */
+ CAPAB_TSMODE, /* TSMODE */
+ CAPAB_UNCONNECT, /* UNCONNECT */
+ 0, /* NICKIP */
+ 0, /* SJOIN */
+ 0, /* ZIP */
+ CAPAB_BURST, /* BURST */
+ 0, /* TS5 */
+ 0, /* TS3 */
+ CAPAB_DKEY, /* 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 */
+ CAPAB_DOZIP, /* DOZIP */
+ 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 'a':
+ if (UnRestrictSAdmin) {
+ break;
+ }
+ if (add && !is_services_admin(user)) {
+ common_svsmode(user, "-a", NULL);
+ user->mode &= ~UMODE_a;
+ }
+ break;
+ case 'd':
+ if (ac == 0) {
+ alog("user: umode +d with no parameter (?) for user %s",
+ user->nick);
+ break;
+ }
+
+ ac--;
+ av++;
+ user->svid = strtoul(*av, NULL, 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;
+ case 'r':
+ if (add && !nick_identified(user)) {
+ common_svsmode(user, "-r", NULL);
+ user->mode &= ~UMODE_r;
+ }
+ break;
+ case 'v':
+ update_host(user);
+ 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, UMODE_C, /* A B C */
+ UMODE_D, 0, UMODE_F, /* D E F */
+ 0, UMODE_H, UMODE_I, /* G H I */
+ 0, UMODE_K, 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, UMODE_X, /* V W X */
+ 0, /* Y */
+ 0, /* Z */
+ 0, 0, 0, /* [ \ ] */
+ 0, 0, 0, /* ^ _ ` */
+ UMODE_a, UMODE_b, UMODE_c, /* a b c */
+ UMODE_d, UMODE_e, UMODE_f, /* d e f */
+ UMODE_g, UMODE_h, UMODE_i, /* g h i */
+ UMODE_j, UMODE_k, 0, /* j k l */
+ UMODE_m, UMODE_n, UMODE_o, /* m n o */
+ 0, 0, UMODE_r, /* p q r */
+ UMODE_s, 0, 0, /* s t u */
+ UMODE_v, 0, UMODE_x, /* v w x */
+ UMODE_y, /* y */
+ UMODE_z, /* 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,
+ 0,
+ 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},
+ {0}, /* A */
+ {0}, /* B */
+ {0}, /* C */
+ {0}, /* D */
+ {0}, /* E */
+ {0}, /* F */
+ {0}, /* G */
+ {0}, /* H */
+ {0}, /* I */
+ {0}, /* J */
+ {0}, /* K */
+ {0}, /* L */
+ {CMODE_M},
+ {0}, /* N */
+ {CMODE_O, CBM_NO_USER_MLOCK, NULL, NULL},
+ {0}, /* P */
+ {0}, /* Q */
+ {CMODE_R, 0, NULL, NULL}, /* R */
+ {0}, /* S */
+ {0}, /* T */
+ {0}, /* U */
+ {0}, /* V */
+ {0}, /* W */
+ {0}, /* X */
+ {0}, /* Y */
+ {0}, /* Z */
+ {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, /* a */
+ {0}, /* b */
+ {CMODE_c, 0, NULL, NULL},
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {0}, /* h */
+ {CMODE_i, 0, NULL, NULL},
+ {CMODE_j, 0, set_flood, cs_set_flood}, /* 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, CBM_NO_MLOCK, NULL, NULL},
+ {CMODE_s, 0, NULL, NULL},
+ {CMODE_t, 0, NULL, NULL},
+ {0},
+ {0}, /* v */
+ {0}, /* w */
+ {0}, /* x */
+ {0}, /* y */
+ {0}, /* z */
+ {0}, {0}, {0}, {0}
+};
+
+CBModeInfo cbmodeinfos[] = {
+ {'c', CMODE_c, 0, NULL, NULL},
+ {'i', CMODE_i, 0, NULL, NULL},
+ {'j', CMODE_j, 0, get_flood, cs_get_flood},
+ {'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},
+ {'M', CMODE_M, 0, NULL, NULL},
+ {'O', CMODE_O, 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},
+ {0}, /* a */
+ {0}, /* b */
+ {0}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {0}, /* h */
+ {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_mode(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;
+ }
+
+ if (ircdcap->tsmode) {
+ if (uplink_capab & ircdcap->tsmode) {
+ send_cmd(source, "MODE %s 0 %s", dest, buf);
+ } else {
+ send_cmd(source, "MODE %s %s", dest, buf);
+ }
+ } else {
+ send_cmd(source, "MODE %s %s", dest, buf);
+ }
+ }
+}
+
+/* SVSHOLD - set */
+void anope_cmd_svshold(char *nick)
+{
+ send_cmd(ServerName, "SVSHOLD %s %d :%s", nick, NSReleaseTimeout,
+ "Being held for registered user");
+}
+
+/* SVSHOLD - release */
+void anope_cmd_release_svshold(char *nick)
+{
+ send_cmd(ServerName, "SVSHOLD %s 0", nick);
+}
+
+/* SVSMODE -b */
+void anope_cmd_unban(char *name, char *nick)
+{
+ send_cmd(ServerName, "SVSMODE %s -b %s", name, nick);
+}
+
+void anope_cmd_bot_chan_mode(char *nick, char *chan)
+{
+ anope_cmd_mode(nick, chan, "%s %s", ircd->botchanumode, nick);
+}
+
+/* EVENT: SJOIN */
+int anope_event_sjoin(char *source, int ac, char **av)
+{
+ do_sjoin(source, ac, av);
+ return MOD_CONT;
+}
+
+/*
+** NICK - new
+** source = NULL
+** parv[0] = nickname
+** parv[1] = hopcount
+** parv[2] = timestamp
+** parv[3] = modes
+** parv[4] = username
+** parv[5] = hostname
+** parv[6] = server
+** parv[7] = servicestamp
+** parv[8] = IP
+** parv[9] = info
+** NICK - change
+** source = oldnick
+** parv[0] = new nickname
+** parv[1] = hopcount
+*/
+int anope_event_nick(char *source, int ac, char **av)
+{
+ User *user;
+
+ if (ac != 2) {
+ user = do_nick(source, av[0], av[4], av[5], av[6], av[9],
+ strtoul(av[2], NULL, 10), strtoul(av[7], NULL, 0),
+ strtoul(av[8], NULL, 0), NULL, NULL);
+ 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;
+}
+
+/* EVENT : CAPAB */
+int anope_event_capab(char *source, int ac, char **av)
+{
+ capab_parse(ac, av);
+ return MOD_CONT;
+}
+
+/* EVENT : OS */
+int anope_event_os(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_OperServ, av[0]);
+ return MOD_CONT;
+}
+
+/* EVENT : NS */
+int anope_event_ns(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_NickServ, av[0]);
+ return MOD_CONT;
+}
+
+/* EVENT : MS */
+int anope_event_ms(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_MemoServ, av[0]);
+ return MOD_CONT;
+}
+
+/* EVENT : HS */
+int anope_event_hs(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_HostServ, av[0]);
+ return MOD_CONT;
+}
+
+/* EVENT : CS */
+int anope_event_cs(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_ChanServ, 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;
+
+ 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_null); 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("MOTD", anope_event_motd); addCoreMessage(IRCD,m);
+ m = createMessage("NICK", 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("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("AKILL", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("GLOBOPS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("GNOTICE", anope_event_gnotice); addCoreMessage(IRCD,m);
+ m = createMessage("GOPER", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("RAKILL", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SILENCE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSKILL", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSMODE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSNICK", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSNOOP", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SQLINE", anope_event_sqline); addCoreMessage(IRCD,m);
+ m = createMessage("UNSQLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("CAPAB", anope_event_capab); addCoreMessage(IRCD,m);
+ m = createMessage("CS", anope_event_cs); addCoreMessage(IRCD,m);
+ m = createMessage("HS", anope_event_hs); addCoreMessage(IRCD,m);
+ m = createMessage("MS", anope_event_ms); addCoreMessage(IRCD,m);
+ m = createMessage("NS", anope_event_ns); addCoreMessage(IRCD,m);
+ m = createMessage("OS", anope_event_os); addCoreMessage(IRCD,m);
+ m = createMessage("RS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SGLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SJOIN", anope_event_sjoin); addCoreMessage(IRCD,m);
+ m = createMessage("SS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVINFO", anope_event_svinfo); addCoreMessage(IRCD,m);
+ m = createMessage("SZLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("UNSGLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("UNSZLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("ERROR", anope_event_error); addCoreMessage(IRCD,m);
+ m = createMessage("LUSERSLOCK",anope_event_luserslock); addCoreMessage(IRCD,m);
+ m = createMessage("BURST", anope_event_burst); addCoreMessage(IRCD,m);
+ m = createMessage("ADMIN", anope_event_admin); addCoreMessage(IRCD,m);
+ m = createMessage("SVHOST", anope_event_vs); addCoreMessage(IRCD,m);
+ m = createMessage("ELMER", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SILLY", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SHUN", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("NORMAL", anope_event_null); addCoreMessage(IRCD,m);
+}
+
+/* *INDENT-ON* */
+
+
+int anope_event_vs(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(av[0]);
+ if (!u) {
+ alog("user: SVHOST for nonexistent user %s", av[0]);
+ return MOD_CONT;
+ }
+
+ change_user_host(u, av[1]);
+ return MOD_CONT;
+
+}
+
+/* SQLINE */
+void anope_cmd_sqline(char *mask, char *reason)
+{
+ if (!mask || !reason) {
+ return;
+ }
+
+ send_cmd(NULL, "SQLINE %s :%s", mask, reason);
+}
+
+/* UNSGLINE */
+void anope_cmd_unsgline(char *mask)
+{
+ send_cmd(NULL, "UNSGLINE 0 :%s", mask);
+}
+
+/* UNSZLINE */
+void anope_cmd_unszline(char *mask)
+{
+ send_cmd(NULL, "UNSZLINE 0 %s", mask);
+}
+
+/* SZLINE */
+void anope_cmd_szline(char *mask, char *reason, char *whom)
+{
+ send_cmd(NULL, "SZLINE %s :%s", mask, reason);
+}
+
+/* SVSNOOP */
+void anope_cmd_svsnoop(char *server, int set)
+{
+ send_cmd(NULL, "SVSNOOP %s %s", server, (set ? "+" : "-"));
+}
+
+void anope_cmd_svsadmin(char *server, int set)
+{
+ anope_cmd_svsnoop(server, set);
+}
+
+/* SGLINE */
+void anope_cmd_sgline(char *mask, char *reason)
+{
+ send_cmd(NULL, "SGLINE %d :%s:%s", strlen(mask), mask, reason);
+}
+
+/* RAKILL */
+void anope_cmd_remove_akill(char *user, char *host)
+{
+ send_cmd(NULL, "RAKILL %s %s", host, user);
+}
+
+/* PART */
+void anope_cmd_part(char *nick, char *chan, 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 (!nick || !chan) {
+ return;
+ }
+
+ if (buf) {
+ send_cmd(nick, "PART %s :%s", chan, buf);
+ } else {
+ send_cmd(nick, "PART %s", chan);
+ }
+}
+
+/* TOPIC */
+void anope_cmd_topic(char *whosets, char *chan, char *whosetit,
+ char *topic, time_t when)
+{
+ send_cmd(whosets, "TOPIC %s %s %lu :%s", chan, whosetit,
+ (unsigned long int) when, topic);
+}
+
+/* UNSQLINE */
+void anope_cmd_unsqline(char *user)
+{
+ send_cmd(NULL, "UNSQLINE %s", user);
+}
+
+/* JOIN - SJOIN */
+void anope_cmd_join(char *user, char *channel, time_t chantime)
+{
+ send_cmd(user, "SJOIN %ld %s", (long int) chantime, channel);
+}
+
+/* AKILL */
+/* parv[1]=host
+ * parv[2]=user
+ * parv[3]=length
+ * parv[4]=akiller
+ * parv[5]=time set
+ * parv[6]=reason
+ */
+void anope_cmd_akill(char *user, char *host, char *who, time_t when,
+ time_t expires, char *reason)
+{
+ send_cmd(NULL, "AKILL %s %s %d %s %ld :%s", host, user, 86400 * 2, who,
+ (long int) time(NULL), reason);
+}
+
+/* SVSKILL */
+/* parv[0] = servername
+ * parv[1] = client
+ * parv[2] = nick stamp
+ * parv[3] = kill message
+ */
+/*
+ Note: if the stamp is null 0, the below usage is correct of Bahamut
+*/
+void anope_cmd_svskill(char *source, char *user, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (!source || !user || !fmt) {
+ return;
+ }
+
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source, "SVSKILL %s :%s", user, buf);
+}
+
+/* SVSMODE */
+/* parv[0] - sender
+ * parv[1] - nick
+ * parv[2] - TS (or mode, depending on svs version)
+ * parv[3] - mode (or services id if old svs version)
+ * parv[4] - optional arguement (services id)
+ */
+void anope_cmd_svsmode(User * u, int ac, char **av)
+{
+ send_cmd(ServerName, "SVSMODE %s %ld %s%s%s", u->nick,
+ (long int) u->timestamp, av[0], (ac == 2 ? " " : ""),
+ (ac == 2 ? av[1] : ""));
+}
+
+/* SQUIT */
+/*
+ * parv[0] = sender prefix
+ * parv[1] = server name
+ * parv[2] = comment
+*/
+void anope_cmd_squit(char *servname, char *message)
+{
+ send_cmd(NULL, "SQUIT %s :%s", servname, message);
+}
+
+/* PONG */
+void anope_cmd_pong(char *servname, char *who)
+{
+ send_cmd(servname, "PONG %s", who);
+}
+
+void anope_cmd_connect(int servernum)
+{
+ 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();
+ anope_cmd_burst();
+}
+
+
+/*
+ * 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 5 3 0 :%ld", (long int) time(NULL));
+}
+
+/* PASS */
+void anope_cmd_pass(char *pass)
+{
+ send_cmd(NULL, "PASS %s :TS", pass);
+}
+
+/* SERVER */
+void anope_cmd_server(char *servname, int hop, char *descript)
+{
+ send_cmd(NULL, "SERVER %s %d :%s", servname, hop, ServerDesc);
+}
+
+/* CAPAB */
+void anope_cmd_capab()
+{
+ /* CAPAB SSJOIN NOQUIT BURST UNCONNECT ZIP NICKIP TSMODE */
+ send_cmd(NULL, "CAPAB SSJOIN NOQUIT BURST UNCONNECT NICKIP TSMODE");
+}
+
+/* EVENT : SERVER */
+int anope_event_server(char *source, int ac, char **av)
+{
+ char *uplink;
+
+ if (!stricmp(av[1], "1")) {
+ uplink = sstrdup(av[0]);
+ }
+
+ do_server(source, av[0], av[1], av[2], NULL);
+ return MOD_CONT;
+}
+
+/* EVENT : PRIVMSG */
+int anope_event_privmsg(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ m_privmsg(source, av[0], av[1]);
+ return MOD_CONT;
+}
+
+/* EVENT : 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)
+{
+ return MOD_CONT;
+}
+
+
+int anope_event_part(char *source, int ac, char **av)
+{
+ if (ac < 1 || ac > 2)
+ return MOD_CONT;
+ do_part(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_whois(char *source, int ac, char **av)
+{
+ if (source && ac >= 1) {
+ m_whois(source, av[0]);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_topic(char *source, int ac, char **av)
+{
+ if (ac != 4)
+ return MOD_CONT;
+ do_topic(source, ac, av);
+ 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)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_quit(source, ac, av);
+ return MOD_CONT;
+}
+
+/* EVENT: MODE */
+int anope_event_mode(char *source, int ac, char **av)
+{
+ if (ac < 2)
+ return MOD_CONT;
+
+ if (*av[0] == '#' || *av[0] == '&') {
+ do_cmode(source, ac, av);
+ } else {
+ do_umode(source, ac, av);
+ }
+ return MOD_CONT;
+}
+
+/* EVENT: KILL */
+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;
+}
+
+/* EVENT: KICK */
+int anope_event_kick(char *source, int ac, char **av)
+{
+ if (ac != 3)
+ return MOD_CONT;
+ do_kick(source, ac, av);
+ return MOD_CONT;
+}
+
+/* EVENT: JOIN */
+int anope_event_join(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_join(source, ac, av);
+ return MOD_CONT;
+}
+
+/* EVENT: MOTD */
+int anope_event_motd(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+
+ m_motd(source);
+ return MOD_CONT;
+}
+
+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);
+ }
+}
+
+/* NOTICE */
+void anope_cmd_notice(char *source, char *dest, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, sizeof(buf), fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ if (UsePrivmsg) {
+ anope_cmd_privmsg2(source, dest, buf);
+ } else {
+ send_cmd(source, "NOTICE %s :%s", dest, buf);
+ }
+}
+
+void anope_cmd_notice2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE %s :%s", dest, msg);
+}
+
+void anope_cmd_privmsg(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(source, "PRIVMSG %s :%s", dest, buf);
+}
+
+void anope_cmd_privmsg2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG %s :%s", dest, 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);
+}
+
+/* GLOBOPS */
+void anope_cmd_global(char *source, 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(source ? source : ServerName, "GLOBOPS :%s", buf);
+}
+
+/* 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(ServerName, "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(ServerName, "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(ServerName, "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(ServerName, "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(ServerName, "401 %s %s :No such service.", source, who);
+}
+
+/* 318 */
+void anope_cmd_318(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+
+ send_cmd(ServerName, "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_nick(char *nick, char *name, char *modes)
+{
+ EnforceQlinedNick(nick, NULL);
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s 0 0 :%s", nick,
+ (long int) time(NULL), modes, ServiceUser, ServiceHost,
+ ServerName, name);
+ 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];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+
+ if (buf) {
+ send_cmd(source, "KICK %s %s :%s", chan, user, buf);
+ } else {
+ send_cmd(source, "KICK %s %s", chan, user);
+ }
+}
+
+void anope_cmd_372(char *source, char *msg)
+{
+ send_cmd(ServerName, "372 %s :- %s", source, msg);
+}
+
+void anope_cmd_372_error(char *source)
+{
+ send_cmd(ServerName, "372 %s :- MOTD file not found! Please "
+ "contact your IRC administrator.", source);
+}
+
+void anope_cmd_375(char *source)
+{
+ send_cmd(ServerName, "375 %s :- %s Message of the Day",
+ source, ServerName);
+}
+
+void anope_cmd_376(char *source)
+{
+ send_cmd(ServerName, "376 %s :End of /MOTD command.", source);
+}
+
+/* INVITE */
+void anope_cmd_invite(char *source, char *chan, char *nick)
+{
+ if (!source || !chan || !nick) {
+ return;
+ }
+
+ send_cmd(source, "INVITE %s %s", nick, chan);
+}
+
+/* QUIT */
+void anope_cmd_quit(char *source, 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) {
+ send_cmd(source, "QUIT :%s", buf);
+ } else {
+ send_cmd(source, "QUIT");
+ }
+}
+
+int anope_event_away(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+
+ if (!source) {
+ return MOD_CONT;
+ }
+ m_away(source, av[0]);
+ return MOD_CONT;
+}
+
+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;
+}
+
+void anope_cmd_351(char *source)
+{
+ send_cmd(ServerName, "351 %s Anope-%s %s :%s - %s -- %s",
+ source, version_number, ServerName, ircd->name, version_flags,
+ version_build);
+}
+
+void anope_cmd_bot_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ EnforceQlinedNick(nick, s_BotServ);
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s 0 0 :%s", nick,
+ (long int) time(NULL), modes, user, host, ServerName, real);
+ anope_cmd_sqline(nick, "Reserved for services");
+}
+
+/* SVSNICK */
+/* parv[0] = sender
+ * parv[1] = old nickname
+ * parv[2] = new nickname
+ * parv[3] = timestamp
+ */
+void anope_cmd_svsnick(char *source, char *guest, time_t when)
+{
+ if (!source || !guest) {
+ return;
+ }
+ send_cmd(NULL, "SVSNICK %s %s :%ld", source, guest, (long int) when);
+}
+
+void anope_cmd_guest_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s 0 0 :%s", nick,
+ (long int) time(NULL), modes, user, host, ServerName, real);
+}
+
+void anope_cmd_svso(char *source, char *nick, char *flag)
+{
+ /* Not Supported by this IRCD */
+}
+
+void anope_cmd_vhost_on(char *nick, char *vIdent, char *vhost)
+{
+ send_cmd(s_HostServ, "SVSMODE %s +v", nick);
+ anope_cmd_chghost(nick, vhost);
+}
+
+void anope_cmd_vhost_off(User * u)
+{
+ send_cmd(s_HostServ, "SVSMODE %s -v", u->nick);
+ notice_lang(s_HostServ, u, HOST_OFF_UNREAL, u->nick);
+}
+
+void anope_cmd_chghost(char *nick, char *vhost)
+{
+ if (!nick || !vhost) {
+ return;
+ }
+ send_cmd(ServerName, "SVHOST %s %s", nick, vhost);
+}
+
+/* SVSMODE +d */
+/* sent if svid is something weird */
+void anope_cmd_svid_umode(char *nick, time_t ts)
+{
+ send_cmd(ServerName, "SVSMODE %s %lu +d 1", nick,
+ (unsigned long int) ts);
+}
+
+
+/* SVSMODE +d */
+/* nc_change was = 1, and there is no na->status */
+void anope_cmd_nc_change(User * u)
+{
+ common_svsmode(u, "+d", "1");
+}
+
+/* SVSMODE +d */
+void anope_cmd_svid_umode2(User * u, char *ts)
+{
+ /* not used by bahamut ircds */
+}
+
+
+void anope_cmd_svid_umode3(User * u, char *ts)
+{
+ if (u->svid != u->timestamp) {
+ common_svsmode(u, "+rd", ts);
+ } else {
+ common_svsmode(u, "+r", NULL);
+ }
+}
+
+/* NICK <newnick> */
+void anope_cmd_chg_nick(char *oldnick, char *newnick)
+{
+ if (!oldnick || !newnick) {
+ return;
+ }
+
+ send_cmd(oldnick, "NICK %s", newnick);
+}
+
+int anope_event_error(char *source, int ac, char **av)
+{
+ if (ac >= 1) {
+ if (debug) {
+ alog("ERROR: %s", av[0]);
+ }
+ }
+ return MOD_CONT;
+}
+
+int anope_event_notice(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_sqline(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+
+int anope_event_gnotice(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_pass(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+void anope_cmd_svsjoin(char *source, char *nick, char *chan)
+{
+ /* Can not find any reference to these in Bahamut */
+}
+
+void anope_cmd_svspart(char *source, char *nick, char *chan)
+{
+ /* Can not find any reference to these in Bahamut */
+}
+
+void anope_cmd_swhois(char *source, char *who, char *mask)
+{
+ /* not supported */
+}
+
+
+void anope_cmd_burst()
+{
+ send_cmd(NULL, "BURST");
+}
+
+void anope_cmd_eob()
+{
+ send_cmd(NULL, "BURST 0");
+}
+
+int anope_event_burst(char *source, int ac, char **av)
+{
+ Server *s;
+ s = findserver(servlist, source);
+ if (!ac) {
+ /* for future use - start burst */
+ } else {
+ if (s) {
+ s->sync = 1;
+ }
+ }
+ return MOD_CONT;
+}
+
+int anope_event_luserslock(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_rehash(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_credits(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_admin(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_flood_mode_check(char *value)
+{
+ char *dp, *end;
+
+ if (value && *value != ':'
+ && (strtoul((*value == '*' ? value + 1 : value), &dp, 10) > 0)
+ && (*dp == ':') && (*(++dp) != 0) && (strtoul(dp, &end, 10) > 0)
+ && (*end == 0)) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+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);
+}
+
+/* GLOBOPS - to handle old WALLOPS */
+void anope_cmd_global_legacy(char *source, char *fmt)
+{
+ send_cmd(source ? source : ServerName, "GLOBOPS :%s", fmt);
+}
+
+/*
+ 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, "%s NOTICE :\1%s \1", dest, s);
+}
+
+#endif
diff --git a/src/unreal32.c b/src/unreal32.c
index f600cbf65..ae06b3fb2 100644
--- a/src/unreal32.c
+++ b/src/unreal32.c
@@ -71,7 +71,7 @@ IRCDVar ircd[] = {
0, /* Has Admin */
0, /* Chan SQlines */
0, /* Quit on Kill */
- 0, /* SVSMODE unban */
+ 1, /* SVSMODE unban */
1, /* Has Protect */
1, /* Reverse */
1, /* Chan Reg */
@@ -201,7 +201,7 @@ char csmodes[128] = {
0,
0, 0, 0,
'h', /* (37) % Channel halfops */
- 'b', /* (38) & Channel halfops */
+ 'b', /* (38) & bans */
0, 0, 0,
'q',
@@ -1932,7 +1932,8 @@ void anope_cmd_sgline(char *mask, char *reason)
/* SVSMODE -b */
void anope_cmd_unban(char *name, char *nick)
{
- /* Not Supported by this IRCD */
+ send_cmd(ServerName, "%s %s -b %s", send_token("SVSMODE", "n"), name,
+ nick);
}
/* SVSMODE +d */
@@ -2025,7 +2026,6 @@ int anope_event_swhois(char *source, int ac, char **av)
return MOD_CONT;
}
-
int anope_event_rehash(char *source, int ac, char **av)
{
return MOD_CONT;
@@ -2041,7 +2041,6 @@ int anope_event_admin(char *source, int ac, char **av)
return MOD_CONT;
}
-
int anope_event_sdesc(char *source, int ac, char **av)
{
Server *s;
@@ -2054,14 +2053,12 @@ int anope_event_sdesc(char *source, int ac, char **av)
return MOD_CONT;
}
-
int anope_event_sjoin(char *source, int ac, char **av)
{
do_sjoin(source, ac, av);
return MOD_CONT;
}
-
void anope_cmd_swhois(char *source, char *who, char *mask)
{
send_cmd(source, "SWHOIS %s :%s", who, mask);
@@ -2072,7 +2069,6 @@ void anope_cmd_eob()
send_cmd(ServerName, "EOS");
}
-
/* svswatch
* parv[0] - sender
* parv[1] - target nick
diff --git a/src/users.c b/src/users.c
index 28ccaa9ae..ad17d40ad 100644
--- a/src/users.c
+++ b/src/users.c
@@ -17,7 +17,8 @@
#define HASH(nick) (((nick)[0]&31)<<5 | ((nick)[1]&31))
User *userlist[1024];
-int32 usercnt = 0, opcnt = 0, maxusercnt = 0;
+int32 usercnt = 0, opcnt = 0;
+uint32 maxusercnt = 0;
time_t maxusertime;
/*************************************************************************/
@@ -707,8 +708,9 @@ void do_quit(const char *source, int ac, char **av)
merge_args(ac, av));
return;
}
- if (debug)
+ if (debug) {
alog("debug: %s quits", source);
+ }
if ((na = user->na) && (!(na->status & NS_VERBOTEN))
&& (na->status & (NS_IDENTIFIED | NS_RECOGNIZED))) {
na->last_seen = time(NULL);
@@ -717,8 +719,9 @@ void do_quit(const char *source, int ac, char **av)
na->last_quit = *av[0] ? sstrdup(av[0]) : NULL;
}
#ifndef STREAMLINED
- if (LimitSessions)
+ if (LimitSessions) {
del_session(user->host);
+ }
#endif
delete_user(user);
}
@@ -736,13 +739,15 @@ void do_kill(char *nick, char *msg)
NickAlias *na;
user = finduser(nick);
- if (!user)
+ if (!user) {
if (debug) {
alog("debug: KILL of nonexistent nick: %s", nick);
}
- return;
- if (debug)
+ return;
+ }
+ if (debug) {
alog("debug: %s killed", nick);
+ }
if ((na = user->na) && (!(na->status & NS_VERBOTEN))
&& (na->status & (NS_IDENTIFIED | NS_RECOGNIZED))) {
na->last_seen = time(NULL);
@@ -752,8 +757,9 @@ void do_kill(char *nick, char *msg)
}
#ifndef STREAMLINED
- if (LimitSessions)
+ if (LimitSessions) {
del_session(user->host);
+ }
#endif
delete_user(user);
}
diff --git a/version.log b/version.log
index d1b20afe3..3cbefe1d9 100644
--- a/version.log
+++ b/version.log
@@ -8,10 +8,25 @@
VERSION_MAJOR="1"
VERSION_MINOR="7"
VERSION_PATCH="6"
-VERSION_BUILD="462"
+VERSION_BUILD="463"
# $Log$
#
+# BUILD : 1.7.6 (463)
+# BUGS : 192, 210, 222, 234
+# NOTES : 1. Removed +d references from the ptlink protocol code, since they do not timestamp the nicks
+# 2. Memos sent as notification of receipt can not be cancelled.
+# 3. Unreal3.2 supports SVSMODE -b on clearing bans
+# 4. fixed do_kill() not remove the user from the user list
+# 5. /os set sql [on|off] runtime sql toggle
+# 6. Segfaults logged to the services log when DumpCore is disabled
+# 7. fixed RUNGROUP not passed during build time
+# 8. Exceptions now update if the limit is changed
+# 9. Solid-IRCD support
+# 10. Fixed TSMODE warnings when using FANTASY commands
+# 11. Fixed read_int32 warnings (fixes compiling and running under cygwin)
+# - Thats all..
+#
# BUILD : 1.7.6 (462)
# BUGS : 226
# NOTES : 1. RageIRCD sends TSMODE which is part of their beta7