diff options
-rw-r--r-- | Changes | 10 | ||||
-rw-r--r-- | Changes.lang | 7 | ||||
-rwxr-xr-x | Config | 7 | ||||
-rw-r--r-- | Makefile.in | 1 | ||||
-rwxr-xr-x | configure | 159 | ||||
-rw-r--r-- | configure.in | 9 | ||||
-rw-r--r-- | include/extern.h | 5 | ||||
-rw-r--r-- | include/services.h | 11 | ||||
-rw-r--r-- | include/solidircd.h | 78 | ||||
-rw-r--r-- | include/sysconf.h.in | 6 | ||||
-rw-r--r-- | lang/cat.l | 12 | ||||
-rw-r--r-- | lang/de.l | 12 | ||||
-rw-r--r-- | lang/en_us.l | 18 | ||||
-rw-r--r-- | lang/es.l | 12 | ||||
-rw-r--r-- | lang/fr.l | 12 | ||||
-rw-r--r-- | lang/gr.l | 12 | ||||
-rw-r--r-- | lang/hun.l | 12 | ||||
-rw-r--r-- | lang/it.l | 12 | ||||
-rw-r--r-- | lang/nl.l | 12 | ||||
-rw-r--r-- | lang/pl.l | 12 | ||||
-rw-r--r-- | lang/pt.l | 12 | ||||
-rw-r--r-- | lang/ru.l | 12 | ||||
-rw-r--r-- | lang/tr.l | 12 | ||||
-rw-r--r-- | src/Makefile | 6 | ||||
-rw-r--r-- | src/botserv.c | 33 | ||||
-rw-r--r-- | src/chanserv.c | 2 | ||||
-rw-r--r-- | src/hostserv.c | 4 | ||||
-rw-r--r-- | src/language.c | 2 | ||||
-rw-r--r-- | src/main.c | 35 | ||||
-rw-r--r-- | src/memoserv.c | 7 | ||||
-rw-r--r-- | src/news.c | 2 | ||||
-rw-r--r-- | src/nickserv.c | 6 | ||||
-rw-r--r-- | src/operserv.c | 38 | ||||
-rw-r--r-- | src/ptlink.c | 15 | ||||
-rw-r--r-- | src/sessions.c | 35 | ||||
-rw-r--r-- | src/solidircd.c | 1710 | ||||
-rw-r--r-- | src/unreal32.c | 12 | ||||
-rw-r--r-- | src/users.c | 20 | ||||
-rw-r--r-- | version.log | 17 |
39 files changed, 2321 insertions, 78 deletions
@@ -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: @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 |