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>2004-11-28 06:10:17 +0000
committertrystan trystan@31f1291d-b8d6-0310-a050-a5561fc1590b <trystan trystan@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>2004-11-28 06:10:17 +0000
commitf37314234168d48ea2dddba3a3b4b8fefadab8b3 (patch)
treed2a0f3dab7647c7b4b99ae7004002b242d20deff
parentc55942927eccc7b3bf3e5aa742acdb737b4a8989 (diff)
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..
git-svn-id: svn://svn.anope.org/anope/trunk@463 31f1291d-b8d6-0310-a050-a5561fc1590b git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@317 5417fbe8-f217-4b02-8779-1006273d7864
-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