Index: AUTHORS =================================================================== RCS file: /srv/cvs/ngircd/ngircd/AUTHORS,v retrieving revision 1.8.2.2 retrieving revision 1.11 diff -u -p -r1.8.2.2 -r1.11 --- AUTHORS 26 Jan 2005 13:26:41 -0000 1.8.2.2 +++ AUTHORS 19 Mar 2005 14:24:52 -0000 1.11 @@ -21,7 +21,7 @@ Goetz Hoffart, (goetz Ilja Osthoff, (ilja) Benjamin Pineau, Sean Reifschneider, -Florian Westphal, +Florian Westphal, (fw) Code snippets @@ -32,4 +32,4 @@ Andrew Tridgell & Martin Pool: strl{cpy| -- -$Id: AUTHORS,v 1.8.2.2 2005/01/26 13:26:41 alex Exp $ +$Id: AUTHORS,v 1.11 2005/03/19 14:24:52 alex Exp $ Index: ChangeLog =================================================================== RCS file: /srv/cvs/ngircd/ngircd/ChangeLog,v retrieving revision 1.233.2.20 retrieving revision 1.276.2.3 diff -u -p -r1.233.2.20 -r1.276.2.3 --- ChangeLog 3 Feb 2005 10:16:25 -0000 1.233.2.20 +++ ChangeLog 5 Jul 2005 22:58:25 -0000 1.276.2.3 @@ -1,7 +1,7 @@ ngIRCd - Next Generation IRC Server - (c)2001-2005 Alexander Barton, + (c)2001-2005 Alexander Barton, alex@barton.de, http://www.barton.de/ ngIRCd is free software and published under the @@ -10,6 +10,56 @@ -- ChangeLog -- +ngIRCd 0.9.x + + - Fixed maximum length of user names, now allow up to 9 characters. + - Cut off oversized IRC messages that should be sent to the network instead + of shuttding down the (wrong) connection. + - Don't generate error messages for unknown commands received before the + client is registered with the server (like the original ircd). + - Never run with root privileges but always switch the user ID. + - Make "netsplit" messages RFC compliant. + - Fix handling of QUIT Messages: send only one message, even if the client + is member of multiple channels. + - Don't exit server if closing of a socket fails; instead ignore it and + pray that this will be "the right thing" ... + - Implemented the IRC function "WHOWAS". + - Don't enable assert() calls when not ./configure'd with --enable-debug. + - Fixed ./configure test for TCP Wrappers: now it runs on Mac OS X as well. + - Enhanced configure script: now you can pass an (optional) search path + to all --with-XXX parameters, e. g. "--with-ident=/opt/ident". + - Removed typedefs for the native C datatypes. + Use stdbool.h / inttypes.h if available. + - New configuration option "OperServerMode" to enable a workaround needed + when running an network with ircd2 servers and "OperCanUseMode" enabled + to prevent the ircd2 daemon to drop mode changes of IRC operators. + Patch by Florian Westphal, . + - Implemented support for "secret channels" (channel mode "s"). + - New configuration option "Mask" for [Operator] sections to limit OPER + commands to users with a specific IRC mask. Patch from Florian Westphal. + - Write "error file" (/tmp/ngircd-XXX.err) only if compiled with debug + code ("--enable-debug") and running as daemon process. + - Don't create version information string each time a client connects + but instead on server startup. By Florian Westphal. + - New configuration variable "PidFile", section "[Global]": if defined, + the server writes its process ID (PID) to this file. Default: off. + Idea of Florian Westphal, . + - Code cleanups from Florian Westphal, . + - Raised the maximum length of passwords to 20 characters. + - Fixed a memory leak when resizing the connection pool and realloc() + failed. Now we don't fall back to malloc(), which should be sane anyway. + Patch from Florian Westphal, . + - Added support for the Howl (http://www.porchdogsoft.com/products/howl/) + Rendezvous API, in addition to the API of Apple (Mac OS X). The available + API will be autodetected when you call "./configure --with-rendezvous". + - Made ngIRCd compile on HP/UX 10.20 with native HP pre-ANSI C compiler and + most probably other older C compilers on other systems. + - When the daemon should switch to another user ID (ServerID is defined in + the configuration file) and is not running in a chroot environment, it + changes its working directory to the home directory of this user. This + should enable the system to write proper core files when not running with + root privileges ... + ngIRCd 0.8.3 (2005-02-03) - Fixed a bug that could case a root exploit when the daemon is compiled @@ -31,12 +81,12 @@ ngIRCd 0.8.2 (2005-01-26) It has only been used when the system didn't implement strlcpy by itself, not on "modern" systems. Florian Westphal, . -nIRCd 0.8.1 (2004-12-25) +ngIRCd 0.8.1 (2004-12-25) - Autoconf: Updated config.guess and config.sub - Added some more debug code ... - Fixed wrong variable names in output of "ngircd --configtest". - - Debian: Fxied the name of the "default file" in the init script for + - Debian: Fixed the name of the "default file" in the init script for ngircd-full packages. And do the test if the binary is executable after reading this file. - Enhanced the "test suite": please have a look at src/testsuite/README! @@ -45,11 +95,11 @@ ngIRCd 0.8.0 (2004-06-26) - Fixed wrong buffer size calculation for results of the resolver. - ngIRCd 0.8.0-pre2 (2004-05-16) + ngircd 0.8.0-pre2 (2004-05-16) - Enhanced logging to console when running in "no-detached mode": added PID and log messages of resolver sub-processes. - Fixed host name lookups when using IDENT user lookups. - - "make clean" and "make maintainer-clean" remove more files mow. + - "make clean" and "make maintainer-clean" remove more files now. ngIRCd 0.8.0-pre1 (2004-05-07) - Two new configuration options: "ChrootDir" and "MotdPhrase", thanks to @@ -561,4 +611,4 @@ ngIRCd 0.0.1, 31.12.2001 -- -$Id: ChangeLog,v 1.233.2.20 2005/02/03 10:16:25 alex Exp $ +$Id: ChangeLog,v 1.276.2.3 2005/07/05 22:58:25 alex Exp $ Index: INSTALL =================================================================== RCS file: /srv/cvs/ngircd/ngircd/INSTALL,v retrieving revision 1.18.2.2 retrieving revision 1.21 diff -u -p -r1.18.2.2 -r1.21 --- INSTALL 3 Sep 2004 20:02:02 -0000 1.18.2.2 +++ INSTALL 10 Feb 2005 08:20:09 -0000 1.21 @@ -14,6 +14,12 @@ I. Upgrade Information ~~~~~~~~~~~~~~~~~~~~~~ +Differences to version 0.8.x + +- The maximum length of passwords has been raised to 20 characters (instead + of 8 characters). If your passwords are longer than 8 characters then they + are cut at an other position now. + Differences to version 0.6.x - Some options of the configure script have been renamed: @@ -177,4 +183,4 @@ number. In both cases the server exits a -- -$Id: INSTALL,v 1.18.2.2 2004/09/03 20:02:02 alex Exp $ +$Id: INSTALL,v 1.21 2005/02/10 08:20:09 alex Exp $ Index: Makefile.am =================================================================== RCS file: /srv/cvs/ngircd/ngircd/Makefile.am,v retrieving revision 1.14.2.1 retrieving revision 1.16 diff -u -p -r1.14.2.1 -r1.16 --- Makefile.am 11 May 2004 00:38:17 -0000 1.14.2.1 +++ Makefile.am 9 Apr 2005 12:27:40 -0000 1.16 @@ -8,7 +8,7 @@ # (at your option) any later version. # Please read the file COPYING, README and AUTHORS for more information. # -# $Id: Makefile.am,v 1.14.2.1 2004/05/11 00:38:17 alex Exp $ +# $Id: Makefile.am,v 1.16 2005/04/09 12:27:40 alex Exp $ # AUTOMAKE_OPTIONS = gnu @@ -27,6 +27,15 @@ maintainer-clean-local: lint: make -C src/ngircd lint +srcdoc: + make -C src srcdoc + +xcode: + @xcodebuild -project contrib/MacOSX/ngIRCd.xcode -list >/dev/null 2>&1 \ + || ( echo; echo "Error: \"xcodebuild\" not found!"; echo; exit 1 ) + xcodebuild -project contrib/MacOSX/ngIRCd.xcode -alltargets \ + -buildstyle Development + rpm: distcheck rpm -ta ngircd-*.tar.gz Index: NEWS =================================================================== RCS file: /srv/cvs/ngircd/ngircd/NEWS,v retrieving revision 1.64.2.3 retrieving revision 1.74 diff -u -p -r1.64.2.3 -r1.74 --- NEWS 26 Jun 2004 09:12:38 -0000 1.64.2.3 +++ NEWS 26 Jun 2005 21:54:02 -0000 1.74 @@ -1,7 +1,7 @@ ngIRCd - Next Generation IRC Server - (c)2001-2004 by Alexander Barton, + (c)2001-2005 Alexander Barton, alex@barton.de, http://www.barton.de/ ngIRCd is free software and published under the @@ -10,6 +10,25 @@ -- NEWS -- +ngIRCd 0.9.0 + + - Never run with root privileges but always switch the user ID. + - Make "netsplit" messages RFC compliant. + - Implemented the IRC function "WHOWAS". + - New configuration option "OperServerMode" to enable a workaround needed + when running an network with ircd2 servers and "OperCanUseMode" enabled + to prevent the ircd2 daemon to drop mode changes of IRC operators. + Patch by Florian Westphal, . + - Implemented support for "secret channels" (channel mode "s"). + - New configuration option "Mask" for [Operator] sections to limit OPER + commands to users with a specific IRC mask. Patch from Florian Westphal. + - New configuration variable "PidFile", section "[Global]": if defined, + the server writes its process ID (PID) to this file. Default: off. + Idea of Florian Westphal, . + - Added support for the Howl (http://www.porchdogsoft.com/products/howl/) + Rendezvous API, in addition to the API of Apple (Mac OS X). The available + API will be autodetected when you call "./configure --with-rendezvous". + ngIRCd 0.8.0 (2004-06-26) - Two new configuration options: "ChrootDir" and "MotdPhrase", thanks to @@ -52,7 +71,7 @@ ngIRCd 0.7.0 (2003-05-01) - Added support for TCP Wrappers library: pass "--with-tcp-wrappers" to configure to enable it. - Changed some configure options to use "--with"/"--without" as prefix - insetead of "--enable"/"--disable": "--without-syslog", "--without-zlib", + instead of "--enable"/"--disable": "--without-syslog", "--without-zlib", "--with-tcp-wrappers", and "--with-rendezvous". - Enhanced manual pages ngircd(8) and ngircd.conf(5). - Documentation is now installed in $(datadir)/doc/ngircd. @@ -189,4 +208,4 @@ ngIRCd 0.0.1, 31.12.2001 -- -$Id: NEWS,v 1.64.2.3 2004/06/26 09:12:38 alex Exp $ +$Id: NEWS,v 1.74 2005/06/26 21:54:02 alex Exp $ Index: README =================================================================== RCS file: /srv/cvs/ngircd/ngircd/README,v retrieving revision 1.18.2.1 retrieving revision 1.20 diff -u -p -r1.18.2.1 -r1.20 --- README 7 May 2004 11:24:17 -0000 1.18.2.1 +++ README 26 Jun 2005 21:54:01 -0000 1.20 @@ -1,21 +1,19 @@ ngIRCd - Next Generation IRC Server - (c)2001-2004 by Alexander Barton, + (c)2001-2005 Alexander Barton, alex@barton.de, http://www.barton.de/ ngIRCd is free software and published under the terms of the GNU General Public License. -- README -- - - Ilja Osthoff, I. Introduction ~~~~~~~~~~~~~~~ -ngIRCd is an Open-Source server for the Internet Relay Chat (IRC), which +ngIRCd is an Open Source server for the Internet Relay Chat (IRC), which is developed and published under the terms of the GNU General Public Licence (URL: http://www.gnu.org/licenses/gpl.html). ngIRCd means "next generation IRC daemon", it's written from scratch and not deduced from the @@ -25,15 +23,19 @@ generation IRC daemon", it's written fro II. Status ~~~~~~~~~~~ -At present, the ngIRCd is under active development, some features are not -implemented, some only partly. +It is not the goal of ngIRCd to implement all the nasty behaviours of the +original ircd, but to implement most of the useful commands and semantics +specified by the RFCs. -Till today (more or less complete) implemented IRC-commands: +In the meantime ngIRCd should be quite feature complete and stable to be +used in real IRC networks. + +Implemented IRC-commands are: ADMIN, AWAY, CHANINFO, CONNECT, DIE, DISCONNECT, ERROR, HELP, INVITE, ISON, -JOIN, KICK, KILL, LINKS, LIST, LUSERS, MODE, MOTD, NAMES, NICK, NJOIN, -NOTICE, OPER, PART, PASS, PING, PONG, PRIVMSG, QUIT, REHASH, RESTART, SERVER, -SQUIT, STATS, TIME, TOPIC, TRACE, USER, USERHOST, VERSION, WHO, WHOIS. +JOIN, KICK, KILL, LINKS, LIST, LUSERS, MODE, MOTD, NAMES, NICK, NJOIN, NOTICE, +OPER, PART, PASS, PING, PONG, PRIVMSG, QUIT, REHASH, RESTART, SERVER, SQUIT, +STATS, TIME, TOPIC, TRACE, USER, USERHOST, VERSION, WHO, WHOIS, WHOWAS. III. Features (or: why use ngIRCd?) @@ -43,10 +45,8 @@ III. Features (or: why use ngIRCd?) - simple, easy understandable configuration file, - freely published open-source C source code, - ngIRCd will be developed on in the future. -- supported platforms (tested versions): AIX (3.2.5), A/UX (3.0.1), FreeBSD - (4.5), HP-UX (10.20), IRIX (6.5), Linux (2.x), Mac OS X (10.x), NetBSD - (1.5.2/i386, 1.5.3/m68k), Solaris (2.5.1, 2.6), Windows with Cygwin, and - OpenBSD (3.4/i386). +- wide field of supported platforms, including AIX, A/UX, FreeBSD, HP-UX, + IRIX, Linux, Mac OS X, NetBSD, OpenBSD, Solaris, and Windows with Cygwin. IV. Documentation @@ -84,4 +84,4 @@ mail to: or /dev/null 2>&1 if [ $? -eq 0 ]; then - echo "${name}-${major}.${minor}" >/dev/null 2>&1 + echo "${name}-${major}.${minor}" return 0 fi done @@ -125,7 +125,11 @@ fi [ "$VERBOSE" = "1" ] && echo "Using \"$EXIST\" to test for tools." # We want to use GNU automake 1.7, if available (WANT_AUTOMAKE is used by -# the wrapper scripts of Gentoo Linux): +# the wrapper scripts of Gentoo Linux, AUTOMAKE_VERSION is used by OpenBSD); +# same applies for GNU autoconf, we want to use version 2.59. +AUTOMAKE_VERSION=1.7 +AUTOCONF_VERSION=2.59 +export AUTOMAKE_VERSION AUTOCONF_VERSION WANT_AUTOMAKE=1.7 export WANT_AUTOMAKE Index: configure.in =================================================================== RCS file: /srv/cvs/ngircd/ngircd/configure.in,v retrieving revision 1.102.2.7 retrieving revision 1.111.2.1 diff -u -p -r1.102.2.7 -r1.111.2.1 --- configure.in 3 Feb 2005 10:16:25 -0000 1.102.2.7 +++ configure.in 27 Jun 2005 16:12:51 -0000 1.111.2.1 @@ -8,13 +8,13 @@ # (at your option) any later version. # Please read the file COPYING, README and AUTHORS for more information. # -# $Id: configure.in,v 1.102.2.7 2005/02/03 10:16:25 alex Exp $ +# $Id: configure.in,v 1.111.2.1 2005/06/27 16:12:51 alex Exp $ # # -- Initialisation -- AC_PREREQ(2.50) -AC_INIT(ngircd, 0.8.3) +AC_INIT(ngircd, 0.9-CVS) AC_CONFIG_SRCDIR(src/ngircd/ngircd.c) AC_CANONICAL_TARGET AM_INIT_AUTOMAKE(1.6) @@ -85,14 +85,14 @@ AC_CHECK_HEADERS([ \ strings.h sys/socket.h sys/time.h unistd.h \ ],,AC_MSG_ERROR([required C header missing!])) -AC_CHECK_HEADERS([arpa/inet.h ctype.h malloc.h stdint.h varargs.h]) +AC_CHECK_HEADERS([arpa/inet.h ctype.h malloc.h stdbool.h stddef.h varargs.h]) # -- Datatypes -- AC_MSG_CHECKING(whether socklen_t exists) AC_TRY_COMPILE([ - #include - #include +#include +#include ],[ socklen_t a, b; a = 2; b = 4; a += b; @@ -121,7 +121,7 @@ AC_CHECK_FUNCS([ \ memset realloc setsid setsockopt socket strcasecmp strchr strerror \ strstr waitpid],,AC_MSG_ERROR([required function missing!])) -AC_CHECK_FUNCS(inet_aton isdigit sigaction snprintf vsnprintf strlcpy strlcat) +AC_CHECK_FUNCS(inet_aton isdigit sigaction snprintf vsnprintf strdup strlcpy strlcat) AC_CHECK_FUNCS(select,[AC_CHECK_HEADERS(sys/select.h)], AC_MSG_ERROR([required function select() is missing!]) @@ -132,7 +132,12 @@ AC_CHECK_FUNCS(select,[AC_CHECK_HEADERS( x_syslog_on=no AC_ARG_WITH(syslog, [ --without-syslog disable syslog (autodetected by default)], - [ if test "$withval" = "yes"; then + [ if test "$withval" != "no"; then + if test "$withval" != "yes"; then + CFLAGS="-I$withval/include $CFLAGS" + CPPFLAGS="-I$withval/include $CPPFLAGS" + LDFLAGS="-L$withval/lib $LDFLAGS" + fi AC_CHECK_LIB(be, syslog) AC_CHECK_FUNCS(syslog, x_syslog_on=yes, AC_MSG_ERROR([Can't enable syslog!]) @@ -146,13 +151,18 @@ AC_ARG_WITH(syslog, ) if test "$x_syslog_on" = "yes"; then AC_DEFINE(SYSLOG, 1) - AC_CHECK_HEADERS(syslog.h) + AC_CHECK_HEADERS(syslog.h,,AC_MSG_ERROR([required C header missing!])) fi x_zlib_on=no AC_ARG_WITH(zlib, [ --without-zlib disable zlib compression (autodetected by default)], - [ if test "$withval" = "yes"; then + [ if test "$withval" != "no"; then + if test "$withval" != "yes"; then + CFLAGS="-I$withval/include $CFLAGS" + CPPFLAGS="-I$withval/include $CPPFLAGS" + LDFLAGS="-L$withval/lib $LDFLAGS" + fi AC_CHECK_LIB(z, deflate) AC_CHECK_FUNCS(deflate, x_zlib_on=yes, AC_MSG_ERROR([Can't enable zlib!]) @@ -165,20 +175,26 @@ AC_ARG_WITH(zlib, ) if test "$x_zlib_on" = "yes"; then AC_DEFINE(ZLIB, 1) - AC_CHECK_HEADERS(zlib.h) + AC_CHECK_HEADERS(zlib.h,,AC_MSG_ERROR([required C header missing!])) fi x_tcpwrap_on=no AC_ARG_WITH(tcp-wrappers, [ --with-tcp-wrappers enable TCP wrappers support], - [ if test "$withval" = "yes"; then - AC_CHECK_LIB(wrap, tcpd_warn) + [ if test "$withval" != "no"; then + if test "$withval" != "yes"; then + CFLAGS="-I$withval/include $CFLAGS" + CPPFLAGS="-I$withval/include $CPPFLAGS" + LDFLAGS="-L$withval/lib $LDFLAGS" + fi AC_MSG_CHECKING(for hosts_access) + LIBS="-lwrap $LIBS" AC_TRY_LINK([ - #include +#include +int allow_severity = 0; +int deny_severity = 0; ],[ - void *ptr; - ptr = hosts_access; + tcpd_warn("link test"); ],[ AC_MSG_RESULT(yes) AC_DEFINE(TCPWRAP, 1) @@ -194,22 +210,59 @@ AC_ARG_WITH(tcp-wrappers, x_rendezvous_on=no AC_ARG_WITH(rendezvous, [ --with-rendezvous enable support for "Rendezvous"], - [ if test "$withval" = "yes"; then - AC_CHECK_FUNCS(DNSServiceRegistrationCreate, x_rendezvous_on=yes, - AC_MSG_ERROR([Can't enable Rendezvous!]) - ) + [ if test "$withval" != "no"; then + if test "$withval" != "yes"; then + CFLAGS="-I$withval/include $CFLAGS" + CPPFLAGS="-I$withval/include $CPPFLAGS" + LDFLAGS="-L$withval/lib $LDFLAGS" + fi + AC_CHECK_FUNCS(DNSServiceRegistrationCreate, x_rendezvous_on=osx, + [ + AC_CHECK_LIB(pthread, pthread_mutexattr_init) + AC_CHECK_LIB(howl, sw_discovery_init) + AC_CHECK_FUNCS(sw_discovery_init, \ + x_rendezvous_on=howl, \ + AC_MSG_ERROR([Can't enable Rendezvous!])) + ]) fi ] ) -if test "$x_rendezvous_on" = "yes"; then +if test "$x_rendezvous_on" = "osx"; then + AC_CHECK_HEADERS([DNSServiceDiscovery/DNSServiceDiscovery.h \ + mach/port.h],,AC_MSG_ERROR([required C header missing!])) + AC_DEFINE(RENDEZVOUS, 1) +fi +if test "$x_rendezvous_on" = "howl"; then + for dir in /usr/local/include /usr/local/include/howl* \ + /usr/include /usr/include/howl*; do + test -d "$dir" || continue + AC_MSG_CHECKING([for Howl headers in $dir]) + if test -f "$dir/rendezvous/rendezvous.h"; then + if test "$dir" != "/usr/local/include" -a \ + "$dir" != "/usr/include"; then + CFLAGS="-I$dir $CFLAGS" + CPPFLAGS="-I$dir $CPPFLAGS" + fi + AC_MSG_RESULT(yes) + break + else + AC_MSG_RESULT(no) + fi + done + AC_CHECK_HEADERS([rendezvous/rendezvous.h],, \ + AC_MSG_ERROR([required C header missing!])) AC_DEFINE(RENDEZVOUS, 1) - AC_CHECK_HEADERS(DNSServiceDiscovery/DNSServiceDiscovery.h mach/port.h) fi x_identauth_on=no AC_ARG_WITH(ident, [ --with-ident enable "IDENT" ("AUTH") protocol support], - [ if test "$withval" = "yes"; then + [ if test "$withval" != "no"; then + if test "$withval" != "yes"; then + CFLAGS="-I$withval/include $CFLAGS" + CPPFLAGS="-I$withval/include $CPPFLAGS" + LDFLAGS="-L$withval/lib $LDFLAGS" + fi AC_CHECK_LIB(ident, ident_id) AC_CHECK_FUNCS(ident_id, x_identauth_on=yes, AC_MSG_ERROR([Can't enable IDENT support!]) @@ -219,7 +272,7 @@ AC_ARG_WITH(ident, ) if test "$x_identauth_on" = "yes"; then AC_DEFINE(IDENTAUTH, 1) - AC_CHECK_HEADERS(ident.h) + AC_CHECK_HEADERS(ident.h,,AC_MSG_ERROR([required C header missing!])) fi x_ircplus_on=yes @@ -295,7 +348,7 @@ fi # -- Result -- echo -echo "ngIRCd has been configured with the following options:" +echo "ngIRCd $PACKAGE_VERSION has been configured with the following options:" echo # Someone please show me a better way :) [borrowed by OpenSSH] @@ -347,7 +400,7 @@ test "$x_strict_rfc_on" = "yes" \ || echo "no" echo $ECHO_N " Rendezvous support: $ECHO_C" -test "$x_rendezvous_on" = "yes" \ +test "$x_rendezvous_on" = "osx" -o "$x_rendezvous_on" = "howl" \ && echo $ECHO_N "yes $ECHO_C" \ || echo $ECHO_N "no $ECHO_C" echo $ECHO_N " IRC+ protocol: $ECHO_C" Index: contrib/ngircd.spec =================================================================== RCS file: /srv/cvs/ngircd/ngircd/contrib/ngircd.spec,v retrieving revision 1.4.2.6 retrieving revision 1.4 diff -u -p -r1.4.2.6 -r1.4 --- contrib/ngircd.spec 3 Feb 2005 10:16:25 -0000 1.4.2.6 +++ contrib/ngircd.spec 29 Nov 2003 20:29:09 -0000 1.4 @@ -1,5 +1,5 @@ %define name ngircd -%define version 0.8.3 +%define version CVSHEAD %define release 1 %define prefix %{_prefix} Index: contrib/Debian/Makefile.am =================================================================== RCS file: /srv/cvs/ngircd/ngircd/contrib/Debian/Makefile.am,v retrieving revision 1.3.2.1 retrieving revision 1.4 diff -u -p -r1.3.2.1 -r1.4 --- contrib/Debian/Makefile.am 11 May 2004 00:38:17 -0000 1.3.2.1 +++ contrib/Debian/Makefile.am 11 May 2004 00:32:31 -0000 1.4 @@ -8,7 +8,7 @@ # (at your option) any later version. # Please read the file COPYING, README and AUTHORS for more information. # -# $Id: Makefile.am,v 1.3.2.1 2004/05/11 00:38:17 alex Exp $ +# $Id: Makefile.am,v 1.4 2004/05/11 00:32:31 alex Exp $ # EXTRA_DIST = rules changelog compat control copyright \ Index: contrib/Debian/changelog =================================================================== RCS file: /srv/cvs/ngircd/ngircd/contrib/Debian/changelog,v retrieving revision 1.8.2.8 retrieving revision 1.11 diff -u -p -r1.8.2.8 -r1.11 --- contrib/Debian/changelog 3 Feb 2005 10:16:25 -0000 1.8.2.8 +++ contrib/Debian/changelog 7 Feb 2005 19:57:05 -0000 1.11 @@ -29,6 +29,13 @@ ngircd (0.8.0-0ab1) unstable; urgency=lo -- Alexander Barton Sat, 26 Jun 2004 11:25:59 +0200 +ngircd (0.7.7+HEAD-0ab6) unstable; urgency=low + + * Incorporated actual CVS HEAD version which includes all features of + version 0.8.0-pre1 and patches for the resolver and logger. + + -- Alexander Barton Tue, 11 May 2004 02:18:50 +0200 + ngircd (0.7.7+HEAD-0ab5) unstable; urgency=low * Updates from CVS HEAD branch, most notably: "INVITE- and BAN-lists Index: contrib/Debian/ngircd.init =================================================================== RCS file: /srv/cvs/ngircd/ngircd/contrib/Debian/ngircd.init,v retrieving revision 1.1.2.1 retrieving revision 1.5 diff -u -p -r1.1.2.1 -r1.5 --- contrib/Debian/ngircd.init 6 Sep 2004 00:36:49 -0000 1.1.2.1 +++ contrib/Debian/ngircd.init 1 Jun 2005 21:51:11 -0000 1.5 @@ -2,16 +2,17 @@ # # ngIRCd start and stop script for Debian-based systems # -# $Id: ngircd.init,v 1.1.2.1 2004/09/06 00:36:49 alex Exp $ +# $Id: ngircd.init,v 1.5 2005/06/01 21:51:11 alex Exp $ # PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DAEMON=/usr/sbin/ngircd NAME=ngIRCd -BASENAME=`basename $0` DESC="IRC daemon" PARAMS="" +test -h "$0" && BASENAME=`readlink $0` || BASENAME=`basename $0` + test -f /etc/default/$BASENAME && . /etc/default/$BASENAME test -x $DAEMON || exit 0 @@ -28,6 +29,7 @@ Check_Config() Try_Start() { + [ ! -d /var/run/ircd ] || chown irc:irc /var/run/ircd start-stop-daemon --start --quiet --exec $DAEMON -- $PARAMS if [ $? -ne 0 ]; then echo "$NAME failed!" @@ -44,7 +46,7 @@ case "$1" in ;; stop) echo -n "Stopping $DESC: " - start-stop-daemon --stop --quiet --exec $DAEMON \ + start-stop-daemon --stop --quiet --pidfile /var/run/ircd/ngircd.pid --exec $DAEMON \ && echo "$NAME." \ || echo "(none running)" ;; Index: contrib/Debian/rules =================================================================== RCS file: /srv/cvs/ngircd/ngircd/contrib/Debian/rules,v retrieving revision 1.2 retrieving revision 1.3 diff -u -p -r1.2 -r1.3 --- contrib/Debian/rules 1 Jan 2004 22:24:48 -0000 1.2 +++ contrib/Debian/rules 7 Feb 2005 23:09:31 -0000 1.3 @@ -11,7 +11,7 @@ # # debian/rules for ngIRCd # -# $Id: rules,v 1.2 2004/01/01 22:24:48 alex Exp $ +# $Id: rules,v 1.3 2005/02/07 23:09:31 alex Exp $ # # Based on the sample debian/rules that uses debhelper, # GNU copyright 1997 to 1999 by Joey Hess. @@ -38,7 +38,7 @@ endif configure-ngircd: configure dh_testdir - + # configure "standard" variant: ./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) \ --prefix=/usr \ @@ -48,7 +48,7 @@ configure-ngircd: configure configure-ngircd-full: configure dh_testdir - + # configure "full" variant: ./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) \ --prefix=/usr \ @@ -63,20 +63,20 @@ build-ngircd: build-stamp-ngircd build-stamp-ngircd: configure-ngircd dh_testdir rm -f build-stamp-* - + # Add here commands to compile the "standard" package: $(MAKE) - + touch build-stamp-ngircd build-ngircd-full: build-stamp-ngircd-full build-stamp-ngircd-full: configure-ngircd-full dh_testdir rm -f build-stamp-* - + # Add here commands to compile the "full" package: $(MAKE) - + touch build-stamp-ngircd-full clean: @@ -86,10 +86,10 @@ clean: rm -f $(CURDIR)/debian/ngircd-full.default rm -f $(CURDIR)/debian/ngircd-full.init rm -f $(CURDIR)/debian/ngircd-full.postinst - + # Add here commands to clean up after the build process: -$(MAKE) clean - + ifneq "$(wildcard /usr/share/misc/config.sub)" "" cp -f /usr/share/misc/config.sub config.sub endif @@ -104,23 +104,39 @@ install-ngircd: build-ngircd dh_testdir dh_testroot dh_installdirs - + # Add here commands to install the "standard" package into debian/ngircd: $(MAKE) install DESTDIR=$(CURDIR)/debian/ngircd rm $(CURDIR)/debian/ngircd/usr/share/doc/ngircd/INSTALL* rm $(CURDIR)/debian/ngircd/usr/share/doc/ngircd/COPYING* + mkdir -p $(CURDIR)/debian/ngircd/var/run/ircd + cat $(CURDIR)/debian/ngircd/usr/share/doc/ngircd/sample-ngircd.conf | \ + sed -e "s/;ServerUID = 65534/ServerUID = irc/g" | \ + sed -e "s/;ServerGID = 65534/ServerGID = irc/g" | \ + sed -e "s/;MotdFile = \/usr\/local\/etc\/ngircd.motd/MotdFile = \/etc\/ngircd\/ngircd.motd/g" | \ + sed -e "s/;PidFile = \/var\/run\/ngircd\/ngircd.pid/PidFile = \/var\/run\/ircd\/ngircd.pid/g" \ + >$(CURDIR)/debian/ngircd/etc/ngircd/ngircd.conf + touch $(CURDIR)/debian/ngircd/etc/ngircd/ngircd.motd install-ngircd-full: build-ngircd-full dh_testdir dh_testroot dh_installdirs - + # Add here commands to install the "full" package into debian/ngircd-full: $(MAKE) install DESTDIR=$(CURDIR)/debian/ngircd-full rm $(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd/INSTALL* rm $(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd/COPYING* mv $(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd \ $(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd-full + mkdir -p $(CURDIR)/debian/ngircd-full/var/run/ircd + cat $(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd-full/sample-ngircd.conf | \ + sed -e "s/;ServerUID = 65534/ServerUID = irc/g" | \ + sed -e "s/;ServerGID = 65534/ServerGID = irc/g" | \ + sed -e "s/;MotdFile = \/usr\/local\/etc\/ngircd.motd/MotdFile = \/etc\/ngircd\/ngircd.motd/g" | \ + sed -e "s/;PidFile = \/var\/run\/ngircd\/ngircd.pid/PidFile = \/var\/run\/ircd\/ngircd.pid/g" \ + >$(CURDIR)/debian/ngircd-full/etc/ngircd/ngircd.conf + touch $(CURDIR)/debian/ngircd-full/etc/ngircd/ngircd.motd # Build architecture-independent files here. binary-indep: Index: contrib/MacOSX/Makefile.am =================================================================== RCS file: /srv/cvs/ngircd/ngircd/contrib/MacOSX/Makefile.am,v retrieving revision 1.1.2.1 retrieving revision 1.2 diff -u -p -r1.1.2.1 -r1.2 --- contrib/MacOSX/Makefile.am 11 May 2004 00:38:17 -0000 1.1.2.1 +++ contrib/MacOSX/Makefile.am 11 May 2004 00:34:26 -0000 1.2 @@ -8,7 +8,7 @@ # (at your option) any later version. # Please read the file COPYING, README and AUTHORS for more information. # -# $Id: Makefile.am,v 1.1.2.1 2004/05/11 00:38:17 alex Exp $ +# $Id: Makefile.am,v 1.2 2004/05/11 00:34:26 alex Exp $ # clean-local: Index: contrib/MacOSX/ngIRCd.xcode/project.pbxproj =================================================================== RCS file: /srv/cvs/ngircd/ngircd/contrib/MacOSX/ngIRCd.xcode/project.pbxproj,v retrieving revision 1.3 retrieving revision 1.6 diff -u -p -r1.3 -r1.6 --- contrib/MacOSX/ngIRCd.xcode/project.pbxproj 9 Apr 2004 20:48:27 -0000 1.3 +++ contrib/MacOSX/ngIRCd.xcode/project.pbxproj 9 Apr 2005 18:29:30 -0000 1.6 @@ -6,17 +6,11 @@ objectVersion = 39; objects = { 014CEA520018CE5811CA2923 = { - buildRules = ( - ); buildSettings = { - COPY_PHASE_STRIP = NO; - DEBUGGING_SYMBOLS = YES; - GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; - OPTIMIZATION_CFLAGS = "-O0"; - ZERO_LINK = NO; + ZERO_LINK = YES; }; isa = PBXBuildStyle; name = Development; @@ -36,6 +30,7 @@ }; buildStyles = ( 014CEA520018CE5811CA2923, + FA2002770807EE21005A2F4C, ); hasScannedForEncodings = 1; isa = PBXProject; @@ -71,6 +66,7 @@ 08FB7795FE84155DC02AAC07 = { children = ( FADE2B9005F14C6C0081A16E, + FA59ACBF080854DC00CD93BE, FADE2AED05F14A6A0081A16E, FADE2AEE05F14A700081A16E, FADE2AEF05F14A760081A16E, @@ -79,6 +75,7 @@ ); isa = PBXGroup; name = src; + path = ""; refType = 4; sourceTree = ""; }; @@ -273,6 +270,21 @@ //FA2 //FA3 //FA4 + FA2002770807EE21005A2F4C = { + buildSettings = { + }; + isa = PBXBuildStyle; + name = Deployment; + }; + FA59ACBF080854DC00CD93BE = { + fileEncoding = 5; + isa = PBXFileReference; + lastKnownFileType = text; + name = Doxyfile; + path = ../../src/Doxyfile; + refType = 2; + sourceTree = SOURCE_ROOT; + }; FA83332A0627391D00A909F0 = { isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; @@ -629,9 +641,9 @@ isa = PBXFileReference; lastKnownFileType = text; name = ngircd.spec; - path = /local/alex/Develop/ngircd/HEAD/contrib/ngircd.spec; - refType = 0; - sourceTree = ""; + path = ../ngircd.spec; + refType = 2; + sourceTree = SOURCE_ROOT; }; FADE2AED05F14A6A0081A16E = { children = ( Index: doc/Makefile.am =================================================================== RCS file: /srv/cvs/ngircd/ngircd/doc/Makefile.am,v retrieving revision 1.17 retrieving revision 1.18 diff -u -p -r1.17 -r1.18 --- doc/Makefile.am 22 Apr 2003 23:50:18 -0000 1.17 +++ doc/Makefile.am 27 Apr 2005 07:52:29 -0000 1.18 @@ -9,7 +9,7 @@ # Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste # der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. # -# $Id: Makefile.am,v 1.17 2003/04/22 23:50:18 alex Exp $ +# $Id: Makefile.am,v 1.18 2005/04/27 07:52:29 alex Exp $ # EXTRA_DIST = CVS.txt FAQ.txt Protocol.txt Platforms.txt \ @@ -18,6 +18,9 @@ EXTRA_DIST = CVS.txt FAQ.txt Protocol.tx maintainer-clean-local: rm -f Makefile Makefile.in +distclean-local: + rm -rf src + docdir = $(datadir)/doc/$(PACKAGE) documents = $(EXTRA_DIST) ../AUTHORS ../COPYING ../ChangeLog ../INSTALL \ Index: doc/Platforms.txt =================================================================== RCS file: /srv/cvs/ngircd/ngircd/doc/Platforms.txt,v retrieving revision 1.11.2.1 retrieving revision 1.13.2.1 diff -u -p -r1.11.2.1 -r1.13.2.1 --- doc/Platforms.txt 9 Nov 2004 10:58:01 -0000 1.11.2.1 +++ doc/Platforms.txt 8 Jul 2005 12:50:43 -0000 1.13.2.1 @@ -28,6 +28,7 @@ Platform Compiler --------------------------- ------------ ---------- -------- ------ - - - - --- hppa/unknown/openbsd3.5 gcc 2.95.3 CVSHEAD 04-05-25 alex Y Y Y Y hppa1.1/unknown/linux-gnu gcc 3.3.3 0.8.0 04-05-30 alex Y Y Y Y +hppa2.0/unknown/linux-gnu gcc 3.3.5 0.9.x-CVS 05-06-27 alex Y Y Y Y i386/pc/solaris2.9 gcc 3.2.2 CVSHEAD 04-02-24 alex Y Y Y Y i386/unknown/freebsd5.2.1 gcc 3.3.3 0.8.0 04-05-30 alex Y Y Y Y i386/unknown/gnu0.3 gcc 3.3.3 0.8.0 04-05-30 alex Y Y n Y @@ -40,6 +41,7 @@ m68k/hp/hp-ux9.10 Orig. HPUX m88k/dg/dgux5.4R3.10 gcc 2.5.8 CVSHEAD 04-03-15 alex Y Y ? ? powerpc/apple/darwin6.5 gcc 3.1 0.7.x-CVS 03-04-23 alex Y Y Y Y powerpc/apple/darwin7.4.0 gcc 3.3 0.8.0 04-05-30 alex Y Y Y Y +powerpc/apple/darwin8.1.0 gcc 4.0 0.9.x-CVS 05-06-27 alex Y Y Y Y powerpc/unknown/linux-gnu gcc 3.3.3 0.8.0 04-05-30 alex Y Y Y Y sparc/sun/solaris2.6 gcc 2.95.3 0.7.x-CVS 03-04-22 alex Y Y Y Y sparc/sun/solaris2.7 gcc 3.3 0.8.0 04-05-30 alex Y Y Y Y @@ -60,4 +62,4 @@ Notes -- -$Id: Platforms.txt,v 1.11.2.1 2004/11/09 10:58:01 alex Exp $ +$Id: Platforms.txt,v 1.13.2.1 2005/07/08 12:50:43 alex Exp $ Index: doc/README-AUX.txt =================================================================== RCS file: /srv/cvs/ngircd/ngircd/doc/README-AUX.txt,v retrieving revision 1.8 retrieving revision 1.9 diff -u -p -r1.8 -r1.9 --- doc/README-AUX.txt 21 Apr 2003 21:59:34 -0000 1.8 +++ doc/README-AUX.txt 24 Jun 2005 20:59:13 -0000 1.9 @@ -1,7 +1,7 @@ ngIRCd - Next Generation IRC Server - (c)2001-2003 by Alexander Barton, + (c)2001-2005 Alexander Barton, alex@barton.de, http://www.barton.de/ ngIRCd is free software and published under the @@ -22,7 +22,7 @@ The following software packages are need - GNU sed Source: http://www.rezepte-im-web.de/appleux/sed-3.02.tar.gz - ftp://arthur.ath.cx/pub/AUX/Software/Tools/sed-3.02.tar.gz + ftp://arthur.barton.de/pub/UNIX/AUX/Tools/sed-3.02.tar.gz A/UX comes with /bin/sed which isn't supporting all functions needed by GNU automake/autoconf. @@ -33,8 +33,8 @@ The following software packages are need - libUTIL.a Source: - http://ftp.mayn.de/pub/apple/apple_unix/Sys_stuff/libUTIL-2.1.tar.gz - ftp://arthur.ath.cx/pub/AUX/Software/Libraries/libUTIL-2.1.tar.gz + ftp://ftp.mayn.de/pub/really_old_stuff/apple/apple_unix/Sys_stuff/libUTIL-2.1.tar.gz> + ftp://arthur.barton.de/pub/UNIX/AUX/Libraries/libUTIL-2.1.tar.gz This library contains functions that are common on other UNIX systems but not on A/UX e.g. memmove(), strerror() und strdup(). @@ -50,7 +50,7 @@ A few hints in case of errors: (so 'configure' uses its own shell script) or use a fully functionable one. There's at least one binary "out there" causing problems. The one of the GNU fileutils works fine: - ftp://arthur.ath.cx/pub/UNIX/AUX/Software/Tools/fileutils-4.0.tar.gz + ftp://arthur.barton.de/pub/UNIX/AUX/Software/Tools/fileutils-4.0.tar.gz - The precompiled binary of the old 'bash' shouldn't be installed within /bin (better do this in /usr/local/bin) because 'configure' would @@ -64,4 +64,4 @@ A few hints in case of errors: even if you don't use ngIRCd. -- -$Id: README-AUX.txt,v 1.8 2003/04/21 21:59:34 goetz Exp $ +$Id: README-AUX.txt,v 1.9 2005/06/24 20:59:13 alex Exp $ Index: doc/SSL.txt =================================================================== RCS file: /srv/cvs/ngircd/ngircd/doc/SSL.txt,v retrieving revision 1.2.2.1 retrieving revision 1.2 diff -u -p -r1.2.2.1 -r1.2 --- doc/SSL.txt 26 Jan 2005 21:47:47 -0000 1.2.2.1 +++ doc/SSL.txt 27 Dec 2004 01:11:40 -0000 1.2 @@ -55,4 +55,4 @@ Probably ngIRCd will include support for -- -$Id: SSL.txt,v 1.2.2.1 2005/01/26 21:47:47 alex Exp $ +$Id: SSL.txt,v 1.2 2004/12/27 01:11:40 alex Exp $ Index: doc/sample-ngircd.conf =================================================================== RCS file: /srv/cvs/ngircd/ngircd/doc/sample-ngircd.conf,v retrieving revision 1.25.2.1 retrieving revision 1.33 diff -u -p -r1.25.2.1 -r1.33 --- doc/sample-ngircd.conf 7 May 2004 11:24:17 -0000 1.25.2.1 +++ doc/sample-ngircd.conf 15 Mar 2005 16:58:01 -0000 1.33 @@ -1,4 +1,4 @@ -# $Id: sample-ngircd.conf,v 1.25.2.1 2004/05/07 11:24:17 alex Exp $ +# $Id: sample-ngircd.conf,v 1.33 2005/03/15 16:58:01 alex Exp $ # # This is a sample configuration file for the ngIRCd, which must be adepted @@ -11,7 +11,6 @@ # [Global] - # The [Global] section of this file is used to define the main # configuration of the server, like the server name and the ports # on which the server should be listening. @@ -34,8 +33,8 @@ ;AdminEMail = admin@irc.server # Ports on which the server should listen. There may be more than - # one port, separated with ";". (Default: 6667) - ;Ports = 6667, 6668, 66694 + # one port, separated with ",". (Default: 6667) + ;Ports = 6667, 6668, 6669 # IP address on which the server should listen. (Default: empty, # so the server listens on all IP addresses of the system) @@ -68,6 +67,12 @@ # with root privileges! ;ChrootDir = /var/empty + # This tells ngircd to write its current process id to a file. + # Note that the pidfile is written AFTER chroot and switching uid, + # i. e. the Directory the pidfile resides in must be writeable by + # the ngircd user and exist in the chroot directory. + ;PidFile = /var/run/ngircd/ngircd.pid + # After seconds of inactivity the server will send a # PING to the peer to test whether it is alive or not. ;PingTimeout = 120 @@ -84,6 +89,10 @@ # they are not(!) channel-operators? ;OperCanUseMode = no + # Mask IRC Operator mode requests as if they were coming from the + # server? (This is a compatibility hack for ircd-irc2 servers) + ;OperServerMode = no + # Maximum number of simultaneous connection the server is allowed # to accept (<=0: unlimited): ;MaxConnections = -1 @@ -105,6 +114,12 @@ # Password of the IRC operator ;Password = ThePwd + # Optional Mask from which /OPER will be accepted + ;Mask = *!ident@somewhere.example.com + +[Operator] + # More [Operator] sections, if you like ... + [Server] # Other servers are configured in [Server] sections. If you # configure a port for the connection, then this ngircd tries to @@ -140,6 +155,9 @@ # Group of this server (optional) ;Group = 123 +[Server] + # More [Server] sections, if you like ... + [Channel] # Pre-defined channels can be configured in [Channel] sections. # Such channels are created by the server when starting up and even @@ -157,4 +175,7 @@ # Initial channel modes ;Modes = tn +[Channel] + # More [Channel] sections, if you like ... + # -eof- Index: man/ngircd.8 =================================================================== RCS file: /srv/cvs/ngircd/ngircd/man/ngircd.8,v retrieving revision 1.9 retrieving revision 1.10 diff -u -p -r1.9 -r1.10 --- man/ngircd.8 5 Apr 2004 10:59:10 -0000 1.9 +++ man/ngircd.8 4 Jun 2005 13:39:20 -0000 1.10 @@ -1,15 +1,15 @@ .\" -.\" $Id: ngircd.8,v 1.9 2004/04/05 10:59:10 alex Exp $ +.\" $Id: ngircd.8,v 1.10 2005/06/04 13:39:20 alex Exp $ .\" -.TH ngircd 8 "March 2003" ngircd "ngIRCd Manual" +.TH ngircd 8 "Juni 2005" ngircd "ngIRCd Manual" .SH NAME -ngircd \- the next generation IRC daemon +ngIRCd \- the next generation IRC daemon .SH SYNOPSIS .B ngircd [ .I Options .B ] .SH DESCRIPTION -.BR ngircd +.BR ngIRCd is a free open source daemon for the Internet Relay Chat (IRC), developed under the GNU General Public License (GPL). .PP @@ -18,16 +18,12 @@ many others. It is easy to configure, su original ircd's) and runs on hosts with changing IP addresses (such as dial-in networks). .PP -Currently supported platforms (tested versions) are: AIX (3.2.5 with IBM XL -C Compiler), A/UX (3.x, Apple pre-ANSI C Compiler and GNU C), FreeBSD -(4.5/i386, GNU C), HP-UX (10.20, GNU C), IRIX (6.5, SGI MIPSpro C 7.30), -Linux (2.2.x/i386, 2.4.x/i386 and 2.4.x/hppa, GNU C), Mac OS X (10.x, GNU C), -NetBSD (1.5.2/i386 and 1.5.3/m68k, GNU C), Solaris (2.5.1 and 2.6, GNU C), -and Windows with Cygwin (GNU C). +Currently supported platforms include AIX, A/UX, FreeBSD, HP-UX, IRIX, +Linux, Mac OS X, NetBSD, OpenBSD, Solaris, and Windows with Cygwin. .PP As ngIRCd relies on UNIX standards and uses GNU automake and GNU autoconf there are good chances that it also supports other UNIX-based operating -systems. +systems as well. .SH OPTIONS The default behaviour of .BR ngircd @@ -43,7 +39,8 @@ as configuration file. .TP \fB\-n\fR, \fB\-\-nodaemon\fR Don't fork a child and don't detach from controlling terminal. -All log messages go to the console. +All log messages go to the console and you can use CTRL-C to +terminate the server. .TP \fB\-p\fR, \fB\-\-passive\fR Disable automatic connections to other servers. You can use the IRC command Index: man/ngircd.conf.5 =================================================================== RCS file: /srv/cvs/ngircd/ngircd/man/ngircd.conf.5,v retrieving revision 1.12.2.1 retrieving revision 1.18 diff -u -p -r1.12.2.1 -r1.18 --- man/ngircd.conf.5 7 May 2004 11:24:18 -0000 1.12.2.1 +++ man/ngircd.conf.5 4 Jun 2005 13:39:20 -0000 1.18 @@ -1,7 +1,7 @@ .\" -.\" $Id: ngircd.conf.5,v 1.12.2.1 2004/05/07 11:24:18 alex Exp $ +.\" $Id: ngircd.conf.5,v 1.18 2005/06/04 13:39:20 alex Exp $ .\" -.TH ngircd.conf 5 "Mai 2003" ngircd "ngIRCd Manual" +.TH ngircd.conf 5 "Juni 2005" ngircd "ngIRCd Manual" .SH NAME ngircd.conf \- configuration file of ngIRCd .SH SYNOPSIS @@ -32,13 +32,13 @@ represents either a comment, a section n .PP Section and parameter names are not case sensitive. .SH "SECTION OVERVIEW" -The file is separated in four blocks: [Global], [Operator], [Server], +The file can contain blocks of four types: [Global], [Operator], [Server], and [Channel]. .PP In the .I [Global] section, there is the main configuration like the server name and the -ports, on which the server should be listening. IRC operators of this +ports on which the server should be listening. IRC operators of this server are defined in .I [Operator] blocks. @@ -46,6 +46,9 @@ blocks. is the section where server links are configured. And .I [Channel] blocks are used to configure pre-defined ("persistent") IRC channels. +.PP +There can be more than one [Operator], [Server] and [Channel] sections +per configuration file, but only one [Global] section. .SH [GLOBAL] The .I [Global] @@ -65,18 +68,18 @@ command. .TP \fBPorts\fR Ports on which the server should listen. There may be more than one port, -separated with ';'. Default: 6667. +separated with ','. Default: 6667. .TP \fBListen\fR -The ip address on which the server should listen. Default is empty, so -the server listens on all configured ip addresses and interfaces. +The IP address on which the server should listen. Default is empty, so +the server listens on all configured IP addresses and interfaces. .TP \fBMotdFile\fR Text file with the "message of the day" (MOTD). This message will be shown to all users connecting to the server. .TP \fBMotdPhrase\fR -A simple Phrase (<256 chars) if you don't want to use a motd file. +A simple Phrase (<256 chars) if you don't want to use a MOTD file. If it is set no MotdFile will be read at all. .TP \fBServerUID\fR @@ -114,6 +117,13 @@ For this to work the server must have been started with root privileges! .RE .TP +\fBPidFile\fR +This tells ngIRCd to write its current process ID to a file. Note that the +pidfile is written AFTER chroot and switching the user ID, i. e. the +directory the pidfile resides in must be writeable by the ngIRCd user and +exist in the chroot directory (if configured, see above). +.RE +.TP \fBPingTimeout\fR After seconds of inactivity the server will send a PING to the peer to test whether it is alive or not. Default: 120. @@ -130,6 +140,11 @@ The server tries every se Should IRC Operators be allowed to use the MODE command even if they are not(!) channel-operators? Default: no. .TP +\fBOperServerMode\fR +If OperCanUseMode is enabled, this may lead the compatibility problems with +Servers that run the ircd-irc2 Software. This Option "masks" mode requests +by non-chanops as if they were coming from the server. Default: no. +.TP \fBMaxConnections\fR Maximum number of simultaneous connection the server is allowed to accept (<=0: unlimited). Default: -1. @@ -153,6 +168,10 @@ ID of the operator (may be different of .TP \fBPassword\fR Password of the IRC operator. +.TP +\fBMask\fR +Mask that is to be checked before an /OPER for this account is accepted. +Example: nick!ident@*.example.com .SH [SERVER] Other servers are configured in .I [Server] Index: src/Doxyfile =================================================================== RCS file: src/Doxyfile diff -N src/Doxyfile --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/Doxyfile 9 Apr 2005 12:21:51 -0000 1.1 @@ -0,0 +1,137 @@ +# +# ngIRCd -- The Next Generation IRC Daemon +# Copyright (c)2001-2005 Alexander Barton (alex@barton.de) +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# Please read the file COPYING, README and AUTHORS for more information. +# +# $Id: Doxyfile,v 1.1 2005/04/09 12:21:51 alex Exp $ +# + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for ngIRCd. + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = ngIRCd + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = ../doc/src + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = YES + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that +# contain documented source files. You may enter file names like "myfile.cpp" +# or directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = ngircd portab tool + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +#--------------------------------------------------------------------------- +# Output formats +#--------------------------------------------------------------------------- + +GENERATE_HTML = YES +GENERATE_HTMLHELP = NO +GENERATE_LATEX = NO +GENERATE_RTF = NO +GENERATE_MAN = NO +GENERATE_XML = NO +GENERATE_AUTOGEN_DEF = NO +GENERATE_PERLMOD = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = CONN_MODULE __client_c__ + +# -eof- Index: src/Makefile.am =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/Makefile.am,v retrieving revision 1.5 retrieving revision 1.6 diff -u -p -r1.5 -r1.6 --- src/Makefile.am 13 Jan 2003 12:20:16 -0000 1.5 +++ src/Makefile.am 9 Apr 2005 12:22:41 -0000 1.6 @@ -8,7 +8,7 @@ # (at your option) any later version. # Please read the file COPYING, README and AUTHORS for more information. # -# $Id: Makefile.am,v 1.5 2003/01/13 12:20:16 alex Exp $ +# $Id: Makefile.am,v 1.6 2005/04/09 12:22:41 alex Exp $ # SUBDIRS = portab tool ngircd testsuite @@ -16,4 +16,9 @@ SUBDIRS = portab tool ngircd testsuite maintainer-clean-local: rm -f Makefile Makefile.in config.h config.h.in stamp-h.in +srcdoc: + @doxygen --version >/dev/null 2>&1 \ + || ( echo; echo "Error: \"doxygen\" not found!"; echo; exit 1 ) + doxygen + # -eof- Index: src/ngircd/Makefile.am =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/Makefile.am,v retrieving revision 1.42 retrieving revision 1.46 diff -u -p -r1.42 -r1.46 --- src/ngircd/Makefile.am 4 Dec 2003 14:05:16 -0000 1.42 +++ src/ngircd/Makefile.am 23 May 2005 00:11:15 -0000 1.46 @@ -8,14 +8,15 @@ # (at your option) any later version. # Please read the file COPYING, README and AUTHORS for more information. # -# $Id: Makefile.am,v 1.42 2003/12/04 14:05:16 alex Exp $ +# $Id: Makefile.am,v 1.46 2005/05/23 00:11:15 alex Exp $ # AUTOMAKE_OPTIONS = ../portab/ansi2knr INCLUDES = -I$(srcdir)/../portab -I$(srcdir)/../tool -LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN +LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN \ + -varuse -retvalother -emptyret -unrecog sbin_PROGRAMS = ngircd @@ -51,15 +52,30 @@ check-help: Makefile chmod 755 check-help lint: - rm -f lint.out + @splint --version >/dev/null 2>&1 \ + || ( echo; echo "Error: \"splint\" not found!"; echo; exit 1 ) + @echo; warnings=0; files=0; \ for f in *.c; do \ echo "checking $$f ..."; \ - splint $$f $(LINTARGS) -I./.. -I./../portab $(AM_CFLAGS) > lint.out 2>&1; \ + splint $$f $(LINTARGS) -I$(srcdir) -I$(srcdir)/.. \ + $(INCLUDES) $(AM_CFLAGS) >lint.out 2>&1; \ grep "no warnings" lint.out > /dev/null 2>&1; \ if [ $$? -ne 0 ]; then \ - echo; cat lint.out; echo; \ + waswarning=1; \ + echo; grep -v "^Command Line: " lint.out; echo; \ + w=$$( grep "code warning" lint.out | awk "{ print \$$4 }" ); \ + [ "$$w" -gt 0 ] && warnings=`expr $$warnings + $$w`; \ + files=`expr $$files + 1`; \ + else \ + waswarning=0; \ fi; \ - done; + rm -f lint.out; \ + done; \ + [ $$waswarning -eq 0 ] && echo; \ + [ $$warnings -gt 0 ] \ + && echo "Result: $$warnings warning(s) in $$files file(s)!" \ + || echo "Result: no warnings found."; \ + echo; [ $$warnings -gt 0 ] && exit 1 ngircd.c: cvs-version.h Index: src/ngircd/channel.c =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/channel.c,v retrieving revision 1.45 retrieving revision 1.50 diff -u -p -r1.45 -r1.50 --- src/ngircd/channel.c 11 Mar 2004 22:16:31 -0000 1.45 +++ src/ngircd/channel.c 18 Jun 2005 08:57:37 -0000 1.50 @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de) + * Copyright (c)2001-2005 by Alexander Barton (alex@barton.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,7 +17,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: channel.c,v 1.45 2004/03/11 22:16:31 alex Exp $"; +static char UNUSED id[] = "$Id: channel.c,v 1.50 2005/06/18 08:57:37 fw Exp $"; #include "imp.h" #include @@ -25,6 +25,7 @@ static char UNUSED id[] = "$Id: channel. #include #include +#include "defines.h" #include "conn-func.h" #include "client.h" @@ -54,28 +55,28 @@ LOCAL CL2CHAN *My_Cl2Chan; LOCAL CL2CHAN *Get_Cl2Chan PARAMS(( CHANNEL *Chan, CLIENT *Client )); LOCAL CL2CHAN *Add_Client PARAMS(( CHANNEL *Chan, CLIENT *Client )); -LOCAL BOOLEAN Remove_Client PARAMS(( INT Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Reason, BOOLEAN InformServer )); +LOCAL bool Remove_Client PARAMS(( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Reason, bool InformServer )); LOCAL CL2CHAN *Get_First_Cl2Chan PARAMS(( CLIENT *Client, CHANNEL *Chan )); LOCAL CL2CHAN *Get_Next_Cl2Chan PARAMS(( CL2CHAN *Start, CLIENT *Client, CHANNEL *Chan )); -LOCAL BOOLEAN Delete_Channel PARAMS(( CHANNEL *Chan )); +LOCAL bool Delete_Channel PARAMS(( CHANNEL *Chan )); -GLOBAL VOID -Channel_Init( VOID ) +GLOBAL void +Channel_Init( void ) { My_Channels = NULL; My_Cl2Chan = NULL; } /* Channel_Init */ -GLOBAL VOID -Channel_InitPredefined( VOID ) +GLOBAL void +Channel_InitPredefined( void ) { /* Vordefinierte persistente Channels erzeugen */ CHANNEL *chan; - CHAR *c; - INT i; + char *c; + int i; for( i = 0; i < Conf_Channel_Count; i++ ) { @@ -112,8 +113,8 @@ Channel_InitPredefined( VOID ) } /* Channel_InitPredefined */ -GLOBAL VOID -Channel_Exit( VOID ) +GLOBAL void +Channel_Exit( void ) { CHANNEL *c, *c_next; CL2CHAN *cl2chan, *cl2chan_next; @@ -138,8 +139,8 @@ Channel_Exit( VOID ) } /* Channel_Exit */ -GLOBAL BOOLEAN -Channel_Join( CLIENT *Client, CHAR *Name ) +GLOBAL bool +Channel_Join( CLIENT *Client, char *Name ) { CHANNEL *chan; @@ -150,7 +151,7 @@ Channel_Join( CLIENT *Client, CHAR *Name if( ! Channel_IsValidName( Name )) { IRC_WriteStrClient( Client, ERR_NOSUCHCHANNEL_MSG, Client_ID( Client ), Name ); - return FALSE; + return false; } /* Channel suchen */ @@ -158,23 +159,23 @@ Channel_Join( CLIENT *Client, CHAR *Name if( chan ) { /* Ist der Client bereits Mitglied? */ - if( Get_Cl2Chan( chan, Client )) return FALSE; + if( Get_Cl2Chan( chan, Client )) return false; } else { /* Gibt es noch nicht? Dann neu anlegen: */ chan = Channel_Create( Name ); - if( ! chan ) return FALSE; + if( ! chan ) return false; } /* User dem Channel hinzufuegen */ - if( ! Add_Client( chan, Client )) return FALSE; - else return TRUE; + if( ! Add_Client( chan, Client )) return false; + else return true; } /* Channel_Join */ -GLOBAL BOOLEAN -Channel_Part( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason ) +GLOBAL bool +Channel_Part( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason ) { CHANNEL *chan; @@ -187,17 +188,17 @@ Channel_Part( CLIENT *Client, CLIENT *Or if(( ! chan ) || ( ! Get_Cl2Chan( chan, Client ))) { IRC_WriteStrClient( Client, ERR_NOSUCHCHANNEL_MSG, Client_ID( Client ), Name ); - return FALSE; + return false; } /* User aus Channel entfernen */ - if( ! Remove_Client( REMOVE_PART, chan, Client, Origin, Reason, TRUE )) return FALSE; - else return TRUE; + if( ! Remove_Client( REMOVE_PART, chan, Client, Origin, Reason, true)) return false; + else return true; } /* Channel_Part */ -GLOBAL VOID -Channel_Kick( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason ) +GLOBAL void +Channel_Kick( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason ) { CHANNEL *chan; @@ -235,35 +236,36 @@ Channel_Kick( CLIENT *Client, CLIENT *Or return; } - Remove_Client( REMOVE_KICK, chan, Client, Origin, Reason, TRUE ); + Remove_Client( REMOVE_KICK, chan, Client, Origin, Reason, true); } /* Channel_Kick */ -GLOBAL VOID -Channel_Quit( CLIENT *Client, CHAR *Reason ) +GLOBAL void +Channel_Quit( CLIENT *Client, char *Reason ) { CHANNEL *c, *next_c; assert( Client != NULL ); assert( Reason != NULL ); + IRC_WriteStrRelatedPrefix( Client, Client, false, "QUIT :%s", Reason ); + c = My_Channels; while( c ) { next_c = c->next; - Remove_Client( REMOVE_QUIT, c, Client, Client, Reason, FALSE ); + Remove_Client( REMOVE_QUIT, c, Client, Client, Reason, false ); c = next_c; } } /* Channel_Quit */ -GLOBAL LONG -Channel_Count( VOID ) +GLOBAL long +Channel_Count( void ) { CHANNEL *c; - LONG count; + long count = 0; - count = 0; c = My_Channels; while( c ) { @@ -274,15 +276,14 @@ Channel_Count( VOID ) } /* Channel_Count */ -GLOBAL LONG +GLOBAL long Channel_MemberCount( CHANNEL *Chan ) { CL2CHAN *cl2chan; - LONG count; + long count = 0; assert( Chan != NULL ); - count = 0; cl2chan = My_Cl2Chan; while( cl2chan ) { @@ -293,17 +294,16 @@ Channel_MemberCount( CHANNEL *Chan ) } /* Channel_MemberCount */ -GLOBAL INT +GLOBAL int Channel_CountForUser( CLIENT *Client ) { /* Count number of channels a user is member of. */ CL2CHAN *cl2chan; - INT count; + int count = 0; assert( Client != NULL ); - count = 0; cl2chan = My_Cl2Chan; while( cl2chan ) { @@ -315,15 +315,14 @@ Channel_CountForUser( CLIENT *Client ) } /* Channel_CountForUser */ -GLOBAL INT -Channel_PCount( VOID ) +GLOBAL int +Channel_PCount( void ) { /* Count the number of persistent (mode 'P') channels */ CHANNEL *chan; - INT count; + int count = 0; - count = 0; chan = My_Channels; while( chan ) { @@ -335,7 +334,7 @@ Channel_PCount( VOID ) } /* Channel_PCount */ -GLOBAL CHAR * +GLOBAL char * Channel_Name( CHANNEL *Chan ) { assert( Chan != NULL ); @@ -343,7 +342,7 @@ Channel_Name( CHANNEL *Chan ) } /* Channel_Name */ -GLOBAL CHAR * +GLOBAL char * Channel_Modes( CHANNEL *Chan ) { assert( Chan != NULL ); @@ -351,7 +350,7 @@ Channel_Modes( CHANNEL *Chan ) } /* Channel_Modes */ -GLOBAL CHAR * +GLOBAL char * Channel_Key( CHANNEL *Chan ) { assert( Chan != NULL ); @@ -359,7 +358,7 @@ Channel_Key( CHANNEL *Chan ) } /* Channel_Key */ -GLOBAL LONG +GLOBAL long Channel_MaxUsers( CHANNEL *Chan ) { assert( Chan != NULL ); @@ -368,7 +367,7 @@ Channel_MaxUsers( CHANNEL *Chan ) GLOBAL CHANNEL * -Channel_First( VOID ) +Channel_First( void ) { return My_Channels; } /* Channel_First */ @@ -383,7 +382,7 @@ Channel_Next( CHANNEL *Chan ) GLOBAL CHANNEL * -Channel_Search( CHAR *Name ) +Channel_Search( char *Name ) { /* Channel-Struktur suchen */ @@ -457,86 +456,88 @@ Channel_GetChannel( CL2CHAN *Cl2Chan ) } /* Channel_GetChannel */ -GLOBAL BOOLEAN -Channel_IsValidName( CHAR *Name ) +GLOBAL bool +Channel_IsValidName( char *Name ) { /* Pruefen, ob Name als Channelname gueltig */ - CHAR *ptr, badchars[10]; + char *ptr, badchars[10]; assert( Name != NULL ); - if(( Name[0] != '#' ) || ( strlen( Name ) >= CHANNEL_NAME_LEN )) return FALSE; + if(( Name[0] != '#' ) || ( strlen( Name ) >= CHANNEL_NAME_LEN )) return false; ptr = Name; strcpy( badchars, " ,:\007" ); while( *ptr ) { - if( strchr( badchars, *ptr )) return FALSE; + if( strchr( badchars, *ptr )) return false; ptr++; } - return TRUE; + return true; } /* Channel_IsValidName */ -GLOBAL BOOLEAN -Channel_ModeAdd( CHANNEL *Chan, CHAR Mode ) +GLOBAL bool +Channel_ModeAdd( CHANNEL *Chan, char Mode ) { - /* Mode soll gesetzt werden. TRUE wird geliefert, wenn der - * Mode neu gesetzt wurde, FALSE, wenn der Channel den Mode - * bereits hatte. */ + /* set Mode. + * If the channel already had this mode, return false. + * If the channel mode was newly set return true. + */ - CHAR x[2]; + char x[2]; assert( Chan != NULL ); x[0] = Mode; x[1] = '\0'; if( ! strchr( Chan->modes, x[0] )) { - /* Client hat den Mode noch nicht -> setzen */ + /* Channel does not have this mode yet, set it */ strlcat( Chan->modes, x, sizeof( Chan->modes )); - return TRUE; + return true; } - else return FALSE; + else return false; } /* Channel_ModeAdd */ -GLOBAL BOOLEAN -Channel_ModeDel( CHANNEL *Chan, CHAR Mode ) +GLOBAL bool +Channel_ModeDel( CHANNEL *Chan, char Mode ) { - /* Mode soll geloescht werden. TRUE wird geliefert, wenn der - * Mode entfernt wurde, FALSE, wenn der Channel den Mode - * ueberhaupt nicht hatte. */ - - CHAR x[2], *p; + /* Delete mode. + * if the mode was removed return true. + * if the channel did not have the mode, return false. + */ + char x[2], *p; assert( Chan != NULL ); x[0] = Mode; x[1] = '\0'; p = strchr( Chan->modes, x[0] ); - if( ! p ) return FALSE; + if( ! p ) return false; - /* Client hat den Mode -> loeschen */ + /* Channel has mode -> delete */ while( *p ) { *p = *(p + 1); p++; } - return TRUE; + return true; } /* Channel_ModeDel */ -GLOBAL BOOLEAN -Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, CHAR Mode ) +GLOBAL bool +Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, char Mode ) { - /* Channel-User-Mode soll gesetzt werden. TRUE wird geliefert, - * wenn der Mode neu gesetzt wurde, FALSE, wenn der User den - * Channel-Mode bereits hatte. */ + /* Set Channel-User-Mode. + * if mode was newly set, return true. + * if the User already had this channel-mode, return false. + */ CL2CHAN *cl2chan; - CHAR x[2]; + char x[2]; assert( Chan != NULL ); assert( Client != NULL ); @@ -547,23 +548,24 @@ Channel_UserModeAdd( CHANNEL *Chan, CLIE x[0] = Mode; x[1] = '\0'; if( ! strchr( cl2chan->modes, x[0] )) { - /* Client hat den Mode noch nicht -> setzen */ + /* mode not set, -> set it */ strlcat( cl2chan->modes, x, sizeof( cl2chan->modes )); - return TRUE; + return true; } - else return FALSE; + else return false; } /* Channel_UserModeAdd */ -GLOBAL BOOLEAN -Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, CHAR Mode ) +GLOBAL bool +Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, char Mode ) { - /* Channel-User-Mode soll geloescht werden. TRUE wird geliefert, - * wenn der Mode entfernt wurde, FALSE, wenn der User den Channel-Mode - * ueberhaupt nicht hatte. */ + /* Delete Channel-User-Mode. + * If Mode was removed, return true. + * If User did not have the Channel-Mode, return false. + */ CL2CHAN *cl2chan; - CHAR x[2], *p; + char x[2], *p; assert( Chan != NULL ); assert( Client != NULL ); @@ -574,22 +576,22 @@ Channel_UserModeDel( CHANNEL *Chan, CLIE x[0] = Mode; x[1] = '\0'; p = strchr( cl2chan->modes, x[0] ); - if( ! p ) return FALSE; + if( ! p ) return false; - /* Client hat den Mode -> loeschen */ + /* Client has Mode -> delete */ while( *p ) { *p = *(p + 1); p++; } - return TRUE; + return true; } /* Channel_UserModeDel */ -GLOBAL CHAR * +GLOBAL char * Channel_UserModes( CHANNEL *Chan, CLIENT *Client ) { - /* Channel-Modes eines Users liefern */ + /* return Users' Channel-Modes */ CL2CHAN *cl2chan; @@ -603,20 +605,20 @@ Channel_UserModes( CHANNEL *Chan, CLIENT } /* Channel_UserModes */ -GLOBAL BOOLEAN +GLOBAL bool Channel_IsMemberOf( CHANNEL *Chan, CLIENT *Client ) { - /* Pruefen, ob Client Mitglied in Channel ist */ + /* Test if Client is on Channel Chan */ assert( Chan != NULL ); assert( Client != NULL ); - if( Get_Cl2Chan( Chan, Client )) return TRUE; - else return FALSE; + if( Get_Cl2Chan( Chan, Client )) return true; + else return false; } /* Channel_IsMemberOf */ -GLOBAL CHAR * +GLOBAL char * Channel_Topic( CHANNEL *Chan ) { assert( Chan != NULL ); @@ -624,8 +626,8 @@ Channel_Topic( CHANNEL *Chan ) } /* Channel_Topic */ -GLOBAL VOID -Channel_SetTopic( CHANNEL *Chan, CHAR *Topic ) +GLOBAL void +Channel_SetTopic( CHANNEL *Chan, char *Topic ) { assert( Chan != NULL ); assert( Topic != NULL ); @@ -634,8 +636,8 @@ Channel_SetTopic( CHANNEL *Chan, CHAR *T } /* Channel_SetTopic */ -GLOBAL VOID -Channel_SetModes( CHANNEL *Chan, CHAR *Modes ) +GLOBAL void +Channel_SetModes( CHANNEL *Chan, char *Modes ) { assert( Chan != NULL ); assert( Modes != NULL ); @@ -644,8 +646,8 @@ Channel_SetModes( CHANNEL *Chan, CHAR *M } /* Channel_SetModes */ -GLOBAL VOID -Channel_SetKey( CHANNEL *Chan, CHAR *Key ) +GLOBAL void +Channel_SetKey( CHANNEL *Chan, char *Key ) { assert( Chan != NULL ); assert( Key != NULL ); @@ -655,8 +657,8 @@ Channel_SetKey( CHANNEL *Chan, CHAR *Key } /* Channel_SetKey */ -GLOBAL VOID -Channel_SetMaxUsers( CHANNEL *Chan, LONG Count ) +GLOBAL void +Channel_SetMaxUsers( CHANNEL *Chan, long Count ) { assert( Chan != NULL ); @@ -665,45 +667,44 @@ Channel_SetMaxUsers( CHANNEL *Chan, LONG } /* Channel_SetMaxUsers */ -GLOBAL BOOLEAN -Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR *Text ) +GLOBAL bool +Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, char *Text ) { - BOOLEAN is_member, has_voice, is_op, ok; + bool is_member, has_voice, is_op, ok; /* Okay, target is a channel */ - is_member = has_voice = is_op = FALSE; + is_member = has_voice = is_op = false; if( Channel_IsMemberOf( Chan, From )) { - is_member = TRUE; - if( strchr( Channel_UserModes( Chan, From ), 'v' )) has_voice = TRUE; - if( strchr( Channel_UserModes( Chan, From ), 'o' )) is_op = TRUE; + is_member = true; + if( strchr( Channel_UserModes( Chan, From ), 'v' )) has_voice = true; + if( strchr( Channel_UserModes( Chan, From ), 'o' )) is_op = true; } - /* Check weather client is allowed to write to channel */ - ok = TRUE; - if( strchr( Channel_Modes( Chan ), 'n' ) && ( ! is_member )) ok = FALSE; - if( strchr( Channel_Modes( Chan ), 'm' ) && ( ! is_op ) && ( ! has_voice )) ok = FALSE; + /* Is the client allowed to write to channel? */ + ok = true; + if( strchr( Channel_Modes( Chan ), 'n' ) && ( ! is_member )) ok = false; + if( strchr( Channel_Modes( Chan ), 'm' ) && ( ! is_op ) && ( ! has_voice )) ok = false; /* Is the client banned? */ if( Lists_CheckBanned( From, Chan )) { /* Client is banned, bus is he channel operator or has voice? */ - if(( ! has_voice ) && ( ! is_op )) ok = FALSE; + if(( ! has_voice ) && ( ! is_op )) ok = false; } if( ! ok ) return IRC_WriteStrClient( From, ERR_CANNOTSENDTOCHAN_MSG, Client_ID( From ), Channel_Name( Chan )); /* Send text */ if( Client_Conn( From ) > NONE ) Conn_UpdateIdle( Client_Conn( From )); - return IRC_WriteStrChannelPrefix( Client, Chan, From, TRUE, "PRIVMSG %s :%s", Channel_Name( Chan ), Text ); + return IRC_WriteStrChannelPrefix( Client, Chan, From, true, "PRIVMSG %s :%s", Channel_Name( Chan ), Text ); } /* Channel_Write */ GLOBAL CHANNEL * -Channel_Create( CHAR *Name ) +Channel_Create( char *Name ) { - /* Neue Channel-Struktur anlegen */ - + /* Create new CHANNEL structure and add it to linked list */ CHANNEL *c; assert( Name != NULL ); @@ -714,16 +715,9 @@ Channel_Create( CHAR *Name ) Log( LOG_EMERG, "Can't allocate memory! [New_Chan]" ); return NULL; } - c->next = NULL; + memset( c, 0, sizeof( CHANNEL )); strlcpy( c->name, Name, sizeof( c->name )); - c->name[CHANNEL_NAME_LEN - 1] = '\0'; - strcpy( c->modes, "" ); - strcpy( c->topic, "" ); c->hash = Hash( c->name ); - strcpy( c->key, "" ); - c->maxusers = 0; - - /* Verketten */ c->next = My_Channels; My_Channels = c; @@ -780,8 +774,8 @@ Add_Client( CHANNEL *Chan, CLIENT *Clien } /* Add_Client */ -LOCAL BOOLEAN -Remove_Client( INT Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Reason, BOOLEAN InformServer ) +LOCAL bool +Remove_Client( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Reason, bool InformServer ) { CL2CHAN *cl2chan, *last_cl2chan; CHANNEL *c; @@ -799,7 +793,7 @@ Remove_Client( INT Type, CHANNEL *Chan, last_cl2chan = cl2chan; cl2chan = cl2chan->next; } - if( ! cl2chan ) return FALSE; + if( ! cl2chan ) return false; c = cl2chan->channel; assert( c != NULL ); @@ -814,22 +808,21 @@ Remove_Client( INT Type, CHANNEL *Chan, case REMOVE_QUIT: /* QUIT: andere Server wurden bereits informiert, vgl. Client_Destroy(); * hier also "nur" noch alle User in betroffenen Channeln infomieren */ - assert( InformServer == FALSE ); - IRC_WriteStrChannelPrefix( Origin, c, Origin, FALSE, "QUIT :%s", Reason ); + assert( InformServer == false ); Log( LOG_DEBUG, "User \"%s\" left channel \"%s\" (%s).", Client_Mask( Client ), c->name, Reason ); break; case REMOVE_KICK: /* User wurde geKICKed: ggf. andere Server sowie alle betroffenen User * im entsprechenden Channel informieren */ if( InformServer ) IRC_WriteStrServersPrefix( Client_NextHop( Origin ), Origin, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason ); - IRC_WriteStrChannelPrefix( Client, c, Origin, FALSE, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason ); + IRC_WriteStrChannelPrefix( Client, c, Origin, false, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason ); if(( Client_Conn( Client ) > NONE ) && ( Client_Type( Client ) == CLIENT_USER )) IRC_WriteStrClientPrefix( Client, Origin, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason ); Log( LOG_DEBUG, "User \"%s\" has been kicked of \"%s\" by \"%s\": %s.", Client_Mask( Client ), c->name, Client_ID( Origin ), Reason ); break; default: /* PART */ if( InformServer ) IRC_WriteStrServersPrefix( Origin, Client, "PART %s :%s", c->name, Reason ); - IRC_WriteStrChannelPrefix( Origin, c, Client, FALSE, "PART %s :%s", c->name, Reason ); + IRC_WriteStrChannelPrefix( Origin, c, Client, false, "PART %s :%s", c->name, Reason ); if(( Client_Conn( Origin ) > NONE ) && ( Client_Type( Origin ) == CLIENT_USER )) IRC_WriteStrClientPrefix( Origin, Client, "PART %s :%s", c->name, Reason ); Log( LOG_DEBUG, "User \"%s\" left channel \"%s\" (%s).", Client_Mask( Client ), c->name, Reason ); } @@ -840,7 +833,7 @@ Remove_Client( INT Type, CHANNEL *Chan, if( ! Get_First_Cl2Chan( NULL, Chan )) Delete_Channel( Chan ); } - return TRUE; + return true; } /* Remove_Client */ @@ -869,7 +862,7 @@ Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT } /* Get_Next_Cl2Chan */ -LOCAL BOOLEAN +LOCAL bool Delete_Channel( CHANNEL *Chan ) { /* Channel-Struktur loeschen */ @@ -884,7 +877,7 @@ Delete_Channel( CHANNEL *Chan ) last_chan = chan; chan = chan->next; } - if( ! chan ) return FALSE; + if( ! chan ) return false; Log( LOG_DEBUG, "Freed channel structure for \"%s\".", Chan->name ); @@ -896,7 +889,7 @@ Delete_Channel( CHANNEL *Chan ) else My_Channels = chan->next; free( chan ); - return TRUE; + return true; } /* Delete_Channel */ Index: src/ngircd/channel.h =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/channel.h,v retrieving revision 1.26 retrieving revision 1.27 diff -u -p -r1.26 -r1.27 --- src/ngircd/channel.h 16 Dec 2002 23:05:24 -0000 1.26 +++ src/ngircd/channel.h 19 Mar 2005 18:43:48 -0000 1.27 @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: channel.h,v 1.26 2002/12/16 23:05:24 alex Exp $ + * $Id: channel.h,v 1.27 2005/03/19 18:43:48 fw Exp $ * * Channel management (header) */ @@ -25,12 +25,12 @@ typedef struct _CHANNEL { struct _CHANNEL *next; - CHAR name[CHANNEL_NAME_LEN]; /* Name of the channel */ + char name[CHANNEL_NAME_LEN]; /* Name of the channel */ UINT32 hash; /* Hash of the (lowecase!) name */ - CHAR modes[CHANNEL_MODE_LEN]; /* Channel modes */ - CHAR topic[CHANNEL_TOPIC_LEN]; /* Topic of the channel */ - CHAR key[CLIENT_PASS_LEN]; /* Channel key ("password", mode "k" ) */ - LONG maxusers; /* Maximum number of members (mode "l") */ + char modes[CHANNEL_MODE_LEN]; /* Channel modes */ + char topic[CHANNEL_TOPIC_LEN]; /* Topic of the channel */ + char key[CLIENT_PASS_LEN]; /* Channel key ("password", mode "k" ) */ + long maxusers; /* Maximum number of members (mode "l") */ } CHANNEL; typedef struct _CLIENT2CHAN @@ -38,7 +38,7 @@ typedef struct _CLIENT2CHAN struct _CLIENT2CHAN *next; CLIENT *client; CHANNEL *channel; - CHAR modes[CHANNEL_MODE_LEN]; /* User-Modes in dem Channel */ + char modes[CHANNEL_MODE_LEN]; /* User-Modes in dem Channel */ } CL2CHAN; #else @@ -49,36 +49,36 @@ typedef POINTER CL2CHAN; #endif -GLOBAL VOID Channel_Init PARAMS(( VOID )); -GLOBAL VOID Channel_InitPredefined PARAMS(( VOID )); -GLOBAL VOID Channel_Exit PARAMS(( VOID )); +GLOBAL void Channel_Init PARAMS(( void )); +GLOBAL void Channel_InitPredefined PARAMS(( void )); +GLOBAL void Channel_Exit PARAMS(( void )); -GLOBAL BOOLEAN Channel_Join PARAMS(( CLIENT *Client, CHAR *Name )); -GLOBAL BOOLEAN Channel_Part PARAMS(( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason )); +GLOBAL bool Channel_Join PARAMS(( CLIENT *Client, char *Name )); +GLOBAL bool Channel_Part PARAMS(( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason )); -GLOBAL VOID Channel_Quit PARAMS(( CLIENT *Client, CHAR *Reason )); +GLOBAL void Channel_Quit PARAMS(( CLIENT *Client, char *Reason )); -GLOBAL VOID Channel_Kick PARAMS(( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason )); +GLOBAL void Channel_Kick PARAMS(( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason )); -GLOBAL LONG Channel_Count PARAMS(( VOID )); -GLOBAL LONG Channel_MemberCount PARAMS(( CHANNEL *Chan )); -GLOBAL INT Channel_CountForUser PARAMS(( CLIENT *Client )); -GLOBAL INT Channel_PCount PARAMS(( VOID )); +GLOBAL long Channel_Count PARAMS(( void )); +GLOBAL long Channel_MemberCount PARAMS(( CHANNEL *Chan )); +GLOBAL int Channel_CountForUser PARAMS(( CLIENT *Client )); +GLOBAL int Channel_PCount PARAMS(( void )); -GLOBAL CHAR *Channel_Name PARAMS(( CHANNEL *Chan )); -GLOBAL CHAR *Channel_Modes PARAMS(( CHANNEL *Chan )); -GLOBAL CHAR *Channel_Topic PARAMS(( CHANNEL *Chan )); -GLOBAL CHAR *Channel_Key PARAMS(( CHANNEL *Chan )); -GLOBAL LONG Channel_MaxUsers PARAMS(( CHANNEL *Chan )); +GLOBAL char *Channel_Name PARAMS(( CHANNEL *Chan )); +GLOBAL char *Channel_Modes PARAMS(( CHANNEL *Chan )); +GLOBAL char *Channel_Topic PARAMS(( CHANNEL *Chan )); +GLOBAL char *Channel_Key PARAMS(( CHANNEL *Chan )); +GLOBAL long Channel_MaxUsers PARAMS(( CHANNEL *Chan )); -GLOBAL VOID Channel_SetTopic PARAMS(( CHANNEL *Chan, CHAR *Topic )); -GLOBAL VOID Channel_SetModes PARAMS(( CHANNEL *Chan, CHAR *Modes )); -GLOBAL VOID Channel_SetKey PARAMS(( CHANNEL *Chan, CHAR *Key )); -GLOBAL VOID Channel_SetMaxUsers PARAMS(( CHANNEL *Chan, LONG Count )); +GLOBAL void Channel_SetTopic PARAMS(( CHANNEL *Chan, char *Topic )); +GLOBAL void Channel_SetModes PARAMS(( CHANNEL *Chan, char *Modes )); +GLOBAL void Channel_SetKey PARAMS(( CHANNEL *Chan, char *Key )); +GLOBAL void Channel_SetMaxUsers PARAMS(( CHANNEL *Chan, long Count )); -GLOBAL CHANNEL *Channel_Search PARAMS(( CHAR *Name )); +GLOBAL CHANNEL *Channel_Search PARAMS(( char *Name )); -GLOBAL CHANNEL *Channel_First PARAMS(( VOID )); +GLOBAL CHANNEL *Channel_First PARAMS(( void )); GLOBAL CHANNEL *Channel_Next PARAMS(( CHANNEL *Chan )); GLOBAL CL2CHAN *Channel_FirstMember PARAMS(( CHANNEL *Chan )); @@ -89,20 +89,20 @@ GLOBAL CL2CHAN *Channel_NextChannelOf PA GLOBAL CLIENT *Channel_GetClient PARAMS(( CL2CHAN *Cl2Chan )); GLOBAL CHANNEL *Channel_GetChannel PARAMS(( CL2CHAN *Cl2Chan )); -GLOBAL BOOLEAN Channel_IsValidName PARAMS(( CHAR *Name )); +GLOBAL bool Channel_IsValidName PARAMS(( char *Name )); -GLOBAL BOOLEAN Channel_ModeAdd PARAMS(( CHANNEL *Chan, CHAR Mode )); -GLOBAL BOOLEAN Channel_ModeDel PARAMS(( CHANNEL *Chan, CHAR Mode )); +GLOBAL bool Channel_ModeAdd PARAMS(( CHANNEL *Chan, char Mode )); +GLOBAL bool Channel_ModeDel PARAMS(( CHANNEL *Chan, char Mode )); -GLOBAL BOOLEAN Channel_UserModeAdd PARAMS(( CHANNEL *Chan, CLIENT *Client, CHAR Mode )); -GLOBAL BOOLEAN Channel_UserModeDel PARAMS(( CHANNEL *Chan, CLIENT *Client, CHAR Mode )); -GLOBAL CHAR *Channel_UserModes PARAMS(( CHANNEL *Chan, CLIENT *Client )); +GLOBAL bool Channel_UserModeAdd PARAMS(( CHANNEL *Chan, CLIENT *Client, char Mode )); +GLOBAL bool Channel_UserModeDel PARAMS(( CHANNEL *Chan, CLIENT *Client, char Mode )); +GLOBAL char *Channel_UserModes PARAMS(( CHANNEL *Chan, CLIENT *Client )); -GLOBAL BOOLEAN Channel_IsMemberOf PARAMS(( CHANNEL *Chan, CLIENT *Client )); +GLOBAL bool Channel_IsMemberOf PARAMS(( CHANNEL *Chan, CLIENT *Client )); -GLOBAL BOOLEAN Channel_Write PARAMS(( CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR *Text )); +GLOBAL bool Channel_Write PARAMS(( CHANNEL *Chan, CLIENT *From, CLIENT *Client, char *Text )); -GLOBAL CHANNEL *Channel_Create PARAMS(( CHAR *Name )); +GLOBAL CHANNEL *Channel_Create PARAMS(( char *Name )); #endif Index: src/ngircd/client.c =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/client.c,v retrieving revision 1.76 retrieving revision 1.84 diff -u -p -r1.76 -r1.84 --- src/ngircd/client.c 11 Mar 2004 22:16:31 -0000 1.76 +++ src/ngircd/client.c 12 Jun 2005 16:39:42 -0000 1.84 @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de) + * Copyright (c)2001-2005 by Alexander Barton (alex@barton.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,7 +17,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: client.c,v 1.76 2004/03/11 22:16:31 alex Exp $"; +static char UNUSED id[] = "$Id: client.c,v 1.84 2005/06/12 16:39:42 alex Exp $"; #include "imp.h" #include @@ -28,6 +28,7 @@ static char UNUSED id[] = "$Id: client.c #include #include +#include "defines.h" #include "conn.h" #include "exp.h" @@ -50,26 +51,29 @@ static char UNUSED id[] = "$Id: client.c LOCAL CLIENT *This_Server, *My_Clients; -LOCAL CHAR GetID_Buffer[GETID_LEN]; +LOCAL char GetID_Buffer[GETID_LEN]; +LOCAL WHOWAS My_Whowas[MAX_WHOWAS]; +LOCAL int Last_Whowas = -1; -LOCAL LONG Count PARAMS(( CLIENT_TYPE Type )); -LOCAL LONG MyCount PARAMS(( CLIENT_TYPE Type )); -LOCAL CLIENT *New_Client_Struct PARAMS(( VOID )); -LOCAL VOID Generate_MyToken PARAMS(( CLIENT *Client )); -LOCAL VOID Adjust_Counters PARAMS(( CLIENT *Client )); +LOCAL long Count PARAMS(( CLIENT_TYPE Type )); +LOCAL long MyCount PARAMS(( CLIENT_TYPE Type )); + +LOCAL CLIENT *New_Client_Struct PARAMS(( void )); +LOCAL void Generate_MyToken PARAMS(( CLIENT *Client )); +LOCAL void Adjust_Counters PARAMS(( CLIENT *Client )); #ifndef Client_DestroyNow -GLOBAL VOID Client_DestroyNow PARAMS((CLIENT *Client )); +GLOBAL void Client_DestroyNow PARAMS((CLIENT *Client )); #endif -LONG Max_Users = 0, My_Max_Users = 0; +long Max_Users = 0, My_Max_Users = 0; -GLOBAL VOID -Client_Init( VOID ) +GLOBAL void +Client_Init( void ) { struct hostent *h; @@ -97,17 +101,19 @@ Client_Init( VOID ) Client_SetInfo( This_Server, Conf_ServerInfo ); My_Clients = This_Server; + + memset( &My_Whowas, 0, sizeof( My_Whowas )); } /* Client_Init */ -GLOBAL VOID -Client_Exit( VOID ) +GLOBAL void +Client_Exit( void ) { CLIENT *c, *next; - INT cnt; + int cnt; - if( NGIRCd_SignalRestart ) Client_Destroy( This_Server, "Server going down (restarting).", NULL, FALSE ); - else Client_Destroy( This_Server, "Server going down.", NULL, FALSE ); + if( NGIRCd_SignalRestart ) Client_Destroy( This_Server, "Server going down (restarting).", NULL, false ); + else Client_Destroy( This_Server, "Server going down.", NULL, false ); cnt = 0; c = My_Clients; @@ -123,14 +129,14 @@ Client_Exit( VOID ) GLOBAL CLIENT * -Client_ThisServer( VOID ) +Client_ThisServer( void ) { return This_Server; } /* Client_ThisServer */ GLOBAL CLIENT * -Client_NewLocal( CONN_ID Idx, CHAR *Hostname, INT Type, BOOLEAN Idented ) +Client_NewLocal( CONN_ID Idx, char *Hostname, int Type, bool Idented ) { /* Neuen lokalen Client erzeugen: Wrapper-Funktion fuer Client_New(). */ return Client_New( Idx, This_Server, NULL, Type, NULL, NULL, Hostname, NULL, 0, 0, NULL, Idented ); @@ -138,7 +144,7 @@ Client_NewLocal( CONN_ID Idx, CHAR *Host GLOBAL CLIENT * -Client_NewRemoteServer( CLIENT *Introducer, CHAR *Hostname, CLIENT *TopServer, INT Hops, INT Token, CHAR *Info, BOOLEAN Idented ) +Client_NewRemoteServer( CLIENT *Introducer, char *Hostname, CLIENT *TopServer, int Hops, int Token, char *Info, bool Idented ) { /* Neuen Remote-Client erzeugen: Wrapper-Funktion fuer Client_New (). */ return Client_New( NONE, Introducer, TopServer, CLIENT_SERVER, Hostname, NULL, Hostname, Info, Hops, Token, NULL, Idented ); @@ -146,7 +152,7 @@ Client_NewRemoteServer( CLIENT *Introduc GLOBAL CLIENT * -Client_NewRemoteUser( CLIENT *Introducer, CHAR *Nick, INT Hops, CHAR *User, CHAR *Hostname, INT Token, CHAR *Modes, CHAR *Info, BOOLEAN Idented ) +Client_NewRemoteUser( CLIENT *Introducer, char *Nick, int Hops, char *User, char *Hostname, int Token, char *Modes, char *Info, bool Idented ) { /* Neuen Remote-Client erzeugen: Wrapper-Funktion fuer Client_New (). */ return Client_New( NONE, Introducer, NULL, CLIENT_USER, Nick, User, Hostname, Info, Hops, Token, Modes, Idented ); @@ -154,7 +160,7 @@ Client_NewRemoteUser( CLIENT *Introducer GLOBAL CLIENT * -Client_New( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, INT Type, CHAR *ID, CHAR *User, CHAR *Hostname, CHAR *Info, INT Hops, INT Token, CHAR *Modes, BOOLEAN Idented ) +Client_New( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, int Type, char *ID, char *User, char *Hostname, char *Info, int Hops, int Token, char *Modes, bool Idented ) { CLIENT *client; @@ -166,6 +172,7 @@ Client_New( CONN_ID Idx, CLIENT *Introdu if( ! client ) return NULL; /* Initialisieren */ + client->starttime = time(NULL); client->conn_id = Idx; client->introducer = Introducer; client->topserver = TopServer; @@ -193,13 +200,13 @@ Client_New( CONN_ID Idx, CLIENT *Introdu } /* Client_New */ -GLOBAL VOID -Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN SendQuit ) +GLOBAL void +Client_Destroy( CLIENT *Client, char *LogMsg, char *FwdMsg, bool SendQuit ) { /* Client entfernen. */ CLIENT *last, *c; - CHAR msg[LINE_LEN], *txt; + char msg[LINE_LEN], *txt; assert( Client != NULL ); @@ -208,7 +215,11 @@ Client_Destroy( CLIENT *Client, CHAR *Lo if( ! txt ) txt = "Reason unknown."; /* Netz-Split-Nachricht vorbereiten (noch nicht optimal) */ - if( Client->type == CLIENT_SERVER ) snprintf( msg, sizeof( msg ), "%s: lost server %s", This_Server->id, Client->id ); + if( Client->type == CLIENT_SERVER ) { + strlcpy(msg, This_Server->id, sizeof (msg)); + strlcat(msg, " ", sizeof (msg)); + strlcat(msg, Client->id, sizeof (msg)); + } last = NULL; c = My_Clients; @@ -218,7 +229,7 @@ Client_Destroy( CLIENT *Client, CHAR *Lo { /* der Client, der geloescht wird ist ein Server. Der Client, den wir gerade * pruefen, ist ein Child von diesem und muss daher auch entfernt werden */ - Client_Destroy( c, NULL, msg, FALSE ); + Client_Destroy( c, NULL, msg, false ); last = NULL; c = My_Clients; continue; @@ -257,7 +268,12 @@ Client_Destroy( CLIENT *Client, CHAR *Lo else IRC_WriteStrServersPrefix( Client_NextHop( c ), c, "QUIT :" ); } } + + /* Unregister client from channels */ Channel_Quit( c, FwdMsg ? FwdMsg : c->id ); + + /* Register client in My_Whowas structure */ + Client_RegisterWhowas( c ); } else if( c->type == CLIENT_SERVER ) { @@ -297,7 +313,7 @@ Client_Destroy( CLIENT *Client, CHAR *Lo } /* Client_Destroy */ -GLOBAL VOID +GLOBAL void Client_DestroyNow( CLIENT *Client ) { /* Destroy client structure immediately. This function is only @@ -326,8 +342,8 @@ Client_DestroyNow( CLIENT *Client ) } /* Client_DestroyNow */ -GLOBAL VOID -Client_SetHostname( CLIENT *Client, CHAR *Hostname ) +GLOBAL void +Client_SetHostname( CLIENT *Client, char *Hostname ) { /* Hostname eines Clients setzen */ @@ -338,8 +354,8 @@ Client_SetHostname( CLIENT *Client, CHAR } /* Client_SetHostname */ -GLOBAL VOID -Client_SetID( CLIENT *Client, CHAR *ID ) +GLOBAL void +Client_SetID( CLIENT *Client, char *ID ) { /* Hostname eines Clients setzen, Hash-Wert berechnen */ @@ -353,8 +369,8 @@ Client_SetID( CLIENT *Client, CHAR *ID ) } /* Client_SetID */ -GLOBAL VOID -Client_SetUser( CLIENT *Client, CHAR *User, BOOLEAN Idented ) +GLOBAL void +Client_SetUser( CLIENT *Client, char *User, bool Idented ) { /* Username eines Clients setzen */ @@ -370,8 +386,8 @@ Client_SetUser( CLIENT *Client, CHAR *Us } /* Client_SetUser */ -GLOBAL VOID -Client_SetInfo( CLIENT *Client, CHAR *Info ) +GLOBAL void +Client_SetInfo( CLIENT *Client, char *Info ) { /* Hostname eines Clients setzen */ @@ -382,8 +398,8 @@ Client_SetInfo( CLIENT *Client, CHAR *In } /* Client_SetInfo */ -GLOBAL VOID -Client_SetModes( CLIENT *Client, CHAR *Modes ) +GLOBAL void +Client_SetModes( CLIENT *Client, char *Modes ) { /* Modes eines Clients setzen */ @@ -394,8 +410,8 @@ Client_SetModes( CLIENT *Client, CHAR *M } /* Client_SetModes */ -GLOBAL VOID -Client_SetFlags( CLIENT *Client, CHAR *Flags ) +GLOBAL void +Client_SetFlags( CLIENT *Client, char *Flags ) { /* Flags eines Clients setzen */ @@ -406,8 +422,8 @@ Client_SetFlags( CLIENT *Client, CHAR *F } /* Client_SetFlags */ -GLOBAL VOID -Client_SetPassword( CLIENT *Client, CHAR *Pwd ) +GLOBAL void +Client_SetPassword( CLIENT *Client, char *Pwd ) { /* Von einem Client geliefertes Passwort */ @@ -418,8 +434,8 @@ Client_SetPassword( CLIENT *Client, CHAR } /* Client_SetPassword */ -GLOBAL VOID -Client_SetAway( CLIENT *Client, CHAR *Txt ) +GLOBAL void +Client_SetAway( CLIENT *Client, char *Txt ) { /* Set AWAY reason of client */ @@ -431,8 +447,8 @@ Client_SetAway( CLIENT *Client, CHAR *Tx } /* Client_SetAway */ -GLOBAL VOID -Client_SetType( CLIENT *Client, INT Type ) +GLOBAL void +Client_SetType( CLIENT *Client, int Type ) { assert( Client != NULL ); Client->type = Type; @@ -441,23 +457,23 @@ Client_SetType( CLIENT *Client, INT Type } /* Client_SetType */ -GLOBAL VOID -Client_SetHops( CLIENT *Client, INT Hops ) +GLOBAL void +Client_SetHops( CLIENT *Client, int Hops ) { assert( Client != NULL ); Client->hops = Hops; } /* Client_SetHops */ -GLOBAL VOID -Client_SetToken( CLIENT *Client, INT Token ) +GLOBAL void +Client_SetToken( CLIENT *Client, int Token ) { assert( Client != NULL ); Client->token = Token; } /* Client_SetToken */ -GLOBAL VOID +GLOBAL void Client_SetIntroducer( CLIENT *Client, CLIENT *Introducer ) { assert( Client != NULL ); @@ -466,22 +482,23 @@ Client_SetIntroducer( CLIENT *Client, CL } /* Client_SetIntroducer */ -GLOBAL VOID -Client_SetOperByMe( CLIENT *Client, BOOLEAN OperByMe ) +GLOBAL void +Client_SetOperByMe( CLIENT *Client, bool OperByMe ) { assert( Client != NULL ); Client->oper_by_me = OperByMe; } /* Client_SetOperByMe */ -GLOBAL BOOLEAN -Client_ModeAdd( CLIENT *Client, CHAR Mode ) +GLOBAL bool +Client_ModeAdd( CLIENT *Client, char Mode ) { - /* Mode soll gesetzt werden. TRUE wird geliefert, wenn der - * Mode neu gesetzt wurde, FALSE, wenn der Client den Mode - * bereits hatte. */ + /* Set Mode. + * If Client already alread had Mode, return false. + * If the Mode was newly set, return true. + */ - CHAR x[2]; + char x[2]; assert( Client != NULL ); @@ -490,43 +507,45 @@ Client_ModeAdd( CLIENT *Client, CHAR Mod { /* Client hat den Mode noch nicht -> setzen */ strlcat( Client->modes, x, sizeof( Client->modes )); - return TRUE; + return true; } - else return FALSE; + else return false; } /* Client_ModeAdd */ -GLOBAL BOOLEAN -Client_ModeDel( CLIENT *Client, CHAR Mode ) +GLOBAL bool +Client_ModeDel( CLIENT *Client, char Mode ) { - /* Mode soll geloescht werden. TRUE wird geliefert, wenn der - * Mode entfernt wurde, FALSE, wenn der Client den Mode - * ueberhaupt nicht hatte. */ + /* Delete Mode. + * If Mode was removed, return true. + * If Client did not have Mode, return false. + */ - CHAR x[2], *p; + char x[2], *p; assert( Client != NULL ); x[0] = Mode; x[1] = '\0'; p = strchr( Client->modes, x[0] ); - if( ! p ) return FALSE; + if( ! p ) return false; - /* Client hat den Mode -> loeschen */ + /* Client has Mode -> delete */ while( *p ) { *p = *(p + 1); p++; } - return TRUE; + return true; } /* Client_ModeDel */ GLOBAL CLIENT * Client_GetFromConn( CONN_ID Idx ) { - /* Client-Struktur, die zur lokalen Verbindung Idx gehoert, - * liefern. Wird keine gefunden, so wird NULL geliefert. */ + /* return Client-Structure that belongs to the local Connection Idx gehoert. + * If none is found, return NULL. + */ CLIENT *c; @@ -543,18 +562,19 @@ Client_GetFromConn( CONN_ID Idx ) GLOBAL CLIENT * -Client_Search( CHAR *Nick ) +Client_Search( char *Nick ) { - /* Client-Struktur, die den entsprechenden Nick hat, liefern. - * Wird keine gefunden, so wird NULL geliefert. */ + /* return Client-Structure that has the corresponding Nick. + * If none is found, return NULL. + */ - CHAR search_id[CLIENT_ID_LEN], *ptr; + char search_id[CLIENT_ID_LEN], *ptr; CLIENT *c = NULL; UINT32 search_hash; assert( Nick != NULL ); - /* Nick kopieren und ggf. Host-Mask abschneiden */ + /* copy Nick and truncate hostmask if necessary */ strlcpy( search_id, Nick, sizeof( search_id )); ptr = strchr( search_id, '!' ); if( ptr ) *ptr = '\0'; @@ -576,7 +596,7 @@ Client_Search( CHAR *Nick ) GLOBAL CLIENT * -Client_GetFromToken( CLIENT *Client, INT Token ) +Client_GetFromToken( CLIENT *Client, int Token ) { /* Client-Struktur, die den entsprechenden Introducer (=Client) * und das gegebene Token hat, liefern. Wird keine gefunden, @@ -597,7 +617,7 @@ Client_GetFromToken( CLIENT *Client, INT } /* Client_GetFromToken */ -GLOBAL INT +GLOBAL int Client_Type( CLIENT *Client ) { assert( Client != NULL ); @@ -613,7 +633,7 @@ Client_Conn( CLIENT *Client ) } /* Client_Conn */ -GLOBAL CHAR * +GLOBAL char * Client_ID( CLIENT *Client ) { assert( Client != NULL ); @@ -627,7 +647,7 @@ Client_ID( CLIENT *Client ) } /* Client_ID */ -GLOBAL CHAR * +GLOBAL char * Client_Info( CLIENT *Client ) { assert( Client != NULL ); @@ -635,7 +655,7 @@ Client_Info( CLIENT *Client ) } /* Client_Info */ -GLOBAL CHAR * +GLOBAL char * Client_User( CLIENT *Client ) { assert( Client != NULL ); @@ -644,7 +664,7 @@ Client_User( CLIENT *Client ) } /* Client_User */ -GLOBAL CHAR * +GLOBAL char * Client_Hostname( CLIENT *Client ) { assert( Client != NULL ); @@ -652,7 +672,7 @@ Client_Hostname( CLIENT *Client ) } /* Client_Hostname */ -GLOBAL CHAR * +GLOBAL char * Client_Password( CLIENT *Client ) { assert( Client != NULL ); @@ -660,7 +680,7 @@ Client_Password( CLIENT *Client ) } /* Client_Password */ -GLOBAL CHAR * +GLOBAL char * Client_Modes( CLIENT *Client ) { assert( Client != NULL ); @@ -668,7 +688,7 @@ Client_Modes( CLIENT *Client ) } /* Client_Modes */ -GLOBAL CHAR * +GLOBAL char * Client_Flags( CLIENT *Client ) { assert( Client != NULL ); @@ -676,7 +696,7 @@ Client_Flags( CLIENT *Client ) } /* Client_Flags */ -GLOBAL BOOLEAN +GLOBAL bool Client_OperByMe( CLIENT *Client ) { assert( Client != NULL ); @@ -684,7 +704,7 @@ Client_OperByMe( CLIENT *Client ) } /* Client_OperByMe */ -GLOBAL INT +GLOBAL int Client_Hops( CLIENT *Client ) { assert( Client != NULL ); @@ -692,7 +712,7 @@ Client_Hops( CLIENT *Client ) } /* Client_Hops */ -GLOBAL INT +GLOBAL int Client_Token( CLIENT *Client ) { assert( Client != NULL ); @@ -700,7 +720,7 @@ Client_Token( CLIENT *Client ) } /* Client_Token */ -GLOBAL INT +GLOBAL int Client_MyToken( CLIENT *Client ) { assert( Client != NULL ); @@ -721,7 +741,7 @@ Client_NextHop( CLIENT *Client ) } /* Client_NextHop */ -GLOBAL CHAR * +GLOBAL char * Client_Mask( CLIENT *Client ) { /* Client-"ID" liefern, wie sie z.B. fuer @@ -752,15 +772,15 @@ Client_TopServer( CLIENT *Client ) } /* Client_TopServer */ -GLOBAL BOOLEAN -Client_HasMode( CLIENT *Client, CHAR Mode ) +GLOBAL bool +Client_HasMode( CLIENT *Client, char Mode ) { assert( Client != NULL ); return strchr( Client->modes, Mode ) != NULL; } /* Client_HasMode */ -GLOBAL CHAR * +GLOBAL char * Client_Away( CLIENT *Client ) { /* AWAY-Text liefern */ @@ -770,8 +790,8 @@ Client_Away( CLIENT *Client ) } /* Client_Away */ -GLOBAL BOOLEAN -Client_CheckNick( CLIENT *Client, CHAR *Nick ) +GLOBAL bool +Client_CheckNick( CLIENT *Client, char *Nick ) { /* Nick ueberpruefen */ @@ -782,7 +802,7 @@ Client_CheckNick( CLIENT *Client, CHAR * if( ! Client_IsValidNick( Nick )) { IRC_WriteStrClient( Client, ERR_ERRONEUSNICKNAME_MSG, Client_ID( Client ), Nick ); - return FALSE; + return false; } /* Nick bereits vergeben? */ @@ -790,19 +810,19 @@ Client_CheckNick( CLIENT *Client, CHAR * { /* den Nick gibt es bereits */ IRC_WriteStrClient( Client, ERR_NICKNAMEINUSE_MSG, Client_ID( Client ), Nick ); - return FALSE; + return false; } - return TRUE; + return true; } /* Client_CheckNick */ -GLOBAL BOOLEAN -Client_CheckID( CLIENT *Client, CHAR *ID ) +GLOBAL bool +Client_CheckID( CLIENT *Client, char *ID ) { /* Nick ueberpruefen */ - CHAR str[COMMAND_LEN]; + char str[COMMAND_LEN]; CLIENT *c; assert( Client != NULL ); @@ -813,7 +833,7 @@ Client_CheckID( CLIENT *Client, CHAR *ID if( strlen( ID ) > CLIENT_ID_LEN ) { IRC_WriteStrClient( Client, ERR_ERRONEUSNICKNAME_MSG, Client_ID( Client ), ID ); - return FALSE; + return false; } /* ID bereits vergeben? */ @@ -826,18 +846,18 @@ Client_CheckID( CLIENT *Client, CHAR *ID snprintf( str, sizeof( str ), "ID \"%s\" already registered", ID ); if( Client->conn_id != c->conn_id ) Log( LOG_ERR, "%s (on connection %d)!", str, c->conn_id ); else Log( LOG_ERR, "%s (via network)!", str ); - Conn_Close( Client->conn_id, str, str, TRUE ); - return FALSE; + Conn_Close( Client->conn_id, str, str, true); + return false; } c = (CLIENT *)c->next; } - return TRUE; + return true; } /* Client_CheckID */ GLOBAL CLIENT * -Client_First( VOID ) +Client_First( void ) { /* Ersten Client liefern. */ @@ -856,46 +876,46 @@ Client_Next( CLIENT *c ) } /* Client_Next */ -GLOBAL LONG -Client_UserCount( VOID ) +GLOBAL long +Client_UserCount( void ) { return Count( CLIENT_USER ); } /* Client_UserCount */ -GLOBAL LONG -Client_ServiceCount( VOID ) +GLOBAL long +Client_ServiceCount( void ) { return Count( CLIENT_SERVICE );; } /* Client_ServiceCount */ -GLOBAL LONG -Client_ServerCount( VOID ) +GLOBAL long +Client_ServerCount( void ) { return Count( CLIENT_SERVER ); } /* Client_ServerCount */ -GLOBAL LONG -Client_MyUserCount( VOID ) +GLOBAL long +Client_MyUserCount( void ) { return MyCount( CLIENT_USER ); } /* Client_MyUserCount */ -GLOBAL LONG -Client_MyServiceCount( VOID ) +GLOBAL long +Client_MyServiceCount( void ) { return MyCount( CLIENT_SERVICE ); } /* Client_MyServiceCount */ -GLOBAL LONG -Client_MyServerCount( VOID ) +GLOBAL long +Client_MyServerCount( void ) { CLIENT *c; - LONG cnt; + long cnt; cnt = 0; c = My_Clients; @@ -908,11 +928,11 @@ Client_MyServerCount( VOID ) } /* Client_MyServerCount */ -GLOBAL LONG -Client_OperCount( VOID ) +GLOBAL long +Client_OperCount( void ) { CLIENT *c; - LONG cnt; + long cnt; cnt = 0; c = My_Clients; @@ -925,11 +945,11 @@ Client_OperCount( VOID ) } /* Client_OperCount */ -GLOBAL LONG -Client_UnknownCount( VOID ) +GLOBAL long +Client_UnknownCount( void ) { CLIENT *c; - LONG cnt; + long cnt; cnt = 0; c = My_Clients; @@ -942,52 +962,84 @@ Client_UnknownCount( VOID ) } /* Client_UnknownCount */ -GLOBAL LONG -Client_MaxUserCount( VOID ) +GLOBAL long +Client_MaxUserCount( void ) { return Max_Users; } /* Client_MaxUserCount */ -GLOBAL LONG -Client_MyMaxUserCount( VOID ) +GLOBAL long +Client_MyMaxUserCount( void ) { return My_Max_Users; } /* Client_MyMaxUserCount */ -GLOBAL BOOLEAN -Client_IsValidNick( CHAR *Nick ) +GLOBAL bool +Client_IsValidNick( char *Nick ) { /* Ist der Nick gueltig? */ - CHAR *ptr, goodchars[20]; + char *ptr, goodchars[20]; assert( Nick != NULL ); strcpy( goodchars, ";0123456789-" ); - if( Nick[0] == '#' ) return FALSE; - if( strchr( goodchars, Nick[0] )) return FALSE; - if( strlen( Nick ) >= CLIENT_NICK_LEN ) return FALSE; + if( Nick[0] == '#' ) return false; + if( strchr( goodchars, Nick[0] )) return false; + if( strlen( Nick ) >= CLIENT_NICK_LEN ) return false; ptr = Nick; while( *ptr ) { - if(( *ptr < 'A' ) && ( ! strchr( goodchars, *ptr ))) return FALSE; - if(( *ptr > '}' ) && ( ! strchr( goodchars, *ptr ))) return FALSE; + if(( *ptr < 'A' ) && ( ! strchr( goodchars, *ptr ))) return false; + if(( *ptr > '}' ) && ( ! strchr( goodchars, *ptr ))) return false; ptr++; } - return TRUE; + return true; } /* Client_IsValidNick */ -LOCAL LONG +/** + * Return pointer to "My_Whowas" structure. + */ +GLOBAL WHOWAS * +Client_GetWhowas( void ) +{ + return My_Whowas; +} /* Client_GetWhowas */ + +/** + * Return the index of the last used WHOWAS entry. + */ +GLOBAL int +Client_GetLastWhowasIndex( void ) +{ + return Last_Whowas; +} /* Client_GetLastWhowasIndex */ + + +/** + * Get the start time of this client. + * The result is the start time in seconds since 1970-01-01, as reported + * by the C function time(NULL). + */ +GLOBAL time_t +Client_StartTime(CLIENT *Client) +{ + assert( Client != NULL ); + return Client->starttime; +} /* Client_Uptime */ + + +LOCAL long Count( CLIENT_TYPE Type ) { CLIENT *c; - LONG cnt; + long cnt; cnt = 0; c = My_Clients; @@ -1000,11 +1052,11 @@ Count( CLIENT_TYPE Type ) } /* Count */ -LOCAL LONG +LOCAL long MyCount( CLIENT_TYPE Type ) { CLIENT *c; - LONG cnt; + long cnt; cnt = 0; c = My_Clients; @@ -1018,7 +1070,7 @@ MyCount( CLIENT_TYPE Type ) LOCAL CLIENT * -New_Client_Struct( VOID ) +New_Client_Struct( void ) { /* Neue CLIENT-Struktur pre-initialisieren */ @@ -1031,34 +1083,24 @@ New_Client_Struct( VOID ) return NULL; } - c->next = NULL; - c->hash = 0; + memset( c, 0, sizeof ( CLIENT )); + c->type = CLIENT_UNKNOWN; c->conn_id = NONE; - c->introducer = NULL; - c->topserver = NULL; - strcpy( c->id, "" ); - strcpy( c->pwd, "" ); - strcpy( c->host, "" ); - strcpy( c->user, "" ); - strcpy( c->info, "" ); - strcpy( c->modes, "" ); - c->oper_by_me = FALSE; + c->oper_by_me = false; c->hops = -1; c->token = -1; c->mytoken = -1; - strcpy( c->away, "" ); - strcpy( c->flags, "" ); return c; } /* New_Client */ -LOCAL VOID +LOCAL void Generate_MyToken( CLIENT *Client ) { CLIENT *c; - INT token; + int token; c = My_Clients; token = 2; @@ -1078,10 +1120,10 @@ Generate_MyToken( CLIENT *Client ) } /* Generate_MyToken */ -LOCAL VOID +LOCAL void Adjust_Counters( CLIENT *Client ) { - LONG count; + long count; assert( Client != NULL ); @@ -1098,4 +1140,44 @@ Adjust_Counters( CLIENT *Client ) } /* Adjust_Counters */ +/** + * Register client in My_Whowas structure for further recall by WHOWAS. + * Note: Only clients that have been connected at least 30 seconds will be + * registered to prevent automated IRC bots to "destroy" a nice server + * history database. + */ +GLOBAL void +Client_RegisterWhowas( CLIENT *Client ) +{ + int slot; + + assert( Client != NULL ); + + /* Don't register clients that were connected less than 30 seconds. */ + if( time(NULL) - Client->starttime < 30 ) + return; + + slot = Last_Whowas + 1; + if( slot >= MAX_WHOWAS || slot < 0 ) slot = 0; + +#ifdef DEBUG + Log( LOG_DEBUG, "Saving WHOWAS information to slot %d ...", slot ); +#endif + + My_Whowas[slot].time = time( NULL ); + strlcpy( My_Whowas[slot].id, Client_ID( Client ), + sizeof( My_Whowas[slot].id )); + strlcpy( My_Whowas[slot].user, Client_User( Client ), + sizeof( My_Whowas[slot].user )); + strlcpy( My_Whowas[slot].host, Client_Hostname( Client ), + sizeof( My_Whowas[slot].host )); + strlcpy( My_Whowas[slot].info, Client_Info( Client ), + sizeof( My_Whowas[slot].info )); + strlcpy( My_Whowas[slot].server, Client_ID( Client_Introducer( Client )), + sizeof( My_Whowas[slot].server )); + + Last_Whowas = slot; +} /* Client_RegisterWhowas */ + + /* -eof- */ Index: src/ngircd/client.h =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/client.h,v retrieving revision 1.34 retrieving revision 1.39 diff -u -p -r1.34 -r1.39 --- src/ngircd/client.h 15 Jan 2003 14:28:25 -0000 1.34 +++ src/ngircd/client.h 12 Jun 2005 16:18:49 -0000 1.39 @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: client.h,v 1.34 2003/01/15 14:28:25 alex Exp $ + * $Id: client.h,v 1.39 2005/06/12 16:18:49 alex Exp $ * * Client management (header) */ @@ -28,31 +28,30 @@ #define CLIENT_SERVER 128 /* client is a server */ #define CLIENT_SERVICE 256 /* client is a service */ -#define CLIENT_TYPE INT +#define CLIENT_TYPE int #if defined(__client_c__) | defined(S_SPLINT_S) -#include "defines.h" - typedef struct _CLIENT { - CHAR id[CLIENT_ID_LEN]; /* nick (user) / ID (server) */ + time_t starttime; /* Start time of link */ + char id[CLIENT_ID_LEN]; /* nick (user) / ID (server) */ UINT32 hash; /* hash of lower-case ID */ POINTER *next; /* pointer to next client structure */ CLIENT_TYPE type; /* type of client, see CLIENT_xxx */ CONN_ID conn_id; /* ID of the connection (if local) or NONE (remote) */ struct _CLIENT *introducer; /* ID of the servers which the client is connected to */ struct _CLIENT *topserver; /* toplevel servers (only valid if client is a server) */ - CHAR pwd[CLIENT_PASS_LEN]; /* password received of the client */ - CHAR host[CLIENT_HOST_LEN]; /* hostname of the client */ - CHAR user[CLIENT_USER_LEN]; /* user name ("login") */ - CHAR info[CLIENT_INFO_LEN]; /* long user name (user) / info text (server) */ - CHAR modes[CLIENT_MODE_LEN]; /* client modes */ - INT hops, token, mytoken; /* "hops" and "Token" (see SERVER command) */ - BOOLEAN oper_by_me; /* client is local IRC operator on this server? */ - CHAR away[CLIENT_AWAY_LEN]; /* AWAY text (valid if mode 'a' is set) */ - CHAR flags[CLIENT_FLAGS_LEN]; /* flags of the client */ + char pwd[CLIENT_PASS_LEN]; /* password received of the client */ + char host[CLIENT_HOST_LEN]; /* hostname of the client */ + char user[CLIENT_USER_LEN]; /* user name ("login") */ + char info[CLIENT_INFO_LEN]; /* long user name (user) / info text (server) */ + char modes[CLIENT_MODE_LEN]; /* client modes */ + int hops, token, mytoken; /* "hops" and "Token" (see SERVER command) */ + bool oper_by_me; /* client is local IRC operator on this server? */ + char away[CLIENT_AWAY_LEN]; /* AWAY text (valid if mode 'a' is set) */ + char flags[CLIENT_FLAGS_LEN]; /* flags of the client */ } CLIENT; #else @@ -62,81 +61,98 @@ typedef POINTER CLIENT; #endif -GLOBAL VOID Client_Init PARAMS(( VOID )); -GLOBAL VOID Client_Exit PARAMS(( VOID )); - -GLOBAL CLIENT *Client_NewLocal PARAMS(( CONN_ID Idx, CHAR *Hostname, INT Type, BOOLEAN Idented )); -GLOBAL CLIENT *Client_NewRemoteServer PARAMS(( CLIENT *Introducer, CHAR *Hostname, CLIENT *TopServer, INT Hops, INT Token, CHAR *Info, BOOLEAN Idented )); -GLOBAL CLIENT *Client_NewRemoteUser PARAMS(( CLIENT *Introducer, CHAR *Nick, INT Hops, CHAR *User, CHAR *Hostname, INT Token, CHAR *Modes, CHAR *Info, BOOLEAN Idented )); -GLOBAL CLIENT *Client_New PARAMS(( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, INT Type, CHAR *ID, CHAR *User, CHAR *Hostname, CHAR *Info, INT Hops, INT Token, CHAR *Modes, BOOLEAN Idented )); +typedef struct _WHOWAS +{ + time_t time; /* time stamp of entry or 0 if unused */ + char id[CLIENT_NICK_LEN]; /* client nick name */ + char host[CLIENT_HOST_LEN]; /* hostname of the client */ + char user[CLIENT_USER_LEN]; /* user name ("login") */ + char info[CLIENT_INFO_LEN]; /* long user name */ + char server[CLIENT_HOST_LEN]; /* server name */ +} WHOWAS; + + +GLOBAL void Client_Init PARAMS(( void )); +GLOBAL void Client_Exit PARAMS(( void )); + +GLOBAL CLIENT *Client_NewLocal PARAMS(( CONN_ID Idx, char *Hostname, int Type, bool Idented )); +GLOBAL CLIENT *Client_NewRemoteServer PARAMS(( CLIENT *Introducer, char *Hostname, CLIENT *TopServer, int Hops, int Token, char *Info, bool Idented )); +GLOBAL CLIENT *Client_NewRemoteUser PARAMS(( CLIENT *Introducer, char *Nick, int Hops, char *User, char *Hostname, int Token, char *Modes, char *Info, bool Idented )); +GLOBAL CLIENT *Client_New PARAMS(( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, int Type, char *ID, char *User, char *Hostname, char *Info, int Hops, int Token, char *Modes, bool Idented )); -GLOBAL VOID Client_Destroy PARAMS(( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN SendQuit )); +GLOBAL void Client_Destroy PARAMS(( CLIENT *Client, char *LogMsg, char *FwdMsg, bool SendQuit )); #ifdef CONN_MODULE -GLOBAL VOID Client_DestroyNow PARAMS(( CLIENT *Client )); +GLOBAL void Client_DestroyNow PARAMS(( CLIENT *Client )); #endif -GLOBAL CLIENT *Client_ThisServer PARAMS(( VOID )); +GLOBAL CLIENT *Client_ThisServer PARAMS(( void )); GLOBAL CLIENT *Client_GetFromConn PARAMS(( CONN_ID Idx )); -GLOBAL CLIENT *Client_GetFromToken PARAMS(( CLIENT *Client, INT Token )); +GLOBAL CLIENT *Client_GetFromToken PARAMS(( CLIENT *Client, int Token )); -GLOBAL CLIENT *Client_Search PARAMS(( CHAR *ID )); -GLOBAL CLIENT *Client_First PARAMS(( VOID )); +GLOBAL CLIENT *Client_Search PARAMS(( char *ID )); +GLOBAL CLIENT *Client_First PARAMS(( void )); GLOBAL CLIENT *Client_Next PARAMS(( CLIENT *c )); -GLOBAL INT Client_Type PARAMS(( CLIENT *Client )); +GLOBAL int Client_Type PARAMS(( CLIENT *Client )); GLOBAL CONN_ID Client_Conn PARAMS(( CLIENT *Client )); -GLOBAL CHAR *Client_ID PARAMS(( CLIENT *Client )); -GLOBAL CHAR *Client_Mask PARAMS(( CLIENT *Client )); -GLOBAL CHAR *Client_Info PARAMS(( CLIENT *Client )); -GLOBAL CHAR *Client_User PARAMS(( CLIENT *Client )); -GLOBAL CHAR *Client_Hostname PARAMS(( CLIENT *Client )); -GLOBAL CHAR *Client_Password PARAMS(( CLIENT *Client )); -GLOBAL CHAR *Client_Modes PARAMS(( CLIENT *Client )); -GLOBAL CHAR *Client_Flags PARAMS(( CLIENT *Client )); +GLOBAL char *Client_ID PARAMS(( CLIENT *Client )); +GLOBAL char *Client_Mask PARAMS(( CLIENT *Client )); +GLOBAL char *Client_Info PARAMS(( CLIENT *Client )); +GLOBAL char *Client_User PARAMS(( CLIENT *Client )); +GLOBAL char *Client_Hostname PARAMS(( CLIENT *Client )); +GLOBAL char *Client_Password PARAMS(( CLIENT *Client )); +GLOBAL char *Client_Modes PARAMS(( CLIENT *Client )); +GLOBAL char *Client_Flags PARAMS(( CLIENT *Client )); GLOBAL CLIENT *Client_Introducer PARAMS(( CLIENT *Client )); -GLOBAL BOOLEAN Client_OperByMe PARAMS(( CLIENT *Client )); -GLOBAL INT Client_Hops PARAMS(( CLIENT *Client )); -GLOBAL INT Client_Token PARAMS(( CLIENT *Client )); -GLOBAL INT Client_MyToken PARAMS(( CLIENT *Client )); +GLOBAL bool Client_OperByMe PARAMS(( CLIENT *Client )); +GLOBAL int Client_Hops PARAMS(( CLIENT *Client )); +GLOBAL int Client_Token PARAMS(( CLIENT *Client )); +GLOBAL int Client_MyToken PARAMS(( CLIENT *Client )); GLOBAL CLIENT *Client_TopServer PARAMS(( CLIENT *Client )); GLOBAL CLIENT *Client_NextHop PARAMS(( CLIENT *Client )); -GLOBAL CHAR *Client_Away PARAMS(( CLIENT *Client )); +GLOBAL char *Client_Away PARAMS(( CLIENT *Client )); +GLOBAL time_t Client_StartTime PARAMS(( CLIENT *Client )); + +GLOBAL bool Client_HasMode PARAMS(( CLIENT *Client, char Mode )); + +GLOBAL void Client_SetHostname PARAMS(( CLIENT *Client, char *Hostname )); +GLOBAL void Client_SetID PARAMS(( CLIENT *Client, char *Nick )); +GLOBAL void Client_SetUser PARAMS(( CLIENT *Client, char *User, bool Idented )); +GLOBAL void Client_SetInfo PARAMS(( CLIENT *Client, char *Info )); +GLOBAL void Client_SetPassword PARAMS(( CLIENT *Client, char *Pwd )); +GLOBAL void Client_SetType PARAMS(( CLIENT *Client, int Type )); +GLOBAL void Client_SetHops PARAMS(( CLIENT *Client, int Hops )); +GLOBAL void Client_SetToken PARAMS(( CLIENT *Client, int Token )); +GLOBAL void Client_SetOperByMe PARAMS(( CLIENT *Client, bool OperByMe )); +GLOBAL void Client_SetModes PARAMS(( CLIENT *Client, char *Modes )); +GLOBAL void Client_SetFlags PARAMS(( CLIENT *Client, char *Flags )); +GLOBAL void Client_SetIntroducer PARAMS(( CLIENT *Client, CLIENT *Introducer )); +GLOBAL void Client_SetAway PARAMS(( CLIENT *Client, char *Txt )); + +GLOBAL bool Client_ModeAdd PARAMS(( CLIENT *Client, char Mode )); +GLOBAL bool Client_ModeDel PARAMS(( CLIENT *Client, char Mode )); + +GLOBAL bool Client_CheckNick PARAMS(( CLIENT *Client, char *Nick )); +GLOBAL bool Client_CheckID PARAMS(( CLIENT *Client, char *ID )); + +GLOBAL long Client_UserCount PARAMS(( void )); +GLOBAL long Client_ServiceCount PARAMS(( void )); +GLOBAL long Client_ServerCount PARAMS(( void )); +GLOBAL long Client_OperCount PARAMS(( void )); +GLOBAL long Client_UnknownCount PARAMS(( void )); +GLOBAL long Client_MyUserCount PARAMS(( void )); +GLOBAL long Client_MyServiceCount PARAMS(( void )); +GLOBAL long Client_MyServerCount PARAMS(( void )); +GLOBAL long Client_MaxUserCount PARAMS(( void )); +GLOBAL long Client_MyMaxUserCount PARAMS(( void )); -GLOBAL BOOLEAN Client_HasMode PARAMS(( CLIENT *Client, CHAR Mode )); +GLOBAL bool Client_IsValidNick PARAMS(( char *Nick )); -GLOBAL VOID Client_SetHostname PARAMS(( CLIENT *Client, CHAR *Hostname )); -GLOBAL VOID Client_SetID PARAMS(( CLIENT *Client, CHAR *Nick )); -GLOBAL VOID Client_SetUser PARAMS(( CLIENT *Client, CHAR *User, BOOLEAN Idented )); -GLOBAL VOID Client_SetInfo PARAMS(( CLIENT *Client, CHAR *Info )); -GLOBAL VOID Client_SetPassword PARAMS(( CLIENT *Client, CHAR *Pwd )); -GLOBAL VOID Client_SetType PARAMS(( CLIENT *Client, INT Type )); -GLOBAL VOID Client_SetHops PARAMS(( CLIENT *Client, INT Hops )); -GLOBAL VOID Client_SetToken PARAMS(( CLIENT *Client, INT Token )); -GLOBAL VOID Client_SetOperByMe PARAMS(( CLIENT *Client, BOOLEAN OperByMe )); -GLOBAL VOID Client_SetModes PARAMS(( CLIENT *Client, CHAR *Modes )); -GLOBAL VOID Client_SetFlags PARAMS(( CLIENT *Client, CHAR *Flags )); -GLOBAL VOID Client_SetIntroducer PARAMS(( CLIENT *Client, CLIENT *Introducer )); -GLOBAL VOID Client_SetAway PARAMS(( CLIENT *Client, CHAR *Txt )); - -GLOBAL BOOLEAN Client_ModeAdd PARAMS(( CLIENT *Client, CHAR Mode )); -GLOBAL BOOLEAN Client_ModeDel PARAMS(( CLIENT *Client, CHAR Mode )); - -GLOBAL BOOLEAN Client_CheckNick PARAMS(( CLIENT *Client, CHAR *Nick )); -GLOBAL BOOLEAN Client_CheckID PARAMS(( CLIENT *Client, CHAR *ID )); - -GLOBAL LONG Client_UserCount PARAMS(( VOID )); -GLOBAL LONG Client_ServiceCount PARAMS(( VOID )); -GLOBAL LONG Client_ServerCount PARAMS(( VOID )); -GLOBAL LONG Client_OperCount PARAMS(( VOID )); -GLOBAL LONG Client_UnknownCount PARAMS(( VOID )); -GLOBAL LONG Client_MyUserCount PARAMS(( VOID )); -GLOBAL LONG Client_MyServiceCount PARAMS(( VOID )); -GLOBAL LONG Client_MyServerCount PARAMS(( VOID )); -GLOBAL LONG Client_MaxUserCount PARAMS(( VOID )); -GLOBAL LONG Client_MyMaxUserCount PARAMS(( VOID )); +GLOBAL WHOWAS *Client_GetWhowas PARAMS(( void )); +GLOBAL int Client_GetLastWhowasIndex PARAMS(( void )); -GLOBAL BOOLEAN Client_IsValidNick PARAMS(( CHAR *Nick )); +GLOBAL void Client_RegisterWhowas PARAMS(( CLIENT *Client )); #endif Index: src/ngircd/conf.c =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/conf.c,v retrieving revision 1.63.2.2 retrieving revision 1.77 diff -u -p -r1.63.2.2 -r1.77 --- src/ngircd/conf.c 27 Sep 2004 11:30:52 -0000 1.63.2.2 +++ src/ngircd/conf.c 17 Jun 2005 19:16:53 -0000 1.77 @@ -14,12 +14,16 @@ #include "portab.h" -static char UNUSED id[] = "$Id: conf.c,v 1.63.2.2 2004/09/27 11:30:52 alex Exp $"; +static char UNUSED id[] = "$Id: conf.c,v 1.77 2005/06/17 19:16:53 fw Exp $"; #include "imp.h" #include #include -#include +#ifdef PROTOTYPES +# include +#else +# include +#endif #include #include #include @@ -46,60 +50,64 @@ static char UNUSED id[] = "$Id: conf.c,v #include "conf.h" -LOCAL BOOLEAN Use_Log = TRUE; +LOCAL bool Use_Log = true; LOCAL CONF_SERVER New_Server; -LOCAL INT New_Server_Idx; +LOCAL int New_Server_Idx; -LOCAL VOID Set_Defaults PARAMS(( BOOLEAN InitServers )); -LOCAL VOID Read_Config PARAMS(( VOID )); -LOCAL VOID Validate_Config PARAMS(( BOOLEAN TestOnly )); +LOCAL void Set_Defaults PARAMS(( bool InitServers )); +LOCAL void Read_Config PARAMS(( void )); +LOCAL void Validate_Config PARAMS(( bool TestOnly )); -LOCAL VOID Handle_GLOBAL PARAMS(( INT Line, CHAR *Var, CHAR *Arg )); -LOCAL VOID Handle_OPERATOR PARAMS(( INT Line, CHAR *Var, CHAR *Arg )); -LOCAL VOID Handle_SERVER PARAMS(( INT Line, CHAR *Var, CHAR *Arg )); -LOCAL VOID Handle_CHANNEL PARAMS(( INT Line, CHAR *Var, CHAR *Arg )); +LOCAL void Handle_GLOBAL PARAMS(( int Line, char *Var, char *Arg )); +LOCAL void Handle_OPERATOR PARAMS(( int Line, char *Var, char *Arg )); +LOCAL void Handle_SERVER PARAMS(( int Line, char *Var, char *Arg )); +LOCAL void Handle_CHANNEL PARAMS(( int Line, char *Var, char *Arg )); -LOCAL VOID Config_Error PARAMS(( CONST INT Level, CONST CHAR *Format, ... )); +LOCAL void Config_Error PARAMS(( const int Level, const char *Format, ... )); -LOCAL VOID Init_Server_Struct PARAMS(( CONF_SERVER *Server )); +LOCAL void Config_Error_NaN PARAMS(( const int LINE, const char *Value )); +LOCAL void Config_Error_TooLong PARAMS(( const int LINE, const char *Value )); +LOCAL void Init_Server_Struct PARAMS(( CONF_SERVER *Server )); -GLOBAL VOID -Conf_Init( VOID ) + +GLOBAL void +Conf_Init( void ) { - Set_Defaults( TRUE ); + Set_Defaults( true ); Read_Config( ); - Validate_Config( FALSE ); + Validate_Config( false ); } /* Config_Init */ -GLOBAL VOID -Conf_Rehash( VOID ) +GLOBAL void +Conf_Rehash( void ) { - Set_Defaults( FALSE ); + Set_Defaults( false ); Read_Config( ); - Validate_Config( FALSE ); + Validate_Config( false ); } /* Config_Rehash */ -GLOBAL INT -Conf_Test( VOID ) +GLOBAL int +Conf_Test( void ) { /* Read configuration, validate and output it. */ struct passwd *pwd; struct group *grp; - INT i; + int i; - Use_Log = FALSE; - Set_Defaults( TRUE ); + Use_Log = false; + Set_Defaults( true ); Read_Config( ); - Validate_Config( TRUE ); + Validate_Config( true ); - /* If stdin is a valid tty wait for a key: */ - if( isatty( fileno( stdout ))) + /* If stdin and stdout ("you can read our nice message and we can + * read in your keypress") are valid tty's, wait for a key: */ + if( isatty( fileno( stdin )) && isatty( fileno( stdout ))) { puts( "OK, press enter to see a dump of your service configuration ..." ); getchar( ); @@ -115,25 +123,27 @@ Conf_Test( VOID ) printf( " AdminEMail = %s\n", Conf_ServerAdminMail ); printf( " MotdFile = %s\n", Conf_MotdFile ); printf( " MotdPhrase = %s\n", Conf_MotdPhrase ); - printf( " ChrootDir= %s\n", Conf_Chroot ); + printf( " ChrootDir = %s\n", Conf_Chroot ); + printf( " PidFile = %s\n", Conf_PidFile); printf( " Ports = " ); for( i = 0; i < Conf_ListenPorts_Count; i++ ) { if( i != 0 ) printf( ", " ); - printf( "%u", Conf_ListenPorts[i] ); + printf( "%u", (unsigned int) Conf_ListenPorts[i] ); } puts( "" ); printf( " Listen = %s\n", Conf_ListenAddress ); pwd = getpwuid( Conf_UID ); if( pwd ) printf( " ServerUID = %s\n", pwd->pw_name ); - else printf( " ServerUID = %ld\n", (LONG)Conf_UID ); + else printf( " ServerUID = %ld\n", (long)Conf_UID ); grp = getgrgid( Conf_GID ); if( grp ) printf( " ServerGID = %s\n", grp->gr_name ); - else printf( " ServerGID = %ld\n", (LONG)Conf_GID ); + else printf( " ServerGID = %ld\n", (long)Conf_GID ); printf( " PingTimeout = %d\n", Conf_PingTimeout ); printf( " PongTimeout = %d\n", Conf_PongTimeout ); printf( " ConnectRetry = %d\n", Conf_ConnectRetry ); - printf( " OperCanUseMode = %s\n", Conf_OperCanMode == TRUE ? "yes" : "no" ); + printf( " OperCanUseMode = %s\n", Conf_OperCanMode == true? "yes" : "no" ); + printf( " OperServerMode = %s\n", Conf_OperServerMode == true? "yes" : "no" ); if( Conf_MaxConnections > 0 ) printf( " MaxConnections = %ld\n", Conf_MaxConnections ); else printf( " MaxConnections = -1\n" ); if( Conf_MaxConnectionsIP > 0 ) printf( " MaxConnectionsIP = %d\n", Conf_MaxConnectionsIP ); @@ -150,6 +160,7 @@ Conf_Test( VOID ) puts( "[OPERATOR]" ); printf( " Name = %s\n", Conf_Oper[i].name ); printf( " Password = %s\n", Conf_Oper[i].pwd ); + if ( Conf_Oper[i].mask ) printf( " Mask = %s\n", Conf_Oper[i].mask ); puts( "" ); } @@ -184,7 +195,7 @@ Conf_Test( VOID ) } /* Conf_Test */ -GLOBAL VOID +GLOBAL void Conf_UnsetServer( CONN_ID Idx ) { /* Set next time for next connection attempt, if this is a server @@ -192,7 +203,7 @@ Conf_UnsetServer( CONN_ID Idx ) * "once", delete it from our configuration. * Non-Server-Connections will be silently ignored. */ - INT i; + int i; /* Check all our configured servers */ for( i = 0; i < MAX_SERVERS; i++ ) @@ -220,8 +231,8 @@ Conf_UnsetServer( CONN_ID Idx ) } /* Conf_UnsetServer */ -GLOBAL VOID -Conf_SetServer( INT ConfServer, CONN_ID Idx ) +GLOBAL void +Conf_SetServer( int ConfServer, CONN_ID Idx ) { /* Set connection for specified configured server */ @@ -232,12 +243,12 @@ Conf_SetServer( INT ConfServer, CONN_ID } /* Conf_SetServer */ -GLOBAL INT +GLOBAL int Conf_GetServer( CONN_ID Idx ) { /* Get index of server in configuration structure */ - INT i = 0; + int i = 0; assert( Idx > NONE ); @@ -249,12 +260,12 @@ Conf_GetServer( CONN_ID Idx ) } /* Conf_GetServer */ -GLOBAL BOOLEAN -Conf_EnableServer( CHAR *Name, INT Port ) +GLOBAL bool +Conf_EnableServer( char *Name, UINT16 Port ) { /* Enable specified server and adjust port */ - INT i; + int i; assert( Name != NULL ); @@ -265,19 +276,19 @@ Conf_EnableServer( CHAR *Name, INT Port /* Gotcha! Set port and enable server: */ Conf_Server[i].port = Port; Conf_Server[i].flags &= ~CONF_SFLAG_DISABLED; - return TRUE; + return true; } } - return FALSE; + return false; } /* Conf_EnableServer */ -GLOBAL BOOLEAN -Conf_DisableServer( CHAR *Name ) +GLOBAL bool +Conf_DisableServer( char *Name ) { /* Enable specified server and adjust port */ - INT i; + int i; assert( Name != NULL ); @@ -287,20 +298,20 @@ Conf_DisableServer( CHAR *Name ) { /* Gotcha! Disable and disconnect server: */ Conf_Server[i].flags |= CONF_SFLAG_DISABLED; - if( Conf_Server[i].conn_id > NONE ) Conn_Close( Conf_Server[i].conn_id, NULL, "Server link terminated on operator request", TRUE ); - return TRUE; + if( Conf_Server[i].conn_id > NONE ) Conn_Close( Conf_Server[i].conn_id, NULL, "Server link terminated on operator request", true); + return true; } } - return FALSE; + return false; } /* Conf_DisableServer */ -GLOBAL BOOLEAN -Conf_AddServer( CHAR *Name, INT Port, CHAR *Host, CHAR *MyPwd, CHAR *PeerPwd ) +GLOBAL bool +Conf_AddServer( char *Name, UINT16 Port, char *Host, char *MyPwd, char *PeerPwd ) { /* Add new server to configuration */ - INT i; + int i; assert( Name != NULL ); assert( Host != NULL ); @@ -313,7 +324,7 @@ Conf_AddServer( CHAR *Name, INT Port, CH /* Is this item used? */ if( ! Conf_Server[i].name[0] ) break; } - if( i >= MAX_SERVERS ) return FALSE; + if( i >= MAX_SERVERS ) return false; Init_Server_Struct( &Conf_Server[i] ); strlcpy( Conf_Server[i].name, Name, sizeof( Conf_Server[i].name )); @@ -323,19 +334,19 @@ Conf_AddServer( CHAR *Name, INT Port, CH Conf_Server[i].port = Port; Conf_Server[i].flags = CONF_SFLAG_ONCE; - return TRUE; + return true; } /* Conf_AddServer */ -LOCAL VOID -Set_Defaults( BOOLEAN InitServers ) +LOCAL void +Set_Defaults( bool InitServers ) { /* Initialize configuration variables with default values. */ - INT i; + int i; strcpy( Conf_ServerName, "" ); - sprintf( Conf_ServerInfo, "%s %s", PACKAGE_NAME, PACKAGE_VERSION ); + snprintf( Conf_ServerInfo, sizeof Conf_ServerInfo, "%s %s", PACKAGE_NAME, PACKAGE_VERSION ); strcpy( Conf_ServerPwd, "" ); strcpy( Conf_ServerAdmin1, "" ); @@ -349,6 +360,8 @@ Set_Defaults( BOOLEAN InitServers ) strlcpy( Conf_Chroot, CHROOT_DIR, sizeof( Conf_Chroot )); + strlcpy( Conf_PidFile, PID_FILE, sizeof( Conf_PidFile )); + Conf_ListenPorts_Count = 0; strcpy( Conf_ListenAddress, "" ); @@ -362,7 +375,8 @@ Set_Defaults( BOOLEAN InitServers ) Conf_Oper_Count = 0; Conf_Channel_Count = 0; - Conf_OperCanMode = FALSE; + Conf_OperCanMode = false; + Conf_OperServerMode = false; Conf_MaxConnections = -1; Conf_MaxConnectionsIP = 5; @@ -373,13 +387,13 @@ Set_Defaults( BOOLEAN InitServers ) } /* Set_Defaults */ -LOCAL VOID -Read_Config( VOID ) +LOCAL void +Read_Config( void ) { /* Read configuration file. */ - CHAR section[LINE_LEN], str[LINE_LEN], *var, *arg, *ptr; - INT line, i, n; + char section[LINE_LEN], str[LINE_LEN], *var, *arg, *ptr; + int line, i, n; FILE *fd; /* Open configuration file */ @@ -436,7 +450,7 @@ Read_Config( VOID ) New_Server_Idx = NONE; /* Read configuration file */ - while( TRUE ) + while( true ) { if( ! fgets( str, LINE_LEN, fd )) break; ngt_TrimStr( str ); @@ -456,8 +470,12 @@ Read_Config( VOID ) else { /* Initialize new operator structure */ - strcpy( Conf_Oper[Conf_Oper_Count].name, "" ); - strcpy( Conf_Oper[Conf_Oper_Count].pwd, "" ); + Conf_Oper[Conf_Oper_Count].name[0] = '\0'; + Conf_Oper[Conf_Oper_Count].pwd[0] = '\0'; + if (Conf_Oper[Conf_Oper_Count].mask) { + free(Conf_Oper[Conf_Oper_Count].mask ); + Conf_Oper[Conf_Oper_Count].mask = NULL; + } Conf_Oper_Count++; } continue; @@ -546,13 +564,24 @@ Read_Config( VOID ) } /* Read_Config */ -LOCAL VOID -Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg ) +LOCAL bool +Check_ArgIsTrue( const char *Arg ) +{ + if( strcasecmp( Arg, "yes" ) == 0 ) return true; + if( strcasecmp( Arg, "true" ) == 0 ) return true; + if( atoi( Arg ) != 0 ) return true; + + return false; +} /* Check_ArgIsTrue */ + + +LOCAL void +Handle_GLOBAL( int Line, char *Var, char *Arg ) { struct passwd *pwd; struct group *grp; - CHAR *ptr; - LONG port; + char *ptr; + long port; assert( Line > 0 ); assert( Var != NULL ); @@ -561,37 +590,43 @@ Handle_GLOBAL( INT Line, CHAR *Var, CHAR if( strcasecmp( Var, "Name" ) == 0 ) { /* Server name */ - if( strlcpy( Conf_ServerName, Arg, sizeof( Conf_ServerName )) >= sizeof( Conf_ServerName )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Name\" too long!", NGIRCd_ConfFile, Line ); + if( strlcpy( Conf_ServerName, Arg, sizeof( Conf_ServerName )) >= sizeof( Conf_ServerName )) + Config_Error_TooLong( Line, Var ); + return; } if( strcasecmp( Var, "Info" ) == 0 ) { /* Info text of server */ - if( strlcpy( Conf_ServerInfo, Arg, sizeof( Conf_ServerInfo )) >= sizeof( Conf_ServerInfo )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Info\" too long!", NGIRCd_ConfFile, Line ); + if( strlcpy( Conf_ServerInfo, Arg, sizeof( Conf_ServerInfo )) >= sizeof( Conf_ServerInfo )) + Config_Error_TooLong ( Line, Var ); + return; } if( strcasecmp( Var, "Password" ) == 0 ) { /* Global server password */ - if( strlcpy( Conf_ServerPwd, Arg, sizeof( Conf_ServerPwd )) >= sizeof( Conf_ServerPwd )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Password\" too long!", NGIRCd_ConfFile, Line ); + if( strlcpy( Conf_ServerPwd, Arg, sizeof( Conf_ServerPwd )) >= sizeof( Conf_ServerPwd )) + Config_Error_TooLong( Line, Var ); + return; } if( strcasecmp( Var, "AdminInfo1" ) == 0 ) { /* Administrative info #1 */ - if( strlcpy( Conf_ServerAdmin1, Arg, sizeof( Conf_ServerAdmin1 )) >= sizeof( Conf_ServerAdmin1 )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"AdminInfo1\" too long!", NGIRCd_ConfFile, Line ); + if( strlcpy( Conf_ServerAdmin1, Arg, sizeof( Conf_ServerAdmin1 )) >= sizeof( Conf_ServerAdmin1 )) Config_Error_TooLong ( Line, Var ); return; } if( strcasecmp( Var, "AdminInfo2" ) == 0 ) { /* Administrative info #2 */ - if( strlcpy( Conf_ServerAdmin2, Arg, sizeof( Conf_ServerAdmin2 )) >= sizeof( Conf_ServerAdmin2 )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"AdminInfo2\" too long!", NGIRCd_ConfFile, Line ); + if( strlcpy( Conf_ServerAdmin2, Arg, sizeof( Conf_ServerAdmin2 )) >= sizeof( Conf_ServerAdmin2 )) Config_Error_TooLong ( Line, Var ); return; } if( strcasecmp( Var, "AdminEMail" ) == 0 ) { /* Administrative email contact */ - if( strlcpy( Conf_ServerAdminMail, Arg, sizeof( Conf_ServerAdminMail )) >= sizeof( Conf_ServerAdminMail )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"AdminEMail\" too long!", NGIRCd_ConfFile, Line ); + if( strlcpy( Conf_ServerAdminMail, Arg, sizeof( Conf_ServerAdminMail )) >= sizeof( Conf_ServerAdminMail )) Config_Error_TooLong( Line, Var ); return; } if( strcasecmp( Var, "Ports" ) == 0 ) @@ -606,7 +641,7 @@ Handle_GLOBAL( INT Line, CHAR *Var, CHAR if( Conf_ListenPorts_Count + 1 > MAX_LISTEN_PORTS ) Config_Error( LOG_ERR, "Too many listen ports configured. Port %ld ignored.", port ); else { - if( port > 0 && port < 0xFFFF ) Conf_ListenPorts[Conf_ListenPorts_Count++] = (UINT)port; + if( port > 0 && port < 0xFFFF ) Conf_ListenPorts[Conf_ListenPorts_Count++] = (UINT16)port; else Config_Error( LOG_ERR, "%s, line %d (section \"Global\"): Illegal port number %ld!", NGIRCd_ConfFile, Line, port ); } ptr = strtok( NULL, "," ); @@ -616,21 +651,37 @@ Handle_GLOBAL( INT Line, CHAR *Var, CHAR if( strcasecmp( Var, "MotdFile" ) == 0 ) { /* "Message of the day" (MOTD) file */ - if( strlcpy( Conf_MotdFile, Arg, sizeof( Conf_MotdFile )) >= sizeof( Conf_MotdFile )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"MotdFile\" too long!", NGIRCd_ConfFile, Line ); + if( strlcpy( Conf_MotdFile, Arg, sizeof( Conf_MotdFile )) >= sizeof( Conf_MotdFile )) + Config_Error_TooLong( Line, Var ); + return; } if( strcasecmp( Var, "MotdPhrase" ) == 0 ) { /* "Message of the day" phrase (instead of file) */ - if( strlcpy( Conf_MotdPhrase, Arg, sizeof( Conf_MotdPhrase )) >= sizeof( Conf_MotdPhrase )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"MotdPhrase\" too long!", NGIRCd_ConfFile, Line ); + if( strlcpy( Conf_MotdPhrase, Arg, sizeof( Conf_MotdPhrase )) >= sizeof( Conf_MotdPhrase )) + Config_Error_TooLong( Line, Var ); + return; } if( strcasecmp( Var, "ChrootDir" ) == 0 ) { /* directory for chroot() */ - if( strlcpy( Conf_Chroot, Arg, sizeof( Conf_Chroot )) >= sizeof( Conf_Chroot )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"ChrootDir\" too long!", NGIRCd_ConfFile, Line ); + if( strlcpy( Conf_Chroot, Arg, sizeof( Conf_Chroot )) >= sizeof( Conf_Chroot )) + Config_Error_TooLong( Line, Var ); + return; } + + if ( strcasecmp( Var, "PidFile" ) == 0 ) + { + /* name of pidfile */ + if( strlcpy( Conf_PidFile, Arg, sizeof( Conf_PidFile )) >= sizeof( Conf_PidFile )) + Config_Error_TooLong( Line, Var ); + + return; + } + if( strcasecmp( Var, "ServerUID" ) == 0 ) { /* UID the daemon should switch to */ @@ -639,10 +690,10 @@ Handle_GLOBAL( INT Line, CHAR *Var, CHAR else { #ifdef HAVE_ISDIGIT - if( ! isdigit( (INT)*Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"ServerUID\" is not a number!", NGIRCd_ConfFile, Line ); + if( ! isdigit( (int)*Arg )) Config_Error_NaN( Line, Var ); else #endif - Conf_UID = (UINT)atoi( Arg ); + Conf_UID = (unsigned int)atoi( Arg ); } return; } @@ -654,10 +705,10 @@ Handle_GLOBAL( INT Line, CHAR *Var, CHAR else { #ifdef HAVE_ISDIGIT - if( ! isdigit( (INT)*Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"ServerGID\" is not a number!", NGIRCd_ConfFile, Line ); + if( ! isdigit( (int)*Arg )) Config_Error_NaN( Line, Var ); else #endif - Conf_GID = (UINT)atoi( Arg ); + Conf_GID = (unsigned int)atoi( Arg ); } return; } @@ -697,17 +748,20 @@ Handle_GLOBAL( INT Line, CHAR *Var, CHAR if( strcasecmp( Var, "OperCanUseMode" ) == 0 ) { /* Are IRC operators allowed to use MODE in channels they aren't Op in? */ - if( strcasecmp( Arg, "yes" ) == 0 ) Conf_OperCanMode = TRUE; - else if( strcasecmp( Arg, "true" ) == 0 ) Conf_OperCanMode = TRUE; - else if( atoi( Arg ) != 0 ) Conf_OperCanMode = TRUE; - else Conf_OperCanMode = FALSE; + Conf_OperCanMode = Check_ArgIsTrue( Arg ); + return; + } + if( strcasecmp( Var, "OperServerMode" ) == 0 ) + { + /* Mask IRC operator as if coming from the server? (ircd-irc2 compat hack) */ + Conf_OperServerMode = Check_ArgIsTrue( Arg ); return; } if( strcasecmp( Var, "MaxConnections" ) == 0 ) { /* Maximum number of connections. Values <= 0 are equal to "no limit". */ #ifdef HAVE_ISDIGIT - if( ! isdigit( (INT)*Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"MaxConnections\" is not a number!", NGIRCd_ConfFile, Line ); + if( ! isdigit( (int)*Arg )) Config_Error_NaN( Line, Var); else #endif Conf_MaxConnections = atol( Arg ); @@ -717,7 +771,7 @@ Handle_GLOBAL( INT Line, CHAR *Var, CHAR { /* Maximum number of simoultanous connections from one IP. Values <= 0 are equal to "no limit". */ #ifdef HAVE_ISDIGIT - if( ! isdigit( (INT)*Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"MaxConnectionsIP\" is not a number!", NGIRCd_ConfFile, Line ); + if( ! isdigit( (int)*Arg )) Config_Error_NaN( Line, Var ); else #endif Conf_MaxConnectionsIP = atoi( Arg ); @@ -727,7 +781,7 @@ Handle_GLOBAL( INT Line, CHAR *Var, CHAR { /* Maximum number of channels a user can join. Values <= 0 are equal to "no limit". */ #ifdef HAVE_ISDIGIT - if( ! isdigit( (INT)*Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"MaxJoins\" is not a number!", NGIRCd_ConfFile, Line ); + if( ! isdigit( (int)*Arg )) Config_Error_NaN( Line, Var ); else #endif Conf_MaxJoins = atoi( Arg ); @@ -738,7 +792,7 @@ Handle_GLOBAL( INT Line, CHAR *Var, CHAR /* IP-Address to bind sockets */ if( strlcpy( Conf_ListenAddress, Arg, sizeof( Conf_ListenAddress )) >= sizeof( Conf_ListenAddress )) { - Config_Error( LOG_WARNING, "%s, line %d: Value of \"Listen\" too long!", NGIRCd_ConfFile, Line ); + Config_Error_TooLong( Line, Var ); } return; } @@ -747,8 +801,8 @@ Handle_GLOBAL( INT Line, CHAR *Var, CHAR } /* Handle_GLOBAL */ -LOCAL VOID -Handle_OPERATOR( INT Line, CHAR *Var, CHAR *Arg ) +LOCAL void +Handle_OPERATOR( int Line, char *Var, char *Arg ) { assert( Line > 0 ); assert( Var != NULL ); @@ -758,24 +812,34 @@ Handle_OPERATOR( INT Line, CHAR *Var, CH if( strcasecmp( Var, "Name" ) == 0 ) { /* Name of IRC operator */ - if( strlcpy( Conf_Oper[Conf_Oper_Count - 1].name, Arg, sizeof( Conf_Oper[Conf_Oper_Count - 1].name )) >= sizeof( Conf_Oper[Conf_Oper_Count - 1].name )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Name\" too long!", NGIRCd_ConfFile, Line ); + if( strlcpy( Conf_Oper[Conf_Oper_Count - 1].name, Arg, sizeof( Conf_Oper[Conf_Oper_Count - 1].name )) >= sizeof( Conf_Oper[Conf_Oper_Count - 1].name )) Config_Error_TooLong( Line, Var ); return; } if( strcasecmp( Var, "Password" ) == 0 ) { /* Password of IRC operator */ - if( strlcpy( Conf_Oper[Conf_Oper_Count - 1].pwd, Arg, sizeof( Conf_Oper[Conf_Oper_Count - 1].pwd )) >= sizeof( Conf_Oper[Conf_Oper_Count - 1].pwd )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Password\" too long!", NGIRCd_ConfFile, Line ); + if( strlcpy( Conf_Oper[Conf_Oper_Count - 1].pwd, Arg, sizeof( Conf_Oper[Conf_Oper_Count - 1].pwd )) >= sizeof( Conf_Oper[Conf_Oper_Count - 1].pwd )) Config_Error_TooLong( Line, Var ); + return; + } + if( strcasecmp( Var, "Mask" ) == 0 ) + { + if (Conf_Oper[Conf_Oper_Count - 1].mask) return; /* Hostname already configured */ + Conf_Oper[Conf_Oper_Count - 1].mask = strdup( Arg ); + if (! Conf_Oper[Conf_Oper_Count - 1].mask) { + Config_Error( LOG_ERR, "%s, line %d: Cannot allocate memory for operator mask: %s", NGIRCd_ConfFile, Line, strerror(errno) ); + return; + } + return; } - Config_Error( LOG_ERR, "%s, line %d (section \"Operator\"): Unknown variable \"%s\"!", NGIRCd_ConfFile, Line, Var ); } /* Handle_OPERATOR */ -LOCAL VOID -Handle_SERVER( INT Line, CHAR *Var, CHAR *Arg ) +LOCAL void +Handle_SERVER( int Line, char *Var, char *Arg ) { - LONG port; + long port; assert( Line > 0 ); assert( Var != NULL ); @@ -787,32 +851,35 @@ Handle_SERVER( INT Line, CHAR *Var, CHAR if( strcasecmp( Var, "Host" ) == 0 ) { /* Hostname of the server */ - if( strlcpy( New_Server.host, Arg, sizeof( New_Server.host )) >= sizeof( New_Server.host )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Host\" too long!", NGIRCd_ConfFile, Line ); + if( strlcpy( New_Server.host, Arg, sizeof( New_Server.host )) >= sizeof( New_Server.host )) + Config_Error_TooLong ( Line, Var ); + return; } if( strcasecmp( Var, "Name" ) == 0 ) { /* Name of the server ("Nick"/"ID") */ - if( strlcpy( New_Server.name, Arg, sizeof( New_Server.name )) >= sizeof( New_Server.name )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Name\" too long!", NGIRCd_ConfFile, Line ); + if( strlcpy( New_Server.name, Arg, sizeof( New_Server.name )) >= sizeof( New_Server.name )) + Config_Error_TooLong( Line, Var ); return; } if( strcasecmp( Var, "MyPassword" ) == 0 ) { /* Password of this server which is sent to the peer */ - if( strlcpy( New_Server.pwd_in, Arg, sizeof( New_Server.pwd_in )) >= sizeof( New_Server.pwd_in )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"MyPassword\" too long!", NGIRCd_ConfFile, Line ); + if( strlcpy( New_Server.pwd_in, Arg, sizeof( New_Server.pwd_in )) >= sizeof( New_Server.pwd_in )) Config_Error_TooLong( Line, Var ); return; } if( strcasecmp( Var, "PeerPassword" ) == 0 ) { /* Passwort of the peer which must be received */ - if( strlcpy( New_Server.pwd_out, Arg, sizeof( New_Server.pwd_out )) >= sizeof( New_Server.pwd_out )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"PeerPassword\" too long!", NGIRCd_ConfFile, Line ); + if( strlcpy( New_Server.pwd_out, Arg, sizeof( New_Server.pwd_out )) >= sizeof( New_Server.pwd_out )) Config_Error_TooLong( Line, Var ); return; } if( strcasecmp( Var, "Port" ) == 0 ) { /* Port to which this server should connect */ port = atol( Arg ); - if( port > 0 && port < 0xFFFF ) New_Server.port = (INT)port; + if( port > 0 && port < 0xFFFF ) New_Server.port = (UINT16)port; else Config_Error( LOG_ERR, "%s, line %d (section \"Server\"): Illegal port number %ld!", NGIRCd_ConfFile, Line, port ); return; } @@ -820,7 +887,7 @@ Handle_SERVER( INT Line, CHAR *Var, CHAR { /* Server group */ #ifdef HAVE_ISDIGIT - if( ! isdigit( (INT)*Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Group\" is not a number!", NGIRCd_ConfFile, Line ); + if( ! isdigit( (int)*Arg )) Config_Error_NaN( Line, Var ); else #endif New_Server.group = atoi( Arg ); @@ -831,8 +898,8 @@ Handle_SERVER( INT Line, CHAR *Var, CHAR } /* Handle_SERVER */ -LOCAL VOID -Handle_CHANNEL( INT Line, CHAR *Var, CHAR *Arg ) +LOCAL void +Handle_CHANNEL( int Line, char *Var, char *Arg ) { assert( Line > 0 ); assert( Var != NULL ); @@ -841,19 +908,23 @@ Handle_CHANNEL( INT Line, CHAR *Var, CHA if( strcasecmp( Var, "Name" ) == 0 ) { /* Name of the channel */ - if( strlcpy( Conf_Channel[Conf_Channel_Count - 1].name, Arg, sizeof( Conf_Channel[Conf_Channel_Count - 1].name )) >= sizeof( Conf_Channel[Conf_Channel_Count - 1].name )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Name\" too long!", NGIRCd_ConfFile, Line ); + if( strlcpy( Conf_Channel[Conf_Channel_Count - 1].name, Arg, sizeof( Conf_Channel[Conf_Channel_Count - 1].name )) >= sizeof( Conf_Channel[Conf_Channel_Count - 1].name )) + Config_Error_TooLong( Line, Var ); return; } if( strcasecmp( Var, "Modes" ) == 0 ) { /* Initial modes */ - if( strlcpy( Conf_Channel[Conf_Channel_Count - 1].modes, Arg, sizeof( Conf_Channel[Conf_Channel_Count - 1].modes )) >= sizeof( Conf_Channel[Conf_Channel_Count - 1].modes )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Modes\" too long!", NGIRCd_ConfFile, Line ); + if( strlcpy( Conf_Channel[Conf_Channel_Count - 1].modes, Arg, sizeof( Conf_Channel[Conf_Channel_Count - 1].modes )) >= sizeof( Conf_Channel[Conf_Channel_Count - 1].modes )) + Config_Error_TooLong( Line, Var ); return; } if( strcasecmp( Var, "Topic" ) == 0 ) { /* Initial topic */ - if( strlcpy( Conf_Channel[Conf_Channel_Count - 1].topic, Arg, sizeof( Conf_Channel[Conf_Channel_Count - 1].topic )) >= sizeof( Conf_Channel[Conf_Channel_Count - 1].topic )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Topic\" too long!", NGIRCd_ConfFile, Line ); + if( strlcpy( Conf_Channel[Conf_Channel_Count - 1].topic, Arg, sizeof( Conf_Channel[Conf_Channel_Count - 1].topic )) >= sizeof( Conf_Channel[Conf_Channel_Count - 1].topic )) + Config_Error_TooLong( Line, Var ); + return; } @@ -861,13 +932,13 @@ Handle_CHANNEL( INT Line, CHAR *Var, CHA } /* Handle_CHANNEL */ -LOCAL VOID -Validate_Config( BOOLEAN Configtest ) +LOCAL void +Validate_Config( bool Configtest ) { /* Validate configuration settings. */ #ifdef DEBUG - INT i, servers, servers_once; + int i, servers, servers_once; #endif if( ! Conf_ServerName[0] ) @@ -911,9 +982,9 @@ Validate_Config( BOOLEAN Configtest ) Config_Error( LOG_WARNING, "No administrative information configured but required by RFC!" ); } #ifdef FD_SETSIZE - if(( Conf_MaxConnections > (LONG)FD_SETSIZE ) || ( Conf_MaxConnections < 1 )) + if(( Conf_MaxConnections > (long)FD_SETSIZE ) || ( Conf_MaxConnections < 1 )) { - Conf_MaxConnections = (LONG)FD_SETSIZE; + Conf_MaxConnections = (long)FD_SETSIZE; Config_Error( LOG_ERR, "Setting MaxConnections to %ld, select() can't handle more file descriptors!", Conf_MaxConnections ); } #else @@ -935,18 +1006,30 @@ Validate_Config( BOOLEAN Configtest ) } /* Validate_Config */ +LOCAL void +Config_Error_TooLong ( const int Line, const char *Item ) +{ + Config_Error( LOG_WARNING, "%s, line %d: Value of \"%s\" too long!", NGIRCd_ConfFile, Line, Item ); +} + +LOCAL void +Config_Error_NaN( const int Line, const char *Item ) +{ + Config_Error( LOG_WARNING, "%s, line %d: Value of \"%s\" is not a number!", NGIRCd_ConfFile, Line, Item ); +} + #ifdef PROTOTYPES -LOCAL VOID Config_Error( CONST INT Level, CONST CHAR *Format, ... ) +LOCAL void Config_Error( const int Level, const char *Format, ... ) #else -LOCAL VOID Config_Error( Level, Format, va_alist ) -CONST INT Level; -CONST CHAR *Format; +LOCAL void Config_Error( Level, Format, va_alist ) +const int Level; +const char *Format; va_dcl #endif { /* Error! Write to console and/or logfile. */ - CHAR msg[MAX_LOG_MSG_LEN]; + char msg[MAX_LOG_MSG_LEN]; va_list ap; assert( Format != NULL ); @@ -967,24 +1050,20 @@ va_dcl } /* Config_Error */ -LOCAL VOID +LOCAL void Init_Server_Struct( CONF_SERVER *Server ) { /* Initialize server configuration structur to default values */ assert( Server != NULL ); - strcpy( Server->host, "" ); - strcpy( Server->ip, "" ); - strcpy( Server->name, "" ); - strcpy( Server->pwd_in, "" ); - strcpy( Server->pwd_out, "" ); - Server->port = 0; + memset( Server, 0, sizeof (CONF_SERVER) ); + Server->group = NONE; Server->lasttry = time( NULL ) - Conf_ConnectRetry + STARTUP_DELAY; - Server->res_stat = NULL; + if( NGIRCd_Passive ) Server->flags = CONF_SFLAG_DISABLED; - else Server->flags = 0; + Server->conn_id = NONE; } /* Init_Server_Struct */ Index: src/ngircd/conf.h =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/conf.h,v retrieving revision 1.28.2.1 retrieving revision 1.34 diff -u -p -r1.28.2.1 -r1.34 --- src/ngircd/conf.h 7 May 2004 11:24:18 -0000 1.28.2.1 +++ src/ngircd/conf.h 20 Mar 2005 13:54:06 -0000 1.34 @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: conf.h,v 1.28.2.1 2004/05/07 11:24:18 alex Exp $ + * $Id: conf.h,v 1.34 2005/03/20 13:54:06 fw Exp $ * * Configuration management (header) */ @@ -20,34 +20,35 @@ #include #include "defines.h" - +#include "portab.h" typedef struct _Conf_Oper { - CHAR name[CLIENT_PASS_LEN]; /* Name (ID) of IRC operator */ - CHAR pwd[CLIENT_PASS_LEN]; /* Password */ + char name[CLIENT_PASS_LEN]; /* Name (ID) of IRC operator */ + char pwd[CLIENT_PASS_LEN]; /* Password */ + char *mask; } CONF_OPER; typedef struct _Conf_Server { - CHAR host[HOST_LEN]; /* Hostname */ - CHAR ip[16]; /* IP address (Resolver) */ - CHAR name[CLIENT_ID_LEN]; /* IRC-Client-ID */ - CHAR pwd_in[CLIENT_PASS_LEN]; /* Password which must be received */ - CHAR pwd_out[CLIENT_PASS_LEN]; /* Password to send to peer */ - INT port; /* Server port */ - INT group; /* Group of server */ + char host[HOST_LEN]; /* Hostname */ + char ip[16]; /* IP address (Resolver) */ + char name[CLIENT_ID_LEN]; /* IRC-Client-ID */ + char pwd_in[CLIENT_PASS_LEN]; /* Password which must be received */ + char pwd_out[CLIENT_PASS_LEN]; /* Password to send to peer */ + UINT16 port; /* Server port */ + int group; /* Group of server */ time_t lasttry; /* Last connect attempt */ RES_STAT *res_stat; /* Status of the resolver */ - INT flags; /* Flags */ + int flags; /* Flags */ CONN_ID conn_id; /* ID of server connection or NONE */ } CONF_SERVER; typedef struct _Conf_Channel { - CHAR name[CHANNEL_NAME_LEN]; /* Name of the channel */ - CHAR modes[CHANNEL_MODE_LEN]; /* Initial channel modes */ - CHAR topic[CHANNEL_TOPIC_LEN]; /* Initial topic */ + char name[CHANNEL_NAME_LEN]; /* Name of the channel */ + char modes[CHANNEL_MODE_LEN]; /* Initial channel modes */ + char topic[CHANNEL_TOPIC_LEN]; /* Initial topic */ } CONF_CHANNEL; @@ -56,81 +57,89 @@ typedef struct _Conf_Channel /* Name ("Nick") of the servers */ -GLOBAL CHAR Conf_ServerName[CLIENT_ID_LEN]; +GLOBAL char Conf_ServerName[CLIENT_ID_LEN]; /* Server info text */ -GLOBAL CHAR Conf_ServerInfo[CLIENT_INFO_LEN]; +GLOBAL char Conf_ServerInfo[CLIENT_INFO_LEN]; /* Global server passwort */ -GLOBAL CHAR Conf_ServerPwd[CLIENT_PASS_LEN]; +GLOBAL char Conf_ServerPwd[CLIENT_PASS_LEN]; /* Administrative information */ -GLOBAL CHAR Conf_ServerAdmin1[CLIENT_INFO_LEN]; -GLOBAL CHAR Conf_ServerAdmin2[CLIENT_INFO_LEN]; -GLOBAL CHAR Conf_ServerAdminMail[CLIENT_INFO_LEN]; +GLOBAL char Conf_ServerAdmin1[CLIENT_INFO_LEN]; +GLOBAL char Conf_ServerAdmin2[CLIENT_INFO_LEN]; +GLOBAL char Conf_ServerAdminMail[CLIENT_INFO_LEN]; /* File with MOTD text */ -GLOBAL CHAR Conf_MotdFile[FNAME_LEN]; +GLOBAL char Conf_MotdFile[FNAME_LEN]; /* Phrase with MOTD text */ -GLOBAL CHAR Conf_MotdPhrase[LINE_LEN]; +GLOBAL char Conf_MotdPhrase[LINE_LEN]; /* Ports the server should listen on */ -GLOBAL UINT Conf_ListenPorts[MAX_LISTEN_PORTS]; -GLOBAL INT Conf_ListenPorts_Count; +GLOBAL UINT16 Conf_ListenPorts[MAX_LISTEN_PORTS]; +GLOBAL int Conf_ListenPorts_Count; /* Address to which the socket should be bound or empty (=all) */ -GLOBAL CHAR Conf_ListenAddress[16]; +GLOBAL char Conf_ListenAddress[16]; /* User and group ID the server should run with */ -GLOBAL UINT Conf_UID; -GLOBAL UINT Conf_GID; +GLOBAL unsigned int Conf_UID; +GLOBAL unsigned int Conf_GID; /* A directory to chroot() in */ -GLOBAL CHAR Conf_Chroot[FNAME_LEN]; +GLOBAL char Conf_Chroot[FNAME_LEN]; + +/* File with PID of daemon */ +GLOBAL char Conf_PidFile[FNAME_LEN]; /* Timeouts for PING and PONG */ -GLOBAL INT Conf_PingTimeout; -GLOBAL INT Conf_PongTimeout; +GLOBAL int Conf_PingTimeout; +GLOBAL int Conf_PongTimeout; /* Seconds between connect attempts to other servers */ -GLOBAL INT Conf_ConnectRetry; +GLOBAL int Conf_ConnectRetry; /* Operators */ GLOBAL CONF_OPER Conf_Oper[MAX_OPERATORS]; -GLOBAL INT Conf_Oper_Count; +GLOBAL int Conf_Oper_Count; /* Servers */ GLOBAL CONF_SERVER Conf_Server[MAX_SERVERS]; /* Pre-defined channels */ GLOBAL CONF_CHANNEL Conf_Channel[MAX_DEFCHANNELS]; -GLOBAL INT Conf_Channel_Count; +GLOBAL int Conf_Channel_Count; /* Are IRC operators allowed to always use MODE? */ -GLOBAL BOOLEAN Conf_OperCanMode; +GLOBAL bool Conf_OperCanMode; + +/* If an IRC op gives chanop privileges without being a chanop, + * ircd2 will ignore the command. This enables a workaround: + * It masks the command as coming from the server */ +GLOBAL bool Conf_OperServerMode; /* Maximum number of connections to this server */ -GLOBAL LONG Conf_MaxConnections; +GLOBAL long Conf_MaxConnections; /* Maximum number of channels a user can join */ -GLOBAL INT Conf_MaxJoins; +GLOBAL int Conf_MaxJoins; /* Maximum number of connections per IP address */ -GLOBAL INT Conf_MaxConnectionsIP; +GLOBAL int Conf_MaxConnectionsIP; -GLOBAL VOID Conf_Init PARAMS((VOID )); -GLOBAL VOID Conf_Rehash PARAMS((VOID )); -GLOBAL INT Conf_Test PARAMS((VOID )); +GLOBAL void Conf_Init PARAMS((void )); +GLOBAL void Conf_Rehash PARAMS((void )); +GLOBAL int Conf_Test PARAMS((void )); -GLOBAL VOID Conf_UnsetServer PARAMS(( CONN_ID Idx )); -GLOBAL VOID Conf_SetServer PARAMS(( INT ConfServer, CONN_ID Idx )); -GLOBAL INT Conf_GetServer PARAMS(( CONN_ID Idx )); +GLOBAL void Conf_UnsetServer PARAMS(( CONN_ID Idx )); +GLOBAL void Conf_SetServer PARAMS(( int ConfServer, CONN_ID Idx )); +GLOBAL int Conf_GetServer PARAMS(( CONN_ID Idx )); -GLOBAL BOOLEAN Conf_EnableServer PARAMS(( CHAR *Name, INT Port )); -GLOBAL BOOLEAN Conf_DisableServer PARAMS(( CHAR *Name )); -GLOBAL BOOLEAN Conf_AddServer PARAMS(( CHAR *Name, INT Port, CHAR *Host, CHAR *MyPwd, CHAR *PeerPwd )); +GLOBAL bool Conf_EnableServer PARAMS(( char *Name, UINT16 Port )); +GLOBAL bool Conf_DisableServer PARAMS(( char *Name )); +GLOBAL bool Conf_AddServer PARAMS(( char *Name, UINT16 Port, char *Host, char *MyPwd, char *PeerPwd )); #endif Index: src/ngircd/conn-func.c =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/conn-func.c,v retrieving revision 1.3 retrieving revision 1.6 diff -u -p -r1.3 -r1.6 --- src/ngircd/conn-func.c 26 Dec 2003 15:55:07 -0000 1.3 +++ src/ngircd/conn-func.c 12 Jun 2005 16:32:17 -0000 1.6 @@ -16,19 +16,20 @@ #include "portab.h" -static char UNUSED id[] = "$Id: conn-func.c,v 1.3 2003/12/26 15:55:07 alex Exp $"; +static char UNUSED id[] = "$Id: conn-func.c,v 1.6 2005/06/12 16:32:17 alex Exp $"; #include "imp.h" #include #include #include "conn.h" +#include "client.h" #include "exp.h" #include "conn-func.h" -GLOBAL VOID +GLOBAL void Conn_UpdateIdle( CONN_ID Idx ) { /* Idle-Timer zuruecksetzen */ @@ -58,7 +59,7 @@ Conn_LastPing( CONN_ID Idx ) } /* Conn_LastPing */ -GLOBAL VOID +GLOBAL void Conn_SetPenalty( CONN_ID Idx, time_t Seconds ) { /* Penalty-Delay fuer eine Verbindung (in Sekunden) setzen; @@ -76,7 +77,7 @@ Conn_SetPenalty( CONN_ID Idx, time_t Sec } /* Conn_SetPenalty */ -GLOBAL VOID +GLOBAL void Conn_ResetPenalty( CONN_ID Idx ) { assert( Idx > NONE ); @@ -84,8 +85,8 @@ Conn_ResetPenalty( CONN_ID Idx ) } /* Conn_ResetPenalty */ -GLOBAL VOID -Conn_ClearFlags( VOID ) +GLOBAL void +Conn_ClearFlags( void ) { /* Alle Connection auf "nicht-markiert" setzen */ @@ -95,18 +96,18 @@ Conn_ClearFlags( VOID ) } /* Conn_ClearFlags */ -GLOBAL INT +GLOBAL int Conn_Flag( CONN_ID Idx ) { - /* Ist eine Connection markiert (TRUE) oder nicht? */ + /* Ist eine Connection markiert (true) oder nicht? */ assert( Idx > NONE ); return My_Connections[Idx].flag; } /* Conn_Flag */ -GLOBAL VOID -Conn_SetFlag( CONN_ID Idx, INT Flag ) +GLOBAL void +Conn_SetFlag( CONN_ID Idx, int Flag ) { /* Connection markieren */ @@ -116,7 +117,7 @@ Conn_SetFlag( CONN_ID Idx, INT Flag ) GLOBAL CONN_ID -Conn_First( VOID ) +Conn_First( void ) { /* Connection-Struktur der ersten Verbindung liefern; * Ist keine Verbindung vorhanden, wird NONE geliefert. */ @@ -149,32 +150,7 @@ Conn_Next( CONN_ID Idx ) } /* Conn_Next */ -GLOBAL VOID -Conn_SetOption( CONN_ID Idx, INT Option ) -{ - /* Option fuer Verbindung setzen. - * Initial sind alle Optionen _nicht_ gesetzt. */ - - assert( Idx > NONE ); - assert( Option != 0 ); - - My_Connections[Idx].options |= Option; -} /* Conn_SetOption */ - - -GLOBAL VOID -Conn_UnsetOption( CONN_ID Idx, INT Option ) -{ - /* Option fuer Verbindung loeschen */ - - assert( Idx > NONE ); - assert( Option != 0 ); - - My_Connections[Idx].options &= ~Option; -} /* Conn_UnsetOption */ - - -GLOBAL INT +GLOBAL int Conn_Options( CONN_ID Idx ) { assert( Idx > NONE ); @@ -182,17 +158,28 @@ Conn_Options( CONN_ID Idx ) } /* Conn_Options */ +/** + * Get the start time of the connection. + * The result is the start time in seconds since 1970-01-01, as reported + * by the C function time(NULL). + */ GLOBAL time_t Conn_StartTime( CONN_ID Idx ) { - /* Zeitpunkt des Link-Starts liefern (in Sekunden) */ + CLIENT *c; - assert( Idx > NONE ); - return My_Connections[Idx].starttime; -} /* Conn_Uptime */ + assert(Idx > NONE); + + /* Search client structure for this link ... */ + c = Client_GetFromConn(Idx); + if(c != NULL) + return Client_StartTime(c); + + return 0; +} /* Conn_StartTime */ -GLOBAL INT +GLOBAL int Conn_SendQ( CONN_ID Idx ) { /* Laenge der Daten im Schreibbuffer liefern */ @@ -206,7 +193,7 @@ Conn_SendQ( CONN_ID Idx ) } /* Conn_SendQ */ -GLOBAL LONG +GLOBAL long Conn_SendMsg( CONN_ID Idx ) { /* Anzahl gesendeter Nachrichten liefern */ @@ -216,7 +203,7 @@ Conn_SendMsg( CONN_ID Idx ) } /* Conn_SendMsg */ -GLOBAL LONG +GLOBAL long Conn_SendBytes( CONN_ID Idx ) { /* Anzahl gesendeter Bytes (unkomprimiert) liefern */ @@ -226,7 +213,7 @@ Conn_SendBytes( CONN_ID Idx ) } /* Conn_SendBytes */ -GLOBAL INT +GLOBAL int Conn_RecvQ( CONN_ID Idx ) { /* Laenge der Daten im Lesebuffer liefern */ @@ -240,7 +227,7 @@ Conn_RecvQ( CONN_ID Idx ) } /* Conn_RecvQ */ -GLOBAL LONG +GLOBAL long Conn_RecvMsg( CONN_ID Idx ) { /* Anzahl empfangener Nachrichten liefern */ @@ -250,7 +237,7 @@ Conn_RecvMsg( CONN_ID Idx ) } /* Conn_RecvMsg */ -GLOBAL LONG +GLOBAL long Conn_RecvBytes( CONN_ID Idx ) { /* Anzahl empfangener Bytes (unkomprimiert) liefern */ @@ -260,15 +247,15 @@ Conn_RecvBytes( CONN_ID Idx ) } /* Conn_RecvBytes */ -GLOBAL VOID -Conn_ResetWCounter( VOID ) +GLOBAL void +Conn_ResetWCounter( void ) { WCounter = 0; } /* Conn_ResetWCounter */ -GLOBAL LONG -Conn_WCounter( VOID ) +GLOBAL long +Conn_WCounter( void ) { return WCounter; } /* Conn_WCounter */ Index: src/ngircd/conn-func.h =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/conn-func.h,v retrieving revision 1.1 retrieving revision 1.4 diff -u -p -r1.1 -r1.4 --- src/ngircd/conn-func.h 30 Dec 2002 17:14:28 -0000 1.1 +++ src/ngircd/conn-func.h 25 Apr 2005 18:37:16 -0000 1.4 @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: conn-func.h,v 1.1 2002/12/30 17:14:28 alex Exp $ + * $Id: conn-func.h,v 1.4 2005/04/25 18:37:16 fw Exp $ * * Connection management: Global functions (header) */ @@ -26,34 +26,35 @@ #endif -GLOBAL VOID Conn_UpdateIdle PARAMS(( CONN_ID Idx )); +GLOBAL void Conn_UpdateIdle PARAMS(( CONN_ID Idx )); GLOBAL time_t Conn_GetIdle PARAMS(( CONN_ID Idx )); GLOBAL time_t Conn_LastPing PARAMS(( CONN_ID Idx )); GLOBAL time_t Conn_StartTime PARAMS(( CONN_ID Idx )); -GLOBAL INT Conn_SendQ PARAMS(( CONN_ID Idx )); -GLOBAL INT Conn_RecvQ PARAMS(( CONN_ID Idx )); -GLOBAL LONG Conn_SendMsg PARAMS(( CONN_ID Idx )); -GLOBAL LONG Conn_RecvMsg PARAMS(( CONN_ID Idx )); -GLOBAL LONG Conn_SendBytes PARAMS(( CONN_ID Idx )); -GLOBAL LONG Conn_RecvBytes PARAMS(( CONN_ID Idx )); - -GLOBAL VOID Conn_SetPenalty PARAMS(( CONN_ID Idx, time_t Seconds )); -GLOBAL VOID Conn_ResetPenalty PARAMS(( CONN_ID Idx )); - -GLOBAL VOID Conn_ClearFlags PARAMS(( VOID )); -GLOBAL INT Conn_Flag PARAMS(( CONN_ID Idx )); -GLOBAL VOID Conn_SetFlag PARAMS(( CONN_ID Idx, INT Flag )); +GLOBAL int Conn_SendQ PARAMS(( CONN_ID Idx )); +GLOBAL int Conn_RecvQ PARAMS(( CONN_ID Idx )); +GLOBAL long Conn_SendMsg PARAMS(( CONN_ID Idx )); +GLOBAL long Conn_RecvMsg PARAMS(( CONN_ID Idx )); +GLOBAL long Conn_SendBytes PARAMS(( CONN_ID Idx )); +GLOBAL long Conn_RecvBytes PARAMS(( CONN_ID Idx )); + +GLOBAL void Conn_SetPenalty PARAMS(( CONN_ID Idx, time_t Seconds )); +GLOBAL void Conn_ResetPenalty PARAMS(( CONN_ID Idx )); + +GLOBAL void Conn_ClearFlags PARAMS(( void )); +GLOBAL int Conn_Flag PARAMS(( CONN_ID Idx )); +GLOBAL void Conn_SetFlag PARAMS(( CONN_ID Idx, int Flag )); -GLOBAL CONN_ID Conn_First PARAMS(( VOID )); +GLOBAL CONN_ID Conn_First PARAMS(( void )); GLOBAL CONN_ID Conn_Next PARAMS(( CONN_ID Idx )); -GLOBAL VOID Conn_SetOption PARAMS(( CONN_ID Idx, INT Option )); -GLOBAL VOID Conn_UnsetOption PARAMS(( CONN_ID Idx, INT Option )); -GLOBAL INT Conn_Options PARAMS(( CONN_ID Idx )); +GLOBAL int Conn_Options PARAMS(( CONN_ID Idx )); -GLOBAL VOID Conn_ResetWCounter PARAMS(( VOID )); -GLOBAL LONG Conn_WCounter PARAMS(( VOID )); +GLOBAL void Conn_ResetWCounter PARAMS(( void )); +GLOBAL long Conn_WCounter PARAMS(( void )); +#define Conn_OPTION_ADD( x, opt ) ( (x)->options |= opt ) +#define Conn_OPTION_DEL( x, opt ) ( (x)->options &= ~opt ) +#define Conn_OPTION_ISSET( x, opt ) ( (x)->options & opt ) #endif Index: src/ngircd/conn-zip.c =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/conn-zip.c,v retrieving revision 1.5 retrieving revision 1.7 diff -u -p -r1.5 -r1.7 --- src/ngircd/conn-zip.c 25 Apr 2004 13:55:36 -0000 1.5 +++ src/ngircd/conn-zip.c 25 Apr 2005 18:37:16 -0000 1.7 @@ -19,7 +19,7 @@ #ifdef ZLIB -static char UNUSED id[] = "$Id: conn-zip.c,v 1.5 2004/04/25 13:55:36 alex Exp $"; +static char UNUSED id[] = "$Id: conn-zip.c,v 1.7 2005/04/25 18:37:16 fw Exp $"; #include "imp.h" #include @@ -34,7 +34,7 @@ static char UNUSED id[] = "$Id: conn-zip #include "conn-zip.h" -GLOBAL BOOLEAN +GLOBAL bool Zip_InitConn( CONN_ID Idx ) { /* Kompression fuer Link initialisieren */ @@ -52,7 +52,7 @@ Zip_InitConn( CONN_ID Idx ) { /* Fehler! */ Log( LOG_ALERT, "Can't initialize compression on connection %d (zlib inflate)!", Idx ); - return FALSE; + return false; } My_Connections[Idx].zip.out.total_in = 0; @@ -65,24 +65,24 @@ Zip_InitConn( CONN_ID Idx ) { /* Fehler! */ Log( LOG_ALERT, "Can't initialize compression on connection %d (zlib deflate)!", Idx ); - return FALSE; + return false; } My_Connections[Idx].zip.bytes_in = My_Connections[Idx].bytes_in; My_Connections[Idx].zip.bytes_out = My_Connections[Idx].bytes_out; Log( LOG_INFO, "Enabled link compression (zlib) on connection %d.", Idx ); - Conn_SetOption( Idx, CONN_ZIP ); + Conn_OPTION_ADD( &My_Connections[Idx], CONN_ZIP ); - return TRUE; + return true; } /* Zip_InitConn */ -GLOBAL BOOLEAN -Zip_Buffer( CONN_ID Idx, CHAR *Data, INT Len ) +GLOBAL bool +Zip_Buffer( CONN_ID Idx, char *Data, int Len ) { /* Daten zum Komprimieren im "Kompressions-Puffer" sammeln. - * Es wird TRUE bei Erfolg, sonst FALSE geliefert. */ + * Es wird true bei Erfolg, sonst false geliefert. */ assert( Idx > NONE ); assert( Data != NULL ); @@ -92,39 +92,39 @@ Zip_Buffer( CONN_ID Idx, CHAR *Data, INT if( ZWRITEBUFFER_LEN - My_Connections[Idx].zip.wdatalen < Len + 50 ) { /* Nein! Puffer zunaechst leeren ...*/ - if( ! Zip_Flush( Idx )) return FALSE; + if( ! Zip_Flush( Idx )) return false; } /* Daten kopieren */ memmove( My_Connections[Idx].zip.wbuf + My_Connections[Idx].zip.wdatalen, Data, Len ); My_Connections[Idx].zip.wdatalen += Len; - return TRUE; + return true; } /* Zip_Buffer */ -GLOBAL BOOLEAN +GLOBAL bool Zip_Flush( CONN_ID Idx ) { /* Daten komprimieren und in Schreibpuffer kopieren. - * Es wird TRUE bei Erfolg, sonst FALSE geliefert. */ + * Es wird true bei Erfolg, sonst false geliefert. */ - INT result, out_len; + int result, out_len; z_stream *out; out = &My_Connections[Idx].zip.out; - out->next_in = (VOID *)My_Connections[Idx].zip.wbuf; + out->next_in = (void *)My_Connections[Idx].zip.wbuf; out->avail_in = My_Connections[Idx].zip.wdatalen; - out->next_out = (VOID *)(My_Connections[Idx].wbuf + My_Connections[Idx].wdatalen); + out->next_out = (void *)(My_Connections[Idx].wbuf + My_Connections[Idx].wdatalen); out->avail_out = WRITEBUFFER_LEN - My_Connections[Idx].wdatalen; result = deflate( out, Z_SYNC_FLUSH ); if(( result != Z_OK ) || ( out->avail_in > 0 )) { Log( LOG_ALERT, "Compression error: code %d!?", result ); - Conn_Close( Idx, "Compression error!", NULL, FALSE ); - return FALSE; + Conn_Close( Idx, "Compression error!", NULL, false ); + return false; } out_len = WRITEBUFFER_LEN - My_Connections[Idx].wdatalen - out->avail_out; @@ -133,37 +133,37 @@ Zip_Flush( CONN_ID Idx ) My_Connections[Idx].zip.bytes_out += My_Connections[Idx].zip.wdatalen; My_Connections[Idx].zip.wdatalen = 0; - return TRUE; + return true; } /* Zip_Flush */ -GLOBAL BOOLEAN +GLOBAL bool Unzip_Buffer( CONN_ID Idx ) { /* Daten entpacken und in Lesepuffer kopieren. Bei Fehlern - * wird FALSE geliefert, ansonsten TRUE. Der Fall, dass keine + * wird false geliefert, ansonsten true. Der Fall, dass keine * Daten mehr zu entpacken sind, ist _kein_ Fehler! */ - INT result, in_len, out_len; + int result, in_len, out_len; z_stream *in; assert( Idx > NONE ); - if( My_Connections[Idx].zip.rdatalen <= 0 ) return TRUE; + if( My_Connections[Idx].zip.rdatalen <= 0 ) return true; in = &My_Connections[Idx].zip.in; - in->next_in = (VOID *)My_Connections[Idx].zip.rbuf; + in->next_in = (void *)My_Connections[Idx].zip.rbuf; in->avail_in = My_Connections[Idx].zip.rdatalen; - in->next_out = (VOID *)(My_Connections[Idx].rbuf + My_Connections[Idx].rdatalen); + in->next_out = (void *)(My_Connections[Idx].rbuf + My_Connections[Idx].rdatalen); in->avail_out = READBUFFER_LEN - My_Connections[Idx].rdatalen - 1; result = inflate( in, Z_SYNC_FLUSH ); if( result != Z_OK ) { Log( LOG_ALERT, "Decompression error: %s (code=%d, ni=%d, ai=%d, no=%d, ao=%d)!?", in->msg, result, in->next_in, in->avail_in, in->next_out, in->avail_out ); - Conn_Close( Idx, "Decompression error!", NULL, FALSE ); - return FALSE; + Conn_Close( Idx, "Decompression error!", NULL, false ); + return false; } in_len = My_Connections[Idx].zip.rdatalen - in->avail_in; @@ -180,11 +180,11 @@ Unzip_Buffer( CONN_ID Idx ) else My_Connections[Idx].zip.rdatalen = 0; My_Connections[Idx].zip.bytes_in += out_len; - return TRUE; + return true; } /* Unzip_Buffer */ -GLOBAL LONG +GLOBAL long Zip_SendBytes( CONN_ID Idx ) { /* Anzahl gesendeter Bytes (komprimiert!) liefern */ @@ -194,7 +194,7 @@ Zip_SendBytes( CONN_ID Idx ) } /* Zip_SendBytes */ -GLOBAL LONG +GLOBAL long Zip_RecvBytes( CONN_ID Idx ) { /* Anzahl gesendeter Bytes (komprimiert!) liefern */ Index: src/ngircd/conn-zip.h =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/conn-zip.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -p -r1.2 -r1.3 --- src/ngircd/conn-zip.h 26 Dec 2003 15:55:07 -0000 1.2 +++ src/ngircd/conn-zip.h 19 Mar 2005 18:43:48 -0000 1.3 @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: conn-zip.h,v 1.2 2003/12/26 15:55:07 alex Exp $ + * $Id: conn-zip.h,v 1.3 2005/03/19 18:43:48 fw Exp $ * * Connection compression using ZLIB (header) */ @@ -20,14 +20,14 @@ #define __conn_zip_h__ -GLOBAL BOOLEAN Zip_InitConn PARAMS(( CONN_ID Idx )); +GLOBAL bool Zip_InitConn PARAMS(( CONN_ID Idx )); -GLOBAL BOOLEAN Zip_Buffer PARAMS(( CONN_ID Idx, CHAR *Data, INT Len )); -GLOBAL BOOLEAN Zip_Flush PARAMS(( CONN_ID Idx )); -GLOBAL BOOLEAN Unzip_Buffer PARAMS(( CONN_ID Idx )); +GLOBAL bool Zip_Buffer PARAMS(( CONN_ID Idx, char *Data, int Len )); +GLOBAL bool Zip_Flush PARAMS(( CONN_ID Idx )); +GLOBAL bool Unzip_Buffer PARAMS(( CONN_ID Idx )); -GLOBAL LONG Zip_SendBytes PARAMS(( CONN_ID Idx )); -GLOBAL LONG Zip_RecvBytes PARAMS(( CONN_ID Idx )); +GLOBAL long Zip_SendBytes PARAMS(( CONN_ID Idx )); +GLOBAL long Zip_RecvBytes PARAMS(( CONN_ID Idx )); #endif /* __conn_zip_h__ */ Index: src/ngircd/conn.c =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/conn.c,v retrieving revision 1.134.2.4 retrieving revision 1.155.2.1 diff -u -p -r1.134.2.4 -r1.155.2.1 --- src/ngircd/conn.c 19 Jan 2005 23:35:42 -0000 1.134.2.4 +++ src/ngircd/conn.c 2 Jul 2005 14:45:07 -0000 1.155.2.1 @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2004 Alexander Barton + * Copyright (c)2001-2005 Alexander Barton * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,11 +16,15 @@ #include "portab.h" -static char UNUSED id[] = "$Id: conn.c,v 1.134.2.4 2005/01/19 23:35:42 alex Exp $"; +static char UNUSED id[] = "$Id: conn.c,v 1.155.2.1 2005/07/02 14:45:07 alex Exp $"; #include "imp.h" #include -#include +#ifdef PROTOTYPES +# include +#else +# include +#endif #include #include #include @@ -77,34 +81,49 @@ static char UNUSED id[] = "$Id: conn.c,v #define SERVER_WAIT (NONE - 1) -LOCAL VOID Handle_Read PARAMS(( INT sock )); -LOCAL BOOLEAN Handle_Write PARAMS(( CONN_ID Idx )); -LOCAL VOID New_Connection PARAMS(( INT Sock )); -LOCAL CONN_ID Socket2Index PARAMS(( INT Sock )); -LOCAL VOID Read_Request PARAMS(( CONN_ID Idx )); -LOCAL BOOLEAN Try_Write PARAMS(( CONN_ID Idx )); -LOCAL BOOLEAN Handle_Buffer PARAMS(( CONN_ID Idx )); -LOCAL VOID Check_Connections PARAMS(( VOID )); -LOCAL VOID Check_Servers PARAMS(( VOID )); -LOCAL VOID Init_Conn_Struct PARAMS(( CONN_ID Idx )); -LOCAL BOOLEAN Init_Socket PARAMS(( INT Sock )); -LOCAL VOID New_Server PARAMS(( INT Server, CONN_ID Idx )); -LOCAL VOID Read_Resolver_Result PARAMS(( INT r_fd )); -LOCAL VOID Simple_Message PARAMS(( INT Sock, CHAR *Msg )); -LOCAL INT Count_Connections PARAMS(( struct sockaddr_in addr )); +LOCAL void Handle_Read PARAMS(( int sock )); +LOCAL bool Handle_Write PARAMS(( CONN_ID Idx )); +LOCAL void New_Connection PARAMS(( int Sock )); +LOCAL CONN_ID Socket2Index PARAMS(( int Sock )); +LOCAL void Read_Request PARAMS(( CONN_ID Idx )); +LOCAL bool Handle_Buffer PARAMS(( CONN_ID Idx )); +LOCAL void Check_Connections PARAMS(( void )); +LOCAL void Check_Servers PARAMS(( void )); +LOCAL void Init_Conn_Struct PARAMS(( CONN_ID Idx )); +LOCAL bool Init_Socket PARAMS(( int Sock )); +LOCAL void New_Server PARAMS(( int Server, CONN_ID Idx )); +LOCAL void Read_Resolver_Result PARAMS(( int r_fd )); +LOCAL void Simple_Message PARAMS(( int Sock, char *Msg )); +LOCAL int Count_Connections PARAMS(( struct sockaddr_in addr )); LOCAL fd_set My_Listeners; LOCAL fd_set My_Sockets; -LOCAL fd_set My_Connects; #ifdef TCPWRAP -INT allow_severity = LOG_INFO; -INT deny_severity = LOG_ERR; +int allow_severity = LOG_INFO; +int deny_severity = LOG_ERR; #endif +LOCAL void +FreeRes_stat( CONNECTION *c ) +{ + assert( c != NULL ); + assert( c->res_stat != NULL ); + + if (!c->res_stat) return; + + FD_CLR( c->res_stat->pipe[0], &Resolver_FDs ); -GLOBAL VOID -Conn_Init( VOID ) + close( c->res_stat->pipe[0] ); + close( c->res_stat->pipe[1] ); + + free( c->res_stat ); + c->res_stat = NULL; +} + + +GLOBAL void +Conn_Init( void ) { /* Modul initialisieren: statische Strukturen "ausnullen". */ @@ -117,7 +136,7 @@ Conn_Init( VOID ) /* konfiguriertes Limit beachten */ if( Pool_Size > Conf_MaxConnections ) Pool_Size = Conf_MaxConnections; } - My_Connections = (CONNECTION *)malloc( sizeof( CONNECTION ) * Pool_Size ); + My_Connections = (CONNECTION *) calloc( Pool_Size, sizeof( CONNECTION ) ); if( ! My_Connections ) { /* Speicher konnte nicht alloziert werden! */ @@ -131,7 +150,6 @@ Conn_Init( VOID ) /* zu Beginn haben wir keine Verbindungen */ FD_ZERO( &My_Listeners ); FD_ZERO( &My_Sockets ); - FD_ZERO( &My_Connects ); /* Groesster File-Descriptor fuer select() */ Conn_MaxFD = 0; @@ -144,14 +162,14 @@ Conn_Init( VOID ) } /* Conn_Init */ -GLOBAL VOID -Conn_Exit( VOID ) +GLOBAL void +Conn_Exit( void ) { /* Modul abmelden: alle noch offenen Connections * schliessen und freigeben. */ CONN_ID idx; - INT i; + int i; #ifdef DEBUG Log( LOG_DEBUG, "Shutting down all connections ..." ); @@ -177,17 +195,10 @@ Conn_Exit( VOID ) Log( LOG_DEBUG, "Listening socket %d closed.", i ); #endif } - else if( FD_ISSET( i, &My_Connects )) - { - close( i ); -#ifdef DEBUG - Log( LOG_DEBUG, "Connection %d closed during creation (socket %d).", idx, i ); -#endif - } else if( idx < Pool_Size ) { - if( NGIRCd_SignalRestart ) Conn_Close( idx, NULL, "Server going down (restarting)", TRUE ); - else Conn_Close( idx, NULL, "Server going down", TRUE ); + if( NGIRCd_SignalRestart ) Conn_Close( idx, NULL, "Server going down (restarting)", true ); + else Conn_Close( idx, NULL, "Server going down", true ); } else { @@ -203,29 +214,29 @@ Conn_Exit( VOID ) } /* Conn_Exit */ -GLOBAL INT -Conn_InitListeners( VOID ) +GLOBAL int +Conn_InitListeners( void ) { /* Initialize ports on which the server should accept connections */ - INT created, i; + int created, i; created = 0; for( i = 0; i < Conf_ListenPorts_Count; i++ ) { if( Conn_NewListener( Conf_ListenPorts[i] )) created++; - else Log( LOG_ERR, "Can't listen on port %u!", Conf_ListenPorts[i] ); + else Log( LOG_ERR, "Can't listen on port %u!", (unsigned int) Conf_ListenPorts[i] ); } return created; } /* Conn_InitListeners */ -GLOBAL VOID -Conn_ExitListeners( VOID ) +GLOBAL void +Conn_ExitListeners( void ) { /* Close down all listening sockets */ - INT i; + int i; #ifdef RENDEZVOUS Rendezvous_UnregisterListeners( ); @@ -245,16 +256,16 @@ Conn_ExitListeners( VOID ) } /* Conn_ExitListeners */ -GLOBAL BOOLEAN -Conn_NewListener( CONST UINT Port ) +GLOBAL bool +Conn_NewListener( const UINT16 Port ) { /* Create new listening socket on specified port */ struct sockaddr_in addr; struct in_addr inaddr; - INT sock; + int sock; #ifdef RENDEZVOUS - CHAR name[CLIENT_ID_LEN], *info; + char name[CLIENT_ID_LEN], *info; #endif /* Server-"Listen"-Socket initialisieren */ @@ -272,7 +283,7 @@ Conn_NewListener( CONST UINT Port ) #endif { Log( LOG_CRIT, "Can't listen on %s:%u: can't convert ip address %s!", Conf_ListenAddress, Port, Conf_ListenAddress ); - return FALSE; + return false; } } else inaddr.s_addr = htonl( INADDR_ANY ); @@ -283,17 +294,17 @@ Conn_NewListener( CONST UINT Port ) if( sock < 0 ) { Log( LOG_CRIT, "Can't create socket: %s!", strerror( errno )); - return FALSE; + return false; } - if( ! Init_Socket( sock )) return FALSE; + if( ! Init_Socket( sock )) return false; /* an Port binden */ if( bind( sock, (struct sockaddr *)&addr, (socklen_t)sizeof( addr )) != 0 ) { Log( LOG_CRIT, "Can't bind socket: %s!", strerror( errno )); close( sock ); - return FALSE; + return false; } /* in "listen mode" gehen :-) */ @@ -301,7 +312,7 @@ Conn_NewListener( CONST UINT Port ) { Log( LOG_CRIT, "Can't listen on soecket: %s!", strerror( errno )); close( sock ); - return FALSE; + return false; } /* Neuen Listener in Strukturen einfuegen */ @@ -341,12 +352,12 @@ Conn_NewListener( CONST UINT Port ) Rendezvous_Register( name, RENDEZVOUS_TYPE, Port ); #endif - return TRUE; + return true; } /* Conn_NewListener */ -GLOBAL VOID -Conn_Handler( VOID ) +GLOBAL void +Conn_Handler( void ) { /* "Hauptschleife": Aktive Verbindungen ueberwachen. Folgende Aktionen * werden dabei durchgefuehrt, bis der Server terminieren oder neu @@ -364,12 +375,12 @@ Conn_Handler( VOID ) struct timeval tv; time_t start, t; CONN_ID i, idx; - BOOLEAN timeout; + bool timeout; start = time( NULL ); while(( ! NGIRCd_SignalQuit ) && ( ! NGIRCd_SignalRestart )) { - timeout = TRUE; + timeout = true; #ifdef RENDEZVOUS Rendezvous_Handler( ); @@ -391,7 +402,7 @@ Conn_Handler( VOID ) ( My_Connections[i].delaytime < t )) { /* Kann aus dem Buffer noch ein Befehl extrahiert werden? */ - if( Handle_Buffer( i )) timeout = FALSE; + if( Handle_Buffer( i )) timeout = false; } } @@ -413,22 +424,30 @@ Conn_Handler( VOID ) /* Sockets mit im Aufbau befindlichen ausgehenden Verbindungen suchen */ for( i = 0; i < Pool_Size; i++ ) { - if(( My_Connections[i].sock > NONE ) && ( FD_ISSET( My_Connections[i].sock, &My_Connects ))) FD_SET( My_Connections[i].sock, &write_sockets ); + if ( My_Connections[i].sock > NONE ) { + if ( Conn_OPTION_ISSET( &My_Connections[i], CONN_ISCONNECTING )) { + FD_SET( My_Connections[i].sock, &write_sockets ); + } + } + } /* von welchen Sockets koennte gelesen werden? */ read_sockets = My_Sockets; for( i = 0; i < Pool_Size; i++ ) { - if(( My_Connections[i].sock > NONE ) && ( My_Connections[i].host[0] == '\0' )) - { - /* Hier muss noch auf den Resolver Sub-Prozess gewartet werden */ - FD_CLR( My_Connections[i].sock, &read_sockets ); - } - if(( My_Connections[i].sock > NONE ) && ( FD_ISSET( My_Connections[i].sock, &My_Connects ))) - { - /* Hier laeuft noch ein asyncrones connect() */ - FD_CLR( My_Connections[i].sock, &read_sockets ); + if ( My_Connections[i].sock > NONE ) { + if ( My_Connections[i].res_stat ) { + /* wait for completion of Resolver Sub-Process */ + FD_CLR( My_Connections[i].sock, &read_sockets ); + continue; + } + + if ( Conn_OPTION_ISSET( &My_Connections[i], CONN_ISCONNECTING )) { + /* wait for completion of connect() */ + FD_CLR( My_Connections[i].sock, &read_sockets ); + continue; + } } if( My_Connections[i].delaytime > t ) { @@ -498,23 +517,28 @@ Conn_Handler( VOID ) } /* Conn_Handler */ +/** + * Write a text string into the socket of a connection. + * This function automatically appends CR+LF to the string and validates that + * the result is a valid IRC message (oversized messages are shortened, for + * example). Then it calls the Conn_Write() function to do the actual sending. + * @param Idx Index fo the connection. + * @param Format Format string, see printf(). + * @return true on success, false otherwise. + */ #ifdef PROTOTYPES -GLOBAL BOOLEAN -Conn_WriteStr( CONN_ID Idx, CHAR *Format, ... ) +GLOBAL bool +Conn_WriteStr( CONN_ID Idx, char *Format, ... ) #else -GLOBAL BOOLEAN +GLOBAL bool Conn_WriteStr( Idx, Format, va_alist ) CONN_ID Idx; -CHAR *Format; +char *Format; va_dcl #endif { - /* String in Socket schreiben. CR+LF wird von dieser Funktion - * automatisch angehaengt. Im Fehlerfall wird dir Verbindung - * getrennt und FALSE geliefert. */ - - CHAR buffer[COMMAND_LEN]; - BOOLEAN ok; + char buffer[COMMAND_LEN]; + bool ok; va_list ap; assert( Idx > NONE ); @@ -525,15 +549,38 @@ va_dcl #else va_start( ap ); #endif - if( vsnprintf( buffer, COMMAND_LEN - 2, Format, ap ) >= COMMAND_LEN - 2 ) - { - Log( LOG_CRIT, "Text too long to send (connection %d)!", Idx ); - Conn_Close( Idx, "Text too long to send!", NULL, FALSE ); - return FALSE; + + if (vsnprintf(buffer, COMMAND_LEN - 2, Format, ap) >= COMMAND_LEN - 2) { + /* + * The string that should be written to the socket is longer + * than the allowed size of COMMAND_LEN bytes (including both + * the CR and LF characters). This can be caused by the + * IRC_WriteXXX() functions when the prefix of this server had + * to be added to an already "quite long" command line which + * has been received from a regular IRC client, for example. + * + * We are not allowed to send such "oversized" messages to + * other servers and clients, see RFC 2812 2.3 and 2813 3.3 + * ("these messages SHALL NOT exceed 512 characters in length, + * counting all characters including the trailing CR-LF"). + * + * So we have a big problem here: we should send more bytes + * to the network than we are allowed to and we don't know + * the originator (any more). The "old" behaviour of blaming + * the receiver ("next hop") is a bad idea (it could be just + * an other server only routing the message!), so the only + * option left is to shorten the string and to hope that the + * result is still somewhat useful ... + * -alex- + */ + + strcpy (buffer + sizeof(buffer) - strlen(CUT_TXTSUFFIX) - 2 - 1, + CUT_TXTSUFFIX); } #ifdef SNIFFER - if( NGIRCd_Sniffer ) Log( LOG_DEBUG, " -> connection %d: '%s'.", Idx, buffer ); + if (NGIRCd_Sniffer) + Log(LOG_DEBUG, " -> connection %d: '%s'.", Idx, buffer); #endif strlcat( buffer, "\r\n", sizeof( buffer )); @@ -545,11 +592,11 @@ va_dcl } /* Conn_WriteStr */ -GLOBAL BOOLEAN -Conn_Write( CONN_ID Idx, CHAR *Data, INT Len ) +GLOBAL bool +Conn_Write( CONN_ID Idx, char *Data, int Len ) { /* Daten in Socket schreiben. Bei "fatalen" Fehlern wird - * der Client disconnectiert und FALSE geliefert. */ + * der Client disconnectiert und false geliefert. */ assert( Idx > NONE ); assert( Data != NULL ); @@ -564,7 +611,7 @@ Conn_Write( CONN_ID Idx, CHAR *Data, INT #ifdef DEBUG Log( LOG_DEBUG, "Skipped write on closed socket (connection %d).", Idx ); #endif - return FALSE; + return false; } /* Pruefen, ob im Schreibpuffer genuegend Platz ist. Ziel ist es, @@ -574,22 +621,21 @@ Conn_Write( CONN_ID Idx, CHAR *Data, INT { /* Der Puffer ist dummerweise voll. Jetzt versuchen, den Puffer * zu schreiben, wenn das nicht klappt, haben wir ein Problem ... */ - if( ! Try_Write( Idx )) return FALSE; + if( ! Handle_Write( Idx )) return false; /* nun neu pruefen: */ if( WRITEBUFFER_LEN - My_Connections[Idx].wdatalen - Len <= 0 ) { Log( LOG_NOTICE, "Write buffer overflow (connection %d)!", Idx ); - Conn_Close( Idx, "Write buffer overflow!", NULL, FALSE ); - return FALSE; + Conn_Close( Idx, "Write buffer overflow!", NULL, false ); + return false; } } #ifdef ZLIB - if( My_Connections[Idx].options & CONN_ZIP ) - { + if ( Conn_OPTION_ISSET( &My_Connections[Idx], CONN_ZIP )) { /* Daten komprimieren und in Puffer kopieren */ - if( ! Zip_Buffer( Idx, Data, Len )) return FALSE; + if( ! Zip_Buffer( Idx, Data, Len )) return false; } else #endif @@ -603,31 +649,30 @@ Conn_Write( CONN_ID Idx, CHAR *Data, INT /* Adjust global write counter */ WCounter += Len; - return TRUE; + return true; } /* Conn_Write */ -GLOBAL VOID -Conn_Close( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformClient ) +GLOBAL void +Conn_Close( CONN_ID Idx, char *LogMsg, char *FwdMsg, bool InformClient ) { /* Close connection. Open pipes of asyncronous resolver * sub-processes are closed down. */ CLIENT *c; - CHAR *txt; - DOUBLE in_k, out_k; + char *txt; + double in_k, out_k; #ifdef ZLIB - DOUBLE in_z_k, out_z_k; - INT in_p, out_p; + double in_z_k, out_z_k; + int in_p, out_p; #endif assert( Idx > NONE ); /* Is this link already shutting down? */ - if( My_Connections[Idx].options & CONN_ISCLOSING ) - { + if( Conn_OPTION_ISSET( &My_Connections[Idx], CONN_ISCLOSING )) { /* Conn_Close() has been called recursively for this link; - * probabe reason: Try_Write() failed -- see below. */ + * probabe reason: Handle_Write() failed -- see below. */ #ifdef DEBUG Log( LOG_DEBUG, "Recursive request to close connection: %d", Idx ); #endif @@ -637,7 +682,7 @@ Conn_Close( CONN_ID Idx, CHAR *LogMsg, C assert( My_Connections[Idx].sock > NONE ); /* Mark link as "closing" */ - My_Connections[Idx].options |= CONN_ISCLOSING; + Conn_OPTION_ADD( &My_Connections[Idx], CONN_ISCLOSING ); if( LogMsg ) txt = LogMsg; else txt = FwdMsg; @@ -655,7 +700,7 @@ Conn_Close( CONN_ID Idx, CHAR *LogMsg, C /* Send statistics to client if registered as user: */ if(( c != NULL ) && ( Client_Type( c ) == CLIENT_USER )) { - Conn_WriteStr( Idx, "NOTICE %s :%sConnection statistics: client %.1f kb, server %.1f kb.", Client_ThisServer( ), NOTICE_TXTPREFIX, (DOUBLE)My_Connections[Idx].bytes_in / 1024, (DOUBLE)My_Connections[Idx].bytes_out / 1024 ); + Conn_WriteStr( Idx, "NOTICE %s :%sConnection statistics: client %.1f kb, server %.1f kb.", Client_ThisServer( ), NOTICE_TXTPREFIX, (double)My_Connections[Idx].bytes_in / 1024, (double)My_Connections[Idx].bytes_out / 1024 ); } #endif @@ -665,35 +710,31 @@ Conn_Close( CONN_ID Idx, CHAR *LogMsg, C } /* Try to write out the write buffer */ - (VOID)Try_Write( Idx ); + (void)Handle_Write( Idx ); /* Shut down socket */ if( close( My_Connections[Idx].sock ) != 0 ) { - /* Oops, we can't close the socket!? This is fatal! */ - Log( LOG_EMERG, "Error closing connection %d (socket %d) with %s:%d - %s!", Idx, My_Connections[Idx].sock, My_Connections[Idx].host, ntohs( My_Connections[Idx].addr.sin_port), strerror( errno )); - Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME ); - exit( 1 ); + /* Oops, we can't close the socket!? This is ... ugly! */ + Log( LOG_CRIT, "Error closing connection %d (socket %d) with %s:%d - %s! (ignored)", Idx, My_Connections[Idx].sock, My_Connections[Idx].host, ntohs( My_Connections[Idx].addr.sin_port), strerror( errno )); } /* Mark socket as invalid: */ FD_CLR( My_Connections[Idx].sock, &My_Sockets ); - FD_CLR( My_Connections[Idx].sock, &My_Connects ); My_Connections[Idx].sock = NONE; /* If there is still a client, unregister it now */ - if( c ) Client_Destroy( c, LogMsg, FwdMsg, TRUE ); + if( c ) Client_Destroy( c, LogMsg, FwdMsg, true ); /* Calculate statistics and log information */ - in_k = (DOUBLE)My_Connections[Idx].bytes_in / 1024; - out_k = (DOUBLE)My_Connections[Idx].bytes_out / 1024; + in_k = (double)My_Connections[Idx].bytes_in / 1024; + out_k = (double)My_Connections[Idx].bytes_out / 1024; #ifdef ZLIB - if( My_Connections[Idx].options & CONN_ZIP ) - { - in_z_k = (DOUBLE)My_Connections[Idx].zip.bytes_in / 1024; - out_z_k = (DOUBLE)My_Connections[Idx].zip.bytes_out / 1024; - in_p = (INT)(( in_k * 100 ) / in_z_k ); - out_p = (INT)(( out_k * 100 ) / out_z_k ); + if ( Conn_OPTION_ISSET( &My_Connections[Idx], CONN_ZIP )) { + in_z_k = (double)My_Connections[Idx].zip.bytes_in / 1024; + out_z_k = (double)My_Connections[Idx].zip.bytes_out / 1024; + in_p = (int)(( in_k * 100 ) / in_z_k ); + out_p = (int)(( out_k * 100 ) / out_z_k ); Log( LOG_INFO, "Connection %d with %s:%d closed (in: %.1fk/%.1fk/%d%%, out: %.1fk/%.1fk/%d%%).", Idx, My_Connections[Idx].host, ntohs( My_Connections[Idx].addr.sin_port ), in_k, in_z_k, in_p, out_k, out_z_k, out_p ); } else @@ -704,21 +745,14 @@ Conn_Close( CONN_ID Idx, CHAR *LogMsg, C /* Is there a resolver sub-process running? */ if( My_Connections[Idx].res_stat ) - { - /* Free resolver structures */ - FD_CLR( My_Connections[Idx].res_stat->pipe[0], &Resolver_FDs ); - close( My_Connections[Idx].res_stat->pipe[0] ); - close( My_Connections[Idx].res_stat->pipe[1] ); - free( My_Connections[Idx].res_stat ); - } + FreeRes_stat( &My_Connections[Idx] ); /* Servers: Modify time of next connect attempt? */ Conf_UnsetServer( Idx ); #ifdef ZLIB /* Clean up zlib, if link was compressed */ - if( Conn_Options( Idx ) & CONN_ZIP ) - { + if ( Conn_OPTION_ISSET( &My_Connections[Idx], CONN_ZIP )) { inflateEnd( &My_Connections[Idx].zip.in ); deflateEnd( &My_Connections[Idx].zip.out ); } @@ -733,15 +767,15 @@ Conn_Close( CONN_ID Idx, CHAR *LogMsg, C } /* Conn_Close */ -GLOBAL VOID -Conn_SyncServerStruct( VOID ) +GLOBAL void +Conn_SyncServerStruct( void ) { /* Synchronize server structures (connection IDs): * connections <-> configuration */ CLIENT *client; CONN_ID i; - INT c; + int c; for( i = 0; i < Pool_Size; i++ ) { @@ -764,51 +798,8 @@ Conn_SyncServerStruct( VOID ) } /* SyncServerStruct */ -LOCAL BOOLEAN -Try_Write( CONN_ID Idx ) -{ - /* Versuchen, Daten aus dem Schreib-Puffer in den Socket zu - * schreiben. TRUE wird geliefert, wenn entweder keine Daten - * zum Versenden vorhanden sind oder erfolgreich bearbeitet - * werden konnten. Im Fehlerfall wird FALSE geliefert und - * die Verbindung geschlossen. */ - - fd_set write_socket; - struct timeval tv; - - assert( Idx > NONE ); - assert( My_Connections[Idx].sock > NONE ); - - /* sind ueberhaupt Daten vorhanden? */ -#ifdef ZLIB - if(( ! My_Connections[Idx].wdatalen > 0 ) && ( ! My_Connections[Idx].zip.wdatalen )) return TRUE; -#else - if( ! My_Connections[Idx].wdatalen > 0 ) return TRUE; -#endif - - /* Timeout initialisieren: 0 Sekunden, also nicht blockieren */ - tv.tv_sec = 0; tv.tv_usec = 0; - - FD_ZERO( &write_socket ); - FD_SET( My_Connections[Idx].sock, &write_socket ); - if( select( My_Connections[Idx].sock + 1, NULL, &write_socket, NULL, &tv ) == -1 ) - { - /* Fehler! */ - if( errno != EINTR ) - { - Log( LOG_ALERT, "Try_Write(): select() failed: %s (con=%d, sock=%d)!", strerror( errno ), Idx, My_Connections[Idx].sock ); - Conn_Close( Idx, "Server error!", NULL, FALSE ); - return FALSE; - } - } - - if( FD_ISSET( My_Connections[Idx].sock, &write_socket )) return Handle_Write( Idx ); - else return TRUE; -} /* Try_Write */ - - -LOCAL VOID -Handle_Read( INT Sock ) +LOCAL void +Handle_Read( int Sock ) { /* Aktivitaet auf einem Socket verarbeiten: * - neue Clients annehmen, @@ -842,24 +833,22 @@ Handle_Read( INT Sock ) } /* Handle_Read */ -LOCAL BOOLEAN +LOCAL bool Handle_Write( CONN_ID Idx ) { /* Daten aus Schreibpuffer versenden bzw. Connection aufbauen */ - INT len, res, err; + int len, res, err; socklen_t sock_len; CLIENT *c; assert( Idx > NONE ); assert( My_Connections[Idx].sock > NONE ); - if( FD_ISSET( My_Connections[Idx].sock, &My_Connects )) - { - /* es soll nichts geschrieben werden, sondern ein - * connect() hat ein Ergebnis geliefert */ + if ( Conn_OPTION_ISSET( &My_Connections[Idx], CONN_ISCONNECTING )) { + /* connect() has finished, check result */ - FD_CLR( My_Connections[Idx].sock, &My_Connects ); + Conn_OPTION_DEL( &My_Connections[Idx], CONN_ISCONNECTING ); /* Ergebnis des connect() ermitteln */ sock_len = sizeof( err ); @@ -884,7 +873,7 @@ Handle_Write( CONN_ID Idx ) Conf_Server[Conf_GetServer( Idx )].lasttry = time( NULL ); Conf_UnsetServer( Idx ); - return FALSE; + return false; } Log( LOG_INFO, "Connection %d with \"%s:%d\" established. Now logging in ...", Idx, My_Connections[Idx].host, Conf_Server[Conf_GetServer( Idx )].port ); @@ -894,36 +883,37 @@ Handle_Write( CONN_ID Idx ) } #ifdef ZLIB - /* Schreibpuffer leer, aber noch Daten im Kompressionsbuffer? - * Dann muss dieser nun geflushed werden! */ + if(( My_Connections[Idx].wdatalen <= 0 ) && ( ! My_Connections[Idx].zip.wdatalen )) + return true; + + /* write buffer empty, but not compression buf? -> flush compression buf. */ if( My_Connections[Idx].wdatalen == 0 ) Zip_Flush( Idx ); +#else + if( My_Connections[Idx].wdatalen <= 0 ) + return true; #endif - assert( My_Connections[Idx].wdatalen > 0 ); - - /* Daten schreiben */ - len = send( My_Connections[Idx].sock, My_Connections[Idx].wbuf, My_Connections[Idx].wdatalen, 0 ); - if( len < 0 ) - { - /* Operation haette Socket "nur" blockiert ... */ - if( errno == EAGAIN ) return TRUE; + len = write( My_Connections[Idx].sock, My_Connections[Idx].wbuf, My_Connections[Idx].wdatalen ); + if( len < 0 ) { + if( errno == EAGAIN || errno == EINTR) + return true; - /* Oops, ein Fehler! */ - Log( LOG_ERR, "Write error on connection %d (socket %d): %s!", Idx, My_Connections[Idx].sock, strerror( errno )); - Conn_Close( Idx, "Write error!", NULL, FALSE ); - return FALSE; + Log( LOG_ERR, "Write error on connection %d (socket %d): %s!", Idx, + My_Connections[Idx].sock, strerror( errno )); + Conn_Close( Idx, "Write error!", NULL, false ); + return false; } - /* Puffer anpassen */ + /* Update buffer len and move any data not yet written to beginning of buf */ My_Connections[Idx].wdatalen -= len; memmove( My_Connections[Idx].wbuf, My_Connections[Idx].wbuf + len, My_Connections[Idx].wdatalen ); - return TRUE; + return true; } /* Handle_Write */ -LOCAL VOID -New_Connection( INT Sock ) +LOCAL void +New_Connection( int Sock ) { /* Neue Client-Verbindung von Listen-Socket annehmen und * CLIENT-Struktur anlegen. */ @@ -932,12 +922,12 @@ New_Connection( INT Sock ) struct request_info req; #endif struct sockaddr_in new_addr; - INT new_sock, new_sock_len; + int new_sock, new_sock_len; RES_STAT *s; CONN_ID idx; CLIENT *c; POINTER *ptr; - LONG new_size, cnt; + long new_size, cnt; assert( Sock > NONE ); @@ -971,9 +961,9 @@ New_Connection( INT Sock ) cnt = Count_Connections( new_addr ); if(( Conf_MaxConnectionsIP > 0 ) && ( cnt >= Conf_MaxConnectionsIP )) { - /* Access denied, too many connections from this IP! */ - Log( LOG_ERR, "Refused connection from %s: too may connections (%ld) from this IP!", inet_ntoa( new_addr.sin_addr ), cnt); - Simple_Message( new_sock, "ERROR :Connection refused, too many connections from your IP!" ); + /* Access denied, too many connections from this IP address! */ + Log( LOG_ERR, "Refused connection from %s: too may connections (%ld) from this IP address!", inet_ntoa( new_addr.sin_addr ), cnt); + Simple_Message( new_sock, "ERROR :Connection refused, too many connections from your IP address!" ); close( new_sock ); return; } @@ -1002,38 +992,23 @@ New_Connection( INT Sock ) } if( new_size < Pool_Size ) { - Log( LOG_ALERT, "Can't accespt connection: limit (%d) reached -- overflow!", Pool_Size ); + Log( LOG_ALERT, "Can't accept connection: limit (%d) reached -- overflow!", Pool_Size ); Simple_Message( new_sock, "ERROR :Connection limit reached" ); close( new_sock ); return; } - /* zunaechst realloc() versuchen; wenn das scheitert, malloc() versuchen - * und Daten ggf. "haendisch" umkopieren. (Haesslich! Eine wirklich - * dynamische Verwaltung waere wohl _deutlich_ besser ...) */ ptr = (POINTER *)realloc( My_Connections, sizeof( CONNECTION ) * new_size ); if( ! ptr ) { - /* realloc() ist fehlgeschlagen. Nun malloc() probieren: */ - ptr = (POINTER *)malloc( sizeof( CONNECTION ) * new_size ); - if( ! ptr ) - { - /* Offenbar steht kein weiterer Sepeicher zur Verfuegung :-( */ - Log( LOG_EMERG, "Can't allocate memory! [New_Connection]" ); - Simple_Message( new_sock, "ERROR: Internal error" ); - close( new_sock ); - return; - } - - /* Struktur umkopieren ... */ - memcpy( ptr, My_Connections, sizeof( CONNECTION ) * Pool_Size ); - -#ifdef DEBUG - Log( LOG_DEBUG, "Allocated new connection pool for %ld items (%ld bytes). [malloc()/memcpy()]", new_size, sizeof( CONNECTION ) * new_size ); -#endif + Log( LOG_EMERG, "Can't allocate memory! [New_Connection]" ); + Simple_Message( new_sock, "ERROR: Internal error" ); + close( new_sock ); + return; } + #ifdef DEBUG - else Log( LOG_DEBUG, "Allocated new connection pool for %ld items (%ld bytes). [realloc()]", new_size, sizeof( CONNECTION ) * new_size ); + Log( LOG_DEBUG, "Allocated new connection pool for %ld items (%ld bytes). [realloc()]", new_size, sizeof( CONNECTION ) * new_size ); #endif /* Adjust pointer to new block */ @@ -1048,7 +1023,7 @@ New_Connection( INT Sock ) } /* Client-Struktur initialisieren */ - c = Client_NewLocal( idx, inet_ntoa( new_addr.sin_addr ), CLIENT_UNKNOWN, FALSE ); + c = Client_NewLocal( idx, inet_ntoa( new_addr.sin_addr ), CLIENT_UNKNOWN, false ); if( ! c ) { Log( LOG_ALERT, "Can't accept connection: can't create client structure!" ); @@ -1076,11 +1051,8 @@ New_Connection( INT Sock ) #else s = Resolve_Addr( &new_addr ); #endif - if( s ) - { - /* Sub-Prozess wurde asyncron gestartet */ - My_Connections[idx].res_stat = s; - } + /* resolver process has been started */ + if( s ) My_Connections[idx].res_stat = s; /* Penalty-Zeit setzen */ Conn_SetPenalty( idx, 4 ); @@ -1088,7 +1060,7 @@ New_Connection( INT Sock ) LOCAL CONN_ID -Socket2Index( INT Sock ) +Socket2Index( int Sock ) { /* zum Socket passende Connection suchen */ @@ -1111,13 +1083,13 @@ Socket2Index( INT Sock ) } /* Socket2Index */ -LOCAL VOID +LOCAL void Read_Request( CONN_ID Idx ) { /* Daten von Socket einlesen und entsprechend behandeln. * Tritt ein Fehler auf, so wird der Socket geschlossen. */ - INT len, bsize; + int len, bsize; #ifdef ZLIB CLIENT *c; #endif @@ -1140,14 +1112,13 @@ Read_Request( CONN_ID Idx ) #endif { /* Der Lesepuffer ist voll */ - Log( LOG_ERR, "Read buffer overflow (connection %d): %d bytes!", Idx, My_Connections[Idx].rdatalen ); - Conn_Close( Idx, "Read buffer overflow!", NULL, FALSE ); + Log( LOG_ERR, "Receive buffer overflow (connection %d): %d bytes!", Idx, My_Connections[Idx].rdatalen ); + Conn_Close( Idx, "Receive buffer overflow!", NULL, false ); return; } #ifdef ZLIB - if( My_Connections[Idx].options & CONN_ZIP ) - { + if ( Conn_OPTION_ISSET( &My_Connections[Idx], CONN_ZIP )) { len = recv( My_Connections[Idx].sock, My_Connections[Idx].zip.rbuf + My_Connections[Idx].zip.rdatalen, ( ZREADBUFFER_LEN - My_Connections[Idx].zip.rdatalen ), 0 ); if( len > 0 ) My_Connections[Idx].zip.rdatalen += len; } @@ -1162,7 +1133,7 @@ Read_Request( CONN_ID Idx ) { /* Socket wurde geschlossen */ Log( LOG_INFO, "%s:%d (%s) is closing the connection ...", My_Connections[Idx].host, ntohs( My_Connections[Idx].addr.sin_port), inet_ntoa( My_Connections[Idx].addr.sin_addr )); - Conn_Close( Idx, "Socket closed!", "Client closed connection", FALSE ); + Conn_Close( Idx, "Socket closed!", "Client closed connection", false ); return; } @@ -1173,7 +1144,7 @@ Read_Request( CONN_ID Idx ) /* Fehler beim Lesen */ Log( LOG_ERR, "Read error on connection %d (socket %d): %s!", Idx, My_Connections[Idx].sock, strerror( errno )); - Conn_Close( Idx, "Read error!", "Client closed connection", FALSE ); + Conn_Close( Idx, "Read error!", "Client closed connection", false ); return; } @@ -1187,24 +1158,24 @@ Read_Request( CONN_ID Idx ) } /* Read_Request */ -LOCAL BOOLEAN +LOCAL bool Handle_Buffer( CONN_ID Idx ) { /* Daten im Lese-Puffer einer Verbindung verarbeiten. - * Wurde ein Request verarbeitet, so wird TRUE geliefert, - * ansonsten FALSE (auch bei Fehlern). */ + * Wurde ein Request verarbeitet, so wird true geliefert, + * ansonsten false (auch bei Fehlern). */ #ifndef STRICT_RFC - CHAR *ptr1, *ptr2; + char *ptr1, *ptr2; #endif - CHAR *ptr; - INT len, delta; - BOOLEAN action, result; + char *ptr; + int len, delta; + bool action, result; #ifdef ZLIB - BOOLEAN old_z; + bool old_z; #endif - result = FALSE; + result = false; do { /* Check penalty */ @@ -1212,10 +1183,8 @@ Handle_Buffer( CONN_ID Idx ) #ifdef ZLIB /* ggf. noch unkomprimiete Daten weiter entpacken */ - if( My_Connections[Idx].options & CONN_ZIP ) - { - if( ! Unzip_Buffer( Idx )) return FALSE; - } + if ( Conn_OPTION_ISSET( &My_Connections[Idx], CONN_ZIP )) + if( ! Unzip_Buffer( Idx )) return false; #endif if( My_Connections[Idx].rdatalen < 1 ) break; @@ -1240,7 +1209,7 @@ Handle_Buffer( CONN_ID Idx ) } #endif - action = FALSE; + action = false; if( ptr ) { /* Ende der Anfrage wurde gefunden */ @@ -1252,8 +1221,8 @@ Handle_Buffer( CONN_ID Idx ) * (incl. CR+LF!) werden; vgl. RFC 2812. Wenn soetwas * empfangen wird, wird der Client disconnectiert. */ Log( LOG_ERR, "Request too long (connection %d): %d bytes (max. %d expected)!", Idx, My_Connections[Idx].rdatalen, COMMAND_LEN - 1 ); - Conn_Close( Idx, NULL, "Request too long", TRUE ); - return FALSE; + Conn_Close( Idx, NULL, "Request too long", true ); + return false; } #ifdef ZLIB @@ -1265,8 +1234,8 @@ Handle_Buffer( CONN_ID Idx ) { /* Es wurde ein Request gelesen */ My_Connections[Idx].msg_in++; - if( ! Parse_Request( Idx, My_Connections[Idx].rbuf )) return FALSE; - else action = TRUE; + if( ! Parse_Request( Idx, My_Connections[Idx].rbuf )) return false; + else action = true; } /* Puffer anpassen */ @@ -1282,8 +1251,8 @@ Handle_Buffer( CONN_ID Idx ) if( My_Connections[Idx].rdatalen > ZREADBUFFER_LEN ) { /* Hupsa! Soviel Platz haben wir aber gar nicht! */ - Log( LOG_ALERT, "Can't move read buffer: No space left in unzip buffer (need %d bytes)!", My_Connections[Idx].rdatalen ); - return FALSE; + Log( LOG_ALERT, "Can't move receive buffer: No space left in unzip buffer (need %d bytes)!", My_Connections[Idx].rdatalen ); + return false; } memcpy( My_Connections[Idx].zip.rbuf, My_Connections[Idx].rbuf, My_Connections[Idx].rdatalen ); My_Connections[Idx].zip.rdatalen = My_Connections[Idx].rdatalen; @@ -1295,15 +1264,15 @@ Handle_Buffer( CONN_ID Idx ) #endif /* ZLIB */ } - if( action ) result = TRUE; + if( action ) result = true; } while( action ); return result; } /* Handle_Buffer */ -LOCAL VOID -Check_Connections( VOID ) +LOCAL void +Check_Connections( void ) { /* Pruefen, ob Verbindungen noch "alive" sind. Ist dies * nicht der Fall, zunaechst PING-PONG spielen und, wenn @@ -1329,7 +1298,7 @@ Check_Connections( VOID ) #ifdef DEBUG Log( LOG_DEBUG, "Connection %d: Ping timeout: %d seconds.", i, Conf_PongTimeout ); #endif - Conn_Close( i, NULL, "Ping timeout", TRUE ); + Conn_Close( i, NULL, "Ping timeout", true ); } } else if( My_Connections[i].lastdata < time( NULL ) - Conf_PingTimeout ) @@ -1351,21 +1320,21 @@ Check_Connections( VOID ) #ifdef DEBUG Log( LOG_DEBUG, "Connection %d timed out ...", i ); #endif - Conn_Close( i, NULL, "Timeout", FALSE ); + Conn_Close( i, NULL, "Timeout", false ); } } } } /* Check_Connections */ -LOCAL VOID -Check_Servers( VOID ) +LOCAL void +Check_Servers( void ) { /* Check if we can establish further server links */ RES_STAT *s; CONN_ID idx; - INT i, n; + int i, n; /* Serach all connections, are there results from the resolver? */ for( idx = 0; idx < Pool_Size; idx++ ) @@ -1419,23 +1388,21 @@ Check_Servers( VOID ) strlcpy( Conf_Server[i].ip, Conf_Server[i].host, sizeof( Conf_Server[i].ip )); strlcpy( My_Connections[idx].host, Conf_Server[i].host, sizeof( My_Connections[idx].host )); s = Resolve_Name( Conf_Server[i].host ); - if( s ) - { - /* Sub-Prozess wurde asyncron gestartet */ - My_Connections[idx].res_stat = s; - } + + /* resolver process running? */ + if( s ) My_Connections[idx].res_stat = s; } } /* Check_Servers */ -LOCAL VOID -New_Server( INT Server, CONN_ID Idx ) +LOCAL void +New_Server( int Server, CONN_ID Idx ) { /* Establish new server link */ struct sockaddr_in new_addr; struct in_addr inaddr; - INT res, new_sock; + int res, new_sock; CLIENT *c; assert( Server > NONE ); @@ -1497,7 +1464,7 @@ New_Server( INT Server, CONN_ID Idx ) } /* Client-Struktur initialisieren */ - c = Client_NewLocal( Idx, inet_ntoa( new_addr.sin_addr ), CLIENT_UNKNOWNSERVER, FALSE ); + c = Client_NewLocal( Idx, inet_ntoa( new_addr.sin_addr ), CLIENT_UNKNOWNSERVER, false ); if( ! c ) { /* Can't create new client structure */ @@ -1517,7 +1484,8 @@ New_Server( INT Server, CONN_ID Idx ) /* Register new socket */ FD_SET( new_sock, &My_Sockets ); - FD_SET( new_sock, &My_Connects ); + Conn_OPTION_ADD( &My_Connections[Idx], CONN_ISCONNECTING ); + if( new_sock > Conn_MaxFD ) Conn_MaxFD = new_sock; #ifdef DEBUG @@ -1526,54 +1494,32 @@ New_Server( INT Server, CONN_ID Idx ) } /* New_Server */ -LOCAL VOID +LOCAL void Init_Conn_Struct( CONN_ID Idx ) { + time_t now = time( NULL ); /* Connection-Struktur initialisieren */ + memset( &My_Connections[Idx], 0, sizeof ( CONNECTION )); My_Connections[Idx].sock = NONE; - My_Connections[Idx].res_stat = NULL; - My_Connections[Idx].host[0] = '\0'; - My_Connections[Idx].rbuf[0] = '\0'; - My_Connections[Idx].rdatalen = 0; - My_Connections[Idx].wbuf[0] = '\0'; - My_Connections[Idx].wdatalen = 0; - My_Connections[Idx].starttime = time( NULL ); - My_Connections[Idx].lastdata = time( NULL ); - My_Connections[Idx].lastping = 0; - My_Connections[Idx].lastprivmsg = time( NULL ); - My_Connections[Idx].delaytime = 0; - My_Connections[Idx].bytes_in = 0; - My_Connections[Idx].bytes_out = 0; - My_Connections[Idx].msg_in = 0; - My_Connections[Idx].msg_out = 0; - My_Connections[Idx].flag = 0; - My_Connections[Idx].options = 0; - -#ifdef ZLIB - My_Connections[Idx].zip.rbuf[0] = '\0'; - My_Connections[Idx].zip.rdatalen = 0; - My_Connections[Idx].zip.wbuf[0] = '\0'; - My_Connections[Idx].zip.wdatalen = 0; - My_Connections[Idx].zip.bytes_in = 0; - My_Connections[Idx].zip.bytes_out = 0; -#endif + My_Connections[Idx].lastdata = now; + My_Connections[Idx].lastprivmsg = now; } /* Init_Conn_Struct */ -LOCAL BOOLEAN -Init_Socket( INT Sock ) +LOCAL bool +Init_Socket( int Sock ) { /* Initialize socket (set options) */ - INT value; + int value; #ifdef O_NONBLOCK /* unknown on A/UX */ if( fcntl( Sock, F_SETFL, O_NONBLOCK ) != 0 ) { Log( LOG_CRIT, "Can't enable non-blocking mode for socket: %s!", strerror( errno )); close( Sock ); - return FALSE; + return false; } #endif @@ -1598,21 +1544,21 @@ Init_Socket( INT Sock ) } #endif - return TRUE; + return true; } /* Init_Socket */ -LOCAL VOID -Read_Resolver_Result( INT r_fd ) +LOCAL void +Read_Resolver_Result( int r_fd ) { /* Read result of resolver sub-process from pipe and update the * apropriate connection/client structure(s): hostname and/or * IDENT user name.*/ CLIENT *c; - INT len, i, n; + int len, i, n; RES_STAT *s; - CHAR *ptr; + char *ptr; /* Search associated connection ... */ for( i = 0; i < Pool_Size; i++ ) @@ -1643,8 +1589,8 @@ Read_Resolver_Result( INT r_fd ) if( len < 0 ) { /* Error! */ - close( r_fd ); Log( LOG_CRIT, "Resolver: Can't read result: %s!", strerror( errno )); + FreeRes_stat( &My_Connections[i] ); return; } s->bufpos += len; @@ -1665,47 +1611,45 @@ try_resolve: /* Okay, we got a complete result: this is a host name for outgoing * connections and a host name or IDENT user name (if enabled) for - * incoming conneciions.*/ + * incoming connections.*/ if( My_Connections[i].sock > NONE ) { - /* Incoming connection */ - - /* Search client ... */ + /* Incoming connection. Search client ... */ c = Client_GetFromConn( i ); assert( c != NULL ); /* Only update client information of unregistered clients */ if( Client_Type( c ) == CLIENT_UNKNOWN ) { - if( s->stage == 0 ) - { - /* host name */ + switch(s->stage) { + case 0: /* host name */ strlcpy( My_Connections[i].host, s->buffer, sizeof( My_Connections[i].host )); Client_SetHostname( c, s->buffer ); - #ifdef IDENTAUTH /* clean up buffer for IDENT result */ len = strlen( s->buffer ) + 1; + assert((size_t)len <= sizeof( s->buffer )); memmove( s->buffer, s->buffer + len, sizeof( s->buffer ) - len ); + assert(len <= s->bufpos ); s->bufpos -= len; /* Don't close pipe and clean up, but * instead wait for IDENT result */ s->stage = 1; goto try_resolve; - } - else if( s->stage == 1 ) - { - /* IDENT user name */ + + case 1: /* IDENT user name */ if( s->buffer[0] ) { Log( LOG_INFO, "IDENT lookup for connection %ld: \"%s\".", i, s->buffer ); - Client_SetUser( c, s->buffer, TRUE ); + Client_SetUser( c, s->buffer, true ); } else Log( LOG_INFO, "IDENT lookup for connection %ld: no result.", i ); #endif + break; + default: + Log( LOG_ERR, "Resolver: got result for unknown stage %d!?", s->stage ); } - else Log( LOG_ERR, "Resolver: got result for unknown stage %d!?", s->stage ); } #ifdef DEBUG else Log( LOG_DEBUG, "Resolver: discarding result for already registered connection %d.", i ); @@ -1724,36 +1668,33 @@ try_resolve: } /* Clean up ... */ - FD_CLR( r_fd, &Resolver_FDs ); - close( My_Connections[i].res_stat->pipe[0] ); - close( My_Connections[i].res_stat->pipe[1] ); - free( My_Connections[i].res_stat ); - My_Connections[i].res_stat = NULL; + FreeRes_stat( &My_Connections[i] ); /* Reset penalty time */ Conn_ResetPenalty( i ); } /* Read_Resolver_Result */ -LOCAL VOID -Simple_Message( INT Sock, CHAR *Msg ) +LOCAL void +Simple_Message( int Sock, char *Msg ) { + char buf[COMMAND_LEN]; /* Write "simple" message to socket, without using compression * or even the connection write buffers. Used e.g. for error * messages by New_Connection(). */ - assert( Sock > NONE ); assert( Msg != NULL ); - (VOID)send( Sock, Msg, strlen( Msg ), 0 ); - (VOID)send( Sock, "\r\n", 2, 0 ); + strlcpy( buf, Msg, sizeof buf - 2); + strlcat( buf, "\r\n", sizeof buf); + (void)write( Sock, buf, strlen( buf ) ); } /* Simple_Error */ -LOCAL INT +LOCAL int Count_Connections( struct sockaddr_in addr_in ) { - INT i, cnt; + int i, cnt; cnt = 0; for( i = 0; i < Pool_Size; i++ ) Index: src/ngircd/conn.h =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/conn.h,v retrieving revision 1.32 retrieving revision 1.35 diff -u -p -r1.32 -r1.35 --- src/ngircd/conn.h 26 Dec 2003 15:55:07 -0000 1.32 +++ src/ngircd/conn.h 12 Jun 2005 16:28:55 -0000 1.35 @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: conn.h,v 1.32 2003/12/26 15:55:07 alex Exp $ + * $Id: conn.h,v 1.35 2005/06/12 16:28:55 alex Exp $ * * Connection management (header) */ @@ -18,17 +18,18 @@ #define __conn_h__ -#include /* fro time_t, see below */ +#include /* for time_t, see below */ -#define CONN_ISCLOSING 1 /* Conn_Close() already called */ +#define CONN_ISCLOSING 1U /* Conn_Close() already called */ +#define CONN_ISCONNECTING 2U /* connect() in progress */ #ifdef ZLIB -#define CONN_ZIP 2 /* zlib compressed link */ +#define CONN_ZIP 4U /* zlib compressed link */ #endif -typedef INT CONN_ID; +typedef int CONN_ID; #ifdef CONN_MODULE @@ -42,33 +43,32 @@ typedef struct _ZipData { z_stream in; /* "Handle" for input stream */ z_stream out; /* "Handle" for output stream */ - CHAR rbuf[READBUFFER_LEN]; /* Read buffer */ - INT rdatalen; /* Length of data in read buffer (compressed) */ - CHAR wbuf[WRITEBUFFER_LEN]; /* Write buffer */ - INT wdatalen; /* Length of data in write buffer (uncompressed) */ - LONG bytes_in, bytes_out; /* Counter for statistics (uncompressed!) */ + char rbuf[READBUFFER_LEN]; /* Read buffer */ + int rdatalen; /* Length of data in read buffer (compressed) */ + char wbuf[WRITEBUFFER_LEN]; /* Write buffer */ + int wdatalen; /* Length of data in write buffer (uncompressed) */ + long bytes_in, bytes_out; /* Counter for statistics (uncompressed!) */ } ZIPDATA; #endif /* ZLIB */ typedef struct _Connection { - INT sock; /* Socket handle */ + int sock; /* Socket handle */ struct sockaddr_in addr; /* Client address */ RES_STAT *res_stat; /* Status of resolver process, if any */ - CHAR host[HOST_LEN]; /* Hostname */ - CHAR rbuf[READBUFFER_LEN]; /* Read buffer */ - INT rdatalen; /* Length of data in read buffer */ - CHAR wbuf[WRITEBUFFER_LEN]; /* Write buffer */ - INT wdatalen; /* Length of data in write buffer */ - time_t starttime; /* Start time of link */ + char host[HOST_LEN]; /* Hostname */ + char rbuf[READBUFFER_LEN]; /* Read buffer */ + int rdatalen; /* Length of data in read buffer */ + char wbuf[WRITEBUFFER_LEN]; /* Write buffer */ + int wdatalen; /* Length of data in write buffer */ time_t lastdata; /* Last activity */ time_t lastping; /* Last PING */ time_t lastprivmsg; /* Last PRIVMSG */ time_t delaytime; /* Ignore link ("penalty") */ - LONG bytes_in, bytes_out; /* Received and sent bytes */ - LONG msg_in, msg_out; /* Received and sent IRC messages */ - INT flag; /* Flag (see "irc-write" module) */ - INT options; /* Link options */ + long bytes_in, bytes_out; /* Received and sent bytes */ + long msg_in, msg_out; /* Received and sent IRC messages */ + int flag; /* Flag (see "irc-write" module) */ + UINT16 options; /* Link options / connection state */ #ifdef ZLIB ZIPDATA zip; /* Compression information */ #endif /* ZLIB */ @@ -76,29 +76,29 @@ typedef struct _Connection GLOBAL CONNECTION *My_Connections; GLOBAL CONN_ID Pool_Size; -GLOBAL LONG WCounter; +GLOBAL long WCounter; #endif /* CONN_MODULE */ -GLOBAL VOID Conn_Init PARAMS((VOID )); -GLOBAL VOID Conn_Exit PARAMS(( VOID )); +GLOBAL void Conn_Init PARAMS((void )); +GLOBAL void Conn_Exit PARAMS(( void )); -GLOBAL INT Conn_InitListeners PARAMS(( VOID )); -GLOBAL VOID Conn_ExitListeners PARAMS(( VOID )); +GLOBAL int Conn_InitListeners PARAMS(( void )); +GLOBAL void Conn_ExitListeners PARAMS(( void )); -GLOBAL BOOLEAN Conn_NewListener PARAMS(( CONST UINT Port )); +GLOBAL bool Conn_NewListener PARAMS(( const UINT16 Port )); -GLOBAL VOID Conn_Handler PARAMS(( VOID )); +GLOBAL void Conn_Handler PARAMS(( void )); -GLOBAL BOOLEAN Conn_Write PARAMS(( CONN_ID Idx, CHAR *Data, INT Len )); -GLOBAL BOOLEAN Conn_WriteStr PARAMS(( CONN_ID Idx, CHAR *Format, ... )); +GLOBAL bool Conn_Write PARAMS(( CONN_ID Idx, char *Data, int Len )); +GLOBAL bool Conn_WriteStr PARAMS(( CONN_ID Idx, char *Format, ... )); -GLOBAL VOID Conn_Close PARAMS(( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformClient )); +GLOBAL void Conn_Close PARAMS(( CONN_ID Idx, char *LogMsg, char *FwdMsg, bool InformClient )); -GLOBAL VOID Conn_SyncServerStruct PARAMS(( VOID )); +GLOBAL void Conn_SyncServerStruct PARAMS(( void )); -GLOBAL INT Conn_MaxFD; +GLOBAL int Conn_MaxFD; #endif Index: src/ngircd/defines.h =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/defines.h,v retrieving revision 1.45.2.1 retrieving revision 1.52.2.2 diff -u -p -r1.45.2.1 -r1.52.2.2 --- src/ngircd/defines.h 7 May 2004 11:24:18 -0000 1.45.2.1 +++ src/ngircd/defines.h 5 Jul 2005 22:58:25 -0000 1.52.2.2 @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: defines.h,v 1.45.2.1 2004/05/07 11:24:18 alex Exp $ + * $Id: defines.h,v 1.52.2.2 2005/07/05 22:58:25 alex Exp $ * * Global defines of ngIRCd. */ @@ -19,83 +19,90 @@ #define NONE -1 -#define FNAME_LEN 256 /* max. Laenge eines Dateinamen */ +#define FNAME_LEN 256 /* max. length of file name */ -#define LINE_LEN 256 /* max. Laenge einer Konfigurationszeile */ +#define LINE_LEN 256 /* max. length of a line in the configuration file */ -#define HOST_LEN 256 /* max. Laenge eines Hostnamen */ +#define HOST_LEN 256 /* max. lenght of fully qualified host names */ -#define MAX_LISTEN_PORTS 16 /* max. Anzahl von Listen-Ports */ +#define MAX_LISTEN_PORTS 16 /* max. count of listening ports */ -#define MAX_OPERATORS 16 /* max. Anzahl konfigurierbarer Operatoren */ +#define MAX_OPERATORS 16 /* max. count of configurable operators */ -#define MAX_SERVERS 16 /* max. Anzahl konfigurierbarer Server ("Peers") */ +#define MAX_SERVERS 16 /* max. count of configurable servers ("peers") */ -#define MAX_DEFCHANNELS 16 /* max. Anzahl vorkonfigurierbarerr Channels */ +#define MAX_DEFCHANNELS 16 /* max. count of preconfigurable channels */ -#define MAX_SERVICES 8 /* maximum number of configurable services */ +#define MAX_SERVICES 8 /* max. number of configurable services */ -#define CONNECTION_POOL 100 /* Anzahl Verbindungs-Strukturen, die blockweise alloziert werden */ +#define MAX_WHOWAS 64 /* max. number of WHOWAS items */ +#define DEFAULT_WHOWAS 5 /* default count for WHOWAS command */ -#define CLIENT_ID_LEN 64 /* max. ID-Laenge; vgl. RFC 2812, 1.1 und 1.2.1 */ -#define CLIENT_NICK_LEN 10 /* max. Nick-Laenge; vgl. RFC 2812, 1.2.1 */ -#define CLIENT_PASS_LEN 9 /* max. Laenge des Passwortes */ -#define CLIENT_USER_LEN 9 /* max. Laenge des Benutzernamen ("Login") */ -#define CLIENT_NAME_LEN 32 /* max. Laenge des "langen Benutzernamen" */ -#define CLIENT_HOST_LEN 64 /* max. Laenge des Hostname */ -#define CLIENT_MODE_LEN 8 /* max. Laenge der Client-Modes */ -#define CLIENT_INFO_LEN 64 /* max. Infotext-Laenge (Server) */ -#define CLIENT_AWAY_LEN 128 /* max. Laenger der AWAY-Nachricht */ -#define CLIENT_FLAGS_LEN 100 /* max. Laenger der Client-Flags */ +#define CONNECTION_POOL 100 /* size of default connection pool */ -#define CHANNEL_NAME_LEN 51 /* max. Laenge eines Channel-Namens, vgl. RFC 2812, 1.3 */ -#define CHANNEL_MODE_LEN 8 /* max. Laenge der Channel-Modes */ -#define CHANNEL_TOPIC_LEN 128 /* max. Laenge eines Channel-Topics */ +#define CLIENT_ID_LEN 64 /* max. length of an IRC ID; see RFC 2812, 1.1 and 1.2.1 */ +#define CLIENT_NICK_LEN 10 /* max. nick length; see. RFC 2812, 1.2.1 */ +#define CLIENT_PASS_LEN 21 /* max. password length */ +#define CLIENT_USER_LEN 10 /* Max. length of user name ("login") + see RFC 2812, section 1.2.1 */ +#define CLIENT_NAME_LEN 32 /* max. length of "real names" */ +#define CLIENT_HOST_LEN 64 /* max. host name length */ +#define CLIENT_MODE_LEN 8 /* max. lenth of all client modes */ +#define CLIENT_INFO_LEN 64 /* max. length of server info texts */ +#define CLIENT_AWAY_LEN 128 /* max. length of away messages */ +#define CLIENT_FLAGS_LEN 100 /* max. length of client flags */ -#define COMMAND_LEN 513 /* max. Laenge eines Befehls, vgl. RFC 2812, 3.2 */ +#define CHANNEL_NAME_LEN 51 /* max. length of a channel name, see. RFC 2812, 1.3 */ +#define CHANNEL_MODE_LEN 9 /* max. length of channel modes */ +#define CHANNEL_TOPIC_LEN 128 /* max. length of a channel topic */ -#define READBUFFER_LEN 2048 /* Laenge des Lesepuffers je Verbindung (Bytes) */ -#define WRITEBUFFER_LEN 4096 /* Laenge des Schreibpuffers je Verbindung (Bytes) */ +#define COMMAND_LEN 513 /* max. IRC command length, see. RFC 2812, 3.2 */ + +#define READBUFFER_LEN 2048 /* size of the read buffer of a connection (bytes) */ +#define WRITEBUFFER_LEN 4096 /* size of the write buffer of a connection (bytes) */ #ifdef ZLIB -#define ZREADBUFFER_LEN 1024 /* Laenge des Lesepuffers je Verbindung (Bytes) */ -#define ZWRITEBUFFER_LEN 4096 /* Laenge des Schreibpuffers fuer Kompression (Bytes) */ +#define ZREADBUFFER_LEN 1024 /* compressed read buffer of a connection (bytes) */ +#define ZWRITEBUFFER_LEN 4096 /* compressed write buffer of a connection (bytes) */ #endif -#define PROTOVER "0210" /* implementierte Protokoll-Version (RFC 2813, 4.1.1) */ -#define PROTOIRC "-IRC" /* Protokoll-Suffix (RFC 2813, 4.1.1) */ -#define PROTOIRCPLUS "-IRC+" /* Protokoll-Suffix fŸr IRC+-Protokoll */ +#define PROTOVER "0210" /* implemented IRC protocol version (see RFC 2813, 4.1.1) */ +#define PROTOIRC "-IRC" /* protocol suffix (see RFC 2813, 4.1.1) */ +#define PROTOIRCPLUS "-IRC+" /* protokol suffix for IRC+ protocol (see doc/Protocol.txt) */ #ifdef IRCPLUS -# define IRCPLUSFLAGS "CL" /* IRC+-Flags, die immer zutreffen */ +# define IRCPLUSFLAGS "CL" /* standard IRC+ flags */ #endif -#define STARTUP_DELAY 1 /* Erst n Sek. nach Start zu anderen Servern verbinden */ -#define RECONNECT_DELAY 3 /* Server-Links erst nach 3 Sekunden versuchen, wieder aufzubauen */ +#define STARTUP_DELAY 1 /* delay outgoing connections n seconds after startup */ +#define RECONNECT_DELAY 3 /* time to delay re-connect attempts (seconds) */ -#define USERMODES "aios" /* unterstuetzte User-Modes */ -#define CHANMODES "biklImnoPtv" /* unterstuetzte Channel-Modes */ +#define USERMODES "aios" /* supported user modes */ +#define CHANMODES "biklImnoPstv" /* supported channel modes */ -#define CONNECTED TRUE /* fuer die irc-xxx-Module */ -#define DISCONNECTED FALSE +#define CONNECTED true /* internal status codes */ +#define DISCONNECTED false -#define DEFAULT_AWAY_MSG "Away" /* Away-Meldung fuer User von anderen Servern */ +#define DEFAULT_AWAY_MSG "Away" /* away message for users connected to linked servers */ #define CONFIG_FILE "/ngircd.conf" #define MOTD_FILE "/ngircd.motd" #define MOTD_PHRASE "" #define CHROOT_DIR "" +#define PID_FILE "" #define ERROR_DIR "/tmp" -#define MAX_LOG_MSG_LEN 256 /* max. Laenge einer Log-Meldung */ +#define MAX_LOG_MSG_LEN 256 /* max. length of a log message */ -#define TOKEN_OUTBOUND -2 /* Kennzeichnung fuer ausgehende Server-Links im Aufbau */ +#define TOKEN_OUTBOUND -2 /* tag for outbound server links */ -#define NOTICE_TXTPREFIX "" /* Kennzeichnung fuer Server-NOTICEs an User */ +#define NOTICE_TXTPREFIX "" /* prefix for NOTICEs from the server to users */ +#define CUT_TXTSUFFIX "[CUT]" /* Suffix for oversized messages that + have been shortened and cut off. */ #ifdef RENDEZVOUS -#define RENDEZVOUS_TYPE "_ircu._tcp." /* Service type to register with Rendezvous */ +#define RENDEZVOUS_TYPE "_ircu._tcp." /* service type to register with Rendezvous */ #endif Index: src/ngircd/hash.c =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/hash.c,v retrieving revision 1.9 retrieving revision 1.11 diff -u -p -r1.9 -r1.11 --- src/ngircd/hash.c 26 Dec 2002 16:25:43 -0000 1.9 +++ src/ngircd/hash.c 19 Mar 2005 18:43:48 -0000 1.11 @@ -14,14 +14,13 @@ #include "portab.h" -static char UNUSED id[] = "$Id: hash.c,v 1.9 2002/12/26 16:25:43 alex Exp $"; +static char UNUSED id[] = "$Id: hash.c,v 1.11 2005/03/19 18:43:48 fw Exp $"; #include "imp.h" #include #include #include "defines.h" -#include "log.h" #include "tool.h" #include "exp.h" @@ -32,11 +31,11 @@ LOCAL UINT32 jenkins_hash PARAMS(( regis GLOBAL UINT32 -Hash( CHAR *String ) +Hash( char *String ) { /* Hash-Wert ueber String berechnen */ - CHAR buffer[LINE_LEN]; + char buffer[LINE_LEN]; strlcpy( buffer, String, sizeof( buffer )); return jenkins_hash( (UINT8 *)ngt_LowerStr( buffer ), strlen( buffer ), 42 ); @@ -100,7 +99,7 @@ jenkins_hash( register UINT8 *k, registe /* handle the last 11 bytes */ c += length; - switch( (INT)len ) /* all the case statements fall through */ + switch( (int)len ) /* all the case statements fall through */ { case 11: c+=((UINT32)k[10]<<24); case 10: c+=((UINT32)k[9]<<16); Index: src/ngircd/hash.h =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/hash.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -p -r1.4 -r1.5 --- src/ngircd/hash.h 12 Dec 2002 12:23:43 -0000 1.4 +++ src/ngircd/hash.h 19 Mar 2005 18:43:48 -0000 1.5 @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: hash.h,v 1.4 2002/12/12 12:23:43 alex Exp $ + * $Id: hash.h,v 1.5 2005/03/19 18:43:48 fw Exp $ * * Hash calculation (header) */ @@ -18,7 +18,7 @@ #define __hash_h__ -GLOBAL UINT32 Hash PARAMS((CHAR *String )); +GLOBAL UINT32 Hash PARAMS((char *String )); #endif Index: src/ngircd/irc-channel.c =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/irc-channel.c,v retrieving revision 1.27 retrieving revision 1.30 diff -u -p -r1.27 -r1.30 --- src/ngircd/irc-channel.c 9 Apr 2004 20:46:48 -0000 1.27 +++ src/ngircd/irc-channel.c 12 Jun 2005 18:23:59 -0000 1.30 @@ -14,7 +14,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: irc-channel.c,v 1.27 2004/04/09 20:46:48 alex Exp $"; +static char UNUSED id[] = "$Id: irc-channel.c,v 1.30 2005/06/12 18:23:59 alex Exp $"; #include "imp.h" #include @@ -40,11 +40,11 @@ static char UNUSED id[] = "$Id: irc-chan #include "irc-channel.h" -GLOBAL BOOLEAN +GLOBAL bool IRC_JOIN( CLIENT *Client, REQUEST *Req ) { - CHAR *channame, *key, *flags, *topic, modes[8]; - BOOLEAN is_new_chan, is_invited, is_banned; + char *channame, *key, *flags, *topic, modes[8]; + bool is_new_chan, is_invited, is_banned; CLIENT *target; CHANNEL *chan; @@ -71,8 +71,8 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req ) chan = NULL; flags = NULL; /* wird der Channel neu angelegt? */ - if( Channel_Search( channame )) is_new_chan = FALSE; - else is_new_chan = TRUE; + if( Channel_Search( channame )) is_new_chan = false; + else is_new_chan = true; /* Hat ein Server Channel-User-Modes uebergeben? */ if( Client_Type( Client ) == CLIENT_SERVER ) @@ -115,7 +115,7 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req ) is_invited = Lists_CheckInvited( target, chan ); /* Testen, ob Client gebanned ist */ - if(( is_banned == TRUE ) && ( is_invited == FALSE )) + if(( is_banned == true) && ( is_invited == false )) { /* Client ist gebanned (und nicht invited): */ IRC_WriteStrClient( Client, ERR_BANNEDFROMCHAN_MSG, Client_ID( Client ), channame ); @@ -126,7 +126,7 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req ) } /* Ist der Channel "invite-only"? */ - if(( strchr( Channel_Modes( chan ), 'i' )) && ( is_invited == FALSE )) + if(( strchr( Channel_Modes( chan ), 'i' )) && ( is_invited == false )) { /* Channel ist "invite-only" und Client wurde nicht invited: */ IRC_WriteStrClient( Client, ERR_INVITEONLYCHAN_MSG, Client_ID( Client ), channame ); @@ -167,7 +167,7 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req ) * commands) in this list become deleted when a user * joins a channel this way. */ chan = Channel_Search( channame ); - if( chan != NULL ) (VOID)Lists_CheckInvited( target, chan ); + if( chan != NULL ) (void)Lists_CheckInvited( target, chan ); } /* Channel joinen (und ggf. anlegen) */ @@ -199,11 +199,11 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req ) IRC_WriteStrServersPrefix( Client, target, "JOIN :%s%s", channame, modes ); /* im Channel bekannt machen */ - IRC_WriteStrChannelPrefix( Client, chan, target, FALSE, "JOIN :%s", channame ); + IRC_WriteStrChannelPrefix( Client, chan, target, false, "JOIN :%s", channame ); if( modes[1] ) { /* Modes im Channel bekannt machen */ - IRC_WriteStrChannelPrefix( Client, chan, target, FALSE, "MODE %s +%s %s", channame, &modes[1], Client_ID( target )); + IRC_WriteStrChannelPrefix( Client, chan, target, false, "MODE %s +%s %s", channame, &modes[1], Client_ID( target )); } if( Client_Type( Client ) == CLIENT_USER ) @@ -227,11 +227,11 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req ) } /* IRC_JOIN */ -GLOBAL BOOLEAN +GLOBAL bool IRC_PART( CLIENT *Client, REQUEST *Req ) { CLIENT *target; - CHAR *chan; + char *chan; assert( Client != NULL ); assert( Req != NULL ); @@ -262,12 +262,12 @@ IRC_PART( CLIENT *Client, REQUEST *Req ) } /* IRC_PART */ -GLOBAL BOOLEAN +GLOBAL bool IRC_TOPIC( CLIENT *Client, REQUEST *Req ) { CHANNEL *chan; CLIENT *from; - CHAR *topic; + char *topic; assert( Client != NULL ); assert( Req != NULL ); @@ -306,78 +306,107 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req /* im Channel bekannt machen und an Server weiterleiten */ IRC_WriteStrServersPrefix( Client, from, "TOPIC %s :%s", Req->argv[0], Req->argv[1] ); - IRC_WriteStrChannelPrefix( Client, chan, from, FALSE, "TOPIC %s :%s", Req->argv[0], Req->argv[1] ); + IRC_WriteStrChannelPrefix( Client, chan, from, false, "TOPIC %s :%s", Req->argv[0], Req->argv[1] ); if( Client_Type( Client ) == CLIENT_USER ) return IRC_WriteStrClientPrefix( Client, Client, "TOPIC %s :%s", Req->argv[0], Req->argv[1] ); else return CONNECTED; } /* IRC_TOPIC */ -GLOBAL BOOLEAN +/** + * Handler for the IRC "LIST" command. + * This implementation handles the local case as well as the forwarding of the + * LIST command to other servers in the IRC network. + */ +GLOBAL bool IRC_LIST( CLIENT *Client, REQUEST *Req ) { - CHAR *pattern; + char *pattern; CHANNEL *chan; CLIENT *from, *target; assert( Client != NULL ); assert( Req != NULL ); - /* Falsche Anzahl Parameter? */ - if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); - - if( Req->argc > 0 ) pattern = strtok( Req->argv[0], "," ); - else pattern = "*"; - - /* From aus Prefix ermitteln */ - if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix ); - else from = Client; - if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix ); + /* Bad number of prameters? */ + if( Req->argc > 2 ) + return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, + Client_ID( Client ), Req->command ); + + if( Req->argc > 0 ) + pattern = strtok( Req->argv[0], "," ); + else + pattern = "*"; + + /* Get sender from prefix, if any */ + if( Client_Type( Client ) == CLIENT_SERVER ) + from = Client_Search( Req->prefix ); + else + from = Client; + + if( ! from ) + return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, + Client_ID( Client ), Req->prefix ); if( Req->argc == 2 ) { - /* an anderen Server forwarden */ + /* Forward to other server? */ target = Client_Search( Req->argv[1] ); - if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER )) return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] ); + if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER )) + return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG, + Client_ID( Client ), Req->argv[1] ); if( target != Client_ThisServer( )) { - /* Ok, anderer Server ist das Ziel: forwarden */ - return IRC_WriteStrClientPrefix( target, from, "LIST %s :%s", from, Req->argv[1] ); + /* Target is indeed an other server, forward it! */ + return IRC_WriteStrClientPrefix( target, from, + "LIST %s :%s", Client_ID( from ), + Req->argv[1] ); } } while( pattern ) { - /* alle Channel durchgehen */ + /* Loop through all the channels */ chan = Channel_First( ); while( chan ) { - /* Passt die Suchmaske auf diesen Channel? */ + /* Check search pattern */ if( Match( pattern, Channel_Name( chan ))) { - /* Treffer! */ - if( ! IRC_WriteStrClient( from, RPL_LIST_MSG, from, Channel_Name( chan ), Channel_MemberCount( chan ), Channel_Topic( chan ))) return DISCONNECTED; + /* Gotcha! */ + if( ! strchr( Channel_Modes( chan ), 's' ) || + Channel_IsMemberOf( chan, from )) + { + if( ! IRC_WriteStrClient( from, + RPL_LIST_MSG, Client_ID( from ), + Channel_Name( chan ), + Channel_MemberCount( chan ), + Channel_Topic( chan ))) + return DISCONNECTED; + } } chan = Channel_Next( chan ); } - /* naechsten Namen ermitteln */ - if( Req->argc > 0 ) pattern = strtok( NULL, "," ); - else pattern = NULL; + /* Get next name ... */ + if( Req->argc > 0 ) + pattern = strtok( NULL, "," ); + else + pattern = NULL; } - return IRC_WriteStrClient( from, RPL_LISTEND_MSG, from ); + return IRC_WriteStrClient( from, RPL_LISTEND_MSG, Client_ID( from )); } /* IRC_LIST */ -GLOBAL BOOLEAN +GLOBAL bool IRC_CHANINFO( CLIENT *Client, REQUEST *Req ) { - CHAR modes_add[COMMAND_LEN], l[16], *ptr; + char modes_add[COMMAND_LEN], l[16], *ptr; CLIENT *from; CHANNEL *chan; - INT arg_topic; + int arg_topic; assert( Client != NULL ); assert( Req != NULL ); @@ -437,7 +466,7 @@ IRC_CHANINFO( CLIENT *Client, REQUEST *R } /* Inform members of this channel */ - IRC_WriteStrChannelPrefix( Client, chan, from, FALSE, "MODE %s +%s%s", Req->argv[0], Channel_Modes( chan ), modes_add ); + IRC_WriteStrChannelPrefix( Client, chan, from, false, "MODE %s +%s%s", Req->argv[0], Channel_Modes( chan ), modes_add ); } } else Log( LOG_WARNING, "CHANINFO: invalid MODE format ignored!" ); @@ -450,7 +479,7 @@ IRC_CHANINFO( CLIENT *Client, REQUEST *R { /* OK, there is no topic jet */ Channel_SetTopic( chan, Req->argv[arg_topic] ); - IRC_WriteStrChannelPrefix( Client, chan, from, FALSE, "TOPIC %s :%s", Req->argv[0], Channel_Topic( chan )); + IRC_WriteStrChannelPrefix( Client, chan, from, false, "TOPIC %s :%s", Req->argv[0], Channel_Topic( chan )); } } Index: src/ngircd/irc-channel.h =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/irc-channel.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -p -r1.6 -r1.7 --- src/ngircd/irc-channel.h 12 Dec 2002 12:23:43 -0000 1.6 +++ src/ngircd/irc-channel.h 19 Mar 2005 18:43:48 -0000 1.7 @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: irc-channel.h,v 1.6 2002/12/12 12:23:43 alex Exp $ + * $Id: irc-channel.h,v 1.7 2005/03/19 18:43:48 fw Exp $ * * IRC channel commands (header) */ @@ -18,13 +18,13 @@ #define __irc_channel_h__ -GLOBAL BOOLEAN IRC_JOIN PARAMS((CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_PART PARAMS((CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_TOPIC PARAMS((CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_JOIN PARAMS((CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_PART PARAMS((CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_TOPIC PARAMS((CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_LIST PARAMS((CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_LIST PARAMS((CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_CHANINFO PARAMS((CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_CHANINFO PARAMS((CLIENT *Client, REQUEST *Req )); #endif Index: src/ngircd/irc-info.c =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/irc-info.c,v retrieving revision 1.21.2.2 retrieving revision 1.30 diff -u -p -r1.21.2.2 -r1.30 --- src/ngircd/irc-info.c 24 Jan 2005 14:22:30 -0000 1.21.2.2 +++ src/ngircd/irc-info.c 17 Jun 2005 19:15:43 -0000 1.30 @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de) + * Copyright (c)2001-2005 Alexander Barton (alex@barton.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -14,12 +14,13 @@ #include "portab.h" -static char UNUSED id[] = "$Id: irc-info.c,v 1.21.2.2 2005/01/24 14:22:30 alex Exp $"; +static char UNUSED id[] = "$Id: irc-info.c,v 1.30 2005/06/17 19:15:43 fw Exp $"; #include "imp.h" #include #include #include +#include #include #include @@ -42,7 +43,7 @@ static char UNUSED id[] = "$Id: irc-info #include "irc-info.h" -GLOBAL BOOLEAN +GLOBAL bool IRC_ADMIN(CLIENT *Client, REQUEST *Req ) { CLIENT *target, *prefix; @@ -83,13 +84,13 @@ IRC_ADMIN(CLIENT *Client, REQUEST *Req ) } /* IRC_ADMIN */ -GLOBAL BOOLEAN +GLOBAL bool IRC_ISON( CLIENT *Client, REQUEST *Req ) { - CHAR rpl[COMMAND_LEN]; + char rpl[COMMAND_LEN]; CLIENT *c; - CHAR *ptr; - INT i; + char *ptr; + int i; assert( Client != NULL ); assert( Req != NULL ); @@ -97,7 +98,7 @@ IRC_ISON( CLIENT *Client, REQUEST *Req ) /* Falsche Anzahl Parameter? */ if(( Req->argc < 1 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); - strcpy( rpl, RPL_ISON_MSG ); + strlcpy( rpl, RPL_ISON_MSG, sizeof rpl ); for( i = 0; i < Req->argc; i++ ) { ptr = strtok( Req->argv[i], " " ); @@ -114,17 +115,17 @@ IRC_ISON( CLIENT *Client, REQUEST *Req ) ptr = strtok( NULL, " " ); } } - if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0'; + ngt_TrimLastChr(rpl, ' '); return IRC_WriteStrClient( Client, rpl, Client_ID( Client ) ); } /* IRC_ISON */ -GLOBAL BOOLEAN +GLOBAL bool IRC_LINKS( CLIENT *Client, REQUEST *Req ) { CLIENT *target, *from, *c; - CHAR *mask; + char *mask; assert( Client != NULL ); assert( Req != NULL ); @@ -169,7 +170,7 @@ IRC_LINKS( CLIENT *Client, REQUEST *Req } /* IRC_LINKS */ -GLOBAL BOOLEAN +GLOBAL bool IRC_LUSERS( CLIENT *Client, REQUEST *Req ) { CLIENT *target, *from; @@ -205,7 +206,7 @@ IRC_LUSERS( CLIENT *Client, REQUEST *Req } /* IRC_LUSERS */ -GLOBAL BOOLEAN +GLOBAL bool IRC_MOTD( CLIENT *Client, REQUEST *Req ) { CLIENT *from, *target; @@ -239,10 +240,10 @@ IRC_MOTD( CLIENT *Client, REQUEST *Req ) } /* IRC_MOTD */ -GLOBAL BOOLEAN +GLOBAL bool IRC_NAMES( CLIENT *Client, REQUEST *Req ) { - CHAR rpl[COMMAND_LEN], *ptr; + char rpl[COMMAND_LEN], *ptr; CLIENT *target, *from, *c; CHANNEL *chan; @@ -334,12 +335,12 @@ IRC_NAMES( CLIENT *Client, REQUEST *Req } /* IRC_NAMES */ -GLOBAL BOOLEAN +GLOBAL bool IRC_STATS( CLIENT *Client, REQUEST *Req ) { CLIENT *from, *target, *cl; CONN_ID con; - CHAR query; + char query; COMMAND *cmd; assert( Client != NULL ); @@ -383,12 +384,12 @@ IRC_STATS( CLIENT *Client, REQUEST *Req #ifdef ZLIB if( Conn_Options( con ) & CONN_ZIP ) { - if( ! IRC_WriteStrClient( from, RPL_STATSLINKINFOZIP_MSG, Client_ID( from ), Client_Mask( cl ), Conn_SendQ( con ), Conn_SendMsg( con ), Zip_SendBytes( con ), Conn_SendBytes( con ), Conn_RecvMsg( con ), Zip_RecvBytes( con ), Conn_RecvBytes( con ), (LONG)( time( NULL ) - Conn_StartTime( con )))) return DISCONNECTED; + if( ! IRC_WriteStrClient( from, RPL_STATSLINKINFOZIP_MSG, Client_ID( from ), Client_Mask( cl ), Conn_SendQ( con ), Conn_SendMsg( con ), Zip_SendBytes( con ), Conn_SendBytes( con ), Conn_RecvMsg( con ), Zip_RecvBytes( con ), Conn_RecvBytes( con ), (long)( time( NULL ) - Conn_StartTime( con )))) return DISCONNECTED; } else #endif { - if( ! IRC_WriteStrClient( from, RPL_STATSLINKINFO_MSG, Client_ID( from ), Client_Mask( cl ), Conn_SendQ( con ), Conn_SendMsg( con ), Conn_SendBytes( con ), Conn_RecvMsg( con ), Conn_RecvBytes( con ), (LONG)( time( NULL ) - Conn_StartTime( con )))) return DISCONNECTED; + if( ! IRC_WriteStrClient( from, RPL_STATSLINKINFO_MSG, Client_ID( from ), Client_Mask( cl ), Conn_SendQ( con ), Conn_SendMsg( con ), Conn_SendBytes( con ), Conn_RecvMsg( con ), Conn_RecvBytes( con ), (long)( time( NULL ) - Conn_StartTime( con )))) return DISCONNECTED; } } con = Conn_Next( con ); @@ -413,11 +414,11 @@ IRC_STATS( CLIENT *Client, REQUEST *Req } /* IRC_STATS */ -GLOBAL BOOLEAN +GLOBAL bool IRC_TIME( CLIENT *Client, REQUEST *Req ) { CLIENT *from, *target; - CHAR t_str[64]; + char t_str[64]; time_t t; assert( Client != NULL ); @@ -445,17 +446,17 @@ IRC_TIME( CLIENT *Client, REQUEST *Req ) } t = time( NULL ); - (VOID)strftime( t_str, 60, "%A %B %d %Y -- %H:%M %Z", localtime( &t )); + (void)strftime( t_str, 60, "%A %B %d %Y -- %H:%M %Z", localtime( &t )); return IRC_WriteStrClient( from, RPL_TIME_MSG, Client_ID( from ), Client_ID( Client_ThisServer( )), t_str ); } /* IRC_TIME */ -GLOBAL BOOLEAN +GLOBAL bool IRC_USERHOST( CLIENT *Client, REQUEST *Req ) { - CHAR rpl[COMMAND_LEN]; + char rpl[COMMAND_LEN]; CLIENT *c; - INT max, i; + int max, i; assert( Client != NULL ); assert( Req != NULL ); @@ -466,7 +467,7 @@ IRC_USERHOST( CLIENT *Client, REQUEST *R if( Req->argc > 5 ) max = 5; else max = Req->argc; - strcpy( rpl, RPL_USERHOST_MSG ); + strlcpy( rpl, RPL_USERHOST_MSG, sizeof rpl ); for( i = 0; i < max; i++ ) { c = Client_Search( Req->argv[i] ); @@ -484,18 +485,18 @@ IRC_USERHOST( CLIENT *Client, REQUEST *R strlcat( rpl, " ", sizeof( rpl )); } } - if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0'; + ngt_TrimLastChr( rpl, ' '); return IRC_WriteStrClient( Client, rpl, Client_ID( Client ) ); } /* IRC_USERHOST */ -GLOBAL BOOLEAN +GLOBAL bool IRC_VERSION( CLIENT *Client, REQUEST *Req ) { CLIENT *target, *prefix; #ifdef CVSDATE - CHAR ver[12], vertxt[30]; + char ver[12], vertxt[30]; #endif assert( Client != NULL ); @@ -530,20 +531,20 @@ IRC_VERSION( CLIENT *Client, REQUEST *Re strncpy( ver + 4, ver + 5, 2 ); strncpy( ver + 6, ver + 8, 3 ); snprintf( vertxt, sizeof( vertxt ), "%s(%s)", PACKAGE_VERSION, ver ); - return IRC_WriteStrClient( Client, RPL_VERSION_MSG, Client_ID( prefix ), PACKAGE_NAME, vertxt, NGIRCd_DebugLevel, Conf_ServerName, NGIRCd_VersionAddition( )); + return IRC_WriteStrClient( Client, RPL_VERSION_MSG, Client_ID( prefix ), PACKAGE_NAME, vertxt, NGIRCd_DebugLevel, Conf_ServerName, NGIRCd_VersionAddition ); #else - return IRC_WriteStrClient( Client, RPL_VERSION_MSG, Client_ID( prefix ), PACKAGE_NAME, PACKAGE_VERSION, NGIRCd_DebugLevel, Conf_ServerName, NGIRCd_VersionAddition( )); + return IRC_WriteStrClient( Client, RPL_VERSION_MSG, Client_ID( prefix ), PACKAGE_NAME, PACKAGE_VERSION, NGIRCd_DebugLevel, Conf_ServerName, NGIRCd_VersionAddition ); #endif } /* IRC_VERSION */ -GLOBAL BOOLEAN +GLOBAL bool IRC_WHO( CLIENT *Client, REQUEST *Req ) { - BOOLEAN ok, only_ops; - CHAR flags[8], *ptr; + bool ok, only_ops; + char flags[8], *ptr; CL2CHAN *cl2chan; - CHANNEL *chan; + CHANNEL *chan, *cn; CLIENT *c; assert( Client != NULL ); @@ -552,13 +553,13 @@ IRC_WHO( CLIENT *Client, REQUEST *Req ) /* Falsche Anzahl Parameter? */ if(( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); - only_ops = FALSE; + only_ops = false; chan = NULL; if( Req->argc == 2 ) { /* Nur OPs anzeigen? */ - if( strcmp( Req->argv[1], "o" ) == 0 ) only_ops = TRUE; + if( strcmp( Req->argv[1], "o" ) == 0 ) only_ops = true; #ifdef STRICT_RFC else return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); #endif @@ -581,24 +582,35 @@ IRC_WHO( CLIENT *Client, REQUEST *Req ) { if(( Client_Type( c ) == CLIENT_USER ) && ( ! strchr( Client_Modes( c ), 'i' ))) { - ok = FALSE; - if( Req->argc == 0 ) ok = TRUE; + ok = false; + if( Req->argc == 0 ) ok = true; else { - if( strcasecmp( Req->argv[0], Client_ID( c )) == 0 ) ok = TRUE; - else if( strcmp( Req->argv[0], "0" ) == 0 ) ok = TRUE; + if( strcasecmp( Req->argv[0], Client_ID( c )) == 0 ) ok = true; + else if( strcmp( Req->argv[0], "0" ) == 0 ) ok = true; } if( ok && (( ! only_ops ) || ( strchr( Client_Modes( c ), 'o' )))) { - /* Flags zusammenbasteln */ + /* Get flags */ strcpy( flags, "H" ); if( strchr( Client_Modes( c ), 'o' )) strlcat( flags, "*", sizeof( flags )); - /* ausgeben */ + /* Search suitable channel */ cl2chan = Channel_FirstChannelOf( c ); - if( cl2chan ) ptr = Channel_Name( Channel_GetChannel( cl2chan )); - else ptr = "*"; + while( cl2chan ) + { + cn = Channel_GetChannel( cl2chan ); + if( Channel_IsMemberOf( cn, Client ) || + ! strchr( Channel_Modes( cn ), 's' )) + { + ptr = Channel_Name( cn ); + break; + } + cl2chan = Channel_NextChannelOf( c, cl2chan ); + } + if( ! cl2chan ) ptr = "*"; + if( ! IRC_WriteStrClient( Client, RPL_WHOREPLY_MSG, Client_ID( Client ), ptr, Client_User( c ), Client_Hostname( c ), Client_ID( Client_Introducer( c )), Client_ID( c ), flags, Client_Hops( c ), Client_Info( c ))) return DISCONNECTED; } } @@ -613,11 +625,11 @@ IRC_WHO( CLIENT *Client, REQUEST *Req ) } /* IRC_WHO */ -GLOBAL BOOLEAN +GLOBAL bool IRC_WHOIS( CLIENT *Client, REQUEST *Req ) { CLIENT *from, *target, *c; - CHAR str[LINE_LEN + 1]; + char str[LINE_LEN + 1]; CL2CHAN *cl2chan; CHANNEL *chan; @@ -663,6 +675,12 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req chan = Channel_GetChannel( cl2chan ); assert( chan != NULL ); + /* next */ + cl2chan = Channel_NextChannelOf( c, cl2chan ); + + /* Secret channel? */ + if( strchr( Channel_Modes( chan ), 's' ) && ! Channel_IsMemberOf( chan, Client )) continue; + /* Concatenate channel names */ if( str[strlen( str ) - 1] != ':' ) strlcat( str, " ", sizeof( str )); if( strchr( Channel_UserModes( chan, c ), 'o' )) strlcat( str, "@", sizeof( str )); @@ -675,9 +693,6 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED; snprintf( str, sizeof( str ), RPL_WHOISCHANNELS_MSG, Client_ID( from ), Client_ID( c )); } - - /* next */ - cl2chan = Channel_NextChannelOf( c, cl2chan ); } if( str[strlen( str ) - 1] != ':') { @@ -708,25 +723,116 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req } /* IRC_WHOIS */ -GLOBAL BOOLEAN +/** + * IRC "WHOWAS" function. + * This function implements the IRC command "WHOWHAS". It handles local + * requests and request that should be forwarded to other servers. + */ +GLOBAL bool IRC_WHOWAS( CLIENT *Client, REQUEST *Req ) { + CLIENT *target, *prefix; + WHOWAS *whowas; + int max, last, count, i; + char t_str[60]; + assert( Client != NULL ); assert( Req != NULL ); - /* Falsche Anzahl Parameter? */ - if(( Req->argc < 1 ) || ( Req->argc > 3 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); + /* Wrong number of parameters? */ + if(( Req->argc < 1 ) || ( Req->argc > 3 )) + return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, + Client_ID( Client ), Req->command ); + + /* Search taget */ + if( Req->argc == 3 ) + target = Client_Search( Req->argv[2] ); + else + target = Client_ThisServer( ); + + /* Get prefix */ + if( Client_Type( Client ) == CLIENT_SERVER ) + prefix = Client_Search( Req->prefix ); + else + prefix = Client; + + if( ! prefix ) + return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, + Client_ID( Client ), Req->prefix ); - /* ... */ - - return CONNECTED; + /* Forward to other server? */ + if( target != Client_ThisServer( )) + { + if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER )) + return IRC_WriteStrClient( prefix, ERR_NOSUCHSERVER_MSG, + Client_ID( prefix ), + Req->argv[2] ); + + /* Forward */ + IRC_WriteStrClientPrefix( target, prefix, "WHOWAS %s %s %s", + Req->argv[0], Req->argv[1], + Req->argv[2] ); + return CONNECTED; + } + + whowas = Client_GetWhowas( ); + last = Client_GetLastWhowasIndex( ); + if( last < 0 ) last = 0; + + if( Req->argc > 1 ) + { + max = atoi( Req->argv[1] ); + if( max < 1 ) max = MAX_WHOWAS; + } + else + max = DEFAULT_WHOWAS; + + i = last; + count = 0; + do + { + /* Used entry? */ + if( whowas[i].time > 0 && + strcasecmp( Req->argv[0], whowas[i].id ) == 0 ) + { + (void)strftime( t_str, sizeof(t_str), + "%a %b %d %H:%M:%S %Y", + localtime( &whowas[i].time )); + + if( ! IRC_WriteStrClient( prefix, RPL_WHOWASUSER_MSG, + Client_ID( prefix ), + whowas[i].id, + whowas[i].user, + whowas[i].host, + whowas[i].info )) + return DISCONNECTED; + + if( ! IRC_WriteStrClient( prefix, RPL_WHOISSERVER_MSG, + Client_ID( prefix ), + whowas[i].id, + whowas[i].server, t_str )) + return DISCONNECTED; + + count++; + if( count >= max ) break; + } + + /* previos entry */ + i--; + + /* "underflow", wrap around */ + if( i < 0 ) i = MAX_WHOWAS - 1; + } while( i != last ); + + return IRC_WriteStrClient( prefix, RPL_ENDOFWHOWAS_MSG, + Client_ID( prefix ), Req->argv[0] ); } /* IRC_WHOWAS */ -GLOBAL BOOLEAN +GLOBAL bool IRC_Send_LUSERS( CLIENT *Client ) { - LONG cnt; + long cnt; assert( Client != NULL ); @@ -764,13 +870,12 @@ IRC_Send_LUSERS( CLIENT *Client ) } /* IRC_Send_LUSERS */ -GLOBAL BOOLEAN +GLOBAL bool IRC_Show_MOTD( CLIENT *Client ) { - BOOLEAN ok; - CHAR line[127]; + bool ok; + char line[127]; FILE *fd; - UINT line_len; assert( Client != NULL ); @@ -789,18 +894,16 @@ IRC_Show_MOTD( CLIENT *Client ) } if( ! IRC_WriteStrClient( Client, RPL_MOTDSTART_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )))) return DISCONNECTED; - while( TRUE ) + while( true ) { if( ! fgets( line, sizeof( line ), fd )) break; - line_len = strlen( line ); - if( line_len > 0 ) line_len--; - if( line[line_len] == '\n' ) line[line_len] = '\0'; + ngt_TrimLastChr( line, '\n'); if( ! IRC_WriteStrClient( Client, RPL_MOTD_MSG, Client_ID( Client ), line )) { fclose( fd ); - return FALSE; + return false; } } ok = IRC_WriteStrClient( Client, RPL_ENDOFMOTD_MSG, Client_ID( Client ) ); @@ -811,19 +914,22 @@ IRC_Show_MOTD( CLIENT *Client ) } /* IRC_Show_MOTD */ -GLOBAL BOOLEAN +GLOBAL bool IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan ) { - BOOLEAN is_visible, is_member; - CHAR str[LINE_LEN + 1]; + bool is_visible, is_member; + char str[LINE_LEN + 1]; CL2CHAN *cl2chan; CLIENT *cl; assert( Client != NULL ); assert( Chan != NULL ); - if( Channel_IsMemberOf( Chan, Client )) is_member = TRUE; - else is_member = FALSE; + if( Channel_IsMemberOf( Chan, Client )) is_member = true; + else is_member = false; + + /* Secret channel? */ + if( ! is_member && strchr( Channel_Modes( Chan ), 's' )) return CONNECTED; /* Alle Mitglieder suchen */ snprintf( str, sizeof( str ), RPL_NAMREPLY_MSG, Client_ID( Client ), "=", Channel_Name( Chan )); @@ -832,8 +938,8 @@ IRC_Send_NAMES( CLIENT *Client, CHANNEL { cl = Channel_GetClient( cl2chan ); - if( strchr( Client_Modes( cl ), 'i' )) is_visible = FALSE; - else is_visible = TRUE; + if( strchr( Client_Modes( cl ), 'i' )) is_visible = false; + else is_visible = true; if( is_member || is_visible ) { @@ -864,19 +970,22 @@ IRC_Send_NAMES( CLIENT *Client, CHANNEL } /* IRC_Send_NAMES */ -GLOBAL BOOLEAN -IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps ) +GLOBAL bool +IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, bool OnlyOps ) { - BOOLEAN is_visible, is_member; + bool is_visible, is_member; CL2CHAN *cl2chan; - CHAR flags[8]; + char flags[8]; CLIENT *c; assert( Client != NULL ); assert( Chan != NULL ); - if( Channel_IsMemberOf( Chan, Client )) is_member = TRUE; - else is_member = FALSE; + if( Channel_IsMemberOf( Chan, Client )) is_member = true; + else is_member = false; + + /* Secret channel? */ + if( ! is_member && strchr( Channel_Modes( Chan ), 's' )) return CONNECTED; /* Alle Mitglieder suchen */ cl2chan = Channel_FirstMember( Chan ); @@ -884,8 +993,8 @@ IRC_Send_WHO( CLIENT *Client, CHANNEL *C { c = Channel_GetClient( cl2chan ); - if( strchr( Client_Modes( c ), 'i' )) is_visible = FALSE; - else is_visible = TRUE; + if( strchr( Client_Modes( c ), 'i' )) is_visible = false; + else is_visible = true; if( is_member || is_visible ) { Index: src/ngircd/irc-info.h =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/irc-info.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -p -r1.2 -r1.3 --- src/ngircd/irc-info.h 12 Dec 2002 12:23:43 -0000 1.2 +++ src/ngircd/irc-info.h 19 Mar 2005 18:43:48 -0000 1.3 @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: irc-info.h,v 1.2 2002/12/12 12:23:43 alex Exp $ + * $Id: irc-info.h,v 1.3 2005/03/19 18:43:48 fw Exp $ * * IRC info commands (header) */ @@ -18,24 +18,24 @@ #define __irc_info_h__ -GLOBAL BOOLEAN IRC_ADMIN PARAMS(( CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_ISON PARAMS(( CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_LINKS PARAMS(( CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_LUSERS PARAMS(( CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_MOTD PARAMS(( CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_NAMES PARAMS(( CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_STATS PARAMS(( CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_TIME PARAMS(( CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_USERHOST PARAMS(( CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_VERSION PARAMS(( CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_WHO PARAMS(( CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_WHOIS PARAMS(( CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_WHOWAS PARAMS(( CLIENT *Client, REQUEST *Req )); - -GLOBAL BOOLEAN IRC_Send_LUSERS PARAMS(( CLIENT *Client )); -GLOBAL BOOLEAN IRC_Send_NAMES PARAMS(( CLIENT *Client, CHANNEL *Chan )); -GLOBAL BOOLEAN IRC_Show_MOTD PARAMS(( CLIENT *Client )); -GLOBAL BOOLEAN IRC_Send_WHO PARAMS(( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps )); +GLOBAL bool IRC_ADMIN PARAMS(( CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_ISON PARAMS(( CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_LINKS PARAMS(( CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_LUSERS PARAMS(( CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_MOTD PARAMS(( CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_NAMES PARAMS(( CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_STATS PARAMS(( CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_TIME PARAMS(( CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_USERHOST PARAMS(( CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_VERSION PARAMS(( CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_WHO PARAMS(( CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_WHOIS PARAMS(( CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_WHOWAS PARAMS(( CLIENT *Client, REQUEST *Req )); + +GLOBAL bool IRC_Send_LUSERS PARAMS(( CLIENT *Client )); +GLOBAL bool IRC_Send_NAMES PARAMS(( CLIENT *Client, CHANNEL *Chan )); +GLOBAL bool IRC_Show_MOTD PARAMS(( CLIENT *Client )); +GLOBAL bool IRC_Send_WHO PARAMS(( CLIENT *Client, CHANNEL *Chan, bool OnlyOps )); #endif Index: src/ngircd/irc-login.c =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/irc-login.c,v retrieving revision 1.40 retrieving revision 1.44 diff -u -p -r1.40 -r1.44 --- src/ngircd/irc-login.c 11 Mar 2004 22:16:31 -0000 1.40 +++ src/ngircd/irc-login.c 4 Jun 2005 12:32:09 -0000 1.44 @@ -14,7 +14,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: irc-login.c,v 1.40 2004/03/11 22:16:31 alex Exp $"; +static char UNUSED id[] = "$Id: irc-login.c,v 1.44 2005/06/04 12:32:09 fw Exp $"; #include "imp.h" #include @@ -41,11 +41,11 @@ static char UNUSED id[] = "$Id: irc-logi #include "irc-login.h" -LOCAL BOOLEAN Hello_User PARAMS(( CLIENT *Client )); -LOCAL VOID Kill_Nick PARAMS(( CHAR *Nick, CHAR *Reason )); +LOCAL bool Hello_User PARAMS(( CLIENT *Client )); +LOCAL void Kill_Nick PARAMS(( char *Nick, char *Reason )); -GLOBAL BOOLEAN +GLOBAL bool IRC_PASS( CLIENT *Client, REQUEST *Req ) { assert( Client != NULL ); @@ -67,8 +67,8 @@ IRC_PASS( CLIENT *Client, REQUEST *Req ) } else if((( Client_Type( Client ) == CLIENT_UNKNOWN ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER )) && (( Req->argc == 3 ) || ( Req->argc == 4 ))) { - CHAR c2, c4, *type, *impl, *serverver, *flags, *ptr, *ircflags; - INT protohigh, protolow; + char c2, c4, *type, *impl, *serverver, *flags, *ptr, *ircflags; + int protohigh, protolow; /* noch nicht registrierte Server-Verbindung */ Log( LOG_DEBUG, "Connection %d: got PASS command (new server link) ...", Client_Conn( Client )); @@ -143,88 +143,138 @@ IRC_PASS( CLIENT *Client, REQUEST *Req ) } /* IRC_PASS */ -GLOBAL BOOLEAN +/** + * IRC "NICK" command. + * This function implements the IRC command "NICK" which is used to register + * with the server, to change already registered nicknames and to introduce + * new users which are connected to other servers. + */ +GLOBAL bool IRC_NICK( CLIENT *Client, REQUEST *Req ) { CLIENT *intr_c, *target, *c; - CHAR *modes; + char *modes; assert( Client != NULL ); assert( Req != NULL ); - /* Zumindest BitchX sendet NICK-USER in der falschen Reihenfolge. */ #ifndef STRICT_RFC - if( Client_Type( Client ) == CLIENT_UNKNOWN || Client_Type( Client ) == CLIENT_GOTPASS || Client_Type( Client ) == CLIENT_GOTNICK || Client_Type( Client ) == CLIENT_GOTUSER || Client_Type( Client ) == CLIENT_USER || ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 )) + /* Some IRC clients, for example BitchX, send the NICK and USER + * commands in the wrong order ... */ + if( Client_Type( Client ) == CLIENT_UNKNOWN + || Client_Type( Client ) == CLIENT_GOTPASS + || Client_Type( Client ) == CLIENT_GOTNICK + || Client_Type( Client ) == CLIENT_GOTUSER + || Client_Type( Client ) == CLIENT_USER + || ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 )) #else - if( Client_Type( Client ) == CLIENT_UNKNOWN || Client_Type( Client ) == CLIENT_GOTPASS || Client_Type( Client ) == CLIENT_GOTNICK || Client_Type( Client ) == CLIENT_USER || ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 )) + if( Client_Type( Client ) == CLIENT_UNKNOWN + || Client_Type( Client ) == CLIENT_GOTPASS + || Client_Type( Client ) == CLIENT_GOTNICK + || Client_Type( Client ) == CLIENT_USER + || ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 )) #endif { - /* User-Registrierung bzw. Nick-Aenderung */ + /* User registration or change of nickname */ - /* Falsche Anzahl Parameter? */ - if( Req->argc != 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); + /* Wrong number of arguments? */ + if( Req->argc != 1 ) + return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, + Client_ID( Client ), + Req->command ); - /* "Ziel-Client" ermitteln */ + /* Search "target" client */ if( Client_Type( Client ) == CLIENT_SERVER ) { target = Client_Search( Req->prefix ); - if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] ); + if( ! target ) + return IRC_WriteStrClient( Client, + ERR_NOSUCHNICK_MSG, + Client_ID( Client ), + Req->argv[0] ); } else { - /* Ist der Client "restricted"? */ - if( Client_HasMode( Client, 'r' )) return IRC_WriteStrClient( Client, ERR_RESTRICTED_MSG, Client_ID( Client )); + /* Is this a restricted client? */ + if( Client_HasMode( Client, 'r' )) + return IRC_WriteStrClient( Client, + ERR_RESTRICTED_MSG, + Client_ID( Client )); + target = Client; } #ifndef STRICT_RFC - /* Wenn der Client zu seinem eigenen Nick wechseln will, so machen - * wir nichts. So macht es das Original und mind. Snak hat probleme, - * wenn wir es nicht so machen. Ob es so okay ist? Hm ... */ - if( strcmp( Client_ID( target ), Req->argv[0] ) == 0 ) return CONNECTED; + /* If the clients tries to change to its own nickname we won't + * do anything. This is how the original ircd behaves and some + * clients (for example Snak) expect it to be like this. + * But I doubt that this is "really the right thing" ... */ + if( strcmp( Client_ID( target ), Req->argv[0] ) == 0 ) + return CONNECTED; #endif - /* pruefen, ob Nick bereits vergeben. Speziallfall: der Client - * will nur die Gross- und Kleinschreibung aendern. Das darf - * er natuerlich machen :-) */ + /* Check that the new nickname is available. Special case: + * the client only changes from/to upper to lower case. */ if( strcasecmp( Client_ID( target ), Req->argv[0] ) != 0 ) { - if( ! Client_CheckNick( target, Req->argv[0] )) return CONNECTED; + if( ! Client_CheckNick( target, Req->argv[0] )) + return CONNECTED; } - if(( Client_Type( target ) != CLIENT_USER ) && ( Client_Type( target ) != CLIENT_SERVER )) + if(( Client_Type( target ) != CLIENT_USER ) + && ( Client_Type( target ) != CLIENT_SERVER )) { - /* Neuer Client */ - Log( LOG_DEBUG, "Connection %d: got valid NICK command ...", Client_Conn( Client )); + /* New client */ + Log( LOG_DEBUG, "Connection %d: got valid NICK command ...", + Client_Conn( Client )); - /* Client-Nick registrieren */ + /* Register new nickname of this client */ Client_SetID( target, Req->argv[0] ); - /* schon ein USER da? Dann registrieren! */ - if( Client_Type( Client ) == CLIENT_GOTUSER ) return Hello_User( Client ); - else Client_SetType( Client, CLIENT_GOTNICK ); + /* If we received a valid USER command already then + * register the new client! */ + if( Client_Type( Client ) == CLIENT_GOTUSER ) + return Hello_User( Client ); + else + Client_SetType( Client, CLIENT_GOTNICK ); } else { - /* Nick-Aenderung */ + /* Nickname change */ if( Client_Conn( target ) > NONE ) { - /* lokaler Client */ - Log( LOG_INFO, "User \"%s\" changed nick (connection %d): \"%s\" -> \"%s\".", Client_Mask( target ), Client_Conn( target ), Client_ID( target ), Req->argv[0] ); + /* Local client */ + Log( LOG_INFO, + "User \"%s\" changed nick (connection %d): \"%s\" -> \"%s\".", + Client_Mask( target ), Client_Conn( target ), + Client_ID( target ), Req->argv[0] ); } else { - /* Remote-Client */ - Log( LOG_DEBUG, "User \"%s\" changed nick: \"%s\" -> \"%s\".", Client_Mask( target ), Client_ID( target ), Req->argv[0] ); + /* Remote client */ + Log( LOG_DEBUG, + "User \"%s\" changed nick: \"%s\" -> \"%s\".", + Client_Mask( target ), Client_ID( target ), + Req->argv[0] ); } - /* alle betroffenen User und Server ueber Nick-Aenderung informieren */ - if( Client_Type( Client ) == CLIENT_USER ) IRC_WriteStrClientPrefix( Client, Client, "NICK :%s", Req->argv[0] ); - IRC_WriteStrServersPrefix( Client, target, "NICK :%s", Req->argv[0] ); - IRC_WriteStrRelatedPrefix( target, target, FALSE, "NICK :%s", Req->argv[0] ); + /* Inform all users and servers (which have to know) + * of this nickname change */ + if( Client_Type( Client ) == CLIENT_USER ) + IRC_WriteStrClientPrefix( Client, Client, + "NICK :%s", + Req->argv[0] ); + IRC_WriteStrServersPrefix( Client, target, + "NICK :%s", Req->argv[0] ); + IRC_WriteStrRelatedPrefix( target, target, false, + "NICK :%s", Req->argv[0] ); - /* neuen Client-Nick speichern */ + /* Register old nickname for WHOWAS queries */ + Client_RegisterWhowas( target ); + + /* Save new nickname */ Client_SetID( target, Req->argv[0] ); + IRC_SetPenalty( target, 2 ); } @@ -232,7 +282,7 @@ IRC_NICK( CLIENT *Client, REQUEST *Req ) } else if( Client_Type( Client ) == CLIENT_SERVER ) { - /* Server fuehrt neuen Client ein */ + /* Server introduces new client */ /* Falsche Anzahl Parameter? */ if( Req->argc != 7 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); @@ -259,7 +309,7 @@ IRC_NICK( CLIENT *Client, REQUEST *Req ) } /* Neue Client-Struktur anlegen */ - c = Client_NewRemoteUser( intr_c, Req->argv[0], atoi( Req->argv[1] ), Req->argv[2], Req->argv[3], atoi( Req->argv[4] ), Req->argv[5] + 1, Req->argv[6], TRUE ); + c = Client_NewRemoteUser( intr_c, Req->argv[0], atoi( Req->argv[1] ), Req->argv[2], Req->argv[3], atoi( Req->argv[4] ), Req->argv[5] + 1, Req->argv[6], true); if( ! c ) { /* Eine neue Client-Struktur konnte nicht angelegt werden. @@ -283,11 +333,11 @@ IRC_NICK( CLIENT *Client, REQUEST *Req ) } /* IRC_NICK */ -GLOBAL BOOLEAN +GLOBAL bool IRC_USER( CLIENT *Client, REQUEST *Req ) { #ifdef IDENTAUTH - CHAR *ptr; + char *ptr; #endif assert( Client != NULL ); @@ -305,9 +355,9 @@ IRC_USER( CLIENT *Client, REQUEST *Req ) /* User name */ #ifdef IDENTAUTH ptr = Client_User( Client ); - if( ! ptr || ! *ptr || *ptr == '~' ) Client_SetUser( Client, Req->argv[0], FALSE ); + if( ! ptr || ! *ptr || *ptr == '~' ) Client_SetUser( Client, Req->argv[0], false ); #else - Client_SetUser( Client, Req->argv[0], FALSE ); + Client_SetUser( Client, Req->argv[0], false ); #endif /* "Real name" or user info text: Don't set it to the empty string, the original ircd @@ -328,21 +378,25 @@ IRC_USER( CLIENT *Client, REQUEST *Req ) } /* IRC_USER */ -GLOBAL BOOLEAN +GLOBAL bool IRC_QUIT( CLIENT *Client, REQUEST *Req ) { CLIENT *target; + char quitmsg[LINE_LEN]; assert( Client != NULL ); assert( Req != NULL ); + + /* Wrong number of arguments? */ + if( Req->argc > 1 ) + return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); + + if (Req->argc == 1) + strlcpy(quitmsg, Req->argv[0], sizeof quitmsg); if ( Client_Type( Client ) == CLIENT_SERVER ) { /* Server */ - - /* Falsche Anzahl Parameter? */ - if( Req->argc > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); - target = Client_Search( Req->prefix ); if( ! target ) { @@ -351,27 +405,28 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req ) return CONNECTED; } - if( Req->argc == 0 ) Client_Destroy( target, "Got QUIT command.", NULL, TRUE ); - else Client_Destroy( target, "Got QUIT command.", Req->argv[0], TRUE ); + Client_Destroy( target, "Got QUIT command.", Req->argc == 1 ? quitmsg : NULL, true); return CONNECTED; } else { - /* User, Service, oder noch nicht registriert */ - - /* Falsche Anzahl Parameter? */ - if( Req->argc > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); + if (Req->argc == 1 && quitmsg[0] != '\"') { + /* " " to avoid confusion */ + strlcpy(quitmsg, "\"", sizeof quitmsg); + strlcat(quitmsg, Req->argv[0], sizeof quitmsg-1); + strlcat(quitmsg, "\"", sizeof quitmsg ); + } - if( Req->argc == 0 ) Conn_Close( Client_Conn( Client ), "Got QUIT command.", NULL, TRUE ); - else Conn_Close( Client_Conn( Client ), "Got QUIT command.", Req->argv[0], TRUE ); + /* User, Service, oder noch nicht registriert */ + Conn_Close( Client_Conn( Client ), "Got QUIT command.", Req->argc == 1 ? quitmsg : NULL, true); return DISCONNECTED; } } /* IRC_QUIT */ -GLOBAL BOOLEAN +GLOBAL bool IRC_PING( CLIENT *Client, REQUEST *Req ) { CLIENT *target, *from; @@ -405,7 +460,7 @@ IRC_PING( CLIENT *Client, REQUEST *Req ) } /* IRC_PING */ -GLOBAL BOOLEAN +GLOBAL bool IRC_PONG( CLIENT *Client, REQUEST *Req ) { CLIENT *target, *from; @@ -442,11 +497,11 @@ IRC_PONG( CLIENT *Client, REQUEST *Req ) } /* IRC_PONG */ -LOCAL BOOLEAN +LOCAL bool Hello_User( CLIENT *Client ) { #ifdef CVSDATE - CHAR ver[12], vertxt[30]; + char ver[12], vertxt[30]; #endif assert( Client != NULL ); @@ -456,7 +511,7 @@ Hello_User( CLIENT *Client ) { /* Bad password! */ Log( LOG_ERR, "User \"%s\" rejected (connection %d): Bad password!", Client_Mask( Client ), Client_Conn( Client )); - Conn_Close( Client_Conn( Client ), NULL, "Bad password", TRUE ); + Conn_Close( Client_Conn( Client ), NULL, "Bad password", true); return DISCONNECTED; } @@ -466,24 +521,24 @@ Hello_User( CLIENT *Client ) IRC_WriteStrServers( NULL, "NICK %s 1 %s %s 1 +%s :%s", Client_ID( Client ), Client_User( Client ), Client_Hostname( Client ), Client_Modes( Client ), Client_Info( Client )); /* Welcome :-) */ - if( ! IRC_WriteStrClient( Client, RPL_WELCOME_MSG, Client_ID( Client ), Client_Mask( Client ))) return FALSE; + if( ! IRC_WriteStrClient( Client, RPL_WELCOME_MSG, Client_ID( Client ), Client_Mask( Client ))) return false; /* Version and system type */ #ifdef CVSDATE - strlcpy( ver, CVSDATE, sizeof( ver )); - strncpy( ver + 4, ver + 5, 2 ); - strncpy( ver + 6, ver + 8, 3 ); + strlcpy( ver, CVSDATE, sizeof( ver )); + strncpy( ver + 4, ver + 5, 2 ); + strncpy( ver + 6, ver + 8, 3 ); snprintf( vertxt, sizeof( vertxt ), "%s(%s)", PACKAGE_VERSION, ver ); - if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), vertxt, TARGET_CPU, TARGET_VENDOR, TARGET_OS )) return FALSE; + if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), vertxt, TARGET_CPU, TARGET_VENDOR, TARGET_OS )) return false; #else - if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), PACKAGE_VERSION, TARGET_CPU, TARGET_VENDOR, TARGET_OS )) return FALSE; + if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), PACKAGE_VERSION, TARGET_CPU, TARGET_VENDOR, TARGET_OS )) return false; #endif - if( ! IRC_WriteStrClient( Client, RPL_CREATED_MSG, Client_ID( Client ), NGIRCd_StartStr )) return FALSE; + if( ! IRC_WriteStrClient( Client, RPL_CREATED_MSG, Client_ID( Client ), NGIRCd_StartStr )) return false; #ifdef CVSDATE - if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), vertxt, USERMODES, CHANMODES )) return FALSE; + if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), vertxt, USERMODES, CHANMODES )) return false; #else - if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), PACKAGE_VERSION, USERMODES, CHANMODES )) return FALSE; + if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), PACKAGE_VERSION, USERMODES, CHANMODES )) return false; #endif /* Features */ @@ -501,15 +556,15 @@ Hello_User( CLIENT *Client ) } /* Hello_User */ -LOCAL VOID -Kill_Nick( CHAR *Nick, CHAR *Reason ) +LOCAL void +Kill_Nick( char *Nick, char *Reason ) { REQUEST r; assert( Nick != NULL ); assert( Reason != NULL ); - r.prefix = (CHAR *)Client_ThisServer( ); + r.prefix = (char *)Client_ThisServer( ); r.argv[0] = Nick; r.argv[1] = Reason; r.argc = 2; Index: src/ngircd/irc-login.h =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/irc-login.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -p -r1.5 -r1.6 --- src/ngircd/irc-login.h 12 Dec 2002 12:23:43 -0000 1.5 +++ src/ngircd/irc-login.h 19 Mar 2005 18:43:48 -0000 1.6 @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: irc-login.h,v 1.5 2002/12/12 12:23:43 alex Exp $ + * $Id: irc-login.h,v 1.6 2005/03/19 18:43:48 fw Exp $ * * Login and logout (header) */ @@ -18,12 +18,12 @@ #define __irc_login_h__ -GLOBAL BOOLEAN IRC_PASS PARAMS((CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_NICK PARAMS((CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_USER PARAMS((CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_PING PARAMS((CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_PONG PARAMS((CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_QUIT PARAMS((CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_PASS PARAMS((CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_NICK PARAMS((CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_USER PARAMS((CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_PING PARAMS((CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_PONG PARAMS((CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_QUIT PARAMS((CLIENT *Client, REQUEST *Req )); #endif Index: src/ngircd/irc-mode.c =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/irc-mode.c,v retrieving revision 1.35 retrieving revision 1.43 diff -u -p -r1.35 -r1.43 --- src/ngircd/irc-mode.c 25 Apr 2004 15:42:05 -0000 1.35 +++ src/ngircd/irc-mode.c 17 Jun 2005 19:14:58 -0000 1.43 @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de) + * Copyright (c)2001-2005 Alexander Barton (alex@barton.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -14,7 +14,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: irc-mode.c,v 1.35 2004/04/25 15:42:05 alex Exp $"; +static char UNUSED id[] = "$Id: irc-mode.c,v 1.43 2005/06/17 19:14:58 fw Exp $"; #include "imp.h" #include @@ -22,10 +22,10 @@ static char UNUSED id[] = "$Id: irc-mode #include #include +#include "defines.h" #include "conn.h" #include "client.h" #include "channel.h" -#include "defines.h" #include "irc-write.h" #include "lists.h" #include "log.h" @@ -38,19 +38,19 @@ static char UNUSED id[] = "$Id: irc-mode #include "irc-mode.h" -LOCAL BOOLEAN Client_Mode PARAMS(( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )); -LOCAL BOOLEAN Channel_Mode PARAMS(( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )); +LOCAL bool Client_Mode PARAMS(( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )); +LOCAL bool Channel_Mode PARAMS(( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )); -LOCAL BOOLEAN Add_Invite PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern )); -LOCAL BOOLEAN Add_Ban PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern )); +LOCAL bool Add_Invite PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )); +LOCAL bool Add_Ban PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )); -LOCAL BOOLEAN Del_Invite PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern )); -LOCAL BOOLEAN Del_Ban PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern )); +LOCAL bool Del_Invite PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )); +LOCAL bool Del_Ban PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )); -LOCAL BOOLEAN Send_ListChange PARAMS(( CHAR *Mode, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Mask )); +LOCAL bool Send_ListChange PARAMS(( char *Mode, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Mask )); -GLOBAL BOOLEAN +GLOBAL bool IRC_MODE( CLIENT *Client, REQUEST *Req ) { CLIENT *cl, *origin; @@ -83,14 +83,15 @@ IRC_MODE( CLIENT *Client, REQUEST *Req ) } /* IRC_MODE */ -LOCAL BOOLEAN +LOCAL bool Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ) { /* Handle client mode requests */ - CHAR the_modes[COMMAND_LEN], x[2], *mode_ptr; - BOOLEAN ok, set; - INT mode_arg; + char the_modes[COMMAND_LEN], x[2], *mode_ptr; + bool ok, set; + int mode_arg; + size_t len; /* Is the client allowed to request or change the modes? */ if( Client_Type( Client ) == CLIENT_USER ) @@ -106,8 +107,8 @@ Client_Mode( CLIENT *Client, REQUEST *Re mode_ptr = Req->argv[mode_arg]; /* Initial state: set or unset modes? */ - if( *mode_ptr == '+' ) set = TRUE; - else if( *mode_ptr == '-' ) set = FALSE; + if( *mode_ptr == '+' ) set = true; + else if( *mode_ptr == '-' ) set = false; else return IRC_WriteStrClient( Origin, ERR_UMODEUNKNOWNFLAG_MSG, Client_ID( Origin )); /* Prepare reply string */ @@ -134,10 +135,11 @@ Client_Mode( CLIENT *Client, REQUEST *Re if((( *mode_ptr == '+' ) && ( ! set )) || (( *mode_ptr == '-' ) && ( set ))) { /* Action modifier ("+"/"-") must be changed ... */ - if(( the_modes[strlen( the_modes ) - 1] == '+' ) || ( the_modes[strlen( the_modes ) - 1] == '-' )) + len = strlen( the_modes ) - 1; + if(( the_modes[len] == '+' ) || ( the_modes[len] == '-' )) { /* Adjust last action modifier in result */ - the_modes[strlen( the_modes ) - 1] = *mode_ptr; + the_modes[len] = *mode_ptr; } else { @@ -145,8 +147,8 @@ Client_Mode( CLIENT *Client, REQUEST *Re x[0] = *mode_ptr; strlcat( the_modes, x, sizeof( the_modes )); } - if( *mode_ptr == '+' ) set = TRUE; - else set = FALSE; + if( *mode_ptr == '+' ) set = true; + else set = false; } continue; } @@ -155,37 +157,34 @@ Client_Mode( CLIENT *Client, REQUEST *Re x[0] = '\0'; switch( *mode_ptr ) { - case 'a': - /* Away */ + case 'i': /* Invisible */ + case 's': /* Server messages */ + x[0] = *mode_ptr; + break; + + case 'a': /* Away */ if( Client_Type( Client ) == CLIENT_SERVER ) { x[0] = 'a'; - Client_SetAway( Client, DEFAULT_AWAY_MSG ); + Client_SetAway( Origin, DEFAULT_AWAY_MSG ); } else ok = IRC_WriteStrClient( Origin, ERR_NOPRIVILEGES_MSG, Client_ID( Origin )); break; - case 'i': - /* Invisible */ - x[0] = 'i'; - break; - case 'o': - /* IRC operator (only unsetable!) */ + + case 'o': /* IRC operator (only unsettable!) */ if(( ! set ) || ( Client_Type( Client ) == CLIENT_SERVER )) { - Client_SetOperByMe( Target, FALSE ); + Client_SetOperByMe( Target, false ); x[0] = 'o'; } else ok = IRC_WriteStrClient( Origin, ERR_NOPRIVILEGES_MSG, Client_ID( Origin )); break; - case 'r': - /* Restricted (only setable) */ + + case 'r': /* Restricted (only settable) */ if(( set ) || ( Client_Type( Client ) == CLIENT_SERVER )) x[0] = 'r'; else ok = IRC_WriteStrClient( Origin, ERR_RESTRICTED_MSG, Client_ID( Origin )); break; - case 's': - /* Server messages */ - x[0] = 's'; - break; + default: Log( LOG_DEBUG, "Unknown mode \"%c%c\" from \"%s\"!?", set ? '+' : '-', *mode_ptr, Client_ID( Origin )); if( Client_Type( Client ) != CLIENT_SERVER ) ok = IRC_WriteStrClient( Origin, ERR_UMODEUNKNOWNFLAG2_MSG, Client_ID( Origin ), set ? '+' : '-', *mode_ptr ); @@ -215,7 +214,8 @@ client_exit: if( the_modes[1] ) { /* Remoce needless action modifier characters */ - if(( the_modes[strlen( the_modes ) - 1] == '+' ) || ( the_modes[strlen( the_modes ) - 1] == '-' )) the_modes[strlen( the_modes ) - 1] = '\0'; + len = strlen( the_modes ) - 1; + if(( the_modes[len] == '+' ) || ( the_modes[len] == '-' )) the_modes[len] = '\0'; if( Client_Type( Client ) == CLIENT_SERVER ) { @@ -236,16 +236,17 @@ client_exit: } /* Client_Mode */ -LOCAL BOOLEAN +LOCAL bool Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel ) { /* Handle channel and channel-user modes */ - CHAR the_modes[COMMAND_LEN], the_args[COMMAND_LEN], x[2], argadd[CLIENT_PASS_LEN], *mode_ptr; - BOOLEAN ok, set, modeok, skiponce; - INT mode_arg, arg_arg; + char the_modes[COMMAND_LEN], the_args[COMMAND_LEN], x[2], argadd[CLIENT_PASS_LEN], *mode_ptr; + bool ok, set, modeok = false, skiponce, use_servermode = false; + int mode_arg, arg_arg; CLIENT *client; - LONG l; + long l; + size_t len; /* Mode request: let's answer it :-) */ if( Req->argc == 1 ) @@ -256,7 +257,7 @@ Channel_Mode( CLIENT *Client, REQUEST *R /* The sender is a member: generate extended reply */ strlcpy( the_modes, Channel_Modes( Channel ), sizeof( the_modes )); mode_ptr = the_modes; - strcpy( the_args, "" ); + the_args[0] = '\0'; while( *mode_ptr ) { switch( *mode_ptr ) @@ -284,15 +285,17 @@ Channel_Mode( CLIENT *Client, REQUEST *R if( ! Channel_IsMemberOf( Channel, Origin )) return IRC_WriteStrClient( Origin, ERR_NOTONCHANNEL_MSG, Client_ID( Origin ), Channel_Name( Channel )); /* Is he channel operator? */ - if( strchr( Channel_UserModes( Channel, Origin ), 'o' )) modeok = TRUE; - else modeok = FALSE; - if( Conf_OperCanMode ) + if( strchr( Channel_UserModes( Channel, Origin ), 'o' )) modeok = true; + else if( Conf_OperCanMode ) { - /* auch IRC-Operatoren duerfen MODE verwenden */ - if( Client_OperByMe( Origin )) modeok = TRUE; + /* IRC-Operators can use MODE as well */ + if( Client_OperByMe( Origin )) { + modeok = true; + if ( Conf_OperServerMode ) use_servermode = true; /* Change Origin to Server */ + } } } - else modeok = TRUE; + else modeok = true; mode_arg = 1; mode_ptr = Req->argv[mode_arg]; @@ -300,10 +303,10 @@ Channel_Mode( CLIENT *Client, REQUEST *R else arg_arg = -1; /* Initial state: set or unset modes? */ - skiponce = FALSE; - if( *mode_ptr == '-' ) set = FALSE; - else if( *mode_ptr == '+' ) set = TRUE; - else set = skiponce = TRUE; + skiponce = false; + if( *mode_ptr == '-' ) set = false; + else if( *mode_ptr == '+' ) set = true; + else set = skiponce = true; /* Prepare reply string */ if( set ) strcpy( the_modes, "+" ); @@ -325,7 +328,7 @@ Channel_Mode( CLIENT *Client, REQUEST *R if( Req->argc > mode_arg + 1 ) arg_arg = mode_arg + 1; else arg_arg = -1; } - skiponce = FALSE; + skiponce = false; switch( *mode_ptr ) { @@ -334,10 +337,11 @@ Channel_Mode( CLIENT *Client, REQUEST *R if((( *mode_ptr == '+' ) && ( ! set )) || (( *mode_ptr == '-' ) && ( set ))) { /* Action modifier ("+"/"-") must be changed ... */ - if(( the_modes[strlen( the_modes ) - 1] == '+' ) || ( the_modes[strlen( the_modes ) - 1] == '-' )) + len = strlen( the_modes ) - 1; + if(( the_modes[len] == '+' ) || ( the_modes[len] == '-' )) { /* Adjust last action modifier in result */ - the_modes[strlen( the_modes ) - 1] = *mode_ptr; + the_modes[len] = *mode_ptr; } else { @@ -345,8 +349,8 @@ Channel_Mode( CLIENT *Client, REQUEST *R x[0] = *mode_ptr; strlcat( the_modes, x, sizeof( the_modes )); } - if( *mode_ptr == '+' ) set = TRUE; - else set = FALSE; + if( *mode_ptr == '+' ) set = true; + else set = false; } continue; } @@ -360,62 +364,18 @@ Channel_Mode( CLIENT *Client, REQUEST *R client = NULL; switch( *mode_ptr ) { - /* Channel modes */ - case 'i': - /* Invite-Only */ - if( modeok ) x[0] = 'i'; - else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel )); - break; - case 'm': - /* Moderated */ - if( modeok ) x[0] = 'm'; - else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel )); - break; - case 'n': - /* kein Schreiben in den Channel von aussen */ - if( modeok ) x[0] = 'n'; - else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel )); - break; - case 't': - /* Topic Lock */ - if( modeok ) x[0] = 't'; - else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel )); - break; - case 'P': - /* Persistent channel */ - if( modeok ) - { - if( set && ( ! Client_OperByMe( Client ))) - { - /* Only IRC operators are allowed to set P mode */ - ok = IRC_WriteStrClient( Origin, ERR_NOPRIVILEGES_MSG, Client_ID( Origin )); - } - else x[0] = 'P'; - } + /* --- Channel modes --- */ + + case 'i': /* Invite only */ + case 'm': /* Moderated */ + case 'n': /* Only members can write */ + case 's': /* Secret channel */ + case 't': /* Topic locked */ + if( modeok ) x[0] = *mode_ptr; else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel )); break; - /* Channel user modes */ - case 'o': - /* Channel operator */ - case 'v': - /* Voice */ - if( arg_arg > mode_arg ) - { - if( modeok ) - { - client = Client_Search( Req->argv[arg_arg] ); - if( client ) x[0] = *mode_ptr; - else ok = IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[arg_arg] ); - } - else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel )); - Req->argv[arg_arg][0] = '\0'; - arg_arg++; - } - else ok = IRC_WriteStrClient( Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID( Origin ), Req->command ); - break; - case 'k': - /* Channel key */ + case 'k': /* Channel key */ if( ! set ) { if( modeok ) x[0] = *mode_ptr; @@ -437,8 +397,8 @@ Channel_Mode( CLIENT *Client, REQUEST *R } else ok = IRC_WriteStrClient( Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID( Origin ), Req->command ); break; - case 'l': - /* Member limit */ + + case 'l': /* Member limit */ if( ! set ) { if( modeok ) x[0] = *mode_ptr; @@ -465,9 +425,41 @@ Channel_Mode( CLIENT *Client, REQUEST *R else ok = IRC_WriteStrClient( Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID( Origin ), Req->command ); break; - /* Channel lists */ - case 'I': - /* Invite lists */ + case 'P': /* Persistent channel */ + if( modeok ) + { + if( set && ( ! Client_OperByMe( Client ))) + { + /* Only IRC operators are allowed to set P mode */ + ok = IRC_WriteStrClient( Origin, ERR_NOPRIVILEGES_MSG, Client_ID( Origin )); + } + else x[0] = 'P'; + } + else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel )); + break; + + /* --- Channel user modes --- */ + + case 'o': /* Channel operator */ + case 'v': /* Voice */ + if( arg_arg > mode_arg ) + { + if( modeok ) + { + client = Client_Search( Req->argv[arg_arg] ); + if( client ) x[0] = *mode_ptr; + else ok = IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[arg_arg] ); + } + else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel )); + Req->argv[arg_arg][0] = '\0'; + arg_arg++; + } + else ok = IRC_WriteStrClient( Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID( Origin ), Req->command ); + break; + + /* --- Channel lists --- */ + + case 'I': /* Invite lists */ if( arg_arg > mode_arg ) { /* modify list */ @@ -482,8 +474,8 @@ Channel_Mode( CLIENT *Client, REQUEST *R } else Lists_ShowInvites( Origin, Channel ); break; - case 'b': - /* Ban lists */ + + case 'b': /* Ban lists */ if( arg_arg > mode_arg ) { /* modify list */ @@ -569,7 +561,8 @@ Channel_Mode( CLIENT *Client, REQUEST *R /* Are there additional arguments to add? */ if( argadd[0] ) { - if( the_args[strlen( the_args ) - 1] != ' ' ) strlcat( the_args, " ", sizeof( the_args )); + len = strlen( the_args ) - 1; + if( the_args[len] != ' ' ) strlcat( the_args, " ", sizeof( the_args )); strlcat( the_args, argadd, sizeof( the_args )); } } @@ -579,7 +572,8 @@ chan_exit: if( the_modes[1] ) { /* Clean up mode string */ - if(( the_modes[strlen( the_modes ) - 1] == '+' ) || ( the_modes[strlen( the_modes ) - 1] == '-' )) the_modes[strlen( the_modes ) - 1] = '\0'; + len = strlen( the_modes ) - 1; + if(( the_modes[len] == '+' ) || ( the_modes[len] == '-' )) the_modes[len] = '\0'; /* Clean up argument string if there are none */ if( ! the_args[1] ) the_args[0] = '\0'; @@ -588,14 +582,16 @@ chan_exit: { /* Forward mode changes to channel users and other servers */ IRC_WriteStrServersPrefix( Client, Origin, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args ); - IRC_WriteStrChannelPrefix( Client, Channel, Origin, FALSE, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args ); + IRC_WriteStrChannelPrefix( Client, Channel, Origin, false, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args ); } else { + if ( use_servermode ) Origin = Client_ThisServer(); + /* Send reply to client and inform other servers and channel users */ ok = IRC_WriteStrClientPrefix( Client, Origin, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args ); IRC_WriteStrServersPrefix( Client, Origin, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args ); - IRC_WriteStrChannelPrefix( Client, Channel, Origin, FALSE, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args ); + IRC_WriteStrChannelPrefix( Client, Channel, Origin, false, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args ); } } @@ -604,7 +600,7 @@ chan_exit: } /* Channel_Mode */ -GLOBAL BOOLEAN +GLOBAL bool IRC_AWAY( CLIENT *Client, REQUEST *Req ) { assert( Client != NULL ); @@ -631,11 +627,11 @@ IRC_AWAY( CLIENT *Client, REQUEST *Req ) } /* IRC_AWAY */ -LOCAL BOOLEAN -Add_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern ) +LOCAL bool +Add_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ) { - CHAR *mask; - BOOLEAN already; + char *mask; + bool already; assert( Client != NULL ); assert( Channel != NULL ); @@ -645,19 +641,19 @@ Add_Invite( CLIENT *Prefix, CLIENT *Clie already = Lists_IsInviteEntry( mask, Channel ); - if( ! Lists_AddInvited( mask, Channel, FALSE )) return CONNECTED; + if( ! Lists_AddInvited( mask, Channel, false )) return CONNECTED; - if(( Client_Type( Prefix ) == CLIENT_SERVER ) && ( already == TRUE )) return CONNECTED; + if(( Client_Type( Prefix ) == CLIENT_SERVER ) && ( already == true)) return CONNECTED; return Send_ListChange( "+I", Prefix, Client, Channel, mask ); } /* Add_Invite */ -LOCAL BOOLEAN -Add_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern ) +LOCAL bool +Add_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ) { - CHAR *mask; - BOOLEAN already; + char *mask; + bool already; assert( Client != NULL ); assert( Channel != NULL ); @@ -669,16 +665,16 @@ Add_Ban( CLIENT *Prefix, CLIENT *Client, if( ! Lists_AddBanned( mask, Channel )) return CONNECTED; - if(( Client_Type( Prefix ) == CLIENT_SERVER ) && ( already == TRUE )) return CONNECTED; + if(( Client_Type( Prefix ) == CLIENT_SERVER ) && ( already == true)) return CONNECTED; return Send_ListChange( "+b", Prefix, Client, Channel, mask ); } /* Add_Ban */ -LOCAL BOOLEAN -Del_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern ) +LOCAL bool +Del_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ) { - CHAR *mask; + char *mask; assert( Client != NULL ); assert( Channel != NULL ); @@ -690,10 +686,10 @@ Del_Invite( CLIENT *Prefix, CLIENT *Clie } /* Del_Invite */ -LOCAL BOOLEAN -Del_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern ) +LOCAL bool +Del_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ) { - CHAR *mask; + char *mask; assert( Client != NULL ); assert( Channel != NULL ); @@ -705,25 +701,25 @@ Del_Ban( CLIENT *Prefix, CLIENT *Client, } /* Del_Ban */ -LOCAL BOOLEAN -Send_ListChange( CHAR *Mode, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Mask ) +LOCAL bool +Send_ListChange( char *Mode, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Mask ) { /* Bestaetigung an Client schicken & andere Server sowie Channel-User informieren */ - BOOLEAN ok; + bool ok; if( Client_Type( Client ) == CLIENT_USER ) { /* Bestaetigung an Client */ ok = IRC_WriteStrClientPrefix( Client, Prefix, "MODE %s %s %s", Channel_Name( Channel ), Mode, Mask ); } - else ok = TRUE; + else ok = true; /* an andere Server */ IRC_WriteStrServersPrefix( Client, Prefix, "MODE %s %s %s", Channel_Name( Channel ), Mode, Mask ); /* und lokale User im Channel */ - IRC_WriteStrChannelPrefix( Client, Channel, Prefix, FALSE, "MODE %s %s %s", Channel_Name( Channel ), Mode, Mask ); + IRC_WriteStrChannelPrefix( Client, Channel, Prefix, false, "MODE %s %s %s", Channel_Name( Channel ), Mode, Mask ); return ok; } /* Send_ListChange */ Index: src/ngircd/irc-mode.h =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/irc-mode.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -p -r1.5 -r1.6 --- src/ngircd/irc-mode.h 12 Dec 2002 12:23:43 -0000 1.5 +++ src/ngircd/irc-mode.h 19 Mar 2005 18:43:48 -0000 1.6 @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: irc-mode.h,v 1.5 2002/12/12 12:23:43 alex Exp $ + * $Id: irc-mode.h,v 1.6 2005/03/19 18:43:48 fw Exp $ * * IRC commands for mode changes (header) */ @@ -18,8 +18,8 @@ #define __irc_mode_h__ -GLOBAL BOOLEAN IRC_MODE PARAMS((CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_AWAY PARAMS((CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_MODE PARAMS((CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_AWAY PARAMS((CLIENT *Client, REQUEST *Req )); #endif Index: src/ngircd/irc-op.c =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/irc-op.c,v retrieving revision 1.13 retrieving revision 1.15 diff -u -p -r1.13 -r1.15 --- src/ngircd/irc-op.c 9 Apr 2004 21:41:52 -0000 1.13 +++ src/ngircd/irc-op.c 27 Apr 2005 07:39:18 -0000 1.15 @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2003 by Alexander Barton (alex@barton.de) + * Copyright (c)2001-2005 by Alexander Barton (alex@barton.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -14,17 +14,17 @@ #include "portab.h" -static char UNUSED id[] = "$Id: irc-op.c,v 1.13 2004/04/09 21:41:52 alex Exp $"; +static char UNUSED id[] = "$Id: irc-op.c,v 1.15 2005/04/27 07:39:18 alex Exp $"; #include "imp.h" #include #include #include +#include "defines.h" #include "conn.h" #include "client.h" #include "channel.h" -#include "defines.h" #include "irc-write.h" #include "lists.h" #include "log.h" @@ -35,7 +35,7 @@ static char UNUSED id[] = "$Id: irc-op.c #include "irc-op.h" -GLOBAL BOOLEAN +GLOBAL bool IRC_KICK( CLIENT *Client, REQUEST *Req ) { CLIENT *target, *from; @@ -59,12 +59,12 @@ IRC_KICK( CLIENT *Client, REQUEST *Req ) } /* IRC_KICK */ -GLOBAL BOOLEAN +GLOBAL bool IRC_INVITE( CLIENT *Client, REQUEST *Req ) { CHANNEL *chan; CLIENT *target, *from; - BOOLEAN remember = FALSE; + bool remember = false; assert( Client != NULL ); assert( Req != NULL ); @@ -92,19 +92,19 @@ IRC_INVITE( CLIENT *Client, REQUEST *Req { /* Yes. The user must be channel operator! */ if( ! strchr( Channel_UserModes( chan, from ), 'o' )) return IRC_WriteStrClient( from, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( from ), Channel_Name( chan )); - remember = TRUE; + remember = true; } /* Is the target user already member of the channel? */ if( Channel_IsMemberOf( chan, target )) return IRC_WriteStrClient( from, ERR_USERONCHANNEL_MSG, Client_ID( from ), Req->argv[0], Req->argv[1] ); /* If the target user is banned on that channel: remember invite */ - if( Lists_CheckBanned( target, chan )) remember = TRUE; + if( Lists_CheckBanned( target, chan )) remember = true; if( remember ) { /* We must memember this invite */ - if( ! Lists_AddInvited( Client_Mask( target ), chan, TRUE )) return CONNECTED; + if( ! Lists_AddInvited( Client_Mask( target ), chan, true)) return CONNECTED; } } Index: src/ngircd/irc-op.h =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/irc-op.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -p -r1.3 -r1.4 --- src/ngircd/irc-op.h 12 Dec 2002 12:23:43 -0000 1.3 +++ src/ngircd/irc-op.h 19 Mar 2005 18:43:48 -0000 1.4 @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: irc-op.h,v 1.3 2002/12/12 12:23:43 alex Exp $ + * $Id: irc-op.h,v 1.4 2005/03/19 18:43:48 fw Exp $ * * Channel operator commands (header) */ @@ -18,8 +18,8 @@ #define __irc_op_h__ -GLOBAL BOOLEAN IRC_KICK PARAMS(( CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_INVITE PARAMS(( CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_KICK PARAMS(( CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_INVITE PARAMS(( CLIENT *Client, REQUEST *Req )); #endif Index: src/ngircd/irc-oper.c =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/irc-oper.c,v retrieving revision 1.17 retrieving revision 1.22 diff -u -p -r1.17 -r1.22 --- src/ngircd/irc-oper.c 31 Dec 2002 16:10:55 -0000 1.17 +++ src/ngircd/irc-oper.c 12 Jun 2005 18:02:09 -0000 1.22 @@ -14,7 +14,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: irc-oper.c,v 1.17 2002/12/31 16:10:55 alex Exp $"; +static char UNUSED id[] = "$Id: irc-oper.c,v 1.22 2005/06/12 18:02:09 fw Exp $"; #include "imp.h" #include @@ -29,6 +29,7 @@ static char UNUSED id[] = "$Id: irc-oper #include "channel.h" #include "irc-write.h" #include "log.h" +#include "match.h" #include "messages.h" #include "parse.h" @@ -36,10 +37,20 @@ static char UNUSED id[] = "$Id: irc-oper #include "irc-oper.h" -GLOBAL BOOLEAN +LOCAL bool +Bad_OperPass(CLIENT *Client, char *errtoken, char *errmsg) +{ + Log( LOG_WARNING, "Got invalid OPER from \"%s\": \"%s\" -- %s", Client_Mask( Client ), + errtoken, errmsg); + IRC_SetPenalty(Client, 3); + return IRC_WriteStrClient( Client, ERR_PASSWDMISMATCH_MSG, Client_ID( Client )); +} + + +GLOBAL bool IRC_OPER( CLIENT *Client, REQUEST *Req ) { - INT i; + int i; assert( Client != NULL ); assert( Req != NULL ); @@ -53,17 +64,15 @@ IRC_OPER( CLIENT *Client, REQUEST *Req ) if( Conf_Oper[i].name[0] && Conf_Oper[i].pwd[0] && ( strcmp( Conf_Oper[i].name, Req->argv[0] ) == 0 )) break; } if( i >= Conf_Oper_Count ) - { - Log( LOG_WARNING, "Got invalid OPER from \"%s\": Name \"%s\" not configured!", Client_Mask( Client ), Req->argv[0] ); - return IRC_WriteStrClient( Client, ERR_PASSWDMISMATCH_MSG, Client_ID( Client )); - } + return Bad_OperPass(Client, Req->argv[0], "not configured"); /* Stimmt das Passwort? */ if( strcmp( Conf_Oper[i].pwd, Req->argv[1] ) != 0 ) - { - Log( LOG_WARNING, "Got invalid OPER from \"%s\": Bad password for \"%s\"!", Client_Mask( Client ), Conf_Oper[i].name ); - return IRC_WriteStrClient( Client, ERR_PASSWDMISMATCH_MSG, Client_ID( Client )); - } + return Bad_OperPass(Client, Conf_Oper[i].name, "Bad password"); + + /* Authorized Mask? */ + if( Conf_Oper[i].mask && (! Match( Conf_Oper[i].mask, Client_Mask( Client ) ))) + return Bad_OperPass(Client, Conf_Oper[i].mask, "hostmask check failed" ); if( ! Client_HasMode( Client, 'o' )) { @@ -75,12 +84,12 @@ IRC_OPER( CLIENT *Client, REQUEST *Req ) if( ! Client_OperByMe( Client )) Log( LOG_NOTICE|LOG_snotice, "Got valid OPER from \"%s\", user is an IRC operator now.", Client_Mask( Client )); - Client_SetOperByMe( Client, TRUE ); + Client_SetOperByMe( Client, true); return IRC_WriteStrClient( Client, RPL_YOUREOPER_MSG, Client_ID( Client )); } /* IRC_OPER */ -GLOBAL BOOLEAN +GLOBAL bool IRC_DIE( CLIENT *Client, REQUEST *Req ) { /* Shut down server */ @@ -95,12 +104,12 @@ IRC_DIE( CLIENT *Client, REQUEST *Req ) if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); Log( LOG_NOTICE|LOG_snotice, "Got DIE command from \"%s\" ...", Client_Mask( Client )); - NGIRCd_SignalQuit = TRUE; + NGIRCd_SignalQuit = true; return CONNECTED; } /* IRC_DIE */ -GLOBAL BOOLEAN +GLOBAL bool IRC_REHASH( CLIENT *Client, REQUEST *Req ) { /* Reload configuration file */ @@ -115,13 +124,13 @@ IRC_REHASH( CLIENT *Client, REQUEST *Req if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); Log( LOG_NOTICE|LOG_snotice, "Got REHASH command from \"%s\" ...", Client_Mask( Client )); - NGIRCd_SignalRehash = TRUE; + NGIRCd_SignalRehash = true; return CONNECTED; } /* IRC_REHASH */ -GLOBAL BOOLEAN +GLOBAL bool IRC_RESTART( CLIENT *Client, REQUEST *Req ) { /* Restart IRC server (fork a new process) */ @@ -136,12 +145,12 @@ IRC_RESTART( CLIENT *Client, REQUEST *Re if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); Log( LOG_NOTICE|LOG_snotice, "Got RESTART command from \"%s\" ...", Client_Mask( Client )); - NGIRCd_SignalRestart = TRUE; + NGIRCd_SignalRestart = true; return CONNECTED; } /* IRC_RESTART */ -GLOBAL BOOLEAN +GLOBAL bool IRC_CONNECT(CLIENT *Client, REQUEST *Req ) { /* Connect configured or new server */ @@ -174,7 +183,7 @@ IRC_CONNECT(CLIENT *Client, REQUEST *Req } /* IRC_CONNECT */ -GLOBAL BOOLEAN +GLOBAL bool IRC_DISCONNECT(CLIENT *Client, REQUEST *Req ) { /* Disconnect and disable configured server */ Index: src/ngircd/irc-oper.h =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/irc-oper.h,v retrieving revision 1.10 retrieving revision 1.11 diff -u -p -r1.10 -r1.11 --- src/ngircd/irc-oper.h 31 Dec 2002 16:11:06 -0000 1.10 +++ src/ngircd/irc-oper.h 19 Mar 2005 18:43:48 -0000 1.11 @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: irc-oper.h,v 1.10 2002/12/31 16:11:06 alex Exp $ + * $Id: irc-oper.h,v 1.11 2005/03/19 18:43:48 fw Exp $ * * IRC operator commands (header) */ @@ -18,12 +18,12 @@ #define __irc_oper_h__ -GLOBAL BOOLEAN IRC_OPER PARAMS((CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_DIE PARAMS((CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_REHASH PARAMS((CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_RESTART PARAMS((CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_CONNECT PARAMS((CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_DISCONNECT PARAMS((CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_OPER PARAMS((CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_DIE PARAMS((CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_REHASH PARAMS((CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_RESTART PARAMS((CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_CONNECT PARAMS((CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_DISCONNECT PARAMS((CLIENT *Client, REQUEST *Req )); #endif Index: src/ngircd/irc-server.c =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/irc-server.c,v retrieving revision 1.36.2.1 retrieving revision 1.38 diff -u -p -r1.36.2.1 -r1.38 --- src/ngircd/irc-server.c 15 May 2004 23:52:17 -0000 1.36.2.1 +++ src/ngircd/irc-server.c 19 Mar 2005 18:43:49 -0000 1.38 @@ -14,7 +14,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: irc-server.c,v 1.36.2.1 2004/05/15 23:52:17 alex Exp $"; +static char UNUSED id[] = "$Id: irc-server.c,v 1.38 2005/03/19 18:43:49 fw Exp $"; #include "imp.h" #include @@ -41,15 +41,15 @@ static char UNUSED id[] = "$Id: irc-serv #include "irc-server.h" -GLOBAL BOOLEAN +GLOBAL bool IRC_SERVER( CLIENT *Client, REQUEST *Req ) { - CHAR str[LINE_LEN], *ptr, *modes, *topic; + char str[LINE_LEN], *ptr, *modes, *topic; CLIENT *from, *c, *cl; CL2CHAN *cl2chan; - INT max_hops, i; + int max_hops, i; CHANNEL *chan; - BOOLEAN ok; + bool ok; CONN_ID con; assert( Client != NULL ); @@ -72,14 +72,14 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req { /* Server ist nicht konfiguriert! */ Log( LOG_ERR, "Connection %d: Server \"%s\" not configured here!", Client_Conn( Client ), Req->argv[0] ); - Conn_Close( Client_Conn( Client ), NULL, "Server not configured here", TRUE ); + Conn_Close( Client_Conn( Client ), NULL, "Server not configured here", true); return DISCONNECTED; } if( strcmp( Client_Password( Client ), Conf_Server[i].pwd_in ) != 0 ) { /* Falsches Passwort */ Log( LOG_ERR, "Connection %d: Got bad password from server \"%s\"!", Client_Conn( Client ), Req->argv[0] ); - Conn_Close( Client_Conn( Client ), NULL, "Bad password", TRUE ); + Conn_Close( Client_Conn( Client ), NULL, "Bad password", true); return DISCONNECTED; } @@ -97,12 +97,12 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req if( Client_Token( Client ) != TOKEN_OUTBOUND ) { /* Eingehende Verbindung: Unseren SERVER- und PASS-Befehl senden */ - ok = TRUE; - if( ! IRC_WriteStrClient( Client, "PASS %s %s", Conf_Server[i].pwd_out, NGIRCd_ProtoID )) ok = FALSE; + ok = true; + if( ! IRC_WriteStrClient( Client, "PASS %s %s", Conf_Server[i].pwd_out, NGIRCd_ProtoID )) ok = false; else ok = IRC_WriteStrClient( Client, "SERVER %s 1 :%s", Conf_ServerName, Conf_ServerInfo ); if( ! ok ) { - Conn_Close( con, "Unexpected server behavior!", NULL, FALSE ); + Conn_Close( con, "Unexpected server behavior!", NULL, false ); return DISCONNECTED; } Client_SetIntroducer( Client, Client ); @@ -127,7 +127,7 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req if( ! Zip_InitConn( con )) { /* Fehler! */ - Conn_Close( con, "Can't inizialize compression (zlib)!", NULL, FALSE ); + Conn_Close( con, "Can't inizialize compression (zlib)!", NULL, false ); return DISCONNECTED; } } @@ -281,17 +281,17 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req { /* Hm, Server, der diesen einfuehrt, ist nicht bekannt!? */ Log( LOG_ALERT, "Unknown ID in prefix of SERVER: \"%s\"! (on connection %d)", Req->prefix, Client_Conn( Client )); - Conn_Close( Client_Conn( Client ), NULL, "Unknown ID in prefix of SERVER", TRUE ); + Conn_Close( Client_Conn( Client ), NULL, "Unknown ID in prefix of SERVER", true); return DISCONNECTED; } /* Neue Client-Struktur anlegen */ - c = Client_NewRemoteServer( Client, Req->argv[0], from, atoi( Req->argv[1] ), atoi( Req->argv[2] ), ptr, TRUE ); + c = Client_NewRemoteServer( Client, Req->argv[0], from, atoi( Req->argv[1] ), atoi( Req->argv[2] ), ptr, true); if( ! c ) { /* Neue Client-Struktur konnte nicht angelegt werden */ Log( LOG_ALERT, "Can't create client structure for server! (on connection %d)", Client_Conn( Client )); - Conn_Close( Client_Conn( Client ), NULL, "Can't allocate client structure for remote server", TRUE ); + Conn_Close( Client_Conn( Client ), NULL, "Can't allocate client structure for remote server", true); return DISCONNECTED; } @@ -309,11 +309,11 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req } /* IRC_SERVER */ -GLOBAL BOOLEAN +GLOBAL bool IRC_NJOIN( CLIENT *Client, REQUEST *Req ) { - CHAR nick_in[COMMAND_LEN], nick_out[COMMAND_LEN], *channame, *ptr, modes[8]; - BOOLEAN is_op, is_voiced; + char nick_in[COMMAND_LEN], nick_out[COMMAND_LEN], *channame, *ptr, modes[8]; + bool is_op, is_voiced; CHANNEL *chan; CLIENT *c; @@ -330,13 +330,13 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req ptr = strtok( nick_in, "," ); while( ptr ) { - is_op = is_voiced = FALSE; + is_op = is_voiced = false; /* Prefixe abschneiden */ while(( *ptr == '@' ) || ( *ptr == '+' )) { - if( *ptr == '@' ) is_op = TRUE; - if( *ptr == '+' ) is_voiced = TRUE; + if( *ptr == '@' ) is_op = true; + if( *ptr == '+' ) is_voiced = true; ptr++; } @@ -351,14 +351,14 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req if( is_voiced ) Channel_UserModeAdd( chan, c, 'v' ); /* im Channel bekannt machen */ - IRC_WriteStrChannelPrefix( Client, chan, c, FALSE, "JOIN :%s", channame ); + IRC_WriteStrChannelPrefix( Client, chan, c, false, "JOIN :%s", channame ); /* Channel-User-Modes setzen */ strlcpy( modes, Channel_UserModes( chan, c ), sizeof( modes )); if( modes[0] ) { /* Modes im Channel bekannt machen */ - IRC_WriteStrChannelPrefix( Client, chan, Client, FALSE, "MODE %s +%s %s", channame, modes, Client_ID( c )); + IRC_WriteStrChannelPrefix( Client, chan, Client, false, "MODE %s +%s %s", channame, modes, Client_ID( c )); } if( nick_out[0] != '\0' ) strlcat( nick_out, ",", sizeof( nick_out )); @@ -379,11 +379,11 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req } /* IRC_NJOIN */ -GLOBAL BOOLEAN +GLOBAL bool IRC_SQUIT( CLIENT *Client, REQUEST *Req ) { CLIENT *target; - CHAR msg[LINE_LEN + 64]; + char msg[LINE_LEN + 64]; assert( Client != NULL ); assert( Req != NULL ); @@ -411,14 +411,14 @@ IRC_SQUIT( CLIENT *Client, REQUEST *Req if( Client_Conn( target ) > NONE ) { /* dieser Server hat die Connection */ - if( Req->argv[1][0] ) Conn_Close( Client_Conn( target ), msg, Req->argv[1], TRUE ); - else Conn_Close( Client_Conn( target ), msg, NULL, TRUE ); + if( Req->argv[1][0] ) Conn_Close( Client_Conn( target ), msg, Req->argv[1], true); + else Conn_Close( Client_Conn( target ), msg, NULL, true); return DISCONNECTED; } else { /* Verbindung hielt anderer Server */ - Client_Destroy( target, msg, Req->argv[1], FALSE ); + Client_Destroy( target, msg, Req->argv[1], false ); return CONNECTED; } } /* IRC_SQUIT */ Index: src/ngircd/irc-server.h =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/irc-server.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -p -r1.4 -r1.5 --- src/ngircd/irc-server.h 12 Dec 2002 12:23:43 -0000 1.4 +++ src/ngircd/irc-server.h 19 Mar 2005 18:43:49 -0000 1.5 @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: irc-server.h,v 1.4 2002/12/12 12:23:43 alex Exp $ + * $Id: irc-server.h,v 1.5 2005/03/19 18:43:49 fw Exp $ * * IRC commands for server links (header) */ @@ -18,9 +18,9 @@ #define __irc_server_h__ -GLOBAL BOOLEAN IRC_SERVER PARAMS((CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_NJOIN PARAMS((CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_SQUIT PARAMS((CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_SERVER PARAMS((CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_NJOIN PARAMS((CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_SQUIT PARAMS((CLIENT *Client, REQUEST *Req )); #endif Index: src/ngircd/irc-write.c =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/irc-write.c,v retrieving revision 1.15 retrieving revision 1.18 diff -u -p -r1.15 -r1.18 --- src/ngircd/irc-write.c 5 Nov 2003 23:24:48 -0000 1.15 +++ src/ngircd/irc-write.c 27 Apr 2005 07:39:18 -0000 1.18 @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de) + * Copyright (c)2001-2005 by Alexander Barton (alex@barton.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -14,18 +14,22 @@ #include "portab.h" -static char UNUSED id[] = "$Id: irc-write.c,v 1.15 2003/11/05 23:24:48 alex Exp $"; +static char UNUSED id[] = "$Id: irc-write.c,v 1.18 2005/04/27 07:39:18 alex Exp $"; #include "imp.h" #include -#include +#ifdef PROTOTYPES +# include +#else +# include +#endif #include #include +#include "defines.h" #include "conn-func.h" #include "client.h" #include "channel.h" -#include "defines.h" #include "exp.h" #include "irc-write.h" @@ -35,22 +39,22 @@ static char UNUSED id[] = "$Id: irc-writ #define SEND_TO_SERVER 2 -LOCAL CHAR *Get_Prefix PARAMS(( CLIENT *Target, CLIENT *Client )); +LOCAL char *Get_Prefix PARAMS(( CLIENT *Target, CLIENT *Client )); #ifdef PROTOTYPES -GLOBAL BOOLEAN -IRC_WriteStrClient( CLIENT *Client, CHAR *Format, ... ) +GLOBAL bool +IRC_WriteStrClient( CLIENT *Client, char *Format, ... ) #else -GLOBAL BOOLEAN +GLOBAL bool IRC_WriteStrClient( Client, Format, va_alist ) CLIENT *Client; -CHAR *Format; +char *Format; va_dcl #endif { - CHAR buffer[1000]; - BOOLEAN ok = CONNECTED; + char buffer[1000]; + bool ok = CONNECTED; va_list ap; assert( Client != NULL ); @@ -72,20 +76,20 @@ va_dcl #ifdef PROTOTYPES -GLOBAL BOOLEAN -IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, CHAR *Format, ... ) +GLOBAL bool +IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, char *Format, ... ) #else -GLOBAL BOOLEAN +GLOBAL bool IRC_WriteStrClientPrefix( Client, Prefix, Format, va_alist ) CLIENT *Client; CLIENT *Prefix; -CHAR *Format; +char *Format; va_dcl #endif { /* Text an Clients, lokal bzw. remote, senden. */ - CHAR buffer[1000]; + char buffer[1000]; va_list ap; assert( Client != NULL ); @@ -105,19 +109,19 @@ va_dcl #ifdef PROTOTYPES -GLOBAL BOOLEAN -IRC_WriteStrChannel( CLIENT *Client, CHANNEL *Chan, BOOLEAN Remote, CHAR *Format, ... ) +GLOBAL bool +IRC_WriteStrChannel( CLIENT *Client, CHANNEL *Chan, bool Remote, char *Format, ... ) #else -GLOBAL BOOLEAN +GLOBAL bool IRC_WriteStrChannel( Client, Chan, Remote, Format, va_alist ) CLIENT *Client; CHANNEL *Chan; -BOOLEAN Remote; -CHAR *Format; +bool Remote; +char *Format; va_dcl #endif { - CHAR buffer[1000]; + char buffer[1000]; va_list ap; assert( Client != NULL ); @@ -136,21 +140,21 @@ va_dcl #ifdef PROTOTYPES -GLOBAL BOOLEAN -IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... ) +GLOBAL bool +IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, bool Remote, char *Format, ... ) #else -GLOBAL BOOLEAN +GLOBAL bool IRC_WriteStrChannelPrefix( Client, Chan, Prefix, Remote, Format, va_alist ) CLIENT *Client; CHANNEL *Chan; CLIENT *Prefix; -BOOLEAN Remote; -CHAR *Format; +bool Remote; +char *Format; va_dcl #endif { - BOOLEAN ok = CONNECTED; - CHAR buffer[1000]; + bool ok = CONNECTED; + char buffer[1000]; CL2CHAN *cl2chan; CONN_ID conn; CLIENT *c; @@ -212,17 +216,17 @@ va_dcl #ifdef PROTOTYPES -GLOBAL VOID -IRC_WriteStrServers( CLIENT *ExceptOf, CHAR *Format, ... ) +GLOBAL void +IRC_WriteStrServers( CLIENT *ExceptOf, char *Format, ... ) #else -GLOBAL VOID +GLOBAL void IRC_WriteStrServers( ExceptOf, Format, va_alist ) CLIENT *ExceptOf; -CHAR *Format; +char *Format; va_dcl #endif { - CHAR buffer[1000]; + char buffer[1000]; va_list ap; assert( Format != NULL ); @@ -241,18 +245,18 @@ va_dcl #ifdef PROTOTYPES -GLOBAL VOID -IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *Format, ... ) +GLOBAL void +IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, char *Format, ... ) #else -GLOBAL VOID +GLOBAL void IRC_WriteStrServersPrefix( ExceptOf, Prefix, Format, va_alist ) CLIENT *ExceptOf; CLIENT *Prefix; -CHAR *Format; +char *Format; va_dcl #endif { - CHAR buffer[1000]; + char buffer[1000]; va_list ap; assert( Format != NULL ); @@ -271,19 +275,19 @@ va_dcl #ifdef PROTOTYPES -GLOBAL VOID -IRC_WriteStrServersPrefixFlag( CLIENT *ExceptOf, CLIENT *Prefix, CHAR Flag, CHAR *Format, ... ) +GLOBAL void +IRC_WriteStrServersPrefixFlag( CLIENT *ExceptOf, CLIENT *Prefix, char Flag, char *Format, ... ) #else -GLOBAL VOID +GLOBAL void IRC_WriteStrServersPrefixFlag( ExceptOf, Prefix, Flag, Format, va_alist ) CLIENT *ExceptOf; CLIENT *Prefix; -CHAR Flag; -CHAR *Format; +char Flag; +char *Format; va_dcl #endif { - CHAR buffer[1000]; + char buffer[1000]; CLIENT *c; va_list ap; @@ -312,21 +316,21 @@ va_dcl #ifdef PROTOTYPES -GLOBAL BOOLEAN -IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... ) +GLOBAL bool +IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, bool Remote, char *Format, ... ) #else -GLOBAL BOOLEAN +GLOBAL bool IRC_WriteStrRelatedPrefix( Client, Prefix, Remote, Format, va_alist ) CLIENT *Client; CLIENT *Prefix; -BOOLEAN Remote; -CHAR *Format; +bool Remote; +char *Format; va_dcl #endif { - BOOLEAN ok = CONNECTED; + bool ok = CONNECTED; CL2CHAN *chan_cl2chan, *cl2chan; - CHAR buffer[1000]; + char buffer[1000]; CHANNEL *chan; CONN_ID conn; va_list ap; @@ -395,8 +399,8 @@ va_dcl } /* IRC_WriteStrRelatedPrefix */ -GLOBAL VOID -IRC_SetPenalty( CLIENT *Client, INT Seconds ) +GLOBAL void +IRC_SetPenalty( CLIENT *Client, int Seconds ) { CONN_ID c; @@ -410,7 +414,7 @@ IRC_SetPenalty( CLIENT *Client, INT Seco } /* IRC_SetPenalty */ -LOCAL CHAR * +LOCAL char * Get_Prefix( CLIENT *Target, CLIENT *Client ) { assert( Target != NULL ); Index: src/ngircd/irc-write.h =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/irc-write.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -p -r1.6 -r1.7 --- src/ngircd/irc-write.h 5 Nov 2003 23:24:48 -0000 1.6 +++ src/ngircd/irc-write.h 19 Mar 2005 18:43:49 -0000 1.7 @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: irc-write.h,v 1.6 2003/11/05 23:24:48 alex Exp $ + * $Id: irc-write.h,v 1.7 2005/03/19 18:43:49 fw Exp $ * * Sending IRC commands over the network (header) */ @@ -18,19 +18,19 @@ #define __irc_write_h__ -GLOBAL BOOLEAN IRC_WriteStrClient PARAMS(( CLIENT *Client, CHAR *Format, ... )); -GLOBAL BOOLEAN IRC_WriteStrClientPrefix PARAMS(( CLIENT *Client, CLIENT *Prefix, CHAR *Format, ... )); +GLOBAL bool IRC_WriteStrClient PARAMS(( CLIENT *Client, char *Format, ... )); +GLOBAL bool IRC_WriteStrClientPrefix PARAMS(( CLIENT *Client, CLIENT *Prefix, char *Format, ... )); -GLOBAL BOOLEAN IRC_WriteStrChannel PARAMS(( CLIENT *Client, CHANNEL *Chan, BOOLEAN Remote, CHAR *Format, ... )); -GLOBAL BOOLEAN IRC_WriteStrChannelPrefix PARAMS(( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )); +GLOBAL bool IRC_WriteStrChannel PARAMS(( CLIENT *Client, CHANNEL *Chan, bool Remote, char *Format, ... )); +GLOBAL bool IRC_WriteStrChannelPrefix PARAMS(( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, bool Remote, char *Format, ... )); -GLOBAL VOID IRC_WriteStrServers PARAMS(( CLIENT *ExceptOf, CHAR *Format, ... )); -GLOBAL VOID IRC_WriteStrServersPrefix PARAMS(( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *Format, ... )); -GLOBAL VOID IRC_WriteStrServersPrefixFlag PARAMS(( CLIENT *ExceptOf, CLIENT *Prefix, CHAR Flag, CHAR *Format, ... )); +GLOBAL void IRC_WriteStrServers PARAMS(( CLIENT *ExceptOf, char *Format, ... )); +GLOBAL void IRC_WriteStrServersPrefix PARAMS(( CLIENT *ExceptOf, CLIENT *Prefix, char *Format, ... )); +GLOBAL void IRC_WriteStrServersPrefixFlag PARAMS(( CLIENT *ExceptOf, CLIENT *Prefix, char Flag, char *Format, ... )); -GLOBAL BOOLEAN IRC_WriteStrRelatedPrefix PARAMS(( CLIENT *Client, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )); +GLOBAL bool IRC_WriteStrRelatedPrefix PARAMS(( CLIENT *Client, CLIENT *Prefix, bool Remote, char *Format, ... )); -GLOBAL VOID IRC_SetPenalty PARAMS(( CLIENT *Client, INT Seconds )); +GLOBAL void IRC_SetPenalty PARAMS(( CLIENT *Client, int Seconds )); #endif Index: src/ngircd/irc.c =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/irc.c,v retrieving revision 1.124 retrieving revision 1.126 diff -u -p -r1.124 -r1.126 --- src/ngircd/irc.c 28 Feb 2004 02:18:16 -0000 1.124 +++ src/ngircd/irc.c 18 Apr 2005 15:44:39 -0000 1.126 @@ -14,7 +14,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: irc.c,v 1.124 2004/02/28 02:18:16 alex Exp $"; +static char UNUSED id[] = "$Id: irc.c,v 1.126 2005/04/18 15:44:39 alex Exp $"; #include "imp.h" #include @@ -38,10 +38,10 @@ static char UNUSED id[] = "$Id: irc.c,v #include "irc.h" -LOCAL CHAR *Option_String PARAMS(( CONN_ID Idx )); +LOCAL char *Option_String PARAMS(( CONN_ID Idx )); -GLOBAL BOOLEAN +GLOBAL bool IRC_ERROR( CLIENT *Client, REQUEST *Req ) { assert( Client != NULL ); @@ -54,88 +54,120 @@ IRC_ERROR( CLIENT *Client, REQUEST *Req } /* IRC_ERROR */ -GLOBAL BOOLEAN +/** + * Kill client on request. + * This function implements the IRC command "KILL" wich is used to selectively + * disconnect clients. It can be used by IRC operators and servers, for example + * to "solve" nick collisions after netsplits. + * Please note that this function is also called internally, without a real + * KILL command beeing received over the network! Client is Client_ThisServer() + * in this case. */ +GLOBAL bool IRC_KILL( CLIENT *Client, REQUEST *Req ) { CLIENT *prefix, *c; - CHAR reason[COMMAND_LEN]; + char reason[COMMAND_LEN], *msg; CONN_ID my_conn, conn; assert( Client != NULL ); assert( Req != NULL ); - /* Is the user an IRC operator? */ - if(( Client_Type( Client ) != CLIENT_SERVER ) && ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client )); + if(( Client_Type( Client ) != CLIENT_SERVER ) && + ( ! Client_OperByMe( Client ))) + { + /* The originator of the KILL is neither an IRC operator of + * this server nor a server. */ + return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, + Client_ID( Client )); + } - /* Bad number of parameters? */ - if(( Req->argc != 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); + if( Req->argc != 2 ) + { + /* This command requires exactly 2 parameters! */ + return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, + Client_ID( Client ), Req->command ); + } if( Req->prefix ) prefix = Client_Search( Req->prefix ); else prefix = Client; if( ! prefix ) { - Log( LOG_WARNING, "Got KILL with invalid prefix: \"%s\"!", Req->prefix ); + Log( LOG_WARNING, "Got KILL with invalid prefix: \"%s\"!", + Req->prefix ); prefix = Client_ThisServer( ); } - if( Client != Client_ThisServer( )) Log( LOG_NOTICE|LOG_snotice, "Got KILL command from \"%s\" for \"%s\": %s", Client_Mask( prefix ), Req->argv[0], Req->argv[1] ); + if( Client != Client_ThisServer( )) + { + /* This is a "real" KILL received from the network. */ + Log( LOG_NOTICE|LOG_snotice, "Got KILL command from \"%s\" for \"%s\": %s", + Client_Mask( prefix ), Req->argv[0], Req->argv[1] ); + } /* Build reason string */ - if( Client_Type( Client ) == CLIENT_USER ) snprintf( reason, sizeof( reason ), "KILLed by %s: %s", Client_ID( Client ), Req->argv[1] ); - else strlcpy( reason, Req->argv[1], sizeof( reason )); + if( Client_Type( Client ) == CLIENT_USER ) + { + /* Prefix the "reason" if the originator is a regular user, + * so users can't spoof KILLs of servers. */ + snprintf( reason, sizeof( reason ), "KILLed by %s: %s", + Client_ID( Client ), Req->argv[1] ); + } + else + strlcpy( reason, Req->argv[1], sizeof( reason )); /* Inform other servers */ - IRC_WriteStrServersPrefix( Client, prefix, "KILL %s :%s", Req->argv[0], reason ); + IRC_WriteStrServersPrefix( Client, prefix, "KILL %s :%s", + Req->argv[0], reason ); /* Save ID of this connection */ my_conn = Client_Conn( Client ); - + /* Do we host such a client? */ c = Client_Search( Req->argv[0] ); if( c ) { - /* Yes, there is such a client -- but is it a valid user? */ - if( Client_Type( c ) == CLIENT_SERVER ) + if(( Client_Type( c ) != CLIENT_USER ) && + ( Client_Type( c ) != CLIENT_GOTNICK )) { - if( Client != Client_ThisServer( )) IRC_WriteStrClient( Client, ERR_CANTKILLSERVER_MSG, Client_ID( Client )); - else - { - /* Oops, I should kill another server!? */ - Log( LOG_ERR, "Can't KILL server \"%s\"!", Req->argv[0] ); - conn = Client_Conn( Client_NextHop( c )); - assert( conn > NONE ); - Conn_Close( conn, NULL, "Nick collision for server!?", TRUE ); - } - } - else if( Client_Type( c ) != CLIENT_USER ) - { - if( Client != Client_ThisServer( )) IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client )); - else + /* Target of this KILL is not a regular user, this is + * invalid! So we ignore this case if we received a + * regular KILL from the network and try to kill the + * client/connection anyway (but log an error!) if the + * origin is the local server. */ + + if( Client != Client_ThisServer( )) { - /* Oops, what sould I close?? */ - Log( LOG_ERR, "Can't KILL \"%s\": invalid client type!", Req->argv[0] ); - conn = Client_Conn( Client_NextHop( c )); - assert( conn > NONE ); - Conn_Close( conn, NULL, "Collision for invalid client type!?", TRUE ); + /* Invalid KILL received from remote */ + if( Client_Type( c ) == CLIENT_SERVER ) + msg = ERR_CANTKILLSERVER_MSG; + else + msg = ERR_NOPRIVILEGES_MSG; + return IRC_WriteStrClient( Client, msg, + Client_ID( Client )); } + + Log( LOG_ERR, "Got KILL for invalid client type: %d, \"%s\"!", + Client_Type( c ), Req->argv[0] ); } - else - { - /* Kill user NOW! */ - conn = Client_Conn( c ); - Client_Destroy( c, NULL, reason, FALSE ); - if( conn != NONE ) Conn_Close( conn, NULL, reason, TRUE ); - } + + /* Kill client NOW! */ + conn = Client_Conn( Client_NextHop( c )); + Client_Destroy( c, NULL, reason, false ); + if( conn > NONE ) + Conn_Close( conn, NULL, reason, true ); } - else Log( LOG_NOTICE, "Client with nick \"%s\" is unknown here.", Req->argv[0] ); + else + Log( LOG_NOTICE, "Client with nick \"%s\" is unknown here.", Req->argv[0] ); /* Are we still connected or were we killed, too? */ - if(( my_conn > NONE ) && ( Client_GetFromConn( my_conn ))) return CONNECTED; - else return DISCONNECTED; + if(( my_conn > NONE ) && ( Client_GetFromConn( my_conn ))) + return CONNECTED; + else + return DISCONNECTED; } /* IRC_KILL */ -GLOBAL BOOLEAN +GLOBAL bool IRC_NOTICE( CLIENT *Client, REQUEST *Req ) { CLIENT *to, *from; @@ -162,7 +194,7 @@ IRC_NOTICE( CLIENT *Client, REQUEST *Req } /* IRC_NOTICE */ -GLOBAL BOOLEAN +GLOBAL bool IRC_PRIVMSG( CLIENT *Client, REQUEST *Req ) { CLIENT *cl, *from; @@ -205,12 +237,12 @@ IRC_PRIVMSG( CLIENT *Client, REQUEST *Re } /* IRC_PRIVMSG */ -GLOBAL BOOLEAN +GLOBAL bool IRC_TRACE( CLIENT *Client, REQUEST *Req ) { CLIENT *from, *target, *c; CONN_ID idx, idx2; - CHAR user[CLIENT_USER_LEN]; + char user[CLIENT_USER_LEN]; assert( Client != NULL ); assert( Req != NULL ); @@ -270,7 +302,7 @@ IRC_TRACE( CLIENT *Client, REQUEST *Req } /* IRC_TRACE */ -GLOBAL BOOLEAN +GLOBAL bool IRC_HELP( CLIENT *Client, REQUEST *Req ) { COMMAND *cmd; @@ -293,11 +325,11 @@ IRC_HELP( CLIENT *Client, REQUEST *Req ) } /* IRC_HELP */ -LOCAL CHAR * +LOCAL char * Option_String( CONN_ID Idx ) { - STATIC CHAR option_txt[8]; - INT options; + static char option_txt[8]; + int options; options = Conn_Options( Idx ); Index: src/ngircd/irc.h =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/irc.h,v retrieving revision 1.38 retrieving revision 1.39 diff -u -p -r1.38 -r1.39 --- src/ngircd/irc.h 15 Jan 2003 13:49:20 -0000 1.38 +++ src/ngircd/irc.h 19 Mar 2005 18:43:49 -0000 1.39 @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: irc.h,v 1.38 2003/01/15 13:49:20 alex Exp $ + * $Id: irc.h,v 1.39 2005/03/19 18:43:49 fw Exp $ * * IRC commands (header) */ @@ -18,12 +18,12 @@ #define __irc_h__ -GLOBAL BOOLEAN IRC_ERROR PARAMS(( CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_KILL PARAMS(( CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_NOTICE PARAMS(( CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_PRIVMSG PARAMS(( CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_TRACE PARAMS(( CLIENT *Client, REQUEST *Req )); -GLOBAL BOOLEAN IRC_HELP PARAMS(( CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_ERROR PARAMS(( CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_KILL PARAMS(( CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_NOTICE PARAMS(( CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_PRIVMSG PARAMS(( CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_TRACE PARAMS(( CLIENT *Client, REQUEST *Req )); +GLOBAL bool IRC_HELP PARAMS(( CLIENT *Client, REQUEST *Req )); #endif Index: src/ngircd/lists.c =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/lists.c,v retrieving revision 1.15.2.1 retrieving revision 1.17 diff -u -p -r1.15.2.1 -r1.17 --- src/ngircd/lists.c 26 Jan 2005 13:27:01 -0000 1.15.2.1 +++ src/ngircd/lists.c 19 Mar 2005 18:43:49 -0000 1.17 @@ -14,7 +14,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: lists.c,v 1.15.2.1 2005/01/26 13:27:01 alex Exp $"; +static char UNUSED id[] = "$Id: lists.c,v 1.17 2005/03/19 18:43:49 fw Exp $"; #include "imp.h" #include @@ -42,24 +42,24 @@ static char UNUSED id[] = "$Id: lists.c, typedef struct _C2C { struct _C2C *next; - CHAR mask[MASK_LEN]; + char mask[MASK_LEN]; CHANNEL *channel; - BOOLEAN onlyonce; + bool onlyonce; } C2C; LOCAL C2C *My_Invites, *My_Bans; -LOCAL C2C *New_C2C PARAMS(( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce )); +LOCAL C2C *New_C2C PARAMS(( char *Mask, CHANNEL *Chan, bool OnlyOnce )); -LOCAL BOOLEAN Check_List PARAMS(( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan )); -LOCAL BOOLEAN Already_Registered PARAMS(( C2C *Cl2Chan, CHAR *Mask, CHANNEL *Chan )); +LOCAL bool Check_List PARAMS(( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan )); +LOCAL bool Already_Registered PARAMS(( C2C *Cl2Chan, char *Mask, CHANNEL *Chan )); -GLOBAL VOID -Lists_Init( VOID ) +GLOBAL void +Lists_Init( void ) { /* Modul initialisieren */ @@ -67,8 +67,8 @@ Lists_Init( VOID ) } /* Lists_Init */ -GLOBAL VOID -Lists_Exit( VOID ) +GLOBAL void +Lists_Exit( void ) { /* Modul abmelden */ @@ -94,15 +94,15 @@ Lists_Exit( VOID ) } /* Lists_Exit */ -GLOBAL BOOLEAN +GLOBAL bool Lists_CheckInvited( CLIENT *Client, CHANNEL *Chan ) { return Check_List( &My_Invites, Client, Chan ); } /* Lists_CheckInvited */ -GLOBAL BOOLEAN -Lists_IsInviteEntry( CHAR *Mask, CHANNEL *Chan ) +GLOBAL bool +Lists_IsInviteEntry( char *Mask, CHANNEL *Chan ) { assert( Mask != NULL ); assert( Chan != NULL ); @@ -111,21 +111,21 @@ Lists_IsInviteEntry( CHAR *Mask, CHANNEL } /* Lists_IsInviteEntry */ -GLOBAL BOOLEAN -Lists_AddInvited( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce ) +GLOBAL bool +Lists_AddInvited( char *Mask, CHANNEL *Chan, bool OnlyOnce ) { C2C *c2c; assert( Mask != NULL ); assert( Chan != NULL ); - if( Already_Registered( My_Invites, Mask, Chan )) return TRUE; + if( Already_Registered( My_Invites, Mask, Chan )) return true; c2c = New_C2C( Mask, Chan, OnlyOnce ); if( ! c2c ) { Log( LOG_ERR, "Can't add new invite list entry!" ); - return FALSE; + return false; } /* verketten */ @@ -133,12 +133,12 @@ Lists_AddInvited( CHAR *Mask, CHANNEL *C My_Invites = c2c; Log( LOG_DEBUG, "Added \"%s\" to invite list for \"%s\".", Mask, Channel_Name( Chan )); - return TRUE; + return true; } /* Lists_AddInvited */ -GLOBAL VOID -Lists_DelInvited( CHAR *Mask, CHANNEL *Chan ) +GLOBAL void +Lists_DelInvited( char *Mask, CHANNEL *Chan ) { C2C *c2c, *last, *next; @@ -164,7 +164,7 @@ Lists_DelInvited( CHAR *Mask, CHANNEL *C } /* Lists_DelInvited */ -GLOBAL BOOLEAN +GLOBAL bool Lists_ShowInvites( CLIENT *Client, CHANNEL *Channel ) { C2C *c2c; @@ -186,7 +186,7 @@ Lists_ShowInvites( CLIENT *Client, CHANN } /* Lists_ShowInvites */ -GLOBAL BOOLEAN +GLOBAL bool Lists_SendInvites( CLIENT *Client ) { C2C *c2c; @@ -203,7 +203,7 @@ Lists_SendInvites( CLIENT *Client ) } /* Lists_SendInvites */ -GLOBAL BOOLEAN +GLOBAL bool Lists_SendBans( CLIENT *Client ) { C2C *c2c; @@ -220,15 +220,15 @@ Lists_SendBans( CLIENT *Client ) } /* Lists_SendBans */ -GLOBAL BOOLEAN +GLOBAL bool Lists_CheckBanned( CLIENT *Client, CHANNEL *Chan ) { return Check_List( &My_Bans, Client, Chan ); } /* Lists_CheckBanned */ -GLOBAL BOOLEAN -Lists_IsBanEntry( CHAR *Mask, CHANNEL *Chan ) +GLOBAL bool +Lists_IsBanEntry( char *Mask, CHANNEL *Chan ) { assert( Mask != NULL ); assert( Chan != NULL ); @@ -237,21 +237,21 @@ Lists_IsBanEntry( CHAR *Mask, CHANNEL *C } /* Lists_IsBanEntry */ -GLOBAL BOOLEAN -Lists_AddBanned( CHAR *Mask, CHANNEL *Chan ) +GLOBAL bool +Lists_AddBanned( char *Mask, CHANNEL *Chan ) { C2C *c2c; assert( Mask != NULL ); assert( Chan != NULL ); - if( Already_Registered( My_Bans, Mask, Chan )) return TRUE; + if( Already_Registered( My_Bans, Mask, Chan )) return true; - c2c = New_C2C( Mask, Chan, FALSE ); + c2c = New_C2C( Mask, Chan, false ); if( ! c2c ) { Log( LOG_ERR, "Can't add new ban list entry!" ); - return FALSE; + return false; } /* verketten */ @@ -259,12 +259,12 @@ Lists_AddBanned( CHAR *Mask, CHANNEL *Ch My_Bans = c2c; Log( LOG_DEBUG, "Added \"%s\" to ban list for \"%s\".", Mask, Channel_Name( Chan )); - return TRUE; + return true; } /* Lists_AddBanned */ -GLOBAL VOID -Lists_DelBanned( CHAR *Mask, CHANNEL *Chan ) +GLOBAL void +Lists_DelBanned( char *Mask, CHANNEL *Chan ) { C2C *c2c, *last, *next; @@ -290,7 +290,7 @@ Lists_DelBanned( CHAR *Mask, CHANNEL *Ch } /* Lists_DelBanned */ -GLOBAL BOOLEAN +GLOBAL bool Lists_ShowBans( CLIENT *Client, CHANNEL *Channel ) { C2C *c2c; @@ -312,7 +312,7 @@ Lists_ShowBans( CLIENT *Client, CHANNEL } /* Lists_ShowBans */ -GLOBAL VOID +GLOBAL void Lists_DeleteChannel( CHANNEL *Chan ) { /* Channel wurde geloescht, Invite- und Ban-Lists aufraeumen */ @@ -357,16 +357,16 @@ Lists_DeleteChannel( CHANNEL *Chan ) } /* Lists_DeleteChannel */ -GLOBAL CHAR * -Lists_MakeMask( CHAR *Pattern ) +GLOBAL char * +Lists_MakeMask( char *Pattern ) { /* This function generats a valid IRC mask of "any" string. This * mask is only valid until the next call to Lists_MakeMask(), * because a single global buffer is used. You have to copy the * generated mask to some sane location yourself! */ - STATIC CHAR TheMask[MASK_LEN]; - CHAR *excl, *at; + static char TheMask[MASK_LEN]; + char *excl, *at; assert( Pattern != NULL ); @@ -408,7 +408,7 @@ Lists_MakeMask( CHAR *Pattern ) LOCAL C2C * -New_C2C( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce ) +New_C2C( char *Mask, CHANNEL *Chan, bool OnlyOnce ) { C2C *c2c; @@ -431,7 +431,7 @@ New_C2C( CHAR *Mask, CHANNEL *Chan, BOOL } /* New_C2C */ -LOCAL BOOLEAN +LOCAL bool Check_List( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan ) { C2C *c2c, *last; @@ -459,29 +459,29 @@ Check_List( C2C **Cl2Chan, CLIENT *Clien else *Cl2Chan = c2c->next; free( c2c ); } - return TRUE; + return true; } } last = c2c; c2c = c2c->next; } - return FALSE; + return false; } /* Check_List */ -LOCAL BOOLEAN -Already_Registered( C2C *List, CHAR *Mask, CHANNEL *Chan ) +LOCAL bool +Already_Registered( C2C *List, char *Mask, CHANNEL *Chan ) { C2C *c2c; c2c = List; while( c2c ) { - if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 )) return TRUE; + if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 )) return true; c2c = c2c->next; } - return FALSE; + return false; } /* Already_Registered */ Index: src/ngircd/lists.h =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/lists.h,v retrieving revision 1.11 retrieving revision 1.12 diff -u -p -r1.11 -r1.12 --- src/ngircd/lists.h 25 Apr 2004 15:40:19 -0000 1.11 +++ src/ngircd/lists.h 19 Mar 2005 18:43:49 -0000 1.12 @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: lists.h,v 1.11 2004/04/25 15:40:19 alex Exp $ + * $Id: lists.h,v 1.12 2005/03/19 18:43:49 fw Exp $ * * Management of IRC lists: ban, invite, ... (header) */ @@ -18,26 +18,26 @@ #define __lists_h__ -GLOBAL VOID Lists_Init PARAMS(( VOID )); -GLOBAL VOID Lists_Exit PARAMS(( VOID )); +GLOBAL void Lists_Init PARAMS(( void )); +GLOBAL void Lists_Exit PARAMS(( void )); -GLOBAL BOOLEAN Lists_CheckInvited PARAMS(( CLIENT *Client, CHANNEL *Chan )); -GLOBAL BOOLEAN Lists_AddInvited PARAMS(( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce )); -GLOBAL VOID Lists_DelInvited PARAMS(( CHAR *Mask, CHANNEL *Chan )); -GLOBAL BOOLEAN Lists_ShowInvites PARAMS(( CLIENT *Client, CHANNEL *Channel )); -GLOBAL BOOLEAN Lists_SendInvites PARAMS(( CLIENT *Client )); -GLOBAL BOOLEAN Lists_IsInviteEntry PARAMS(( CHAR *Mask, CHANNEL *Chan )); - -GLOBAL BOOLEAN Lists_CheckBanned PARAMS(( CLIENT *Client, CHANNEL *Chan )); -GLOBAL BOOLEAN Lists_AddBanned PARAMS(( CHAR *Mask, CHANNEL *Chan )); -GLOBAL VOID Lists_DelBanned PARAMS(( CHAR *Mask, CHANNEL *Chan )); -GLOBAL BOOLEAN Lists_ShowBans PARAMS(( CLIENT *Client, CHANNEL *Channel )); -GLOBAL BOOLEAN Lists_SendBans PARAMS(( CLIENT *Client )); -GLOBAL BOOLEAN Lists_IsBanEntry PARAMS(( CHAR *Mask, CHANNEL *Chan )); +GLOBAL bool Lists_CheckInvited PARAMS(( CLIENT *Client, CHANNEL *Chan )); +GLOBAL bool Lists_AddInvited PARAMS(( char *Mask, CHANNEL *Chan, bool OnlyOnce )); +GLOBAL void Lists_DelInvited PARAMS(( char *Mask, CHANNEL *Chan )); +GLOBAL bool Lists_ShowInvites PARAMS(( CLIENT *Client, CHANNEL *Channel )); +GLOBAL bool Lists_SendInvites PARAMS(( CLIENT *Client )); +GLOBAL bool Lists_IsInviteEntry PARAMS(( char *Mask, CHANNEL *Chan )); + +GLOBAL bool Lists_CheckBanned PARAMS(( CLIENT *Client, CHANNEL *Chan )); +GLOBAL bool Lists_AddBanned PARAMS(( char *Mask, CHANNEL *Chan )); +GLOBAL void Lists_DelBanned PARAMS(( char *Mask, CHANNEL *Chan )); +GLOBAL bool Lists_ShowBans PARAMS(( CLIENT *Client, CHANNEL *Channel )); +GLOBAL bool Lists_SendBans PARAMS(( CLIENT *Client )); +GLOBAL bool Lists_IsBanEntry PARAMS(( char *Mask, CHANNEL *Chan )); -GLOBAL VOID Lists_DeleteChannel PARAMS(( CHANNEL *Chan )); +GLOBAL void Lists_DeleteChannel PARAMS(( CHANNEL *Chan )); -GLOBAL CHAR *Lists_MakeMask PARAMS(( CHAR *Pattern )); +GLOBAL char *Lists_MakeMask PARAMS(( char *Pattern )); #endif Index: src/ngircd/log.c =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/log.c,v retrieving revision 1.44.2.4 retrieving revision 1.57 diff -u -p -r1.44.2.4 -r1.57 --- src/ngircd/log.c 3 Feb 2005 09:27:09 -0000 1.44.2.4 +++ src/ngircd/log.c 24 Jun 2005 19:55:10 -0000 1.57 @@ -14,12 +14,16 @@ #include "portab.h" -static char UNUSED id[] = "$Id: log.c,v 1.44.2.4 2005/02/03 09:27:09 alex Exp $"; +static char UNUSED id[] = "$Id: log.c,v 1.57 2005/06/24 19:55:10 alex Exp $"; #include "imp.h" #include #include -#include +#ifdef PROTOTYPES +# include +#else +# include +#endif #include #include #include @@ -40,64 +44,79 @@ static char UNUSED id[] = "$Id: log.c,v #include "log.h" -LOCAL CHAR Error_File[FNAME_LEN]; -LOCAL CHAR Init_Txt[127]; +LOCAL char Init_Txt[127]; +LOCAL bool Is_Daemon; + +#ifdef DEBUG +LOCAL char Error_File[FNAME_LEN]; +#endif -LOCAL VOID Wall_ServerNotice PARAMS(( CHAR *Msg )); +LOCAL void Wall_ServerNotice PARAMS(( char *Msg )); -GLOBAL VOID -Log_Init( VOID ) +GLOBAL void +Log_Init( bool Daemon_Mode ) { + Is_Daemon = Daemon_Mode; + #ifdef SYSLOG +#ifndef LOG_CONS /* Kludge: mips-dec-ultrix4.5 has no LOG_CONS/LOG_LOCAL5 */ +#define LOG_CONS 0 +#endif +#ifndef LOG_LOCAL5 +#define LOG_LOCAL5 0 +#endif /* Syslog initialisieren */ openlog( PACKAGE_NAME, LOG_CONS|LOG_PID, LOG_LOCAL5 ); #endif /* Hello World! */ - Log( LOG_NOTICE, "%s started.", NGIRCd_Version( )); + Log( LOG_NOTICE, "%s started.", NGIRCd_Version ); /* Informationen uebern den "Operation Mode" */ - strcpy( Init_Txt, "" ); + Init_Txt[0] = '\0'; #ifdef DEBUG if( NGIRCd_Debug ) { - if( Init_Txt[0] ) strcat( Init_Txt, ", " ); - strcat( Init_Txt, "debug-mode" ); + strlcpy( Init_Txt, "debug-mode", sizeof Init_Txt ); } #endif - if( NGIRCd_NoDaemon ) + if( ! Is_Daemon ) { - if( Init_Txt[0] ) strcat( Init_Txt, ", " ); - strcat( Init_Txt, "no-daemon-mode" ); + if( Init_Txt[0] ) strlcat( Init_Txt, ", ", sizeof Init_Txt ); + strlcat( Init_Txt, "no-daemon-mode", sizeof Init_Txt ); } if( NGIRCd_Passive ) { - if( Init_Txt[0] ) strcat( Init_Txt, ", " ); - strcat( Init_Txt, "passive-mode" ); + if( Init_Txt[0] ) strlcat( Init_Txt, ", ", sizeof Init_Txt ); + strlcat( Init_Txt, "passive-mode", sizeof Init_Txt ); } #ifdef SNIFFER if( NGIRCd_Sniffer ) { - if( Init_Txt[0] ) strcat( Init_Txt, ", " ); - strcat( Init_Txt, "network sniffer" ); + if( Init_Txt[0] ) strlcat( Init_Txt, ", ", sizeof Init_Txt ); + strlcat( Init_Txt, "network sniffer", sizeof Init_Txt ); } #endif if( Init_Txt[0] ) Log( LOG_INFO, "Activating: %s.", Init_Txt ); +#ifdef DEBUG Error_File[0] = '\0'; +#endif } /* Log_Init */ -GLOBAL VOID -Log_InitErrorfile( VOID ) +#ifdef DEBUG + +GLOBAL void +Log_InitErrorfile( void ) { /* "Error-Log" initialisieren: stderr in Datei umlenken. Dort * landen z.B. alle Ausgaben von assert()-Aufrufen. */ /* Dateiname zusammen bauen */ - sprintf( Error_File, "%s/%s-%ld.err", ERROR_DIR, PACKAGE_NAME, (LONG)getpid( )); + snprintf( Error_File, sizeof Error_File, "%s/%s-%ld.err", ERROR_DIR, PACKAGE_NAME, (long)getpid( )); /* stderr umlenken */ fflush( stderr ); @@ -109,26 +128,32 @@ Log_InitErrorfile( VOID ) /* Einige Infos in das Error-File schreiben */ fputs( ctime( &NGIRCd_Start ), stderr ); - fprintf( stderr, "%s started.\n", NGIRCd_Version( )); + fprintf( stderr, "%s started.\n", NGIRCd_Version ); fprintf( stderr, "Activating: %s\n\n", Init_Txt[0] ? Init_Txt : "-" ); fflush( stderr ); +#ifdef DEBUG Log( LOG_DEBUG, "Redirected stderr to \"%s\".", Error_File ); +#endif } /* Log_InitErrfile */ +#endif + -GLOBAL VOID -Log_Exit( VOID ) +GLOBAL void +Log_Exit( void ) { /* Good Bye! */ if( NGIRCd_SignalRestart ) Log( LOG_NOTICE, "%s done (restarting).", PACKAGE_NAME ); else Log( LOG_NOTICE, "%s done.", PACKAGE_NAME ); +#ifdef DEBUG if( Error_File[0] ) { /* Error-File (stderr) loeschen */ if( unlink( Error_File ) != 0 ) Log( LOG_ERR, "Can't delete \"%s\": %s", Error_File, strerror( errno )); } +#endif #ifdef SYSLOG /* syslog abmelden */ @@ -138,20 +163,20 @@ Log_Exit( VOID ) #ifdef PROTOTYPES -GLOBAL VOID -Log( INT Level, CONST CHAR *Format, ... ) +GLOBAL void +Log( int Level, const char *Format, ... ) #else -GLOBAL VOID +GLOBAL void Log( Level, Format, va_alist ) -INT Level; -CONST CHAR *Format; +int Level; +const char *Format; va_dcl #endif { /* Eintrag in Logfile(s) schreiben */ - CHAR msg[MAX_LOG_MSG_LEN]; - BOOLEAN snotice; + char msg[MAX_LOG_MSG_LEN]; + bool snotice; va_list ap; assert( Format != NULL ); @@ -159,10 +184,10 @@ va_dcl if( Level & LOG_snotice ) { /* Notice an User mit "s" Mode */ - snotice = TRUE; + snotice = true; Level &= ~LOG_snotice; } - else snotice = FALSE; + else snotice = false; #ifdef DEBUG if(( Level == LOG_DEBUG ) && ( ! NGIRCd_Debug )) return; @@ -179,10 +204,10 @@ va_dcl vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap ); va_end( ap ); - if( NGIRCd_NoDaemon ) + if( ! Is_Daemon ) { /* auf Konsole ausgeben */ - fprintf( stdout, "[%d:%d] %s\n", (INT)getpid( ), Level, msg ); + fprintf( stdout, "[%d:%d] %s\n", (int)getpid( ), Level, msg ); fflush( stdout ); } #ifdef SYSLOG @@ -195,7 +220,7 @@ va_dcl if( Level <= LOG_CRIT ) { - /* Kritische Meldungen in Error-File (stderr) */ + /* log critical messages to stderr */ fprintf( stderr, "%s\n", msg ); fflush( stderr ); } @@ -208,20 +233,24 @@ va_dcl } /* Log */ -GLOBAL VOID -Log_Init_Resolver( VOID ) +GLOBAL void +Log_Init_Resolver( void ) { #ifdef SYSLOG openlog( PACKAGE_NAME, LOG_CONS|LOG_PID, LOG_LOCAL5 ); #endif +#ifdef DEBUG Log_Resolver( LOG_DEBUG, "Resolver sub-process starting, PID %d.", getpid( )); +#endif } /* Log_Init_Resolver */ -GLOBAL VOID -Log_Exit_Resolver( VOID ) +GLOBAL void +Log_Exit_Resolver( void ) { +#ifdef DEBUG Log_Resolver( LOG_DEBUG, "Resolver sub-process %d done.", getpid( )); +#endif #ifdef SYSLOG closelog( ); #endif @@ -229,19 +258,19 @@ Log_Exit_Resolver( VOID ) #ifdef PROTOTYPES -GLOBAL VOID -Log_Resolver( CONST INT Level, CONST CHAR *Format, ... ) +GLOBAL void +Log_Resolver( const int Level, const char *Format, ... ) #else -GLOBAL VOID +GLOBAL void Log_Resolver( Level, Format, va_alist ) -CONST INT Level; -CONST CHAR *Format; +const int Level; +const char *Format; va_dcl #endif { /* Eintrag des Resolver in Logfile(s) schreiben */ - CHAR msg[MAX_LOG_MSG_LEN]; + char msg[MAX_LOG_MSG_LEN]; va_list ap; assert( Format != NULL ); @@ -261,11 +290,10 @@ va_dcl vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap ); va_end( ap ); - /* Output */ - if( NGIRCd_NoDaemon ) + if( ! Is_Daemon ) { /* Output to console */ - fprintf( stdout, "[%d:%d] %s\n", (INT)getpid( ), Level, msg ); + fprintf( stdout, "[%d:%d] %s\n", (int)getpid( ), Level, msg ); fflush( stdout ); } #ifdef SYSLOG @@ -274,8 +302,8 @@ va_dcl } /* Log_Resolver */ -LOCAL VOID -Wall_ServerNotice( CHAR *Msg ) +LOCAL void +Wall_ServerNotice( char *Msg ) { /* Server-Notice an entsprechende User verschicken */ Index: src/ngircd/log.h =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/log.h,v retrieving revision 1.14 retrieving revision 1.18 diff -u -p -r1.14 -r1.18 --- src/ngircd/log.h 26 Dec 2003 15:55:07 -0000 1.14 +++ src/ngircd/log.h 24 Jun 2005 19:55:10 -0000 1.18 @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: log.h,v 1.14 2003/12/26 15:55:07 alex Exp $ + * $Id: log.h,v 1.18 2005/06/24 19:55:10 alex Exp $ * * Logging functions (header) */ @@ -35,16 +35,19 @@ #define LOG_snotice 1024 -GLOBAL VOID Log_Init PARAMS((VOID )); -GLOBAL VOID Log_Exit PARAMS((VOID )); +GLOBAL void Log_Init PARAMS(( bool Daemon_Mode )); +GLOBAL void Log_Exit PARAMS(( void )); -GLOBAL VOID Log_InitErrorfile PARAMS((VOID )); -GLOBAL VOID Log PARAMS((INT Level, CONST CHAR *Format, ... )); +GLOBAL void Log PARAMS(( int Level, const char *Format, ... )); -GLOBAL VOID Log_Init_Resolver PARAMS((VOID )); -GLOBAL VOID Log_Exit_Resolver PARAMS((VOID )); +GLOBAL void Log_Init_Resolver PARAMS(( void )); +GLOBAL void Log_Exit_Resolver PARAMS(( void )); -GLOBAL VOID Log_Resolver PARAMS((CONST INT Level, CONST CHAR *Format, ... )); +GLOBAL void Log_Resolver PARAMS(( const int Level, const char *Format, ... )); + +#ifdef DEBUG +GLOBAL void Log_InitErrorfile PARAMS(( void )); +#endif #endif Index: src/ngircd/match.c =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/match.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -p -r1.2 -r1.3 --- src/ngircd/match.c 12 Dec 2002 12:24:18 -0000 1.2 +++ src/ngircd/match.c 19 Mar 2005 18:43:49 -0000 1.3 @@ -14,7 +14,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: match.c,v 1.2 2002/12/12 12:24:18 alex Exp $"; +static char UNUSED id[] = "$Id: match.c,v 1.3 2005/03/19 18:43:49 fw Exp $"; #include "imp.h" #include @@ -32,8 +32,8 @@ static char UNUSED id[] = "$Id: match.c, */ -LOCAL INT Matche PARAMS(( REGISTER CHAR *p, REGISTER CHAR *t )); -LOCAL INT Matche_After_Star PARAMS(( REGISTER CHAR *p, REGISTER CHAR *t )); +LOCAL int Matche PARAMS(( char *p, char *t )); +LOCAL int Matche_After_Star PARAMS(( char *p, char *t )); #define MATCH_PATTERN 6 /* bad pattern */ @@ -44,22 +44,22 @@ LOCAL INT Matche_After_Star PARAMS(( REG #define MATCH_VALID 1 /* valid match */ -GLOBAL BOOLEAN -Match( CHAR *Pattern, CHAR *String ) +GLOBAL bool +Match( char *Pattern, char *String ) { /* Pattern mit String vergleichen */ - if( Matche( Pattern, String ) == MATCH_VALID ) return TRUE; - else return FALSE; + if( Matche( Pattern, String ) == MATCH_VALID ) return true; + else return false; } /* Match */ -LOCAL INT -Matche( REGISTER CHAR *p, REGISTER CHAR *t ) +LOCAL int +Matche( char *p, char *t ) { - REGISTER CHAR range_start, range_end; - BOOLEAN invert; - BOOLEAN member_match; - BOOLEAN loop; + register char range_start, range_end; + bool invert; + bool member_match; + bool loop; for( ; *p; p++, t++ ) { @@ -83,25 +83,25 @@ Matche( REGISTER CHAR *p, REGISTER CHAR p++; /* check if this is a member match or exclusion match */ - invert = FALSE; + invert = false; if( *p == '!' || *p == '^' ) { - invert = TRUE; + invert = true; p++; } /* if closing bracket here or at range start then we have a malformed pattern */ if ( *p == ']' ) return MATCH_PATTERN; - member_match = FALSE; - loop = TRUE; + member_match = false; + loop = true; while( loop ) { /* if end of construct then loop is done */ if( *p == ']' ) { - loop = FALSE; + loop = false; continue; } @@ -140,16 +140,16 @@ Matche( REGISTER CHAR *p, REGISTER CHAR { if( *t >= range_start && *t <= range_end ) { - member_match = TRUE; - loop = FALSE; + member_match = true; + loop = false; } } else { if( *t >= range_end && *t <= range_start ) { - member_match = TRUE; - loop = FALSE; + member_match = true; + loop = false; } } } @@ -200,10 +200,10 @@ Matche( REGISTER CHAR *p, REGISTER CHAR } /* Matche */ -LOCAL INT -Matche_After_Star( REGISTER CHAR *p, REGISTER CHAR *t ) +LOCAL int +Matche_After_Star( char *p, char *t ) { - REGISTER INT nextp, match = 0; + register int nextp, match = 0; /* pass over existing ? and * in pattern */ while( *p == '?' || *p == '*' ) Index: src/ngircd/match.h =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/match.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -p -r1.2 -r1.3 --- src/ngircd/match.h 12 Dec 2002 12:23:43 -0000 1.2 +++ src/ngircd/match.h 19 Mar 2005 18:43:49 -0000 1.3 @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: match.h,v 1.2 2002/12/12 12:23:43 alex Exp $ + * $Id: match.h,v 1.3 2005/03/19 18:43:49 fw Exp $ * * Wildcard pattern matching (header) */ @@ -18,7 +18,7 @@ #define __match_h__ -GLOBAL BOOLEAN Match PARAMS(( CHAR *Pattern, CHAR *String )); +GLOBAL bool Match PARAMS(( char *Pattern, char *String )); #endif Index: src/ngircd/ngircd.c =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/ngircd.c,v retrieving revision 1.83.2.3 retrieving revision 1.102.2.2 diff -u -p -r1.83.2.3 -r1.102.2.2 --- src/ngircd/ngircd.c 26 Jan 2005 22:02:36 -0000 1.83.2.3 +++ src/ngircd/ngircd.c 8 Jul 2005 23:20:04 -0000 1.102.2.2 @@ -7,14 +7,18 @@ * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. - * - * Main program -- main() */ #include "portab.h" -static char UNUSED id[] = "$Id: ngircd.c,v 1.83.2.3 2005/01/26 22:02:36 alex Exp $"; +static char UNUSED id[] = "$Id: ngircd.c,v 1.102.2.2 2005/07/08 23:20:04 alex Exp $"; + +/** + * @file + * The main program, including the C function main() which is called + * by the loader of the operating system. + */ #include "imp.h" #include @@ -28,6 +32,7 @@ static char UNUSED id[] = "$Id: ngircd.c #include #include #include +#include #include #include @@ -51,39 +56,56 @@ static char UNUSED id[] = "$Id: ngircd.c #include "ngircd.h" -LOCAL VOID Initialize_Signal_Handler PARAMS(( VOID )); -LOCAL VOID Signal_Handler PARAMS(( INT Signal )); +LOCAL void Initialize_Signal_Handler PARAMS(( void )); +LOCAL void Signal_Handler PARAMS(( int Signal )); + +LOCAL void Show_Version PARAMS(( void )); +LOCAL void Show_Help PARAMS(( void )); + +LOCAL void Pidfile_Create PARAMS(( long )); +LOCAL void Pidfile_Delete PARAMS(( void )); -LOCAL VOID Show_Version PARAMS(( VOID )); -LOCAL VOID Show_Help PARAMS(( VOID )); +LOCAL void Fill_Version PARAMS(( void )); +LOCAL void Setup_FDStreams PARAMS(( void )); +LOCAL bool NGIRCd_Init PARAMS(( bool )); + +/** + * The main() function of ngIRCd. + * Here all starts: this function is called by the operating system loader, + * it is the first portion of code executed of ngIRCd. + * @param argc The number of arguments passed to ngIRCd on the command line. + * @param argv An array containing all the arguments passed to ngIRCd. + * @return Global exit code of ngIRCd, zero on success. + */ GLOBAL int main( int argc, const char *argv[] ) { - struct passwd *pwd; - struct group *grp; - BOOLEAN ok, configtest = FALSE; - LONG pid, n; - INT i; + bool ok, configtest = false; + bool NGIRCd_NoDaemon = false; + int i; + size_t n; umask( 0077 ); - NGIRCd_SignalQuit = NGIRCd_SignalRestart = NGIRCd_SignalRehash = FALSE; - NGIRCd_NoDaemon = NGIRCd_Passive = FALSE; + NGIRCd_SignalQuit = NGIRCd_SignalRestart = NGIRCd_SignalRehash = false; + NGIRCd_Passive = false; #ifdef DEBUG - NGIRCd_Debug = FALSE; + NGIRCd_Debug = false; #endif #ifdef SNIFFER - NGIRCd_Sniffer = FALSE; + NGIRCd_Sniffer = false; #endif strlcpy( NGIRCd_ConfFile, SYSCONFDIR, sizeof( NGIRCd_ConfFile )); strlcat( NGIRCd_ConfFile, CONFIG_FILE, sizeof( NGIRCd_ConfFile )); + Fill_Version( ); + /* Kommandozeile parsen */ for( i = 1; i < argc; i++ ) { - ok = FALSE; + ok = false; if(( argv[i][0] == '-' ) && ( argv[i][1] == '-' )) { /* Lange Option */ @@ -96,19 +118,19 @@ main( int argc, const char *argv[] ) strlcpy( NGIRCd_ConfFile, argv[i + 1], sizeof( NGIRCd_ConfFile )); /* next parameter */ - i++; ok = TRUE; + i++; ok = true; } } if( strcmp( argv[i], "--configtest" ) == 0 ) { - configtest = TRUE; - ok = TRUE; + configtest = true; + ok = true; } #ifdef DEBUG if( strcmp( argv[i], "--debug" ) == 0 ) { - NGIRCd_Debug = TRUE; - ok = TRUE; + NGIRCd_Debug = true; + ok = true; } #endif if( strcmp( argv[i], "--help" ) == 0 ) @@ -119,19 +141,19 @@ main( int argc, const char *argv[] ) } if( strcmp( argv[i], "--nodaemon" ) == 0 ) { - NGIRCd_NoDaemon = TRUE; - ok = TRUE; + NGIRCd_NoDaemon = true; + ok = true; } if( strcmp( argv[i], "--passive" ) == 0 ) { - NGIRCd_Passive = TRUE; - ok = TRUE; + NGIRCd_Passive = true; + ok = true; } #ifdef SNIFFER if( strcmp( argv[i], "--sniffer" ) == 0 ) { - NGIRCd_Sniffer = TRUE; - ok = TRUE; + NGIRCd_Sniffer = true; + ok = true; } #endif if( strcmp( argv[i], "--version" ) == 0 ) @@ -143,15 +165,14 @@ main( int argc, const char *argv[] ) else if(( argv[i][0] == '-' ) && ( argv[i][1] != '-' )) { /* Kurze Option */ - - for( n = 1; n < (LONG)strlen( argv[i] ); n++ ) + for( n = 1; n < strlen( argv[i] ); n++ ) { - ok = FALSE; + ok = false; #ifdef DEBUG if( argv[i][n] == 'd' ) { - NGIRCd_Debug = TRUE; - ok = TRUE; + NGIRCd_Debug = true; + ok = true; } #endif if( argv[i][n] == 'f' ) @@ -162,31 +183,32 @@ main( int argc, const char *argv[] ) strlcpy( NGIRCd_ConfFile, argv[i + 1], sizeof( NGIRCd_ConfFile )); /* go to the following parameter */ - i++; n = (LONG)strlen( argv[i] ); - ok = TRUE; + i++; + n = strlen( argv[i] ); + ok = true; } } if( argv[i][n] == 'n' ) { - NGIRCd_NoDaemon = TRUE; - ok = TRUE; + NGIRCd_NoDaemon = true; + ok = true; } if( argv[i][n] == 'p' ) { - NGIRCd_Passive = TRUE; - ok = TRUE; + NGIRCd_Passive = true; + ok = true; } #ifdef SNIFFER if( argv[i][n] == 's' ) { - NGIRCd_Sniffer = TRUE; - ok = TRUE; + NGIRCd_Sniffer = true; + ok = true; } #endif if( argv[i][n] == 't' ) { - configtest = TRUE; - ok = TRUE; + configtest = true; + ok = true; } if( ! ok ) @@ -207,14 +229,14 @@ main( int argc, const char *argv[] ) } /* Debug-Level (fuer IRC-Befehl "VERSION") ermitteln */ - strcpy( NGIRCd_DebugLevel, "" ); + NGIRCd_DebugLevel[0] = '\0'; #ifdef DEBUG if( NGIRCd_Debug ) strcpy( NGIRCd_DebugLevel, "1" ); #endif #ifdef SNIFFER if( NGIRCd_Sniffer ) { - NGIRCd_Debug = TRUE; + NGIRCd_Debug = true; strcpy( NGIRCd_DebugLevel, "2" ); } #endif @@ -230,59 +252,19 @@ main( int argc, const char *argv[] ) { /* Initialize global variables */ NGIRCd_Start = time( NULL ); - (VOID)strftime( NGIRCd_StartStr, 64, "%a %b %d %Y at %H:%M:%S (%Z)", localtime( &NGIRCd_Start )); + (void)strftime( NGIRCd_StartStr, 64, "%a %b %d %Y at %H:%M:%S (%Z)", localtime( &NGIRCd_Start )); - NGIRCd_SignalRehash = FALSE; - NGIRCd_SignalRestart = FALSE; - NGIRCd_SignalQuit = FALSE; + NGIRCd_SignalRehash = false; + NGIRCd_SignalRestart = false; + NGIRCd_SignalQuit = false; /* Initialize modules, part I */ - Log_Init( ); + Log_Init( ! NGIRCd_NoDaemon ); Conf_Init( ); - if( Conf_Chroot[0] ) - { - /* Chroot */ - if( chdir( Conf_Chroot ) != 0 ) Log( LOG_ERR, "Can't chdir() in ChrootDir (%s): %s", Conf_Chroot, strerror( errno )); - - if( chroot( Conf_Chroot ) != 0 ) Log( LOG_ERR, "Can't change root directory to \"%s\": %s", Conf_Chroot, strerror( errno )); - else Log( LOG_INFO, "Changed root and working directory to \"%s\".", Conf_Chroot ); - } - - if( Conf_GID != 0 ) - { - /* Set new group ID */ - if( setgid( Conf_GID ) != 0 ) Log( LOG_ERR, "Can't change group ID to %u: %s", Conf_GID, strerror( errno )); - } - if( Conf_UID != 0 ) - { - /* Set new user ID */ - if( setuid( Conf_UID ) != 0 ) Log( LOG_ERR, "Can't change user ID to %u: %s", Conf_UID, strerror( errno )); - } - - /* In der Regel wird ein Sub-Prozess ge-fork()'t, der - * nicht mehr mit dem Terminal verbunden ist. Mit der - * Option "--nodaemon" kann dies (z.B. zum Debuggen) - * verhindert werden. */ - if( ! NGIRCd_NoDaemon ) - { - /* Daemon im Hintergrund erzeugen */ - pid = (LONG)fork( ); - if( pid > 0 ) - { - /* "alter" Prozess */ - exit( 0 ); - } - if( pid < 0 ) - { - /* Fehler */ - printf( "%s: Can't fork: %s!\nFatal error, exiting now ...\n", PACKAGE_NAME, strerror( errno )); - exit( 1 ); - } - - /* Child-Prozess initialisieren */ - (VOID)setsid( ); - chdir( "/" ); + if (!NGIRCd_Init( NGIRCd_NoDaemon )) { + Log(LOG_WARNING, "Fatal: Initialization failed"); + exit(1); } /* Initialize modules, part II: these functions are eventually @@ -296,15 +278,11 @@ main( int argc, const char *argv[] ) #endif Conn_Init( ); - /* Show user, group, and PID of the running daemon */ - pwd = getpwuid( getuid( )); grp = getgrgid( getgid( )); - Log( LOG_INFO, "Running as user %s(%ld), group %s(%ld), with PID %ld.", pwd ? pwd->pw_name : "unknown", (LONG)getuid( ), grp ? grp->gr_name : "unknown", (LONG)getgid( ), (LONG)getpid( )); - - /* Redirect stderr handle to "error file" for debugging. - * But don't try to write in the chroot jail, since it's more - * secure to have a chroot dir not writable by the daemon. - */ - if( ! Conf_Chroot[0] ) Log_InitErrorfile( ); +#ifdef DEBUG + /* Redirect stderr handle to "error file" for debugging + * when not running in "no daemon" mode: */ + if( ! NGIRCd_NoDaemon ) Log_InitErrorfile( ); +#endif /* Signal-Handler initialisieren */ Initialize_Signal_Handler( ); @@ -313,17 +291,17 @@ main( int argc, const char *argv[] ) * beim PASS-Befehl verwendete Syntax sowie die erweiterten Flags * sind in doc/Protocol.txt beschrieben. */ #ifdef IRCPLUS - sprintf( NGIRCd_ProtoID, "%s%s %s|%s:%s", PROTOVER, PROTOIRCPLUS, PACKAGE_NAME, PACKAGE_VERSION, IRCPLUSFLAGS ); + snprintf( NGIRCd_ProtoID, sizeof NGIRCd_ProtoID, "%s%s %s|%s:%s", PROTOVER, PROTOIRCPLUS, PACKAGE_NAME, PACKAGE_VERSION, IRCPLUSFLAGS ); #ifdef ZLIB strcat( NGIRCd_ProtoID, "Z" ); #endif if( Conf_OperCanMode ) strcat( NGIRCd_ProtoID, "o" ); #else - sprintf( NGIRCd_ProtoID, "%s%s %s|%s", PROTOVER, PROTOIRC, PACKAGE_NAME, PACKAGE_VERSION ); + snprintf( NGIRCd_ProtoID, sizeof NGIRCd_ProtoID, "%s%s %s|%s", PROTOVER, PROTOIRC, PACKAGE_NAME, PACKAGE_VERSION ); #endif - strcat( NGIRCd_ProtoID, " P" ); + strlcat( NGIRCd_ProtoID, " P", sizeof NGIRCd_ProtoID ); #ifdef ZLIB - strcat( NGIRCd_ProtoID, "Z" ); + strlcat( NGIRCd_ProtoID, "Z", sizeof NGIRCd_ProtoID ); #endif Log( LOG_DEBUG, "Protocol and server ID is \"%s\".", NGIRCd_ProtoID ); @@ -335,6 +313,7 @@ main( int argc, const char *argv[] ) { Log( LOG_ALERT, "Server isn't listening on a single port!" ); Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME ); + Pidfile_Delete( ); exit( 1 ); } @@ -351,93 +330,108 @@ main( int argc, const char *argv[] ) Lists_Exit( ); Log_Exit( ); } + Pidfile_Delete( ); return 0; } /* main */ -GLOBAL CHAR * -NGIRCd_Version( VOID ) -{ - STATIC CHAR version[126]; - -#ifdef CVSDATE - sprintf( version, "%s %s(%s)-%s", PACKAGE_NAME, PACKAGE_VERSION, CVSDATE, NGIRCd_VersionAddition( )); -#else - sprintf( version, "%s %s-%s", PACKAGE_NAME, PACKAGE_VERSION, NGIRCd_VersionAddition( )); -#endif - return version; -} /* NGIRCd_Version */ - - -GLOBAL CHAR * -NGIRCd_VersionAddition( VOID ) +/** + * Generate ngIRCd "version string". + * This string is generated once and then stored in NGIRCd_Version for + * further usage, for example by the IRC command VERSION and the --version + * command line switch. + */ +LOCAL void +Fill_Version( void ) { - STATIC CHAR txt[200]; - - strcpy( txt, "" ); + NGIRCd_VersionAddition[0] = '\0'; #ifdef SYSLOG - if( txt[0] ) strcat( txt, "+" ); - strcat( txt, "SYSLOG" ); + strlcpy( NGIRCd_VersionAddition, "SYSLOG", sizeof NGIRCd_VersionAddition ); #endif #ifdef ZLIB - if( txt[0] ) strcat( txt, "+" ); - strcat( txt, "ZLIB" ); + if( NGIRCd_VersionAddition[0] ) + strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition ); + + strlcat( NGIRCd_VersionAddition, "ZLIB", sizeof NGIRCd_VersionAddition ); #endif #ifdef TCPWRAP - if( txt[0] ) strcat( txt, "+" ); - strcat( txt, "TCPWRAP" ); + if( NGIRCd_VersionAddition[0] ) + strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition ); + + strlcat( NGIRCd_VersionAddition, "TCPWRAP", sizeof NGIRCd_VersionAddition ); #endif #ifdef RENDEZVOUS - if( txt[0] ) strcat( txt, "+" ); - strcat( txt, "RENDEZVOUS" ); + if( NGIRCd_VersionAddition[0] ) + strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition ); + + strlcat( NGIRCd_VersionAddition, "RENDEZVOUS", sizeof NGIRCd_VersionAddition ); #endif #ifdef IDENTAUTH - if( txt[0] ) strcat( txt, "+" ); - strcat( txt, "IDENT" ); + if( NGIRCd_VersionAddition[0] ) + strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition ); + + strlcat( NGIRCd_VersionAddition, "IDENT", sizeof NGIRCd_VersionAddition ); #endif #ifdef DEBUG - if( txt[0] ) strcat( txt, "+" ); - strcat( txt, "DEBUG" ); + if( NGIRCd_VersionAddition[0] ) + strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition ); + + strlcat( NGIRCd_VersionAddition, "DEBUG", sizeof NGIRCd_VersionAddition ); #endif #ifdef SNIFFER - if( txt[0] ) strcat( txt, "+" ); - strcat( txt, "SNIFFER" ); + if( NGIRCd_VersionAddition[0] ) + strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition ); + + strlcat( NGIRCd_VersionAddition, "SNIFFER", sizeof NGIRCd_VersionAddition ); #endif #ifdef STRICT_RFC - if( txt[0] ) strcat( txt, "+" ); - strcat( txt, "RFC" ); + if( NGIRCd_VersionAddition[0] ) + strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition ); + + strlcat( NGIRCd_VersionAddition, "RFC", sizeof NGIRCd_VersionAddition ); #endif #ifdef IRCPLUS - if( txt[0] ) strcat( txt, "+" ); - strcat( txt, "IRCPLUS" ); + if( NGIRCd_VersionAddition[0] ) + strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition ); + + strlcat( NGIRCd_VersionAddition, "IRCPLUS", sizeof NGIRCd_VersionAddition ); #endif - - if( txt[0] ) strlcat( txt, "-", sizeof( txt )); - strlcat( txt, TARGET_CPU, sizeof( txt )); - strlcat( txt, "/", sizeof( txt )); - strlcat( txt, TARGET_VENDOR, sizeof( txt )); - strlcat( txt, "/", sizeof( txt )); - strlcat( txt, TARGET_OS, sizeof( txt )); - return txt; -} /* NGIRCd_VersionAddition */ + if( NGIRCd_VersionAddition[0] ) + strlcat( NGIRCd_VersionAddition, "-", sizeof( NGIRCd_VersionAddition )); + + strlcat( NGIRCd_VersionAddition, TARGET_CPU, sizeof( NGIRCd_VersionAddition )); + strlcat( NGIRCd_VersionAddition, "/", sizeof( NGIRCd_VersionAddition )); + strlcat( NGIRCd_VersionAddition, TARGET_VENDOR, sizeof( NGIRCd_VersionAddition )); + strlcat( NGIRCd_VersionAddition, "/", sizeof( NGIRCd_VersionAddition )); + strlcat( NGIRCd_VersionAddition, TARGET_OS, sizeof( NGIRCd_VersionAddition )); + +#ifdef CVSDATE + snprintf( NGIRCd_Version, sizeof NGIRCd_Version,"%s %s(%s)-%s", PACKAGE_NAME, PACKAGE_VERSION, CVSDATE, NGIRCd_VersionAddition); +#else + snprintf( NGIRCd_Version, sizeof NGIRCd_Version, "%s %s-%s", PACKAGE_NAME, PACKAGE_VERSION, NGIRCd_VersionAddition); +#endif +} /* Fill_Version */ -GLOBAL VOID -NGIRCd_Rehash( VOID ) +/** + * Reload the server configuration file. + */ +GLOBAL void +NGIRCd_Rehash( void ) { - CHAR old_name[CLIENT_ID_LEN]; + char old_name[CLIENT_ID_LEN]; Log( LOG_NOTICE|LOG_snotice, "Re-reading configuration NOW!" ); - NGIRCd_SignalRehash = FALSE; + NGIRCd_SignalRehash = false; /* Close down all listening sockets */ Conn_ExitListeners( ); /* Remember old server name */ - strcpy( old_name, Conf_ServerName ); + strlcpy( old_name, Conf_ServerName, sizeof old_name ); /* Re-read configuration ... */ Conf_Rehash( ); @@ -462,8 +456,11 @@ NGIRCd_Rehash( VOID ) } /* NGIRCd_Rehash */ -LOCAL VOID -Initialize_Signal_Handler( VOID ) +/** + * Initialize the signal handler. + */ +LOCAL void +Initialize_Signal_Handler( void ) { /* Signal-Handler initialisieren: einige Signale * werden ignoriert, andere speziell behandelt. */ @@ -509,24 +506,26 @@ Initialize_Signal_Handler( VOID ) } /* Initialize_Signal_Handler */ -LOCAL VOID -Signal_Handler( INT Signal ) +/** + * Signal handler of ngIRCd. + * This function is called whenever ngIRCd catches a signal sent by the + * user and/or the system to it. For example SIGTERM and SIGHUP. + * @param Signal Number of the signal to handle. + */ +LOCAL void +Signal_Handler( int Signal ) { - /* Signal-Handler. Dieser wird aufgerufen, wenn eines der Signale eintrifft, - * fuer das wir uns registriert haben (vgl. Initialize_Signal_Handler). Die - * Nummer des eingetroffenen Signals wird der Funktion uebergeben. */ - switch( Signal ) { case SIGTERM: case SIGINT: case SIGQUIT: /* wir soll(t)en uns wohl beenden ... */ - NGIRCd_SignalQuit = TRUE; + NGIRCd_SignalQuit = true; break; case SIGHUP: /* Konfiguration neu einlesen: */ - NGIRCd_SignalRehash = TRUE; + NGIRCd_SignalRehash = true; break; case SIGCHLD: /* Child-Prozess wurde beendet. Zombies vermeiden: */ @@ -541,10 +540,13 @@ Signal_Handler( INT Signal ) } /* Signal_Handler */ -LOCAL VOID -Show_Version( VOID ) +/** + * Display copyright and version information of ngIRCd on the console. + */ +LOCAL void +Show_Version( void ) { - puts( NGIRCd_Version( )); + puts( NGIRCd_Version ); puts( "Copyright (c)2001-2005 by Alexander Barton ()." ); puts( "Homepage: \n" ); puts( "This is free software; see the source for copying conditions. There is NO" ); @@ -552,15 +554,20 @@ Show_Version( VOID ) } /* Show_Version */ -LOCAL VOID -Show_Help( VOID ) +/** + * Display a short help text on the console. + * This help depends on the configuration of the executable and only shows + * options that are actually enabled. + */ +LOCAL void +Show_Help( void ) { #ifdef DEBUG puts( " -d, --debug log extra debug messages" ); #endif puts( " -f, --config use file as configuration file" ); - puts( " -n, --nodaemon don't fork and don't detach from controlling terminal" ); - puts( " -p, --passive disable automatic connections to other servers" ); + puts( " -n, --nodaemon don't fork and don't detach from controlling terminal" ); + puts( " -p, --passive disable automatic connections to other servers" ); #ifdef SNIFFER puts( " -s, --sniffer enable network sniffer and display all IRC traffic" ); #endif @@ -570,4 +577,235 @@ Show_Help( VOID ) } /* Show_Help */ +/** + * Delete the file containing the process ID (PID). + */ +LOCAL void +Pidfile_Delete( void ) +{ + /* Pidfile configured? */ + if( ! Conf_PidFile[0] ) return; + +#ifdef DEBUG + Log( LOG_DEBUG, "Removing PID file (%s) ...", Conf_PidFile ); +#endif + + if( unlink( Conf_PidFile )) + Log( LOG_ERR, "Error unlinking PID file (%s): %s", Conf_PidFile, strerror( errno )); +} /* Pidfile_Delete */ + + +/** + * Create the file containing the process ID of ngIRCd ("PID file"). + * @param pid The process ID to be stored in this file. + */ +LOCAL void +Pidfile_Create( long pid ) +{ + int pidfd; + char pidbuf[64]; + int len; + + /* Pidfile configured? */ + if( ! Conf_PidFile[0] ) return; + +#ifdef DEBUG + Log( LOG_DEBUG, "Creating PID file (%s) ...", Conf_PidFile ); +#endif + + pidfd = open( Conf_PidFile, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); + if ( pidfd < 0 ) { + Log( LOG_ERR, "Error writing PID file (%s): %s", Conf_PidFile, strerror( errno )); + return; + } + + len = snprintf( pidbuf, sizeof pidbuf, "%ld\n", pid ); + if (len < 0|| len < (int)sizeof pid) { + Log( LOG_ERR, "Error converting pid"); + return; + } + + if( write( pidfd, pidbuf, len) != len) + Log( LOG_ERR, "Can't write PID file (%s): %s", Conf_PidFile, strerror( errno )); + + if( close(pidfd) != 0 ) + Log( LOG_ERR, "Error closing PID file (%s): %s", Conf_PidFile, strerror( errno )); +} /* Pidfile_Create */ + + +/** + * Redirect stdin, stdout and stderr to apropriate file handles. + */ +LOCAL void +Setup_FDStreams( void ) +{ + int fd; + + /* Test if we can open /dev/null for reading and writing. If not + * we are most probably chrooted already and the server has been + * restarted. So we simply don't try to redirect stdXXX ... */ + fd = open( "/dev/null", O_RDWR ); + if ( fd < 0 ) { + Log(LOG_WARNING, "Could not open /dev/null: %s", strerror(errno)); + return; + } + + fflush(stdout); + fflush(stderr); + + /* Create new stdin(0), stdout(1) and stderr(2) descriptors */ + dup2( fd, 0 ); dup2( fd, 1 ); dup2( fd, 2 ); + + /* Close newly opened file descriptor if not stdin/out/err */ + if( fd > 2 ) close( fd ); +} /* Setup_FDStreams */ + + +LOCAL bool +NGIRCd_getNobodyID(unsigned int *uid, unsigned int *gid ) +{ + struct passwd *pwd; + + pwd = getpwnam("nobody"); + if (!pwd) return false; + + if ( !pwd->pw_uid || !pwd->pw_gid) + return false; + + *uid = pwd->pw_uid; + *gid = pwd->pw_gid; + endpwent(); + + return true; +} + + +LOCAL bool +NGIRCd_Init( bool NGIRCd_NoDaemon ) +{ + static bool initialized; + bool chrooted = false; + struct passwd *pwd; + struct group *grp; + int real_errno; + long pid; + + if (initialized) + return true; + + if( Conf_Chroot[0] ) { + if( chdir( Conf_Chroot ) != 0 ) { + Log( LOG_ERR, "Can't chdir() in ChrootDir (%s): %s", Conf_Chroot, strerror( errno )); + return false; + } + + if( chroot( Conf_Chroot ) != 0 ) { + if (errno != EPERM) { + Log( LOG_ERR, "Can't change root directory to \"%s\": %s", + Conf_Chroot, strerror( errno )); + + return false; + } + } else { + chrooted = true; + Log( LOG_INFO, "Changed root and working directory to \"%s\".", Conf_Chroot ); + } + } + + if (Conf_UID == 0) { + Log(LOG_INFO, "ServerUID must not be 0, using \"nobody\" instead.", Conf_UID); + + if (! NGIRCd_getNobodyID(&Conf_UID, &Conf_GID)) { + Log(LOG_WARNING, "Could not get user/group ID of user \"nobody\": %s", + errno ? strerror(errno) : "not found" ); + return false; + } + } + + if (getgid() != Conf_GID) { + /* Change group ID */ + if (setgid(Conf_GID) != 0) { + real_errno = errno; + Log( LOG_ERR, "Can't change group ID to %u: %s", Conf_GID, strerror( errno )); + if (real_errno != EPERM) + return false; + } + } + + if (getuid() != Conf_UID) { + /* Change user ID */ + if (setuid(Conf_UID) != 0) { + real_errno = errno; + Log(LOG_ERR, "Can't change user ID to %u: %s", Conf_UID, strerror(errno)); + if (real_errno != EPERM) + return false; + } + } + + initialized = true; + + /* Normally a child process is forked which isn't any longer + * connected to ther controlling terminal. Use "--nodaemon" + * to disable this "daemon mode" (useful for debugging). */ + if ( ! NGIRCd_NoDaemon ) { + pid = (long)fork( ); + if( pid > 0 ) { + /* "Old" process: exit. */ + exit( 0 ); + } + if( pid < 0 ) { + /* Error!? */ + fprintf( stderr, "%s: Can't fork: %s!\nFatal error, exiting now ...\n", + PACKAGE_NAME, strerror( errno )); + exit( 1 ); + } + + /* New child process */ + (void)setsid( ); + chdir( "/" ); + + /* Detach stdin, stdout and stderr */ + Setup_FDStreams( ); + } + pid = getpid(); + + Pidfile_Create( pid ); + + /* Check UID/GID we are running as, can be different from values + * configured (e. g. if we were already started with a UID>0. */ + Conf_UID = getuid(); + Conf_GID = getgid(); + + pwd = getpwuid( Conf_UID ); + grp = getgrgid( Conf_GID ); + + Log( LOG_INFO, "Running as user %s(%ld), group %s(%ld), with PID %ld.", + pwd ? pwd->pw_name : "unknown", Conf_UID, + grp ? grp->gr_name : "unknown", Conf_GID, pid); + + if ( chrooted ) { + Log( LOG_INFO, "Running chrooted, chrootdir \"%s\".", Conf_Chroot ); + return true; + } else { + Log( LOG_INFO, "Not running chrooted." ); + } + + /* Change working directory to home directory of the user + * we are running as (only when running in daemon mode and not in chroot) */ + + if ( pwd ) { + if (!NGIRCd_NoDaemon ) { + if( chdir( pwd->pw_dir ) == 0 ) + Log( LOG_DEBUG, "Changed working directory to \"%s\" ...", pwd->pw_dir ); + else + Log( LOG_ERR, "Can't change working directory to \"%s\": %s", + pwd->pw_dir, strerror( errno )); + } + } else { + Log( LOG_ERR, "Can't get user informaton for UID %d!?", Conf_UID ); + } + +return true; +} + /* -eof- */ Index: src/ngircd/ngircd.h =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/ngircd.h,v retrieving revision 1.19 retrieving revision 1.22 diff -u -p -r1.19 -r1.22 --- src/ngircd/ngircd.h 26 Dec 2002 16:48:14 -0000 1.19 +++ src/ngircd/ngircd.h 24 Jun 2005 19:20:56 -0000 1.22 @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: ngircd.h,v 1.19 2002/12/26 16:48:14 alex Exp $ + * $Id: ngircd.h,v 1.22 2005/06/24 19:20:56 fw Exp $ * * Prototypes of the "main module". */ @@ -23,35 +23,32 @@ GLOBAL time_t NGIRCd_Start; /* Startzeitpunkt des Daemon */ -GLOBAL CHAR NGIRCd_StartStr[64]; +GLOBAL char NGIRCd_StartStr[64]; +GLOBAL char NGIRCd_Version[126]; +GLOBAL char NGIRCd_VersionAddition[126]; #ifdef DEBUG -GLOBAL BOOLEAN NGIRCd_Debug; /* Debug-Modus aktivieren */ +GLOBAL bool NGIRCd_Debug; /* Debug-Modus aktivieren */ #endif #ifdef SNIFFER -GLOBAL BOOLEAN NGIRCd_Sniffer; /* Sniffer aktivieren */ +GLOBAL bool NGIRCd_Sniffer; /* Sniffer aktivieren */ #endif -GLOBAL BOOLEAN NGIRCd_NoDaemon; /* nicht im Hintergrund laufen */ +GLOBAL bool NGIRCd_Passive; /* nicht zu anderen Servern connecten */ -GLOBAL BOOLEAN NGIRCd_Passive; /* nicht zu anderen Servern connecten */ +GLOBAL bool NGIRCd_SignalQuit; /* true: quit server*/ +GLOBAL bool NGIRCd_SignalRestart; /* true: restart server */ +GLOBAL bool NGIRCd_SignalRehash; /* true: reload configuration */ -GLOBAL BOOLEAN NGIRCd_SignalQuit; /* TRUE: quit server*/ -GLOBAL BOOLEAN NGIRCd_SignalRestart; /* TRUE: restart server */ -GLOBAL BOOLEAN NGIRCd_SignalRehash; /* TRUE: reload configuration */ +GLOBAL char NGIRCd_DebugLevel[2]; /* Debug-Level fuer IRC_VERSION() */ -GLOBAL CHAR NGIRCd_DebugLevel[2]; /* Debug-Level fuer IRC_VERSION() */ +GLOBAL char NGIRCd_ConfFile[FNAME_LEN]; /* Konfigurationsdatei */ -GLOBAL CHAR NGIRCd_ConfFile[FNAME_LEN]; /* Konfigurationsdatei */ +GLOBAL char NGIRCd_ProtoID[COMMAND_LEN];/* Protokoll- und Server-Identifikation */ -GLOBAL CHAR NGIRCd_ProtoID[COMMAND_LEN];/* Protokoll- und Server-Identifikation */ - -GLOBAL CHAR *NGIRCd_Version PARAMS((VOID )); -GLOBAL CHAR *NGIRCd_VersionAddition PARAMS((VOID )); - -GLOBAL VOID NGIRCd_Rehash PARAMS(( VOID )); +GLOBAL void NGIRCd_Rehash PARAMS(( void )); #endif Index: src/ngircd/parse.c =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/parse.c,v retrieving revision 1.60 retrieving revision 1.63 diff -u -p -r1.60 -r1.63 --- src/ngircd/parse.c 17 Jan 2004 03:17:49 -0000 1.60 +++ src/ngircd/parse.c 24 Jun 2005 20:56:46 -0000 1.63 @@ -7,14 +7,17 @@ * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. - * - * IRC command parser and validator */ #include "portab.h" -static char UNUSED id[] = "$Id: parse.c,v 1.60 2004/01/17 03:17:49 alex Exp $"; +static char UNUSED id[] = "$Id: parse.c,v 1.63 2005/06/24 20:56:46 alex Exp $"; + +/** + * @file + * IRC command parser and validator. + */ #include "imp.h" #include @@ -100,32 +103,52 @@ COMMAND My_Commands[] = }; -LOCAL VOID Init_Request PARAMS(( REQUEST *Req )); +LOCAL void Init_Request PARAMS(( REQUEST *Req )); -LOCAL BOOLEAN Validate_Prefix PARAMS(( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed )); -LOCAL BOOLEAN Validate_Command PARAMS(( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed )); -LOCAL BOOLEAN Validate_Args PARAMS(( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed )); +LOCAL bool Validate_Prefix PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed )); +LOCAL bool Validate_Command PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed )); +LOCAL bool Validate_Args PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed )); -LOCAL BOOLEAN Handle_Request PARAMS(( CONN_ID Idx, REQUEST *Req )); +LOCAL bool Handle_Request PARAMS(( CONN_ID Idx, REQUEST *Req )); +/** + * Return the pointer to the global "IRC command structure". + * This structure, an array of type "COMMAND" describes all the IRC commands + * implemented by ngIRCd and how to handle them. + * @return Pointer to the global command structure. + */ GLOBAL COMMAND * -Parse_GetCommandStruct( VOID ) +Parse_GetCommandStruct( void ) { return My_Commands; } /* Parse_GetCommandStruct */ -GLOBAL BOOLEAN -Parse_Request( CONN_ID Idx, CHAR *Request ) +/** + * Parse a command ("request") received from a client. + * + * This function is called after the connection layer received a valid CR+LF + * terminated line of text: we asume that this is a valid IRC command and + * try to do something useful with it :-) + * + * All errors are reported to the client from which the command has been + * received, and if the error is fatal this connection is closed down. + * + * This function is able to parse the syntax as described in RFC 2812, + * section 2.3. + * + * @param Idx Index of the connection from which the command has been received. + * @param Request NULL terminated line of text (the "command"). + * @return true on success (valid command or "regular" error), false if a + * fatal error occured and the connection has been shut down. + */ +GLOBAL bool +Parse_Request( CONN_ID Idx, char *Request ) { - /* Client-Request parsen. Bei einem schwerwiegenden Fehler wird - * die Verbindung geschlossen und FALSE geliefert. - * Der Aufbau gueltiger Requests ist in RFC 2812, 2.3 definiert. */ - REQUEST req; - CHAR *start, *ptr; - BOOLEAN closed; + char *start, *ptr; + bool closed; assert( Idx >= 0 ); assert( Request != NULL ); @@ -220,12 +243,16 @@ Parse_Request( CONN_ID Idx, CHAR *Reques } /* Parse_Request */ -LOCAL VOID +/** + * Initialize request structure. + * @param Req Request structure to be initialized. + */ +LOCAL void Init_Request( REQUEST *Req ) { /* Neue Request-Struktur initialisieren */ - INT i; + int i; assert( Req != NULL ); @@ -236,18 +263,18 @@ Init_Request( REQUEST *Req ) } /* Init_Request */ -LOCAL BOOLEAN -Validate_Prefix( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed ) +LOCAL bool +Validate_Prefix( CONN_ID Idx, REQUEST *Req, bool *Closed ) { CLIENT *client, *c; assert( Idx >= 0 ); assert( Req != NULL ); - *Closed = FALSE; + *Closed = false; /* ist ueberhaupt ein Prefix vorhanden? */ - if( ! Req->prefix ) return TRUE; + if( ! Req->prefix ) return true; /* Client-Struktur der Connection ermitteln */ client = Client_GetFromConn( Idx ); @@ -259,7 +286,7 @@ Validate_Prefix( CONN_ID Idx, REQUEST *R /* noch nicht registrierte Verbindung. * Das Prefix wird ignoriert. */ Req->prefix = NULL; - return TRUE; + return true; } /* pruefen, ob der im Prefix angegebene Client bekannt ist */ @@ -268,8 +295,8 @@ Validate_Prefix( CONN_ID Idx, REQUEST *R { /* im Prefix angegebener Client ist nicht bekannt */ Log( LOG_ERR, "Invalid prefix \"%s\", client not known (connection %d, command %s)!?", Req->prefix, Idx, Req->command ); - if( ! Conn_WriteStr( Idx, "ERROR :Invalid prefix \"%s\", client not known!?", Req->prefix )) *Closed = TRUE; - return FALSE; + if( ! Conn_WriteStr( Idx, "ERROR :Invalid prefix \"%s\", client not known!?", Req->prefix )) *Closed = true; + return false; } /* pruefen, ob der Client mit dem angegebenen Prefix in Richtung @@ -280,48 +307,48 @@ Validate_Prefix( CONN_ID Idx, REQUEST *R /* das angegebene Prefix ist aus dieser Richtung, also * aus der gegebenen Connection, ungueltig! */ Log( LOG_ERR, "Spoofed prefix \"%s\" from \"%s\" (connection %d, command %s)!", Req->prefix, Client_Mask( Client_GetFromConn( Idx )), Idx, Req->command ); - Conn_Close( Idx, NULL, "Spoofed prefix", TRUE ); - *Closed = TRUE; - return FALSE; + Conn_Close( Idx, NULL, "Spoofed prefix", true); + *Closed = true; + return false; } - return TRUE; + return true; } /* Validate_Prefix */ -LOCAL BOOLEAN -Validate_Command( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed ) +LOCAL bool +Validate_Command( CONN_ID Idx, REQUEST *Req, bool *Closed ) { assert( Idx >= 0 ); assert( Req != NULL ); - *Closed = FALSE; + *Closed = false; - return TRUE; + return true; } /* Validate_Comman */ -LOCAL BOOLEAN -Validate_Args( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed ) +LOCAL bool +Validate_Args( CONN_ID Idx, REQUEST *Req, bool *Closed ) { assert( Idx >= 0 ); assert( Req != NULL ); - *Closed = FALSE; + *Closed = false; - return TRUE; + return true; } /* Validate_Args */ -LOCAL BOOLEAN +LOCAL bool Handle_Request( CONN_ID Idx, REQUEST *Req ) { /* Client-Request verarbeiten. Bei einem schwerwiegenden Fehler - * wird die Verbindung geschlossen und FALSE geliefert. */ + * wird die Verbindung geschlossen und false geliefert. */ CLIENT *client, *target, *prefix; - CHAR str[LINE_LEN]; - BOOLEAN result; + char str[LINE_LEN]; + bool result; COMMAND *cmd; - INT i; + int i; assert( Idx >= 0 ); assert( Req != NULL ); @@ -343,13 +370,13 @@ Handle_Request( CONN_ID Idx, REQUEST *Re /* Status code without target!? */ if( Req->argc > 0 ) Log( LOG_WARNING, "Unknown target for status code %s: \"%s\"", Req->command, Req->argv[0] ); else Log( LOG_WARNING, "Unknown target for status code %s!", Req->command ); - return TRUE; + return true; } if( target == Client_ThisServer( )) { /* This server is the target, ignore it */ Log( LOG_DEBUG, "Ignored status code %s from \"%s\".", Req->command, Client_ID( client )); - return TRUE; + return true; } /* Determine source */ @@ -357,14 +384,14 @@ Handle_Request( CONN_ID Idx, REQUEST *Re { /* Oops, no prefix!? */ Log( LOG_WARNING, "Got status code %s from \"%s\" without prefix!?", Req->command, Client_ID( client )); - return TRUE; + return true; } else prefix = Client_Search( Req->prefix ); if( ! prefix ) { /* Oops, unknown prefix!? */ Log( LOG_WARNING, "Got status code %s from unknown source: \"%s\"", Req->command, Req->prefix ); - return TRUE; + return true; } /* Forward status code */ @@ -406,11 +433,23 @@ Handle_Request( CONN_ID Idx, REQUEST *Re return IRC_WriteStrClient( client, ERR_NOTREGISTERED_MSG, Client_ID( client )); } } + + if( Client_Type( client ) != CLIENT_USER && + Client_Type( client ) != CLIENT_SERVER && + Client_Type( client ) != CLIENT_SERVICE ) + return true; - /* Unbekannter Befehl */ - Log( LOG_DEBUG, "Connection %d: Unknown command \"%s\", %d %s,%s prefix.", Client_Conn( client ), Req->command, Req->argc, Req->argc == 1 ? "parameter" : "parameters", Req->prefix ? "" : " no" ); - if( Client_Type( client ) != CLIENT_SERVER ) return IRC_WriteStrClient( client, ERR_UNKNOWNCOMMAND_MSG, Client_ID( client ), Req->command ); - else return TRUE; + /* Unknown command and registered connection: generate error: */ + Log( LOG_DEBUG, "Connection %d: Unknown command \"%s\", %d %s,%s prefix.", + Client_Conn( client ), Req->command, Req->argc, + Req->argc == 1 ? "parameter" : "parameters", + Req->prefix ? "" : " no" ); + + if( Client_Type( client ) != CLIENT_SERVER ) + return IRC_WriteStrClient( client, ERR_UNKNOWNCOMMAND_MSG, + Client_ID( client ), Req->command ); + + return true; } /* Handle_Request */ Index: src/ngircd/parse.h =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/parse.h,v retrieving revision 1.10 retrieving revision 1.11 diff -u -p -r1.10 -r1.11 --- src/ngircd/parse.h 3 Jan 2003 22:03:51 -0000 1.10 +++ src/ngircd/parse.h 19 Mar 2005 18:43:49 -0000 1.11 @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: parse.h,v 1.10 2003/01/03 22:03:51 alex Exp $ + * $Id: parse.h,v 1.11 2005/03/19 18:43:49 fw Exp $ * * IRC command parser and validator (header) */ @@ -17,29 +17,30 @@ #ifndef __parse_h__ #define __parse_h__ +#include "portab.h" typedef struct _REQUEST /* vgl. RFC 2812, 2.3 */ { - CHAR *prefix; /* Prefix */ - CHAR *command; /* IRC-Befehl */ - CHAR *argv[15]; /* Parameter (max. 15: 0..14) */ - INT argc; /* Anzahl vorhandener Parameter */ + char *prefix; /* Prefix */ + char *command; /* IRC-Befehl */ + char *argv[15]; /* Parameter (max. 15: 0..14) */ + int argc; /* Anzahl vorhandener Parameter */ } REQUEST; typedef struct _COMMAND { - CHAR *name; /* command name */ - BOOLEAN (*function) PARAMS(( CLIENT *Client, REQUEST *Request )); - CLIENT_TYPE type; /* valid client types (bit mask) */ - LONG lcount, rcount; /* number of local and remote calls */ - LONG bytes; /* number of bytes created */ + char *name; /* command name */ + bool (*function) PARAMS(( CLIENT *Client, REQUEST *Request )); + CLIENT_TYPE type; /* valid client types (bit mask) */ + long lcount, rcount; /* number of local and remote calls */ + long bytes; /* number of bytes created */ } COMMAND; -GLOBAL BOOLEAN Parse_Request PARAMS((CONN_ID Idx, CHAR *Request )); +GLOBAL bool Parse_Request PARAMS((CONN_ID Idx, char *Request )); -GLOBAL COMMAND *Parse_GetCommandStruct PARAMS(( VOID )); +GLOBAL COMMAND *Parse_GetCommandStruct PARAMS(( void )); #endif Index: src/ngircd/rendezvous.c =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/rendezvous.c,v retrieving revision 1.2 retrieving revision 1.5 diff -u -p -r1.2 -r1.5 --- src/ngircd/rendezvous.c 27 Mar 2003 01:24:32 -0000 1.2 +++ src/ngircd/rendezvous.c 19 Mar 2005 18:43:49 -0000 1.5 @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2003 by Alexander Barton (alex@barton.de) + * Copyright (c)2001-2004 by Alexander Barton (alex@barton.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -8,7 +8,11 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * Rendezvous service registration (using Mach Ports, e.g. Mac OS X) + * Rendezvous service registration. + * + * Supported APIs are: + * - Apple Mac OS X + * - Howl */ @@ -17,7 +21,7 @@ #ifdef RENDEZVOUS -static char UNUSED id[] = "$Id: rendezvous.c,v 1.2 2003/03/27 01:24:32 alex Exp $"; +static char UNUSED id[] = "$Id: rendezvous.c,v 1.5 2005/03/19 18:43:49 fw Exp $"; #include "imp.h" #include @@ -34,6 +38,10 @@ static char UNUSED id[] = "$Id: rendezvo #include #endif +#ifdef HAVE_RENDEZVOUS_RENDEZVOUS_H +#include +#endif + #include "defines.h" #include "log.h" @@ -41,73 +49,124 @@ static char UNUSED id[] = "$Id: rendezvo #include "rendezvous.h" +#if defined(HAVE_DNSSERVICEREGISTRATIONCREATE) +# define APPLE +#elif defined(HAVE_SW_DISCOVERY_INIT) +# define HOWL +#else +# error "Can't detect Rendezvous API!?" +#endif + + +#define MAX_RENDEZVOUS 1000 + typedef struct _service { + char Desc[CLIENT_ID_LEN]; +#ifdef APPLE dns_service_discovery_ref Discovery_Ref; mach_port_t Mach_Port; - CHAR Desc[CLIENT_ID_LEN]; +#endif +#ifdef HOWL + sw_discovery_oid Id; +#endif } SERVICE; +LOCAL SERVICE My_Rendezvous[MAX_RENDEZVOUS]; -LOCAL VOID Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrCode, VOID *Context ); -LOCAL VOID Unregister( INT Idx ); +LOCAL void Unregister( int Idx ); + + +/* -- Apple API -- */ + +#ifdef APPLE -#define MAX_RENDEZVOUS 1000 #define MAX_MACH_MSG_SIZE 512 +LOCAL void Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrCode, void *Context ); -LOCAL SERVICE My_Rendezvous[MAX_RENDEZVOUS]; +#endif /* Apple */ + + +/* -- Howl API -- */ + +#ifdef HOWL + +LOCAL sw_discovery My_Discovery_Session = NULL; +LOCAL sw_salt My_Salt; +LOCAL sw_result HOWL_API Registration_Reply_Handler( sw_discovery Session, sw_discovery_publish_status Status, sw_discovery_oid Id, sw_opaque Extra ); -GLOBAL VOID Rendezvous_Init( VOID ) +#endif /* Howl */ + + +GLOBAL void Rendezvous_Init( void ) { /* Initialize structures */ - INT i; + int i; - for( i = 0; i < MAX_RENDEZVOUS; i++ ) +#ifdef HOWL + if( sw_discovery_init( &My_Discovery_Session ) != SW_OKAY ) { - My_Rendezvous[i].Discovery_Ref = 0; - My_Rendezvous[i].Mach_Port = 0; + Log( LOG_EMERG, "Can't initialize Rendezvous (Howl): sw_discovery_init() failed!" ); + Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME ); + exit( 1 ); + } + + if( sw_discovery_salt( My_Discovery_Session, &My_Salt ) != SW_OKAY ) + { + Log( LOG_EMERG, "Can't initialize Rendezvous (Howl): sw_discovery_salt() failed!" ); + Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME ); + exit( 1 ); } +#endif + + for( i = 0; i < MAX_RENDEZVOUS; i++ ) My_Rendezvous[i].Desc[0] = '\0'; } /* Rendezvous_Init */ -GLOBAL VOID Rendezvous_Exit( VOID ) +GLOBAL void Rendezvous_Exit( void ) { /* Clean up & exit module */ - INT i; + int i; for( i = 0; i < MAX_RENDEZVOUS; i++ ) { - if( My_Rendezvous[i].Discovery_Ref ) Unregister( i ); + if( My_Rendezvous[i].Desc[0] ) Unregister( i ); } + +#ifdef HOWL + sw_discovery_fina( My_Discovery_Session ); +#endif } /* Rendezvous_Exit */ -GLOBAL BOOLEAN Rendezvous_Register( CHAR *Name, CHAR *Type, UINT Port ) +GLOBAL bool Rendezvous_Register( char *Name, char *Type, unsigned int Port ) { /* Register new service */ - INT i; + int i; /* Search free port structure */ - for( i = 0; i < MAX_RENDEZVOUS; i++ ) if( ! My_Rendezvous[i].Discovery_Ref ) break; + for( i = 0; i < MAX_RENDEZVOUS; i++ ) if( ! My_Rendezvous[i].Desc[0] ) break; if( i >= MAX_RENDEZVOUS ) { Log( LOG_ERR, "Can't register \"%s\" with Rendezvous: limit (%d) reached!", Name, MAX_RENDEZVOUS ); - return FALSE; + return false; } strlcpy( My_Rendezvous[i].Desc, Name, sizeof( My_Rendezvous[i].Desc )); +#ifdef APPLE /* Register new service */ - My_Rendezvous[i].Discovery_Ref = DNSServiceRegistrationCreate( Name, Type, "", htonl( Port ), "", Registration_Reply_Handler, My_Rendezvous[i].Desc ); + My_Rendezvous[i].Discovery_Ref = DNSServiceRegistrationCreate( Name, Type, "", htonl( Port ), "", Registration_Reply_Handler, &My_Rendezvous[i] ); if( ! My_Rendezvous[i].Discovery_Ref ) { Log( LOG_ERR, "Can't register \"%s\" with Rendezvous: can't register service!", My_Rendezvous[i].Desc ); - return FALSE; + My_Rendezvous[i].Desc[0] = '\0'; + return false; } /* Get and save the corresponding Mach Port */ @@ -117,28 +176,39 @@ GLOBAL BOOLEAN Rendezvous_Register( CHAR Log( LOG_ERR, "Can't register \"%s\" with Rendezvous: got no Mach Port!", My_Rendezvous[i].Desc ); /* Here we actually leek a descriptor :-( */ My_Rendezvous[i].Discovery_Ref = 0; - return FALSE; + My_Rendezvous[i].Desc[0] = '\0'; + return false; + } +#endif /* Apple */ + +#ifdef HOWL + if( sw_discovery_publish( My_Discovery_Session, 0, Name, Type, NULL, NULL, Port, NULL, 0, Registration_Reply_Handler, &My_Rendezvous[i], &My_Rendezvous[i].Id ) != SW_OKAY ) + { + Log( LOG_ERR, "Can't register \"%s\" with Rendezvous: can't register service!", My_Rendezvous[i].Desc ); + My_Rendezvous[i].Desc[0] = '\0'; + return false; } +#endif /* Howl */ Log( LOG_DEBUG, "Rendezvous: Registering \"%s\" ...", My_Rendezvous[i].Desc ); - return TRUE; + return true; } /* Rendezvous_Register */ -GLOBAL BOOLEAN Rendezvous_Unregister( CHAR *Name ) +GLOBAL bool Rendezvous_Unregister( char *Name ) { /* Unregister service from rendezvous */ - INT i; - BOOLEAN ok; + int i; + bool ok; - ok = FALSE; + ok = false; for( i = 0; i < MAX_RENDEZVOUS; i++ ) { if( strcmp( Name, My_Rendezvous[i].Desc ) == 0 ) { Unregister( i ); - ok = TRUE; + ok = true; } } @@ -146,26 +216,27 @@ GLOBAL BOOLEAN Rendezvous_Unregister( CH } /* Rendezvous_Unregister */ -GLOBAL VOID Rendezvous_UnregisterListeners( VOID ) +GLOBAL void Rendezvous_UnregisterListeners( void ) { /* Unregister all our listening sockets from Rendezvous */ - INT i; + int i; for( i = 0; i < MAX_RENDEZVOUS; i++ ) { - if( My_Rendezvous[i].Discovery_Ref ) Unregister( i ); + if( My_Rendezvous[i].Desc[0] ) Unregister( i ); } } /* Rendezvous_UnregisterListeners */ -GLOBAL VOID Rendezvous_Handler( VOID ) +GLOBAL void Rendezvous_Handler( void ) { /* Handle all Rendezvous stuff; this function must be called * periodically from the run loop of the main program */ - INT i; - CHAR buffer[MAX_MACH_MSG_SIZE]; +#ifdef APPLE + int i; + char buffer[MAX_MACH_MSG_SIZE]; mach_msg_return_t result; mach_msg_header_t *msg; @@ -180,20 +251,53 @@ GLOBAL VOID Rendezvous_Handler( VOID ) /* Handle message */ if( result == MACH_MSG_SUCCESS ) DNSServiceDiscovery_handleReply( msg ); #ifdef DEBUG - else if( result != MACH_RCV_TIMED_OUT ) Log( LOG_DEBUG, "mach_msg(): %ld", (LONG)result ); -#endif + else if( result != MACH_RCV_TIMED_OUT ) Log( LOG_DEBUG, "mach_msg(): %ld", (long)result ); +#endif /* Debug */ } +#endif /* Apple */ + +#ifdef HOWL + sw_ulong msecs = 10; + sw_salt_step( My_Salt, &msecs ); +#endif } /* Rendezvous_Handler */ -LOCAL VOID Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrCode, VOID *Context ) +LOCAL void Unregister( int Idx ) { - CHAR txt[50]; + /* Unregister service */ + +#ifdef APPLE + DNSServiceDiscoveryDeallocate( My_Rendezvous[Idx].Discovery_Ref ); +#endif /* Apple */ + +#ifdef HOWL + if( sw_discovery_cancel( My_Discovery_Session, My_Rendezvous[Idx].Id ) != SW_OKAY ) + { + Log( LOG_ERR, "Rendezvous: Failed to unregister \"%s\"!", My_Rendezvous[Idx].Desc ); + return; + } +#endif /* Howl */ + + Log( LOG_INFO, "Unregistered \"%s\" from Rendezvous.", My_Rendezvous[Idx].Desc ); + My_Rendezvous[Idx].Desc[0] = '\0'; +} /* Unregister */ + + +/* -- Apple API -- */ + +#ifdef APPLE + + +LOCAL void Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrCode, void *Context ) +{ + SERVICE *s = (SERVICE *)Context; + char txt[50]; if( ErrCode == kDNSServiceDiscoveryNoError ) { /* Success! */ - Log( LOG_INFO, "Successfully registered \"%s\" with Rendezvous.", Context ? Context : "NULL" ); + Log( LOG_INFO, "Successfully registered \"%s\" with Rendezvous.", s->Desc ); return; } @@ -206,21 +310,54 @@ LOCAL VOID Registration_Reply_Handler( D strcpy( txt, "name conflict!" ); break; default: - sprintf( txt, "error code %ld!", (LONG)ErrCode ); + sprintf( txt, "error code %ld!", (long)ErrCode ); } - Log( LOG_INFO, "Can't register \"%s\" with Rendezvous: %s", Context ? Context : "NULL", txt ); + Log( LOG_INFO, "Can't register \"%s\" with Rendezvous: %s", s->Desc, txt ); + s->Desc[0] = '\0'; } /* Registration_Reply_Handler */ -LOCAL VOID Unregister( INT Idx ) +#endif /* Apple */ + + +/* -- Howl API -- */ + +#ifdef HOWL + + +LOCAL sw_result HOWL_API Registration_Reply_Handler( sw_discovery Session, sw_discovery_publish_status Status, UNUSED sw_discovery_oid Id, sw_opaque Extra ) { - /* Unregister service */ + SERVICE *s = (SERVICE *)Extra; + char txt[50]; - DNSServiceDiscoveryDeallocate( My_Rendezvous[Idx].Discovery_Ref ); - Log( LOG_INFO, "Unregistered \"%s\" from Rendezvous.", My_Rendezvous[Idx].Desc ); - My_Rendezvous[Idx].Discovery_Ref = 0; -} /* Unregister */ + assert( Session == My_Discovery_Session ); + assert( Extra != NULL ); + + if( Status == SW_DISCOVERY_PUBLISH_STARTED || Status == SW_DISCOVERY_PUBLISH_STOPPED ) + { + /* Success! */ + Log( LOG_INFO, "Successfully registered \"%s\" with Rendezvous.", s->Desc ); + return SW_OKAY; + } + + switch( Status ) + { + case SW_DISCOVERY_PUBLISH_NAME_COLLISION: + strcpy( txt, "name conflict!" ); + break; + default: + sprintf( txt, "error code %ld!", (long)Status ); + } + + Log( LOG_INFO, "Can't register \"%s\" with Rendezvous: %s", s->Desc, txt ); + s->Desc[0] = '\0'; + + return SW_OKAY; +} /* Registration_Reply_Handler */ + + +#endif /* Howl */ #endif /* RENDEZVOUS */ Index: src/ngircd/rendezvous.h =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/rendezvous.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -p -r1.1 -r1.2 --- src/ngircd/rendezvous.h 23 Feb 2003 12:02:26 -0000 1.1 +++ src/ngircd/rendezvous.h 19 Mar 2005 18:43:49 -0000 1.2 @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: rendezvous.h,v 1.1 2003/02/23 12:02:26 alex Exp $ + * $Id: rendezvous.h,v 1.2 2005/03/19 18:43:49 fw Exp $ * * "Rendezvous" functions (Header) */ @@ -20,15 +20,15 @@ #define __rdezvous_h__ -GLOBAL VOID Rendezvous_Init( VOID ); -GLOBAL VOID Rendezvous_Exit( VOID ); +GLOBAL void Rendezvous_Init( void ); +GLOBAL void Rendezvous_Exit( void ); -GLOBAL BOOLEAN Rendezvous_Register( CHAR *Name, CHAR *Type, UINT Port ); +GLOBAL bool Rendezvous_Register( char *Name, char *Type, unsigned int Port ); -GLOBAL BOOLEAN Rendezvous_Unregister( CHAR *Name ); -GLOBAL VOID Rendezvous_UnregisterListeners( VOID ); +GLOBAL bool Rendezvous_Unregister( char *Name ); +GLOBAL void Rendezvous_UnregisterListeners( void ); -GLOBAL VOID Rendezvous_Handler( VOID ); +GLOBAL void Rendezvous_Handler( void ); #endif /* __rdezvous_h__ */ Index: src/ngircd/resolve.c =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/resolve.c,v retrieving revision 1.8.2.1 retrieving revision 1.12 diff -u -p -r1.8.2.1 -r1.12 --- src/ngircd/resolve.c 15 May 2004 23:52:17 -0000 1.8.2.1 +++ src/ngircd/resolve.c 28 May 2005 10:46:50 -0000 1.12 @@ -14,7 +14,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: resolve.c,v 1.8.2.1 2004/05/15 23:52:17 alex Exp $"; +static char UNUSED id[] = "$Id: resolve.c,v 1.12 2005/05/28 10:46:50 fw Exp $"; #include "imp.h" #include @@ -42,20 +42,22 @@ static char UNUSED id[] = "$Id: resolve. #ifdef IDENTAUTH -LOCAL VOID Do_ResolveAddr PARAMS(( struct sockaddr_in *Addr, INT Sock, INT w_fd )); +LOCAL void Do_ResolveAddr PARAMS(( struct sockaddr_in *Addr, int Sock, int w_fd )); #else -LOCAL VOID Do_ResolveAddr PARAMS(( struct sockaddr_in *Addr, INT w_fd )); +LOCAL void Do_ResolveAddr PARAMS(( struct sockaddr_in *Addr, int w_fd )); #endif -LOCAL VOID Do_ResolveName PARAMS(( CHAR *Host, INT w_fd )); +LOCAL void Do_ResolveName PARAMS(( char *Host, int w_fd )); #ifdef h_errno -LOCAL CHAR *Get_Error PARAMS(( INT H_Error )); +LOCAL char *Get_Error PARAMS(( int H_Error )); #endif +LOCAL RES_STAT *New_Res_Stat PARAMS(( void )); -GLOBAL VOID -Resolve_Init( VOID ) + +GLOBAL void +Resolve_Init( void ) { /* Initialize module */ @@ -75,23 +77,10 @@ Resolve_Addr( struct sockaddr_in *Addr ) * can't be forked, this functions returns NULL. */ RES_STAT *s; - INT pid; + int pid; - /* Allocate memory */ - s = (RES_STAT *)malloc( sizeof( RES_STAT )); - if( ! s ) - { - Log( LOG_EMERG, "Resolver: Can't allocate memory! [Resolve_Addr]" ); - return NULL; - } - - /* Initialize pipe for result */ - if( pipe( s->pipe ) != 0 ) - { - free( s ); - Log( LOG_ALERT, "Resolver: Can't create output pipe: %s!", strerror( errno )); - return NULL; - } + s = New_Res_Stat( ); + if( ! s ) return NULL; /* For sub-process */ pid = fork( ); @@ -102,8 +91,6 @@ Resolve_Addr( struct sockaddr_in *Addr ) FD_SET( s->pipe[0], &Resolver_FDs ); if( s->pipe[0] > Conn_MaxFD ) Conn_MaxFD = s->pipe[0]; s->pid = pid; - s->stage = 0; - s->bufpos = 0; return s; } else if( pid == 0 ) @@ -129,29 +116,16 @@ Resolve_Addr( struct sockaddr_in *Addr ) GLOBAL RES_STAT * -Resolve_Name( CHAR *Host ) +Resolve_Name( char *Host ) { /* Resolve hostname (asynchronous!). On errors, e.g. if the child * process can't be forked, this functions returns NULL. */ RES_STAT *s; - INT pid; + int pid; - /* Allocate memory */ - s = (RES_STAT *)malloc( sizeof( RES_STAT )); - if( ! s ) - { - Log( LOG_EMERG, "Resolver: Can't allocate memory! [Resolve_Name]" ); - return NULL; - } - - /* Initialize the pipe for the result */ - if( pipe( s->pipe ) != 0 ) - { - free( s ); - Log( LOG_ALERT, "Resolver: Can't create output pipe: %s!", strerror( errno )); - return NULL; - } + s = New_Res_Stat( ); + if( ! s ) return NULL; /* Fork sub-process */ pid = fork( ); @@ -162,8 +136,6 @@ Resolve_Name( CHAR *Host ) FD_SET( s->pipe[0], &Resolver_FDs ); if( s->pipe[0] > Conn_MaxFD ) Conn_MaxFD = s->pipe[0]; s->pid = pid; - s->stage = 0; - s->bufpos = 0; return s; } else if( pid == 0 ) @@ -185,26 +157,26 @@ Resolve_Name( CHAR *Host ) #ifdef IDENTAUTH -LOCAL VOID -Do_ResolveAddr( struct sockaddr_in *Addr, int Sock, INT w_fd ) +LOCAL void +Do_ResolveAddr( struct sockaddr_in *Addr, int Sock, int w_fd ) #else -LOCAL VOID -Do_ResolveAddr( struct sockaddr_in *Addr, INT w_fd ) +LOCAL void +Do_ResolveAddr( struct sockaddr_in *Addr, int w_fd ) #endif { /* Resolver sub-process: resolve IP address and write result into * pipe to parent. */ - CHAR hostname[HOST_LEN]; + char hostname[HOST_LEN]; struct hostent *h; - INT len; + size_t len; #ifdef IDENTAUTH - CHAR *res; + char *res; #endif /* Resolve IP address */ Log_Resolver( LOG_DEBUG, "Now resolving %s ...", inet_ntoa( Addr->sin_addr )); - h = gethostbyaddr( (CHAR *)&Addr->sin_addr, sizeof( Addr->sin_addr ), AF_INET ); + h = gethostbyaddr( (char *)&Addr->sin_addr, sizeof( Addr->sin_addr ), AF_INET ); if( h ) strlcpy( hostname, h->h_name, sizeof( hostname )); else { @@ -234,9 +206,12 @@ Do_ResolveAddr( struct sockaddr_in *Addr Log_Resolver( LOG_DEBUG, "Ok, IDENT lookup on socket %d done: \"%s\"", Sock, res ? res : "" ); /* Write IDENT result into pipe to parent */ - len = strlen( res ? res : "" ); - if( res != NULL ) res[len] = '\n'; - len++; + if (res) { + len = strlen(res); + res[len] = '\n'; + len++; + } else len = 1; + if( (size_t)write( w_fd, res ? res : "\n", len ) != (size_t)len ) { Log_Resolver( LOG_CRIT, "Resolver: Can't write to parent (IDENT): %s!", strerror( errno )); @@ -247,16 +222,16 @@ Do_ResolveAddr( struct sockaddr_in *Addr } /* Do_ResolveAddr */ -LOCAL VOID -Do_ResolveName( CHAR *Host, INT w_fd ) +LOCAL void +Do_ResolveName( char *Host, int w_fd ) { /* Resolver sub-process: resolve name and write result into pipe * to parent. */ - CHAR ip[16]; + char ip[16]; struct hostent *h; struct in_addr *addr; - INT len; + int len; Log_Resolver( LOG_DEBUG, "Now resolving \"%s\" ...", Host ); @@ -274,7 +249,7 @@ Do_ResolveName( CHAR *Host, INT w_fd ) #else Log_Resolver( LOG_WARNING, "Can't resolve \"%s\"!", Host ); #endif - strcpy( ip, "" ); + ip[0] = '\0'; } if( ip[0] ) Log_Resolver( LOG_DEBUG, "Ok, translated \"%s\" to %s.", Host, ip ); @@ -291,8 +266,8 @@ Do_ResolveName( CHAR *Host, INT w_fd ) #ifdef h_errno -LOCAL CHAR * -Get_Error( INT H_Error ) +LOCAL char * +Get_Error( int H_Error ) { /* Get error message for H_Error */ @@ -314,4 +289,33 @@ Get_Error( INT H_Error ) #endif +LOCAL RES_STAT * +New_Res_Stat( void ) +{ + RES_STAT *s; + + /* Allocate memory */ + s = (RES_STAT *)malloc( sizeof( RES_STAT )); + if( ! s ) + { + Log( LOG_EMERG, "Resolver: Can't allocate memory! [Resolve_Addr]" ); + return NULL; + } + + /* Initialize pipe for result */ + if( pipe( s->pipe ) != 0 ) + { + free( s ); + Log( LOG_ALERT, "Resolver: Can't create output pipe: %s!", strerror( errno )); + return NULL; + } + + s->stage = 0; + s->bufpos = 0; + s->pid = -1; + + return s; +} /* New_Res_Stat */ + + /* -eof- */ Index: src/ngircd/resolve.h =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/ngircd/resolve.h,v retrieving revision 1.6.2.1 retrieving revision 1.8 diff -u -p -r1.6.2.1 -r1.8 --- src/ngircd/resolve.h 15 May 2004 23:52:17 -0000 1.6.2.1 +++ src/ngircd/resolve.h 19 Mar 2005 18:43:49 -0000 1.8 @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: resolve.h,v 1.6.2.1 2004/05/15 23:52:17 alex Exp $ + * $Id: resolve.h,v 1.8 2005/03/19 18:43:49 fw Exp $ * * Asynchronous resolver (header) */ @@ -27,18 +27,18 @@ typedef struct _Res_Stat { - INT pid; /* PID des Child-Prozess */ - INT pipe[2]; /* Pipe fuer IPC */ - INT stage; /* Hostname/IP(0) or IDENT(1)? */ - INT bufpos; /* Position in buffer */ - CHAR buffer[HOST_LEN]; /* Buffer */ + int pid; /* PID des Child-Prozess */ + int pipe[2]; /* Pipe fuer IPC */ + int stage; /* Hostname/IP(0) or IDENT(1)? */ + int bufpos; /* Position in buffer */ + char buffer[HOST_LEN]; /* Buffer */ } RES_STAT; GLOBAL fd_set Resolver_FDs; -GLOBAL VOID Resolve_Init PARAMS(( VOID )); +GLOBAL void Resolve_Init PARAMS(( void )); #ifdef IDENTAUTH GLOBAL RES_STAT *Resolve_Addr PARAMS(( struct sockaddr_in *Addr, int Sock )); @@ -46,7 +46,7 @@ GLOBAL RES_STAT *Resolve_Addr PARAMS(( s GLOBAL RES_STAT *Resolve_Addr PARAMS(( struct sockaddr_in *Addr )); #endif -GLOBAL RES_STAT *Resolve_Name PARAMS(( CHAR *Host )); +GLOBAL RES_STAT *Resolve_Name PARAMS(( char *Host )); #endif Index: src/portab/Makefile.am =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/portab/Makefile.am,v retrieving revision 1.7 retrieving revision 1.8 diff -u -p -r1.7 -r1.8 --- src/portab/Makefile.am 3 Jan 2003 22:04:14 -0000 1.7 +++ src/portab/Makefile.am 16 Apr 2005 09:23:01 -0000 1.8 @@ -9,14 +9,14 @@ # Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste # der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. # -# $Id: Makefile.am,v 1.7 2003/01/03 22:04:14 alex Exp $ +# $Id: Makefile.am,v 1.8 2005/04/16 09:23:01 fw Exp $ # AUTOMAKE_OPTIONS = ansi2knr noinst_LIBRARIES = libngportab.a -libngportab_a_SOURCES = strlcpy.c vsnprintf.c +libngportab_a_SOURCES = strlcpy.c strdup.c vsnprintf.c check_PROGRAMS = portabtest Index: src/portab/portab.h =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/portab/portab.h,v retrieving revision 1.17 retrieving revision 1.21 diff -u -p -r1.17 -r1.21 --- src/portab/portab.h 15 Mar 2004 19:26:39 -0000 1.17 +++ src/portab/portab.h 16 Apr 2005 09:23:01 -0000 1.21 @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2003 by Alexander Barton (alex@barton.de) + * Copyright (c)2001-2005 Alexander Barton (alex@barton.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: portab.h,v 1.17 2004/03/15 19:26:39 alex Exp $ + * $Id: portab.h,v 1.21 2005/04/16 09:23:01 fw Exp $ * * Portability functions and declarations (header for libngbportab). */ @@ -20,10 +20,31 @@ #include "config.h" +#ifndef DEBUG +# define NDEBUG +#endif + #ifdef HAVE_SYS_TYPES_H # include #endif +#ifdef HAVE_INTTYPES_H +# include +# define NGIRC_GOT_INTTYPES +#else +# ifdef HAVE_STDINT_H +# include +# define NGIRC_GOT_INTTYPES +# endif +#endif + +#ifdef HAVE_STDDEF_H +# include +#endif + +#ifdef HAVE_STDBOOL_H +# include +#endif /* compiler features */ @@ -45,13 +66,7 @@ /* keywords */ - -#define EXTERN extern -#define STATIC static #define LOCAL static -#define CONST const -#define REGISTER register - /* datatypes */ @@ -61,40 +76,31 @@ # endif #endif -typedef void VOID; typedef void POINTER; -typedef signed int INT; -typedef unsigned int UINT; -typedef signed long LONG; -typedef unsigned long ULONG; - -typedef signed char INT8; +#ifdef NGIRC_GOT_INTTYPES +typedef uint8_t UINT8; +typedef uint16_t UINT16; +typedef uint32_t UINT32; +#else typedef unsigned char UINT8; -typedef signed short INT16; typedef unsigned short UINT16; -typedef signed long INT32; -typedef unsigned long UINT32; - -typedef double DOUBLE; -typedef float FLOAT; - -typedef char CHAR; - -typedef UINT8 BOOLEAN; - -#undef TRUE -#define TRUE (BOOLEAN)1 +typedef unsigned int UINT32; +#endif -#undef FALSE -#define FALSE (BOOLEAN)0 +#ifndef HAVE_STDBOOL_H +typedef unsigned char bool; +#define true (bool)1 +#define false (bool)0 +#endif -#undef NULL +#ifndef NULL #ifdef PROTOTYPES -# define NULL (VOID *)0 +# define NULL (void *)0 #else # define NULL 0L #endif +#endif #undef GLOBAL #define GLOBAL @@ -126,24 +132,28 @@ typedef UINT8 BOOLEAN; /* configure options */ #ifndef HAVE_socklen_t -#define socklen_t int /* u.a. fuer Mac OS X */ +typedef int socklen_t; /* for Mac OS X, amongst others */ #endif #ifndef HAVE_SNPRINTF -EXTERN INT snprintf PARAMS(( CHAR *str, size_t count, CONST CHAR *fmt, ... )); +extern int snprintf PARAMS(( char *str, size_t count, const char *fmt, ... )); #endif #ifndef HAVE_STRLCAT -EXTERN size_t strlcat PARAMS(( CHAR *dst, CONST CHAR *src, size_t size )); +extern size_t strlcat PARAMS(( char *dst, const char *src, size_t size )); #endif #ifndef HAVE_STRLCPY -EXTERN size_t strlcpy PARAMS(( CHAR *dst, CONST CHAR *src, size_t size )); +extern size_t strlcpy PARAMS(( char *dst, const char *src, size_t size )); +#endif + +#ifndef HAVE_STRDUP +extern char * strdup PARAMS(( const char *s )); #endif #ifndef HAVE_VSNPRINTF #include -EXTERN INT vsnprintf PARAMS(( CHAR *str, size_t count, CONST CHAR *fmt, va_list args )); +extern int vsnprintf PARAMS(( char *str, size_t count, const char *fmt, va_list args )); #endif #ifndef PACKAGE_NAME Index: src/portab/portabtest.c =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/portab/portabtest.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -p -r1.11 -r1.12 --- src/portab/portabtest.c 4 Jan 2003 10:40:01 -0000 1.11 +++ src/portab/portabtest.c 19 Mar 2005 18:43:50 -0000 1.12 @@ -14,7 +14,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: portabtest.c,v 1.11 2003/01/04 10:40:01 alex Exp $"; +static char UNUSED id[] = "$Id: portabtest.c,v 1.12 2005/03/19 18:43:50 fw Exp $"; #include "imp.h" #include @@ -25,20 +25,17 @@ static char UNUSED id[] = "$Id: portabte #include "exp.h" -LOCAL VOID Panic PARAMS (( CHAR *Reason, INT Code )); +LOCAL void Panic PARAMS (( char *Reason, int Code )); GLOBAL int -main( VOID ) +main( void ) { /* validate datatypes */ - if( FALSE != 0 ) Panic( "FALSE", 1 ); - if( TRUE != 1 ) Panic( "TRUE", 1 ); - if( sizeof( INT8 ) != 1 ) Panic( "INT8", 1 ); + if( false != 0 ) Panic( "false", 1 ); + if( true != 1 ) Panic( "true", 1 ); if( sizeof( UINT8 ) != 1 ) Panic( "UINT8", 1 ); - if( sizeof( INT16 ) != 2 ) Panic( "INT16", 1 ); if( sizeof( UINT16 ) != 2 ) Panic( "UINT16", 1 ); - if( sizeof( INT32 ) != 4 ) Panic( "INT32", 1 ); if( sizeof( UINT32 ) != 4 ) Panic( "UINT32", 1 ); #ifdef PROTOTYPES @@ -54,8 +51,8 @@ main( VOID ) } /* portab_check_types */ -LOCAL VOID -Panic( CHAR *Reason, INT Code ) +LOCAL void +Panic( char *Reason, int Code ) { /* Oops, something failed!? */ fprintf( stderr, "Oops, test for %s failed!?", Reason ); Index: src/portab/strdup.c =================================================================== RCS file: src/portab/strdup.c diff -N src/portab/strdup.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/portab/strdup.c 16 Apr 2005 09:20:53 -0000 1.1 @@ -0,0 +1,35 @@ +/* + * ngIRCd -- The Next Generation IRC Daemon + * + * strdup() implementation. Public domain. + * + * $Id: strdup.c,v 1.1 2005/04/16 09:20:53 fw Exp $ + */ + +#include "portab.h" + +#include "imp.h" +#include +#include +#include + +#include "exp.h" + +#ifndef HAVE_STRDUP + +GLOBAL char * +strdup( const char *s ) +{ + char *dup; + size_t len = strlen( s ); + size_t alloc = len + 1; + + if (len >= alloc ) return NULL; + dup = malloc( alloc ); + if (dup) strlcpy(dup, s, alloc ); + +return dup; +} + +#endif + Index: src/portab/strlcpy.c =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/portab/strlcpy.c,v retrieving revision 1.2.4.1 retrieving revision 1.5 diff -u -p -r1.2.4.1 -r1.5 --- src/portab/strlcpy.c 18 Jan 2005 09:09:05 -0000 1.2.4.1 +++ src/portab/strlcpy.c 19 Mar 2005 18:43:50 -0000 1.5 @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de) + * Copyright (c)2001-2005 Alexander Barton (alex@barton.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -13,13 +13,13 @@ * * Code partially borrowed from compat.c of rsync, written by Andrew * Tridgell (1998) and Martin Pool (2002): - * + * */ #include "portab.h" -static char UNUSED id[] = "$Id: strlcpy.c,v 1.2.4.1 2005/01/18 09:09:05 alex Exp $"; +static char UNUSED id[] = "$Id: strlcpy.c,v 1.5 2005/03/19 18:43:50 fw Exp $"; #include "imp.h" #include @@ -31,7 +31,7 @@ static char UNUSED id[] = "$Id: strlcpy. #ifndef HAVE_STRLCAT GLOBAL size_t -strlcat( CHAR *dst, CONST CHAR *src, size_t size ) +strlcat( char *dst, const char *src, size_t size ) { /* Like strncat() but does not 0 fill the buffer and * always null terminates. */ @@ -39,10 +39,10 @@ strlcat( CHAR *dst, CONST CHAR *src, siz 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 ) - { + + if( size && ( len1 < size - 1 )) { + if( len2 >= size - len1 ) + len2 = size - len1 - 1; memcpy( dst + len1, src, len2 ); dst[len1 + len2] = 0; } @@ -55,7 +55,7 @@ strlcat( CHAR *dst, CONST CHAR *src, siz #ifndef HAVE_STRLCPY GLOBAL size_t -strlcpy( CHAR *dst, CONST CHAR *src, size_t size ) +strlcpy( char *dst, const char *src, size_t size ) { /* Like strncpy but does not 0 fill the buffer and * always null terminates. */ @@ -63,10 +63,11 @@ strlcpy( CHAR *dst, CONST CHAR *src, siz 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; + if( size > 0 ) { + if( len >= size ) len = size - 1; + memcpy( dst, src, len ); + dst[len] = 0; + } return ret; } /* strlcpy */ Index: src/testsuite/Makefile.am =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/testsuite/Makefile.am,v retrieving revision 1.9.6.3 retrieving revision 1.14 diff -u -p -r1.9.6.3 -r1.14 --- src/testsuite/Makefile.am 8 Sep 2004 09:45:53 -0000 1.9.6.3 +++ src/testsuite/Makefile.am 8 Sep 2004 09:40:51 -0000 1.14 @@ -9,7 +9,7 @@ # Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste # der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. # -# $Id: Makefile.am,v 1.9.6.3 2004/09/08 09:45:53 alex Exp $ +# $Id: Makefile.am,v 1.14 2004/09/08 09:40:51 alex Exp $ # AUTOMAKE_OPTIONS = ../portab/ansi2knr Index: src/testsuite/README =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/testsuite/README,v retrieving revision 1.1.2.1 retrieving revision 1.1 diff -u -p -r1.1.2.1 -r1.1 --- src/testsuite/README 4 Sep 2004 20:49:36 -0000 1.1.2.1 +++ src/testsuite/README 4 Sep 2004 13:58:31 -0000 1.1 @@ -69,4 +69,4 @@ stress-B.e -- -$Id: README,v 1.1.2.1 2004/09/04 20:49:36 alex Exp $ +$Id: README,v 1.1 2004/09/04 13:58:31 alex Exp $ Index: src/testsuite/check-idle.e =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/testsuite/check-idle.e,v retrieving revision 1.1.8.1 retrieving revision 1.2 diff -u -p -r1.1.8.1 -r1.2 --- src/testsuite/check-idle.e 4 Sep 2004 20:49:36 -0000 1.1.8.1 +++ src/testsuite/check-idle.e 4 Sep 2004 14:22:13 -0000 1.2 @@ -1,4 +1,4 @@ -# $Id: check-idle.e,v 1.1.8.1 2004/09/04 20:49:36 alex Exp $ +# $Id: check-idle.e,v 1.2 2004/09/04 14:22:13 alex Exp $ spawn telnet localhost 6789 expect { Index: src/testsuite/functions.inc =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/testsuite/functions.inc,v retrieving revision 1.1.2.1 retrieving revision 1.1 diff -u -p -r1.1.2.1 -r1.1 --- src/testsuite/functions.inc 6 Sep 2004 22:07:26 -0000 1.1.2.1 +++ src/testsuite/functions.inc 6 Sep 2004 22:04:06 -0000 1.1 @@ -9,7 +9,7 @@ # (at your option) any later version. # Please read the file COPYING, README and AUTHORS for more information. # -# $Id: functions.inc,v 1.1.2.1 2004/09/06 22:07:26 alex Exp $ +# $Id: functions.inc,v 1.1 2004/09/06 22:04:06 alex Exp $ # # test how to call echo to get output without newline Index: src/testsuite/start-server.sh =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/testsuite/start-server.sh,v retrieving revision 1.11.2.2 retrieving revision 1.14 diff -u -p -r1.11.2.2 -r1.14 --- src/testsuite/start-server.sh 6 Sep 2004 22:07:26 -0000 1.11.2.2 +++ src/testsuite/start-server.sh 6 Sep 2004 22:04:06 -0000 1.14 @@ -1,6 +1,6 @@ #!/bin/sh # ngIRCd Test Suite -# $Id: start-server.sh,v 1.11.2.2 2004/09/06 22:07:26 alex Exp $ +# $Id: start-server.sh,v 1.14 2004/09/06 22:04:06 alex Exp $ [ -z "$srcdir" ] && srcdir=`dirname $0` Index: src/testsuite/stop-server.sh =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/testsuite/stop-server.sh,v retrieving revision 1.10.2.3 retrieving revision 1.13 diff -u -p -r1.10.2.3 -r1.13 --- src/testsuite/stop-server.sh 6 Sep 2004 22:07:26 -0000 1.10.2.3 +++ src/testsuite/stop-server.sh 6 Sep 2004 22:04:06 -0000 1.13 @@ -1,6 +1,6 @@ #!/bin/sh # ngIRCd Test Suite -# $Id: stop-server.sh,v 1.10.2.3 2004/09/06 22:07:26 alex Exp $ +# $Id: stop-server.sh,v 1.13 2004/09/06 22:04:06 alex Exp $ [ -z "$srcdir" ] && srcdir=`dirname $0` Index: src/testsuite/stress-server.sh =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/testsuite/stress-server.sh,v retrieving revision 1.8.2.2 retrieving revision 1.15 diff -u -p -r1.8.2.2 -r1.15 --- src/testsuite/stress-server.sh 6 Sep 2004 22:07:26 -0000 1.8.2.2 +++ src/testsuite/stress-server.sh 6 Sep 2004 22:04:06 -0000 1.15 @@ -9,7 +9,7 @@ # (at your option) any later version. # Please read the file COPYING, README and AUTHORS for more information. # -# $Id: stress-server.sh,v 1.8.2.2 2004/09/06 22:07:26 alex Exp $ +# $Id: stress-server.sh,v 1.15 2004/09/06 22:04:06 alex Exp $ # # detect source directory Index: src/testsuite/test-loop.sh =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/testsuite/test-loop.sh,v retrieving revision 1.2.2.1 retrieving revision 1.2 diff -u -p -r1.2.2.1 -r1.2 --- src/testsuite/test-loop.sh 4 Sep 2004 20:49:36 -0000 1.2.2.1 +++ src/testsuite/test-loop.sh 4 Sep 2004 19:14:46 -0000 1.2 @@ -9,7 +9,7 @@ # (at your option) any later version. # Please read the file COPYING, README and AUTHORS for more information. # -# $Id: test-loop.sh,v 1.2.2.1 2004/09/04 20:49:36 alex Exp $ +# $Id: test-loop.sh,v 1.2 2004/09/04 19:14:46 alex Exp $ # # detect source directory Index: src/testsuite/tests.sh =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/testsuite/tests.sh,v retrieving revision 1.4.2.2 retrieving revision 1.7 diff -u -p -r1.4.2.2 -r1.7 --- src/testsuite/tests.sh 6 Sep 2004 22:07:26 -0000 1.4.2.2 +++ src/testsuite/tests.sh 6 Sep 2004 22:04:06 -0000 1.7 @@ -1,6 +1,6 @@ #!/bin/sh # ngIRCd Test Suite -# $Id: tests.sh,v 1.4.2.2 2004/09/06 22:07:26 alex Exp $ +# $Id: tests.sh,v 1.7 2004/09/06 22:04:06 alex Exp $ # detect source directory [ -z "$srcdir" ] && srcdir=`dirname $0` Index: src/testsuite/wait-tests.sh =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/testsuite/wait-tests.sh,v retrieving revision 1.3.2.2 retrieving revision 1.4 diff -u -p -r1.3.2.2 -r1.4 --- src/testsuite/wait-tests.sh 6 Sep 2004 22:07:26 -0000 1.3.2.2 +++ src/testsuite/wait-tests.sh 6 Sep 2004 22:04:06 -0000 1.4 @@ -9,7 +9,7 @@ # (at your option) any later version. # Please read the file COPYING, README and AUTHORS for more information. # -# $Id: wait-tests.sh,v 1.3.2.2 2004/09/06 22:07:26 alex Exp $ +# $Id: wait-tests.sh,v 1.4 2004/09/06 22:04:06 alex Exp $ # [ "$1" -gt 0 ] 2> /dev/null && MAX="$1" || MAX=5 Index: src/tool/tool.c =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/tool/tool.c,v retrieving revision 1.1 retrieving revision 1.3 diff -u -p -r1.1 -r1.3 --- src/tool/tool.c 13 Jan 2003 12:20:16 -0000 1.1 +++ src/tool/tool.c 19 Mar 2005 18:43:52 -0000 1.3 @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de) + * Copyright (c)2001-2005 Alexander Barton (alex@barton.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -14,7 +14,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: tool.c,v 1.1 2003/01/13 12:20:16 alex Exp $"; +static char UNUSED id[] = "$Id: tool.c,v 1.3 2005/03/19 18:43:52 fw Exp $"; #include "imp.h" #include @@ -26,14 +26,14 @@ static char UNUSED id[] = "$Id: tool.c,v #include "tool.h" -GLOBAL VOID -ngt_TrimStr( CHAR *String ) +GLOBAL void +ngt_TrimStr( char *String ) { /* Mit ngt_TrimStr() werden fuehrende und folgende Leerzeichen, * Tabulatoren und Zeilenumbrueche (ASCII 10 und ASCII 13) aus * dem String entfernt. */ - CHAR *start, *ptr; + char *start, *ptr; assert( String != NULL ); @@ -51,14 +51,14 @@ ngt_TrimStr( CHAR *String ) } /* ngt_TrimStr */ -GLOBAL CHAR * -ngt_LowerStr( CHAR *String ) +GLOBAL char * +ngt_LowerStr( char *String ) { /* String in Kleinbuchstaben konvertieren. Der uebergebene * Speicherbereich wird durch das Ergebnis ersetzt, zusaetzlich * wird dieser auch als Pointer geliefert. */ - CHAR *ptr; + char *ptr; assert( String != NULL ); @@ -74,4 +74,23 @@ ngt_LowerStr( CHAR *String ) } /* ngt_LowerStr */ +GLOBAL void +ngt_TrimLastChr( char *String, const char Chr) +{ + /* If last character in the string matches Chr, remove it. + * Empty strings are handled correctly. */ + + unsigned int len; + + assert( String != NULL ); + + len = strlen( String ); + if( len == 0 ) return; + + len--; + + if( String[len] == Chr ) String[len] = '\0'; +} /* ngt_TrimLastChr */ + + /* -eof- */ Index: src/tool/tool.h =================================================================== RCS file: /srv/cvs/ngircd/ngircd/src/tool/tool.h,v retrieving revision 1.1 retrieving revision 1.3 diff -u -p -r1.1 -r1.3 --- src/tool/tool.h 13 Jan 2003 12:20:16 -0000 1.1 +++ src/tool/tool.h 19 Mar 2005 18:43:53 -0000 1.3 @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: tool.h,v 1.1 2003/01/13 12:20:16 alex Exp $ + * $Id: tool.h,v 1.3 2005/03/19 18:43:53 fw Exp $ * * Tool functions (Header) */ @@ -18,9 +18,11 @@ #define __tool_h__ -GLOBAL VOID ngt_TrimStr PARAMS((CHAR *String )); +GLOBAL void ngt_TrimLastChr PARAMS((char *String, const char Chr )); -GLOBAL CHAR *ngt_LowerStr PARAMS((CHAR *String )); +GLOBAL void ngt_TrimStr PARAMS((char *String )); + +GLOBAL char *ngt_LowerStr PARAMS((char *String )); #endif