1
0
mirror of https://github.com/osmarks/ngircd.git synced 2025-10-09 11:52:25 +00:00

Compare commits

..

39 Commits

Author SHA1 Message Date
Alexander Barton
ab1e81841b Debian package for 0.9.2. 2006-07-23 11:45:36 +00:00
Florian Westphal
957cdda1c0 fix format string (from HEAD) 2006-03-24 23:30:34 +00:00
Florian Westphal
c35b810b90 use strlcat return value; don't call time() repeatedly. [from HEAD] 2006-03-18 22:30:45 +00:00
Florian Westphal
3179bd3090 corrected return value (from HEAD) 2006-03-16 20:14:46 +00:00
Florian Westphal
f95d813064 removed redundant (foo) { if (foo){} } clause (from HEAD) 2006-03-16 20:03:14 +00:00
Florian Westphal
a854a38616 log.c and log.h from CVSHEAD (adds LogDebug() Function) 2006-02-08 21:23:21 +00:00
Alexander Barton
51b22759b6 Return PING argument in PONG reply if STRICT_RFC is not defined [from HEAD].
Fixes Debian Bug #343200.
2005-12-15 11:01:59 +00:00
Alexander Barton
521782ad05 Fixed my email address ... argl! 2005-10-15 12:59:19 +00:00
Alexander Barton
84e23f09fc Updated autoconf scripts. 2005-10-15 12:59:00 +00:00
Alexander Barton
4429afe3c2 Version 0.9.2 2005-10-15 12:44:08 +00:00
Alexander Barton
216eb30c73 Changed Handle_Write() to not close sockets itself but to call Conn_Close. 2005-10-11 19:28:47 +00:00
Alexander Barton
ff91c6db38 Updated Changelog: fixed file descriptor leak in resolver code. 2005-09-02 22:10:58 +00:00
Florian Westphal
a8d50a1ee4 fix fd leak on fork() failure (from HEAD) 2005-09-02 22:07:38 +00:00
Alexander Barton
7962ba5fe0 Changed version string to "0.9-CVS". 2005-08-30 20:21:58 +00:00
Alexander Barton
04766b8f3d Fixed server NOTICEs to users with "s" mode ("server messages"). [from HEAD] 2005-08-29 11:19:48 +00:00
Alexander Barton
2019324741 Fixed format string bug in "connection statistics" message [from HEAD]. 2005-08-25 09:04:23 +00:00
Alexander Barton
99e718eff9 Fixed my mail address ... once more :-/ 2005-08-03 16:37:12 +00:00
Alexander Barton
61776e9a57 Preparing ngIRCd 0.9.1 ... 2005-08-03 14:27:48 +00:00
Alexander Barton
eccf4ea5f2 The KILL command killed much more than desired (including server links!)
when the target user is connected to a remote server.
2005-08-02 23:08:26 +00:00
Alexander Barton
914fbac0f1 Removed "U" unsigned suffix: caused problems with older compilers and is
not necessary for this constants. [from HEAD]
2005-07-30 23:24:50 +00:00
Alexander Barton
b6ce4ce002 New Debian release: 0.9.0-0ab2 2005-07-26 19:34:09 +00:00
Alexander Barton
1246ec04b8 Run "basename" on your script name when it is a symlink as well. 2005-07-26 19:30:54 +00:00
Alexander Barton
6335461bc1 Release 0.9.0 2005-07-24 21:39:45 +00:00
Alexander Barton
8e5d37efc8 Updated config.guess and config.sub to latest release used in Debian. 2005-07-24 21:21:11 +00:00
Alexander Barton
ac8559171b Fixed wrong email address ... 2005-07-24 21:19:40 +00:00
Alexander Barton
d052fdff78 Release 0.9.0 2005-07-24 21:14:19 +00:00
Alexander Barton
fe9525d105 Eliminate some compiler warnings ("unused parameter"). [from HEAD] 2005-07-24 21:06:51 +00:00
Alexander Barton
5b29518ae5 Updated documentation. [from HEAD] 2005-07-09 14:41:39 +00:00
Alexander Barton
b715a5f061 ngIRCd 0.9.0-pre1 2005-07-09 11:57:07 +00:00
Alexander Barton
0b31b46353 Preparations for ngIRCd 0.9.0 :-) 2005-07-09 11:50:29 +00:00
Alexander Barton
8a7ae2dfc1 Prepare for "new upstream release". 2005-07-09 11:20:05 +00:00
Alexander Barton
01ee1bdf2c Updated documentation. 2005-07-09 11:16:38 +00:00
Alexander Barton
13ee3e62be Only setuid()/setgid() if it differs from current UID/GID.
Solves problems with Cygwin. [from HEAD]
2005-07-08 23:20:04 +00:00
Alexander Barton
fc038ae444 Use "ServerUID" (and not internal variable name) for error message. [HEAD] 2005-07-08 21:05:19 +00:00
Alexander Barton
8d1fe3b89a Updated documentation. 2005-07-08 12:50:43 +00:00
Alexander Barton
d74029851f Fixed maximum length of user names, now allow up to 9 characters. [from HEAD] 2005-07-05 22:58:25 +00:00
Alexander Barton
8ff1a4b666 Cut off oversized IRC messages that should be sent to the network instead
of shuttding down the (wrong) connection. [from HEAD]
2005-07-02 14:45:07 +00:00
Alexander Barton
5f68d5f1e1 New constant "CUT_TXTSUFFIX". [from HEAD] 2005-07-02 14:44:36 +00:00
Alexander Barton
db2a41e5bc Moving towards ngIRCd 0.0.9! :-) 2005-06-27 16:12:51 +00:00
112 changed files with 5376 additions and 7498 deletions

View File

@@ -1,7 +0,0 @@
Makefile
Makefile.in
aclocal.m4
autom4te.cache
config.log
config.status
configure

12
AUTHORS
View File

@@ -1,7 +1,7 @@
ngIRCd - Next Generation IRC Server
(c)2001-2007 Alexander Barton,
(c)2001-2005 Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd is free software and published under the
@@ -10,16 +10,9 @@
-- AUTHORS and CONTRIBUTORS --
Note: If you have critics, patches or something else, please feel free to
post a mail to the ngIRCd mailing list: <ngircd-ml@arthur.ath.cx> (please see
<http://ngircd.barton.de/#ml> for details). Don't mail the contributors
directly, if possible!
Main Authors
~~~~~~~~~~~~
Alexander Barton, <alex@barton.de> (alex)
Florian Westphal, <westphal@foo.fh-furtwangen.de> (fw)
Contributors
@@ -28,6 +21,7 @@ Goetz Hoffart, <goetz@hoffart.de> (goetz)
Ilja Osthoff, <i.osthoff@gmx.net> (ilja)
Benjamin Pineau, <ben@zouh.org>
Sean Reifschneider, <jafo-rpms@tummy.com>
Florian Westphal, <westphal@foo.fh-furtwangen.de> (fw)
Code snippets
@@ -38,4 +32,4 @@ Andrew Tridgell & Martin Pool: strl{cpy|cat}()-functions
--
$Id: AUTHORS,v 1.13 2007/10/04 15:18:48 alex Exp $
$Id: AUTHORS,v 1.11 2005/03/19 14:24:52 alex Exp $

121
ChangeLog
View File

@@ -1,7 +1,7 @@
ngIRCd - Next Generation IRC Server
(c)2001-2008 Alexander Barton,
(c)2001-2005 Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd is free software and published under the
@@ -10,122 +10,9 @@
-- ChangeLog --
ngIRCd 0.11.1 (2008-02-26)
- Fix sending of JOIN commands between servers when remote server appended
mode flags. (Rolf Eike Beer) [from HEAD]
- Send "G" instead of "H" flag in WHO replies. (reported by Dana Dahlstrom)
- Under some circumstances ngIRCd issued channel MODE message with a
trailing space. (Dana Dahlstrom) [from HEAD]
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].
ngIRCd 0.11.0-pre1 (2008-01-02)
- Use dotted-decimal IP address if hostname is >= 64.
- Add support for /STAT u (server uptime) command.
- New [Server] configuration Option "Bind" allows to specify
the source ip adress to use when connecting to remote server.
- New configuration option "MaxNickLength" to specify the allowed maximum
length of user nick names. Note: must be unique in an IRC network!
- Enhanced the IRC+ protocol to support an enhanced "server handshake" and
enable server to recognice numeric 005 (ISUPPORT) and 376 (ENDOFMOTD).
See doc/Protocol.txt for details.
- Re-added doc/SSL.txt to distribution -- got lost somewhere!?
- Fixes the wrong logging output when nested servers are introduced
to the network as well as the wrong output of the LINKS command.
- Update Mac OS X Xcode project file for Xcode 3.
- Adjust test suite to be usable on HP/UX 11.11 :-)
- Fix code to compile using K&R C compiler and ansi2kr again.
- New config option NoDNS: Disables DNS lookups when clients connect.
- Fixed propagation of channel mode 'P' on server links.
- Numeric 317: implemented "signon time" (displayed in WHOIS result).
- Fixed code that prevented GCC 2.95 to compile ngIRCd.
- Adjust path names in manual pages according to "./configure" settings.
- Added new server configuration option "Passive" for "Server" blocks to
disable automatic outgoing connections (similar to -p option to ngircd,
but only for the specified server). (Tassilo Schweyer)
- Don't connect to a server if a connection to another server within the
same group is already in progress.
- Added support for the WALLOPS command. Usage is restricted to IRC
operators.
ngIRCd 0.10.4 (2008-01-07)
- SECURITY: IRC_PART could reference invalid memory, causing
ngircd to crash [from HEAD].
ngIRCd 0.10.3 (2007-08-01)
- SECURITY: Fixed a severe bug in handling JOIN commands, which could
cause the server to crash. Thanks to Sebastian Vesper, <net@veoson.net>.
ngIRCd 0.10.2 (2007-06-08)
ngIRCd 0.10.2-pre2 (2007-05-19)
- Server links are allowed to use larger write buffers now (up to 50 KB).
ngIRCd 0.10.2-pre1 (2007-05-05)
- Fix compressed server links (broken since 0.10.0).
- Predefined Channel configuration now allows specification of channel key
(mode k) and maximum user count (mode l).
- When using epoll() IO interface, compile in the select() interface as
well and fall back to it when epoll() isn't available on runtime.
- New configure option "--without-select" to disable select() IO API
(even when using epoll(), see above).
- Added support for IO APIs "poll()" and "/dev/poll".
- Reorganized internal handling of invite and ban lists.
ngIRCd 0.10.1 (2006-12-17)
- Fixed validation of server names containing digits.
- Update the "info text" of the local server after re-reading configuration.
- Changed Numerics 265 and 266 to follow ircd 2.11.x "standards".
- Allow PASS syntax defined in RFC 1459 for server links, too.
- Enhanced ISUPPORT message (005 numeric).
- New configuration option "PredefChannelsOnly": if set, clients can only
join predefined channels.
- Code cleanups: use "LogDebug(...)" instead of "Log(LOG_DEBUG, ...)", use
"strcspn()", unsigned vs. signed, use "const", fix whitespaces, ...
ngIRCd 0.10.0 (2006-10-01)
- Fixed file handle leak when daemon is not able to send MOTD to a client.
ngIRCd 0.10.0-pre2 (2006-09-09)
- Fixed build problems with GCC option -fstack-protector.
- Minor documentation updates.
ngIRCd 0.10.0-pre1 (2006-08-02)
- Validate "ServerName" (see RFC 2812, section 2.3.1).
- Enhanced DIE to accept a single parameter ("comment text") which is sent
to all locally connected clients before the server goes down.
- The ngIRCd handles time shifts backwards more gracefully now (the
timeout handling doesn't disconnect clients by mistake any more).
- Internal: Restructured connection handling (the connection ID is equal
to the file descriptor of the connection).
- Internal: Simplified resolver code.
- JOIN now supports more than one channel key at a time.
- Implemented numeric "333": Time and user name who set a channel topic.
- Enhanced the handler for PING and PONG commands: fix forwarding and enable
back-passing of a client supplied additional argument of PING.
- Changed handling of timeouts for unregistered connections: don't reset
the counter if data is received and disconnect clients earlier.
- Removed unnecessary #define of "LOCAL", now use plain C "static" instead.
- Channel topics are no longer limited to 127 characters: now the only limit
is the maximum length of an IRC command, i. e. 512 bytes (in practice, this
limits the topic to about 490 characters due to protocol overhead).
- Reverse DNS lookup code now checks the result by doing an additional
lookup to prevent spoofing.
- Added new IO layer which (optionally) supports epoll() and kqueue() in
addition to the select() interface.
ngIRCd 0.9.2 (2005-10-15)
- Fixed a bug that could cause the daemon to crash when outgoing server
- Fixed a bug that could cause the damon to crash when outgoing server
connections can't be established.
- Fixed a bug that caused the daemon to leak file descriptors when no
resolver subprocesses could be created.
@@ -145,7 +32,7 @@ ngIRCd 0.9.0 (2005-07-24)
ngIRCd 0.9.0-pre1 (2005-07-09)
- Fixed maximum length of user names, now allow up to 9 characters.
- Cut off oversized IRC messages that should be sent to the network instead
of shutting down the (wrong) connection.
of shuttding down the (wrong) connection.
- Don't generate error messages for unknown commands received before the
client is registered with the server (like the original ircd).
- Never run with root privileges but always switch the user ID.
@@ -742,4 +629,4 @@ ngIRCd 0.0.1, 31.12.2001
--
$Id: ChangeLog,v 1.332.2.11 2008/02/26 20:35:05 alex Exp $
$Id: ChangeLog,v 1.276.2.12 2005/10/15 12:44:08 alex Exp $

76
INSTALL
View File

@@ -1,7 +1,7 @@
ngIRCd - Next Generation IRC Server
(c)2001-2007 Alexander Barton,
(c)2001-2004 by Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd is free software and published under the
@@ -14,12 +14,6 @@
I. Upgrade Information
~~~~~~~~~~~~~~~~~~~~~~
Differences to version 0.9.x
- The option of the configure script to enable support for Zeroconf/Bonjour/
Rendezvous/WhateverItIsNamedToday has been renamed:
--with-rendezvous -> --with-zeroconf
Differences to version 0.8.x
- The maximum length of passwords has been raised to 20 characters (instead
@@ -127,65 +121,7 @@ This files will be installed by default:
- /usr/local/share/doc/ngircd/: documentation
III. Additional features
~~~~~~~~~~~~~~~~~~~~~~~~
The following optional features can be compiled into the daemon by passing
options to the "configure" script. Most options can handle a <path> argument
which will be used to search for the required libraries and header files in
the given paths ("<path>/lib/...", "<path>/include/...") in addition to the
standard locations.
* Syslog Logging (autodetected by default):
--with-syslog[=<path>] / --without-syslog
Enable (disable) support for logging to "syslog", which should be
available on most modern UNIX-like operating systems by default.
* ZLib Compression (autodetected by default):
--with-zlib[=<path>] / --without-zlib
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[=<path>] / --without-select
--with-poll[=<path>] / --without-poll
--with-devpoll[=<path>] / --without-devpoll
--with-epoll[=<path>] / --without-epoll
--with-kqueue[=<path>] / --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
more efficient and flexible epoll() (Linux >=2.6), kqueue() (BSD) and
/dev/poll APIs.
By default the IO backend is autodetected, but you can use "--without-xxx"
to disable a more enhanced API.
When using the epoll() API, support for select() is compiled in as well by
default to enable the binary to run on older Linux kernels (<2.6), too.
* IDENT-Support:
--with-ident[=<path>]
Include support for IDENT ("AUTH") lookups. The "ident" library is
required for this option.
* ZeroConf Support:
--with-zeroconf[=<path>]
Compile ngIRCd with support for ZeroConf multicast DNS service registration.
Either the Apple ZeroConf implementation (e. g. Mac OS X) or the Howl
library is required. Which one is available is autodetected.
* TCP-Wrappers:
--with-tcp-wrappers[=<path>]
Include support for Wietse Venemas "TCP Wrappers" to limit client access
to the daemon, for example by using "/etc/hosts.{allow|deny}".
The "libwrap" is required for this option.
IV. Useful make-targets
II. Useful make-targets
~~~~~~~~~~~~~~~~~~~~~~~
The Makefile produced by the configure-script contains always these useful
@@ -201,8 +137,8 @@ targets:
next step: -> ./autogen.sh
V. Sample configuration file ngircd.conf
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
III. Sample configuration file ngircd.conf
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In the sample configuration file, there are comments beginning with "#" OR
";" -- this is only for the better understanding of the file.
@@ -222,7 +158,7 @@ The meaning of the variables in the configuration file is explained in the
and in the "ngircd.conf" manual page.
VI. Command line options
IV. Command line options
~~~~~~~~~~~~~~~~~~~~~~~~
These parameters could be passed to the ngIRCd:
@@ -247,4 +183,4 @@ number. In both cases the server exits after the output.
--
$Id: INSTALL,v 1.26 2007/04/08 11:39:08 alex Exp $
$Id: INSTALL,v 1.21 2005/02/10 08:20:09 alex Exp $

View File

@@ -8,7 +8,7 @@
# (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information.
#
# $Id: Makefile.am,v 1.17 2005/07/22 21:01:52 alex Exp $
# $Id: Makefile.am,v 1.16 2005/04/09 12:27:40 alex Exp $
#
AUTOMAKE_OPTIONS = gnu
@@ -28,7 +28,7 @@ lint:
make -C src/ngircd lint
srcdoc:
make -C doc srcdoc
make -C src srcdoc
xcode:
@xcodebuild -project contrib/MacOSX/ngIRCd.xcode -list >/dev/null 2>&1 \

47
NEWS
View File

@@ -1,7 +1,7 @@
ngIRCd - Next Generation IRC Server
(c)2001-2008 Alexander Barton,
(c)2001-2005 Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd is free software and published under the
@@ -10,49 +10,6 @@
-- NEWS --
ngIRCd 0.11.0 (2008-01-15)
- Add support for /STAT u (server uptime) command.
- New [Server] configuration Option "Bind" allows to specify
the source ip adress to use when connecting to remote server.
- New configuration option "MaxNickLength" to specify the allowed maximum
length of user nick names. Note: must be unique in an IRC network!
- Numeric 317: implemented "signon time" (displayed in WHOIS result).
- Added new server configuration option "Passive" for "Server" blocks to
disable automatic outgoing connections (similar to -p option to ngircd,
but only for the specified server). (Tassilo Schweyer)
- Added support for the WALLOPS command. Usage is restricted to IRC
operators.
ngIRCd 0.10.2 (2007-06-08)
- Predefined channel configuration now allows specification of channel key
(mode k) and maximum user count (mode l): variables "Key" and "MaxUsers".
- When using the epoll() IO interface, compile in the select() interface as
well and fall back to it when epoll() isn't available on runtime.
- Added support for IO APIs "poll()" and "/dev/poll".
ngIRCd 0.10.1 (2006-12-17)
- Allow PASS syntax defined in RFC 1459 for server links, too.
- New configuration option "PredefChannelsOnly": if set, clients can only
join predefined channels.
ngIRCd 0.10.0 (2006-10-01)
ngIRCd 0.10.0-pre1 (2006-08-02)
- Enhanced DIE to accept a single parameter ("comment text") which is sent
to all locally connected clients before the server goes down.
- JOIN now supports more than one channel key at a time.
- Implemented numeric "333": Time and user name who set a channel topic.
- Channel topics are no longer limited to 127 characters: now the only limit
is the maximum length of an IRC command, i. e. 512 bytes (in practice, this
limits the topic to about 490 characters due to protocol overhead).
- Reverse DNS lookup code now checks the result by doing an additional
lookup to prevent spoofing.
- Added new IO layer which (optionally) supports epoll() and kqueue() in
addition to the select() interface.
ngIRCd 0.9.0 (2005-07-24)
- Never run with root privileges but always switch the user ID.
@@ -251,4 +208,4 @@ ngIRCd 0.0.1, 31.12.2001
--
$Id: NEWS,v 1.83.2.4 2008/02/26 19:22:07 alex Exp $
$Id: NEWS,v 1.74.2.1 2005/07/24 21:39:45 alex Exp $

12
README
View File

@@ -1,7 +1,7 @@
ngIRCd - Next Generation IRC Server
(c)2001-2007 Alexander Barton,
(c)2001-2005 Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd is free software and published under the
@@ -19,8 +19,6 @@ Licence (URL: http://www.gnu.org/licenses/gpl.html). ngIRCd means "next
generation IRC daemon", it's written from scratch and not deduced from the
"grandfather of IRC daemons", the daemon of the IRCNet.
Please see the INSTALL document for installation and upgrade information!
II. Status
~~~~~~~~~~~
@@ -37,8 +35,7 @@ Implemented IRC-commands are:
ADMIN, AWAY, CHANINFO, CONNECT, DIE, DISCONNECT, ERROR, HELP, INVITE, ISON,
JOIN, KICK, KILL, LINKS, LIST, LUSERS, MODE, MOTD, NAMES, NICK, NJOIN, NOTICE,
OPER, PART, PASS, PING, PONG, PRIVMSG, QUIT, REHASH, RESTART, SERVER, SQUIT,
STATS, TIME, TOPIC, TRACE, USER, USERHOST, VERSION, WALLOPS, WHO, WHOIS,
WHOWAS.
STATS, TIME, TOPIC, TRACE, USER, USERHOST, VERSION, WHO, WHOIS, WHOWAS.
III. Features (or: why use ngIRCd?)
@@ -83,9 +80,8 @@ them at the following URL:
There you can read about known bugs and limitations, too.
If you have critics, patches or something else, please feel free to post a
mail to the ngIRCd mailing list: <ngircd-ml@arthur.ath.cx> (please see
<http://ngircd.barton.de/#ml> for details).
mail to <alex@barton.de>.
--
$Id: README,v 1.25 2007/10/04 15:18:48 alex Exp $
$Id: README,v 1.20.2.1 2005/07/09 14:41:39 alex Exp $

View File

@@ -9,7 +9,7 @@
# (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information.
#
# $Id: autogen.sh,v 1.15 2007/10/07 13:02:15 alex Exp $
# $Id: autogen.sh,v 1.14 2005/02/21 15:23:23 alex Exp $
#
#
@@ -124,22 +124,17 @@ if [ -z "$EXIST" ]; then
fi
[ "$VERBOSE" = "1" ] && echo "Using \"$EXIST\" to test for tools."
# We want to use GNU automake 1.9, if available (WANT_AUTOMAKE is used by
# We want to use GNU automake 1.7, if available (WANT_AUTOMAKE is used by
# the wrapper scripts of Gentoo Linux, AUTOMAKE_VERSION is used by OpenBSD);
# same applies for GNU autoconf, we want to use version 2.59. -- But only
# set these preferences if not already set!
if [ -z "$AUTOMAKE_VERSION" -a -z "$WANT_AUTOMAKE" ]; then
AUTOMAKE_VERSION=1.9
WANT_AUTOMAKE=1.9
fi
if [ -z "$AUTOCONF_VERSION" -a -z "$WANT_AUTOCONF" ]; then
AUTOCONF_VERSION=2.59
WANT_AUTOCONF=2.59
fi
export AUTOMAKE_VERSION WANT_AUTOMAKE AUTOCONF_VERSION WANT_AUTOCONF
# same applies for GNU autoconf, we want to use version 2.59.
AUTOMAKE_VERSION=1.7
AUTOCONF_VERSION=2.59
export AUTOMAKE_VERSION AUTOCONF_VERSION
WANT_AUTOMAKE=1.7
export WANT_AUTOMAKE
# Try to detect the needed tools when no environment variable already
# specifies one:
# spezifies one:
echo "Searching tools ..."
[ -z "$ACLOCAL" ] && ACLOCAL=`Search aclocal 1`
[ "$VERBOSE" = "1" ] && echo "ACLOCAL=$ACLOCAL"

599
config.guess vendored

File diff suppressed because it is too large Load Diff

137
config.sub vendored
View File

@@ -1,10 +1,9 @@
#! /bin/sh
# Configuration validation subroutine script.
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
# Inc.
# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
timestamp='2007-01-18'
timestamp='2005-04-22'
# This file is (in principle) common to ALL GNU software.
# The presence of a machine in this file suggests that SOME GNU software
@@ -22,15 +21,14 @@ timestamp='2007-01-18'
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
# 02110-1301, USA.
#
# Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
# 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.
# Please send patches to <config-patches@gnu.org>. Submit a context
# diff and a properly formatted ChangeLog entry.
#
@@ -85,11 +83,11 @@ Try \`$me --help' for more information."
while test $# -gt 0 ; do
case $1 in
--time-stamp | --time* | -t )
echo "$timestamp" ; exit ;;
echo "$timestamp" ; exit 0 ;;
--version | -v )
echo "$version" ; exit ;;
echo "$version" ; exit 0 ;;
--help | --h* | -h )
echo "$usage"; exit ;;
echo "$usage"; exit 0 ;;
-- ) # Stop option processing
shift; break ;;
- ) # Use stdin as input.
@@ -101,7 +99,7 @@ while test $# -gt 0 ; do
*local*)
# First pass through any local machine types.
echo $1
exit ;;
exit 0;;
* )
break ;;
@@ -120,9 +118,8 @@ esac
# Here we must recognize all the valid KERNEL-OS combinations.
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
case $maybe_os in
nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
storm-chaos* | os2-emx* | rtmk-nova*)
nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \
kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
os=-$maybe_os
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
;;
@@ -173,10 +170,6 @@ case $os in
-hiux*)
os=-hiuxwe2
;;
-sco6)
os=-sco5v6
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-sco5)
os=-sco3.2v5
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
@@ -193,10 +186,6 @@ case $os in
# Don't forget version if it is 3.2v4 or newer.
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-sco5v6*)
# Don't forget version if it is 3.2v4 or newer.
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-sco*)
os=-sco3.2v2
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
@@ -241,16 +230,15 @@ 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 \
| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
| bfin \
| c4x | clipper \
| d10v | d30v | dlx | dsp16xx \
| fido | fr30 | frv \
| fr30 | frv \
| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
| i370 | i860 | i960 | ia64 \
| ip2k | iq2000 \
| m32c | m32r | m32rle | m68000 | m68k | m88k \
| maxq | mb | microblaze | mcore | mep \
| m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \
| mips | mipsbe | mipseb | mipsel | mipsle \
| mips16 \
| mips64 | mips64el \
@@ -259,7 +247,6 @@ case $basic_machine in
| mips64vr4100 | mips64vr4100el \
| mips64vr4300 | mips64vr4300el \
| mips64vr5000 | mips64vr5000el \
| mips64vr5900 | mips64vr5900el \
| mipsisa32 | mipsisa32el \
| mipsisa32r2 | mipsisa32r2el \
| mipsisa64 | mipsisa64el \
@@ -268,24 +255,21 @@ case $basic_machine in
| mipsisa64sr71k | mipsisa64sr71kel \
| mipstx39 | mipstx39el \
| mn10200 | mn10300 \
| mt \
| msp430 \
| nios | nios2 \
| ns16k | ns32k \
| or32 \
| openrisc | or32 \
| pdp10 | pdp11 | pj | pjl \
| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
| pyramid \
| score \
| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
| sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
| sh64 | sh64le \
| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
| spu | strongarm \
| sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \
| sparcv8 | sparcv9 | sparcv9b \
| strongarm \
| tahoe | thumb | tic4x | tic80 | tron \
| v850 | v850e \
| we32k \
| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
| x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
| z8k)
basic_machine=$basic_machine-unknown
;;
@@ -296,9 +280,6 @@ case $basic_machine in
;;
m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
;;
ms1)
basic_machine=mt-unknown
;;
# We use `pc' rather than `unknown'
# because (1) that's what they normally are, and
@@ -318,18 +299,18 @@ case $basic_machine in
| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
| arm-* | armbe-* | armle-* | armeb-* | armv*-* \
| avr-* | avr32-* \
| avr-* \
| bfin-* | bs2000-* \
| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
| clipper-* | craynv-* | cydra-* \
| d10v-* | d30v-* | dlx-* \
| elxsi-* \
| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
| h8300-* | h8500-* \
| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
| i*86-* | i860-* | i960-* | ia64-* \
| ip2k-* | iq2000-* \
| m32c-* | m32r-* | m32rle-* \
| m32r-* | m32rle-* \
| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
| m88110-* | m88k-* | maxq-* | mcore-* \
| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
@@ -340,7 +321,6 @@ case $basic_machine in
| mips64vr4100-* | mips64vr4100el-* \
| mips64vr4300-* | mips64vr4300el-* \
| mips64vr5000-* | mips64vr5000el-* \
| mips64vr5900-* | mips64vr5900el-* \
| mipsisa32-* | mipsisa32el-* \
| mipsisa32r2-* | mipsisa32r2el-* \
| mipsisa64-* | mipsisa64el-* \
@@ -349,26 +329,24 @@ case $basic_machine in
| mipsisa64sr71k-* | mipsisa64sr71kel-* \
| mipstx39-* | mipstx39el-* \
| mmix-* \
| mt-* \
| msp430-* \
| nios-* | nios2-* \
| none-* | np1-* | ns16k-* | ns32k-* \
| orion-* \
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
| pyramid-* \
| romp-* | rs6000-* \
| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
| sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \
| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
| sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \
| sparclite-* \
| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
| sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
| tahoe-* | thumb-* \
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
| tron-* \
| v850-* | v850e-* | vax-* \
| we32k-* \
| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
| x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
| xstormy16-* | xtensa-* \
| ymp-* \
| z8k-*)
@@ -708,9 +686,6 @@ case $basic_machine in
basic_machine=i386-pc
os=-msdos
;;
ms1-*)
basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
;;
mvs)
basic_machine=i370-ibm
os=-mvs
@@ -786,8 +761,9 @@ case $basic_machine in
basic_machine=hppa1.1-oki
os=-proelf
;;
openrisc | openrisc-*)
or32 | or32-*)
basic_machine=or32-unknown
os=-coff
;;
os400)
basic_machine=powerpc-ibm
@@ -818,12 +794,6 @@ case $basic_machine in
pc532 | pc532-*)
basic_machine=ns32k-pc532
;;
pc98)
basic_machine=i386-pc
;;
pc98-*)
basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
pentium | p5 | k5 | k6 | nexgen | viac3)
basic_machine=i586-pc
;;
@@ -880,10 +850,6 @@ case $basic_machine in
basic_machine=i586-unknown
os=-pw32
;;
rdos)
basic_machine=i386-pc
os=-rdos
;;
rom68k)
basic_machine=m68k-rom68k
os=-coff
@@ -910,10 +876,6 @@ case $basic_machine in
sb1el)
basic_machine=mipsisa64sb1el-unknown
;;
sde)
basic_machine=mipsisa32-sde
os=-elf
;;
sei)
basic_machine=mips-sei
os=-seiux
@@ -925,9 +887,6 @@ case $basic_machine in
basic_machine=sh-hitachi
os=-hms
;;
sh5el)
basic_machine=sh5le-unknown
;;
sh64)
basic_machine=sh64-unknown
;;
@@ -1130,10 +1089,13 @@ case $basic_machine in
we32k)
basic_machine=we32k-att
;;
sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele)
basic_machine=sh-unknown
;;
sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
sh64)
basic_machine=sh64-unknown
;;
sparc | sparcv8 | sparcv9 | sparcv9b)
basic_machine=sparc-sun
;;
cydra)
@@ -1206,23 +1168,20 @@ case $os in
| -aos* \
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
| -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
| -openbsd* | -solidbsd* \
| -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \
| -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
| -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
| -chorusos* | -chorusrdb* \
| -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
| -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
| -uxpv* | -beos* | -mpeix* | -udk* \
| -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \
| -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
| -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
| -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
| -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
| -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
| -skyos* | -haiku* | -rdos* | -toppers* | -drops*)
| -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*)
# Remember, each alternative MUST END IN *, to match a version number.
;;
-qnx*)
@@ -1240,7 +1199,7 @@ case $os in
os=`echo $os | sed -e 's|nto|nto-qnx|'`
;;
-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
| -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
| -windows* | -osx | -abug | -netware* | -os9* | -beos* \
| -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
;;
-mac*)
@@ -1374,12 +1333,6 @@ else
# system, and we'll never get to this point.
case $basic_machine in
score-*)
os=-elf
;;
spu-*)
os=-elf
;;
*-acorn)
os=-riscix1.2
;;
@@ -1389,9 +1342,9 @@ case $basic_machine in
arm*-semi)
os=-aout
;;
c4x-* | tic4x-*)
os=-coff
;;
c4x-* | tic4x-*)
os=-coff
;;
# This must come before the *-dec entry.
pdp10-*)
os=-tops20
@@ -1417,9 +1370,6 @@ case $basic_machine in
m68*-cisco)
os=-aout
;;
mep-*)
os=-elf
;;
mips*-cisco)
os=-elf
;;
@@ -1438,9 +1388,6 @@ case $basic_machine in
*-be)
os=-beos
;;
*-haiku)
os=-haiku
;;
*-ibm)
os=-aix
;;
@@ -1612,7 +1559,7 @@ case $basic_machine in
esac
echo $basic_machine$os
exit
exit 0
# Local variables:
# eval: (add-hook 'write-file-hooks 'time-stamp)

View File

@@ -1,6 +1,6 @@
#
# ngIRCd -- The Next Generation IRC Daemon
# Copyright (c)2001-2008 Alexander Barton <alex@barton.de>
# Copyright (c)2001-2005 Alexander Barton <alex@barton.de>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -8,13 +8,13 @@
# (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information.
#
# $Id: configure.in,v 1.125.2.4 2008/02/26 19:37:34 alex Exp $
# $Id: configure.in,v 1.111.2.6 2005/10/15 12:44:08 alex Exp $
#
# -- Initialisation --
AC_PREREQ(2.50)
AC_INIT(ngircd, 0.11.1)
AC_INIT(ngircd, 0.9.2)
AC_CONFIG_SRCDIR(src/ngircd/ngircd.c)
AC_CANONICAL_TARGET
AM_INIT_AUTOMAKE(1.6)
@@ -30,7 +30,7 @@ AH_TEMPLATE([SYSLOG], [Define if syslog should be used for logging])
AH_TEMPLATE([ZLIB], [Define if zlib compression should be enabled])
AH_TEMPLATE([TCPWRAP], [Define if TCP wrappers should be used])
AH_TEMPLATE([IRCPLUS], [Define if IRC+ protocol should be used])
AH_TEMPLATE([ZEROCONF], [Define if support for Zeroconf should be included])
AH_TEMPLATE([RENDEZVOUS], [Define if Rendezvous support should be included])
AH_TEMPLATE([IDENTAUTH], [Define if the server should do IDENT requests])
AH_TEMPLATE([TARGET_OS], [Target operating system name])
@@ -53,31 +53,12 @@ AC_PROG_RANLIB
AM_C_PROTOTYPES
AC_C_CONST
AC_C_INLINE
# -- Hard coded system and compiler dependencies/features/options ... --
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
])
if test "$GCC" = "yes"; then
# We are using the GNU C compiler. Good!
CFLAGS="$CFLAGS -pipe -W -Wall -Wpointer-arith -Wstrict-prototypes"
GCC_STACK_PROTECT_CC
fi
case "$target_os" in
@@ -124,7 +105,6 @@ AC_TRY_COMPILE([
AC_TYPE_SIGNAL
AC_TYPE_SIZE_T
# -- Libraries --
AC_CHECK_LIB(UTIL,memmove)
@@ -138,14 +118,16 @@ AC_FUNC_STRFTIME
AC_CHECK_FUNCS([ \
bind gethostbyaddr gethostbyname gethostname inet_ntoa malloc memmove \
memset realloc setsid setsockopt socket strcasecmp strchr strcspn strerror \
memset realloc setsid setsockopt socket strcasecmp strchr strerror \
strstr waitpid],,AC_MSG_ERROR([required function missing!]))
AC_CHECK_FUNCS(inet_aton isdigit sigaction snprintf vsnprintf strdup strlcpy strlcat)
# -- Configuration options --
AC_CHECK_FUNCS(select,[AC_CHECK_HEADERS(sys/select.h)],
AC_MSG_ERROR([required function select() is missing!])
)
# use syslog?
# -- Configuration options --
x_syslog_on=no
AC_ARG_WITH(syslog,
@@ -172,8 +154,6 @@ if test "$x_syslog_on" = "yes"; then
AC_CHECK_HEADERS(syslog.h,,AC_MSG_ERROR([required C header missing!]))
fi
# use zlib compression?
x_zlib_on=no
AC_ARG_WITH(zlib,
[ --without-zlib disable zlib compression (autodetected by default)],
@@ -198,121 +178,6 @@ if test "$x_zlib_on" = "yes"; then
AC_CHECK_HEADERS(zlib.h,,AC_MSG_ERROR([required C header missing!]))
fi
# detect which IO API to use:
x_io_backend=none
AC_ARG_WITH(select,
[ --without-select disable select IO support (autodetected by default)],
[ if test "$withval" != "no"; then
if test "$withval" != "yes"; then
CFLAGS="-I$withval/include $CFLAGS"
CPPFLAGS="-I$withval/include $CPPFLAGS"
LDFLAGS="-L$withval/lib $LDFLAGS"
fi
AC_CHECK_FUNCS(select, x_io_select=yes,
AC_MSG_ERROR([Can't enable select IO support!])
)
fi
],
[
AC_CHECK_FUNCS(select, x_io_select=yes)
]
)
AC_ARG_WITH(poll,
[ --without-poll disable poll support (autodetected by default)],
[ if test "$withval" != "no"; then
if test "$withval" != "yes"; then
CFLAGS="-I$withval/include $CFLAGS"
CPPFLAGS="-I$withval/include $CPPFLAGS"
LDFLAGS="-L$withval/lib $LDFLAGS"
fi
AC_CHECK_FUNCS(poll, x_io_backend=poll\(\),
AC_MSG_ERROR([Can't enable poll IO support!])
)
fi
],
[
AC_CHECK_FUNCS(poll, x_io_backend=poll\(\))
]
)
AC_ARG_WITH(devpoll,
[ --without-devpoll disable /dev/poll IO support (autodetected by default)],
[ if test "$withval" != "no"; then
if test "$withval" != "yes"; then
CFLAGS="-I$withval/include $CFLAGS"
CPPFLAGS="-I$withval/include $CPPFLAGS"
LDFLAGS="-L$withval/lib $LDFLAGS"
fi
AC_CHECK_HEADERS(sys/devpoll.h,,AC_MSG_ERROR([required C header missing!]))
fi
],
[
AC_CHECK_HEADERS(sys/devpoll.h, x_io_backend=/dev/poll)
]
)
AC_ARG_WITH(epoll,
[ --without-epoll disable epoll IO support (autodetected by default)],
[ if test "$withval" != "no"; then
if test "$withval" != "yes"; then
CFLAGS="-I$withval/include $CFLAGS"
CPPFLAGS="-I$withval/include $CPPFLAGS"
LDFLAGS="-L$withval/lib $LDFLAGS"
fi
AC_CHECK_FUNCS(epoll_create, x_io_epoll=yes,
AC_MSG_ERROR([Can't enable epoll IO support!])
)
fi
],
[
AC_CHECK_FUNCS(epoll_create, x_io_epoll=yes)
]
)
AC_ARG_WITH(kqueue,
[ --without-kqueue disable kqueue IO support (autodetected by default)],
[ if test "$withval" != "no"; then
if test "$withval" != "yes"; then
CFLAGS="-I$withval/include $CFLAGS"
CPPFLAGS="-I$withval/include $CPPFLAGS"
LDFLAGS="-L$withval/lib $LDFLAGS"
fi
AC_CHECK_FUNCS(kqueue, x_io_backend=kqueue\(\),
AC_MSG_ERROR([Can't enable kqueue IO support!])
)
fi
],
[
AC_CHECK_FUNCS(kqueue, x_io_backend=kqueue\(\))
]
)
if test "$x_io_epoll" = "yes" -a "$x_io_select" = "yes"; then
# when epoll() and select() are available, we'll use both!
x_io_backend="epoll(), select()"
else
if test "$x_io_epoll" = "yes"; then
# we prefere epoll() if it is available
x_io_backend="epoll()"
else
if test "$x_io_select" = "yes" -a "$x_io_backend" = "none"; then
# we'll use select, when available and no "better"
# interface has been detected ...
x_io_backend="select()"
fi
fi
fi
if test "$x_io_backend" = "none"; then
AC_MSG_ERROR([No useabe IO API activated/found!?])
fi
# use TCP wrappers?
x_tcpwrap_on=no
AC_ARG_WITH(tcp-wrappers,
[ --with-tcp-wrappers enable TCP wrappers support],
@@ -342,37 +207,34 @@ int deny_severity = 0;
]
)
# include support for "zeroconf"?
x_zeroconf_on=no
AC_ARG_WITH(zeroconf,
[ --with-zeroconf enable support for "Zeroconf"],
x_rendezvous_on=no
AC_ARG_WITH(rendezvous,
[ --with-rendezvous enable support for "Rendezvous"],
[ if test "$withval" != "no"; then
if test "$withval" != "yes"; then
CFLAGS="-I$withval/include $CFLAGS"
CPPFLAGS="-I$withval/include $CPPFLAGS"
LDFLAGS="-L$withval/lib $LDFLAGS"
fi
AC_CHECK_FUNCS(DNSServiceRegistrationCreate, x_zeroconf_on=osx,
AC_CHECK_FUNCS(DNSServiceRegistrationCreate, x_rendezvous_on=osx,
[
AC_CHECK_LIB(pthread, pthread_mutexattr_init)
AC_CHECK_LIB(howl, sw_discovery_init)
AC_CHECK_FUNCS(sw_discovery_init, \
x_zeroconf_on=howl, \
AC_MSG_ERROR([Can't enable Zeroconf!]))
x_rendezvous_on=howl, \
AC_MSG_ERROR([Can't enable Rendezvous!]))
])
fi
]
)
if test "$x_zeroconf_on" = "osx"; then
if test "$x_rendezvous_on" = "osx"; then
AC_CHECK_HEADERS([DNSServiceDiscovery/DNSServiceDiscovery.h \
mach/port.h],,AC_MSG_ERROR([required C header missing!]))
AC_DEFINE(ZEROCONF, 1)
AC_DEFINE(RENDEZVOUS, 1)
fi
if test "$x_zeroconf_on" = "howl"; then
if test "$x_rendezvous_on" = "howl"; then
for dir in /usr/local/include /usr/local/include/howl* \
/usr/include /usr/include/howl* \
/usr/local/include/avahi* /usr/include/avahi*; do
/usr/include /usr/include/howl*; do
test -d "$dir" || continue
AC_MSG_CHECKING([for Howl headers in $dir])
if test -f "$dir/rendezvous/rendezvous.h"; then
@@ -389,11 +251,9 @@ if test "$x_zeroconf_on" = "howl"; then
done
AC_CHECK_HEADERS([rendezvous/rendezvous.h],, \
AC_MSG_ERROR([required C header missing!]))
AC_DEFINE(ZEROCONF, 1)
AC_DEFINE(RENDEZVOUS, 1)
fi
# do IDENT requests using libident?
x_identauth_on=no
AC_ARG_WITH(ident,
[ --with-ident enable "IDENT" ("AUTH") protocol support],
@@ -415,8 +275,6 @@ if test "$x_identauth_on" = "yes"; then
AC_CHECK_HEADERS(ident.h,,AC_MSG_ERROR([required C header missing!]))
fi
# compile in IRC+ protocol support?
x_ircplus_on=yes
AC_ARG_ENABLE(ircplus,
[ --disable-ircplus disable IRC+ protocol],
@@ -426,8 +284,6 @@ if test "$x_ircplus_on" = "yes"; then
AC_DEFINE(IRCPLUS, 1)
fi
# compile in IRC "sniffer"?
x_sniffer_on=no; x_debug_on=no
AC_ARG_ENABLE(sniffer,
[ --enable-sniffer enable IRC traffic sniffer (enables debug mode)],
@@ -437,8 +293,6 @@ AC_ARG_ENABLE(sniffer,
fi
)
# enable additional debugging code?
AC_ARG_ENABLE(debug,
[ --enable-debug show additional debug output],
if test "$enableval" = "yes"; then x_debug_on=yes; fi
@@ -448,8 +302,6 @@ if test "$x_debug_on" = "yes"; then
test "$GCC" = "yes" && CFLAGS="-pedantic $CFLAGS"
fi
# enable "strict RFC rules"?
x_strict_rfc_on=no
AC_ARG_ENABLE(strict-rfc,
[ --enable-strict-rfc strict RFC conformance -- may break clients!],
@@ -474,7 +326,6 @@ test -n "$CFLAGS_END" && CFLAGS="$CFLAGS $CFLAGS_END"
AC_OUTPUT([ \
Makefile \
doc/Makefile \
doc/src/Makefile \
src/Makefile \
src/portab/Makefile \
src/tool/Makefile \
@@ -523,8 +374,8 @@ echo
echo $ECHO_N " Syslog support: $ECHO_C"
test "$x_syslog_on" = "yes" \
&& echo $ECHO_N "yes $ECHO_C" \
|| echo $ECHO_N "no $ECHO_C"
&& echo $ECHO_N "yes $ECHO_C" \
|| echo $ECHO_N "no $ECHO_C"
echo $ECHO_N " Enable debug code: $ECHO_C"
test "$x_debug_on" = "yes" \
&& echo "yes" \
@@ -532,8 +383,8 @@ test "$x_debug_on" = "yes" \
echo $ECHO_N " zlib compression: $ECHO_C"
test "$x_zlib_on" = "yes" \
&& echo $ECHO_N "yes $ECHO_C" \
|| echo $ECHO_N "no $ECHO_C"
&& echo $ECHO_N "yes $ECHO_C" \
|| echo $ECHO_N "no $ECHO_C"
echo $ECHO_N " IRC sniffer: $ECHO_C"
test "$x_sniffer_on" = "yes" \
&& echo "yes" \
@@ -541,25 +392,17 @@ test "$x_sniffer_on" = "yes" \
echo $ECHO_N " Use TCP Wrappers: $ECHO_C"
test "$x_tcpwrap_on" = "yes" \
&& echo $ECHO_N "yes $ECHO_C" \
|| echo $ECHO_N "no $ECHO_C"
&& echo $ECHO_N "yes $ECHO_C" \
|| echo $ECHO_N "no $ECHO_C"
echo $ECHO_N " Strict RFC mode: $ECHO_C"
test "$x_strict_rfc_on" = "yes" \
&& echo "yes" \
|| echo "no"
echo $ECHO_N " Zeroconf support: $ECHO_C"
case "$x_zeroconf_on" in
osx)
echo $ECHO_N "Apple $ECHO_C"
;;
howl)
echo $ECHO_N "Howl $ECHO_C"
;;
*)
echo $ECHO_N "no $ECHO_C"
;;
esac
echo $ECHO_N " Rendezvous support: $ECHO_C"
test "$x_rendezvous_on" = "osx" -o "$x_rendezvous_on" = "howl" \
&& echo $ECHO_N "yes $ECHO_C" \
|| echo $ECHO_N "no $ECHO_C"
echo $ECHO_N " IRC+ protocol: $ECHO_C"
test "$x_ircplus_on" = "yes" \
&& echo "yes" \
@@ -567,11 +410,9 @@ test "$x_ircplus_on" = "yes" \
echo $ECHO_N " IDENT support: $ECHO_C"
test "$x_identauth_on" = "yes" \
&& echo $ECHO_N "yes $ECHO_C" \
|| echo $ECHO_N "no $ECHO_C"
echo $ECHO_N " I/O backend: $ECHO_C"
echo "\"$x_io_backend\""
&& echo $ECHO_N "yes $ECHO_C" \
|| echo $ECHO_N "no $ECHO_C"
echo
echo; echo
# -eof-

View File

@@ -1,2 +0,0 @@
Makefile
Makefile.in

View File

@@ -1,2 +0,0 @@
Makefile
Makefile.in

View File

@@ -1,59 +1,4 @@
ngircd (0.11.1-0ab1) unstable; urgency=low
* New "upstream" release 0.11.1.
-- Alexander Barton <alex@barton.de> Tue, 26 Feb 2008 20:24:55 +0100
ngircd (0.11.0-0ab1) unstable; urgency=low
* New "upstream" release 0.11.0.
-- Alexander Barton <alex@barton.de> Tue, 15 Jan 2008 21:43:46 +0100
ngircd (0.11.0-0ab0-pre2) unstable; urgency=low
* Second prerelease of upcoming new "upstream release".
-- Alexander Barton <alex@barton.de> Mon, 7 Jan 2008 15:32:42 +0100
ngircd (0.11.0-0ab0-pre1) unstable; urgency=low
* Prerelease of upcoming new "upstream release".
-- Alexander Barton <alex@barton.de> Wed, 2 Jan 2008 21:33:15 +0100
ngircd (0.10.4-0ab1) unstable; urgency=high
* New "upstream" release: 0.10.4 - fixing a security bug.
-- Alexander Barton <alex@barton.de> Mon, 7 Jan 2008 22:04:44 +0100
ngircd (0.10.0-0ab1) unstable; urgency=low
* New "upstream" release: 0.10.0
-- Alexander Barton <alex@barton.de> Sun, 1 Oct 2006 18:14:21 +0200
ngircd (0.10.0-0ab0-pre2-1) unstable; urgency=low
* Bumped standards version to 3.7.2.1.
* Added "Provides: ircd" to Debian control file.
-- Alexander Barton <alex@barton.de> Sun, 1 Oct 2006 16:25:33 +0200
ngircd (0.10.0-0ab0-pre2) unstable; urgency=low
* Second "upstream" prerelease of upcoming 0.10.0 release.
-- Alexander Barton <alex@barton.de> Sat, 9 Sep 2006 20:57:52 +0200
ngircd (0.10.0-0ab0-pre1) unstable; urgency=low
* Prerelease of upcoming new "upstream release".
-- Alexander Barton <alex@barton.de> Wed, 2 Aug 2006 12:01:07 +0200
ngircd (0.9.2-0ab1) unstable; urgency=low
ngircd (0.9.2-0ab1) stable; urgency=low
* New "upstream release" fixing a few bugs in 0.9.1.

View File

@@ -3,12 +3,11 @@ Section: net
Priority: optional
Maintainer: Alexander Barton <alex@barton.de>
Build-Depends: debhelper (>> 4.0.0), libz-dev, libwrap-dev, libident-dev
Standards-Version: 3.7.2.1
Standards-Version: 3.5.8
Package: ngircd
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Provides: ircd
Description: A lightweight daemon for the Internet Relay Chat (IRC)
ngIRCd is a free open source daemon for the Internet Relay Chat (IRC)
network. It is written from scratch and is not based upon the original
@@ -29,7 +28,6 @@ Description: A lightweight daemon for the Internet Relay Chat (IRC)
Package: ngircd-full
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Provides: ircd
Conflicts: ngircd
Description: A lightweight daemon for the Internet Relay Chat (IRC)
ngIRCd is a free open source daemon for the Internet Relay Chat (IRC)

View File

@@ -2,20 +2,9 @@
#
# ngIRCd start and stop script for Debian-based systems
#
# $Id: ngircd.init,v 1.7 2006/12/26 14:43:46 alex Exp $
# $Id: ngircd.init,v 1.5.2.1 2005/07/26 19:30:54 alex Exp $
#
### BEGIN INIT INFO
# Provides: ircd
# Required-Start: $local_fs
# Required-Stop: $local_fs
# Should-Start: $syslog $network
# Should-Stop: $syslog $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Next Generation IRC Server
### END INIT INFO
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/ngircd
NAME=ngIRCd

View File

@@ -1,20 +1,13 @@
#!/bin/sh
#
# Debian post-installation script
# $Id: ngircd.postinst,v 1.2 2006/12/26 14:44:40 alex Exp $
# $Id: ngircd.postinst,v 1.1 2003/12/31 17:20:11 alex Exp $
#
set -e
case "$1" in
configure)
if [ -f /etc/ngircd/ngircd.conf ]; then
# make sure that the configuration file is not
# world-readable, it contains passwords!
chmod o= /etc/ngircd/ngircd.conf
fi
;;
esac
if [ -f /etc/ngircd/ngircd.conf ]; then
# make sure that configuration file is not world readable
chmod o= /etc/ngircd/ngircd.conf
fi
#DEBHELPER#

View File

@@ -1,2 +0,0 @@
Makefile
Makefile.in

View File

@@ -1,92 +0,0 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001-2007 Alexander Barton (alex@barton.de).
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: config.h,v 1.1 2007/11/19 22:11:36 alex Exp $
*
* Static configuration file for Mac OS X Xcode project
*/
#define PACKAGE_NAME "ngircd"
#define VERSION "??"
#define SYSCONFDIR "/etc/ngircd"
/* -- Build options -- */
/* Define if debug-mode should be enabled */
#define DEBUG 1
/* Define if the server should do IDENT requests */
/*#define IDENTAUTH 1*/
/* Define if IRC+ protocol should be used */
#define IRCPLUS 1
/* Define if IRC sniffer should be enabled */
/*#define SNIFFER 1*/
/* Define if syslog should be used for logging */
#define SYSLOG 1
/* Define if TCP wrappers should be used */
/*#define TCPWRAP 1*/
/* Define if support for Zeroconf should be included */
/*#define ZEROCONF 1*/
/* Define if zlib compression should be enabled */
#define ZLIB 1
/* -- Supported features -- */
/* Define if SSP C support is enabled. */
#define ENABLE_SSP_CC 1
/* Define to 1 if the C compiler supports function prototypes. */
#define PROTOTYPES 1
/* Define like PROTOTYPES; this can be used by system headers. */
#define __PROTOTYPES 1
/* Define to 1 if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1
/* Define to 1 if you have the <inttypes.h> header file. */
#define HAVE_INTTYPES_H 1
/* Define to 1 if you have the <stddef.h> header file. */
#define HAVE_STDDEF_H 1
/* Define to 1 if you have the <stdbool.h> header file. */
#define HAVE_STDBOOL_H 1
/* Define to 1 if you have the <arpa/inet.h> header file. */
#define HAVE_ARPA_INET_H 1
/* Define to 1 if you have the `kqueue' function. */
#define HAVE_KQUEUE 1
/* Define to 1 if you have the `inet_ntoa' function. */
#define HAVE_INET_NTOA 1
/* Define to 1 if you have the `snprintf' function. */
#define HAVE_SNPRINTF 1
/* Define to 1 if you have the `strlcat' function. */
#define HAVE_STRLCAT 1
/* Define to 1 if you have the `strlcpy' function. */
#define HAVE_STRLCPY 1
/* Define to 1 if you have the `strdup' function. */
#define HAVE_STRDUP 1
/* Define to 1 if you have the `vsnprintf' function. */
#define HAVE_VSNPRINTF 1
/* Define if socklen_t exists */
#define HAVE_socklen_t 1
#ifdef ZEROCONF
/* Define to 1 if you have the <DNSServiceDiscovery/DNSServiceDiscovery.h> header file. */
#define HAVE_DNSSERVICEDISCOVERY_DNSSERVICEDISCOVERY_H 1
/* Define to 1 if you have the `DNSServiceRegistrationCreate' function. */
#define HAVE_DNSSERVICEREGISTRATIONCREATE 1
#endif
/* -eof- */

File diff suppressed because it is too large Load Diff

View File

@@ -1,683 +0,0 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 44;
objects = {
/* Begin PBXBuildFile section */
FA322D350CEF74B1001761B3 /* array.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CD90CEF74B1001761B3 /* array.c */; };
FA322D360CEF74B1001761B3 /* channel.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CDB0CEF74B1001761B3 /* channel.c */; };
FA322D370CEF74B1001761B3 /* client.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CDD0CEF74B1001761B3 /* client.c */; };
FA322D380CEF74B1001761B3 /* conf.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CDF0CEF74B1001761B3 /* conf.c */; };
FA322D390CEF74B1001761B3 /* conn-func.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CE10CEF74B1001761B3 /* conn-func.c */; };
FA322D3A0CEF74B1001761B3 /* conn-zip.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CE30CEF74B1001761B3 /* conn-zip.c */; };
FA322D3B0CEF74B1001761B3 /* conn.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CE50CEF74B1001761B3 /* conn.c */; };
FA322D3C0CEF74B1001761B3 /* hash.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CE80CEF74B1001761B3 /* hash.c */; };
FA322D3D0CEF74B1001761B3 /* io.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CEA0CEF74B1001761B3 /* io.c */; };
FA322D3E0CEF74B1001761B3 /* irc-channel.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CEC0CEF74B1001761B3 /* irc-channel.c */; };
FA322D3F0CEF74B1001761B3 /* irc-info.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CEE0CEF74B1001761B3 /* irc-info.c */; };
FA322D400CEF74B1001761B3 /* irc-login.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CF00CEF74B1001761B3 /* irc-login.c */; };
FA322D410CEF74B1001761B3 /* irc-mode.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CF20CEF74B1001761B3 /* irc-mode.c */; };
FA322D420CEF74B1001761B3 /* irc-op.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CF40CEF74B1001761B3 /* irc-op.c */; };
FA322D430CEF74B1001761B3 /* irc-oper.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CF60CEF74B1001761B3 /* irc-oper.c */; };
FA322D440CEF74B1001761B3 /* irc-server.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CF80CEF74B1001761B3 /* irc-server.c */; };
FA322D450CEF74B1001761B3 /* irc-write.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CFA0CEF74B1001761B3 /* irc-write.c */; };
FA322D460CEF74B1001761B3 /* irc.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CFC0CEF74B1001761B3 /* irc.c */; };
FA322D470CEF74B1001761B3 /* lists.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CFE0CEF74B1001761B3 /* lists.c */; };
FA322D480CEF74B1001761B3 /* log.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D000CEF74B1001761B3 /* log.c */; };
FA322D490CEF74B1001761B3 /* match.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D030CEF74B1001761B3 /* match.c */; };
FA322D4A0CEF74B1001761B3 /* ngircd.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D060CEF74B1001761B3 /* ngircd.c */; };
FA322D4B0CEF74B1001761B3 /* parse.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D080CEF74B1001761B3 /* parse.c */; };
FA322D4C0CEF74B1001761B3 /* rendezvous.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D0A0CEF74B1001761B3 /* rendezvous.c */; };
FA322D4D0CEF74B1001761B3 /* resolve.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D0C0CEF74B1001761B3 /* resolve.c */; };
FA322DBE0CEF7766001761B3 /* tool.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D330CEF74B1001761B3 /* tool.c */; };
FA322DC10CEF77CB001761B3 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FA322DC00CEF77CB001761B3 /* libz.dylib */; };
FAE5CC2E0CF2308A007D69B6 /* numeric.c in Sources */ = {isa = PBXBuildFile; fileRef = FAE5CC2D0CF2308A007D69B6 /* numeric.c */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
8DD76FAF0486AB0100D96B5E /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 8;
dstPath = /usr/share/man/man1/;
dstSubfolderSpec = 0;
files = (
);
runOnlyForDeploymentPostprocessing = 1;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
FA322BBA0CEF72E4001761B3 /* ngIRCd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ngIRCd; sourceTree = BUILT_PRODUCTS_DIR; };
FA322CD50CEF74B1001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
FA322CD60CEF74B1001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
FA322CD80CEF74B1001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
FA322CD90CEF74B1001761B3 /* array.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = array.c; sourceTree = "<group>"; };
FA322CDA0CEF74B1001761B3 /* array.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = array.h; sourceTree = "<group>"; };
FA322CDB0CEF74B1001761B3 /* channel.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = channel.c; sourceTree = "<group>"; };
FA322CDC0CEF74B1001761B3 /* channel.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = channel.h; sourceTree = "<group>"; };
FA322CDD0CEF74B1001761B3 /* client.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = client.c; sourceTree = "<group>"; };
FA322CDE0CEF74B1001761B3 /* client.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = client.h; sourceTree = "<group>"; };
FA322CDF0CEF74B1001761B3 /* conf.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = conf.c; sourceTree = "<group>"; };
FA322CE00CEF74B1001761B3 /* conf.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = conf.h; sourceTree = "<group>"; };
FA322CE10CEF74B1001761B3 /* conn-func.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "conn-func.c"; sourceTree = "<group>"; };
FA322CE20CEF74B1001761B3 /* conn-func.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "conn-func.h"; sourceTree = "<group>"; };
FA322CE30CEF74B1001761B3 /* conn-zip.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "conn-zip.c"; sourceTree = "<group>"; };
FA322CE40CEF74B1001761B3 /* conn-zip.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "conn-zip.h"; sourceTree = "<group>"; };
FA322CE50CEF74B1001761B3 /* conn.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = conn.c; sourceTree = "<group>"; };
FA322CE60CEF74B1001761B3 /* conn.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = conn.h; sourceTree = "<group>"; };
FA322CE70CEF74B1001761B3 /* defines.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = defines.h; sourceTree = "<group>"; };
FA322CE80CEF74B1001761B3 /* hash.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = hash.c; sourceTree = "<group>"; };
FA322CE90CEF74B1001761B3 /* hash.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = hash.h; sourceTree = "<group>"; };
FA322CEA0CEF74B1001761B3 /* io.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = io.c; sourceTree = "<group>"; };
FA322CEB0CEF74B1001761B3 /* io.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = io.h; sourceTree = "<group>"; };
FA322CEC0CEF74B1001761B3 /* irc-channel.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-channel.c"; sourceTree = "<group>"; };
FA322CED0CEF74B1001761B3 /* irc-channel.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-channel.h"; sourceTree = "<group>"; };
FA322CEE0CEF74B1001761B3 /* irc-info.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-info.c"; sourceTree = "<group>"; };
FA322CEF0CEF74B1001761B3 /* irc-info.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-info.h"; sourceTree = "<group>"; };
FA322CF00CEF74B1001761B3 /* irc-login.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-login.c"; sourceTree = "<group>"; };
FA322CF10CEF74B1001761B3 /* irc-login.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-login.h"; sourceTree = "<group>"; };
FA322CF20CEF74B1001761B3 /* irc-mode.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-mode.c"; sourceTree = "<group>"; };
FA322CF30CEF74B1001761B3 /* irc-mode.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-mode.h"; sourceTree = "<group>"; };
FA322CF40CEF74B1001761B3 /* irc-op.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-op.c"; sourceTree = "<group>"; };
FA322CF50CEF74B1001761B3 /* irc-op.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-op.h"; sourceTree = "<group>"; };
FA322CF60CEF74B1001761B3 /* irc-oper.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-oper.c"; sourceTree = "<group>"; };
FA322CF70CEF74B1001761B3 /* irc-oper.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-oper.h"; sourceTree = "<group>"; };
FA322CF80CEF74B1001761B3 /* irc-server.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-server.c"; sourceTree = "<group>"; };
FA322CF90CEF74B1001761B3 /* irc-server.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-server.h"; sourceTree = "<group>"; };
FA322CFA0CEF74B1001761B3 /* irc-write.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-write.c"; sourceTree = "<group>"; };
FA322CFB0CEF74B1001761B3 /* irc-write.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-write.h"; sourceTree = "<group>"; };
FA322CFC0CEF74B1001761B3 /* irc.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = irc.c; sourceTree = "<group>"; };
FA322CFD0CEF74B1001761B3 /* irc.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = irc.h; sourceTree = "<group>"; };
FA322CFE0CEF74B1001761B3 /* lists.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = lists.c; sourceTree = "<group>"; };
FA322CFF0CEF74B1001761B3 /* lists.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = lists.h; sourceTree = "<group>"; };
FA322D000CEF74B1001761B3 /* log.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = log.c; sourceTree = "<group>"; };
FA322D010CEF74B1001761B3 /* log.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = log.h; sourceTree = "<group>"; };
FA322D020CEF74B1001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
FA322D030CEF74B1001761B3 /* match.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = match.c; sourceTree = "<group>"; };
FA322D040CEF74B1001761B3 /* match.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = match.h; sourceTree = "<group>"; };
FA322D050CEF74B1001761B3 /* messages.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = messages.h; sourceTree = "<group>"; };
FA322D060CEF74B1001761B3 /* ngircd.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = ngircd.c; sourceTree = "<group>"; };
FA322D070CEF74B1001761B3 /* ngircd.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = ngircd.h; sourceTree = "<group>"; };
FA322D080CEF74B1001761B3 /* parse.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = parse.c; sourceTree = "<group>"; };
FA322D090CEF74B1001761B3 /* parse.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = parse.h; sourceTree = "<group>"; };
FA322D0A0CEF74B1001761B3 /* rendezvous.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = rendezvous.c; sourceTree = "<group>"; };
FA322D0B0CEF74B1001761B3 /* rendezvous.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = rendezvous.h; sourceTree = "<group>"; };
FA322D0C0CEF74B1001761B3 /* resolve.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = resolve.c; sourceTree = "<group>"; };
FA322D0D0CEF74B1001761B3 /* resolve.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = resolve.h; sourceTree = "<group>"; };
FA322D0F0CEF74B1001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
FA322D100CEF74B1001761B3 /* ansi2knr.1 */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.man; path = ansi2knr.1; sourceTree = "<group>"; };
FA322D110CEF74B1001761B3 /* ansi2knr.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = ansi2knr.c; sourceTree = "<group>"; };
FA322D120CEF74B1001761B3 /* exp.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = exp.h; sourceTree = "<group>"; };
FA322D130CEF74B1001761B3 /* imp.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = imp.h; sourceTree = "<group>"; };
FA322D140CEF74B1001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
FA322D150CEF74B1001761B3 /* portab.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = portab.h; sourceTree = "<group>"; };
FA322D160CEF74B1001761B3 /* portabtest.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = portabtest.c; sourceTree = "<group>"; };
FA322D170CEF74B1001761B3 /* splint.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = splint.h; sourceTree = "<group>"; };
FA322D180CEF74B1001761B3 /* strdup.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = strdup.c; sourceTree = "<group>"; };
FA322D190CEF74B1001761B3 /* strlcpy.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = strlcpy.c; sourceTree = "<group>"; };
FA322D1A0CEF74B1001761B3 /* vsnprintf.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = vsnprintf.c; sourceTree = "<group>"; };
FA322D1C0CEF74B1001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
FA322D1D0CEF74B1001761B3 /* channel-test.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "channel-test.e"; sourceTree = "<group>"; };
FA322D1E0CEF74B1001761B3 /* check-idle.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "check-idle.e"; sourceTree = "<group>"; };
FA322D1F0CEF74B1001761B3 /* connect-test.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "connect-test.e"; sourceTree = "<group>"; };
FA322D200CEF74B1001761B3 /* functions.inc */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.pascal; path = functions.inc; sourceTree = "<group>"; };
FA322D210CEF74B1001761B3 /* getpid.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = getpid.sh; sourceTree = "<group>"; };
FA322D220CEF74B1001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
FA322D230CEF74B1001761B3 /* mode-test.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "mode-test.e"; sourceTree = "<group>"; };
FA322D240CEF74B1001761B3 /* ngircd-test.conf */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "ngircd-test.conf"; sourceTree = "<group>"; };
FA322D250CEF74B1001761B3 /* README */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = README; sourceTree = "<group>"; };
FA322D260CEF74B1001761B3 /* start-server.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = "start-server.sh"; sourceTree = "<group>"; };
FA322D270CEF74B1001761B3 /* stop-server.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = "stop-server.sh"; sourceTree = "<group>"; };
FA322D280CEF74B1001761B3 /* stress-A.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "stress-A.e"; sourceTree = "<group>"; };
FA322D290CEF74B1001761B3 /* stress-B.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "stress-B.e"; sourceTree = "<group>"; };
FA322D2A0CEF74B1001761B3 /* stress-server.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = "stress-server.sh"; sourceTree = "<group>"; };
FA322D2B0CEF74B1001761B3 /* test-loop.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = "test-loop.sh"; sourceTree = "<group>"; };
FA322D2C0CEF74B1001761B3 /* tests.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = tests.sh; sourceTree = "<group>"; };
FA322D2D0CEF74B1001761B3 /* wait-tests.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = "wait-tests.sh"; sourceTree = "<group>"; };
FA322D2F0CEF74B1001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
FA322D300CEF74B1001761B3 /* ansi2knr.1 */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.man; path = ansi2knr.1; sourceTree = "<group>"; };
FA322D310CEF74B1001761B3 /* ansi2knr.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = ansi2knr.c; sourceTree = "<group>"; };
FA322D320CEF74B1001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
FA322D330CEF74B1001761B3 /* tool.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = tool.c; sourceTree = "<group>"; };
FA322D340CEF74B1001761B3 /* tool.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = tool.h; sourceTree = "<group>"; };
FA322D5A0CEF750F001761B3 /* AUTHORS */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = AUTHORS; path = ../../AUTHORS; sourceTree = SOURCE_ROOT; };
FA322D5B0CEF750F001761B3 /* autogen.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; name = autogen.sh; path = ../../autogen.sh; sourceTree = SOURCE_ROOT; };
FA322D5C0CEF750F001761B3 /* ChangeLog */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = ChangeLog; path = ../../ChangeLog; sourceTree = SOURCE_ROOT; };
FA322D5E0CEF750F001761B3 /* config.guess */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; name = config.guess; path = ../../config.guess; sourceTree = SOURCE_ROOT; };
FA322D5F0CEF750F001761B3 /* config.sub */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; name = config.sub; path = ../../config.sub; sourceTree = SOURCE_ROOT; };
FA322D600CEF750F001761B3 /* configure.in */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = configure.in; path = ../../configure.in; sourceTree = SOURCE_ROOT; };
FA322D610CEF750F001761B3 /* COPYING */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = COPYING; path = ../../COPYING; sourceTree = SOURCE_ROOT; };
FA322D620CEF750F001761B3 /* INSTALL */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = INSTALL; path = ../../INSTALL; sourceTree = SOURCE_ROOT; };
FA322D630CEF750F001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = Makefile.am; path = ../../Makefile.am; sourceTree = SOURCE_ROOT; };
FA322D640CEF750F001761B3 /* NEWS */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = NEWS; path = ../../NEWS; sourceTree = SOURCE_ROOT; };
FA322D650CEF750F001761B3 /* README */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = README; path = ../../README; sourceTree = SOURCE_ROOT; };
FA322D670CEF7523001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
FA322D690CEF7523001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
FA322D6A0CEF7523001761B3 /* changelog */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = changelog; sourceTree = "<group>"; };
FA322D6B0CEF7523001761B3 /* compat */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = compat; sourceTree = "<group>"; };
FA322D6C0CEF7523001761B3 /* control */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = control; sourceTree = "<group>"; };
FA322D6D0CEF7523001761B3 /* copyright */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = copyright; sourceTree = "<group>"; };
FA322D6E0CEF7523001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
FA322D6F0CEF7523001761B3 /* ngircd.default */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = ngircd.default; sourceTree = "<group>"; };
FA322D700CEF7523001761B3 /* ngircd.init */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = ngircd.init; sourceTree = "<group>"; };
FA322D710CEF7523001761B3 /* ngircd.postinst */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = ngircd.postinst; sourceTree = "<group>"; };
FA322D720CEF7523001761B3 /* rules */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = rules; sourceTree = "<group>"; };
FA322D740CEF7523001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
FA322D8D0CEF7523001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
FA322D8E0CEF7523001761B3 /* ngIRCd.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = ngIRCd.xcodeproj; sourceTree = "<group>"; };
FA322D910CEF7523001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
FA322D920CEF7523001761B3 /* ngindent */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = ngindent; sourceTree = "<group>"; };
FA322D930CEF7523001761B3 /* ngircd.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = ngircd.sh; sourceTree = "<group>"; };
FA322D940CEF7523001761B3 /* ngircd.spec */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = ngircd.spec; sourceTree = "<group>"; };
FA322D950CEF7523001761B3 /* README */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = README; sourceTree = "<group>"; };
FA322D960CEF7523001761B3 /* systrace.policy */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = systrace.policy; sourceTree = "<group>"; };
FA322D980CEF752C001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
FA322D990CEF752C001761B3 /* CVS.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = CVS.txt; sourceTree = "<group>"; };
FA322D9A0CEF752C001761B3 /* FAQ.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = FAQ.txt; sourceTree = "<group>"; };
FA322D9B0CEF752C001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
FA322D9C0CEF752C001761B3 /* Platforms.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Platforms.txt; sourceTree = "<group>"; };
FA322D9D0CEF752C001761B3 /* Protocol.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Protocol.txt; sourceTree = "<group>"; };
FA322D9E0CEF752C001761B3 /* README-AUX.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "README-AUX.txt"; sourceTree = "<group>"; };
FA322D9F0CEF752C001761B3 /* README-BeOS.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "README-BeOS.txt"; sourceTree = "<group>"; };
FA322DA00CEF752C001761B3 /* RFC.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = RFC.txt; sourceTree = "<group>"; };
FA322DA10CEF752C001761B3 /* sample-ngircd.conf */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "sample-ngircd.conf"; sourceTree = "<group>"; };
FA322DA30CEF752C001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
FA322DA40CEF752C001761B3 /* Doxyfile */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Doxyfile; sourceTree = "<group>"; };
FA322DA50CEF752C001761B3 /* footer.inc.html */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.html; path = footer.inc.html; sourceTree = "<group>"; };
FA322DA60CEF752C001761B3 /* header.inc.html */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.html; path = header.inc.html; sourceTree = "<group>"; };
FA322DA70CEF752C001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
FA322DA80CEF752C001761B3 /* ngircd-doc.css */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.css; path = "ngircd-doc.css"; sourceTree = "<group>"; };
FA322DA90CEF752C001761B3 /* SSL.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = SSL.txt; sourceTree = "<group>"; };
FA322DAA0CEF752C001761B3 /* Zeroconf.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Zeroconf.txt; sourceTree = "<group>"; };
FA322DAC0CEF7538001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
FA322DAD0CEF7538001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
FA322DAE0CEF7538001761B3 /* ngircd.8.tmpl */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = ngircd.8.tmpl; sourceTree = "<group>"; };
FA322DAF0CEF7538001761B3 /* ngircd.conf.5.tmpl */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = ngircd.conf.5.tmpl; sourceTree = "<group>"; };
FA322DB10CEF7565001761B3 /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = "<group>"; };
FA322DBB0CEF773C001761B3 /* cvs-version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "cvs-version.h"; sourceTree = "<group>"; };
FA322DC00CEF77CB001761B3 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = /usr/lib/libz.dylib; sourceTree = "<absolute>"; };
FAE5CC2C0CF2308A007D69B6 /* numeric.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = numeric.h; sourceTree = "<group>"; };
FAE5CC2D0CF2308A007D69B6 /* numeric.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = numeric.c; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
8DD76FAD0486AB0100D96B5E /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
FA322DC10CEF77CB001761B3 /* libz.dylib in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
08FB7794FE84155DC02AAC07 /* ngIRCd */ = {
isa = PBXGroup;
children = (
FA322D970CEF752C001761B3 /* doc */,
FA322D660CEF7523001761B3 /* contrib */,
FA322DAB0CEF7538001761B3 /* man */,
FA322CD40CEF74B0001761B3 /* src */,
FA322D5A0CEF750F001761B3 /* AUTHORS */,
FA322D610CEF750F001761B3 /* COPYING */,
FA322D620CEF750F001761B3 /* INSTALL */,
FA322D640CEF750F001761B3 /* NEWS */,
FA322D650CEF750F001761B3 /* README */,
FA322D5B0CEF750F001761B3 /* autogen.sh */,
FA322D5C0CEF750F001761B3 /* ChangeLog */,
FA322D5E0CEF750F001761B3 /* config.guess */,
FA322D5F0CEF750F001761B3 /* config.sub */,
FA322D600CEF750F001761B3 /* configure.in */,
FA322D630CEF750F001761B3 /* Makefile.am */,
1AB674ADFE9D54B511CA2CBB /* Products */,
FA322DC00CEF77CB001761B3 /* libz.dylib */,
);
name = ngIRCd;
sourceTree = "<group>";
};
1AB674ADFE9D54B511CA2CBB /* Products */ = {
isa = PBXGroup;
children = (
FA322BBA0CEF72E4001761B3 /* ngIRCd */,
);
name = Products;
sourceTree = "<group>";
};
FA322CD40CEF74B0001761B3 /* src */ = {
isa = PBXGroup;
children = (
FA322CD70CEF74B1001761B3 /* ngircd */,
FA322D0E0CEF74B1001761B3 /* portab */,
FA322D1B0CEF74B1001761B3 /* testsuite */,
FA322D2E0CEF74B1001761B3 /* tool */,
FA322CD50CEF74B1001761B3 /* .cvsignore */,
FA322CD60CEF74B1001761B3 /* Makefile.am */,
);
name = src;
path = ../../src;
sourceTree = SOURCE_ROOT;
};
FA322CD70CEF74B1001761B3 /* ngircd */ = {
isa = PBXGroup;
children = (
FA322CD80CEF74B1001761B3 /* .cvsignore */,
FA322CD90CEF74B1001761B3 /* array.c */,
FA322CDA0CEF74B1001761B3 /* array.h */,
FA322CDB0CEF74B1001761B3 /* channel.c */,
FA322CDC0CEF74B1001761B3 /* channel.h */,
FA322CDD0CEF74B1001761B3 /* client.c */,
FA322CDE0CEF74B1001761B3 /* client.h */,
FA322CDF0CEF74B1001761B3 /* conf.c */,
FA322CE00CEF74B1001761B3 /* conf.h */,
FA322CE10CEF74B1001761B3 /* conn-func.c */,
FA322CE20CEF74B1001761B3 /* conn-func.h */,
FA322CE30CEF74B1001761B3 /* conn-zip.c */,
FA322CE40CEF74B1001761B3 /* conn-zip.h */,
FA322CE50CEF74B1001761B3 /* conn.c */,
FA322CE60CEF74B1001761B3 /* conn.h */,
FA322CE70CEF74B1001761B3 /* defines.h */,
FA322CE80CEF74B1001761B3 /* hash.c */,
FA322CE90CEF74B1001761B3 /* hash.h */,
FA322CEA0CEF74B1001761B3 /* io.c */,
FA322CEB0CEF74B1001761B3 /* io.h */,
FA322CEC0CEF74B1001761B3 /* irc-channel.c */,
FA322CED0CEF74B1001761B3 /* irc-channel.h */,
FA322CEE0CEF74B1001761B3 /* irc-info.c */,
FA322CEF0CEF74B1001761B3 /* irc-info.h */,
FA322CF00CEF74B1001761B3 /* irc-login.c */,
FA322CF10CEF74B1001761B3 /* irc-login.h */,
FA322CF20CEF74B1001761B3 /* irc-mode.c */,
FA322CF30CEF74B1001761B3 /* irc-mode.h */,
FA322CF40CEF74B1001761B3 /* irc-op.c */,
FA322CF50CEF74B1001761B3 /* irc-op.h */,
FA322CF60CEF74B1001761B3 /* irc-oper.c */,
FA322CF70CEF74B1001761B3 /* irc-oper.h */,
FA322CF80CEF74B1001761B3 /* irc-server.c */,
FA322CF90CEF74B1001761B3 /* irc-server.h */,
FA322CFA0CEF74B1001761B3 /* irc-write.c */,
FA322CFB0CEF74B1001761B3 /* irc-write.h */,
FA322CFC0CEF74B1001761B3 /* irc.c */,
FA322CFD0CEF74B1001761B3 /* irc.h */,
FA322CFE0CEF74B1001761B3 /* lists.c */,
FA322CFF0CEF74B1001761B3 /* lists.h */,
FA322D000CEF74B1001761B3 /* log.c */,
FA322D010CEF74B1001761B3 /* log.h */,
FA322D020CEF74B1001761B3 /* Makefile.am */,
FA322D030CEF74B1001761B3 /* match.c */,
FA322D040CEF74B1001761B3 /* match.h */,
FA322D050CEF74B1001761B3 /* messages.h */,
FA322D060CEF74B1001761B3 /* ngircd.c */,
FA322D070CEF74B1001761B3 /* ngircd.h */,
FAE5CC2D0CF2308A007D69B6 /* numeric.c */,
FAE5CC2C0CF2308A007D69B6 /* numeric.h */,
FA322D080CEF74B1001761B3 /* parse.c */,
FA322D090CEF74B1001761B3 /* parse.h */,
FA322D0A0CEF74B1001761B3 /* rendezvous.c */,
FA322D0B0CEF74B1001761B3 /* rendezvous.h */,
FA322D0C0CEF74B1001761B3 /* resolve.c */,
FA322D0D0CEF74B1001761B3 /* resolve.h */,
);
path = ngircd;
sourceTree = "<group>";
};
FA322D0E0CEF74B1001761B3 /* portab */ = {
isa = PBXGroup;
children = (
FA322D0F0CEF74B1001761B3 /* .cvsignore */,
FA322D100CEF74B1001761B3 /* ansi2knr.1 */,
FA322D110CEF74B1001761B3 /* ansi2knr.c */,
FA322D120CEF74B1001761B3 /* exp.h */,
FA322D130CEF74B1001761B3 /* imp.h */,
FA322D140CEF74B1001761B3 /* Makefile.am */,
FA322D150CEF74B1001761B3 /* portab.h */,
FA322D160CEF74B1001761B3 /* portabtest.c */,
FA322D170CEF74B1001761B3 /* splint.h */,
FA322D180CEF74B1001761B3 /* strdup.c */,
FA322D190CEF74B1001761B3 /* strlcpy.c */,
FA322D1A0CEF74B1001761B3 /* vsnprintf.c */,
);
path = portab;
sourceTree = "<group>";
};
FA322D1B0CEF74B1001761B3 /* testsuite */ = {
isa = PBXGroup;
children = (
FA322D1C0CEF74B1001761B3 /* .cvsignore */,
FA322D1D0CEF74B1001761B3 /* channel-test.e */,
FA322D1E0CEF74B1001761B3 /* check-idle.e */,
FA322D1F0CEF74B1001761B3 /* connect-test.e */,
FA322D200CEF74B1001761B3 /* functions.inc */,
FA322D210CEF74B1001761B3 /* getpid.sh */,
FA322D220CEF74B1001761B3 /* Makefile.am */,
FA322D230CEF74B1001761B3 /* mode-test.e */,
FA322D240CEF74B1001761B3 /* ngircd-test.conf */,
FA322D250CEF74B1001761B3 /* README */,
FA322D260CEF74B1001761B3 /* start-server.sh */,
FA322D270CEF74B1001761B3 /* stop-server.sh */,
FA322D280CEF74B1001761B3 /* stress-A.e */,
FA322D290CEF74B1001761B3 /* stress-B.e */,
FA322D2A0CEF74B1001761B3 /* stress-server.sh */,
FA322D2B0CEF74B1001761B3 /* test-loop.sh */,
FA322D2C0CEF74B1001761B3 /* tests.sh */,
FA322D2D0CEF74B1001761B3 /* wait-tests.sh */,
);
path = testsuite;
sourceTree = "<group>";
};
FA322D2E0CEF74B1001761B3 /* tool */ = {
isa = PBXGroup;
children = (
FA322D2F0CEF74B1001761B3 /* .cvsignore */,
FA322D300CEF74B1001761B3 /* ansi2knr.1 */,
FA322D310CEF74B1001761B3 /* ansi2knr.c */,
FA322D320CEF74B1001761B3 /* Makefile.am */,
FA322D330CEF74B1001761B3 /* tool.c */,
FA322D340CEF74B1001761B3 /* tool.h */,
);
path = tool;
sourceTree = "<group>";
};
FA322D660CEF7523001761B3 /* contrib */ = {
isa = PBXGroup;
children = (
FA322D670CEF7523001761B3 /* .cvsignore */,
FA322D680CEF7523001761B3 /* Debian */,
FA322D730CEF7523001761B3 /* MacOSX */,
FA322D910CEF7523001761B3 /* Makefile.am */,
FA322D920CEF7523001761B3 /* ngindent */,
FA322D930CEF7523001761B3 /* ngircd.sh */,
FA322D940CEF7523001761B3 /* ngircd.spec */,
FA322D950CEF7523001761B3 /* README */,
FA322D960CEF7523001761B3 /* systrace.policy */,
);
name = contrib;
path = ..;
sourceTree = SOURCE_ROOT;
};
FA322D680CEF7523001761B3 /* Debian */ = {
isa = PBXGroup;
children = (
FA322D690CEF7523001761B3 /* .cvsignore */,
FA322D6A0CEF7523001761B3 /* changelog */,
FA322D6B0CEF7523001761B3 /* compat */,
FA322D6C0CEF7523001761B3 /* control */,
FA322D6D0CEF7523001761B3 /* copyright */,
FA322D6E0CEF7523001761B3 /* Makefile.am */,
FA322D6F0CEF7523001761B3 /* ngircd.default */,
FA322D700CEF7523001761B3 /* ngircd.init */,
FA322D710CEF7523001761B3 /* ngircd.postinst */,
FA322D720CEF7523001761B3 /* rules */,
);
path = Debian;
sourceTree = "<group>";
};
FA322D730CEF7523001761B3 /* MacOSX */ = {
isa = PBXGroup;
children = (
FA322D740CEF7523001761B3 /* .cvsignore */,
FA322D750CEF7523001761B3 /* build */,
FA322D8D0CEF7523001761B3 /* Makefile.am */,
FA322D8E0CEF7523001761B3 /* ngIRCd.xcodeproj */,
FA322DB10CEF7565001761B3 /* config.h */,
FA322DBB0CEF773C001761B3 /* cvs-version.h */,
);
path = MacOSX;
sourceTree = "<group>";
};
FA322D750CEF7523001761B3 /* build */ = {
isa = PBXGroup;
children = (
FA322D760CEF7523001761B3 /* ngIRCd.build */,
);
path = build;
sourceTree = "<group>";
};
FA322D760CEF7523001761B3 /* ngIRCd.build */ = {
isa = PBXGroup;
children = (
FA322D770CEF7523001761B3 /* Default */,
FA322D7F0CEF7523001761B3 /* ngIRCd.pbxindex */,
);
path = ngIRCd.build;
sourceTree = "<group>";
};
FA322D770CEF7523001761B3 /* Default */ = {
isa = PBXGroup;
children = (
FA322D780CEF7523001761B3 /* ngIRCd.build */,
);
path = Default;
sourceTree = "<group>";
};
FA322D780CEF7523001761B3 /* ngIRCd.build */ = {
isa = PBXGroup;
children = (
FA322D7A0CEF7523001761B3 /* Objects-normal */,
);
path = ngIRCd.build;
sourceTree = "<group>";
};
FA322D7A0CEF7523001761B3 /* Objects-normal */ = {
isa = PBXGroup;
children = (
FA322D7B0CEF7523001761B3 /* i386 */,
FA322D7D0CEF7523001761B3 /* ppc */,
);
path = "Objects-normal";
sourceTree = "<group>";
};
FA322D7B0CEF7523001761B3 /* i386 */ = {
isa = PBXGroup;
children = (
);
path = i386;
sourceTree = "<group>";
};
FA322D7D0CEF7523001761B3 /* ppc */ = {
isa = PBXGroup;
children = (
);
path = ppc;
sourceTree = "<group>";
};
FA322D7F0CEF7523001761B3 /* ngIRCd.pbxindex */ = {
isa = PBXGroup;
children = (
FA322D880CEF7523001761B3 /* strings.pbxstrings */,
);
path = ngIRCd.pbxindex;
sourceTree = "<group>";
};
FA322D880CEF7523001761B3 /* strings.pbxstrings */ = {
isa = PBXGroup;
children = (
);
path = strings.pbxstrings;
sourceTree = "<group>";
};
FA322D8F0CEF7523001761B3 /* Products */ = {
isa = PBXGroup;
children = (
);
name = Products;
sourceTree = "<group>";
};
FA322D970CEF752C001761B3 /* doc */ = {
isa = PBXGroup;
children = (
FA322D980CEF752C001761B3 /* .cvsignore */,
FA322D990CEF752C001761B3 /* CVS.txt */,
FA322D9A0CEF752C001761B3 /* FAQ.txt */,
FA322D9B0CEF752C001761B3 /* Makefile.am */,
FA322D9C0CEF752C001761B3 /* Platforms.txt */,
FA322D9D0CEF752C001761B3 /* Protocol.txt */,
FA322D9E0CEF752C001761B3 /* README-AUX.txt */,
FA322D9F0CEF752C001761B3 /* README-BeOS.txt */,
FA322DA00CEF752C001761B3 /* RFC.txt */,
FA322DA10CEF752C001761B3 /* sample-ngircd.conf */,
FA322DA20CEF752C001761B3 /* src */,
FA322DA90CEF752C001761B3 /* SSL.txt */,
FA322DAA0CEF752C001761B3 /* Zeroconf.txt */,
);
name = doc;
path = ../../doc;
sourceTree = SOURCE_ROOT;
};
FA322DA20CEF752C001761B3 /* src */ = {
isa = PBXGroup;
children = (
FA322DA30CEF752C001761B3 /* .cvsignore */,
FA322DA40CEF752C001761B3 /* Doxyfile */,
FA322DA50CEF752C001761B3 /* footer.inc.html */,
FA322DA60CEF752C001761B3 /* header.inc.html */,
FA322DA70CEF752C001761B3 /* Makefile.am */,
FA322DA80CEF752C001761B3 /* ngircd-doc.css */,
);
path = src;
sourceTree = "<group>";
};
FA322DAB0CEF7538001761B3 /* man */ = {
isa = PBXGroup;
children = (
FA322DAC0CEF7538001761B3 /* .cvsignore */,
FA322DAD0CEF7538001761B3 /* Makefile.am */,
FA322DAE0CEF7538001761B3 /* ngircd.8.tmpl */,
FA322DAF0CEF7538001761B3 /* ngircd.conf.5.tmpl */,
);
name = man;
path = ../../man;
sourceTree = SOURCE_ROOT;
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
8DD76FA90486AB0100D96B5E /* ngIRCd */ = {
isa = PBXNativeTarget;
buildConfigurationList = 1DEB928508733DD80010E9CD /* Build configuration list for PBXNativeTarget "ngIRCd" */;
buildPhases = (
8DD76FAB0486AB0100D96B5E /* Sources */,
8DD76FAD0486AB0100D96B5E /* Frameworks */,
8DD76FAF0486AB0100D96B5E /* CopyFiles */,
);
buildRules = (
);
dependencies = (
);
name = ngIRCd;
productInstallPath = "$(HOME)/bin";
productName = ngIRCd;
productReference = FA322BBA0CEF72E4001761B3 /* ngIRCd */;
productType = "com.apple.product-type.tool";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
08FB7793FE84155DC02AAC07 /* Project object */ = {
isa = PBXProject;
buildConfigurationList = 1DEB928908733DD80010E9CD /* Build configuration list for PBXProject "ngIRCd" */;
compatibilityVersion = "Xcode 3.0";
hasScannedForEncodings = 1;
mainGroup = 08FB7794FE84155DC02AAC07 /* ngIRCd */;
projectDirPath = "";
projectReferences = (
{
ProductGroup = FA322D8F0CEF7523001761B3 /* Products */;
ProjectRef = FA322D8E0CEF7523001761B3 /* ngIRCd.xcodeproj */;
},
);
projectRoot = "";
targets = (
8DD76FA90486AB0100D96B5E /* ngIRCd */,
);
};
/* End PBXProject section */
/* Begin PBXSourcesBuildPhase section */
8DD76FAB0486AB0100D96B5E /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
FA322D350CEF74B1001761B3 /* array.c in Sources */,
FA322D360CEF74B1001761B3 /* channel.c in Sources */,
FA322D370CEF74B1001761B3 /* client.c in Sources */,
FA322D380CEF74B1001761B3 /* conf.c in Sources */,
FA322D390CEF74B1001761B3 /* conn-func.c in Sources */,
FA322D3A0CEF74B1001761B3 /* conn-zip.c in Sources */,
FA322D3B0CEF74B1001761B3 /* conn.c in Sources */,
FA322D3C0CEF74B1001761B3 /* hash.c in Sources */,
FA322D3D0CEF74B1001761B3 /* io.c in Sources */,
FA322D3E0CEF74B1001761B3 /* irc-channel.c in Sources */,
FA322D3F0CEF74B1001761B3 /* irc-info.c in Sources */,
FA322D400CEF74B1001761B3 /* irc-login.c in Sources */,
FA322D410CEF74B1001761B3 /* irc-mode.c in Sources */,
FA322D420CEF74B1001761B3 /* irc-op.c in Sources */,
FA322D430CEF74B1001761B3 /* irc-oper.c in Sources */,
FA322D440CEF74B1001761B3 /* irc-server.c in Sources */,
FA322D450CEF74B1001761B3 /* irc-write.c in Sources */,
FA322D460CEF74B1001761B3 /* irc.c in Sources */,
FA322D470CEF74B1001761B3 /* lists.c in Sources */,
FA322D480CEF74B1001761B3 /* log.c in Sources */,
FA322D490CEF74B1001761B3 /* match.c in Sources */,
FA322D4A0CEF74B1001761B3 /* ngircd.c in Sources */,
FA322D4B0CEF74B1001761B3 /* parse.c in Sources */,
FA322D4C0CEF74B1001761B3 /* rendezvous.c in Sources */,
FA322D4D0CEF74B1001761B3 /* resolve.c in Sources */,
FA322DBE0CEF7766001761B3 /* tool.c in Sources */,
FAE5CC2E0CF2308A007D69B6 /* numeric.c in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
1DEB928708733DD80010E9CD /* Default */ = {
isa = XCBuildConfiguration;
buildSettings = {
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
GCC_MODEL_TUNING = G5;
INSTALL_PATH = /usr/local/bin;
PRODUCT_NAME = ngIRCd;
};
name = Default;
};
1DEB928B08733DD80010E9CD /* Default */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = (
ppc,
i386,
);
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
PREBINDING = NO;
SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk";
};
name = Default;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
1DEB928508733DD80010E9CD /* Build configuration list for PBXNativeTarget "ngIRCd" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1DEB928708733DD80010E9CD /* Default */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Default;
};
1DEB928908733DD80010E9CD /* Build configuration list for PBXProject "ngIRCd" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1DEB928B08733DD80010E9CD /* Default */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Default;
};
/* End XCConfigurationList section */
};
rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;
}

View File

@@ -1,7 +1,7 @@
ngIRCd - Next Generation IRC Server
(c)2001-2005 Alexander Barton,
(c)2001-2004 by Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd is free software and published under the
@@ -10,17 +10,11 @@
-- Contributions --
Debian/
- Various files for building Debian GNU/Linux packages (".deb's").
MacOSX/
- Project files for XCode, the "project builder" of Apple Mac OS X.
- Project file for XCode "project builder" of Mac OS X.
ngindent
- Script to indent the code of ngIRCd in the "standard way".
ngircd.sh
- Start script for FreeBSD.
Debian/
- Various files for building Debian packages.
ngircd.spec
- RPM "spec" file.
@@ -30,4 +24,4 @@ systrace.policy
--
$Id: README,v 1.3 2006/07/23 11:34:32 alex Exp $
$Id: README,v 1.1 2004/04/28 12:18:50 alex Exp $

View File

@@ -1,16 +0,0 @@
#/bin/sh
INDENTARGS="-kr -i8 -ts8 -l80 -c3 -cd41 -ss -ncs -psl"
# check if indent(1) is available
type indent >/dev/null 2>&1 && INDENT="indent"
type gnuindent >/dev/null 2>&1 && INDENT="gnuindent"
if [ -z "$INDENT" ]; then
echo "Error: GNU \"indent\" not found!"
exit 1
fi
$INDENT -v $INDENTARGS $*
# -eof-

View File

@@ -1,51 +0,0 @@
#!/bin/sh
# PROVIDE: ngircd
# REQUIRE: NETWORKING SERVERS
# BEFORE: DAEMON
# KEYWORD: FreeBSD shutdown
# Add the following line to /etc/rc.conf to enable `ngircd':
#
#ngircd_enable="YES"
#
. "/etc/rc.subr"
name="ngircd"
rcvar=`set_rcvar`
command="/usr/local/sbin/ngircd"
command_args=""
load_rc_config "$name"
: ${ngircd_enable="NO"}
: ${ngircd_flags=""}
required_files="/usr/local/etc/$name.conf"
pidfile="${ngircd_pidfile:-/var/run/${name}/${name}.pid}"
if [ ! x"${ngircd_chrootdir}" = x ];then
# Mount a devfs in the chroot directory if needed
if [ ! -c ${ngircd_chrootdir}/dev/random \
-o ! -c ${ngircd_chrootdir}/dev/null ]; then
umount ${ngircd_chrootdir}/dev 2>/dev/null
mount_devfs devfs ${ngircd_chrootdir}/dev
fi
devfs -m ${ngircd_chrootdir}/dev rule apply hide
devfs -m ${ngircd_chrootdir}/dev rule apply path null unhide
devfs -m ${ngircd_chrootdir}/dev rule apply path random unhide
# Copy local timezone information if it is not up to date.
if [ -f /etc/localtime ]; then
cmp -s /etc/localtime "${named_chrootdir}/etc/localtime" || \
cp -p /etc/localtime "${named_chrootdir}/etc/localtime"
fi
pidfile="${ngircd_chrootdir}${pidfile}"
fi
run_rc_command "$1"
# -eof-

View File

@@ -1,5 +1,5 @@
%define name ngircd
%define version 0.11.1
%define version 0.9.2
%define release 1
%define prefix %{_prefix}

View File

@@ -1,2 +0,0 @@
Makefile
Makefile.in

View File

@@ -1,7 +1,7 @@
ngIRCd - Next Generation IRC Server
(c)2001-2006 Alexander Barton,
(c)2001-2003 by Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd is free software and published under the
@@ -21,19 +21,18 @@ To access the source tree anonymously in read-only mode, follow these steps:
Login to the CVS server:
$ cvs -d:pserver:anonymous@ngircd.barton.de:/srv/cvs/ngircd login
$ cvs -d:pserver:anonymous@arthur.ath.cx:/usr/local/CVS/ngircd login
Use "anonymous" as user name and no password (just hit Return). Now you can
check out the sources:
$ cvs -d:pserver:anonymous@ngircd.barton.de:/srv/cvs/ngircd checkout ngircd
$ cvs -d:pserver:anonymous@arthur.ath.cx:/usr/local/CVS/ngircd checkout ngircd
Thereby a new folder "ngircd" will be created containing all the individual
source files. (Substitute the last "ngircd" with "website" to check out all
the files of the homepage of ngIRCd.)
source files.
The newly created folder ("ngircd" or "website") is the "working folder", all
CVS commands will be executed from within this folder in the future.
This is the "working folder", all CVS commands will be executed from within
this folder in the future.
Please note: When checking out a fresh copy of ngIRCd from CVS, the
configure script doesn't exist; you have to run the autogen.sh shell script
@@ -47,11 +46,11 @@ Updating the CVS tree:
You can update a single file or the complete source tree.
II. Write Access
~~~~~~~~~~~~~~~~
III. Write Access
~~~~~~~~~~~~~~~~~
If you want to contribute a couple of patches and write access to the CVS
repository would be handy, please contact Alex Barton, <alex@barton.de>.
--
$Id: CVS.txt,v 1.9 2006/08/03 14:37:29 alex Exp $
$Id: CVS.txt,v 1.7 2003/03/26 22:34:33 alex Exp $

View File

@@ -76,4 +76,4 @@ A: Please file a bug report at <http://ngircd.barton.de/bugzilla/index.cgi>!
--
$Id: FAQ.txt,v 1.11.4.1 2008/01/02 22:36:48 fw Exp $
$Id: FAQ.txt,v 1.7.4.1 2005/07/09 14:41:39 alex Exp $

View File

@@ -1,6 +1,6 @@
#
# ngIRCd -- The Next Generation IRC Daemon
# Copyright (c)2001-2007 by Alexander Barton (alex@barton.de)
# Copyright (c)2001-2003 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
@@ -9,17 +9,18 @@
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
#
# $Id: Makefile.am,v 1.22 2007/11/20 21:39:35 alex Exp $
# $Id: Makefile.am,v 1.18 2005/04/27 07:52:29 alex Exp $
#
SUBDIRS = src
EXTRA_DIST = CVS.txt FAQ.txt Protocol.txt Platforms.txt README-AUX.txt \
README-BeOS.txt RFC.txt SSL.txt Zeroconf.txt sample-ngircd.conf
EXTRA_DIST = CVS.txt FAQ.txt Protocol.txt Platforms.txt \
README-AUX.txt README-BeOS.txt RFC.txt sample-ngircd.conf
maintainer-clean-local:
rm -f Makefile Makefile.in
distclean-local:
rm -rf src
docdir = $(datadir)/doc/$(PACKAGE)
documents = $(EXTRA_DIST) ../AUTHORS ../COPYING ../ChangeLog ../INSTALL \
@@ -38,7 +39,4 @@ install-data-hook:
uninstall-hook:
rm -rf $(DESTDIR)$(docdir)
srcdoc:
make -C src srcdoc
# -eof-

View File

@@ -1,7 +1,7 @@
ngIRCd - Next Generation IRC Server
(c)2001-2006 Alexander Barton
(c)2001-2005 Alexander Barton
alex@barton.de, http://www.barton.de/
ngIRCd is free software and published under the
@@ -26,32 +26,23 @@ list can be updated. Thanks for your help!
| | | |
Platform Compiler ngIRCd Date Tester C M T R See
--------------------------- ------------ ---------- -------- ------ - - - - ---
alpha/unknown/netbsd3.0 gcc 3.3.3 CVSHEAD 06-05-07 fw Y Y Y Y (3)
hppa/unknown/openbsd3.5 gcc 2.95.3 CVSHEAD 04-05-25 alex Y Y Y Y
hppa1.1/unknown/linux-gnu gcc 3.3.3 0.8.0 04-05-30 alex Y Y Y Y
hppa2.0/unknown/linux-gnu gcc 3.3.5 0.9.x-CVS 05-06-27 alex Y Y Y Y
i386/pc/solaris2.9 gcc 3.2.2 CVSHEAD 04-02-24 alex Y Y Y Y
i386/pc/solaris2.11 gcc 3.4.3 CVSHEAD 06-08-04 alex Y Y Y Y
i386/unknown/freebsd5.2.1 gcc 3.3.3 0.8.0 04-05-30 alex Y Y Y Y
i386/unknown/freebsd6.0 gcc 3.4.4 0.10.0-p1 06-08-04 alex Y Y Y Y (3)
i386/unknown/freebsd6.1 gcc 3.4.4 CVSHEAD 06-05-07 fw Y Y Y Y (3)
i386/unknown/gnu0.3 gcc 3.3.3 0.8.0 04-05-30 alex Y Y n Y
i386/unknown/netbsdelf1.6.1 gcc 2.95.3 CVSHEAD 04-02-24 alex Y Y Y Y
i386/unknown/netbsdelf3.0.1 gcc 3.3.3 0.10.0-p1 06-08-30 alex Y Y Y Y (3)
i386/unknown/openbsd3.9 gcc 3.3.5 0.10.0-p1 06-08-30 alex Y Y Y Y (3)
i686/pc/cygwin gcc 3.3.1 0.8.0 04-05-30 alex Y Y n Y
i686/pc/cygwin gcc 3.3.1 0.9.x-CVS 05-07-08 alex Y Y n Y
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.3 0.8.0 04-05-30 alex Y Y Y Y (1)
i386/pc/linux-gnu gcc 4.1.2 0.10.0-p1 06-08-30 alex Y Y Y Y (1)
i686/pc/linux-gnu gcc 3.3.5 0.9.x-CVS 05-07-09 alex Y Y Y Y (1)
m68k/apple/aux3.1.1 Orig. A/UX 0.7.x-CVS 03-04-22 alex Y Y Y Y (2)
m68k/hp/hp-ux9.10 Orig. HPUX 0.7.x-CVS 03-04-30 goetz Y Y Y Y
m88k/dg/dgux5.4R3.10 gcc 2.5.8 CVSHEAD 04-03-15 alex Y Y ? ?
powerpc/apple/darwin6.5 gcc 3.1 0.7.x-CVS 03-04-23 alex Y Y Y Y
powerpc/apple/darwin7.4.0 gcc 3.3 0.8.0 04-05-30 alex Y Y Y Y
powerpc/apple/darwin7.9.0 gcc 3.3 CVSHEAD 06-05-07 fw Y Y Y Y (3)
powerpc/apple/darwin8.1.0 gcc 4.0 0.9.x-CVS 05-06-27 alex Y Y Y Y
powerpc/unknown/linux-gnu gcc 3.3.3 0.8.0 04-05-30 alex Y Y Y Y
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
@@ -59,19 +50,16 @@ sparc/unkn./netbsdelf1.6.1 gcc 2.95.3 0.8.0 04-05-30 alex Y Y Y Y
Notes
~~~~~
(1) i686/pc/linux-gnu:
ngIRCd has been tested with various Linux distributions, such as SuSE,
RedHat, Debian, and Gentoo using Kernels 2.2.x, 2.4.x and 2.6.x with
various versions of the GNU C compiler (starting with 2.95.x and up to
version 4.1.x). The eldest glibc used was glibc-2.0.7. ngIRCd compiled
and run on all these systems without problems.
Actual Linux kernels (2.6.x) and glic's support the epoll() IO interface.
various versions of the GNU C compiler (2.95.3, 3.0, 3.2, and 3.3). The
eldest glibc used was glibc-2.0.7. ngIRCd compiled and run on all these
systems without problems.
(2) This compiler is an pre-ANSI C compiler, therefore the source code is
automatically converted using the included ansi2knr tool while building.
(3) Using the kqueue() IO interface.
--
$Id: Platforms.txt,v 1.18 2006/10/08 14:09:16 alex Exp $
$Id: Platforms.txt,v 1.13.2.2 2005/07/09 11:16:38 alex Exp $

View File

@@ -1,7 +1,7 @@
ngIRCd - Next Generation IRC Server
(c)2001-2007 Alexander Barton,
(c)2001-2003 by Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd is free software and published under the
@@ -79,9 +79,6 @@ The following <serverflags> are defined at the moment:
peer understands this flag, it will send "MODE +I" and "MODE +b"
commands after the server link has been established.
- H: The server supports the "enhanced server handshake", see section II.2
for a detailed description.
- o: IRC operators are allowed to change channel- and channel-user-modes
even if they aren't channel-operator of the affected channel.
@@ -93,53 +90,10 @@ The optional parameter <options> is used to propagate server options as
defined in RFC 2813, section 4.1.1.
II.2 Enhanced Server Handshake
The "enhanced server handshake" is used when both servers support this IRC+
extension, which is indicated by the 'H' flag in the <serverflags> sent with
the PASS command, see section II.1.
It basically means, that after exchanging the PASS and SERVER commands the
server is not registered in the network (as usual), but that IRC numerics
are exchanged until the numeric 376 (ENDOFMOTD) is received. Afterwards the
peer is registered in the network as with the regular IRC protocol.
A server implementing the enhanced server handshake (and indicating this
using 'H' in the <serverflags>) MUST ignore all unknown numerics to it
silently.
In addition, such a server should at least send the numeric 005 (ISUPPORT)
to its peer, containing the following information. Syntax: <key>=<value>,
one token per IRC parameter. If the server has to send more than 12 token
it must send separate ISUPPORT numerics (this is a limitation of the IRC
protocol which allows at max 15 arguments per command).
- NICKLEN: Maximum nickname length. Default: 9.
- CASEMAPPING: Case mapping used for nick- and channel name comparing.
Default: "ascii", the chars [a-z] are lowercase of [A-Z].
- PREFIX: List of channel modes a person can get and the respective prefix
a channel or nickname will get in case the person has it. The order of the
modes goes from most powerful to least powerful. Default: "(ov)@+"
- CHANTYPES: Supported channel prefixes. Default: "#".
- CHANMODES: List of channel modes for 4 types, separated by comma (","):
Mode that adds or removes a nick or address to a list, mode that changes
a setting (both have always has a parameter), mode that changes a setting
and only has a parameter when set, and mode that changes a setting and
never has a parameter. For example "bI,k,l,imnPst".
- CHANLIMIT: Maximum number of channels allowed to join by channel prefix,
for example "#:10".
Please see <http://www.irc.org/tech_docs/005.html> for details.
The information exchanged using ISUPPORT can be used to detect configuration
incompatibilities (different maximum nick name length, for example) and
therefore to disconnect the peer prior to registering it in the network.
II.3 Exchange channel-modes, topics, and persistent channels
II.2 Exchange channel-modes, topics, and persistent channels
Command: CHANINFO
Parameters: <channel> +<modes> <key> <limit> [<topic>]
Parameters: <channel> +<modes> <key> <maxusers> [<topic>]
Used by: servers only
CHANINFO is used by servers to inform each other about a channel: its
@@ -161,4 +115,4 @@ channel mode). In this case <limit> should be "0".
--
$Id: Protocol.txt,v 1.14 2007/11/21 12:16:35 alex Exp $
$Id: Protocol.txt,v 1.12 2004/04/25 15:44:10 alex Exp $

View File

@@ -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
ftp://arthur.barton.de/pub/UNIX/AUX/Tools/sed-3.02.tar.gz
A/UX comes with /bin/sed which isn't supporting all functions needed
by GNU automake/autoconf.
@@ -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
ftp://arthur.barton.de/pub/UNIX/AUX/Libraries/libUTIL-2.1.tar.gz
This library contains functions that are common on other UNIX
systems but not on A/UX e.g. memmove(), strerror() und strdup().
@@ -50,7 +50,7 @@ A few hints in case of errors:
(so 'configure' uses its own shell script) or use a fully functionable one.
There's at least one binary "out there" causing problems. The one
of the GNU fileutils works fine:
ftp://arthur.barton.de/pub/unix/aux/tools/fileutils-4.0.tar.gz
ftp://arthur.barton.de/pub/UNIX/AUX/Software/Tools/fileutils-4.0.tar.gz
- The precompiled binary of the old 'bash' shouldn't be installed within
/bin (better do this in /usr/local/bin) because 'configure' would
@@ -64,4 +64,4 @@ A few hints in case of errors:
even if you don't use ngIRCd.
--
$Id: README-AUX.txt,v 1.10 2006/07/23 12:19:57 alex Exp $
$Id: README-AUX.txt,v 1.9 2005/06/24 20:59:13 alex Exp $

View File

@@ -1,40 +0,0 @@
ngIRCd - Next Generation IRC Server
(c)2001-2006 Alexander Barton
alex@barton.de, http://www.barton.de/
ngIRCd is free software and published under the
terms of the GNU General Public License.
-- Zeroconf.txt --
ngIRCd supports one aspect of Zeroconf Networking[1]: Multicast DNS (mDNS[2])
with DNS Service Discovery (DNS-SD[3]).
To use this features you can use one of two APIs:
a) Apple "Bonjour" API as used by Mac OS X,
b) the Howl[4] Zeroconf library or the Howl compatibility layer
of the newer Avahi[5] library.
When calling the configure script using the "--with-zeroconf" switch the
avalable API will be autodetected and the required additional libraries will
be linked to the ngircd binary as required.
ngIRCd then registers a DNS-SD service for each port it is listening on using
the service type "_ircu._tcp.".
Links:
[1] http://www.zeroconf.org/
[2] http://www.multicastdns.org/
[3] http://www.dns-sd.org/
[4] http://www.porchdogsoft.com/products/howl/
[5] http://avahi.org/
--
$Id: Zeroconf.txt,v 1.2 2006/08/03 14:37:29 alex Exp $

View File

@@ -1,4 +1,4 @@
# $Id: sample-ngircd.conf,v 1.43.2.1 2008/01/07 23:10:28 alex Exp $
# $Id: sample-ngircd.conf,v 1.33 2005/03/15 16:58:01 alex Exp $
#
# This is a sample configuration file for the ngIRCd, which must be adepted
@@ -6,30 +6,26 @@
#
# Comments are started with "#" or ";".
#
# A lot of configuration options in this file start with a ";". You have
# to remove the ";" in front of each variable to actually set a value!
# The disabled variables are shown with example values for completeness.
#
# Use "ngircd --configtest" (see manual page ngircd(8)) to validate that the
# server interprets the configuration file as expected!
# server interpreted the configuration file as expected!
#
[Global]
# The [Global] section of this file is used to define the main
# configuration of the server, like the server name and the ports
# on which the server should be listening.
# Server name in the IRC network, must contain at least one dot
# (".") and be unique in the IRC network. Required!
Name = irc.the.net
# Info text of the server. This will be shown by WHOIS and
# LINKS requests for example.
Info = Server Info Text
# Global password for all users needed to connect to the server
;Password = abc
# Information about the server and the administrator, used by the
# ADMIN command. Not required by server but by RFC!
;AdminInfo1 = Description
@@ -43,7 +39,7 @@
# IP address on which the server should listen. (Default: empty,
# so the server listens on all IP addresses of the system)
;Listen = 1.2.3.4
# Text file with the "message of the day" (MOTD). This message will
# be shown to all users connecting to the server:
;MotdFile = /usr/local/etc/ngircd.motd
@@ -96,33 +92,22 @@
# Mask IRC Operator mode requests as if they were coming from the
# server? (This is a compatibility hack for ircd-irc2 servers)
;OperServerMode = no
# Allow Pre-Defined Channels only (see Section [Channels])
;PredefChannelsOnly = no
# Don't do any DNS lookups when a client connects to the server.
;NoDNS = no
# Maximum number of simultaneous connection the server is allowed
# to accept (0: unlimited):
;MaxConnections = 0
# to accept (<=0: unlimited):
;MaxConnections = -1
# Maximum number of simultaneous connections from a single IP address
# the server will accept (0: unlimited):
# the server will accept (<=0: unlimited):
;MaxConnectionsIP = 5
# Maximum number of channels a user can be member of (0: no limit):
# Maximum number of channels a user can be member of (<=0: no limit):
;MaxJoins = 10
# Maximum length of an user nick name (Default: 9, as in RFC 2812).
# Please note that all servers in an IRC network MUST use the same
# maximum nick name length!
;MaxNickLength = 9
[Operator]
# [Operator] sections are used to define IRC Operators. There may be
# more than one [Operator] block, one for each local operator.
# ID of the operator (may be different of the nick name)
;Name = TheOper
@@ -140,7 +125,7 @@
# configure a port for the connection, then this ngircd tries to
# connect to to the other server on the given port; if not it waits
# for the other server to connect.
# There may be more than one server block, one for each server.
# There may be more than one server block.
#
# Server Groups:
# The ngIRCd allows "server groups": You can assign an "ID" to every
@@ -148,22 +133,16 @@
# group won't answer, the ngIRCd tries to connect to the next server
# in the given group. But the ngircd never tries to connect to two
# servers with the same group ID.
# IRC name of the remote server, must match the "Name" variable in
# the [Global] section of the other server (when using ngIRCd).
# IRC name of the server
;Name = irc2.the.net
# Internet host name or IP address of the peer (only required when
# this server should establish the connection).
# Internet host name of the peer
;Host = connect-to-host.the.net
# IP address to use as _source_ address for the connection. if unspecified,
# ngircd will let the operating system pick an address.
;Bind = 10.0.0.1
# Port of the server to which the ngIRCd should connect. If you
# assign no port the ngIRCd waits for incoming connections.
;Port = 6667
;Port = 6666
# Own password for the connection. This password has to be configured
# as "PeerPassword" on the other server.
@@ -172,17 +151,10 @@
# Foreign password for this connection. This password has to be
# configured as "MyPassword" on the other server.
;PeerPassword = PeerSecret
# Group of this server (optional)
;Group = 123
# Set the "Passive" option to "yes" if you don't want this ngIRCd to
# connect to the configured peer (same as leaving the "Port" variable
# empty). The advantage of this option is that you can actually configure
# a port an use the IRC command CONNECT more easily to manually connect
# this specific server later.
;Passive = no
[Server]
# More [Server] sections, if you like ...
@@ -192,22 +164,16 @@
# persist when there are no more members left.
# Persistent channels are marked with the mode 'P', which can be set
# and unset by IRC operators like other modes on the fly.
# There may be more than one [Channel] block, one for each channel.
# There may be more than one [Channel] block.
# Name of the channel
;Name = #TheName
# Topic for this channel
;Topic = a great topic
# Initial channel modes
;Modes = tnk
# initial channel password (mode k)
;Key = Secret
# maximum users per channel (mode l)
;MaxUsers = 23
;Modes = tn
[Channel]
# More [Channel] sections, if you like ...

View File

@@ -1,3 +0,0 @@
Makefile
Makefile.in
html

View File

@@ -1,25 +0,0 @@
#
# ngIRCd -- The Next Generation IRC Daemon
# Copyright (c)2001-2006 Alexander Barton (alex@barton.de)
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information.
#
# $Id: Makefile.am,v 1.3 2006/12/28 14:04:28 alex Exp $
#
maintainer-clean-local:
rm -f Makefile Makefile.in
distclean-local:
rm -rf html
srcdoc:
@doxygen --version >/dev/null 2>&1 \
|| ( echo; echo "Error: \"doxygen\" not found!"; echo; exit 1 )
doxygen
# -eof-

View File

@@ -1,11 +0,0 @@
<hr class="footer">
<p>
ngIRCd
<a href="http://ngircd.barton.de/">Homepage</a>,
<a href="http://arthur.barton.de/cgi-bin/viewcvs.cgi/ngircd/">CVS-Repository</a>,
<a href="http://ngircd.barton.de/bugzilla/index.cgi">Bug-Tracker</a>.
</p>
</body>
</html>

View File

@@ -1,10 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>ngIRCd Source Documentation</title>
<link href="ngircd-doc.css" rel="stylesheet" type="text/css">
</head>
<body>

View File

@@ -1,77 +0,0 @@
/*
* Cascading Style Sheet for the ngIRCd source documentation
*
* $Id: ngircd-doc.css,v 1.2 2005/07/22 21:23:22 alex Exp $
*/
BODY {
background-color: white;
color: black;
margin: 30px;
font-family: Geneva, sans-serif;
font-size: 12px;
}
A:visited { color: purple; background: transparent; }
A:link { color: navy; background: transparent; }
A:active { color: red; background: transparent; }
A:hover { background: #ffa; }
H1, H2, H3 {
font-family: Verdana, sans-serif;
background-color: white;
color: #005555;
}
H1 { margin-bottom: 10px; }
H2 {
margin-top: 20px;
margin-bottom: 10px;
}
P, LI, TD, TH, DT {
font-family: Geneva, sans-serif;
font-size: 12px;
line-height: 1.2
}
DD { margin-bottom: 1em; }
UL { list-style-type: square; }
HR { margin: 2em 0px; }
BODY>TABLE { padding: 1em 0px; }
TD.mdRow {
border: 1px dotted silver;
background-color: #fff9dd;
}
TD.md { font-weight: bold; }
TD.memItemLeft { padding-top: 4px; }
TD.memItemRight { padding-top: 4px; }
TD.mdescRight { font-style: italic; }
DIV.qindex {
background-color: #eee;
border: 1px dotted silver;
padding: 3px;
margin-bottom: 2px;
}
DIV.nav {
margin: 1em 0px;
}
HR.footer { margin-top: 50px; }
.comment {
color: gray;
font-style: italic;
}
.preprocessor { color: #f90; }
.keyword, .keywordflow, .keywordtype { color: red; }
.stringliteral { color: green; }
/* -eof- */

View File

@@ -1,4 +0,0 @@
Makefile
Makefile.in
ngircd.8
ngircd.conf.5

View File

@@ -9,25 +9,12 @@
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
#
# $Id: Makefile.am,v 1.6 2006/12/25 16:13:26 alex Exp $
# $Id: Makefile.am,v 1.5 2002/04/04 13:02:41 alex Exp $
#
TEMPLATE_MANS = ngircd.conf.5.tmpl ngircd.8.tmpl
SUFFIXES = .tmpl .
.tmpl:
sed \
-e s@:SBINDIR:@${sbindir}@ \
-e s@:BINDIR:@${bindir}@ \
-e s@:ETCDIR:@${sysconfdir}@ \
<$< >$@
man_MANS = ngircd.conf.5 ngircd.8
CLEANFILES = $(man_MANS)
EXTRA_DIST = $(TEMPLATE_MANS)
EXTRA_DIST = $(man_MANS)
maintainer-clean-local:
rm -f Makefile Makefile.in

View File

@@ -1,7 +1,7 @@
.\"
.\" $Id: ngircd.8.tmpl,v 1.2 2007/11/15 01:03:29 fw Exp $
.\" $Id: ngircd.8,v 1.10 2005/06/04 13:39:20 alex Exp $
.\"
.TH ngircd 8 "August 2005" ngircd "ngIRCd Manual"
.TH ngircd 8 "Juni 2005" ngircd "ngIRCd Manual"
.SH NAME
ngIRCd \- the next generation IRC daemon
.SH SYNOPSIS
@@ -23,8 +23,7 @@ Linux, Mac OS X, NetBSD, OpenBSD, Solaris, and Windows with Cygwin.
.PP
As ngIRCd relies on UNIX standards and uses GNU automake and GNU autoconf
there are good chances that it also supports other UNIX-based operating
systems as well. By default, ngIRCd writes diagnostic and informational messages using
the syslog mechanism.
systems as well.
.SH OPTIONS
The default behaviour of
.BR ngircd
@@ -56,11 +55,11 @@ Output version information and exit.
\fB\-\-help\fR
Display a brief help text and exit.
.SH FILES
.I :ETCDIR:/ngircd.conf
.I /usr/local/etc/ngircd.conf
.RS
The system wide default configuration file.
.RE
.I :ETCDIR:/ngircd.motd
.I /usr/local/etc/ngircd.motd
.RS
Default "message of the day" (MOTD).
.RE
@@ -71,8 +70,8 @@ alex@barton.de
.UE
.br
Homepage:
.UR http://ngircd.barton.de/
http://ngircd.barton.de/
.UR http://arthur.ath.cx/~alex/ngircd/
http://arthur.ath.cx/~alex/ngircd/
.UE
.SH "SEE ALSO"
.BR ngircd.conf (5),

View File

@@ -1,17 +1,16 @@
.\"
.\" $Id: ngircd.conf.5.tmpl,v 1.7 2007/11/23 16:26:03 fw Exp $
.\" $Id: ngircd.conf.5,v 1.18 2005/06/04 13:39:20 alex Exp $
.\"
.TH ngircd.conf 5 "August 2005" ngircd "ngIRCd Manual"
.TH ngircd.conf 5 "Juni 2005" ngircd "ngIRCd Manual"
.SH NAME
ngircd.conf \- configuration file of ngIRCd
.SH SYNOPSIS
.B :ETCDIR:/ngircd.conf
.B /usr/local/etc/ngircd.conf
.SH DESCRIPTION
.BR ngircd.conf
is the configuration file of the
is the configuration file for
.BR ngircd (8)
Internet Relay Chat (IRC) daemon which you should adept to your local
preferences and needs.
which you should adept to your local preferences and needs.
.SH "FILE FORMAT"
The file consists of sections and parameters. A section begins with the name
of the section in square brackets and continues until the next section
@@ -25,8 +24,8 @@ Sections contain parameters of the form
.I value
.RE
.PP
Empty lines and any line beginning with a semicolon (';') or a hash ('#')
character is treated as a comment and will be ignored.
Any line beginning with a semicolon (';') or a hash ('#') character is
treated as a comment and ignored.
.PP
The file format is line-based - that means, each newline-terminated line
represents either a comment, a section name or a parameter.
@@ -146,35 +145,18 @@ If OperCanUseMode is enabled, this may lead the compatibility problems with
Servers that run the ircd-irc2 Software. This Option "masks" mode requests
by non-chanops as if they were coming from the server. Default: no.
.TP
\fBPredefChannelsOnly\fR
If enabled, no new channels can be created. Useful if
you do not want to have channels other than those defined in
the config file.
Default: No.
.TP
\fBNoDNS\fR
If enabled, ngircd will not make DNS lookups when clients connect.
If you configure ngircd to connect to other servers, ngircd may still
perform a DNS lookup if required.
Default: No.
.TP
\fBMaxConnections\fR
Maximum number of simultaneous connection the server is allowed to accept
(0: unlimited). Default: 0.
(<=0: unlimited). Default: -1.
.TP
\fBMaxConnectionsIP\fR
Maximum number of simultaneous connections from a single IP address that
the server will accept (0: unlimited). This configuration options lowers
the server will accept (<=0: unlimited). This configuration options lowers
the risk of denial of service attacks (DoS). Default: 5.
.TP
\fBMaxJoins\fR
Maximum number of channels a user can be member of (0: no limit).
Maximum number of channels a user can be member of (<=0: no limit).
Default: 10.
.TP
\fBMaxNickLength\fR
Maximum length of an user nick name (Default: 9, as in RFC 2812). Please
note that all servers in an IRC network MUST use the same maximum nick name
length!
.SH [OPERATOR]
.I [Operator]
sections are used to define IRC Operators. There may be more than one
@@ -212,17 +194,13 @@ IRC name of the server
\fBHost\fR
Internet host name of the peer
.TP
\fBBind\fR
IP address to use as source IP for the outgoing connection. Default ist
to let the operating system decide.
.TP
\fBPort\fR
Port of the server to which the ngIRCd should connect. If you assign no port
the ngIRCd waits for incoming connections.
.TP
\fBMyPassword\fR
Own password for this connection. This password has to be configured as
"PeerPassword" on the other server. Must not have ':' as first character.
"PeerPassword" on the other server.
.TP
\fBPeerPassword\fR
Foreign password for this connection. This password has to be configured as
@@ -230,9 +208,6 @@ Foreign password for this connection. This password has to be configured as
.TP
\fBGroup\fR
Group of this server (optional).
\fBPassive\fR
Disable automatic connection even if port value is specified. Default: false.
You can use the IRC Operator command CONNECT later on to create the link.
.SH [CHANNEL]
Pre-defined channels can be configured in
.I [Channel]
@@ -254,12 +229,6 @@ Topic for this channel
.TP
\fBModes\fR
Initial channel modes.
.TP
\fBKey\fR
Sets initial channel key (only relevant if mode k is set)
.TP
\fBMaxUsers\fR
Set maximum user limit for this channel (only relevant if mode l is set)
.SH HINTS
It's wise to use "ngircd --configtest" to validate the configuration file
after changing it. See
@@ -272,8 +241,8 @@ alex@barton.de
.UE
.br
Homepage:
.UR http://ngircd.barton.de/
http://ngircd.barton.de/
.UR http://arthur.ath.cx/~alex/ngircd/
http://arthur.ath.cx/~alex/ngircd/
.UE
.SH "SEE ALSO"
.BR ngircd (8)

View File

@@ -1,5 +0,0 @@
Makefile
Makefile.in
config.h
config.h.in
stamp-h1

View File

@@ -8,7 +8,7 @@
# (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information.
#
# $Id: Doxyfile,v 1.2 2005/07/23 00:48:38 alex Exp $
# $Id: Doxyfile,v 1.1 2005/04/09 12:21:51 alex Exp $
#
# This file describes the settings to be used by the documentation system
@@ -28,16 +28,7 @@ PROJECT_NAME = ngIRCd
# If a relative path is entered, it will be relative to the location
# where doxygen was started. If left blank the current directory will be used.
OUTPUT_DIRECTORY = .
# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
# can be used to strip a user-defined part of the path. Stripping is
# only done if one of the specified strings matches the left-hand part of
# the path. The tag can be used to show relative paths in the file list.
# If left blank the directory from which doxygen is run is used as the
# path to strip.
STRIP_FROM_PATH = ../..
OUTPUT_DIRECTORY = ../doc/src
# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
# will interpret the first line (until the first dot) of a JavaDoc-style
@@ -97,7 +88,7 @@ EXTRACT_LOCAL_CLASSES = YES
# or directories like "/usr/src/myproject". Separate the files or directories
# with spaces.
INPUT = ../../src
INPUT = ngircd portab tool
# The RECURSIVE tag can be used to turn specify whether or not subdirectories
# should be searched for input files as well. Possible values are YES and NO.
@@ -121,13 +112,6 @@ SOURCE_BROWSER = YES
#---------------------------------------------------------------------------
GENERATE_HTML = YES
HTML_OUTPUT = html
HTML_FILE_EXTENSION = .html
HTML_HEADER = header.inc.html
HTML_FOOTER = footer.inc.html
HTML_STYLESHEET = ngircd-doc.css
GENERATE_HTMLHELP = NO
GENERATE_LATEX = NO
GENERATE_RTF = NO

View File

@@ -8,7 +8,7 @@
# (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information.
#
# $Id: Makefile.am,v 1.7 2005/07/22 21:01:03 alex Exp $
# $Id: Makefile.am,v 1.6 2005/04/09 12:22:41 alex Exp $
#
SUBDIRS = portab tool ngircd testsuite
@@ -16,4 +16,9 @@ SUBDIRS = portab tool ngircd testsuite
maintainer-clean-local:
rm -f Makefile Makefile.in config.h config.h.in stamp-h.in
srcdoc:
@doxygen --version >/dev/null 2>&1 \
|| ( echo; echo "Error: \"doxygen\" not found!"; echo; exit 1 )
doxygen
# -eof-

View File

@@ -1,8 +0,0 @@
Makefile
Makefile.in
.deps
check-help
check-version
cvs-version.h
cvs-version.new
ngircd

View File

@@ -8,7 +8,7 @@
# (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information.
#
# $Id: Makefile.am,v 1.50 2007/11/21 12:16:36 alex Exp $
# $Id: Makefile.am,v 1.46 2005/05/23 00:11:15 alex Exp $
#
AUTOMAKE_OPTIONS = ../portab/ansi2knr
@@ -20,20 +20,20 @@ LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN \
sbin_PROGRAMS = ngircd
ngircd_SOURCES = ngircd.c array.c channel.c client.c conf.c conn.c conn-func.c \
conn-zip.c hash.c io.c irc.c irc-channel.c irc-info.c irc-login.c \
irc-mode.c irc-op.c irc-oper.c irc-server.c irc-write.c lists.c log.c \
match.c numeric.c parse.c rendezvous.c resolve.c
ngircd_SOURCES = ngircd.c channel.c client.c conf.c conn.c conn-zip.c conn-func.c \
hash.c irc.c irc-channel.c irc-info.c irc-login.c irc-mode.c irc-op.c \
irc-oper.c irc-server.c irc-write.c lists.c log.c match.c parse.c \
rendezvous.c resolve.c
ngircd_LDFLAGS = -L../portab -L../tool
ngircd_LDADD = -lngportab -lngtool
noinst_HEADERS = ngircd.h array.h channel.h client.h conf.h conn.h conn-func.h \
conn-zip.h hash.h io.h irc.h irc-channel.h irc-info.h irc-login.h \
irc-mode.h irc-op.h irc-oper.h irc-server.h irc-write.h lists.h log.h \
match.h numeric.h parse.h rendezvous.h resolve.h \
defines.h messages.h
noinst_HEADERS = ngircd.h channel.h client.h conf.h conn.h conn-zip.h conn-func.h \
hash.h irc.h irc-channel.h irc-info.h irc-login.h irc-mode.h irc-op.h \
irc-oper.h irc-server.h irc-write.h lists.h log.h match.h parse.h \
rendezvous.h resolve.h \
messages.h defines.h
clean-local:
rm -f check-version check-help lint.out cvs-version.*
@@ -43,12 +43,12 @@ maintainer-clean-local:
check-version: Makefile
echo "#!/bin/sh" > check-version
echo "./ngircd --version | grep ngircd >/dev/null 2>&1" >>check-version
echo "./ngircd --version | grep ngircd > /dev/null 2>&1" >> check-version
chmod 755 check-version
check-help: Makefile
echo "#!/bin/sh" > check-help
echo "./ngircd --help | grep help >/dev/null 2>&1" >>check-help
echo "./ngircd --help | grep help > /dev/null 2>&1" >> check-help
chmod 755 check-help
lint:
@@ -63,7 +63,7 @@ lint:
if [ $$? -ne 0 ]; then \
waswarning=1; \
echo; grep -v "^Command Line: " lint.out; echo; \
w=$$( grep "code warning" lint.out | $(AWK) "{ print \$$4 }" ); \
w=$$( grep "code warning" lint.out | awk "{ print \$$4 }" ); \
[ "$$w" -gt 0 ] && warnings=`expr $$warnings + $$w`; \
files=`expr $$files + 1`; \
else \

View File

@@ -1,345 +0,0 @@
/*
* 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.
*
* functions to dynamically allocate arrays.
* Copyright (c) 2005 Florian Westphal (westphal@foo.fh-furtwangen.de)
*
*/
#include "array.h"
static char UNUSED id[] = "$Id: array.c,v 1.15 2007/11/18 15:05:35 alex Exp $";
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include "log.h"
/* Enable more Debug messages in alloc / append / memmove code. */
/* #define DEBUG_ARRAY */
#define array_UNUSABLE(x) ( !(x)->mem || (0 == (x)->allocated) )
#define ALIGN_32U(x) (((x)+(unsigned)31 ) & ~((unsigned)31))
#define ALIGN_1024U(x) (((x)+(unsigned)1023) & ~((unsigned)1023))
#define ALIGN_4096U(x) (((x)+(unsigned)4095) & ~((unsigned)4095))
static bool
safemult_sizet(size_t a, size_t b, size_t *res)
{
size_t tmp = a * b;
if (b && (tmp / b != a))
return false;
*res = tmp;
return true;
}
void
array_init(array *a)
{
assert(a != NULL);
a->mem = NULL;
a->allocated = 0;
a->used = 0;
}
/* if realloc() fails, array_alloc return NULL. otherwise return pointer to elem pos in array */
void *
array_alloc(array * a, size_t size, size_t pos)
{
size_t alloc, pos_plus1 = pos + 1;
size_t aligned = 0;
char *tmp;
assert(size > 0);
if (pos_plus1 == 0 || !safemult_sizet(size, pos_plus1, &alloc))
return NULL;
if (a->allocated < alloc) {
if (alloc < 128) {
aligned = ALIGN_32U(alloc);
} else {
if (alloc < 4096) {
aligned = ALIGN_1024U(alloc);
} else {
aligned = ALIGN_4096U(alloc);
}
}
#ifdef DEBUG_ARRAY
Log(LOG_DEBUG, "array_alloc(): rounded %u to %u bytes.", alloc, aligned);
#endif
assert(aligned >= alloc);
if (aligned < alloc) /* rounding overflow */
return NULL;
alloc = aligned;
#ifdef DEBUG_ARRAY
Log(LOG_DEBUG, "array_alloc(): changing size from %u to %u bytes.",
a->allocated, aligned);
#endif
tmp = realloc(a->mem, alloc);
if (!tmp)
return NULL;
a->mem = tmp;
a->allocated = alloc;
assert(a->allocated > a->used);
memset(a->mem + a->used, 0, a->allocated - a->used);
a->used = alloc;
}
return a->mem + (pos * size);
}
/*return number of initialized ELEMS in a. */
size_t
array_length(const array * const a, size_t membersize)
{
assert(a != NULL);
assert(membersize > 0);
if (array_UNUSABLE(a))
return 0;
return membersize ? a->used / membersize : 0;
}
/* copy array src to array dest */
bool
array_copy(array * dest, const array * const src)
{
if (array_UNUSABLE(src))
return false;
return array_copyb(dest, src->mem, src->used);
}
/* return false on failure (realloc failure, invalid src/dest array) */
bool
array_copyb(array * dest, const char *src, size_t len)
{
assert(dest != NULL);
assert(src != NULL );
if (!src || !dest)
return false;
array_trunc(dest);
return array_catb(dest, src, len);
}
/* copy string to dest */
bool
array_copys(array * dest, const char *src)
{
return array_copyb(dest, src, strlen(src));
}
/* append len bytes from src to the array dest.
return false if we could not append all bytes (realloc failure, invalid src/dest array) */
bool
array_catb(array * dest, const char *src, size_t len)
{
size_t tmp;
size_t used;
char *ptr;
assert(dest != NULL);
assert(src != NULL);
if (!len)
return true;
if (!src || !dest)
return false;
used = dest->used;
tmp = used + len;
if (tmp < used || tmp < len) /* integer overflow */
return false;
if (!array_alloc(dest, 1, tmp))
return false;
ptr = dest->mem;
assert(ptr != NULL);
#ifdef DEBUG_ARRAY
Log(LOG_DEBUG,
"array_catb(): appending %u bytes to array (now %u bytes in array).",
len, tmp);
#endif
memcpy(ptr + used, src, len);
dest->used = tmp;
return true;
}
/* append string to dest */
bool
array_cats(array * dest, const char *src)
{
return array_catb(dest, src, strlen(src));
}
/* append trailing NUL byte to array */
bool
array_cat0(array * a)
{
return array_catb(a, "", 1);
}
/* append trailing NUL byte to array, but do not count it. */
bool
array_cat0_temporary(array * a)
{
char *endpos = array_alloc(a, 1, array_bytes(a));
if (!endpos)
return false;
*endpos = '\0';
return true;
}
/* add contents of array src to array dest. */
bool
array_cat(array * dest, const array * const src)
{
if (array_UNUSABLE(src))
return false;
return array_catb(dest, src->mem, src->used);
}
/* return pointer to the element at pos.
return NULL if the array is unallocated, or if pos is larger than
the number of elements stored int the array. */
void *
array_get(array * a, size_t membersize, size_t pos)
{
size_t totalsize;
size_t posplus1 = pos + 1;
assert(membersize > 0);
assert(a != NULL);
if (!posplus1 || array_UNUSABLE(a))
return NULL;
if (!safemult_sizet(posplus1, membersize, &totalsize))
return NULL;
if (a->allocated < totalsize)
return NULL;
totalsize = pos * membersize;
return a->mem + totalsize;
}
void
array_free(array * a)
{
assert(a != NULL);
#ifdef DEBUG_ARRAY
Log(LOG_DEBUG,
"array_free(): %u bytes free'd (%u bytes still used at time of free()).",
a->allocated, a->used);
#endif
free(a->mem);
a->mem = NULL;
a->allocated = 0;
a->used = 0;
}
void *
array_start(const array * const a)
{
assert(a != NULL);
return a->mem;
}
void
array_trunc(array * a)
{
assert(a != NULL);
a->used = 0;
}
void
array_truncate(array * a, size_t membersize, size_t len)
{
size_t newlen;
assert(a != NULL);
if (!safemult_sizet(membersize, len, &newlen))
return;
if (newlen <= a->allocated)
a->used = newlen;
}
/* move elements starting at pos to beginning of array */
void
array_moveleft(array * a, size_t membersize, size_t pos)
{
size_t bytepos;
assert(a != NULL);
assert(membersize > 0);
if (!safemult_sizet(membersize, pos, &bytepos)) {
a->used = 0;
return;
}
if (!bytepos)
return; /* nothing to do */
#ifdef DEBUG_ARRAY
Log(LOG_DEBUG,
"array_moveleft(): %u bytes used in array, starting at position %u.",
a->used, bytepos);
#endif
if (a->used <= bytepos) {
a->used = 0;
return;
}
a->used -= bytepos;
memmove(a->mem, a->mem + bytepos, a->used);
}
/* -eof- */

View File

@@ -1,101 +0,0 @@
/*
* 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.
*
* libarray - dynamically allocate arrays.
* Copyright (c) 2005 Florian Westphal (westphal@foo.fh-furtwangen.de)
*
* $Id: array.h,v 1.4 2005/08/30 13:36:32 fw Exp $
*/
#ifndef array_h_included
#define array_h_included
#include "portab.h"
typedef struct {
char * mem;
size_t allocated;
size_t used;
} array;
/* allocated: mem != NULL, used >= 0 && used <= allocated, allocated > 0
unallocated: mem == NULL, allocated == 0, used == 0 */
#define array_unallocated(x) (array_bytes(x)==0)
#define INIT_ARRAY { NULL, 0, 0 }
/* set all variables in a to 0 */
extern void array_init PARAMS((array *a));
/* allocates space for at least nmemb+1 elements of size bytes each.
return pointer to elem at pos, or NULL if realloc() fails */
extern void * array_alloc PARAMS((array *a, size_t size, size_t pos));
/* returns the number of initialized BYTES in a. */
#define array_bytes(array) ( (array)->used )
/* returns the number of initialized ELEMS in a. */
extern size_t array_length PARAMS((const array* const a, size_t elemsize));
/* _copy functions: copy src to dest.
return true if OK, else false (e. g. realloc failure, invalid src/dest
array, ...). In that case dest is left unchanged. */
/* copy array src to dest */
extern bool array_copy PARAMS((array* dest, const array* const src));
/* copy len bytes from src to array dest. */
extern bool array_copyb PARAMS((array* dest, const char* src, size_t len));
/* copy string to dest */
extern bool array_copys PARAMS((array* dest, const char* src));
/* _cat functions: append src to dest.
return true if OK, else false (e. g. realloc failure, invalid src/dest
array, ...). In that case dest is left unchanged. */
/* append len bytes from src to array dest. */
extern bool array_catb PARAMS((array* dest, const char* src, size_t len));
/* append string to dest */
extern bool array_cats PARAMS((array* dest, const char* src));
/* append NUL byte to dest */
extern bool array_cat0 PARAMS((array* dest));
/* append NUL byte to dest, but do not count null byte */
extern bool array_cat0_temporary PARAMS((array* dest));
/* append contents of array src to array dest. */
extern bool array_cat PARAMS((array* dest, const array* const src));
/* return pointer to element at pos.
return NULL if the array is unallocated or if pos is larger than the number
of elements stored int the array. */
extern void* array_get PARAMS((array* a, size_t membersize, size_t pos));
/* free the contents of this array. */
extern void array_free PARAMS((array* a));
/* overwrite array with zeroes before free */
extern void array_free_wipe PARAMS((array* a));
/* return pointer to first element in this array */
extern void* array_start PARAMS((const array* const a));
/* reset this array (the memory is not free'd */
extern void array_trunc PARAMS((array* a));
/* set number of used elements in this array to len */
extern void array_truncate PARAMS((array* a, size_t membersize, size_t len));
/* move elements starting at pos to beginning of array */
extern void array_moveleft PARAMS((array* a, size_t membersize, size_t pos));
#endif
/* -eof- */

View File

@@ -17,13 +17,12 @@
#include "portab.h"
static char UNUSED id[] = "$Id: channel.c,v 1.63 2007/06/11 20:06:46 fw Exp $";
static char UNUSED id[] = "$Id: channel.c,v 1.50 2005/06/18 08:57:37 fw Exp $";
#include "imp.h"
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <strings.h>
#include "defines.h"
@@ -50,16 +49,16 @@ static char UNUSED id[] = "$Id: channel.c,v 1.63 2007/06/11 20:06:46 fw Exp $";
#define REMOVE_KICK 2
static CHANNEL *My_Channels;
static CL2CHAN *My_Cl2Chan;
LOCAL CHANNEL *My_Channels;
LOCAL 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, char *Reason, bool InformServer ));
static CL2CHAN *Get_First_Cl2Chan PARAMS(( CLIENT *Client, CHANNEL *Chan ));
static CL2CHAN *Get_Next_Cl2Chan PARAMS(( CL2CHAN *Start, CLIENT *Client, CHANNEL *Chan ));
static bool Delete_Channel PARAMS(( CHANNEL *Chan ));
LOCAL CL2CHAN *Get_Cl2Chan PARAMS(( CHANNEL *Chan, CLIENT *Client ));
LOCAL CL2CHAN *Add_Client PARAMS(( CHANNEL *Chan, CLIENT *Client ));
LOCAL bool Remove_Client PARAMS(( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Reason, bool InformServer ));
LOCAL CL2CHAN *Get_First_Cl2Chan PARAMS(( CLIENT *Client, CHANNEL *Chan ));
LOCAL CL2CHAN *Get_Next_Cl2Chan PARAMS(( CL2CHAN *Start, CLIENT *Client, CHANNEL *Chan ));
LOCAL bool Delete_Channel PARAMS(( CHANNEL *Chan ));
GLOBAL void
@@ -70,22 +69,6 @@ Channel_Init( void )
} /* Channel_Init */
GLOBAL struct list_head *
Channel_GetListBans(CHANNEL *c)
{
assert(c != NULL);
return &c->list_bans;
}
GLOBAL struct list_head *
Channel_GetListInvites(CHANNEL *c)
{
assert(c != NULL);
return &c->list_invites;
}
GLOBAL void
Channel_InitPredefined( void )
{
@@ -93,7 +76,7 @@ Channel_InitPredefined( void )
CHANNEL *chan;
char *c;
unsigned int i;
int i;
for( i = 0; i < Conf_Channel_Count; i++ )
{
@@ -104,7 +87,6 @@ Channel_InitPredefined( void )
if( ! Channel_IsValidName( Conf_Channel[i].name ))
{
Log( LOG_ERR, "Can't create pre-defined channel: invalid name: \"%s\"!", Conf_Channel[i].name );
array_free(&Conf_Channel[i].topic);
continue;
}
@@ -113,32 +95,20 @@ Channel_InitPredefined( void )
if( chan )
{
Log( LOG_INFO, "Can't create pre-defined channel \"%s\": name already in use.", Conf_Channel[i].name );
array_free(&Conf_Channel[i].topic);
continue;
}
/* Create channel */
chan = Channel_Create(Conf_Channel[i].name);
if (chan) {
Channel_ModeAdd(chan, 'P');
if (array_start(&Conf_Channel[i].topic) != NULL)
Channel_SetTopic(chan, NULL,
array_start(&Conf_Channel[i].topic));
array_free(&Conf_Channel[i].topic);
/* Channel anlegen */
chan = Channel_Create( Conf_Channel[i].name );
if( chan )
{
Channel_ModeAdd( chan, 'P' );
Channel_SetTopic( chan, Conf_Channel[i].topic );
c = Conf_Channel[i].modes;
while (*c)
Channel_ModeAdd(chan, *c++);
Channel_SetKey(chan, Conf_Channel[i].key);
Channel_SetMaxUsers(chan, Conf_Channel[i].maxusers);
Log(LOG_INFO, "Created pre-defined channel \"%s\".",
Conf_Channel[i].name );
while( *c ) Channel_ModeAdd( chan, *c++ );
Log( LOG_INFO, "Created pre-defined channel \"%s\".", Conf_Channel[i].name );
}
else Log(LOG_ERR, "Can't create pre-defined channel \"%s\"!",
Conf_Channel[i].name );
else Log( LOG_ERR, "Can't create pre-defined channel \"%s\"!", Conf_Channel[i].name );
}
} /* Channel_InitPredefined */
@@ -148,13 +118,12 @@ Channel_Exit( void )
{
CHANNEL *c, *c_next;
CL2CHAN *cl2chan, *cl2chan_next;
/* Channel-Strukturen freigeben */
c = My_Channels;
while( c )
{
c_next = c->next;
array_free(&c->topic);
free( c );
c = c_next;
}
@@ -178,13 +147,17 @@ Channel_Join( CLIENT *Client, char *Name )
assert( Client != NULL );
assert( Name != NULL );
if( ! Channel_IsValidName( Name )) {
/* Valider Channel-Name? */
if( ! Channel_IsValidName( Name ))
{
IRC_WriteStrClient( Client, ERR_NOSUCHCHANNEL_MSG, Client_ID( Client ), Name );
return false;
}
/* Channel suchen */
chan = Channel_Search( Name );
if( chan ) {
if( chan )
{
/* Ist der Client bereits Mitglied? */
if( Get_Cl2Chan( chan, Client )) return false;
}
@@ -192,7 +165,7 @@ Channel_Join( CLIENT *Client, char *Name )
{
/* Gibt es noch nicht? Dann neu anlegen: */
chan = Channel_Create( Name );
if (!chan) return false;
if( ! chan ) return false;
}
/* User dem Channel hinzufuegen */
@@ -210,6 +183,7 @@ Channel_Part( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason )
assert( Name != NULL );
assert( Reason != NULL );
/* Channel suchen */
chan = Channel_Search( Name );
if(( ! chan ) || ( ! Get_Cl2Chan( chan, Client )))
{
@@ -233,6 +207,7 @@ Channel_Kick( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason )
assert( Name != NULL );
assert( Reason != NULL );
/* Channel suchen */
chan = Channel_Search( Name );
if( ! chan )
{
@@ -240,20 +215,21 @@ Channel_Kick( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason )
return;
}
/* Ist der User Mitglied in dem Channel? */
if( ! Channel_IsMemberOf( chan, Origin ))
{
IRC_WriteStrClient( Origin, ERR_NOTONCHANNEL_MSG, Client_ID( Origin ), Name );
return;
}
/* Is User Channel-Operator? */
/* Ist der User Channel-Operator? */
if( ! strchr( Channel_UserModes( chan, Origin ), 'o' ))
{
IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Name);
return;
}
/* Ist the kickED User member of channel? */
/* Ist der Ziel-User Mitglied im Channel? */
if( ! Channel_IsMemberOf( chan, Client ))
{
IRC_WriteStrClient( Origin, ERR_USERNOTINCHANNEL_MSG, Client_ID( Origin ), Client_ID( Client ), Name );
@@ -284,11 +260,11 @@ Channel_Quit( CLIENT *Client, char *Reason )
} /* Channel_Quit */
GLOBAL unsigned long
GLOBAL long
Channel_Count( void )
{
CHANNEL *c;
unsigned long count = 0;
long count = 0;
c = My_Channels;
while( c )
@@ -300,11 +276,11 @@ Channel_Count( void )
} /* Channel_Count */
GLOBAL unsigned long
GLOBAL long
Channel_MemberCount( CHANNEL *Chan )
{
CL2CHAN *cl2chan;
unsigned long count = 0;
long count = 0;
assert( Chan != NULL );
@@ -339,9 +315,27 @@ Channel_CountForUser( CLIENT *Client )
} /* Channel_CountForUser */
GLOBAL int
Channel_PCount( void )
{
/* Count the number of persistent (mode 'P') channels */
GLOBAL const char *
Channel_Name( const CHANNEL *Chan )
CHANNEL *chan;
int count = 0;
chan = My_Channels;
while( chan )
{
if( strchr( chan->modes, 'P' )) count++;
chan = chan->next;
}
return count;
} /* Channel_PCount */
GLOBAL char *
Channel_Name( CHANNEL *Chan )
{
assert( Chan != NULL );
return Chan->name;
@@ -364,7 +358,7 @@ Channel_Key( CHANNEL *Chan )
} /* Channel_Key */
GLOBAL unsigned long
GLOBAL long
Channel_MaxUsers( CHANNEL *Chan )
{
assert( Chan != NULL );
@@ -463,13 +457,25 @@ Channel_GetChannel( CL2CHAN *Cl2Chan )
GLOBAL bool
Channel_IsValidName( const char *Name )
Channel_IsValidName( char *Name )
{
/* Pruefen, ob Name als Channelname gueltig */
char *ptr, badchars[10];
assert( Name != NULL );
if(( Name[0] != '#' ) || ( strlen( Name ) >= CHANNEL_NAME_LEN )) return false;
return Name[strcspn(Name, " ,:\007")] == 0;
ptr = Name;
strcpy( badchars, " ,:\007" );
while( *ptr )
{
if( strchr( badchars, *ptr )) return false;
ptr++;
}
return true;
} /* Channel_IsValidName */
@@ -503,11 +509,13 @@ Channel_ModeDel( CHANNEL *Chan, char Mode )
* if the mode was removed return true.
* if the channel did not have the mode, return false.
*/
char *p;
char x[2], *p;
assert( Chan != NULL );
p = strchr( Chan->modes, Mode );
x[0] = Mode; x[1] = '\0';
p = strchr( Chan->modes, x[0] );
if( ! p ) return false;
/* Channel has mode -> delete */
@@ -536,7 +544,7 @@ Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, char Mode )
cl2chan = Get_Cl2Chan( Chan, Client );
assert( cl2chan != NULL );
x[0] = Mode; x[1] = '\0';
if( ! strchr( cl2chan->modes, x[0] ))
{
@@ -557,7 +565,7 @@ Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, char Mode )
*/
CL2CHAN *cl2chan;
char *p;
char x[2], *p;
assert( Chan != NULL );
assert( Client != NULL );
@@ -565,7 +573,9 @@ Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, char Mode )
cl2chan = Get_Cl2Chan( Chan, Client );
assert( cl2chan != NULL );
p = strchr( cl2chan->modes, Mode );
x[0] = Mode; x[1] = '\0';
p = strchr( cl2chan->modes, x[0] );
if( ! p ) return false;
/* Client has Mode -> delete */
@@ -582,7 +592,7 @@ GLOBAL char *
Channel_UserModes( CHANNEL *Chan, CLIENT *Client )
{
/* return Users' Channel-Modes */
CL2CHAN *cl2chan;
assert( Chan != NULL );
@@ -602,65 +612,27 @@ Channel_IsMemberOf( CHANNEL *Chan, CLIENT *Client )
assert( Chan != NULL );
assert( Client != NULL );
return Get_Cl2Chan(Chan, Client) != NULL;
if( Get_Cl2Chan( Chan, Client )) return true;
else return false;
} /* Channel_IsMemberOf */
GLOBAL char *
Channel_Topic( CHANNEL *Chan )
{
char *ret;
assert( Chan != NULL );
ret = array_start(&Chan->topic);
return ret ? ret : "";
return Chan->topic;
} /* Channel_Topic */
#ifndef STRICT_RFC
GLOBAL unsigned int
Channel_TopicTime(CHANNEL *Chan)
{
assert(Chan != NULL);
return (unsigned int) Chan->topic_time;
} /* Channel_TopicTime */
GLOBAL char *
Channel_TopicWho(CHANNEL *Chan)
{
assert(Chan != NULL);
return Chan->topic_who;
} /* Channel_TopicWho */
#endif
GLOBAL void
Channel_SetTopic(CHANNEL *Chan, CLIENT *Client, char *Topic)
Channel_SetTopic( CHANNEL *Chan, char *Topic )
{
size_t len;
assert( Chan != NULL );
assert( Topic != NULL );
len = strlen(Topic);
if (len < array_bytes(&Chan->topic))
array_free(&Chan->topic);
if (len >= COMMAND_LEN || !array_copyb(&Chan->topic, Topic, len+1))
Log(LOG_WARNING, "could not set new Topic \"%s\" on %s: %s",
Topic, Chan->name, strerror(errno));
#ifndef STRICT_RFC
Chan->topic_time = time(NULL);
if (Client != NULL && Client_Type(Client) != CLIENT_SERVER)
strlcpy(Chan->topic_who, Client_ID(Client),
sizeof Chan->topic_who);
else
strlcpy(Chan->topic_who, DEFAULT_TOPIC_ID,
sizeof Chan->topic_who);
#else
(void) Client;
#endif
strlcpy( Chan->topic, Topic, sizeof( Chan->topic ));
} /* Channel_SetTopic */
@@ -681,17 +653,17 @@ Channel_SetKey( CHANNEL *Chan, char *Key )
assert( Key != NULL );
strlcpy( Chan->key, Key, sizeof( Chan->key ));
LogDebug("Channel %s: Key is now \"%s\".", Chan->name, Chan->key );
Log( LOG_DEBUG, "Channel %s: Key is now \"%s\".", Chan->name, Chan->key );
} /* Channel_SetKey */
GLOBAL void
Channel_SetMaxUsers(CHANNEL *Chan, unsigned long Count)
Channel_SetMaxUsers( CHANNEL *Chan, long Count )
{
assert( Chan != NULL );
Chan->maxusers = Count;
LogDebug("Channel %s: Member limit is now %lu.", Chan->name, Chan->maxusers );
Log( LOG_DEBUG, "Channel %s: Member limit is now %ld.", Chan->name, Chan->maxusers );
} /* Channel_SetMaxUsers */
@@ -713,11 +685,11 @@ Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, char *Text )
ok = true;
if( strchr( Channel_Modes( Chan ), 'n' ) && ( ! is_member )) ok = false;
if( strchr( Channel_Modes( Chan ), 'm' ) && ( ! is_op ) && ( ! has_voice )) ok = false;
/* Is the client banned? */
if( Lists_Check(&Chan->list_bans, From))
if( Lists_CheckBanned( From, Chan ))
{
/* Client is banned, but is he channel operator or has voice? */
/* Client is banned, bus is he channel operator or has voice? */
if(( ! has_voice ) && ( ! is_op )) ok = false;
}
@@ -736,7 +708,7 @@ Channel_Create( char *Name )
CHANNEL *c;
assert( Name != NULL );
c = (CHANNEL *)malloc( sizeof( CHANNEL ));
if( ! c )
{
@@ -748,12 +720,14 @@ Channel_Create( char *Name )
c->hash = Hash( c->name );
c->next = My_Channels;
My_Channels = c;
LogDebug("Created new channel structure for \"%s\".", Name);
Log( LOG_DEBUG, "Created new channel structure for \"%s\".", Name );
return c;
} /* Channel_Create */
static CL2CHAN *
LOCAL CL2CHAN *
Get_Cl2Chan( CHANNEL *Chan, CLIENT *Client )
{
CL2CHAN *cl2chan;
@@ -771,7 +745,7 @@ Get_Cl2Chan( CHANNEL *Chan, CLIENT *Client )
} /* Get_Cl2Chan */
static CL2CHAN *
LOCAL CL2CHAN *
Add_Client( CHANNEL *Chan, CLIENT *Client )
{
CL2CHAN *cl2chan;
@@ -800,7 +774,7 @@ Add_Client( CHANNEL *Chan, CLIENT *Client )
} /* Add_Client */
static bool
LOCAL bool
Remove_Client( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Reason, bool InformServer )
{
CL2CHAN *cl2chan, *last_cl2chan;
@@ -832,42 +806,25 @@ Remove_Client( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Re
switch( Type )
{
case REMOVE_QUIT:
/* QUIT: other servers have already been notified, see Client_Destroy();
* so only inform other clients in same channel. */
/* QUIT: andere Server wurden bereits informiert, vgl. Client_Destroy();
* hier also "nur" noch alle User in betroffenen Channeln infomieren */
assert( InformServer == false );
LogDebug("User \"%s\" left channel \"%s\" (%s).",
Client_Mask( Client ), c->name, Reason );
Log( LOG_DEBUG, "User \"%s\" left channel \"%s\" (%s).", Client_Mask( Client ), c->name, Reason );
break;
case REMOVE_KICK:
/* User was KICKed: inform other servers and all users in channel */
if( InformServer )
IRC_WriteStrServersPrefix( Client_NextHop( Origin ),
Origin, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason);
IRC_WriteStrChannelPrefix(Client, c, Origin, false, "KICK %s %s :%s",
c->name, Client_ID( Client ), Reason );
if ((Client_Conn(Client) > NONE) &&
(Client_Type(Client) == CLIENT_USER))
{
IRC_WriteStrClientPrefix(Client, Origin, "KICK %s %s :%s",
c->name, Client_ID( Client ), Reason);
}
LogDebug("User \"%s\" has been kicked of \"%s\" by \"%s\": %s.",
Client_Mask( Client ), c->name, Client_ID(Origin), Reason);
/* User wurde geKICKed: ggf. andere Server sowie alle betroffenen User
* im entsprechenden Channel informieren */
if( InformServer ) IRC_WriteStrServersPrefix( Client_NextHop( Origin ), Origin, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason );
IRC_WriteStrChannelPrefix( Client, c, Origin, false, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason );
if(( Client_Conn( Client ) > NONE ) && ( Client_Type( Client ) == CLIENT_USER )) IRC_WriteStrClientPrefix( Client, Origin, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason );
Log( LOG_DEBUG, "User \"%s\" has been kicked of \"%s\" by \"%s\": %s.", Client_Mask( Client ), c->name, Client_ID( Origin ), Reason );
break;
default: /* PART */
if (InformServer)
IRC_WriteStrServersPrefix(Origin, Client, "PART %s :%s", c->name, Reason);
IRC_WriteStrChannelPrefix(Origin, c, Client, false, "PART %s :%s",
c->name, Reason);
if ((Client_Conn(Origin) > NONE) &&
(Client_Type(Origin) == CLIENT_USER))
{
IRC_WriteStrClientPrefix( Origin, Client, "PART %s :%s", c->name, Reason);
LogDebug("User \"%s\" left channel \"%s\" (%s).",
Client_Mask(Client), c->name, Reason);
}
default:
/* PART */
if( InformServer ) IRC_WriteStrServersPrefix( Origin, Client, "PART %s :%s", c->name, Reason );
IRC_WriteStrChannelPrefix( Origin, c, Client, false, "PART %s :%s", c->name, Reason );
if(( Client_Conn( Origin ) > NONE ) && ( Client_Type( Origin ) == CLIENT_USER )) IRC_WriteStrClientPrefix( Origin, Client, "PART %s :%s", c->name, Reason );
Log( LOG_DEBUG, "User \"%s\" left channel \"%s\" (%s).", Client_Mask( Client ), c->name, Reason );
}
/* Wenn Channel nun leer und nicht pre-defined: loeschen */
@@ -880,76 +837,14 @@ Remove_Client( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Re
} /* Remove_Client */
GLOBAL bool
Channel_AddBan(CHANNEL *c, const char *mask )
{
struct list_head *h = Channel_GetListBans(c);
return Lists_Add(h, mask, false);
}
GLOBAL bool
Channel_AddInvite(CHANNEL *c, const char *mask, bool onlyonce)
{
struct list_head *h = Channel_GetListInvites(c);
return Lists_Add(h, mask, onlyonce);
}
static bool
ShowInvitesBans(struct list_head *head, CLIENT *Client, CHANNEL *Channel, bool invite)
{
struct list_elem *e;
char *msg = invite ? RPL_INVITELIST_MSG : RPL_BANLIST_MSG;
char *msg_end;
assert( Client != NULL );
assert( Channel != NULL );
e = Lists_GetFirst(head);
while (e) {
if( ! IRC_WriteStrClient( Client, msg, Client_ID( Client ),
Channel_Name( Channel ), Lists_GetMask(e) )) return DISCONNECTED;
e = Lists_GetNext(e);
}
msg_end = invite ? RPL_ENDOFINVITELIST_MSG : RPL_ENDOFBANLIST_MSG;
return IRC_WriteStrClient( Client, msg_end, Client_ID( Client ), Channel_Name( Channel ));
}
GLOBAL bool
Channel_ShowBans( CLIENT *Client, CHANNEL *Channel )
{
struct list_head *h;
assert( Channel != NULL );
h = Channel_GetListBans(Channel);
return ShowInvitesBans(h, Client, Channel, false);
}
GLOBAL bool
Channel_ShowInvites( CLIENT *Client, CHANNEL *Channel )
{
struct list_head *h;
assert( Channel != NULL );
h = Channel_GetListInvites(Channel);
return ShowInvitesBans(h, Client, Channel, true);
}
static CL2CHAN *
LOCAL CL2CHAN *
Get_First_Cl2Chan( CLIENT *Client, CHANNEL *Chan )
{
return Get_Next_Cl2Chan( My_Cl2Chan, Client, Chan );
} /* Get_First_Cl2Chan */
static CL2CHAN *
LOCAL CL2CHAN *
Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Channel )
{
CL2CHAN *cl2chan;
@@ -967,11 +862,11 @@ Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Channel )
} /* Get_Next_Cl2Chan */
static bool
LOCAL bool
Delete_Channel( CHANNEL *Chan )
{
/* Channel-Struktur loeschen */
CHANNEL *chan, *last_chan;
last_chan = NULL;
@@ -987,14 +882,13 @@ Delete_Channel( CHANNEL *Chan )
Log( LOG_DEBUG, "Freed channel structure for \"%s\".", Chan->name );
/* Invite- und Ban-Lists aufraeumen */
Lists_Free( &chan->list_bans );
Lists_Free( &chan->list_invites );
Lists_DeleteChannel( chan );
/* Neu verketten und freigeben */
if( last_chan ) last_chan->next = chan->next;
else My_Channels = chan->next;
free( chan );
return true;
} /* Delete_Channel */

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: channel.h,v 1.33 2006/12/07 22:23:39 fw Exp $
* $Id: channel.h,v 1.27 2005/03/19 18:43:48 fw Exp $
*
* Channel management (header)
*/
@@ -20,9 +20,7 @@
#if defined(__channel_c__) | defined(S_SPLINT_S)
#include "lists.h"
#include "defines.h"
#include "array.h"
typedef struct _CHANNEL
{
@@ -30,15 +28,9 @@ typedef struct _CHANNEL
char name[CHANNEL_NAME_LEN]; /* Name of the channel */
UINT32 hash; /* Hash of the (lowecase!) name */
char modes[CHANNEL_MODE_LEN]; /* Channel modes */
array topic; /* Topic of the channel */
#ifndef STRICT_RFC
time_t topic_time; /* Time when topic was set */
char topic_who[CLIENT_NICK_LEN];/* Nickname of user that set topic */
#endif
char topic[CHANNEL_TOPIC_LEN]; /* Topic of the channel */
char key[CLIENT_PASS_LEN]; /* Channel key ("password", mode "k" ) */
unsigned long maxusers; /* Maximum number of members (mode "l") */
struct list_head list_bans; /* list head of banned users */
struct list_head list_invites; /* list head of invited users */
long maxusers; /* Maximum number of members (mode "l") */
} CHANNEL;
typedef struct _CLIENT2CHAN
@@ -56,8 +48,6 @@ typedef POINTER CL2CHAN;
#endif
GLOBAL struct list_head *Channel_GetListBans PARAMS((CHANNEL *c));
GLOBAL struct list_head *Channel_GetListInvites PARAMS((CHANNEL *c));
GLOBAL void Channel_Init PARAMS(( void ));
GLOBAL void Channel_InitPredefined PARAMS(( void ));
@@ -70,20 +60,21 @@ GLOBAL void Channel_Quit PARAMS(( CLIENT *Client, char *Reason ));
GLOBAL void Channel_Kick PARAMS(( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason ));
GLOBAL unsigned long Channel_Count PARAMS(( void ));
GLOBAL unsigned long Channel_MemberCount PARAMS(( CHANNEL *Chan ));
GLOBAL long Channel_Count PARAMS(( void ));
GLOBAL long Channel_MemberCount PARAMS(( CHANNEL *Chan ));
GLOBAL int Channel_CountForUser PARAMS(( CLIENT *Client ));
GLOBAL int Channel_PCount PARAMS(( void ));
GLOBAL const char *Channel_Name PARAMS(( const CHANNEL *Chan ));
GLOBAL char *Channel_Name PARAMS(( CHANNEL *Chan ));
GLOBAL char *Channel_Modes PARAMS(( CHANNEL *Chan ));
GLOBAL char *Channel_Topic PARAMS(( CHANNEL *Chan ));
GLOBAL char *Channel_Key PARAMS(( CHANNEL *Chan ));
GLOBAL unsigned long Channel_MaxUsers PARAMS(( CHANNEL *Chan ));
GLOBAL long Channel_MaxUsers PARAMS(( CHANNEL *Chan ));
GLOBAL void Channel_SetTopic PARAMS(( CHANNEL *Chan, CLIENT *Client, char *Topic ));
GLOBAL void Channel_SetTopic PARAMS(( CHANNEL *Chan, char *Topic ));
GLOBAL void Channel_SetModes PARAMS(( CHANNEL *Chan, char *Modes ));
GLOBAL void Channel_SetKey PARAMS(( CHANNEL *Chan, char *Key ));
GLOBAL void Channel_SetMaxUsers PARAMS(( CHANNEL *Chan, unsigned long Count ));
GLOBAL void Channel_SetMaxUsers PARAMS(( CHANNEL *Chan, long Count ));
GLOBAL CHANNEL *Channel_Search PARAMS(( char *Name ));
@@ -98,7 +89,7 @@ GLOBAL CL2CHAN *Channel_NextChannelOf PARAMS(( CLIENT *Client, CL2CHAN *Cl2Chan
GLOBAL CLIENT *Channel_GetClient PARAMS(( CL2CHAN *Cl2Chan ));
GLOBAL CHANNEL *Channel_GetChannel PARAMS(( CL2CHAN *Cl2Chan ));
GLOBAL bool Channel_IsValidName PARAMS(( const char *Name ));
GLOBAL bool Channel_IsValidName PARAMS(( char *Name ));
GLOBAL bool Channel_ModeAdd PARAMS(( CHANNEL *Chan, char Mode ));
GLOBAL bool Channel_ModeDel PARAMS(( CHANNEL *Chan, char Mode ));
@@ -113,15 +104,8 @@ GLOBAL bool Channel_Write PARAMS(( CHANNEL *Chan, CLIENT *From, CLIENT *Client,
GLOBAL CHANNEL *Channel_Create PARAMS(( char *Name ));
#ifndef STRICT_RFC
GLOBAL unsigned int Channel_TopicTime PARAMS(( CHANNEL *Chan ));
GLOBAL char *Channel_TopicWho PARAMS(( CHANNEL *Chan ));
#endif
GLOBAL bool Channel_AddInvite PARAMS((CHANNEL *c, const char *Mask, bool OnlyOnce ));
GLOBAL bool Channel_AddBan PARAMS((CHANNEL *c, const char *Mask ));
GLOBAL bool Channel_ShowBans PARAMS((CLIENT *client, CHANNEL *c));
GLOBAL bool Channel_ShowInvites PARAMS((CLIENT *client, CHANNEL *c));
#endif
/* -eof- */

View File

@@ -17,7 +17,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: client.c,v 1.97 2007/11/21 12:16:36 alex Exp $";
static char UNUSED id[] = "$Id: client.c,v 1.84.2.1 2006/03/24 23:30:34 fw Exp $";
#include "imp.h"
#include <assert.h>
@@ -50,23 +50,23 @@ static char UNUSED id[] = "$Id: client.c,v 1.97 2007/11/21 12:16:36 alex Exp $";
#define GETID_LEN (CLIENT_NICK_LEN-1) + 1 + (CLIENT_USER_LEN-1) + 1 + (CLIENT_HOST_LEN-1) + 1
static CLIENT *This_Server, *My_Clients;
static char GetID_Buffer[GETID_LEN];
LOCAL CLIENT *This_Server, *My_Clients;
LOCAL char GetID_Buffer[GETID_LEN];
static WHOWAS My_Whowas[MAX_WHOWAS];
static int Last_Whowas = -1;
LOCAL WHOWAS My_Whowas[MAX_WHOWAS];
LOCAL int Last_Whowas = -1;
static unsigned long Count PARAMS(( CLIENT_TYPE Type ));
static unsigned long MyCount PARAMS(( CLIENT_TYPE Type ));
LOCAL long Count PARAMS(( CLIENT_TYPE Type ));
LOCAL long MyCount PARAMS(( CLIENT_TYPE Type ));
static CLIENT *New_Client_Struct PARAMS(( void ));
static void Generate_MyToken PARAMS(( CLIENT *Client ));
static void Adjust_Counters PARAMS(( CLIENT *Client ));
LOCAL CLIENT *New_Client_Struct PARAMS(( void ));
LOCAL void Generate_MyToken PARAMS(( CLIENT *Client ));
LOCAL void Adjust_Counters PARAMS(( CLIENT *Client ));
static CLIENT *Init_New_Client PARAMS((CONN_ID Idx, CLIENT *Introducer,
CLIENT *TopServer, int Type, char *ID, char *User, char *Hostname,
char *Info, int Hops, int Token, char *Modes, bool Idented));
#ifndef Client_DestroyNow
GLOBAL void Client_DestroyNow PARAMS((CLIENT *Client ));
#endif
long Max_Users = 0, My_Max_Users = 0;
@@ -94,10 +94,9 @@ Client_Init( void )
This_Server->hops = 0;
gethostname( This_Server->host, CLIENT_HOST_LEN );
if (!Conf_NoDNS) {
h = gethostbyname( This_Server->host );
if (h) strlcpy(This_Server->host, h->h_name, sizeof(This_Server->host));
}
h = gethostbyname( This_Server->host );
if( h ) strlcpy( This_Server->host, h->h_name, sizeof( This_Server->host ));
Client_SetID( This_Server, Conf_ServerName );
Client_SetInfo( This_Server, Conf_ServerInfo );
@@ -136,53 +135,32 @@ Client_ThisServer( void )
} /* Client_ThisServer */
/**
* Initialize new local client; wrapper function for Init_New_Client().
* @return New CLIENT structure.
*/
GLOBAL CLIENT *
Client_NewLocal(CONN_ID Idx, char *Hostname, int Type, bool Idented)
Client_NewLocal( CONN_ID Idx, char *Hostname, int Type, bool Idented )
{
return Init_New_Client(Idx, This_Server, NULL, Type, NULL, NULL,
Hostname, NULL, 0, 0, NULL, Idented);
/* Neuen lokalen Client erzeugen: Wrapper-Funktion fuer Client_New(). */
return Client_New( Idx, This_Server, NULL, Type, NULL, NULL, Hostname, NULL, 0, 0, NULL, Idented );
} /* Client_NewLocal */
/**
* Initialize new remote server; wrapper function for Init_New_Client().
* @return New CLIENT structure.
*/
GLOBAL CLIENT *
Client_NewRemoteServer(CLIENT *Introducer, char *Hostname, CLIENT *TopServer,
int Hops, int Token, char *Info, bool Idented)
Client_NewRemoteServer( CLIENT *Introducer, char *Hostname, CLIENT *TopServer, int Hops, int Token, char *Info, bool Idented )
{
return Init_New_Client(NONE, Introducer, TopServer, CLIENT_SERVER,
Hostname, NULL, Hostname, Info, Hops, Token, NULL, Idented);
/* Neuen Remote-Client erzeugen: Wrapper-Funktion fuer Client_New (). */
return Client_New( NONE, Introducer, TopServer, CLIENT_SERVER, Hostname, NULL, Hostname, Info, Hops, Token, NULL, Idented );
} /* Client_NewRemoteServer */
/**
* Initialize new remote client; wrapper function for Init_New_Client().
* @return New CLIENT structure.
*/
GLOBAL CLIENT *
Client_NewRemoteUser(CLIENT *Introducer, char *Nick, int Hops, char *User,
char *Hostname, int Token, char *Modes, char *Info, bool Idented)
Client_NewRemoteUser( CLIENT *Introducer, char *Nick, int Hops, char *User, char *Hostname, int Token, char *Modes, char *Info, bool Idented )
{
return Init_New_Client(NONE, Introducer, NULL, CLIENT_USER, Nick,
User, Hostname, Info, Hops, Token, Modes, Idented);
/* Neuen Remote-Client erzeugen: Wrapper-Funktion fuer Client_New (). */
return Client_New( NONE, Introducer, NULL, CLIENT_USER, Nick, User, Hostname, Info, Hops, Token, Modes, Idented );
} /* Client_NewRemoteUser */
/**
* Initialize new client and set up the given parameters like client type,
* user name, host name, introducing server etc. ...
* @return New CLIENT structure.
*/
static CLIENT *
Init_New_Client(CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer,
int Type, char *ID, char *User, char *Hostname, char *Info, int Hops,
int Token, char *Modes, bool Idented)
GLOBAL CLIENT *
Client_New( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, int Type, char *ID, char *User, char *Hostname, char *Info, int Hops, int Token, char *Modes, bool Idented )
{
CLIENT *client;
@@ -208,8 +186,8 @@ Init_New_Client(CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer,
if( Modes ) Client_SetModes( client, Modes );
if( Type == CLIENT_SERVER ) Generate_MyToken( client );
if( strchr( client->modes, 'a' ))
strlcpy( client->away, DEFAULT_AWAY_MSG, sizeof( client->away ));
/* ist der User away? */
if( strchr( client->modes, 'a' )) strlcpy( client->away, DEFAULT_AWAY_MSG, sizeof( client->away ));
/* Verketten */
client->next = (POINTER *)My_Clients;
@@ -219,7 +197,7 @@ Init_New_Client(CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer,
Adjust_Counters( client );
return client;
} /* Init_New_Client */
} /* Client_New */
GLOBAL void
@@ -333,14 +311,43 @@ Client_Destroy( CLIENT *Client, char *LogMsg, char *FwdMsg, bool SendQuit )
} /* Client_Destroy */
GLOBAL void
Client_DestroyNow( CLIENT *Client )
{
/* Destroy client structure immediately. This function is only
* intended for the connection layer to remove client structures
* of connections that can't be established! */
CLIENT *last, *c;
assert( Client != NULL );
last = NULL;
c = My_Clients;
while( c )
{
if( c == Client )
{
/* Wir haben den Client gefunden: entfernen */
if( last ) last->next = c->next;
else My_Clients = (CLIENT *)c->next;
free( c );
break;
}
last = c;
c = (CLIENT *)c->next;
}
} /* Client_DestroyNow */
GLOBAL void
Client_SetHostname( CLIENT *Client, char *Hostname )
{
/* Hostname eines Clients setzen */
assert( Client != NULL );
assert( Hostname != NULL );
strlcpy( Client->host, Hostname, sizeof( Client->host ));
} /* Client_SetHostname */
@@ -367,7 +374,7 @@ Client_SetUser( CLIENT *Client, char *User, bool Idented )
assert( Client != NULL );
assert( User != NULL );
if( Idented ) strlcpy( Client->user, User, sizeof( Client->user ));
else
{
@@ -384,7 +391,7 @@ Client_SetInfo( CLIENT *Client, char *Info )
assert( Client != NULL );
assert( Info != NULL );
strlcpy( Client->info, Info, sizeof( Client->info ));
} /* Client_SetInfo */
@@ -420,7 +427,7 @@ Client_SetPassword( CLIENT *Client, char *Pwd )
assert( Client != NULL );
assert( Pwd != NULL );
strlcpy( Client->pwd, Pwd, sizeof( Client->pwd ));
} /* Client_SetPassword */
@@ -490,7 +497,7 @@ Client_ModeAdd( CLIENT *Client, char Mode )
*/
char x[2];
assert( Client != NULL );
x[0] = Mode; x[1] = '\0';
@@ -531,6 +538,27 @@ Client_ModeDel( CLIENT *Client, char Mode )
} /* Client_ModeDel */
GLOBAL CLIENT *
Client_GetFromConn( CONN_ID Idx )
{
/* return Client-Structure that belongs to the local Connection Idx gehoert.
* If none is found, return NULL.
*/
CLIENT *c;
assert( Idx >= 0 );
c = My_Clients;
while( c )
{
if( c->conn_id == Idx ) return c;
c = (CLIENT *)c->next;
}
return NULL;
} /* Client_GetFromConn */
GLOBAL CLIENT *
Client_Search( char *Nick )
{
@@ -609,8 +637,7 @@ Client_ID( CLIENT *Client )
assert( Client != NULL );
#ifdef DEBUG
if(Client->type == CLIENT_USER)
assert(strlen(Client->id) < Conf_MaxNickLength);
if( Client->type == CLIENT_USER ) assert( strlen( Client->id ) < CLIENT_NICK_LEN );
#endif
if( Client->id[0] ) return Client->id;
@@ -630,7 +657,8 @@ GLOBAL char *
Client_User( CLIENT *Client )
{
assert( Client != NULL );
return Client->user[0] ? Client->user : "~";
if( Client->user[0] ) return Client->user;
else return "~";
} /* Client_User */
@@ -702,13 +730,11 @@ GLOBAL CLIENT *
Client_NextHop( CLIENT *Client )
{
CLIENT *c;
assert( Client != NULL );
c = Client;
while( c->introducer && ( c->introducer != c ) && ( c->introducer != This_Server ))
c = c->introducer;
while( c->introducer && ( c->introducer != c ) && ( c->introducer != This_Server )) c = c->introducer;
return c;
} /* Client_NextHop */
@@ -720,7 +746,7 @@ Client_Mask( CLIENT *Client )
* Prefixe benoetigt wird. */
assert( Client != NULL );
if( Client->type == CLIENT_SERVER ) return Client->id;
snprintf( GetID_Buffer, GETID_LEN, "%s!%s@%s", Client->id, Client->user, Client->host );
@@ -765,9 +791,12 @@ Client_Away( CLIENT *Client )
GLOBAL bool
Client_CheckNick( CLIENT *Client, char *Nick )
{
/* Nick ueberpruefen */
assert( Client != NULL );
assert( Nick != NULL );
/* Nick ungueltig? */
if( ! Client_IsValidNick( Nick ))
{
IRC_WriteStrClient( Client, ERR_ERRONEUSNICKNAME_MSG, Client_ID( Client ), Nick );
@@ -880,12 +909,13 @@ Client_MyServiceCount( void )
} /* Client_MyServiceCount */
GLOBAL unsigned long
GLOBAL long
Client_MyServerCount( void )
{
CLIENT *c;
unsigned long cnt = 0;
long cnt;
cnt = 0;
c = My_Clients;
while( c )
{
@@ -896,12 +926,13 @@ Client_MyServerCount( void )
} /* Client_MyServerCount */
GLOBAL unsigned long
GLOBAL long
Client_OperCount( void )
{
CLIENT *c;
unsigned long cnt = 0;
long cnt;
cnt = 0;
c = My_Clients;
while( c )
{
@@ -912,19 +943,19 @@ Client_OperCount( void )
} /* Client_OperCount */
GLOBAL unsigned long
GLOBAL long
Client_UnknownCount( void )
{
CLIENT *c;
unsigned long cnt = 0;
long cnt;
cnt = 0;
c = My_Clients;
while( c )
{
if( c && ( c->type != CLIENT_USER ) && ( c->type != CLIENT_SERVICE ) && ( c->type != CLIENT_SERVER )) cnt++;
c = (CLIENT *)c->next;
}
return cnt;
} /* Client_UnknownCount */
@@ -944,25 +975,28 @@ Client_MyMaxUserCount( void )
GLOBAL bool
Client_IsValidNick( const char *Nick )
Client_IsValidNick( char *Nick )
{
const char *ptr;
static const char goodchars[] = ";0123456789-";
/* Ist der Nick gueltig? */
char *ptr, goodchars[20];
assert( Nick != NULL );
strcpy( goodchars, ";0123456789-" );
if( Nick[0] == '#' ) return false;
if( strchr( goodchars, Nick[0] )) return false;
if( strlen( Nick ) >= Conf_MaxNickLength) return false;
if( strlen( Nick ) >= CLIENT_NICK_LEN ) return false;
ptr = Nick;
while( *ptr )
{
if (( *ptr < 'A' ) && ( ! strchr( goodchars, *ptr ))) return false;
if ( *ptr > '}' ) return false;
if(( *ptr < 'A' ) && ( ! strchr( goodchars, *ptr ))) return false;
if(( *ptr > '}' ) && ( ! strchr( goodchars, *ptr ))) return false;
ptr++;
}
return true;
} /* Client_IsValidNick */
@@ -999,12 +1033,13 @@ Client_StartTime(CLIENT *Client)
} /* Client_Uptime */
static unsigned long
LOCAL long
Count( CLIENT_TYPE Type )
{
CLIENT *c;
unsigned long cnt = 0;
long cnt;
cnt = 0;
c = My_Clients;
while( c )
{
@@ -1015,12 +1050,13 @@ Count( CLIENT_TYPE Type )
} /* Count */
static unsigned long
LOCAL long
MyCount( CLIENT_TYPE Type )
{
CLIENT *c;
unsigned long cnt = 0;
long cnt;
cnt = 0;
c = My_Clients;
while( c )
{
@@ -1031,13 +1067,13 @@ MyCount( CLIENT_TYPE Type )
} /* MyCount */
static CLIENT *
LOCAL CLIENT *
New_Client_Struct( void )
{
/* Neue CLIENT-Struktur pre-initialisieren */
CLIENT *c;
c = (CLIENT *)malloc( sizeof( CLIENT ));
if( ! c )
{
@@ -1058,7 +1094,7 @@ New_Client_Struct( void )
} /* New_Client */
static void
LOCAL void
Generate_MyToken( CLIENT *Client )
{
CLIENT *c;
@@ -1082,7 +1118,7 @@ Generate_MyToken( CLIENT *Client )
} /* Generate_MyToken */
static void
LOCAL void
Adjust_Counters( CLIENT *Client )
{
long count;
@@ -1090,7 +1126,7 @@ Adjust_Counters( CLIENT *Client )
assert( Client != NULL );
if( Client->type != CLIENT_USER ) return;
if( Client->conn_id != NONE )
{
/* Local connection */
@@ -1112,13 +1148,11 @@ GLOBAL void
Client_RegisterWhowas( CLIENT *Client )
{
int slot;
time_t now;
assert( Client != NULL );
now = time(NULL);
/* Don't register clients that were connected less than 30 seconds. */
if( now - Client->starttime < 30 )
if( time(NULL) - Client->starttime < 30 )
return;
slot = Last_Whowas + 1;
@@ -1127,8 +1161,8 @@ Client_RegisterWhowas( CLIENT *Client )
#ifdef DEBUG
Log( LOG_DEBUG, "Saving WHOWAS information to slot %d ...", slot );
#endif
My_Whowas[slot].time = now;
My_Whowas[slot].time = time( NULL );
strlcpy( My_Whowas[slot].id, Client_ID( Client ),
sizeof( My_Whowas[slot].id ));
strlcpy( My_Whowas[slot].user, Client_User( Client ),
@@ -1139,7 +1173,7 @@ Client_RegisterWhowas( CLIENT *Client )
sizeof( My_Whowas[slot].info ));
strlcpy( My_Whowas[slot].server, Client_ID( Client_Introducer( Client )),
sizeof( My_Whowas[slot].server ));
Last_Whowas = slot;
} /* Client_RegisterWhowas */

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: client.h,v 1.46 2007/01/23 16:07:19 alex Exp $
* $Id: client.h,v 1.39 2005/06/12 16:18:49 alex Exp $
*
* Client management (header)
*/
@@ -23,13 +23,13 @@
#define CLIENT_GOTNICK 4 /* client did send NICK */
#define CLIENT_GOTUSER 8 /* client did send USER */
#define CLIENT_USER 16 /* client is an IRC user */
#define CLIENT_SERVER 32 /* client is a server */
#define CLIENT_SERVICE 64 /* client is a service */
#define CLIENT_UNKNOWNSERVER 128 /* unregistered server connection */
#define CLIENT_UNKNOWNSERVER 32 /* unregistered server connection */
#define CLIENT_GOTPASSSERVER 64 /* client did send PASS in "server style" */
#define CLIENT_SERVER 128 /* client is a server */
#define CLIENT_SERVICE 256 /* client is a service */
#define CLIENT_TYPE int
#include "defines.h"
#if defined(__client_c__) | defined(S_SPLINT_S)
@@ -78,11 +78,16 @@ GLOBAL void Client_Exit PARAMS(( void ));
GLOBAL CLIENT *Client_NewLocal PARAMS(( CONN_ID Idx, char *Hostname, int Type, bool Idented ));
GLOBAL CLIENT *Client_NewRemoteServer PARAMS(( CLIENT *Introducer, char *Hostname, CLIENT *TopServer, int Hops, int Token, char *Info, bool Idented ));
GLOBAL CLIENT *Client_NewRemoteUser PARAMS(( CLIENT *Introducer, char *Nick, int Hops, char *User, char *Hostname, int Token, char *Modes, char *Info, bool Idented ));
GLOBAL CLIENT *Client_New PARAMS(( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, int Type, char *ID, char *User, char *Hostname, char *Info, int Hops, int Token, char *Modes, bool Idented ));
GLOBAL void Client_Destroy PARAMS(( CLIENT *Client, char *LogMsg, char *FwdMsg, bool SendQuit ));
#ifdef CONN_MODULE
GLOBAL void Client_DestroyNow PARAMS(( CLIENT *Client ));
#endif
GLOBAL CLIENT *Client_ThisServer PARAMS(( void ));
GLOBAL CLIENT *Client_GetFromConn PARAMS(( CONN_ID Idx ));
GLOBAL CLIENT *Client_GetFromToken PARAMS(( CLIENT *Client, int Token ));
GLOBAL CLIENT *Client_Search PARAMS(( char *ID ));
@@ -134,15 +139,15 @@ GLOBAL bool Client_CheckID PARAMS(( CLIENT *Client, char *ID ));
GLOBAL long Client_UserCount PARAMS(( void ));
GLOBAL long Client_ServiceCount PARAMS(( void ));
GLOBAL long Client_ServerCount PARAMS(( void ));
GLOBAL unsigned long Client_OperCount PARAMS(( void ));
GLOBAL unsigned long Client_UnknownCount PARAMS(( void ));
GLOBAL long Client_OperCount PARAMS(( void ));
GLOBAL long Client_UnknownCount PARAMS(( void ));
GLOBAL long Client_MyUserCount PARAMS(( void ));
GLOBAL long Client_MyServiceCount PARAMS(( void ));
GLOBAL unsigned long Client_MyServerCount PARAMS(( void ));
GLOBAL long Client_MyServerCount PARAMS(( void ));
GLOBAL long Client_MaxUserCount PARAMS(( void ));
GLOBAL long Client_MyMaxUserCount PARAMS(( void ));
GLOBAL bool Client_IsValidNick PARAMS(( const char *Nick ));
GLOBAL bool Client_IsValidNick PARAMS(( char *Nick ));
GLOBAL WHOWAS *Client_GetWhowas PARAMS(( void ));
GLOBAL int Client_GetLastWhowasIndex PARAMS(( void ));

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: conf.h,v 1.47 2007/11/23 16:28:37 fw Exp $
* $Id: conf.h,v 1.34 2005/03/20 13:54:06 fw Exp $
*
* Configuration management (header)
*/
@@ -20,7 +20,6 @@
#include <time.h>
#include "defines.h"
#include "array.h"
#include "portab.h"
typedef struct _Conf_Oper
@@ -33,25 +32,23 @@ typedef struct _Conf_Oper
typedef struct _Conf_Server
{
char host[HOST_LEN]; /* Hostname */
char ip[16]; /* IP address (Resolver) */
char name[CLIENT_ID_LEN]; /* IRC-Client-ID */
char pwd_in[CLIENT_PASS_LEN]; /* Password which must be received */
char pwd_out[CLIENT_PASS_LEN]; /* Password to send to peer */
UINT16 port; /* Server port */
int group; /* Group of server */
time_t lasttry; /* Last connect attempt */
RES_STAT res_stat; /* Status of the resolver */
RES_STAT *res_stat; /* Status of the resolver */
int flags; /* Flags */
CONN_ID conn_id; /* ID of server connection or NONE */
struct in_addr bind_addr; /* source address to use for outgoing connections */
} CONF_SERVER;
typedef struct _Conf_Channel
{
char name[CHANNEL_NAME_LEN]; /* Name of the channel */
char modes[CHANNEL_MODE_LEN]; /* Initial channel modes */
char key[CLIENT_PASS_LEN]; /* Channel key ("password", mode "k" ) */
unsigned long maxusers; /* maximum usercount for this channel, mode "l" */
array topic; /* Initial topic */
char topic[CHANNEL_TOPIC_LEN]; /* Initial topic */
} CONF_CHANNEL;
@@ -80,14 +77,15 @@ GLOBAL char Conf_MotdFile[FNAME_LEN];
GLOBAL char Conf_MotdPhrase[LINE_LEN];
/* Ports the server should listen on */
GLOBAL array Conf_ListenPorts;
GLOBAL UINT16 Conf_ListenPorts[MAX_LISTEN_PORTS];
GLOBAL int Conf_ListenPorts_Count;
/* Address to which the socket should be bound or empty (=all) */
GLOBAL char Conf_ListenAddress[16];
/* User and group ID the server should run with */
GLOBAL uid_t Conf_UID;
GLOBAL gid_t Conf_GID;
GLOBAL unsigned int Conf_UID;
GLOBAL unsigned int Conf_GID;
/* A directory to chroot() in */
GLOBAL char Conf_Chroot[FNAME_LEN];
@@ -104,23 +102,18 @@ GLOBAL int Conf_ConnectRetry;
/* Operators */
GLOBAL CONF_OPER Conf_Oper[MAX_OPERATORS];
GLOBAL unsigned int Conf_Oper_Count;
GLOBAL int Conf_Oper_Count;
/* Servers */
GLOBAL CONF_SERVER Conf_Server[MAX_SERVERS];
/* Pre-defined channels */
GLOBAL CONF_CHANNEL Conf_Channel[MAX_DEFCHANNELS];
GLOBAL unsigned int Conf_Channel_Count;
/* Pre-defined channels only */
GLOBAL bool Conf_PredefChannelsOnly;
GLOBAL int Conf_Channel_Count;
/* Are IRC operators allowed to always use MODE? */
GLOBAL bool Conf_OperCanMode;
/* Disable all DNS functions? */
GLOBAL bool Conf_NoDNS;
/* If an IRC op gives chanop privileges without being a chanop,
* ircd2 will ignore the command. This enables a workaround:
* It masks the command as coming from the server */
@@ -135,19 +128,16 @@ GLOBAL int Conf_MaxJoins;
/* Maximum number of connections per IP address */
GLOBAL int Conf_MaxConnectionsIP;
/* Maximum length of a nick name */
GLOBAL unsigned int Conf_MaxNickLength;
GLOBAL void Conf_Init PARAMS((void));
GLOBAL void Conf_Rehash PARAMS((void));
GLOBAL int Conf_Test PARAMS((void));
GLOBAL void Conf_Init PARAMS((void ));
GLOBAL void Conf_Rehash PARAMS((void ));
GLOBAL int Conf_Test PARAMS((void ));
GLOBAL void Conf_UnsetServer PARAMS(( CONN_ID Idx ));
GLOBAL void Conf_SetServer PARAMS(( int ConfServer, CONN_ID Idx ));
GLOBAL int Conf_GetServer PARAMS(( CONN_ID Idx ));
GLOBAL bool Conf_EnableServer PARAMS(( char *Name, UINT16 Port ));
GLOBAL bool Conf_EnablePassiveServer PARAMS((const char *Name));
GLOBAL bool Conf_DisableServer PARAMS(( char *Name ));
GLOBAL bool Conf_AddServer PARAMS(( char *Name, UINT16 Port, char *Host, char *MyPwd, char *PeerPwd ));

View File

@@ -16,7 +16,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: conn-func.c,v 1.11 2007/10/04 15:03:56 alex Exp $";
static char UNUSED id[] = "$Id: conn-func.c,v 1.6 2005/06/12 16:32:17 alex Exp $";
#include "imp.h"
#include <assert.h>
@@ -39,16 +39,6 @@ Conn_UpdateIdle( CONN_ID Idx )
}
/*
* Get signon time of a connection.
*/
GLOBAL time_t
Conn_GetSignon(CONN_ID Idx)
{
assert(Idx > NONE);
return My_Connections[Idx].signon;
}
GLOBAL time_t
Conn_GetIdle( CONN_ID Idx )
{
@@ -83,13 +73,7 @@ Conn_SetPenalty( CONN_ID Idx, time_t Seconds )
assert( Seconds >= 0 );
t = time( NULL ) + Seconds;
if (t > My_Connections[Idx].delaytime)
My_Connections[Idx].delaytime = t;
#ifdef DEBUG
Log(LOG_DEBUG, "Add penalty time on connection %d: %ld second(s).",
Idx, (long)Seconds);
#endif
if( t > My_Connections[Idx].delaytime ) My_Connections[Idx].delaytime = t;
} /* Conn_SetPenalty */
@@ -166,7 +150,7 @@ Conn_Next( CONN_ID Idx )
} /* Conn_Next */
GLOBAL UINT16
GLOBAL int
Conn_Options( CONN_ID Idx )
{
assert( Idx > NONE );
@@ -187,7 +171,7 @@ Conn_StartTime( CONN_ID Idx )
assert(Idx > NONE);
/* Search client structure for this link ... */
c = Conn_GetClient(Idx);
c = Client_GetFromConn(Idx);
if(c != NULL)
return Client_StartTime(c);
@@ -195,18 +179,17 @@ Conn_StartTime( CONN_ID Idx )
} /* Conn_StartTime */
GLOBAL size_t
GLOBAL int
Conn_SendQ( CONN_ID Idx )
{
/* Laenge der Daten im Schreibbuffer liefern */
assert( Idx > NONE );
#ifdef ZLIB
if( My_Connections[Idx].options & CONN_ZIP )
return array_bytes(&My_Connections[Idx].zip.wbuf);
if( My_Connections[Idx].options & CONN_ZIP ) return My_Connections[Idx].zip.wdatalen;
else
#endif
return array_bytes(&My_Connections[Idx].wbuf);
return My_Connections[Idx].wdatalen;
} /* Conn_SendQ */
@@ -230,18 +213,17 @@ Conn_SendBytes( CONN_ID Idx )
} /* Conn_SendBytes */
GLOBAL size_t
GLOBAL int
Conn_RecvQ( CONN_ID Idx )
{
/* Laenge der Daten im Lesebuffer liefern */
assert( Idx > NONE );
#ifdef ZLIB
if( My_Connections[Idx].options & CONN_ZIP )
return array_bytes(&My_Connections[Idx].zip.rbuf);
if( My_Connections[Idx].options & CONN_ZIP ) return My_Connections[Idx].zip.rdatalen;
else
#endif
return array_bytes(&My_Connections[Idx].rbuf);
return My_Connections[Idx].rdatalen;
} /* Conn_RecvQ */

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: conn-func.h,v 1.7 2007/10/04 15:03:56 alex Exp $
* $Id: conn-func.h,v 1.4 2005/04/25 18:37:16 fw Exp $
*
* Connection management: Global functions (header)
*/
@@ -27,12 +27,11 @@
GLOBAL void Conn_UpdateIdle PARAMS(( CONN_ID Idx ));
GLOBAL time_t Conn_GetSignon PARAMS((CONN_ID Idx));
GLOBAL time_t Conn_GetIdle PARAMS(( CONN_ID Idx ));
GLOBAL time_t Conn_LastPing PARAMS(( CONN_ID Idx ));
GLOBAL time_t Conn_StartTime PARAMS(( CONN_ID Idx ));
GLOBAL size_t Conn_SendQ PARAMS(( CONN_ID Idx ));
GLOBAL size_t Conn_RecvQ PARAMS(( CONN_ID Idx ));
GLOBAL int Conn_SendQ PARAMS(( CONN_ID Idx ));
GLOBAL int Conn_RecvQ PARAMS(( CONN_ID Idx ));
GLOBAL long Conn_SendMsg PARAMS(( CONN_ID Idx ));
GLOBAL long Conn_RecvMsg PARAMS(( CONN_ID Idx ));
GLOBAL long Conn_SendBytes PARAMS(( CONN_ID Idx ));
@@ -48,14 +47,14 @@ GLOBAL void Conn_SetFlag PARAMS(( CONN_ID Idx, int Flag ));
GLOBAL CONN_ID Conn_First PARAMS(( void ));
GLOBAL CONN_ID Conn_Next PARAMS(( CONN_ID Idx ));
GLOBAL UINT16 Conn_Options PARAMS(( CONN_ID Idx ));
GLOBAL int Conn_Options PARAMS(( CONN_ID Idx ));
GLOBAL void Conn_ResetWCounter PARAMS(( void ));
GLOBAL long Conn_WCounter PARAMS(( void ));
#define Conn_OPTION_ADD( x, opt ) ( (x)->options |= (opt) )
#define Conn_OPTION_DEL( x, opt ) ( (x)->options &= ~(opt) )
#define Conn_OPTION_ISSET( x, opt ) ( ((x)->options & (opt)) != 0)
#define Conn_OPTION_ADD( x, opt ) ( (x)->options |= opt )
#define Conn_OPTION_DEL( x, opt ) ( (x)->options &= ~opt )
#define Conn_OPTION_ISSET( x, opt ) ( (x)->options & opt )
#endif

View File

@@ -1,6 +1,6 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001-2007 Alexander Barton (alex@barton.de)
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -19,10 +19,7 @@
#ifdef ZLIB
/* enable more zlib related debug messages: */
/* #define DEBUG_ZLIB */
static char UNUSED id[] = "$Id: conn-zip.c,v 1.16 2007/05/17 23:34:24 alex Exp $";
static char UNUSED id[] = "$Id: conn-zip.c,v 1.7 2005/04/25 18:37:16 fw Exp $";
#include "imp.h"
#include <assert.h>
@@ -33,7 +30,6 @@ static char UNUSED id[] = "$Id: conn-zip.c,v 1.16 2007/05/17 23:34:24 alex Exp $
#include "conn-func.h"
#include "log.h"
#include "array.h"
#include "exp.h"
#include "conn-zip.h"
@@ -82,71 +78,47 @@ Zip_InitConn( CONN_ID Idx )
} /* Zip_InitConn */
/**
* Copy data to the compression buffer of a connection. We do collect
* some data there until it's full so that we can achieve better
* compression ratios.
* If the (pre-)compression buffer is full, we try to flush it ("actually
* compress some data") and to add the new (uncompressed) data afterwards.
* @param Idx Connection handle.
* @param Data Pointer to the data.
* @param Len Length of the data to add.
* @return true on success, false otherwise. */
GLOBAL bool
Zip_Buffer( CONN_ID Idx, char *Data, size_t Len )
Zip_Buffer( CONN_ID Idx, char *Data, int Len )
{
size_t buflen;
/* Daten zum Komprimieren im "Kompressions-Puffer" sammeln.
* Es wird true bei Erfolg, sonst false geliefert. */
assert( Idx > NONE );
assert( Data != NULL );
assert( Len > 0 );
buflen = array_bytes(&My_Connections[Idx].zip.wbuf);
if (buflen + Len >= WRITEBUFFER_SLINK_LEN) {
/* compression buffer is full, flush */
/* Ist noch Platz im Kompressions-Puffer? */
if( ZWRITEBUFFER_LEN - My_Connections[Idx].zip.wdatalen < Len + 50 )
{
/* Nein! Puffer zunaechst leeren ...*/
if( ! Zip_Flush( Idx )) return false;
}
/* check again; if zip buf is still too large do not append data:
* otherwise the zip wbuf would grow too large */
buflen = array_bytes(&My_Connections[Idx].zip.wbuf);
if (buflen + Len >= WRITEBUFFER_SLINK_LEN)
return false;
/* Daten kopieren */
memmove( My_Connections[Idx].zip.wbuf + My_Connections[Idx].zip.wdatalen, Data, Len );
My_Connections[Idx].zip.wdatalen += Len;
return array_catb(&My_Connections[Idx].zip.wbuf, Data, Len);
return true;
} /* Zip_Buffer */
/**
* Compress data in ZIP buffer and move result to the write buffer of
* the connection.
* @param Idx Connection handle.
* @retrun true on success, false otherwise.
*/
GLOBAL bool
Zip_Flush( CONN_ID Idx )
{
int result;
unsigned char zipbuf[WRITEBUFFER_SLINK_LEN];
int zipbuf_used = 0;
/* Daten komprimieren und in Schreibpuffer kopieren.
* Es wird true bei Erfolg, sonst false geliefert. */
int result, out_len;
z_stream *out;
out = &My_Connections[Idx].zip.out;
out->avail_in = (uInt)array_bytes(&My_Connections[Idx].zip.wbuf);
if (!out->avail_in)
return true; /* nothing to do. */
out->next_in = (void *)My_Connections[Idx].zip.wbuf;
out->avail_in = My_Connections[Idx].zip.wdatalen;
out->next_out = (void *)(My_Connections[Idx].wbuf + My_Connections[Idx].wdatalen);
out->avail_out = WRITEBUFFER_LEN - My_Connections[Idx].wdatalen;
out->next_in = array_start(&My_Connections[Idx].zip.wbuf);
assert(out->next_in != NULL);
out->next_out = zipbuf;
out->avail_out = (uInt)sizeof zipbuf;
#ifdef DEBUG_ZIP
Log(LOG_DEBUG, "out->avail_in %d, out->avail_out %d",
out->avail_in, out->avail_out);
#endif
result = deflate( out, Z_SYNC_FLUSH );
if(( result != Z_OK ) || ( out->avail_in > 0 ))
{
@@ -155,30 +127,11 @@ Zip_Flush( CONN_ID Idx )
return false;
}
if (out->avail_out <= 0) {
/* Not all data was compressed, because data became
* bigger while compressing it. */
Log (LOG_ALERT, "Compression error: buffer overvlow!?");
Conn_Close(Idx, "Compression error!", NULL, false);
return false;
}
assert(out->avail_out <= WRITEBUFFER_SLINK_LEN);
zipbuf_used = WRITEBUFFER_SLINK_LEN - out->avail_out;
#ifdef DEBUG_ZIP
Log(LOG_DEBUG, "zipbuf_used: %d", zipbuf_used);
#endif
if (!array_catb(&My_Connections[Idx].wbuf,
(char *)zipbuf, (size_t) zipbuf_used)) {
Log (LOG_ALERT, "Compression error: can't copy data!?");
Conn_Close(Idx, "Compression error!", NULL, false);
return false;
}
My_Connections[Idx].bytes_out += zipbuf_used;
My_Connections[Idx].zip.bytes_out += array_bytes(&My_Connections[Idx].zip.wbuf);
array_trunc(&My_Connections[Idx].zip.wbuf);
out_len = WRITEBUFFER_LEN - My_Connections[Idx].wdatalen - out->avail_out;
My_Connections[Idx].wdatalen += out_len;
My_Connections[Idx].bytes_out += out_len;
My_Connections[Idx].zip.bytes_out += My_Connections[Idx].zip.wdatalen;
My_Connections[Idx].zip.wdatalen = 0;
return true;
} /* Zip_Flush */
@@ -191,33 +144,20 @@ Unzip_Buffer( CONN_ID Idx )
* wird false geliefert, ansonsten true. Der Fall, dass keine
* Daten mehr zu entpacken sind, ist _kein_ Fehler! */
int result;
unsigned char unzipbuf[READBUFFER_LEN];
int unzipbuf_used = 0;
unsigned int z_rdatalen;
unsigned int in_len;
int result, in_len, out_len;
z_stream *in;
assert( Idx > NONE );
z_rdatalen = (unsigned int)array_bytes(&My_Connections[Idx].zip.rbuf);
if (z_rdatalen == 0)
return true;
if( My_Connections[Idx].zip.rdatalen <= 0 ) return true;
in = &My_Connections[Idx].zip.in;
in->next_in = array_start(&My_Connections[Idx].zip.rbuf);
assert(in->next_in != NULL);
in->next_in = (void *)My_Connections[Idx].zip.rbuf;
in->avail_in = My_Connections[Idx].zip.rdatalen;
in->next_out = (void *)(My_Connections[Idx].rbuf + My_Connections[Idx].rdatalen);
in->avail_out = READBUFFER_LEN - My_Connections[Idx].rdatalen - 1;
in->avail_in = z_rdatalen;
in->next_out = unzipbuf;
in->avail_out = (uInt)sizeof unzipbuf;
#ifdef DEBUG_ZIP
Log(LOG_DEBUG, "in->avail_in %d, in->avail_out %d",
in->avail_in, in->avail_out);
#endif
result = inflate( in, Z_SYNC_FLUSH );
if( result != Z_OK )
{
@@ -226,24 +166,19 @@ Unzip_Buffer( CONN_ID Idx )
return false;
}
assert(z_rdatalen >= in->avail_in);
in_len = z_rdatalen - in->avail_in;
unzipbuf_used = READBUFFER_LEN - in->avail_out;
#ifdef DEBUG_ZIP
Log(LOG_DEBUG, "unzipbuf_used: %d - %d = %d", READBUFFER_LEN,
in->avail_out, unzipbuf_used);
#endif
assert(unzipbuf_used <= READBUFFER_LEN);
if (!array_catb(&My_Connections[Idx].rbuf, (char*) unzipbuf,
(size_t)unzipbuf_used))
return false;
in_len = My_Connections[Idx].zip.rdatalen - in->avail_in;
out_len = READBUFFER_LEN - My_Connections[Idx].rdatalen - 1 - in->avail_out;
My_Connections[Idx].rdatalen += out_len;
if( in->avail_in > 0 ) {
array_moveleft(&My_Connections[Idx].zip.rbuf, 1, in_len );
} else {
array_trunc( &My_Connections[Idx].zip.rbuf );
My_Connections[Idx].zip.bytes_in += unzipbuf_used;
if( in->avail_in > 0 )
{
/* es konnten nicht alle Daten entpackt werden, vermutlich war
* im Ziel-Puffer kein Platz mehr. Umkopieren ... */
My_Connections[Idx].zip.rdatalen -= in_len;
memmove( My_Connections[Idx].zip.rbuf, My_Connections[Idx].zip.rbuf + in_len, My_Connections[Idx].zip.rdatalen );
}
else My_Connections[Idx].zip.rdatalen = 0;
My_Connections[Idx].zip.bytes_in += out_len;
return true;
} /* Unzip_Buffer */

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: conn-zip.h,v 1.4 2006/05/10 21:24:01 alex Exp $
* $Id: conn-zip.h,v 1.3 2005/03/19 18:43:48 fw Exp $
*
* Connection compression using ZLIB (header)
*/
@@ -22,7 +22,7 @@
GLOBAL bool Zip_InitConn PARAMS(( CONN_ID Idx ));
GLOBAL bool Zip_Buffer PARAMS(( CONN_ID Idx, char *Data, size_t Len ));
GLOBAL bool Zip_Buffer PARAMS(( CONN_ID Idx, char *Data, int Len ));
GLOBAL bool Zip_Flush PARAMS(( CONN_ID Idx ));
GLOBAL bool Unzip_Buffer PARAMS(( CONN_ID Idx ));

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: conn.h,v 1.45 2007/10/04 15:03:56 alex Exp $
* $Id: conn.h,v 1.35.2.1 2005/07/30 23:24:50 alex Exp $
*
* Connection management (header)
*/
@@ -31,13 +31,11 @@
typedef int CONN_ID;
#include "client.h"
#ifdef CONN_MODULE
#include "defines.h"
#include "resolve.h"
#include "array.h"
#ifdef ZLIB
#include <zlib.h>
@@ -45,8 +43,10 @@ typedef struct _ZipData
{
z_stream in; /* "Handle" for input stream */
z_stream out; /* "Handle" for output stream */
array rbuf; /* Read buffer (compressed) */
array wbuf; /* Write buffer (uncompressed) */
char rbuf[READBUFFER_LEN]; /* Read buffer */
int rdatalen; /* Length of data in read buffer (compressed) */
char wbuf[WRITEBUFFER_LEN]; /* Write buffer */
int wdatalen; /* Length of data in write buffer (uncompressed) */
long bytes_in, bytes_out; /* Counter for statistics (uncompressed!) */
} ZIPDATA;
#endif /* ZLIB */
@@ -55,11 +55,12 @@ typedef struct _Connection
{
int sock; /* Socket handle */
struct sockaddr_in addr; /* Client address */
RES_STAT res_stat; /* Status of resolver process */
RES_STAT *res_stat; /* Status of resolver process, if any */
char host[HOST_LEN]; /* Hostname */
array rbuf; /* Read buffer */
array wbuf; /* Write buffer */
time_t signon; /* Signon ("connect") time */
char rbuf[READBUFFER_LEN]; /* Read buffer */
int rdatalen; /* Length of data in read buffer */
char wbuf[WRITEBUFFER_LEN]; /* Write buffer */
int wdatalen; /* Length of data in write buffer */
time_t lastdata; /* Last activity */
time_t lastping; /* Last PING */
time_t lastprivmsg; /* Last PRIVMSG */
@@ -68,7 +69,6 @@ typedef struct _Connection
long msg_in, msg_out; /* Received and sent IRC messages */
int flag; /* Flag (see "irc-write" module) */
UINT16 options; /* Link options / connection state */
CLIENT *client; /* pointer to client structure */
#ifdef ZLIB
ZIPDATA zip; /* Compression information */
#endif /* ZLIB */
@@ -84,18 +84,24 @@ GLOBAL long WCounter;
GLOBAL void Conn_Init PARAMS((void ));
GLOBAL void Conn_Exit PARAMS(( void ));
GLOBAL unsigned int Conn_InitListeners PARAMS(( void ));
GLOBAL int Conn_InitListeners PARAMS(( void ));
GLOBAL void Conn_ExitListeners PARAMS(( void ));
GLOBAL bool Conn_NewListener PARAMS(( const UINT16 Port ));
GLOBAL void Conn_Handler PARAMS(( void ));
GLOBAL bool Conn_Write PARAMS(( CONN_ID Idx, char *Data, int Len ));
GLOBAL bool Conn_WriteStr PARAMS(( CONN_ID Idx, char *Format, ... ));
GLOBAL void Conn_Close PARAMS(( CONN_ID Idx, char *LogMsg, char *FwdMsg, bool InformClient ));
GLOBAL void Conn_SyncServerStruct PARAMS(( void ));
GLOBAL CLIENT* Conn_GetClient PARAMS((CONN_ID i));
GLOBAL int Conn_MaxFD;
#endif
/* -eof- */

View File

@@ -1,6 +1,6 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001-2007 Alexander Barton (alex@barton.de)
* Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -8,119 +8,101 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: defines.h,v 1.62 2007/11/21 12:16:36 alex Exp $
* $Id: defines.h,v 1.52.2.2 2005/07/05 22:58:25 alex Exp $
*
* Global defines of ngIRCd.
*/
#ifndef __defines_h__
#define __defines_h__
/**
* @file
* Global constants ("#defines") used by the ngIRCd.
*/
#define NONE -1
#define FNAME_LEN 256 /* Max. length of file name */
#define FNAME_LEN 256 /* max. length of file name */
#define LINE_LEN 256 /* Max. length of a line in the
configuration file */
#define LINE_LEN 256 /* max. length of a line in the configuration file */
#define HOST_LEN 256 /* Max. lenght of fully qualified host
names (e. g. "abc.domain.tld") */
#define HOST_LEN 256 /* max. lenght of fully qualified host names */
#define MAX_LISTEN_PORTS 16 /* Max. count of listening ports */
#define MAX_LISTEN_PORTS 16 /* max. count of listening ports */
#define MAX_OPERATORS 16 /* Max. count of configurable IRC Ops */
#define MAX_OPERATORS 16 /* max. count of configurable operators */
#define MAX_SERVERS 16 /* Max. count of configurable servers */
#define MAX_SERVERS 16 /* max. count of configurable servers ("peers") */
#define MAX_DEFCHANNELS 16 /* Max. count of predefined channels */
#define MAX_DEFCHANNELS 16 /* max. count of preconfigurable channels */
#define MAX_SERVICES 8 /* Max. count of services */
#define MAX_SERVICES 8 /* max. number of configurable services */
#define MAX_WHOWAS 64 /* Max. number of WHOWAS items */
#define MAX_WHOWAS 64 /* max. number of WHOWAS items */
#define DEFAULT_WHOWAS 5 /* default count for WHOWAS command */
#define CONNECTION_POOL 100 /* Size of default connection pool */
#define CONNECTION_POOL 100 /* size of default connection pool */
#define CLIENT_ID_LEN 64 /* Max. length of an IRC ID; see RFC
RFC 2812 section 1.1 and 1.2.1 */
#define CLIENT_NICK_LEN_DEFAULT 10 /* Default nick length, see. RFC 2812
* section 1.2.1 */
#define CLIENT_NICK_LEN 32 /* Maximum nick name length */
#define CLIENT_PASS_LEN 21 /* Max. password length */
#define CLIENT_ID_LEN 64 /* max. length of an IRC ID; see RFC 2812, 1.1 and 1.2.1 */
#define CLIENT_NICK_LEN 10 /* max. nick length; see. RFC 2812, 1.2.1 */
#define CLIENT_PASS_LEN 21 /* max. password length */
#define CLIENT_USER_LEN 10 /* Max. length of user name ("login")
see RFC 2812, section 1.2.1 */
#define CLIENT_NAME_LEN 32 /* Max. length of "real names" */
#define CLIENT_HOST_LEN 64 /* Max. host name length */
#define CLIENT_MODE_LEN 9 /* Max. lenth of all client modes */
#define CLIENT_INFO_LEN 64 /* Max. length of server info texts */
#define CLIENT_AWAY_LEN 128 /* Max. length of away messages */
#define CLIENT_FLAGS_LEN 100 /* Max. length of client flags */
see RFC 2812, section 1.2.1 */
#define CLIENT_NAME_LEN 32 /* max. length of "real names" */
#define CLIENT_HOST_LEN 64 /* max. host name length */
#define CLIENT_MODE_LEN 8 /* max. lenth of all client modes */
#define CLIENT_INFO_LEN 64 /* max. length of server info texts */
#define CLIENT_AWAY_LEN 128 /* max. length of away messages */
#define CLIENT_FLAGS_LEN 100 /* max. length of client flags */
#define CHANNEL_NAME_LEN 51 /* Max. length of a channel name, see
RFC 2812 section 1.3 */
#define CHANNEL_MODE_LEN 9 /* Max. length of channel modes */
#define CHANNEL_NAME_LEN 51 /* max. length of a channel name, see. RFC 2812, 1.3 */
#define CHANNEL_MODE_LEN 9 /* max. length of channel modes */
#define CHANNEL_TOPIC_LEN 128 /* max. length of a channel topic */
#define COMMAND_LEN 513 /* Max. IRC command length, see. RFC
2812 section 3.2 */
#define COMMAND_LEN 513 /* max. IRC command length, see. RFC 2812, 3.2 */
#define READBUFFER_LEN 2048 /* Size of the read buffer of a
connection in bytes. */
#define WRITEBUFFER_LEN 4096 /* Size of the write buffer of a
connection in bytes. */
#define WRITEBUFFER_SLINK_LEN 51200 /* Size of the write buffer of a
server link connection in bytes. */
#define READBUFFER_LEN 2048 /* size of the read buffer of a connection (bytes) */
#define WRITEBUFFER_LEN 4096 /* size of the write buffer of a connection (bytes) */
#define PROTOVER "0210" /* Implemented IRC protocol version,
see RFC 2813 section 4.1.1. */
#define PROTOIRC "-IRC" /* Protocol suffix, see RFC 2813
section 4.1.1 */
#define PROTOIRCPLUS "-IRC+" /* Protocol suffix used by the IRC+
protocol, see doc/Protocol.txt */
#ifdef IRCPLUS
# define IRCPLUSFLAGS "CHL" /* Standard IRC+ flags */
#ifdef ZLIB
#define ZREADBUFFER_LEN 1024 /* compressed read buffer of a connection (bytes) */
#define ZWRITEBUFFER_LEN 4096 /* compressed write buffer of a connection (bytes) */
#endif
#define STARTUP_DELAY 1 /* Delay outgoing connections n seconds
after startup. */
#define RECONNECT_DELAY 3 /* Time to delay re-connect attempts
in seconds. */
#define PROTOVER "0210" /* implemented IRC protocol version (see RFC 2813, 4.1.1) */
#define PROTOIRC "-IRC" /* protocol suffix (see RFC 2813, 4.1.1) */
#define PROTOIRCPLUS "-IRC+" /* protokol suffix for IRC+ protocol (see doc/Protocol.txt) */
#define USERMODES "aios" /* Supported user modes. */
#define CHANMODES "biIklmnoPstv" /* Supported channel modes. */
#ifdef IRCPLUS
# define IRCPLUSFLAGS "CL" /* standard IRC+ flags */
#endif
#define CONNECTED true /* Internal status codes. */
#define STARTUP_DELAY 1 /* delay outgoing connections n seconds after startup */
#define RECONNECT_DELAY 3 /* time to delay re-connect attempts (seconds) */
#define USERMODES "aios" /* supported user modes */
#define CHANMODES "biklImnoPstv" /* supported channel modes */
#define CONNECTED true /* internal status codes */
#define DISCONNECTED false
#define DEFAULT_AWAY_MSG "Away" /* Away message for users connected to
linked servers. */
#define DEFAULT_AWAY_MSG "Away" /* away message for users connected to linked servers */
#define DEFAULT_TOPIC_ID "-Server-" /* Default ID for "topic owner". */
#define CONFIG_FILE "/ngircd.conf"
#define MOTD_FILE "/ngircd.motd"
#define MOTD_PHRASE ""
#define CHROOT_DIR ""
#define PID_FILE ""
#define CONFIG_FILE "/ngircd.conf" /* Configuration file name. */
#define MOTD_FILE "/ngircd.motd" /* Name of the MOTD file. */
#define MOTD_PHRASE "" /* Default MOTD phrase string. */
#define CHROOT_DIR "" /* Default chroot() directory. */
#define PID_FILE "" /* Default file for the process ID. */
#define ERROR_DIR "/tmp"
#define ERROR_DIR "/tmp" /* Error directory used in debug mode */
#define MAX_LOG_MSG_LEN 256 /* max. length of a log message */
#define MAX_LOG_MSG_LEN 256 /* Max. length of a log message. */
#define TOKEN_OUTBOUND -2 /* tag for outbound server links */
#define TOKEN_OUTBOUND -2 /* Tag for outbound server links. */
#define NOTICE_TXTPREFIX "" /* Prefix for NOTICEs from the server
to users. Some servers use '*'. */
#define NOTICE_TXTPREFIX "" /* prefix for NOTICEs from the server to users */
#define CUT_TXTSUFFIX "[CUT]" /* Suffix for oversized messages that
have been shortened and cut off. */
#ifdef ZEROCONF
#define MDNS_TYPE "_ircu._tcp." /* Service type to register with mDNS */
#ifdef RENDEZVOUS
#define RENDEZVOUS_TYPE "_ircu._tcp." /* service type to register with Rendezvous */
#endif

View File

@@ -14,7 +14,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: hash.c,v 1.13 2006/10/06 21:23:47 fw Exp $";
static char UNUSED id[] = "$Id: hash.c,v 1.11 2005/03/19 18:43:48 fw Exp $";
#include "imp.h"
#include <assert.h>
@@ -27,11 +27,11 @@ static char UNUSED id[] = "$Id: hash.c,v 1.13 2006/10/06 21:23:47 fw Exp $";
#include "hash.h"
static UINT32 jenkins_hash PARAMS(( register UINT8 *k, register UINT32 length, register UINT32 initval ));
LOCAL UINT32 jenkins_hash PARAMS(( register UINT8 *k, register UINT32 length, register UINT32 initval ));
GLOBAL UINT32
Hash( const char *String )
Hash( char *String )
{
/* Hash-Wert ueber String berechnen */
@@ -72,7 +72,7 @@ Hash( const char *String )
} /* mix */
static UINT32
LOCAL UINT32
jenkins_hash( register UINT8 *k, register UINT32 length, register UINT32 initval )
{
/* k: the key

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: hash.h,v 1.6 2006/10/06 21:23:47 fw Exp $
* $Id: hash.h,v 1.5 2005/03/19 18:43:48 fw Exp $
*
* Hash calculation (header)
*/
@@ -17,7 +17,8 @@
#ifndef __hash_h__
#define __hash_h__
GLOBAL UINT32 Hash PARAMS((const char *String ));
GLOBAL UINT32 Hash PARAMS((char *String ));
#endif

View File

@@ -1,931 +0,0 @@
/*
* 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.
*
* I/O abstraction interface.
* Copyright (c) 2005 Florian Westphal (westphal@foo.fh-furtwangen.de)
*
*/
#include "portab.h"
static char UNUSED id[] = "$Id: io.c,v 1.28.2.1 2008/04/03 14:16:35 fw Exp $";
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#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);
#else
void (*callback)();
#endif
short what;
} io_event;
#define INIT_IOEVENT { NULL, -1, 0, NULL }
#define IO_ERROR 4
#ifdef HAVE_EPOLL_CREATE
# define IO_USE_EPOLL 1
# ifdef HAVE_SELECT
# define IO_USE_SELECT 1
# endif
#else
# ifdef HAVE_KQUEUE
# define IO_USE_KQUEUE 1
# else
# ifdef HAVE_SYS_DEVPOLL_H
# define IO_USE_DEVPOLL 1
# else
# ifdef HAVE_POLL
# define IO_USE_POLL 1
# else
# ifdef HAVE_SELECT
# define IO_USE_SELECT 1
# else
# error "no IO API available!?"
# endif /* HAVE_SELECT */
# endif /* HAVE_POLL */
# endif /* HAVE_SYS_DEVPOLL_H */
# endif /* HAVE_KQUEUE */
#endif /* HAVE_EPOLL_CREATE */
static bool library_initialized = false;
#ifdef IO_USE_EPOLL
#include <sys/epoll.h>
static int io_masterfd = -1;
static bool io_event_change_epoll(int fd, short what, const int action);
static int io_dispatch_epoll(struct timeval *tv);
#endif
#ifdef IO_USE_KQUEUE
#include <sys/types.h>
#include <sys/event.h>
static array io_evcache;
static int io_masterfd;
static int io_dispatch_kqueue(struct timeval *tv);
static bool io_event_change_kqueue(int, short, const int action);
#endif
#ifdef IO_USE_POLL
#include <poll.h>
static array pollfds;
static int poll_maxfd;
static bool io_event_change_poll PARAMS((int fd, short what));
#endif
#ifdef IO_USE_DEVPOLL
#include <sys/devpoll.h>
static int io_masterfd;
static bool io_event_change_devpoll(int fd, short what);
#endif
#ifdef IO_USE_SELECT
#include "defines.h" /* for conn.h */
#include "conn.h" /* for CONN_IDX (needed by resolve.h) */
#include "resolve.h" /* for RES_STAT (needed by conf.h) */
#include "conf.h" /* for Conf_MaxConnections */
static fd_set readers;
static fd_set writers;
static int select_maxfd; /* the select() interface sucks badly */
static int io_dispatch_select(struct timeval *tv);
#ifndef IO_USE_EPOLL
#define io_masterfd -1
#endif
#endif /* IO_USE_SELECT */
static array io_events;
static void io_docallback PARAMS((int fd, short what));
static io_event *
io_event_get(int fd)
{
io_event *i;
assert(fd >= 0);
i = (io_event *) array_get(&io_events, sizeof(io_event), (size_t) fd);
assert(i != NULL);
return i;
}
#ifdef IO_USE_DEVPOLL
static void
io_library_init_devpoll(unsigned int eventsize)
{
io_masterfd = open("/dev/poll", O_RDWR);
if (io_masterfd >= 0)
library_initialized = true;
Log(LOG_INFO, "IO subsystem: /dev/poll (initial maxfd %u, masterfd %d).",
eventsize, io_masterfd);
}
#endif
#ifdef IO_USE_POLL
static void
io_library_init_poll(unsigned int eventsize)
{
struct pollfd *p;
array_init(&pollfds);
poll_maxfd = 0;
Log(LOG_INFO, "IO subsystem: poll (initial maxfd %u).",
eventsize);
p = array_alloc(&pollfds, sizeof(struct pollfd), eventsize);
if (p) {
unsigned i;
p = array_start(&pollfds);
for (i = 0; i < eventsize; i++)
p[i].fd = -1;
library_initialized = true;
}
}
#endif
#ifdef IO_USE_SELECT
static void
io_library_init_select(unsigned int eventsize)
{
Log(LOG_INFO, "IO subsystem: select (initial maxfd %u).",
eventsize);
FD_ZERO(&readers);
FD_ZERO(&writers);
#ifdef FD_SETSIZE
if (Conf_MaxConnections >= (int)FD_SETSIZE) {
Log(LOG_WARNING,
"MaxConnections (%d) exceeds limit (%u), changed MaxConnections to %u.",
Conf_MaxConnections, FD_SETSIZE, FD_SETSIZE - 1);
Conf_MaxConnections = FD_SETSIZE - 1;
}
#endif /* FD_SETSIZE */
library_initialized = true;
}
#endif /* SELECT */
#ifdef IO_USE_EPOLL
static void
io_library_init_epoll(unsigned int eventsize)
{
int ecreate_hint = (int)eventsize;
if (ecreate_hint <= 0)
ecreate_hint = 128;
io_masterfd = epoll_create(ecreate_hint);
if (io_masterfd >= 0) {
library_initialized = true;
Log(LOG_INFO,
"IO subsystem: epoll (hint size %d, initial maxfd %u, masterfd %d).",
ecreate_hint, eventsize, io_masterfd);
}
}
#endif
#ifdef IO_USE_KQUEUE
static void
io_library_init_kqueue(unsigned int eventsize)
{
io_masterfd = kqueue();
Log(LOG_INFO,
"IO subsystem: kqueue (initial maxfd %u, masterfd %d)",
eventsize, io_masterfd);
if (io_masterfd >= 0)
library_initialized = true;
}
#endif
bool
io_library_init(unsigned int eventsize)
{
if (library_initialized)
return true;
#ifdef IO_USE_SELECT
#ifndef FD_SETSIZE
Log(LOG_WARNING,
"FD_SETSIZE undefined, don't know how many descriptors select() can handle on your platform ...");
#else
if (eventsize >= FD_SETSIZE)
eventsize = FD_SETSIZE - 1;
#endif /* FD_SETSIZE */
#endif /* IO_USE_SELECT */
if ((eventsize > 0) && !array_alloc(&io_events, sizeof(io_event), (size_t)eventsize))
eventsize = 0;
#ifdef IO_USE_EPOLL
io_library_init_epoll(eventsize);
#ifdef IO_USE_SELECT
if (io_masterfd < 0)
Log(LOG_INFO, "Can't initialize epoll() IO interface, falling back to select() ...");
#endif
#endif
#ifdef IO_USE_KQUEUE
io_library_init_kqueue(eventsize);
#endif
#ifdef IO_USE_DEVPOLL
io_library_init_devpoll(eventsize);
#endif
#ifdef IO_USE_POLL
io_library_init_poll(eventsize);
#endif
#ifdef IO_USE_SELECT
if (! library_initialized)
io_library_init_select(eventsize);
#endif
return library_initialized;
}
void
io_library_shutdown(void)
{
#ifdef IO_USE_SELECT
FD_ZERO(&readers);
FD_ZERO(&writers);
#endif
#ifdef IO_USE_EPOLL
if (io_masterfd >= 0)
close(io_masterfd);
io_masterfd = -1;
#endif
#ifdef IO_USE_KQUEUE
close(io_masterfd);
io_masterfd = -1;
array_free(&io_evcache);
#endif
library_initialized = false;
}
bool
io_event_setcb(int fd, void (*cbfunc) (int, short))
{
io_event *i = io_event_get(fd);
if (!i)
return false;
i->callback = cbfunc;
return true;
}
bool
io_event_create(int fd, short what, void (*cbfunc) (int, short))
{
bool ret;
io_event *i;
assert(fd >= 0);
#if defined(IO_USE_SELECT) && defined(FD_SETSIZE)
if (io_masterfd < 0 && fd >= FD_SETSIZE) {
Log(LOG_ERR,
"fd %d exceeds FD_SETSIZE (%u) (select can't handle more file descriptors)",
fd, FD_SETSIZE);
return false;
}
#endif
i = (io_event *) array_alloc(&io_events, sizeof(io_event), (size_t) fd);
if (!i) {
Log(LOG_WARNING,
"array_alloc failed: could not allocate space for %d io_event structures",
fd);
return false;
}
i->callback = cbfunc;
i->what = 0;
#ifdef IO_USE_DEVPOLL
ret = io_event_change_devpoll(fd, what);
#endif
#ifdef IO_USE_POLL
ret = io_event_change_poll(fd, what);
#endif
#ifdef IO_USE_EPOLL
ret = io_event_change_epoll(fd, what, EPOLL_CTL_ADD);
#endif
#ifdef IO_USE_KQUEUE
ret = io_event_change_kqueue(fd, what, EV_ADD|EV_ENABLE);
#endif
#ifdef IO_USE_SELECT
if (io_masterfd < 0)
ret = io_event_add(fd, what);
#endif
if (ret) i->what = what;
return ret;
}
#ifdef IO_USE_DEVPOLL
static bool
io_event_change_devpoll(int fd, short what)
{
struct pollfd p;
p.events = 0;
if (what & IO_WANTREAD)
p.events = POLLIN | POLLPRI;
if (what & IO_WANTWRITE)
p.events |= POLLOUT;
p.fd = fd;
return write(io_masterfd, &p, sizeof p) == (ssize_t)sizeof p;
}
#endif
#ifdef IO_USE_POLL
static bool
io_event_change_poll(int fd, short what)
{
struct pollfd *p;
short events = 0;
if (what & IO_WANTREAD)
events = POLLIN | POLLPRI;
if (what & IO_WANTWRITE)
events |= POLLOUT;
p = array_alloc(&pollfds, sizeof *p, fd);
if (p) {
p->events = events;
p->fd = fd;
if (fd > poll_maxfd)
poll_maxfd = fd;
}
return p != NULL;
}
#endif
#ifdef IO_USE_EPOLL
static bool
io_event_change_epoll(int fd, short what, const int action)
{
struct epoll_event ev = { 0, {0} };
ev.data.fd = fd;
if (what & IO_WANTREAD)
ev.events = EPOLLIN | EPOLLPRI;
if (what & IO_WANTWRITE)
ev.events |= EPOLLOUT;
return epoll_ctl(io_masterfd, action, fd, &ev) == 0;
}
#endif
#ifdef IO_USE_KQUEUE
static bool
io_event_kqueue_commit_cache(void)
{
struct kevent *events;
bool ret;
int len = (int) array_length(&io_evcache, sizeof (struct kevent));
if (!len) /* nothing to do */
return true;
assert(len>0);
if (len < 0) {
array_free(&io_evcache);
return false;
}
events = array_start(&io_evcache);
assert(events != NULL);
ret = kevent(io_masterfd, events, len, NULL, 0, NULL) == 0;
if (ret)
array_trunc(&io_evcache);
return ret;
}
static bool
io_event_change_kqueue(int fd, short what, const int action)
{
struct kevent kev;
bool ret = true;
if (what & IO_WANTREAD) {
EV_SET(&kev, fd, EVFILT_READ, action, 0, 0, 0);
ret = array_catb(&io_evcache, (char*) &kev, sizeof (kev));
if (!ret)
ret = kevent(io_masterfd, &kev,1, NULL, 0, NULL) == 0;
}
if (ret && (what & IO_WANTWRITE)) {
EV_SET(&kev, fd, EVFILT_WRITE, action, 0, 0, 0);
ret = array_catb(&io_evcache, (char*) &kev, sizeof (kev));
if (!ret)
ret = kevent(io_masterfd, &kev, 1, NULL, 0, NULL) == 0;
}
if (array_length(&io_evcache, sizeof kev) >= 100)
io_event_kqueue_commit_cache();
return ret;
}
#endif
bool
io_event_add(int fd, short what)
{
io_event *i = io_event_get(fd);
if (!i) return false;
if ((i->what & what) == what) /* event type is already registered */
return true;
#ifdef DEBUG_IO
Log(LOG_DEBUG, "io_event_add(): fd %d, what %d.", fd, what);
#endif
i->what |= what;
#ifdef IO_USE_EPOLL
if (io_masterfd >= 0)
return io_event_change_epoll(fd, i->what, EPOLL_CTL_MOD);
#endif
#ifdef IO_USE_KQUEUE
return io_event_change_kqueue(fd, what, EV_ADD | EV_ENABLE);
#endif
#ifdef IO_USE_DEVPOLL
return io_event_change_devpoll(fd, i->what);
#endif
#ifdef IO_USE_POLL
return io_event_change_poll(fd, i->what);
#endif
#ifdef IO_USE_SELECT
if (fd > select_maxfd)
select_maxfd = fd;
if (what & IO_WANTREAD)
FD_SET(fd, &readers);
if (what & IO_WANTWRITE)
FD_SET(fd, &writers);
return true;
#endif
}
bool
io_setnonblock(int fd)
{
int flags = fcntl(fd, F_GETFL);
if (flags == -1)
return false;
#ifndef O_NONBLOCK
#define O_NONBLOCK O_NDELAY
#endif
flags |= O_NONBLOCK;
return fcntl(fd, F_SETFL, flags) == 0;
}
#ifdef IO_USE_DEVPOLL
static void
io_close_devpoll(int fd)
{
struct pollfd p;
p.events = POLLREMOVE;
p.fd = fd;
write(io_masterfd, &p, sizeof p);
}
#else
static inline void
io_close_devpoll(int UNUSED x)
{
/* NOTHING */
}
#endif
#ifdef IO_USE_POLL
static void
io_close_poll(int fd)
{
struct pollfd *p;
p = array_get(&pollfds, sizeof *p, fd);
if (!p) return;
p->fd = -1;
if (fd == poll_maxfd) {
while (poll_maxfd > 0) {
--poll_maxfd;
p = array_get(&pollfds, sizeof *p, poll_maxfd);
if (p && p->fd >= 0)
break;
}
}
}
#else
static inline void io_close_poll(int UNUSED x) { /* NOTHING */ }
#endif
#ifdef IO_USE_SELECT
static void
io_close_select(int fd)
{
io_event *i;
if (io_masterfd >= 0) /* Are we using epoll()? */
return;
FD_CLR(fd, &writers);
FD_CLR(fd, &readers);
i = io_event_get(fd);
if (!i) return;
if (fd == select_maxfd) {
while (select_maxfd>0) {
--select_maxfd; /* find largest fd */
i = io_event_get(select_maxfd);
if (i && i->callback) break;
}
}
}
#else
static inline void
io_close_select(int UNUSED x)
{
/* NOTHING */
}
#endif
bool
io_close(int fd)
{
io_event *i;
i = io_event_get(fd);
#ifdef IO_USE_KQUEUE
if (array_length(&io_evcache, sizeof (struct kevent))) /* pending data in cache? */
io_event_kqueue_commit_cache();
/* both kqueue and epoll remove fd from all sets automatically on the last close
* of the descriptor. since we don't know if this is the last close we'll have
* to remove the set explicitly. */
if (i) {
io_event_change_kqueue(fd, i->what, EV_DELETE);
io_event_kqueue_commit_cache();
}
#endif
io_close_devpoll(fd);
io_close_poll(fd);
io_close_select(fd);
#ifdef IO_USE_EPOLL
io_event_change_epoll(fd, 0, EPOLL_CTL_DEL);
#endif
if (i) {
i->callback = NULL;
i->what = 0;
}
return close(fd) == 0;
}
bool
io_event_del(int fd, short what)
{
io_event *i = io_event_get(fd);
#ifdef DEBUG_IO
Log(LOG_DEBUG, "io_event_del(): trying to delete eventtype %d on fd %d", what, fd);
#endif
if (!i) return false;
if (!(i->what & what)) /* event is already disabled */
return true;
i->what &= ~what;
#ifdef IO_USE_DEVPOLL
return io_event_change_devpoll(fd, i->what);
#endif
#ifdef IO_USE_POLL
return io_event_change_poll(fd, i->what);
#endif
#ifdef IO_USE_EPOLL
if (io_masterfd >= 0)
return io_event_change_epoll(fd, i->what, EPOLL_CTL_MOD);
#endif
#ifdef IO_USE_KQUEUE
return io_event_change_kqueue(fd, what, EV_DISABLE);
#endif
#ifdef IO_USE_SELECT
if (what & IO_WANTWRITE)
FD_CLR(fd, &writers);
if (what & IO_WANTREAD)
FD_CLR(fd, &readers);
return true;
#endif
}
#ifdef IO_USE_SELECT
static int
io_dispatch_select(struct timeval *tv)
{
fd_set readers_tmp = readers;
fd_set writers_tmp = writers;
short what;
int ret, i;
int fds_ready;
ret = select(select_maxfd + 1, &readers_tmp, &writers_tmp, NULL, tv);
if (ret <= 0)
return ret;
fds_ready = ret;
for (i = 0; i <= select_maxfd; i++) {
what = 0;
if (FD_ISSET(i, &readers_tmp)) {
what = IO_WANTREAD;
fds_ready--;
}
if (FD_ISSET(i, &writers_tmp)) {
what |= IO_WANTWRITE;
fds_ready--;
}
if (what)
io_docallback(i, what);
if (fds_ready <= 0)
break;
}
return ret;
}
#endif
#ifdef IO_USE_DEVPOLL
static int
io_dispatch_devpoll(struct timeval *tv)
{
struct dvpoll dvp;
time_t sec = tv->tv_sec * 1000;
int i, total, ret, timeout = tv->tv_usec + sec;
short what;
struct pollfd p[100];
if (timeout < 0)
timeout = 1000;
total = 0;
do {
dvp.dp_timeout = timeout;
dvp.dp_nfds = 100;
dvp.dp_fds = p;
ret = ioctl(io_masterfd, DP_POLL, &dvp);
total += ret;
if (ret <= 0)
return total;
for (i=0; i < ret ; i++) {
what = 0;
if (p[i].revents & (POLLIN|POLLPRI))
what = IO_WANTREAD;
if (p[i].revents & POLLOUT)
what |= IO_WANTWRITE;
if (p[i].revents && !what) {
/* other flag is set, probably POLLERR */
what = IO_ERROR;
}
io_docallback(p[i].fd, what);
}
} while (ret == 100);
return total;
}
#endif
#ifdef IO_USE_POLL
static int
io_dispatch_poll(struct timeval *tv)
{
time_t sec = tv->tv_sec * 1000;
int i, ret, timeout = tv->tv_usec + sec;
int fds_ready;
short what;
struct pollfd *p = array_start(&pollfds);
if (timeout < 0)
timeout = 1000;
ret = poll(p, poll_maxfd + 1, timeout);
if (ret <= 0)
return ret;
fds_ready = ret;
for (i=0; i <= poll_maxfd; i++) {
what = 0;
if (p[i].revents & (POLLIN|POLLPRI))
what = IO_WANTREAD;
if (p[i].revents & POLLOUT)
what |= IO_WANTWRITE;
if (p[i].revents && !what) {
/* other flag is set, probably POLLERR */
what = IO_ERROR;
}
if (what) {
fds_ready--;
io_docallback(i, what);
}
if (fds_ready <= 0)
break;
}
return ret;
}
#endif
#ifdef IO_USE_EPOLL
static int
io_dispatch_epoll(struct timeval *tv)
{
time_t sec = tv->tv_sec * 1000;
int i, total = 0, ret, timeout = tv->tv_usec + sec;
struct epoll_event epoll_ev[100];
short type;
if (timeout < 0)
timeout = 1000;
do {
ret = epoll_wait(io_masterfd, epoll_ev, 100, timeout);
total += ret;
if (ret <= 0)
return total;
for (i = 0; i < ret; i++) {
type = 0;
if (epoll_ev[i].events & (EPOLLERR | EPOLLHUP))
type = IO_ERROR;
if (epoll_ev[i].events & (EPOLLIN | EPOLLPRI))
type |= IO_WANTREAD;
if (epoll_ev[i].events & EPOLLOUT)
type |= IO_WANTWRITE;
io_docallback(epoll_ev[i].data.fd, type);
}
timeout = 0;
} while (ret == 100);
return total;
}
#endif
#ifdef IO_USE_KQUEUE
static int
io_dispatch_kqueue(struct timeval *tv)
{
int i, total = 0, ret;
struct kevent kev[100];
struct kevent *newevents;
struct timespec ts;
int newevents_len;
ts.tv_sec = tv->tv_sec;
ts.tv_nsec = tv->tv_usec * 1000;
do {
newevents_len = (int) array_length(&io_evcache, sizeof (struct kevent));
newevents = (newevents_len > 0) ? array_start(&io_evcache) : NULL;
assert(newevents_len >= 0);
ret = kevent(io_masterfd, newevents, newevents_len, kev, 100, &ts);
if (newevents && ret != -1)
array_trunc(&io_evcache);
total += ret;
if (ret <= 0)
return total;
for (i = 0; i < ret; i++) {
#ifdef DEBUG_IO
LogDebug("fd %d, kev.flags: %x", (int)kev[i].ident, kev[i].flags);
#endif
if (kev[i].flags & (EV_EOF|EV_ERROR)) {
if (kev[i].flags & EV_ERROR)
Log(LOG_ERR, "kevent fd %d: EV_ERROR (%s)",
(int)kev[i].ident, strerror((int)kev[i].data));
io_docallback((int)kev[i].ident, IO_ERROR);
continue;
}
switch (kev[i].filter) {
case EVFILT_READ:
io_docallback((int)kev[i].ident, IO_WANTREAD);
break;
case EVFILT_WRITE:
io_docallback((int)kev[i].ident, IO_WANTWRITE);
break;
default:
LogDebug("Unknown kev.filter number %d for fd %d",
kev[i].filter, kev[i].ident);
/* Fall through */
case EV_ERROR:
io_docallback((int)kev[i].ident, IO_ERROR);
break;
}
}
ts.tv_sec = 0;
ts.tv_nsec = 0;
} while (ret == 100);
return total;
}
#endif
int
io_dispatch(struct timeval *tv)
{
#ifdef IO_USE_EPOLL
if (io_masterfd >= 0)
return io_dispatch_epoll(tv);
#endif
#ifdef IO_USE_SELECT
return io_dispatch_select(tv);
#endif
#ifdef IO_USE_KQUEUE
return io_dispatch_kqueue(tv);
#endif
#ifdef IO_USE_DEVPOLL
return io_dispatch_devpoll(tv);
#endif
#ifdef IO_USE_POLL
return io_dispatch_poll(tv);
#endif
}
/* call the callback function inside the struct matching fd */
static void
io_docallback(int fd, short what)
{
io_event *i;
#ifdef DEBUG_IO
Log(LOG_DEBUG, "doing callback for fd %d, what %d", fd, what);
#endif
i = io_event_get(fd);
if (i->callback) { /* callback might be NULL if a previous callback function
called io_close on this fd */
i->callback(fd, (what & IO_ERROR) ? i->what : what);
}
/* if error indicator is set, we return the event(s) that were registered */
}

View File

@@ -1,51 +0,0 @@
/*
* 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.
*
* I/O abstraction interface header
*
* $Id: io.h,v 1.4 2006/12/25 22:53:52 alex Exp $
*/
#ifndef io_H_included
#define io_H_included
#include "portab.h"
#include <sys/time.h>
#define IO_WANTREAD 1
#define IO_WANTWRITE 2
/* init library.
sets up epoll/kqueue descriptors and tries to allocate space for ioevlen
file descriptors. ioevlen is just the _initial_ size, not a limit. */
bool io_library_init PARAMS((unsigned int ioevlen));
/* shutdown and free all internal data structures */
void io_library_shutdown PARAMS((void));
/* add fd to internal set, enable readability check, set callback */
bool io_event_create PARAMS((int fd, short what, void (*cbfunc)(int, short)));
/* change callback function associated with fd */
bool io_event_setcb PARAMS((int fd, void (*cbfunc)(int, short)));
/* watch fd for event of type what */
bool io_event_add PARAMS((int fd, short what));
/* do not watch fd for event of type what */
bool io_event_del PARAMS((int fd, short what));
/* remove fd from watchlist, close() fd. */
bool io_close PARAMS((int fd));
/* set O_NONBLOCK */
bool io_setnonblock PARAMS((int fd));
/* watch fds for activity */
int io_dispatch PARAMS((struct timeval *tv));
#endif /* io_H_included */

View File

@@ -14,7 +14,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: irc-channel.c,v 1.40.2.2 2008/02/26 12:07:41 fw Exp $";
static char UNUSED id[] = "$Id: irc-channel.c,v 1.30.2.2 2006/03/16 20:14:46 fw Exp $";
#include "imp.h"
#include <assert.h>
@@ -43,18 +43,16 @@ static char UNUSED id[] = "$Id: irc-channel.c,v 1.40.2.2 2008/02/26 12:07:41 fw
GLOBAL bool
IRC_JOIN( CLIENT *Client, REQUEST *Req )
{
char *channame, *channame_ptr, *key, *key_ptr, *flags, *topic, modes[8];
char *channame, *key, *flags, *topic, modes[8];
bool is_new_chan, is_invited, is_banned;
CLIENT *target;
CHANNEL *chan;
assert( Client != NULL );
assert( Req != NULL );
/* Bad number of arguments? */
if (Req->argc < 1 || Req->argc > 2)
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
Client_ID(Client), Req->command);
if(( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Who is the sender? */
if( Client_Type( Client ) == CLIENT_SERVER ) target = Client_Search( Req->prefix );
@@ -62,44 +60,32 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
/* Are channel keys given? */
if (Req->argc > 1) {
key = Req->argv[1];
key_ptr = strchr(key, ',');
if (key_ptr) *key_ptr = '\0';
}
else
key = key_ptr = NULL;
channame = Req->argv[0];
channame_ptr = strchr(channame, ',');
if (channame_ptr) *channame_ptr = '\0';
if( Req->argc > 1 ) key = Req->argv[1];
else key = NULL;
/* Channel-Namen durchgehen */
while (channame)
chan = NULL;
channame = strtok( Req->argv[0], "," );
while( channame )
{
chan = NULL; flags = NULL;
if (Client_Type(Client) == CLIENT_SERVER) {
/* wird der Channel neu angelegt? */
if( Channel_Search( channame )) is_new_chan = false;
else is_new_chan = true;
/* Hat ein Server Channel-User-Modes uebergeben? */
if( Client_Type( Client ) == CLIENT_SERVER )
{
/* Channel-Flags extrahieren */
flags = strchr( channame, 0x7 );
if( flags ) {
if( flags )
{
*flags = '\0';
flags++;
}
}
/* wird der Channel neu angelegt? */
if( Channel_Search( channame )) {
is_new_chan = false;
} else {
if (Conf_PredefChannelsOnly) { /* this server does not allow creation of channels */
IRC_WriteStrClient( Client, ERR_BANNEDFROMCHAN_MSG, Client_ID( Client ), channame );
/* Try next name, if any */
channame = strchr(channame, ',');
continue;
}
is_new_chan = true;
}
/* Local client? */
if( Client_Type( Client ) == CLIENT_USER )
{
@@ -120,8 +106,8 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
chan = Channel_Search( channame );
assert( chan != NULL );
is_banned = Lists_Check(Channel_GetListBans(chan), target );
is_invited = Lists_Check(Channel_GetListInvites(chan), target );
is_banned = Lists_CheckBanned( target, chan );
is_invited = Lists_CheckInvited( target, chan );
/* Testen, ob Client gebanned ist */
if(( is_banned == true) && ( is_invited == false ))
@@ -130,7 +116,7 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
IRC_WriteStrClient( Client, ERR_BANNEDFROMCHAN_MSG, Client_ID( Client ), channame );
/* Try next name, if any */
channame = strchr(channame, ',');
channame = strtok( NULL, "," );
continue;
}
@@ -141,7 +127,7 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
IRC_WriteStrClient( Client, ERR_INVITEONLYCHAN_MSG, Client_ID( Client ), channame );
/* Try next name, if any */
channame = strchr(channame, ',');
channame = strtok( NULL, "," );
continue;
}
@@ -152,7 +138,7 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
IRC_WriteStrClient( Client, ERR_BADCHANNELKEY_MSG, Client_ID( Client ), channame );
/* Try next name, if any */
channame = strchr(channame, ',');
channame = strtok( NULL, "," );
continue;
}
@@ -163,7 +149,7 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
IRC_WriteStrClient( Client, ERR_CHANNELISFULL_MSG, Client_ID( Client ), channame );
/* Try next name, if any */
channame = strchr(channame, ',');
channame = strtok( NULL, "," );
continue;
}
}
@@ -176,14 +162,14 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
* commands) in this list become deleted when a user
* joins a channel this way. */
chan = Channel_Search( channame );
if( chan != NULL ) (void)Lists_Check(Channel_GetListInvites(chan), target);
if( chan != NULL ) (void)Lists_CheckInvited( target, chan );
}
/* Channel joinen (und ggf. anlegen) */
if( ! Channel_Join( target, channame ))
{
/* naechsten Namen ermitteln */
channame = strchr(channame, ',');
channame = strtok( NULL, "," );
continue;
}
if( ! chan ) chan = Channel_Search( channame );
@@ -220,37 +206,17 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
/* an Client bestaetigen */
IRC_WriteStrClientPrefix( Client, target, "JOIN :%s", channame );
/* Send topic to client, if any */
topic = Channel_Topic(chan);
if (*topic) {
IRC_WriteStrClient(Client, RPL_TOPIC_MSG,
Client_ID(Client), channame, topic);
#ifndef STRICT_RFC
IRC_WriteStrClient(Client, RPL_TOPICSETBY_MSG,
Client_ID(Client), channame,
Channel_TopicWho(chan),
Channel_TopicTime(chan));
#endif
}
/* Topic an Client schicken */
topic = Channel_Topic( chan );
if( *topic ) IRC_WriteStrClient( Client, RPL_TOPIC_MSG, Client_ID( Client ), channame, topic );
/* Mitglieder an Client Melden */
IRC_Send_NAMES( Client, chan );
IRC_WriteStrClient( Client, RPL_ENDOFNAMES_MSG, Client_ID( Client ), Channel_Name( chan ));
}
/* next channel? */
channame = channame_ptr;
if (channame) {
channame++;
channame_ptr = strchr(channame, ',');
if (channame_ptr) *channame_ptr = '\0';
if (key_ptr) {
key = ++key_ptr;
key_ptr = strchr(key, ',');
if (key_ptr) *key_ptr = '\0';
}
}
/* naechsten Namen ermitteln */
channame = strtok( NULL, "," );
}
return CONNECTED;
} /* IRC_JOIN */
@@ -265,9 +231,8 @@ IRC_PART( CLIENT *Client, REQUEST *Req )
assert( Client != NULL );
assert( Req != NULL );
if (Req->argc < 1 || Req->argc > 2)
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
Client_ID(Client), Req->command);
/* Falsche Anzahl Parameter? */
if(( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Wer ist der Absender? */
if( Client_Type( Client ) == CLIENT_SERVER ) target = Client_Search( Req->prefix );
@@ -275,11 +240,18 @@ IRC_PART( CLIENT *Client, REQUEST *Req )
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
/* Channel-Namen durchgehen */
chan = strtok(Req->argv[0], ",");
while (chan) {
Channel_Part(target, Client, chan, Req->argc > 1 ? Req->argv[1] : Client_ID(target));
chan = strtok( Req->argv[0], "," );
while( chan )
{
if( ! Channel_Part( target, Client, chan, Req->argc > 1 ? Req->argv[1] : Client_ID( target )))
{
/* naechsten Namen ermitteln */
chan = strtok( NULL, "," );
continue;
}
chan = strtok(NULL, ",");
/* naechsten Namen ermitteln */
chan = strtok( NULL, "," );
}
return CONNECTED;
} /* IRC_PART */
@@ -291,7 +263,6 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
CHANNEL *chan;
CLIENT *from;
char *topic;
bool r;
assert( Client != NULL );
assert( Req != NULL );
@@ -312,22 +283,10 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
if( Req->argc == 1 )
{
/* Request actual topic */
topic = Channel_Topic(chan);
if (*topic) {
r = IRC_WriteStrClient(from, RPL_TOPIC_MSG,
Client_ID(Client), Channel_Name(chan), topic);
#ifndef STRICT_RFC
r = IRC_WriteStrClient(from, RPL_TOPICSETBY_MSG,
Client_ID(Client), Channel_Name(chan),
Channel_TopicWho(chan),
Channel_TopicTime(chan));
#endif
return r;
}
else
return IRC_WriteStrClient(from, RPL_NOTOPIC_MSG,
Client_ID(from), Channel_Name(chan));
/* Topic erfragen */
topic = Channel_Topic( chan );
if( *topic ) return IRC_WriteStrClient( from, RPL_TOPIC_MSG, Client_ID( from ), Channel_Name( chan ), topic );
else return IRC_WriteStrClient( from, RPL_NOTOPIC_MSG, Client_ID( from ), Channel_Name( chan ));
}
if( strchr( Channel_Modes( chan ), 't' ))
@@ -336,11 +295,9 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
if( ! strchr( Channel_UserModes( chan, from ), 'o' )) return IRC_WriteStrClient( from, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( from ), Channel_Name( chan ));
}
/* Set new topic */
Channel_SetTopic(chan, from, Req->argv[1]);
Log(LOG_DEBUG, "User \"%s\" set topic on \"%s\": %s",
Client_Mask(from), Channel_Name(chan),
Req->argv[1][0] ? Req->argv[1] : "<none>");
/* Topic setzen */
Channel_SetTopic( chan, Req->argv[1] );
Log( LOG_DEBUG, "User \"%s\" set topic on \"%s\": %s", Client_Mask( from ), Channel_Name( chan ), Req->argv[1][0] ? Req->argv[1] : "<none>" );
/* im Channel bekannt machen und an Server weiterleiten */
IRC_WriteStrServersPrefix( Client, from, "TOPIC %s :%s", Req->argv[0], Req->argv[1] );
@@ -492,7 +449,7 @@ IRC_CHANINFO( CLIENT *Client, REQUEST *Req )
{
if( *ptr == 'l' )
{
snprintf( l, sizeof( l ), " %lu", Channel_MaxUsers( chan ));
snprintf( l, sizeof( l ), " %ld", Channel_MaxUsers( chan ));
strlcat( modes_add, l, sizeof( modes_add ));
}
if( *ptr == 'k' )
@@ -516,9 +473,8 @@ IRC_CHANINFO( CLIENT *Client, REQUEST *Req )
if(( ! *ptr ) && ( Req->argv[arg_topic][0] ))
{
/* OK, there is no topic jet */
Channel_SetTopic(chan, Client, Req->argv[arg_topic]);
IRC_WriteStrChannelPrefix(Client, chan, from, false,
"TOPIC %s :%s", Req->argv[0], Channel_Topic(chan));
Channel_SetTopic( chan, Req->argv[arg_topic] );
IRC_WriteStrChannelPrefix( Client, chan, from, false, "TOPIC %s :%s", Req->argv[0], Channel_Topic( chan ));
}
}

View File

@@ -14,7 +14,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: irc-info.c,v 1.41.2.1 2008/02/26 12:06:57 fw Exp $";
static char UNUSED id[] = "$Id: irc-info.c,v 1.30 2005/06/17 19:15:43 fw Exp $";
#include "imp.h"
#include <assert.h>
@@ -335,41 +335,6 @@ IRC_NAMES( CLIENT *Client, REQUEST *Req )
} /* IRC_NAMES */
static unsigned int
t_diff(time_t *t, const time_t div)
{
time_t diff, remain;
diff = *t / div;
remain = diff * div;
*t -= remain;
return diff;
}
static unsigned int
uptime_days(time_t *now)
{
return t_diff(now, 60 * 60 * 24);
}
static unsigned int
uptime_hrs(time_t *now)
{
return t_diff(now, 60 * 60);
}
static unsigned int
uptime_mins(time_t *now)
{
return t_diff(now, 60);
}
GLOBAL bool
IRC_STATS( CLIENT *Client, REQUEST *Req )
{
@@ -377,94 +342,75 @@ IRC_STATS( CLIENT *Client, REQUEST *Req )
CONN_ID con;
char query;
COMMAND *cmd;
time_t time_now;
unsigned int days, hrs, mins;
assert( Client != NULL );
assert( Req != NULL );
/* Falsche Anzahl Parameter? */
if (Req->argc > 2)
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command);
if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* From aus Prefix ermitteln */
if (Client_Type(Client) == CLIENT_SERVER)
from = Client_Search(Req->prefix);
else
from = Client;
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
else from = Client;
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
if (! from)
return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix);
if (Req->argc == 2) {
if( Req->argc == 2 )
{
/* an anderen Server forwarden */
target = Client_Search( Req->argv[1] );
if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER ))
return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG, Client_ID( from ), Req->argv[1] );
if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER )) return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG, Client_ID( from ), Req->argv[1] );
if( target != Client_ThisServer()) {
if( target != Client_ThisServer( ))
{
/* Ok, anderer Server ist das Ziel: forwarden */
return IRC_WriteStrClientPrefix( target, from, "STATS %s %s", Req->argv[0], Req->argv[1] );
}
}
if (Req->argc > 0)
query = Req->argv[0][0] ? Req->argv[0][0] : '*';
else
query = '*';
if( Req->argc > 0 ) query = Req->argv[0][0] ? Req->argv[0][0] : '*';
else query = '*';
switch (query) {
switch ( query )
{
case 'l': /* Links */
case 'L':
time_now = time(NULL);
for (con = Conn_First(); con != NONE ;con = Conn_Next(con)) {
cl = Conn_GetClient(con);
if (!cl)
continue;
if ((Client_Type(cl) == CLIENT_SERVER) || (cl == Client)) {
con = Conn_First( );
while( con != NONE )
{
cl = Client_GetFromConn( con );
if( cl && (( Client_Type( cl ) == CLIENT_SERVER ) || ( cl == Client )))
{
/* Server link or our own connection */
#ifdef ZLIB
if (Conn_Options(con) & CONN_ZIP) {
if (!IRC_WriteStrClient(from, RPL_STATSLINKINFOZIP_MSG,
Client_ID(from), Client_Mask(cl), Conn_SendQ(con),
Conn_SendMsg(con), Zip_SendBytes(con), Conn_SendBytes(con),
Conn_RecvMsg(con), Zip_RecvBytes(con), Conn_RecvBytes(con), (long)(time_now - Conn_StartTime(con))))
return DISCONNECTED;
continue;
if( Conn_Options( con ) & CONN_ZIP )
{
if( ! IRC_WriteStrClient( from, RPL_STATSLINKINFOZIP_MSG, Client_ID( from ), Client_Mask( cl ), Conn_SendQ( con ), Conn_SendMsg( con ), Zip_SendBytes( con ), Conn_SendBytes( con ), Conn_RecvMsg( con ), Zip_RecvBytes( con ), Conn_RecvBytes( con ), (long)( time( NULL ) - Conn_StartTime( con )))) return DISCONNECTED;
}
else
#endif
if (!IRC_WriteStrClient(from, RPL_STATSLINKINFO_MSG, Client_ID(from),
Client_Mask(cl), Conn_SendQ(con), Conn_SendMsg(con), Conn_SendBytes(con),
Conn_RecvMsg(con), Conn_RecvBytes(con), (long)(time_now - Conn_StartTime(con))))
return DISCONNECTED;
{
if( ! IRC_WriteStrClient( from, RPL_STATSLINKINFO_MSG, Client_ID( from ), Client_Mask( cl ), Conn_SendQ( con ), Conn_SendMsg( con ), Conn_SendBytes( con ), Conn_RecvMsg( con ), Conn_RecvBytes( con ), (long)( time( NULL ) - Conn_StartTime( con )))) return DISCONNECTED;
}
}
con = Conn_Next( con );
}
break;
case 'm': /* IRC-Commands */
case 'm': /* IRC-Befehle */
case 'M':
cmd = Parse_GetCommandStruct( );
for (; cmd->name ; cmd++) {
if (cmd->lcount == 0 && cmd->rcount == 0)
continue;
if (!IRC_WriteStrClient(from, RPL_STATSCOMMANDS_MSG, Client_ID(from),
cmd->name, cmd->lcount, cmd->bytes, cmd->rcount))
return DISCONNECTED;
while( cmd->name )
{
if( cmd->lcount > 0 || cmd->rcount > 0 )
{
if( ! IRC_WriteStrClient( from, RPL_STATSCOMMANDS_MSG, Client_ID( from ), cmd->name, cmd->lcount, cmd->bytes, cmd->rcount )) return DISCONNECTED;
}
cmd++;
}
break;
case 'u': /* server uptime */
case 'U':
time_now = time(NULL) - NGIRCd_Start;
days = uptime_days(&time_now);
hrs = uptime_hrs(&time_now);
mins = uptime_mins(&time_now);
if (!IRC_WriteStrClient(from, RPL_STATSUPTIME, Client_ID(from),
days, hrs, mins, (unsigned int) time_now))
return DISCONNECTED;
break;
}
IRC_SetPenalty(from, 2);
return IRC_WriteStrClient(from, RPL_ENDOFSTATS_MSG, Client_ID(from), query);
IRC_SetPenalty( from, 2 );
return IRC_WriteStrClient( from, RPL_ENDOFSTATS_MSG, Client_ID( from ), query );
} /* IRC_STATS */
@@ -596,8 +542,7 @@ GLOBAL bool
IRC_WHO( CLIENT *Client, REQUEST *Req )
{
bool ok, only_ops;
char flags[8];
const char *ptr;
char flags[8], *ptr;
CL2CHAN *cl2chan;
CHANNEL *chan, *cn;
CLIENT *c;
@@ -648,11 +593,7 @@ IRC_WHO( CLIENT *Client, REQUEST *Req )
if( ok && (( ! only_ops ) || ( strchr( Client_Modes( c ), 'o' ))))
{
/* Get flags */
if (strchr(Client_Modes( c ), 'a'))
strcpy(flags, "G"); /* away */
else
strcpy(flags, "H");
strcpy( flags, "H" );
if( strchr( Client_Modes( c ), 'o' )) strlcat( flags, "*", sizeof( flags ));
/* Search suitable channel */
@@ -765,13 +706,10 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req )
if( ! IRC_WriteStrClient( from, RPL_WHOISOPERATOR_MSG, Client_ID( from ), Client_ID( c ))) return DISCONNECTED;
}
/* Idle and signon time (local clients only!) */
if (Client_Conn(c) > NONE ) {
if (! IRC_WriteStrClient(from, RPL_WHOISIDLE_MSG,
Client_ID(from), Client_ID(c),
(unsigned long)Conn_GetIdle(Client_Conn(c)),
(unsigned long)Conn_GetSignon(Client_Conn(c))))
return DISCONNECTED;
/* Idle (only local clients) */
if( Client_Conn( c ) > NONE )
{
if( ! IRC_WriteStrClient( from, RPL_WHOISIDLE_MSG, Client_ID( from ), Client_ID( c ), Conn_GetIdle( Client_Conn ( c )))) return DISCONNECTED;
}
/* Away? */
@@ -894,10 +832,7 @@ IRC_WHOWAS( CLIENT *Client, REQUEST *Req )
GLOBAL bool
IRC_Send_LUSERS( CLIENT *Client )
{
unsigned long cnt;
#ifndef STRICT_RFC
unsigned long max;
#endif
long cnt;
assert( Client != NULL );
@@ -926,81 +861,56 @@ IRC_Send_LUSERS( CLIENT *Client )
#ifndef STRICT_RFC
/* Maximum number of local users */
cnt = Client_MyUserCount();
max = Client_MyMaxUserCount();
if (! IRC_WriteStrClient(Client, RPL_LOCALUSERS_MSG, Client_ID(Client),
cnt, max, cnt, max))
return DISCONNECTED;
if( ! IRC_WriteStrClient( Client, RPL_LOCALUSERS_MSG, Client_ID( Client ), Client_MyUserCount( ), Client_MyMaxUserCount( ))) return DISCONNECTED;
/* Maximum number of users in the network */
cnt = Client_UserCount();
max = Client_MaxUserCount();
if(! IRC_WriteStrClient(Client, RPL_NETUSERS_MSG, Client_ID(Client),
cnt, max, cnt, max))
return DISCONNECTED;
if( ! IRC_WriteStrClient( Client, RPL_NETUSERS_MSG, Client_ID( Client ), Client_UserCount( ), Client_MaxUserCount( ))) return DISCONNECTED;
#endif
return CONNECTED;
} /* IRC_Send_LUSERS */
static bool
Show_MOTD_Start(CLIENT *Client)
{
return IRC_WriteStrClient(Client, RPL_MOTDSTART_MSG,
Client_ID( Client ), Client_ID( Client_ThisServer( )));
}
static bool
Show_MOTD_Sendline(CLIENT *Client, const char *msg)
{
return IRC_WriteStrClient(Client, RPL_MOTD_MSG, Client_ID( Client ), msg);
}
static bool
Show_MOTD_End(CLIENT *Client)
{
return IRC_WriteStrClient( Client, RPL_ENDOFMOTD_MSG, Client_ID( Client ));
}
GLOBAL bool
IRC_Show_MOTD( CLIENT *Client )
{
bool ok;
char line[127];
FILE *fd;
assert( Client != NULL );
if (Conf_MotdPhrase[0]) {
if (!Show_MOTD_Start(Client))
return DISCONNECTED;
if (!Show_MOTD_Sendline(Client, Conf_MotdPhrase))
return DISCONNECTED;
return Show_MOTD_End(Client);
if( Conf_MotdPhrase[0] )
{
if( ! IRC_WriteStrClient( Client, RPL_MOTDSTART_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )))) return DISCONNECTED;
if( ! IRC_WriteStrClient( Client, RPL_MOTD_MSG, Client_ID( Client ), Conf_MotdPhrase )) return DISCONNECTED;
return IRC_WriteStrClient( Client, RPL_ENDOFMOTD_MSG, Client_ID( Client ));
}
fd = fopen( Conf_MotdFile, "r" );
if( ! fd ) {
if( ! fd )
{
Log( LOG_WARNING, "Can't read MOTD file \"%s\": %s", Conf_MotdFile, strerror( errno ));
return IRC_WriteStrClient( Client, ERR_NOMOTD_MSG, Client_ID( Client ) );
}
if (!Show_MOTD_Start( Client )) {
fclose(fd);
return false;
}
if( ! IRC_WriteStrClient( Client, RPL_MOTDSTART_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )))) return DISCONNECTED;
while( true )
{
if( ! fgets( line, sizeof( line ), fd )) break;
while (fgets( line, (int)sizeof line, fd )) {
ngt_TrimLastChr( line, '\n');
if( ! Show_MOTD_Sendline( Client, line)) {
if( ! IRC_WriteStrClient( Client, RPL_MOTD_MSG, Client_ID( Client ), line ))
{
fclose( fd );
return false;
}
}
fclose(fd);
return Show_MOTD_End(Client);
ok = IRC_WriteStrClient( Client, RPL_ENDOFMOTD_MSG, Client_ID( Client ) );
fclose( fd );
return ok;
} /* IRC_Show_MOTD */
@@ -1086,12 +996,10 @@ IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, bool OnlyOps )
if( strchr( Client_Modes( c ), 'i' )) is_visible = false;
else is_visible = true;
if( is_member || is_visible ) {
if (strchr(Client_Modes( c ), 'a'))
strcpy(flags, "G"); /* away */
else
strcpy(flags, "H");
if( is_member || is_visible )
{
/* Flags zusammenbasteln */
strcpy( flags, "H" );
if( strchr( Client_Modes( c ), 'o' )) strlcat( flags, "*", sizeof( flags ));
if( strchr( Channel_UserModes( Chan, c ), 'o' )) strlcat( flags, "@", sizeof( flags ));
else if( strchr( Channel_UserModes( Chan, c ), 'v' )) strlcat( flags, "+", sizeof( flags ));
@@ -1110,22 +1018,4 @@ IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, bool OnlyOps )
} /* IRC_Send_WHO */
/**
* Send the ISUPPORT numeric (005).
* This numeric indicates the features that are supported by this server.
* See <http://www.irc.org/tech_docs/005.html> for details.
*/
GLOBAL bool
IRC_Send_ISUPPORT PARAMS((CLIENT * Client))
{
if (!IRC_WriteStrClient(Client, RPL_ISUPPORT1_MSG, Client_ID(Client),
Conf_MaxJoins))
return DISCONNECTED;
return IRC_WriteStrClient(Client, RPL_ISUPPORT2_MSG, Client_ID(Client),
CHANNEL_NAME_LEN - 1, Conf_MaxNickLength - 1,
COMMAND_LEN - 23, CLIENT_AWAY_LEN - 1,
COMMAND_LEN - 113);
} /* IRC_Send_ISUPPORT */
/* -eof- */

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: irc-info.h,v 1.4 2007/11/21 12:16:36 alex Exp $
* $Id: irc-info.h,v 1.3 2005/03/19 18:43:48 fw Exp $
*
* IRC info commands (header)
*/
@@ -36,7 +36,6 @@ GLOBAL bool IRC_Send_LUSERS PARAMS(( CLIENT *Client ));
GLOBAL bool IRC_Send_NAMES PARAMS(( CLIENT *Client, CHANNEL *Chan ));
GLOBAL bool IRC_Show_MOTD PARAMS(( CLIENT *Client ));
GLOBAL bool IRC_Send_WHO PARAMS(( CLIENT *Client, CHANNEL *Chan, bool OnlyOps ));
GLOBAL bool IRC_Send_ISUPPORT PARAMS(( CLIENT *Client ));
#endif

View File

@@ -14,7 +14,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: irc-login.c,v 1.54.2.1 2008/02/05 11:48:37 fw Exp $";
static char UNUSED id[] = "$Id: irc-login.c,v 1.44.2.1 2005/12/15 11:01:59 alex Exp $";
#include "imp.h"
#include <assert.h>
@@ -41,123 +41,105 @@ static char UNUSED id[] = "$Id: irc-login.c,v 1.54.2.1 2008/02/05 11:48:37 fw Ex
#include "irc-login.h"
static bool Hello_User PARAMS(( CLIENT *Client ));
static void Kill_Nick PARAMS(( char *Nick, char *Reason ));
LOCAL bool Hello_User PARAMS(( CLIENT *Client ));
LOCAL void Kill_Nick PARAMS(( char *Nick, char *Reason ));
/**
* Handler for the IRC command "PASS".
* See RFC 2813 section 4.1.1, and RFC 2812 section 3.1.1.
*/
GLOBAL bool
IRC_PASS( CLIENT *Client, REQUEST *Req )
{
char *type, *orig_flags;
int protohigh, protolow;
assert( Client != NULL );
assert( Req != NULL );
/* Return an error if this is not a local client */
if (Client_Conn(Client) <= NONE)
return IRC_WriteStrClient(Client, ERR_UNKNOWNCOMMAND_MSG,
Client_ID(Client), Req->command);
/* Fehler liefern, wenn kein lokaler Client */
if( Client_Conn( Client ) <= NONE ) return IRC_WriteStrClient( Client, ERR_UNKNOWNCOMMAND_MSG, Client_ID( Client ), Req->command );
if (Client_Type(Client) == CLIENT_UNKNOWN && Req->argc == 1) {
/* Not yet registered "unknown" connection, PASS with one
* argument: either a regular client, service, or server
* using the old RFC 1459 section 4.1.1 syntax. */
LogDebug("Connection %d: got PASS command ...",
Client_Conn(Client));
} else if ((Client_Type(Client) == CLIENT_UNKNOWN ||
Client_Type(Client) == CLIENT_UNKNOWNSERVER) &&
(Req->argc == 3 || Req->argc == 4)) {
/* Not yet registered "unknown" connection or outgoing server
* link, PASS with three or four argument: server using the
* RFC 2813 section 4.1.1 syntax. */
LogDebug("Connection %d: got PASS command (new server link) ...",
Client_Conn(Client));
} else if (Client_Type(Client) == CLIENT_UNKNOWN ||
Client_Type(Client) == CLIENT_UNKNOWNSERVER) {
/* Unregistered connection, but wrong number of arguments: */
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
Client_ID(Client), Req->command);
} else {
/* Registered connection, PASS command is not allowed! */
return IRC_WriteStrClient(Client, ERR_ALREADYREGISTRED_MSG,
Client_ID(Client));
if(( Client_Type( Client ) == CLIENT_UNKNOWN ) && ( Req->argc == 1))
{
/* noch nicht registrierte unbekannte Verbindung */
Log( LOG_DEBUG, "Connection %d: got PASS command ...", Client_Conn( Client ));
/* Passwort speichern */
Client_SetPassword( Client, Req->argv[0] );
Client_SetType( Client, CLIENT_GOTPASS );
return CONNECTED;
}
else if((( Client_Type( Client ) == CLIENT_UNKNOWN ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER )) && (( Req->argc == 3 ) || ( Req->argc == 4 )))
{
char c2, c4, *type, *impl, *serverver, *flags, *ptr, *ircflags;
int protohigh, protolow;
Client_SetPassword(Client, Req->argv[0]);
Client_SetType(Client, CLIENT_GOTPASS);
/* noch nicht registrierte Server-Verbindung */
Log( LOG_DEBUG, "Connection %d: got PASS command (new server link) ...", Client_Conn( Client ));
/* Protocol version */
if (Req->argc >= 2 && strlen(Req->argv[1]) >= 4) {
int c2, c4;
/* Passwort speichern */
Client_SetPassword( Client, Req->argv[0] );
c2 = Req->argv[1][2];
c4 = Req->argv[1][4];
/* Protokollversion ermitteln */
if( strlen( Req->argv[1] ) >= 4 )
{
c2 = Req->argv[1][2];
c4 = Req->argv[1][4];
Req->argv[1][4] = '\0';
protolow = atoi(&Req->argv[1][2]);
Req->argv[1][2] = '\0';
protohigh = atoi(Req->argv[1]);
Req->argv[1][4] = '\0';
protolow = atoi( &Req->argv[1][2] );
Req->argv[1][2] = '\0';
protohigh = atoi( Req->argv[1] );
Req->argv[1][2] = c2;
Req->argv[1][4] = c4;
} else
protohigh = protolow = 0;
Req->argv[1][2] = c2;
Req->argv[1][4] = c4;
}
else protohigh = protolow = 0;
/* Protocol type, see doc/Protocol.txt */
if (Req->argc >= 2 && strlen(Req->argv[1]) > 4)
type = &Req->argv[1][4];
else
type = NULL;
/* Protocol flags/options */
if (Req->argc >= 4)
orig_flags = Req->argv[3];
else
orig_flags = "";
/* Protokoll-Typ */
if( strlen( Req->argv[1] ) > 4 ) type = &Req->argv[1][4];
else type = NULL;
/* Implementation, version and IRC+ flags */
if (Req->argc >= 3) {
char *impl, *ptr, *serverver, *flags;
/* IRC-Flags (nach RFC 2813) */
if( Req->argc >= 4 ) ircflags = Req->argv[3];
else ircflags = "";
/* Implementation, Version und ngIRCd-Flags */
impl = Req->argv[2];
ptr = strchr(impl, '|');
if (ptr)
*ptr = '\0';
ptr = strchr( impl, '|' );
if( ptr ) *ptr = '\0';
if (type && strcmp(type, PROTOIRCPLUS) == 0) {
/* The peer seems to be a server which supports the
* IRC+ protocol (see doc/Protocol.txt). */
if( type && ( strcmp( type, PROTOIRCPLUS ) == 0 ))
{
/* auf der anderen Seite laeuft ein Server, der
* ebenfalls das IRC+-Protokoll versteht */
serverver = ptr + 1;
flags = strchr(serverver, ':');
if (flags) {
flags = strchr( serverver, ':' );
if( flags )
{
*flags = '\0';
flags++;
} else
flags = "";
Log(LOG_INFO,
"Peer announces itself as %s-%s using protocol %d.%d/IRC+ (flags: \"%s\").",
impl, serverver, protohigh, protolow, flags);
} else {
/* The peer seems to be a server supporting the
* "original" IRC protocol (RFC 2813). */
serverver = "";
if (strchr(orig_flags, 'Z'))
flags = "Z";
else
flags = "";
Log(LOG_INFO,
"Peer announces itself as \"%s\" using protocol %d.%d (flags: \"%s\").",
impl, protohigh, protolow, flags);
}
else flags = "";
Log( LOG_INFO, "Peer announces itself as %s-%s using protocol %d.%d/IRC+ (flags: \"%s\").", impl, serverver, protohigh, protolow, flags );
}
else
{
/* auf der anderen Seite laeuft ein Server, der
* nur das Originalprotokoll unterstuetzt */
serverver = "";
if( strchr( ircflags, 'Z' )) flags = "Z";
else flags = "";
Log( LOG_INFO, "Peer announces itself as \"%s\" using protocol %d.%d (flags: \"%s\").", impl, protohigh, protolow, flags );
}
Client_SetFlags(Client, flags);
}
return CONNECTED;
Client_SetType( Client, CLIENT_GOTPASSSERVER );
Client_SetFlags( Client, flags );
return CONNECTED;
}
else if(( Client_Type( Client ) == CLIENT_UNKNOWN ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER ))
{
/* Falsche Anzahl Parameter? */
return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
}
else return IRC_WriteStrClient( Client, ERR_ALREADYREGISTRED_MSG, Client_ID( Client ));
} /* IRC_PASS */
@@ -286,13 +268,13 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
"NICK :%s", Req->argv[0] );
IRC_WriteStrRelatedPrefix( target, target, false,
"NICK :%s", Req->argv[0] );
/* Register old nickname for WHOWAS queries */
Client_RegisterWhowas( target );
/* Save new nickname */
Client_SetID( target, Req->argv[0] );
IRC_SetPenalty( target, 2 );
}
@@ -445,134 +427,85 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req )
GLOBAL bool
IRC_PING(CLIENT *Client, REQUEST *Req)
IRC_PING( CLIENT *Client, REQUEST *Req )
{
CLIENT *target, *from;
assert(Client != NULL);
assert(Req != NULL);
assert( Client != NULL );
assert( Req != NULL );
/* Wrong number of arguments? */
if (Req->argc < 1)
return IRC_WriteStrClient(Client, ERR_NOORIGIN_MSG,
Client_ID(Client));
/* Falsche Anzahl Parameter? */
if( Req->argc < 1 ) return IRC_WriteStrClient( Client, ERR_NOORIGIN_MSG, Client_ID( Client ));
#ifdef STRICT_RFC
/* Don't ignore additional arguments when in "strict" mode */
if (Req->argc > 2)
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
Client_ID(Client), Req->command);
if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
#endif
if (Req->argc > 1) {
/* A target has been specified ... */
target = Client_Search(Req->argv[1]);
if (!target || Client_Type(target) != CLIENT_SERVER)
return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
Client_ID(Client), Req->argv[1]);
if (target != Client_ThisServer()) {
/* Ok, we have to forward the PING */
if (Client_Type(Client) == CLIENT_SERVER)
from = Client_Search(Req->prefix);
else
from = Client;
if (!from)
return IRC_WriteStrClient(Client,
ERR_NOSUCHSERVER_MSG,
Client_ID(Client), Req->prefix);
return IRC_WriteStrClientPrefix(target, from,
"PING %s :%s", Req->argv[0],
Req->argv[1] );
if( Req->argc > 1 )
{
/* es wurde ein Ziel-Client angegeben */
target = Client_Search( Req->argv[1] );
if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] );
if( target != Client_ThisServer( ))
{
/* ok, forwarden */
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
else from = Client;
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix );
return IRC_WriteStrClientPrefix( target, from, "PING %s :%s", Client_ID( from ), Req->argv[1] );
}
}
if (Client_Type(Client) == CLIENT_SERVER) {
if (Req->prefix)
from = Client_Search(Req->prefix);
else
from = Client;
} else
from = Client_ThisServer();
if (!from)
return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
Client_ID(Client), Req->prefix);
Log(LOG_DEBUG, "Connection %d: got PING, sending PONG ...",
Client_Conn(Client));
Log( LOG_DEBUG, "Connection %d: got PING, sending PONG ...", Client_Conn( Client ));
#ifdef STRICT_RFC
return IRC_WriteStrClient(Client, "PONG %s :%s",
Client_ID(from), Client_ID(Client));
Client_ID(Client_ThisServer()), Client_ID(Client));
#else
/* Some clients depend on the argument being returned in the PONG
* reply (not mentioned in any RFC, though) */
* reply (not mentioned in any RFC, though) */
return IRC_WriteStrClient(Client, "PONG %s :%s",
Client_ID(from), Req->argv[0]);
#endif
Client_ID(Client_ThisServer( )), Req->argv[0]);
#endif
} /* IRC_PING */
GLOBAL bool
IRC_PONG(CLIENT *Client, REQUEST *Req)
IRC_PONG( CLIENT *Client, REQUEST *Req )
{
CLIENT *target, *from;
char *s;
assert(Client != NULL);
assert(Req != NULL);
assert( Client != NULL );
assert( Req != NULL );
/* Wrong number of arguments? */
if (Req->argc < 1)
return IRC_WriteStrClient(Client, ERR_NOORIGIN_MSG,
Client_ID(Client));
if (Req->argc > 2)
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
Client_ID(Client), Req->command);
/* Falsche Anzahl Parameter? */
if( Req->argc < 1 ) return IRC_WriteStrClient( Client, ERR_NOORIGIN_MSG, Client_ID( Client ));
if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Forward? */
if (Req->argc == 2 && Client_Type(Client) == CLIENT_SERVER) {
target = Client_Search(Req->argv[0]);
if (!target)
return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
Client_ID(Client), Req->argv[0]);
from = Client_Search(Req->prefix);
if (target != Client_ThisServer() && target != from) {
/* Ok, we have to forward the message. */
if (!from)
return IRC_WriteStrClient(Client,
ERR_NOSUCHSERVER_MSG,
Client_ID(Client), Req->prefix);
if (Client_Type(Client_NextHop(target)) != CLIENT_SERVER)
s = Client_ID(from);
else
s = Req->argv[0];
return IRC_WriteStrClientPrefix(target, from,
"PONG %s :%s", s, Req->argv[1]);
/* forwarden? */
if( Req->argc == 2 )
{
target = Client_Search( Req->argv[1] );
if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] );
if( target != Client_ThisServer( ))
{
/* ok, forwarden */
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
else from = Client;
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix );
return IRC_WriteStrClientPrefix( target, from, "PONG %s :%s", Client_ID( from ), Req->argv[1] );
}
}
/* The connection timestamp has already been updated when the data has
* been read from so socket, so we don't need to update it here. */
/* Der Connection-Timestamp wurde schon beim Lesen aus dem Socket
* aktualisiert, daher muss das hier nicht mehr gemacht werden. */
if (Client_Conn(Client) > NONE)
Log(LOG_DEBUG,
"Connection %d: received PONG. Lag: %ld seconds.",
Client_Conn(Client),
time(NULL) - Conn_LastPing(Client_Conn(Client)));
else
Log(LOG_DEBUG,
"Connection %d: received PONG.", Client_Conn(Client));
if( Client_Conn( Client ) > NONE ) Log( LOG_DEBUG, "Connection %d: received PONG. Lag: %ld seconds.", Client_Conn( Client ), time( NULL ) - Conn_LastPing( Client_Conn( Client )));
else Log( LOG_DEBUG, "Connection %d: received PONG.", Client_Conn( Client ));
return CONNECTED;
} /* IRC_PONG */
static bool
LOCAL bool
Hello_User( CLIENT *Client )
{
#ifdef CVSDATE
@@ -601,8 +534,8 @@ Hello_User( CLIENT *Client )
/* Version and system type */
#ifdef CVSDATE
strlcpy( ver, CVSDATE, sizeof( ver ));
memmove( ver + 4, ver + 5, 2 );
memmove( ver + 6, ver + 8, 3 );
strncpy( ver + 4, ver + 5, 2 );
strncpy( ver + 6, ver + 8, 3 );
snprintf( vertxt, sizeof( vertxt ), "%s(%s)", PACKAGE_VERSION, ver );
if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), vertxt, TARGET_CPU, TARGET_VENDOR, TARGET_OS )) return false;
#else
@@ -616,10 +549,8 @@ Hello_User( CLIENT *Client )
if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), PACKAGE_VERSION, USERMODES, CHANMODES )) return false;
#endif
/* Features supported by this server (005 numeric, ISUPPORT),
* see <http://www.irc.org/tech_docs/005.html> for details. */
if (! IRC_Send_ISUPPORT(Client))
return DISCONNECTED;
/* Features */
if( ! IRC_WriteStrClient( Client, RPL_ISUPPORT_MSG, Client_ID( Client ), CLIENT_NICK_LEN - 1, CHANNEL_TOPIC_LEN - 1, CLIENT_AWAY_LEN - 1, Conf_MaxJoins )) return DISCONNECTED;
Client_SetType( Client, CLIENT_USER );
@@ -633,7 +564,7 @@ Hello_User( CLIENT *Client )
} /* Hello_User */
static void
LOCAL void
Kill_Nick( char *Nick, char *Reason )
{
REQUEST r;

View File

@@ -14,7 +14,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: irc-mode.c,v 1.50.2.1 2008/02/16 11:26:12 fw Exp $";
static char UNUSED id[] = "$Id: irc-mode.c,v 1.43 2005/06/17 19:14:58 fw Exp $";
#include "imp.h"
#include <assert.h>
@@ -38,16 +38,16 @@ static char UNUSED id[] = "$Id: irc-mode.c,v 1.50.2.1 2008/02/16 11:26:12 fw Exp
#include "irc-mode.h"
static bool Client_Mode PARAMS(( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ));
static bool Channel_Mode PARAMS(( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel ));
LOCAL bool Client_Mode PARAMS(( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ));
LOCAL bool Channel_Mode PARAMS(( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel ));
static bool Add_Invite PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ));
static bool Add_Ban PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ));
LOCAL bool Add_Invite PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ));
LOCAL bool Add_Ban PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ));
static bool Del_Invite PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ));
static bool Del_Ban PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ));
LOCAL bool Del_Invite PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ));
LOCAL bool Del_Ban PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ));
static bool Send_ListChange PARAMS(( char *Mode, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Mask ));
LOCAL bool Send_ListChange PARAMS(( char *Mode, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Mask ));
GLOBAL bool
@@ -69,26 +69,21 @@ IRC_MODE( CLIENT *Client, REQUEST *Req )
if( ! origin ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
}
else origin = Client;
/* Channel or user mode? */
cl = NULL; chan = NULL;
if (Client_IsValidNick(Req->argv[0]))
cl = Client_Search(Req->argv[0]);
if (Channel_IsValidName(Req->argv[0]))
chan = Channel_Search(Req->argv[0]);
cl = chan = NULL;
if( Client_IsValidNick( Req->argv[0] )) cl = Client_Search( Req->argv[0] );
if( Channel_IsValidName( Req->argv[0] )) chan = Channel_Search( Req->argv[0] );
if (cl)
return Client_Mode(Client, Req, origin, cl);
if (chan)
return Channel_Mode(Client, Req, origin, chan);
if( cl ) return Client_Mode( Client, Req, origin, cl );
if( chan ) return Channel_Mode( Client, Req, origin, chan );
/* No target found! */
return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG,
Client_ID(Client), Req->argv[0]);
return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
} /* IRC_MODE */
static bool
LOCAL bool
Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
{
/* Handle client mode requests */
@@ -164,7 +159,6 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
{
case 'i': /* Invisible */
case 's': /* Server messages */
case 'w': /* Wallops messages */
x[0] = *mode_ptr;
break;
@@ -242,7 +236,7 @@ client_exit:
} /* Client_Mode */
static bool
LOCAL bool
Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
{
/* Handle channel and channel-user modes */
@@ -269,7 +263,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
switch( *mode_ptr )
{
case 'l':
snprintf( argadd, sizeof( argadd ), " %lu", Channel_MaxUsers( Channel ));
snprintf( argadd, sizeof( argadd ), " %ld", Channel_MaxUsers( Channel ));
strlcat( the_args, argadd, sizeof( the_args ));
break;
case 'k':
@@ -317,7 +311,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
/* Prepare reply string */
if( set ) strcpy( the_modes, "+" );
else strcpy( the_modes, "-" );
the_args[0] = '\0';
strcpy( the_args, " " );
x[1] = '\0';
ok = CONNECTED;
@@ -432,21 +426,16 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
break;
case 'P': /* Persistent channel */
if (modeok) {
/* Only IRC operators are allowed to
* set the 'P' channel mode! */
if (set && ! (Client_OperByMe(Client)
|| Client_Type(Client) == CLIENT_SERVER)) {
ok = IRC_WriteStrClient(Origin,
ERR_NOPRIVILEGES_MSG,
Client_ID(Origin));
} else
x[0] = 'P';
} else
ok = IRC_WriteStrClient(Origin,
ERR_CHANOPRIVSNEEDED_MSG,
Client_ID(Origin),
Channel_Name(Channel));
if( modeok )
{
if( set && ( ! Client_OperByMe( Client )))
{
/* Only IRC operators are allowed to set P mode */
ok = IRC_WriteStrClient( Origin, ERR_NOPRIVILEGES_MSG, Client_ID( Origin ));
}
else x[0] = 'P';
}
else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
break;
/* --- Channel user modes --- */
@@ -483,7 +472,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
Req->argv[arg_arg][0] = '\0';
arg_arg++;
}
else Channel_ShowInvites( Origin, Channel );
else Lists_ShowInvites( Origin, Channel );
break;
case 'b': /* Ban lists */
@@ -499,7 +488,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
Req->argv[arg_arg][0] = '\0';
arg_arg++;
}
else Channel_ShowBans( Origin, Channel );
else Lists_ShowBans( Origin, Channel );
break;
default:
@@ -528,8 +517,8 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
/* Channel-User-Mode */
if( Channel_UserModeAdd( Channel, client, x[0] ))
{
strlcat( the_args, " ", sizeof( the_args ));
strlcat( the_args, Client_ID( client ), sizeof( the_args ));
strlcat( the_args, " ", sizeof( the_args ));
strlcat( the_modes, x, sizeof( the_modes ));
Log( LOG_DEBUG, "User \"%s\": Mode change on %s, now \"%s\"", Client_Mask( client ), Channel_Name( Channel ), Channel_UserModes( Channel, client ));
}
@@ -552,8 +541,8 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
/* Channel-User-Mode */
if( Channel_UserModeDel( Channel, client, x[0] ))
{
strlcat( the_args, " ", sizeof( the_args ));
strlcat( the_args, Client_ID( client ), sizeof( the_args ));
strlcat( the_args, " ", sizeof( the_args ));
strlcat( the_modes, x, sizeof( the_modes ));
Log( LOG_DEBUG, "User \"%s\": Mode change on %s, now \"%s\"", Client_Mask( client ), Channel_Name( Channel ), Channel_UserModes( Channel, client ));
}
@@ -572,7 +561,8 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
/* Are there additional arguments to add? */
if( argadd[0] )
{
strlcat( the_args, " ", sizeof( the_args ));
len = strlen( the_args ) - 1;
if( the_args[len] != ' ' ) strlcat( the_args, " ", sizeof( the_args ));
strlcat( the_args, argadd, sizeof( the_args ));
}
}
@@ -585,6 +575,9 @@ chan_exit:
len = strlen( the_modes ) - 1;
if(( the_modes[len] == '+' ) || ( the_modes[len] == '-' )) the_modes[len] = '\0';
/* Clean up argument string if there are none */
if( ! the_args[1] ) the_args[0] = '\0';
if( Client_Type( Client ) == CLIENT_SERVER )
{
/* Forward mode changes to channel users and other servers */
@@ -634,7 +627,7 @@ IRC_AWAY( CLIENT *Client, REQUEST *Req )
} /* IRC_AWAY */
static bool
LOCAL bool
Add_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
{
char *mask;
@@ -646,19 +639,17 @@ Add_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
mask = Lists_MakeMask( Pattern );
already = Lists_CheckDupeMask(Channel_GetListInvites(Channel), mask );
if (!already) {
if( ! Channel_AddInvite(Channel, mask, false ))
return CONNECTED;
}
if ( already && ( Client_Type( Prefix ) == CLIENT_SERVER ))
return CONNECTED;
already = Lists_IsInviteEntry( mask, Channel );
if( ! Lists_AddInvited( mask, Channel, false )) return CONNECTED;
if(( Client_Type( Prefix ) == CLIENT_SERVER ) && ( already == true)) return CONNECTED;
return Send_ListChange( "+I", Prefix, Client, Channel, mask );
} /* Add_Invite */
static bool
LOCAL bool
Add_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
{
char *mask;
@@ -670,19 +661,17 @@ Add_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
mask = Lists_MakeMask( Pattern );
already = Lists_CheckDupeMask(Channel_GetListBans(Channel), mask );
if (!already) {
if( ! Channel_AddBan(Channel, mask))
return CONNECTED;
}
if ( already && ( Client_Type( Prefix ) == CLIENT_SERVER ))
return CONNECTED;
already = Lists_IsBanEntry( mask, Channel );
if( ! Lists_AddBanned( mask, Channel )) return CONNECTED;
if(( Client_Type( Prefix ) == CLIENT_SERVER ) && ( already == true)) return CONNECTED;
return Send_ListChange( "+b", Prefix, Client, Channel, mask );
} /* Add_Ban */
static bool
LOCAL bool
Del_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
{
char *mask;
@@ -692,12 +681,12 @@ Del_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
assert( Pattern != NULL );
mask = Lists_MakeMask( Pattern );
Lists_Del(Channel_GetListInvites(Channel), mask);
Lists_DelInvited( mask, Channel );
return Send_ListChange( "-I", Prefix, Client, Channel, mask );
} /* Del_Invite */
static bool
LOCAL bool
Del_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
{
char *mask;
@@ -707,12 +696,12 @@ Del_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
assert( Pattern != NULL );
mask = Lists_MakeMask( Pattern );
Lists_Del(Channel_GetListBans(Channel), mask);
Lists_DelBanned( mask, Channel );
return Send_ListChange( "-b", Prefix, Client, Channel, mask );
} /* Del_Ban */
static bool
LOCAL bool
Send_ListChange( char *Mode, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Mask )
{
/* Bestaetigung an Client schicken & andere Server sowie Channel-User informieren */

View File

@@ -14,7 +14,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: irc-op.c,v 1.17 2006/12/07 17:57:20 fw Exp $";
static char UNUSED id[] = "$Id: irc-op.c,v 1.15 2005/04/27 07:39:18 alex Exp $";
#include "imp.h"
#include <assert.h>
@@ -99,17 +99,17 @@ IRC_INVITE( CLIENT *Client, REQUEST *Req )
if( Channel_IsMemberOf( chan, target )) return IRC_WriteStrClient( from, ERR_USERONCHANNEL_MSG, Client_ID( from ), Req->argv[0], Req->argv[1] );
/* If the target user is banned on that channel: remember invite */
if( Lists_Check(Channel_GetListBans(chan), target )) remember = true;
if( Lists_CheckBanned( target, chan )) remember = true;
if (remember) {
/* We must remember this invite */
if( ! Channel_AddInvite(chan, Client_Mask( target ), true))
return CONNECTED;
if( remember )
{
/* We must memember this invite */
if( ! Lists_AddInvited( Client_Mask( target ), chan, true)) return CONNECTED;
}
}
LogDebug("User \"%s\" invites \"%s\" to \"%s\" ...", Client_Mask(from), Req->argv[0], Req->argv[1]);
Log( LOG_DEBUG, "User \"%s\" invites \"%s\" to \"%s\" ...", Client_Mask( from ), Req->argv[0], Req->argv[1] );
/* Inform target client */
IRC_WriteStrClientPrefix( target, from, "INVITE %s %s", Req->argv[0], Req->argv[1] );

View File

@@ -14,7 +14,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: irc-oper.c,v 1.29 2007/08/02 10:14:26 fw Exp $";
static char UNUSED id[] = "$Id: irc-oper.c,v 1.22 2005/06/12 18:02:09 fw Exp $";
#include "imp.h"
#include <assert.h>
@@ -23,7 +23,7 @@ static char UNUSED id[] = "$Id: irc-oper.c,v 1.29 2007/08/02 10:14:26 fw Exp $";
#include "ngircd.h"
#include "resolve.h"
#include "conn-func.h"
#include "conn.h"
#include "conf.h"
#include "client.h"
#include "channel.h"
@@ -37,7 +37,7 @@ static char UNUSED id[] = "$Id: irc-oper.c,v 1.29 2007/08/02 10:14:26 fw Exp $";
#include "irc-oper.h"
static bool
LOCAL bool
Bad_OperPass(CLIENT *Client, char *errtoken, char *errmsg)
{
Log( LOG_WARNING, "Got invalid OPER from \"%s\": \"%s\" -- %s", Client_Mask( Client ),
@@ -50,7 +50,7 @@ Bad_OperPass(CLIENT *Client, char *errtoken, char *errmsg)
GLOBAL bool
IRC_OPER( CLIENT *Client, REQUEST *Req )
{
unsigned int i;
int i;
assert( Client != NULL );
assert( Req != NULL );
@@ -90,46 +90,21 @@ IRC_OPER( CLIENT *Client, REQUEST *Req )
GLOBAL bool
IRC_DIE(CLIENT * Client, REQUEST * Req)
IRC_DIE( CLIENT *Client, REQUEST *Req )
{
/* Shut down server */
CONN_ID c;
CLIENT *cl;
assert(Client != NULL);
assert(Req != NULL);
assert( Client != NULL );
assert( Req != NULL );
/* Not a local IRC operator? */
if ((!Client_HasMode(Client, 'o')) || (!Client_OperByMe(Client)))
return IRC_WriteStrClient(Client, ERR_NOPRIVILEGES_MSG,
Client_ID(Client));
if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
/* Bad number of parameters? */
#ifdef STRICT_RFC
if (Req->argc != 0)
#else
if (Req->argc > 1)
#endif
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
Client_ID(Client), Req->command);
if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Is a message given? */
if (Req->argc > 0) {
c = Conn_First();
while (c != NONE) {
cl = Conn_GetClient(c);
if (Client_Type(cl) == CLIENT_USER)
IRC_WriteStrClient(cl, "NOTICE %s :%s",
Client_ID(cl), Req->argv[0]);
c = Conn_Next(c);
}
}
Log(LOG_NOTICE | LOG_snotice, "Got DIE command from \"%s\" ...",
Client_Mask(Client));
Log( LOG_NOTICE|LOG_snotice, "Got DIE command from \"%s\" ...", Client_Mask( Client ));
NGIRCd_SignalQuit = true;
return CONNECTED;
} /* IRC_DIE */
@@ -175,60 +150,35 @@ IRC_RESTART( CLIENT *Client, REQUEST *Req )
} /* IRC_RESTART */
/**
* Connect configured or new server.
*/
GLOBAL bool
IRC_CONNECT(CLIENT * Client, REQUEST * Req)
IRC_CONNECT(CLIENT *Client, REQUEST *Req )
{
/* Connect configured or new server */
assert(Client != NULL);
assert(Req != NULL);
assert( Client != NULL );
assert( Req != NULL );
/* Not a local IRC operator? */
if ((!Client_HasMode(Client, 'o')) || (!Client_OperByMe(Client)))
return IRC_WriteStrClient(Client, ERR_NOPRIVILEGES_MSG,
Client_ID(Client));
if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
/* Bad number of parameters? */
if ((Req->argc != 1) && (Req->argc != 2) && (Req->argc != 5))
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
Client_ID(Client), Req->command);
if(( Req->argc != 2 ) && ( Req->argc != 5 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Invalid port number? */
if ((Req->argc > 1) && atoi(Req->argv[1]) < 1)
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
Client_ID(Client), Req->command);
if( atoi( Req->argv[1] ) < 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
Log(LOG_NOTICE | LOG_snotice,
"Got CONNECT command from \"%s\" for \"%s\".", Client_Mask(Client),
Req->argv[0]);
Log( LOG_NOTICE|LOG_snotice, "Got CONNECT command from \"%s\" for \"%s\".", Client_Mask( Client ), Req->argv[0]);
switch (Req->argc) {
case 1:
if (!Conf_EnablePassiveServer(Req->argv[0]))
return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
Client_ID(Client),
Req->argv[0]);
break;
case 2:
if( Req->argc == 2 )
{
/* Connect configured server */
if (!Conf_EnableServer
(Req->argv[0], (UINT16) atoi(Req->argv[1])))
return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
Client_ID(Client),
Req->argv[0]);
break;
default:
/* Add server */
if (!Conf_AddServer
(Req->argv[0], (UINT16) atoi(Req->argv[1]), Req->argv[2],
Req->argv[3], Req->argv[4]))
return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
Client_ID(Client),
Req->argv[0]);
if( ! Conf_EnableServer( Req->argv[0], atoi( Req->argv[1] ))) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] );
}
else
{
/* Add server */
if( ! Conf_AddServer( Req->argv[0], atoi( Req->argv[1] ), Req->argv[2], Req->argv[3], Req->argv[4] )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] );
}
return CONNECTED;
} /* IRC_CONNECT */
@@ -258,59 +208,9 @@ IRC_DISCONNECT(CLIENT *Client, REQUEST *Req )
if( ! Conf_DisableServer( Req->argv[0] )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] );
/* Are we still connected or were we killed, too? */
if( Conn_GetClient( my_conn )) return CONNECTED;
if( Client_GetFromConn( my_conn )) return CONNECTED;
else return DISCONNECTED;
} /* IRC_CONNECT */
GLOBAL bool
IRC_WALLOPS( CLIENT *Client, REQUEST *Req )
{
CLIENT *to, *from;
int client_type;
assert( Client != NULL );
assert( Req != NULL );
if (Req->argc != 1)
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command);
client_type = Client_Type(Client);
switch (client_type) {
case CLIENT_USER:
if (!Client_OperByMe(Client))
return IRC_WriteStrClient(Client, ERR_NOPRIVILEGES_MSG, Client_ID(Client));
from = Client;
break;
case CLIENT_SERVER:
from = Client_Search(Req->prefix);
break;
default:
return CONNECTED;
}
if (!from)
return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, Client_ID(Client), Req->prefix);
for (to=Client_First(); to != NULL; to=Client_Next(to)) {
if (Client_Conn(to) < 0) /* no local connection or WALLOPS origin */
continue;
client_type = Client_Type(to);
switch (client_type) {
case CLIENT_USER:
if (Client_HasMode(to, 'w'))
IRC_WriteStrClientPrefix(to, from, "WALLOPS :%s", Req->argv[0]);
break;
case CLIENT_SERVER:
if (to != Client)
IRC_WriteStrClientPrefix(to, from, "WALLOPS :%s", Req->argv[0]);
break;
}
}
return CONNECTED;
}
/* -eof- */

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: irc-oper.h,v 1.12 2007/08/02 10:14:26 fw Exp $
* $Id: irc-oper.h,v 1.11 2005/03/19 18:43:48 fw Exp $
*
* IRC operator commands (header)
*/
@@ -24,7 +24,6 @@ GLOBAL bool IRC_REHASH PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_RESTART PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_CONNECT PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_DISCONNECT PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_WALLOPS PARAMS(( CLIENT *Client, REQUEST *Req ));
#endif

View File

@@ -1,6 +1,6 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001-2007 Alexander Barton (alex@barton.de)
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -14,7 +14,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: irc-server.c,v 1.46 2007/11/21 12:16:36 alex Exp $";
static char UNUSED id[] = "$Id: irc-server.c,v 1.38 2005/03/19 18:43:49 fw Exp $";
#include "imp.h"
#include <assert.h>
@@ -35,40 +35,33 @@ static char UNUSED id[] = "$Id: irc-server.c,v 1.46 2007/11/21 12:16:36 alex Exp
#include "log.h"
#include "messages.h"
#include "parse.h"
#include "numeric.h"
#include "ngircd.h"
#include "irc-info.h"
#include "exp.h"
#include "irc-server.h"
/**
* Handler for the IRC command "SERVER".
* See RFC 2813 section 4.1.2.
*/
GLOBAL bool
IRC_SERVER( CLIENT *Client, REQUEST *Req )
{
char str[LINE_LEN], *ptr;
CLIENT *from, *c;
char str[LINE_LEN], *ptr, *modes, *topic;
CLIENT *from, *c, *cl;
CL2CHAN *cl2chan;
int max_hops, i;
CHANNEL *chan;
bool ok;
int i;
CONN_ID con;
assert( Client != NULL );
assert( Req != NULL );
/* Return an error if this is not a local client */
if (Client_Conn(Client) <= NONE)
return IRC_WriteStrClient(Client, ERR_UNKNOWNCOMMAND_MSG,
Client_ID(Client), Req->command);
/* Fehler liefern, wenn kein lokaler Client */
if( Client_Conn( Client ) <= NONE ) return IRC_WriteStrClient( Client, ERR_UNKNOWNCOMMAND_MSG, Client_ID( Client ), Req->command );
if (Client_Type(Client) == CLIENT_GOTPASS) {
/* We got a PASS command from the peer, and now a SERVER
* command: the peer tries to register itself as a server. */
LogDebug("Connection %d: got SERVER command (new server link) ...",
Client_Conn(Client));
if( Client_Type( Client ) == CLIENT_GOTPASSSERVER )
{
/* Verbindung soll als Server-Server-Verbindung registriert werden */
Log( LOG_DEBUG, "Connection %d: got SERVER command (new server link) ...", Client_Conn( Client ));
/* Falsche Anzahl Parameter? */
if(( Req->argc != 2 ) && ( Req->argc != 3 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
@@ -122,10 +115,10 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
Client_SetToken( Client, atoi( Req->argv[1] ));
}
/* Mark this connection as belonging to an configured server */
Conf_SetServer(i, con);
Client_SetType(Client, CLIENT_UNKNOWNSERVER);
Log( LOG_NOTICE|LOG_snotice, "Server \"%s\" registered (connection %d, 1 hop - direct link).", Client_ID( Client ), con );
Client_SetType( Client, CLIENT_SERVER );
Conf_SetServer( i, con );
#ifdef ZLIB
/* Kompression initialisieren, wenn erforderlich */
@@ -140,23 +133,134 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
}
#endif
#ifdef IRCPLUS
if (strchr(Client_Flags(Client), 'H')) {
LogDebug("Peer supports IRC+ extended server handshake ...");
if (!IRC_Send_ISUPPORT(Client))
return DISCONNECTED;
return IRC_WriteStrClient(Client, RPL_ENDOFMOTD_MSG,
Client_ID(Client));
} else {
#endif
if (Conf_MaxNickLength != CLIENT_NICK_LEN_DEFAULT)
Log(LOG_CRIT,
"Attention: this server uses a non-standard nick length, but the peer doesn't support the IRC+ extended server handshake!");
#ifdef IRCPLUS
/* maximalen Hop Count ermitteln */
max_hops = 0;
c = Client_First( );
while( c )
{
if( Client_Hops( c ) > max_hops ) max_hops = Client_Hops( c );
c = Client_Next( c );
}
/* Alle bisherigen Server dem neuen Server bekannt machen,
* die bisherigen Server ueber den neuen informierenn */
for( i = 0; i < ( max_hops + 1 ); i++ )
{
c = Client_First( );
while( c )
{
if(( Client_Type( c ) == CLIENT_SERVER ) && ( c != Client ) && ( c != Client_ThisServer( )) && ( Client_Hops( c ) == i ))
{
if( Client_Conn( c ) > NONE )
{
/* Dem gefundenen Server gleich den neuen
* Server bekannt machen */
if( ! IRC_WriteStrClient( c, "SERVER %s %d %d :%s", Client_ID( Client ), Client_Hops( Client ) + 1, Client_MyToken( Client ), Client_Info( Client ))) return DISCONNECTED;
}
/* Den neuen Server ueber den alten informieren */
if( ! IRC_WriteStrClientPrefix( Client, Client_Hops( c ) == 1 ? Client_ThisServer( ) : Client_Introducer( c ), "SERVER %s %d %d :%s", Client_ID( c ), Client_Hops( c ) + 1, Client_MyToken( c ), Client_Info( c ))) return DISCONNECTED;
}
c = Client_Next( c );
}
}
/* alle User dem neuen Server bekannt machen */
c = Client_First( );
while( c )
{
if( Client_Type( c ) == CLIENT_USER )
{
/* User an neuen Server melden */
if( ! IRC_WriteStrClient( Client, "NICK %s %d %s %s %d +%s :%s", Client_ID( c ), Client_Hops( c ) + 1, Client_User( c ), Client_Hostname( c ), Client_MyToken( Client_Introducer( c )), Client_Modes( c ), Client_Info( c ))) return DISCONNECTED;
}
c = Client_Next( c );
}
/* Channels dem neuen Server bekannt machen */
chan = Channel_First( );
while( chan )
{
#ifdef IRCPLUS
/* Send CHANINFO if the peer supports it */
if( strchr( Client_Flags( Client ), 'C' ))
{
#ifdef DEBUG
Log( LOG_DEBUG, "Sending CHANINFO commands ..." );
#endif
modes = Channel_Modes( chan );
topic = Channel_Topic( chan );
if( *modes || *topic )
{
/* send CHANINFO */
if(( ! strchr( Channel_Modes( chan ), 'k' )) && ( ! strchr( Channel_Modes( chan ), 'l' )) && ( ! *topic ))
{
/* "CHANINFO <chan> +<modes>" */
if( ! IRC_WriteStrClient( Client, "CHANINFO %s +%s", Channel_Name( chan ), modes )) return DISCONNECTED;
}
else if(( ! strchr( Channel_Modes( chan ), 'k' )) && ( ! strchr( Channel_Modes( chan ), 'l' )))
{
/* "CHANINFO <chan> +<modes> :<topic>" */
if( ! IRC_WriteStrClient( Client, "CHANINFO %s +%s :%s", Channel_Name( chan ), modes, topic )) return DISCONNECTED;
}
else
{
/* "CHANINFO <chan> +<modes> <key> <limit> :<topic>" */
if( ! IRC_WriteStrClient( Client, "CHANINFO %s +%s %s %ld :%s", Channel_Name( chan ), modes, strchr( Channel_Modes( chan ), 'k' ) ? Channel_Key( chan ) : "*", strchr( Channel_Modes( chan ), 'l' ) ? Channel_MaxUsers( chan ) : 0L, topic )) return DISCONNECTED;
}
}
}
#endif
return IRC_Num_ENDOFMOTD(Client, Req);
/* alle Member suchen */
cl2chan = Channel_FirstMember( chan );
snprintf( str, sizeof( str ), "NJOIN %s :", Channel_Name( chan ));
while( cl2chan )
{
cl = Channel_GetClient( cl2chan );
assert( cl != NULL );
/* Nick, ggf. mit Modes, anhaengen */
if( str[strlen( str ) - 1] != ':' ) strlcat( str, ",", sizeof( str ));
if( strchr( Channel_UserModes( chan, cl ), 'v' )) strlcat( str, "+", sizeof( str ));
if( strchr( Channel_UserModes( chan, cl ), 'o' )) strlcat( str, "@", sizeof( str ));
strlcat( str, Client_ID( cl ), sizeof( str ));
if( strlen( str ) > ( LINE_LEN - CLIENT_NICK_LEN - 8 ))
{
/* Zeile senden */
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
snprintf( str, sizeof( str ), "NJOIN %s :", Channel_Name( chan ));
}
cl2chan = Channel_NextMember( chan, cl2chan );
}
/* noch Daten da? */
if( str[strlen( str ) - 1] != ':')
{
/* Ja; Also senden ... */
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
}
#ifdef IRCPLUS
if( strchr( Client_Flags( Client ), 'L' ))
{
#ifdef DEBUG
Log( LOG_DEBUG, "Synchronizing INVITE- and BAN-lists ..." );
#endif
/* Synchronize INVITE- and BAN-lists */
if( ! Lists_SendInvites( Client )) return DISCONNECTED;
if( ! Lists_SendBans( Client )) return DISCONNECTED;
}
#endif
/* naechsten Channel suchen */
chan = Channel_Next( chan );
}
return CONNECTED;
}
else if( Client_Type( Client ) == CLIENT_SERVER )
{
@@ -200,9 +304,8 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
IRC_WriteStrServersPrefix( Client, from, "SERVER %s %d %d :%s", Client_ID( c ), Client_Hops( c ) + 1, Client_MyToken( c ), Client_Info( c ));
return CONNECTED;
} else
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
Client_ID(Client), Req->command);
}
else return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
} /* IRC_SERVER */

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: irc-server.h,v 1.6 2007/11/21 12:16:36 alex Exp $
* $Id: irc-server.h,v 1.5 2005/03/19 18:43:49 fw Exp $
*
* IRC commands for server links (header)
*/
@@ -22,8 +22,6 @@ GLOBAL bool IRC_SERVER PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_NJOIN PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_SQUIT PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_ENDOFMOTD_Server PARAMS((CLIENT *Client));
#endif

View File

@@ -14,7 +14,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: irc-write.c,v 1.21 2006/08/12 11:56:24 fw Exp $";
static char UNUSED id[] = "$Id: irc-write.c,v 1.18 2005/04/27 07:39:18 alex Exp $";
#include "imp.h"
#include <assert.h>
@@ -39,7 +39,7 @@ static char UNUSED id[] = "$Id: irc-write.c,v 1.21 2006/08/12 11:56:24 fw Exp $"
#define SEND_TO_SERVER 2
static char *Get_Prefix PARAMS(( CLIENT *Target, CLIENT *Client ));
LOCAL char *Get_Prefix PARAMS(( CLIENT *Target, CLIENT *Client ));
#ifdef PROTOTYPES
@@ -378,7 +378,7 @@ va_dcl
}
cl2chan = Channel_NextMember( chan, cl2chan );
}
/* naechsten Channel */
chan_cl2chan = Channel_NextChannelOf( Client, chan_cl2chan );
}
@@ -400,22 +400,21 @@ va_dcl
GLOBAL void
IRC_SetPenalty( CLIENT *Client, time_t Seconds )
IRC_SetPenalty( CLIENT *Client, int Seconds )
{
CONN_ID c;
assert( Client != NULL );
assert( Seconds > 0 );
if( Client_Type( Client ) == CLIENT_SERVER ) return;
c = Client_Conn( Client );
if (c > NONE)
Conn_SetPenalty(c, Seconds);
if( c > NONE ) Conn_SetPenalty( c, Seconds );
} /* IRC_SetPenalty */
static char *
LOCAL char *
Get_Prefix( CLIENT *Target, CLIENT *Client )
{
assert( Target != NULL );

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: irc-write.h,v 1.8 2006/05/10 21:24:01 alex Exp $
* $Id: irc-write.h,v 1.7 2005/03/19 18:43:49 fw Exp $
*
* Sending IRC commands over the network (header)
*/
@@ -30,7 +30,7 @@ GLOBAL void IRC_WriteStrServersPrefixFlag PARAMS(( CLIENT *ExceptOf, CLIENT *Pre
GLOBAL bool IRC_WriteStrRelatedPrefix PARAMS(( CLIENT *Client, CLIENT *Prefix, bool Remote, char *Format, ... ));
GLOBAL void IRC_SetPenalty PARAMS(( CLIENT *Client, time_t Seconds ));
GLOBAL void IRC_SetPenalty PARAMS(( CLIENT *Client, int Seconds ));
#endif

View File

@@ -14,7 +14,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: irc.c,v 1.131 2006/07/23 14:55:40 alex Exp $";
static char UNUSED id[] = "$Id: irc.c,v 1.126.2.1 2005/08/02 23:08:27 alex Exp $";
#include "imp.h"
#include <assert.h>
@@ -22,9 +22,10 @@ static char UNUSED id[] = "$Id: irc.c,v 1.131 2006/07/23 14:55:40 alex Exp $";
#include <string.h>
#include "ngircd.h"
#include "conn.h"
#include "resolve.h"
#include "conn-func.h"
#include "conf.h"
#include "conn-func.h"
#include "client.h"
#include "channel.h"
#include "defines.h"
@@ -37,7 +38,7 @@ static char UNUSED id[] = "$Id: irc.c,v 1.131 2006/07/23 14:55:40 alex Exp $";
#include "irc.h"
static char *Option_String PARAMS(( CONN_ID Idx ));
LOCAL char *Option_String PARAMS(( CONN_ID Idx ));
GLOBAL bool
@@ -159,7 +160,7 @@ IRC_KILL( CLIENT *Client, REQUEST *Req )
Log( LOG_NOTICE, "Client with nick \"%s\" is unknown here.", Req->argv[0] );
/* Are we still connected or were we killed, too? */
if(( my_conn > NONE ) && ( Conn_GetClient( my_conn )))
if(( my_conn > NONE ) && ( Client_GetFromConn( my_conn )))
return CONNECTED;
else
return DISCONNECTED;
@@ -324,19 +325,17 @@ IRC_HELP( CLIENT *Client, REQUEST *Req )
} /* IRC_HELP */
static char *
LOCAL char *
Option_String( CONN_ID Idx )
{
static char option_txt[8];
UINT16 options;
int options;
options = Conn_Options(Idx);
options = Conn_Options( Idx );
strcpy(option_txt, "F"); /* No idea what this means, but the
* original ircd sends it ... */
strcpy( option_txt, "F" ); /* No idea what this means but the original ircd sends it ... */
#ifdef ZLIB
if(options & CONN_ZIP) /* zlib compression supported. */
strcat(option_txt, "z");
if( options & CONN_ZIP ) strcat( option_txt, "z" );
#endif
return option_txt;

View File

@@ -14,7 +14,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: lists.c,v 1.21 2007/01/29 21:13:26 fw Exp $";
static char UNUSED id[] = "$Id: lists.c,v 1.17 2005/03/19 18:43:49 fw Exp $";
#include "imp.h"
#include <assert.h>
@@ -35,131 +35,326 @@ static char UNUSED id[] = "$Id: lists.c,v 1.21 2007/01/29 21:13:26 fw Exp $";
#include "exp.h"
#include "lists.h"
#define MASK_LEN (2*CLIENT_HOST_LEN)
struct list_elem {
struct list_elem *next;
#define MASK_LEN 2*CLIENT_HOST_LEN
typedef struct _C2C
{
struct _C2C *next;
char mask[MASK_LEN];
CHANNEL *channel;
bool onlyonce;
};
} C2C;
GLOBAL const char *
Lists_GetMask(const struct list_elem *e)
{
return e->mask;
}
LOCAL C2C *My_Invites, *My_Bans;
GLOBAL struct list_elem*
Lists_GetFirst(const struct list_head *h)
{
return h->first;
}
LOCAL C2C *New_C2C PARAMS(( char *Mask, CHANNEL *Chan, bool OnlyOnce ));
LOCAL bool Check_List PARAMS(( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan ));
LOCAL bool Already_Registered PARAMS(( C2C *Cl2Chan, char *Mask, CHANNEL *Chan ));
GLOBAL struct list_elem*
Lists_GetNext(const struct list_elem *e)
{
return e->next;
}
bool
Lists_Add(struct list_head *header, const char *Mask, bool OnlyOnce )
{
struct list_elem *e, *newelem;
assert( header != NULL );
assert( Mask != NULL );
if (Lists_CheckDupeMask(header, Mask )) return true;
e = Lists_GetFirst(header);
newelem = malloc(sizeof(struct list_elem));
if( ! newelem ) {
Log( LOG_EMERG, "Can't allocate memory for new Ban/Invite entry!" );
return false;
}
strlcpy( newelem->mask, Mask, sizeof( newelem->mask ));
newelem->onlyonce = OnlyOnce;
newelem->next = e;
header->first = newelem;
LogDebug("Added \"%s\" to invite list", Mask);
return true;
}
static void
Lists_Unlink(struct list_head *header, struct list_elem *p, struct list_elem *victim)
{
assert(victim != NULL);
assert(header != NULL);
if (p) p->next = victim->next;
else header->first = victim->next;
free(victim);
}
GLOBAL void
Lists_Del(struct list_head *header, const char *Mask)
Lists_Init( void )
{
struct list_elem *e, *last, *victim;
/* Modul initialisieren */
assert( header != NULL );
assert( Mask != NULL );
last = NULL;
e = Lists_GetFirst(header);
while( e ) {
if(strcasecmp( e->mask, Mask ) == 0 ) {
LogDebug("Deleted \"%s\" from list", e->mask);
victim = e;
e = victim->next;
Lists_Unlink(header, last, victim);
continue;
}
last = e;
e = e->next;
}
}
My_Invites = My_Bans = NULL;
} /* Lists_Init */
GLOBAL void
Lists_Free(struct list_head *head)
Lists_Exit( void )
{
struct list_elem *e, *victim;
/* Modul abmelden */
assert(head != NULL);
C2C *c2c, *next;
e = head->first;
head->first = NULL;
while (e) {
LogDebug("Deleted \"%s\" from invite list" , e->mask);
victim = e;
e = e->next;
free( victim );
/* Invite-Lists freigeben */
c2c = My_Invites;
while( c2c )
{
next = c2c->next;
free( c2c );
c2c = next;
}
}
/* Ban-Lists freigeben */
c2c = My_Bans;
while( c2c )
{
next = c2c->next;
free( c2c );
c2c = next;
}
} /* Lists_Exit */
GLOBAL bool
Lists_CheckDupeMask(const struct list_head *h, const char *Mask )
Lists_CheckInvited( CLIENT *Client, CHANNEL *Chan )
{
struct list_elem *e;
e = h->first;
while (e) {
if (strcasecmp( e->mask, Mask ) == 0 )
return true;
e = e->next;
return Check_List( &My_Invites, Client, Chan );
} /* Lists_CheckInvited */
GLOBAL bool
Lists_IsInviteEntry( char *Mask, CHANNEL *Chan )
{
assert( Mask != NULL );
assert( Chan != NULL );
return Already_Registered( My_Invites, Mask, Chan );
} /* Lists_IsInviteEntry */
GLOBAL bool
Lists_AddInvited( char *Mask, CHANNEL *Chan, bool OnlyOnce )
{
C2C *c2c;
assert( Mask != NULL );
assert( Chan != NULL );
if( Already_Registered( My_Invites, Mask, Chan )) return true;
c2c = New_C2C( Mask, Chan, OnlyOnce );
if( ! c2c )
{
Log( LOG_ERR, "Can't add new invite list entry!" );
return false;
}
return false;
}
/* verketten */
c2c->next = My_Invites;
My_Invites = c2c;
Log( LOG_DEBUG, "Added \"%s\" to invite list for \"%s\".", Mask, Channel_Name( Chan ));
return true;
} /* Lists_AddInvited */
GLOBAL void
Lists_DelInvited( char *Mask, CHANNEL *Chan )
{
C2C *c2c, *last, *next;
assert( Mask != NULL );
assert( Chan != NULL );
last = NULL;
c2c = My_Invites;
while( c2c )
{
next = c2c->next;
if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 ))
{
/* dieser Eintrag muss geloescht werden */
Log( LOG_DEBUG, "Deleted \"%s\" from invite list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
if( last ) last->next = next;
else My_Invites = next;
free( c2c );
}
else last = c2c;
c2c = next;
}
} /* Lists_DelInvited */
GLOBAL bool
Lists_ShowInvites( CLIENT *Client, CHANNEL *Channel )
{
C2C *c2c;
assert( Client != NULL );
assert( Channel != NULL );
c2c = My_Invites;
while( c2c )
{
if( c2c->channel == Channel )
{
/* Eintrag fuer Channel gefunden; ausgeben: */
if( ! IRC_WriteStrClient( Client, RPL_INVITELIST_MSG, Client_ID( Client ), Channel_Name( Channel ), c2c->mask )) return DISCONNECTED;
}
c2c = c2c->next;
}
return IRC_WriteStrClient( Client, RPL_ENDOFINVITELIST_MSG, Client_ID( Client ), Channel_Name( Channel ));
} /* Lists_ShowInvites */
GLOBAL bool
Lists_SendInvites( CLIENT *Client )
{
C2C *c2c;
assert( Client != NULL );
c2c = My_Invites;
while( c2c )
{
if( ! IRC_WriteStrClient( Client, "MODE %s +I %s", Channel_Name( c2c->channel ), c2c->mask )) return DISCONNECTED;
c2c = c2c->next;
}
return CONNECTED;
} /* Lists_SendInvites */
GLOBAL bool
Lists_SendBans( CLIENT *Client )
{
C2C *c2c;
assert( Client != NULL );
c2c = My_Bans;
while( c2c )
{
if( ! IRC_WriteStrClient( Client, "MODE %s +b %s", Channel_Name( c2c->channel ), c2c->mask )) return DISCONNECTED;
c2c = c2c->next;
}
return CONNECTED;
} /* Lists_SendBans */
GLOBAL bool
Lists_CheckBanned( CLIENT *Client, CHANNEL *Chan )
{
return Check_List( &My_Bans, Client, Chan );
} /* Lists_CheckBanned */
GLOBAL bool
Lists_IsBanEntry( char *Mask, CHANNEL *Chan )
{
assert( Mask != NULL );
assert( Chan != NULL );
return Already_Registered( My_Bans, Mask, Chan );
} /* Lists_IsBanEntry */
GLOBAL bool
Lists_AddBanned( char *Mask, CHANNEL *Chan )
{
C2C *c2c;
assert( Mask != NULL );
assert( Chan != NULL );
if( Already_Registered( My_Bans, Mask, Chan )) return true;
c2c = New_C2C( Mask, Chan, false );
if( ! c2c )
{
Log( LOG_ERR, "Can't add new ban list entry!" );
return false;
}
/* verketten */
c2c->next = My_Bans;
My_Bans = c2c;
Log( LOG_DEBUG, "Added \"%s\" to ban list for \"%s\".", Mask, Channel_Name( Chan ));
return true;
} /* Lists_AddBanned */
GLOBAL void
Lists_DelBanned( char *Mask, CHANNEL *Chan )
{
C2C *c2c, *last, *next;
assert( Mask != NULL );
assert( Chan != NULL );
last = NULL;
c2c = My_Bans;
while( c2c )
{
next = c2c->next;
if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 ))
{
/* dieser Eintrag muss geloescht werden */
Log( LOG_DEBUG, "Deleted \"%s\" from ban list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
if( last ) last->next = next;
else My_Bans = next;
free( c2c );
}
else last = c2c;
c2c = next;
}
} /* Lists_DelBanned */
GLOBAL bool
Lists_ShowBans( CLIENT *Client, CHANNEL *Channel )
{
C2C *c2c;
assert( Client != NULL );
assert( Channel != NULL );
c2c = My_Bans;
while( c2c )
{
if( c2c->channel == Channel )
{
/* Eintrag fuer Channel gefunden; ausgeben: */
if( ! IRC_WriteStrClient( Client, RPL_BANLIST_MSG, Client_ID( Client ), Channel_Name( Channel ), c2c->mask )) return DISCONNECTED;
}
c2c = c2c->next;
}
return IRC_WriteStrClient( Client, RPL_ENDOFBANLIST_MSG, Client_ID( Client ), Channel_Name( Channel ));
} /* Lists_ShowBans */
GLOBAL void
Lists_DeleteChannel( CHANNEL *Chan )
{
/* Channel wurde geloescht, Invite- und Ban-Lists aufraeumen */
C2C *c2c, *last, *next;
/* Invite-List */
last = NULL;
c2c = My_Invites;
while( c2c )
{
next = c2c->next;
if( c2c->channel == Chan )
{
/* dieser Eintrag muss geloescht werden */
Log( LOG_DEBUG, "Deleted \"%s\" from invite list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
if( last ) last->next = next;
else My_Invites = next;
free( c2c );
}
else last = c2c;
c2c = next;
}
/* Ban-List */
last = NULL;
c2c = My_Bans;
while( c2c )
{
next = c2c->next;
if( c2c->channel == Chan )
{
/* dieser Eintrag muss geloescht werden */
Log( LOG_DEBUG, "Deleted \"%s\" from ban list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
if( last ) last->next = next;
else My_Bans = next;
free( c2c );
}
else last = c2c;
c2c = next;
}
} /* Lists_DeleteChannel */
GLOBAL char *
@@ -212,30 +407,82 @@ Lists_MakeMask( char *Pattern )
} /* Lists_MakeMask */
bool
Lists_Check( struct list_head *header, CLIENT *Client)
LOCAL C2C *
New_C2C( char *Mask, CHANNEL *Chan, bool OnlyOnce )
{
struct list_elem *e, *last;
C2C *c2c;
assert( Mask != NULL );
assert( Chan != NULL );
assert( header != NULL );
/* Speicher fuer Eintrag anfordern */
c2c = (C2C *)malloc( sizeof( C2C ));
if( ! c2c )
{
Log( LOG_EMERG, "Can't allocate memory! [New_C2C]" );
return NULL;
}
e = header->first;
strlcpy( c2c->mask, Mask, sizeof( c2c->mask ));
c2c->channel = Chan;
c2c->onlyonce = OnlyOnce;
return c2c;
} /* New_C2C */
LOCAL bool
Check_List( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan )
{
C2C *c2c, *last;
assert( Cl2Chan != NULL );
assert( Client != NULL );
assert( Chan != NULL );
c2c = *Cl2Chan;
last = NULL;
while( e ) {
if( Match( e->mask, Client_Mask( Client ))) {
if( e->onlyonce ) { /* delete entry */
LogDebug("Deleted \"%s\" from list", e->mask);
Lists_Unlink(header, last, e);
while( c2c )
{
if( c2c->channel == Chan )
{
/* Ok, richtiger Channel. Passt die Maske? */
if( Match( c2c->mask, Client_Mask( Client )))
{
/* Treffer! */
if( c2c->onlyonce )
{
/* Eintrag loeschen */
Log( LOG_DEBUG, "Deleted \"%s\" from %s list for \"%s\".", c2c->mask, *Cl2Chan == My_Invites ? "invite" : "ban", Channel_Name( Chan ));
if( last ) last->next = c2c->next;
else *Cl2Chan = c2c->next;
free( c2c );
}
return true;
}
return true;
}
last = e;
e = e->next;
last = c2c;
c2c = c2c->next;
}
return false;
}
} /* Check_List */
LOCAL bool
Already_Registered( C2C *List, char *Mask, CHANNEL *Chan )
{
C2C *c2c;
c2c = List;
while( c2c )
{
if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 )) return true;
c2c = c2c->next;
}
return false;
} /* Already_Registered */
/* -eof- */

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: lists.h,v 1.13 2006/12/07 17:57:20 fw Exp $
* $Id: lists.h,v 1.12 2005/03/19 18:43:49 fw Exp $
*
* Management of IRC lists: ban, invite, ... (header)
*/
@@ -16,31 +16,31 @@
#ifndef __lists_h__
#define __lists_h__
#include "portab.h"
#include "client.h"
struct list_elem;
struct list_head {
struct list_elem *first;
};
GLOBAL struct list_elem *Lists_GetFirst PARAMS((const struct list_head *));
GLOBAL struct list_elem *Lists_GetNext PARAMS((const struct list_elem *));
GLOBAL void Lists_Init PARAMS(( void ));
GLOBAL void Lists_Exit PARAMS(( void ));
GLOBAL bool Lists_Check PARAMS((struct list_head *head, CLIENT *client ));
GLOBAL bool Lists_CheckDupeMask PARAMS((const struct list_head *head, const char *mask ));
GLOBAL bool Lists_CheckInvited PARAMS(( CLIENT *Client, CHANNEL *Chan ));
GLOBAL bool Lists_AddInvited PARAMS(( char *Mask, CHANNEL *Chan, bool OnlyOnce ));
GLOBAL void Lists_DelInvited PARAMS(( char *Mask, CHANNEL *Chan ));
GLOBAL bool Lists_ShowInvites PARAMS(( CLIENT *Client, CHANNEL *Channel ));
GLOBAL bool Lists_SendInvites PARAMS(( CLIENT *Client ));
GLOBAL bool Lists_IsInviteEntry PARAMS(( char *Mask, CHANNEL *Chan ));
GLOBAL bool Lists_Add PARAMS((struct list_head *header, const char *Mask, bool OnlyOnce ));
GLOBAL void Lists_Del PARAMS((struct list_head *head, const char *Mask ));
GLOBAL bool Lists_CheckBanned PARAMS(( CLIENT *Client, CHANNEL *Chan ));
GLOBAL bool Lists_AddBanned PARAMS(( char *Mask, CHANNEL *Chan ));
GLOBAL void Lists_DelBanned PARAMS(( char *Mask, CHANNEL *Chan ));
GLOBAL bool Lists_ShowBans PARAMS(( CLIENT *Client, CHANNEL *Channel ));
GLOBAL bool Lists_SendBans PARAMS(( CLIENT *Client ));
GLOBAL bool Lists_IsBanEntry PARAMS(( char *Mask, CHANNEL *Chan ));
GLOBAL bool Lists_AlreadyRegistered PARAMS(( const struct list_head *head, const char *Mask));
GLOBAL void Lists_Free PARAMS(( struct list_head *head ));
GLOBAL void Lists_DeleteChannel PARAMS(( CHANNEL *Chan ));
GLOBAL char *Lists_MakeMask PARAMS(( char *Pattern ));
GLOBAL const char *Lists_GetMask PARAMS(( const struct list_elem *e ));
#endif
/* -eof- */

View File

@@ -14,7 +14,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: log.c,v 1.62 2006/08/05 09:16:21 fw Exp $";
static char UNUSED id[] = "$Id: log.c,v 1.57.2.2 2006/02/08 21:23:21 fw Exp $";
#include "imp.h"
#include <assert.h>
@@ -162,16 +162,6 @@ Log_Exit( void )
} /* Log_Exit */
/**
* Log function for debug messages.
* This function is only functional when the program is compiled with debug
* code enabled; otherwise it is an empty function which the compiler will
* hopefully mangle down to "nothing" (see log.h). Therefore you should use
* LogDebug(...) in favor to Log(LOG_DEBUG, ...).
* @param Format Format string like printf().
* @param ... Further arguments.
*/
#ifdef DEBUG
# ifdef PROTOTYPES
GLOBAL void
LogDebug( const char *Format, ... )
@@ -180,7 +170,8 @@ GLOBAL void
LogDebug( Format, va_alist )
const char *Format;
va_dcl
# endif /* PROTOTYPES */
# endif
#ifdef DEBUG
{
char msg[MAX_LOG_MSG_LEN];
va_list ap;
@@ -195,18 +186,11 @@ va_dcl
va_end( ap );
Log(LOG_DEBUG, "%s", msg);
}
#else
{ /* do nothing */ }
#endif /* DEBUG */
/**
* Logging function of ngIRCd.
* This function logs messages to the console and/or syslog, whichever is
* suitable for the mode ngIRCd is running in (daemon vs. non-daemon).
* Please note: you sould use LogDebug(...) for debug messages!
* @param Level syslog level (LOG_xxx)
* @param Format Format string like printf().
* @param ... Further arguments.
*/
#ifdef PROTOTYPES
GLOBAL void
Log( int Level, const char *Format, ... )

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: log.h,v 1.20 2006/08/05 09:16:21 fw Exp $
* $Id: log.h,v 1.18.2.1 2006/02/08 21:23:21 fw Exp $
*
* Logging functions (header)
*/
@@ -39,13 +39,7 @@ GLOBAL void Log_Init PARAMS(( bool Daemon_Mode ));
GLOBAL void Log_Exit PARAMS(( void ));
GLOBAL void Log PARAMS(( int Level, const char *Format, ... ));
#ifdef DEBUG
GLOBAL void LogDebug PARAMS(( const char *Format, ... ));
#else
static inline void LogDebug PARAMS(( UNUSED const char *Format, ... )){/* Do nothing. The compiler should optimize this out, please ;-) */}
#endif
GLOBAL void Log_Init_Resolver PARAMS(( void ));
GLOBAL void Log_Exit_Resolver PARAMS(( void ));

View File

@@ -14,7 +14,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: match.c,v 1.5 2006/10/06 21:23:47 fw Exp $";
static char UNUSED id[] = "$Id: match.c,v 1.3 2005/03/19 18:43:49 fw Exp $";
#include "imp.h"
#include <assert.h>
@@ -32,8 +32,8 @@ static char UNUSED id[] = "$Id: match.c,v 1.5 2006/10/06 21:23:47 fw Exp $";
*/
static int Matche PARAMS(( const char *p, const char *t ));
static int Matche_After_Star PARAMS(( const char *p, const char *t ));
LOCAL int Matche PARAMS(( char *p, char *t ));
LOCAL int Matche_After_Star PARAMS(( char *p, char *t ));
#define MATCH_PATTERN 6 /* bad pattern */
@@ -45,7 +45,7 @@ static int Matche_After_Star PARAMS(( const char *p, const char *t ));
GLOBAL bool
Match( const char *Pattern, const char *String )
Match( char *Pattern, char *String )
{
/* Pattern mit String vergleichen */
if( Matche( Pattern, String ) == MATCH_VALID ) return true;
@@ -53,8 +53,8 @@ Match( const char *Pattern, const char *String )
} /* Match */
static int
Matche( const char *p, const char *t )
LOCAL int
Matche( char *p, char *t )
{
register char range_start, range_end;
bool invert;
@@ -200,8 +200,8 @@ Matche( const char *p, const char *t )
} /* Matche */
static int
Matche_After_Star( const char *p, const char *t )
LOCAL int
Matche_After_Star( char *p, char *t )
{
register int nextp, match = 0;

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: match.h,v 1.4 2006/10/06 21:23:47 fw Exp $
* $Id: match.h,v 1.3 2005/03/19 18:43:49 fw Exp $
*
* Wildcard pattern matching (header)
*/
@@ -18,7 +18,7 @@
#define __match_h__
GLOBAL bool Match PARAMS(( const char *Pattern, const char *String ));
GLOBAL bool Match PARAMS(( char *Pattern, char *String ));
#endif

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: messages.h,v 1.74 2007/12/11 11:29:44 fw Exp $
* $Id: messages.h,v 1.66 2004/02/28 02:18:16 alex Exp $
*
* IRC numerics (Header)
*/
@@ -22,8 +22,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_ISUPPORT1_MSG "005 %s RFC2812 CASEMAPPING=ascii PREFIX=(ov)@+ CHANTYPES=# CHANMODES=bI,k,l,imnPst CHANLIMIT=#:%d :are supported on this server"
#define RPL_ISUPPORT2_MSG "005 %s CHANNELLEN=%d NICKLEN=%d TOPICLEN=%d AWAYLEN=%d KICKLEN=%d PENALTY :are supported on this server"
#define RPL_ISUPPORT_MSG "005 %s NICKLEN=%d TOPICLEN=%d AWAYLEN=%d MAXCHANNELS=%d :are supported on this server"
#define RPL_TRACELINK_MSG "200 %s Link %s-%s %s %s V%s %ld %d %d"
#define RPL_TRACEOPERATOR_MSG "204 %s Oper 2 :%s"
@@ -32,19 +31,18 @@
#define RPL_STATSCOMMANDS_MSG "212 %s %s %ld %ld %ld"
#define RPL_ENDOFSTATS_MSG "219 %s %c :End of STATS report"
#define RPL_UMODEIS_MSG "221 %s +%s"
#define RPL_STATSUPTIME "242 %s :Server Up %u days %u:%02u:%02u"
#define RPL_LUSERCLIENT_MSG "251 %s :There are %ld users and %ld services on %ld servers"
#define RPL_LUSEROP_MSG "252 %s %lu :operator(s) online"
#define RPL_LUSERUNKNOWN_MSG "253 %s %lu :unknown connection(s)"
#define RPL_LUSERCHANNELS_MSG "254 %s %lu :channels formed"
#define RPL_LUSERME_MSG "255 %s :I have %lu users, %lu services and %lu servers"
#define RPL_LUSEROP_MSG "252 %s %ld :operator(s) online"
#define RPL_LUSERUNKNOWN_MSG "253 %s %ld :unknown connection(s)"
#define RPL_LUSERCHANNELS_MSG "254 %s %ld :channels formed"
#define RPL_LUSERME_MSG "255 %s :I have %ld users, %ld services and %ld servers"
#define RPL_ADMINME_MSG "256 %s %s :Administrative info"
#define RPL_ADMINLOC1_MSG "257 %s :%s"
#define RPL_ADMINLOC2_MSG "258 %s :%s"
#define RPL_ADMINEMAIL_MSG "259 %s :%s"
#define RPL_TRACEEND_MSG "262 %s %s %s-%s.%s :End of TRACE"
#define RPL_LOCALUSERS_MSG "265 %s %lu %lu :Current local users: %lu, Max: %lu"
#define RPL_NETUSERS_MSG "266 %s %lu %lu :Current global users: %lu, Max: %lu"
#define RPL_LOCALUSERS_MSG "265 %s :Current local users: %ld, Max: %ld"
#define RPL_NETUSERS_MSG "266 %s :Current global users: %ld, Max: %ld"
#define RPL_AWAY_MSG "301 %s %s :%s"
#define RPL_USERHOST_MSG "302 %s :"
@@ -56,7 +54,7 @@
#define RPL_WHOISOPERATOR_MSG "313 %s %s :is an IRC operator"
#define RPL_WHOWASUSER_MSG "314 %s %s %s %s * :%s"
#define RPL_ENDOFWHO_MSG "315 %s %s :End of WHO list"
#define RPL_WHOISIDLE_MSG "317 %s %s %lu %lu :seconds idle, signon time"
#define RPL_WHOISIDLE_MSG "317 %s %s %ld :seconds idle"
#define RPL_ENDOFWHOIS_MSG "318 %s %s :End of WHOIS list"
#define RPL_WHOISCHANNELS_MSG "319 %s %s :"
#define RPL_LIST_MSG "322 %s %s %ld :%s"
@@ -64,7 +62,6 @@
#define RPL_CHANNELMODEIS_MSG "324 %s %s +%s"
#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"
#define RPL_INVITING_MSG "341 %s %s %s"
#define RPL_INVITELIST_MSG "346 %s %s %s"
#define RPL_ENDOFINVITELIST_MSG "347 %s %s :End of channel invite list"

View File

@@ -1,6 +1,6 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001-2007 Alexander Barton (alex@barton.de).
* Copyright (c)2001-2005 by Alexander Barton (alex@barton.de)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -12,7 +12,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: ngircd.c,v 1.117 2007/11/21 12:16:36 alex Exp $";
static char UNUSED id[] = "$Id: ngircd.c,v 1.102.2.2 2005/07/08 23:20:04 alex Exp $";
/**
* @file
@@ -48,7 +48,7 @@ static char UNUSED id[] = "$Id: ngircd.c,v 1.117 2007/11/21 12:16:36 alex Exp $"
#include "parse.h"
#include "irc.h"
#ifdef ZEROCONF
#ifdef RENDEZVOUS
#include "rendezvous.h"
#endif
@@ -56,20 +56,20 @@ static char UNUSED id[] = "$Id: ngircd.c,v 1.117 2007/11/21 12:16:36 alex Exp $"
#include "ngircd.h"
static void Initialize_Signal_Handler PARAMS(( void ));
static void Signal_Handler PARAMS(( int Signal ));
LOCAL void Initialize_Signal_Handler PARAMS(( void ));
LOCAL void Signal_Handler PARAMS(( int Signal ));
static void Show_Version PARAMS(( void ));
static void Show_Help PARAMS(( void ));
LOCAL void Show_Version PARAMS(( void ));
LOCAL void Show_Help PARAMS(( void ));
static void Pidfile_Create PARAMS(( pid_t pid ));
static void Pidfile_Delete PARAMS(( void ));
LOCAL void Pidfile_Create PARAMS(( long ));
LOCAL void Pidfile_Delete PARAMS(( void ));
static void Fill_Version PARAMS(( void ));
LOCAL void Fill_Version PARAMS(( void ));
static void Setup_FDStreams PARAMS(( void ));
LOCAL void Setup_FDStreams PARAMS(( void ));
static bool NGIRCd_Init PARAMS(( bool ));
LOCAL bool NGIRCd_Init PARAMS(( bool ));
/**
* The main() function of ngIRCd.
@@ -262,18 +262,18 @@ main( int argc, const char *argv[] )
Log_Init( ! NGIRCd_NoDaemon );
Conf_Init( );
/* Initialize the "main program": chroot environment, user and
* group ID, ... */
if (!NGIRCd_Init(NGIRCd_NoDaemon)) {
Log(LOG_ALERT, "Fatal: Initialization failed");
if (!NGIRCd_Init( NGIRCd_NoDaemon )) {
Log(LOG_WARNING, "Fatal: Initialization failed");
exit(1);
}
/* Initialize modules, part II: these functions are eventually
* called with already dropped privileges ... */
Resolve_Init( );
Lists_Init( );
Channel_Init( );
Client_Init( );
#ifdef ZEROCONF
#ifdef RENDEZVOUS
Rendezvous_Init( );
#endif
Conn_Init( );
@@ -322,11 +322,12 @@ main( int argc, const char *argv[] )
/* Alles abmelden */
Conn_Exit( );
#ifdef ZEROCONF
#ifdef RENDEZVOUS
Rendezvous_Exit( );
#endif
Client_Exit( );
Channel_Exit( );
Lists_Exit( );
Log_Exit( );
}
Pidfile_Delete( );
@@ -341,7 +342,7 @@ main( int argc, const char *argv[] )
* further usage, for example by the IRC command VERSION and the --version
* command line switch.
*/
static void
LOCAL void
Fill_Version( void )
{
NGIRCd_VersionAddition[0] = '\0';
@@ -361,11 +362,11 @@ Fill_Version( void )
strlcat( NGIRCd_VersionAddition, "TCPWRAP", sizeof NGIRCd_VersionAddition );
#endif
#ifdef ZEROCONF
#ifdef RENDEZVOUS
if( NGIRCd_VersionAddition[0] )
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
strlcat( NGIRCd_VersionAddition, "ZEROCONF", sizeof NGIRCd_VersionAddition );
strlcat( NGIRCd_VersionAddition, "RENDEZVOUS", sizeof NGIRCd_VersionAddition );
#endif
#ifdef IDENTAUTH
if( NGIRCd_VersionAddition[0] )
@@ -422,7 +423,6 @@ GLOBAL void
NGIRCd_Rehash( void )
{
char old_name[CLIENT_ID_LEN];
unsigned old_nicklen;
Log( LOG_NOTICE|LOG_snotice, "Re-reading configuration NOW!" );
NGIRCd_SignalRehash = false;
@@ -430,22 +430,17 @@ NGIRCd_Rehash( void )
/* Close down all listening sockets */
Conn_ExitListeners( );
/* Remember old server name and nick name length */
/* Remember old server name */
strlcpy( old_name, Conf_ServerName, sizeof old_name );
old_nicklen = Conf_MaxNickLength;
/* Re-read configuration ... */
Conf_Rehash( );
/* Recover old server name and nick name length: these values can't
* be changed during run-time */
if (strcmp(old_name, Conf_ServerName) != 0 ) {
strlcpy(Conf_ServerName, old_name, sizeof Conf_ServerName);
Log(LOG_ERR, "Can't change \"ServerName\" on runtime! Ignored new name.");
}
if (old_nicklen != Conf_MaxNickLength) {
Conf_MaxNickLength = old_nicklen;
Log(LOG_ERR, "Can't change \"MaxNickLength\" on runtime! Ignored new value.");
/* Recover old server name: it can't be changed during run-time */
if( strcmp( old_name, Conf_ServerName ) != 0 )
{
strcpy( Conf_ServerName, old_name );
Log( LOG_ERR, "Can't change \"ServerName\" on runtime! Ignored new name." );
}
/* Create new pre-defined channels */
@@ -464,7 +459,7 @@ NGIRCd_Rehash( void )
/**
* Initialize the signal handler.
*/
static void
LOCAL void
Initialize_Signal_Handler( void )
{
/* Signal-Handler initialisieren: einige Signale
@@ -486,27 +481,27 @@ Initialize_Signal_Handler( void )
#endif
/* Signal-Handler einhaengen */
sigaction(SIGINT, &saction, NULL);
sigaction(SIGQUIT, &saction, NULL);
sigaction(SIGTERM, &saction, NULL);
sigaction(SIGHUP, &saction, NULL);
sigaction(SIGCHLD, &saction, NULL);
sigaction( SIGINT, &saction, NULL );
sigaction( SIGQUIT, &saction, NULL );
sigaction( SIGTERM, &saction, NULL);
sigaction( SIGHUP, &saction, NULL);
sigaction( SIGCHLD, &saction, NULL);
/* einige Signale ignorieren */
saction.sa_handler = SIG_IGN;
sigaction(SIGPIPE, &saction, NULL);
sigaction( SIGPIPE, &saction, NULL );
#else
/* kein sigaction() vorhanden */
/* Signal-Handler einhaengen */
signal(SIGINT, Signal_Handler);
signal(SIGQUIT, Signal_Handler);
signal(SIGTERM, Signal_Handler);
signal(SIGHUP, Signal_Handler);
signal(SIGCHLD, Signal_Handler);
signal( SIGINT, Signal_Handler );
signal( SIGQUIT, Signal_Handler );
signal( SIGTERM, Signal_Handler );
signal( SIGHUP, Signal_Handler );
signal( SIGCHLD, Signal_Handler );
/* einige Signale ignorieren */
signal(SIGPIPE, SIG_IGN);
signal( SIGPIPE, SIG_IGN );
#endif
} /* Initialize_Signal_Handler */
@@ -517,7 +512,7 @@ Initialize_Signal_Handler( void )
* user and/or the system to it. For example SIGTERM and SIGHUP.
* @param Signal Number of the signal to handle.
*/
static void
LOCAL void
Signal_Handler( int Signal )
{
switch( Signal )
@@ -548,12 +543,12 @@ Signal_Handler( int Signal )
/**
* Display copyright and version information of ngIRCd on the console.
*/
static void
LOCAL void
Show_Version( void )
{
puts( NGIRCd_Version );
puts( "Copyright (c)2001-2007 Alexander Barton (<alex@barton.de>) and Contributors." );
puts( "Homepage: <http://ngircd.barton.de/>\n" );
puts( "Copyright (c)2001-2005 by Alexander Barton (<alex@barton.de>)." );
puts( "Homepage: <http://arthur.ath.cx/~alex/ngircd/>\n" );
puts( "This is free software; see the source for copying conditions. There is NO" );
puts( "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." );
} /* Show_Version */
@@ -564,7 +559,7 @@ Show_Version( void )
* This help depends on the configuration of the executable and only shows
* options that are actually enabled.
*/
static void
LOCAL void
Show_Help( void )
{
#ifdef DEBUG
@@ -585,7 +580,7 @@ Show_Help( void )
/**
* Delete the file containing the process ID (PID).
*/
static void
LOCAL void
Pidfile_Delete( void )
{
/* Pidfile configured? */
@@ -604,8 +599,8 @@ Pidfile_Delete( void )
* Create the file containing the process ID of ngIRCd ("PID file").
* @param pid The process ID to be stored in this file.
*/
static void
Pidfile_Create(pid_t pid)
LOCAL void
Pidfile_Create( long pid )
{
int pidfd;
char pidbuf[64];
@@ -624,13 +619,13 @@ Pidfile_Create(pid_t pid)
return;
}
len = snprintf(pidbuf, sizeof pidbuf, "%ld\n", (long)pid);
if (len < 0 || len >= (int)sizeof pidbuf) {
len = snprintf( pidbuf, sizeof pidbuf, "%ld\n", pid );
if (len < 0|| len < (int)sizeof pid) {
Log( LOG_ERR, "Error converting pid");
return;
}
if (write(pidfd, pidbuf, (size_t)len) != (ssize_t)len)
if( write( pidfd, pidbuf, len) != len)
Log( LOG_ERR, "Can't write PID file (%s): %s", Conf_PidFile, strerror( errno ));
if( close(pidfd) != 0 )
@@ -641,7 +636,7 @@ Pidfile_Create(pid_t pid)
/**
* Redirect stdin, stdout and stderr to apropriate file handles.
*/
static void
LOCAL void
Setup_FDStreams( void )
{
int fd;
@@ -666,8 +661,8 @@ Setup_FDStreams( void )
} /* Setup_FDStreams */
static bool
NGIRCd_getNobodyID(uid_t *uid, gid_t *gid )
LOCAL bool
NGIRCd_getNobodyID(unsigned int *uid, unsigned int *gid )
{
struct passwd *pwd;
@@ -685,7 +680,7 @@ NGIRCd_getNobodyID(uid_t *uid, gid_t *gid )
}
static bool
LOCAL bool
NGIRCd_Init( bool NGIRCd_NoDaemon )
{
static bool initialized;
@@ -693,7 +688,7 @@ NGIRCd_Init( bool NGIRCd_NoDaemon )
struct passwd *pwd;
struct group *grp;
int real_errno;
pid_t pid;
long pid;
if (initialized)
return true;
@@ -753,7 +748,7 @@ NGIRCd_Init( bool NGIRCd_NoDaemon )
* connected to ther controlling terminal. Use "--nodaemon"
* to disable this "daemon mode" (useful for debugging). */
if ( ! NGIRCd_NoDaemon ) {
pid = fork( );
pid = (long)fork( );
if( pid > 0 ) {
/* "Old" process: exit. */
exit( 0 );
@@ -803,7 +798,7 @@ NGIRCd_Init( bool NGIRCd_NoDaemon )
if( chdir( pwd->pw_dir ) == 0 )
Log( LOG_DEBUG, "Changed working directory to \"%s\" ...", pwd->pw_dir );
else
Log( LOG_INFO, "Notice: Can't change working directory to \"%s\": %s",
Log( LOG_ERR, "Can't change working directory to \"%s\": %s",
pwd->pw_dir, strerror( errno ));
}
} else {

View File

@@ -1,334 +0,0 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001-2007 Alexander Barton (alex@barton.de)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* Handlers for IRC numerics sent to the server
*/
#include "portab.h"
static char UNUSED id[] = "$Id: numeric.c,v 1.1 2007/11/21 12:20:32 alex Exp $";
#include "imp.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "defines.h"
#include "resolve.h"
#include "conn.h"
#include "conf.h"
#include "conn.h"
#include "client.h"
#include "channel.h"
#include "irc-write.h"
#include "lists.h"
#include "log.h"
#include "messages.h"
#include "parse.h"
#include "exp.h"
#include "numeric.h"
/**
* Announce new server in the network
* @param Client New server
* @param Server Existing server in the network
*/
static bool
Announce_Server(CLIENT * Client, CLIENT * Server)
{
CLIENT *c;
if (Client_Conn(Server) > NONE) {
/* Announce the new server to the one already registered
* which is directly connected to the local server */
if (!IRC_WriteStrClient
(Server, "SERVER %s %d %d :%s", Client_ID(Client),
Client_Hops(Client) + 1, Client_MyToken(Client),
Client_Info(Client)))
return DISCONNECTED;
}
if (Client_Hops(Server) == 1)
c = Client_ThisServer();
else
c = Client_Introducer(Server);
/* Inform new server about the one already registered in the network */
return IRC_WriteStrClientPrefix(Client, c, "SERVER %s %d %d :%s",
Client_ID(Server), Client_Hops(Server) + 1,
Client_MyToken(Server), Client_Info(Server));
} /* Announce_Server */
/**
* Announce existing user to a new server
* @param Client New server
* @param User Existing user in the network
*/
static bool
Announce_User(CLIENT * Client, CLIENT * User)
{
return IRC_WriteStrClient(Client, "NICK %s %d %s %s %d +%s :%s",
Client_ID(User), Client_Hops(User) + 1, Client_User(User),
Client_Hostname(User), Client_MyToken(Client_Introducer(User)),
Client_Modes(User), Client_Info(User));
} /* Announce_User */
#ifdef IRCPLUS
/**
* Synchronize invite and ban lists between servers
* @param Client New server
*/
static bool
Synchronize_Lists(CLIENT * Client)
{
CHANNEL *c;
struct list_head *head;
struct list_elem *elem;
assert(Client != NULL);
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);
}
c = Channel_Next(c);
}
return CONNECTED;
}
/**
* Send CHANINFO commands to a new server (inform it about existing channels).
* @param Client New server
* @param Chan Channel
*/
static bool
Send_CHANINFO(CLIENT * Client, CHANNEL * Chan)
{
char *modes, *topic;
bool has_k, has_l;
#ifdef DEBUG
Log(LOG_DEBUG, "Sending CHANINFO commands ...");
#endif
modes = Channel_Modes(Chan);
topic = Channel_Topic(Chan);
if (!*modes && !*topic)
return CONNECTED;
has_k = strchr(modes, 'k') != NULL;
has_l = strchr(modes, 'l') != NULL;
/* send CHANINFO */
if (!has_k && !has_l) {
if (!*topic) {
/* "CHANINFO <chan> +<modes>" */
return IRC_WriteStrClient(Client, "CHANINFO %s +%s",
Channel_Name(Chan), modes);
}
/* "CHANINFO <chan> +<modes> :<topic>" */
return IRC_WriteStrClient(Client, "CHANINFO %s +%s :%s",
Channel_Name(Chan), modes, topic);
}
/* "CHANINFO <chan> +<modes> <key> <limit> :<topic>" */
return IRC_WriteStrClient(Client, "CHANINFO %s +%s %s %lu :%s",
Channel_Name(Chan), modes,
has_k ? Channel_Key(Chan) : "*",
has_l ? Channel_MaxUsers(Chan) : 0, topic);
} /* Send_CHANINFO */
#endif /* IRCPLUS */
/**
* Handle ENDOFMOTD (376) numeric and login remote server.
* The peer is either an IRC server (no IRC+ protocol), or we got the
* ENDOFMOTD numeric from an IRC+ server. We have to register the new server.
*/
GLOBAL bool
IRC_Num_ENDOFMOTD(CLIENT * Client, UNUSED REQUEST * Req)
{
char str[LINE_LEN];
int max_hops, i;
CLIENT *c, *cl;
CHANNEL *chan;
CL2CHAN *cl2chan;
Client_SetType(Client, CLIENT_SERVER);
Log(LOG_NOTICE | LOG_snotice,
"Server \"%s\" registered (connection %d, 1 hop - direct link).",
Client_ID(Client), Client_Conn(Client));
/* Get highest hop count */
max_hops = 0;
c = Client_First();
while (c) {
if (Client_Hops(c) > max_hops)
max_hops = Client_Hops(c);
c = Client_Next(c);
}
/* Inform the new server about all other servers, and announce the
* new server to all the already registered ones. Important: we have
* to do this "in order" and can't introduce servers of which the
* "toplevel server" isn't known already. */
for (i = 0; i < (max_hops + 1); i++) {
for (c = Client_First(); c != NULL; c = Client_Next(c)) {
if (Client_Type(c) != CLIENT_SERVER)
continue; /* not a server */
if (Client_Hops(c) != i)
continue; /* not actual "nesting level" */
if (c == Client || c == Client_ThisServer())
continue; /* that's us or the peer! */
if (!Announce_Server(Client, c))
return DISCONNECTED;
}
}
/* Announce all the users to the new server */
c = Client_First();
while (c) {
if (Client_Type(c) == CLIENT_USER) {
if (!Announce_User(Client, c))
return DISCONNECTED;
}
c = Client_Next(c);
}
/* Announce all channels to the new server */
chan = Channel_First();
while (chan) {
#ifdef IRCPLUS
/* Send CHANINFO if the peer supports it */
if (strchr(Client_Flags(Client), 'C')) {
if (!Send_CHANINFO(Client, chan))
return DISCONNECTED;
}
#endif
/* Get all the members of this channel */
cl2chan = Channel_FirstMember(chan);
snprintf(str, sizeof(str), "NJOIN %s :", Channel_Name(chan));
while (cl2chan) {
cl = Channel_GetClient(cl2chan);
assert(cl != NULL);
/* Nick name, with modes (if applicable) */
if (str[strlen(str) - 1] != ':')
strlcat(str, ",", sizeof(str));
if (strchr(Channel_UserModes(chan, cl), 'v'))
strlcat(str, "+", sizeof(str));
if (strchr(Channel_UserModes(chan, cl), 'o'))
strlcat(str, "@", sizeof(str));
strlcat(str, Client_ID(cl), sizeof(str));
/* Send the data if the buffer is "full" */
if (strlen(str) > (LINE_LEN - CLIENT_NICK_LEN - 8)) {
if (!IRC_WriteStrClient(Client, "%s", str))
return DISCONNECTED;
snprintf(str, sizeof(str), "NJOIN %s :",
Channel_Name(chan));
}
cl2chan = Channel_NextMember(chan, cl2chan);
}
/* Data left in the buffer? */
if (str[strlen(str) - 1] != ':') {
/* Yes, send it ... */
if (!IRC_WriteStrClient(Client, "%s", str))
return DISCONNECTED;
}
/* Get next channel ... */
chan = Channel_Next(chan);
}
#ifdef IRCPLUS
if (strchr(Client_Flags(Client), 'L')) {
LogDebug("Synchronizing INVITE- and BAN-lists ...");
if (!Synchronize_Lists(Client))
return DISCONNECTED;
}
#endif
return CONNECTED;
} /* IRC_Num_ENDOFMOTD */
/**
* Handle ISUPPORT (005) numeric.
*/
GLOBAL bool
IRC_Num_ISUPPORT(CLIENT * Client, REQUEST * Req)
{
int i;
char *key, *value;
for (i = 1; i < Req->argc - 1; i++) {
key = Req->argv[i];
value = strchr(key, '=');
if (value)
*value++ = '\0';
else
value = "";
if (strcmp("NICKLEN", key) == 0) {
if ((unsigned int)atol(value) == Conf_MaxNickLength - 1)
continue;
/* Nick name length settings are different! */
Log(LOG_ERR,
"Peer uses incompatible nick name length (%d/%d)! Disconnecting ...",
Conf_MaxNickLength - 1, atoi(value));
Conn_Close(Client_Conn(Client),
"Incompatible nick name length",
NULL, false);
return DISCONNECTED;
}
}
return CONNECTED;
} /* IRC_Num_ISUPPORT */
/* -eof- */

View File

@@ -1,24 +0,0 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001-2007 by Alexander Barton (alex@barton.de)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: numeric.h,v 1.1 2007/11/21 12:20:32 alex Exp $
*
* Handlers for IRC numerics sent to the server (header)
*/
#ifndef __numeric_h__
#define __numeric_h__
GLOBAL bool IRC_Num_ENDOFMOTD PARAMS((CLIENT *Client, UNUSED REQUEST *Req));
GLOBAL bool IRC_Num_ISUPPORT PARAMS((CLIENT *Client, REQUEST *Req));
#endif
/* -eof- */

View File

@@ -12,7 +12,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: parse.c,v 1.69.2.1 2008/02/05 13:11:20 fw Exp $";
static char UNUSED id[] = "$Id: parse.c,v 1.63.2.1 2005/07/24 21:06:51 alex Exp $";
/**
* @file
@@ -48,7 +48,6 @@ static char UNUSED id[] = "$Id: parse.c,v 1.69.2.1 2008/02/05 13:11:20 fw Exp $"
#include "irc-oper.h"
#include "irc-server.h"
#include "irc-write.h"
#include "numeric.h"
#include "exp.h"
@@ -94,7 +93,6 @@ COMMAND My_Commands[] =
{ "USER", IRC_USER, 0xFFFF, 0, 0, 0 },
{ "USERHOST", IRC_USERHOST, CLIENT_USER, 0, 0, 0 },
{ "VERSION", IRC_VERSION, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "WALLOPS", IRC_WALLOPS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "WHO", IRC_WHO, CLIENT_USER, 0, 0, 0 },
{ "WHOIS", IRC_WHOIS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "WHOWAS", IRC_WHOWAS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
@@ -104,21 +102,14 @@ COMMAND My_Commands[] =
{ NULL, NULL, 0x0, 0, 0, 0 } /* Ende-Marke */
};
NUMERIC My_Numerics[] =
{
{ 005, IRC_Num_ISUPPORT },
{ 376, IRC_Num_ENDOFMOTD },
{ 0, NULL } /* end marker */
};
LOCAL void Init_Request PARAMS(( REQUEST *Req ));
static void Init_Request PARAMS(( REQUEST *Req ));
LOCAL bool Validate_Prefix PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed ));
LOCAL bool Validate_Command PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed ));
LOCAL bool Validate_Args PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed ));
static bool Validate_Prefix PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed ));
static bool Validate_Command PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed ));
static bool Validate_Args PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed ));
static bool Handle_Request PARAMS(( CONN_ID Idx, REQUEST *Req ));
LOCAL bool Handle_Request PARAMS(( CONN_ID Idx, REQUEST *Req ));
/**
@@ -256,7 +247,7 @@ Parse_Request( CONN_ID Idx, char *Request )
* Initialize request structure.
* @param Req Request structure to be initialized.
*/
static void
LOCAL void
Init_Request( REQUEST *Req )
{
/* Neue Request-Struktur initialisieren */
@@ -272,7 +263,7 @@ Init_Request( REQUEST *Req )
} /* Init_Request */
static bool
LOCAL bool
Validate_Prefix( CONN_ID Idx, REQUEST *Req, bool *Closed )
{
CLIENT *client, *c;
@@ -286,7 +277,7 @@ Validate_Prefix( CONN_ID Idx, REQUEST *Req, bool *Closed )
if( ! Req->prefix ) return true;
/* Client-Struktur der Connection ermitteln */
client = Conn_GetClient( Idx );
client = Client_GetFromConn( Idx );
assert( client != NULL );
/* nur validieren, wenn bereits registrierte Verbindung */
@@ -315,7 +306,7 @@ Validate_Prefix( CONN_ID Idx, REQUEST *Req, bool *Closed )
{
/* das angegebene Prefix ist aus dieser Richtung, also
* aus der gegebenen Connection, ungueltig! */
Log( LOG_ERR, "Spoofed prefix \"%s\" from \"%s\" (connection %d, command %s)!", Req->prefix, Client_Mask( Conn_GetClient( Idx )), Idx, Req->command );
Log( LOG_ERR, "Spoofed prefix \"%s\" from \"%s\" (connection %d, command %s)!", Req->prefix, Client_Mask( Client_GetFromConn( Idx )), Idx, Req->command );
Conn_Close( Idx, NULL, "Spoofed prefix", true);
*Closed = true;
return false;
@@ -325,7 +316,7 @@ Validate_Prefix( CONN_ID Idx, REQUEST *Req, bool *Closed )
} /* Validate_Prefix */
static bool
LOCAL bool
Validate_Command( UNUSED CONN_ID Idx, UNUSED REQUEST *Req, bool *Closed )
{
assert( Idx >= 0 );
@@ -336,7 +327,7 @@ Validate_Command( UNUSED CONN_ID Idx, UNUSED REQUEST *Req, bool *Closed )
} /* Validate_Comman */
static bool
LOCAL bool
Validate_Args( UNUSED CONN_ID Idx, UNUSED REQUEST *Req, bool *Closed )
{
assert( Idx >= 0 );
@@ -347,7 +338,7 @@ Validate_Args( UNUSED CONN_ID Idx, UNUSED REQUEST *Req, bool *Closed )
} /* Validate_Args */
static bool
LOCAL bool
Handle_Request( CONN_ID Idx, REQUEST *Req )
{
/* Client-Request verarbeiten. Bei einem schwerwiegenden Fehler
@@ -357,55 +348,34 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
char str[LINE_LEN];
bool result;
COMMAND *cmd;
NUMERIC *num;
int i, client_type;
int i;
assert( Idx >= 0 );
assert( Req != NULL );
assert( Req->command != NULL );
client = Conn_GetClient( Idx );
client = Client_GetFromConn( Idx );
assert( client != NULL );
/* Numeric? */
if ((Client_Type(client) == CLIENT_SERVER ||
Client_Type(client) == CLIENT_UNKNOWNSERVER)
&& strlen(Req->command) == 3 && atoi(Req->command) > 1) {
/* Command is a status code ("numeric") from an other server */
/* Statuscode? */
if(( Client_Type( client ) == CLIENT_SERVER ) && ( strlen( Req->command ) == 3 ) && ( atoi( Req->command ) > 100 ))
{
/* Command is a status code from an other server */
/* Determine target */
if (Req->argc > 0)
target = Client_Search( Req->argv[0] );
else
target = NULL;
if (!target) {
if( Req->argc > 0 ) target = Client_Search( Req->argv[0] );
else target = NULL;
if( ! target )
{
/* Status code without target!? */
if (Req->argc > 0)
Log(LOG_WARNING,
"Unknown target for status code %s: \"%s\"",
Req->command, Req->argv[0]);
else
Log(LOG_WARNING,
"Unknown target for status code %s!",
Req->command);
if( Req->argc > 0 ) Log( LOG_WARNING, "Unknown target for status code %s: \"%s\"", Req->command, Req->argv[0] );
else Log( LOG_WARNING, "Unknown target for status code %s!", Req->command );
return true;
}
if (target == Client_ThisServer()) {
/* This server is the target of the numeric */
i = atoi(Req->command);
num = My_Numerics;
while (num->numeric > 0) {
if (i != num->numeric) {
num++;
continue;
}
result = (num->function)(client, Req);
return result;
}
LogDebug("Ignored status code %s from \"%s\".",
Req->command, Client_ID(client));
if( target == Client_ThisServer( ))
{
/* This server is the target, ignore it */
Log( LOG_DEBUG, "Ignored status code %s from \"%s\".", Req->command, Client_ID( client ));
return true;
}
@@ -436,7 +406,6 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
}
cmd = My_Commands;
client_type = Client_Type(client);
while( cmd->name )
{
/* Befehl suchen */
@@ -445,7 +414,7 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
cmd++; continue;
}
if( client_type & cmd->type )
if( Client_Type( client ) & cmd->type )
{
/* Command is allowed for this client: call it and count produced bytes */
Conn_ResetWCounter( );
@@ -453,7 +422,7 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
cmd->bytes += Conn_WCounter( );
/* Adjust counters */
if( client_type != CLIENT_SERVER ) cmd->lcount++;
if( Client_Type( client ) != CLIENT_SERVER ) cmd->lcount++;
else cmd->rcount++;
return result;
@@ -476,12 +445,9 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
Req->argc == 1 ? "parameter" : "parameters",
Req->prefix ? "" : " no" );
if (Client_Type(client) != CLIENT_SERVER) {
result = IRC_WriteStrClient(client, ERR_UNKNOWNCOMMAND_MSG,
Client_ID(client), Req->command);
Conn_SetPenalty(Idx, 1);
return result;
}
if( Client_Type( client ) != CLIENT_SERVER )
return IRC_WriteStrClient( client, ERR_UNKNOWNCOMMAND_MSG,
Client_ID( client ), Req->command );
return true;
} /* Handle_Request */

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: parse.h,v 1.12 2007/11/21 12:16:36 alex Exp $
* $Id: parse.h,v 1.11 2005/03/19 18:43:49 fw Exp $
*
* IRC command parser and validator (header)
*/
@@ -33,18 +33,11 @@ typedef struct _COMMAND
char *name; /* command name */
bool (*function) PARAMS(( CLIENT *Client, REQUEST *Request ));
CLIENT_TYPE type; /* valid client types (bit mask) */
long lcount, rcount; /* number of local and remote calls */
long bytes; /* number of bytes created */
long lcount, rcount; /* number of local and remote calls */
long bytes; /* number of bytes created */
} COMMAND;
typedef struct _NUMERIC
{
int numeric; /* numeric */
bool (*function) PARAMS(( CLIENT *Client, REQUEST *Request ));
} NUMERIC;
GLOBAL bool Parse_Request PARAMS((CONN_ID Idx, char *Request ));
GLOBAL COMMAND *Parse_GetCommandStruct PARAMS(( void ));

View File

@@ -18,10 +18,10 @@
#include "portab.h"
#ifdef ZEROCONF
#ifdef RENDEZVOUS
static char UNUSED id[] = "$Id: rendezvous.c,v 1.8 2006/05/10 21:24:01 alex Exp $";
static char UNUSED id[] = "$Id: rendezvous.c,v 1.5 2005/03/19 18:43:49 fw Exp $";
#include "imp.h"
#include <assert.h>
@@ -72,10 +72,10 @@ typedef struct _service
#endif
} SERVICE;
static SERVICE My_Rendezvous[MAX_RENDEZVOUS];
LOCAL SERVICE My_Rendezvous[MAX_RENDEZVOUS];
static void Unregister( int Idx );
LOCAL void Unregister( int Idx );
/* -- Apple API -- */
@@ -84,7 +84,7 @@ static void Unregister( int Idx );
#define MAX_MACH_MSG_SIZE 512
static void Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrCode, void *Context );
LOCAL void Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrCode, void *Context );
#endif /* Apple */
@@ -93,10 +93,10 @@ static void Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType Err
#ifdef HOWL
static sw_discovery My_Discovery_Session = NULL;
static sw_salt My_Salt;
LOCAL sw_discovery My_Discovery_Session = NULL;
LOCAL sw_salt My_Salt;
static sw_result HOWL_API Registration_Reply_Handler( sw_discovery Session, sw_discovery_publish_status Status, sw_discovery_oid Id, sw_opaque Extra );
LOCAL sw_result HOWL_API Registration_Reply_Handler( sw_discovery Session, sw_discovery_publish_status Status, sw_discovery_oid Id, sw_opaque Extra );
#endif /* Howl */
@@ -144,7 +144,7 @@ GLOBAL void Rendezvous_Exit( void )
} /* Rendezvous_Exit */
GLOBAL bool Rendezvous_Register( char *Name, char *Type, UINT16 Port )
GLOBAL bool Rendezvous_Register( char *Name, char *Type, unsigned int Port )
{
/* Register new service */
@@ -263,7 +263,7 @@ GLOBAL void Rendezvous_Handler( void )
} /* Rendezvous_Handler */
static void Unregister( int Idx )
LOCAL void Unregister( int Idx )
{
/* Unregister service */
@@ -289,7 +289,7 @@ static void Unregister( int Idx )
#ifdef APPLE
static void Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrCode, void *Context )
LOCAL void Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrCode, void *Context )
{
SERVICE *s = (SERVICE *)Context;
char txt[50];
@@ -310,8 +310,7 @@ static void Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType Err
strcpy( txt, "name conflict!" );
break;
default:
snprintf(txt, sizeof txt, "error code %ld!",
(long)ErrCode);
sprintf( txt, "error code %ld!", (long)ErrCode );
}
Log( LOG_INFO, "Can't register \"%s\" with Rendezvous: %s", s->Desc, txt );
@@ -327,7 +326,7 @@ static void Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType Err
#ifdef HOWL
static sw_result HOWL_API Registration_Reply_Handler( sw_discovery Session, sw_discovery_publish_status Status, UNUSED sw_discovery_oid Id, sw_opaque Extra )
LOCAL sw_result HOWL_API Registration_Reply_Handler( sw_discovery Session, sw_discovery_publish_status Status, UNUSED sw_discovery_oid Id, sw_opaque Extra )
{
SERVICE *s = (SERVICE *)Extra;
char txt[50];
@@ -348,8 +347,7 @@ static sw_result HOWL_API Registration_Reply_Handler( sw_discovery Session, sw_d
strcpy( txt, "name conflict!" );
break;
default:
snprintf(txt, sizeof txt, "error code %ld!",
(long)Status);
sprintf( txt, "error code %ld!", (long)Status );
}
Log( LOG_INFO, "Can't register \"%s\" with Rendezvous: %s", s->Desc, txt );
@@ -362,7 +360,7 @@ static sw_result HOWL_API Registration_Reply_Handler( sw_discovery Session, sw_d
#endif /* Howl */
#endif /* ZEROCONF */
#endif /* RENDEZVOUS */
/* -eof- */

View File

@@ -8,13 +8,13 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: rendezvous.h,v 1.4 2006/05/10 21:24:01 alex Exp $
* $Id: rendezvous.h,v 1.2 2005/03/19 18:43:49 fw Exp $
*
* "Rendezvous" functions (Header)
*/
#ifdef ZEROCONF
#ifdef RENDEZVOUS
#ifndef __rdezvous_h__
#define __rdezvous_h__
@@ -23,7 +23,7 @@
GLOBAL void Rendezvous_Init( void );
GLOBAL void Rendezvous_Exit( void );
GLOBAL bool Rendezvous_Register( char *Name, char *Type, UINT16 Port );
GLOBAL bool Rendezvous_Register( char *Name, char *Type, unsigned int Port );
GLOBAL bool Rendezvous_Unregister( char *Name );
GLOBAL void Rendezvous_UnregisterListeners( void );
@@ -33,7 +33,7 @@ GLOBAL void Rendezvous_Handler( void );
#endif /* __rdezvous_h__ */
#endif /* ZEROCONF */
#endif /* RENDEZVOUS */
/* -eof- */

View File

@@ -14,7 +14,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: resolve.c,v 1.28 2008/01/02 11:03:29 fw Exp $";
static char UNUSED id[] = "$Id: resolve.c,v 1.12.2.1 2005/09/02 22:07:38 fw Exp $";
#include "imp.h"
#include <assert.h>
@@ -24,6 +24,7 @@ static char UNUSED id[] = "$Id: resolve.c,v 1.28 2008/01/02 11:03:29 fw Exp $";
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#ifdef IDENTAUTH
@@ -35,210 +36,198 @@ static char UNUSED id[] = "$Id: resolve.c,v 1.28 2008/01/02 11:03:29 fw Exp $";
#include "conn.h"
#include "defines.h"
#include "log.h"
#include "tool.h"
#include "exp.h"
#include "resolve.h"
#include "io.h"
static void Do_ResolveAddr PARAMS(( struct sockaddr_in *Addr, int Sock, int w_fd ));
static void Do_ResolveName PARAMS(( const char *Host, int w_fd ));
static bool register_callback PARAMS((RES_STAT *s, void (*cbfunc)(int, short)));
#ifdef IDENTAUTH
LOCAL void Do_ResolveAddr PARAMS(( struct sockaddr_in *Addr, int Sock, int w_fd ));
#else
LOCAL void Do_ResolveAddr PARAMS(( struct sockaddr_in *Addr, int w_fd ));
#endif
LOCAL void Do_ResolveName PARAMS(( char *Host, int w_fd ));
#ifdef h_errno
static char *Get_Error PARAMS(( int H_Error ));
LOCAL char *Get_Error PARAMS(( int H_Error ));
#endif
static pid_t
Resolver_fork(int *pipefds)
{
pid_t pid;
if (pipe(pipefds) != 0) {
Log( LOG_ALERT, "Resolver: Can't create output pipe: %s!", strerror( errno ));
return -1;
}
pid = fork();
switch(pid) {
case -1:
Log( LOG_CRIT, "Resolver: Can't fork: %s!", strerror( errno ));
close(pipefds[0]);
close(pipefds[1]);
return -1;
case 0: /* child */
close(pipefds[0]);
Log_Init_Resolver( );
return 0;
}
/* parent */
close(pipefds[1]);
return pid;
}
/**
* Resolve IP (asynchronous!).
*/
GLOBAL bool
Resolve_Addr(RES_STAT * s, struct sockaddr_in *Addr, int identsock,
void (*cbfunc) (int, short))
{
int pipefd[2];
pid_t pid;
assert(s != NULL);
pid = Resolver_fork(pipefd);
if (pid > 0) {
#ifdef DEBUG
Log( LOG_DEBUG, "Resolver for %s created (PID %d).", inet_ntoa( Addr->sin_addr ), pid );
#endif
s->pid = pid;
s->resolver_fd = pipefd[0];
return register_callback(s, cbfunc);
} else if( pid == 0 ) {
/* Sub process */
Do_ResolveAddr( Addr, identsock, pipefd[1]);
Log_Exit_Resolver( );
exit(0);
}
return false;
} /* Resolve_Addr */
/**
* Resolve hostname (asynchronous!).
*/
GLOBAL bool
Resolve_Name( RES_STAT *s, const char *Host, void (*cbfunc)(int, short))
{
int pipefd[2];
pid_t pid;
assert(s != NULL);
pid = Resolver_fork(pipefd);
if (pid > 0) {
/* Main process */
#ifdef DEBUG
Log( LOG_DEBUG, "Resolver for \"%s\" created (PID %d).", Host, pid );
#endif
s->pid = pid;
s->resolver_fd = pipefd[0];
return register_callback(s, cbfunc);
} else if( pid == 0 ) {
/* Sub process */
Do_ResolveName(Host, pipefd[1]);
Log_Exit_Resolver( );
exit(0);
}
return false;
} /* Resolve_Name */
LOCAL RES_STAT *New_Res_Stat PARAMS(( void ));
GLOBAL void
Resolve_Init(RES_STAT *s)
Resolve_Init( void )
{
assert(s != NULL);
s->resolver_fd = -1;
s->pid = 0;
}
/* Initialize module */
FD_ZERO( &Resolver_FDs );
} /* Resolve_Init */
static void
Do_ResolveAddr( struct sockaddr_in *Addr, int identsock, int w_fd )
#ifdef IDENTAUTH
GLOBAL RES_STAT *
Resolve_Addr( struct sockaddr_in *Addr, int Sock )
#else
GLOBAL RES_STAT *
Resolve_Addr( struct sockaddr_in *Addr )
#endif
{
/* Resolve IP (asynchronous!). On errors, e.g. if the child process
* can't be forked, this functions returns NULL. */
RES_STAT *s;
int pid;
s = New_Res_Stat( );
if( ! s ) return NULL;
/* For sub-process */
pid = fork( );
if( pid > 0 )
{
/* Main process */
Log( LOG_DEBUG, "Resolver for %s created (PID %d).", inet_ntoa( Addr->sin_addr ), pid );
FD_SET( s->pipe[0], &Resolver_FDs );
if( s->pipe[0] > Conn_MaxFD ) Conn_MaxFD = s->pipe[0];
s->pid = pid;
return s;
}
else if( pid == 0 )
{
/* Sub process */
Log_Init_Resolver( );
#ifdef IDENTAUTH
Do_ResolveAddr( Addr, Sock, s->pipe[1] );
#else
Do_ResolveAddr( Addr, s->pipe[1] );
#endif
Log_Exit_Resolver( );
exit( 0 );
}
else
{
/* Error! */
close(s->pipe[0]);
close(s->pipe[1]);
free( s );
Log( LOG_CRIT, "Resolver: Can't fork: %s!", strerror( errno ));
return NULL;
}
} /* Resolve_Addr */
GLOBAL RES_STAT *
Resolve_Name( char *Host )
{
/* Resolve hostname (asynchronous!). On errors, e.g. if the child
* process can't be forked, this functions returns NULL. */
RES_STAT *s;
int pid;
s = New_Res_Stat( );
if( ! s ) return NULL;
/* Fork sub-process */
pid = fork( );
if( pid > 0 )
{
/* Main process */
Log( LOG_DEBUG, "Resolver for \"%s\" created (PID %d).", Host, pid );
FD_SET( s->pipe[0], &Resolver_FDs );
if( s->pipe[0] > Conn_MaxFD ) Conn_MaxFD = s->pipe[0];
s->pid = pid;
return s;
}
else if( pid == 0 )
{
/* Sub process */
Log_Init_Resolver( );
Do_ResolveName( Host, s->pipe[1] );
Log_Exit_Resolver( );
exit( 0 );
}
else
{
/* Error! */
close(s->pipe[0]);
close(s->pipe[1]);
free( s );
Log( LOG_CRIT, "Resolver: Can't fork: %s!", strerror( errno ));
return NULL;
}
} /* Resolve_Name */
#ifdef IDENTAUTH
LOCAL void
Do_ResolveAddr( struct sockaddr_in *Addr, int Sock, int w_fd )
#else
LOCAL void
Do_ResolveAddr( struct sockaddr_in *Addr, int w_fd )
#endif
{
/* Resolver sub-process: resolve IP address and write result into
* pipe to parent. */
char hostname[CLIENT_HOST_LEN];
char ipstr[CLIENT_HOST_LEN];
char hostname[HOST_LEN];
struct hostent *h;
size_t len;
struct in_addr *addr;
char *ntoaptr;
array resolved_addr;
#ifdef IDENTAUTH
char *res;
#endif
array_init(&resolved_addr);
/* Resolve IP address */
#ifdef DEBUG
Log_Resolver( LOG_DEBUG, "Now resolving %s ...", inet_ntoa( Addr->sin_addr ));
#endif
h = gethostbyaddr( (char *)&Addr->sin_addr, sizeof( Addr->sin_addr ), AF_INET );
if (!h || strlen(h->h_name) >= sizeof(hostname)) {
if( h ) strlcpy( hostname, h->h_name, sizeof( hostname ));
else
{
#ifdef h_errno
Log_Resolver( LOG_WARNING, "Can't resolve address \"%s\": %s!", inet_ntoa( Addr->sin_addr ), Get_Error( h_errno ));
#else
Log_Resolver( LOG_WARNING, "Can't resolve address \"%s\"!", inet_ntoa( Addr->sin_addr ));
#endif
strlcpy( hostname, inet_ntoa( Addr->sin_addr ), sizeof( hostname ));
} else {
strlcpy( hostname, h->h_name, sizeof( hostname ));
h = gethostbyname( hostname );
if ( h ) {
if (memcmp(h->h_addr, &Addr->sin_addr, sizeof (struct in_addr))) {
addr = (struct in_addr*) h->h_addr;
strlcpy(ipstr, inet_ntoa(*addr), sizeof ipstr);
ntoaptr = inet_ntoa( Addr->sin_addr );
Log(LOG_WARNING,"Possible forgery: %s resolved to %s (which is at ip %s!)",
ntoaptr, hostname, ipstr);
strlcpy( hostname, ntoaptr, sizeof hostname);
}
} else {
ntoaptr = inet_ntoa( Addr->sin_addr );
Log(LOG_WARNING, "Possible forgery: %s resolved to %s (which has no ip address)",
ntoaptr, hostname);
strlcpy( hostname, ntoaptr, sizeof hostname);
}
}
Log_Resolver( LOG_DEBUG, "Ok, translated %s to \"%s\".", inet_ntoa( Addr->sin_addr ), hostname );
/* Write resolver result into pipe to parent */
len = strlen( hostname );
hostname[len] = '\n'; len++;
if (!array_copyb(&resolved_addr, hostname, len )) {
Log_Resolver( LOG_CRIT, "Resolver: Can't copy resolved name: %s!", strerror( errno ));
if( (size_t)write( w_fd, hostname, len ) != (size_t)len )
{
Log_Resolver( LOG_CRIT, "Resolver: Can't write to parent: %s!", strerror( errno ));
close( w_fd );
return;
}
#ifdef IDENTAUTH
assert(identsock >= 0);
if (identsock >= 0) {
/* Do "IDENT" (aka "AUTH") lookup and append result to resolved_addr array */
#ifdef DEBUG
Log_Resolver( LOG_DEBUG, "Doing IDENT lookup on socket %d ...", identsock );
#endif
res = ident_id( identsock, 10 );
#ifdef DEBUG
Log_Resolver(LOG_DEBUG, "Ok, IDENT lookup on socket %d done: \"%s\"",
identsock, res ? res : "(NULL)" );
#endif
if (res && !array_cats(&resolved_addr, res)) {
Log_Resolver(LOG_WARNING, "Resolver: Cannot copy IDENT result: %s!", strerror(errno));
/* omit ident and return hostname only */
}
/* Do "IDENT" (aka "AUTH") lookup and write result to parent */
Log_Resolver( LOG_DEBUG, "Doing IDENT lookup on socket %d ...", Sock );
res = ident_id( Sock, 10 );
Log_Resolver( LOG_DEBUG, "Ok, IDENT lookup on socket %d done: \"%s\"", Sock, res ? res : "" );
if (res) free(res);
/* Write IDENT result into pipe to parent */
if (res) {
len = strlen(res);
res[len] = '\n';
len++;
} else len = 1;
if( (size_t)write( w_fd, res ? res : "\n", len ) != (size_t)len )
{
Log_Resolver( LOG_CRIT, "Resolver: Can't write to parent (IDENT): %s!", strerror( errno ));
close( w_fd );
}
#else
(void)identsock;
free( res );
#endif
len = array_bytes(&resolved_addr);
if( (size_t)write( w_fd, array_start(&resolved_addr), len) != len )
Log_Resolver( LOG_CRIT, "Resolver: Can't write result to parent: %s!", strerror( errno ));
close(w_fd);
array_free(&resolved_addr);
} /* Do_ResolveAddr */
static void
Do_ResolveName( const char *Host, int w_fd )
LOCAL void
Do_ResolveName( char *Host, int w_fd )
{
/* Resolver sub-process: resolve name and write result into pipe
* to parent. */
@@ -246,30 +235,33 @@ Do_ResolveName( const char *Host, int w_fd )
char ip[16];
struct hostent *h;
struct in_addr *addr;
size_t len;
int len;
Log_Resolver( LOG_DEBUG, "Now resolving \"%s\" ...", Host );
/* Resolve hostname */
h = gethostbyname( Host );
if( h ) {
if( h )
{
addr = (struct in_addr *)h->h_addr;
strlcpy( ip, inet_ntoa( *addr ), sizeof( ip ));
} else {
}
else
{
#ifdef h_errno
Log_Resolver( LOG_WARNING, "Can't resolve \"%s\": %s!", Host, Get_Error( h_errno ));
#else
Log_Resolver( LOG_WARNING, "Can't resolve \"%s\"!", Host );
#endif
close(w_fd);
return;
ip[0] = '\0';
}
#ifdef DEBUG
Log_Resolver( LOG_DEBUG, "Ok, translated \"%s\" to %s.", Host, ip );
#endif
if( ip[0] ) Log_Resolver( LOG_DEBUG, "Ok, translated \"%s\" to %s.", Host, ip );
/* Write result into pipe to parent */
len = strlen( ip );
if ((size_t)write( w_fd, ip, len ) != len) {
ip[len] = '\n'; len++;
if( (size_t)write( w_fd, ip, len ) != (size_t)len )
{
Log_Resolver( LOG_CRIT, "Resolver: Can't write to parent: %s!", strerror( errno ));
close( w_fd );
}
@@ -278,7 +270,7 @@ Do_ResolveName( const char *Host, int w_fd )
#ifdef h_errno
static char *
LOCAL char *
Get_Error( int H_Error )
{
/* Get error message for H_Error */
@@ -301,65 +293,33 @@ Get_Error( int H_Error )
#endif
static bool
register_callback( RES_STAT *s, void (*cbfunc)(int, short))
LOCAL RES_STAT *
New_Res_Stat( void )
{
assert(cbfunc != NULL);
assert(s != NULL);
assert(s->resolver_fd >= 0);
RES_STAT *s;
if (io_setnonblock(s->resolver_fd) &&
io_event_create(s->resolver_fd, IO_WANTREAD, cbfunc))
return true;
Log( LOG_CRIT, "Resolver: Could not register callback function: %s!", strerror(errno));
close(s->resolver_fd);
Resolve_Init(s);
return false;
}
GLOBAL bool
Resolve_Shutdown( RES_STAT *s)
{
bool ret = false;
assert(s != NULL);
assert(s->resolver_fd >= 0);
if (s->resolver_fd >= 0)
ret = io_close(s->resolver_fd);
Resolve_Init(s);
return ret;
}
/**
* Read result of resolver sub-process from pipe
*/
GLOBAL size_t
Resolve_Read( RES_STAT *s, void* readbuf, size_t buflen)
{
ssize_t bytes_read;
assert(buflen > 0);
/* Read result from pipe */
bytes_read = read(s->resolver_fd, readbuf, buflen);
if (bytes_read < 0) {
if (errno == EAGAIN)
return 0;
Log( LOG_CRIT, "Resolver: Can't read result: %s!", strerror(errno));
bytes_read = 0;
/* Allocate memory */
s = (RES_STAT *)malloc( sizeof( RES_STAT ));
if( ! s )
{
Log( LOG_EMERG, "Resolver: Can't allocate memory! [Resolve_Addr]" );
return NULL;
}
#ifdef DEBUG
else if (bytes_read == 0)
Log( LOG_DEBUG, "Resolver: Can't read result: EOF");
#endif
Resolve_Shutdown(s);
return (size_t)bytes_read;
}
/* -eof- */
/* Initialize pipe for result */
if( pipe( s->pipe ) != 0 )
{
free( s );
Log( LOG_ALERT, "Resolver: Can't create output pipe: %s!", strerror( errno ));
return NULL;
}
s->stage = 0;
s->bufpos = 0;
s->pid = -1;
return s;
} /* New_Res_Stat */
/* -eof- */

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: resolve.h,v 1.13 2006/05/10 21:24:02 alex Exp $
* $Id: resolve.h,v 1.8 2005/03/19 18:43:49 fw Exp $
*
* Asynchronous resolver (header)
*/
@@ -17,24 +17,39 @@
#ifndef __resolve_h__
#define __resolve_h__
#include "array.h"
#ifdef HAVE_SYS_SELECT_H
# include <sys/select.h>
#endif
#include <sys/types.h>
#include <netinet/in.h>
/* This struct must not be accessed directly */
typedef struct _Res_Stat {
pid_t pid; /* PID of resolver process */
int resolver_fd; /* pipe fd for lookup result. */
typedef struct _Res_Stat
{
int pid; /* PID des Child-Prozess */
int pipe[2]; /* Pipe fuer IPC */
int stage; /* Hostname/IP(0) or IDENT(1)? */
int bufpos; /* Position in buffer */
char buffer[HOST_LEN]; /* Buffer */
} RES_STAT;
#define Resolve_Getfd(x) ((x)->resolver_fd)
#define Resolve_INPROGRESS(x) ((x)->resolver_fd >= 0)
GLOBAL fd_set Resolver_FDs;
GLOBAL void Resolve_Init PARAMS(( void ));
#ifdef IDENTAUTH
GLOBAL RES_STAT *Resolve_Addr PARAMS(( struct sockaddr_in *Addr, int Sock ));
#else
GLOBAL RES_STAT *Resolve_Addr PARAMS(( struct sockaddr_in *Addr ));
#endif
GLOBAL RES_STAT *Resolve_Name PARAMS(( char *Host ));
GLOBAL bool Resolve_Addr PARAMS(( RES_STAT *s, struct sockaddr_in *Addr, int identsock, void (*cbfunc)(int, short)));
GLOBAL bool Resolve_Name PARAMS(( RES_STAT *s, const char *Host, void (*cbfunc)(int, short) ));
GLOBAL size_t Resolve_Read PARAMS(( RES_STAT *s, void *buf, size_t buflen));
GLOBAL void Resolve_Init PARAMS(( RES_STAT *s));
GLOBAL bool Resolve_Shutdown PARAMS(( RES_STAT *s));
#endif
/* -eof- */

View File

@@ -1,4 +0,0 @@
Makefile
Makefile.in
.deps
portabtest

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: portab.h,v 1.22 2005/07/31 20:13:11 alex Exp $
* $Id: portab.h,v 1.21 2005/04/16 09:23:01 fw Exp $
*
* Portability functions and declarations (header for libngbportab).
*/
@@ -65,6 +65,9 @@
#endif
/* keywords */
#define LOCAL static
/* datatypes */
#ifndef PROTOTYPES

View File

@@ -14,7 +14,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: portabtest.c,v 1.13 2005/07/31 20:13:11 alex Exp $";
static char UNUSED id[] = "$Id: portabtest.c,v 1.12 2005/03/19 18:43:50 fw Exp $";
#include "imp.h"
#include <stdarg.h>
@@ -25,7 +25,7 @@ static char UNUSED id[] = "$Id: portabtest.c,v 1.13 2005/07/31 20:13:11 alex Exp
#include "exp.h"
static void Panic PARAMS (( char *Reason, int Code ));
LOCAL void Panic PARAMS (( char *Reason, int Code ));
GLOBAL int
@@ -51,7 +51,7 @@ main( void )
} /* portab_check_types */
static void
LOCAL void
Panic( char *Reason, int Code )
{
/* Oops, something failed!? */

Some files were not shown because too many files have changed in this diff Show More