From c2dc1e4909463ee4893157dc389f93a0ad4fbbfe Mon Sep 17 00:00:00 2001 From: stskeeps Date: Mon, 20 May 2002 19:43:14 +0000 Subject: [PATCH] beta10 --- .RELEASE.NOTES | 2 +- Changes | 40 + Makefile.in | 4 +- autoconf/configure.in | 8 +- configure | 1085 ++++++++++++++++++---------- doc/conf.doc | 3 + doc/example.conf | 4 +- help.conf | 11 +- html/back/background.jpg | Bin 58761 -> 52 bytes html/back/grad.jpg | Bin 3618 -> 443 bytes html/icons/conffiles.jpg | Bin 8113 -> 453 bytes html/icons/modules.jpg | Bin 8398 -> 451 bytes html/icons/opers.jpg | Bin 8360 -> 441 bytes html/icons/settings.jpg | Bin 8880 -> 447 bytes html/icons/stats.jpg | Bin 8908 -> 449 bytes html/icons/users.jpg | Bin 7848 -> 445 bytes include/common.h | 2 +- include/config.h | 4 +- include/h.h | 19 +- include/proto.h | 1 - include/struct.h | 15 +- include/threads.h | 8 +- include/version.h | 2 +- networks/awesomechristians.network | 28 + networks/ctcp.network | 26 + networks/darkkaos.network | 26 + networks/discussioni.network | 26 + networks/icechat.network | 26 + networks/ircsystems.network | 29 + networks/l33t-irc.network | 26 + networks/networks.ndx | 38 +- networks/outsiderz.network | 26 + src/badwords.c | 60 +- src/channel.c | 83 ++- src/cloak.c | 19 +- src/crule.c | 6 +- src/dbuf.c | 2 +- src/ircd.c | 623 ++++++++-------- src/modules/m_akill.c | 3 +- src/modules/m_guest.c | 26 +- src/modules/m_kill.c | 6 +- src/modules/m_kline.c | 18 +- src/modules/m_oper.c | 9 +- src/modules/m_rakill.c | 2 +- src/modules/m_svsmode.c | 19 +- src/modules/m_svsnick.c | 2 +- src/modules/m_unkline.c | 4 +- src/modules/m_unzline.c | 4 +- src/modules/m_whois.c | 14 +- src/modules/m_zline.c | 19 +- src/modules/scan.c | 28 +- src/modules/scan_http.c | 13 +- src/modules/scan_socks.c | 23 +- src/modules/web/httpd.c | 11 +- src/modules/web/phtml.c | 2 +- src/parse.c | 2 +- src/res.c | 31 +- src/res_init.c | 2 +- src/s_auth.c | 3 +- src/s_bsd.c | 16 +- src/s_conf.c | 19 +- src/s_extra.c | 13 +- src/s_kline.c | 51 +- src/s_misc.c | 9 +- src/s_numeric.c | 3 + src/s_serv.c | 17 +- src/s_svs.c | 6 +- src/s_user.c | 9 +- src/send.c | 4 +- src/ssl.rnd | Bin 1024 -> 1024 bytes src/support.c | 841 +++++++++++++++++++++ src/version.c.SH | 11 +- src/win32/Win32GUI.c | 18 +- 73 files changed, 2487 insertions(+), 1023 deletions(-) create mode 100644 networks/awesomechristians.network create mode 100644 networks/ctcp.network create mode 100644 networks/darkkaos.network create mode 100644 networks/discussioni.network create mode 100644 networks/icechat.network create mode 100644 networks/ircsystems.network create mode 100644 networks/l33t-irc.network create mode 100644 networks/outsiderz.network diff --git a/.RELEASE.NOTES b/.RELEASE.NOTES index 47d699ecc..6b5cacd4f 100644 --- a/.RELEASE.NOTES +++ b/.RELEASE.NOTES @@ -1,5 +1,5 @@ -Unreal3.2-Selene (BETA7) RELEASE NOTES +Unreal3.2-Selene (BETA10) RELEASE NOTES ====================================== I M P O R T A N T R E A D I N G diff --git a/Changes b/Changes index ea3af138f..0bb7c9a5c 100644 --- a/Changes +++ b/Changes @@ -1257,3 +1257,43 @@ seen. gmtime warning still there - Added EXLIBS= to make custommodule so a module can specify additional libraries it needs - Changed version to beta9 and updated documentation - Made +I once again work in win32 +*** beta9 released *** +- Fixed a stupid m_oper bug +- Fixed a win32 editor bug causing a crash when you click save multiple times +- Fixed a /stats q bug where it would crash if there was an sqline with no reason, reported by toji (#0000120) +- Fixed a bug that caused locops to see client exiting but not client connecting notices while +s +c, + reported and fixed by cmx (#0000123) +- Fixed a bug reported by dimplesx where +H did not decrease the oper count (#0000129) +- Documentation bug #0000152 reported by Tony at sexnet.org fixed regarding + example.conf being wrong about set::socks +- First part of skyper's security audit patch +- Some more of skyper's security audit patch. Some of them were simply + unfair in regards to performance or blindly added strlcats/strlcpy +- Fixed some problems with skyper's patch (typos) +- Fixed a cloak problem on OSes with 64bit integers (reported by wolven) +- Updated credits +- Memory leak fixes with scanners +- Some fixes with connect(). Knowing my luck this will fuck up to hell +- Fixed another memory leak with the scanners +- Fixed some helpop typos reported by BiGi (#0000144) +- Fixed a typo in /stats ? where T/t were reversed, reported by Zer0 +- Fixed a typo displaying a message to edit config.h after compiling reported by dimplesx + (#0000133) +- Fixed a bug where except ban didn't work (reported by Hercules) +- Fixed a scanner memory leak, and made some changes to make the HTTP scanner work +- Fixed a bug in the socks scanner causing it to fail +- Removed some typecasts from free calls, *hopefully* it will fix some problems +- Fixed a bug with \r\n being mistakenly parsed wrong. Thanks to John_z +- Fixed a config parser bug that would cause a crash under certain conditions. Reported by + roskecr (#0000173) +- Rewrote check_pings and the whole way banning people are handled. Do loop.do_bancheck = 1 + to provoke a bans check. This possibly fixes #00001702, #0000137 and other + funny bugs. +- Fixed a number of bugs in the upper patch. +- Fixed an OpenBSD bug reported by RaYmAn, k0adh, and numerous others (#0000104) +- Credits changes +- Fixed problem in dopm (short and char should NEVER be passed to va_arg) +- Fixed HCN so it uses IP instead of sockhost. +- Changed version to beta10 and updated documentation +- Removed obsolete network files +- Added some new network files (hopefully I'll be able to get all the submissions added soon) diff --git a/Makefile.in b/Makefile.in index f3c19240e..a22d90d6c 100644 --- a/Makefile.in +++ b/Makefile.in @@ -153,8 +153,8 @@ build: done @echo ' __________________________________________________ ' @echo '| Compile is now complete. |' - @echo '| You might want to see include/config.h to adjust |' - @echo '| some settings |' + @echo '| You should now read the documentation and learn |' + @echo '| how to configure your IRCd. |' @echo '| |' @echo '| If you really like UnrealIRCd, and would like to |' @echo '| make a donation, please read the Donation file in|' diff --git a/autoconf/configure.in b/autoconf/configure.in index e004531e7..49f5a9e90 100644 --- a/autoconf/configure.in +++ b/autoconf/configure.in @@ -99,10 +99,10 @@ ac_cv_underscore=no else ac_cv_underscore=yes fi +]) if test "$ac_cv_underscore" = "yes"; then AC_DEFINE(UNDERSCORE) fi -]) MODULEFLAGS=$ac_cv_pic AC_DEFINE(DYNAMIC_LINKING) @@ -234,6 +234,12 @@ dnl Checks for library functions. AC_PROG_GCC_TRADITIONAL AC_FUNC_SETPGRP AC_FUNC_SETVBUF_REVERSED +AC_CHECK_FUNCS(snprintf,AC_DEFINE(HAVE_SNPRINTF)) +AC_CHECK_FUNCS(vsnprintf,AC_DEFINE(HAVE_VSNPRINTF)) +AC_CHECK_FUNCS(strlcpy, AC_DEFINE(HAVE_STRLCPY)) +AC_CHECK_FUNCS(strlcat, AC_DEFINE(HAVE_STRLCAT)) +AC_CHECK_FUNCS(strlncat, AC_DEFINE(HAVE_STRLNCAT)) + AC_CACHE_CHECK(if we can set the core size to unlimited, ac_cv_force_core,[ AC_TRY_RUN([ #include diff --git a/configure b/configure index ff4a8ad59..93b19c256 100755 --- a/configure +++ b/configure @@ -2814,8 +2814,299 @@ EOF fi +for ac_func in snprintf +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:2821: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2849: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <> confdefs.h <<\EOF +#define HAVE_SNPRINTF 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi +done + +for ac_func in vsnprintf +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:2879: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2907: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <> confdefs.h <<\EOF +#define HAVE_VSNPRINTF 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi +done + +for ac_func in strlcpy +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:2937: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2965: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <> confdefs.h <<\EOF +#define HAVE_STRLCPY 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi +done + +for ac_func in strlcat +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:2995: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:3023: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <> confdefs.h <<\EOF +#define HAVE_STRLCAT 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi +done + +for ac_func in strlncat +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:3053: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:3081: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <> confdefs.h <<\EOF +#define HAVE_STRLNCAT 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi +done + + echo $ac_n "checking if we can set the core size to unlimited""... $ac_c" 1>&6 -echo "configure:2819: checking if we can set the core size to unlimited" >&5 +echo "configure:3110: checking if we can set the core size to unlimited" >&5 if eval "test \"`echo '$''{'ac_cv_force_core'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2824,7 +3115,7 @@ if test "$cross_compiling" = yes; then { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext < @@ -2839,7 +3130,7 @@ exit(0); } EOF -if { (eval echo configure:2843: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:3134: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_force_core=yes else @@ -2862,12 +3153,12 @@ EOF fi echo $ac_n "checking for vprintf""... $ac_c" 1>&6 -echo "configure:2866: checking for vprintf" >&5 +echo "configure:3157: checking for vprintf" >&5 if eval "test \"`echo '$''{'ac_cv_func_vprintf'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3185: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_vprintf=yes" else @@ -2914,12 +3205,12 @@ fi if test "$ac_cv_func_vprintf" != yes; then echo $ac_n "checking for _doprnt""... $ac_c" 1>&6 -echo "configure:2918: checking for _doprnt" >&5 +echo "configure:3209: checking for _doprnt" >&5 if eval "test \"`echo '$''{'ac_cv_func__doprnt'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3237: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func__doprnt=yes" else @@ -2969,12 +3260,12 @@ fi for ac_func in gettimeofday do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:2973: checking for $ac_func" >&5 +echo "configure:3264: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3292: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -3024,12 +3315,12 @@ else for ac_func in lrand48 do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3028: checking for $ac_func" >&5 +echo "configure:3319: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3347: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -3085,12 +3376,12 @@ done for ac_func in getrusage do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3089: checking for $ac_func" >&5 +echo "configure:3380: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3408: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -3140,12 +3431,12 @@ else for ac_func in times do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3144: checking for $ac_func" >&5 +echo "configure:3435: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3463: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -3201,12 +3492,12 @@ done for ac_func in setproctitle do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3205: checking for $ac_func" >&5 +echo "configure:3496: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3524: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -3254,7 +3545,7 @@ EOF else echo "$ac_t""no" 1>&6 echo $ac_n "checking for setproctitle in -lutil""... $ac_c" 1>&6 -echo "configure:3258: checking for setproctitle in -lutil" >&5 +echo "configure:3549: checking for setproctitle in -lutil" >&5 ac_lib_var=`echo util'_'setproctitle | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3262,7 +3553,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lutil $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3568: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3296,7 +3587,7 @@ else echo "$ac_t""no" 1>&6 cat > conftest.$ac_ext < EOF @@ -3313,12 +3604,12 @@ else for ac_func in pstat do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3317: checking for $ac_func" >&5 +echo "configure:3608: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3636: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -3380,7 +3671,7 @@ fi done echo $ac_n "checking what type of signals you have""... $ac_c" 1>&6 -echo "configure:3384: checking what type of signals you have" >&5 +echo "configure:3675: checking what type of signals you have" >&5 if eval "test \"`echo '$''{'ac_cv_sigtype'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -3389,7 +3680,7 @@ if test "$cross_compiling" = yes; then { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext < @@ -3398,7 +3689,7 @@ sigaction(SIGTERM, (struct sigaction *)0L, (struct sigaction *)0L); } EOF -if { (eval echo configure:3402: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:3693: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sigtype=POSIX else @@ -3410,7 +3701,7 @@ if test "$cross_compiling" = yes; then { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext < @@ -3431,7 +3722,7 @@ exit(0); } EOF -if { (eval echo configure:3435: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:3726: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sigtype=BSD else @@ -3470,12 +3761,12 @@ fi for ac_func in strtoken do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3474: checking for $ac_func" >&5 +echo "configure:3765: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3793: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -3529,12 +3820,12 @@ done for ac_func in strtok do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3533: checking for $ac_func" >&5 +echo "configure:3824: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3852: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -3588,12 +3879,12 @@ done for ac_func in strerror do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3592: checking for $ac_func" >&5 +echo "configure:3883: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3911: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -3647,12 +3938,12 @@ done for ac_func in index do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3651: checking for $ac_func" >&5 +echo "configure:3942: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3970: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -3706,297 +3997,6 @@ done for ac_func in strtoul do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3710: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:3738: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <&6 -STRTOUL="strtoul.o" -fi -done - -for ac_func in bcopy -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3766: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:3794: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <&6 -cat >> confdefs.h <<\EOF -#define NEED_BCOPY 1 -EOF - -fi -done - -for ac_func in bcmp -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3825: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:3853: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <&6 -cat >> confdefs.h <<\EOF -#define NEED_BCMP 1 -EOF - -fi -done - -for ac_func in bzero -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3884: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:3912: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <&6 -cat >> confdefs.h <<\EOF -#define NEED_BZERO 1 -EOF - -fi -done - -for ac_func in strcasecmp -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3943: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:3971: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <> confdefs.h <<\EOF -#define GOT_STRCASECMP 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi -done - -for ac_func in inet_addr -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 echo "configure:4001: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -4046,22 +4046,19 @@ EOF else echo "$ac_t""no" 1>&6 -cat >> confdefs.h <<\EOF -#define NEED_INET_ADDR 1 -EOF - +STRTOUL="strtoul.o" fi done -for ac_func in inet_ntoa +for ac_func in bcopy do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:4060: checking for $ac_func" >&5 +echo "configure:4057: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:4085: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +cat >> confdefs.h <<\EOF +#define NEED_BCOPY 1 +EOF + +fi +done + +for ac_func in bcmp +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:4116: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:4144: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +cat >> confdefs.h <<\EOF +#define NEED_BCMP 1 +EOF + +fi +done + +for ac_func in bzero +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:4175: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:4203: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +cat >> confdefs.h <<\EOF +#define NEED_BZERO 1 +EOF + +fi +done + +for ac_func in strcasecmp +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:4234: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:4262: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <> confdefs.h <<\EOF +#define GOT_STRCASECMP 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi +done + +for ac_func in inet_addr +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:4292: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:4320: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +cat >> confdefs.h <<\EOF +#define NEED_INET_ADDR 1 +EOF + +fi +done + +for ac_func in inet_ntoa +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:4351: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:4379: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -4115,12 +4406,12 @@ done for ac_func in inet_netof do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:4119: checking for $ac_func" >&5 +echo "configure:4410: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:4438: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -4174,12 +4465,12 @@ done for ac_func in syslog do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:4178: checking for $ac_func" >&5 +echo "configure:4469: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:4497: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -4232,12 +4523,12 @@ done for ac_func in vsyslog do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:4236: checking for $ac_func" >&5 +echo "configure:4527: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:4555: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -4448,7 +4739,7 @@ cat >> confdefs.h <<\EOF EOF echo $ac_n "checking what order we should supply the SSL libraries in""... $ac_c" 1>&6 -echo "configure:4452: checking what order we should supply the SSL libraries in" >&5 +echo "configure:4743: checking what order we should supply the SSL libraries in" >&5 if eval "test \"`echo '$''{'ac_cv_ssl_libs'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -4456,7 +4747,7 @@ else save_libs="$LIBS" LIBS="$LIBS -lssl -lcrypto -lssl" cat > conftest.$ac_ext < int main() { @@ -4465,7 +4756,7 @@ SSL_write(NULL, NULL, NULL); ; return 0; } EOF -if { (eval echo configure:4469: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:4760: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_ssl_libs="-lssl -lcrypto -lssl" LIBS="$save_libs" else @@ -4491,12 +4782,12 @@ if test "${enable_dynamic_linking+set}" = set; then enableval="$enable_dynamic_linking" echo $ac_n "checking for dlopen""... $ac_c" 1>&6 -echo "configure:4495: checking for dlopen" >&5 +echo "configure:4786: checking for dlopen" >&5 if eval "test \"`echo '$''{'ac_cv_func_dlopen'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:4814: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_dlopen=yes" else @@ -4537,7 +4828,7 @@ if eval "test \"`echo '$ac_cv_func_'dlopen`\" = yes"; then else echo "$ac_t""no" 1>&6 echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 -echo "configure:4541: checking for dlopen in -ldl" >&5 +echo "configure:4832: checking for dlopen in -ldl" >&5 ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -4545,7 +4836,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ldl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:4851: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -4585,20 +4876,20 @@ fi hold_cflags=$CFLAGS CFLAGS="$CFLAGS -export-dynamic" echo $ac_n "checking if we need the -export-dynamic flag""... $ac_c" 1>&6 -echo "configure:4589: checking if we need the -export-dynamic flag" >&5 +echo "configure:4880: checking if we need the -export-dynamic flag" >&5 if eval "test \"`echo '$''{'ac_cv_export_dynamic'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:4893: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_export_dynamic=yes else @@ -4616,7 +4907,7 @@ CFLAGS=$hold_cflags fi echo $ac_n "checking for compiler option to produce PIC""... $ac_c" 1>&6 -echo "configure:4620: checking for compiler option to produce PIC" >&5 +echo "configure:4911: checking for compiler option to produce PIC" >&5 if eval "test \"`echo '$''{'ac_cv_pic'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -4635,7 +4926,7 @@ fi echo "$ac_t""$ac_cv_pic" 1>&6 echo $ac_n "checking if your system prepends an underscore on symbols""... $ac_c" 1>&6 -echo "configure:4639: checking if your system prepends an underscore on symbols" >&5 +echo "configure:4930: checking if your system prepends an underscore on symbols" >&5 if eval "test \"`echo '$''{'ac_cv_underscore'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -4651,6 +4942,10 @@ ac_cv_underscore=no else ac_cv_underscore=yes fi + +fi + +echo "$ac_t""$ac_cv_underscore" 1>&6 if test "$ac_cv_underscore" = "yes"; then cat >> confdefs.h <<\EOF #define UNDERSCORE 1 @@ -4658,10 +4953,6 @@ EOF fi -fi - -echo "$ac_t""$ac_cv_underscore" 1>&6 - MODULEFLAGS=$ac_cv_pic cat >> confdefs.h <<\EOF #define DYNAMIC_LINKING 1 @@ -4680,7 +4971,7 @@ if test "${enable_inet6+set}" = set; then enableval="$enable_inet6" echo $ac_n "checking if your system has IPv6 support""... $ac_c" 1>&6 -echo "configure:4684: checking if your system has IPv6 support" >&5 +echo "configure:4975: checking if your system has IPv6 support" >&5 if eval "test \"`echo '$''{'ac_cv_ip6'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -4689,7 +4980,7 @@ if test "$cross_compiling" = yes; then { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext < @@ -4701,7 +4992,7 @@ exit(0); } EOF -if { (eval echo configure:4705: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:4996: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_ip6=yes else @@ -4763,7 +5054,7 @@ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } fi echo $ac_n "checking host system type""... $ac_c" 1>&6 -echo "configure:4767: checking host system type" >&5 +echo "configure:5058: checking host system type" >&5 host_alias=$host case "$host_alias" in @@ -4789,17 +5080,17 @@ acx_pthread_ok=no # If it isn't, don't bother looking for the threads libraries. ac_safe=`echo "pthread.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for pthread.h""... $ac_c" 1>&6 -echo "configure:4793: checking for pthread.h" >&5 +echo "configure:5084: checking for pthread.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:4803: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:5094: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -4868,7 +5159,7 @@ esac result=none if test "$acx_pthread_ok" = "no"; then echo $ac_n "checking what flags pthreads needs""... $ac_c" 1>&6 -echo "configure:4872: checking what flags pthreads needs" >&5 +echo "configure:5163: checking what flags pthreads needs" >&5 if eval "test \"`echo '$''{'ac_cv_pthreadflag'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -4906,7 +5197,7 @@ for flag in $acx_pthread_flags; do # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. cat > conftest.$ac_ext < int main() { @@ -4915,7 +5206,7 @@ pthread_t th; pthread_join(th, 0); pthread_create(0,0,0,0); pthread_cleanup_pop(0); ; return 0; } EOF -if { (eval echo configure:4919: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:5210: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* acx_pthread_ok=yes else @@ -4961,20 +5252,20 @@ esac # Detect AIX lossage: threads are created detached by default # and the JOINABLE attribute has a nonstandard name (UNDETACHED). echo $ac_n "checking for joinable pthread attribute""... $ac_c" 1>&6 -echo "configure:4965: checking for joinable pthread attribute" >&5 +echo "configure:5256: checking for joinable pthread attribute" >&5 if eval "test \"`echo '$''{'ac_cv_pthreadjoin'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < int main() { int attr=PTHREAD_CREATE_JOINABLE; ; return 0; } EOF -if { (eval echo configure:4978: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:5269: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_pthreadjoin=PTHREAD_CREATE_JOINABLE else @@ -4986,14 +5277,14 @@ fi rm -f conftest* if test "$ac_cv_pthreadjoin" = "unknown"; then cat > conftest.$ac_ext < int main() { int attr=PTHREAD_CREATE_UNDETACHED; ; return 0; } EOF -if { (eval echo configure:4997: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:5288: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_pthreadjoin=PTHREAD_CREATE_UNDETACHED else @@ -5019,7 +5310,7 @@ EOF fi echo $ac_n "checking if more special flags are required for pthreads""... $ac_c" 1>&6 -echo "configure:5023: checking if more special flags are required for pthreads" >&5 +echo "configure:5314: checking if more special flags are required for pthreads" >&5 if eval "test \"`echo '$''{'ac_cv_pthreadspecial'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -5044,7 +5335,7 @@ echo "$ac_t""$ac_cv_pthreadspecial" 1>&6 # Extract the first word of "cc_r", so it can be a program name with args. set dummy cc_r; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:5048: checking for $ac_word" >&5 +echo "configure:5339: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_PTHREAD_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -5076,7 +5367,7 @@ else fi if test "x$ac_cv_pthreadflag"!=x; then echo $ac_n "checking if pthreads uses one thread per process""... $ac_c" 1>&6 -echo "configure:5080: checking if pthreads uses one thread per process" >&5 +echo "configure:5371: checking if pthreads uses one thread per process" >&5 if eval "test \"`echo '$''{'ac_cv_thread_multi'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -5089,7 +5380,7 @@ if test "$cross_compiling" = yes; then { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext < @@ -5123,7 +5414,7 @@ int main() { } EOF -if { (eval echo configure:5127: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:5418: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_thread_multi=no else @@ -5199,12 +5490,12 @@ CC="$PTHREAD_CC" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" IRCDLIBS="$IRCDLIBS $PTHREAD_LIBS" echo $ac_n "checking if FD_SETSIZE is large enough to allow $ac_fd file descriptors""... $ac_c" 1>&6 -echo "configure:5203: checking if FD_SETSIZE is large enough to allow $ac_fd file descriptors" >&5 +echo "configure:5494: checking if FD_SETSIZE is large enough to allow $ac_fd file descriptors" >&5 if test "$cross_compiling" = yes; then { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext < @@ -5216,7 +5507,7 @@ exit(1); } EOF -if { (eval echo configure:5220: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:5511: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then echo "$ac_t""yes" 1>&6 else diff --git a/doc/conf.doc b/doc/conf.doc index 814fa32ea..df782e4d7 100644 --- a/doc/conf.doc +++ b/doc/conf.doc @@ -973,6 +973,9 @@ If set to no, the user must set +x manually to receive the oper host. set::scan::endpoint ; Specifies the IP and port that the server will tell an incomming open proxy to connect to. +This must be a valid IP and port, in addition the port on the specified IP must be open and +able to accept connections. Therefore it is a good idea to specify the IP of your server +and a port you know is open. set::scan::bantime ; A time value that defines the length of time that a user caught by the scanner will be diff --git a/doc/example.conf b/doc/example.conf index f93c8ecdb..8e485a17c 100644 --- a/doc/example.conf +++ b/doc/example.conf @@ -576,7 +576,7 @@ except ban { }; /* - * NEW: except socks {} + * NEW: except scan {} * OLD: e:Line * Makes it so scan.so doesn't scan you. * @@ -701,7 +701,7 @@ set { show-connect-info; }; - socks { + scan { ban-message "Insecure SOCKS server"; quit-message "Insecure SOCKS server"; ban-time "4d"; diff --git a/help.conf b/help.conf index 02f8ca5bf..ca8301720 100644 --- a/help.conf +++ b/help.conf @@ -61,7 +61,7 @@ help Svscmds { " /MSG OPERSERV RAW :services "; " Use /HELPOP to get info about that command"; " -"; - " ----------oOo-----------"; + " -----------oOo-----------"; " SVSNICK SVSMODE SVSKILL"; " SVSNOOP SVSJOIN SVSPART"; " SVSO SWHOIS SQLINE"; @@ -1059,3 +1059,12 @@ help Svsfline { " :server SVSFLINE - file (Deletes the filename)"; " :server SVSFLINE * (Wipes the DCCDENY list)"; }; + +help Svsmotd { + "Changes the Services Message Of The Day"; + "Must be sent through an U:Lined server."; + "Syntax: SVSMOTD # : (Adds to Services MOTD)"; + " SVSMOTD ! (Deletes the MOTD)"; + " SVSMOTD ! : (Deletes and Adds text)"; + "Example: SVSMOTD # :Services MOTD"; +}; diff --git a/html/back/background.jpg b/html/back/background.jpg index a599c3a60924ad72870eb55f28a0a20dc5cfd9ea..2a0e64a66bce8cb995b13f7cb977ac4388da9a63 100644 GIT binary patch delta 6 NcmeA?&1^Ek1ON#y0#E<| literal 58761 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 bDYTZ5!bz`P?aMNjyrb_dIuBhMAtwJ13YJXX diff --git a/html/icons/modules.jpg b/html/icons/modules.jpg index b908e3b6e13f083123c7fce5bd6019d1b5ea4c1a..c2299c5650f92c7e4b39c9981022aefaf578bad1 100644 GIT binary patch delta 7 OcmX@-c$j&^VMYKBp#w?) literal 8398 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 F{|E4G?NtB( diff --git a/html/icons/opers.jpg b/html/icons/opers.jpg index 4a84cc12f01f93fc71230f95ccb6fe14ae73370a..ce1a0b5c0d73469bd4d61e08e45fade3e9c3f2f1 100644 GIT binary patch delta 7 OcmZ4CxRZIqPDTI?Q3DVF literal 8360 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

mc~0SD*8C{#Z#O;@rE?IPgs~?6`>ZWMo<{?wjv` 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 diff --git a/html/icons/settings.jpg b/html/icons/settings.jpg index f04d9c1d4b596d2024b0148cedb46c908315a164..ceea8bdba54e2c905226903172398e0f96b7240f 100644 GIT binary patch delta 7 Ocmdnsx}SN&entQd%L6C? literal 8880 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 diff --git a/html/icons/stats.jpg b/html/icons/stats.jpg index bd7f4e691d43834cb13a8dd052ab6240792eec53..331a5102466375e1bde77d7d127fe776c9e3eaaa 100644 GIT binary patch delta 7 OcmX@(dXRa;K}G-$odZY! literal 8908 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 I6m;f)0Lk>)4*&oF diff --git a/html/icons/users.jpg b/html/icons/users.jpg index 0019333fc2c64140f827dc32909fc0fbbb03c093..5b597830d49e751629b39ca629d6aa24f3b0b933 100644 GIT binary patch delta 7 OcmZ2syO(*xUPb^7RRa_N literal 7848 zcmb_=1yq#X_V>fU&>e!5bPLiU-5{L`D2*Tu0}=v?faD;Z(w$0+5`whSA*tlhjpWSy z2Yl~)@BP;O*8i^ceS6l~&)ISI`JH{vGyALu`2+b2AXZmaQwGpLXn-o}2OxKFj&EWC(*Er3HZNEdTMPzU~2DsP^lxIX|uDix(C z1E>Hrt|C6H;;NcMv5)cy-5|a}W5|UptLh?UDNdB7u$aa7P8P@dZ&v5_AkkQhuKth)|9iF4-Q|hIEd3EgvbfCl-X(C4C)VIWDa4npizCvhxm0E^6qW zT>CAmV*K>^o0Q_lo+;QV2>=42&|=(R!oma#-#}pGC&fS^aAzU|3%rUWzeeyyZ)9JP z#cI(bI9@@Y!rD{lfEDu^02Z5Y$0!O!KBbM4p$Now>2C=CcLePJgn*m@@X>GPBmrcA zW4yhMA9NDYnd#`Aoiul?)#gl_wRYN?OOe2!ba2oPciT=g5;$}Su(FpTBBmFennMEl zL5Gbz>24c5SgvoL`=DR;uSr^Yt0lwAwb>Lv0Li(EiYdY!!gm?Dcj?l0m2Q3%l^Zl? z95m~N1XdVh@iSzn5==8n z^WRep)PoR6RNNAEQ^UhMe;fb7Pq@iz9SIS|RU-kZ7M&i1(~GuElWMpH z5{ToMsWwOW`{l-7{WuRAuQy-)Ep0orCT$5Hjx(y|E2_EV+@zF_go~GMyIY*F&rQw9 zh(~+*J0gJ)BVEp7EN+TKyV1M$o^w6l#A{CBl(84FIXP!3LgFuUSzh(<6KE4H_4Qib z_Mm}NEzD_QP3#uN#TlMFfjyjY@$#9HRH!HshF0!L_(A7Rr#6GWTq1!7n|IgXm`DIM zg|x}X0jRW$nb*Vm$TIs61snmd}QCn6$0<2T<)hDGx9{dPpew_VgZ$ZXP}a&92_*w&Zocauw5RLqJH z!J$JVrR&}5D{gam?0#fQkFPImML>a8s?ULuYKu>Mw?X>0nDrX32T4S9K7w++3DSId z@vdP7v!Qd>kxI=`0d=}vPK7hz^;73j<=q%MLp!LH7z>8#BYtdIi2@8SeRyU1;U}XL zO-8~{4d;qO*qy=BLH!qk2&Z&ZzwV{*~<87i5hJJRowK(9~GpA-0WO1Y^ z_FC>**j!uLcjBq`vHFEOU{882JWNuFcdxbFmKh>?R?+oFLMg|m!re^Foi9G1PD^Op zT*_=wnyk_+PatYgbcbL7}YRhMm>8piPq zZ1*b0ScQx5LgiBCgvTWPNtKOjv0dZ#%qTp=q~;xwI^5)Et)m{DNYfpee#21y_Ol>L z1_!3S^$C>y?MD5#a?TEysCq*$Oc9W}9E%Prozs76JL63mF+_1xbp-$-Kn_*FT>&dp zA!h(|0DDv)f@+>OJ=9eOAp2iD7yuD~7r1vF@Xri??hIG}HcEk-1NqOYD|_v9Q+5B; zwEv2O{z>S6)4zcbcL zcxFLQa*CveNlSMR2&=H+EpJNWlt!_p+am&cRy7LxENmkCxnn{GU7}PRoZ=*?2|?%} zFeWuNCi-<$5E?q_c0fXk$%u6wv(9})fZRY-*YZ`ayq-t!D6^n~zGp)17>i;eMg1)! zY@E0cUtZ@6jZ^L)#6u?7tqPR>y)HJw-5+ls)K(3N6ssI4j;v!Pi_RRbCpU17Ae!?r9v_Y(*hHPBi!{S0=ZA;MK)WECqfv zkP0y1ie}&o;$r9IsHe+eo)6x00*spuwDvAXw@-x$fEOx7qe>dxcimRz6 zCMG6Pg1ZbcYYwBfnQ|O&b&MC|M-|jnSh*r?D9|oiykYo=pvEN&8ie zpeJxtG2Tt!;IhX&ta6fO#f#`9JsA{~=cA;UDSy&>AQjRoyXl&4stF6@`~AQV2?Wue zZ~v4t{M`m=b2B|puBKRbPNdb=&H^Vn;`rOW?mSxj`X_v^-E zd|OeftNqo8N2{Eg9plkWQ6FwA$Sf1!=da8@?+m#GEX`#<{@7{C$RCdF;Gb1ezlTYX zepJHJ3k+o%o@UzDDhtwul|rc^cj!V=i$QnACXy@Jz300+PHo2GtZC8&NL6ebRd{lo zK5FJILiIF5>x{vR206h=C8QR0p0qv&{^MPjIYWb|!@&foON}LoqGCN1D&` zD^sK~sx-Ph1e&g#BqM}0V>6xHe$nRlMZo%XRiu;Z`n&KvC(V)wD0f2`tT^6A%a(E?z}pzot9Y)3Q`_E2Pwo9e zeI#qS?jY0<#!DAKOW)tN9=lKe#b~z#(37{Fy zZf)c2)*ykhYWAAChl$gjbpr;T{qp5#1B`RTrLwZ_kVZ_-jq=WIcLb=S5u|9iMmBF7 zq_1T^%c)XK-Tu`gLQct1Ap-n}l9e;;@Ugpol#$XUEGIoGVjM(gT@+rznPXrYM@~B4 z-&m(t!066m@CywIteNh20RX>ZyStnckDyr5X2zROv7(Y3;;A$58ZziJIfEZp1!rJd zv2idlL#fKJm&!glJpcNg6#;HDss7!hu-+}xP4~>W;mt=R5G!*rBj_?t#v%P6J(wch zRx?A1sf%Tx0?bEKXXe>y+cCLQ7QVat%QvgHzV)dIeb>EpjylD5Mo*9LoT7bZ-cN%* zrSz5epB}v6?M#r1Ns`&m;OW=h<_wE7_VKU6cJ$zLjOFx^gGdqeUUL( zsYZ^}!Z_H+GoA*8i6pEi*L{T*-e2F+c1j!Vcr$Ok5G#Laz#9T#)_F3_IG1~sRD4fo z76~L;mjohC@b>l_FBg)SvYPx=jmb)Qy9bHuCk&N#I6XGEY#*>Xhv~g4DW#5A4u`sX zk_37VDHtSu0-NR}u22ZF;~qqF4eF`c>1};>o9<=%ZWp|8E(*PJHj$w3ETgttB*gdi zcnH0~Zy42&PltMdYhk9gI#PoU0A-$87a=rP8jMK*)16n4_a+r zCfPk4GjN)?YcM{FTOae(SmRzwc6_L0GXeFxMJ8+_^@=>#%xc!%4E_0PKj-)sF)iuY zud^CQZvp9dM^dopImZbk9t`|@b!yJyLD_aG#+(g+x(gQ@!LEvy8w5uLLc?y zJhqFVwHV{gMZ_@4LmJ+Ii=PJ)xVo&)dmKGcW0S8;xvz?bK9c1J6V7kqjOYGd-GrGV zNB_UtY7a|G2om@CHwQ`&75YyD)n+qd86%~?n<%YU97R7f89 zUJzYW!P4EuDoB;-kgq)N&PBr2V*sw5^?L%X7mAXgjtq15woGw}AAB+{tk7>&-3Ym2 znQ)dqFwD~G<$oi)YV|Vv^OC;LqDTSf+@m_oMMEO1+?En zJ)PmGcU;;b_nCmYmj=}4tz{$Y=YqwYH$t<1+TYAo9y!xA%n^)~zrdIf{KZ{MA4|oY zXBUc{7Cr+&`Il-cUyH3te!_l>R`e*1TKG(L^gXYFTi?X;)DxOAm#q5_Roxwr~8&~tY7 z4;Y$%E%GI25BA7zlxEEP>oq!I@(~MV)SOS!IMf6T6&`Ohs@cVGejXNuBwC2Khn^A- z@3W&V{6wI~&2}%j@XfhYamp&NVSIle+Vcn+9cHx>-mpQ9?Z#||%~AIDl~V7N@b59< zRYSKQV{u8$+nZv&xawNU&u|kWn}m~$wufUjZ;L&9rd$juFk~j?T@Z`42OUuO&ts5? zCHA~oRVxs(&G4Q{cS*(3R3J%>rtnqj?pX9iQqGFKiI@ki!yT>0A~ghXPU__%dtIk>p_5hS-Cipa6~1km+O23v3Q4xtbH^ zGyeD{oR#>>+Ar!%d~q1!!ex0j;#-~T#I#6YYCU&uzI__Pf;g6bxII0r7jgfoubt$R z%sS#nY_QX!p_figc`oF>t;y^I{`ue7ImNipnwUIS8`_ZLwT&F&gES;g>lV_=)Ey(( z87<4PmGAN^G5m4AQP^c!UkW7vbG)SxtLLLu+$~a0k@v;>vQ)=bUv-CtwECoUc6pDZ zS6~Fy%`lRCd+J;zL>vk(s}N5Okyv*$Rm~8s8}mkB%%OP@I_GM4h87qMm?Rh1Int*J z6wz6b*?H0`nCdi_lCUIjI)4|^`O#H>^7Y4d;>qb}to?m53`Nbf6f$N3nn59X7k+XL zHGfBnos5^u$uM^(-@AjDBjERdMh@2_-yXxMIWHJ}z}epKUZ1eoBWt3MVFA%CGuoY_ z0p)m2Q?TbU=eT5il9_NB^XdLCM*`nnns=31JAkTTLreVjxZdZ7 z?7utp=0($eNj~X^JAM9OKpbc4wWMn+!Fr~4rM@08z2T72Hqo%b&n#&pcMoU!E}^w? zA04`}Z7c`cdtFZPh&eSX=avscb`ELQ^V81?zE9b!6%D)FLcQonckDJg)W;8jRol5- zuDLP^>O{4!!knCNDlK>EGEehgcib*u?isZoA2mi$q+Wyt3>SERa`lYtv>4FsqV>L? zIYJXTA{IQ|#55wBI@0CdaBu~2ZBumJ^Ia}E*4LvQ8_6w~-5Oxxm(Y?v4mNNuPUDw_ z>DI$23^fSkh$*mPx00}Sa`MA7gToV76Ucg9?u&GG*H@VV)52<@y-_hfu?vzUDn-mlfRX9-Owo85d8(V3B-Q(? z58Lx8=->%z#A&ah-#+d`jFXPHHDca70WYd8d-HD1FvD{#JPy6Lzrnn#+M+yjeI|AOpkMsDOpZ83+;_?xHNVYi~zp>e{0O>b6>luXK43cg8a5WvP~WIov_;h%IzAxq4s*hscga)SSk^xXG_ zJVSL0;>AP^A=r0(;TLF&x|`{3HU8}>cxqe7cqDAxY94q6LY9Nho~oi-5X2m zBBKsmfz3H98QVS=iNQ@UDt(&+=5oaasL>VYdL%tM)_iCp)&e%l+}f9KQ6H=Z6@M>W zQ5oLABr)df0FyShXP@L6BpjhG82k#ak~hsy&4M=}7^R50>=QxGiH#`PojBJkjvYq8!F9<<1Yo5S7qo{cx41Fvf&9fXchZ$%+_-Z1gk^4pWZ>7hj zc*c)Jc{IkBj4FZHz7;a&H-wO24AAz*po{Xa=_~r`5}-cdafepMB#1sfN0;a6{nBbg za~EM&>sBO{Z449W@55{7;@t*&DLz@V{g{ZeZHd?#P?s+#=sMsQzK2rdi;Mjc0UAk?1 zGDiuGuG)49TKHDAcVGFTYSrxa*AMZj+dVc!Tw?CNW^J&T`!2K11`Y+zp=+`MfH$tFI9oFN-z`Ha#!pJ@H5sK< z<@r!~Tp~=Gx5~x++c$q4A<5(@Lj2OcI|M$H*>k&omMy&S_+A7-k=d)HpSCJ^iA%nP zGfzm}S&594N`vEVt8~$p^l3wcHfTFl@`Ew)Qt!P}4_U+HyBma@%A9Hap)|1sIuS_q z&Hq%)r%eY+y8V$Z$+MrQ7Mht<REo&xc*CZF$+F(L)ntu_#v;@7Jdi@|8#_9h!gY)Z@rll&O%{NQ}%b_4i zruUDOlnV76BU9aVv9$D6HwJ}$<(hi6urfl(P(X}r?XsHl0g{%~230f}ffo8_|EAW|cuYwg~^cPByK!&!jUFL^PcX+9vS^qS9 wvvkU@PQ7Aumodes & UMODE_WALLOP)) #define SendServNotice(x) (((x)->user) && ((x)->user->snomask & SNO_SNOTICE)) #define IsListening(x) ((x)->flags & FLAGS_LISTEN) -#define DoAccess(x) ((x)->flags & FLAGS_CHKACCESS) +// #define DoAccess(x) ((x)->flags & FLAGS_CHKACCESS) #define IsLocal(x) ((x)->flags & FLAGS_LOCAL) #define IsDead(x) ((x)->flags & FLAGS_DEADSOCKET) #define GotProtoctl(x) ((x)->flags & FLAGS_PROTOCTL) @@ -389,7 +390,7 @@ typedef unsigned int u_int32_t; /* XXX Hope this works! */ #define SetWallops(x) ((x)->umodes |= UMODE_WALLOP) #define SetDNS(x) ((x)->flags |= FLAGS_DOINGDNS) #define DoingDNS(x) ((x)->flags & FLAGS_DOINGDNS) -#define SetAccess(x) ((x)->flags |= FLAGS_CHKACCESS) +#define SetAccess(x) ((x)->flags |= FLAGS_CHKACCESS); Debug((DEBUG_DEBUG, "SetAccess(%s)", (x)->name)) #define SetBlocked(x) ((x)->flags |= FLAGS_BLOCKED) #define DoingAuth(x) ((x)->flags & FLAGS_AUTH) #define NoNewLine(x) ((x)->flags & FLAGS_NONL) @@ -588,8 +589,8 @@ struct MotdItem { struct aloopStruct { unsigned do_garbage_collect : 1; - unsigned do_tkl_sweep : 1; unsigned ircd_booted : 1; + unsigned do_bancheck : 1; }; typedef struct Whowas { @@ -935,6 +936,14 @@ struct _configitem_listen { char *ip; int port; long options, clients; + ConfigItem_ssl *ssl; +}; + +struct _configitem_ssl { + char *cert; + char *key; + char *ca; + char *cipher; }; struct _configitem_vhost { diff --git a/include/threads.h b/include/threads.h index 19bc384d4..8d929081b 100644 --- a/include/threads.h +++ b/include/threads.h @@ -33,10 +33,9 @@ #endif #if !defined(_WIN32) || defined(USE_PTHREADS) #include -typedef pthread_attr_t THREAD_ATTR; typedef pthread_t THREAD; typedef pthread_mutex_t MUTEX; -#define IRCCreateThread(thread, attr, start, arg) TDebug(CreateThread); pthread_attr_init(&attr); pthread_create(&thread, &attr, (void*)start, arg) +#define IRCCreateThread(thread, start, arg) TDebug(CreateThread); pthread_create(&thread, NULL, (void*)start, arg) #define IRCMutexLock(mutex) TDebug(MutexLock); pthread_mutex_lock(&mutex) #define IRCMutexTryLock(mutex) TDebug(MutexTryLock); pthread_mutex_trylock(&mutex); #define IRCMutexUnlock(mutex) TDebug(MutexUnlcok); pthread_mutex_unlock(&mutex) @@ -44,14 +43,14 @@ typedef pthread_mutex_t MUTEX; #define IRCMutexDestroy(mutex) TDebug(MutexDestroy); pthread_mutex_destroy(&mutex) #define IRCJoinThread(thread,return) TDebug(JoinThread); pthread_join(thread, return) #define IRCExitThread(value) TDebug(ExitThread); pthread_exit(value) +#define IRCDetachThread(value) TDebug(DetachThread); pthread_detach(value); #define IRCTerminateThread(thread, value) pthread_cancel(&thread) #define IRCThreadSelf() pthread_self() #define IRCThreadEqual(thread1, thread2) pthread_equal(thread1,thread2) #else -typedef short THREAD_ATTR; /* Not needed but makes porting easier */ typedef unsigned long THREAD; typedef HANDLE MUTEX; -#define IRCCreateThread(thread, attr, start, arg) thread = _beginthread((void *)start, 0, arg) +#define IRCCreateThread(thread, start, arg) thread = _beginthread((void *)start, 0, arg) #define IRCMutexLock(mutex) WaitForSingleObject(mutex, INFINITE) #define IRCMutexTryLock(mutex) WaitForSingleObject(mutex, 0) #define IRCMutexUnlock(mutex) ReleaseMutex(mutex) @@ -62,6 +61,7 @@ typedef HANDLE MUTEX; #define IRCTerminateThread(thread, value) TerminateThread((HANDLE)thread, value) #define IRCThreadSelf() GetCurrentThread() #define IRCThreadEqual(thread1, thread2) thread1 == thread2 ? 1 : 0 +#define IRCDetachThread(value) ; #endif #endif diff --git a/include/version.h b/include/version.h index 31334dda3..e38b9898e 100644 --- a/include/version.h +++ b/include/version.h @@ -31,7 +31,7 @@ #define PATCH1 "3" #define PATCH2 ".2" #define PATCH3 "-Selene" -#define PATCH4 "[beta9]" +#define PATCH4 "[beta10]" #define PATCH5 "" #define PATCH6 "" #define PATCH7 "" diff --git a/networks/awesomechristians.network b/networks/awesomechristians.network new file mode 100644 index 000000000..a62ab119b --- /dev/null +++ b/networks/awesomechristians.network @@ -0,0 +1,28 @@ +/* + * AwesomeChristians Chat Network (irc.awesomechristians.com) Network Configuration File + * -------------------------------------------------- + * Added-at: 31 December 2001 15:25 + * Author: ChildLikeFaith + * Email: childlikefaith@awesomechristians.com + * ----------------------------------------- + */ + +set { + network-name "AwesomeChristians Chat Network"; + default-server "irc.awesomechristians.com"; + services-server "services.awesomechristians.com"; + stats-server "services.awesomechristians.com"; + help-channel "#operhelp"; + hiddenhost-prefix "awesome"; + prefix-quit "Quit:"; + hosts { + local "ircop.awesomechristians.net"; + global "ircop.awesomechristians.net"; + coadmin "co.admin.awesomechristians.net"; + admin "admin.awesomechristians.net"; + servicesadmin "services.admin.awesomechristians.net"; + netadmin "network.admin.awesomechristians.net"; + host-on-oper-up "on"; + }; +}; + diff --git a/networks/ctcp.network b/networks/ctcp.network new file mode 100644 index 000000000..b5b2fb7e8 --- /dev/null +++ b/networks/ctcp.network @@ -0,0 +1,26 @@ +/* + * CTCP Networks (irc.ctcp.net) Network Configuration File + * + * Added-at: 12 February 2002 19:54 + * Author: Mark + * Email: mark@ctcp.net + */ + +set { + network-name "CTCP Networks"; + default-server "irc.ctcp.net"; + services-server "services.ctcp.net"; + stats-server "stats.ctcp.net"; + help-channel "#opers"; + hiddenhost-prefix "ctcp"; + hosts { + local "locop.ctcp.net"; + global "oper.ctcp.net"; + coadmin "coadmin.ctcp.net"; + admin "admin.ctcp.net"; + servicesadmin "csop.ctcp.net"; + netadmin "netadmin.ctcp.net"; + host-on-oper-up yes; + }; +}; + diff --git a/networks/darkkaos.network b/networks/darkkaos.network new file mode 100644 index 000000000..5c1c01e4c --- /dev/null +++ b/networks/darkkaos.network @@ -0,0 +1,26 @@ +/* + * Dark Kaos Network (irc.darkkaos.net) Network Configuration File + * + * Added-at: 04 February 2002 03:15 + * Author: ka0t1c_m4n + * Email: drk_kaos@yahoo.com + */ + +set { + network-name "Dark Kaos Network"; + default-server "irc.darkkaos.net"; + services-server "services.darkkaos.net"; + stats-server "stats.darkkaos.net"; + help-channel "#help"; + hiddenhost-prefix "hide"; + hosts { + local "localop.darkkaos.net"; + global "would.u.like.to.be.me.com"; + coadmin "ircop.darkkaos.net"; + admin "i.hate.terr.oists.net"; + servicesadmin "Csop.darkkaos.net"; + netadmin "netadmin.darkkaos.net"; + host-on-oper-up yes; + }; +}; + diff --git a/networks/discussioni.network b/networks/discussioni.network new file mode 100644 index 000000000..d07d37ef7 --- /dev/null +++ b/networks/discussioni.network @@ -0,0 +1,26 @@ +/* + * Discussioni.Org (IRC.Discussioni.Org) Network Configuration File + * + * Added-at: 17 January 2002 22:39 + * Author: Jollino + * Email: jollino@discussioni.org + */ + +set { + network-name "Discussioni.Org"; + default-server "IRC.Discussioni.Org"; + services-server "Services.Discussioni.Org"; + stats-server "Stats.Discussioni.Org"; + help-channel "#help"; + hiddenhost-prefix "DISCUSSIONI"; + hosts { + local "LocOp.Discussioni.Org"; + global "Oper.Discussioni.Org"; + coadmin "Co-Admin.Discussioni.Org"; + admin "Admin.Discussioni.Org"; + servicesadmin "ServOper.Discussioni.Org"; + netadmin "NetAdmin.Discussioni.Org"; + host-on-oper-up yes; + }; +}; + diff --git a/networks/icechat.network b/networks/icechat.network new file mode 100644 index 000000000..105b04eb2 --- /dev/null +++ b/networks/icechat.network @@ -0,0 +1,26 @@ +/* + * IceChat (irc.icechat.net) Network Configuration File + * + * Added-at: 19 February 2002 16:55 + * Author: Rosco + * Email: pssystem@home.com + */ + +set { + network-name "IceChat"; + default-server "irc.icechat.net"; + services-server "services.icechat.net"; + stats-server "stats.icechat.net"; + help-channel "#help"; + hiddenhost-prefix "00"; + hosts { + local "locop.icechat.net"; + global "oper.icechat.net"; + coadmin "coadmin.icechat.net"; + admin "admin.icechat.net"; + servicesadmin "csop.icechat.net"; + netadmin "netadmin.icechat.net"; + host-on-oper-up yes; + }; +}; + diff --git a/networks/ircsystems.network b/networks/ircsystems.network new file mode 100644 index 000000000..6e082b612 --- /dev/null +++ b/networks/ircsystems.network @@ -0,0 +1,29 @@ +/* + * ROXnet (irc.rox.za.net) Network Configuration File + * -------------------------------------------------- + * Added-at: 14 July 1999 00:00 GMT + * Author: Stskeeps (Carsten Munk) + * E-Mail: stskeeps@roxnet.org + * $Id$ + * ----------------------------------------- + */ + +set { + network-name "IRCsystems"; + default-server "irc.ircsystems.net"; + services-server "services.ircsystems.net"; + stats-server "stats.ircsystems.net"; + help-channel "#IRCsystems"; + hiddenhost-prefix "rox"; + prefix-quit "Quit:"; + hosts { + local "locop.ircsystems.net"; + global "ircop.ircsystems.net"; + coadmin "coadmin.ircsystems.net"; + admin "admin.ircsystems.net"; + servicesadmin "csops.ircsystems.net"; + techadmin "techadmin.ircsystems.net"; + netadmin "netadmin.ircsystems.net"; + host-on-oper-up "off"; + }; +}; diff --git a/networks/l33t-irc.network b/networks/l33t-irc.network new file mode 100644 index 000000000..b2005f890 --- /dev/null +++ b/networks/l33t-irc.network @@ -0,0 +1,26 @@ +/* + * l33t-irc.com (irc.l33t-irc.com) Network Configuration File + * + * Added-at: 04 January 2002 15:46 + * Author: [LW]FlOwBiE + * Email: flowbie@l33t-irc.com + */ + +set { + network-name "l33t-irc.com"; + default-server "irc.l33t-irc.com"; + services-server "services.l33t-irc.com"; + stats-server "stats.l33t-irc.com"; + help-channel "#l33t-irc.com"; + hiddenhost-prefix "l33t-irc.com"; + hosts { + local "local.l33t-irc.com"; + global "l33t-irc"; + coadmin "coadmin.l33t-irc.com"; + admin "admin.l33t-irc.com"; + servicesadmin "servicesadmin.l33t-irc.com"; + netadmin "netadmin.l33t-irc.com"; + host-on-oper no; + }; +}; + diff --git a/networks/networks.ndx b/networks/networks.ndx index 9b783f8db..5978389f5 100644 --- a/networks/networks.ndx +++ b/networks/networks.ndx @@ -6,57 +6,33 @@ * of these networks. */ -networks/action-irc.network ......: Action-IRC (http://www.action-irc.net) +networks/awesomechristians.network: Awesome Christians Chat Network (http://www.awesomechristians.com) networks/axenet.network ..........: AXEnet (http://www.axenet.org) -networks/bitchx.network ..........: BitchX (http://www.bitchx.cl) -networks/blind-irc.network .......: Blind-Irc (http://www.blind-irc.com) networks/bunker7.network .........: Bunker7 (http://www.bunker7.net) networks/burnnet.network .........: BuRnNET (http://www.burncycl.net) networks/cabonet.network .........: CaboNet (http://www.cabonet.org) -networks/cc2.network .............: CC2 (http://www.cc2.org) networks/chatcrap.network ........: ChatCrap (http://www.chatcrap.com) networks/chatuniverse.network ....: ChatUniverse (http://www.chatuniverse.net) -networks/coolchat.network ........: Coolchat (http://www.coolchat.net) -networks/cynicnet.network ........: CynicNet (http://www.cynicnet.org) -networks/dark-core.network .......: Dark Core Networks -networks/darkfyre.network ........: Darkfyre (http://www.darkfyre.net) -networks/darkwar.network .........: Darkwar (http://www.darkwar.net) +networks/ctcp.network ............: CTCP Networks (http://www.ctcp.net) +networks/darkkaos.network ........: Dark Kaos Network (http://www.darkkaos.net) networks/digitalirc.network ......: DigitalIRC (http://www.digitalirc.net) +networks/discussioni.network .....: Discussioni.org (http://www.discussioni.org) networks/dragonwings.network .....: DragonWings (http://www.dragonwings.org) -networks/fireirc.network .........: FireIRC (http://www.fireirc.net) -networks/flort.network ...........: Flort -networks/friendlyirc.network .....: FriendlyIRC (http://www.friendlyirc.net) networks/gamescafe.network .......: GamesCafe (http://www.gamerscafe.net) -networks/geridnet.network ........: Gerid.Net (http://www.gerid.net) networks/german-elite.network ....: German-Elite (http://www.german-elite.net) networks/german-global-irc.network: German Global IRC (http://www.global-irc.de) networks/globalchat.network ......: GlobalChat (http://www.globalchat.ca) networks/global-irc.network ......: Global-IRC (http://www.global-irc.net) -networks/globo.network ...........: Globo +networks/icechat.network .........: IceChat (http://www.icechat.net) networks/infinity.network ........: Infinity-IRC.org (http://www.infinity-irc.org) -networks/irclatino.network .......: IRCLatino (http://www.irclatino.org) -networks/irc4ever.network ........: IRC4ever (http://www.irc4ever.net) networks/isno.network ............: Isno (http://www.isno.net) -networks/israelnet.network .......: IsraelNet (http://www.israel.net) +networks/l33t-irc.network ........: L33T-IRC (http://www.l33t-irc.com) networks/lcirc.network ...........: LCIrc (http://www.lcirc.net) -networks/lostchat.network ........: Lostchat (http://www.lostchat.net) -networks/maxatnet.network ........: MaxatNet -networks/phatnet.network .........: PhatNet (http://www.phat-net.de) +networks/outsiderz.network .......: Outsiderz (http://www.outsiderz.com) networks/phazenet.network ........: PhazeNet (http://www.phazenet.com) -networks/pheernet.network ........: PheerNet (http://www.pheernet.org) -networks/roxnet.network ..........: ROXnet (http://www.roxnet.org) -networks/shallomchat.network .....: ShallomChat (http://www.shallomchat.org) -networks/solargalaxy.network .....: SolarGalaxy (http://www.solargalaxy.net) -netwrosk/spamnet.network .........: SpamNet (http://www.spamnet.org) -networks/spin.network ............: SpiN (http://www.spinempire.com) -networks/starequinox.network .....: StarEquinox (http://www.starequinox.net) networks/stormdancing.network ....: StormDancing (http://www.stormdancing.net) networks/thainet.network .........: Thai IRC Network -networks/tspre.network ...........: TSpre (http://www.tspre.org) -networks/unitedirc.network .......: UnitedIRC (http://www.unitedirc.com) networks/unitedirc-org.network ...: Unitedirc (http://www.unitedirc.org) -networks/united-irc.network ......: united-irc -networks/uzaynet.network .........: UzayNet (http://www.uzaynet.nu) networks/wazzza.network ..........: wazZza (http://www.wazzza.org) networks/x-irc.network ...........: x-irc (http://www.x-irc.net) networks/zirc.network ............: ZiRC (http://www.zirc.org) diff --git a/networks/outsiderz.network b/networks/outsiderz.network new file mode 100644 index 000000000..78bc71a85 --- /dev/null +++ b/networks/outsiderz.network @@ -0,0 +1,26 @@ +* + * Outsiderz.com (irc.Outsiderz.com) Network Configuration File + * + * Added-at: 29 January 2002 07:35 + * Author: DrDeath + * Email: DrDeath@hotmail.com + */ + +set { + network-name "Outsiderz.com"; + default-server "irc.Outsiderz.com"; + services-server "services.outsiderz.com"; + stats-server "stats.outsiderz.com"; + help-channel "#Outsiderz"; + hiddenhost-prefix "Outsiderz"; + hosts { + local "LocOP.Outsiderz.com"; + global "IrcOP.Outsiderz.com"; + coadmin "CoAdmin.Outsiderz.com"; + admin "Admin.Outsiderz.com"; + servicesadmin "CsOP.Outsiderz.com"; + netadmin "NetAdmin.Outsiderz.com"; + host-on-oper-up yes; + }; +}; + diff --git a/src/badwords.c b/src/badwords.c index 47d696db8..4e7b8d6f0 100644 --- a/src/badwords.c +++ b/src/badwords.c @@ -50,12 +50,15 @@ char *stripbadwords_channel(char *str) char *ptr; int errorcode, matchlen, stringlen; ConfigItem_badword *this_word; - + size_t n; if (!conf_badword_channel) return str; - strncpy(cleanstr, str, sizeof(cleanstr) - 1); /* Let's work on a backup */ - memset(&pmatch, 0, sizeof(pmatch)); - stringlen = strlen(cleanstr); + + /* + * work on a copy + */ + stringlen = strlcpy(cleanstr, str, sizeof cleanstr); + memset(&pmatch, 0, sizeof pmatch); matchlen = 0; buf[0] = '\0'; @@ -68,23 +71,28 @@ char *stripbadwords_channel(char *str) return cleanstr; } - ptr = cleanstr; /* Set pointer to start of string */ + /* + * Set pointer to start of string + */ + ptr = cleanstr; + while (regexec(&pcomp, ptr, MAX_MATCH, pmatch, 0) != REG_NOMATCH) { if (pmatch[0].rm_so == -1) break; matchlen += pmatch[0].rm_eo - pmatch[0].rm_so; - strncat(buf, ptr, pmatch[0].rm_so); + strlncat(buf, ptr, sizeof buf, pmatch[0].rm_so); if (this_word->replace) - strcat(buf, this_word->replace); + strlcat(buf, this_word->replace, sizeof buf); else - strcat(buf, REPLACEWORD); + strlcat(buf, REPLACEWORD, sizeof buf); ptr += pmatch[0].rm_eo; /* Set pointer after the match pos */ memset(&pmatch, 0, sizeof(pmatch)); } - strcat(buf, ptr); /* All the better to eat you with! */ - strncpy(cleanstr, buf, sizeof(cleanstr)); + /* All the better to eat you with! */ + strlcat(buf, ptr, sizeof buf); + memcpy(cleanstr, buf, sizeof cleanstr); memset(buf, 0, sizeof(buf)); regfree(&pcomp); if (matchlen == stringlen) @@ -101,18 +109,21 @@ char *stripbadwords_message(char *str) static char cleanstr[4096]; char buf[4096]; char *ptr; - ConfigItem_badword *this_word; int errorcode, matchlen, stringlen; - + ConfigItem_badword *this_word; + size_t n; if (!conf_badword_message) return str; - strncpy(cleanstr, str, sizeof(cleanstr) - 1); /* Let's work on a backup */ - memset(&pmatch, 0, sizeof(pmatch)); - stringlen = strlen(cleanstr); + + /* + * work on a copy + */ + stringlen = strlcpy(cleanstr, str, sizeof cleanstr); + memset(&pmatch, 0, sizeof pmatch); matchlen = 0; buf[0] = '\0'; - for (this_word = conf_badword_message; this_word; this_word = (ConfigItem_badword *)this_word->next) + for (this_word = conf_badword_message; this_word; this_word = (ConfigItem_badword *)this_word->next) { if ((errorcode = regcomp(&pcomp, this_word->word, REG_ICASE)) > 0) @@ -121,23 +132,28 @@ char *stripbadwords_message(char *str) return cleanstr; } - ptr = cleanstr; /* Set pointer to start of string */ + /* + * Set pointer to start of string + */ + ptr = cleanstr; + while (regexec(&pcomp, ptr, MAX_MATCH, pmatch, 0) != REG_NOMATCH) { if (pmatch[0].rm_so == -1) break; matchlen += pmatch[0].rm_eo - pmatch[0].rm_so; - strncat(buf, ptr, pmatch[0].rm_so); + strlncat(buf, ptr, sizeof buf, pmatch[0].rm_so); if (this_word->replace) - strcat(buf, this_word->replace); + strlcat(buf, this_word->replace, sizeof buf); else - strcat(buf, REPLACEWORD); + strlcat(buf, REPLACEWORD, sizeof buf); ptr += pmatch[0].rm_eo; /* Set pointer after the match pos */ memset(&pmatch, 0, sizeof(pmatch)); } - strcat(buf, ptr); /* All the better to eat you with! */ - strncpy(cleanstr, buf, sizeof(cleanstr)); + /* All the better to eat you with! */ + strlcat(buf, ptr, sizeof buf); + memcpy(cleanstr, buf, sizeof cleanstr); memset(buf, 0, sizeof(buf)); regfree(&pcomp); if (matchlen == stringlen) diff --git a/src/channel.c b/src/channel.c index f63e04c88..a031103bb 100644 --- a/src/channel.c +++ b/src/channel.c @@ -539,13 +539,13 @@ extern Ban *is_banned(aClient *cptr, aClient *sptr, aChannel *chptr) s = make_nick_user_host(cptr->name, cptr->user->username, cptr->user->realhost); - strcpy(realhost, s); + strlcpy(realhost, s, sizeof realhost); if (dovirt) { s = make_nick_user_host(cptr->name, cptr->user->username, - cptr->user->virthost); - strcpy(virthost, s); + cptr->user->virthost); + strlcpy(virthost, s, sizeof virthost); } /* We now check +b first, if a +b is found we then see if there is a +e. * If a +e was found we return NULL, if not, we return the ban. @@ -811,7 +811,8 @@ static void channel_modes(aClient *cptr, char *mbuf, char *pbuf, aChannel *chptr if (IsMember(cptr, chptr) || IsServer(cptr) || IsULine(cptr)) { - (void)ircsprintf(bcbuf, "%s ", chptr->mode.key); + /* FIXME: hope pbuf is long enough */ + (void)snprintf(bcbuf, sizeof bcbuf, "%s ", chptr->mode.key); (void)strcat(pbuf, bcbuf); } } @@ -821,7 +822,8 @@ static void channel_modes(aClient *cptr, char *mbuf, char *pbuf, aChannel *chptr if (IsMember(cptr, chptr) || IsServer(cptr) || IsULine(cptr)) { - (void)ircsprintf(bcbuf, "%s ", chptr->mode.link); + /* FIXME: is pbuf long enough? */ + (void)snprintf(bcbuf, sizeof bcbuf, "%s ", chptr->mode.link); (void)strcat(pbuf, bcbuf); } } @@ -879,8 +881,8 @@ static int send_mode_list(aClient *cptr, char *chname, TS creationtime, Member * if (strlen(parabuf) + strlen(name) + 11 < (size_t)MODEBUFLEN) { if (*parabuf) - (void)strcat(parabuf, " "); - (void)strcat(parabuf, name); + (void)strlcat(parabuf, " ", sizeof parabuf); + (void)strlcat(parabuf, name, sizeof parabuf); count++; *cp++ = flag; *cp = '\0'; @@ -901,7 +903,7 @@ static int send_mode_list(aClient *cptr, char *chname, TS creationtime, Member * *cp++ = '+'; if (count != RESYNCMODES) { - (void)strcpy(parabuf, name); + (void)strlcpy(parabuf, name, sizeof parabuf); *cp++ = flag; } count = 0; @@ -2727,10 +2729,13 @@ CMD_FUNC(channel_link) continue; } if (*jbuf) - (void)strcat(jbuf, ","); - (void)strncat(jbuf, name, sizeof(jbuf) - i - 1); + (void)strlcat(jbuf, ",", sizeof jbuf); + (void)strlncat(jbuf, name, sizeof jbuf, sizeof(jbuf) - i - 1); i += strlen(name) + 1; } + /* + * FIXME: Hopefully parv[1] is long enough? + */ (void)strcpy(parv[1], jbuf); p = NULL; @@ -2963,8 +2968,8 @@ CMD_FUNC(m_join) continue; } if (*jbuf) - (void)strcat(jbuf, ","); - (void)strncat(jbuf, name, sizeof(jbuf) - i - 1); + (void)strlcat(jbuf, ",", sizeof jbuf); + (void)strlncat(jbuf, name, sizeof jbuf, sizeof(jbuf) - i - 1); i += strlen(name) + 1; } (void)strcpy(parv[1], jbuf); @@ -3933,7 +3938,7 @@ char mode_buf[MODEBUFLEN], parabuf[MODEBUFLEN]; if (mode_buf[2] == '\0') mode_buf[0] = '\0'; else - strcat(mode_buf, "]"); + strlcat(mode_buf, "]", sizeof mode_buf); #endif if (!IsAnOper(cptr)) sendto_one(cptr, @@ -4268,7 +4273,7 @@ CMD_FUNC(m_list) if (mode_buf[2] == '\0') mode_buf[0] = '\0'; else - strcat(mode_buf, "]"); + strlcat(mode_buf, "]", sizeof mode_buf); #endif sendto_one(sptr, rpl_str(RPL_LIST), @@ -4442,7 +4447,7 @@ void send_user_joins(aClient *cptr, aClient *user) int cnt = 0, len = 0, clen; char *mask; - ircsprintf(buf, ":%s %s ", user->name, + snprintf(buf, sizeof buf, ":%s %s ", user->name, (IsToken(cptr) ? TOK_JOIN : MSG_JOIN)); len = strlen(buf); @@ -4462,18 +4467,18 @@ void send_user_joins(aClient *cptr, aClient *user) buf[len - 1] = '\0'; sendto_one(cptr, "%s", buf); } - ircsprintf(buf, ":%s %s ", user->name, + snprintf(buf, sizeof buf, ":%s %s ", user->name, (IsToken(cptr) ? TOK_JOIN : MSG_JOIN)); len = strlen(buf); cnt = 0; } - (void)strcpy(buf + len, chptr->chname); + (void)strlcpy(buf + len, chptr->chname, sizeof buf-len); cnt++; len += clen; if (lp->next) { len++; - (void)strcat(buf, ","); + (void)strlcat(buf, ",", sizeof buf); } } if (*buf && cnt) @@ -4672,8 +4677,8 @@ else if (b == MAXMODEPARAMS) {\ } #define Addsingle(x) modebuf[b] = x; b++ #define CheckStatus(x,y) if (modeflags & (y)) { Addit((x), nick); } -#define AddBan(x) strcat(banbuf, x); strcat(banbuf, " "); -#define AddEx(x) strcat(exbuf, x); strcat(exbuf, " "); +#define AddBan(x) strlcat(banbuf, x, sizeof banbuf); strlcat(banbuf, " ", sizeof banbuf); +#define AddEx(x) strlcat(exbuf, x, sizeof exbuf); strlcat(exbuf, " ", sizeof banbuf); CMD_FUNC(m_sjoin) @@ -4853,7 +4858,7 @@ CMD_FUNC(m_sjoin) b = 1; c = 0; bp = buf; - strcpy(cbuf, parv[parc-1]); + strlcpy(cbuf, parv[parc-1], sizeof cbuf); for (s = s0 = strtoken(&p, cbuf, " "); s; s = s0 = strtoken(&p, (char *)NULL, " ")) { @@ -4986,15 +4991,15 @@ CMD_FUNC(m_sjoin) if (!merge && !removetheirs && !nomode) { - strcpy(modebuf, parv[3]); + strlcpy(modebuf, parv[3], sizeof modebuf); parabuf[0] = '\0'; if (!nopara) for (b = 4; b <= (parc - 2); b++) { - strcat(parabuf, parv[b]); - strcat(parabuf, " "); + strlcat(parabuf, parv[b], sizeof parabuf); + strlcat(parabuf, " ", sizeof parabuf); } - strcpy(paraback, parabuf); + strlcpy(paraback, parabuf, sizeof paraback); ap = mp2parv(modebuf, parabuf); set_mode(chptr, cptr, ap->parc, ap->parv, &pcount, pvar, 0); sendto_serv_butone_sjoin(cptr, @@ -5009,13 +5014,13 @@ CMD_FUNC(m_sjoin) aCtab *acp; bcopy(&chptr->mode, &oldmode, sizeof(Mode)); /* merge the modes */ - strcpy(modebuf, parv[3]); + strlcpy(modebuf, parv[3], sizeof modebuf); parabuf[0] = '\0'; if (!nopara) for (b = 4; b <= (parc - 2); b++) { - strcat(parabuf, parv[b]); - strcat(parabuf, " "); + strlcat(parabuf, parv[b], sizeof parabuf); + strlcat(parabuf, " ", sizeof parabuf); } ap = mp2parv(modebuf, parabuf); set_mode(chptr, cptr, ap->parc, ap->parv, &pcount, pvar, 0); @@ -5024,7 +5029,7 @@ CMD_FUNC(m_sjoin) We first see if any para modes are set */ - strcpy(modebuf, "-"); + strlcpy(modebuf, "-", sizeof modebuf); parabuf[0] = '\0'; b = 1; /* however, is this really going to happen at all? may be unneeded */ @@ -5064,7 +5069,7 @@ CMD_FUNC(m_sjoin) } else { - strcpy(modebuf, "+"); + strlcpy(modebuf, "+", sizeof modebuf); b = 1; } for (acp = cFlagTab; acp->mode; acp++) @@ -5120,7 +5125,7 @@ CMD_FUNC(m_sjoin) z = MAX(x, y); if (z == x) { - strcpy(chptr->mode.key, oldmode.key); + strlcpy(chptr->mode.key, oldmode.key, sizeof chptr->mode.key); } else { @@ -5136,7 +5141,7 @@ CMD_FUNC(m_sjoin) z = MAX(x, y); if (z == x) { - strcpy(chptr->mode.link, oldmode.link); + strlcpy(chptr->mode.link, oldmode.link, sizeof(chptr->mode.link)); } else { @@ -5187,7 +5192,7 @@ CMD_FUNC(m_sjoin) oldts, chptr->creationtime); - strcpy(parabuf, ""); + strlcpy(parabuf, "", sizeof parabuf); for (i = 2; i <= (parc - 2); i++) { if (!parv[i]) @@ -5195,9 +5200,9 @@ CMD_FUNC(m_sjoin) sendto_ops("Got null parv in SJ3 code"); continue; } - strcat(parabuf, parv[i]); + strlcat(parabuf, parv[i], sizeof parabuf); if (((i + 1) <= (parc - 2))) - strcat(parabuf, " "); + strlcat(parabuf, " ", sizeof parabuf); } if (!chptr->users) { @@ -5260,7 +5265,7 @@ static int send_ban_list(aClient *cptr, char *chname, TS creationtime, aChannel *cp++ = '+'; if (count != MODEPARAMS) { - (void)strcpy(parabuf, name); + (void)strlcpy(parabuf, name, sizeof parabuf); *cp++ = 'b'; } count = 0; @@ -5298,7 +5303,7 @@ static int send_ban_list(aClient *cptr, char *chname, TS creationtime, aChannel *cp++ = '+'; if (count != MODEPARAMS) { - (void)strcpy(parabuf, name); + (void)strlcpy(parabuf, name, sizeof parabuf); *cp++ = 'e'; } count = 0; @@ -5339,9 +5344,9 @@ void send_channel_modes_sjoin(aClient *cptr, aChannel *chptr) else { if (!SupportSJOIN2(cptr)) - strcpy(parabuf, ""); + strlcpy(parabuf, "", sizeof parabuf); else - strcpy(parabuf, "<->"); + strlcpy(parabuf, "<->", sizeof parabuf); } ircsprintf(buf, "%s %ld %s %s %s :", (IsToken(cptr) ? TOK_SJOIN : MSG_SJOIN), diff --git a/src/cloak.c b/src/cloak.c index 6e5a938a4..e8f8e9ba9 100644 --- a/src/cloak.c +++ b/src/cloak.c @@ -203,7 +203,8 @@ char *hidehost(char *host) #else l[i] = ((l[i] + KEY2) ^ KEY) + KEY3; #endif - l[i] <<= 2; l[i] >>= 2; + + l[i] &= 0x3FFFFFFF; } ircsprintf(cloaked, "%lx:%lx:%lx:IP", l[2], l[1], l[0]); @@ -220,7 +221,7 @@ char *hidehost(char *host) if (!(*p)) { /* Do IPv4 cloaking here */ - strcpy(h1, host); + strlcpy(h1, host, sizeof h1); i = 0; for (i = 0, p = strtok(h1, "."); p && (i <= 3); p = strtok(NULL, "."), i++) { @@ -241,9 +242,10 @@ char *hidehost(char *host) l[4] = crc32(host, strlen(host)); l[2] = ((l[4] + KEY) ^ KEY3)^ KEY2; #endif - l[2] <<= 2; l[2] >>= 2; - l[0] <<= 1; l[0] >>= 1; - ircsprintf(cloaked, "%lX.%lX.%lX.IP", l[2], l[1], l[0]); + l[2] &= 0x3FFFFFFF; + l[0] &= 0x7FFFFFFF; + l[1] &= 0xFFFFFFFF; + snprintf(cloaked, sizeof cloaked, "%lX.%lX.%lX.IP", l[2], l[1], l[0]); return cloaked; } else @@ -265,14 +267,13 @@ char *hidehost(char *host) #else l[0] = ((crc32(host, strlen(host)) ^ KEY2) + KEY) ^ KEY3; #endif - l[0] <<= 2; - l[0] >>= 2; + l[0] &= 0x3FFFFFFF; p++; if (*p) - sprintf(cloaked, "%s-%lX.%s", hidden_host, + snprintf(cloaked, sizeof cloaked, "%s-%lX.%s", hidden_host, l[0], p); else - sprintf(cloaked, "%s-%lX", hidden_host, l[0]); + snprintf(cloaked, sizeof cloaked, "%s-%lX", hidden_host, l[0]); return cloaked; } diff --git a/src/crule.c b/src/crule.c index 8284380ef..013d3a729 100644 --- a/src/crule.c +++ b/src/crule.c @@ -613,14 +613,14 @@ int crule_parsearglist(crule_treeptr argrootp, int *next_tokp, char **ruleptr) { if ((arglen + wordlen) < (CR_MAXARGLEN - 1)) { - strcat(currarg, " "); - strcat(currarg, word); + strlcat(currarg, " ", sizeof currarg); + strlcat(currarg, word, sizeof currarg); arglen += wordlen + 1; } } else { - strcpy(currarg, word); + strlcpy(currarg, word, sizeof currarg); arglen = wordlen; } errcode = crule_gettoken(next_tokp, ruleptr); diff --git a/src/dbuf.c b/src/dbuf.c index 25c81e9e5..7438add1a 100644 --- a/src/dbuf.c +++ b/src/dbuf.c @@ -297,7 +297,7 @@ int dbuf_getmsg(dbuf *dyn, char *buf, int length) while (length > 0 && dlen > 0) { dlen--; - if (*s == '\n' /* || *s == '\r' */ ) /*let stop at \n now .. */ + if (*s == '\n' || *s == '\r' ) { copy = dyn->length - dlen; /* diff --git a/src/ircd.c b/src/ircd.c index 4453311ce..a2e0f70ca 100644 --- a/src/ircd.c +++ b/src/ircd.c @@ -85,10 +85,10 @@ int un_gid = 99; #ifndef _WIN32 extern char unreallogo[]; #endif -int SVSNOOP = 0; +int SVSNOOP = 0; extern char *buildid; time_t timeofday = 0; -int tainted = 0; +int tainted = 0; LoopStruct loop; extern aMotd *opermotd; extern aMotd *svsmotd; @@ -171,7 +171,6 @@ TS nextconnect = 1; /* time for next try_connections call */ TS nextping = 1; /* same as above for check_pings() */ TS nextdnscheck = 0; /* next time to poll dns to force timeouts */ TS nextexpire = 1; /* next expire run on the dns cache */ -TS nextkillcheck = 1; /* next time to check for nickserv kills */ TS lastlucheck = 0; #ifdef UNREAL_DEBUG @@ -208,7 +207,7 @@ VOIDSIG s_monitor(void) VOIDSIG s_die() { #ifdef _WIN32 - int i; + int i; aClient *cptr; #endif unload_all_modules(); @@ -245,7 +244,8 @@ VOIDSIG s_rehash() #endif } -void restart(char *mesg) { +void restart(char *mesg) +{ server_reboot(mesg); } @@ -253,9 +253,10 @@ VOIDSIG s_restart() { static int restarting = 0; - if (restarting == 0) - { - /* Send (or attempt to) a dying scream to oper if present */ + if (restarting == 0) { + /* + * Send (or attempt to) a dying scream to oper if present + */ restarting = 1; server_reboot("SIGINT"); @@ -265,8 +266,7 @@ VOIDSIG s_restart() VOIDSIG s_segv(void) { - char *argv[] = - { + char *argv[] = { "./.bugreport", NULL }; @@ -310,7 +310,7 @@ VOIDSIG dummy() #endif } -#endif /* _WIN32 */ +#endif /* _WIN32 */ void server_reboot(char *mesg) @@ -329,8 +329,8 @@ void server_reboot(char *mesg) (void)send_queued(cptr); #endif /* - ** fd 0 must be 'preserved' if either the -d or -i options have - ** been passed to us before restarting. + * ** fd 0 must be 'preserved' if either the -d or -i options have + * ** been passed to us before restarting. */ #ifdef HAVE_SYSLOG (void)closelog(); @@ -363,14 +363,8 @@ char *areason; EVENT(loop_event) { - if (loop.do_tkl_sweep) - { - tkl_sweep(); - loop.do_tkl_sweep = 0; - } - if (loop.do_garbage_collect == 1) - { - garbage_collect(NULL); + if (loop.do_garbage_collect == 1) { + garbage_collect(NULL); } } @@ -380,26 +374,21 @@ EVENT(garbage_collect) extern Link *freelink; Link p; int ii; - + if (loop.do_garbage_collect == 1) sendto_realops("Doing garbage collection .."); - if (freelinks > HOW_MANY_FREELINKS_ALLOWED) - { + if (freelinks > HOW_MANY_FREELINKS_ALLOWED) { ii = freelinks; - while (freelink - && (freelinks > HOW_MANY_FREELINKS_ALLOWED)) - { + while (freelink && (freelinks > HOW_MANY_FREELINKS_ALLOWED)) { freelinks--; p.next = freelink; freelink = freelink->next; MyFree(p.next); } - if (loop.do_garbage_collect == 1) - { + if (loop.do_garbage_collect == 1) { loop.do_garbage_collect = 0; sendto_realops - ("Cleaned up %i garbage blocks", - (ii - freelinks)); + ("Cleaned up %i garbage blocks", (ii - freelinks)); } } if (loop.do_garbage_collect == 1) @@ -426,23 +415,23 @@ static TS try_connections(TS currenttime) connecting = FALSE; Debug((DEBUG_NOTICE, "Connection check at : %s", myctime(currenttime))); - for (aconf = conf_link; aconf; aconf = (ConfigItem_link *) aconf->next) - { - /* Also when already connecting! (update holdtimes) --SRB */ + for (aconf = conf_link; aconf; aconf = (ConfigItem_link *) aconf->next) { + /* + * Also when already connecting! (update holdtimes) --SRB + */ if (!(aconf->options & CONNECT_AUTO)) continue; cltmp = aconf->class; /* - ** Skip this entry if the use of it is still on hold until - ** future. Otherwise handle this entry (and set it on hold - ** until next time). Will reset only hold times, if already - ** made one successfull connection... [this algorithm is - ** a bit fuzzy... -- msa >;) ] + * ** Skip this entry if the use of it is still on hold until + * ** future. Otherwise handle this entry (and set it on hold + * ** until next time). Will reset only hold times, if already + * ** made one successfull connection... [this algorithm is + * ** a bit fuzzy... -- msa >;) ] */ - if ((aconf->hold > currenttime)) - { + if ((aconf->hold > currenttime)) { if ((next > aconf->hold) || (next == 0)) next = aconf->hold; continue; @@ -451,14 +440,15 @@ static TS try_connections(TS currenttime) confrq = cltmp->connfreq; aconf->hold = currenttime + confrq; /* - ** Found a CONNECT config with port specified, scan clients - ** and see if this server is already connected? + * ** Found a CONNECT config with port specified, scan clients + * ** and see if this server is already connected? */ cptr = find_name(aconf->servername, (aClient *)NULL); - if (!cptr && (cltmp->clients < cltmp->maxclients)) - { - /* Check connect rules to see if we're allowed to try */ + if (!cptr && (cltmp->clients < cltmp->maxclients)) { + /* + * Check connect rules to see if we're allowed to try + */ for (deny = conf_deny_link; deny; deny = (ConfigItem_deny_link *) deny->next) if (!match(deny->mask, aconf->servername) @@ -467,7 +457,8 @@ static TS try_connections(TS currenttime) if (connect_server(aconf, (aClient *)NULL, (struct hostent *)NULL) == 0) - sendto_realops("Connection to %s[%s] activated.", + sendto_realops + ("Connection to %s[%s] activated.", aconf->servername, aconf->hostname); } @@ -483,34 +474,48 @@ static TS try_connections(TS currenttime) AKILL/RAKILL/KLINE/UNKLINE/REHASH. Very significant CPU usage decrease. -- Barubary */ -extern TS check_pings(TS currenttime, int check_kills) -{ - aClient *cptr; - ConfigItem_ban *bconf = NULL; - int ping = 0, killflag = 0, i = 0; - TS oldest = 0; - static char banbuf[1024]; - for (i = 0; i <= LastSlot; i++) - { - /* If something we should not touch .. */ + +extern TS check_pings(TS currenttime) +{ + aClient *cptr = NULL; + ConfigItem_ban *bconf = NULL; + char killflag = 0; + int i = 0; + char banbuf[1024]; + int ping = 0; + TS oldest = 0; + + for (i = 0; i <= LastSlot; i++) { + /* + * If something we should not touch .. + */ if (!(cptr = local[i]) || IsMe(cptr) || IsLog(cptr)) continue; /* - ** Note: No need to notify opers here. It's - ** already done when "FLAGS_DEADSOCKET" is set. + * ** Note: No need to notify opers here. It's + * ** already done when "FLAGS_DEADSOCKET" is set. */ - if (cptr->flags & FLAGS_DEADSOCKET) - { + if (cptr->flags & FLAGS_DEADSOCKET) { (void)exit_client(cptr, cptr, &me, "Dead socket"); continue; } - bconf = NULL; - if (check_kills) - { - if (IsPerson(cptr)) - { + killflag = 0; + /* + * Check if user is banned + */ + if (loop.do_bancheck) { + if (find_tkline_match(cptr, 0) < 0) { + /* + * Client exited + */ + continue; + } + if (!killflag && IsPerson(cptr)) { + /* + * If it's a user, we check for CONF_BAN_USER + */ bconf = Find_ban(make_user_host(cptr-> user ? cptr->user->username : cptr-> @@ -518,86 +523,78 @@ extern TS check_pings(TS currenttime, int check_kills) cptr->user ? cptr->user->realhost : cptr-> sockhost), CONF_BAN_USER); if (bconf) - killflag = 1; - else - killflag = 0; - } - } - else - killflag = 0; + killflag++; + + if (!killflag && !IsAnOper(cptr) && + (bconf = + Find_ban(cptr->info, CONF_BAN_REALNAME))) { + killflag++; + } - if (check_kills && !killflag && IsPerson(cptr)) - { - if ((bconf = - Find_ban(inetntoa((char *)&cptr->ip), CONF_BAN_IP))) - { - killflag = 1; - } - if (bconf) - killflag = 1; - if (find_tkline_match(cptr, 0) < 0) - { - continue; } - if (!IsAnOper(cptr) - && (bconf = - Find_ban(cptr->info, CONF_BAN_REALNAME))) - { - killflag = 1; - } - } - if (killflag) - { - if (IsPerson(cptr)) - { - sendto_realops - ("Kill line active for %s (%s)", - get_client_name(cptr, FALSE), - bconf ? - bconf-> - reason ? bconf->reason : "no reason" : - "no reason"); - if (bconf && bconf->reason) - { - ircsprintf(banbuf, - "User has been banned (%s)", - bconf->reason); + /* + * If no cookie, we search for Z:lines + */ + if (!killflag) + if ((bconf = + Find_ban(Inet_ia2p(&cptr->ip), + CONF_BAN_IP))) + killflag++; + if (killflag) { + if (IsPerson(cptr)) + sendto_realops("Ban active for %s (%s)", + get_client_name(cptr, FALSE), + bconf->reason ? bconf-> + reason : "no reason"); + + if (IsServer(cptr)) + sendto_realops + ("Ban active for server %s (%s)", + get_client_name(cptr, FALSE), + bconf->reason ? bconf-> + reason : "no reason"); + if (bconf->reason) { + if (IsPerson(cptr)) + snprintf(banbuf, + sizeof banbuf - 1, + "User has been banned (%s)", + bconf->reason); + snprintf(banbuf, sizeof banbuf - 1, + "Banned (%s)", bconf->reason); (void)exit_client(cptr, cptr, &me, banbuf); + } else { + if (IsPerson(cptr)) + (void)exit_client(cptr, cptr, + &me, + "User has been banned"); + else + (void)exit_client(cptr, cptr, + &me, "Banned"); } - else - { - (void)exit_client(cptr, cptr, &me, - "User has been banned"); - } + continue; } - else - { - exit_client(cptr, cptr, &me, "Banned"); - } - continue; + } - /* If we go here, its a ping timeout */ + /* + * We go into ping phase + */ ping = IsRegistered(cptr) ? (cptr->class ? cptr-> class->pingfreq : CONNECTTIMEOUT) : CONNECTTIMEOUT; Debug((DEBUG_DEBUG, "c(%s)=%d p %d k %d a %d", cptr->name, cptr->status, ping, killflag, currenttime - cptr->lasttime)); - if (ping < (currenttime - cptr->lasttime)) - { + if (ping < (currenttime - cptr->lasttime)) { if (((cptr->flags & FLAGS_PINGSENT) && ((currenttime - cptr->lasttime) >= (2 * ping))) || ((!IsRegistered(cptr) && (currenttime - cptr->since) >= ping))) - { if (!IsRegistered(cptr) && (DoingDNS(cptr) || DoingAuth(cptr) - )) - { - if (cptr->authfd >= 0) - { + )) { + if (cptr->authfd >= 0) { CLOSE_SOCK(cptr->authfd); --OpenFiles; cptr->authfd = -1; @@ -616,7 +613,7 @@ extern TS check_pings(TS currenttime, int check_kills) "DNS/AUTH timeout %s", get_client_name(cptr, TRUE))); del_queries((char *)cptr); - ClearAuth(cptr); + ClearAuth(cptr); ClearDNS(cptr); SetAccess(cptr); cptr->firsttime = currenttime; @@ -624,8 +621,7 @@ extern TS check_pings(TS currenttime, int check_kills) continue; } if (IsServer(cptr) || IsConnecting(cptr) || - IsHandshake(cptr)) - { + IsHandshake(cptr)) { sendto_realops ("No response from %s, closing link", get_client_name(cptr, FALSE)); @@ -636,24 +632,23 @@ extern TS check_pings(TS currenttime, int check_kills) } exit_client(cptr, cptr, &me, "Ping timeout"); continue; - } - else if (IsRegistered(cptr) && - ((cptr->flags & FLAGS_PINGSENT) == 0)) - { + } else if (IsRegistered(cptr) && + ((cptr->flags & FLAGS_PINGSENT) == 0)) { /* * if we havent PINGed the connection and we havent * heard from it in a while, PING it to make sure * it is still alive. */ cptr->flags |= FLAGS_PINGSENT; - /* not nice but does the job */ + /* + * not nice but does the job + */ cptr->lasttime = currenttime - ping; sendto_one(cptr, "%s :%s", IsToken(cptr) ? TOK_PING : MSG_PING, me.name); } } - /* * Check UNKNOWN connections - if they have been in this state * for > 100s, close them. @@ -664,27 +659,27 @@ extern TS check_pings(TS currenttime, int check_kills) (void)exit_client(cptr, cptr, &me, "Connection Timed Out"); } - - /* EXPLANATION - * on a server with a large volume of clients, at any given point - * there may be a client which needs to be pinged the next second, - * or even right away (a second may have passed while running - * check_pings). Preserving CPU time is more important than - * pinging clients out at exact times, IMO. Therefore, I am going to make - * check_pings always return currenttime + 9. This means that it may take - * a user up to 9 seconds more than pingfreq to timeout. Oh well. - * Plus, the number is 9 to 'stagger' our check_pings calls out over - * time, to avoid doing it and the other tasks ircd does at the same time - * all the time (which are usually done on intervals of 5 seconds or so). - * - lucas - * + /* + * EXPLANATION + * * on a server with a large volume of clients, at any given point + * * there may be a client which needs to be pinged the next second, + * * or even right away (a second may have passed while running + * * check_pings). Preserving CPU time is more important than + * * pinging clients out at exact times, IMO. Therefore, I am going to make + * * check_pings always return currenttime + 9. This means that it may take + * * a user up to 9 seconds more than pingfreq to timeout. Oh well. + * * Plus, the number is 9 to 'stagger' our check_pings calls out over + * * time, to avoid doing it and the other tasks ircd does at the same time + * * all the time (which are usually done on intervals of 5 seconds or so). + * * - lucas + * * */ - - oldest = currenttime + 9; + if (loop.do_bancheck) + loop.do_bancheck = 0; Debug((DEBUG_NOTICE, "Next check_ping() call at: %s, %d %d %d", - myctime(oldest), ping, oldest, currenttime)); + myctime(currenttime+9), ping, currenttime+9, currenttime)); - return oldest; + return currenttime + 9; } /* @@ -701,7 +696,8 @@ static int bad_command(void) #define CMDLINE_CFG "" #endif (void)printf - ("Usage: ircd %s[-h servername] [-p portnumber] [-x loglevel] [-t] [-H]\n",CMDLINE_CFG); + ("Usage: ircd %s[-h servername] [-p portnumber] [-x loglevel] [-t] [-H]\n", + CMDLINE_CFG); (void)printf("Server not started\n\n"); #else MessageBox(NULL, @@ -715,19 +711,17 @@ char chess[] = { 85, 110, 114, 101, 97, 108, 0 }; #ifndef NO_FDLIST -inline TS check_fdlists(TS now) +inline TS check_fdlists(TS now) { aClient *cptr; int pri; /* temp. for priority */ int i, j; j = 0; - for (i = LastSlot; i >= 0; i--) - { + for (i = LastSlot; i >= 0; i--) { if (!(cptr = local[i])) continue; if (IsServer(cptr) || IsListening(cptr) - || IsOper(cptr) || DoingAuth(cptr)) - { + || IsOper(cptr) || DoingAuth(cptr)) { busycli_fdlist.entry[++j] = i; continue; } @@ -748,6 +742,7 @@ inline TS check_fdlists(TS now) busycli_fdlist.last_entry = j; /* rest of the fdlist is garbage */ return (now + FDLISTCHKFREQ + lifesux * FDLISTCHKFREQ); } + EVENT(e_check_fdlists) { check_fdlists(TStime()); @@ -758,9 +753,9 @@ EVENT(e_check_fdlists) extern time_t TSoffset; #ifndef _WIN32 -int main(int argc, char *argv[]) +int main(int argc, char *argv[]) #else -int InitwIRCD(int argc, char *argv[]) +int InitwIRCD(int argc, char *argv[]) #endif { #ifdef _WIN32 @@ -791,14 +786,12 @@ int InitwIRCD(int argc, char *argv[]) # endif #endif #ifdef CHROOTDIR - if (chdir(dpath)) - { + if (chdir(dpath)) { perror("chdir"); exit(-1); } ircd_res_init(); - if (chroot(DPATH)) - { + if (chroot(DPATH)) { (void)fprintf(stderr, "ERROR: Cannot chdir/chroot\n"); exit(5); } @@ -820,27 +813,22 @@ int InitwIRCD(int argc, char *argv[]) printf("unlimit core size failed; errno = %d\n", errno); #endif /* - ** All command line parameters have the syntax "-fstring" - ** or "-f string" (e.g. the space is optional). String may - ** be empty. Flag characters cannot be concatenated (like - ** "-fxyz"), it would conflict with the form "-fstring". + * ** All command line parameters have the syntax "-fstring" + * ** or "-f string" (e.g. the space is optional). String may + * ** be empty. Flag characters cannot be concatenated (like + * ** "-fxyz"), it would conflict with the form "-fstring". */ - while (--argc > 0 && (*++argv)[0] == '-') - { + while (--argc > 0 && (*++argv)[0] == '-') { char *p = argv[0] + 1; int flag = *p++; - if (flag == '\0' || *p == '\0') - { - if (argc > 1 && argv[1][0] != '-') - { + if (flag == '\0' || *p == '\0') { + if (argc > 1 && argv[1][0] != '-') { p = *++argv; argc -= 1; - } - else + } else p = ""; } - switch (flag) - { + switch (flag) { #ifndef _WIN32 case 'a': bootopt |= BOOT_AUTODIE; @@ -869,42 +857,43 @@ int InitwIRCD(int argc, char *argv[]) break; #endif case 'h': - if (!strchr(p, '.')) - { + if (!strchr(p, '.')) { (void)printf ("ERROR: %s is not valid: Server names must contain at least 1 \".\"\n", - p); exit(1); + p); + exit(1); } strncpyzt(me.name, p, sizeof(me.name)); break; #endif #ifndef _WIN32 - case 'P': { + case 'P':{ short type; char *result; srandom(TStime()); if ((type = Auth_FindType(p)) == -1) { - printf("No such auth type %s\n", p); - exit(0); + printf("No such auth type %s\n", p); + exit(0); } p = *++argv; argc--; if (!(result = Auth_Make(type, p))) { - printf("Authentication failed\n"); - exit(0); + printf("Authentication failed\n"); + exit(0); } printf("Encrypted password is: %s\n", result); exit(0); } -#endif - +#endif + case 'p': if ((portarg = atoi(p)) > 0) portnum = portarg; break; case 's': - (void)printf("sizeof(aClient) == %u\n", sizeof(aClient)); + (void)printf("sizeof(aClient) == %u\n", + sizeof(aClient)); (void)printf("sizeof(aChannel) == %u\n", sizeof(aChannel)); (void)printf("sizeof(aServer) == %u\n", @@ -917,7 +906,8 @@ int InitwIRCD(int argc, char *argv[]) (void)printf("sizeof(struct ircstatsx) == %u\n", sizeof(struct ircstatsx)); (void)printf("aClient remote == %u\n", - CLIENT_REMOTE_SIZE); exit(0); + CLIENT_REMOTE_SIZE); + exit(0); break; #ifndef _WIN32 case 't': @@ -932,19 +922,19 @@ int InitwIRCD(int argc, char *argv[]) "UnrealIRCD/Win32 version", MB_OK); #endif exit(0); - case 'W': { - struct IN_ADDR bah; - int bit; - parse_netmask("255.255.255.255/8", &bah, &bit); - printf("%s - %d\n",Inet_ia2p(&bah), bit); - flag_add("m"); - flag_del('m'); - flag_add("n"); - flag_add("m"); - flag_del('m'); - printf("%s\n", extraflags); - exit(0); - } + case 'W':{ + struct IN_ADDR bah; + int bit; + parse_netmask("255.255.255.255/8", &bah, &bit); + printf("%s - %d\n", Inet_ia2p(&bah), bit); + flag_add("m"); + flag_del('m'); + flag_add("n"); + flag_add("m"); + flag_del('m'); + printf("%s\n", extraflags); + exit(0); + } case 'C': conf_debuglevel = atoi(p); break; @@ -976,8 +966,7 @@ int InitwIRCD(int argc, char *argv[]) } #ifndef CHROOT - if (chdir(dpath)) - { + if (chdir(dpath)) { # ifndef _WIN32 perror("chdir"); # else @@ -989,8 +978,7 @@ int InitwIRCD(int argc, char *argv[]) #endif #if !defined(IRC_UID) && !defined(_WIN32) - if ((uid != euid) && !euid) - { + if ((uid != euid) && !euid) { (void)fprintf(stderr, "ERROR: do not run ircd setuid root. Make it setuid a\ normal user.\n"); @@ -1008,40 +996,47 @@ int InitwIRCD(int argc, char *argv[]) * Modified 13/2000 DrBin * We need to have better controll over running as root ... see config.h */ - if ((int)getuid() == 0) - { + if ((int)getuid() == 0) { #ifndef BIG_SECURITY_HOLE - if ((IRC_UID == 0) || (IRC_GID == 0)) - { - (void)fprintf(stderr, "ERROR: SETUID and SETGID have not been set properly" + if ((IRC_UID == 0) || (IRC_GID == 0)) { + (void)fprintf(stderr, + "ERROR: SETUID and SETGID have not been set properly" "\nPlease read your documentation\n(HINT:SETUID or SETGID can not be 0)\n"); exit(-1); - } - else - { - /* run as a specified user */ + } else { + /* + * run as a specified user + */ - (void)fprintf(stderr, "WARNING: ircd invoked as root\n"); - (void)fprintf(stderr, " changing to uid %d\n", IRC_UID); - (void)fprintf(stderr, " changing to gid %d\n", IRC_GID); + (void)fprintf(stderr, + "WARNING: ircd invoked as root\n"); + (void)fprintf(stderr, " changing to uid %d\n", + IRC_UID); + (void)fprintf(stderr, " changing to gid %d\n", + IRC_GID); (void)setgid(IRC_GID); - (void)setuid(IRC_UID); + (void)setuid(IRC_UID); } #else - /* check for setuid root as usual */ + /* + * check for setuid root as usual + */ (void)fprintf(stderr, "ERROR: do not run ircd setuid root. Make it setuid a\ normal user.\n"); exit(-1); # endif } -#endif /*CHROOTDIR/UID/GID/_WIN32 */ +#endif /*CHROOTDIR/UID/GID/_WIN32 */ #ifndef _WIN32 - /* didn't set debuglevel */ - /* but asked for debugging output to tty */ - if ((debuglevel < 0) && (bootopt & BOOT_TTY)) - { + /* + * didn't set debuglevel + */ + /* + * but asked for debugging output to tty + */ + if ((debuglevel < 0) && (bootopt & BOOT_TTY)) { (void)fprintf(stderr, "you specified -t without -x. use -x \n"); exit(-1); @@ -1051,7 +1046,7 @@ int InitwIRCD(int argc, char *argv[]) if (argc > 0) return bad_command(); /* This should exit out */ #ifndef _WIN32 - fprintf(stderr, unreallogo); + fprintf(stderr, "%s", unreallogo); #endif fprintf(stderr, " v%s\n\n", VERSIONONLY); clear_client_hash_table(); @@ -1065,20 +1060,23 @@ int InitwIRCD(int argc, char *argv[]) booted = FALSE; /* Hack to stop people from being able to read the config file */ #if !defined(_WIN32) && !defined(_AMIGA) && DEFAULT_PERMISSIONS != 0 - chmod(CPATH,DEFAULT_PERMISSIONS); + chmod(CPATH, DEFAULT_PERMISSIONS); #endif init_dynconf(); -#ifdef STATIC_LINKING +#ifdef STATIC_LINKING { ModuleInfo ModCoreInfo; ModCoreInfo.size = sizeof(ModuleInfo); ModCoreInfo.module_load = 0; ModCoreInfo.handle = NULL; - l_commands_Init(&ModCoreInfo); + l_commands_Init(&ModCoreInfo); } #endif - /* Add default class */ - default_class = (ConfigItem_class *) MyMallocEx(sizeof(ConfigItem_class)); + /* + * Add default class + */ + default_class = + (ConfigItem_class *) MyMallocEx(sizeof(ConfigItem_class)); default_class->flag.permanent = 1; default_class->pingfreq = PINGFREQUENCY; default_class->maxclients = 100; @@ -1123,10 +1121,14 @@ int InitwIRCD(int argc, char *argv[]) #ifdef HAVE_SYSLOG openlog("ircd", LOG_PID | LOG_NDELAY, LOG_DAEMON); #endif - /* Put in our info */ + /* + * Put in our info + */ strncpyzt(me.info, conf_me->info, sizeof(me.info)); strncpyzt(me.name, conf_me->name, sizeof(me.name)); - /* We accept the first listen record */ + /* + * We accept the first listen record + */ portnum = conf_listen->port; /* * This is completely unneeded-Sts @@ -1153,7 +1155,9 @@ int InitwIRCD(int argc, char *argv[]) me.user = NULL; me.from = &me; me.class = (ConfigItem_class *) conf_listen; - /* This listener will never go away */ + /* + * This listener will never go away + */ conf_listen->clients++; me_hash = find_or_add(me.name); me.serv->up = me_hash; @@ -1184,6 +1188,7 @@ int InitwIRCD(int argc, char *argv[]) write_pidfile(); Debug((DEBUG_NOTICE, "Server ready...")); SetupEvents(); + loop.do_bancheck = 0; loop.ircd_booted = 1; #if defined(HAVE_SETPROCTITLE) setproctitle("%s", me.name); @@ -1196,14 +1201,12 @@ int InitwIRCD(int argc, char *argv[]) #endif module_loadall(0); #ifdef STATIC_LINKING - l_commands_Load(0); + l_commands_Load(0); #endif #ifndef NO_FDLIST check_fdlists(TStime()); #endif - nextkillcheck = TStime() + (TS)1; - #ifdef _WIN32 return 1; @@ -1218,9 +1221,13 @@ void SocketLoop(void *dummy) #ifndef NO_FDLIST TS nextfdlistcheck = 0; /*end of priority code */ #endif - + while (1) #else + /* + * Forever drunk .. forever drunk .. + * * (Sorry Alphaville.) + */ for (;;) #endif { @@ -1228,17 +1235,17 @@ void SocketLoop(void *dummy) oldtimeofday = timeofday; timeofday = time(NULL) + TSoffset; - if (timeofday - oldtimeofday < 0) - { - sendto_realops("Time running backwards! %i-%i<0", timeofday, oldtimeofday); + if (timeofday - oldtimeofday < 0) { + sendto_realops("Time running backwards! %i-%i<0", + timeofday, oldtimeofday); } LockEventSystem(); DoEvents(); UnlockEventSystem(); /* - ** Run through the hashes and check lusers every - ** second - ** also check for expiring glines + * ** Run through the hashes and check lusers every + * ** second + * ** also check for expiring glines */ #ifndef NO_FDLIST @@ -1250,26 +1257,26 @@ void SocketLoop(void *dummy) if (IRCstats.me_clients > IRCstats.me_max) IRCstats.me_max = IRCstats.me_clients; /* - ** We only want to connect if a connection is due, - ** not every time through. Note, if there are no - ** active C lines, this call to Tryconnections is - ** made once only; it will return 0. - avalon + * ** We only want to connect if a connection is due, + * ** not every time through. Note, if there are no + * ** active C lines, this call to Tryconnections is + * ** made once only; it will return 0. - avalon */ if (nextconnect && timeofday >= nextconnect) nextconnect = try_connections(timeofday); /* - ** DNS checks. One to timeout queries, one for cache expiries. + * ** DNS checks. One to timeout queries, one for cache expiries. */ if (timeofday >= nextdnscheck) nextdnscheck = timeout_query_list(timeofday); if (timeofday >= nextexpire) nextexpire = expire_cache(timeofday); - /* - ** take the smaller of the two 'timed' event times as - ** the time of next event (stops us being late :) - avalon - ** WARNING - nextconnect can return 0! - */ - if (nextconnect) + /* + * ** take the smaller of the two 'timed' event times as + * ** the time of next event (stops us being late :) - avalon + * ** WARNING - nextconnect can return 0! + */ + if (nextconnect) delay = MIN(nextping, nextconnect); else delay = nextping; @@ -1277,13 +1284,13 @@ void SocketLoop(void *dummy) delay = MIN(nextexpire, delay); delay -= timeofday; /* - ** Adjust delay to something reasonable [ad hoc values] - ** (one might think something more clever here... --msa) - ** We don't really need to check that often and as long - ** as we don't delay too long, everything should be ok. - ** waiting too long can cause things to timeout... - ** i.e. PINGS -> a disconnection :( - ** - avalon + * ** Adjust delay to something reasonable [ad hoc values] + * ** (one might think something more clever here... --msa) + * ** We don't really need to check that often and as long + * ** as we don't delay too long, everything should be ok. + * ** waiting too long can cause things to timeout... + * ** i.e. PINGS -> a disconnection :( + * ** - avalon */ if (delay < 1) delay = 1; @@ -1294,59 +1301,59 @@ void SocketLoop(void *dummy) #else (void)read_message(0, &serv_fdlist); /* servers */ (void)read_message(1, &busycli_fdlist); /* busy clients */ - if (lifesux) - { + if (lifesux) { static time_t alllasttime = 0; (void)read_message(1, &serv_fdlist); - /* read servs more often */ - if (lifesux > 9) /* life really sucks */ - { + /* + * read servs more often + */ + if (lifesux > 9) { /* life really sucks */ (void)read_message(1, &busycli_fdlist); (void)read_message(1, &serv_fdlist); } flush_fdlist_connections(&serv_fdlist); timeofday = time(NULL) + TSoffset; - if ((alllasttime + (lifesux + 1)) > timeofday) - { + if ((alllasttime + (lifesux + 1)) > timeofday) { read_message(delay, NULL); /* check everything */ alllasttime = timeofday; } - } - else - { + } else { read_message(delay, NULL); /* check everything */ } #endif - /*Debug((DEBUG_DEBUG, "Got message(s)")); */ /* - ** ...perhaps should not do these loops every time, - ** but only if there is some chance of something - ** happening (but, note that conf->hold times may - ** be changed elsewhere--so precomputed next event - ** time might be too far away... (similarly with - ** ping times) --msa + * Debug((DEBUG_DEBUG, "Got message(s)")); + */ + /* + * ** ...perhaps should not do these loops every time, + * ** but only if there is some chance of something + * ** happening (but, note that conf->hold times may + * ** be changed elsewhere--so precomputed next event + * ** time might be too far away... (similarly with + * ** ping times) --msa */ #ifdef NO_FDLIST - if (timeofday >= nextping) + if (timeofday >= nextping || loop.do_bancheck) #else - if (timeofday >= nextping && !lifesux) + if ((timeofday >= nextping && !lifesux) || loop.do_bancheck) #endif - nextping = check_pings(timeofday, 0); - if (dorehash) - { + nextping = check_pings(timeofday); + if (dorehash) { (void)rehash(&me, &me, 1); dorehash = 0; } /* - ** Flush output buffers on all connections timeofday if they - ** have data in them (or at least try to flush) - ** -avalon + * ** Flush output buffers on all connections timeofday if they + * ** have data in them (or at least try to flush) + * ** -avalon */ #ifndef NO_FDLIST - /* check which clients are active */ + /* + * check which clients are active + */ if (timeofday > nextfdlistcheck) nextfdlistcheck = check_fdlists(timeofday); #endif @@ -1369,33 +1376,32 @@ static void open_debugfile(void) #ifdef DEBUGMODE int fd; aClient *cptr; - if (debuglevel >= 0) - { + if (debuglevel >= 0) { cptr = make_client(NULL, NULL); cptr->fd = 2; SetLog(cptr); cptr->port = debuglevel; cptr->flags = 0; cptr->listener = cptr; - /* local[2] = cptr; winlocal */ - (void)strcpy(cptr->sockhost, me.sockhost); + /* + * local[2] = cptr; winlocal + */ + (void)strlcpy(cptr->sockhost, me.sockhost, + sizeof cptr->sockhost); # ifndef _WIN32 (void)printf("isatty = %d ttyname = %#x\n", isatty(2), (u_int)ttyname(2)); - if (!(bootopt & BOOT_TTY)) /* leave debugging output on fd 2 */ - { + if (!(bootopt & BOOT_TTY)) { /* leave debugging output on fd 2 */ (void)truncate(LOGFILE, 0); if ((fd = open(LOGFILE, O_WRONLY | O_CREAT, 0600)) < 0) if ((fd = open("/dev/null", O_WRONLY)) < 0) exit(-1); - if (fd != 2) - { + if (fd != 2) { (void)dup2(fd, 2); (void)close(fd); } strncpyzt(cptr->name, LOGFILE, sizeof(cptr->name)); - } - else if (isatty(2) && ttyname(2)) + } else if (isatty(2) && ttyname(2)) strncpyzt(cptr->name, ttyname(2), sizeof(cptr->name)); else # endif @@ -1403,11 +1409,12 @@ static void open_debugfile(void) Debug((DEBUG_FATAL, "Debug: File <%s> Level: %d at %s", cptr->name, cptr->port, myctime(time(NULL)))); - } - else - /* local[2] = NULL; winlocal */ + } else + /* + * local[2] = NULL; winlocal + */ #endif - return; + return; } static void setup_signals() @@ -1463,13 +1470,13 @@ static void setup_signals() #endif #ifdef RESTARTING_SYSTEMCALLS /* - ** At least on Apollo sr10.1 it seems continuing system calls - ** after signal is the default. The following 'siginterrupt' - ** should change that default to interrupting calls. + * ** At least on Apollo sr10.1 it seems continuing system calls + * ** after signal is the default. The following 'siginterrupt' + * ** should change that default to interrupting calls. */ (void)siginterrupt(SIGALRM, 1); #endif #else - (void)signal(SIGSEGV,CleanUpSegv); + (void)signal(SIGSEGV, CleanUpSegv); #endif } diff --git a/src/modules/m_akill.c b/src/modules/m_akill.c index b2c7f8acc..8010a283e 100644 --- a/src/modules/m_akill.c +++ b/src/modules/m_akill.c @@ -211,7 +211,6 @@ DLLFUNC int m_akill(aClient *cptr, aClient *sptr, int parc, char *parv[]) sendto_serv_butone(cptr, ":%s AKILL %s %s", IsServer(cptr) ? parv[0] : me.name, hostmask, usermask); - - check_pings(TStime(), 1); + loop.do_bancheck = 1; return 0; } diff --git a/src/modules/m_guest.c b/src/modules/m_guest.c index 1742d1758..f3a7ba01e 100644 --- a/src/modules/m_guest.c +++ b/src/modules/m_guest.c @@ -114,20 +114,20 @@ int m_guest_Unload(int module_unload) DLLFUNC int m_guest(aClient *cptr, aClient *sptr, int parc, char *parv[]) { -int randnum; -char guestnick[NICKLEN]; -char *param[2]; + int randnum; + char guestnick[NICKLEN]; + char *param[2]; -randnum = 1+(int) (99999.0*rand()/(RAND_MAX+10000.0)); -snprintf(guestnick, NICKLEN, "Guest%d", randnum); + randnum = 1+(int) (99999.0*rand()/(RAND_MAX+10000.0)); + snprintf(guestnick, NICKLEN, "Guest%d", randnum); -while(find_client(guestnick, (aClient *)NULL)) -{ -randnum = 1+(int) (99999.0*rand()/(RAND_MAX+10000.0)); -snprintf(guestnick, NICKLEN, "Guest%d", randnum); -} -param[0] = sptr->name; -param[1] = guestnick; -m_nick(sptr,cptr,2,param); + while(find_client(guestnick, (aClient *)NULL)) + { + randnum = 1+(int) (99999.0*rand()/(RAND_MAX+10000.0)); + snprintf(guestnick, NICKLEN, "Guest%d", randnum); + } + param[0] = sptr->name; + param[1] = guestnick; + m_nick(sptr,cptr,2,param); return 0; } diff --git a/src/modules/m_kill.c b/src/modules/m_kill.c index 59a42d57c..d55719a18 100644 --- a/src/modules/m_kill.c +++ b/src/modules/m_kill.c @@ -151,7 +151,7 @@ DLLFUNC int m_kill(aClient *cptr, aClient *sptr, int parc, char *parv[]) user = parv[1]; path = parv[2]; /* Either defined or NULL (parc >= 2!!) */ - strcpy(inpath, oinpath); + strlcpy(inpath, oinpath, sizeof inpath); #ifndef ROXnet if (IsServer(cptr) && (s = (char *)index(inpath, '.')) != NULL) @@ -245,9 +245,9 @@ DLLFUNC int m_kill(aClient *cptr, aClient *sptr, int parc, char *parv[]) ** ...!operhost!oper ** ...!operhost!oper (comment) */ - strcpy(inpath, + strlcpy(inpath, IsHidden(cptr) ? cptr->user->virthost : cptr->user-> - realhost); + realhost, sizeof inpath); if (kcount < 2) { /* Only check the path the first time around, or it gets appended to itself. */ if (!BadPtr(path)) diff --git a/src/modules/m_kline.c b/src/modules/m_kline.c index 27978a114..601e1d71b 100644 --- a/src/modules/m_kline.c +++ b/src/modules/m_kline.c @@ -148,11 +148,9 @@ DLLFUNC int m_kline(aClient *cptr, aClient *sptr, int parc, char *parv[]) { *hosttemp = 0; hosttemp++; - bzero(name, sizeof(name)); - bzero(uhost, sizeof(uhost)); + strlcpy(name, parv[1], sizeof name); + strlcpy(uhost, hosttemp, sizeof uhost); - strncpy(name, parv[1], sizeof(name) - 1); - strncpy(uhost, hosttemp, sizeof(uhost) - 1); if (name[0] == '\0' || uhost[0] == '\0') { @@ -200,7 +198,7 @@ DLLFUNC int m_kline(aClient *cptr, aClient *sptr, int parc, char *parv[]) if (!acptr->user) return 0; - strcpy(name, acptr->user->username); + strlcpy(name, acptr->user->username, sizeof name); if (MyClient(acptr)) host = acptr->sockhost; else @@ -217,8 +215,14 @@ DLLFUNC int m_kline(aClient *cptr, aClient *sptr, int parc, char *parv[]) /* Add some wildcards */ + /* + * sscanf is bad :/ at least make host < uhost + */ + if (strlen(host) > sizeof uhost) + host[sizeof uhost - 1] = '\0'; + + strlcpy(uhost, host, sizeof uhost); - strcpy(uhost, host); if (isdigit(host[strlen(host) - 1])) { if (sscanf(host, "%d.%d.%d.%*d", &ip1, &ip2, &ip3)) @@ -242,6 +246,6 @@ DLLFUNC int m_kline(aClient *cptr, aClient *sptr, int parc, char *parv[]) bconf->reason = parv[2] ? strdup(parv[2]) : NULL; bconf->flag.type2 = CONF_BAN_TYPE_TEMPORARY; AddListItem(bconf, conf_ban); - check_pings(TStime(), 1); + loop.do_bancheck = 1; return 0; } diff --git a/src/modules/m_oper.c b/src/modules/m_oper.c index 9506957a8..d80836477 100644 --- a/src/modules/m_oper.c +++ b/src/modules/m_oper.c @@ -69,8 +69,6 @@ static oper_oflag_t oper_oflags[] = { "is now a co administrator (C)" }, { OFLAG_ISGLOBAL, &UMODE_OPER, &oper_host, "is now an operator (O)" }, -/* { 0xFFFFFFFF, &UMODE_LOCOP, &locop_host, - "is now a local operator (o)" }, */ { OFLAG_HELPOP, &UMODE_HELPOP, 0 , 0 }, { OFLAG_GLOBOP, &UMODE_FAILOP, 0 , @@ -79,8 +77,6 @@ static oper_oflag_t oper_oflags[] = { 0 }, { OFLAG_WHOIS, &UMODE_WHOIS, 0 , 0 }, - { OFLAG_HIDE, &UMODE_HIDE, 0 , - 0 }, { 0, 0, 0 , 0 }, }; @@ -192,8 +188,8 @@ DLLFUNC int m_oper(aClient *cptr, aClient *sptr, int parc, char *parv[]) { sptr->since += 7; return 0; } - strcpy(nuhhost, make_user_host(sptr->user->username, sptr->user->realhost)); - strcpy(nuhhost2, make_user_host(sptr->user->username, Inet_ia2p(&sptr->ip))); + strlcpy(nuhhost, make_user_host(sptr->user->username, sptr->user->realhost), sizeof(nuhhost)); + strlcpy(nuhhost2, make_user_host(sptr->user->username, Inet_ia2p(&sptr->ip)), sizeof(nuhhost2)); for (oper_from = (ConfigItem_oper_from *) aconf->from; oper_from; oper_from = (ConfigItem_oper_from *) oper_from->next) if (!match(oper_from->name, nuhhost) || !match(oper_from->name, nuhhost2)) @@ -256,6 +252,7 @@ DLLFUNC int m_oper(aClient *cptr, aClient *sptr, int parc, char *parv[]) { if ((aconf->oflags & OFLAG_HIDE) && iNAH && !BadPtr(host)) { iNAH_host(sptr, host); + SetHidden(sptr); } if (!IsOper(sptr)) diff --git a/src/modules/m_rakill.c b/src/modules/m_rakill.c index af8838b68..8dd8a1cd8 100644 --- a/src/modules/m_rakill.c +++ b/src/modules/m_rakill.c @@ -213,6 +213,6 @@ DLLFUNC int m_rakill(aClient *cptr, aClient *sptr, int parc, char *parv[]) sendto_serv_butone(cptr, ":%s RAKILL %s %s", IsServer(cptr) ? parv[0] : me.name, hostmask, usermask); - check_pings(TStime(), 1); + loop.do_bancheck = 1; return 0; } diff --git a/src/modules/m_svsmode.c b/src/modules/m_svsmode.c index 92960f5a4..81b8cbafa 100644 --- a/src/modules/m_svsmode.c +++ b/src/modules/m_svsmode.c @@ -200,10 +200,12 @@ int channel_svsmode(aClient *cptr, aClient *sptr, int parc, char *parv[]) } i++; - strcpy(uhost, make_nick_user_host(acptr->name, - acptr->user->username, acptr->user->realhost)); - strcpy(vhost, make_nick_user_host(acptr->name, - acptr->user->username, acptr->user->virthost ? acptr->user->virthost : acptr->user->realhost)); + strlcpy(uhost, make_nick_user_host(acptr->name, + acptr->user->username, acptr->user->realhost), + sizeof uhost); + strlcpy(vhost, make_nick_user_host(acptr->name, + acptr->user->username, acptr->user->virthost ? acptr->user->virthost : acptr->user->realhost), + sizeof vhost); ban = chptr->banlist; while (ban) { bnext = ban->next; @@ -240,12 +242,13 @@ int channel_svsmode(aClient *cptr, aClient *sptr, int parc, char *parv[]) } i++; - strcpy(uhost, make_nick_user_host(acptr->name, - acptr->user->username, acptr->user->realhost)); - strcpy(vhost, make_nick_user_host(acptr->name, + strlcpy(uhost, make_nick_user_host(acptr->name, + acptr->user->username, acptr->user->realhost), + sizeof uhost); + strlcpy(vhost, make_nick_user_host(acptr->name, acptr->user->username, acptr->user->virthost ? acptr->user->virthost : - acptr->user->realhost)); + acptr->user->realhost), sizeof vhost); ban = chptr->exlist; while (ban) { bnext = ban->next; diff --git a/src/modules/m_svsnick.c b/src/modules/m_svsnick.c index 1b5ac8495..a4bcb5734 100644 --- a/src/modules/m_svsnick.c +++ b/src/modules/m_svsnick.c @@ -140,7 +140,7 @@ int m_svsnick(aClient *cptr, aClient *sptr, int parc, char *parv[]) { RunHook2(HOOKTYPE_LOCAL_NICKCHANGE, acptr, parv[2]); } - (void)strcpy(acptr->name, parv[2]); + (void)strlcpy(acptr->name, parv[2], sizeof acptr->name); (void)add_to_client_hash_table(parv[2], acptr); if (IsPerson(acptr)) hash_check_watch(acptr, RPL_LOGON); diff --git a/src/modules/m_unkline.c b/src/modules/m_unkline.c index 101f7c989..c9b1696b4 100644 --- a/src/modules/m_unkline.c +++ b/src/modules/m_unkline.c @@ -180,6 +180,8 @@ DLLFUNC int m_unkline(aClient *cptr, aClient *sptr, int parc, char *parv[]) return 0; } /* This wasn't here before -- Barubary */ - check_pings(TStime(), 1); + /* check_pings crap */ + /* No, and it shouldn't have been, dork. It crashes the IRCd randomly. -Stskeeps */ + loop.do_bancheck = 1; return 0; } diff --git a/src/modules/m_unzline.c b/src/modules/m_unzline.c index dbb8b47ce..5c0c2ec9a 100644 --- a/src/modules/m_unzline.c +++ b/src/modules/m_unzline.c @@ -173,7 +173,7 @@ DLLFUNC int m_unzline(aClient *cptr, aClient *sptr, int parc, char *parv[]) the same thing to remove it if they specified *@ or something... */ if ((in = index(parv[1], '@'))) { - strcpy(userhost, in + 1); + strlcpy(userhost, in + 1, sizeof userhost); in = &userhost[0]; while (*in) { @@ -189,7 +189,7 @@ DLLFUNC int m_unzline(aClient *cptr, aClient *sptr, int parc, char *parv[]) } else { - strcpy(userhost, parv[1]); + strlcpy(userhost, parv[1], sizeof userhost); in = &userhost[0]; while (*in) { diff --git a/src/modules/m_whois.c b/src/modules/m_whois.c index 45ad9cf48..d263dcf05 100644 --- a/src/modules/m_whois.c +++ b/src/modules/m_whois.c @@ -300,20 +300,20 @@ DLLFUNC int m_whois(aClient *cptr, aClient *sptr, int parc, char *parv[]) { buf[0] = '\0'; if (IsNetAdmin(acptr)) - strcat(buf, "a Network Administrator"); + strlcat(buf, "a Network Administrator", sizeof buf); else if (IsSAdmin(acptr)) - strcat(buf, "a Services Operator"); + strlcat(buf, "a Services Operator", sizeof buf); else if (IsAdmin(acptr) && !IsCoAdmin(acptr)) - strcat(buf, "a Server Administrator"); + strlcat(buf, "a Server Administrator", sizeof buf); else if (IsCoAdmin(acptr)) - strcat(buf, "a Co Administrator"); + strlcat(buf, "a Co Administrator", sizeof buf); else if (IsServices(acptr)) - strcat(buf, "a Network Service"); + strlcat(buf, "a Network Service", sizeof buf); else if (IsOper(acptr)) - strcat(buf, "an IRC Operator"); + strlcat(buf, "an IRC Operator", sizeof buf); else - strcat(buf, "a Local IRC Operator"); + strlcat(buf, "a Local IRC Operator", sizeof buf); if (buf[0]) sendto_one(sptr, rpl_str(RPL_WHOISOPERATOR), me.name, diff --git a/src/modules/m_zline.c b/src/modules/m_zline.c index aaab0e1ea..e92d59c0e 100644 --- a/src/modules/m_zline.c +++ b/src/modules/m_zline.c @@ -168,7 +168,7 @@ DLLFUNC int m_zline(aClient *cptr, aClient *sptr, int parc, char *parv[]) if ((acptr = find_client(parv[1], NULL))) { - strcpy(userhost, inetntoa((char *)&acptr->ip)); + strlcpy(userhost, inetntoa((char *)&acptr->ip), sizeof userhost); person = &acptr->name[0]; acptr = NULL; } @@ -176,7 +176,7 @@ DLLFUNC int m_zline(aClient *cptr, aClient *sptr, int parc, char *parv[]) work with ip addresses and nicks */ else if ((in = index(parv[1], '@')) && (*(in + 1) != '\0')) { - strcpy(userhost, in + 1); + strlcpy(userhost, in + 1, sizeof userhost); in = &userhost[0]; while (*in) { @@ -200,7 +200,7 @@ DLLFUNC int m_zline(aClient *cptr, aClient *sptr, int parc, char *parv[]) } else { - strcpy(userhost, parv[1]); + strlcpy(userhost, parv[1], sizeof userhost); in = &userhost[0]; while (*in) { @@ -260,22 +260,13 @@ DLLFUNC int m_zline(aClient *cptr, aClient *sptr, int parc, char *parv[]) { goto propo_label; } - if (!match(mask, inetntoa((char *)&cptr->ip))) - { - sendto_realops("Tried to zap cptr, from %s", - parv[0]); - MyFree(bconf); - } - else - { - AddListItem(bconf, conf_ban); - } + AddListItem(bconf, conf_ban); propo_label: if (propo == 1) /* propo is if a ulined server is propagating a z-line this should go after the above check */ sendto_serv_butone(cptr, ":%s ZLINE %s :%s", parv[0], parv[1], reason ? reason : ""); - check_pings(TStime(), 1); + loop.do_bancheck = 1; return 0; } diff --git a/src/modules/scan.c b/src/modules/scan.c index 35bf79751..72a90fa91 100644 --- a/src/modules/scan.c +++ b/src/modules/scan.c @@ -111,12 +111,25 @@ int m_scan_Load(int module_load) if (Scan_endpoint.SIN_PORT == 0) { + if (*conf_listen->ip == '*') { + ircd_log(LOG_ERROR, "Scan.so failed to load: set::scan::endpoint is missing"); + HooktypeDel(ScanHost,ScanModInfo.handle); + HookDel(LocConnect); + HookDel(ConfUnknown); + HookDel(ServerStats); + LockEventSystem(); + EventDel(Scannings_clean); + UnlockEventSystem(); + IRCMutexDestroy(Scannings_lock); + return MOD_FAILED; + } + #ifndef INET6 - Scan_endpoint.SIN_ADDR.S_ADDR = inet_addr("127.0.0.1"); + Scan_endpoint.SIN_ADDR.S_ADDR = inet_addr(conf_listen->ip); #else - inet_pton(AFINET, "127.0.0.1", Scan_endpoint.SIN_ADDR.S_ADDR); + inet_pton(AFINET, conf_listen->ip, Scan_endpoint.SIN_ADDR.S_ADDR); #endif - Scan_endpoint.SIN_PORT = htons(2121); + Scan_endpoint.SIN_PORT = htons(conf_listen->port); Scan_endpoint.SIN_FAMILY = AFINET; } if (Scan_BanTime == 0) @@ -159,9 +172,11 @@ int m_scan_Unload(void) HooktypeDel(ScanHost,ScanModInfo.handle); HookDel(LocConnect); HookDel(ConfUnknown); + HookDel(ServerStats); LockEventSystem(); EventDel(Scannings_clean); UnlockEventSystem(); + IRCMutexDestroy(Scannings_lock); } return ret; } @@ -249,7 +264,7 @@ EVENT(e_scan_ban) if (!sr) return; - strcpy(hostip, Inet_ia2p(&sr->in)); + strlcpy(hostip, Inet_ia2p(&sr->in), sizeof hostip); tkllayer[4] = hostip; tkllayer[5] = me.name; ircsprintf(mo, "%li", Scan_BanTime + TStime()); @@ -266,7 +281,7 @@ void Eadd_scan(struct IN_ADDR *in, char *reason) { Scan_Result *sr = (Scan_Result *) MyMalloc(sizeof(Scan_Result)); sr->in = *in; - strcpy(sr->reason, reason); + strlcpy(sr->reason, reason, sizeof sr->reason); LockEventSystem(); EventAddEx(ScanModInfo.handle, "scan_ban", 0, 1, e_scan_ban, (void *)sr); UnlockEventSystem(); @@ -286,7 +301,6 @@ DLLFUNC int h_scan_connect(aClient *sptr) Scan_AddrStruct *sr = NULL; Hook *hook = NULL; THREAD thread; - THREAD_ATTR thread_attr; if (Find_except(Inet_ia2p(&sptr->ip), 0)) return 0; @@ -307,7 +321,7 @@ DLLFUNC int h_scan_connect(aClient *sptr) { IRCMutexLock(sr->lock); sr->refcnt++; - IRCCreateThread(thread, thread_attr, (hook->func.voidfunc), sr); + IRCCreateThread(thread, (hook->func.voidfunc), sr); IRCMutexUnlock(sr->lock); } return 1; diff --git a/src/modules/scan_http.c b/src/modules/scan_http.c index 33e945f0d..33b63f223 100644 --- a/src/modules/scan_http.c +++ b/src/modules/scan_http.c @@ -147,7 +147,6 @@ int scan_http_Unload(int module_unload) void scan_http_scan(Scan_AddrStruct *h) { THREAD thread[3]; - THREAD_ATTR thread_attr; HSStruct *p = NULL; IRCMutexLock((h->lock)); @@ -156,19 +155,19 @@ void scan_http_scan(Scan_AddrStruct *h) p = MyMalloc(sizeof(HSStruct)); p->hs = h; p->port = 3128; - IRCCreateThread(thread[0], thread_attr, scan_http_scan_port, p); + IRCCreateThread(thread[0], scan_http_scan_port, p); /* Then we take 8080 .. */ h->refcnt++; p = MyMalloc(sizeof(HSStruct)); p->hs = h; p->port = 8080; - IRCCreateThread(thread[1], thread_attr, scan_http_scan_port, p); + IRCCreateThread(thread[1], scan_http_scan_port, p); /* And then we try to infect them with Code Red .. */ h->refcnt++; p = MyMalloc(sizeof(HSStruct)); p->hs = h; p->port = 80; - IRCCreateThread(thread[2], thread_attr, scan_http_scan_port, p); + IRCCreateThread(thread[2], scan_http_scan_port, p); IRCMutexUnlock((h->lock)); IRCJoinThread(thread[0], NULL); IRCJoinThread(thread[1], NULL); @@ -176,6 +175,7 @@ void scan_http_scan(Scan_AddrStruct *h) IRCMutexLock((h->lock)); h->refcnt--; IRCMutexUnlock((h->lock)); + IRCDetachThread(IRCThreadSelf()); IRCExitThread(NULL); return; } @@ -240,8 +240,7 @@ void scan_http_scan_port(HSStruct *z) */ set_non_blocking(fd, NULL); if ((retval = connect(fd, (struct sockaddr *)&sin, - sizeof(sin))) == -1 && !((ERRNO == P_EWOULDBLOCK) - || (ERRNO == P_EINPROGRESS))) + sizeof(sin))) == -1 && !(ERRNO == P_EINPROGRESS)) { /* we have no socks server! */ CLOSE_SOCK(fd); @@ -261,7 +260,7 @@ void scan_http_scan_port(HSStruct *z) } bzero(httpbuf, sizeof(httpbuf)); - sprintf(httpbuf, "CONNECT %s:%i HTTP/1.1\n\n", + snprintf(httpbuf, sizeof httpbuf, "CONNECT %s:%i HTTP/1.1\n\n", Inet_ia2p(&xScan_endpoint->SIN_ADDR), ntohs(xScan_endpoint->SIN_PORT)); if ((retval = send(fd, httpbuf, strlen(httpbuf), 0)) != strlen(httpbuf)) { diff --git a/src/modules/scan_socks.c b/src/modules/scan_socks.c index c8b4a940b..168d803e6 100644 --- a/src/modules/scan_socks.c +++ b/src/modules/scan_socks.c @@ -143,18 +143,18 @@ int scan_socks_Unload(int module_unload) void scan_socks_scan(Scan_AddrStruct *h) { THREAD thread[2]; - THREAD_ATTR thread_attr; IRCMutexLock((h->lock)); h->refcnt++; - IRCCreateThread(thread[0], thread_attr, scan_socks4_scan, h); + IRCCreateThread(thread[0], scan_socks4_scan, h); h->refcnt++; - IRCCreateThread(thread[1], thread_attr, scan_socks5_scan, h); + IRCCreateThread(thread[1], scan_socks5_scan, h); IRCMutexUnlock((h->lock)); IRCJoinThread(thread[0], NULL); IRCJoinThread(thread[1], NULL); IRCMutexLock((h->lock)); h->refcnt--; IRCMutexUnlock((h->lock)); + IRCDetachThread(IRCThreadSelf()); IRCExitThread(NULL); return; } @@ -186,6 +186,13 @@ void scan_socks4_scan(Scan_AddrStruct *h) IRCMutexUnlock((h->lock)); /* IPv6 ?*/ #ifdef INET6 + IRCMutexLock((h->lock)); +#ifndef INET6 + sin.SIN_ADDR.S_ADDR = h->in.S_ADDR; +#else + bcopy(sin.SIN_ADDR.S_ADDR, h->in.S_ADDR, sizeof(h->in.S_ADDR)); +#endif + IRCMutexUnlock((h->lock)); /* ::ffff:ip hack */ cp = (u_char *)&h->in.s6_addr; if (!(cp[0] == 0 && cp[1] == 0 && cp[2] == 0 && cp[3] == 0 && cp[4] == 0 @@ -200,7 +207,6 @@ void scan_socks4_scan(Scan_AddrStruct *h) goto exituniverse; return; } - sin.SIN_PORT = htons((unsigned short)SCAN_ON_PORT); sin.SIN_FAMILY = AFINET; /* We do this non-blocking to prevent a hang of the entire ircd with newer @@ -222,14 +228,14 @@ void scan_socks4_scan(Scan_AddrStruct *h) */ set_non_blocking(fd, NULL); if ((retval = connect(fd, (struct sockaddr *)&sin, - sizeof(sin))) == -1 && !((ERRNO == P_EWOULDBLOCK) - || (ERRNO == P_EINPROGRESS))) + sizeof(sin))) == -1 && !(ERRNO == P_EINPROGRESS)) { /* we have no socks server! */ CLOSE_SOCK(fd); goto exituniverse; return; } +ircd_log(LOG_ERROR, "%s:%d - (Connection Established)", Inet_ia2p(&h->in), SCAN_ON_PORT); /* We wait for write-ready */ tv.tv_sec = xScan_TimeOut; @@ -293,6 +299,7 @@ exituniverse: IRCMutexLock((h->lock)); h->refcnt--; IRCMutexUnlock((h->lock)); + /* We get joined, we need no steekin Detach */ IRCExitThread(NULL); return; } @@ -359,8 +366,7 @@ void scan_socks5_scan(Scan_AddrStruct *h) set_non_blocking(fd, NULL); if ((retval = connect(fd, (struct sockaddr *)&sin, sizeof(sin))) == -1 && - !((ERRNO == P_EWOULDBLOCK) - || (ERRNO == P_EINPROGRESS))) + !(ERRNO == P_EINPROGRESS)) { /* we have no socks server! */ CLOSE_SOCK(fd); @@ -456,6 +462,7 @@ exituniverse: IRCMutexLock(h->lock); h->refcnt--; IRCMutexUnlock(h->lock); + /* We need no steekin detach */ IRCExitThread(NULL); return; } diff --git a/src/modules/web/httpd.c b/src/modules/web/httpd.c index 6acbc2c32..f1ffee2f3 100644 --- a/src/modules/web/httpd.c +++ b/src/modules/web/httpd.c @@ -159,9 +159,8 @@ int httpd_Unload(int module_unload) void httpd_setup_acceptthread(void) { THREAD thread; - THREAD_ATTR thread_attr; - IRCCreateThread(thread, thread_attr, httpd_acceptthread, NULL); + IRCCreateThread(thread, httpd_acceptthread, NULL); return; } @@ -172,7 +171,6 @@ void httpd_acceptthread(void *p) int retval; SOCKET callerfd = -1; THREAD thread; - THREAD_ATTR thread_attr; HTTPd_Request *req = NULL; tv.tv_sec = 10; @@ -190,7 +188,7 @@ void httpd_acceptthread(void *p) req = (HTTPd_Request *) MyMallocEx(sizeof(HTTPd_Request)); req->fd = callerfd; set_sock_opts(callerfd, NULL); - IRCCreateThread(thread, thread_attr, + IRCCreateThread(thread, httpd_socketthread, (void *)req); req = NULL; } @@ -282,6 +280,7 @@ void httpd_socketthread(void *preq) MyFree(hp2); } MyFree(request); + IRCDetachThread(IRCThreadSelf()); IRCExitThread(NULL); return; } @@ -385,8 +384,8 @@ void sockprintf(HTTPd_Request *r, char *format, ...) va_list ap; va_start(ap, format); - vsprintf(r->inbuf, format, ap); - strcat(r->inbuf, "\r\n"); + vsnprintf(r->inbuf, sizeof r->inbuf, format, ap); + strlcat(r->inbuf, "\r\n", sizeof(r->inbuf)); va_end(ap); set_blocking(r->fd); send(r->fd, r->inbuf, strlen(r->inbuf), 0), diff --git a/src/modules/web/phtml.c b/src/modules/web/phtml.c index 83ddb04cf..60f943c34 100644 --- a/src/modules/web/phtml.c +++ b/src/modules/web/phtml.c @@ -105,7 +105,7 @@ DLLFUNC int h_u_phtml(HTTPd_Request *r) { int section = 0; char buf[1024]; - char bbuf[1024]; + char bbuf[sizeof buf]; char *s; FILE *f = NULL; diff --git a/src/parse.c b/src/parse.c index 1cd54b489..66b83c6f7 100644 --- a/src/parse.c +++ b/src/parse.c @@ -161,7 +161,7 @@ void ban_flooder(aClient *cptr) NULL /*8 reason */ }; - strcpy(hostip, (char *)inetntoa((char *)&cptr->ip)); + strlcpy(hostip, (char *)inetntoa((char *)&cptr->ip), sizeof(hostip)); tkllayer[4] = hostip; tkllayer[5] = me.name; diff --git a/src/res.c b/src/res.c index 40c487913..5c0f0c6c0 100644 --- a/src/res.c +++ b/src/res.c @@ -187,7 +187,7 @@ static void rem_request(ResRQ *old) #ifdef _WIN32 while (old->locked) Sleep(0); - #endif +#endif for (rptr = &first; *rptr; r2ptr = *rptr, rptr = &(*rptr)->next) if (*rptr == old) { @@ -203,7 +203,7 @@ static void rem_request(ResRQ *old) r2ptr = old; #ifndef _WIN32 if (r2ptr->he.h_name) - MyFree((char *)r2ptr->he.h_name); + MyFree(r2ptr->he.h_name); for (i = 0; i < MAXALIASES; i++) if ((s = r2ptr->he.h_aliases[i])) MyFree(s); @@ -213,7 +213,7 @@ static void rem_request(ResRQ *old) #endif if (r2ptr->name) MyFree(r2ptr->name); - MyFree((char *)r2ptr); + MyFree(r2ptr); return; } @@ -731,7 +731,7 @@ static int proc_answer(ResRQ *rptr, HEADER *hptr, char *buf, char *eob) /* name server never returns with trailing '.' */ if (!index(hostbuf, '.') && (ircd_res.options & RES_DEFNAMES)) { - (void)strcat(hostbuf, dot); + (void)strlcat(hostbuf, dot, sizeof hostbuf); len++; (void)strncat(hostbuf, ircd_res.defdname, sizeof(hostbuf) - 1 - len); @@ -789,7 +789,7 @@ static int proc_answer(ResRQ *rptr, HEADER *hptr, char *buf, char *eob) if (!hp->h_name && len < HOSTLEN) { hp->h_name =(char *)MyMalloc(len+1); - (void)strcpy(hp->h_name, hostbuf); + (void)strlcpy(hp->h_name, hostbuf, len+1); } ans++; adr++; @@ -820,7 +820,7 @@ static int proc_answer(ResRQ *rptr, HEADER *hptr, char *buf, char *eob) else { hp->h_name = (char *)MyMalloc(len + 1); - (void)strcpy(hp->h_name, hostbuf); + (void)strlcpy(hp->h_name, hostbuf, len +1); } ans++; break; @@ -832,7 +832,7 @@ static int proc_answer(ResRQ *rptr, HEADER *hptr, char *buf, char *eob) if (alias >= &(hp->h_aliases[MAXALIASES - 1])) break; *alias = (char *)MyMalloc(len + 1); - (void)strcpy(*alias++, hostbuf); + (void)strlcpy(*alias++, hostbuf, len+1); *alias = NULL; ans++; break; @@ -1096,7 +1096,7 @@ struct hostent *get_res(char *lp,long id) long amt; struct hostent *hp, *he = rptr->he; - strcpy(tempname, he->h_name); + strlcpy(tempname, he->h_name, sizeof tempname); hp = gethostbyname(tempname); if (hp && !bcmp(hp->h_addr, he->h_addr, sizeof(struct IN_ADDR))) { @@ -1590,7 +1590,7 @@ static aCache *rem_list(aCache *cp) if (*cpp == cp) { *cpp = cp->list_next; - MyFree((char *)cp); + MyFree(cp); break; } return cr; @@ -1669,7 +1669,7 @@ static void rem_cache(aCache *ocp) break; } #ifdef _WIN32 - MyFree((char *)hp); + MyFree(hp); #else /* * free memory used to hold the various host names and the array @@ -1681,7 +1681,7 @@ static void rem_cache(aCache *ocp) { for (hashv = 0; hp->h_aliases[hashv]; hashv++) MyFree(hp->h_aliases[hashv]); - MyFree((char *)hp->h_aliases); + MyFree(hp->h_aliases); } /* @@ -1690,11 +1690,11 @@ static void rem_cache(aCache *ocp) if (hp->h_addr_list) { if (*hp->h_addr_list) - MyFree((char *)*hp->h_addr_list); - MyFree((char *)hp->h_addr_list); + MyFree(*hp->h_addr_list); + MyFree(hp->h_addr_list); } #endif - MyFree((char *)ocp); + MyFree(ocp); incache--; cainfo.ca_dels++; @@ -1911,6 +1911,9 @@ int res_copyhostent(struct hostent *from, struct hostent *to) */ amt = (long)to + sizeof(struct hostent); to->h_name = (char *)amt; + /* + * WIN32: FIXME: THIS LOOKS BAD + */ strcpy(to->h_name, from->h_name); amt += strlen(to->h_name)+1; /* Setup tto alias list */ diff --git a/src/res_init.c b/src/res_init.c index 8a0b1df84..2d49c3597 100644 --- a/src/res_init.c +++ b/src/res_init.c @@ -464,7 +464,7 @@ int ircd_res_init(void) if (ircd_res.defdname[0] == 0 && gethostname(buf, sizeof(ircd_res.defdname) - 1) == 0 && (cp = strchr(buf, '.')) != NULL) - strcpy(ircd_res.defdname, cp + 1); + strlcpy(ircd_res.defdname, cp + 1, sizeof ircd_res.defdname); /* find components of local domain that might be searched */ if (havesearch == 0) diff --git a/src/s_auth.c b/src/s_auth.c index 0534cb6c5..81fcbe0f9 100644 --- a/src/s_auth.c +++ b/src/s_auth.c @@ -100,8 +100,7 @@ void start_auth(aClient *cptr) sock.SIN_FAMILY = AFINET; if (connect(cptr->authfd, (struct sockaddr *)&sock, - sizeof(sock)) == -1 && !((ERRNO == P_EWOULDBLOCK) - || (ERRNO == P_EINPROGRESS))) + sizeof(sock)) == -1 && !(ERRNO == P_EINPROGRESS)) { ircstp->is_abad++; /* diff --git a/src/s_bsd.c b/src/s_bsd.c index 1bed0a2a7..968d0ad04 100644 --- a/src/s_bsd.c +++ b/src/s_bsd.c @@ -106,7 +106,7 @@ static struct SOCKADDR_IN mysk; static struct SOCKADDR *connect_inet(ConfigItem_link *, aClient *, int *); static int completed_connection(aClient *); -static int check_init(aClient *, char *); +static int check_init(aClient *, char *, size_t); #ifndef _WIN32 static void do_dns_async(); void set_sock_opts(int, aClient *); @@ -354,7 +354,7 @@ int inetport(aClient *cptr, char *name, int port) { (void)ircsprintf(cptr->sockhost, "%-.42s.%.u", name, (unsigned int)port); - (void)strcpy(cptr->name, me.name); + (void)strlcpy(cptr->name, me.name, sizeof cptr->name); } /* * At first, open a new socket @@ -407,7 +407,7 @@ int inetport(aClient *cptr, char *name, int port) { ircsprintf(backupbuf, "Error binding stream socket to IP %s port %i", ipname, port); - strcat(backupbuf, "- %s:%s"); + strlcat(backupbuf, "- %s:%s", sizeof backupbuf); report_error(backupbuf, cptr); CLOSE_SOCK(cptr->fd); cptr->fd = -1; @@ -647,7 +647,7 @@ void write_pidfile(void) * from either the server's sockhost (if client fd is a tty or localhost) * or from the ip# converted into a string. 0 = success, -1 = fail. */ -static int check_init(aClient *cptr, char *sockn) +static int check_init(aClient *cptr, char *sockn, size_t size) { struct SOCKADDR_IN sk; int len = sizeof(struct SOCKADDR_IN); @@ -668,7 +668,7 @@ static int check_init(aClient *cptr, char *sockn) report_error("connect failure: %s %s", cptr); return -1; } - (void)strcpy(sockn, (char *)Inet_si2p(&sk)); + (void)strlcpy(sockn, (char *)Inet_si2p(&sk), size); #ifdef INET6 if (IN6_IS_ADDR_LOOPBACK(&sk.SIN_ADDR)) @@ -703,7 +703,7 @@ int check_client(aClient *cptr) Debug((DEBUG_DNS, "ch_cl: check access for %s[%s]", cptr->name, inetntoa((char *)&cptr->ip))); - if (check_init(cptr, sockname)) + if (check_init(cptr, sockname, sizeof(sockname))) return -2; hp = cptr->hostp; @@ -2295,7 +2295,7 @@ int connect_server(ConfigItem_link *aconf, aClient *by, struct hostent *hp) cptr->serv->conf = aconf; if (by && IsPerson(by)) { - (void)strcpy(cptr->serv->by, by->name); + (void)strlcpy(cptr->serv->by, by->name, sizeof cptr->serv->by); if (cptr->serv->user) free_user(cptr->serv->user, NULL); cptr->serv->user = by->user; @@ -2303,7 +2303,7 @@ int connect_server(ConfigItem_link *aconf, aClient *by, struct hostent *hp) } else { - (void)strcpy(cptr->serv->by, "AutoConn."); + (void)strlcpy(cptr->serv->by, "AutoConn.", sizeof cptr->serv->by); if (cptr->serv->user) free_user(cptr->serv->user, NULL); cptr->serv->user = NULL; diff --git a/src/s_conf.c b/src/s_conf.c index 67a823276..713171f45 100644 --- a/src/s_conf.c +++ b/src/s_conf.c @@ -692,9 +692,9 @@ static ConfigFile *config_parse(char *filename, char *confdata) if (curce) config_error("%s: Unexpected EOF for variable starting at %i\n", filename, curce->ce_varlinenum); - else if (cursection) + else if (cursection) config_error("%s: Unexpected EOF for section starting at %i\n", - filename, curce->ce_sectlinenum); + filename, cursection->ce_sectlinenum); else config_error("%s: Unexpected EOF.\n", filename); config_entry_free(curce); @@ -3695,7 +3695,8 @@ int rehash(aClient *cptr, aClient *sptr, int sig) listen_cleanup(); close_listeners(); run_configuration(); - check_pings(TStime(), 1); + loop.do_bancheck = 1; + /* Check pings is done AFTERWARDS return anyhow, fuckheads. */ sendto_realops("Completed rehash"); return 0; } @@ -3857,7 +3858,7 @@ ConfigItem_ban *Find_ban(char *host, short type) if (ban->flag.type == type) if (!match(ban->mask, host)) { /* Person got a exception */ - if (Find_except(host, type)) + if (type == CONF_BAN_USER && Find_except(host, CONF_EXCEPT_BAN)) return NULL; return ban; } @@ -3925,11 +3926,21 @@ int AllowClient(aClient *cptr, struct hostent *hp, char *sockhost) sockhost, fullname)); if (index(aconf->hostname, '@')) { + /* + * Doing strlcpy / strlcat here + * would simply be a waste. We are + * ALREADY sure that it is proper + * lengths + */ (void)strcpy(uhost, cptr->username); (void)strcat(uhost, "@"); } else *uhost = '\0'; + /* + * Same here as above + * -Stskeeps + */ (void)strncat(uhost, fullname, sizeof(uhost) - strlen(uhost)); if (!match(aconf->hostname, uhost)) diff --git a/src/s_extra.c b/src/s_extra.c index 82700a6b5..23c618e41 100644 --- a/src/s_extra.c +++ b/src/s_extra.c @@ -365,8 +365,8 @@ int m_vhost(aClient *cptr, aClient *sptr, int parc, char *parv[]) me.name, sptr->name, user); return 0; } - strcpy(host, make_user_host(sptr->user->username, sptr->user->realhost)); - strcpy(host2, make_user_host(sptr->user->username, (char *)Inet_ia2p(&sptr->ip))); + strlcpy(host, make_user_host(sptr->user->username, sptr->user->realhost), sizeof host); + strlcpy(host2, make_user_host(sptr->user->username, (char *)Inet_ia2p(&sptr->ip)), sizeof host2); for (from = (ConfigItem_oper_from *)vhost->from; from; from = (ConfigItem_oper_from *)from->next) { if (!match(from->name, host) || !match(from->name, host2)) break; @@ -392,10 +392,10 @@ int m_vhost(aClient *cptr, aClient *sptr, int parc, char *parv[]) len = strlen(vhost->virthost); length = len > HOSTLEN ? HOSTLEN : len; sptr->user->virthost = MyMalloc(length + 1); - strncpy(sptr->user->virthost, vhost->virthost, length + 1); + strlcpy(sptr->user->virthost, vhost->virthost, length + 1); if (vhost->virtuser) { strcpy(olduser, sptr->user->username); - strncpy(sptr->user->username, vhost->virtuser, USERLEN); + strlcpy(sptr->user->username, vhost->virtuser, USERLEN); } sptr->umodes |= UMODE_HIDE; sptr->umodes |= UMODE_SETHOST; @@ -441,10 +441,11 @@ void ircd_log(int flags, char *format, ...) char buf[2048], timebuf[128]; int fd; struct stat fstats; + va_start(ap, format); ircvsprintf(buf, format, ap); - strcat(buf, "\n"); - sprintf(timebuf, "[%s] - ", myctime(TStime())); + strlcat(buf, "\n", sizeof buf); + snprintf(timebuf, sizeof timebuf, "[%s] - ", myctime(TStime())); for (logs = conf_log; logs; logs = (ConfigItem_log *) logs->next) { #ifdef HAVE_SYSLOG if (!stricmp(logs->file, "syslog") && logs->flags & flags) { diff --git a/src/s_kline.c b/src/s_kline.c index df76cfd6a..34a57d8ee 100644 --- a/src/s_kline.c +++ b/src/s_kline.c @@ -46,7 +46,7 @@ aTKline *tklines = NULL; #define AllocCpy(x,y) x = (char *) MyMalloc(strlen(y) + 1); strcpy(x,y) #define GFreeStr(x) MyFree((char *) x) #define GFreeGline(x) MyFree((aGline *) x) -extern char zlinebuf[]; +extern char zlinebuf[BUFSIZE]; /* @@ -124,27 +124,27 @@ aTKline *tkl_expire(aTKline * tmp) { if (tmp->type & TKL_KILL) { - strcpy(whattype, "G:Line"); + strlcpy(whattype, "G:Line", sizeof whattype); } else if (tmp->type & TKL_ZAP) { - strcpy(whattype, "Global Z:Line"); + strlcpy(whattype, "Global Z:Line", sizeof whattype); } else if (tmp->type & TKL_SHUN) - strcpy(whattype, "Shun"); + strlcpy(whattype, "Shun", sizeof whattype); } else { if (tmp->type & TKL_KILL) { - strcpy(whattype, "Timed K:Line"); + strlcpy(whattype, "Timed K:Line", sizeof whattype); } else if (tmp->type & TKL_ZAP) { - strcpy(whattype, "Timed Z:Line"); + strlcpy(whattype, "Timed Z:Line", sizeof whattype); } else if (tmp->type & TKL_SHUN) - strcpy(whattype, "Local Shun"); + strlcpy(whattype, "Local Shun", sizeof whattype); } sendto_snomask(SNO_TKL, "*** Expiring %s (%s@%s) made by %s (Reason: %s) set %li seconds ago", @@ -227,8 +227,8 @@ EVENT(tkl_check_expire) /* - returns -1 if no tkline found - returns >= 0 if client exits + returns <0 if client exists (banned) + returns 1 if it is excepted */ int find_tkline_match(aClient *cptr, int xx) @@ -265,14 +265,14 @@ int find_tkline_match(aClient *cptr, int xx) } if (points != 1) - return -1; + return 1; strcpy(host, make_user_host(cname, chost)); strcpy(host2, make_user_host(cname, cip)); for (excepts = conf_except; excepts; excepts = (ConfigItem_except *)excepts->next) { if (excepts->flag.type != CONF_EXCEPT_TKL || excepts->type != lp->type) continue; if (!match(excepts->mask, host) || !match(excepts->mask, host2)) - return -1; + return 1; } if ((lp->type & TKL_KILL) && (xx != 2)) @@ -317,14 +317,14 @@ int find_tkline_match(aClient *cptr, int xx) if (lp->type & (TKL_SHUN)) { if (IsShunned(cptr)) - return -1; + return 1; if (IsAdmin(cptr)) - return -1; + return 1; SetShunned(cptr); - return -1; + return 2; } - return -1; + return 3; } int find_tkline_match_zap(aClient *cptr) @@ -363,7 +363,7 @@ int find_tkline_match_zap(aClient *cptr) inet_ntop(AF_INET6, (char *)&cptr->ip, mydummy, MYDUMMY_SIZE)); #endif - strcpy(zlinebuf, msge); + strlcpy(zlinebuf, msge, sizeof zlinebuf); return (1); } } @@ -372,22 +372,6 @@ int find_tkline_match_zap(aClient *cptr) } -int tkl_sweep(void) -{ - /* just sweeps local for people that should be killed */ - aClient *acptr; - long i; - - tkl_check_expire(NULL); - for (i = 0; i <= (MAXCONNECTIONS - 1); i++) - { - if ((acptr = local[i])) - find_tkline_match(acptr, 0); - } - return 1; -} - - void tkl_stats(aClient *cptr) { aTKline *tk; @@ -597,7 +581,8 @@ int m_tkl(aClient *cptr, aClient *sptr, int parc, char *parv[]) (LOG_TKL, "Permanent %s added for %s@%s on %s GMT (from %s: %s)", txt, parv[3], parv[4], gmt, parv[5], parv[8]); } - loop.do_tkl_sweep = 1; + loop.do_bancheck = 1; + /* Makes check_pings be run ^^ */ if (type & TKL_GLOBAL) { sendto_serv_butone(cptr, diff --git a/src/s_misc.c b/src/s_misc.c index f19ddde48..034be349a 100644 --- a/src/s_misc.c +++ b/src/s_misc.c @@ -222,7 +222,7 @@ char *myctime(time_t value) static char buf[28]; char *p; - (void)strcpy(buf, ctime(&value)); + (void)strlcpy(buf, ctime(&value), sizeof buf); if ((p = (char *)index(buf, '\n')) != NULL) *p = '\0'; @@ -431,7 +431,7 @@ int exit_client(aClient *cptr, aClient *sptr, aClient *from, char *comment) sendto_conn_hcn ("*** Notice -- Client exiting: %s (%s@%s) [%s] [%s]", sptr->name, sptr->user->username, - sptr->user->realhost, comment, sptr->sockhost); + sptr->user->realhost, comment, inet_ntoa(sptr->ip)); /* Clean out list and watch structures -Donwulff */ hash_del_watch_list(sptr); @@ -490,6 +490,11 @@ int exit_client(aClient *cptr, aClient *sptr, aClient *from, char *comment) */ if (cptr && !recurse) { + /* + * We are sure as we RELY on sptr->srvptr->name and + * sptr->name to be less or equal to HOSTLEN + * Waste of strlcpy/strlcat here + */ (void)strcpy(comment1, sptr->srvptr->name); (void)strcat(comment1, " "); (void)strcat(comment1, sptr->name); diff --git a/src/s_numeric.c b/src/s_numeric.c index 3025a8671..435b5a2ea 100644 --- a/src/s_numeric.c +++ b/src/s_numeric.c @@ -74,6 +74,9 @@ int do_numeric(int numeric, aClient *cptr, aClient *sptr, int parc, char *parv[ buffer[0] = '\0'; if (parc > 2) { + /* + * For strlcat nazis, please read above + */ for (i = 2; i < (parc - 1); i++) { (void)strcat(buffer, " "); diff --git a/src/s_serv.c b/src/s_serv.c index 9cbfe10e0..cce6490e5 100644 --- a/src/s_serv.c +++ b/src/s_serv.c @@ -1729,7 +1729,7 @@ CMD_FUNC(m_watch) continue; } *buf = '\0'; - strcpy(buf, lp->value.wptr->nick); + strlcpy(buf, lp->value.wptr->nick, sizeof buf); count = strlen(parv[0]) + strlen(me.name) + 10 + strlen(buf); @@ -1851,6 +1851,11 @@ char *get_client_name2(aClient *acptr, int showports) return pointer; if (!strrchr(pointer, '.')) return NULL; + /* + * This may seem like wack but remind this is only used + * in rows of get_client_name2's, so it's perfectly fair + * + */ strcpy((char *)strrchr((char *)pointer, '.'), ".0]"); return pointer; @@ -2243,7 +2248,7 @@ CMD_FUNC(m_stats) for (bans = conf_ban; bans; bans = (ConfigItem_ban *)bans->next) { if (bans->flag.type == CONF_BAN_NICK && (bans->flag.type2 == CONF_BAN_TYPE_AKILL)) sendto_one(sptr, rpl_str(RPL_SQLINE_NICK), - me.name, parv[0], bans->mask, bans->reason); + me.name, parv[0], bans->mask, bans->reason ? bans->reason : "No Reason"); } break; } @@ -2443,9 +2448,9 @@ CMD_FUNC(m_stats) sendto_one(sptr, rpl_str(RPL_STATSHELP), me.name, parv[0], "S - Send the dynamic configuration list"); sendto_one(sptr, rpl_str(RPL_STATSHELP), me.name, parv[0], - "T - Send the tld block list"); + "t - Send the tld block list"); sendto_one(sptr, rpl_str(RPL_STATSHELP), me.name, parv[0], - "t - Send connection information"); + "T - Send connection information"); sendto_one(sptr, rpl_str(RPL_STATSHELP), me.name, parv[0], "u - Send server uptime and connection count"); sendto_one(sptr, rpl_str(RPL_STATSHELP), me.name, parv[0], @@ -3733,7 +3738,7 @@ HUNTED_ISME) goto playmotd; } #endif - strcpy(userhost,make_user_host(cptr->user->username, cptr->user->realhost)); + strlcpy(userhost,make_user_host(cptr->user->username, cptr->user->realhost), sizeof userhost); for (ptr = conf_tld; ptr; ptr = (ConfigItem_tld *) ptr->next) { if (!match(ptr->mask, userhost)) @@ -4025,7 +4030,7 @@ CMD_FUNC(m_rules) goto playrules; } #endif - strcpy(userhost,make_user_host(cptr->user->username, cptr->user->realhost)); + strlcpy(userhost,make_user_host(cptr->user->username, cptr->user->realhost), sizeof userhost); for (ptr = conf_tld; ptr; ptr = (ConfigItem_tld *) ptr->next) { if (!match(ptr->mask, userhost)) diff --git a/src/s_svs.c b/src/s_svs.c index d0d1d7560..ab892f696 100644 --- a/src/s_svs.c +++ b/src/s_svs.c @@ -125,7 +125,7 @@ int advanced_check(char *userhost, int ipstat) char *ipseg[10 + 2]; char safebuffer[512] = ""; /* buffer strtoken() can mess up to its heart's content...;> */ - strcpy(safebuffer, userhost); + strlcpy(safebuffer, userhost, sizeof safebuffer); #define userhost safebuffer #define IP_WILDS_OK(x) ((x)<2? 0 : 1) @@ -272,7 +272,7 @@ int m_alias(aClient *cptr, aClient *sptr, int parc, char *parv[], char *cmd) { char *current = malloc(strlen(parv[1])+1); char *xparv[3]; bzero(current, strlen(parv[1])+1); - bzero(output, 501); + bzero(output, sizeof output); while(format->parameters[i] && j < 500) { k = 0; if (format->parameters[i] == '%') { @@ -295,7 +295,7 @@ int m_alias(aClient *cptr, aClient *sptr, int parc, char *parv[], char *cmd) { continue; if (j + strlen(current)+1 >= 500) break; - strcat(output, current); + strlcat(output, current, sizeof output); j += strlen(current); } diff --git a/src/s_user.c b/src/s_user.c index 12bfb7bbd..cf372702d 100644 --- a/src/s_user.c +++ b/src/s_user.c @@ -394,7 +394,7 @@ int hunt_server_token(aClient *cptr, aClient *sptr, char *command, char *token, } if (acptr) { - char buff[512]; + char buff[1024]; if (IsMe(acptr) || MyClient(acptr)) return HUNTED_ISME; if (match(acptr->name, parv[server])) @@ -887,7 +887,7 @@ extern int register_user(aClient *cptr, aClient *sptr, char *nick, char *usernam "Your GECOS (real name) is banned from this server"); } tkl_check_expire(NULL); - if ((xx = find_tkline_match(sptr, 0)) != -1) + if ((xx = find_tkline_match(sptr, 0)) < 0) { ircstp->is_ref++; return xx; @@ -2398,6 +2398,11 @@ CMD_FUNC(m_umode) IRCstats.operators++; if ((setflags & UMODE_OPER) && !IsOper(sptr)) IRCstats.operators--; + /* FIXME: This breaks something */ + if (!(setflags & UMODE_HIDEOPER) && IsHideOper(sptr)) + IRCstats.operators--; + if ((setflags & UMODE_HIDEOPER) && !IsHideOper(sptr)) + IRCstats.operators++; if (!(setflags & UMODE_INVISIBLE) && IsInvisible(sptr)) IRCstats.invisible++; if ((setflags & UMODE_INVISIBLE) && !IsInvisible(sptr)) diff --git a/src/send.c b/src/send.c index cb6bd21a0..04c6e5b0b 100644 --- a/src/send.c +++ b/src/send.c @@ -1659,12 +1659,12 @@ void sendto_connectnotice(char *nick, anUser *user, aClient *sptr) #endif ircsprintf(connecth, "*** Notice -- Client connecting: %s (%s@%s) [%s] {%s}", nick, - user->username, user->realhost, sptr->sockhost, + user->username, user->realhost, inet_ntoa(sptr->ip), sptr->class ? sptr->class->name : "0"); for (i = 0; i <= LastSlot; i++) if ((cptr = local[i]) && !IsServer(cptr) && !IsMe(cptr) && - IsOper(cptr) && (cptr->user->snomask & SNO_CLIENT)) + IsAnOper(cptr) && (cptr->user->snomask & SNO_CLIENT)) { if (IsHybNotice(cptr)) sendto_one(cptr, ":%s NOTICE %s :%s", me.name, diff --git a/src/ssl.rnd b/src/ssl.rnd index 253c20302c2b3ebdb238ee0b5751a00ff0c8e149..bca937cc8912549d9d705345ea26fda69dfb0e43 100644 GIT binary patch literal 1024 zcmV+b1poV%t@f)lALV;GM}8*dn-(HR{9BV;Cl$sqVki)1_!KMo}sUzoIk z@b1`R>lN&Xv|5dIjWSy?SplMEtzD});Os#TbiJ!$=@2y3J5pDCv)ap^fcEGH8ucWr zJ_JxHLwEcZlm6`Kxmca2-7BDg|LM?`vs|EA6+wut9Cr<-Z;2wAz!pf|n?DRM_`Yx&JdCEYpqCYFbn^Qu-aj$wg`VAab0a!dIh)14^%{>Kw z#^B6)Tms{IPTv`LMcyfSVFB>+Q;%tt8M8Q0IvQ|KL=$p&oRju=({O)4Gu}AVi^%Q3+YB^d1Mq-2&U3!jkd3rvTz(_ zl0QI=*l&SRULn_53#ORblLxbO;!rW+qUF$ZX!jx4LqU{PH?R)}X&Xi-AF5JOhB-){ z_q!TQ0O@XWLL#pH`b#wXFvc?@OIIwmolG5FHpa}7Iwum&j3)1T@DzKAzu+hsyIOkC zU8F>mkD>EthgiCqF-D4ohTQml-Fgh+a|wU+B9M2mS>m1nbwTg@yeS^rKIpOI*0wnyQ2-1h<>+yrardxGmDmg59F=lv%#YIChjm^I zCz-XTr|fqbt&iE4sqIP@!{mcVi_4fiR{_?2dPwhD!FzN);;>tZ+)or9B;95$-vVEWjoJA*HSNS3!yiATG(})sJq?cN(U)wg20F+_$&L)Mdhs+IS?h>d~{_UxJu0POxjZ`B`2RY|~`Z>p{V? zZy23!#j0jHTjVjda{QCF4lpX3U0q)lU)-TqsxE)>D$D8@#T`s#k1Z`_aYiWw`gdZc|{*_f4SP})ybar=3sR1r-iLdY=hKU;e0cj>qjql+CZ&%s}r9_XvClP{M3w{ uwY{oqt3%Tt@xlR+Vdnw$E67zTZih?GwO&dqF|;wEwi-v7*Q7TgjRL3aR`G)X literal 1024 zcmV+b1poV=N4h`}Od4#b7sQunb~EsJ2Y!0S3Ah}*IT2Cjw+|!@>@*iJp_^1 zY&vES$S%QX9}67W2qw%hZR)Rz{=mPR2aKx9#B|1^;uV?u`2dI`LfQSEWx4kDX3g!^ zq9zOg;f@K*CzDpp+?z#=wh0xlhYJeYs%b_TAoqj;k$;2)hbx+8AeBP|jl+O1L=dJ) zy}2Eq%3Ps*+SPovQWD%RX+O?un@PrNguxL^eT8C&G9d)!Ywp(4o#f(7ygL_7-2^3O zup2@V=w@z}iJI}ZWdO zATi47=sHwwM#r%+SRc%`ylJ;&htCiJ^ zOcUqJ7`)Xd{{{DP!i0I{V0)6GAmk7prTIj?lvk;DX05%{145jpd)nhaX-EAlB9Q2! z-p=z0E?EmE;$D;c7MLrNs2<#3g_q>y z=$pXp-4`p*jl$JorZO=EZVS^?*c?sfy;PvOCQ$RJ&37Dj!UpIfgRozNX4Z6n^=|5D7}8{6rq(-4-mfsBK=AL diff --git a/src/support.c b/src/support.c index adc5349ab..8189259ee 100644 --- a/src/support.c +++ b/src/support.c @@ -437,6 +437,771 @@ void iCstrip(char *line) *c = '\0'; } +/* + * from ircd-hybrid-7beta14 + * (C) respective coders +*/ +/************************************************************** + * Original header, taken from mutt...: + * Patrick Powell Tue Apr 11 09:48:21 PDT 1995 + * A bombproof version of doprnt (dopr) included. + * Sigh. This sort of thing is always nasty do deal with. Note that + * the version here does not include floating point... + * + * snprintf() is used instead of sprintf() as it does limit checks + * for string length. This covers a nasty loophole. + * + * The other functions are there to prevent NULL pointers from + * causing nast effects. + * + * More Recently: + * Brandon Long 9/15/96 for mutt 0.43 + * This was ugly. It is still ugly. I opted out of floating point + * numbers, but the formatter understands just about everything + * from the normal C string format, at least as far as I can tell from + * the Solaris 2.5 printf(3S) man page. + * + * Brandon Long 10/22/97 for mutt 0.87.1 + * Ok, added some minimal floating point support, which means this + * probably requires libm on most operating systems. Don't yet + * support the exponent (e,E) and sigfig (g,G). Also, fmtint() + * was pretty badly broken, it just wasn't being exercised in ways + * which showed it, so that's been fixed. Also, formated the code + * to mutt conventions, and removed dead code left over from the + * original. Also, there is now a builtin-test, just compile with: + * gcc -DTEST_SNPRINTF -o snprintf snprintf.c -lm + * and run snprintf for results. + * + * Thomas Roessler 01/27/98 for mutt 0.89i + * The PGP code was using unsigned hexadecimal formats. + * Unfortunately, unsigned formats simply didn't work. + * + * Michael Elkins 03/05/98 for mutt 0.90.8 + * The original code assumed that both snprintf() and vsnprintf() were + * missing. Some systems only have snprintf() but not vsnprintf(), so + * the code is now broken down under HAVE_SNPRINTF and HAVE_VSNPRINTF. + * + **************************************************************/ + +#if !defined(HAVE_SNPRINTF) || !defined(HAVE_VSNPRINTF) + +/* varargs declarations: */ + +# define HAVE_STDARGS /* let's hope that works everywhere (mj) */ +# define VA_LOCAL_DECL va_list ap +# define VA_START(f) va_start(ap, f) +# define VA_SHIFT(v,t) ; /* no-op for ANSI */ +# define VA_END va_end(ap) + + +static void dopr (char *buffer, size_t maxlen, const char *format, + va_list args); +static void fmtstr (char *buffer, size_t *currlen, size_t maxlen, + char *value, int flags, int min, int max); +static void fmtint (char *buffer, size_t *currlen, size_t maxlen, + long value, int base, int min, int max, int flags); +static void fmtfp (char *buffer, size_t *currlen, size_t maxlen, + long double fvalue, int min, int max, int flags); +static void dopr_outch (char *buffer, size_t *currlen, size_t maxlen, char c ); + +/* + * dopr(): poor man's version of doprintf + */ + +/* format read states */ +#define DP_S_DEFAULT 0 +#define DP_S_FLAGS 1 +#define DP_S_MIN 2 +#define DP_S_DOT 3 +#define DP_S_MAX 4 +#define DP_S_MOD 5 +#define DP_S_CONV 6 +#define DP_S_DONE 7 + +/* format flags - Bits */ +#define DP_F_MINUS (1 << 0) +#define DP_F_PLUS (1 << 1) +#define DP_F_SPACE (1 << 2) +#define DP_F_NUM (1 << 3) +#define DP_F_ZERO (1 << 4) +#define DP_F_UP (1 << 5) +#define DP_F_UNSIGNED (1 << 6) + +/* Conversion Flags */ +#define DP_C_SHORT 1 +#define DP_C_LONG 2 +#define DP_C_LDOUBLE 3 + +#define char_to_int(p) (p - '0') +#undef MAX +#define MAX(p,q) ((p >= q) ? p : q) + +static void dopr (char *buffer, size_t maxlen, const char *format, va_list args) +{ + char ch; + long value; + long double fvalue; + char *strvalue; + int min; + int max; + int state; + int flags; + int cflags; + size_t currlen; + + state = DP_S_DEFAULT; + currlen = flags = cflags = min = 0; + max = -1; + ch = *format++; + + while (state != DP_S_DONE) + { + if ((ch == '\0') || (currlen >= maxlen)) + state = DP_S_DONE; + + switch(state) + { + case DP_S_DEFAULT: + if (ch == '%') + state = DP_S_FLAGS; + else + dopr_outch (buffer, &currlen, maxlen, ch); + ch = *format++; + break; + case DP_S_FLAGS: + switch (ch) + { + case '-': + flags |= DP_F_MINUS; + ch = *format++; + break; + case '+': + flags |= DP_F_PLUS; + ch = *format++; + break; + case ' ': + flags |= DP_F_SPACE; + ch = *format++; + break; + case '#': + flags |= DP_F_NUM; + ch = *format++; + break; + case '0': + flags |= DP_F_ZERO; + ch = *format++; + break; + default: + state = DP_S_MIN; + break; + } + break; + case DP_S_MIN: + if (isdigit((unsigned char)ch)) + { + min = 10*min + char_to_int (ch); + ch = *format++; + } + else if (ch == '*') + { + min = va_arg (args, int); + ch = *format++; + state = DP_S_DOT; + } + else + state = DP_S_DOT; + break; + case DP_S_DOT: + if (ch == '.') + { + state = DP_S_MAX; + ch = *format++; + } + else + state = DP_S_MOD; + break; + case DP_S_MAX: + if (isdigit((unsigned char)ch)) + { + if (max < 0) + max = 0; + max = 10*max + char_to_int (ch); + ch = *format++; + } + else if (ch == '*') + { + max = va_arg (args, int); + ch = *format++; + state = DP_S_MOD; + } + else + state = DP_S_MOD; + break; + case DP_S_MOD: + /* Currently, we don't support Long Long, bummer */ + switch (ch) + { + case 'h': + cflags = DP_C_SHORT; + ch = *format++; + break; + case 'l': + cflags = DP_C_LONG; + ch = *format++; + break; + case 'L': + cflags = DP_C_LDOUBLE; + ch = *format++; + break; + default: + break; + } + state = DP_S_CONV; + break; + case DP_S_CONV: + switch (ch) + { + case 'd': + case 'i': + if (cflags == DP_C_SHORT) + value = va_arg (args, int); + else if (cflags == DP_C_LONG) + value = va_arg (args, long int); + else + value = va_arg (args, int); + fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags); + break; + case 'o': + flags |= DP_F_UNSIGNED; + if (cflags == DP_C_SHORT) + value = va_arg (args, int); + else if (cflags == DP_C_LONG) + value = va_arg (args, unsigned long int); + else + value = va_arg (args, unsigned int); + fmtint (buffer, &currlen, maxlen, value, 8, min, max, flags); + break; + case 'u': + flags |= DP_F_UNSIGNED; + if (cflags == DP_C_SHORT) + value = va_arg (args, int); + else if (cflags == DP_C_LONG) + value = va_arg (args, unsigned long int); + else + value = va_arg (args, unsigned int); + fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags); + break; + case 'X': + flags |= DP_F_UP; + case 'x': + flags |= DP_F_UNSIGNED; + if (cflags == DP_C_SHORT) + value = va_arg (args, int); + else if (cflags == DP_C_LONG) + value = va_arg (args, unsigned long int); + else + value = va_arg (args, unsigned int); + fmtint (buffer, &currlen, maxlen, value, 16, min, max, flags); + break; + case 'f': + if (cflags == DP_C_LDOUBLE) + fvalue = va_arg (args, long double); + else + fvalue = va_arg (args, double); + /* um, floating point? */ + fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags); + break; + case 'E': + flags |= DP_F_UP; + case 'e': + if (cflags == DP_C_LDOUBLE) + fvalue = va_arg (args, long double); + else + fvalue = va_arg (args, double); + break; + case 'G': + flags |= DP_F_UP; + case 'g': + if (cflags == DP_C_LDOUBLE) + fvalue = va_arg (args, long double); + else + fvalue = va_arg (args, double); + break; + case 'c': + dopr_outch (buffer, &currlen, maxlen, va_arg (args, int)); + break; + case 's': + strvalue = va_arg (args, char *); + if (max < 0) + max = maxlen; /* ie, no max */ + fmtstr (buffer, &currlen, maxlen, strvalue, flags, min, max); + break; + case 'p': + strvalue = va_arg (args, void *); + fmtint (buffer, &currlen, maxlen, (long) strvalue, 16, min, max, flags); + break; + case 'n': + if (cflags == DP_C_SHORT) + { + short int *num; + num = va_arg (args, short int *); + *num = currlen; + } + else if (cflags == DP_C_LONG) + { + long int *num; + num = va_arg (args, long int *); + *num = currlen; + } + else + { + int *num; + num = va_arg (args, int *); + *num = currlen; + } + break; + case '%': + dopr_outch (buffer, &currlen, maxlen, ch); + break; + case 'w': + /* not supported yet, treat as next char */ + ch = *format++; + break; + default: + /* Unknown, skip */ + break; + } + ch = *format++; + state = DP_S_DEFAULT; + flags = cflags = min = 0; + max = -1; + break; + case DP_S_DONE: + break; + default: + /* hmm? */ + break; /* some picky compilers need this */ + } + } + if (currlen < maxlen - 1) + buffer[currlen] = '\0'; + else + buffer[maxlen - 1] = '\0'; +} + +static void fmtstr (char *buffer, size_t *currlen, size_t maxlen, + char *value, int flags, int min, int max) +{ + int padlen, strln; /* amount to pad */ + int cnt = 0; + + if (value == 0) + { + value = ""; + } + + for (strln = 0; value[strln]; ++strln); /* strlen */ + padlen = min - strln; + if (padlen < 0) + padlen = 0; + if (flags & DP_F_MINUS) + padlen = -padlen; /* Left Justify */ + + while ((padlen > 0) && (cnt < max)) + { + dopr_outch (buffer, currlen, maxlen, ' '); + --padlen; + ++cnt; + } + while (*value && (cnt < max)) + { + dopr_outch (buffer, currlen, maxlen, *value++); + ++cnt; + } + while ((padlen < 0) && (cnt < max)) + { + dopr_outch (buffer, currlen, maxlen, ' '); + ++padlen; + ++cnt; + } +} + +/* Have to handle DP_F_NUM (ie 0x and 0 alternates) */ + +static void fmtint (char *buffer, size_t *currlen, size_t maxlen, + long value, int base, int min, int max, int flags) +{ + int signvalue = 0; + unsigned long uvalue; + char convert[20]; + int place = 0; + int spadlen = 0; /* amount to space pad */ + int zpadlen = 0; /* amount to zero pad */ + int caps = 0; + + if (max < 0) + max = 0; + + uvalue = value; + + if(!(flags & DP_F_UNSIGNED)) + { + if( value < 0 ) { + signvalue = '-'; + uvalue = -value; + } + else + if (flags & DP_F_PLUS) /* Do a sign (+/i) */ + signvalue = '+'; + else + if (flags & DP_F_SPACE) + signvalue = ' '; + } + + if (flags & DP_F_UP) caps = 1; /* Should characters be upper case? */ + + do { + convert[place++] = + (caps? "0123456789ABCDEF":"0123456789abcdef") + [uvalue % (unsigned)base ]; + uvalue = (uvalue / (unsigned)base ); + } while(uvalue && (place < 20)); + if (place == 20) place--; + convert[place] = 0; + + zpadlen = max - place; + spadlen = min - MAX (max, place) - (signvalue ? 1 : 0); + if (zpadlen < 0) zpadlen = 0; + if (spadlen < 0) spadlen = 0; + if (flags & DP_F_ZERO) + { + zpadlen = MAX(zpadlen, spadlen); + spadlen = 0; + } + if (flags & DP_F_MINUS) + spadlen = -spadlen; /* Left Justifty */ + +#ifdef DEBUG_SNPRINTF + dprint (1, (debugfile, "zpad: %d, spad: %d, min: %d, max: %d, place: %d\n", + zpadlen, spadlen, min, max, place)); +#endif + + /* Spaces */ + while (spadlen > 0) + { + dopr_outch (buffer, currlen, maxlen, ' '); + --spadlen; + } + + /* Sign */ + if (signvalue) + dopr_outch (buffer, currlen, maxlen, signvalue); + + /* Zeros */ + if (zpadlen > 0) + { + while (zpadlen > 0) + { + dopr_outch (buffer, currlen, maxlen, '0'); + --zpadlen; + } + } + + /* Digits */ + while (place > 0) + dopr_outch (buffer, currlen, maxlen, convert[--place]); + + /* Left Justified spaces */ + while (spadlen < 0) { + dopr_outch (buffer, currlen, maxlen, ' '); + ++spadlen; + } +} + +static long double abs_val (long double value) +{ + long double result = value; + + if (value < 0) + result = -value; + + return result; +} + +static long double pow10 (int exp) +{ + long double result = 1; + + while (exp) + { + result *= 10; + exp--; + } + + return result; +} + +static long round (long double value) +{ + long intpart; + + intpart = value; + value = value - intpart; + if (value >= 0.5) + intpart++; + + return intpart; +} + +static void fmtfp (char *buffer, size_t *currlen, size_t maxlen, + long double fvalue, int min, int max, int flags) +{ + int signvalue = 0; + long double ufvalue; + char iconvert[20]; + char fconvert[20]; + int iplace = 0; + int fplace = 0; + int padlen = 0; /* amount to pad */ + int zpadlen = 0; + int caps = 0; + long intpart; + long fracpart; + + /* + * AIX manpage says the default is 0, but Solaris says the default + * is 6, and sprintf on AIX defaults to 6 + */ + if (max < 0) + max = 6; + + ufvalue = abs_val (fvalue); + + if (fvalue < 0) + signvalue = '-'; + else + if (flags & DP_F_PLUS) /* Do a sign (+/i) */ + signvalue = '+'; + else + if (flags & DP_F_SPACE) + signvalue = ' '; + + intpart = ufvalue; + + /* + * Sorry, we only support 9 digits past the decimal because of our + * conversion method + */ + if (max > 9) + max = 9; + + /* We "cheat" by converting the fractional part to integer by + * multiplying by a factor of 10 + */ + fracpart = round ((pow10 (max)) * (ufvalue - intpart)); + + if (fracpart >= pow10 (max)) + { + intpart++; + fracpart -= pow10 (max); + } + +#ifdef DEBUG_SNPRINTF + dprint (1, (debugfile, "fmtfp: %f =? %d.%d\n", fvalue, intpart, fracpart)); +#endif + + /* Convert integer part */ + do { + iconvert[iplace++] = + (caps? "0123456789ABCDEF":"0123456789abcdef")[intpart % 10]; + intpart = (intpart / 10); + } while(intpart && (iplace < 20)); + if (iplace == 20) iplace--; + iconvert[iplace] = 0; + + /* Convert fractional part */ + do { + fconvert[fplace++] = + (caps? "0123456789ABCDEF":"0123456789abcdef")[fracpart % 10]; + fracpart = (fracpart / 10); + } while(fracpart && (fplace < 20)); + if (fplace == 20) fplace--; + fconvert[fplace] = 0; + + /* -1 for decimal point, another -1 if we are printing a sign */ + padlen = min - iplace - max - 1 - ((signvalue) ? 1 : 0); + zpadlen = max - fplace; + if (zpadlen < 0) + zpadlen = 0; + if (padlen < 0) + padlen = 0; + if (flags & DP_F_MINUS) + padlen = -padlen; /* Left Justifty */ + + if ((flags & DP_F_ZERO) && (padlen > 0)) + { + if (signvalue) + { + dopr_outch (buffer, currlen, maxlen, signvalue); + --padlen; + signvalue = 0; + } + while (padlen > 0) + { + dopr_outch (buffer, currlen, maxlen, '0'); + --padlen; + } + } + while (padlen > 0) + { + dopr_outch (buffer, currlen, maxlen, ' '); + --padlen; + } + if (signvalue) + dopr_outch (buffer, currlen, maxlen, signvalue); + + while (iplace > 0) + dopr_outch (buffer, currlen, maxlen, iconvert[--iplace]); + + /* + * Decimal point. This should probably use locale to find the correct + * char to print out. + */ + dopr_outch (buffer, currlen, maxlen, '.'); + + while (fplace > 0) + dopr_outch (buffer, currlen, maxlen, fconvert[--fplace]); + + while (zpadlen > 0) + { + dopr_outch (buffer, currlen, maxlen, '0'); + --zpadlen; + } + + while (padlen < 0) + { + dopr_outch (buffer, currlen, maxlen, ' '); + ++padlen; + } +} + +static void dopr_outch (char *buffer, size_t *currlen, size_t maxlen, char c) +{ + if (*currlen < maxlen) + buffer[(*currlen)++] = c; +} +#endif /* !defined(HAVE_SNPRINTF) || !defined(HAVE_VSNPRINTF) */ + +#ifndef HAVE_VSNPRINTF +int vsnprintf (char *str, size_t count, const char *fmt, va_list args) +{ + str[0] = 0; + dopr(str, count, fmt, args); + return(strlen(str)); +} +#endif /* !HAVE_VSNPRINTF */ + +#ifndef HAVE_SNPRINTF +/* VARARGS3 */ +#ifdef HAVE_STDARGS +int snprintf (char *str,size_t count,const char *fmt,...) +#else +int snprintf (va_alist) va_dcl +#endif +{ +#ifndef HAVE_STDARGS + char *str; + size_t count; + char *fmt; +#endif + VA_LOCAL_DECL; + + VA_START (fmt); + VA_SHIFT (str, char *); + VA_SHIFT (count, size_t ); + VA_SHIFT (fmt, char *); + (void) vsnprintf(str, count, fmt, ap); + VA_END; + return(strlen(str)); +} + +#ifdef TEST_SNPRINTF +#ifndef LONG_STRING +#define LONG_STRING 1024 +#endif +int main (void) +{ + char buf1[LONG_STRING]; + char buf2[LONG_STRING]; + char *fp_fmt[] = { + "%-1.5f", + "%1.5f", + "%123.9f", + "%10.5f", + "% 10.5f", + "%+22.9f", + "%+4.9f", + "%01.3f", + "%4f", + "%3.1f", + "%3.2f", + NULL + }; + double fp_nums[] = { -1.5, 134.21, 91340.2, 341.1234, 0203.9, 0.96, 0.996, + 0.9996, 1.996, 4.136, 0}; + char *int_fmt[] = { + "%-1.5d", + "%1.5d", + "%123.9d", + "%5.5d", + "%10.5d", + "% 10.5d", + "%+22.33d", + "%01.3d", + "%4d", + NULL + }; + long int_nums[] = { -1, 134, 91340, 341, 0203, 0}; + int x, y; + int fail = 0; + int num = 0; + + printf ("Testing snprintf format codes against system sprintf...\n"); + + for (x = 0; fp_fmt[x] != NULL ; x++) + for (y = 0; fp_nums[y] != 0 ; y++) + { + snprintf (buf1, sizeof (buf1), fp_fmt[x], fp_nums[y]); + sprintf (buf2, fp_fmt[x], fp_nums[y]); + if (strcmp (buf1, buf2)) + { + printf("snprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf = %s\n", /* __SPRINTF_CHECKED__ */ + fp_fmt[x], buf1, buf2); + fail++; + } + num++; + } + + for (x = 0; int_fmt[x] != NULL ; x++) + for (y = 0; int_nums[y] != 0 ; y++) + { + snprintf (buf1, sizeof (buf1), int_fmt[x], int_nums[y]); + sprintf (buf2, int_fmt[x], int_nums[y]); + if (strcmp (buf1, buf2)) + { + printf("snprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf = %s\n", /* __SPRINTF_CHECKED__ */ + int_fmt[x], buf1, buf2); + fail++; + } + num++; + } + printf ("%d tests failed out of %d.\n", fail, num); +} +#endif /* SNPRINTF_TEST */ + +#endif /* !HAVE_SNPRINTF */ + + /* * Copyright 1996, 1997, 1998, 1999, 2000 Michiel Boland. * Under the BSD license (without advertising clause) @@ -585,6 +1350,82 @@ time_t rfc2time(char *s) day + daytab[year % 4 == 0][mon] + 365L * (year - 1970L) + ((year - 1969L) >> 2)))); } +#ifndef HAVE_STRLCPY +/* + * bsd'sh strlcpy(). + * The strlcpy() function copies up to size-1 characters from the + * NUL-terminated string src to dst, NUL-terminating the result. + * Return: total length of the string tried to create. + */ +size_t +strlcpy(char *dst, const char *src, size_t size) +{ + size_t len = strlen(src); + size_t ret = len; + + if (size <= 0) + return 0; + if (len >= size) + len = size - 1; + memcpy(dst, src, len); + dst[len] = 0; + + return ret; +} +#endif + +#ifndef HAVE_STRLCAT +/* + * bsd'sh strlcat(). + * The strlcat() function appends the NUL-terminated string src to the end of + * dst. It will append at most size - strlen(dst) - 1 bytes, NUL-terminating + * the result. + */ +size_t +strlcat(char *dst, const char *src, size_t size) +{ + size_t len1 = strlen(dst); + size_t len2 = strlen(src); + size_t ret = len1 + len2; + + if (len1 + len2 >= size) + len2 = size - (len1 + 1); + + if (len2 > 0) { + memcpy(dst + len1, src, len2); + dst[len1 + len2] = 0; + } + + return ret; +} +#endif + +#ifndef HAVE_STRLNCAT +/* + * see strlcat(), but never cat more then n characters. + */ +size_t +strlncat(char *dst, const char *src, size_t size, size_t n) +{ + size_t len1 = strlen(dst); + size_t len2 = strlen(src); + size_t ret = len1 + len2; + + if (len2 > n) + len2 = n; + + if (len1 + len2 >= size) + len2 = size - (len1 + 1); + + if (len2 > 0) { + memcpy(dst + len1, src, len2); + dst[len1 + len2] = 0; + } + + return ret; +} +#endif + static const char Base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static const char Pad64 = '='; diff --git a/src/version.c.SH b/src/version.c.SH index f61218e19..9225e4252 100644 --- a/src/version.c.SH +++ b/src/version.c.SH @@ -91,12 +91,10 @@ char *unrealcredits[] = "{X} (Laurie) x@tspre.org", "- Making the main code/design of UnrealIRCd/32 gui", " bugfounds, etc", - "www.secure-tech.net", + "Phil Veale - email@philipveale.com - www.flame.tiefighter.org", "- Donating webhosting", "TheDarkOne & x-irc.net", - "- Donating DNS and development shells", - "irc4ever.net", - "- Donating backup DNS", + "- Development shells", "RaYmAn (Jens Andersen)", "- Supporting with hardware, software, movies, etc, and for", " a great friendship, and spending a lot of time with sts", @@ -121,8 +119,12 @@ char *unrealcredits[] = " - donation to the UnrealIRCd development", "Jan Knutar (JK@IRC)", " - RAM donation, Shell donations :D, and a hell lot of other stuff", + "ThePlayer", + " - Donation to re-buy tspre.org", "Thanks to Headbang and WonderWal too for hardware+software", "donations", + "powerstorm.net", + " - Donating an alpha shell", " (yes your name can be here too;)", "", " \37These people have helped alpha/betatesting/fixing bugs\37", @@ -139,6 +141,7 @@ char *unrealcredits[] = "nemesis - nemesis@unrealircd.info", "Ron885 - Ron885@unrealircd.info", "iDW-badSol - iDW-badSol@unrealircd.info", + "SciFi - SciFi@unrealircd.info", "", "Thanks to former supporters, and anyone who has helped without", "officially joining the staff", diff --git a/src/win32/Win32GUI.c b/src/win32/Win32GUI.c index 09cb7347a..dfc62d85a 100644 --- a/src/win32/Win32GUI.c +++ b/src/win32/Win32GUI.c @@ -175,23 +175,19 @@ LRESULT RESubClassFunc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) { * (c) 2001 codemastr */ typedef struct colorlist { + struct colorlist *prev,*next; char *color; - struct colorlist *next, *prev; } ColorList; ColorList *TextColors = NULL; void AddColor(char *color) { ColorList *clist; - clist = MyMalloc(sizeof(ColorList)); + clist = MyMallocEx(sizeof(ColorList)); if (!clist) return; clist->color = strdup(color); - clist->prev = NULL; - clist->next = TextColors; - if (TextColors) - TextColors->prev = clist; - TextColors = clist; + AddListItem(clist,TextColors); } ColorList *DelNewestColor() { @@ -207,14 +203,13 @@ ColorList *DelNewestColor() { } void WipeColors() { - ColorList *clist, q; + ColorList *clist, *next; - for (clist = TextColors; clist; clist = clist->next) + for (clist = TextColors; clist; clist = next) { - q.next = clist->next; + next = clist->next; MyFree(clist->color); MyFree(clist); - clist = &q; } } @@ -267,6 +262,7 @@ DWORD CALLBACK RTFToIRC(int fd, char *pbBuff, long cb) { char cmd[15], value[500], color[25], colorbuf[4]; char colors[16]; pbBuff++; + TextColors = NULL; bzero(buffer, cb); for (; *pbBuff; pbBuff++) { if (*pbBuff == '\r' || *pbBuff == '\n')