.gitignore | 2 + ChangeLog | 116 ++++- INSTALL | 12 +- NEWS | 83 +++- config.guess | 331 +++++--------- config.sub | 94 ++-- configure.ng | 55 +-- contrib/Debian/changelog | 20 + contrib/Debian/rules | 22 +- contrib/MacOSX/ngIRCd.xcodeproj/project.pbxproj | 4 - contrib/ngircd.spec | 2 +- contrib/platformtest.sh | 58 ++- doc/Bopm.txt | 16 +- doc/Modes.txt | 3 +- doc/Platforms.txt | 31 +- doc/README-AUX.txt | 6 +- doc/Services.txt | 2 +- doc/sample-ngircd.conf.tmpl | 10 +- man/ngircd.conf.5.tmpl | 53 ++- src/ipaddr/ng_ipaddr.h | 2 + src/ngircd/array.c | 19 +- src/ngircd/channel.c | 13 +- src/ngircd/class.c | 8 +- src/ngircd/client-cap.c | 6 +- src/ngircd/client.c | 24 +- src/ngircd/client.h | 5 +- src/ngircd/conf.c | 26 +- src/ngircd/conf.h | 3 + src/ngircd/conn-encoding.c | 16 +- src/ngircd/conn-func.c | 30 +- src/ngircd/conn-ssl.c | 11 +- src/ngircd/conn-zip.c | 22 +- src/ngircd/conn.c | 574 ++++++++++++------------ src/ngircd/defines.h | 10 +- src/ngircd/hash.c | 4 +- src/ngircd/io.c | 18 +- src/ngircd/irc-cap.c | 7 +- src/ngircd/irc-channel.c | 21 +- src/ngircd/irc-encoding.c | 8 +- src/ngircd/irc-info.c | 70 ++- src/ngircd/irc-login.c | 15 +- src/ngircd/irc-macros.h | 16 +- src/ngircd/irc-metadata.c | 8 +- src/ngircd/irc-mode.c | 26 +- src/ngircd/irc-op.c | 25 +- src/ngircd/irc-oper.c | 24 +- src/ngircd/irc-server.c | 20 +- src/ngircd/irc-write.c | 26 +- src/ngircd/irc.c | 17 +- src/ngircd/lists.c | 19 +- src/ngircd/log.c | 15 +- src/ngircd/login.c | 16 +- src/ngircd/match.c | 132 +----- src/ngircd/messages.h | 2 + src/ngircd/ngircd.c | 9 - src/ngircd/numeric.c | 70 ++- src/ngircd/op.c | 12 +- src/ngircd/pam.c | 23 +- src/ngircd/parse.c | 150 +++---- src/ngircd/parse.h | 1 + src/ngircd/proc.c | 9 +- src/ngircd/resolve.c | 11 +- src/ngircd/sighandlers.c | 6 +- src/portab/Makefile.ng | 4 +- src/portab/exp.h | 21 - src/portab/imp.h | 21 - src/portab/portab.h | 89 ++-- src/portab/portabtest.c | 194 ++++++-- src/portab/strdup.c | 22 +- src/portab/strlcpy.c | 8 +- src/portab/strndup.c | 5 +- src/portab/vsnprintf.c | 144 ------ src/portab/waitpid.c | 3 - src/testsuite/.gitignore | 1 + src/testsuite/Makefile.ng | 5 +- src/testsuite/channel-test.e | 5 +- src/testsuite/check-idle.e | 5 +- src/testsuite/connect-test.e | 5 +- src/testsuite/invite-test.e | 5 +- src/testsuite/join-test.e | 5 +- src/testsuite/kick-test.e | 5 +- src/testsuite/message-test.e | 7 +- src/testsuite/misc-test.e | 5 +- src/testsuite/mode-test.e | 5 +- src/testsuite/opless-channel-test.e | 5 +- src/testsuite/server-link-test.e | 2 - src/testsuite/start-server.sh | 4 + src/testsuite/stress-A.e | 5 +- src/testsuite/stress-B.e | 5 +- src/testsuite/tests.sh | 5 +- src/testsuite/who-test.e | 5 +- src/testsuite/whois-test.e | 2 - src/tool/tool.c | 4 +- 93 files changed, 1398 insertions(+), 1672 deletions(-) diff --git a/.gitignore b/.gitignore index b4d402e..183dca2 100644 --- a/.gitignore +++ b/.gitignore @@ -8,11 +8,13 @@ ar-lib autom4te.cache build-stamp-ngircd* compile +config.cache config.log config.status configure configure.ac configure.lineno +cov-int cscope.out debian depcomp diff --git a/ChangeLog b/ChangeLog index a732af9..68cabc5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -9,6 +9,84 @@ -- ChangeLog -- +ngIRCd 22 (2014-10-11) + + - Match all list patterns case-insensitive: this affects the invite-, + ban-, and except lists, as well as G-Lines an K-Lines. + Problem pointed out by "wowaname" on #ngircd, thanks! + + ngIRCd 22~rc1 (2014-09-29) + - Sync "except lists" between servers: Up to now, ban, invite, and G-Line + lists have been synced between servers while linking -- but obviously + nobody noticed that except list have been missing ever since. Until now. + Thanks to "j4jackj", who reported this issue in #ngircd. + - Allow longer user names (up to 63 characters) for authentication. + - Correctly check that a server has a valid hostname and port, thanks to + David Binderman who reported this bug. + - Fix the function which generates complete "IRC masks" from user input, + don't destroy the source buffer and use all provided parts (nick, user, + host name). This fixes GLINEs/KLINEs from not working in some situations. + - Increase MAX_SERVERS from 16 to 64: There are installations out there + that would like to configure more than 16 links per server, so increase + this limit. Best would be to get rid of MAX_SERVERS altogether and make + if fully dynamic, but start with this quick and dirty hack ... + - Debian: Don't adjust path names that are correct by default and correctly + set and use "docdir". + - Update config.guess and config.sub to recent versions. + - Test suite/platformtest.sh: Detect when tests have been skipped. + - doc/Bopm.txt: Update "connregex" and "kline" for current ngIRCd. + - Allow "DefaultUserModes" to set all possible modes, including modes only + settable by IRC Operators. + - Spoofed prefixes: Really kill connection on non-server links. + - Implement user mode "F": "relaxed flood protection". Clients with mode + "F" set are allowed to rapidly send data to the daemon. This mode is only + settable by IRC Operators and can cause problems in the network -- so be + careful and only set it on "trusted" clients! + User mode "F" is used by Bahamut for this purpose, for example. + - Handle "throttling" in a single function: ngIRCd implements "command + throttling" and "bps throttling" (bytes per second). The states are + detected in different functions, Conn_Handler() and Read_Request(), but + handle the actual "throttling" in a common function: this enables us to + guarantee consistent behavior and to disable throttling for special + connections in only one place + - Use server password when PAM is compiled in but disabled. + - Streamline punctuation of log messages. + - Return ISUPPORT(005) numerics on "VERSION". This is how ircd-seven, + Charybdis, Hybrid, and InspIRCd behave, for example. + - configure: Only link "contrib/Debian" if it exists, which isn't the case + on "VPATH builds", for example. + - Show the account name in WHOIS. This uses the same numeric as Charybdis + and ircu families: WHOISLOGGEDIN(330). + - Pattern matching: Remove "range matching" in our pattern matching code + using the "[...]" syntax, because [ and ] are valid characters in nick + names and one has to quote them currently using the "\" character, which + is quite unexpected for users. + - platformtest.sh: New option "-x", don't regenerate build system and + allow using separate source and build trees. + - Test suite: explicitly enable glibc memory checking. + - Make "MODE -k" handling more robust and compatible, send "fake '*' key" + in all replies. + - Update configure.ng: ngIRCd requires GNU autoconf 2.61 for generating its + build system, so update the build system accordingly and implement all + changes that autoupdate(1) suggests: Update AC_PREREQ and AC_INIT, use + AC_LINK_IFELSE, AC_RUN_IFELSE, and AC_COMPILE_IFELSE, and remove + AC_TYPE_SIGNAL (we don't use RETSIGTYPE). + - portabtest: Actually test the functions snprintf(), strlcpy(), strlcat(), + and vsnprintf() for correctness, not only existence (which was quite + useless, because if they weren't available, the program could not have + been linked at all ...). + - Implement new configuration option "Network": it is used to set the + (completely optional) "network name", to which this instance of the + daemon belongs. When set, this name is used in the ISUPPORT(005) numeric + which is sent to all clients connecting to the server after logging in. + - Update doc/Platforms.txt. + - Various code cleanups, remove unused code, streamline error handling. + Remove all imp.h and exp.h header files, support non-standard vsnprintf() + return codes, and fix some K&R C portability issues. Streamline + DEBUG_ARRAY, DEBUG_BUFFER, DEBUG_IO, DEBUG_ZIP definitions. + - Increase penalty time to 10 seconds when handling OPER commands with an + invalid password. + ngIRCd 21.1 (2014-03-25) - Don't ignore but use the server password when PAM is compiled in but @@ -420,7 +498,7 @@ ngIRCd 20 (2012-12-17) the hash function. When "CloakHostSalt" is not set (the default), a random salt will be generated after each server restart. (Closes #133) -ngIRCd Release 19.2 (2012-06-19) +ngIRCd 19.2 (2012-06-19) - doc/Capabilities.txt: document "multi-prefix" capability @@ -450,7 +528,7 @@ ngIRCd Release 19.2 (2012-06-19) - Fix: Don't ignore "permission denied" errors when enabling chroot. - FAQ: enhance description of chroot setup. -ngIRCd Release 19.1 (2012-03-19) +ngIRCd 19.1 (2012-03-19) - Fix gcc warning (v4.6.3), initialize "list" variable to NULL. - Fix typos: "recieved" -> "received", "Please not" -> "Please note", @@ -460,7 +538,7 @@ ngIRCd Release 19.1 (2012-03-19) - getpid.sh: Fix test case error for Debian using sbuild(1). - Don't log "ngIRCd hello message" two times when starting up. -ngIRCd Release 19 (2012-02-29) +ngIRCd 19 (2012-02-29) - Update build system: bump config.guess and config.sub files used by GNU autoconf/automake to recent versions. @@ -610,7 +688,7 @@ ngIRCd Release 19 (2012-02-29) asynchronous nature of the IRC protocol. So don't break server- links, only log a message and ignore the command. (Closes #113) -ngIRCd Release 18 (2011-07-10) +ngIRCd 18 (2011-07-10) - Update timestamp of ngircd(8) manual page. - Add preliminary ngIRCd protocol module for Anope 1.9 to contrib/Anope/. @@ -720,7 +798,7 @@ ngIRCd Release 18 (2011-07-10) only relevant when a trusted server on a server-server link sends invalid commands). -ngIRCd Release 17.1 (2010-12-19) +ngIRCd 17.1 (2010-12-19) - --configtest: remember if MOTD is configured by file or phrase - Enhance log messages when establishing server links a little bit @@ -736,7 +814,7 @@ ngIRCd Release 17.1 (2010-12-19) - New numeric 329: get channel creation time on "MODE #chan" commands - Save channel creation time; new function Channel_CreationTime() -ngIRCd Release 17 (2010-11-07) +ngIRCd 17 (2010-11-07) - doc: change path names in sample-ngircd.conf depending on sysconfdir - Fix up generation and distribution of sample-ngircd.conf @@ -817,7 +895,7 @@ ngIRCd Release 17 (2010-11-07) - Fix "beeing" typo ... - SSL/TLS: fix bogus "socket closed" error message. -ngIRCd Release 16 (2010-05-02) +ngIRCd 16 (2010-05-02) - doc/SSL: remove line continuation marker @@ -857,7 +935,7 @@ ngIRCd Release 16 (2010-05-02) every channel, and c) remote clients using a server not supporting this mode are not checked either and therefore always allowed to join. -ngIRCd Release 15 (2009-11-07) +ngIRCd 15 (2009-11-07) - "ngircd --configtest": print SSL configuration options even when unset. @@ -883,7 +961,7 @@ ngIRCd Release 15 (2009-11-07) - Fix a few error handling glitches for SSL/TLS connections. - Minor fixes to manual pages and documentation. -ngIRCd Release 14.1 (2009-05-05) +ngIRCd 14.1 (2009-05-05) - Security: fix remotely triggerable crash in SSL/TLS code. - BSD start script contrib/ngircd.sh has been renamed to ngircd-bsd.sh. @@ -896,7 +974,7 @@ ngIRCd Release 14.1 (2009-05-05) - Fix server list announcement. - Do not remove host names from info text. -ngIRCd Release 14 (2009-04-20) +ngIRCd 14 (2009-04-20) - Display IPv6 addresses as "[]" when accepting connections. @@ -920,7 +998,7 @@ ngIRCd Release 14 (2009-04-20) - Fix handling of channels containing dots. (closes ug #93, reported by Gonosz Csiga) -ngIRCd Release 13 (2008-12-25) +ngIRCd 13 (2008-12-25) - Updated documentation, especially doc/Services.txt and doc/SSL.txt. - Make the test suite work on OpenSolaris. @@ -1011,7 +1089,7 @@ ngIRCd 0.11.0 (2008-01-15) ngIRCd 0.11.0-pre2 (2008-01-07) - SECURITY: IRC_PART could reference invalid memory, causing ngircd to crash [from HEAD]. (CVE-2008-0285) - + ngIRCd 0.11.0-pre1 (2008-01-02) - Use dotted-decimal IP address if host name is >= 64. - Add support for /STAT u (server uptime) command. @@ -1045,7 +1123,7 @@ ngIRCd 0.10.4 (2008-01-07) - SECURITY: IRC_PART could reference invalid memory, causing ngircd to crash [from HEAD]. (CVE-2008-0285) - + ngIRCd 0.10.3 (2007-08-01) - SECURITY: Fixed a severe bug in handling JOIN commands, which could @@ -1351,7 +1429,7 @@ ngIRCd 0.7.0 (2003-05-01) - Documentation is now installed in $(datadir)/doc/ngircd. - Enhanced handling of NJOIN in case of nick collisions. -ngIRCd 0.6.1, 2003-01-21 +ngIRCd 0.6.1 (2003-01-21) - Fixed KILL: you can't crash the server by killing yourself any more, ngIRCd no longer sends a QUIT to other servers after the KILL, and you @@ -1372,15 +1450,15 @@ ngIRCd 0.6.1, 2003-01-21 Older changes (sorry, only available in german language): -ngIRCd 0.6.0, 2002-12-24 +ngIRCd 0.6.0, 24.12.2002 - ngIRCd 0.6.0-pre2, 2002-12-23 + ngIRCd 0.6.0-pre2, 23.12.2002 - neuer Numeric 005 ("Features") beim Connect. - LUSERS erweitert: nun wird die maximale Anzahl der lokalen und globalen Clients, die dem Server bzw. im Netzwerk seit dem letzten (Re-)Start dem Server gleichzeitig bekannt waren, angezeigt. - ngIRCd 0.6.0-pre1, 2002-12-18 + ngIRCd 0.6.0-pre1, 18.12.2002 - beim Schliessen einer Verbindung zeigt der Server nun vor dem ERROR noch eine Statistik ueber die empfangene und gesendete Datenmenge an. - der Server wartet bei einer eingehenden Verbindung nun laenger auf den @@ -1431,7 +1509,7 @@ ngIRCd 0.6.0, 2002-12-24 ngIRCd 0.5.4, 24.11.2002 - - Fehler-Handling von connect() gefixed: der Server kann sich nun auch + - Fehler-Handling von connect() gefixed: der Server kann sich nun auch unter A/UX wieder zu anderen verbinden. - in den Konfigurationsvariablen ServerUID und ServerGID kann nun nicht nur die numerische ID, sondern auch der Name des Users bzw. der Gruppe @@ -1543,7 +1621,7 @@ ngIRCd 0.5.0, 20.09.2002 - ADMIN-Befehl implementiert. Die Daten hierzu werden in der Konfig-Datei im [Global]-Abschnitt mit den Variablen "AdminInfo1", "AdminInfo2" und "AdminEMail" konfiguriert. - + ngIRCd 0.4.3, 11.06.2002 - Bei PRIVMSG und NOTICE hat der ngIRCd nicht ueberpruft, ob das Ziel diff --git a/INSTALL b/INSTALL index 998274a..cf33fa3 100644 --- a/INSTALL +++ b/INSTALL @@ -170,7 +170,7 @@ autogen.sh produces the Makefile.in's, which are necessary for the configure script itself, and some more files for make. To run autogen.sh you'll need GNU autoconf and GNU automake: at least autoconf 2.61 and automake 1.10 are requird, newer is better. But don't use automake 1.12 or newer for creating -distribution archives: it will work but lack "de-ANSI-fucation" support in the +distribution archives: it will work but lack "de-ANSI-fication" support in the generated Makefile's! Stick with automake 1.11.x for this purpose ... So automake 1.11.x and autoconf 2.67+ is recommended. @@ -226,7 +226,7 @@ which will be used to search for the required libraries and header files in the given paths ("/lib/...", "/include/...") in addition to the standard locations. -* Syslog Logging (autodetected by default): +* Syslog Logging (autodetected by default): --with-syslog[=] / --without-syslog Enable (disable) support for logging to "syslog", which should be @@ -237,13 +237,13 @@ standard locations. Enable (disable) support for compressed server-server links. The Z compression library ("libz") is required for this option. - + * IO Backend (autodetected by default): --with-select[=] / --without-select --with-poll[=] / --without-poll --with-devpoll[=] / --without-devpoll --with-epoll[=] / --without-epoll - --with-kqueue[=] / --without-kqueue + --with-kqueue[=] / --without-kqueue ngIRCd can use different IO "backends": the "old school" select() and poll() API which should be supported by most UNIX-like operating systems, or the @@ -261,7 +261,7 @@ standard locations. required for this option. * TCP-Wrappers: - --with-tcp-wrappers[=] + --with-tcp-wrappers[=] Include support for Wietse Venemas "TCP Wrappers" to limit client access to the daemon, for example by using "/etc/hosts.{allow|deny}". @@ -318,7 +318,7 @@ IRC operators of this server are defined in [Operator] blocks, remote servers are configured in [Server] sections, and [Channel] blocks are used to configure pre-defined ("persistent") IRC channels. -The meaning of the variables in the configuration file is explained in the +The meaning of the variables in the configuration file is explained in the "doc/sample-ngircd.conf", which is used as sample configuration file in /usr/local/etc after running "make install" (if you don't already have one) and in the ngircd.conf(5) manual page. diff --git a/NEWS b/NEWS index 2f2ac67..9ec7547 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,63 @@ -- NEWS -- +ngIRCd 22 (2014-10-11) + + - Match all list patterns case-insensitive: this affects the invite-, + ban-, and except lists, as well as G-Lines an K-Lines. + Problem pointed out by "wowaname" on #ngircd, thanks! + + ngIRCd 22~rc1 (2014-09-29) + - Sync "except lists" between servers: Up to now, ban, invite, and G-Line + lists have been synced between servers while linking -- but obviously + nobody noticed that except list have been missing ever since. Until now. + Thanks to "j4jackj", who reported this issue in #ngircd. + - Allow longer user names (up to 63 characters) for authentication. + - Increase MAX_SERVERS from 16 to 64: There are installations out there + that would like to configure more than 16 links per server, so increase + this limit. Best would be to get rid of MAX_SERVERS altogether and make + if fully dynamic, but start with this quick and dirty hack ... + - Test suite/platformtest.sh: Detect when tests have been skipped. + - Allow "DefaultUserModes" to set all possible modes, including modes only + settable by IRC Operators. + - Implement user mode "F": "relaxed flood protection". Clients with mode + "F" set are allowed to rapidly send data to the daemon. This mode is only + settable by IRC Operators and can cause problems in the network -- so be + careful and only set it on "trusted" clients! + User mode "F" is used by Bahamut for this purpose, for example. + - Use server password when PAM is compiled in but disabled. + - Streamline punctuation of log messages. + - Return ISUPPORT(005) numerics on "VERSION". This is how ircd-seven, + Charybdis, Hybrid, and InspIRCd behave, for example. + - configure: Only link "contrib/Debian" if it exists, which isn't the case + on "VPATH builds", for example. + - Show the account name in WHOIS. This uses the same numeric as Charybdis + and ircu families: WHOISLOGGEDIN(330). + - Pattern matching: Remove "range matching" in our pattern matching code + using the "[...]" syntax, because [ and ] are valid characters in nick + names and one has to quote them currently using the "\" character, which + is quite unexpected for users. + - platformtest.sh: New option "-x", don't regenerate build system and + allow using separate source and build trees. + - Test suite: explicitly enable glibc memory checking. + - Make "MODE -k" handling more robust and compatible, send "fake '*' key" + in all replies. + - portabtest: Actually test the functions snprintf(), strlcpy(), strlcat(), + and vsnprintf() for correctness, not only existence (which was quite + useless, because if they weren't available, the program could not have + been linked at all ...). + - Implement new configuration option "Network": it is used to set the + (completely optional) "network name", to which this instance of the + daemon belongs. When set, this name is used in the ISUPPORT(005) numeric + which is sent to all clients connecting to the server after logging in. + - Update doc/Platforms.txt. + - Various code cleanups, remove unused code, streamline error handling. + Remove all imp.h and exp.h header files, support non-standard vsnprintf() + return codes, and fix some K&R C portability issues. Streamline + DEBUG_ARRAY, DEBUG_BUFFER, DEBUG_IO, DEBUG_ZIP definitions. + - Increase penalty time to 10 seconds when handling OPER commands with an + invalid password. + ngIRCd 21.1 (2014-03-25) - Don't ignore but use the server password when PAM is compiled in but @@ -208,7 +265,7 @@ ngIRCd 20 (2012-12-17) the hash function. When "CloakHostSalt" is not set (the default), a random salt will be generated after each server restart. -ngIRCd Release 19.2 (2012-06-19) +ngIRCd 19.2 (2012-06-19) ngIRCd 19.2~rc1 (2012-06-13) - New configuration option "CloakHostModeX" to configure the hostname @@ -220,12 +277,12 @@ ngIRCd Release 19.2 (2012-06-19) and capablity "multi-prefix" which allows both the NAME and WHO command handlers to return more than one "class prefix" to the client. -ngIRCd Release 19.1 (2012-03-19) +ngIRCd 19.1 (2012-03-19) - Really include _all_ patches to build the Anope module into the distribution archive ... ooops! -ngIRCd Release 19 (2012-02-29) +ngIRCd 19 (2012-02-29) ngIRCd 19~rc1 (2012-02-12) - Update preliminary ngIRCd protocol module for Anope 1.9.6, which now @@ -293,7 +350,7 @@ ngIRCd Release 19 (2012-02-29) argument. Like unknown user and channel modes, these modes are saved and forwarded to other servers, but ignored otherwise. -ngIRCd Release 18 (2011-07-10) +ngIRCd 18 (2011-07-10) - Add preliminary ngIRCd protocol module for Anope 1.9 to contrib/Anope/. @@ -368,13 +425,13 @@ ngIRCd Release 18 (2011-07-10) vice-versa). The defaults are adjusted accordingly and the old variables in [Global] are still accepted, so there is no functional change. -ngIRCd Release 17.1 (2010-12-19) +ngIRCd 17.1 (2010-12-19) - Don't log critical (or worse) messages to stderr - Remove "error file" when compiled with debug code enabled - New numeric 329: get channel creation time on "MODE #chan" commands -ngIRCd Release 17 (2010-11-07) +ngIRCd 17 (2010-11-07) - doc: change path names in sample-ngircd.conf depending on sysconfdir @@ -412,7 +469,7 @@ ngIRCd Release 17 (2010-11-07) this new mode requires the user to be an IRC operator. - Show SSL status in WHOIS output, numeric 275. -ngIRCd Release 16 (2010-05-02) +ngIRCd 16 (2010-05-02) ngIRCd 16~rc2 (2010-04-25) - Enhace connection statistics counters: display total number of served @@ -432,7 +489,7 @@ ngIRCd Release 16 (2010-05-02) every channel, and c) remote clients using a server not supporting this mode are not checked either and therefore always allowed to join. -ngIRCd Release 15 (2009-11-07) +ngIRCd 15 (2009-11-07) ngIRCd 15~rc1 (2009-10-15) - Do not add default listening port (6667) if SSL ports were specified, so @@ -446,13 +503,13 @@ ngIRCd Release 15 (2009-11-07) a throttling scheme: an IRC client can send up to 3 commands or 256 bytes per second before a one second pause is enforced. -ngIRCd Release 14.1 (2009-05-05) +ngIRCd 14.1 (2009-05-05) - Security: fix remotely triggerable crash in SSL/TLS code. - Debian: build ngircd-full-dbg package. - Allow ping timeout quit messages to show the timeout value. -ngIRCd Release 14 (2009-04-20) +ngIRCd 14 (2009-04-20) ngIRCd 14~rc1 (2009-03-29) - Allow creation of persistent modeless channels. @@ -463,7 +520,7 @@ ngIRCd Release 14 (2009-04-20) individual channel keys for different users. - Remove limit on maximum number of predefined channels in ngircd.conf. -ngIRCd Release 13 (2008-12-25) +ngIRCd 13 (2008-12-25) ngIRCd 13~rc1 (2008-11-21): - New version number scheme :-) @@ -595,7 +652,7 @@ ngIRCd 0.7.5 (2003-07-11) (DoS), the default is 5 connections per client IP. - Added new configuration variable "Listen" to bind all listening sockets of the server to a single IP address. - + ngIRCd 0.7.1 (2003-07-18) - Added support for GNU/Hurd. @@ -622,7 +679,7 @@ ngIRCd 0.7.0 (2003-05-01) Older news (sorry, only available in german language): -ngIRCd 0.6.0, 2002-12-24 +ngIRCd 0.6.0, 24.12.2002 - beim Schliessen einer Verbindung zeigt der Server nun vor dem ERROR noch eine Statistik ueber die empfangene und gesendete Datenmenge an. diff --git a/config.guess b/config.guess index 137bedf..1f5c50c 100644 --- a/config.guess +++ b/config.guess @@ -1,14 +1,12 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011, 2012 Free Software Foundation, Inc. +# Copyright 1992-2014 Free Software Foundation, Inc. -timestamp='2012-08-14' +timestamp='2014-03-23' # This file 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 +# the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but @@ -22,19 +20,17 @@ timestamp='2012-08-14' # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Originally written by Per Bothner. Please send patches (context -# diff format) to and include a ChangeLog -# entry. +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). # -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. +# Originally written by Per Bothner. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# +# Please send patches with a ChangeLog entry to config-patches@gnu.org. + me=`echo "$0" | sed -e 's,.*/,,'` @@ -54,9 +50,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -Free Software Foundation, Inc. +Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -138,6 +132,27 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown +case "${UNAME_SYSTEM}" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval $set_cc_for_build + cat <<-EOF > $dummy.c + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + ;; +esac + # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in @@ -306,7 +321,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; - arm:riscos:*:*|arm:RISCOS:*:*) + arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) @@ -811,7 +826,7 @@ EOF *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; - i*:MSYS*:*) + *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) @@ -859,21 +874,21 @@ EOF exit ;; *:GNU:*:*) # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in @@ -886,59 +901,54 @@ EOF EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + if test "$?" = 0 ; then LIBC="gnulibc1" ; fi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then - echo ${UNAME_MACHINE}-unknown-linux-gnueabi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else - echo ${UNAME_MACHINE}-unknown-linux-gnueabihf + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-gnu + echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-gnu + echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) - LIBC=gnu - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build @@ -957,54 +967,63 @@ EOF #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; - or32:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + openrisc*:Linux:*:*) + echo or1k-unknown-linux-${LIBC} + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) - echo sparc-unknown-linux-gnu + echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu + echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-gnu ;; - PA8*) echo hppa2.0-unknown-linux-gnu ;; - *) echo hppa-unknown-linux-gnu ;; + PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; + PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; + *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) - echo powerpc64-unknown-linux-gnu + echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) - echo powerpc-unknown-linux-gnu + echo powerpc-unknown-linux-${LIBC} + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-${LIBC} + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux + echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-gnu + echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. @@ -1237,19 +1256,31 @@ EOF exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - case $UNAME_PROCESSOR in - i386) - eval $set_cc_for_build - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - UNAME_PROCESSOR="x86_64" - fi - fi ;; - unknown) UNAME_PROCESSOR=powerpc ;; - esac + eval $set_cc_for_build + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub + # that puts up a graphical alert prompting to install + # developer tools. Any system running Mac OS X 10.7 or + # later (Darwin 11 and later) is required to have a 64-bit + # processor. This is not true of the ARM version of Darwin + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 + fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) @@ -1340,154 +1371,6 @@ EOF exit ;; esac -eval $set_cc_for_build -cat >$dummy.c < -# include -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -# if !defined (ultrix) -# include -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - c34*) - echo c34-convex-bsd - exit ;; - c38*) - echo c38-convex-bsd - exit ;; - c4*) - echo c4-convex-bsd - exit ;; - esac -fi - cat >&2 <. @@ -26,11 +20,12 @@ timestamp='2012-08-18' # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). -# Please send patches to . Submit a context -# diff and a properly formatted GNU ChangeLog entry. +# Please send patches with a ChangeLog entry to config-patches@gnu.org. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. @@ -73,9 +68,7 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -Free Software Foundation, Inc. +Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -156,7 +149,7 @@ case $os in -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray | -microblaze) + -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; @@ -259,10 +252,12 @@ case $basic_machine in | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ - | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ - | be32 | be64 \ + | arc | arceb \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | be32 | be64 \ | bfin \ - | c4x | clipper \ + | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ @@ -270,10 +265,11 @@ case $basic_machine in | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ + | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | mcore | mep | metag \ + | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ @@ -287,20 +283,22 @@ case $basic_machine in | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ - | nios | nios2 \ + | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ - | open8 \ - | or32 \ + | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ @@ -328,7 +326,7 @@ case $basic_machine in c6x) basic_machine=tic6x-unknown ;; - m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; @@ -370,13 +368,13 @@ case $basic_machine in | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ - | clipper-* | craynv-* | cydra-* \ + | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ @@ -385,11 +383,13 @@ case $basic_machine in | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ + | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ @@ -403,18 +403,22 @@ case $basic_machine in | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ - | nios-* | nios2-* \ + | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ + | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ @@ -788,7 +792,7 @@ case $basic_machine in basic_machine=ns32k-utek os=-sysv ;; - microblaze) + microblaze*) basic_machine=microblaze-xilinx ;; mingw64) @@ -796,7 +800,7 @@ case $basic_machine in os=-mingw64 ;; mingw32) - basic_machine=i386-pc + basic_machine=i686-pc os=-mingw32 ;; mingw32ce) @@ -832,7 +836,7 @@ case $basic_machine in basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) - basic_machine=i386-pc + basic_machine=i686-pc os=-msys ;; mvs) @@ -1023,7 +1027,11 @@ case $basic_machine in basic_machine=i586-unknown os=-pw32 ;; - rdos) + rdos | rdos64) + basic_machine=x86_64-pc + os=-rdos + ;; + rdos32) basic_machine=i386-pc os=-rdos ;; @@ -1350,7 +1358,7 @@ case $os in -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ - | -sym* | -kopensolaris* \ + | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ @@ -1372,7 +1380,7 @@ case $os in | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) @@ -1496,9 +1504,6 @@ case $os in -aros*) os=-aros ;; - -kaos*) - os=-kaos - ;; -zvmoe) os=-zvmoe ;; @@ -1547,6 +1552,9 @@ case $basic_machine in c4x-* | tic4x-*) os=-coff ;; + c8051-*) + os=-elf + ;; hexagon-*) os=-elf ;; diff --git a/configure.ng b/configure.ng index 6338995..bd40694 100644 --- a/configure.ng +++ b/configure.ng @@ -1,6 +1,6 @@ # # ngIRCd -- The Next Generation IRC Daemon -# Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors +# Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors # # 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 @@ -23,8 +23,7 @@ m4_ifdef([AM_SILENT_RULES], # -- Initialisation -- AC_PREREQ([2.61]) -AC_INIT([ngIRCd], VERSION_ID, - [ngircd-ml@ngircd.barton.de], [ngircd], [http://ngircd.barton.de/]) +AC_INIT([ngIRCd],[VERSION_ID],[ngircd-ml@ngircd.barton.de],[ngircd],[http://ngircd.barton.de/]) AC_CONFIG_SRCDIR([src/ngircd/ngircd.c]) AC_CONFIG_HEADER([src/config.h]) @@ -76,27 +75,28 @@ AC_C_CONST AC_C_INLINE __ng_PROTOTYPES__ -# -- Hard coded system and compiler dependencies/features/options ... -- +# -- Function Definitions -- AC_DEFUN([GCC_STACK_PROTECT_CC],[ - ssp_cc=yes - # we use -fstack-protector-all for the test to enfoce the use of the guard variable - AC_MSG_CHECKING([whether ${CC} accepts -fstack-protector]) - ssp_old_cflags="$CFLAGS" - CFLAGS="$CFLAGS -fstack-protector-all" - AC_TRY_LINK(,,, ssp_cc=no) - echo $ssp_cc - CFLAGS="$ssp_old_cflags" - if test "X$ssp_cc" = "Xyes"; then - CFLAGS="$CFLAGS -fstack-protector" - AC_DEFINE([ENABLE_SSP_CC], 1, [Define if SSP C support is enabled.]) - fi + ssp_cc=yes + # Use -fstack-protector-all for the test to enfoce the use of the + # guard variable + AC_MSG_CHECKING([whether ${CC} accepts -fstack-protector]) + ssp_old_cflags="$CFLAGS" + CFLAGS="$CFLAGS -fstack-protector-all" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],[],[ssp_cc=no]) + echo $ssp_cc + CFLAGS="$ssp_old_cflags" + if test "X$ssp_cc" = "Xyes"; then + CFLAGS="$CFLAGS -fstack-protector" + AC_DEFINE([ENABLE_SSP_CC], 1, [Define if SSP C support is enabled.]) + fi ]) AC_DEFUN([WORKING_GETADDRINFO],[ AC_CHECK_FUNCS([getaddrinfo],[ AC_MSG_CHECKING([whether getaddrinfo() works]) - AC_TRY_RUN([ + AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include #include @@ -113,15 +113,19 @@ main(int argc, char **argv) return 1; return 0; } - ],[ + ]])],[ AC_DEFINE([HAVE_WORKING_GETADDRINFO], 1, [getaddrinfo(0)]) AC_MSG_RESULT(yes) ],[ AC_MSG_RESULT(no) + ],[ + AC_MSG_RESULT(no) ]) ]) ]) +# -- Hard coded system and compiler dependencies/features/options ... -- + if test "$GCC" = "yes"; then # We are using the GNU C compiler. Good! CFLAGS="$CFLAGS -pipe -W -Wall -Wpointer-arith -Wstrict-prototypes" @@ -151,7 +155,7 @@ AC_HEADER_TIME # Required header files AC_CHECK_HEADERS([ \ fcntl.h netdb.h netinet/in.h stdlib.h string.h \ - strings.h sys/socket.h sys/time.h unistd.h \ + strings.h sys/socket.h sys/time.h sys/types.h unistd.h \ ],,AC_MSG_ERROR([required C header missing!])) # Optional header files @@ -163,20 +167,19 @@ AC_CHECK_HEADERS_ONCE([ \ # -- Datatypes -- AC_MSG_CHECKING(whether socklen_t exists) -AC_TRY_COMPILE([ +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include #include - ],[ + ]],[[ socklen_t a, b; a = 2; b = 4; a += b; - ],[ + ]])],[ AC_DEFINE(HAVE_socklen_t) AC_MSG_RESULT(yes) ],[ AC_MSG_RESULT(no) ]) AC_TYPE_PID_T -AC_TYPE_SIGNAL AC_TYPE_SIZE_T AC_TYPE_SSIZE_T AC_TYPE_UID_T @@ -467,15 +470,15 @@ AC_ARG_WITH(tcp-wrappers, saved_LIBS="$LIBS" LIBS="-lwrap $LIBS" LIBS_END="-lwrap $LIBS_END" - AC_TRY_LINK([ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include #include #include int allow_severity = 0; int deny_severity = 0; - ],[ + ]],[[ tcpd_warn("link test"); - ],[ + ]])],[ AC_MSG_RESULT(yes) AC_DEFINE(TCPWRAP, 1) x_tcpwrap_on=yes diff --git a/contrib/Debian/changelog b/contrib/Debian/changelog index f833236..46e4211 100644 --- a/contrib/Debian/changelog +++ b/contrib/Debian/changelog @@ -1,3 +1,23 @@ +ngircd (22-0ab1) unstable; urgency=low + + * New "upstream" release: ngIRCd 22. + + -- Alexander Barton Sat, 11 Oct 2014 20:29:03 +0200 + +ngircd (22~rc1-0ab1) unstable; urgency=low + + * New "upstream" release candidate 1 for ngIRCd Release 22. + + -- Alexander Barton Mon, 29 Sep 2014 17:07:55 +0200 + +ngircd (21.1-0ab2) unstable; urgency=low + + * Use correct package name in pathname to "HelpFile" (Command.txt) + in "ngircd-full" and "ngircd-full-dbg" packages. + * Don't adjust path names that are correct by default. + + -- Alexander Barton Mon, 14 Jul 2014 11:20:17 +0200 + ngircd (21.1-0ab1) unstable; urgency=low * New "upstream" release: ngIRCd 21.1. diff --git a/contrib/Debian/rules b/contrib/Debian/rules index 4df0609..1630a01 100755 --- a/contrib/Debian/rules +++ b/contrib/Debian/rules @@ -1,7 +1,7 @@ #!/usr/bin/make -f # # ngIRCd -- The Next Generation IRC Daemon -# Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors +# Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors # # 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 @@ -42,6 +42,7 @@ configure-ngircd: configure --prefix=/usr \ --sysconfdir=/etc/ngircd \ --mandir=\$${prefix}/share/man \ + --docdir=\$${prefix}/share/doc/ngircd \ --with-syslog --with-zlib configure-ngircd-full: configure @@ -52,6 +53,7 @@ configure-ngircd-full: configure --prefix=/usr \ --sysconfdir=/etc/ngircd \ --mandir=\$${prefix}/share/man \ + --docdir=\$${prefix}/share/doc/ngircd-full \ --with-syslog --with-zlib \ --with-gnutls --with-iconv --with-ident --with-tcp-wrappers \ --with-pam \ @@ -65,6 +67,7 @@ configure-ngircd-full-dbg: configure --prefix=/usr \ --sysconfdir=/etc/ngircd \ --mandir=\$${prefix}/share/man \ + --docdir=\$${prefix}/share/doc/ngircd-full-dbg \ --enable-debug --enable-sniffer \ --with-syslog --with-zlib \ --with-gnutls --with-iconv --with-ident --with-tcp-wrappers \ @@ -141,7 +144,6 @@ install-ngircd: build-ngircd 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 @@ -153,16 +155,12 @@ install-ngircd-full: build-ngircd-full # 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 + rm $(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd-full/INSTALL* + rm $(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd-full/COPYING* 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|;HelpFile = /usr/share/doc/ngircd/Commands.txt|HelpFile = /usr/share/doc/ngircd-full/Commands.txt|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 @@ -176,16 +174,12 @@ install-ngircd-full-dbg: build-ngircd-full-dbg # Add here commands to install the "full" package into debian/ngircd-full: $(MAKE) install DESTDIR=$(CURDIR)/debian/ngircd-full-dbg - rm $(CURDIR)/debian/ngircd-full-dbg/usr/share/doc/ngircd/INSTALL* - rm $(CURDIR)/debian/ngircd-full-dbg/usr/share/doc/ngircd/COPYING* - mv $(CURDIR)/debian/ngircd-full-dbg/usr/share/doc/ngircd \ - $(CURDIR)/debian/ngircd-full-dbg/usr/share/doc/ngircd-full-dbg + rm $(CURDIR)/debian/ngircd-full-dbg/usr/share/doc/ngircd-full-dbg/INSTALL* + rm $(CURDIR)/debian/ngircd-full-dbg/usr/share/doc/ngircd-full-dbg/COPYING* mkdir -p $(CURDIR)/debian/ngircd-full-dbg/var/run/ircd cat $(CURDIR)/debian/ngircd-full-dbg/usr/share/doc/ngircd-full-dbg/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|;HelpFile = /usr/share/doc/ngircd/Commands.txt|HelpFile = /usr/share/doc/ngircd-full-dbg/Commands.txt|g" | \ sed -e "s|;PidFile = /var/run/ngircd/ngircd.pid|PidFile = /var/run/ircd/ngircd.pid|g" \ >$(CURDIR)/debian/ngircd-full-dbg/etc/ngircd/ngircd.conf touch $(CURDIR)/debian/ngircd-full-dbg/etc/ngircd/ngircd.motd diff --git a/contrib/MacOSX/ngIRCd.xcodeproj/project.pbxproj b/contrib/MacOSX/ngIRCd.xcodeproj/project.pbxproj index babe5bc..41ddb52 100644 --- a/contrib/MacOSX/ngIRCd.xcodeproj/project.pbxproj +++ b/contrib/MacOSX/ngIRCd.xcodeproj/project.pbxproj @@ -138,8 +138,6 @@ FA322D0D0CEF74B1001761B3 /* resolve.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = resolve.h; sourceTree = ""; }; FA322D100CEF74B1001761B3 /* ansi2knr.1 */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.man; path = ansi2knr.1; sourceTree = ""; }; FA322D110CEF74B1001761B3 /* ansi2knr.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = ansi2knr.c; sourceTree = ""; }; - FA322D120CEF74B1001761B3 /* exp.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = exp.h; sourceTree = ""; }; - FA322D130CEF74B1001761B3 /* imp.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = imp.h; sourceTree = ""; }; FA322D150CEF74B1001761B3 /* portab.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = portab.h; sourceTree = ""; }; FA322D160CEF74B1001761B3 /* portabtest.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = portabtest.c; sourceTree = ""; }; FA322D170CEF74B1001761B3 /* splint.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = splint.h; sourceTree = ""; }; @@ -423,8 +421,6 @@ FA18A64716CEE14900132F66 /* Makefile.ng */, FA322D100CEF74B1001761B3 /* ansi2knr.1 */, FA322D110CEF74B1001761B3 /* ansi2knr.c */, - FA322D120CEF74B1001761B3 /* exp.h */, - FA322D130CEF74B1001761B3 /* imp.h */, FA322D150CEF74B1001761B3 /* portab.h */, FA322D160CEF74B1001761B3 /* portabtest.c */, FA322D170CEF74B1001761B3 /* splint.h */, diff --git a/contrib/ngircd.spec b/contrib/ngircd.spec index c49eff6..63adba9 100644 --- a/contrib/ngircd.spec +++ b/contrib/ngircd.spec @@ -1,5 +1,5 @@ %define name ngircd -%define version 21.1 +%define version 22 %define release 1 %define prefix %{_prefix} diff --git a/contrib/platformtest.sh b/contrib/platformtest.sh index 76f4169..e3587fb 100755 --- a/contrib/platformtest.sh +++ b/contrib/platformtest.sh @@ -16,6 +16,7 @@ NAME=`basename "$0"` VERBOSE= +CLEAN=1 PLATFORM= COMPILER="unknown" @@ -26,8 +27,12 @@ COMMENT= R_CONFIGURE= R_MAKE= R_CHECK= +R_CHECK_Y="?" R_RUN= +SRC_D=`dirname "$0"` +MY_D="$PWD" + [ -n "$MAKE" ] || MAKE="make" export MAKE CC @@ -36,43 +41,56 @@ while [ $# -gt 0 ]; do "-v") VERBOSE=1 ;; + "-x") + CLEAN= + ;; *) - echo "Usage: $NAME [-v]" + echo "Usage: $NAME [-v] [-x]" + echo + echo " -v Verbose output" + echo " -x Don't regenerate build system, even when possible" + echo exit 2 esac shift done echo "$NAME: Checking ngIRCd base source directory ..." -grep "ngIRCd" ./ChangeLog >/dev/null 2>&1 +grep "ngIRCd" "$SRC_D/ChangeLog" >/dev/null 2>&1 if [ $? -ne 0 ]; then - grep "ngIRCd" ../ChangeLog >/dev/null 2>&1 + grep "ngIRCd" "$SRC_D/../ChangeLog" >/dev/null 2>&1 if [ $? -ne 0 ]; then echo "$NAME: ngIRCd base source directory not found!?" exit 1 fi - cd .. + SRC_D="$SRC_D/.." fi +echo "$NAME: - source directory: $SRC_D" +echo "$NAME: - working directory: $MY_D" echo "$NAME: Checking for GIT tree ..." -if [ -d .git ]; then +if [ -d "$SRC_D/.git" ]; then echo "$NAME: Checking for \"git\" command ..." git version >/dev/null 2>&1 - if [ $? -eq 0 ]; then + if [ $? -eq 0 -a -n "$CLEAN" ]; then echo "$NAME: Running \"git clean\" ..." + cd "$SRC_D" || exit 1 [ -n "$VERBOSE" ] && git clean -dxf || git clean -dxf >/dev/null + cd "$MY_D" || exit 1 fi fi -echo "$NAME: Checking for \"./configure\" script ..." -if [ ! -r ./configure ]; then - echo "$NAME: Running \"./autogen.sh\" ..." +echo "$NAME: Checking for \"$SRC_D/configure\" script ..." +if [ ! -r "$SRC_D/configure" ]; then + echo "$NAME: Running \"$SRC_D/autogen.sh\" ..." + cd "$SRC_D" || exit 1 [ -n "$VERBOSE" ] && ./autogen.sh || ./autogen.sh >/dev/null + cd "$MY_D" || exit 1 fi -if [ -r ./configure ]; then - echo "$NAME: Running \"./configure\" script ..." - [ -n "$VERBOSE" ] && ./configure || ./configure >/dev/null +if [ -r "$SRC_D/configure" ]; then + echo "$NAME: Running \"$SRC_D/configure\" script ..." + [ -n "$VERBOSE" ] && "$SRC_D/configure" -C || "$SRC_D/configure" -C >/dev/null if [ $? -eq 0 -a -r ./Makefile ]; then R_CONFIGURE=1 echo "$NAME: Running \"$MAKE\" ..." @@ -84,6 +102,8 @@ if [ -r ./configure ]; then if [ $? -eq 0 ]; then R_CHECK=1 R_RUN=$R_CHECK + [ -r ./src/testsuite/tests-skipped.lst ] \ + && R_CHECK_Y="y" || R_CHECK_Y="Y" else ./src/ngircd/ngircd --help 2>/dev/null \ | grep "^ngIRCd" >/dev/null @@ -143,8 +163,8 @@ fi # Get ngIRCd version information eval $(grep "^VERSION = " Makefile | sed -e 's/ //g') case "$VERSION" in - *-*-*) - VERSION=`echo "$VERSION" | cut -d'-' -f3 | cut -b2-` + *~*-*) + VERSION=`echo "$VERSION" | cut -b1-10` ;; esac [ -n "$VERSION" ] || VERSION="unknown" @@ -163,7 +183,7 @@ fi [ -n "$R_CONFIGURE" ] && C="Y" || C="N" [ -n "$R_MAKE" ] && M="Y" || M="N" -[ -n "$R_CHECK" ] && T="Y" || T="N" +[ -n "$R_CHECK" ] && T="$R_CHECK_Y" || T="N" [ -n "$R_RUN" ] && R="Y" || R="N" [ -n "$COMMENT" ] && COMMENT=" $COMMENT" @@ -177,11 +197,15 @@ echo "Platform Compiler ngIRCd Date Tester C M echo "--------------------------- ------------ ---------- -------- -------- - - - - -" type printf >/dev/null 2>&1 if [ $? -eq 0 ]; then - printf "%-27s %-12s %-10s %s %-8s %s %s %s %s%s" \ + printf "%-27s %-12s %-10s %s %-8s %s %s %s %s%s\n" \ "$PLATFORM" "$COMPILER" "$VERSION" "$DATE" "$USER" \ "$C" "$M" "$T" "$R" "$COMMENT" else echo "$PLATFORM $COMPILER $VERSION $DATE $USER" \ "$C" "$M" "$T" "$R" "$COMMENT" fi -echo; echo +echo +if [ "$R_CHECK_Y" = "y" ]; then + echo "$NAME: Warning: Some tests have been skipped!" + echo +fi diff --git a/doc/Bopm.txt b/doc/Bopm.txt index bd14450..338e5cb 100644 --- a/doc/Bopm.txt +++ b/doc/Bopm.txt @@ -1,9 +1,8 @@ ngIRCd - Next Generation IRC Server + http://ngircd.barton.de/ - (c)2001-2010 Alexander Barton, - alex@barton.de, http://www.barton.de/ - + (c)2001-2014 Alexander Barton and Contributors. ngIRCd is free software and published under the terms of the GNU General Public License. @@ -18,7 +17,7 @@ monitor, designed for use with hybrid-based ircds, although it can be used with slight modification on any server which has the ability to show connects to opers and that supports KLINEs." -And starting with Release 17, ngIRCd supports all required log messages that +Starting with Release 17, ngIRCd supports all required log messages that BOPM requires to be useful. II. Installation @@ -37,11 +36,12 @@ a) BOPM "IRC" section: 3) change "mode" to "+ci" or "+c". 4) Set "connregex" to the following string, everything in one line(!): - "\\*\\*\\* Notice -- Client connecting: ([^ ]+) \\(([^@]+)@([^\\)]+)\\) \\[([0-9\\.]+)\\].*"; - and comment all the other "connregex" examples (prepend a "#" character). + "Client connecting: ([^ ]+) \\(([^@]+)@([^\\)]+)\\) \\[([0-9\\.]+)\\].*"; + and comment out all the other "connregex" examples (that is, prepend a + "#" character). - 5) Set "kline" to "KILL %n :Open proxy found on your host!"; for example, - and comment all the other "kline" examples. + 5) Set "kline" to "GLINE *@%h :Open proxy found on your host!"; + and comment out all the other "kline" examples. b) BOPM "scanner" section: diff --git a/doc/Modes.txt b/doc/Modes.txt index aee7491..a931787 100644 --- a/doc/Modes.txt +++ b/doc/Modes.txt @@ -2,7 +2,7 @@ ngIRCd - Next Generation IRC Server http://ngircd.barton.de/ - (c)2001-2012 Alexander Barton and Contributors. + (c)2001-2014 Alexander Barton and Contributors. ngIRCd is free software and published under the terms of the GNU General Public License. @@ -26,6 +26,7 @@ channels he is using at the moment. B 20 User is flagged as a "bot". c 17 IRC operator wants to receive connect/disconnect NOTICEs. C 19 Only users that share a channel are allowed to send messages. + F 22 Relaxed flood protection (only settable by IRC Operators). i 0.0.1 User is "invisible". o 0.0.1 User is IRC operator. q 20 User is protected, can not be kicked from a channel. diff --git a/doc/Platforms.txt b/doc/Platforms.txt index 13dbff2..95f21b0 100644 --- a/doc/Platforms.txt +++ b/doc/Platforms.txt @@ -30,8 +30,10 @@ alpha/unknown/netbsd3.0 gcc 3.3.3 CVSHEAD 06-05-07 fw Y Y Y Y 3 armv6l/unk./linux-gnueabi gcc 4.7.2 20.2 13-03-08 goetz Y Y Y Y 5 armv6l/unk./linux-gnueabihf gcc 4.6.3 21~rc2 13-10-26 pi Y Y Y Y 5 armv7l/unk./linux-gnueabi gcc 4.4.3 19.1 12-04-29 goetz Y Y Y Y 5 +armv7l/unk./linux-gnueabihf gcc 4.6.3 22~rc1-3 14-10-10 alex Y Y Y Y 5 +armv7l/unk./linux-gnueabihf gcc 4.8.2 21.1 14-07-15 goetz Y Y Y Y 5 hppa/unknown/openbsd3.5 gcc 2.95.3 CVSHEAD 04-05-25 alex Y Y Y Y -hppa/unknown/openbsd5.4 gcc 4.2.1 21 13-11-10 alex Y Y Y Y 3 +hppa/unknown/openbsd5.4 gcc 4.2.1 22~rc1-3 14-10-10 alex Y Y y Y 3 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 13~rc1 08-12-02 alex Y Y Y Y hppa2.0w-hp-hpux11.11 gcc 4.2.3 14.1 09-07-22 goetz Y Y Y Y @@ -45,7 +47,7 @@ i386/unknown/freebsd6.2 gcc 3.4.6 20~rc1 12-11-13 alex Y Y Y Y 3 i386/unknown/freebsd7.3 gcc 4.2.1 20~rc1 12-11-13 alex Y Y Y Y 3 i686/pc/minix gcc 4.4.6 21~rc2 13-10-27 alex Y Y N N i686/unknown/gnu0.3 gcc 4.4.5 19 12-02-29 alex Y Y Y Y -i686/unknown/gnu0.5 gcc 4.8.2 21 14-02-09 alex Y Y Y Y +i686/unknown/gnu0.5 gcc 4.9.1 22~rc1-3 14-10-11 alex Y Y Y Y i686/unkn./kfreebsd7.2-gnu gcc 4.3.4 15 09-12-02 alex Y Y Y Y 3 i386/unknown/netbsdelf1.5.2 egcs-1.1.2 21 13-11-25 goetz Y Y N Y i386/unknown/netbsdelf1.6.2 gcc 2.95.3 18 11-07-10 goetz Y Y Y Y @@ -59,11 +61,12 @@ i386/unknown/openbsd5.3 gcc 4.2.1 21 13-11-28 goetz Y Y Y Y 3 i386/unknown/openbsd5.4 gcc 4.2.1 21 13-11-28 goetz Y Y Y Y 3 i586/pc/haiku gcc 2.95.3 19.2~138 12-10-11 user Y Y N N i586/pc/interix3.5 gcc 3.3 19 12-02-29 alex Y Y N Y -i686/pc/cygwin gcc 4.8.2 21 14-01-02 alex Y Y N Y +i686/pc/cygwin gcc 4.8.3 22~rc1-3 14-10-10 alex Y Y N Y i686/pc/linux-gnu gcc 2.7.2 21~38 14-01-06 goetz Y Y Y Y 1 i686/pc/linux-gnu gcc 2.95.4 0.8.0 04-05-30 alex Y Y Y Y 1 i686/pc/linux-gnu gcc 3.3.5 14.1 09-08-04 alex Y Y Y Y 1 i386/pc/linux-gnu gcc 4.1.2 13~rc1 08-12-05 alex Y Y Y Y 1 +i386/pc/linux-gnu gcc 4.4.5 22~rc1-3 14-10-10 alex Y Y Y Y 1 i686/pc/linux-gnu gcc 4.3.2 14.1 09-08-04 alex Y Y Y Y 1 m68k/apple/aux3.0.1 gcc 2.7.2 17 10-11-07 alex Y Y N Y m68k/apple/aux3.0.1 Orig. A/UX 17 10-11-07 alex Y Y N Y 2 @@ -74,7 +77,7 @@ m88k/dg/dgux5.4R3.10 gcc 2.5.8 CVSHEAD 04-03-15 alex Y Y ? ? mipsel/unknown/linux-gnu gcc 4.1.2 18 11-07-05 goetz Y Y N Y 1 mipsel/unknown/linux-gnu gcc 4.4.5 21 13-11-24 goetz Y Y Y Y 1 powerpc/apple/darwin6.8 gcc 3.1 21 14-01-03 goetz Y Y Y Y -powerpc/apple/darwin7.9.0 gcc 3.3 21 14-01-11 goetz Y Y Y Y 3 +powerpc/apple/darwin7.9.0 gcc 3.3 21.1 14-04-14 goetz Y Y Y Y 3 powerpc/apple/darwin8.11.0 gcc 4.0.1 18 11-07-02 goetz Y Y Y Y 3 powerpc/apple/darwin9.8.0 gcc 4.0.1 21 14-01-04 goetz Y Y Y Y 3 powerpc/unknown/linux-gnu gcc 3.3.3 0.8.0 04-05-30 alex Y Y Y Y @@ -82,22 +85,30 @@ powerpc/unknown/openbsd3.6 gcc 2.95.3 0.10.0 06-10-08 alex Y Y N 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 sparc/unkn./netbsdelf1.6.1 gcc 2.95.3 0.8.0 04-05-30 alex Y Y Y Y +sparc/unknown/openbsd5.5 gcc 4.2.1 21.1 14-05-03 goetz Y Y Y Y 3 x86_64/apple/darwin10.8.0 gcc 4.2.1 21~rc2 13-10-30 alex Y Y Y Y 3 x86_64/apple/darwin12.3.0 gcc 4.2.1 20.2 13-04-01 alex Y Y Y Y 3 x86_64/apple/darwin13.0.0 A-clang 5.0 21 14-01-02 alex Y Y Y Y 3 +x86_64/apple/darwin14.0.0 A-clang 6.0 22~rc1-3 14-10-10 alex Y Y Y Y 3 x86_64/unknown/dragonfly3.4 gcc 4.7.2 21 13-11-12 goetz Y Y N Y 3 -x86_64/unknown/freebsd8.4 gcc 4.2.1 21 14-01-02 alex Y Y Y Y 3 -x86_64/unknown/freebsd9.1 gcc 4.2.1 21 14-01-02 alex Y Y Y Y 3 +x86_64/unknown/freebsd8.4 gcc 4.2.1 22~rc1-3 14-10-10 alex Y Y y Y 3 +x86_64/unknown/freebsd9.2 gcc 4.2.1 22~rc1-3 14-10-10 alex Y Y Y Y 3 +x86_64/unknown/freebsd10.0 F-clang 3.3 22~rc1-3 14-10-10 alex Y Y Y Y 3 x86_64/unkn./freebsd8.1-gnu gcc 4.4.5 19 12-02-26 alex Y Y Y Y 3 x86_64/unknown/linux-gnu clang 3.3 21 14-01-07 alex Y Y Y Y 1 +x86_64/unknown/linux-gnu clang 3.4 22~rc1-3 14-10-11 alex Y Y Y Y 1 +x86_64/unknown/linux-gnu gcc 4.4.5 22~rc1-3 14-10-10 alex Y Y Y Y 1 +x86_64/unknown/linux-gnu gcc 4.7.2 22~rc1-3 14-10-10 alex Y Y Y Y 1 x86_64/unknown/linux-gnu gcc 4.8.2 21 13-12-29 alex Y Y Y Y 1 +x86_64/unknown/linux-gnu gcc 4.9.1 22~rc1-3 14-10-10 alex Y Y Y Y 1 x86_64/unknown/linux-gnu nwcc 0.8.2 21 13-12-01 goetz Y Y Y Y 1 -x86_64/unknown/linux-gnu Open64 21 13-11-30 goetz Y Y Y Y 1 -x86_64/unknown/linux-gnu Sun C 5.12 21 13-11-22 goetz Y Y Y Y 1 -x86_64/unknown/linux-gnu tcc 0.9.25 21 13-11-30 goetz Y Y Y Y 1 +x86_64/unknown/linux-gnu Open64 21.1 14-03-27 goetz Y Y Y Y 1 +x86_64/unknown/linux-gnu Sun C 5.12 21.1 14-03-27 goetz Y Y Y Y 1 +x86_64/unknown/linux-gnu tcc 0.9.25 21.1 14-03-27 goetz Y Y Y Y 1 x86_64/unknown/openbsd4.7 gcc 3.3.5 20~rc1 12-02-26 alex Y Y Y Y 3 -x86_64/unknown/openbsd4.8 gcc 4.2.1 21 13-12-28 alex Y Y Y Y 3 +x86_64/unknown/openbsd4.8 gcc 4.2.1 22~rc1-3 14-10-10 alex Y Y y Y 3 x86_64/unknown/openbsd5.1 gcc 4.2.1 21 13-12-28 alex Y Y Y Y 3 +x86_64/unknown/openbsd5.5 gcc 4.2.1 22~rc1-3 14-10-10 alex Y Y Y Y 3 * Notes diff --git a/doc/README-AUX.txt b/doc/README-AUX.txt index b524294..b90c681 100644 --- a/doc/README-AUX.txt +++ b/doc/README-AUX.txt @@ -22,7 +22,7 @@ The following software packages are needed: - GNU sed Source: http://www.rezepte-im-web.de/appleux/sed-3.02.tar.gz - ftp://arthur.barton.de/pub/unix/aux/tools/sed-3.02.tar.gz + http://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. @@ -34,7 +34,7 @@ The following software packages are needed: - libUTIL.a Source: 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 + http://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() and 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.barton.de/pub/unix/aux/tools/fileutils-4.0.tar.gz + http://arthur.barton.de/pub/unix/aux/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 diff --git a/doc/Services.txt b/doc/Services.txt index 2cef778..3daa729 100644 --- a/doc/Services.txt +++ b/doc/Services.txt @@ -123,7 +123,7 @@ Please note that versions up to and including 5.1.3 contain a bug that sometimes causes IRC Services to hang on startup. There are two workarounds: a) send the services process a HUP signal ("killall -HUP ircservices") b) apply this patch to the IRC Services source tree: - + At least the following settings have to be tweaked, in addition to all the settings marked as required by IRC Services: diff --git a/doc/sample-ngircd.conf.tmpl b/doc/sample-ngircd.conf.tmpl index 65da360..1d07822 100644 --- a/doc/sample-ngircd.conf.tmpl +++ b/doc/sample-ngircd.conf.tmpl @@ -54,6 +54,12 @@ # A simple Phrase (<256 chars) if you don't want to use a motd file. ;MotdPhrase = "Hello world!" + # The name of the IRC network to which this server belongs. This name + # is optional, should only contain ASCII characters, and can't contain + # spaces. It is only used to inform clients. The default is empty, + # so no network name is announced to clients. + ;Network = aIRCnetwork + # Global password for all users needed to connect to the server. # (Default: not set) ;Password = abc @@ -166,8 +172,8 @@ ;ConnectIPv4 = yes # Default user mode(s) to set on new local clients. Please note that - # only modes can be set that the client could set on itself, you can't - # set "a" (away) or "o" (IRC Op), for example! Default: none. + # only modes can be set that the client could set using regular MODE + # commands, you can't set "a" (away) for example! Default: none. ;DefaultUserModes = i # Do DNS lookups when a client connects to the server. diff --git a/man/ngircd.conf.5.tmpl b/man/ngircd.conf.5.tmpl index 5ca6ee3..9b2ed08 100644 --- a/man/ngircd.conf.5.tmpl +++ b/man/ngircd.conf.5.tmpl @@ -1,7 +1,7 @@ .\" .\" ngircd.conf(5) manual page template .\" -.TH ngircd.conf 5 "Oct 2013" ngIRCd "ngIRCd Manual" +.TH ngircd.conf 5 "Jan 2014" ngIRCd "ngIRCd Manual" .SH NAME ngircd.conf \- configuration file of ngIRCd .SH SYNOPSIS @@ -60,7 +60,7 @@ The main configuration of the server is stored in the section, like the server name, administrative information and the ports on which the server should be listening. The variables in this section have to be adjusted to the local requirements most of the time, whereas all the variables -in the other sections can be left on there defaults very often. +in the other sections can be left on their defaults very often. .PP Options in the .I [Limits] @@ -82,12 +82,13 @@ sections. And blocks are used to configure pre-defined ("persistent") IRC channels. .PP There can be more than one [Operator], [Server] and [Channel] section per -configuration file (one for each operator, server, and channel), but only -exactly one [Global], one [Limits], one [Options], and one [SSL] section. +configuration file, one for each operator, server, and channel. [Global], +[Limits], [Options], and [SSL] sections can occure multiple times, too, but +each variable overwrites itself, only the last assignment is relevant. .SH [GLOBAL] The .I [Global] -section of this file is used to define the main configuration of the server, +section is used to define the main configuration of the server, like the server name and the ports on which the server should be listening. These settings depend on your personal preferences, so you should make sure that they correspond to your installation and setup! @@ -126,6 +127,12 @@ configuration file. \fBMotdPhrase\fR (string) A simple Phrase (<256 chars) if you don't want to use a MOTD file. .TP +\fBNetwork\fR (string) +The name of the IRC network to which this server belongs. This name is +optional, should only contain ASCII characters, and can't contain spaces. +It is only used to inform clients. The default is empty, so no network +name is announced to clients. +.TP \fBPassword\fR (string) Global password for all users needed to connect to the server. The default is empty, so no password is required. Please note: This feature is not available @@ -133,16 +140,16 @@ if ngIRCd is using PAM! .TP \fBPidFile\fR (string) This tells ngIRCd to write its current process ID to a file. Note that the -"PID file" is written AFTER chroot and switching the user ID, e.g. the directory -the file resides in must be writable by the ngIRCd user and exist in the -chroot directory (if configured, see above). +"PID file" is written AFTER chroot and switching the user ID, therefore the +directory the file resides in must be writable by the ngIRCd user and exist +in the chroot directory (if configured, see above). .TP \fBPorts\fR (list of numbers) -Ports on which the server should listen for unencrypted connections. There -may be more than one port, separated with commas (","). Default: 6667. +Port number(s) on which the server should listen for unencrypted connections. +There may be more than one port, separated with commas (","). Default: 6667. .TP \fBServerGID\fR (string or number) -Group ID under which the ngIRCd should run; you can use the name of the +Group ID under which the ngIRCd daemon should run; you can use the name of the group or the numerical ID. .PP .RS @@ -152,8 +159,8 @@ For this to work the server must have been started with root privileges! .RE .TP \fBServerUID\fR (string or number) -User ID under which the server should run; you can use the name of the user -or the numerical ID. +User ID under which the ngIRCd daemon should run; you can use the name of the +user or the numerical ID. .PP .RS .B Attention: @@ -163,8 +170,8 @@ addition, the configuration and MOTD files must be readable by this user, otherwise RESTART and REHASH won't work! .RE .SH [LIMITS] -Define some limits and timeouts for this ngIRCd instance. Default values -should be safe, but it is wise to double-check :-) +This section is used to define some limits and timeouts for this ngIRCd +instance. Default values should be safe, but it is wise to double-check :-) .TP \fBConnectRetry\fR (number) The server tries every seconds to establish a link to not yet @@ -206,8 +213,8 @@ If a client fails to answer a PING with a PONG within seconds, it will be disconnected by the server. Default: 20. .SH [OPTIONS] Optional features and configuration options to further tweak the behavior of -ngIRCd. If you want to get started quickly, you most probably don't have to -make changes here -- they are all optional. +ngIRCd are configured in this section. If you want to get started quickly, you +most probably don't have to make changes here -- they are all optional. .TP \fBAllowedChannelTypes\fR (string) List of allowed channel types (channel prefixes) for newly created channels @@ -216,9 +223,9 @@ Set this variable to the empty string to disallow creation of new channels by local clients at all. Default: #&+ .TP \fBAllowRemoteOper\fR (boolean) -Are IRC operators connected to remote servers allowed to control this server, -e.g. are they allowed to use administrative commands like CONNECT, DIE, -SQUIT, ... that affect this server? Default: no. +If this option is active, IRC operators connected to remote servers are allowed +to control this local server using administrative commands, for example like +CONNECT, DIE, SQUIT etc. Default: no. .TP \fBChrootDir\fR (string) A directory to chroot in when everything is initialized. It doesn't need @@ -260,8 +267,8 @@ Default: yes. .TP \fBDefaultUserModes\fR (string) Default user mode(s) to set on new local clients. Please note that only modes -can be set that the client could set on itself, you can't set "a" (away) or -"o" (IRC Op), for example! +can be set that the client could set using regular MODE commands, you can't +set "a" (away) for example! Default: none. .TP \fBDNS\fR (boolean) @@ -277,11 +284,11 @@ Users identified using IDENT are registered without the "~" character prepended to their user name. Default: yes. .TP -.TP \fBIncludeDir\fR (string) Directory containing configuration snippets (*.conf), that should be read in after parsing the current configuration file. Default: none. +.TP \fBMorePrivacy\fR (boolean) This will cause ngIRCd to censor user idle time, logon time as well as the part/quit messages (that are sometimes used to inform everyone about which diff --git a/src/ipaddr/ng_ipaddr.h b/src/ipaddr/ng_ipaddr.h index 8f73760..f8409de 100644 --- a/src/ipaddr/ng_ipaddr.h +++ b/src/ipaddr/ng_ipaddr.h @@ -4,6 +4,7 @@ #ifndef NG_IPADDR_HDR #define NG_IPADDR_HDR + #include "portab.h" /** @@ -12,6 +13,7 @@ */ #include +#include #include #include diff --git a/src/ngircd/array.c b/src/ngircd/array.c index ad4f8da..4cc793f 100644 --- a/src/ngircd/array.c +++ b/src/ngircd/array.c @@ -14,16 +14,19 @@ * Functions to dynamically allocate arrays. */ +/* Additionan debug messages related to array handling: 0=off / 1=on */ +#define DEBUG_ARRAY 0 + #include "array.h" #include #include #include +#include -#include "log.h" - -/* Enable more Debug messages in alloc / append / memmove code. */ -/* #define DEBUG_ARRAY */ +#if DEBUG_ARRAY +# include "log.h" +#endif #define array_UNUSABLE(x) ( !(x)->mem ) @@ -64,7 +67,7 @@ array_alloc(array * a, size_t size, size_t pos) return NULL; if (a->allocated < alloc) { -#ifdef DEBUG_ARRAY +#if DEBUG_ARRAY Log(LOG_DEBUG, "array_alloc(): changing size from %u to %u bytes.", a->allocated, alloc); #endif @@ -165,7 +168,7 @@ array_catb(array * dest, const char *src, size_t len) assert(ptr != NULL); -#ifdef DEBUG_ARRAY +#if DEBUG_ARRAY Log(LOG_DEBUG, "array_catb(): appending %u bytes to array (now %u bytes in array).", len, tmp); @@ -245,7 +248,7 @@ void array_free(array * a) { assert(a != NULL); -#ifdef DEBUG_ARRAY +#if DEBUG_ARRAY Log(LOG_DEBUG, "array_free(): %u bytes free'd (%u bytes still used at time of free()).", a->allocated, a->used); @@ -311,7 +314,7 @@ array_moveleft(array * a, size_t membersize, size_t pos) if (!bytepos) return; /* nothing to do */ -#ifdef DEBUG_ARRAY +#if DEBUG_ARRAY Log(LOG_DEBUG, "array_moveleft(): %u bytes used in array, starting at position %u.", a->used, bytepos); diff --git a/src/ngircd/channel.c b/src/ngircd/channel.c index 6b8d745..6d8dde3 100644 --- a/src/ngircd/channel.c +++ b/src/ngircd/channel.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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 @@ -18,41 +18,32 @@ * Channel management */ -#include "imp.h" #include #include #include #include #include #include +#include -#include "defines.h" #include "conn-func.h" -#include "exp.h" #include "channel.h" -#include "imp.h" #include "irc-write.h" #include "conf.h" #include "hash.h" -#include "lists.h" #include "log.h" #include "messages.h" #include "match.h" -#include "exp.h" - - #define REMOVE_PART 0 #define REMOVE_QUIT 1 #define REMOVE_KICK 2 - static CHANNEL *My_Channels; static CL2CHAN *My_Cl2Chan; - static CL2CHAN *Get_Cl2Chan PARAMS(( CHANNEL *Chan, CLIENT *Client )); static CL2CHAN *Add_Client PARAMS(( CHANNEL *Chan, CLIENT *Client )); static bool Remove_Client PARAMS(( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, const char *Reason, bool InformServer )); diff --git a/src/ngircd/class.c b/src/ngircd/class.c index d08f4c5..9ffa8b1 100644 --- a/src/ngircd/class.c +++ b/src/ngircd/class.c @@ -16,19 +16,13 @@ * User class management. */ -#include "imp.h" #include +#include #include -#include "defines.h" -#include "array.h" #include "conn.h" -#include "client.h" #include "lists.h" -#include "match.h" -#include "stdio.h" -#include "exp.h" #include "class.h" struct list_head My_Classes[CLASS_COUNT]; diff --git a/src/ngircd/client-cap.c b/src/ngircd/client-cap.c index b0da807..e403da1 100644 --- a/src/ngircd/client-cap.c +++ b/src/ngircd/client-cap.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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 @@ -18,15 +18,11 @@ * Functions to deal with IRC Capabilities */ -#include "imp.h" #include -#include "defines.h" #include "conn.h" -#include "client.h" #include "log.h" -#include "exp.h" #include "client-cap.h" GLOBAL int diff --git a/src/ngircd/client.c b/src/ngircd/client.c index 5f01648..07d448f 100644 --- a/src/ngircd/client.c +++ b/src/ngircd/client.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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 @@ -18,22 +18,16 @@ * Client management. */ -#include "imp.h" #include #include #include #include #include #include +#include #include -#include "defines.h" #include "conn.h" - -#include "exp.h" -#include "client.h" - -#include #include "ngircd.h" #include "channel.h" #include "conf.h" @@ -44,8 +38,6 @@ #include "match.h" #include "messages.h" -#include - #define GETID_LEN (CLIENT_NICK_LEN-1) + 1 + (CLIENT_USER_LEN-1) + 1 + (CLIENT_HOST_LEN-1) + 1 static CLIENT *This_Server, *My_Clients; @@ -345,7 +337,7 @@ Client_SetHostname( CLIENT *Client, const char *Hostname ) assert(Client != NULL); assert(Hostname != NULL); - if (strlen(Conf_CloakHost)) { + if (Conf_CloakHost[0]) { char cloak[GETID_LEN]; strlcpy(cloak, Hostname, GETID_LEN); @@ -435,7 +427,7 @@ Client_SetOrigUser(CLIENT UNUSED *Client, const char UNUSED *User) assert(Client != NULL); assert(User != NULL); -#if defined(PAM) && defined(IDENTAUTH) +#if defined(PAM) strlcpy(Client->orig_user, User, sizeof(Client->orig_user)); #endif } /* Client_SetOrigUser */ @@ -739,15 +731,7 @@ Client_User( CLIENT *Client ) */ GLOBAL char * Client_OrigUser(CLIENT *Client) { -#ifndef IDENTAUTH - char *user = Client->user; - - if (user[0] == '~') - user++; - return user; -#else return Client->orig_user; -#endif } /* Client_OrigUser */ #endif diff --git a/src/ngircd/client.h b/src/ngircd/client.h index c6fcec0..4185d21 100644 --- a/src/ngircd/client.h +++ b/src/ngircd/client.h @@ -52,8 +52,9 @@ typedef struct _CLIENT char *cloaked; /* cloaked hostname of the client */ char *ipa_text; /* textual representaton of IP address */ char user[CLIENT_USER_LEN]; /* user name ("login") */ -#if defined(PAM) && defined(IDENTAUTH) - char orig_user[CLIENT_USER_LEN];/* user name supplied by USER command */ +#if defined(PAM) + char orig_user[CLIENT_AUTHUSER_LEN]; + /* original user name supplied by USER command */ #endif char info[CLIENT_INFO_LEN]; /* long user name (user) / info text (server) */ char modes[CLIENT_MODE_LEN]; /* client modes */ diff --git a/src/ngircd/conf.c b/src/ngircd/conf.c index 7a4cb28..6692ecb 100644 --- a/src/ngircd/conf.c +++ b/src/ngircd/conf.c @@ -16,9 +16,7 @@ * Configuration management (reading, parsing & validation) */ -#include "imp.h" #include -#include #include #ifdef PROTOTYPES # include @@ -29,23 +27,19 @@ #include #include #include +#include #include #include #include #include -#include #include -#include "array.h" #include "ngircd.h" #include "conn.h" #include "channel.h" -#include "defines.h" #include "log.h" #include "match.h" -#include "tool.h" -#include "exp.h" #include "conf.h" @@ -369,6 +363,7 @@ Conf_Test( void ) printf(" MotdPhrase = %s\n", array_bytes(&Conf_Motd) ? (const char*) array_start(&Conf_Motd) : ""); } + printf(" Network = %s\n", Conf_Network); if (!Conf_PAM) printf(" Password = %s\n", Conf_ServerPwd); printf(" PidFile = %s\n", Conf_PidFile); @@ -748,6 +743,7 @@ Set_Defaults(bool InitServers) strcpy(Conf_ServerAdminMail, ""); snprintf(Conf_ServerInfo, sizeof Conf_ServerInfo, "%s %s", PACKAGE_NAME, PACKAGE_VERSION); + strcpy(Conf_Network, ""); free(Conf_ListenAddress); Conf_ListenAddress = NULL; array_free(&Conf_ListenPorts); @@ -810,8 +806,8 @@ Set_Defaults(bool InitServers) Conf_PAM = false; #endif Conf_PAMIsOptional = false; -#ifdef SYSLOG Conf_ScrubCTCP = false; +#ifdef SYSLOG #ifdef LOG_LOCAL5 Conf_SyslogFacility = LOG_LOCAL5; #else @@ -1412,6 +1408,7 @@ Handle_GLOBAL(const char *File, int Line, char *Var, char *Arg ) struct group *grp; size_t len; const char *section; + char *ptr; assert(File != NULL); assert(Line > 0); @@ -1494,6 +1491,19 @@ Handle_GLOBAL(const char *File, int Line, char *Var, char *Arg ) Using_MotdFile = false; return; } + if (strcasecmp(Var, "Network") == 0) { + len = strlcpy(Conf_Network, Arg, sizeof(Conf_Network)); + if (len >= sizeof(Conf_Network)) + Config_Error_TooLong(File, Line, Var); + ptr = strchr(Conf_Network, ' '); + if (ptr) { + Config_Error(LOG_WARNING, + "%s, line %d: \"Network\" can't contain spaces!", + File, Line); + *ptr = '\0'; + } + return; + } if(strcasecmp(Var, "Password") == 0) { len = strlcpy(Conf_ServerPwd, Arg, sizeof(Conf_ServerPwd)); if (len >= sizeof(Conf_ServerPwd)) diff --git a/src/ngircd/conf.h b/src/ngircd/conf.h index 02d2331..aa80b8d 100644 --- a/src/ngircd/conf.h +++ b/src/ngircd/conf.h @@ -109,6 +109,9 @@ GLOBAL char Conf_ServerAdmin1[CLIENT_INFO_LEN]; GLOBAL char Conf_ServerAdmin2[CLIENT_INFO_LEN]; GLOBAL char Conf_ServerAdminMail[CLIENT_INFO_LEN]; +/** Network name (optional, no spaces allowed) */ +GLOBAL char Conf_Network[CLIENT_INFO_LEN]; + /** Message of the day (MOTD) of this server */ GLOBAL array Conf_Motd; diff --git a/src/ngircd/conn-encoding.c b/src/ngircd/conn-encoding.c index d0c5630..412a85d 100644 --- a/src/ngircd/conn-encoding.c +++ b/src/ngircd/conn-encoding.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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 @@ -20,25 +20,21 @@ * Functions to deal with character encodings and conversions */ -#include "imp.h" #include #include #include +#include -#include "defines.h" #include "conn.h" -#include "log.h" - -#include "exp.h" -#include "conn-encoding.h" #ifdef ICONV -char Encoding_Buffer[COMMAND_LEN]; +#include "log.h" +#include "conn-encoding.h" +char Encoding_Buffer[COMMAND_LEN]; char *Convert_Message PARAMS((iconv_t Handle, char *Message)); - /** * Set client character encoding on a connection. * @@ -133,7 +129,7 @@ Convert_Message(iconv_t Handle, char *Message) return Encoding_Buffer; } -#endif +#endif /* ICONV */ /** * Convert encoding of a message received from a connection. diff --git a/src/ngircd/conn-func.c b/src/ngircd/conn-func.c index b56e0f0..fb5c55f 100644 --- a/src/ngircd/conn-func.c +++ b/src/ngircd/conn-func.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2008 Alexander Barton (alex@barton.de) + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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 @@ -18,18 +18,16 @@ * Connection management: Global functions */ -#include "imp.h" #include -#include -#include "log.h" +#include +#ifdef DEBUG +# include "log.h" +#endif #include "conn.h" -#include "client.h" -#include "exp.h" #include "conn-func.h" - /** * Update "idle timestamp", the time of the last visible user action * (e. g. like sending messages, joining or leaving channels). @@ -73,7 +71,6 @@ Conn_GetIdle( CONN_ID Idx ) return time( NULL ) - My_Connections[Idx].lastprivmsg; } /* Conn_GetIdle */ - GLOBAL time_t Conn_LastPing( CONN_ID Idx ) { @@ -81,7 +78,6 @@ Conn_LastPing( CONN_ID Idx ) return My_Connections[Idx].lastping; } /* Conn_LastPing */ - /** * Add "penalty time" for a connection. * @@ -116,7 +112,6 @@ Conn_SetPenalty(CONN_ID Idx, time_t Seconds) #endif } /* Conn_SetPenalty */ - GLOBAL void Conn_ClearFlags( void ) { @@ -125,7 +120,6 @@ Conn_ClearFlags( void ) for( i = 0; i < Pool_Size; i++ ) My_Connections[i].flag = 0; } /* Conn_ClearFlags */ - GLOBAL int Conn_Flag( CONN_ID Idx ) { @@ -133,7 +127,6 @@ Conn_Flag( CONN_ID Idx ) return My_Connections[Idx].flag; } /* Conn_Flag */ - GLOBAL void Conn_SetFlag( CONN_ID Idx, int Flag ) { @@ -141,7 +134,6 @@ Conn_SetFlag( CONN_ID Idx, int Flag ) My_Connections[Idx].flag = Flag; } /* Conn_SetFlag */ - GLOBAL CONN_ID Conn_First( void ) { @@ -154,7 +146,6 @@ Conn_First( void ) return NONE; } /* Conn_First */ - GLOBAL CONN_ID Conn_Next( CONN_ID Idx ) { @@ -169,7 +160,6 @@ Conn_Next( CONN_ID Idx ) return NONE; } /* Conn_Next */ - GLOBAL UINT16 Conn_Options( CONN_ID Idx ) { @@ -177,7 +167,6 @@ Conn_Options( CONN_ID Idx ) return My_Connections[Idx].options; } /* Conn_Options */ - /** * Set connection option. */ @@ -188,7 +177,6 @@ Conn_SetOption(CONN_ID Idx, int Option) Conn_OPTION_ADD(&My_Connections[Idx], Option); } /* Conn_SetOption */ - /** * Get the start time of the connection. * The result is the start time in seconds since 1970-01-01, as reported @@ -224,7 +212,6 @@ Conn_SendQ( CONN_ID Idx ) return array_bytes(&My_Connections[Idx].wbuf); } /* Conn_SendQ */ - /** * return number of messages sent on this connection so far */ @@ -236,7 +223,6 @@ Conn_SendMsg( CONN_ID Idx ) return My_Connections[Idx].msg_out; } /* Conn_SendMsg */ - /** * return number of (uncompressed) bytes sent * on this connection so far @@ -248,7 +234,6 @@ Conn_SendBytes( CONN_ID Idx ) return My_Connections[Idx].bytes_out; } /* Conn_SendBytes */ - /** * return number of bytes pending in read buffer */ @@ -264,7 +249,6 @@ Conn_RecvQ( CONN_ID Idx ) return array_bytes(&My_Connections[Idx].rbuf); } /* Conn_RecvQ */ - /** * return number of messages received on this connection so far */ @@ -275,7 +259,6 @@ Conn_RecvMsg( CONN_ID Idx ) return My_Connections[Idx].msg_in; } /* Conn_RecvMsg */ - /** * return number of (uncompressed) bytes received on this * connection so far @@ -297,19 +280,16 @@ Conn_IPA(CONN_ID Idx) return ng_ipaddr_tostr(&My_Connections[Idx].addr); } - GLOBAL void Conn_ResetWCounter( void ) { WCounter = 0; } /* Conn_ResetWCounter */ - GLOBAL long Conn_WCounter( void ) { return WCounter; } /* Conn_WCounter */ - /* -eof- */ diff --git a/src/ngircd/conn-ssl.c b/src/ngircd/conn-ssl.c index 493bcc7..c9bbdd2 100644 --- a/src/ngircd/conn-ssl.c +++ b/src/ngircd/conn-ssl.c @@ -1,6 +1,13 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c) 2005-2008 Florian Westphal + * Copyright (c)2005-2008 Florian Westphal (fw@strlen.de). + * Copyright (c)2008-2014 Alexander Barton (alex@barton.de) and Contributors. + * + * 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. */ #include "portab.h" @@ -10,7 +17,6 @@ * SSL wrapper functions */ -#include "imp.h" #include "conf-ssl.h" #ifdef SSL_SUPPORT @@ -29,7 +35,6 @@ #include "conn-ssl.h" #include "log.h" -#include "exp.h" #include "defines.h" extern struct SSLOptions Conf_SSLOptions; diff --git a/src/ngircd/conn-zip.c b/src/ngircd/conn-zip.c index 0a3c17c..e21dd34 100644 --- a/src/ngircd/conn-zip.c +++ b/src/ngircd/conn-zip.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2007 Alexander Barton (alex@barton.de) + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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 @@ -9,6 +9,8 @@ * Please read the file COPYING, README and AUTHORS for more information. */ +#define CONN_MODULE + #include "portab.h" /** @@ -16,14 +18,11 @@ * Connection compression using ZLIB */ -#define CONN_MODULE +/* Additionan debug messages related to ZIP compression: 0=off / 1=on */ +#define DEBUG_ZIP 0 #ifdef ZLIB -/* enable more zlib related debug messages: */ -/* #define DEBUG_ZLIB */ - -#include "imp.h" #include #include #include @@ -31,9 +30,8 @@ #include "conn.h" #include "conn-func.h" #include "log.h" - #include "array.h" -#include "exp.h" + #include "conn-zip.h" @@ -143,7 +141,7 @@ Zip_Flush( CONN_ID Idx ) out->next_out = zipbuf; out->avail_out = (uInt)sizeof zipbuf; -#ifdef DEBUG_ZIP +#if DEBUG_ZIP Log(LOG_DEBUG, "out->avail_in %d, out->avail_out %d", out->avail_in, out->avail_out); #endif @@ -166,7 +164,7 @@ Zip_Flush( CONN_ID Idx ) assert(out->avail_out <= WRITEBUFFER_SLINK_LEN); zipbuf_used = WRITEBUFFER_SLINK_LEN - out->avail_out; -#ifdef DEBUG_ZIP +#if DEBUG_ZIP Log(LOG_DEBUG, "zipbuf_used: %d", zipbuf_used); #endif if (!array_catb(&My_Connections[Idx].wbuf, @@ -218,7 +216,7 @@ Unzip_Buffer( CONN_ID Idx ) in->next_out = unzipbuf; in->avail_out = (uInt)sizeof unzipbuf; -#ifdef DEBUG_ZIP +#if DEBUG_ZIP Log(LOG_DEBUG, "in->avail_in %d, in->avail_out %d", in->avail_in, in->avail_out); #endif @@ -233,7 +231,7 @@ Unzip_Buffer( CONN_ID Idx ) assert(z_rdatalen >= in->avail_in); in_len = z_rdatalen - in->avail_in; unzipbuf_used = READBUFFER_LEN - in->avail_out; -#ifdef DEBUG_ZIP +#if DEBUG_ZIP Log(LOG_DEBUG, "unzipbuf_used: %d - %d = %d", READBUFFER_LEN, in->avail_out, unzipbuf_used); #endif diff --git a/src/ngircd/conn.c b/src/ngircd/conn.c index e8bfcf1..6256154 100644 --- a/src/ngircd/conn.c +++ b/src/ngircd/conn.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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 @@ -9,20 +9,18 @@ * Please read the file COPYING, README and AUTHORS for more information. */ -#undef DEBUG_BUFFER - #define CONN_MODULE #include "portab.h" -#include "conf-ssl.h" -#include "io.h" /** * @file * Connection management */ -#include "imp.h" +/* Additionan debug messages related to buffer handling: 0=off / 1=on */ +#define DEBUG_BUFFER 0 + #include #ifdef PROTOTYPES # include @@ -34,8 +32,9 @@ #include #include #include +#include #include -#include +#include #include #include #include @@ -51,39 +50,32 @@ # include /* for TCP Wrappers */ #endif -#include "array.h" -#include "defines.h" - -#include "exp.h" #include "conn.h" -#include "imp.h" #include "ngircd.h" -#include "array.h" -#include "client.h" #include "class.h" -#include "conf.h" -#include "conn-encoding.h" +#ifdef ICONV +# include "conn-encoding.h" +#endif #include "conn-ssl.h" #include "conn-zip.h" #include "conn-func.h" +#include "io.h" #include "log.h" #include "ng_ipaddr.h" #include "parse.h" #include "resolve.h" -#include "tool.h" - -#include "exp.h" - -#define SERVER_WAIT (NONE - 1) +#define SERVER_WAIT (NONE - 1) /** "Wait for outgoing connection" flag */ -#define MAX_COMMANDS 3 -#define MAX_COMMANDS_SERVER_MIN 10 -#define MAX_COMMANDS_SERVICE 10 +#define MAX_COMMANDS 3 /** Max. commands per loop for users */ +#define MAX_COMMANDS_SERVER_MIN 10 /** Min. commands per loop for servers */ +#define MAX_COMMANDS_SERVICE 10 /** Max. commands per loop for services */ -#define SD_LISTEN_FDS_START 3 +#define SD_LISTEN_FDS_START 3 /** systemd(8) socket activation offset */ +#define THROTTLE_CMDS 1 /** Throttling: max commands reached */ +#define THROTTLE_BPS 2 /** Throttling: max bps reached */ static bool Handle_Write PARAMS(( CONN_ID Idx )); static bool Conn_Write PARAMS(( CONN_ID Idx, char *Data, size_t Len )); @@ -99,7 +91,8 @@ static void New_Server PARAMS(( int Server, ng_ipaddr_t *dest )); static void Simple_Message PARAMS(( int Sock, const char *Msg )); static int NewListener PARAMS(( const char *listen_addr, UINT16 Port )); static void Account_Connection PARAMS((void)); - +static void Throttle_Connection PARAMS((const CONN_ID Idx, CLIENT *Client, + const int Reason, unsigned int Value)); static array My_Listeners; static array My_ConnArray; @@ -114,6 +107,9 @@ static void server_login PARAMS((CONN_ID idx)); #ifdef SSL_SUPPORT extern struct SSLOptions Conf_SSLOptions; +static bool SSL_WantRead PARAMS((const CONNECTION *c)); +static bool SSL_WantWrite PARAMS((const CONNECTION *c)); +static void cb_listen_ssl PARAMS((int sock, short irrelevant)); static void cb_connserver_login_ssl PARAMS((int sock, short what)); static void cb_clientserver_ssl PARAMS((int sock, short what)); #endif @@ -123,7 +119,6 @@ static void cb_clientserver PARAMS((int sock, short what)); time_t idle_t = 0; - /** * Get number of sockets available from systemd(8). * @@ -159,7 +154,6 @@ my_sd_listen_fds(void) return count; } - /** * IO callback for listening sockets: handle new connections. This callback * gets called when a new non-SSL connection should be accepted. @@ -174,29 +168,6 @@ cb_listen(int sock, short irrelevant) (void) New_Connection(sock, false); } - -#ifdef SSL_SUPPORT -/** - * IO callback for listening SSL sockets: handle new connections. This callback - * gets called when a new SSL-enabled connection should be accepted. - * - * @param sock Socket descriptor. - * @param irrelevant (ignored IO specification) - */ -static void -cb_listen_ssl(int sock, short irrelevant) -{ - int fd; - - (void) irrelevant; - fd = New_Connection(sock, true); - if (fd < 0) - return; - io_event_setcb(My_Connections[fd].sock, cb_clientserver_ssl); -} -#endif - - /** * IO callback for new outgoing non-SSL server connections. * @@ -275,7 +246,6 @@ cb_connserver(int sock, UNUSED short what) server_login(idx); } - /** * Login to a remote server. * @@ -293,46 +263,11 @@ server_login(CONN_ID idx) io_event_add( My_Connections[idx].sock, IO_WANTREAD|IO_WANTWRITE); /* Send PASS and SERVER command to peer */ - Conn_WriteStr( idx, "PASS %s %s", Conf_Server[Conf_GetServer( idx )].pwd_out, NGIRCd_ProtoID ); - Conn_WriteStr( idx, "SERVER %s :%s", Conf_ServerName, Conf_ServerInfo ); -} - - -#ifdef SSL_SUPPORT -/** - * IO callback for new outgoing SSL-enabled server connections. - * - * @param sock Socket descriptor. - * @param unused (ignored IO specification) - */ -static void -cb_connserver_login_ssl(int sock, short unused) -{ - CONN_ID idx = Socket2Index(sock); - - assert(idx >= 0); - if (idx < 0) { - io_close(sock); - return; - } - (void) unused; - switch (ConnSSL_Connect( &My_Connections[idx])) { - case 1: break; - case 0: LogDebug("ConnSSL_Connect: not ready"); - return; - case -1: - Log(LOG_ERR, "SSL connection on socket %d failed!", sock); - Conn_Close(idx, "Can't connect", NULL, false); - return; - } - - Log( LOG_INFO, "SSL connection %d with \"%s:%d\" established.", idx, - My_Connections[idx].host, Conf_Server[Conf_GetServer( idx )].port ); - - server_login(idx); + Conn_WriteStr(idx, "PASS %s %s", + Conf_Server[Conf_GetServer( idx )].pwd_out, NGIRCd_ProtoID); + Conn_WriteStr(idx, "SERVER %s :%s", + Conf_ServerName, Conf_ServerInfo); } -#endif - /** * IO callback for established non-SSL client and server connections. @@ -366,43 +301,6 @@ cb_clientserver(int sock, short what) Handle_Write(idx); } - -#ifdef SSL_SUPPORT -/** - * IO callback for new SSL-enabled client and server connections. - * - * @param sock Socket descriptor. - * @param what IO specification (IO_WANTREAD/IO_WANTWRITE/...). - */ -static void -cb_clientserver_ssl(int sock, UNUSED short what) -{ - CONN_ID idx = Socket2Index(sock); - - assert(idx >= 0); - - if (idx < 0) { - io_close(sock); - return; - } - - switch (ConnSSL_Accept(&My_Connections[idx])) { - case 1: - break; /* OK */ - case 0: - return; /* EAGAIN: callback will be invoked again by IO layer */ - default: - Conn_Close(idx, - "SSL accept error, closing socket", "SSL accept error", - false); - return; - } - - io_event_setcb(sock, cb_clientserver); /* SSL handshake completed */ -} -#endif - - /** * Initialize connection module. */ @@ -437,7 +335,6 @@ Conn_Init( void ) Init_Conn_Struct(i); } /* Conn_Init */ - /** * Clean up connection module. */ @@ -462,7 +359,6 @@ Conn_Exit( void ) io_library_shutdown(); } /* Conn_Exit */ - /** * Close all sockets (file descriptors) of open connections. * This is useful in forked child processes, for example, to make sure that @@ -480,7 +376,6 @@ Conn_CloseAllSockets(int ExceptOf) } } - /** * Initialize listening ports. * @@ -519,7 +414,6 @@ Init_Listeners(array *a, const char *listen_addr, void (*func)(int,short)) return created; } - /** * Initialize all listening sockets. * @@ -549,15 +443,18 @@ Conn_InitListeners( void ) for (i = 0; i < count; i++) { fd = SD_LISTEN_FDS_START + i; addr_len = (int)sizeof(addr); - getsockname(fd, (struct sockaddr *)&addr, (socklen_t*)&addr_len); + getsockname(fd, (struct sockaddr *)&addr, + (socklen_t*)&addr_len); #ifdef WANT_IPV6 - if (addr.sin4.sin_family != AF_INET && addr.sin4.sin_family != AF_INET6) + if (addr.sin4.sin_family != AF_INET + && addr.sin4.sin_family != AF_INET6) #else if (addr.sin4.sin_family != AF_INET) #endif { - /* Socket is of unsupported type! For example, systemd passed in - * an IPv6 socket but ngIRCd isn't compiled with IPv6 support. */ + /* Socket is of unsupported type! For example, + * systemd passed in an IPv6 socket but ngIRCd + * isn't compiled with IPv6 support. */ switch (addr.sin4.sin_family) { case AF_UNSPEC: af_str = "AF_UNSPEC"; break; @@ -627,7 +524,6 @@ Conn_InitListeners( void ) return created; } /* Conn_InitListeners */ - /** * Shut down all listening sockets. */ @@ -657,7 +553,6 @@ Conn_ExitListeners( void ) array_free(&My_Listeners); } /* Conn_ExitListeners */ - /** * Bind a socket to a specific (source) address. * @@ -674,13 +569,13 @@ InitSinaddrListenAddr(ng_ipaddr_t *addr, const char *listen_addrstr, UINT16 Port ret = ng_ipaddr_init(addr, listen_addrstr, Port); if (!ret) { assert(listen_addrstr); - Log(LOG_CRIT, "Can't bind to [%s]:%u: can't convert ip address \"%s\"!", - listen_addrstr, Port, listen_addrstr); + Log(LOG_CRIT, + "Can't bind to [%s]:%u: can't convert ip address \"%s\"!", + listen_addrstr, Port, listen_addrstr); } return ret; } - /** * Set a socket to "IPv6 only". If the given socket doesn't belong to the * AF_INET6 family, or the operating system doesn't support this functionality, @@ -706,7 +601,6 @@ set_v6_only(int af, int sock) #endif } - /** * Initialize new listening port. * @@ -763,67 +657,6 @@ NewListener(const char *listen_addr, UINT16 Port) return sock; } /* NewListener */ - -#ifdef SSL_SUPPORT - -/** - * Check if SSL library needs to read SSL-protocol related data. - * - * SSL/TLS connections require extra treatment: - * When either CONN_SSL_WANT_WRITE or CONN_SSL_WANT_READ is set, we - * need to take care of that first, before checking read/write buffers. - * For instance, while we might have data in our write buffer, the - * TLS/SSL protocol might need to read internal data first for TLS/SSL - * writes to succeed. - * - * If this function returns true, such a condition is met and we have - * to reverse the condition (check for read even if we've data to write, - * do not check for read but writeability even if write-buffer is empty). - * - * @param c Connection to check. - * @returns true if SSL-library has to read protocol data. - */ -static bool -SSL_WantRead(const CONNECTION *c) -{ - if (Conn_OPTION_ISSET(c, CONN_SSL_WANT_READ)) { - io_event_add(c->sock, IO_WANTREAD); - return true; - } - return false; -} - -/** - * Check if SSL library needs to write SSL-protocol related data. - * - * Please see description of SSL_WantRead() for full description! - * - * @param c Connection to check. - * @returns true if SSL-library has to write protocol data. - */ -static bool -SSL_WantWrite(const CONNECTION *c) -{ - if (Conn_OPTION_ISSET(c, CONN_SSL_WANT_WRITE)) { - io_event_add(c->sock, IO_WANTWRITE); - return true; - } - return false; -} - -#else - -static inline bool -SSL_WantRead(UNUSED const CONNECTION *c) -{ return false; } - -static inline bool -SSL_WantWrite(UNUSED const CONNECTION *c) -{ return false; } - -#endif - - /** * "Main Loop": Loop until shutdown or restart is signalled. * @@ -837,7 +670,7 @@ GLOBAL void Conn_Handler(void) { int i; - unsigned int wdatalen, bytes_processed; + size_t wdatalen; struct timeval tv; time_t t; @@ -856,17 +689,7 @@ Conn_Handler(void) if ((My_Connections[i].sock > NONE) && (array_bytes(&My_Connections[i].rbuf) > 0)) { /* ... and try to handle the received data */ - bytes_processed = Handle_Buffer(i); - /* if we processed data, and there might be - * more commands in the input buffer, do not - * try to read any more data now */ - if (bytes_processed && - array_bytes(&My_Connections[i].rbuf) > 2) { - LogDebug - ("Throttling connection %d: command limit reached!", - i); - Conn_SetPenalty(i, 1); - } + Handle_Buffer(i); } } @@ -875,7 +698,7 @@ Conn_Handler(void) if (My_Connections[i].sock <= NONE) continue; - wdatalen = (unsigned int)array_bytes(&My_Connections[i].wbuf); + wdatalen = array_bytes(&My_Connections[i].wbuf); #ifdef ZLIB if (wdatalen > 0 || array_bytes(&My_Connections[i].zip.wbuf) > 0) @@ -883,8 +706,10 @@ Conn_Handler(void) if (wdatalen > 0) #endif { +#ifdef SSL_SUPPORT if (SSL_WantRead(&My_Connections[i])) continue; +#endif io_event_add(My_Connections[i].sock, IO_WANTWRITE); } @@ -896,7 +721,9 @@ Conn_Handler(void) continue; #ifdef SSL_SUPPORT if (SSL_WantWrite(&My_Connections[i])) - continue; /* TLS/SSL layer needs to write data; deal with this first */ + /* TLS/SSL layer needs to write data; deal + * with this first! */ + continue; #endif if (Proc_InProgress(&My_Connections[i].proc_stat)) { /* Wait for completion of forked subprocess @@ -954,7 +781,6 @@ Conn_Handler(void) Log(LOG_NOTICE | LOG_snotice, "Server restarting NOW!"); } /* Conn_Handler */ - /** * Write a text string into the socket of a connection. * @@ -984,6 +810,7 @@ va_dcl size_t len; bool ok; va_list ap; + int r; assert( Idx > NONE ); assert( Format != NULL ); @@ -993,7 +820,8 @@ va_dcl #else va_start( ap ); #endif - if (vsnprintf( buffer, COMMAND_LEN - 2, Format, ap ) >= COMMAND_LEN - 2 ) { + r = vsnprintf(buffer, COMMAND_LEN - 2, Format, ap); + if (r >= COMMAND_LEN - 2 || r == -1) { /* * The string that should be written to the socket is longer * than the allowed size of COMMAND_LEN bytes (including both @@ -1014,6 +842,13 @@ va_dcl * 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 ... + * + * Note: + * C99 states that vsnprintf() "returns the number of characters + * that would have been printed if the n were unlimited"; but + * according to the Linux manual page "glibc until 2.0.6 would + * return -1 when the output was truncated" -- so we have to + * handle both cases ... * -alex- */ @@ -1152,7 +987,6 @@ Conn_Write( CONN_ID Idx, char *Data, size_t Len ) return true; } /* Conn_Write */ - /** * Shut down a connection. * @@ -1165,7 +999,7 @@ Conn_Write( CONN_ID Idx, char *Data, size_t Len ) * connection statistics before disconnecting it. */ GLOBAL void -Conn_Close( CONN_ID Idx, const char *LogMsg, const char *FwdMsg, bool InformClient ) +Conn_Close(CONN_ID Idx, const char *LogMsg, const char *FwdMsg, bool InformClient) { /* Close connection. Open pipes of asynchronous resolver * sub-processes are closed down. */ @@ -1311,7 +1145,6 @@ Conn_Close( CONN_ID Idx, const char *LogMsg, const char *FwdMsg, bool InformClie idle_t = NumConnections > 0 ? 0 : time(NULL); } /* Conn_Close */ - /** * Get current number of connections. * @@ -1323,7 +1156,6 @@ Conn_Count(void) return NumConnections; } /* Conn_Count */ - /** * Get number of maximum simultaneous connections. * @@ -1335,7 +1167,6 @@ Conn_CountMax(void) return NumConnectionsMax; } /* Conn_CountMax */ - /** * Get number of connections accepted since the daemon startet. * @@ -1347,7 +1178,6 @@ Conn_CountAccepted(void) return NumConnectionsAccepted; } /* Conn_CountAccepted */ - /** * Synchronize established connections and configured server structures * after a configuration update and store the correct connection IDs, if any. @@ -1379,7 +1209,6 @@ Conn_SyncServerStruct(void) } } /* SyncServerStruct */ - /** * Get IP address string of a connection. * @@ -1393,7 +1222,6 @@ Conn_GetIPAInfo(CONN_ID Idx) return ng_ipaddr_tostr(&My_Connections[Idx].addr); } - /** * Send out data of write buffer; connect new sockets. * @@ -1433,7 +1261,7 @@ Handle_Write( CONN_ID Idx ) return true; } -#ifdef DEBUG_BUFFER +#if DEBUG_BUFFER LogDebug ("Handle_Write() called for connection %d, %ld bytes pending ...", Idx, wdatalen); @@ -1441,7 +1269,9 @@ Handle_Write( CONN_ID Idx ) #ifdef SSL_SUPPORT if ( Conn_OPTION_ISSET( &My_Connections[Idx], CONN_SSL )) { - len = ConnSSL_Write(&My_Connections[Idx], array_start(&My_Connections[Idx].wbuf), wdatalen); + len = ConnSSL_Write(&My_Connections[Idx], + array_start(&My_Connections[Idx].wbuf), + wdatalen); } else #endif { @@ -1469,7 +1299,6 @@ Handle_Write( CONN_ID Idx ) return true; } /* Handle_Write */ - /** * Count established connections to a specific IP address. * @@ -1490,7 +1319,6 @@ Count_Connections(ng_ipaddr_t *a) return cnt; } /* Count_Connections */ - /** * Initialize new client connection on a listening socket. * @@ -1637,7 +1465,6 @@ New_Connection(int Sock, UNUSED bool IsSSL) return new_sock; } /* New_Connection */ - /** * Finish connection initialization, start resolver subprocess. * @@ -1681,7 +1508,6 @@ Conn_StartLogin(CONN_ID Idx) ident_sock, cb_Read_Resolver_Result); } - /** * Update global connection counters. */ @@ -1696,7 +1522,6 @@ Account_Connection(void) NumConnections, NumConnectionsMax); } /* Account_Connection */ - /** * Translate socket handle into connection index. * @@ -1717,7 +1542,6 @@ Socket2Index( int Sock ) return Sock; } /* Socket2Index */ - /** * Read data from the network to the read buffer. If an error occurs, * the socket of this connection will be shut down. @@ -1744,8 +1568,8 @@ Read_Request( CONN_ID Idx ) { /* Read buffer is full */ Log(LOG_ERR, - "Receive buffer space exhausted (connection %d): %d bytes", - Idx, array_bytes(&My_Connections[Idx].rbuf)); + "Receive buffer space exhausted (connection %d): %d/%d bytes", + Idx, array_bytes(&My_Connections[Idx].rbuf), READBUFFER_LEN); Conn_Close(Idx, "Receive buffer space exhausted", NULL, false); return; } @@ -1790,12 +1614,15 @@ Read_Request( CONN_ID Idx ) Log(LOG_ERR, "Could not append received data to input buffer (connection %d): %d bytes!", Idx, len); - Conn_Close(Idx, "Receive buffer space exhausted", NULL, false ); + Conn_Close(Idx, "Receive buffer space exhausted", NULL, + false ); } } /* Update connection statistics */ My_Connections[Idx].bytes_in += len; + + /* Handle read buffer */ My_Connections[Idx].bps += Handle_Buffer(Idx); /* Make sure that there is still a valid client registered */ @@ -1821,17 +1648,10 @@ Read_Request( CONN_ID Idx ) } /* Look at the data in the (read-) buffer of this connection */ - if (Client_Type(c) != CLIENT_SERVER - && Client_Type(c) != CLIENT_UNKNOWNSERVER - && Client_Type(c) != CLIENT_SERVICE - && My_Connections[Idx].bps >= maxbps) { - LogDebug("Throttling connection %d: BPS exceeded! (%u >= %u)", - Idx, My_Connections[Idx].bps, maxbps); - Conn_SetPenalty(Idx, 1); - } + if (My_Connections[Idx].bps >= maxbps) + Throttle_Connection(Idx, c, THROTTLE_BPS, maxbps); } /* Read_Request */ - /** * Handle all data in the connection read-buffer. * @@ -1873,7 +1693,12 @@ Handle_Buffer(CONN_ID Idx) maxcmd *= 5; break; case CLIENT_SERVICE: - maxcmd = MAX_COMMANDS_SERVICE; break; + maxcmd = MAX_COMMANDS_SERVICE; + break; + case CLIENT_USER: + if (Client_HasMode(c, 'F')) + maxcmd = MAX_COMMANDS_SERVICE; + break; } for (i=0; i < maxcmd; i++) { @@ -1915,7 +1740,7 @@ Handle_Buffer(CONN_ID Idx) ptr2 = strchr(array_start(&My_Connections[Idx].rbuf), '\n'); if (ptr) { /* Check if there is a single CR or LF _before_ the - * corerct CR+LF line terminator: */ + * correct CR+LF line terminator: */ first_eol = ptr1 < ptr2 ? ptr1 : ptr2; if (first_eol < ptr) { /* Single CR or LF before CR+LF found */ @@ -1970,10 +1795,6 @@ Handle_Buffer(CONN_ID Idx) return 0; /* error -> connection has been closed */ array_moveleft(&My_Connections[Idx].rbuf, 1, len); -#ifdef DEBUG_BUFFER - LogDebug("Connection %d: %d bytes left in read buffer.", - Idx, array_bytes(&My_Connections[Idx].rbuf)); -#endif #ifdef ZLIB if ((!old_z) && (My_Connections[Idx].options & CONN_ZIP) && (array_bytes(&My_Connections[Idx].rbuf) > 0)) { @@ -1996,10 +1817,20 @@ Handle_Buffer(CONN_ID Idx) } #endif } +#if DEBUG_BUFFER + LogDebug("Connection %d: Processed %ld commands (max=%ld), %ld bytes. %ld bytes left in read buffer.", + Idx, i, maxcmd, len_processed, + array_bytes(&My_Connections[Idx].rbuf)); +#endif + + /* If data has been processed but there is still data in the read + * buffer, the command limit triggered. Enforce the penalty time: */ + if (len_processed && array_bytes(&My_Connections[Idx].rbuf) > 2) + Throttle_Connection(Idx, c, THROTTLE_CMDS, maxcmd); + return len_processed; } /* Handle_Buffer */ - /** * Check whether established connections are still alive or not. * If not, play PING-PONG first; and if that doesn't help either, @@ -2058,7 +1889,6 @@ Check_Connections(void) } } /* Check_Connections */ - /** * Check if further server links should be established. */ @@ -2074,7 +1904,7 @@ Check_Servers(void) for (i = 0; i < MAX_SERVERS; i++) { if (Conf_Server[i].conn_id != NONE) continue; /* Already establishing or connected */ - if (!Conf_Server[i].host[0] || !Conf_Server[i].port > 0) + if (!Conf_Server[i].host[0] || Conf_Server[i].port <= 0) continue; /* No host and/or port configured */ if (Conf_Server[i].flags & CONF_SFLAG_DISABLED) continue; /* Disabled configuration entry */ @@ -2106,7 +1936,6 @@ Check_Servers(void) } } /* Check_Servers */ - /** * Establish a new outgoing server connection. * @@ -2159,12 +1988,15 @@ New_Server( int Server , ng_ipaddr_t *dest) /* is a bind address configured? */ res = ng_ipaddr_af(&Conf_Server[Server].bind_addr); - /* if yes, bind now. If it fails, warn and let connect() pick a source address */ + + /* if yes, bind now. If it fails, warn and let connect() pick a + * source address */ if (res && bind(new_sock, (struct sockaddr *) &Conf_Server[Server].bind_addr, ng_ipaddr_salen(&Conf_Server[Server].bind_addr))) { ng_ipaddr_tostr_r(&Conf_Server[Server].bind_addr, ip_str); - Log(LOG_WARNING, "Can't bind socket to %s: %s!", ip_str, strerror(errno)); + Log(LOG_WARNING, "Can't bind socket to %s: %s!", ip_str, + strerror(errno)); } ng_ipaddr_setport(dest, Conf_Server[Server].port); res = connect(new_sock, (struct sockaddr *) dest, ng_ipaddr_salen(dest)); @@ -2185,7 +2017,8 @@ New_Server( int Server , ng_ipaddr_t *dest) } if (!io_event_create( new_sock, IO_WANTWRITE, cb_connserver)) { - Log(LOG_ALERT, "io_event_create(): could not add fd %d", strerror(errno)); + Log(LOG_ALERT, "io_event_create(): could not add fd %d", + strerror(errno)); close(new_sock); Conf_Server[Server].conn_id = NONE; return; @@ -2221,12 +2054,13 @@ New_Server( int Server , ng_ipaddr_t *dest) sizeof(My_Connections[new_sock].host )); #ifdef SSL_SUPPORT - if (Conf_Server[Server].SSLConnect && !ConnSSL_PrepareConnect( &My_Connections[new_sock], - &Conf_Server[Server] )) + if (Conf_Server[Server].SSLConnect && + !ConnSSL_PrepareConnect(&My_Connections[new_sock], &Conf_Server[Server])) { Log(LOG_ALERT, "Could not initialize SSL for outgoing connection"); - Conn_Close( new_sock, "Could not initialize SSL for outgoing connection", NULL, false ); - Init_Conn_Struct( new_sock ); + Conn_Close(new_sock, "Could not initialize SSL for outgoing connection", + NULL, false); + Init_Conn_Struct(new_sock); Conf_Server[Server].conn_id = NONE; return; } @@ -2236,7 +2070,6 @@ New_Server( int Server , ng_ipaddr_t *dest) Conn_OPTION_ADD( &My_Connections[new_sock], CONN_ISCONNECTING ); } /* New_Server */ - /** * Initialize connection structure. * @@ -2260,7 +2093,6 @@ Init_Conn_Struct(CONN_ID Idx) #endif } /* Init_Conn_Struct */ - /** * Initialize options of a new socket. * @@ -2276,16 +2108,18 @@ Init_Socket( int Sock ) int value; if (!io_setnonblock(Sock)) { - Log( LOG_CRIT, "Can't enable non-blocking mode for socket: %s!", strerror( errno )); - close( Sock ); + Log(LOG_CRIT, "Can't enable non-blocking mode for socket: %s!", + strerror(errno)); + close(Sock); return false; } /* Don't block this port after socket shutdown */ value = 1; - if( setsockopt( Sock, SOL_SOCKET, SO_REUSEADDR, &value, (socklen_t)sizeof( value )) != 0 ) - { - Log( LOG_ERR, "Can't set socket option SO_REUSEADDR: %s!", strerror( errno )); + if (setsockopt(Sock, SOL_SOCKET, SO_REUSEADDR, &value, + (socklen_t)sizeof(value)) != 0) { + Log(LOG_ERR, "Can't set socket option SO_REUSEADDR: %s!", + strerror(errno)); /* ignore this error */ } @@ -2305,7 +2139,6 @@ Init_Socket( int Sock ) return true; } /* Init_Socket */ - /** * Read results of a resolver sub-process and try to initiate a new server * connection. @@ -2316,15 +2149,16 @@ Init_Socket( int Sock ) static void cb_Connect_to_Server(int fd, UNUSED short events) { - /* Read result of resolver sub-process from pipe and start connection */ int i; size_t len; - ng_ipaddr_t dest_addrs[4]; /* we can handle at most 3; but we read up to - four so we can log the 'more than we can handle' - condition. First result is tried immediately, rest - is saved for later if needed. */ - LogDebug("Resolver: Got forward lookup callback on fd %d, events %d", fd, events); + /* we can handle at most 3 addresses; but we read up to 4 so we can + * log the 'more than we can handle' condition. First result is tried + * immediately, rest is saved for later if needed. */ + ng_ipaddr_t dest_addrs[4]; + + LogDebug("Resolver: Got forward lookup callback on fd %d, events %d", + fd, events); for (i=0; i < MAX_SERVERS; i++) { if (Proc_GetPipeFd(&Conf_Server[i].res_stat) == fd ) @@ -2349,7 +2183,8 @@ cb_Connect_to_Server(int fd, UNUSED short events) assert((len % sizeof(ng_ipaddr_t)) == 0); - LogDebug("Got result from resolver: %u structs (%u bytes).", len/sizeof(ng_ipaddr_t), len); + LogDebug("Got result from resolver: %u structs (%u bytes).", + len/sizeof(ng_ipaddr_t), len); memset(&Conf_Server[i].dst_addr, 0, sizeof(Conf_Server[i].dst_addr)); if (len > sizeof(ng_ipaddr_t)) { @@ -2367,7 +2202,6 @@ cb_Connect_to_Server(int fd, UNUSED short events) New_Server(i, dest_addrs); } /* cb_Read_Forward_Lookup */ - /** * Read results of a resolver sub-process from the pipe and update the * appropriate connection/client structure(s): hostname and/or IDENT user name. @@ -2488,7 +2322,6 @@ cb_Read_Resolver_Result( int r_fd, UNUSED short events ) #endif } /* cb_Read_Resolver_Result */ - /** * Write a "simple" (error) message to a socket. * @@ -2522,7 +2355,6 @@ Simple_Message(int Sock, const char *Msg) } } /* Simple_Error */ - /** * Get CLIENT structure that belongs to a local connection identified by its * index number. Each connection belongs to a client by definition, so it is @@ -2559,7 +2391,6 @@ Conn_GetProcStat(CONN_ID Idx) return &c->proc_stat; } /* Conn_GetProcStat */ - /** * Get CONN_ID from file descriptor associated to a subprocess structure. * @@ -2580,6 +2411,35 @@ Conn_GetFromProc(int fd) return NONE; } /* Conn_GetFromProc */ +/** + * Throttle a connection because of excessive usage. + * + * @param Reason The reason, see THROTTLE_xxx constants. + * @param Idx The connection index. + * @param Client The client of this connection. + * @param Seconds The time to delay this connection. + */ +static void +Throttle_Connection(const CONN_ID Idx, CLIENT *Client, const int Reason, + unsigned int Value) +{ + assert(Idx > NONE); + assert(Client != NULL); + + /* Never throttle servers or services, only interrupt processing */ + if (Client_Type(Client) == CLIENT_SERVER + || Client_Type(Client) == CLIENT_UNKNOWNSERVER + || Client_Type(Client) == CLIENT_SERVICE) + return; + + /* Don't throttle clients with user mode 'F' set */ + if (Client_HasMode(Client, 'F')) + return; + + LogDebug("Throttling connection %d: code %d, value %d!", Idx, + Reason, Value); + Conn_SetPenalty(Idx, 1); +} #ifndef STRICT_RFC @@ -2597,12 +2457,142 @@ Conn_SetAuthPing(CONN_ID Idx, long ID) My_Connections[Idx].auth_ping = ID; } /* Conn_SetAuthPing */ -#endif - +#endif /* STRICT_RFC */ #ifdef SSL_SUPPORT /** + * IO callback for new SSL-enabled client and server connections. + * + * @param sock Socket descriptor. + * @param what IO specification (IO_WANTREAD/IO_WANTWRITE/...). + */ +static void +cb_clientserver_ssl(int sock, UNUSED short what) +{ + CONN_ID idx = Socket2Index(sock); + + assert(idx >= 0); + + if (idx < 0) { + io_close(sock); + return; + } + + switch (ConnSSL_Accept(&My_Connections[idx])) { + case 1: + break; /* OK */ + case 0: + return; /* EAGAIN: callback will be invoked again by IO layer */ + default: + Conn_Close(idx, + "SSL accept error, closing socket", "SSL accept error", + false); + return; + } + + io_event_setcb(sock, cb_clientserver); /* SSL handshake completed */ +} + +/** + * IO callback for listening SSL sockets: handle new connections. This callback + * gets called when a new SSL-enabled connection should be accepted. + * + * @param sock Socket descriptor. + * @param irrelevant (ignored IO specification) + */ +static void +cb_listen_ssl(int sock, short irrelevant) +{ + int fd; + + (void) irrelevant; + fd = New_Connection(sock, true); + if (fd < 0) + return; + io_event_setcb(My_Connections[fd].sock, cb_clientserver_ssl); +} + +/** + * IO callback for new outgoing SSL-enabled server connections. + * + * @param sock Socket descriptor. + * @param unused (ignored IO specification) + */ +static void +cb_connserver_login_ssl(int sock, short unused) +{ + CONN_ID idx = Socket2Index(sock); + + assert(idx >= 0); + if (idx < 0) { + io_close(sock); + return; + } + (void) unused; + switch (ConnSSL_Connect( &My_Connections[idx])) { + case 1: break; + case 0: LogDebug("ConnSSL_Connect: not ready"); + return; + case -1: + Log(LOG_ERR, "SSL connection on socket %d failed!", sock); + Conn_Close(idx, "Can't connect", NULL, false); + return; + } + + Log( LOG_INFO, "SSL connection %d with \"%s:%d\" established.", idx, + My_Connections[idx].host, Conf_Server[Conf_GetServer( idx )].port ); + + server_login(idx); +} + + +/** + * Check if SSL library needs to read SSL-protocol related data. + * + * SSL/TLS connections require extra treatment: + * When either CONN_SSL_WANT_WRITE or CONN_SSL_WANT_READ is set, we + * need to take care of that first, before checking read/write buffers. + * For instance, while we might have data in our write buffer, the + * TLS/SSL protocol might need to read internal data first for TLS/SSL + * writes to succeed. + * + * If this function returns true, such a condition is met and we have + * to reverse the condition (check for read even if we've data to write, + * do not check for read but writeability even if write-buffer is empty). + * + * @param c Connection to check. + * @returns true if SSL-library has to read protocol data. + */ +static bool +SSL_WantRead(const CONNECTION *c) +{ + if (Conn_OPTION_ISSET(c, CONN_SSL_WANT_READ)) { + io_event_add(c->sock, IO_WANTREAD); + return true; + } + return false; +} + +/** + * Check if SSL library needs to write SSL-protocol related data. + * + * Please see description of SSL_WantRead() for full description! + * + * @param c Connection to check. + * @returns true if SSL-library has to write protocol data. + */ +static bool +SSL_WantWrite(const CONNECTION *c) +{ + if (Conn_OPTION_ISSET(c, CONN_SSL_WANT_WRITE)) { + io_event_add(c->sock, IO_WANTWRITE); + return true; + } + return false; +} + +/** * Get information about used SSL cipher. * * @param Idx Connection index number. @@ -2619,7 +2609,6 @@ Conn_GetCipherInfo(CONN_ID Idx, char *buf, size_t len) return ConnSSL_GetCipherInfo(&My_Connections[Idx], buf, len); } - /** * Check if a connection is SSL-enabled or not. * @@ -2635,7 +2624,6 @@ Conn_UsesSSL(CONN_ID Idx) return Conn_OPTION_ISSET(&My_Connections[Idx], CONN_SSL); } - GLOBAL char * Conn_GetCertFp(CONN_ID Idx) { @@ -2645,7 +2633,6 @@ Conn_GetCertFp(CONN_ID Idx) return ConnSSL_GetCertFp(&My_Connections[Idx]); } - GLOBAL bool Conn_SetCertFp(CONN_ID Idx, const char *fingerprint) { @@ -2654,28 +2641,28 @@ Conn_SetCertFp(CONN_ID Idx, const char *fingerprint) assert(Idx < (int) array_length(&My_ConnArray, sizeof(CONNECTION))); return ConnSSL_SetCertFp(&My_Connections[Idx], fingerprint); } -#else + +#else /* SSL_SUPPORT */ + GLOBAL bool Conn_UsesSSL(UNUSED CONN_ID Idx) { return false; } - GLOBAL char * Conn_GetCertFp(UNUSED CONN_ID Idx) { return NULL; } - GLOBAL bool Conn_SetCertFp(UNUSED CONN_ID Idx, UNUSED const char *fingerprint) { return true; } -#endif +#endif /* SSL_SUPPORT */ #ifdef DEBUG @@ -2701,7 +2688,6 @@ Conn_DebugDump(void) } } /* Conn_DumpClients */ -#endif - +#endif /* DEBUG */ /* -eof- */ diff --git a/src/ngircd/defines.h b/src/ngircd/defines.h index 361564f..456c4c9 100644 --- a/src/ngircd/defines.h +++ b/src/ngircd/defines.h @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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 @@ -53,7 +53,7 @@ /* Size of structures */ /** Max. count of configurable servers. */ -#define MAX_SERVERS 16 +#define MAX_SERVERS 64 /** Max. number of WHOWAS list items that can be stored. */ #define MAX_WHOWAS 64 @@ -109,6 +109,10 @@ #else # define CLIENT_USER_LEN 10 #endif +/** Max. length of user names saved for authentication (used by PAM) */ +#ifdef PAM +# define CLIENT_AUTHUSER_LEN 64 +#endif /** Max. length of "real names" (including NULL). */ #define CLIENT_NAME_LEN 32 @@ -173,7 +177,7 @@ #endif /** Supported user modes. */ -#define USERMODES "abBcCioqrRswx" +#define USERMODES "abBcCFioqrRswx" /** Supported channel modes. */ #define CHANMODES "abehiIklmMnoOPqQrRstvVz" diff --git a/src/ngircd/hash.c b/src/ngircd/hash.c index 3c60038..cdac5e8 100644 --- a/src/ngircd/hash.c +++ b/src/ngircd/hash.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2010 Alexander Barton (alex@barton.de) + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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,14 +16,12 @@ * Hash calculation */ -#include "imp.h" #include #include #include "defines.h" #include "tool.h" -#include "exp.h" #include "hash.h" static UINT32 jenkins_hash PARAMS((UINT8 *k, UINT32 length, UINT32 initval)); diff --git a/src/ngircd/io.c b/src/ngircd/io.c index dab3043..037c4af 100644 --- a/src/ngircd/io.c +++ b/src/ngircd/io.c @@ -1,11 +1,13 @@ /* + * ngIRCd -- The Next Generation IRC Daemon + * Copyright (c)2005-2006 Florian Westphal (westphal@foo.fh-furtwangen.de) + * Copyright (c)2006-2014 Alexander Barton (alex@barton.de) and Contributors. + * * 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. - * - * Copyright (c) 2005 Florian Westphal (westphal@foo.fh-furtwangen.de) */ #include "portab.h" @@ -15,21 +17,20 @@ * I/O abstraction interface. */ +/* Extra debug messages in event add/delete/callback code: 0=off / 1=on */ +#define DEBUG_IO 0 + #include -#include #include -#include #include #include +#include #include #include "array.h" #include "io.h" #include "log.h" -/* Enables extra debug messages in event add/delete/callback code. */ -/* #define DEBUG_IO */ - typedef struct { #ifdef PROTOTYPES void (*callback)(int, short); @@ -119,6 +120,7 @@ static bool io_event_change_devpoll(int fd, short what); #endif #ifdef IO_USE_SELECT +#include #include "defines.h" /* for conn.h */ #include "proc.h" /* for PROC_STAT (needed by conf.h) */ #include "conn.h" /* for CONN_ID (needed by conf.h) */ @@ -142,7 +144,7 @@ static array io_events; static void io_docallback PARAMS((int fd, short what)); -#ifdef DEBUG_IO +#if DEBUG_IO static void io_debug(const char *s, int fd, int what) { diff --git a/src/ngircd/irc-cap.c b/src/ngircd/irc-cap.c index 42b0e4d..bf4c9cd 100644 --- a/src/ngircd/irc-cap.c +++ b/src/ngircd/irc-cap.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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,22 +16,19 @@ * Handler for IRC capability ("CAP") commands */ -#include "imp.h" #include #include +#include -#include "defines.h" #include "conn.h" #include "channel.h" #include "client-cap.h" -#include "irc-macros.h" #include "irc-write.h" #include "log.h" #include "login.h" #include "messages.h" #include "parse.h" -#include "exp.h" #include "irc-cap.h" /* Local functions */ diff --git a/src/ngircd/irc-channel.c b/src/ngircd/irc-channel.c index b286b5a..c142243 100644 --- a/src/ngircd/irc-channel.c +++ b/src/ngircd/irc-channel.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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,13 +16,11 @@ * IRC channel commands */ -#include "imp.h" #include #include #include #include -#include "defines.h" #include "conn.h" #include "channel.h" #include "conn-func.h" @@ -37,7 +35,6 @@ #include "irc-write.h" #include "conf.h" -#include "exp.h" #include "irc-channel.h" /** @@ -323,11 +320,9 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req ) channame = strtok_r(channame, ",", &lastchan); /* Make sure that "channame" is not the empty string ("JOIN :") */ - if (!channame) { - IRC_SetPenalty(Client, 2); + if (!channame) return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command); - } while (channame) { flags = NULL; @@ -447,11 +442,9 @@ IRC_PART(CLIENT * Client, REQUEST * Req) chan = strtok(Req->argv[0], ","); /* Make sure that "chan" is not the empty string ("PART :") */ - if (!chan) { - IRC_SetPenalty(Client, 2); + if (!chan) return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command); - } while (chan) { Channel_Part(target, Client, chan, @@ -484,8 +477,6 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req ) assert( Client != NULL ); assert( Req != NULL ); - IRC_SetPenalty(Client, 1); - _IRC_GET_SENDER_OR_RETURN_(from, Req, Client) chan = Channel_Search(Req->argv[0]); @@ -582,8 +573,6 @@ IRC_LIST( CLIENT *Client, REQUEST *Req ) assert(Client != NULL); assert(Req != NULL); - IRC_SetPenalty(Client, 2); - _IRC_GET_SENDER_OR_RETURN_(from, Req, Client) if (Req->argc > 0) @@ -669,11 +658,9 @@ IRC_CHANINFO( CLIENT *Client, REQUEST *Req ) assert( Req != NULL ); /* Bad number of parameters? */ - if (Req->argc < 2 || Req->argc == 4 || Req->argc > 5) { - IRC_SetPenalty(Client, 2); + if (Req->argc < 2 || Req->argc == 4 || Req->argc > 5) return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command); - } /* Compatibility kludge */ if (Req->argc == 5) diff --git a/src/ngircd/irc-encoding.c b/src/ngircd/irc-encoding.c index 97b518a..7b7121b 100644 --- a/src/ngircd/irc-encoding.c +++ b/src/ngircd/irc-encoding.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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,7 +16,8 @@ * IRC encoding commands */ -#include "imp.h" +#ifdef ICONV + #include #include @@ -28,11 +29,8 @@ #include "parse.h" #include "tool.h" -#include "exp.h" #include "irc-encoding.h" -#ifdef ICONV - /** * Handler for the IRC+ "CHARCONV" command. * diff --git a/src/ngircd/irc-info.c b/src/ngircd/irc-info.c index 79a157c..763c930 100644 --- a/src/ngircd/irc-info.c +++ b/src/ngircd/irc-info.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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,13 +16,12 @@ * IRC info commands */ -#include "imp.h" #include -#include #include #include #include #include +#include #include "ngircd.h" #include "conn-func.h" @@ -30,12 +29,9 @@ #include "channel.h" #include "class.h" #include "conf.h" -#include "defines.h" #include "lists.h" -#include "log.h" #include "messages.h" #include "match.h" -#include "tool.h" #include "parse.h" #include "irc.h" #include "irc-macros.h" @@ -43,7 +39,6 @@ #include "client-cap.h" #include "op.h" -#include "exp.h" #include "irc-info.h" /* Local functions */ @@ -152,8 +147,6 @@ IRC_WHO_Channel(CLIENT *Client, CHANNEL *Chan, bool OnlyOps) assert( Client != NULL ); assert( Chan != NULL ); - IRC_SetPenalty(Client, 1); - is_member = Channel_IsMemberOf(Chan, Client); /* Secret channel? */ @@ -191,7 +184,7 @@ IRC_WHO_Channel(CLIENT *Client, CHANNEL *Chan, bool OnlyOps) } } - /* If there are a lot of clients, augment penalty a bit */ + /* If there are a lot of clients, increase the penalty a bit */ if (count > MAX_RPL_WHO) IRC_SetPenalty(Client, 1); @@ -403,6 +396,13 @@ IRC_WHOIS_SendReply(CLIENT *Client, CLIENT *from, CLIENT *c) Client_ID(from), Client_ID(c))) return DISCONNECTED; + /* Account name metadata? */ + if (Client_AccountName(c) && + !IRC_WriteStrClient(from, RPL_WHOISLOGGEDIN_MSG, + Client_ID(from), Client_ID(c), + Client_AccountName(c))) + return DISCONNECTED; + /* Local client and requester is the user itself or an IRC Op? */ if (Client_Conn(c) > NONE && (from == c || (!Conf_MorePrivacy && Client_HasMode(from, 'o')))) { @@ -500,8 +500,6 @@ IRC_ADMIN(CLIENT *Client, REQUEST *Req ) assert( Client != NULL ); assert( Req != NULL ); - IRC_SetPenalty(Client, 1); - _IRC_GET_SENDER_OR_RETURN_(prefix, Req, Client) _IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, prefix) @@ -544,8 +542,6 @@ IRC_INFO(CLIENT * Client, REQUEST * Req) assert(Client != NULL); assert(Req != NULL); - IRC_SetPenalty(Client, 2); - _IRC_GET_SENDER_OR_RETURN_(prefix, Req, Client) _IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, prefix) @@ -631,8 +627,6 @@ IRC_LINKS(CLIENT *Client, REQUEST *Req) assert(Client != NULL); assert(Req != NULL); - IRC_SetPenalty(Client, 1); - _IRC_GET_SENDER_OR_RETURN_(from, Req, Client) /* Get pointer to server mask or "*", if none given */ @@ -685,8 +679,6 @@ IRC_LUSERS( CLIENT *Client, REQUEST *Req ) assert( Client != NULL ); assert( Req != NULL ); - IRC_SetPenalty(Client, 1); - _IRC_GET_SENDER_OR_RETURN_(from, Req, Client) _IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 1, from) @@ -716,8 +708,6 @@ IRC_SERVLIST(CLIENT *Client, REQUEST *Req) assert(Client != NULL); assert(Req != NULL); - IRC_SetPenalty(Client, 1); - if (Req->argc < 2 || strcmp(Req->argv[1], "0") == 0) { for (c = Client_First(); c!= NULL; c = Client_Next(c)) { if (Client_Type(c) != CLIENT_SERVICE) @@ -753,8 +743,6 @@ IRC_MOTD( CLIENT *Client, REQUEST *Req ) assert( Client != NULL ); assert( Req != NULL ); - IRC_SetPenalty(Client, 3); - _IRC_GET_SENDER_OR_RETURN_(from, Req, Client) _IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, from) @@ -785,8 +773,6 @@ IRC_NAMES( CLIENT *Client, REQUEST *Req ) assert( Client != NULL ); assert( Req != NULL ); - IRC_SetPenalty(Client, 1); - _IRC_GET_SENDER_OR_RETURN_(from, Req, Client) _IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 1, from) @@ -871,8 +857,6 @@ IRC_STATS( CLIENT *Client, REQUEST *Req ) assert(Client != NULL); assert(Req != NULL); - IRC_SetPenalty(Client, 2); - _IRC_GET_SENDER_OR_RETURN_(from, Req, Client) _IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 1, from) @@ -1013,8 +997,6 @@ IRC_TIME( CLIENT *Client, REQUEST *Req ) assert(Client != NULL); assert(Req != NULL); - IRC_SetPenalty(Client, 1); - _IRC_GET_SENDER_OR_RETURN_(from, Req, Client) _IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, from) @@ -1048,8 +1030,6 @@ IRC_USERHOST(CLIENT *Client, REQUEST *Req) assert(Client != NULL); assert(Req != NULL); - IRC_SetPenalty(Client, 1); - if (Req->argc > 5) max = 5; else @@ -1110,8 +1090,6 @@ IRC_VERSION( CLIENT *Client, REQUEST *Req ) assert( Client != NULL ); assert( Req != NULL ); - IRC_SetPenalty(Client, 1); - _IRC_GET_SENDER_OR_RETURN_(prefix, Req, Client) _IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, prefix) @@ -1123,10 +1101,19 @@ IRC_VERSION( CLIENT *Client, REQUEST *Req ) } /* send version information */ - return IRC_WriteStrClient(Client, RPL_VERSION_MSG, Client_ID(prefix), - PACKAGE_NAME, PACKAGE_VERSION, - NGIRCd_DebugLevel, Conf_ServerName, - NGIRCd_VersionAddition); + if (!IRC_WriteStrClient(Client, RPL_VERSION_MSG, Client_ID(prefix), + PACKAGE_NAME, PACKAGE_VERSION, + NGIRCd_DebugLevel, Conf_ServerName, + NGIRCd_VersionAddition)) + return DISCONNECTED; + +#ifndef STRICT_RFC + /* send RPL_ISUPPORT(005) numerics */ + if (!IRC_Send_ISUPPORT(prefix)) + return DISCONNECTED; +#endif + + return CONNECTED; } /* IRC_VERSION */ /** @@ -1145,15 +1132,12 @@ IRC_WHO(CLIENT *Client, REQUEST *Req) assert (Client != NULL); assert (Req != NULL); - IRC_SetPenalty(Client, 1); - only_ops = false; if (Req->argc == 2) { if (strcmp(Req->argv[1], "o") == 0) only_ops = true; #ifdef STRICT_RFC else { - IRC_SetPenalty(Client, 2); return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), @@ -1177,7 +1161,6 @@ IRC_WHO(CLIENT *Client, REQUEST *Req) } /* No channel or (valid) mask given */ - IRC_SetPenalty(Client, 2); return IRC_WHO_Mask(Client, NULL, only_ops); } /* IRC_WHO */ @@ -1200,8 +1183,6 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req ) assert( Client != NULL ); assert( Req != NULL ); - IRC_SetPenalty(Client, 1); - /* Wrong number of parameters? */ if (Req->argc < 1) return IRC_WriteErrClient(Client, ERR_NONICKNAMEGIVEN_MSG, @@ -1263,6 +1244,7 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req ) continue; } got_wildcard = true; + /* Increase penalty for wildcard queries */ IRC_SetPenalty(Client, 3); for (c = Client_First(); c; c = Client_Next(c)) { @@ -1568,6 +1550,10 @@ IRC_Send_NAMES(CLIENT * Client, CHANNEL * Chan) GLOBAL bool IRC_Send_ISUPPORT(CLIENT * Client) { + if (Conf_Network[0] && !IRC_WriteStrClient(Client, RPL_ISUPPORTNET_MSG, + Client_ID(Client), + Conf_Network)) + return DISCONNECTED; if (!IRC_WriteStrClient(Client, RPL_ISUPPORT1_MSG, Client_ID(Client), CHANTYPES, CHANTYPES, Conf_MaxJoins)) return DISCONNECTED; diff --git a/src/ngircd/irc-login.c b/src/ngircd/irc-login.c index dc2f6e3..af165cf 100644 --- a/src/ngircd/irc-login.c +++ b/src/ngircd/irc-login.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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,15 +16,14 @@ * Login and logout */ -#include "imp.h" #include #include #include #include #include +#include #include "conn-func.h" -#include "class.h" #include "conf.h" #include "channel.h" #include "log.h" @@ -32,11 +31,9 @@ #include "messages.h" #include "parse.h" #include "irc.h" -#include "irc-info.h" #include "irc-macros.h" #include "irc-write.h" -#include "exp.h" #include "irc-login.h" static void Change_Nick PARAMS((CLIENT * Origin, CLIENT * Target, char *NewNick, @@ -80,7 +77,6 @@ IRC_PASS( CLIENT *Client, REQUEST *Req ) } else if (Client_Type(Client) == CLIENT_UNKNOWN || Client_Type(Client) == CLIENT_UNKNOWNSERVER) { /* Unregistered connection, but wrong number of arguments: */ - IRC_SetPenalty(Client, 2); return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command); } else { @@ -274,11 +270,9 @@ IRC_NICK( CLIENT *Client, REQUEST *Req ) /* Server or service introduces new client */ /* Bad number of parameters? */ - if (Req->argc != 2 && Req->argc != 7) { - IRC_SetPenalty(Client, 2); + if (Req->argc != 2 && Req->argc != 7) return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command); - } if (Req->argc >= 7) { /* RFC 2813 compatible syntax */ @@ -375,10 +369,9 @@ IRC_SVSNICK(CLIENT *Client, REQUEST *Req) /* Search the target */ target = Client_Search(Req->argv[0]); - if (!target || Client_Type(target) != CLIENT_USER) { + if (!target || Client_Type(target) != CLIENT_USER) return IRC_WriteErrClient(Client, ERR_NOSUCHNICK_MSG, Client_ID(Client), Req->argv[0]); - } if (Client_Conn(target) <= NONE) { /* We have to forward the message to the server handling diff --git a/src/ngircd/irc-macros.h b/src/ngircd/irc-macros.h index 07ccfd2..dc18641 100644 --- a/src/ngircd/irc-macros.h +++ b/src/ngircd/irc-macros.h @@ -25,8 +25,7 @@ */ #define _IRC_ARGC_EQ_OR_RETURN_(Client, Req, Count) \ if (Req->argc != Count) { \ - IRC_SetPenalty(Client, 2); \ - return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, \ + return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, \ Client_ID(Client), Req->command); \ } @@ -38,8 +37,7 @@ if (Req->argc != Count) { \ */ #define _IRC_ARGC_LE_OR_RETURN_(Client, Req, Max) \ if (Req->argc > Max) { \ - IRC_SetPenalty(Client, 2); \ - return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, \ + return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, \ Client_ID(Client), Req->command); \ } @@ -51,8 +49,7 @@ if (Req->argc > Max) { \ */ #define _IRC_ARGC_GE_OR_RETURN_(Client, Req, Min) \ if (Req->argc < Min) { \ - IRC_SetPenalty(Client, 2); \ - return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, \ + return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, \ Client_ID(Client), Req->command); \ } @@ -64,8 +61,7 @@ if (Req->argc < Min) { \ */ #define _IRC_ARGC_BETWEEN_OR_RETURN_(Client, Req, Min, Max) \ if (Req->argc < Min || Req->argc > Max) { \ - IRC_SetPenalty(Client, 2); \ - return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, \ + return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, \ Client_ID(Client), Req->command); \ } @@ -82,7 +78,7 @@ if (Req->argc < Min || Req->argc > Max) { \ else \ Sender = Client; \ if (!Sender) \ - return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, \ + return IRC_WriteErrClient(Client, ERR_NOSUCHNICK_MSG, \ Client_ID(Client), Req->prefix); /** @@ -101,7 +97,7 @@ if (Req->argc < Min || Req->argc > Max) { \ if (!Target) \ Target = Client_SearchServer(Req->argv[Argc]); \ if (!Target) \ - return IRC_WriteStrClient(From, ERR_NOSUCHSERVER_MSG, \ + return IRC_WriteErrClient(From, ERR_NOSUCHSERVER_MSG, \ Client_ID(From), Req->argv[Argc]); \ if (Client_Type(Target) != CLIENT_SERVER) \ Target = Client_Introducer(Target); \ diff --git a/src/ngircd/irc-metadata.c b/src/ngircd/irc-metadata.c index f7948e6..efb2201 100644 --- a/src/ngircd/irc-metadata.c +++ b/src/ngircd/irc-metadata.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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 @@ -18,21 +18,17 @@ * IRC metadata commands */ -#include "imp.h" #include -#include +#include #include #include "conn-func.h" #include "channel.h" -#include "conn-encoding.h" #include "irc-write.h" #include "log.h" #include "messages.h" #include "parse.h" -#include "tool.h" -#include "exp.h" #include "irc-metadata.h" /** diff --git a/src/ngircd/irc-mode.c b/src/ngircd/irc-mode.c index af59683..79ab2eb 100644 --- a/src/ngircd/irc-mode.c +++ b/src/ngircd/irc-mode.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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,13 +16,11 @@ * IRC commands for mode changes (like MODE, AWAY, etc.) */ -#include "imp.h" #include #include #include #include -#include "defines.h" #include "conn.h" #include "channel.h" #include "irc-macros.h" @@ -33,7 +31,6 @@ #include "messages.h" #include "conf.h" -#include "exp.h" #include "irc-mode.h" static bool Client_Mode PARAMS((CLIENT *Client, REQUEST *Req, CLIENT *Origin, @@ -71,6 +68,13 @@ IRC_MODE( CLIENT *Client, REQUEST *Req ) _IRC_GET_SENDER_OR_RETURN_(origin, Req, Client) + /* Test for "fake" MODE commands injected by this local instance, + * for example when handling the "DefaultUserModes" settings. + * This doesn't harm real commands, because prefixes of regular + * clients are checked in Validate_Prefix() and can't be faked. */ + if (Req->prefix && Client_Search(Req->prefix) == Client_ThisServer()) + Client = Client_Search(Req->prefix); + /* Channel or user mode? */ cl = NULL; chan = NULL; if (Client_IsValidNick(Req->argv[0])) @@ -225,6 +229,7 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ) break; case 'c': /* Receive connect notices */ case 'q': /* KICK-protected user */ + case 'F': /* disable flood protection */ /* (only settable by IRC operators!) */ if (!set || Client_Type(Client) == CLIENT_SERVER || Client_HasMode(Origin, 'o')) @@ -357,7 +362,6 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ) Client_Modes(Target)); } - IRC_SetPenalty(Client, 1); return ok; } /* Client_Mode */ @@ -583,9 +587,13 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) goto chan_exit; if (!set) { if (is_oper || is_machine || is_owner || - is_admin || is_op || is_halfop) + is_admin || is_op || is_halfop) { x[0] = *mode_ptr; - else + if (Channel_HasMode(Channel, 'k')) + strlcpy(argadd, "*", sizeof(argadd)); + if (arg_arg > mode_arg) + arg_arg++; + } else connected = IRC_WriteErrClient(Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID(Origin), @@ -613,7 +621,6 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) #ifdef STRICT_RFC /* Only send error message in "strict" mode, * this is how ircd2.11 and others behave ... */ - IRC_SetPenalty(Origin, 2); connected = IRC_WriteErrClient(Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID(Origin), Req->command); @@ -658,7 +665,6 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) #ifdef STRICT_RFC /* Only send error message in "strict" mode, * this is how ircd2.11 and others behave ... */ - IRC_SetPenalty(Origin, 2); connected = IRC_WriteErrClient(Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID(Origin), Req->command); @@ -760,7 +766,6 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) * mode, because most other servers don't do * it as well and some clients send "wired" * MODE commands like "MODE #chan -ooo nick". */ - IRC_SetPenalty(Origin, 2); connected = IRC_WriteErrClient(Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID(Origin), Req->command); @@ -921,7 +926,6 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) } } - IRC_SetPenalty(Client, 1); return connected; } /* Channel_Mode */ diff --git a/src/ngircd/irc-op.c b/src/ngircd/irc-op.c index b32a8e6..b75841a 100644 --- a/src/ngircd/irc-op.c +++ b/src/ngircd/irc-op.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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,12 +16,9 @@ * Channel operator commands */ -#include "imp.h" #include #include -#include -#include "defines.h" #include "conn.h" #include "channel.h" #include "irc-macros.h" @@ -31,7 +28,6 @@ #include "messages.h" #include "parse.h" -#include "exp.h" #include "irc-op.h" /* Local functions */ @@ -122,7 +118,6 @@ IRC_KICK(CLIENT *Client, REQUEST *Req) nickCount--; } } else { - IRC_SetPenalty(Client, 2); return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command); } @@ -171,7 +166,8 @@ IRC_INVITE(CLIENT *Client, REQUEST *Req) /* Is the channel "invite-only"? */ if (Channel_HasMode(chan, 'i')) { - /* Yes. The user must be channel owner/admin/operator/halfop! */ + /* Yes. The user issuing the INVITE command must be + * channel owner/admin/operator/halfop! */ if (!Channel_UserHasMode(chan, from, 'q') && !Channel_UserHasMode(chan, from, 'a') && !Channel_UserHasMode(chan, from, 'o') && @@ -205,21 +201,22 @@ IRC_INVITE(CLIENT *Client, REQUEST *Req) Req->argv[0], Req->argv[1]); /* - * RFC 2812 says: - * 'There is no requirement that the channel [..] must exist or be a valid channel' - * The problem with this is that this allows the "channel" to contain spaces, - * in which case we must prefix its name with a colon to make it clear that - * it is only a single argument. + * RFC 2812 states: + * 'There is no requirement that the channel [..] must exist or be a + * valid channel'. The problem with this is that this allows the + * "channel" to contain spaces, in which case we must prefix its name + * with a colon to make it clear that it is only a single argument. */ colon_if_necessary = strchr(Req->argv[1], ' ') ? ":":""; /* Inform target client */ IRC_WriteStrClientPrefix(target, from, "INVITE %s %s%s", Req->argv[0], - colon_if_necessary, Req->argv[1]); + colon_if_necessary, Req->argv[1]); if (Client_Conn(target) > NONE) { /* The target user is local, so we have to send the status code */ if (!IRC_WriteStrClientPrefix(from, target, RPL_INVITING_MSG, - Client_ID(from), Req->argv[0], colon_if_necessary, Req->argv[1])) + Client_ID(from), Req->argv[0], + colon_if_necessary, Req->argv[1])) return DISCONNECTED; if (Client_HasMode(target, 'a') && diff --git a/src/ngircd/irc-oper.c b/src/ngircd/irc-oper.c index 2c2ea3c..1d69a6c 100644 --- a/src/ngircd/irc-oper.c +++ b/src/ngircd/irc-oper.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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,12 +16,12 @@ * IRC operator commands */ -#include "imp.h" #include #include #include #include #include +#include #include "ngircd.h" #include "conn-func.h" @@ -30,7 +30,6 @@ #include "class.h" #include "parse.h" #include "irc.h" -#include "irc-macros.h" #include "irc-write.h" #include "lists.h" #include "log.h" @@ -38,7 +37,6 @@ #include "messages.h" #include "op.h" -#include #include "irc-oper.h" /** @@ -48,9 +46,11 @@ static bool Bad_OperPass(CLIENT *Client, char *errtoken, char *errmsg) { - Log(LOG_WARNING, "Got invalid OPER from \"%s\": \"%s\" -- %s", + Log(LOG_WARNING, "Got invalid OPER from \"%s\": \"%s\" -- %s!", Client_Mask(Client), errtoken, errmsg); - return IRC_WriteErrClient(Client, ERR_PASSWDMISMATCH_MSG, + /* Increase penalty to slow down possible brute force attacks */ + IRC_SetPenalty(Client, 10); + return IRC_WriteStrClient(Client, ERR_PASSWDMISMATCH_MSG, Client_ID(Client)); } /* Bad_OperPass */ @@ -208,18 +208,14 @@ IRC_CONNECT(CLIENT * Client, REQUEST * Req) /* Bad number of parameters? */ if (Req->argc != 1 && Req->argc != 2 && Req->argc != 3 && - Req->argc != 5 && Req->argc != 6) { - IRC_SetPenalty(Client, 2); + Req->argc != 5 && Req->argc != 6) return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command); - } /* Invalid port number? */ - if ((Req->argc > 1) && atoi(Req->argv[1]) < 1) { - IRC_SetPenalty(Client, 2); + if ((Req->argc > 1) && atoi(Req->argv[1]) < 1) return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command); - } if (Client_Type(Client) != CLIENT_SERVER && !Client_HasMode(Client, 'o')) @@ -396,11 +392,9 @@ IRC_xLINE(CLIENT *Client, REQUEST *Req) assert(Req != NULL); /* Bad number of parameters? */ - if (Req->argc != 1 && Req->argc != 3) { - IRC_SetPenalty(Client, 2); + if (Req->argc != 1 && Req->argc != 3) return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command); - } from = Op_Check(Client, Req); if (!from) diff --git a/src/ngircd/irc-server.c b/src/ngircd/irc-server.c index b0abb7c..92186af 100644 --- a/src/ngircd/irc-server.c +++ b/src/ngircd/irc-server.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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,31 +16,25 @@ * IRC commands for server links */ -#include "imp.h" #include #include #include #include #include -#include "defines.h" -#include "conn.h" #include "conn-func.h" #include "conn-zip.h" #include "conf.h" #include "channel.h" -#include "lists.h" #include "log.h" #include "messages.h" #include "parse.h" #include "numeric.h" #include "ngircd.h" #include "irc-info.h" -#include "irc-macros.h" #include "irc-write.h" #include "op.h" -#include "exp.h" #include "irc-server.h" /** @@ -72,12 +66,10 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req ) LogDebug("Connection %d: got SERVER command (new server link) ...", Client_Conn(Client)); - if (Req->argc != 2 && Req->argc != 3) { - IRC_SetPenalty(Client, 2); + if (Req->argc != 2 && Req->argc != 3) return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command); - } /* Get configuration index of new remote server ... */ for (i = 0; i < MAX_SERVERS; i++) @@ -185,11 +177,9 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req ) { /* New server is being introduced to the network */ - if (Req->argc != 4) { - IRC_SetPenalty(Client, 2); + if (Req->argc != 4) return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command); - } /* check for existing server with same ID */ if (!Client_CheckID(Client, Req->argv[0])) @@ -235,11 +225,9 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req ) Client_MyToken(c), Client_Info(c)); return CONNECTED; - } else { - IRC_SetPenalty(Client, 2); + } else return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command); - } } /* IRC_SERVER */ /* diff --git a/src/ngircd/irc-write.c b/src/ngircd/irc-write.c index 25cecaf..8d09f9b 100644 --- a/src/ngircd/irc-write.c +++ b/src/ngircd/irc-write.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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,7 +16,6 @@ * Sending IRC commands over the network */ -#include "imp.h" #include #ifdef PROTOTYPES # include @@ -24,13 +23,10 @@ # include #endif #include -#include -#include "defines.h" #include "conn-func.h" #include "channel.h" -#include "exp.h" #include "irc-write.h" #define SEND_TO_USER 1 @@ -70,7 +66,7 @@ va_dcl #else va_start(ap); #endif - vsnprintf(buffer, 1000, Format, ap); + vsnprintf(buffer, sizeof(buffer), Format, ap); va_end(ap); IRC_SetPenalty(Client, 2); @@ -107,7 +103,7 @@ va_dcl #else va_start(ap); #endif - vsnprintf(buffer, 1000, Format, ap); + vsnprintf(buffer, sizeof(buffer), Format, ap); va_end(ap); return IRC_WriteStrClientPrefix(Client, Client_ThisServer(), @@ -148,7 +144,7 @@ va_dcl #else va_start( ap ); #endif - vsnprintf( buffer, 1000, Format, ap ); + vsnprintf(buffer, sizeof(buffer), Format, ap); va_end( ap ); return Conn_WriteStr(Client_Conn(Client_NextHop(Client)), ":%s %s", @@ -190,7 +186,7 @@ va_dcl #else va_start( ap ); #endif - vsnprintf( buffer, 1000, Format, ap ); + vsnprintf(buffer, sizeof(buffer), Format, ap); va_end( ap ); IRC_WriteStrChannelPrefix(Client, Chan, Client_ThisServer(), @@ -239,7 +235,7 @@ va_dcl #else va_start( ap ); #endif - vsnprintf( buffer, 1000, Format, ap ); + vsnprintf(buffer, sizeof(buffer), Format, ap); va_end( ap ); Conn_ClearFlags( ); @@ -296,7 +292,7 @@ va_dcl #else va_start( ap ); #endif - vsnprintf( buffer, 1000, Format, ap ); + vsnprintf(buffer, sizeof(buffer), Format, ap); va_end( ap ); IRC_WriteStrServersPrefix(ExceptOf, Client_ThisServer(), "%s", buffer); @@ -333,7 +329,7 @@ va_dcl #else va_start( ap ); #endif - vsnprintf( buffer, 1000, Format, ap ); + vsnprintf(buffer, sizeof(buffer), Format, ap); va_end( ap ); IRC_WriteStrServersPrefixFlag( ExceptOf, Prefix, '\0', "%s", buffer ); @@ -373,7 +369,7 @@ va_dcl #else va_start( ap ); #endif - vsnprintf( buffer, 1000, Format, ap ); + vsnprintf(buffer, sizeof(buffer), Format, ap); va_end( ap ); IRC_WriteStrServersPrefixFlag_CB(ExceptOf, Prefix, Flag, @@ -451,7 +447,7 @@ va_dcl #else va_start( ap ); #endif - vsnprintf( buffer, 1000, Format, ap ); + vsnprintf(buffer, sizeof(buffer), Format, ap); va_end( ap ); Conn_ClearFlags( ); @@ -513,7 +509,7 @@ va_dcl #else va_start(ap); #endif - vsnprintf(msg, 1000, Format, ap); + vsnprintf(msg, sizeof(msg), Format, ap); va_end(ap); for (to=Client_First(); to != NULL; to=Client_Next(to)) { diff --git a/src/ngircd/irc.c b/src/ngircd/irc.c index b2d865f..4cec3b1 100644 --- a/src/ngircd/irc.c +++ b/src/ngircd/irc.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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,17 +16,19 @@ * IRC commands */ -#include "imp.h" #include #include #include +#include +#include #include "ngircd.h" #include "conn-func.h" #include "conf.h" #include "channel.h" -#include "conn-encoding.h" -#include "defines.h" +#ifdef ICONV +# include "conn-encoding.h" +#endif #include "irc-macros.h" #include "irc-write.h" #include "log.h" @@ -34,9 +36,7 @@ #include "messages.h" #include "parse.h" #include "op.h" -#include "tool.h" -#include "exp.h" #include "irc.h" static char *Option_String PARAMS((CONN_ID Idx)); @@ -224,8 +224,6 @@ IRC_TRACE(CLIENT *Client, REQUEST *Req) assert(Client != NULL); assert(Req != NULL); - IRC_SetPenalty(Client, 3); - _IRC_GET_SENDER_OR_RETURN_(from, Req, Client) _IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, from) @@ -301,8 +299,6 @@ IRC_HELP(CLIENT *Client, REQUEST *Req) assert(Client != NULL); assert(Req != NULL); - IRC_SetPenalty(Client, 2); - if ((Req->argc == 0 && array_bytes(&Conf_Helptext) > 0) || (Req->argc >= 1 && strcasecmp(Req->argv[0], "Commands") != 0)) { /* Help text available and requested */ @@ -526,7 +522,6 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors) if (Req->argc > 2) { if (!SendErrors) return CONNECTED; - IRC_SetPenalty(Client, 2); return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command); } diff --git a/src/ngircd/lists.c b/src/ngircd/lists.c index b0accd4..247344e 100644 --- a/src/ngircd/lists.c +++ b/src/ngircd/lists.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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,22 +16,16 @@ * Management of IRC lists: ban, invite, etc. */ -#include "imp.h" #include +#include +#include +#include +#include -#include "defines.h" #include "conn.h" -#include "channel.h" #include "log.h" #include "match.h" -#include "messages.h" -#include "irc-write.h" - -#include -#include -#include -#include "exp.h" #include "lists.h" struct list_elem { @@ -291,6 +285,7 @@ Lists_MakeMask(const char *Pattern, char *mask, size_t len) strlcpy(mask, Pattern, len - 5); strlcat(mask, "!*@", len); strlcat(mask, at, len); + at--; *at = '@'; } else { /* All parts (nick, user and domain name) are given */ strlcpy(mask, Pattern, len); @@ -331,7 +326,7 @@ Lists_CheckReason(struct list_head *h, CLIENT *Client, char *reason, size_t len) while (e) { next = e->next; - if (Match(e->mask, Client_MaskCloaked(Client))) { + if (MatchCaseInsensitive(e->mask, Client_MaskCloaked(Client))) { if (len && e->reason) strlcpy(reason, e->reason, len); if (e->valid_until == 1) { diff --git a/src/ngircd/log.c b/src/ngircd/log.c index 18fb6fa..8b39e60 100644 --- a/src/ngircd/log.c +++ b/src/ngircd/log.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2012 Alexander Barton (alex@barton.de) + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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,34 +16,29 @@ * Logging functions */ -#include "imp.h" #include -#include #ifdef PROTOTYPES -# include +# include #else -# include +# include #endif #include -#include #include +#include #include #ifdef SYSLOG -#include +# include #endif #include "ngircd.h" -#include "defines.h" #include "conn.h" #include "channel.h" #include "irc-write.h" #include "conf.h" -#include "exp.h" #include "log.h" - static bool Is_Daemon; diff --git a/src/ngircd/login.c b/src/ngircd/login.c index 23c3b68..64cc812 100644 --- a/src/ngircd/login.c +++ b/src/ngircd/login.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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,36 +16,34 @@ * Functions to deal with client logins */ -#include "imp.h" #include #include #include #include -#include #include -#include "defines.h" #include "conn.h" #include "class.h" -#include "client.h" #include "client-cap.h" #include "channel.h" #include "conf.h" -#include "io.h" #include "parse.h" #include "log.h" #include "messages.h" #include "ngircd.h" -#include "pam.h" #include "irc-info.h" #include "irc-mode.h" #include "irc-write.h" -#include "exp.h" #include "login.h" #ifdef PAM + +#include "io.h" +#include "pam.h" + static void cb_Read_Auth_Result PARAMS((int r_fd, UNUSED short events)); + #endif /** @@ -194,7 +192,7 @@ Login_User_PostAuth(CLIENT *Client) /* Set default user modes */ if (Conf_DefaultUserModes[0]) { snprintf(modes, sizeof(modes), "+%s", Conf_DefaultUserModes); - Req.prefix = Client_ThisServer(); + Req.prefix = Client_ID(Client_ThisServer()); Req.command = "MODE"; Req.argc = 2; Req.argv[0] = Client_ID(Client); diff --git a/src/ngircd/match.c b/src/ngircd/match.c index dad3e7b..93ddc0b 100644 --- a/src/ngircd/match.c +++ b/src/ngircd/match.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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,15 +16,13 @@ * Wildcard pattern matching */ -#include "imp.h" #include #include -#include "exp.h" -#include "match.h" #include "defines.h" #include "tool.h" +#include "match.h" /* * The pattern matching functions [Matche(), Matche_After_Star()] are based @@ -32,11 +30,9 @@ * "public domain": */ - static int Matche PARAMS(( const char *p, const char *t )); static int Matche_After_Star PARAMS(( const char *p, const char *t )); - #define MATCH_PATTERN 6 /**< bad pattern */ #define MATCH_LITERAL 5 /**< match failure on literal match */ #define MATCH_RANGE 4 /**< match failure on [..] construct */ @@ -44,7 +40,6 @@ static int Matche_After_Star PARAMS(( const char *p, const char *t )); #define MATCH_END 2 /**< premature end of pattern string */ #define MATCH_VALID 1 /**< valid match */ - /** * Match string with pattern. * @@ -59,7 +54,6 @@ Match( const char *Pattern, const char *String ) else return false; } /* Match */ - /** * Match string with pattern case-insensitive. * @@ -76,7 +70,6 @@ MatchCaseInsensitive(const char *Pattern, const char *String) return Match(Pattern, ngt_LowerStr(haystack)); } /* MatchCaseInsensitive */ - /** * Match string with pattern case-insensitive. * @@ -105,15 +98,9 @@ MatchCaseInsensitiveList(const char *Pattern, const char *String, return false; } /* MatchCaseInsensitive */ - static int Matche( const char *p, const char *t ) { - register char range_start, range_end; - bool invert; - bool member_match; - bool loop; - for( ; *p; p++, t++ ) { /* if this is the end of the text then this is the end of the match */ @@ -131,118 +118,7 @@ Matche( const char *p, const char *t ) case '*': /* multiple any character match */ return Matche_After_Star( p, t ); - case '[': /* [..] construct, single member/exclusion character match */ - /* move to beginning of range */ - p++; - - /* check if this is a member match or exclusion match */ - invert = false; - if( *p == '!' || *p == '^' ) - { - 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; - - while( loop ) - { - /* if end of construct then loop is done */ - if( *p == ']' ) - { - loop = false; - continue; - } - - /* matching a '!', '^', '-', '\' or a ']' */ - if( *p == '\\' ) range_start = range_end = *++p; - else range_start = range_end = *p; - - /* if end of pattern then bad pattern (Missing ']') */ - if( ! *p ) return MATCH_PATTERN; - - /* check for range bar */ - if( *++p == '-' ) - { - /* get the range end */ - range_end = *++p; - - /* if end of pattern or construct then bad pattern */ - if( range_end == '\0' || range_end == ']' ) return MATCH_PATTERN; - - /* special character range end */ - if( range_end == '\\' ) - { - range_end = *++p; - - /* if end of text then we have a bad pattern */ - if ( ! range_end ) return MATCH_PATTERN; - } - - /* move just beyond this range */ - p++; - } - - /* if the text character is in range then match found. make sure the range - * letters have the proper relationship to one another before comparison */ - if( range_start < range_end ) - { - if( *t >= range_start && *t <= range_end ) - { - member_match = true; - loop = false; - } - } - else - { - if( *t >= range_end && *t <= range_start ) - { - member_match = true; - loop = false; - } - } - } - - /* if there was a match in an exclusion set then no match */ - /* if there was no match in a member set then no match */ - if(( invert && member_match ) || ! ( invert || member_match )) return MATCH_RANGE; - - /* if this is not an exclusion then skip the rest of the [...] - * construct that already matched. */ - if( member_match ) - { - while( *p != ']' ) - { - /* bad pattern (Missing ']') */ - if( ! *p ) return MATCH_PATTERN; - - /* skip exact match */ - if( *p == '\\' ) - { - p++; - - /* if end of text then we have a bad pattern */ - if( ! *p ) return MATCH_PATTERN; - } - - /* move to next pattern char */ - p++; - } - } - break; - case '\\': /* next character is quoted and must match exactly */ - /* move pattern pointer to quoted char and fall through */ - p++; - - /* if end of text then we have a bad pattern */ - if( ! *p ) return MATCH_PATTERN; - - /* must match this character exactly */ - default: + default: /* must match this character exactly */ if( *p != *t ) return MATCH_LITERAL; } } @@ -252,7 +128,6 @@ Matche( const char *p, const char *t ) else return MATCH_VALID; } /* Matche */ - static int Matche_After_Star( const char *p, const char *t ) { @@ -302,5 +177,4 @@ Matche_After_Star( const char *p, const char *t ) return match; } /* Matche_After_Star */ - /* -eof- */ diff --git a/src/ngircd/messages.h b/src/ngircd/messages.h index 53b9658..a56bf86 100644 --- a/src/ngircd/messages.h +++ b/src/ngircd/messages.h @@ -21,6 +21,7 @@ #define RPL_YOURHOST_MSG "002 %s :Your host is %s, running version ngircd-%s (%s/%s/%s)" #define RPL_CREATED_MSG "003 %s :This server has been started %s" #define RPL_MYINFO_MSG "004 %s %s ngircd-%s %s %s" +#define RPL_ISUPPORTNET_MSG "005 %s NETWORK=%s :is my network name" #define RPL_ISUPPORT1_MSG "005 %s RFC2812 IRCD=ngIRCd CHARSET=UTF-8 CASEMAPPING=ascii PREFIX=(qaohv)~&@%%+ CHANTYPES=%s CHANMODES=beI,k,l,imMnOPQRstVz CHANLIMIT=%s:%d :are supported on this server" #define RPL_ISUPPORT2_MSG "005 %s CHANNELLEN=%d NICKLEN=%d TOPICLEN=%d AWAYLEN=%d KICKLEN=%d MODES=%d MAXLIST=beI:%d EXCEPTS=e INVEX=I PENALTY :are supported on this server" @@ -70,6 +71,7 @@ #define RPL_LISTEND_MSG "323 %s :End of LIST" #define RPL_CHANNELMODEIS_MSG "324 %s %s +%s" #define RPL_CREATIONTIME_MSG "329 %s %s %ld" +#define RPL_WHOISLOGGEDIN_MSG "330 %s %s %s :is logged in as" #define RPL_NOTOPIC_MSG "331 %s %s :No topic is set" #define RPL_TOPIC_MSG "332 %s %s :%s" #define RPL_TOPICSETBY_MSG "333 %s %s %s %u" diff --git a/src/ngircd/ngircd.c b/src/ngircd/ngircd.c index 05f7a71..1b20597 100644 --- a/src/ngircd/ngircd.c +++ b/src/ngircd/ngircd.c @@ -17,12 +17,10 @@ * by the loader of the operating system. */ -#include "imp.h" #include #include #include #include -#include #include #include #include @@ -36,23 +34,16 @@ #include #endif -#include "defines.h" #include "conn.h" #include "class.h" -#include "conf-ssl.h" #include "channel.h" #include "conf.h" -#include "lists.h" #include "log.h" -#include "parse.h" #include "sighandlers.h" #include "io.h" -#include "irc.h" -#include "exp.h" #include "ngircd.h" - static void Show_Version PARAMS(( void )); static void Show_Help PARAMS(( void )); diff --git a/src/ngircd/numeric.c b/src/ngircd/numeric.c index ad7e042..b0ceeef 100644 --- a/src/ngircd/numeric.c +++ b/src/ngircd/numeric.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2008 Alexander Barton (alex@barton.de) + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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,29 +16,23 @@ * Handlers for IRC numerics sent to the server */ -#include "imp.h" #include #include #include #include +#include -#include "defines.h" -#include "conn.h" -#include "conf.h" -#include "conn.h" #include "conn-func.h" +#include "conf.h" #include "channel.h" #include "class.h" #include "irc-write.h" #include "lists.h" #include "log.h" -#include "messages.h" #include "parse.h" -#include "exp.h" #include "numeric.h" - /** * Announce a channel and its users in the network. */ @@ -117,7 +111,6 @@ Announce_Channel(CLIENT *Client, CHANNEL *Chan) return CONNECTED; } /* Announce_Channel */ - /** * Announce new server in the network * @param Client New server @@ -149,11 +142,30 @@ Announce_Server(CLIENT * Client, CLIENT * Server) Client_MyToken(Server), Client_Info(Server)); } /* Announce_Server */ - #ifdef IRCPLUS /** - * Synchronize invite, ban, G- and K-Line lists between servers. + * Send a specific list to a remote server. + */ +static bool +Send_List(CLIENT *Client, CHANNEL *Chan, struct list_head *Head, char Type) +{ + struct list_elem *elem; + + elem = Lists_GetFirst(Head); + while (elem) { + if (!IRC_WriteStrClient(Client, "MODE %s +%c %s", + Channel_Name(Chan), Type, + Lists_GetMask(elem))) { + return DISCONNECTED; + } + elem = Lists_GetNext(elem); + } + return CONNECTED; +} + +/** + * Synchronize invite, ban, except, and G-Line lists between servers. * * @param Client New server. * @return CONNECTED or DISCONNECTED. @@ -181,36 +193,17 @@ Synchronize_Lists(CLIENT * Client) c = Channel_First(); while (c) { - /* ban list */ - head = Channel_GetListBans(c); - elem = Lists_GetFirst(head); - while (elem) { - if (!IRC_WriteStrClient(Client, "MODE %s +b %s", - Channel_Name(c), - Lists_GetMask(elem))) { - return DISCONNECTED; - } - elem = Lists_GetNext(elem); - } - - /* invite list */ - head = Channel_GetListInvites(c); - elem = Lists_GetFirst(head); - while (elem) { - if (!IRC_WriteStrClient(Client, "MODE %s +I %s", - Channel_Name(c), - Lists_GetMask(elem))) { - return DISCONNECTED; - } - elem = Lists_GetNext(elem); - } - + if (!Send_List(Client, c, Channel_GetListExcepts(c), 'e')) + return DISCONNECTED; + if (!Send_List(Client, c, Channel_GetListBans(c), 'b')) + return DISCONNECTED; + if (!Send_List(Client, c, Channel_GetListInvites(c), 'I')) + return DISCONNECTED; c = Channel_Next(c); } return CONNECTED; } - /** * Send CHANINFO commands to a new server (inform it about existing channels). * @param Client New server @@ -255,7 +248,6 @@ Send_CHANINFO(CLIENT * Client, CHANNEL * Chan) #endif /* IRCPLUS */ - /** * Handle ENDOFMOTD (376) numeric and login remote server. * The peer is either an IRC server (no IRC+ protocol), or we got the @@ -349,7 +341,6 @@ IRC_Num_ENDOFMOTD(CLIENT * Client, UNUSED REQUEST * Req) return CONNECTED; } /* IRC_Num_ENDOFMOTD */ - /** * Handle ISUPPORT (005) numeric. */ @@ -385,5 +376,4 @@ IRC_Num_ISUPPORT(CLIENT * Client, REQUEST * Req) return CONNECTED; } /* IRC_Num_ISUPPORT */ - /* -eof- */ diff --git a/src/ngircd/op.c b/src/ngircd/op.c index 71e7cbc..4a11355 100644 --- a/src/ngircd/op.c +++ b/src/ngircd/op.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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,9 +16,7 @@ * IRC operator functions */ -#include "imp.h" #include -#include #include "conn.h" #include "channel.h" @@ -28,10 +26,8 @@ #include "messages.h" #include "irc-write.h" -#include #include "op.h" - /** * Return and log a "no privileges" message. */ @@ -44,19 +40,18 @@ Op_NoPrivileges(CLIENT * Client, REQUEST * Req) from = Client_Search(Req->prefix); if (from) { - Log(LOG_NOTICE, "No privileges: client \"%s\" (%s), command \"%s\"", + Log(LOG_NOTICE, "No privileges: client \"%s\" (%s), command \"%s\"!", Req->prefix, Client_Mask(Client), Req->command); return IRC_WriteErrClient(from, ERR_NOPRIVILEGES_MSG, Client_ID(from)); } else { - Log(LOG_NOTICE, "No privileges: client \"%s\", command \"%s\"", + Log(LOG_NOTICE, "No privileges: client \"%s\", command \"%s\"!", Client_Mask(Client), Req->command); return IRC_WriteErrClient(Client, ERR_NOPRIVILEGES_MSG, Client_ID(Client)); } } /* Op_NoPrivileges */ - /** * Check that the originator of a request is an IRC operator and allowed * to administer this server. @@ -94,5 +89,4 @@ Op_Check(CLIENT * Client, REQUEST * Req) return c; } /* Op_Check */ - /* -eof- */ diff --git a/src/ngircd/pam.c b/src/ngircd/pam.c index ed56497..d2a8a54 100644 --- a/src/ngircd/pam.c +++ b/src/ngircd/pam.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2010 Alexander Barton (alex@barton.de). + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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 @@ -18,26 +18,21 @@ * PAM User Authentication */ -#include "imp.h" #include - -#include "defines.h" -#include "log.h" -#include "conn.h" -#include "client.h" - #include #include - #ifdef HAVE_SECURITY_PAM_APPL_H -#include +# include #endif - #ifdef HAVE_PAM_PAM_APPL_H -#include +# include #endif -#include "exp.h" +#include "defines.h" +#include "log.h" +#include "conn.h" +#include "client.h" + #include "pam.h" static char *password; @@ -87,7 +82,7 @@ static struct pam_conv conv = { }; /** - * Authenticate a connectiong client using PAM. + * Authenticate a connecting client using PAM. * @param Client The client to authenticate. * @return true when authentication succeeded, false otherwise. */ diff --git a/src/ngircd/parse.c b/src/ngircd/parse.c index ba4d8f5..28dee6f 100644 --- a/src/ngircd/parse.c +++ b/src/ngircd/parse.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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,29 +16,26 @@ * IRC command parser and validator. */ -#include "imp.h" #include #include -#include #include #include #include "ngircd.h" -#include "defines.h" #include "conn-func.h" +#include "conf.h" #include "channel.h" #include "log.h" #include "messages.h" -#include "tool.h" -#include "exp.h" #include "parse.h" -#include "imp.h" #include "irc.h" #include "irc-cap.h" #include "irc-channel.h" -#include "irc-encoding.h" +#ifdef ICONV +# include "irc-encoding.h" +#endif #include "irc-info.h" #include "irc-login.h" #include "irc-metadata.h" @@ -49,9 +46,6 @@ #include "irc-write.h" #include "numeric.h" -#include "exp.h" -#include "conf.h" - struct _NUMERIC { int numeric; bool (*function) PARAMS(( CLIENT *Client, REQUEST *Request )); @@ -60,78 +54,81 @@ struct _NUMERIC { static COMMAND My_Commands[] = { - { "ADMIN", IRC_ADMIN, CLIENT_USER|CLIENT_SERVER, 0, 1, 0, 0, 0 }, - { "AWAY", IRC_AWAY, CLIENT_USER, 0, 1, 0, 0, 0 }, - { "CAP", IRC_CAP, CLIENT_ANY, 1, 2, 0, 0, 0 }, - { "CONNECT", IRC_CONNECT, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 }, +#define _CMD(name, func, type, min, max, penalty) \ + { (name), (func), (type), (min), (max), (penalty), 0, 0, 0 } + _CMD("ADMIN", IRC_ADMIN, CLIENT_USER|CLIENT_SERVER, 0, 1, 1), + _CMD("AWAY", IRC_AWAY, CLIENT_USER, 0, 1, 0), + _CMD("CAP", IRC_CAP, CLIENT_ANY, 1, 2, 0), + _CMD("CONNECT", IRC_CONNECT, CLIENT_USER|CLIENT_SERVER, 0, -1, 0), #ifdef STRICT_RFC - { "DIE", IRC_DIE, CLIENT_USER, 0, 0, 0, 0, 0 }, + _CMD("DIE", IRC_DIE, CLIENT_USER, 0, 0, 0), #else - { "DIE", IRC_DIE, CLIENT_USER, 0, 1, 0, 0, 0 }, + _CMD("DIE", IRC_DIE, CLIENT_USER, 0, 1, 0), #endif - { "DISCONNECT", IRC_DISCONNECT, CLIENT_USER, 1, 1, 0, 0, 0 }, - { "ERROR", IRC_ERROR, CLIENT_ANY, 0, -1, 0, 0, 0 }, - { "GLINE", IRC_xLINE, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 }, - { "HELP", IRC_HELP, CLIENT_USER, 0, 1, 0, 0, 0 }, - { "INFO", IRC_INFO, CLIENT_USER|CLIENT_SERVER, 0, 1, 0, 0, 0 }, - { "INVITE", IRC_INVITE, CLIENT_USER|CLIENT_SERVER, 2, 2, 0, 0, 0 }, - { "ISON", IRC_ISON, CLIENT_USER, 1, -1, 0, 0, 0 }, - { "JOIN", IRC_JOIN, CLIENT_USER|CLIENT_SERVER, 1, 2, 0, 0, 0 }, - { "KICK", IRC_KICK, CLIENT_USER|CLIENT_SERVER, 2, 3, 0, 0, 0 }, - { "KILL", IRC_KILL, CLIENT_USER|CLIENT_SERVER, 2, 2, 0, 0, 0 }, - { "KLINE", IRC_xLINE, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 }, - { "LINKS", IRC_LINKS, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 }, - { "LIST", IRC_LIST, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 }, - { "LUSERS", IRC_LUSERS, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 }, - { "METADATA", IRC_METADATA, CLIENT_SERVER, 3, 3, 0, 0, 0 }, - { "MODE", IRC_MODE, CLIENT_USER|CLIENT_SERVER, 1, -1, 0, 0, 0 }, - { "MOTD", IRC_MOTD, CLIENT_USER|CLIENT_SERVER, 0, 1, 0, 0, 0 }, - { "NAMES", IRC_NAMES, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 }, - { "NICK", IRC_NICK, CLIENT_ANY, 0, -1, 0, 0, 0 }, - { "NJOIN", IRC_NJOIN, CLIENT_SERVER, 2, 2, 0, 0, 0 }, - { "NOTICE", IRC_NOTICE, CLIENT_ANY, 0, -1, 0, 0, 0 }, - { "OPER", IRC_OPER, CLIENT_USER, 2, 2, 0, 0, 0 }, - { "PART", IRC_PART, CLIENT_USER|CLIENT_SERVER, 1, 2, 0, 0, 0 }, - { "PASS", IRC_PASS, CLIENT_ANY, 0, -1, 0, 0, 0 }, - { "PING", IRC_PING, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 }, - { "PONG", IRC_PONG, CLIENT_ANY, 0, -1, 0, 0, 0 }, - { "PRIVMSG", IRC_PRIVMSG, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 }, - { "QUIT", IRC_QUIT, CLIENT_ANY, 0, 1, 0, 0, 0 }, - { "REHASH", IRC_REHASH, CLIENT_USER, 0, 0, 0, 0, 0 }, - { "RESTART", IRC_RESTART, CLIENT_USER, 0, 0, 0, 0, 0 }, - { "SERVER", IRC_SERVER, CLIENT_ANY, 0, -1, 0, 0, 0 }, - { "SERVICE", IRC_SERVICE, CLIENT_ANY, 6, 6, 0, 0, 0 }, - { "SERVLIST", IRC_SERVLIST, CLIENT_USER, 0, 2, 0, 0, 0 }, - { "SQUERY", IRC_SQUERY, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 }, - { "SQUIT", IRC_SQUIT, CLIENT_USER|CLIENT_SERVER, 2, 2, 0, 0, 0 }, - { "STATS", IRC_STATS, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 }, - { "SVSNICK", IRC_SVSNICK, CLIENT_SERVER, 2, 2, 0, 0, 0 }, - { "SUMMON", IRC_SUMMON, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 }, - { "TIME", IRC_TIME, CLIENT_USER|CLIENT_SERVER, 0, 1, 0, 0, 0 }, - { "TOPIC", IRC_TOPIC, CLIENT_USER|CLIENT_SERVER, 1, 2, 0, 0, 0 }, - { "TRACE", IRC_TRACE, CLIENT_USER|CLIENT_SERVER, 0, 1, 0, 0, 0 }, - { "USER", IRC_USER, CLIENT_ANY, 0, -1, 0, 0, 0 }, - { "USERHOST", IRC_USERHOST, CLIENT_USER, 1, -1, 0, 0, 0 }, - { "USERS", IRC_USERS, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 }, - { "VERSION", IRC_VERSION, CLIENT_USER|CLIENT_SERVER, 0, 1, 0, 0, 0 }, - { "WALLOPS", IRC_WALLOPS, CLIENT_USER|CLIENT_SERVER, 1, 1, 0, 0, 0 }, - { "WEBIRC", IRC_WEBIRC, CLIENT_UNKNOWN, 4, 4, 0, 0, 0 }, - { "WHO", IRC_WHO, CLIENT_USER, 0, 2, 0, 0, 0 }, - { "WHOIS", IRC_WHOIS, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 }, - { "WHOWAS", IRC_WHOWAS, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 }, + _CMD("DISCONNECT", IRC_DISCONNECT, CLIENT_USER, 1, 1, 0), + _CMD("ERROR", IRC_ERROR, CLIENT_ANY, 0, -1, 0), + _CMD("GLINE", IRC_xLINE, CLIENT_USER|CLIENT_SERVER, 0, -1, 0), + _CMD("HELP", IRC_HELP, CLIENT_USER, 0, 1, 2), + _CMD("INFO", IRC_INFO, CLIENT_USER|CLIENT_SERVER, 0, 1, 2), + _CMD("INVITE", IRC_INVITE, CLIENT_USER|CLIENT_SERVER, 2, 2, 0), + _CMD("ISON", IRC_ISON, CLIENT_USER, 1, -1, 0), + _CMD("JOIN", IRC_JOIN, CLIENT_USER|CLIENT_SERVER, 1, 2, 0), + _CMD("KICK", IRC_KICK, CLIENT_USER|CLIENT_SERVER, 2, 3, 0), + _CMD("KILL", IRC_KILL, CLIENT_USER|CLIENT_SERVER, 2, 2, 0), + _CMD("KLINE", IRC_xLINE, CLIENT_USER|CLIENT_SERVER, 0, -1, 0), + _CMD("LINKS", IRC_LINKS, CLIENT_USER|CLIENT_SERVER, 0, 2, 1), + _CMD("LIST", IRC_LIST, CLIENT_USER|CLIENT_SERVER, 0, 2, 2), + _CMD("LUSERS", IRC_LUSERS, CLIENT_USER|CLIENT_SERVER, 0, 2, 1), + _CMD("METADATA", IRC_METADATA, CLIENT_SERVER, 3, 3, 0), + _CMD("MODE", IRC_MODE, CLIENT_USER|CLIENT_SERVER, 1, -1, 1), + _CMD("MOTD", IRC_MOTD, CLIENT_USER|CLIENT_SERVER, 0, 1, 3), + _CMD("NAMES", IRC_NAMES, CLIENT_USER|CLIENT_SERVER, 0, 2, 1), + _CMD("NICK", IRC_NICK, CLIENT_ANY, 0, -1, 0), + _CMD("NJOIN", IRC_NJOIN, CLIENT_SERVER, 2, 2, 0), + _CMD("NOTICE", IRC_NOTICE, CLIENT_ANY, 0, -1, 0), + _CMD("OPER", IRC_OPER, CLIENT_USER, 2, 2, 0), + _CMD("PART", IRC_PART, CLIENT_USER|CLIENT_SERVER, 1, 2, 0), + _CMD("PASS", IRC_PASS, CLIENT_ANY, 0, -1, 0), + _CMD("PING", IRC_PING, CLIENT_USER|CLIENT_SERVER, 0, -1, 0), + _CMD("PONG", IRC_PONG, CLIENT_ANY, 0, -1, 0), + _CMD("PRIVMSG", IRC_PRIVMSG, CLIENT_USER|CLIENT_SERVER, 0, 2, 0), + _CMD("QUIT", IRC_QUIT, CLIENT_ANY, 0, 1, 0), + _CMD("REHASH", IRC_REHASH, CLIENT_USER, 0, 0, 0), + _CMD("RESTART", IRC_RESTART, CLIENT_USER, 0, 0, 0), + _CMD("SERVER", IRC_SERVER, CLIENT_ANY, 0, -1, 0), + _CMD("SERVICE", IRC_SERVICE, CLIENT_ANY, 6, 6, 0), + _CMD("SERVLIST", IRC_SERVLIST, CLIENT_USER, 0, 2, 1), + _CMD("SQUERY", IRC_SQUERY, CLIENT_USER|CLIENT_SERVER, 0, 2, 0), + _CMD("SQUIT", IRC_SQUIT, CLIENT_USER|CLIENT_SERVER, 2, 2, 0), + _CMD("STATS", IRC_STATS, CLIENT_USER|CLIENT_SERVER, 0, 2, 2), + _CMD("SVSNICK", IRC_SVSNICK, CLIENT_SERVER, 2, 2, 0), + _CMD("SUMMON", IRC_SUMMON, CLIENT_USER|CLIENT_SERVER, 0, -1, 0), + _CMD("TIME", IRC_TIME, CLIENT_USER|CLIENT_SERVER, 0, 1, 1), + _CMD("TOPIC", IRC_TOPIC, CLIENT_USER|CLIENT_SERVER, 1, 2, 1), + _CMD("TRACE", IRC_TRACE, CLIENT_USER|CLIENT_SERVER, 0, 1, 3), + _CMD("USER", IRC_USER, CLIENT_ANY, 0, -1, 0), + _CMD("USERHOST", IRC_USERHOST, CLIENT_USER, 1, -1, 1), + _CMD("USERS", IRC_USERS, CLIENT_USER|CLIENT_SERVER, 0, -1, 0), + _CMD("VERSION", IRC_VERSION, CLIENT_USER|CLIENT_SERVER, 0, 1, 1), + _CMD("WALLOPS", IRC_WALLOPS, CLIENT_USER|CLIENT_SERVER, 1, 1, 0), + _CMD("WEBIRC", IRC_WEBIRC, CLIENT_UNKNOWN, 4, 4, 0), + _CMD("WHO", IRC_WHO, CLIENT_USER, 0, 2, 1), + _CMD("WHOIS", IRC_WHOIS, CLIENT_USER|CLIENT_SERVER, 0, -1, 1), + _CMD("WHOWAS", IRC_WHOWAS, CLIENT_USER|CLIENT_SERVER, 0, -1, 0), #ifdef IRCPLUS - { "CHANINFO", IRC_CHANINFO, CLIENT_SERVER, 0, -1, 0, 0, 0 }, + _CMD("CHANINFO", IRC_CHANINFO, CLIENT_SERVER, 0, -1, 0), # ifdef ICONV - { "CHARCONV", IRC_CHARCONV, CLIENT_USER, 1, 1, 0, 0, 0 }, + _CMD("CHARCONV", IRC_CHARCONV, CLIENT_USER, 1, 1, 0), # endif #endif #ifndef STRICT_RFC - { "GET", IRC_QUIT_HTTP, CLIENT_UNKNOWN, 0, -1, 0, 0, 0 }, - { "POST", IRC_QUIT_HTTP, CLIENT_UNKNOWN, 0, -1, 0, 0, 0 }, + _CMD("GET", IRC_QUIT_HTTP, CLIENT_UNKNOWN, 0, -1, 0), + _CMD("POST", IRC_QUIT_HTTP, CLIENT_UNKNOWN, 0, -1, 0), #endif - { NULL, NULL, 0x0, 0, 0, 0, 0, 0 } /* End-Mark */ + _CMD(NULL, NULL, 0, 0, 0, 0) /* End-Mark */ +#undef _CMD }; static void Init_Request PARAMS(( REQUEST *Req )); @@ -530,12 +527,13 @@ Handle_Request( CONN_ID Idx, REQUEST *Req ) Client_ID(client)); } + if (cmd->penalty) + IRC_SetPenalty(client, cmd->penalty); + if (Req->argc < cmd->min_argc || - (cmd->max_argc != -1 && Req->argc > cmd->max_argc)) { - IRC_SetPenalty(client, 2); - return IRC_WriteStrClient(client, ERR_NEEDMOREPARAMS_MSG, + (cmd->max_argc != -1 && Req->argc > cmd->max_argc)) + return IRC_WriteErrClient(client, ERR_NEEDMOREPARAMS_MSG, Client_ID(client), Req->command); - } /* Command is allowed for this client: call it and count * generated bytes in output */ diff --git a/src/ngircd/parse.h b/src/ngircd/parse.h index beac227..859c7ce 100644 --- a/src/ngircd/parse.h +++ b/src/ngircd/parse.h @@ -37,6 +37,7 @@ typedef struct _COMMAND CLIENT_TYPE type; /**< Valid client types (bit mask) */ int min_argc; /**< Min parameters */ int max_argc; /**< Max parameters */ + int penalty; /**< Penalty for this command */ long lcount, rcount; /**< Number of local and remote calls */ long bytes; /**< Number of bytes created */ } COMMAND; diff --git a/src/ngircd/proc.c b/src/ngircd/proc.c index a5afb50..d68d714 100644 --- a/src/ngircd/proc.c +++ b/src/ngircd/proc.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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,20 +16,19 @@ * Process management */ -#include "imp.h" #include #include #include #include #include +#include #include +#include #include "log.h" #include "io.h" -#include "conn.h" - -#include "exp.h" #include "sighandlers.h" + #include "proc.h" /** diff --git a/src/ngircd/resolve.c b/src/ngircd/resolve.c index 01f730c..be41ec8 100644 --- a/src/ngircd/resolve.c +++ b/src/ngircd/resolve.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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 @@ -18,16 +18,16 @@ * Asynchronous resolver */ -#include "imp.h" #include #include #include #include #include +#include +#include #include #include #include -#include #ifdef IDENTAUTH #ifdef HAVE_IDENT_H @@ -35,17 +35,12 @@ #endif #endif -#include "array.h" #include "conn.h" #include "conf.h" -#include "defines.h" #include "log.h" #include "ng_ipaddr.h" -#include "exp.h" #include "resolve.h" -#include "io.h" - static void Do_ResolveAddr PARAMS(( const ng_ipaddr_t *Addr, int Sock, int w_fd )); static void Do_ResolveName PARAMS(( const char *Host, int w_fd )); diff --git a/src/ngircd/sighandlers.c b/src/ngircd/sighandlers.c index effef44..5cde24b 100644 --- a/src/ngircd/sighandlers.c +++ b/src/ngircd/sighandlers.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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 @@ -24,15 +24,15 @@ #include #include #include +#include -#include "imp.h" #include "conn.h" -#include "conf-ssl.h" #include "channel.h" #include "conf.h" #include "io.h" #include "log.h" #include "ngircd.h" + #include "sighandlers.h" static int signalpipe[2]; diff --git a/src/portab/Makefile.ng b/src/portab/Makefile.ng index 17edbdf..8712bc5 100644 --- a/src/portab/Makefile.ng +++ b/src/portab/Makefile.ng @@ -1,6 +1,6 @@ # # ngIRCd -- The Next Generation IRC Daemon -# Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors +# Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors # # 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 @@ -25,7 +25,7 @@ portabtest_LDFLAGS = -L. portabtest_LDADD = -lngportab -noinst_HEADERS = imp.h exp.h portab.h splint.h +noinst_HEADERS = portab.h splint.h maintainer-clean-local: rm -f Makefile Makefile.in Makefile.am diff --git a/src/portab/exp.h b/src/portab/exp.h deleted file mode 100644 index d678b99..0000000 --- a/src/portab/exp.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de) - * - * Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen - * der GNU General Public License (GPL), wie von der Free Software Foundation - * herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2 - * der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version. - * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste - * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. - */ - -/** - * @file - * "Export Header" which makes sure, that global functions are not "extern". - */ - -#undef GLOBAL -#define GLOBAL - -/* -eof- */ diff --git a/src/portab/imp.h b/src/portab/imp.h deleted file mode 100644 index 68b5aee..0000000 --- a/src/portab/imp.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de) - * - * Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen - * der GNU General Public License (GPL), wie von der Free Software Foundation - * herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2 - * der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version. - * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste - * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. - */ - -/** - * @file - * "Import Header" which makes sure that global functions are defined "extern". - */ - -#undef GLOBAL -#define GLOBAL extern - -/* -eof- */ diff --git a/src/portab/portab.h b/src/portab/portab.h index a968a3b..78b6f7e 100644 --- a/src/portab/portab.h +++ b/src/portab/portab.h @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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 @@ -23,28 +23,6 @@ # 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 */ #if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 7)) @@ -63,9 +41,24 @@ # endif #endif - /* datatypes */ +#include + +#ifdef HAVE_STDDEF_H +# include +#endif + +#ifdef HAVE_INTTYPES_H +# include +# define NGIRC_GOT_INTTYPES +#else +# ifdef HAVE_STDINT_H +# include +# define NGIRC_GOT_INTTYPES +# endif +#endif + #ifndef PROTOTYPES # ifndef signed # define signed @@ -84,55 +77,55 @@ typedef unsigned short UINT16; typedef unsigned int UINT32; #endif -#ifndef HAVE_STDBOOL_H +#ifdef HAVE_STDBOOL_H +# include +#else typedef unsigned char bool; -#define true (bool)1 -#define false (bool)0 +# define true (bool)1 +# define false (bool)0 #endif #ifndef NULL -#ifdef PROTOTYPES -# define NULL (void *)0 -#else -# define NULL 0L -#endif +# ifdef PROTOTYPES +# define NULL (void *)0 +# else +# define NULL 0L +# endif #endif #ifdef NeXT -#define S_IRUSR 0000400 /* read permission, owner */ -#define S_IWUSR 0000200 /* write permission, owner */ -#define S_IRGRP 0000040 /* read permission, group */ -#define S_IROTH 0000004 /* read permission, other */ -#define ssize_t int +# define S_IRUSR 0000400 /* read permission, owner */ +# define S_IWUSR 0000200 /* write permission, owner */ +# define S_IRGRP 0000040 /* read permission, group */ +# define S_IROTH 0000004 /* read permission, other */ +# define ssize_t int #endif #undef GLOBAL #define GLOBAL - /* SPLint */ #ifdef S_SPLINT_S -#include "splint.h" +# include "splint.h" #endif - /* target constants */ #ifndef HOST_OS -#define HOST_OS "unknown" +# define HOST_OS "unknown" #endif #ifndef HOST_CPU -#define HOST_CPU "unknown" +# define HOST_CPU "unknown" #endif #ifndef HOST_VENDOR -#define HOST_VENDOR "unknown" +# define HOST_VENDOR "unknown" #endif #ifdef __HAIKU__ -#define SINGLE_USER_OS +# define SINGLE_USER_OS #endif /* configure options */ @@ -171,19 +164,17 @@ extern int vsnprintf PARAMS(( char *str, size_t count, const char *fmt, va_list #endif #ifndef HAVE_GAI_STRERROR -#define gai_strerror(r) "unknown error" +# define gai_strerror(r) "unknown error" #endif #ifndef PACKAGE_NAME -#define PACKAGE_NAME PACKAGE +# define PACKAGE_NAME PACKAGE #endif #ifndef PACKAGE_VERSION -#define PACKAGE_VERSION VERSION +# define PACKAGE_VERSION VERSION #endif - #endif - /* -eof- */ diff --git a/src/portab/portabtest.c b/src/portab/portabtest.c index b55ff97..4980765 100644 --- a/src/portab/portabtest.c +++ b/src/portab/portabtest.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de) + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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,50 +16,188 @@ * Test program for portab.h and friends ;-) */ -#include "imp.h" #include #include #include #include -#include "exp.h" - int allow_severity = 0, deny_severity = 0; +static void +Panic(char *Reason) +{ + /* Oops, something failed!? */ + fprintf(stderr, "Oops, test for %s failed!?\n", Reason); + exit(1); +} /* Panic */ -static void Panic PARAMS (( char *Reason, int Code )); +static void +Check_snprintf(void) +{ + char str[5]; + snprintf(str, sizeof(str), "%s", "1234567890"); + if (str[4] != '\0') + Panic("snprintf NULL byte"); + if (strlen(str) != 4) + Panic("snprintf string length"); +} -GLOBAL int -main( void ) +static void +Check_strdup(void) { - /* validate datatypes */ - if( false != 0 ) Panic( "false", 1 ); - if( true != 1 ) Panic( "true", 1 ); - if( sizeof( UINT8 ) != 1 ) Panic( "UINT8", 1 ); - if( sizeof( UINT16 ) != 2 ) Panic( "UINT16", 1 ); - if( sizeof( UINT32 ) != 4 ) Panic( "UINT32", 1 ); + char *ptr; + + ptr = strdup("1234567890"); + if (!ptr) + Panic("strdup"); + if (ptr[10] != '\0') + Panic("strdup NULL byte"); + if (strlen(ptr) != 10) + Panic("strdup string length"); + free(ptr); +} + +static void +Check_strndup(void) +{ + char *ptr; + + ptr = strndup("1234567890", 5); + if (!ptr) + Panic("strndup"); + if (ptr[5] != '\0') + Panic("strndup NULL byte"); + if (strlen(ptr) != 5) + Panic("strndup string length"); + free(ptr); +} + +static void +Check_strlcpy(void) +{ + char str[5]; + + if (strlcpy(str, "1234567890", sizeof(str)) != 10) + Panic("strlcpy return code"); + if (str[4] != '\0') + Panic("strlcpy NULL byte"); + if (strlen(str) != 4) + Panic("strlcpy string length"); +} + +static void +Check_strlcat(void) +{ + char str[5]; + + if (strlcpy(str, "12", sizeof(str)) != 2) + Panic("strlcpy for strlcat"); + if (strlcat(str, "1234567890", sizeof(str)) != 12) + Panic("strlcat return code"); + if (str[4] != '\0') + Panic("strlcat NULL byte"); + if (strlen(str) != 4) + Panic("strlcat string length"); +} + +static void +Check_strtok_r(void) +{ + char *ptr, *last; + + ptr = strdup("12,abc"); + + ptr = strtok_r(ptr, ",", &last); + if (!ptr) + Panic("strtok_r result #1"); + if (strcmp(ptr, "12") != 0) + Panic("strtok_r token #1"); + + ptr = strtok_r(NULL, ",", &last); + if (!ptr) + Panic("strtok_r result #2"); + if (strcmp(ptr, "abc") != 0) + Panic("strtok_r token #2"); + + ptr = strtok_r(NULL, ",", &last); + if (ptr) + Panic("strtok_r result #3"); +} #ifdef PROTOTYPES - /* check functions */ - if( ! snprintf ) Panic( "snprintf", 2 ); - if( ! vsnprintf ) Panic( "vsnprintf", 2 ); - if( ! strlcpy ) Panic( "strlcpy", 2 ); - if( ! strlcat ) Panic( "strlcat", 2 ); +static void +Check_vsnprintf(const int Len, const char *Format, ...) +#else +static void +Check_vsnprintf(Len, Format, va_alist) +const int Len; +const char *Format; +va_dcl #endif - - /* ok, no error */ - return 0; -} /* portab_check_types */ +{ + char str[5]; + va_list ap; + int r; +#ifdef PROTOTYPES + va_start(ap, Format); +#else + va_start(ap); +#endif + r = vsnprintf(str, sizeof(str), Format, ap); + va_end(ap); + if (r != Len) { + /* C99 states that vsnprintf() "returns the number of + * characters that would have been printed if the n were + * unlimited", but according to the Linux manual page "glibc + * until 2.0.6 would return -1 when the output was truncated", + * and other implementations (libUTIL on A/UX) even return the + * number of characters processed ... so we only test our own + * implementation and warn on errors otherwise :-/ */ +#ifdef HAVE_VSNPRINTF + fprintf(stderr, + "\n ** WARNING: The vsnprintf() function of this system isn't standard\n"); + fprintf(stderr, + " ** conformant and returns a WRONG result: %d (should be %d)! The test\n", + r, Len); + fprintf(stderr, + " ** result has been ignored but may lead to errors during execution!\n\n"); +#else + Panic("vsnprintf return code"); +#endif + } + if (str[4] != '\0') + Panic("vsnprintf NULL byte"); + if (strlen(str) != 4) + Panic("vsnprintf string length"); +} -static void -Panic( char *Reason, int Code ) +GLOBAL int +main(void) { - /* Oops, something failed!? */ - fprintf( stderr, "Oops, test for %s failed!?", Reason ); - exit( Code ); -} /* Panic */ + /* validate datatypes */ + if (false != 0) + Panic("false"); + if (true != 1) + Panic("true"); + if (sizeof(UINT8) != 1) + Panic("UINT8"); + if (sizeof(UINT16) != 2) + Panic("UINT16"); + if (sizeof(UINT32) != 4) + Panic("UINT32"); + /* check functions */ + Check_snprintf(); + Check_strdup(); + Check_strndup(); + Check_strlcpy(); + Check_strlcat(); + Check_strtok_r(); + Check_vsnprintf(2+10, "%s%s", "ab", "1234567890"); + + return 0; +} /* -eof- */ diff --git a/src/portab/strdup.c b/src/portab/strdup.c index 7c0ee8f..adb19e7 100644 --- a/src/portab/strdup.c +++ b/src/portab/strdup.c @@ -11,26 +11,24 @@ #ifndef HAVE_STRDUP -#include "imp.h" #include #include #include -#include "exp.h" - GLOBAL char * -strdup( const char *s ) +strdup(const char *s) { - char *dup; - size_t len = strlen( s ); - size_t alloc = len + 1; + 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 ); + if (len >= alloc) + return NULL; + dup = malloc(alloc); + if (dup) + strlcpy(dup, s, alloc ); -return dup; + return dup; } #endif - diff --git a/src/portab/strlcpy.c b/src/portab/strlcpy.c index ae2018b..1f86a93 100644 --- a/src/portab/strlcpy.c +++ b/src/portab/strlcpy.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2005 Alexander Barton (alex@barton.de) + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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 @@ -22,13 +22,9 @@ * */ -#include "imp.h" #include #include -#include "exp.h" - - #ifndef HAVE_STRLCAT GLOBAL size_t @@ -52,7 +48,6 @@ strlcat( char *dst, const char *src, size_t size ) #endif - #ifndef HAVE_STRLCPY GLOBAL size_t @@ -74,5 +69,4 @@ strlcpy( char *dst, const char *src, size_t size ) #endif - /* -eof- */ diff --git a/src/portab/strndup.c b/src/portab/strndup.c index d6e01c9..d63b972 100644 --- a/src/portab/strndup.c +++ b/src/portab/strndup.c @@ -11,13 +11,10 @@ #ifndef HAVE_STRNDUP -#include "imp.h" #include #include #include -#include "exp.h" - GLOBAL char * strndup(const char *s, size_t maxlen) { @@ -30,8 +27,8 @@ strndup(const char *s, size_t maxlen) dup = malloc(len); if (dup) strlcpy(dup, s, len); + return dup; } #endif - diff --git a/src/portab/vsnprintf.c b/src/portab/vsnprintf.c index 0c9e579..39a6c5f 100644 --- a/src/portab/vsnprintf.c +++ b/src/portab/vsnprintf.c @@ -72,7 +72,6 @@ * removed [v]asprintf() and C99 tests: not needed by ngIRCd. */ - #ifdef HAVE_STRING_H #include #endif @@ -88,7 +87,6 @@ #include #endif - #if defined(HAVE_SNPRINTF) && defined(HAVE_VSNPRINTF) /* only include stdio.h if we are not re-defining snprintf or vsnprintf */ #include @@ -647,14 +645,6 @@ fmtfp (char *buffer, size_t *currlen, size_t maxlen, LDOUBLE fvalue, } } -#if 0 - if (flags & DP_F_UP) caps = 1; /* Should characters be upper case? */ -#endif - -#if 0 - if (max == 0) ufvalue += 0.5; /* if max = 0 we must round */ -#endif - /* * Sorry, we only support 16 digits past the decimal because of our * conversion method @@ -806,138 +796,4 @@ va_dcl #endif - -#ifdef TEST_SNPRINTF -int sprintf(char *str,const char *fmt,...); -int main (void) -{ - char buf1[1024]; - char buf2[1024]; - char *fp_fmt[] = { - "%1.1f", - "%-1.5f", - "%1.5f", - "%123.9f", - "%10.5f", - "% 10.5f", - "%+22.9f", - "%+4.9f", - "%01.3f", - "%4f", - "%3.1f", - "%3.2f", - "%.0f", - "%f", - "-16.16f", - NULL - }; - double fp_nums[] = { 6442452944.1234, -1.5, 134.21, 91340.2, 341.1234, 0203.9, 0.96, 0.996, - 0.9996, 1.996, 4.136, 0}; - char *int_fmt[] = { - "%-1.5d", - "%1.5d", - "%123.9d", - "%5.5d", - "%10.5d", - "% 10.5d", - "%+22.33d", - "%01.3d", - "%4d", - "%d", - NULL - }; - long int_nums[] = { -1, 134, 91340, 341, 0203, 0}; - char *str_fmt[] = { - "10.5s", - "5.10s", - "10.1s", - "0.10s", - "10.0s", - "1.10s", - "%s", - "%.1s", - "%.10s", - "%10s", - NULL - }; - char *str_vals[] = {"hello", "a", "", "a longer string", NULL}; - int x, y; - int fail = 0; - int num = 0; - - printf ("Testing snprintf format codes against system sprintf...\n"); - - for (x = 0; fp_fmt[x] ; x++) { - for (y = 0; fp_nums[y] != 0 ; y++) { - int l1 = snprintf(NULL, 0, fp_fmt[x], fp_nums[y]); - int l2 = snprintf(buf1, sizeof(buf1), fp_fmt[x], fp_nums[y]); - sprintf (buf2, fp_fmt[x], fp_nums[y]); - if (strcmp (buf1, buf2)) { - printf("snprintf doesn't match Format: %s\n\tsnprintf = [%s]\n\t sprintf = [%s]\n", - fp_fmt[x], buf1, buf2); - fail++; - } - if (l1 != l2) { - printf("snprintf l1 != l2 (%d %d) %s\n", l1, l2, fp_fmt[x]); - fail++; - } - num++; - } - } - - for (x = 0; int_fmt[x] ; x++) { - for (y = 0; int_nums[y] != 0 ; y++) { - int l1 = snprintf(NULL, 0, int_fmt[x], int_nums[y]); - int l2 = snprintf(buf1, sizeof(buf1), int_fmt[x], int_nums[y]); - sprintf (buf2, int_fmt[x], int_nums[y]); - if (strcmp (buf1, buf2)) { - printf("snprintf doesn't match Format: %s\n\tsnprintf = [%s]\n\t sprintf = [%s]\n", - int_fmt[x], buf1, buf2); - fail++; - } - if (l1 != l2) { - printf("snprintf l1 != l2 (%d %d) %s\n", l1, l2, int_fmt[x]); - fail++; - } - num++; - } - } - - for (x = 0; str_fmt[x] ; x++) { - for (y = 0; str_vals[y] != 0 ; y++) { - int l1 = snprintf(NULL, 0, str_fmt[x], str_vals[y]); - int l2 = snprintf(buf1, sizeof(buf1), str_fmt[x], str_vals[y]); - sprintf (buf2, str_fmt[x], str_vals[y]); - if (strcmp (buf1, buf2)) { - printf("snprintf doesn't match Format: %s\n\tsnprintf = [%s]\n\t sprintf = [%s]\n", - str_fmt[x], buf1, buf2); - fail++; - } - if (l1 != l2) { - printf("snprintf l1 != l2 (%d %d) %s\n", l1, l2, str_fmt[x]); - fail++; - } - num++; - } - } - - printf ("%d tests failed out of %d.\n", fail, num); - - printf("seeing how many digits we support\n"); - { - double v0 = 0.12345678901234567890123456789012345678901; - for (x=0; x<100; x++) { - snprintf(buf1, sizeof(buf1), "%1.1f", v0*pow(10, x)); - sprintf(buf2, "%1.1f", v0*pow(10, x)); - if (strcmp(buf1, buf2)) { - printf("we seem to support %d digits\n", x-1); - break; - } - } - } - return 0; -} -#endif /* SNPRINTF_TEST */ - - /* -eof- */ diff --git a/src/portab/waitpid.c b/src/portab/waitpid.c index 5846bd8..921dd3d 100644 --- a/src/portab/waitpid.c +++ b/src/portab/waitpid.c @@ -12,13 +12,10 @@ #ifndef HAVE_WAITPID -#include "imp.h" #include #include #include -#include "exp.h" - GLOBAL int waitpid(pid, stat_loc, options) int pid, *stat_loc, options; diff --git a/src/testsuite/.gitignore b/src/testsuite/.gitignore index d17f3b2..d6715ae 100644 --- a/src/testsuite/.gitignore +++ b/src/testsuite/.gitignore @@ -21,3 +21,4 @@ ngircd-test1.motd ngircd-test2.motd logs tests +tests-skipped.lst diff --git a/src/testsuite/Makefile.ng b/src/testsuite/Makefile.ng index b906091..d929592 100644 --- a/src/testsuite/Makefile.ng +++ b/src/testsuite/Makefile.ng @@ -1,6 +1,6 @@ # # ngIRCd -- The Next Generation IRC Daemon -# Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors +# Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors # # 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 @@ -27,7 +27,7 @@ EXTRA_DIST = \ all: clean-local: - rm -rf logs tests *-test ngircd-test*.log procs.tmp \ + rm -rf logs tests *-test ngircd-test*.log procs.tmp tests-skipped.lst \ T-ngircd1 ngircd-test1.motd T-ngircd2 ngircd-test2.motd maintainer-clean-local: @@ -39,6 +39,7 @@ ngircd-TEST-Binary: cp ../ngircd/ngircd T-ngircd1 cp ../ngircd/ngircd T-ngircd2 [ -f getpid.sh ] || ln -s $(srcdir)/getpid.sh . + rm -f tests-skipped.lst connect-test: tests.sh rm -f connect-test diff --git a/src/testsuite/channel-test.e b/src/testsuite/channel-test.e index 16c67ad..dd7eb66 100644 --- a/src/testsuite/channel-test.e +++ b/src/testsuite/channel-test.e @@ -1,4 +1,5 @@ -# $Id: channel-test.e,v 1.4 2008/02/05 13:31:51 fw Exp $ +# ngIRCd test suite +# Channel test spawn telnet localhost 6789 expect { @@ -104,5 +105,3 @@ expect { timeout { exit 1 } "Connection closed" } - -# -eof- diff --git a/src/testsuite/check-idle.e b/src/testsuite/check-idle.e index e994c14..41b8eb4 100644 --- a/src/testsuite/check-idle.e +++ b/src/testsuite/check-idle.e @@ -1,4 +1,5 @@ -# $Id: check-idle.e,v 1.2 2004/09/04 14:22:13 alex Exp $ +# ngIRCd test suite +# Idle test spawn telnet localhost 6789 expect { @@ -28,5 +29,3 @@ expect { } exit $r - -# -eof- diff --git a/src/testsuite/connect-test.e b/src/testsuite/connect-test.e index 49ce70c..662f5f7 100644 --- a/src/testsuite/connect-test.e +++ b/src/testsuite/connect-test.e @@ -1,4 +1,5 @@ -# $Id: connect-test.e,v 1.1 2002/09/09 10:16:24 alex Exp $ +# ngIRCd test suite +# Server connect test spawn telnet localhost 6789 expect { @@ -17,5 +18,3 @@ expect { timeout { exit 1 } "Connection closed" } - -# -eof- diff --git a/src/testsuite/invite-test.e b/src/testsuite/invite-test.e index cc7015a..3716d19 100644 --- a/src/testsuite/invite-test.e +++ b/src/testsuite/invite-test.e @@ -1,3 +1,6 @@ +# ngIRCd test suite +# INVITE test + spawn telnet localhost 6789 expect { timeout { exit 1 } @@ -109,5 +112,3 @@ expect { timeout { exit 1 } "Connection closed" } - -# -eof- diff --git a/src/testsuite/join-test.e b/src/testsuite/join-test.e index 41a5168..28b4c54 100644 --- a/src/testsuite/join-test.e +++ b/src/testsuite/join-test.e @@ -1,3 +1,6 @@ +# ngIRCd test suite +# JOIN test + spawn telnet localhost 6789 expect { timeout { exit 1 } @@ -64,5 +67,3 @@ expect { timeout { exit 1 } "Connection closed" } - -# -eof- diff --git a/src/testsuite/kick-test.e b/src/testsuite/kick-test.e index 9412d32..3d3c1ee 100644 --- a/src/testsuite/kick-test.e +++ b/src/testsuite/kick-test.e @@ -1,3 +1,6 @@ +# ngIRCd test suite +# KICK test + spawn telnet localhost 6789 expect { timeout { exit 1 } @@ -108,5 +111,3 @@ expect { timeout { exit 1 } "Connection closed" } - -# -eof- diff --git a/src/testsuite/message-test.e b/src/testsuite/message-test.e index 6e63bb5..0e70640 100644 --- a/src/testsuite/message-test.e +++ b/src/testsuite/message-test.e @@ -1,3 +1,6 @@ +# ngIRCd test suite +# PRIVMSG and NOTICE test + spawn telnet localhost 6789 expect { timeout { exit 1 } @@ -138,12 +141,8 @@ expect { "401" } -#cannot test host mask since localhost has no '.' as RFC requires - send "quit\r" expect { timeout { exit 1 } "Connection closed" } - -# -eof- diff --git a/src/testsuite/misc-test.e b/src/testsuite/misc-test.e index 0623024..a83bc5b 100644 --- a/src/testsuite/misc-test.e +++ b/src/testsuite/misc-test.e @@ -1,4 +1,5 @@ -# $Id: misc-test.e,v 1.2 2008/02/17 13:51:00 alex Exp $ +# ngIRCd test suite +# Misc test spawn telnet localhost 6789 expect { @@ -161,5 +162,3 @@ expect { timeout { exit 1 } "ERROR" } - -# -eof- diff --git a/src/testsuite/mode-test.e b/src/testsuite/mode-test.e index 44b6e5d..d6726a4 100644 --- a/src/testsuite/mode-test.e +++ b/src/testsuite/mode-test.e @@ -1,4 +1,5 @@ -# $Id: mode-test.e,v 1.7 2008/02/16 11:27:49 fw Exp $ +# ngIRCd test suite +# MODE test spawn telnet localhost 6789 expect { @@ -172,5 +173,3 @@ expect { timeout { exit 1 } "Connection closed" } - -# -eof- diff --git a/src/testsuite/opless-channel-test.e b/src/testsuite/opless-channel-test.e index 35d109e..7d94172 100644 --- a/src/testsuite/opless-channel-test.e +++ b/src/testsuite/opless-channel-test.e @@ -1,3 +1,6 @@ +# ngIRCd test suite +# Op-less channel test + spawn telnet localhost 6789 expect { timeout { exit 1 } @@ -28,5 +31,3 @@ expect { timeout { exit 1 } "Connection closed" } - -# -eof- diff --git a/src/testsuite/server-link-test.e b/src/testsuite/server-link-test.e index 3a1c232..cf3fae8 100644 --- a/src/testsuite/server-link-test.e +++ b/src/testsuite/server-link-test.e @@ -48,5 +48,3 @@ expect { timeout { exit 1 } "ERROR" } - -# -eof- diff --git a/src/testsuite/start-server.sh b/src/testsuite/start-server.sh index 0fd61ea..3d19ffb 100755 --- a/src/testsuite/start-server.sh +++ b/src/testsuite/start-server.sh @@ -35,6 +35,10 @@ fi # generate MOTD for test-server echo "This is an ngIRCd Test Server" > ngircd-test${id}.motd +# glibc memory checking, see malloc(3) +MALLOC_CHECK_=3 +export MALLOC_CHECK_ + # starting up test-server ... ./T-ngircd${id} -n -f ${srcdir}/ngircd-test${id}.conf $* \ >ngircd-test${id}.log 2>&1 & diff --git a/src/testsuite/stress-A.e b/src/testsuite/stress-A.e index b22a2f3..256d5d1 100644 --- a/src/testsuite/stress-A.e +++ b/src/testsuite/stress-A.e @@ -1,4 +1,5 @@ -# $Id: stress-A.e,v 1.2 2005/08/12 21:35:12 alex Exp $ +# ngIRCd test suite +# "Stress" header set timeout 30 @@ -7,5 +8,3 @@ expect { timeout { exit 1 } "Connected" } - -# -eof- diff --git a/src/testsuite/stress-B.e b/src/testsuite/stress-B.e index e260c6d..95156cb 100644 --- a/src/testsuite/stress-B.e +++ b/src/testsuite/stress-B.e @@ -1,4 +1,5 @@ -# $Id: stress-B.e,v 1.3 2005/12/30 22:12:28 alex Exp $ +# ngIRCd test suite +# "Stress" body send "user user . . :User\r" expect { @@ -73,5 +74,3 @@ expect { timeout { exit 1 } "Connection closed" } - -# -eof- diff --git a/src/testsuite/tests.sh b/src/testsuite/tests.sh index 1989205..fc4a4d5 100755 --- a/src/testsuite/tests.sh +++ b/src/testsuite/tests.sh @@ -1,7 +1,7 @@ #!/bin/sh # # ngIRCd Test Suite -# Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors. +# Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. # # 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 @@ -18,6 +18,7 @@ test=`echo ${name} | cut -d '.' -f 1` [ -d logs ] || mkdir logs if [ ! -r "$test" ]; then + echo "$test: test not found" >>tests-skipped.lst echo "${name}: test \"$test\" not found!"; exit 77 exit 1 fi @@ -27,10 +28,12 @@ fi type expect > /dev/null 2>&1 if [ $? -ne 0 ]; then + echo "$test: \"expect\" not found" >>tests-skipped.lst echo "${name}: \"expect\" not found."; exit 77 fi type telnet > /dev/null 2>&1 if [ $? -ne 0 ]; then + echo "$test: \"telnet\" not found" >>tests-skipped.lst echo "${name}: \"telnet\" not found."; exit 77 fi diff --git a/src/testsuite/who-test.e b/src/testsuite/who-test.e index 0a71e3f..a41e6b6 100644 --- a/src/testsuite/who-test.e +++ b/src/testsuite/who-test.e @@ -1,3 +1,6 @@ +# ngIRCd test suite +# WHO test + spawn telnet localhost 6789 expect { timeout { exit 1 } @@ -198,5 +201,3 @@ expect { timeout { exit 1 } "Connection closed" } - -# -eof- diff --git a/src/testsuite/whois-test.e b/src/testsuite/whois-test.e index fdb21bc..16b1184 100644 --- a/src/testsuite/whois-test.e +++ b/src/testsuite/whois-test.e @@ -75,5 +75,3 @@ expect { timeout { exit 1 } "ERROR" } - -# -eof- diff --git a/src/tool/tool.c b/src/tool/tool.c index 3b9cc25..b00e235 100644 --- a/src/tool/tool.c +++ b/src/tool/tool.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2010 Alexander Barton (alex@barton.de) + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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,7 +16,6 @@ * Tool functions */ -#include "imp.h" #include #include #include @@ -31,7 +30,6 @@ #include #endif -#include "exp.h" #include "tool.h"