mirror of
https://github.com/osmarks/ngircd.git
synced 2025-09-23 20:54:02 +00:00
Compare commits
142 Commits
branch-0-1
...
branch-0-1
Author | SHA1 | Date | |
---|---|---|---|
![]() |
3b69da0c52 | ||
![]() |
04933f5b8b | ||
![]() |
45df522bcb | ||
![]() |
51260c2e9f | ||
![]() |
55865d7fc6 | ||
![]() |
082a92beef | ||
![]() |
e92c889580 | ||
![]() |
de4676f066 | ||
![]() |
64a98338d5 | ||
![]() |
f4709082fe | ||
![]() |
997abc6889 | ||
![]() |
b7047f2e3b | ||
![]() |
e990d96c61 | ||
![]() |
d986cd372f | ||
![]() |
762aec0e08 | ||
![]() |
f8cb8e3f20 | ||
![]() |
478a8c01f9 | ||
![]() |
61e6b5c0aa | ||
![]() |
91a6fffaa0 | ||
![]() |
2ce5b734bd | ||
![]() |
f99f9a8f02 | ||
![]() |
4715ccf9ca | ||
![]() |
8974e90552 | ||
![]() |
2fe13f0a45 | ||
![]() |
20ce56cc5b | ||
![]() |
47a0379e2b | ||
![]() |
37563537a9 | ||
![]() |
82d32ffb28 | ||
![]() |
024588dbe7 | ||
![]() |
47ca178a21 | ||
![]() |
12db0bdc4f | ||
![]() |
53b98fd7e9 | ||
![]() |
c7d4d85666 | ||
![]() |
4659dae6eb | ||
![]() |
68f896eee0 | ||
![]() |
06bfb3adfb | ||
![]() |
2f305331a1 | ||
![]() |
ad7361dfe0 | ||
![]() |
e47c9d750f | ||
![]() |
001c00b273 | ||
![]() |
b861f536b2 | ||
![]() |
877bcc55f2 | ||
![]() |
8f162f4e17 | ||
![]() |
089ca21b3d | ||
![]() |
137a139112 | ||
![]() |
b160f574de | ||
![]() |
d223b587e4 | ||
![]() |
77939c382d | ||
![]() |
f586052f2b | ||
![]() |
d4ed056147 | ||
![]() |
9021ea2070 | ||
![]() |
640367e886 | ||
![]() |
4b9e52eb4d | ||
![]() |
69081851ac | ||
![]() |
efcca62a35 | ||
![]() |
cd65e0a56e | ||
![]() |
2275add327 | ||
![]() |
fd1091541b | ||
![]() |
5675be4cd9 | ||
![]() |
f1486e6a53 | ||
![]() |
22a9ed6694 | ||
![]() |
ddf56cbe5f | ||
![]() |
255edf7eab | ||
![]() |
5930a29197 | ||
![]() |
07d8da60de | ||
![]() |
44afe042d1 | ||
![]() |
a073bc89c4 | ||
![]() |
63e89ceb21 | ||
![]() |
09416f36bf | ||
![]() |
508b55126f | ||
![]() |
9f65979979 | ||
![]() |
2e34ddae53 | ||
![]() |
09deb857ce | ||
![]() |
8c14d397ba | ||
![]() |
99eab1e216 | ||
![]() |
c93d089736 | ||
![]() |
429f85b77a | ||
![]() |
ea2a4b3370 | ||
![]() |
f9b9850662 | ||
![]() |
1b852fce72 | ||
![]() |
82aaffe55d | ||
![]() |
40199e0b56 | ||
![]() |
95b7dbcc18 | ||
![]() |
43f8d149bb | ||
![]() |
949a4ef793 | ||
![]() |
f74781647a | ||
![]() |
5c78230283 | ||
![]() |
ee568cc444 | ||
![]() |
2d9a3ec484 | ||
![]() |
262d945284 | ||
![]() |
f6ce2d557a | ||
![]() |
4243cae985 | ||
![]() |
40226d26b2 | ||
![]() |
d2f7d3087d | ||
![]() |
3f1e03edd9 | ||
![]() |
23e7f7f0dd | ||
![]() |
f36746a4d0 | ||
![]() |
8cb0e3af68 | ||
![]() |
eb3ddace46 | ||
![]() |
5040d56489 | ||
![]() |
fb0fbe908d | ||
![]() |
fa7bb2790a | ||
![]() |
5877bca4bc | ||
![]() |
37602d1523 | ||
![]() |
a09034563a | ||
![]() |
5b35b101f2 | ||
![]() |
058d3085a9 | ||
![]() |
74883f57da | ||
![]() |
018e351630 | ||
![]() |
6e105bf87e | ||
![]() |
61966a6088 | ||
![]() |
27c96632f1 | ||
![]() |
4108e16be6 | ||
![]() |
4e02bdc322 | ||
![]() |
ca5e09865e | ||
![]() |
fb0c7ad252 | ||
![]() |
d8950c5dd0 | ||
![]() |
257312b102 | ||
![]() |
27d947fb7d | ||
![]() |
bed98979dc | ||
![]() |
bddb4914b4 | ||
![]() |
4c6c6ecf0e | ||
![]() |
a2f5a05ff8 | ||
![]() |
639eb40035 | ||
![]() |
0d6f9d4e3e | ||
![]() |
147de9dfa9 | ||
![]() |
f6e729443e | ||
![]() |
e426c131c7 | ||
![]() |
b9661ae65d | ||
![]() |
035f7fb2fe | ||
![]() |
1b2c228de5 | ||
![]() |
4d7d1d23be | ||
![]() |
e2aacff7d4 | ||
![]() |
0eccdbc137 | ||
![]() |
939ee6a39b | ||
![]() |
8423b89996 | ||
![]() |
7d87318b04 | ||
![]() |
83caef4598 | ||
![]() |
7378860aea | ||
![]() |
6eb3f3055d | ||
![]() |
c888c81adf | ||
![]() |
fac4682212 |
7
.cvsignore
Normal file
7
.cvsignore
Normal file
@@ -0,0 +1,7 @@
|
||||
Makefile
|
||||
Makefile.in
|
||||
aclocal.m4
|
||||
autom4te.cache
|
||||
config.log
|
||||
config.status
|
||||
configure
|
12
AUTHORS
12
AUTHORS
@@ -1,7 +1,7 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001-2005 Alexander Barton,
|
||||
(c)2001-2007 Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd is free software and published under the
|
||||
@@ -10,9 +10,16 @@
|
||||
-- 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
|
||||
@@ -21,7 +28,6 @@ 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
|
||||
@@ -32,4 +38,4 @@ Andrew Tridgell & Martin Pool: strl{cpy|cat}()-functions
|
||||
|
||||
|
||||
--
|
||||
$Id: AUTHORS,v 1.11 2005/03/19 14:24:52 alex Exp $
|
||||
$Id: AUTHORS,v 1.13 2007/10/04 15:18:48 alex Exp $
|
||||
|
52
ChangeLog
52
ChangeLog
@@ -9,12 +9,56 @@
|
||||
|
||||
-- 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.
|
||||
|
||||
ngIRCd 0.10.3 (2007-07-31)
|
||||
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>.
|
||||
@@ -698,4 +742,4 @@ ngIRCd 0.0.1, 31.12.2001
|
||||
|
||||
|
||||
--
|
||||
$Id: ChangeLog,v 1.302.2.21 2008/01/07 20:57:39 alex Exp $
|
||||
$Id: ChangeLog,v 1.332.2.11 2008/02/26 20:35:05 alex Exp $
|
||||
|
4
INSTALL
4
INSTALL
@@ -1,7 +1,7 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001-2006 by Alexander Barton,
|
||||
(c)2001-2007 Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd is free software and published under the
|
||||
@@ -247,4 +247,4 @@ number. In both cases the server exits after the output.
|
||||
|
||||
|
||||
--
|
||||
$Id: INSTALL,v 1.23.2.2 2007/04/03 22:08:50 fw Exp $
|
||||
$Id: INSTALL,v 1.26 2007/04/08 11:39:08 alex Exp $
|
||||
|
18
NEWS
18
NEWS
@@ -1,7 +1,7 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001-2007 Alexander Barton,
|
||||
(c)2001-2008 Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd is free software and published under the
|
||||
@@ -10,6 +10,20 @@
|
||||
-- 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
|
||||
@@ -237,4 +251,4 @@ ngIRCd 0.0.1, 31.12.2001
|
||||
|
||||
|
||||
--
|
||||
$Id: NEWS,v 1.75.2.7 2007/06/08 09:05:23 alex Exp $
|
||||
$Id: NEWS,v 1.83.2.4 2008/02/26 19:22:07 alex Exp $
|
||||
|
8
README
8
README
@@ -37,7 +37,8 @@ Implemented IRC-commands are:
|
||||
ADMIN, AWAY, CHANINFO, CONNECT, DIE, DISCONNECT, ERROR, HELP, INVITE, ISON,
|
||||
JOIN, KICK, KILL, LINKS, LIST, LUSERS, MODE, MOTD, NAMES, NICK, NJOIN, NOTICE,
|
||||
OPER, PART, PASS, PING, PONG, PRIVMSG, QUIT, REHASH, RESTART, SERVER, SQUIT,
|
||||
STATS, TIME, TOPIC, TRACE, USER, USERHOST, VERSION, WHO, WHOIS, WHOWAS.
|
||||
STATS, TIME, TOPIC, TRACE, USER, USERHOST, VERSION, WALLOPS, WHO, WHOIS,
|
||||
WHOWAS.
|
||||
|
||||
|
||||
III. Features (or: why use ngIRCd?)
|
||||
@@ -82,8 +83,9 @@ 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 <alex@barton.de>.
|
||||
mail to the ngIRCd mailing list: <ngircd-ml@arthur.ath.cx> (please see
|
||||
<http://ngircd.barton.de/#ml> for details).
|
||||
|
||||
|
||||
--
|
||||
$Id: README,v 1.21.2.2 2007/05/05 20:25:20 alex Exp $
|
||||
$Id: README,v 1.25 2007/10/04 15:18:48 alex Exp $
|
||||
|
23
autogen.sh
23
autogen.sh
@@ -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.14 2005/02/21 15:23:23 alex Exp $
|
||||
# $Id: autogen.sh,v 1.15 2007/10/07 13:02:15 alex Exp $
|
||||
#
|
||||
|
||||
#
|
||||
@@ -124,17 +124,22 @@ if [ -z "$EXIST" ]; then
|
||||
fi
|
||||
[ "$VERBOSE" = "1" ] && echo "Using \"$EXIST\" to test for tools."
|
||||
|
||||
# We want to use GNU automake 1.7, if available (WANT_AUTOMAKE is used by
|
||||
# We want to use GNU automake 1.9, 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.
|
||||
AUTOMAKE_VERSION=1.7
|
||||
AUTOCONF_VERSION=2.59
|
||||
export AUTOMAKE_VERSION AUTOCONF_VERSION
|
||||
WANT_AUTOMAKE=1.7
|
||||
export WANT_AUTOMAKE
|
||||
# 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
|
||||
|
||||
# Try to detect the needed tools when no environment variable already
|
||||
# spezifies one:
|
||||
# specifies one:
|
||||
echo "Searching tools ..."
|
||||
[ -z "$ACLOCAL" ] && ACLOCAL=`Search aclocal 1`
|
||||
[ "$VERBOSE" = "1" ] && echo "ACLOCAL=$ACLOCAL"
|
||||
|
@@ -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.118.2.14 2008/01/07 20:57:39 alex Exp $
|
||||
# $Id: configure.in,v 1.125.2.4 2008/02/26 19:37:34 alex Exp $
|
||||
#
|
||||
|
||||
# -- Initialisation --
|
||||
|
||||
AC_PREREQ(2.50)
|
||||
AC_INIT(ngircd, 0.10.4)
|
||||
AC_INIT(ngircd, 0.11.1)
|
||||
AC_CONFIG_SRCDIR(src/ngircd/ngircd.c)
|
||||
AC_CANONICAL_TARGET
|
||||
AM_INIT_AUTOMAKE(1.6)
|
||||
|
2
contrib/.cvsignore
Normal file
2
contrib/.cvsignore
Normal file
@@ -0,0 +1,2 @@
|
||||
Makefile
|
||||
Makefile.in
|
2
contrib/Debian/.cvsignore
Normal file
2
contrib/Debian/.cvsignore
Normal file
@@ -0,0 +1,2 @@
|
||||
Makefile
|
||||
Makefile.in
|
@@ -1,27 +1,33 @@
|
||||
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.3-0ab1) unstable; urgency=high
|
||||
|
||||
* New "upstream" release: 0.10.3 - fixing a security bug.
|
||||
|
||||
-- Alexander Barton <alex@barton.de> Tue, 31 Jul 2007 21:02:52 +0200
|
||||
|
||||
ngircd (0.10.2-0ab1) unstable; urgency=low
|
||||
|
||||
* New "upstream" release: 0.10.2
|
||||
|
||||
-- Alexander Barton <alex@barton.de> Fri, 8 Jun 2007 10:49:36 +0200
|
||||
|
||||
ngircd (0.10.1-0ab1) unstable; urgency=low
|
||||
|
||||
* New "upstream" release: 0.10.1
|
||||
|
||||
-- Alexander Barton <alex@barton.de> Sun, 17 Dec 2006 14:52:06 +0100
|
||||
|
||||
ngircd (0.10.0-0ab1) unstable; urgency=low
|
||||
|
||||
* New "upstream" release: 0.10.0
|
||||
|
@@ -2,7 +2,7 @@
|
||||
#
|
||||
# ngIRCd start and stop script for Debian-based systems
|
||||
#
|
||||
# $Id: ngircd.init,v 1.6.2.1 2007/04/03 22:08:50 fw Exp $
|
||||
# $Id: ngircd.init,v 1.7 2006/12/26 14:43:46 alex Exp $
|
||||
#
|
||||
|
||||
### BEGIN INIT INFO
|
||||
|
@@ -1,13 +1,20 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Debian post-installation script
|
||||
# $Id: ngircd.postinst,v 1.1 2003/12/31 17:20:11 alex Exp $
|
||||
# $Id: ngircd.postinst,v 1.2 2006/12/26 14:44:40 alex Exp $
|
||||
#
|
||||
|
||||
if [ -f /etc/ngircd/ngircd.conf ]; then
|
||||
# make sure that configuration file is not world readable
|
||||
chmod o= /etc/ngircd/ngircd.conf
|
||||
fi
|
||||
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
|
||||
|
||||
#DEBHELPER#
|
||||
|
||||
|
2
contrib/MacOSX/.cvsignore
Normal file
2
contrib/MacOSX/.cvsignore
Normal file
@@ -0,0 +1,2 @@
|
||||
Makefile
|
||||
Makefile.in
|
92
contrib/MacOSX/config.h
Normal file
92
contrib/MacOSX/config.h
Normal file
@@ -0,0 +1,92 @@
|
||||
/*
|
||||
* 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- */
|
0
contrib/MacOSX/cvs-version.h
Normal file
0
contrib/MacOSX/cvs-version.h
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
%define name ngircd
|
||||
%define version 0.10.4
|
||||
%define version 0.11.1
|
||||
%define release 1
|
||||
%define prefix %{_prefix}
|
||||
|
||||
|
2
doc/.cvsignore
Normal file
2
doc/.cvsignore
Normal file
@@ -0,0 +1,2 @@
|
||||
Makefile
|
||||
Makefile.in
|
@@ -54,4 +54,4 @@ repository would be handy, please contact Alex Barton, <alex@barton.de>.
|
||||
|
||||
|
||||
--
|
||||
$Id: CVS.txt,v 1.8.2.1 2006/08/02 09:04:20 alex Exp $
|
||||
$Id: CVS.txt,v 1.9 2006/08/03 14:37:29 alex Exp $
|
||||
|
11
doc/FAQ.txt
11
doc/FAQ.txt
@@ -62,15 +62,6 @@ A: On Linux/glibc with chroot enabled you need to put some libraries inside
|
||||
is to either disable chroot support or to link against dietlibc instead
|
||||
of glibc. (tnx to Sebastian Siewior)
|
||||
|
||||
Q: I am running Linux and ngircd dies on startup with the follwing errors:
|
||||
IO subsystem: epoll (hint size 100, initial maxfd 100, masterfd -1).
|
||||
Cannot initialize IO routines: Function not implemented
|
||||
Server isn't listening on a single port!
|
||||
ngircd exiting due to fatal errors!
|
||||
A: epoll is only supported on 2.6 Linux kernels. Either use a 2.6 kernel, or
|
||||
re-run configure with the --without-epoll parameter. After configure
|
||||
completed, you should see select() being listed as IO backend:
|
||||
'(I/O backend: "select()"').
|
||||
|
||||
IV. Bugs!?
|
||||
~~~~~~~~~~
|
||||
@@ -85,4 +76,4 @@ A: Please file a bug report at <http://ngircd.barton.de/bugzilla/index.cgi>!
|
||||
|
||||
|
||||
--
|
||||
$Id: FAQ.txt,v 1.11 2005/12/09 21:14:56 fw Exp $
|
||||
$Id: FAQ.txt,v 1.11.4.1 2008/01/02 22:36:48 fw Exp $
|
||||
|
@@ -1,6 +1,6 @@
|
||||
#
|
||||
# ngIRCd -- The Next Generation IRC Daemon
|
||||
# Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
|
||||
# Copyright (c)2001-2007 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,13 +9,13 @@
|
||||
# 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.21 2005/11/29 20:59:57 alex Exp $
|
||||
# $Id: Makefile.am,v 1.22 2007/11/20 21:39:35 alex Exp $
|
||||
#
|
||||
|
||||
SUBDIRS = src
|
||||
|
||||
EXTRA_DIST = CVS.txt FAQ.txt Protocol.txt Platforms.txt README-AUX.txt \
|
||||
README-BeOS.txt RFC.txt Zeroconf.txt sample-ngircd.conf
|
||||
README-BeOS.txt RFC.txt SSL.txt Zeroconf.txt sample-ngircd.conf
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -f Makefile Makefile.in
|
||||
|
@@ -74,4 +74,4 @@ Notes
|
||||
(3) Using the kqueue() IO interface.
|
||||
|
||||
--
|
||||
$Id: Platforms.txt,v 1.14.2.2 2007/04/03 22:08:51 fw Exp $
|
||||
$Id: Platforms.txt,v 1.18 2006/10/08 14:09:16 alex Exp $
|
||||
|
@@ -1,7 +1,7 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001-2003 by Alexander Barton,
|
||||
(c)2001-2007 Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd is free software and published under the
|
||||
@@ -79,6 +79,9 @@ 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.
|
||||
|
||||
@@ -90,7 +93,50 @@ The optional parameter <options> is used to propagate server options as
|
||||
defined in RFC 2813, section 4.1.1.
|
||||
|
||||
|
||||
II.2 Exchange channel-modes, topics, and persistent channels
|
||||
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
|
||||
|
||||
Command: CHANINFO
|
||||
Parameters: <channel> +<modes> <key> <limit> [<topic>]
|
||||
@@ -115,4 +161,4 @@ channel mode). In this case <limit> should be "0".
|
||||
|
||||
|
||||
--
|
||||
$Id: Protocol.txt,v 1.13 2005/08/27 19:00:06 alex Exp $
|
||||
$Id: Protocol.txt,v 1.14 2007/11/21 12:16:35 alex Exp $
|
||||
|
@@ -37,4 +37,4 @@ Links:
|
||||
|
||||
|
||||
--
|
||||
$Id: Zeroconf.txt,v 1.1.2.1 2006/08/02 09:04:20 alex Exp $
|
||||
$Id: Zeroconf.txt,v 1.2 2006/08/03 14:37:29 alex Exp $
|
||||
|
@@ -1,4 +1,4 @@
|
||||
# $Id: sample-ngircd.conf,v 1.37.2.2 2007/04/03 22:08:51 fw Exp $
|
||||
# $Id: sample-ngircd.conf,v 1.43.2.1 2008/01/07 23:10:28 alex Exp $
|
||||
|
||||
#
|
||||
# This is a sample configuration file for the ngIRCd, which must be adepted
|
||||
@@ -6,6 +6,10 @@
|
||||
#
|
||||
# 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!
|
||||
#
|
||||
@@ -96,17 +100,25 @@
|
||||
# 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 = -1
|
||||
# to accept (0: unlimited):
|
||||
;MaxConnections = 0
|
||||
|
||||
# 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.
|
||||
@@ -145,6 +157,10 @@
|
||||
# this server should establish the connection).
|
||||
;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
|
||||
@@ -160,6 +176,13 @@
|
||||
# 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 ...
|
||||
|
||||
|
3
doc/src/.cvsignore
Normal file
3
doc/src/.cvsignore
Normal file
@@ -0,0 +1,3 @@
|
||||
Makefile
|
||||
Makefile.in
|
||||
html
|
@@ -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.2.2.1 2007/04/03 22:08:52 fw Exp $
|
||||
# $Id: Makefile.am,v 1.3 2006/12/28 14:04:28 alex Exp $
|
||||
#
|
||||
|
||||
maintainer-clean-local:
|
||||
|
4
man/.cvsignore
Normal file
4
man/.cvsignore
Normal file
@@ -0,0 +1,4 @@
|
||||
Makefile
|
||||
Makefile.in
|
||||
ngircd.8
|
||||
ngircd.conf.5
|
@@ -9,12 +9,25 @@
|
||||
# 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.5 2002/04/04 13:02:41 alex Exp $
|
||||
# $Id: Makefile.am,v 1.6 2006/12/25 16:13:26 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
|
||||
|
||||
EXTRA_DIST = $(man_MANS)
|
||||
CLEANFILES = $(man_MANS)
|
||||
|
||||
EXTRA_DIST = $(TEMPLATE_MANS)
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -f Makefile Makefile.in
|
||||
|
@@ -1,5 +1,5 @@
|
||||
.\"
|
||||
.\" $Id: ngircd.8,v 1.11 2005/08/12 13:20:54 alex Exp $
|
||||
.\" $Id: ngircd.8.tmpl,v 1.2 2007/11/15 01:03:29 fw Exp $
|
||||
.\"
|
||||
.TH ngircd 8 "August 2005" ngircd "ngIRCd Manual"
|
||||
.SH NAME
|
||||
@@ -23,7 +23,8 @@ 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.
|
||||
systems as well. By default, ngIRCd writes diagnostic and informational messages using
|
||||
the syslog mechanism.
|
||||
.SH OPTIONS
|
||||
The default behaviour of
|
||||
.BR ngircd
|
||||
@@ -55,11 +56,11 @@ Output version information and exit.
|
||||
\fB\-\-help\fR
|
||||
Display a brief help text and exit.
|
||||
.SH FILES
|
||||
.I /usr/local/etc/ngircd.conf
|
||||
.I :ETCDIR:/ngircd.conf
|
||||
.RS
|
||||
The system wide default configuration file.
|
||||
.RE
|
||||
.I /usr/local/etc/ngircd.motd
|
||||
.I :ETCDIR:/ngircd.motd
|
||||
.RS
|
||||
Default "message of the day" (MOTD).
|
||||
.RE
|
@@ -1,11 +1,11 @@
|
||||
.\"
|
||||
.\" $Id: ngircd.conf.5,v 1.20.2.1 2006/12/11 22:08:14 fw Exp $
|
||||
.\" $Id: ngircd.conf.5.tmpl,v 1.7 2007/11/23 16:26:03 fw Exp $
|
||||
.\"
|
||||
.TH ngircd.conf 5 "August 2005" ngircd "ngIRCd Manual"
|
||||
.SH NAME
|
||||
ngircd.conf \- configuration file of ngIRCd
|
||||
.SH SYNOPSIS
|
||||
.B /usr/local/etc/ngircd.conf
|
||||
.B :ETCDIR:/ngircd.conf
|
||||
.SH DESCRIPTION
|
||||
.BR ngircd.conf
|
||||
is the configuration file of the
|
||||
@@ -150,19 +150,31 @@ by non-chanops as if they were coming from the server. Default: no.
|
||||
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: -1.
|
||||
(0: unlimited). Default: 0.
|
||||
.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
|
||||
@@ -200,6 +212,10 @@ 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.
|
||||
@@ -214,6 +230,9 @@ 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]
|
||||
@@ -235,6 +254,12 @@ 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
|
5
src/.cvsignore
Normal file
5
src/.cvsignore
Normal file
@@ -0,0 +1,5 @@
|
||||
Makefile
|
||||
Makefile.in
|
||||
config.h
|
||||
config.h.in
|
||||
stamp-h1
|
8
src/ngircd/.cvsignore
Normal file
8
src/ngircd/.cvsignore
Normal file
@@ -0,0 +1,8 @@
|
||||
Makefile
|
||||
Makefile.in
|
||||
.deps
|
||||
check-help
|
||||
check-version
|
||||
cvs-version.h
|
||||
cvs-version.new
|
||||
ngircd
|
@@ -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.49 2006/03/11 01:48:50 alex Exp $
|
||||
# $Id: Makefile.am,v 1.50 2007/11/21 12:16:36 alex Exp $
|
||||
#
|
||||
|
||||
AUTOMAKE_OPTIONS = ../portab/ansi2knr
|
||||
@@ -23,7 +23,7 @@ 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 parse.c rendezvous.c resolve.c
|
||||
match.c numeric.c parse.c rendezvous.c resolve.c
|
||||
|
||||
ngircd_LDFLAGS = -L../portab -L../tool
|
||||
|
||||
@@ -32,7 +32,7 @@ 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 parse.h rendezvous.h resolve.h \
|
||||
match.h numeric.h parse.h rendezvous.h resolve.h \
|
||||
defines.h messages.h
|
||||
|
||||
clean-local:
|
||||
|
@@ -12,7 +12,7 @@
|
||||
|
||||
#include "array.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: array.c,v 1.11.2.3 2007/04/03 22:08:52 fw Exp $";
|
||||
static char UNUSED id[] = "$Id: array.c,v 1.15 2007/11/18 15:05:35 alex Exp $";
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
@@ -28,9 +28,9 @@ static char UNUSED id[] = "$Id: array.c,v 1.11.2.3 2007/04/03 22:08:52 fw Exp $"
|
||||
|
||||
#define array_UNUSABLE(x) ( !(x)->mem || (0 == (x)->allocated) )
|
||||
|
||||
#define ALIGN_32U(x) (((x)+31U ) & ~(31U))
|
||||
#define ALIGN_1024U(x) (((x)+1023U) & ~(1023U))
|
||||
#define ALIGN_4096U(x) (((x)+4095U) & ~(4095U))
|
||||
#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
|
||||
|
@@ -17,7 +17,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: channel.c,v 1.56.2.4 2007/07/31 20:48:15 alex Exp $";
|
||||
static char UNUSED id[] = "$Id: channel.c,v 1.63 2007/06/11 20:06:46 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
|
@@ -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.29.2.2 2007/04/03 20:23:31 fw Exp $
|
||||
* $Id: channel.h,v 1.33 2006/12/07 22:23:39 fw Exp $
|
||||
*
|
||||
* Channel management (header)
|
||||
*/
|
||||
|
@@ -17,7 +17,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: client.c,v 1.91.2.2 2007/04/03 22:08:52 fw Exp $";
|
||||
static char UNUSED id[] = "$Id: client.c,v 1.97 2007/11/21 12:16:36 alex Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
@@ -94,9 +94,10 @@ Client_Init( void )
|
||||
This_Server->hops = 0;
|
||||
|
||||
gethostname( This_Server->host, CLIENT_HOST_LEN );
|
||||
h = gethostbyname( This_Server->host );
|
||||
if( h ) strlcpy( This_Server->host, h->h_name, sizeof( This_Server->host ));
|
||||
|
||||
if (!Conf_NoDNS) {
|
||||
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 );
|
||||
|
||||
@@ -608,7 +609,8 @@ Client_ID( CLIENT *Client )
|
||||
assert( Client != NULL );
|
||||
|
||||
#ifdef DEBUG
|
||||
if( Client->type == CLIENT_USER ) assert( strlen( Client->id ) < CLIENT_NICK_LEN );
|
||||
if(Client->type == CLIENT_USER)
|
||||
assert(strlen(Client->id) < Conf_MaxNickLength);
|
||||
#endif
|
||||
|
||||
if( Client->id[0] ) return Client->id;
|
||||
@@ -951,7 +953,7 @@ Client_IsValidNick( const char *Nick )
|
||||
|
||||
if( Nick[0] == '#' ) return false;
|
||||
if( strchr( goodchars, Nick[0] )) return false;
|
||||
if( strlen( Nick ) >= CLIENT_NICK_LEN ) return false;
|
||||
if( strlen( Nick ) >= Conf_MaxNickLength) return false;
|
||||
|
||||
ptr = Nick;
|
||||
while( *ptr )
|
||||
|
@@ -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.42.2.3 2007/04/03 22:08:52 fw Exp $
|
||||
* $Id: client.h,v 1.46 2007/01/23 16:07:19 alex Exp $
|
||||
*
|
||||
* Client management (header)
|
||||
*/
|
||||
|
@@ -14,7 +14,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: conf.c,v 1.92.2.4 2007/04/03 22:08:52 fw Exp $";
|
||||
static char UNUSED id[] = "$Id: conf.c,v 1.103 2007/11/23 16:26:04 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
@@ -205,9 +205,11 @@ Conf_Test( void )
|
||||
printf( " OperCanUseMode = %s\n", Conf_OperCanMode == true ? "yes" : "no" );
|
||||
printf( " OperServerMode = %s\n", Conf_OperServerMode == true? "yes" : "no" );
|
||||
printf( " PredefChannelsOnly = %s\n", Conf_PredefChannelsOnly == true ? "yes" : "no" );
|
||||
printf( " MaxConnections = %ld\n", Conf_MaxConnections>0 ? Conf_MaxConnections : -1);
|
||||
printf( " MaxConnectionsIP = %d\n", Conf_MaxConnectionsIP>0 ? Conf_MaxConnectionsIP : -1);
|
||||
printf( " MaxJoins = %d\n\n", Conf_MaxJoins>0 ? Conf_MaxJoins : -1);
|
||||
printf( " NoDNS = %s\n", Conf_NoDNS ? "yes" : "no");
|
||||
printf( " MaxConnections = %ld\n", Conf_MaxConnections);
|
||||
printf( " MaxConnectionsIP = %d\n", Conf_MaxConnectionsIP);
|
||||
printf( " MaxJoins = %d\n", Conf_MaxJoins>0 ? Conf_MaxJoins : -1);
|
||||
printf( " MaxNickLength = %u\n\n", Conf_MaxNickLength - 1);
|
||||
|
||||
for( i = 0; i < Conf_Oper_Count; i++ ) {
|
||||
if( ! Conf_Oper[i].name[0] ) continue;
|
||||
@@ -230,7 +232,8 @@ Conf_Test( void )
|
||||
printf( " Port = %u\n", (unsigned int)Conf_Server[i].port );
|
||||
printf( " MyPassword = %s\n", Conf_Server[i].pwd_in );
|
||||
printf( " PeerPassword = %s\n", Conf_Server[i].pwd_out );
|
||||
printf( " Group = %d\n\n", Conf_Server[i].group );
|
||||
printf( " Group = %d\n", Conf_Server[i].group );
|
||||
printf( " Passive = %s\n\n", Conf_Server[i].flags & CONF_SFLAG_DISABLED ? "yes" : "no");
|
||||
}
|
||||
|
||||
for( i = 0; i < Conf_Channel_Count; i++ ) {
|
||||
@@ -336,6 +339,24 @@ Conf_EnableServer( char *Name, UINT16 Port )
|
||||
} /* Conf_EnableServer */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
Conf_EnablePassiveServer(const char *Name)
|
||||
{
|
||||
/* Enable specified server */
|
||||
int i;
|
||||
|
||||
assert( Name != NULL );
|
||||
for (i = 0; i < MAX_SERVERS; i++) {
|
||||
if ((strcasecmp( Conf_Server[i].name, Name ) == 0) && (Conf_Server[i].port > 0)) {
|
||||
/* BINGO! Enable server */
|
||||
Conf_Server[i].flags &= ~CONF_SFLAG_DISABLED;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
} /* Conf_EnablePassiveServer */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
Conf_DisableServer( char *Name )
|
||||
{
|
||||
@@ -425,12 +446,14 @@ Set_Defaults( bool InitServers )
|
||||
Conf_Channel_Count = 0;
|
||||
|
||||
Conf_OperCanMode = false;
|
||||
Conf_NoDNS = false;
|
||||
Conf_PredefChannelsOnly = false;
|
||||
Conf_OperServerMode = false;
|
||||
|
||||
Conf_MaxConnections = -1;
|
||||
Conf_MaxConnections = 0;
|
||||
Conf_MaxConnectionsIP = 5;
|
||||
Conf_MaxJoins = 10;
|
||||
Conf_MaxNickLength = CLIENT_NICK_LEN_DEFAULT;
|
||||
|
||||
/* Initialize server configuration structures */
|
||||
if( InitServers ) for( i = 0; i < MAX_SERVERS; Init_Server_Struct( &Conf_Server[i++] ));
|
||||
@@ -617,6 +640,27 @@ Check_ArgIsTrue( const char *Arg )
|
||||
} /* Check_ArgIsTrue */
|
||||
|
||||
|
||||
static unsigned int Handle_MaxNickLength(int Line, const char *Arg)
|
||||
{
|
||||
unsigned new;
|
||||
|
||||
new = (unsigned) atoi(Arg) + 1;
|
||||
if (new > CLIENT_NICK_LEN) {
|
||||
Config_Error(LOG_WARNING,
|
||||
"%s, line %d: Value of \"MaxNickLength\" exceeds %u!",
|
||||
NGIRCd_ConfFile, Line, CLIENT_NICK_LEN - 1);
|
||||
return CLIENT_NICK_LEN;
|
||||
}
|
||||
if (new < 2) {
|
||||
Config_Error(LOG_WARNING,
|
||||
"%s, line %d: Value of \"MaxNickLength\" must be at least 1!",
|
||||
NGIRCd_ConfFile, Line);
|
||||
return 2;
|
||||
}
|
||||
return new;
|
||||
} /* Handle_MaxNickLength */
|
||||
|
||||
|
||||
static void
|
||||
Handle_GLOBAL( int Line, char *Var, char *Arg )
|
||||
{
|
||||
@@ -764,6 +808,11 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
|
||||
Conf_PredefChannelsOnly = Check_ArgIsTrue( Arg );
|
||||
return;
|
||||
}
|
||||
if( strcasecmp( Var, "NoDNS" ) == 0 ) {
|
||||
/* don't do reverse dns lookups when clients connect? */
|
||||
Conf_NoDNS = Check_ArgIsTrue( Arg );
|
||||
return;
|
||||
}
|
||||
if( strcasecmp( Var, "OperCanUseMode" ) == 0 ) {
|
||||
/* Are IRC operators allowed to use MODE in channels they aren't Op in? */
|
||||
Conf_OperCanMode = Check_ArgIsTrue( Arg );
|
||||
@@ -775,7 +824,7 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
|
||||
return;
|
||||
}
|
||||
if( strcasecmp( Var, "MaxConnections" ) == 0 ) {
|
||||
/* Maximum number of connections. Values <= 0 are equal to "no limit". */
|
||||
/* Maximum number of connections. 0 -> "no limit". */
|
||||
#ifdef HAVE_ISDIGIT
|
||||
if( ! isdigit( (int)*Arg )) Config_Error_NaN( Line, Var);
|
||||
else
|
||||
@@ -784,7 +833,7 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
|
||||
return;
|
||||
}
|
||||
if( strcasecmp( Var, "MaxConnectionsIP" ) == 0 ) {
|
||||
/* Maximum number of simultaneous connections from one IP. Values <= 0 -> "no limit" */
|
||||
/* Maximum number of simultaneous connections from one IP. 0 -> "no limit" */
|
||||
#ifdef HAVE_ISDIGIT
|
||||
if( ! isdigit( (int)*Arg )) Config_Error_NaN( Line, Var );
|
||||
else
|
||||
@@ -793,7 +842,7 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
|
||||
return;
|
||||
}
|
||||
if( strcasecmp( Var, "MaxJoins" ) == 0 ) {
|
||||
/* Maximum number of channels a user can join. Values <= 0 are equal to "no limit". */
|
||||
/* Maximum number of channels a user can join. 0 -> "no limit". */
|
||||
#ifdef HAVE_ISDIGIT
|
||||
if( ! isdigit( (int)*Arg )) Config_Error_NaN( Line, Var );
|
||||
else
|
||||
@@ -801,6 +850,13 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
|
||||
Conf_MaxJoins = atoi( Arg );
|
||||
return;
|
||||
}
|
||||
if( strcasecmp( Var, "MaxNickLength" ) == 0 ) {
|
||||
/* Maximum length of a nick name; must be same on all servers
|
||||
* within the IRC network! */
|
||||
Conf_MaxNickLength = Handle_MaxNickLength(Line, Arg);
|
||||
return;
|
||||
}
|
||||
|
||||
if( strcasecmp( Var, "Listen" ) == 0 ) {
|
||||
/* IP-Address to bind sockets */
|
||||
len = strlcpy( Conf_ListenAddress, Arg, sizeof( Conf_ListenAddress ));
|
||||
@@ -881,6 +937,14 @@ Handle_SERVER( int Line, char *Var, char *Arg )
|
||||
Config_Error_TooLong( Line, Var );
|
||||
return;
|
||||
}
|
||||
if (strcasecmp(Var, "Bind") == 0) {
|
||||
if (ngt_IPStrToBin(Arg, &New_Server.bind_addr))
|
||||
return;
|
||||
|
||||
Config_Error(LOG_ERR, "%s, line %d (section \"Server\"): Can't parse IP address \"%s\"",
|
||||
NGIRCd_ConfFile, Line, Arg);
|
||||
return;
|
||||
}
|
||||
if( strcasecmp( Var, "MyPassword" ) == 0 ) {
|
||||
/* Password of this server which is sent to the peer */
|
||||
if (*Arg == ':') {
|
||||
@@ -920,6 +984,11 @@ Handle_SERVER( int Line, char *Var, char *Arg )
|
||||
New_Server.group = atoi( Arg );
|
||||
return;
|
||||
}
|
||||
if( strcasecmp( Var, "Passive" ) == 0 ) {
|
||||
if (Check_ArgIsTrue(Arg))
|
||||
New_Server.flags |= CONF_SFLAG_DISABLED;
|
||||
return;
|
||||
}
|
||||
|
||||
Config_Error( LOG_ERR, "%s, line %d (section \"Server\"): Unknown variable \"%s\"!",
|
||||
NGIRCd_ConfFile, Line, Var );
|
||||
@@ -1144,6 +1213,7 @@ Init_Server_Struct( CONF_SERVER *Server )
|
||||
|
||||
Resolve_Init(&Server->res_stat);
|
||||
Server->conn_id = NONE;
|
||||
Server->bind_addr.s_addr = htonl(INADDR_ANY);
|
||||
} /* Init_Server_Struct */
|
||||
|
||||
|
||||
|
@@ -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.40.2.2 2007/04/03 22:08:52 fw Exp $
|
||||
* $Id: conf.h,v 1.47 2007/11/23 16:28:37 fw Exp $
|
||||
*
|
||||
* Configuration management (header)
|
||||
*/
|
||||
@@ -33,7 +33,6 @@ 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 */
|
||||
@@ -43,6 +42,7 @@ typedef struct _Conf_Server
|
||||
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
|
||||
@@ -118,6 +118,9 @@ GLOBAL bool Conf_PredefChannelsOnly;
|
||||
/* 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 */
|
||||
@@ -132,6 +135,8 @@ 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));
|
||||
@@ -142,6 +147,7 @@ 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 ));
|
||||
|
||||
|
@@ -16,7 +16,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: conn-func.c,v 1.10 2006/05/10 21:24:01 alex Exp $";
|
||||
static char UNUSED id[] = "$Id: conn-func.c,v 1.11 2007/10/04 15:03:56 alex Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
@@ -39,6 +39,16 @@ 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 )
|
||||
{
|
||||
|
@@ -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.5.2.1 2007/04/03 22:08:52 fw Exp $
|
||||
* $Id: conn-func.h,v 1.7 2007/10/04 15:03:56 alex Exp $
|
||||
*
|
||||
* Connection management: Global functions (header)
|
||||
*/
|
||||
@@ -27,6 +27,7 @@
|
||||
|
||||
|
||||
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 ));
|
||||
|
@@ -22,7 +22,7 @@
|
||||
/* enable more zlib related debug messages: */
|
||||
/* #define DEBUG_ZLIB */
|
||||
|
||||
static char UNUSED id[] = "$Id: conn-zip.c,v 1.11.2.1 2007/05/18 22:11:19 alex Exp $";
|
||||
static char UNUSED id[] = "$Id: conn-zip.c,v 1.16 2007/05/17 23:34:24 alex Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
|
@@ -17,7 +17,7 @@
|
||||
#include "portab.h"
|
||||
#include "io.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: conn.c,v 1.198.2.6 2007/05/18 22:11:19 alex Exp $";
|
||||
static char UNUSED id[] = "$Id: conn.c,v 1.220 2007/12/13 01:30:16 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
@@ -41,12 +41,6 @@ static char UNUSED id[] = "$Id: conn.c,v 1.198.2.6 2007/05/18 22:11:19 alex Exp
|
||||
# include <netinet/ip.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_ARPA_INET_H
|
||||
# include <arpa/inet.h>
|
||||
#else
|
||||
# define PF_INET AF_INET
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STDINT_H
|
||||
# include <stdint.h> /* e.g. for Mac OS X */
|
||||
#endif
|
||||
@@ -92,7 +86,7 @@ static void Check_Connections PARAMS(( void ));
|
||||
static void Check_Servers PARAMS(( void ));
|
||||
static void Init_Conn_Struct PARAMS(( CONN_ID Idx ));
|
||||
static bool Init_Socket PARAMS(( int Sock ));
|
||||
static void New_Server PARAMS(( int Server ));
|
||||
static void New_Server PARAMS(( int Server, struct in_addr *dest));
|
||||
static void Simple_Message PARAMS(( int Sock, const char *Msg ));
|
||||
static int Count_Connections PARAMS(( struct sockaddr_in addr ));
|
||||
static int NewListener PARAMS(( const UINT16 Port ));
|
||||
@@ -260,10 +254,10 @@ Conn_Exit( void )
|
||||
} /* Conn_Exit */
|
||||
|
||||
|
||||
static int
|
||||
static unsigned int
|
||||
ports_initlisteners(array *a, void (*func)(int,short))
|
||||
{
|
||||
int created = 0;
|
||||
unsigned int created = 0;
|
||||
size_t len;
|
||||
int fd;
|
||||
UINT16 *port;
|
||||
@@ -291,12 +285,12 @@ ports_initlisteners(array *a, void (*func)(int,short))
|
||||
}
|
||||
|
||||
|
||||
GLOBAL int
|
||||
GLOBAL unsigned int
|
||||
Conn_InitListeners( void )
|
||||
{
|
||||
/* Initialize ports on which the server should accept connections */
|
||||
|
||||
int created;
|
||||
unsigned int created;
|
||||
|
||||
if (!io_library_init(CONNECTION_POOL)) {
|
||||
Log(LOG_EMERG, "Cannot initialize IO routines: %s", strerror(errno));
|
||||
@@ -333,6 +327,42 @@ Conn_ExitListeners( void )
|
||||
} /* Conn_ExitListeners */
|
||||
|
||||
|
||||
static void
|
||||
InitSinaddr(struct sockaddr_in *addr, UINT16 Port)
|
||||
{
|
||||
struct in_addr inaddr;
|
||||
|
||||
memset(addr, 0, sizeof(*addr));
|
||||
memset( &inaddr, 0, sizeof(inaddr));
|
||||
|
||||
addr->sin_family = AF_INET;
|
||||
addr->sin_port = htons(Port);
|
||||
inaddr.s_addr = htonl(INADDR_ANY);
|
||||
addr->sin_addr = inaddr;
|
||||
}
|
||||
|
||||
|
||||
static bool
|
||||
InitSinaddrListenAddr(struct sockaddr_in *addr, UINT16 Port)
|
||||
{
|
||||
struct in_addr inaddr;
|
||||
|
||||
InitSinaddr(addr, Port);
|
||||
|
||||
if (!Conf_ListenAddress[0])
|
||||
return true;
|
||||
|
||||
if (!ngt_IPStrToBin(Conf_ListenAddress, &inaddr)) {
|
||||
Log( LOG_CRIT, "Can't bind to %s:%u: can't convert ip address \"%s\"",
|
||||
Conf_ListenAddress, Port, Conf_ListenAddress);
|
||||
return false;
|
||||
}
|
||||
|
||||
addr->sin_addr = inaddr;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/* return new listening port file descriptor or -1 on failure */
|
||||
static int
|
||||
NewListener( const UINT16 Port )
|
||||
@@ -340,33 +370,15 @@ NewListener( const UINT16 Port )
|
||||
/* Create new listening socket on specified port */
|
||||
|
||||
struct sockaddr_in addr;
|
||||
struct in_addr inaddr;
|
||||
int sock;
|
||||
#ifdef ZEROCONF
|
||||
char name[CLIENT_ID_LEN], *info;
|
||||
#endif
|
||||
|
||||
/* Server-"Listen"-Socket initialisieren */
|
||||
memset( &addr, 0, sizeof( addr ));
|
||||
memset( &inaddr, 0, sizeof( inaddr ));
|
||||
addr.sin_family = (sa_family_t)AF_INET;
|
||||
InitSinaddrListenAddr(&addr, Port);
|
||||
|
||||
addr.sin_family = AF_INET;
|
||||
addr.sin_port = htons( Port );
|
||||
if( Conf_ListenAddress[0] )
|
||||
{
|
||||
#ifdef HAVE_INET_ATON
|
||||
if( inet_aton( Conf_ListenAddress, &inaddr ) == 0 )
|
||||
#else
|
||||
inaddr.s_addr = inet_addr( Conf_ListenAddress );
|
||||
if( inaddr.s_addr == (unsigned)-1 )
|
||||
#endif
|
||||
{
|
||||
Log( LOG_CRIT, "Can't listen on %s:%u: can't convert ip address %s!",
|
||||
Conf_ListenAddress, Port, Conf_ListenAddress );
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else inaddr.s_addr = htonl( INADDR_ANY );
|
||||
addr.sin_addr = inaddr;
|
||||
|
||||
sock = socket( PF_INET, SOCK_STREAM, 0);
|
||||
if( sock < 0 ) {
|
||||
@@ -1039,11 +1051,11 @@ New_Connection( int Sock )
|
||||
|
||||
Client_SetHostname( c, My_Connections[new_sock].host );
|
||||
|
||||
Resolve_Addr(&My_Connections[new_sock].res_stat, &new_addr,
|
||||
My_Connections[new_sock].sock, cb_Read_Resolver_Result);
|
||||
if (!Conf_NoDNS)
|
||||
Resolve_Addr(&My_Connections[new_sock].res_stat, &new_addr,
|
||||
My_Connections[new_sock].sock, cb_Read_Resolver_Result);
|
||||
|
||||
/* Penalty-Zeit setzen */
|
||||
Conn_SetPenalty( new_sock, 4 );
|
||||
Conn_SetPenalty(new_sock, 4);
|
||||
return new_sock;
|
||||
} /* New_Connection */
|
||||
|
||||
@@ -1333,7 +1345,7 @@ Check_Servers( void )
|
||||
if( Conf_Server[i].group > NONE ) {
|
||||
for (n = 0; n < MAX_SERVERS; n++) {
|
||||
if (n == i) continue;
|
||||
if ((Conf_Server[n].conn_id > NONE) &&
|
||||
if ((Conf_Server[n].conn_id != NONE) &&
|
||||
(Conf_Server[n].group == Conf_Server[i].group))
|
||||
break;
|
||||
}
|
||||
@@ -1347,6 +1359,7 @@ Check_Servers( void )
|
||||
|
||||
/* Okay, try to connect now */
|
||||
Conf_Server[i].lasttry = time_now;
|
||||
Conf_Server[i].conn_id = SERVER_WAIT;
|
||||
assert(Resolve_Getfd(&Conf_Server[i].res_stat) < 0);
|
||||
Resolve_Name(&Conf_Server[i].res_stat, Conf_Server[i].host, cb_Connect_to_Server);
|
||||
}
|
||||
@@ -1354,36 +1367,19 @@ Check_Servers( void )
|
||||
|
||||
|
||||
static void
|
||||
New_Server( int Server )
|
||||
New_Server( int Server , struct in_addr *dest)
|
||||
{
|
||||
/* Establish new server link */
|
||||
|
||||
struct sockaddr_in local_addr;
|
||||
struct sockaddr_in new_addr;
|
||||
struct in_addr inaddr;
|
||||
int res, new_sock;
|
||||
CLIENT *c;
|
||||
|
||||
assert( Server > NONE );
|
||||
|
||||
Log( LOG_INFO, "Establishing connection to \"%s\", %s, port %d ... ", Conf_Server[Server].host,
|
||||
Conf_Server[Server].ip, Conf_Server[Server].port );
|
||||
|
||||
#ifdef HAVE_INET_ATON
|
||||
if( inet_aton( Conf_Server[Server].ip, &inaddr ) == 0 )
|
||||
#else
|
||||
memset( &inaddr, 0, sizeof( inaddr ));
|
||||
inaddr.s_addr = inet_addr( Conf_Server[Server].ip );
|
||||
if( inaddr.s_addr == (unsigned)-1 )
|
||||
#endif
|
||||
{
|
||||
Log( LOG_ERR, "Can't connect to \"%s\": can't convert ip address %s!",
|
||||
Conf_Server[Server].host, Conf_Server[Server].ip );
|
||||
return;
|
||||
}
|
||||
|
||||
memset( &new_addr, 0, sizeof( new_addr ));
|
||||
new_addr.sin_family = (sa_family_t)AF_INET;
|
||||
new_addr.sin_addr = inaddr;
|
||||
memset(&new_addr, 0, sizeof( new_addr ));
|
||||
new_addr.sin_family = AF_INET;
|
||||
new_addr.sin_addr = *dest;
|
||||
new_addr.sin_port = htons( Conf_Server[Server].port );
|
||||
|
||||
new_sock = socket( PF_INET, SOCK_STREAM, 0 );
|
||||
@@ -1394,6 +1390,12 @@ New_Server( int Server )
|
||||
|
||||
if( ! Init_Socket( new_sock )) return;
|
||||
|
||||
/* if we fail to bind, just continue and let connect() pick a source address */
|
||||
InitSinaddr(&local_addr, 0);
|
||||
local_addr.sin_addr = Conf_Server[Server].bind_addr;
|
||||
if (bind(new_sock, (struct sockaddr *)&local_addr, (socklen_t)sizeof(local_addr)))
|
||||
Log(LOG_WARNING, "Can't bind socket to %s: %s!", inet_ntoa(Conf_Server[Server].bind_addr), strerror( errno ));
|
||||
|
||||
res = connect(new_sock, (struct sockaddr *)&new_addr,
|
||||
(socklen_t)sizeof(new_addr));
|
||||
if(( res != 0 ) && ( errno != EINPROGRESS )) {
|
||||
@@ -1401,7 +1403,7 @@ New_Server( int Server )
|
||||
close( new_sock );
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (!array_alloc(&My_ConnArray, sizeof(CONNECTION), (size_t)new_sock)) {
|
||||
Log(LOG_ALERT,
|
||||
"Cannot allocate memory for server connection (socket %d)",
|
||||
@@ -1448,14 +1450,17 @@ New_Server( int Server )
|
||||
} /* New_Server */
|
||||
|
||||
|
||||
/**
|
||||
* Initialize connection structure.
|
||||
*/
|
||||
static void
|
||||
Init_Conn_Struct( CONN_ID Idx )
|
||||
Init_Conn_Struct(CONN_ID Idx)
|
||||
{
|
||||
time_t now = time( NULL );
|
||||
/* Connection-Struktur initialisieren */
|
||||
time_t now = time(NULL);
|
||||
|
||||
memset( &My_Connections[Idx], 0, sizeof ( CONNECTION ));
|
||||
memset(&My_Connections[Idx], 0, sizeof(CONNECTION));
|
||||
My_Connections[Idx].sock = -1;
|
||||
My_Connections[Idx].signon = now;
|
||||
My_Connections[Idx].lastdata = now;
|
||||
My_Connections[Idx].lastprivmsg = now;
|
||||
Resolve_Init(&My_Connections[Idx].res_stat);
|
||||
@@ -1505,6 +1510,7 @@ cb_Connect_to_Server(int fd, UNUSED short events)
|
||||
/* Read result of resolver sub-process from pipe and start connection */
|
||||
int i;
|
||||
size_t len;
|
||||
struct in_addr dest_addr;
|
||||
char readbuf[HOST_LEN + 1];
|
||||
|
||||
LogDebug("Resolver: Got forward lookup callback on fd %d, events %d", fd, events);
|
||||
@@ -1513,7 +1519,7 @@ cb_Connect_to_Server(int fd, UNUSED short events)
|
||||
if (Resolve_Getfd(&Conf_Server[i].res_stat) == fd )
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if( i >= MAX_SERVERS) {
|
||||
/* Ops, no matching server found?! */
|
||||
io_close( fd );
|
||||
@@ -1522,16 +1528,23 @@ cb_Connect_to_Server(int fd, UNUSED short events)
|
||||
}
|
||||
|
||||
/* Read result from pipe */
|
||||
len = Resolve_Read(&Conf_Server[i].res_stat, readbuf, sizeof readbuf -1);
|
||||
len = Resolve_Read(&Conf_Server[i].res_stat, readbuf, sizeof(readbuf)-1);
|
||||
if (len == 0)
|
||||
return;
|
||||
|
||||
|
||||
readbuf[len] = '\0';
|
||||
LogDebug("Got result from resolver: \"%s\" (%u bytes read).", readbuf, len);
|
||||
strlcpy( Conf_Server[i].ip, readbuf, sizeof( Conf_Server[i].ip ));
|
||||
|
||||
if (!ngt_IPStrToBin(readbuf, &dest_addr)) {
|
||||
Log(LOG_ERR, "Can't connect to \"%s\": can't convert ip address %s!",
|
||||
Conf_Server[i].host, readbuf);
|
||||
return;
|
||||
}
|
||||
|
||||
Log( LOG_INFO, "Establishing connection to \"%s\", %s, port %d ... ",
|
||||
Conf_Server[i].host, readbuf, Conf_Server[i].port );
|
||||
/* connect() */
|
||||
New_Server(i);
|
||||
New_Server(i, &dest_addr);
|
||||
} /* cb_Read_Forward_Lookup */
|
||||
|
||||
|
||||
@@ -1598,10 +1611,10 @@ cb_Read_Resolver_Result( int r_fd, UNUSED short events )
|
||||
#ifdef IDENTAUTH
|
||||
++identptr;
|
||||
if (*identptr) {
|
||||
Log( LOG_INFO, "IDENT lookup for connection %ld: \"%s\".", i, identptr);
|
||||
Client_SetUser( c, identptr, true );
|
||||
Log(LOG_INFO, "IDENT lookup for connection %d: \"%s\".", i, identptr);
|
||||
Client_SetUser(c, identptr, true);
|
||||
} else {
|
||||
Log( LOG_INFO, "IDENT lookup for connection %ld: no result.", i );
|
||||
Log(LOG_INFO, "IDENT lookup for connection %d: no result.", i);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@@ -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.42.2.1 2007/05/09 13:21:38 fw Exp $
|
||||
* $Id: conn.h,v 1.45 2007/10/04 15:03:56 alex Exp $
|
||||
*
|
||||
* Connection management (header)
|
||||
*/
|
||||
@@ -59,6 +59,7 @@ typedef struct _Connection
|
||||
char host[HOST_LEN]; /* Hostname */
|
||||
array rbuf; /* Read buffer */
|
||||
array wbuf; /* Write buffer */
|
||||
time_t signon; /* Signon ("connect") time */
|
||||
time_t lastdata; /* Last activity */
|
||||
time_t lastping; /* Last PING */
|
||||
time_t lastprivmsg; /* Last PRIVMSG */
|
||||
@@ -83,7 +84,7 @@ GLOBAL long WCounter;
|
||||
GLOBAL void Conn_Init PARAMS((void ));
|
||||
GLOBAL void Conn_Exit PARAMS(( void ));
|
||||
|
||||
GLOBAL int Conn_InitListeners PARAMS(( void ));
|
||||
GLOBAL unsigned int Conn_InitListeners PARAMS(( void ));
|
||||
GLOBAL void Conn_ExitListeners PARAMS(( void ));
|
||||
|
||||
GLOBAL void Conn_Handler PARAMS(( void ));
|
||||
|
@@ -8,7 +8,7 @@
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: defines.h,v 1.58.2.1 2007/05/18 22:11:19 alex Exp $
|
||||
* $Id: defines.h,v 1.62 2007/11/21 12:16:36 alex Exp $
|
||||
*/
|
||||
|
||||
|
||||
@@ -47,14 +47,15 @@
|
||||
|
||||
#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 10 /* Max. nick length, see. RFC 2812
|
||||
section 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_USER_LEN 10 /* Max. length of user name ("login")
|
||||
see RFC 2812, section 1.2.1 */
|
||||
#define CLIENT_NAME_LEN 32 /* Max. length of "real names" */
|
||||
#define CLIENT_HOST_LEN 64 /* Max. host name length */
|
||||
#define CLIENT_MODE_LEN 8 /* Max. lenth of all client modes */
|
||||
#define CLIENT_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 */
|
||||
@@ -81,7 +82,7 @@
|
||||
protocol, see doc/Protocol.txt */
|
||||
|
||||
#ifdef IRCPLUS
|
||||
# define IRCPLUSFLAGS "CL" /* Standard IRC+ flags */
|
||||
# define IRCPLUSFLAGS "CHL" /* Standard IRC+ flags */
|
||||
#endif
|
||||
|
||||
#define STARTUP_DELAY 1 /* Delay outgoing connections n seconds
|
||||
|
@@ -14,7 +14,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: hash.c,v 1.12.2.1 2006/12/02 13:18:22 fw Exp $";
|
||||
static char UNUSED id[] = "$Id: hash.c,v 1.13 2006/10/06 21:23:47 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
|
@@ -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.5.4.1 2006/12/02 13:18:22 fw Exp $
|
||||
* $Id: hash.h,v 1.6 2006/10/06 21:23:47 fw Exp $
|
||||
*
|
||||
* Hash calculation (header)
|
||||
*/
|
||||
|
@@ -12,7 +12,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: io.c,v 1.16.2.1 2007/04/03 22:08:52 fw Exp $";
|
||||
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>
|
||||
@@ -30,7 +30,11 @@ static char UNUSED id[] = "$Id: io.c,v 1.16.2.1 2007/04/03 22:08:52 fw Exp $";
|
||||
/* #define DEBUG_IO */
|
||||
|
||||
typedef struct {
|
||||
#ifdef PROTOTYPES
|
||||
void (*callback)(int, short);
|
||||
#else
|
||||
void (*callback)();
|
||||
#endif
|
||||
short what;
|
||||
} io_event;
|
||||
|
||||
@@ -88,7 +92,7 @@ static bool io_event_change_kqueue(int, short, const int action);
|
||||
static array pollfds;
|
||||
static int poll_maxfd;
|
||||
|
||||
static bool io_event_change_poll(int fd, short what);
|
||||
static bool io_event_change_poll PARAMS((int fd, short what));
|
||||
#endif
|
||||
|
||||
#ifdef IO_USE_DEVPOLL
|
||||
@@ -304,7 +308,7 @@ io_event_create(int fd, short what, void (*cbfunc) (int, short))
|
||||
|
||||
assert(fd >= 0);
|
||||
#if defined(IO_USE_SELECT) && defined(FD_SETSIZE)
|
||||
if (fd >= 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);
|
||||
@@ -524,7 +528,11 @@ io_close_devpoll(int fd)
|
||||
write(io_masterfd, &p, sizeof p);
|
||||
}
|
||||
#else
|
||||
static inline void io_close_devpoll(int UNUSED x) { /* NOTHING */ }
|
||||
static inline void
|
||||
io_close_devpoll(int UNUSED x)
|
||||
{
|
||||
/* NOTHING */
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -576,7 +584,11 @@ io_close_select(int fd)
|
||||
}
|
||||
}
|
||||
#else
|
||||
static inline void io_close_select(int UNUSED x) { /* NOTHING */ }
|
||||
static inline void
|
||||
io_close_select(int UNUSED x)
|
||||
{
|
||||
/* NOTHING */
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -623,6 +635,9 @@ io_event_del(int fd, short what)
|
||||
#endif
|
||||
if (!i) return false;
|
||||
|
||||
if (!(i->what & what)) /* event is already disabled */
|
||||
return true;
|
||||
|
||||
i->what &= ~what;
|
||||
|
||||
#ifdef IO_USE_DEVPOLL
|
||||
@@ -830,15 +845,9 @@ io_dispatch_kqueue(struct timeval *tv)
|
||||
newevents_len = (int) array_length(&io_evcache, sizeof (struct kevent));
|
||||
newevents = (newevents_len > 0) ? array_start(&io_evcache) : NULL;
|
||||
assert(newevents_len >= 0);
|
||||
if (newevents_len < 0)
|
||||
newevents_len = 0;
|
||||
#ifdef DEBUG
|
||||
if (newevents_len)
|
||||
assert(newevents != NULL);
|
||||
#endif
|
||||
ret = kevent(io_masterfd, newevents, newevents_len, kev,
|
||||
100, &ts);
|
||||
if ((newevents_len>0) && ret != -1)
|
||||
|
||||
ret = kevent(io_masterfd, newevents, newevents_len, kev, 100, &ts);
|
||||
if (newevents && ret != -1)
|
||||
array_trunc(&io_evcache);
|
||||
|
||||
total += ret;
|
||||
@@ -846,30 +855,31 @@ io_dispatch_kqueue(struct timeval *tv)
|
||||
return total;
|
||||
|
||||
for (i = 0; i < ret; i++) {
|
||||
if (kev[i].flags & EV_EOF) {
|
||||
#ifdef DEBUG
|
||||
LogDebug("kev.flag has EV_EOF set, setting IO_ERROR",
|
||||
kev[i].filter, kev[i].ident);
|
||||
#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:
|
||||
#ifdef DEBUG
|
||||
LogDebug("Unknown kev.filter number %d for fd %d",
|
||||
kev[i].filter, kev[i].ident); /* Fall through */
|
||||
#endif
|
||||
case EV_ERROR:
|
||||
io_docallback((int)kev[i].ident, IO_ERROR);
|
||||
break;
|
||||
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;
|
||||
|
@@ -7,7 +7,7 @@
|
||||
*
|
||||
* I/O abstraction interface header
|
||||
*
|
||||
* $Id: io.h,v 1.3.2.1 2007/04/03 22:08:52 fw Exp $
|
||||
* $Id: io.h,v 1.4 2006/12/25 22:53:52 alex Exp $
|
||||
*/
|
||||
|
||||
#ifndef io_H_included
|
||||
|
@@ -14,7 +14,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: irc-channel.c,v 1.35.2.5 2008/01/07 11:41:44 fw Exp $";
|
||||
static char UNUSED id[] = "$Id: irc-channel.c,v 1.40.2.2 2008/02/26 12:07:41 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
@@ -79,6 +79,14 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
chan = NULL; flags = NULL;
|
||||
|
||||
if (Client_Type(Client) == CLIENT_SERVER) {
|
||||
flags = strchr( channame, 0x7 );
|
||||
if( flags ) {
|
||||
*flags = '\0';
|
||||
flags++;
|
||||
}
|
||||
}
|
||||
|
||||
/* wird der Channel neu angelegt? */
|
||||
if( Channel_Search( channame )) {
|
||||
is_new_chan = false;
|
||||
@@ -92,18 +100,6 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
||||
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 )
|
||||
{
|
||||
*flags = '\0';
|
||||
flags++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Local client? */
|
||||
if( Client_Type( Client ) == CLIENT_USER )
|
||||
{
|
||||
@@ -269,7 +265,6 @@ IRC_PART( CLIENT *Client, REQUEST *Req )
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if (Req->argc < 1 || Req->argc > 2)
|
||||
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||
Client_ID(Client), Req->command);
|
||||
@@ -280,18 +275,11 @@ 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 )
|
||||
{
|
||||
if( ! Channel_Part( target, Client, chan, Req->argc > 1 ? Req->argv[1] : Client_ID( target )))
|
||||
{
|
||||
/* naechsten Namen ermitteln */
|
||||
chan = strtok( NULL, "," );
|
||||
continue;
|
||||
}
|
||||
chan = strtok(Req->argv[0], ",");
|
||||
while (chan) {
|
||||
Channel_Part(target, Client, chan, Req->argc > 1 ? Req->argv[1] : Client_ID(target));
|
||||
|
||||
/* naechsten Namen ermitteln */
|
||||
chan = strtok( NULL, "," );
|
||||
chan = strtok(NULL, ",");
|
||||
}
|
||||
return CONNECTED;
|
||||
} /* IRC_PART */
|
||||
|
@@ -14,7 +14,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: irc-info.c,v 1.33.2.2 2006/12/02 14:26:53 fw Exp $";
|
||||
static char UNUSED id[] = "$Id: irc-info.c,v 1.41.2.1 2008/02/26 12:06:57 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
@@ -335,6 +335,41 @@ 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 )
|
||||
{
|
||||
@@ -342,75 +377,94 @@ 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( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
|
||||
if (Client_Type(Client) == CLIENT_SERVER)
|
||||
from = Client_Search(Req->prefix);
|
||||
else
|
||||
from = Client;
|
||||
|
||||
if( Req->argc == 2 )
|
||||
{
|
||||
if (! from)
|
||||
return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix);
|
||||
|
||||
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':
|
||||
con = Conn_First( );
|
||||
while( con != NONE )
|
||||
{
|
||||
cl = Conn_GetClient( con );
|
||||
if( cl && (( Client_Type( cl ) == CLIENT_SERVER ) || ( cl == Client )))
|
||||
{
|
||||
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)) {
|
||||
/* 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( NULL ) - Conn_StartTime( con )))) return DISCONNECTED;
|
||||
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;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
if( ! IRC_WriteStrClient( from, RPL_STATSLINKINFO_MSG, Client_ID( from ), Client_Mask( cl ), Conn_SendQ( con ), Conn_SendMsg( con ), Conn_SendBytes( con ), Conn_RecvMsg( con ), Conn_RecvBytes( con ), (long)( time( NULL ) - Conn_StartTime( con )))) return DISCONNECTED;
|
||||
}
|
||||
if (!IRC_WriteStrClient(from, RPL_STATSLINKINFO_MSG, Client_ID(from),
|
||||
Client_Mask(cl), Conn_SendQ(con), Conn_SendMsg(con), Conn_SendBytes(con),
|
||||
Conn_RecvMsg(con), Conn_RecvBytes(con), (long)(time_now - Conn_StartTime(con))))
|
||||
return DISCONNECTED;
|
||||
}
|
||||
con = Conn_Next( con );
|
||||
}
|
||||
break;
|
||||
case 'm': /* IRC-Befehle */
|
||||
case 'm': /* IRC-Commands */
|
||||
case 'M':
|
||||
cmd = Parse_GetCommandStruct( );
|
||||
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++;
|
||||
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;
|
||||
}
|
||||
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 */
|
||||
|
||||
|
||||
@@ -594,7 +648,11 @@ IRC_WHO( CLIENT *Client, REQUEST *Req )
|
||||
if( ok && (( ! only_ops ) || ( strchr( Client_Modes( c ), 'o' ))))
|
||||
{
|
||||
/* Get flags */
|
||||
strcpy( flags, "H" );
|
||||
if (strchr(Client_Modes( c ), 'a'))
|
||||
strcpy(flags, "G"); /* away */
|
||||
else
|
||||
strcpy(flags, "H");
|
||||
|
||||
if( strchr( Client_Modes( c ), 'o' )) strlcat( flags, "*", sizeof( flags ));
|
||||
|
||||
/* Search suitable channel */
|
||||
@@ -707,10 +765,13 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req )
|
||||
if( ! IRC_WriteStrClient( from, RPL_WHOISOPERATOR_MSG, Client_ID( from ), Client_ID( 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;
|
||||
/* 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;
|
||||
}
|
||||
|
||||
/* Away? */
|
||||
@@ -882,18 +943,21 @@ IRC_Send_LUSERS( CLIENT *Client )
|
||||
} /* IRC_Send_LUSERS */
|
||||
|
||||
|
||||
static bool Show_MOTD_Start(CLIENT *Client)
|
||||
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)
|
||||
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)
|
||||
static bool
|
||||
Show_MOTD_End(CLIENT *Client)
|
||||
{
|
||||
return IRC_WriteStrClient( Client, RPL_ENDOFMOTD_MSG, Client_ID( Client ));
|
||||
}
|
||||
@@ -1022,10 +1086,12 @@ 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 )
|
||||
{
|
||||
/* Flags zusammenbasteln */
|
||||
strcpy( flags, "H" );
|
||||
if( is_member || is_visible ) {
|
||||
if (strchr(Client_Modes( c ), 'a'))
|
||||
strcpy(flags, "G"); /* away */
|
||||
else
|
||||
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 ));
|
||||
@@ -1044,4 +1110,22 @@ 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- */
|
||||
|
@@ -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.3 2005/03/19 18:43:48 fw Exp $
|
||||
* $Id: irc-info.h,v 1.4 2007/11/21 12:16:36 alex Exp $
|
||||
*
|
||||
* IRC info commands (header)
|
||||
*/
|
||||
@@ -36,6 +36,7 @@ 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
|
||||
|
@@ -14,7 +14,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: irc-login.c,v 1.49.2.2 2006/12/02 14:26:53 fw Exp $";
|
||||
static char UNUSED id[] = "$Id: irc-login.c,v 1.54.2.1 2008/02/05 11:48:37 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
@@ -601,8 +601,8 @@ Hello_User( CLIENT *Client )
|
||||
/* Version and system type */
|
||||
#ifdef CVSDATE
|
||||
strlcpy( ver, CVSDATE, sizeof( ver ));
|
||||
strncpy( ver + 4, ver + 5, 2 );
|
||||
strncpy( ver + 6, ver + 8, 3 );
|
||||
memmove( ver + 4, ver + 5, 2 );
|
||||
memmove( 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
|
||||
@@ -618,12 +618,7 @@ Hello_User( CLIENT *Client )
|
||||
|
||||
/* Features supported by this server (005 numeric, ISUPPORT),
|
||||
* see <http://www.irc.org/tech_docs/005.html> for details. */
|
||||
if (! IRC_WriteStrClient(Client, RPL_ISUPPORT1_MSG, Client_ID(Client),
|
||||
Conf_MaxJoins))
|
||||
return DISCONNECTED;
|
||||
if (! IRC_WriteStrClient(Client, RPL_ISUPPORT2_MSG, Client_ID(Client),
|
||||
CHANNEL_NAME_LEN-1, CLIENT_NICK_LEN-1, COMMAND_LEN-23,
|
||||
CLIENT_AWAY_LEN-1, COMMAND_LEN-113))
|
||||
if (! IRC_Send_ISUPPORT(Client))
|
||||
return DISCONNECTED;
|
||||
|
||||
Client_SetType( Client, CLIENT_USER );
|
||||
|
@@ -14,7 +14,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: irc-mode.c,v 1.45.2.2 2007/04/03 20:23:31 fw Exp $";
|
||||
static char UNUSED id[] = "$Id: irc-mode.c,v 1.50.2.1 2008/02/16 11:26:12 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
@@ -164,6 +164,7 @@ 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;
|
||||
|
||||
@@ -316,7 +317,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
||||
/* Prepare reply string */
|
||||
if( set ) strcpy( the_modes, "+" );
|
||||
else strcpy( the_modes, "-" );
|
||||
strcpy( the_args, " " );
|
||||
the_args[0] = '\0';
|
||||
|
||||
x[1] = '\0';
|
||||
ok = CONNECTED;
|
||||
@@ -431,16 +432,21 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
||||
break;
|
||||
|
||||
case 'P': /* Persistent channel */
|
||||
if( modeok )
|
||||
{
|
||||
if( set && ( ! Client_OperByMe( Client )))
|
||||
{
|
||||
/* Only IRC operators are allowed to set P mode */
|
||||
ok = IRC_WriteStrClient( Origin, ERR_NOPRIVILEGES_MSG, Client_ID( Origin ));
|
||||
}
|
||||
else x[0] = 'P';
|
||||
}
|
||||
else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( 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));
|
||||
break;
|
||||
|
||||
/* --- Channel user modes --- */
|
||||
@@ -522,8 +528,8 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
||||
/* Channel-User-Mode */
|
||||
if( Channel_UserModeAdd( Channel, client, x[0] ))
|
||||
{
|
||||
strlcat( the_args, Client_ID( client ), sizeof( the_args ));
|
||||
strlcat( the_args, " ", sizeof( the_args ));
|
||||
strlcat( the_args, Client_ID( client ), 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 ));
|
||||
}
|
||||
@@ -546,8 +552,8 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
||||
/* Channel-User-Mode */
|
||||
if( Channel_UserModeDel( Channel, client, x[0] ))
|
||||
{
|
||||
strlcat( the_args, Client_ID( client ), sizeof( the_args ));
|
||||
strlcat( the_args, " ", sizeof( the_args ));
|
||||
strlcat( the_args, Client_ID( client ), 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 ));
|
||||
}
|
||||
@@ -566,8 +572,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
||||
/* Are there additional arguments to add? */
|
||||
if( argadd[0] )
|
||||
{
|
||||
len = strlen( the_args ) - 1;
|
||||
if( the_args[len] != ' ' ) strlcat( the_args, " ", sizeof( the_args ));
|
||||
strlcat( the_args, " ", sizeof( the_args ));
|
||||
strlcat( the_args, argadd, sizeof( the_args ));
|
||||
}
|
||||
}
|
||||
@@ -580,9 +585,6 @@ 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 */
|
||||
|
@@ -14,7 +14,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: irc-op.c,v 1.15.4.2 2007/04/03 20:23:31 fw Exp $";
|
||||
static char UNUSED id[] = "$Id: irc-op.c,v 1.17 2006/12/07 17:57:20 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
|
@@ -14,7 +14,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: irc-oper.c,v 1.27 2006/07/23 15:43:18 alex Exp $";
|
||||
static char UNUSED id[] = "$Id: irc-oper.c,v 1.29 2007/08/02 10:14:26 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
@@ -191,12 +191,12 @@ IRC_CONNECT(CLIENT * Client, REQUEST * Req)
|
||||
Client_ID(Client));
|
||||
|
||||
/* Bad number of parameters? */
|
||||
if ((Req->argc != 2) && (Req->argc != 5))
|
||||
if ((Req->argc != 1) && (Req->argc != 2) && (Req->argc != 5))
|
||||
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||
Client_ID(Client), Req->command);
|
||||
|
||||
/* Invalid port number? */
|
||||
if (atoi(Req->argv[1]) < 1)
|
||||
if ((Req->argc > 1) && atoi(Req->argv[1]) < 1)
|
||||
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||
Client_ID(Client), Req->command);
|
||||
|
||||
@@ -204,14 +204,22 @@ IRC_CONNECT(CLIENT * Client, REQUEST * Req)
|
||||
"Got CONNECT command from \"%s\" for \"%s\".", Client_Mask(Client),
|
||||
Req->argv[0]);
|
||||
|
||||
if (Req->argc == 2) {
|
||||
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:
|
||||
/* 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]);
|
||||
} else {
|
||||
break;
|
||||
default:
|
||||
/* Add server */
|
||||
if (!Conf_AddServer
|
||||
(Req->argv[0], (UINT16) atoi(Req->argv[1]), Req->argv[2],
|
||||
@@ -255,4 +263,54 @@ IRC_DISCONNECT(CLIENT *Client, REQUEST *Req )
|
||||
} /* 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- */
|
||||
|
@@ -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.11 2005/03/19 18:43:48 fw Exp $
|
||||
* $Id: irc-oper.h,v 1.12 2007/08/02 10:14:26 fw Exp $
|
||||
*
|
||||
* IRC operator commands (header)
|
||||
*/
|
||||
@@ -24,6 +24,7 @@ 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
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001-2006 Alexander Barton (alex@barton.de)
|
||||
* 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
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: irc-server.c,v 1.39.2.3 2007/04/03 20:23:31 fw Exp $";
|
||||
static char UNUSED id[] = "$Id: irc-server.c,v 1.46 2007/11/21 12:16:36 alex Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
@@ -35,56 +35,14 @@ static char UNUSED id[] = "$Id: irc-server.c,v 1.39.2.3 2007/04/03 20:23:31 fw E
|
||||
#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"
|
||||
|
||||
|
||||
#ifdef IRCPLUS
|
||||
static bool
|
||||
Synchronize_Lists( CLIENT *Client )
|
||||
{
|
||||
CHANNEL *c;
|
||||
struct list_head *head;
|
||||
struct list_elem *elem;
|
||||
|
||||
assert( Client != NULL );
|
||||
|
||||
c = Channel_First();
|
||||
|
||||
while (c) {
|
||||
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 false;
|
||||
}
|
||||
elem = Lists_GetNext(elem);
|
||||
}
|
||||
|
||||
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 false;
|
||||
}
|
||||
elem = Lists_GetNext(elem);
|
||||
}
|
||||
c = Channel_Next(c);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Handler for the IRC command "SERVER".
|
||||
* See RFC 2813 section 4.1.2.
|
||||
@@ -92,12 +50,10 @@ Synchronize_Lists( CLIENT *Client )
|
||||
GLOBAL bool
|
||||
IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
char str[LINE_LEN], *ptr, *modes, *topic;
|
||||
CLIENT *from, *c, *cl;
|
||||
CL2CHAN *cl2chan;
|
||||
int max_hops, i;
|
||||
CHANNEL *chan;
|
||||
char str[LINE_LEN], *ptr;
|
||||
CLIENT *from, *c;
|
||||
bool ok;
|
||||
int i;
|
||||
CONN_ID con;
|
||||
|
||||
assert( Client != NULL );
|
||||
@@ -166,10 +122,10 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
||||
Client_SetToken( Client, atoi( Req->argv[1] ));
|
||||
}
|
||||
|
||||
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 );
|
||||
/* Mark this connection as belonging to an configured server */
|
||||
Conf_SetServer(i, con);
|
||||
|
||||
Client_SetType(Client, CLIENT_UNKNOWNSERVER);
|
||||
|
||||
#ifdef ZLIB
|
||||
/* Kompression initialisieren, wenn erforderlich */
|
||||
@@ -184,140 +140,23 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
||||
}
|
||||
#endif
|
||||
|
||||
/* 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 %lu :%s",
|
||||
Channel_Name( chan ), modes,
|
||||
strchr( Channel_Modes( chan ), 'k' ) ? Channel_Key( chan ) : "*",
|
||||
strchr( Channel_Modes( chan ), 'l' ) ? Channel_MaxUsers( chan ) : 0UL, topic ))
|
||||
{
|
||||
return DISCONNECTED;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
||||
/* Get next channel ... */
|
||||
chan = Channel_Next(chan);
|
||||
}
|
||||
|
||||
#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 (!Synchronize_Lists(Client))
|
||||
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
|
||||
}
|
||||
#endif
|
||||
|
||||
return CONNECTED;
|
||||
return IRC_Num_ENDOFMOTD(Client, Req);
|
||||
}
|
||||
else if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
@@ -361,8 +200,9 @@ 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 */
|
||||
|
||||
|
||||
|
@@ -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.5 2005/03/19 18:43:49 fw Exp $
|
||||
* $Id: irc-server.h,v 1.6 2007/11/21 12:16:36 alex Exp $
|
||||
*
|
||||
* IRC commands for server links (header)
|
||||
*/
|
||||
@@ -22,6 +22,8 @@ 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
|
||||
|
||||
|
@@ -14,7 +14,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: irc-write.c,v 1.20.2.1 2006/12/02 13:06:50 fw Exp $";
|
||||
static char UNUSED id[] = "$Id: irc-write.c,v 1.21 2006/08/12 11:56:24 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
|
@@ -14,7 +14,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: lists.c,v 1.18.2.3 2007/04/03 22:08:52 fw Exp $";
|
||||
static char UNUSED id[] = "$Id: lists.c,v 1.21 2007/01/29 21:13:26 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
|
@@ -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.12.4.1 2007/04/03 20:23:31 fw Exp $
|
||||
* $Id: lists.h,v 1.13 2006/12/07 17:57:20 fw Exp $
|
||||
*
|
||||
* Management of IRC lists: ban, invite, ... (header)
|
||||
*/
|
||||
|
@@ -14,7 +14,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: log.c,v 1.61.2.1 2006/12/02 13:02:07 fw Exp $";
|
||||
static char UNUSED id[] = "$Id: log.c,v 1.62 2006/08/05 09:16:21 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
|
@@ -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.19.2.1 2006/12/02 13:02:07 fw Exp $
|
||||
* $Id: log.h,v 1.20 2006/08/05 09:16:21 fw Exp $
|
||||
*
|
||||
* Logging functions (header)
|
||||
*/
|
||||
|
@@ -14,7 +14,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: match.c,v 1.4.2.1 2006/12/02 13:01:11 fw Exp $";
|
||||
static char UNUSED id[] = "$Id: match.c,v 1.5 2006/10/06 21:23:47 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
|
@@ -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.3.4.1 2006/12/02 13:01:11 fw Exp $
|
||||
* $Id: match.h,v 1.4 2006/10/06 21:23:47 fw Exp $
|
||||
*
|
||||
* Wildcard pattern matching (header)
|
||||
*/
|
||||
|
@@ -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.67.2.2 2006/12/02 14:26:53 fw Exp $
|
||||
* $Id: messages.h,v 1.74 2007/12/11 11:29:44 fw Exp $
|
||||
*
|
||||
* IRC numerics (Header)
|
||||
*/
|
||||
@@ -32,6 +32,7 @@
|
||||
#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)"
|
||||
@@ -55,7 +56,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 %ld :seconds idle"
|
||||
#define RPL_WHOISIDLE_MSG "317 %s %s %lu %lu :seconds idle, signon time"
|
||||
#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"
|
||||
|
@@ -12,7 +12,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: ngircd.c,v 1.113.2.2 2007/05/05 20:25:47 alex Exp $";
|
||||
static char UNUSED id[] = "$Id: ngircd.c,v 1.117 2007/11/21 12:16:36 alex Exp $";
|
||||
|
||||
/**
|
||||
* @file
|
||||
@@ -422,6 +422,7 @@ 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;
|
||||
@@ -429,17 +430,22 @@ NGIRCd_Rehash( void )
|
||||
/* Close down all listening sockets */
|
||||
Conn_ExitListeners( );
|
||||
|
||||
/* Remember old server name */
|
||||
/* Remember old server name and nick name length */
|
||||
strlcpy( old_name, Conf_ServerName, sizeof old_name );
|
||||
old_nicklen = Conf_MaxNickLength;
|
||||
|
||||
/* Re-read configuration ... */
|
||||
Conf_Rehash( );
|
||||
|
||||
/* Recover old server name: it 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." );
|
||||
/* 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.");
|
||||
}
|
||||
|
||||
/* Create new pre-defined channels */
|
||||
@@ -797,7 +803,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_ERR, "Can't change working directory to \"%s\": %s",
|
||||
Log( LOG_INFO, "Notice: Can't change working directory to \"%s\": %s",
|
||||
pwd->pw_dir, strerror( errno ));
|
||||
}
|
||||
} else {
|
||||
|
334
src/ngircd/numeric.c
Normal file
334
src/ngircd/numeric.c
Normal file
@@ -0,0 +1,334 @@
|
||||
/*
|
||||
* 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- */
|
24
src/ngircd/numeric.h
Normal file
24
src/ngircd/numeric.h
Normal file
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* 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- */
|
@@ -12,7 +12,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: parse.c,v 1.67.2.1 2008/02/05 13:15:05 fw Exp $";
|
||||
static char UNUSED id[] = "$Id: parse.c,v 1.69.2.1 2008/02/05 13:11:20 fw Exp $";
|
||||
|
||||
/**
|
||||
* @file
|
||||
@@ -48,6 +48,7 @@ static char UNUSED id[] = "$Id: parse.c,v 1.67.2.1 2008/02/05 13:15:05 fw Exp $"
|
||||
#include "irc-oper.h"
|
||||
#include "irc-server.h"
|
||||
#include "irc-write.h"
|
||||
#include "numeric.h"
|
||||
|
||||
#include "exp.h"
|
||||
|
||||
@@ -93,6 +94,7 @@ 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 },
|
||||
@@ -102,6 +104,13 @@ 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 */
|
||||
};
|
||||
|
||||
|
||||
static void Init_Request PARAMS(( REQUEST *Req ));
|
||||
|
||||
@@ -348,6 +357,7 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
|
||||
char str[LINE_LEN];
|
||||
bool result;
|
||||
COMMAND *cmd;
|
||||
NUMERIC *num;
|
||||
int i, client_type;
|
||||
|
||||
assert( Idx >= 0 );
|
||||
@@ -357,25 +367,45 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
|
||||
client = Conn_GetClient( Idx );
|
||||
assert( client != NULL );
|
||||
|
||||
/* Statuscode? */
|
||||
if(( Client_Type( client ) == CLIENT_SERVER ) && ( strlen( Req->command ) == 3 ) && ( atoi( Req->command ) > 100 ))
|
||||
{
|
||||
/* Command is a status code from an other server */
|
||||
/* 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 */
|
||||
|
||||
/* 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, ignore it */
|
||||
Log( LOG_DEBUG, "Ignored status code %s from \"%s\".", Req->command, Client_ID( client ));
|
||||
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));
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -406,7 +436,7 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
|
||||
}
|
||||
|
||||
cmd = My_Commands;
|
||||
client_type = Client_Type( client );
|
||||
client_type = Client_Type(client);
|
||||
while( cmd->name )
|
||||
{
|
||||
/* Befehl suchen */
|
||||
|
@@ -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.11 2005/03/19 18:43:49 fw Exp $
|
||||
* $Id: parse.h,v 1.12 2007/11/21 12:16:36 alex Exp $
|
||||
*
|
||||
* IRC command parser and validator (header)
|
||||
*/
|
||||
@@ -33,11 +33,18 @@ 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 ));
|
||||
|
@@ -14,7 +14,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: resolve.c,v 1.24.2.2 2006/12/17 22:59:56 fw Exp $";
|
||||
static char UNUSED id[] = "$Id: resolve.c,v 1.28 2008/01/02 11:03:29 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
@@ -24,7 +24,6 @@ static char UNUSED id[] = "$Id: resolve.c,v 1.24.2.2 2006/12/17 22:59:56 fw Exp
|
||||
#include <unistd.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
|
||||
#ifdef IDENTAUTH
|
||||
@@ -36,6 +35,7 @@ static char UNUSED id[] = "$Id: resolve.c,v 1.24.2.2 2006/12/17 22:59:56 fw Exp
|
||||
#include "conn.h"
|
||||
#include "defines.h"
|
||||
#include "log.h"
|
||||
#include "tool.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "resolve.h"
|
||||
@@ -153,8 +153,8 @@ Do_ResolveAddr( struct sockaddr_in *Addr, int identsock, int w_fd )
|
||||
/* Resolver sub-process: resolve IP address and write result into
|
||||
* pipe to parent. */
|
||||
|
||||
char hostname[HOST_LEN];
|
||||
char ipstr[HOST_LEN];
|
||||
char hostname[CLIENT_HOST_LEN];
|
||||
char ipstr[CLIENT_HOST_LEN];
|
||||
struct hostent *h;
|
||||
size_t len;
|
||||
struct in_addr *addr;
|
||||
@@ -169,7 +169,7 @@ Do_ResolveAddr( struct sockaddr_in *Addr, int identsock, int w_fd )
|
||||
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) {
|
||||
if (!h || strlen(h->h_name) >= sizeof(hostname)) {
|
||||
#ifdef h_errno
|
||||
Log_Resolver( LOG_WARNING, "Can't resolve address \"%s\": %s!", inet_ntoa( Addr->sin_addr ), Get_Error( h_errno ));
|
||||
#else
|
||||
|
4
src/portab/.cvsignore
Normal file
4
src/portab/.cvsignore
Normal file
@@ -0,0 +1,4 @@
|
||||
Makefile
|
||||
Makefile.in
|
||||
.deps
|
||||
portabtest
|
7
src/testsuite/.cvsignore
Normal file
7
src/testsuite/.cvsignore
Normal file
@@ -0,0 +1,7 @@
|
||||
Makefile
|
||||
Makefile.in
|
||||
T-ngircd
|
||||
logs
|
||||
ngircd-test.log
|
||||
ngircd-test.motd
|
||||
tests
|
@@ -9,7 +9,7 @@
|
||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
#
|
||||
# $Id: Makefile.am,v 1.14 2004/09/08 09:40:51 alex Exp $
|
||||
# $Id: Makefile.am,v 1.15 2007/11/18 15:07:16 alex Exp $
|
||||
#
|
||||
|
||||
AUTOMAKE_OPTIONS = ../portab/ansi2knr
|
||||
@@ -40,12 +40,15 @@ ngircd-TEST-Binary:
|
||||
[ -f getpid.sh ] || ln -s $(srcdir)/getpid.sh .
|
||||
|
||||
connect-test: tests.sh
|
||||
rm -f connect-test
|
||||
ln -s $(srcdir)/tests.sh connect-test
|
||||
|
||||
channel-test: tests.sh
|
||||
rm -f channel-test
|
||||
ln -s $(srcdir)/tests.sh channel-test
|
||||
|
||||
mode-test: tests.sh
|
||||
rm -f mode-test
|
||||
ln -s $(srcdir)/tests.sh mode-test
|
||||
|
||||
TESTS = start-server.sh \
|
||||
|
@@ -1,6 +1,6 @@
|
||||
#!/bin/sh
|
||||
# ngIRCd Test Suite
|
||||
# $Id: getpid.sh,v 1.4.6.1 2006/12/17 13:49:49 alex Exp $
|
||||
# $Id: getpid.sh,v 1.5 2006/08/05 00:15:28 alex Exp $
|
||||
|
||||
# did we get a name?
|
||||
[ $# -ne 1 ] && exit 1
|
||||
|
@@ -1,4 +1,4 @@
|
||||
# $Id: mode-test.e,v 1.6 2004/03/10 20:40:06 alex Exp $
|
||||
# $Id: mode-test.e,v 1.6.8.1 2008/02/16 11:26:13 fw Exp $
|
||||
|
||||
spawn telnet localhost 6789
|
||||
expect {
|
||||
@@ -72,7 +72,7 @@ expect {
|
||||
send "mode #channel +v nick\r"
|
||||
expect {
|
||||
timeout { exit 1 }
|
||||
"@* MODE #channel +v nick"
|
||||
"@* MODE #channel +v nick\r"
|
||||
}
|
||||
|
||||
send "mode #channel +I nick1\r"
|
||||
@@ -96,7 +96,7 @@ expect {
|
||||
send "mode #channel -vo nick nick\r"
|
||||
expect {
|
||||
timeout { exit 1 }
|
||||
"@* MODE #channel -vo nick nick"
|
||||
"@* MODE #channel -vo nick nick\r"
|
||||
}
|
||||
|
||||
send "quit\r"
|
||||
|
@@ -1,4 +1,4 @@
|
||||
# $Id: ngircd-test.conf,v 1.4 2003/11/05 23:31:43 alex Exp $
|
||||
# $Id: ngircd-test.conf,v 1.5 2007/11/18 15:07:16 alex Exp $
|
||||
|
||||
[Global]
|
||||
Name = ngircd.test.server
|
||||
@@ -7,6 +7,8 @@
|
||||
MotdFile = ngircd-test.motd
|
||||
AdminEMail = admin@irc.server
|
||||
MaxConnectionsIP = 0
|
||||
ServerUID = 1
|
||||
ServerGID = 1
|
||||
|
||||
[Operator]
|
||||
Name = TestOp
|
||||
|
3
src/tool/.cvsignore
Normal file
3
src/tool/.cvsignore
Normal file
@@ -0,0 +1,3 @@
|
||||
Makefile
|
||||
Makefile.in
|
||||
.deps
|
@@ -14,7 +14,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: tool.c,v 1.6 2006/04/09 12:53:07 alex Exp $";
|
||||
static char UNUSED id[] = "$Id: tool.c,v 1.8 2007/11/25 18:42:38 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
@@ -22,6 +22,8 @@ static char UNUSED id[] = "$Id: tool.c,v 1.6 2006/04/09 12:53:07 alex Exp $";
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <netinet/in.h>
|
||||
|
||||
#include "exp.h"
|
||||
#include "tool.h"
|
||||
|
||||
@@ -105,4 +107,22 @@ ngt_TrimLastChr( char *String, const char Chr)
|
||||
} /* ngt_TrimLastChr */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
ngt_IPStrToBin(const char *ip_str, struct in_addr *inaddr)
|
||||
{
|
||||
/* AF is always AF_INET for now */
|
||||
#ifdef HAVE_INET_ATON
|
||||
if (inet_aton(ip_str, inaddr) == 0)
|
||||
return false;
|
||||
#else
|
||||
inaddr->s_addr = inet_addr(ip_str);
|
||||
if (inaddr->s_addr == (unsigned)-1)
|
||||
return false;
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* -eof- */
|
||||
|
@@ -8,7 +8,7 @@
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: tool.h,v 1.3 2005/03/19 18:43:53 fw Exp $
|
||||
* $Id: tool.h,v 1.5 2007/11/25 18:42:38 fw Exp $
|
||||
*
|
||||
* Tool functions (Header)
|
||||
*/
|
||||
@@ -16,7 +16,13 @@
|
||||
|
||||
#ifndef __tool_h__
|
||||
#define __tool_h__
|
||||
#include "portab.h"
|
||||
|
||||
#ifdef HAVE_ARPA_INET_H
|
||||
# include <arpa/inet.h>
|
||||
#else
|
||||
# define PF_INET AF_INET
|
||||
#endif
|
||||
|
||||
GLOBAL void ngt_TrimLastChr PARAMS((char *String, const char Chr ));
|
||||
|
||||
@@ -24,7 +30,7 @@ GLOBAL void ngt_TrimStr PARAMS((char *String ));
|
||||
|
||||
GLOBAL char *ngt_LowerStr PARAMS((char *String ));
|
||||
|
||||
|
||||
GLOBAL bool ngt_IPStrToBin PARAMS((const char *ip_str, struct in_addr *inaddr));
|
||||
#endif
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user