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

Compare commits

..

42 Commits

Author SHA1 Message Date
Alexander Barton
a9823b2db1 ngIRCd 0.8.3 2005-02-03 10:16:25 +00:00
Alexander Barton
3563147514 Fixed a bug that could case a root exploit when the daemon is compiled
to do IDENT lookups and is logging to syslog. Bug discovered by CoKi,
<coki@nosystem.com.ar>, thanks a lot! [from HEAD.]
(http://www.nosystem.com.ar/advisories/advisory-11.txt)
2005-02-03 09:27:09 +00:00
Alexander Barton
81d21d4592 "ngIRCd" instead of "ngircd" ... 2005-02-03 09:20:58 +00:00
Alexander Barton
117cc7055d Updated config.guess and config.sub 2005-01-27 00:15:15 +00:00
Alexander Barton
7f1a44dd40 Fixed wrong maintainer name ... 2005-01-27 00:01:10 +00:00
Alexander Barton
51e5d9d74d Ooops, bad email address ... 2005-01-26 22:18:48 +00:00
Alexander Barton
93a0179a34 ngIRCd package 0.8.2-0ab1 2005-01-26 22:16:50 +00:00
Alexander Barton
314cf1238b ngIRCd 0.8.2 2005-01-26 22:05:26 +00:00
Alexander Barton
286b29ffcd We are in the year 2005 now! :-) 2005-01-26 22:02:36 +00:00
Alexander Barton
2283454917 Added doc/SSL.txt (from CVS HEAD) to 0.8.x branch. 2005-01-26 21:47:47 +00:00
Alexander Barton
f0b3a9cacd Fixed a buffer overflow that could cause the daemon to crash. Bug found
by Florian Westphal, <westphal@foo.fh-furtwangen.de>. [from HEAD]
2005-01-26 13:27:01 +00:00
Alexander Barton
9dc7666eed Updated list of contributors. 2005-01-26 13:26:41 +00:00
Alexander Barton
87ce4379e8 Fixed a possible buffer underrun when reading the MOTD file. Thanks to
Florian Westphal, <westphal@foo.fh-furtwangen.de>. [from HEAD].
2005-01-24 14:22:30 +00:00
Alexander Barton
0eb7ad58d0 Fixed detection of IRC lines which are too long to send. Detected by
Florian Westphal, <westphal@foo.fh-furtwangen.de>. [from HEAD]
2005-01-19 23:35:42 +00:00
Alexander Barton
883251ca05 Fixed return values of our own implementation of strlcpy(). The code has
been taken from rsync and they fixed it, but we didn't until today :-/ [HEAD]
2005-01-18 09:09:05 +00:00
Alexander Barton
e04d74ad3b Version 0.8.1 2004-12-25 00:20:57 +00:00
Alexander Barton
002d9299a6 Updated config.guess and config.sub [from HEAD]. 2004-12-25 00:11:42 +00:00
Alexander Barton
33cec4efd9 Added some more debug code ... [from HEAD]. 2004-12-25 00:00:42 +00:00
Alexander Barton
0999dc7907 Updated list of supported/tested platforms. 2004-11-09 10:58:01 +00:00
Alexander Barton
35fe11fea4 Fixed wrong variable names in output of "ngircd --configtest". [From HEAD]. 2004-09-27 11:30:52 +00:00
Alexander Barton
180fdb542b Added functions.inc to EXTRA_DIST files. [From HEAD]. 2004-09-08 09:45:53 +00:00
Alexander Barton
9cb9cca536 Fixed echo without newline for systems not understanding "echo -n"; added
new file "functions.inc" for functions usable by all test scripts. [From HEAD].
2004-09-06 22:07:26 +00:00
Alexander Barton
593cc7b4e2 Reverted extension of the "make all" target in the test-suite. 2004-09-06 20:35:00 +00:00
Alexander Barton
0be284db30 Fixed wrong exit code check of "kill -0". [From HEAD]. 2004-09-06 20:30:43 +00:00
Alexander Barton
e2e89067ae Changed version number to reflect CVS branch-0-8-x. 2004-09-06 00:41:34 +00:00
Alexander Barton
f632ca2645 ed name of "default file" for ngircd-full package. And do the test if
the binary is executable after reading this file. [From HEAD].
2004-09-06 00:36:49 +00:00
Alexander Barton
12497e1dd2 Updated documentation. 2004-09-04 20:50:53 +00:00
Alexander Barton
cabd09d9ae Updated "test suite". From HEAD. 2004-09-04 20:49:36 +00:00
Alexander Barton
98b92e112a Information for configuring ngIRCd. From HEAD. 2004-09-03 20:02:02 +00:00
Alexander Barton
2d524b1958 Fixed wrong email address. 2004-07-28 16:03:42 +00:00
Alexander Barton
d989166d3f Added missing commas to debian control file, fixes bug #56.
Thanks to Kevin Otte (nivex@nivex.net) for the patch.
2004-07-15 08:59:09 +00:00
Alexander Barton
f7c63e9237 Debian package version 0.8.0-0ab1 2004-06-26 09:27:29 +00:00
Alexander Barton
0958133a0a ngIRCd 0.8.0 2004-06-26 09:19:58 +00:00
Alexander Barton
205fea28b3 Updated documentation. 2004-06-26 09:12:38 +00:00
Alexander Barton
8cd18eb6b4 Added cast to integer for Solaris. 2004-06-26 09:06:27 +00:00
Alexander Barton
7f66fd908e Fixed wrong buffer size calculation for resolver results. 2004-05-30 16:24:21 +00:00
Alexander Barton
3c33a41fe8 Version 0.8.0-pre2 2004-05-15 23:55:48 +00:00
Alexander Barton
0d0cdf4831 Fixed host name lookups when using IDENT user lookups. 2004-05-15 23:52:17 +00:00
Alexander Barton
030fef4a8a Enhanced logging to console when running in "no-detached mode": added PID
and log messages of resolver sub-processes. [from HEAD]
2004-05-15 23:51:13 +00:00
Alexander Barton
15d31d31db "make clean" and "make maintainer-clean" remove more files now. [from HEAD] 2004-05-11 00:38:17 +00:00
Alexander Barton
2a3ec21702 Version 0.8.0-pre1 2004-05-07 11:56:19 +00:00
Alexander Barton
9f9576ce31 New "chroot" feature (from Benjamin Pineau), introducing new configuration
variables "ChrootDir" and "MotdPhrase". [from HEAD]
2004-05-07 11:24:17 +00:00
92 changed files with 2536 additions and 3907 deletions

View File

@@ -21,7 +21,7 @@ Goetz Hoffart, <goetz@hoffart.de> (goetz)
Ilja Osthoff, <i.osthoff@gmx.net> (ilja)
Benjamin Pineau, <ben@zouh.org>
Sean Reifschneider, <jafo-rpms@tummy.com>
Florian Westphal, <westphal@foo.fh-furtwangen.de> (fw)
Florian Westphal, <westphal@foo.fh-furtwangen.de>
Code snippets
@@ -32,4 +32,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.8.2.2 2005/01/26 13:26:41 alex Exp $

View File

@@ -1,7 +1,7 @@
ngIRCd - Next Generation IRC Server
(c)2001-2005 Alexander Barton,
(c)2001-2005 Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd is free software and published under the
@@ -10,74 +10,6 @@
-- ChangeLog --
ngIRCd 0.9.2 (2005-10-15)
- Fixed a bug that could cause the damon to crash when outgoing server
connections can't be established.
- Fixed a bug that caused the daemon to leak file descriptors when no
resolver subprocesses could be created.
- Fixed server NOTICEs to users with "s" mode ("server messages").
- Fixed a format string bug in "connection statistics" messages to clients.
ngIRCd 0.9.1 (2005-08-03)
- The KILL command killed much more than desired (including server links!)
when the target user is connected to a remote server. Bug introduced in
ngIRCd 0.9.0 ... Reported by <qssl@fastmail.fm>, Thanks!
- Changed some constants to be "signed" (instead of unsigned) to solve
problems with old (pre-ANSI) compilers.
ngIRCd 0.9.0 (2005-07-24)
ngIRCd 0.9.0-pre1 (2005-07-09)
- Fixed maximum length of user names, now allow up to 9 characters.
- Cut off oversized IRC messages that should be sent to the network instead
of shuttding down the (wrong) connection.
- Don't generate error messages for unknown commands received before the
client is registered with the server (like the original ircd).
- Never run with root privileges but always switch the user ID.
- Make "netsplit" messages RFC compliant.
- Fix handling of QUIT Messages: send only one message, even if the client
is member of multiple channels.
- Don't exit server if closing of a socket fails; instead ignore it and
pray that this will be "the right thing" ...
- Implemented the IRC function "WHOWAS".
- Don't enable assert() calls when not ./configure'd with --enable-debug.
- Fixed ./configure test for TCP Wrappers: now it runs on Mac OS X as well.
- Enhanced configure script: now you can pass an (optional) search path
to all --with-XXX parameters, e. g. "--with-ident=/opt/ident".
- Removed typedefs for the native C datatypes.
Use stdbool.h / inttypes.h if available.
- New configuration option "OperServerMode" to enable a workaround needed
when running an network with ircd2 servers and "OperCanUseMode" enabled
to prevent the ircd2 daemon to drop mode changes of IRC operators.
Patch by Florian Westphal, <westphal@foo.fh-furtwangen.de>.
- Implemented support for "secret channels" (channel mode "s").
- New configuration option "Mask" for [Operator] sections to limit OPER
commands to users with a specific IRC mask. Patch from Florian Westphal.
- Write "error file" (/tmp/ngircd-XXX.err) only if compiled with debug
code ("--enable-debug") and running as daemon process.
- Don't create version information string each time a client connects
but instead on server startup. By Florian Westphal.
- New configuration variable "PidFile", section "[Global]": if defined,
the server writes its process ID (PID) to this file. Default: off.
Idea of Florian Westphal, <westphal@foo.fh-furtwangen.de>.
- Code cleanups from Florian Westphal, <westphal@foo.fh-furtwangen.de>.
- Raised the maximum length of passwords to 20 characters.
- Fixed a memory leak when resizing the connection pool and realloc()
failed. Now we don't fall back to malloc(), which should be sane anyway.
Patch from Florian Westphal, <westphal@foo.fh-furtwangen.de>.
- Added support for the Howl (http://www.porchdogsoft.com/products/howl/)
Rendezvous API, in addition to the API of Apple (Mac OS X). The available
API will be autodetected when you call "./configure --with-rendezvous".
- Made ngIRCd compile on HP/UX 10.20 with native HP pre-ANSI C compiler and
most probably other older C compilers on other systems.
- When the daemon should switch to another user ID (ServerID is defined in
the configuration file) and is not running in a chroot environment, it
changes its working directory to the home directory of this user. This
should enable the system to write proper core files when not running with
root privileges ...
ngIRCd 0.8.3 (2005-02-03)
- Fixed a bug that could case a root exploit when the daemon is compiled
@@ -99,12 +31,12 @@ ngIRCd 0.8.2 (2005-01-26)
It has only been used when the system didn't implement strlcpy by itself,
not on "modern" systems. Florian Westphal, <westphal@foo.fh-furtwangen.de>.
ngIRCd 0.8.1 (2004-12-25)
nIRCd 0.8.1 (2004-12-25)
- Autoconf: Updated config.guess and config.sub
- Added some more debug code ...
- Fixed wrong variable names in output of "ngircd --configtest".
- Debian: Fixed the name of the "default file" in the init script for
- Debian: Fxied the name of the "default file" in the init script for
ngircd-full packages. And do the test if the binary is executable after
reading this file.
- Enhanced the "test suite": please have a look at src/testsuite/README!
@@ -113,11 +45,11 @@ ngIRCd 0.8.0 (2004-06-26)
- Fixed wrong buffer size calculation for results of the resolver.
ngircd 0.8.0-pre2 (2004-05-16)
ngIRCd 0.8.0-pre2 (2004-05-16)
- Enhanced logging to console when running in "no-detached mode": added
PID and log messages of resolver sub-processes.
- Fixed host name lookups when using IDENT user lookups.
- "make clean" and "make maintainer-clean" remove more files now.
- "make clean" and "make maintainer-clean" remove more files mow.
ngIRCd 0.8.0-pre1 (2004-05-07)
- Two new configuration options: "ChrootDir" and "MotdPhrase", thanks to
@@ -629,4 +561,4 @@ ngIRCd 0.0.1, 31.12.2001
--
$Id: ChangeLog,v 1.276.2.12 2005/10/15 12:44:08 alex Exp $
$Id: ChangeLog,v 1.233.2.20 2005/02/03 10:16:25 alex Exp $

View File

@@ -14,12 +14,6 @@
I. Upgrade Information
~~~~~~~~~~~~~~~~~~~~~~
Differences to version 0.8.x
- The maximum length of passwords has been raised to 20 characters (instead
of 8 characters). If your passwords are longer than 8 characters then they
are cut at an other position now.
Differences to version 0.6.x
- Some options of the configure script have been renamed:
@@ -183,4 +177,4 @@ number. In both cases the server exits after the output.
--
$Id: INSTALL,v 1.21 2005/02/10 08:20:09 alex Exp $
$Id: INSTALL,v 1.18.2.2 2004/09/03 20:02:02 alex Exp $

View File

@@ -8,7 +8,7 @@
# (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information.
#
# $Id: Makefile.am,v 1.16 2005/04/09 12:27:40 alex Exp $
# $Id: Makefile.am,v 1.14.2.1 2004/05/11 00:38:17 alex Exp $
#
AUTOMAKE_OPTIONS = gnu
@@ -27,15 +27,6 @@ maintainer-clean-local:
lint:
make -C src/ngircd lint
srcdoc:
make -C src srcdoc
xcode:
@xcodebuild -project contrib/MacOSX/ngIRCd.xcode -list >/dev/null 2>&1 \
|| ( echo; echo "Error: \"xcodebuild\" not found!"; echo; exit 1 )
xcodebuild -project contrib/MacOSX/ngIRCd.xcode -alltargets \
-buildstyle Development
rpm: distcheck
rpm -ta ngircd-*.tar.gz

25
NEWS
View File

@@ -1,7 +1,7 @@
ngIRCd - Next Generation IRC Server
(c)2001-2005 Alexander Barton,
(c)2001-2004 by Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd is free software and published under the
@@ -10,25 +10,6 @@
-- NEWS --
ngIRCd 0.9.0 (2005-07-24)
- Never run with root privileges but always switch the user ID.
- Make "netsplit" messages RFC compliant.
- Implemented the IRC function "WHOWAS".
- New configuration option "OperServerMode" to enable a workaround needed
when running an network with ircd2 servers and "OperCanUseMode" enabled
to prevent the ircd2 daemon to drop mode changes of IRC operators.
Patch by Florian Westphal, <westphal@foo.fh-furtwangen.de>.
- Implemented support for "secret channels" (channel mode "s").
- New configuration option "Mask" for [Operator] sections to limit OPER
commands to users with a specific IRC mask. Patch from Florian Westphal.
- New configuration variable "PidFile", section "[Global]": if defined,
the server writes its process ID (PID) to this file. Default: off.
Idea of Florian Westphal, <westphal@foo.fh-furtwangen.de>.
- Added support for the Howl (http://www.porchdogsoft.com/products/howl/)
Rendezvous API, in addition to the API of Apple (Mac OS X). The available
API will be autodetected when you call "./configure --with-rendezvous".
ngIRCd 0.8.0 (2004-06-26)
- Two new configuration options: "ChrootDir" and "MotdPhrase", thanks to
@@ -71,7 +52,7 @@ ngIRCd 0.7.0 (2003-05-01)
- Added support for TCP Wrappers library: pass "--with-tcp-wrappers" to
configure to enable it.
- Changed some configure options to use "--with"/"--without" as prefix
instead of "--enable"/"--disable": "--without-syslog", "--without-zlib",
insetead of "--enable"/"--disable": "--without-syslog", "--without-zlib",
"--with-tcp-wrappers", and "--with-rendezvous".
- Enhanced manual pages ngircd(8) and ngircd.conf(5).
- Documentation is now installed in $(datadir)/doc/ngircd.
@@ -208,4 +189,4 @@ ngIRCd 0.0.1, 31.12.2001
--
$Id: NEWS,v 1.74.2.1 2005/07/24 21:39:45 alex Exp $
$Id: NEWS,v 1.64.2.3 2004/06/26 09:12:38 alex Exp $

42
README
View File

@@ -1,19 +1,21 @@
ngIRCd - Next Generation IRC Server
(c)2001-2005 Alexander Barton,
(c)2001-2004 by Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd is free software and published under the
terms of the GNU General Public License.
-- README --
Ilja Osthoff, <ilja@glide.ath.cx>
I. Introduction
~~~~~~~~~~~~~~~
ngIRCd is an Open Source server for the Internet Relay Chat (IRC), which
ngIRCd is an Open-Source server for the Internet Relay Chat (IRC), which
is developed and published under the terms of the GNU General Public
Licence (URL: http://www.gnu.org/licenses/gpl.html). ngIRCd means "next
generation IRC daemon", it's written from scratch and not deduced from the
@@ -23,19 +25,15 @@ generation IRC daemon", it's written from scratch and not deduced from the
II. Status
~~~~~~~~~~~
It is not the goal of ngIRCd to implement all the nasty behaviours of the
original ircd, but to implement most of the useful commands and semantics
specified by the RFCs.
At present, the ngIRCd is under active development, some features are not
implemented, some only partly.
In the meantime ngIRCd should be quite feature complete and stable to be
used in real IRC networks.
Implemented IRC-commands are:
Till today (more or less complete) implemented IRC-commands:
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.
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.
III. Features (or: why use ngIRCd?)
@@ -45,23 +43,25 @@ III. Features (or: why use ngIRCd?)
- simple, easy understandable configuration file,
- freely published open-source C source code,
- ngIRCd will be developed on in the future.
- wide field of supported platforms, including AIX, A/UX, FreeBSD, HP-UX,
IRIX, Linux, Mac OS X, NetBSD, OpenBSD, Solaris, and Windows with Cygwin.
- supported platforms (tested versions): AIX (3.2.5), A/UX (3.0.1), FreeBSD
(4.5), HP-UX (10.20), IRIX (6.5), Linux (2.x), Mac OS X (10.x), NetBSD
(1.5.2/i386, 1.5.3/m68k), Solaris (2.5.1, 2.6), Windows with Cygwin, and
OpenBSD (3.4/i386).
IV. Documentation
~~~~~~~~~~~~~~~~~
More documentation can be found in the "doc/" directory and the homepage of
the ngIRCd: <http://ngircd.barton.de/>.
the ngIRCd: <http://arthur.ath.cx/~alex/ngircd/>.
V. Download
~~~~~~~~~~~
The homepage of the ngIRCd is: <http://ngircd.barton.de/>; you will find
the newest information about the ngIRCd and the most recent ("stable")
releases there.
The homepage of the ngIRCd is: <http://arthur.ath.cx/~alex/ngircd>; you
will find the newest information about the ngIRCd and the most recent
("stable") releases there.
If you are interested in the latest development versions (which are not
always stable), then please read the section "CVS" on the homepage and
@@ -75,13 +75,13 @@ VI. Bugs
If you find bugs in the ngIRCd (which might be there :-), please report
them at the following URL:
<http://ngircd.barton.de/#bugs>
<http://arthur.ath.cx/~alex/ngircd/#bugs>
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: <alex@barton.de> or <alex@arthur.ath.cx>
--
$Id: README,v 1.20.2.1 2005/07/09 14:41:39 alex Exp $
$Id: README,v 1.18.2.1 2004/05/07 11:24:17 alex Exp $

View File

@@ -9,7 +9,7 @@
# (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information.
#
# $Id: autogen.sh,v 1.14 2005/02/21 15:23:23 alex Exp $
# $Id: autogen.sh,v 1.12 2004/04/05 12:02:21 alex Exp $
#
#
@@ -85,7 +85,7 @@ Search()
fi
$EXIST "${name}-${major}.${minor}" >/dev/null 2>&1
if [ $? -eq 0 ]; then
echo "${name}-${major}.${minor}"
echo "${name}-${major}.${minor}" >/dev/null 2>&1
return 0
fi
done
@@ -125,11 +125,7 @@ fi
[ "$VERBOSE" = "1" ] && echo "Using \"$EXIST\" to test for tools."
# We want to use GNU automake 1.7, if available (WANT_AUTOMAKE is used by
# the wrapper scripts of Gentoo Linux, 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
# the wrapper scripts of Gentoo Linux):
WANT_AUTOMAKE=1.7
export WANT_AUTOMAKE

20
config.guess vendored
View File

@@ -1,9 +1,9 @@
#! /bin/sh
# Attempt to guess a canonical system name.
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
# 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
timestamp='2005-04-22'
timestamp='2004-11-12'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -53,7 +53,7 @@ version="\
GNU config.guess ($timestamp)
Originally written by Per Bothner.
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
@@ -804,9 +804,6 @@ EOF
i*:UWIN*:*)
echo ${UNAME_MACHINE}-pc-uwin
exit 0 ;;
amd64:CYGWIN*:*:*)
echo x86_64-unknown-cygwin
exit 0 ;;
p*:CYGWIN*:*)
echo powerpcle-unknown-cygwin
exit 0 ;;
@@ -1140,10 +1137,6 @@ EOF
# From seanf@swdc.stratus.com.
echo i860-stratus-sysv4
exit 0 ;;
i*86:VOS:*:*)
# From Paul.Green@stratus.com.
echo ${UNAME_MACHINE}-stratus-vos
exit 0 ;;
*:VOS:*:*)
# From Paul.Green@stratus.com.
echo hppa1.1-stratus-vos
@@ -1204,9 +1197,6 @@ EOF
*:QNX:*:4*)
echo i386-pc-qnx
exit 0 ;;
NSE-?:NONSTOP_KERNEL:*:*)
echo nse-tandem-nsk${UNAME_RELEASE}
exit 0 ;;
NSR-?:NONSTOP_KERNEL:*:*)
echo nsr-tandem-nsk${UNAME_RELEASE}
exit 0 ;;
@@ -1423,9 +1413,7 @@ This script, last modified $timestamp, has failed to recognize
the operating system you are using. It is advised that you
download the most up to date version of the config scripts from
http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
and
http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
ftp://ftp.gnu.org/pub/gnu/config/
If the version you run ($0) is already up to date, please
send the following data and any information you think might be

19
config.sub vendored
View File

@@ -1,9 +1,9 @@
#! /bin/sh
# Configuration validation subroutine script.
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
# 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
timestamp='2005-04-22'
timestamp='2004-11-30'
# This file is (in principle) common to ALL GNU software.
# The presence of a machine in this file suggests that SOME GNU software
@@ -70,7 +70,7 @@ Report bugs and patches to <config-patches@gnu.org>."
version="\
GNU config.sub ($timestamp)
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
@@ -231,14 +231,13 @@ case $basic_machine in
| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
| am33_2.0 \
| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
| bfin \
| c4x | clipper \
| d10v | d30v | dlx | dsp16xx \
| fr30 | frv \
| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
| i370 | i860 | i960 | ia64 \
| ip2k | iq2000 \
| m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \
| m32r | m32rle | m68000 | m68k | m88k | mcore \
| mips | mipsbe | mipseb | mipsel | mipsle \
| mips16 \
| mips64 | mips64el \
@@ -263,8 +262,7 @@ case $basic_machine in
| pyramid \
| sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
| sh64 | sh64le \
| sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \
| sparcv8 | sparcv9 | sparcv9b \
| sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv8 | sparcv9 | sparcv9b \
| strongarm \
| tahoe | thumb | tic4x | tic80 | tron \
| v850 | v850e \
@@ -300,7 +298,7 @@ case $basic_machine in
| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
| arm-* | armbe-* | armle-* | armeb-* | armv*-* \
| avr-* \
| bfin-* | bs2000-* \
| bs2000-* \
| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
| clipper-* | craynv-* | cydra-* \
| d10v-* | d30v-* | dlx-* \
@@ -312,7 +310,7 @@ case $basic_machine in
| ip2k-* | iq2000-* \
| m32r-* | m32rle-* \
| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
| m88110-* | m88k-* | maxq-* | mcore-* \
| m88110-* | m88k-* | mcore-* \
| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
| mips16-* \
| mips64-* | mips64el-* \
@@ -338,8 +336,7 @@ case $basic_machine in
| romp-* | rs6000-* \
| sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \
| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
| sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \
| sparclite-* \
| sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \
| sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
| tahoe-* | thumb-* \
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \

View File

@@ -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.111.2.6 2005/10/15 12:44:08 alex Exp $
# $Id: configure.in,v 1.102.2.7 2005/02/03 10:16:25 alex Exp $
#
# -- Initialisation --
AC_PREREQ(2.50)
AC_INIT(ngircd, 0.9.2)
AC_INIT(ngircd, 0.8.3)
AC_CONFIG_SRCDIR(src/ngircd/ngircd.c)
AC_CANONICAL_TARGET
AM_INIT_AUTOMAKE(1.6)
@@ -85,14 +85,14 @@ AC_CHECK_HEADERS([ \
strings.h sys/socket.h sys/time.h unistd.h \
],,AC_MSG_ERROR([required C header missing!]))
AC_CHECK_HEADERS([arpa/inet.h ctype.h malloc.h stdbool.h stddef.h varargs.h])
AC_CHECK_HEADERS([arpa/inet.h ctype.h malloc.h stdint.h varargs.h])
# -- Datatypes --
AC_MSG_CHECKING(whether socklen_t exists)
AC_TRY_COMPILE([
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <sys/types.h>
],[
socklen_t a, b;
a = 2; b = 4; a += b;
@@ -121,7 +121,7 @@ AC_CHECK_FUNCS([ \
memset realloc setsid setsockopt socket strcasecmp strchr strerror \
strstr waitpid],,AC_MSG_ERROR([required function missing!]))
AC_CHECK_FUNCS(inet_aton isdigit sigaction snprintf vsnprintf strdup strlcpy strlcat)
AC_CHECK_FUNCS(inet_aton isdigit sigaction snprintf vsnprintf strlcpy strlcat)
AC_CHECK_FUNCS(select,[AC_CHECK_HEADERS(sys/select.h)],
AC_MSG_ERROR([required function select() is missing!])
@@ -132,12 +132,7 @@ AC_CHECK_FUNCS(select,[AC_CHECK_HEADERS(sys/select.h)],
x_syslog_on=no
AC_ARG_WITH(syslog,
[ --without-syslog disable syslog (autodetected by default)],
[ if test "$withval" != "no"; then
if test "$withval" != "yes"; then
CFLAGS="-I$withval/include $CFLAGS"
CPPFLAGS="-I$withval/include $CPPFLAGS"
LDFLAGS="-L$withval/lib $LDFLAGS"
fi
[ if test "$withval" = "yes"; then
AC_CHECK_LIB(be, syslog)
AC_CHECK_FUNCS(syslog, x_syslog_on=yes,
AC_MSG_ERROR([Can't enable syslog!])
@@ -151,18 +146,13 @@ AC_ARG_WITH(syslog,
)
if test "$x_syslog_on" = "yes"; then
AC_DEFINE(SYSLOG, 1)
AC_CHECK_HEADERS(syslog.h,,AC_MSG_ERROR([required C header missing!]))
AC_CHECK_HEADERS(syslog.h)
fi
x_zlib_on=no
AC_ARG_WITH(zlib,
[ --without-zlib disable zlib compression (autodetected by default)],
[ if test "$withval" != "no"; then
if test "$withval" != "yes"; then
CFLAGS="-I$withval/include $CFLAGS"
CPPFLAGS="-I$withval/include $CPPFLAGS"
LDFLAGS="-L$withval/lib $LDFLAGS"
fi
[ if test "$withval" = "yes"; then
AC_CHECK_LIB(z, deflate)
AC_CHECK_FUNCS(deflate, x_zlib_on=yes,
AC_MSG_ERROR([Can't enable zlib!])
@@ -175,26 +165,20 @@ AC_ARG_WITH(zlib,
)
if test "$x_zlib_on" = "yes"; then
AC_DEFINE(ZLIB, 1)
AC_CHECK_HEADERS(zlib.h,,AC_MSG_ERROR([required C header missing!]))
AC_CHECK_HEADERS(zlib.h)
fi
x_tcpwrap_on=no
AC_ARG_WITH(tcp-wrappers,
[ --with-tcp-wrappers enable TCP wrappers support],
[ if test "$withval" != "no"; then
if test "$withval" != "yes"; then
CFLAGS="-I$withval/include $CFLAGS"
CPPFLAGS="-I$withval/include $CPPFLAGS"
LDFLAGS="-L$withval/lib $LDFLAGS"
fi
[ if test "$withval" = "yes"; then
AC_CHECK_LIB(wrap, tcpd_warn)
AC_MSG_CHECKING(for hosts_access)
LIBS="-lwrap $LIBS"
AC_TRY_LINK([
#include <tcpd.h>
int allow_severity = 0;
int deny_severity = 0;
#include <tcpd.h>
],[
tcpd_warn("link test");
void *ptr;
ptr = hosts_access;
],[
AC_MSG_RESULT(yes)
AC_DEFINE(TCPWRAP, 1)
@@ -210,59 +194,22 @@ int deny_severity = 0;
x_rendezvous_on=no
AC_ARG_WITH(rendezvous,
[ --with-rendezvous enable support for "Rendezvous"],
[ if test "$withval" != "no"; then
if test "$withval" != "yes"; then
CFLAGS="-I$withval/include $CFLAGS"
CPPFLAGS="-I$withval/include $CPPFLAGS"
LDFLAGS="-L$withval/lib $LDFLAGS"
fi
AC_CHECK_FUNCS(DNSServiceRegistrationCreate, x_rendezvous_on=osx,
[
AC_CHECK_LIB(pthread, pthread_mutexattr_init)
AC_CHECK_LIB(howl, sw_discovery_init)
AC_CHECK_FUNCS(sw_discovery_init, \
x_rendezvous_on=howl, \
AC_MSG_ERROR([Can't enable Rendezvous!]))
])
[ if test "$withval" = "yes"; then
AC_CHECK_FUNCS(DNSServiceRegistrationCreate, x_rendezvous_on=yes,
AC_MSG_ERROR([Can't enable Rendezvous!])
)
fi
]
)
if test "$x_rendezvous_on" = "osx"; then
AC_CHECK_HEADERS([DNSServiceDiscovery/DNSServiceDiscovery.h \
mach/port.h],,AC_MSG_ERROR([required C header missing!]))
AC_DEFINE(RENDEZVOUS, 1)
fi
if test "$x_rendezvous_on" = "howl"; then
for dir in /usr/local/include /usr/local/include/howl* \
/usr/include /usr/include/howl*; do
test -d "$dir" || continue
AC_MSG_CHECKING([for Howl headers in $dir])
if test -f "$dir/rendezvous/rendezvous.h"; then
if test "$dir" != "/usr/local/include" -a \
"$dir" != "/usr/include"; then
CFLAGS="-I$dir $CFLAGS"
CPPFLAGS="-I$dir $CPPFLAGS"
fi
AC_MSG_RESULT(yes)
break
else
AC_MSG_RESULT(no)
fi
done
AC_CHECK_HEADERS([rendezvous/rendezvous.h],, \
AC_MSG_ERROR([required C header missing!]))
if test "$x_rendezvous_on" = "yes"; then
AC_DEFINE(RENDEZVOUS, 1)
AC_CHECK_HEADERS(DNSServiceDiscovery/DNSServiceDiscovery.h mach/port.h)
fi
x_identauth_on=no
AC_ARG_WITH(ident,
[ --with-ident enable "IDENT" ("AUTH") protocol support],
[ if test "$withval" != "no"; then
if test "$withval" != "yes"; then
CFLAGS="-I$withval/include $CFLAGS"
CPPFLAGS="-I$withval/include $CPPFLAGS"
LDFLAGS="-L$withval/lib $LDFLAGS"
fi
[ if test "$withval" = "yes"; then
AC_CHECK_LIB(ident, ident_id)
AC_CHECK_FUNCS(ident_id, x_identauth_on=yes,
AC_MSG_ERROR([Can't enable IDENT support!])
@@ -272,7 +219,7 @@ AC_ARG_WITH(ident,
)
if test "$x_identauth_on" = "yes"; then
AC_DEFINE(IDENTAUTH, 1)
AC_CHECK_HEADERS(ident.h,,AC_MSG_ERROR([required C header missing!]))
AC_CHECK_HEADERS(ident.h)
fi
x_ircplus_on=yes
@@ -348,7 +295,7 @@ fi
# -- Result --
echo
echo "ngIRCd $PACKAGE_VERSION has been configured with the following options:"
echo "ngIRCd has been configured with the following options:"
echo
# Someone please show me a better way :) [borrowed by OpenSSH]
@@ -400,7 +347,7 @@ test "$x_strict_rfc_on" = "yes" \
|| echo "no"
echo $ECHO_N " Rendezvous support: $ECHO_C"
test "$x_rendezvous_on" = "osx" -o "$x_rendezvous_on" = "howl" \
test "$x_rendezvous_on" = "yes" \
&& echo $ECHO_N "yes $ECHO_C" \
|| echo $ECHO_N "no $ECHO_C"
echo $ECHO_N " IRC+ protocol: $ECHO_C"

View File

@@ -8,7 +8,7 @@
# (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information.
#
# $Id: Makefile.am,v 1.4 2004/05/11 00:32:31 alex Exp $
# $Id: Makefile.am,v 1.3.2.1 2004/05/11 00:38:17 alex Exp $
#
EXTRA_DIST = rules changelog compat control copyright \

View File

@@ -1,28 +1,3 @@
ngircd (0.9.2-0ab1) stable; urgency=low
* New "upstream release" fixing a few bugs in 0.9.1.
-- Alexander Barton <alex@barton.de> Sat, 15 Oct 2005 14:10:34 +0200
ngircd (0.9.1-0ab1) unstable; urgency=medium
* New "upstream release" addressing two problems in ngIRCd 0.9.0.
-- Alexander Barton <alex@barton.de> Wed, 3 Aug 2005 15:10:41 +0200
ngircd (0.9.0-0ab2) unstable; urgency=medium
* Init script: fixed a problem with symbolic links in runlevel directories
that could prevent the init script from working correctly.
-- Alexander Barton <alex@barton.de> Tue, 26 Jul 2005 21:31:18 +0200
ngircd (0.9.0-0ab1) unstable; urgency=low
* New "upstream release".
-- Alexander Barton <alex@Arthur.Ath.CX> Sat, 24 Jul 2005 23:30:00 +0200
ngircd (0.8.3-0ab1) unstable; urgency=high
* New "upstream release", including security fixes.
@@ -54,13 +29,6 @@ ngircd (0.8.0-0ab1) unstable; urgency=low
-- Alexander Barton <alex@Arthur.Ath.CX> Sat, 26 Jun 2004 11:25:59 +0200
ngircd (0.7.7+HEAD-0ab6) unstable; urgency=low
* Incorporated actual CVS HEAD version which includes all features of
version 0.8.0-pre1 and patches for the resolver and logger.
-- Alexander Barton <alex@Arthur.Ath.CX> Tue, 11 May 2004 02:18:50 +0200
ngircd (0.7.7+HEAD-0ab5) unstable; urgency=low
* Updates from CVS HEAD branch, most notably: "INVITE- and BAN-lists

View File

@@ -2,18 +2,16 @@
#
# ngIRCd start and stop script for Debian-based systems
#
# $Id: ngircd.init,v 1.5.2.1 2005/07/26 19:30:54 alex Exp $
# $Id: ngircd.init,v 1.1.2.1 2004/09/06 00:36:49 alex Exp $
#
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/ngircd
NAME=ngIRCd
BASENAME=`basename $0`
DESC="IRC daemon"
PARAMS=""
test -h "$0" && me=`readlink $0` || me="$0"
BASENAME=`basename $me`
test -f /etc/default/$BASENAME && . /etc/default/$BASENAME
test -x $DAEMON || exit 0
@@ -30,7 +28,6 @@ Check_Config()
Try_Start()
{
[ ! -d /var/run/ircd ] || chown irc:irc /var/run/ircd
start-stop-daemon --start --quiet --exec $DAEMON -- $PARAMS
if [ $? -ne 0 ]; then
echo "$NAME failed!"
@@ -47,7 +44,7 @@ case "$1" in
;;
stop)
echo -n "Stopping $DESC: "
start-stop-daemon --stop --quiet --pidfile /var/run/ircd/ngircd.pid --exec $DAEMON \
start-stop-daemon --stop --quiet --exec $DAEMON \
&& echo "$NAME." \
|| echo "(none running)"
;;

View File

@@ -11,7 +11,7 @@
#
# debian/rules for ngIRCd
#
# $Id: rules,v 1.3 2005/02/07 23:09:31 alex Exp $
# $Id: rules,v 1.2 2004/01/01 22:24:48 alex Exp $
#
# Based on the sample debian/rules that uses debhelper,
# GNU copyright 1997 to 1999 by Joey Hess.
@@ -38,7 +38,7 @@ endif
configure-ngircd: configure
dh_testdir
# configure "standard" variant:
./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) \
--prefix=/usr \
@@ -48,7 +48,7 @@ configure-ngircd: configure
configure-ngircd-full: configure
dh_testdir
# configure "full" variant:
./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) \
--prefix=/usr \
@@ -63,20 +63,20 @@ build-ngircd: build-stamp-ngircd
build-stamp-ngircd: configure-ngircd
dh_testdir
rm -f build-stamp-*
# Add here commands to compile the "standard" package:
$(MAKE)
touch build-stamp-ngircd
build-ngircd-full: build-stamp-ngircd-full
build-stamp-ngircd-full: configure-ngircd-full
dh_testdir
rm -f build-stamp-*
# Add here commands to compile the "full" package:
$(MAKE)
touch build-stamp-ngircd-full
clean:
@@ -86,10 +86,10 @@ clean:
rm -f $(CURDIR)/debian/ngircd-full.default
rm -f $(CURDIR)/debian/ngircd-full.init
rm -f $(CURDIR)/debian/ngircd-full.postinst
# Add here commands to clean up after the build process:
-$(MAKE) clean
ifneq "$(wildcard /usr/share/misc/config.sub)" ""
cp -f /usr/share/misc/config.sub config.sub
endif
@@ -104,39 +104,23 @@ install-ngircd: build-ngircd
dh_testdir
dh_testroot
dh_installdirs
# Add here commands to install the "standard" package into debian/ngircd:
$(MAKE) install DESTDIR=$(CURDIR)/debian/ngircd
rm $(CURDIR)/debian/ngircd/usr/share/doc/ngircd/INSTALL*
rm $(CURDIR)/debian/ngircd/usr/share/doc/ngircd/COPYING*
mkdir -p $(CURDIR)/debian/ngircd/var/run/ircd
cat $(CURDIR)/debian/ngircd/usr/share/doc/ngircd/sample-ngircd.conf | \
sed -e "s/;ServerUID = 65534/ServerUID = irc/g" | \
sed -e "s/;ServerGID = 65534/ServerGID = irc/g" | \
sed -e "s/;MotdFile = \/usr\/local\/etc\/ngircd.motd/MotdFile = \/etc\/ngircd\/ngircd.motd/g" | \
sed -e "s/;PidFile = \/var\/run\/ngircd\/ngircd.pid/PidFile = \/var\/run\/ircd\/ngircd.pid/g" \
>$(CURDIR)/debian/ngircd/etc/ngircd/ngircd.conf
touch $(CURDIR)/debian/ngircd/etc/ngircd/ngircd.motd
install-ngircd-full: build-ngircd-full
dh_testdir
dh_testroot
dh_installdirs
# Add here commands to install the "full" package into debian/ngircd-full:
$(MAKE) install DESTDIR=$(CURDIR)/debian/ngircd-full
rm $(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd/INSTALL*
rm $(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd/COPYING*
mv $(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd \
$(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd-full
mkdir -p $(CURDIR)/debian/ngircd-full/var/run/ircd
cat $(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd-full/sample-ngircd.conf | \
sed -e "s/;ServerUID = 65534/ServerUID = irc/g" | \
sed -e "s/;ServerGID = 65534/ServerGID = irc/g" | \
sed -e "s/;MotdFile = \/usr\/local\/etc\/ngircd.motd/MotdFile = \/etc\/ngircd\/ngircd.motd/g" | \
sed -e "s/;PidFile = \/var\/run\/ngircd\/ngircd.pid/PidFile = \/var\/run\/ircd\/ngircd.pid/g" \
>$(CURDIR)/debian/ngircd-full/etc/ngircd/ngircd.conf
touch $(CURDIR)/debian/ngircd-full/etc/ngircd/ngircd.motd
# Build architecture-independent files here.
binary-indep:

View File

@@ -8,7 +8,7 @@
# (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information.
#
# $Id: Makefile.am,v 1.2 2004/05/11 00:34:26 alex Exp $
# $Id: Makefile.am,v 1.1.2.1 2004/05/11 00:38:17 alex Exp $
#
clean-local:

View File

@@ -6,11 +6,17 @@
objectVersion = 39;
objects = {
014CEA520018CE5811CA2923 = {
buildRules = (
);
buildSettings = {
COPY_PHASE_STRIP = NO;
DEBUGGING_SYMBOLS = YES;
GCC_DYNAMIC_NO_PIC = NO;
GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
ZERO_LINK = YES;
OPTIMIZATION_CFLAGS = "-O0";
ZERO_LINK = NO;
};
isa = PBXBuildStyle;
name = Development;
@@ -30,7 +36,6 @@
};
buildStyles = (
014CEA520018CE5811CA2923,
FA2002770807EE21005A2F4C,
);
hasScannedForEncodings = 1;
isa = PBXProject;
@@ -66,7 +71,6 @@
08FB7795FE84155DC02AAC07 = {
children = (
FADE2B9005F14C6C0081A16E,
FA59ACBF080854DC00CD93BE,
FADE2AED05F14A6A0081A16E,
FADE2AEE05F14A700081A16E,
FADE2AEF05F14A760081A16E,
@@ -75,7 +79,6 @@
);
isa = PBXGroup;
name = src;
path = "";
refType = 4;
sourceTree = "<group>";
};
@@ -270,21 +273,6 @@
//FA2
//FA3
//FA4
FA2002770807EE21005A2F4C = {
buildSettings = {
};
isa = PBXBuildStyle;
name = Deployment;
};
FA59ACBF080854DC00CD93BE = {
fileEncoding = 5;
isa = PBXFileReference;
lastKnownFileType = text;
name = Doxyfile;
path = ../../src/Doxyfile;
refType = 2;
sourceTree = SOURCE_ROOT;
};
FA83332A0627391D00A909F0 = {
isa = PBXFileReference;
lastKnownFileType = "compiled.mach-o.dylib";
@@ -641,9 +629,9 @@
isa = PBXFileReference;
lastKnownFileType = text;
name = ngircd.spec;
path = ../ngircd.spec;
refType = 2;
sourceTree = SOURCE_ROOT;
path = /local/alex/Develop/ngircd/HEAD/contrib/ngircd.spec;
refType = 0;
sourceTree = "<absolute>";
};
FADE2AED05F14A6A0081A16E = {
children = (

View File

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

View File

@@ -17,7 +17,7 @@ A: Yes. ngIRCd is compatible to the original ircd used by IRCNet. Actually
this is being tested with version 2.10.3p3.
Q: Is there a homepage with further information and downloads?
A: Yes. Please visit <http://ngircd.barton.de/>.
A: Yes. Please visit <http://arthur.ath.cx/~alex/ngircd/>.
Q: Why should I use ngIRCd instead of the original one?
A: ngIRCd offers several benefits: no problems with dynamic IPs, easy to
@@ -51,29 +51,17 @@ A: Most probably you are using version 1.5 of GNU automake which seems to be
1.4 of GNU automake shipped with this distribution; it should work, too.)
III. Runtime
~~~~~~~~~~~~
Q: I cannot connect to remote peers when I use the chroot option, the
following is logged: "Can't resolve example.com: unknown error!".
A: On Linux/glibc with chroot enabled you need to put some libraries inside
the chroot as well, notably libnss_dns; maybe others. Unfortunately, even
linking ngircd statically does not help this. The only known workaround
is to either disable chroot support or to link against dietlibc instead
of glibc. (tnx to Sebastian Siewior)
IV. Bugs!?
~~~~~~~~~~
III. Bugs!?
~~~~~~~~~~~
Q: Is there a list of known bugs and desired feature enhancements?
A: Yes. Have a look at the bug tracking system (Bugzilla) for ngIRCd located
at <http://ngircd.barton.de/bugzilla/index.cgi>. There you can file bug
reports and feature requests as well as search the bug database.
at <http://arthur.ath.cx/bugzilla/ngircd/>. There you can file bug reports
and feature requests as well as search the bug database.
Q: What should I do if I found a bug?
A: Please file a bug report at <http://ngircd.barton.de/bugzilla/index.cgi>!
A: Please file a bug report at <http://arthur.ath.cx/bugzilla/ngircd/>!
The author of the particular component will be notified automagically :-)
--
$Id: FAQ.txt,v 1.7.4.1 2005/07/09 14:41:39 alex Exp $
$Id: FAQ.txt,v 1.7 2003/11/07 21:32:15 alex Exp $

View File

@@ -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.18 2005/04/27 07:52:29 alex Exp $
# $Id: Makefile.am,v 1.17 2003/04/22 23:50:18 alex Exp $
#
EXTRA_DIST = CVS.txt FAQ.txt Protocol.txt Platforms.txt \
@@ -18,9 +18,6 @@ EXTRA_DIST = CVS.txt FAQ.txt Protocol.txt Platforms.txt \
maintainer-clean-local:
rm -f Makefile Makefile.in
distclean-local:
rm -rf src
docdir = $(datadir)/doc/$(PACKAGE)
documents = $(EXTRA_DIST) ../AUTHORS ../COPYING ../ChangeLog ../INSTALL \

View File

@@ -1,7 +1,7 @@
ngIRCd - Next Generation IRC Server
(c)2001-2005 Alexander Barton
(c)2001-2004 Alexander Barton
alex@barton.de, http://www.barton.de/
ngIRCd is free software and published under the
@@ -28,20 +28,18 @@ Platform Compiler ngIRCd Date Tester C M T R See
--------------------------- ------------ ---------- -------- ------ - - - - ---
hppa/unknown/openbsd3.5 gcc 2.95.3 CVSHEAD 04-05-25 alex Y Y Y Y
hppa1.1/unknown/linux-gnu gcc 3.3.3 0.8.0 04-05-30 alex Y Y Y Y
hppa2.0/unknown/linux-gnu gcc 3.3.5 0.9.x-CVS 05-06-27 alex Y Y Y Y
i386/pc/solaris2.9 gcc 3.2.2 CVSHEAD 04-02-24 alex Y Y Y Y
i386/unknown/freebsd5.2.1 gcc 3.3.3 0.8.0 04-05-30 alex Y Y Y Y
i386/unknown/gnu0.3 gcc 3.3.3 0.8.0 04-05-30 alex Y Y n Y
i386/unknown/netbsdelf1.6.1 gcc 2.95.3 CVSHEAD 04-02-24 alex Y Y Y Y
i686/pc/cygwin gcc 3.3.1 0.9.x-CVS 05-07-08 alex Y Y n Y
i686/pc/cygwin gcc 3.3.1 0.8.0 04-05-30 alex Y Y n Y
i686/pc/linux-gnu gcc 2.95.4 0.8.0 04-05-30 alex Y Y Y Y (1)
i686/pc/linux-gnu gcc 3.3.5 0.9.x-CVS 05-07-09 alex Y Y Y Y (1)
i686/pc/linux-gnu gcc 3.3.3 0.8.0 04-05-30 alex Y Y Y Y (1)
m68k/apple/aux3.1.1 Orig. A/UX 0.7.x-CVS 03-04-22 alex Y Y Y Y (2)
m68k/hp/hp-ux9.10 Orig. HPUX 0.7.x-CVS 03-04-30 goetz Y Y Y Y
m88k/dg/dgux5.4R3.10 gcc 2.5.8 CVSHEAD 04-03-15 alex Y Y ? ?
powerpc/apple/darwin6.5 gcc 3.1 0.7.x-CVS 03-04-23 alex Y Y Y Y
powerpc/apple/darwin7.4.0 gcc 3.3 0.8.0 04-05-30 alex Y Y Y Y
powerpc/apple/darwin8.1.0 gcc 4.0 0.9.x-CVS 05-06-27 alex Y Y Y Y
powerpc/unknown/linux-gnu gcc 3.3.3 0.8.0 04-05-30 alex Y Y Y Y
sparc/sun/solaris2.6 gcc 2.95.3 0.7.x-CVS 03-04-22 alex Y Y Y Y
sparc/sun/solaris2.7 gcc 3.3 0.8.0 04-05-30 alex Y Y Y Y
@@ -62,4 +60,4 @@ Notes
--
$Id: Platforms.txt,v 1.13.2.2 2005/07/09 11:16:38 alex Exp $
$Id: Platforms.txt,v 1.11.2.1 2004/11/09 10:58:01 alex Exp $

View File

@@ -1,7 +1,7 @@
ngIRCd - Next Generation IRC Server
(c)2001-2005 Alexander Barton,
(c)2001-2003 by Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd is free software and published under the
@@ -22,7 +22,7 @@ The following software packages are needed:
- GNU sed
Source:
http://www.rezepte-im-web.de/appleux/sed-3.02.tar.gz
ftp://arthur.barton.de/pub/UNIX/AUX/Tools/sed-3.02.tar.gz
ftp://arthur.ath.cx/pub/AUX/Software/Tools/sed-3.02.tar.gz
A/UX comes with /bin/sed which isn't supporting all functions needed
by GNU automake/autoconf.
@@ -33,8 +33,8 @@ The following software packages are needed:
- libUTIL.a
Source:
ftp://ftp.mayn.de/pub/really_old_stuff/apple/apple_unix/Sys_stuff/libUTIL-2.1.tar.gz>
ftp://arthur.barton.de/pub/UNIX/AUX/Libraries/libUTIL-2.1.tar.gz
http://ftp.mayn.de/pub/apple/apple_unix/Sys_stuff/libUTIL-2.1.tar.gz
ftp://arthur.ath.cx/pub/AUX/Software/Libraries/libUTIL-2.1.tar.gz
This library contains functions that are common on other UNIX
systems but not on A/UX e.g. memmove(), strerror() und strdup().
@@ -50,7 +50,7 @@ A few hints in case of errors:
(so 'configure' uses its own shell script) or use a fully functionable one.
There's at least one binary "out there" causing problems. The one
of the GNU fileutils works fine:
ftp://arthur.barton.de/pub/UNIX/AUX/Software/Tools/fileutils-4.0.tar.gz
ftp://arthur.ath.cx/pub/UNIX/AUX/Software/Tools/fileutils-4.0.tar.gz
- The precompiled binary of the old 'bash' shouldn't be installed within
/bin (better do this in /usr/local/bin) because 'configure' would
@@ -64,4 +64,4 @@ A few hints in case of errors:
even if you don't use ngIRCd.
--
$Id: README-AUX.txt,v 1.9 2005/06/24 20:59:13 alex Exp $
$Id: README-AUX.txt,v 1.8 2003/04/21 21:59:34 goetz Exp $

View File

@@ -55,4 +55,4 @@ Probably ngIRCd will include support for SSL in the future ...
--
$Id: SSL.txt,v 1.2 2004/12/27 01:11:40 alex Exp $
$Id: SSL.txt,v 1.2.2.1 2005/01/26 21:47:47 alex Exp $

View File

@@ -1,4 +1,4 @@
# $Id: sample-ngircd.conf,v 1.33 2005/03/15 16:58:01 alex Exp $
# $Id: sample-ngircd.conf,v 1.25.2.1 2004/05/07 11:24:17 alex Exp $
#
# This is a sample configuration file for the ngIRCd, which must be adepted
@@ -11,6 +11,7 @@
#
[Global]
# The [Global] section of this file is used to define the main
# configuration of the server, like the server name and the ports
# on which the server should be listening.
@@ -33,8 +34,8 @@
;AdminEMail = admin@irc.server
# Ports on which the server should listen. There may be more than
# one port, separated with ",". (Default: 6667)
;Ports = 6667, 6668, 6669
# one port, separated with ";". (Default: 6667)
;Ports = 6667, 6668, 66694
# IP address on which the server should listen. (Default: empty,
# so the server listens on all IP addresses of the system)
@@ -67,12 +68,6 @@
# with root privileges!
;ChrootDir = /var/empty
# This tells ngircd to write its current process id to a file.
# Note that the pidfile is written AFTER chroot and switching uid,
# i. e. the Directory the pidfile resides in must be writeable by
# the ngircd user and exist in the chroot directory.
;PidFile = /var/run/ngircd/ngircd.pid
# After <PingTimeout> seconds of inactivity the server will send a
# PING to the peer to test whether it is alive or not.
;PingTimeout = 120
@@ -89,10 +84,6 @@
# they are not(!) channel-operators?
;OperCanUseMode = no
# Mask IRC Operator mode requests as if they were coming from the
# server? (This is a compatibility hack for ircd-irc2 servers)
;OperServerMode = no
# Maximum number of simultaneous connection the server is allowed
# to accept (<=0: unlimited):
;MaxConnections = -1
@@ -114,12 +105,6 @@
# Password of the IRC operator
;Password = ThePwd
# Optional Mask from which /OPER will be accepted
;Mask = *!ident@somewhere.example.com
[Operator]
# More [Operator] sections, if you like ...
[Server]
# Other servers are configured in [Server] sections. If you
# configure a port for the connection, then this ngircd tries to
@@ -155,9 +140,6 @@
# Group of this server (optional)
;Group = 123
[Server]
# More [Server] sections, if you like ...
[Channel]
# Pre-defined channels can be configured in [Channel] sections.
# Such channels are created by the server when starting up and even
@@ -175,7 +157,4 @@
# Initial channel modes
;Modes = tn
[Channel]
# More [Channel] sections, if you like ...
# -eof-

View File

@@ -1,15 +1,15 @@
.\"
.\" $Id: ngircd.8,v 1.10 2005/06/04 13:39:20 alex Exp $
.\" $Id: ngircd.8,v 1.9 2004/04/05 10:59:10 alex Exp $
.\"
.TH ngircd 8 "Juni 2005" ngircd "ngIRCd Manual"
.TH ngircd 8 "March 2003" ngircd "ngIRCd Manual"
.SH NAME
ngIRCd \- the next generation IRC daemon
ngircd \- the next generation IRC daemon
.SH SYNOPSIS
.B ngircd [
.I Options
.B ]
.SH DESCRIPTION
.BR ngIRCd
.BR ngircd
is a free open source daemon for the Internet Relay Chat (IRC),
developed under the GNU General Public License (GPL).
.PP
@@ -18,12 +18,16 @@ many others. It is easy to configure, supports server links (even with
original ircd's) and runs on hosts with changing IP addresses (such as
dial-in networks).
.PP
Currently supported platforms include AIX, A/UX, FreeBSD, HP-UX, IRIX,
Linux, Mac OS X, NetBSD, OpenBSD, Solaris, and Windows with Cygwin.
Currently supported platforms (tested versions) are: AIX (3.2.5 with IBM XL
C Compiler), A/UX (3.x, Apple pre-ANSI C Compiler and GNU C), FreeBSD
(4.5/i386, GNU C), HP-UX (10.20, GNU C), IRIX (6.5, SGI MIPSpro C 7.30),
Linux (2.2.x/i386, 2.4.x/i386 and 2.4.x/hppa, GNU C), Mac OS X (10.x, GNU C),
NetBSD (1.5.2/i386 and 1.5.3/m68k, GNU C), Solaris (2.5.1 and 2.6, GNU C),
and Windows with Cygwin (GNU C).
.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.
.SH OPTIONS
The default behaviour of
.BR ngircd
@@ -39,8 +43,7 @@ as configuration file.
.TP
\fB\-n\fR, \fB\-\-nodaemon\fR
Don't fork a child and don't detach from controlling terminal.
All log messages go to the console and you can use CTRL-C to
terminate the server.
All log messages go to the console.
.TP
\fB\-p\fR, \fB\-\-passive\fR
Disable automatic connections to other servers. You can use the IRC command

View File

@@ -1,7 +1,7 @@
.\"
.\" $Id: ngircd.conf.5,v 1.18 2005/06/04 13:39:20 alex Exp $
.\" $Id: ngircd.conf.5,v 1.12.2.1 2004/05/07 11:24:18 alex Exp $
.\"
.TH ngircd.conf 5 "Juni 2005" ngircd "ngIRCd Manual"
.TH ngircd.conf 5 "Mai 2003" ngircd "ngIRCd Manual"
.SH NAME
ngircd.conf \- configuration file of ngIRCd
.SH SYNOPSIS
@@ -32,13 +32,13 @@ represents either a comment, a section name or a parameter.
.PP
Section and parameter names are not case sensitive.
.SH "SECTION OVERVIEW"
The file can contain blocks of four types: [Global], [Operator], [Server],
The file is separated in four blocks: [Global], [Operator], [Server],
and [Channel].
.PP
In the
.I [Global]
section, there is the main configuration like the server name and the
ports on which the server should be listening. IRC operators of this
ports, on which the server should be listening. IRC operators of this
server are defined in
.I [Operator]
blocks.
@@ -46,9 +46,6 @@ blocks.
is the section where server links are configured. And
.I [Channel]
blocks are used to configure pre-defined ("persistent") IRC channels.
.PP
There can be more than one [Operator], [Server] and [Channel] sections
per configuration file, but only one [Global] section.
.SH [GLOBAL]
The
.I [Global]
@@ -68,18 +65,18 @@ command.
.TP
\fBPorts\fR
Ports on which the server should listen. There may be more than one port,
separated with ','. Default: 6667.
separated with ';'. Default: 6667.
.TP
\fBListen\fR
The IP address on which the server should listen. Default is empty, so
the server listens on all configured IP addresses and interfaces.
The ip address on which the server should listen. Default is empty, so
the server listens on all configured ip addresses and interfaces.
.TP
\fBMotdFile\fR
Text file with the "message of the day" (MOTD). This message will be shown
to all users connecting to the server.
.TP
\fBMotdPhrase\fR
A simple Phrase (<256 chars) if you don't want to use a MOTD file.
A simple Phrase (<256 chars) if you don't want to use a motd file.
If it is set no MotdFile will be read at all.
.TP
\fBServerUID\fR
@@ -117,13 +114,6 @@ For this to work the server must have
been started with root privileges!
.RE
.TP
\fBPidFile\fR
This tells ngIRCd to write its current process ID to a file. Note that the
pidfile is written AFTER chroot and switching the user ID, i. e. the
directory the pidfile resides in must be writeable by the ngIRCd user and
exist in the chroot directory (if configured, see above).
.RE
.TP
\fBPingTimeout\fR
After <PingTimeout> seconds of inactivity the server will send a PING to
the peer to test whether it is alive or not. Default: 120.
@@ -140,11 +130,6 @@ The server tries every <ConnectRetry> seconds to establish a link to not yet
Should IRC Operators be allowed to use the MODE command even if they are
not(!) channel-operators? Default: no.
.TP
\fBOperServerMode\fR
If OperCanUseMode is enabled, this may lead the compatibility problems with
Servers that run the ircd-irc2 Software. This Option "masks" mode requests
by non-chanops as if they were coming from the server. Default: no.
.TP
\fBMaxConnections\fR
Maximum number of simultaneous connection the server is allowed to accept
(<=0: unlimited). Default: -1.
@@ -168,10 +153,6 @@ ID of the operator (may be different of the nick name).
.TP
\fBPassword\fR
Password of the IRC operator.
.TP
\fBMask\fR
Mask that is to be checked before an /OPER for this account is accepted.
Example: nick!ident@*.example.com
.SH [SERVER]
Other servers are configured in
.I [Server]

View File

@@ -1,137 +0,0 @@
#
# ngIRCd -- The Next Generation IRC Daemon
# Copyright (c)2001-2005 Alexander Barton (alex@barton.de)
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information.
#
# $Id: Doxyfile,v 1.1 2005/04/09 12:21:51 alex Exp $
#
# This file describes the settings to be used by the documentation system
# doxygen (www.doxygen.org) for ngIRCd.
#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------
# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
# by quotes) that should identify the project.
PROJECT_NAME = ngIRCd
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
# base path where the generated documentation will be put.
# If a relative path is entered, it will be relative to the location
# where doxygen was started. If left blank the current directory will be used.
OUTPUT_DIRECTORY = ../doc/src
# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
# will interpret the first line (until the first dot) of a JavaDoc-style
# comment as the brief description. If set to NO, the JavaDoc
# comments will behave just like the Qt-style comments (thus requiring an
# explicit @brief command for a brief description.
JAVADOC_AUTOBRIEF = YES
# If the DETAILS_AT_TOP tag is set to YES then Doxygen
# will output the detailed description near the top, like JavaDoc.
# If set to NO, the detailed description appears after the member
# documentation.
DETAILS_AT_TOP = NO
# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
# sources only. Doxygen will then generate output that is more tailored for C.
# For instance, some of the names that are used will be different. The list
# of all members will be omitted, etc.
OPTIMIZE_OUTPUT_FOR_C = YES
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
# documentation are documented, even if no documentation was available.
# Private class members and static file members will be hidden unless
# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
EXTRACT_ALL = YES
# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
# will be included in the documentation.
EXTRACT_PRIVATE = YES
# If the EXTRACT_STATIC tag is set to YES all static members of a file
# will be included in the documentation.
EXTRACT_STATIC = YES
# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
# defined locally in source files will be included in the documentation.
# If set to NO only classes defined in header files are included.
EXTRACT_LOCAL_CLASSES = YES
#---------------------------------------------------------------------------
# configuration options related to the input files
#---------------------------------------------------------------------------
# The INPUT tag can be used to specify the files and/or directories that
# contain documented source files. You may enter file names like "myfile.cpp"
# or directories like "/usr/src/myproject". Separate the files or directories
# with spaces.
INPUT = ngircd portab tool
# The RECURSIVE tag can be used to turn specify whether or not subdirectories
# should be searched for input files as well. Possible values are YES and NO.
# If left blank NO is used.
RECURSIVE = YES
#---------------------------------------------------------------------------
# configuration options related to source browsing
#---------------------------------------------------------------------------
# If the SOURCE_BROWSER tag is set to YES then a list of source files will
# be generated. Documented entities will be cross-referenced with these sources.
# Note: To get rid of all source code in the generated output, make sure also
# VERBATIM_HEADERS is set to NO.
SOURCE_BROWSER = YES
#---------------------------------------------------------------------------
# Output formats
#---------------------------------------------------------------------------
GENERATE_HTML = YES
GENERATE_HTMLHELP = NO
GENERATE_LATEX = NO
GENERATE_RTF = NO
GENERATE_MAN = NO
GENERATE_XML = NO
GENERATE_AUTOGEN_DEF = NO
GENERATE_PERLMOD = NO
#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
# The PREDEFINED tag can be used to specify one or more macro names that
# are defined before the preprocessor is started (similar to the -D option of
# gcc). The argument of the tag is a list of macros of the form: name
# or name=definition (no spaces). If the definition and the = are
# omitted =1 is assumed. To prevent a macro definition from being
# undefined via #undef or recursively expanded use the := operator
# instead of the = operator.
PREDEFINED = CONN_MODULE __client_c__
# -eof-

View File

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

View File

@@ -8,15 +8,14 @@
# (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information.
#
# $Id: Makefile.am,v 1.46 2005/05/23 00:11:15 alex Exp $
# $Id: Makefile.am,v 1.42 2003/12/04 14:05:16 alex Exp $
#
AUTOMAKE_OPTIONS = ../portab/ansi2knr
INCLUDES = -I$(srcdir)/../portab -I$(srcdir)/../tool
LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN \
-varuse -retvalother -emptyret -unrecog
LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN
sbin_PROGRAMS = ngircd
@@ -52,30 +51,15 @@ check-help: Makefile
chmod 755 check-help
lint:
@splint --version >/dev/null 2>&1 \
|| ( echo; echo "Error: \"splint\" not found!"; echo; exit 1 )
@echo; warnings=0; files=0; \
rm -f lint.out
for f in *.c; do \
echo "checking $$f ..."; \
splint $$f $(LINTARGS) -I$(srcdir) -I$(srcdir)/.. \
$(INCLUDES) $(AM_CFLAGS) >lint.out 2>&1; \
splint $$f $(LINTARGS) -I./.. -I./../portab $(AM_CFLAGS) > lint.out 2>&1; \
grep "no warnings" lint.out > /dev/null 2>&1; \
if [ $$? -ne 0 ]; then \
waswarning=1; \
echo; grep -v "^Command Line: " lint.out; echo; \
w=$$( grep "code warning" lint.out | awk "{ print \$$4 }" ); \
[ "$$w" -gt 0 ] && warnings=`expr $$warnings + $$w`; \
files=`expr $$files + 1`; \
else \
waswarning=0; \
echo; cat lint.out; echo; \
fi; \
rm -f lint.out; \
done; \
[ $$waswarning -eq 0 ] && echo; \
[ $$warnings -gt 0 ] \
&& echo "Result: $$warnings warning(s) in $$files file(s)!" \
|| echo "Result: no warnings found."; \
echo; [ $$warnings -gt 0 ] && exit 1
done;
ngircd.c: cvs-version.h

View File

@@ -1,6 +1,6 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001-2005 by Alexander Barton (alex@barton.de)
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -17,7 +17,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: channel.c,v 1.50 2005/06/18 08:57:37 fw Exp $";
static char UNUSED id[] = "$Id: channel.c,v 1.45 2004/03/11 22:16:31 alex Exp $";
#include "imp.h"
#include <assert.h>
@@ -25,7 +25,6 @@ static char UNUSED id[] = "$Id: channel.c,v 1.50 2005/06/18 08:57:37 fw Exp $";
#include <string.h>
#include <strings.h>
#include "defines.h"
#include "conn-func.h"
#include "client.h"
@@ -55,28 +54,28 @@ LOCAL CL2CHAN *My_Cl2Chan;
LOCAL CL2CHAN *Get_Cl2Chan PARAMS(( CHANNEL *Chan, CLIENT *Client ));
LOCAL CL2CHAN *Add_Client PARAMS(( CHANNEL *Chan, CLIENT *Client ));
LOCAL bool Remove_Client PARAMS(( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Reason, bool InformServer ));
LOCAL BOOLEAN Remove_Client PARAMS(( INT Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Reason, BOOLEAN InformServer ));
LOCAL CL2CHAN *Get_First_Cl2Chan PARAMS(( CLIENT *Client, CHANNEL *Chan ));
LOCAL CL2CHAN *Get_Next_Cl2Chan PARAMS(( CL2CHAN *Start, CLIENT *Client, CHANNEL *Chan ));
LOCAL bool Delete_Channel PARAMS(( CHANNEL *Chan ));
LOCAL BOOLEAN Delete_Channel PARAMS(( CHANNEL *Chan ));
GLOBAL void
Channel_Init( void )
GLOBAL VOID
Channel_Init( VOID )
{
My_Channels = NULL;
My_Cl2Chan = NULL;
} /* Channel_Init */
GLOBAL void
Channel_InitPredefined( void )
GLOBAL VOID
Channel_InitPredefined( VOID )
{
/* Vordefinierte persistente Channels erzeugen */
CHANNEL *chan;
char *c;
int i;
CHAR *c;
INT i;
for( i = 0; i < Conf_Channel_Count; i++ )
{
@@ -113,8 +112,8 @@ Channel_InitPredefined( void )
} /* Channel_InitPredefined */
GLOBAL void
Channel_Exit( void )
GLOBAL VOID
Channel_Exit( VOID )
{
CHANNEL *c, *c_next;
CL2CHAN *cl2chan, *cl2chan_next;
@@ -139,8 +138,8 @@ Channel_Exit( void )
} /* Channel_Exit */
GLOBAL bool
Channel_Join( CLIENT *Client, char *Name )
GLOBAL BOOLEAN
Channel_Join( CLIENT *Client, CHAR *Name )
{
CHANNEL *chan;
@@ -151,7 +150,7 @@ Channel_Join( CLIENT *Client, char *Name )
if( ! Channel_IsValidName( Name ))
{
IRC_WriteStrClient( Client, ERR_NOSUCHCHANNEL_MSG, Client_ID( Client ), Name );
return false;
return FALSE;
}
/* Channel suchen */
@@ -159,23 +158,23 @@ Channel_Join( CLIENT *Client, char *Name )
if( chan )
{
/* Ist der Client bereits Mitglied? */
if( Get_Cl2Chan( chan, Client )) return false;
if( Get_Cl2Chan( chan, Client )) return FALSE;
}
else
{
/* Gibt es noch nicht? Dann neu anlegen: */
chan = Channel_Create( Name );
if( ! chan ) return false;
if( ! chan ) return FALSE;
}
/* User dem Channel hinzufuegen */
if( ! Add_Client( chan, Client )) return false;
else return true;
if( ! Add_Client( chan, Client )) return FALSE;
else return TRUE;
} /* Channel_Join */
GLOBAL bool
Channel_Part( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason )
GLOBAL BOOLEAN
Channel_Part( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason )
{
CHANNEL *chan;
@@ -188,17 +187,17 @@ Channel_Part( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason )
if(( ! chan ) || ( ! Get_Cl2Chan( chan, Client )))
{
IRC_WriteStrClient( Client, ERR_NOSUCHCHANNEL_MSG, Client_ID( Client ), Name );
return false;
return FALSE;
}
/* User aus Channel entfernen */
if( ! Remove_Client( REMOVE_PART, chan, Client, Origin, Reason, true)) return false;
else return true;
if( ! Remove_Client( REMOVE_PART, chan, Client, Origin, Reason, TRUE )) return FALSE;
else return TRUE;
} /* Channel_Part */
GLOBAL void
Channel_Kick( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason )
GLOBAL VOID
Channel_Kick( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason )
{
CHANNEL *chan;
@@ -236,36 +235,35 @@ Channel_Kick( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason )
return;
}
Remove_Client( REMOVE_KICK, chan, Client, Origin, Reason, true);
Remove_Client( REMOVE_KICK, chan, Client, Origin, Reason, TRUE );
} /* Channel_Kick */
GLOBAL void
Channel_Quit( CLIENT *Client, char *Reason )
GLOBAL VOID
Channel_Quit( CLIENT *Client, CHAR *Reason )
{
CHANNEL *c, *next_c;
assert( Client != NULL );
assert( Reason != NULL );
IRC_WriteStrRelatedPrefix( Client, Client, false, "QUIT :%s", Reason );
c = My_Channels;
while( c )
{
next_c = c->next;
Remove_Client( REMOVE_QUIT, c, Client, Client, Reason, false );
Remove_Client( REMOVE_QUIT, c, Client, Client, Reason, FALSE );
c = next_c;
}
} /* Channel_Quit */
GLOBAL long
Channel_Count( void )
GLOBAL LONG
Channel_Count( VOID )
{
CHANNEL *c;
long count = 0;
LONG count;
count = 0;
c = My_Channels;
while( c )
{
@@ -276,14 +274,15 @@ Channel_Count( void )
} /* Channel_Count */
GLOBAL long
GLOBAL LONG
Channel_MemberCount( CHANNEL *Chan )
{
CL2CHAN *cl2chan;
long count = 0;
LONG count;
assert( Chan != NULL );
count = 0;
cl2chan = My_Cl2Chan;
while( cl2chan )
{
@@ -294,16 +293,17 @@ Channel_MemberCount( CHANNEL *Chan )
} /* Channel_MemberCount */
GLOBAL int
GLOBAL INT
Channel_CountForUser( CLIENT *Client )
{
/* Count number of channels a user is member of. */
CL2CHAN *cl2chan;
int count = 0;
INT count;
assert( Client != NULL );
count = 0;
cl2chan = My_Cl2Chan;
while( cl2chan )
{
@@ -315,14 +315,15 @@ Channel_CountForUser( CLIENT *Client )
} /* Channel_CountForUser */
GLOBAL int
Channel_PCount( void )
GLOBAL INT
Channel_PCount( VOID )
{
/* Count the number of persistent (mode 'P') channels */
CHANNEL *chan;
int count = 0;
INT count;
count = 0;
chan = My_Channels;
while( chan )
{
@@ -334,7 +335,7 @@ Channel_PCount( void )
} /* Channel_PCount */
GLOBAL char *
GLOBAL CHAR *
Channel_Name( CHANNEL *Chan )
{
assert( Chan != NULL );
@@ -342,7 +343,7 @@ Channel_Name( CHANNEL *Chan )
} /* Channel_Name */
GLOBAL char *
GLOBAL CHAR *
Channel_Modes( CHANNEL *Chan )
{
assert( Chan != NULL );
@@ -350,7 +351,7 @@ Channel_Modes( CHANNEL *Chan )
} /* Channel_Modes */
GLOBAL char *
GLOBAL CHAR *
Channel_Key( CHANNEL *Chan )
{
assert( Chan != NULL );
@@ -358,7 +359,7 @@ Channel_Key( CHANNEL *Chan )
} /* Channel_Key */
GLOBAL long
GLOBAL LONG
Channel_MaxUsers( CHANNEL *Chan )
{
assert( Chan != NULL );
@@ -367,7 +368,7 @@ Channel_MaxUsers( CHANNEL *Chan )
GLOBAL CHANNEL *
Channel_First( void )
Channel_First( VOID )
{
return My_Channels;
} /* Channel_First */
@@ -382,7 +383,7 @@ Channel_Next( CHANNEL *Chan )
GLOBAL CHANNEL *
Channel_Search( char *Name )
Channel_Search( CHAR *Name )
{
/* Channel-Struktur suchen */
@@ -456,88 +457,86 @@ Channel_GetChannel( CL2CHAN *Cl2Chan )
} /* Channel_GetChannel */
GLOBAL bool
Channel_IsValidName( char *Name )
GLOBAL BOOLEAN
Channel_IsValidName( CHAR *Name )
{
/* Pruefen, ob Name als Channelname gueltig */
char *ptr, badchars[10];
CHAR *ptr, badchars[10];
assert( Name != NULL );
if(( Name[0] != '#' ) || ( strlen( Name ) >= CHANNEL_NAME_LEN )) return false;
if(( Name[0] != '#' ) || ( strlen( Name ) >= CHANNEL_NAME_LEN )) return FALSE;
ptr = Name;
strcpy( badchars, " ,:\007" );
while( *ptr )
{
if( strchr( badchars, *ptr )) return false;
if( strchr( badchars, *ptr )) return FALSE;
ptr++;
}
return true;
return TRUE;
} /* Channel_IsValidName */
GLOBAL bool
Channel_ModeAdd( CHANNEL *Chan, char Mode )
GLOBAL BOOLEAN
Channel_ModeAdd( CHANNEL *Chan, CHAR Mode )
{
/* set Mode.
* If the channel already had this mode, return false.
* If the channel mode was newly set return true.
*/
/* Mode soll gesetzt werden. TRUE wird geliefert, wenn der
* Mode neu gesetzt wurde, FALSE, wenn der Channel den Mode
* bereits hatte. */
char x[2];
CHAR x[2];
assert( Chan != NULL );
x[0] = Mode; x[1] = '\0';
if( ! strchr( Chan->modes, x[0] ))
{
/* Channel does not have this mode yet, set it */
/* Client hat den Mode noch nicht -> setzen */
strlcat( Chan->modes, x, sizeof( Chan->modes ));
return true;
return TRUE;
}
else return false;
else return FALSE;
} /* Channel_ModeAdd */
GLOBAL bool
Channel_ModeDel( CHANNEL *Chan, char Mode )
GLOBAL BOOLEAN
Channel_ModeDel( CHANNEL *Chan, CHAR Mode )
{
/* Delete mode.
* if the mode was removed return true.
* if the channel did not have the mode, return false.
*/
char x[2], *p;
/* Mode soll geloescht werden. TRUE wird geliefert, wenn der
* Mode entfernt wurde, FALSE, wenn der Channel den Mode
* ueberhaupt nicht hatte. */
CHAR x[2], *p;
assert( Chan != NULL );
x[0] = Mode; x[1] = '\0';
p = strchr( Chan->modes, x[0] );
if( ! p ) return false;
if( ! p ) return FALSE;
/* Channel has mode -> delete */
/* Client hat den Mode -> loeschen */
while( *p )
{
*p = *(p + 1);
p++;
}
return true;
return TRUE;
} /* Channel_ModeDel */
GLOBAL bool
Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, char Mode )
GLOBAL BOOLEAN
Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, CHAR Mode )
{
/* Set Channel-User-Mode.
* if mode was newly set, return true.
* if the User already had this channel-mode, return false.
*/
/* Channel-User-Mode soll gesetzt werden. TRUE wird geliefert,
* wenn der Mode neu gesetzt wurde, FALSE, wenn der User den
* Channel-Mode bereits hatte. */
CL2CHAN *cl2chan;
char x[2];
CHAR x[2];
assert( Chan != NULL );
assert( Client != NULL );
@@ -548,24 +547,23 @@ Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, char Mode )
x[0] = Mode; x[1] = '\0';
if( ! strchr( cl2chan->modes, x[0] ))
{
/* mode not set, -> set it */
/* Client hat den Mode noch nicht -> setzen */
strlcat( cl2chan->modes, x, sizeof( cl2chan->modes ));
return true;
return TRUE;
}
else return false;
else return FALSE;
} /* Channel_UserModeAdd */
GLOBAL bool
Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, char Mode )
GLOBAL BOOLEAN
Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, CHAR Mode )
{
/* Delete Channel-User-Mode.
* If Mode was removed, return true.
* If User did not have the Channel-Mode, return false.
*/
/* Channel-User-Mode soll geloescht werden. TRUE wird geliefert,
* wenn der Mode entfernt wurde, FALSE, wenn der User den Channel-Mode
* ueberhaupt nicht hatte. */
CL2CHAN *cl2chan;
char x[2], *p;
CHAR x[2], *p;
assert( Chan != NULL );
assert( Client != NULL );
@@ -576,22 +574,22 @@ Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, char Mode )
x[0] = Mode; x[1] = '\0';
p = strchr( cl2chan->modes, x[0] );
if( ! p ) return false;
if( ! p ) return FALSE;
/* Client has Mode -> delete */
/* Client hat den Mode -> loeschen */
while( *p )
{
*p = *(p + 1);
p++;
}
return true;
return TRUE;
} /* Channel_UserModeDel */
GLOBAL char *
GLOBAL CHAR *
Channel_UserModes( CHANNEL *Chan, CLIENT *Client )
{
/* return Users' Channel-Modes */
/* Channel-Modes eines Users liefern */
CL2CHAN *cl2chan;
@@ -605,20 +603,20 @@ Channel_UserModes( CHANNEL *Chan, CLIENT *Client )
} /* Channel_UserModes */
GLOBAL bool
GLOBAL BOOLEAN
Channel_IsMemberOf( CHANNEL *Chan, CLIENT *Client )
{
/* Test if Client is on Channel Chan */
/* Pruefen, ob Client Mitglied in Channel ist */
assert( Chan != NULL );
assert( Client != NULL );
if( Get_Cl2Chan( Chan, Client )) return true;
else return false;
if( Get_Cl2Chan( Chan, Client )) return TRUE;
else return FALSE;
} /* Channel_IsMemberOf */
GLOBAL char *
GLOBAL CHAR *
Channel_Topic( CHANNEL *Chan )
{
assert( Chan != NULL );
@@ -626,8 +624,8 @@ Channel_Topic( CHANNEL *Chan )
} /* Channel_Topic */
GLOBAL void
Channel_SetTopic( CHANNEL *Chan, char *Topic )
GLOBAL VOID
Channel_SetTopic( CHANNEL *Chan, CHAR *Topic )
{
assert( Chan != NULL );
assert( Topic != NULL );
@@ -636,8 +634,8 @@ Channel_SetTopic( CHANNEL *Chan, char *Topic )
} /* Channel_SetTopic */
GLOBAL void
Channel_SetModes( CHANNEL *Chan, char *Modes )
GLOBAL VOID
Channel_SetModes( CHANNEL *Chan, CHAR *Modes )
{
assert( Chan != NULL );
assert( Modes != NULL );
@@ -646,8 +644,8 @@ Channel_SetModes( CHANNEL *Chan, char *Modes )
} /* Channel_SetModes */
GLOBAL void
Channel_SetKey( CHANNEL *Chan, char *Key )
GLOBAL VOID
Channel_SetKey( CHANNEL *Chan, CHAR *Key )
{
assert( Chan != NULL );
assert( Key != NULL );
@@ -657,8 +655,8 @@ Channel_SetKey( CHANNEL *Chan, char *Key )
} /* Channel_SetKey */
GLOBAL void
Channel_SetMaxUsers( CHANNEL *Chan, long Count )
GLOBAL VOID
Channel_SetMaxUsers( CHANNEL *Chan, LONG Count )
{
assert( Chan != NULL );
@@ -667,44 +665,45 @@ Channel_SetMaxUsers( CHANNEL *Chan, long Count )
} /* Channel_SetMaxUsers */
GLOBAL bool
Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, char *Text )
GLOBAL BOOLEAN
Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR *Text )
{
bool is_member, has_voice, is_op, ok;
BOOLEAN is_member, has_voice, is_op, ok;
/* Okay, target is a channel */
is_member = has_voice = is_op = false;
is_member = has_voice = is_op = FALSE;
if( Channel_IsMemberOf( Chan, From ))
{
is_member = true;
if( strchr( Channel_UserModes( Chan, From ), 'v' )) has_voice = true;
if( strchr( Channel_UserModes( Chan, From ), 'o' )) is_op = true;
is_member = TRUE;
if( strchr( Channel_UserModes( Chan, From ), 'v' )) has_voice = TRUE;
if( strchr( Channel_UserModes( Chan, From ), 'o' )) is_op = TRUE;
}
/* Is the client allowed to write to channel? */
ok = true;
if( strchr( Channel_Modes( Chan ), 'n' ) && ( ! is_member )) ok = false;
if( strchr( Channel_Modes( Chan ), 'm' ) && ( ! is_op ) && ( ! has_voice )) ok = false;
/* Check weather client is allowed to write to channel */
ok = TRUE;
if( strchr( Channel_Modes( Chan ), 'n' ) && ( ! is_member )) ok = FALSE;
if( strchr( Channel_Modes( Chan ), 'm' ) && ( ! is_op ) && ( ! has_voice )) ok = FALSE;
/* Is the client banned? */
if( Lists_CheckBanned( From, Chan ))
{
/* Client is banned, bus is he channel operator or has voice? */
if(( ! has_voice ) && ( ! is_op )) ok = false;
if(( ! has_voice ) && ( ! is_op )) ok = FALSE;
}
if( ! ok ) return IRC_WriteStrClient( From, ERR_CANNOTSENDTOCHAN_MSG, Client_ID( From ), Channel_Name( Chan ));
/* Send text */
if( Client_Conn( From ) > NONE ) Conn_UpdateIdle( Client_Conn( From ));
return IRC_WriteStrChannelPrefix( Client, Chan, From, true, "PRIVMSG %s :%s", Channel_Name( Chan ), Text );
return IRC_WriteStrChannelPrefix( Client, Chan, From, TRUE, "PRIVMSG %s :%s", Channel_Name( Chan ), Text );
} /* Channel_Write */
GLOBAL CHANNEL *
Channel_Create( char *Name )
Channel_Create( CHAR *Name )
{
/* Create new CHANNEL structure and add it to linked list */
/* Neue Channel-Struktur anlegen */
CHANNEL *c;
assert( Name != NULL );
@@ -715,9 +714,16 @@ Channel_Create( char *Name )
Log( LOG_EMERG, "Can't allocate memory! [New_Chan]" );
return NULL;
}
memset( c, 0, sizeof( CHANNEL ));
c->next = NULL;
strlcpy( c->name, Name, sizeof( c->name ));
c->name[CHANNEL_NAME_LEN - 1] = '\0';
strcpy( c->modes, "" );
strcpy( c->topic, "" );
c->hash = Hash( c->name );
strcpy( c->key, "" );
c->maxusers = 0;
/* Verketten */
c->next = My_Channels;
My_Channels = c;
@@ -774,8 +780,8 @@ Add_Client( CHANNEL *Chan, CLIENT *Client )
} /* Add_Client */
LOCAL bool
Remove_Client( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Reason, bool InformServer )
LOCAL BOOLEAN
Remove_Client( INT Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Reason, BOOLEAN InformServer )
{
CL2CHAN *cl2chan, *last_cl2chan;
CHANNEL *c;
@@ -793,7 +799,7 @@ Remove_Client( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Re
last_cl2chan = cl2chan;
cl2chan = cl2chan->next;
}
if( ! cl2chan ) return false;
if( ! cl2chan ) return FALSE;
c = cl2chan->channel;
assert( c != NULL );
@@ -808,21 +814,22 @@ Remove_Client( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Re
case REMOVE_QUIT:
/* QUIT: andere Server wurden bereits informiert, vgl. Client_Destroy();
* hier also "nur" noch alle User in betroffenen Channeln infomieren */
assert( InformServer == false );
assert( InformServer == FALSE );
IRC_WriteStrChannelPrefix( Origin, c, Origin, FALSE, "QUIT :%s", Reason );
Log( LOG_DEBUG, "User \"%s\" left channel \"%s\" (%s).", Client_Mask( Client ), c->name, Reason );
break;
case REMOVE_KICK:
/* User wurde geKICKed: ggf. andere Server sowie alle betroffenen User
* im entsprechenden Channel informieren */
if( InformServer ) IRC_WriteStrServersPrefix( Client_NextHop( Origin ), Origin, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason );
IRC_WriteStrChannelPrefix( Client, c, Origin, false, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason );
IRC_WriteStrChannelPrefix( Client, c, Origin, FALSE, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason );
if(( Client_Conn( Client ) > NONE ) && ( Client_Type( Client ) == CLIENT_USER )) IRC_WriteStrClientPrefix( Client, Origin, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason );
Log( LOG_DEBUG, "User \"%s\" has been kicked of \"%s\" by \"%s\": %s.", Client_Mask( Client ), c->name, Client_ID( Origin ), Reason );
break;
default:
/* PART */
if( InformServer ) IRC_WriteStrServersPrefix( Origin, Client, "PART %s :%s", c->name, Reason );
IRC_WriteStrChannelPrefix( Origin, c, Client, false, "PART %s :%s", c->name, Reason );
IRC_WriteStrChannelPrefix( Origin, c, Client, FALSE, "PART %s :%s", c->name, Reason );
if(( Client_Conn( Origin ) > NONE ) && ( Client_Type( Origin ) == CLIENT_USER )) IRC_WriteStrClientPrefix( Origin, Client, "PART %s :%s", c->name, Reason );
Log( LOG_DEBUG, "User \"%s\" left channel \"%s\" (%s).", Client_Mask( Client ), c->name, Reason );
}
@@ -833,7 +840,7 @@ Remove_Client( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Re
if( ! Get_First_Cl2Chan( NULL, Chan )) Delete_Channel( Chan );
}
return true;
return TRUE;
} /* Remove_Client */
@@ -862,7 +869,7 @@ Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Channel )
} /* Get_Next_Cl2Chan */
LOCAL bool
LOCAL BOOLEAN
Delete_Channel( CHANNEL *Chan )
{
/* Channel-Struktur loeschen */
@@ -877,7 +884,7 @@ Delete_Channel( CHANNEL *Chan )
last_chan = chan;
chan = chan->next;
}
if( ! chan ) return false;
if( ! chan ) return FALSE;
Log( LOG_DEBUG, "Freed channel structure for \"%s\".", Chan->name );
@@ -889,7 +896,7 @@ Delete_Channel( CHANNEL *Chan )
else My_Channels = chan->next;
free( chan );
return true;
return TRUE;
} /* Delete_Channel */

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: channel.h,v 1.27 2005/03/19 18:43:48 fw Exp $
* $Id: channel.h,v 1.26 2002/12/16 23:05:24 alex Exp $
*
* Channel management (header)
*/
@@ -25,12 +25,12 @@
typedef struct _CHANNEL
{
struct _CHANNEL *next;
char name[CHANNEL_NAME_LEN]; /* Name of the channel */
CHAR name[CHANNEL_NAME_LEN]; /* Name of the channel */
UINT32 hash; /* Hash of the (lowecase!) name */
char modes[CHANNEL_MODE_LEN]; /* Channel modes */
char topic[CHANNEL_TOPIC_LEN]; /* Topic of the channel */
char key[CLIENT_PASS_LEN]; /* Channel key ("password", mode "k" ) */
long maxusers; /* Maximum number of members (mode "l") */
CHAR modes[CHANNEL_MODE_LEN]; /* Channel modes */
CHAR topic[CHANNEL_TOPIC_LEN]; /* Topic of the channel */
CHAR key[CLIENT_PASS_LEN]; /* Channel key ("password", mode "k" ) */
LONG maxusers; /* Maximum number of members (mode "l") */
} CHANNEL;
typedef struct _CLIENT2CHAN
@@ -38,7 +38,7 @@ typedef struct _CLIENT2CHAN
struct _CLIENT2CHAN *next;
CLIENT *client;
CHANNEL *channel;
char modes[CHANNEL_MODE_LEN]; /* User-Modes in dem Channel */
CHAR modes[CHANNEL_MODE_LEN]; /* User-Modes in dem Channel */
} CL2CHAN;
#else
@@ -49,36 +49,36 @@ typedef POINTER CL2CHAN;
#endif
GLOBAL void Channel_Init PARAMS(( void ));
GLOBAL void Channel_InitPredefined PARAMS(( void ));
GLOBAL void Channel_Exit PARAMS(( void ));
GLOBAL VOID Channel_Init PARAMS(( VOID ));
GLOBAL VOID Channel_InitPredefined PARAMS(( VOID ));
GLOBAL VOID Channel_Exit PARAMS(( VOID ));
GLOBAL bool Channel_Join PARAMS(( CLIENT *Client, char *Name ));
GLOBAL bool Channel_Part PARAMS(( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason ));
GLOBAL BOOLEAN Channel_Join PARAMS(( CLIENT *Client, CHAR *Name ));
GLOBAL BOOLEAN Channel_Part PARAMS(( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason ));
GLOBAL void Channel_Quit PARAMS(( CLIENT *Client, char *Reason ));
GLOBAL VOID Channel_Quit PARAMS(( CLIENT *Client, CHAR *Reason ));
GLOBAL void Channel_Kick PARAMS(( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason ));
GLOBAL VOID Channel_Kick PARAMS(( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason ));
GLOBAL long Channel_Count PARAMS(( void ));
GLOBAL long Channel_MemberCount PARAMS(( CHANNEL *Chan ));
GLOBAL int Channel_CountForUser PARAMS(( CLIENT *Client ));
GLOBAL int Channel_PCount PARAMS(( void ));
GLOBAL LONG Channel_Count PARAMS(( VOID ));
GLOBAL LONG Channel_MemberCount PARAMS(( CHANNEL *Chan ));
GLOBAL INT Channel_CountForUser PARAMS(( CLIENT *Client ));
GLOBAL INT Channel_PCount PARAMS(( VOID ));
GLOBAL char *Channel_Name PARAMS(( CHANNEL *Chan ));
GLOBAL char *Channel_Modes PARAMS(( CHANNEL *Chan ));
GLOBAL char *Channel_Topic PARAMS(( CHANNEL *Chan ));
GLOBAL char *Channel_Key PARAMS(( CHANNEL *Chan ));
GLOBAL long Channel_MaxUsers PARAMS(( CHANNEL *Chan ));
GLOBAL CHAR *Channel_Name PARAMS(( CHANNEL *Chan ));
GLOBAL CHAR *Channel_Modes PARAMS(( CHANNEL *Chan ));
GLOBAL CHAR *Channel_Topic PARAMS(( CHANNEL *Chan ));
GLOBAL CHAR *Channel_Key PARAMS(( CHANNEL *Chan ));
GLOBAL LONG Channel_MaxUsers PARAMS(( CHANNEL *Chan ));
GLOBAL void Channel_SetTopic PARAMS(( CHANNEL *Chan, char *Topic ));
GLOBAL void Channel_SetModes PARAMS(( CHANNEL *Chan, char *Modes ));
GLOBAL void Channel_SetKey PARAMS(( CHANNEL *Chan, char *Key ));
GLOBAL void Channel_SetMaxUsers PARAMS(( CHANNEL *Chan, long Count ));
GLOBAL VOID Channel_SetTopic PARAMS(( CHANNEL *Chan, CHAR *Topic ));
GLOBAL VOID Channel_SetModes PARAMS(( CHANNEL *Chan, CHAR *Modes ));
GLOBAL VOID Channel_SetKey PARAMS(( CHANNEL *Chan, CHAR *Key ));
GLOBAL VOID Channel_SetMaxUsers PARAMS(( CHANNEL *Chan, LONG Count ));
GLOBAL CHANNEL *Channel_Search PARAMS(( char *Name ));
GLOBAL CHANNEL *Channel_Search PARAMS(( CHAR *Name ));
GLOBAL CHANNEL *Channel_First PARAMS(( void ));
GLOBAL CHANNEL *Channel_First PARAMS(( VOID ));
GLOBAL CHANNEL *Channel_Next PARAMS(( CHANNEL *Chan ));
GLOBAL CL2CHAN *Channel_FirstMember PARAMS(( CHANNEL *Chan ));
@@ -89,20 +89,20 @@ GLOBAL CL2CHAN *Channel_NextChannelOf PARAMS(( CLIENT *Client, CL2CHAN *Cl2Chan
GLOBAL CLIENT *Channel_GetClient PARAMS(( CL2CHAN *Cl2Chan ));
GLOBAL CHANNEL *Channel_GetChannel PARAMS(( CL2CHAN *Cl2Chan ));
GLOBAL bool Channel_IsValidName PARAMS(( char *Name ));
GLOBAL BOOLEAN Channel_IsValidName PARAMS(( CHAR *Name ));
GLOBAL bool Channel_ModeAdd PARAMS(( CHANNEL *Chan, char Mode ));
GLOBAL bool Channel_ModeDel PARAMS(( CHANNEL *Chan, char Mode ));
GLOBAL BOOLEAN Channel_ModeAdd PARAMS(( CHANNEL *Chan, CHAR Mode ));
GLOBAL BOOLEAN Channel_ModeDel PARAMS(( CHANNEL *Chan, CHAR Mode ));
GLOBAL bool Channel_UserModeAdd PARAMS(( CHANNEL *Chan, CLIENT *Client, char Mode ));
GLOBAL bool Channel_UserModeDel PARAMS(( CHANNEL *Chan, CLIENT *Client, char Mode ));
GLOBAL char *Channel_UserModes PARAMS(( CHANNEL *Chan, CLIENT *Client ));
GLOBAL BOOLEAN Channel_UserModeAdd PARAMS(( CHANNEL *Chan, CLIENT *Client, CHAR Mode ));
GLOBAL BOOLEAN Channel_UserModeDel PARAMS(( CHANNEL *Chan, CLIENT *Client, CHAR Mode ));
GLOBAL CHAR *Channel_UserModes PARAMS(( CHANNEL *Chan, CLIENT *Client ));
GLOBAL bool Channel_IsMemberOf PARAMS(( CHANNEL *Chan, CLIENT *Client ));
GLOBAL BOOLEAN Channel_IsMemberOf PARAMS(( CHANNEL *Chan, CLIENT *Client ));
GLOBAL bool Channel_Write PARAMS(( CHANNEL *Chan, CLIENT *From, CLIENT *Client, char *Text ));
GLOBAL BOOLEAN Channel_Write PARAMS(( CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR *Text ));
GLOBAL CHANNEL *Channel_Create PARAMS(( char *Name ));
GLOBAL CHANNEL *Channel_Create PARAMS(( CHAR *Name ));
#endif

View File

@@ -1,6 +1,6 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001-2005 by Alexander Barton (alex@barton.de)
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -17,7 +17,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: client.c,v 1.84.2.1 2006/03/24 23:30:34 fw Exp $";
static char UNUSED id[] = "$Id: client.c,v 1.76 2004/03/11 22:16:31 alex Exp $";
#include "imp.h"
#include <assert.h>
@@ -28,7 +28,6 @@ static char UNUSED id[] = "$Id: client.c,v 1.84.2.1 2006/03/24 23:30:34 fw Exp $
#include <strings.h>
#include <netdb.h>
#include "defines.h"
#include "conn.h"
#include "exp.h"
@@ -51,29 +50,26 @@ static char UNUSED id[] = "$Id: client.c,v 1.84.2.1 2006/03/24 23:30:34 fw Exp $
LOCAL CLIENT *This_Server, *My_Clients;
LOCAL char GetID_Buffer[GETID_LEN];
LOCAL WHOWAS My_Whowas[MAX_WHOWAS];
LOCAL int Last_Whowas = -1;
LOCAL CHAR GetID_Buffer[GETID_LEN];
LOCAL long Count PARAMS(( CLIENT_TYPE Type ));
LOCAL long MyCount PARAMS(( CLIENT_TYPE Type ));
LOCAL LONG Count PARAMS(( CLIENT_TYPE Type ));
LOCAL LONG MyCount PARAMS(( CLIENT_TYPE Type ));
LOCAL CLIENT *New_Client_Struct PARAMS(( void ));
LOCAL void Generate_MyToken PARAMS(( CLIENT *Client ));
LOCAL void Adjust_Counters PARAMS(( CLIENT *Client ));
LOCAL CLIENT *New_Client_Struct PARAMS(( VOID ));
LOCAL VOID Generate_MyToken PARAMS(( CLIENT *Client ));
LOCAL VOID Adjust_Counters PARAMS(( CLIENT *Client ));
#ifndef Client_DestroyNow
GLOBAL void Client_DestroyNow PARAMS((CLIENT *Client ));
GLOBAL VOID Client_DestroyNow PARAMS((CLIENT *Client ));
#endif
long Max_Users = 0, My_Max_Users = 0;
LONG Max_Users = 0, My_Max_Users = 0;
GLOBAL void
Client_Init( void )
GLOBAL VOID
Client_Init( VOID )
{
struct hostent *h;
@@ -101,19 +97,17 @@ Client_Init( void )
Client_SetInfo( This_Server, Conf_ServerInfo );
My_Clients = This_Server;
memset( &My_Whowas, 0, sizeof( My_Whowas ));
} /* Client_Init */
GLOBAL void
Client_Exit( void )
GLOBAL VOID
Client_Exit( VOID )
{
CLIENT *c, *next;
int cnt;
INT cnt;
if( NGIRCd_SignalRestart ) Client_Destroy( This_Server, "Server going down (restarting).", NULL, false );
else Client_Destroy( This_Server, "Server going down.", NULL, false );
if( NGIRCd_SignalRestart ) Client_Destroy( This_Server, "Server going down (restarting).", NULL, FALSE );
else Client_Destroy( This_Server, "Server going down.", NULL, FALSE );
cnt = 0;
c = My_Clients;
@@ -129,14 +123,14 @@ Client_Exit( void )
GLOBAL CLIENT *
Client_ThisServer( void )
Client_ThisServer( VOID )
{
return This_Server;
} /* Client_ThisServer */
GLOBAL CLIENT *
Client_NewLocal( CONN_ID Idx, char *Hostname, int Type, bool Idented )
Client_NewLocal( CONN_ID Idx, CHAR *Hostname, INT Type, BOOLEAN Idented )
{
/* Neuen lokalen Client erzeugen: Wrapper-Funktion fuer Client_New(). */
return Client_New( Idx, This_Server, NULL, Type, NULL, NULL, Hostname, NULL, 0, 0, NULL, Idented );
@@ -144,7 +138,7 @@ Client_NewLocal( CONN_ID Idx, char *Hostname, int Type, bool Idented )
GLOBAL CLIENT *
Client_NewRemoteServer( CLIENT *Introducer, char *Hostname, CLIENT *TopServer, int Hops, int Token, char *Info, bool Idented )
Client_NewRemoteServer( CLIENT *Introducer, CHAR *Hostname, CLIENT *TopServer, INT Hops, INT Token, CHAR *Info, BOOLEAN Idented )
{
/* Neuen Remote-Client erzeugen: Wrapper-Funktion fuer Client_New (). */
return Client_New( NONE, Introducer, TopServer, CLIENT_SERVER, Hostname, NULL, Hostname, Info, Hops, Token, NULL, Idented );
@@ -152,7 +146,7 @@ Client_NewRemoteServer( CLIENT *Introducer, char *Hostname, CLIENT *TopServer, i
GLOBAL CLIENT *
Client_NewRemoteUser( CLIENT *Introducer, char *Nick, int Hops, char *User, char *Hostname, int Token, char *Modes, char *Info, bool Idented )
Client_NewRemoteUser( CLIENT *Introducer, CHAR *Nick, INT Hops, CHAR *User, CHAR *Hostname, INT Token, CHAR *Modes, CHAR *Info, BOOLEAN Idented )
{
/* Neuen Remote-Client erzeugen: Wrapper-Funktion fuer Client_New (). */
return Client_New( NONE, Introducer, NULL, CLIENT_USER, Nick, User, Hostname, Info, Hops, Token, Modes, Idented );
@@ -160,7 +154,7 @@ Client_NewRemoteUser( CLIENT *Introducer, char *Nick, int Hops, char *User, char
GLOBAL CLIENT *
Client_New( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, int Type, char *ID, char *User, char *Hostname, char *Info, int Hops, int Token, char *Modes, bool Idented )
Client_New( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, INT Type, CHAR *ID, CHAR *User, CHAR *Hostname, CHAR *Info, INT Hops, INT Token, CHAR *Modes, BOOLEAN Idented )
{
CLIENT *client;
@@ -172,7 +166,6 @@ Client_New( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, int Type, char *
if( ! client ) return NULL;
/* Initialisieren */
client->starttime = time(NULL);
client->conn_id = Idx;
client->introducer = Introducer;
client->topserver = TopServer;
@@ -200,13 +193,13 @@ Client_New( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, int Type, char *
} /* Client_New */
GLOBAL void
Client_Destroy( CLIENT *Client, char *LogMsg, char *FwdMsg, bool SendQuit )
GLOBAL VOID
Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN SendQuit )
{
/* Client entfernen. */
CLIENT *last, *c;
char msg[LINE_LEN], *txt;
CHAR msg[LINE_LEN], *txt;
assert( Client != NULL );
@@ -215,11 +208,7 @@ Client_Destroy( CLIENT *Client, char *LogMsg, char *FwdMsg, bool SendQuit )
if( ! txt ) txt = "Reason unknown.";
/* Netz-Split-Nachricht vorbereiten (noch nicht optimal) */
if( Client->type == CLIENT_SERVER ) {
strlcpy(msg, This_Server->id, sizeof (msg));
strlcat(msg, " ", sizeof (msg));
strlcat(msg, Client->id, sizeof (msg));
}
if( Client->type == CLIENT_SERVER ) snprintf( msg, sizeof( msg ), "%s: lost server %s", This_Server->id, Client->id );
last = NULL;
c = My_Clients;
@@ -229,7 +218,7 @@ Client_Destroy( CLIENT *Client, char *LogMsg, char *FwdMsg, bool SendQuit )
{
/* der Client, der geloescht wird ist ein Server. Der Client, den wir gerade
* pruefen, ist ein Child von diesem und muss daher auch entfernt werden */
Client_Destroy( c, NULL, msg, false );
Client_Destroy( c, NULL, msg, FALSE );
last = NULL;
c = My_Clients;
continue;
@@ -268,12 +257,7 @@ Client_Destroy( CLIENT *Client, char *LogMsg, char *FwdMsg, bool SendQuit )
else IRC_WriteStrServersPrefix( Client_NextHop( c ), c, "QUIT :" );
}
}
/* Unregister client from channels */
Channel_Quit( c, FwdMsg ? FwdMsg : c->id );
/* Register client in My_Whowas structure */
Client_RegisterWhowas( c );
}
else if( c->type == CLIENT_SERVER )
{
@@ -296,9 +280,11 @@ Client_Destroy( CLIENT *Client, char *LogMsg, char *FwdMsg, bool SendQuit )
{
if( c->id[0] ) Log( LOG_NOTICE, "Client \"%s\" unregistered (connection %d): %s", c->id, c->conn_id, txt );
else Log( LOG_NOTICE, "Client unregistered (connection %d): %s", c->conn_id, txt );
} else {
Log(LOG_WARNING, "Unregistered unknown client \"%s\": %s",
c->id[0] ? c->id : "(No Nick)", txt );
}
else
{
if( c->id[0] ) Log( LOG_WARNING, "Unregistered unknown client \"%s\": %s", c->id, txt );
else Log( LOG_WARNING, "Unregistered unknown client: %s", c->id, txt );
}
}
@@ -311,7 +297,7 @@ Client_Destroy( CLIENT *Client, char *LogMsg, char *FwdMsg, bool SendQuit )
} /* Client_Destroy */
GLOBAL void
GLOBAL VOID
Client_DestroyNow( CLIENT *Client )
{
/* Destroy client structure immediately. This function is only
@@ -340,8 +326,8 @@ Client_DestroyNow( CLIENT *Client )
} /* Client_DestroyNow */
GLOBAL void
Client_SetHostname( CLIENT *Client, char *Hostname )
GLOBAL VOID
Client_SetHostname( CLIENT *Client, CHAR *Hostname )
{
/* Hostname eines Clients setzen */
@@ -352,8 +338,8 @@ Client_SetHostname( CLIENT *Client, char *Hostname )
} /* Client_SetHostname */
GLOBAL void
Client_SetID( CLIENT *Client, char *ID )
GLOBAL VOID
Client_SetID( CLIENT *Client, CHAR *ID )
{
/* Hostname eines Clients setzen, Hash-Wert berechnen */
@@ -367,8 +353,8 @@ Client_SetID( CLIENT *Client, char *ID )
} /* Client_SetID */
GLOBAL void
Client_SetUser( CLIENT *Client, char *User, bool Idented )
GLOBAL VOID
Client_SetUser( CLIENT *Client, CHAR *User, BOOLEAN Idented )
{
/* Username eines Clients setzen */
@@ -384,8 +370,8 @@ Client_SetUser( CLIENT *Client, char *User, bool Idented )
} /* Client_SetUser */
GLOBAL void
Client_SetInfo( CLIENT *Client, char *Info )
GLOBAL VOID
Client_SetInfo( CLIENT *Client, CHAR *Info )
{
/* Hostname eines Clients setzen */
@@ -396,8 +382,8 @@ Client_SetInfo( CLIENT *Client, char *Info )
} /* Client_SetInfo */
GLOBAL void
Client_SetModes( CLIENT *Client, char *Modes )
GLOBAL VOID
Client_SetModes( CLIENT *Client, CHAR *Modes )
{
/* Modes eines Clients setzen */
@@ -408,8 +394,8 @@ Client_SetModes( CLIENT *Client, char *Modes )
} /* Client_SetModes */
GLOBAL void
Client_SetFlags( CLIENT *Client, char *Flags )
GLOBAL VOID
Client_SetFlags( CLIENT *Client, CHAR *Flags )
{
/* Flags eines Clients setzen */
@@ -420,8 +406,8 @@ Client_SetFlags( CLIENT *Client, char *Flags )
} /* Client_SetFlags */
GLOBAL void
Client_SetPassword( CLIENT *Client, char *Pwd )
GLOBAL VOID
Client_SetPassword( CLIENT *Client, CHAR *Pwd )
{
/* Von einem Client geliefertes Passwort */
@@ -432,8 +418,8 @@ Client_SetPassword( CLIENT *Client, char *Pwd )
} /* Client_SetPassword */
GLOBAL void
Client_SetAway( CLIENT *Client, char *Txt )
GLOBAL VOID
Client_SetAway( CLIENT *Client, CHAR *Txt )
{
/* Set AWAY reason of client */
@@ -445,8 +431,8 @@ Client_SetAway( CLIENT *Client, char *Txt )
} /* Client_SetAway */
GLOBAL void
Client_SetType( CLIENT *Client, int Type )
GLOBAL VOID
Client_SetType( CLIENT *Client, INT Type )
{
assert( Client != NULL );
Client->type = Type;
@@ -455,23 +441,23 @@ Client_SetType( CLIENT *Client, int Type )
} /* Client_SetType */
GLOBAL void
Client_SetHops( CLIENT *Client, int Hops )
GLOBAL VOID
Client_SetHops( CLIENT *Client, INT Hops )
{
assert( Client != NULL );
Client->hops = Hops;
} /* Client_SetHops */
GLOBAL void
Client_SetToken( CLIENT *Client, int Token )
GLOBAL VOID
Client_SetToken( CLIENT *Client, INT Token )
{
assert( Client != NULL );
Client->token = Token;
} /* Client_SetToken */
GLOBAL void
GLOBAL VOID
Client_SetIntroducer( CLIENT *Client, CLIENT *Introducer )
{
assert( Client != NULL );
@@ -480,23 +466,22 @@ Client_SetIntroducer( CLIENT *Client, CLIENT *Introducer )
} /* Client_SetIntroducer */
GLOBAL void
Client_SetOperByMe( CLIENT *Client, bool OperByMe )
GLOBAL VOID
Client_SetOperByMe( CLIENT *Client, BOOLEAN OperByMe )
{
assert( Client != NULL );
Client->oper_by_me = OperByMe;
} /* Client_SetOperByMe */
GLOBAL bool
Client_ModeAdd( CLIENT *Client, char Mode )
GLOBAL BOOLEAN
Client_ModeAdd( CLIENT *Client, CHAR Mode )
{
/* Set Mode.
* If Client already alread had Mode, return false.
* If the Mode was newly set, return true.
*/
/* Mode soll gesetzt werden. TRUE wird geliefert, wenn der
* Mode neu gesetzt wurde, FALSE, wenn der Client den Mode
* bereits hatte. */
char x[2];
CHAR x[2];
assert( Client != NULL );
@@ -505,45 +490,43 @@ Client_ModeAdd( CLIENT *Client, char Mode )
{
/* Client hat den Mode noch nicht -> setzen */
strlcat( Client->modes, x, sizeof( Client->modes ));
return true;
return TRUE;
}
else return false;
else return FALSE;
} /* Client_ModeAdd */
GLOBAL bool
Client_ModeDel( CLIENT *Client, char Mode )
GLOBAL BOOLEAN
Client_ModeDel( CLIENT *Client, CHAR Mode )
{
/* Delete Mode.
* If Mode was removed, return true.
* If Client did not have Mode, return false.
*/
/* Mode soll geloescht werden. TRUE wird geliefert, wenn der
* Mode entfernt wurde, FALSE, wenn der Client den Mode
* ueberhaupt nicht hatte. */
char x[2], *p;
CHAR x[2], *p;
assert( Client != NULL );
x[0] = Mode; x[1] = '\0';
p = strchr( Client->modes, x[0] );
if( ! p ) return false;
if( ! p ) return FALSE;
/* Client has Mode -> delete */
/* Client hat den Mode -> loeschen */
while( *p )
{
*p = *(p + 1);
p++;
}
return true;
return TRUE;
} /* Client_ModeDel */
GLOBAL CLIENT *
Client_GetFromConn( CONN_ID Idx )
{
/* return Client-Structure that belongs to the local Connection Idx gehoert.
* If none is found, return NULL.
*/
/* Client-Struktur, die zur lokalen Verbindung Idx gehoert,
* liefern. Wird keine gefunden, so wird NULL geliefert. */
CLIENT *c;
@@ -560,19 +543,18 @@ Client_GetFromConn( CONN_ID Idx )
GLOBAL CLIENT *
Client_Search( char *Nick )
Client_Search( CHAR *Nick )
{
/* return Client-Structure that has the corresponding Nick.
* If none is found, return NULL.
*/
/* Client-Struktur, die den entsprechenden Nick hat, liefern.
* Wird keine gefunden, so wird NULL geliefert. */
char search_id[CLIENT_ID_LEN], *ptr;
CHAR search_id[CLIENT_ID_LEN], *ptr;
CLIENT *c = NULL;
UINT32 search_hash;
assert( Nick != NULL );
/* copy Nick and truncate hostmask if necessary */
/* Nick kopieren und ggf. Host-Mask abschneiden */
strlcpy( search_id, Nick, sizeof( search_id ));
ptr = strchr( search_id, '!' );
if( ptr ) *ptr = '\0';
@@ -594,7 +576,7 @@ Client_Search( char *Nick )
GLOBAL CLIENT *
Client_GetFromToken( CLIENT *Client, int Token )
Client_GetFromToken( CLIENT *Client, INT Token )
{
/* Client-Struktur, die den entsprechenden Introducer (=Client)
* und das gegebene Token hat, liefern. Wird keine gefunden,
@@ -615,7 +597,7 @@ Client_GetFromToken( CLIENT *Client, int Token )
} /* Client_GetFromToken */
GLOBAL int
GLOBAL INT
Client_Type( CLIENT *Client )
{
assert( Client != NULL );
@@ -631,7 +613,7 @@ Client_Conn( CLIENT *Client )
} /* Client_Conn */
GLOBAL char *
GLOBAL CHAR *
Client_ID( CLIENT *Client )
{
assert( Client != NULL );
@@ -645,7 +627,7 @@ Client_ID( CLIENT *Client )
} /* Client_ID */
GLOBAL char *
GLOBAL CHAR *
Client_Info( CLIENT *Client )
{
assert( Client != NULL );
@@ -653,7 +635,7 @@ Client_Info( CLIENT *Client )
} /* Client_Info */
GLOBAL char *
GLOBAL CHAR *
Client_User( CLIENT *Client )
{
assert( Client != NULL );
@@ -662,7 +644,7 @@ Client_User( CLIENT *Client )
} /* Client_User */
GLOBAL char *
GLOBAL CHAR *
Client_Hostname( CLIENT *Client )
{
assert( Client != NULL );
@@ -670,7 +652,7 @@ Client_Hostname( CLIENT *Client )
} /* Client_Hostname */
GLOBAL char *
GLOBAL CHAR *
Client_Password( CLIENT *Client )
{
assert( Client != NULL );
@@ -678,7 +660,7 @@ Client_Password( CLIENT *Client )
} /* Client_Password */
GLOBAL char *
GLOBAL CHAR *
Client_Modes( CLIENT *Client )
{
assert( Client != NULL );
@@ -686,7 +668,7 @@ Client_Modes( CLIENT *Client )
} /* Client_Modes */
GLOBAL char *
GLOBAL CHAR *
Client_Flags( CLIENT *Client )
{
assert( Client != NULL );
@@ -694,7 +676,7 @@ Client_Flags( CLIENT *Client )
} /* Client_Flags */
GLOBAL bool
GLOBAL BOOLEAN
Client_OperByMe( CLIENT *Client )
{
assert( Client != NULL );
@@ -702,7 +684,7 @@ Client_OperByMe( CLIENT *Client )
} /* Client_OperByMe */
GLOBAL int
GLOBAL INT
Client_Hops( CLIENT *Client )
{
assert( Client != NULL );
@@ -710,7 +692,7 @@ Client_Hops( CLIENT *Client )
} /* Client_Hops */
GLOBAL int
GLOBAL INT
Client_Token( CLIENT *Client )
{
assert( Client != NULL );
@@ -718,7 +700,7 @@ Client_Token( CLIENT *Client )
} /* Client_Token */
GLOBAL int
GLOBAL INT
Client_MyToken( CLIENT *Client )
{
assert( Client != NULL );
@@ -739,7 +721,7 @@ Client_NextHop( CLIENT *Client )
} /* Client_NextHop */
GLOBAL char *
GLOBAL CHAR *
Client_Mask( CLIENT *Client )
{
/* Client-"ID" liefern, wie sie z.B. fuer
@@ -770,15 +752,15 @@ Client_TopServer( CLIENT *Client )
} /* Client_TopServer */
GLOBAL bool
Client_HasMode( CLIENT *Client, char Mode )
GLOBAL BOOLEAN
Client_HasMode( CLIENT *Client, CHAR Mode )
{
assert( Client != NULL );
return strchr( Client->modes, Mode ) != NULL;
} /* Client_HasMode */
GLOBAL char *
GLOBAL CHAR *
Client_Away( CLIENT *Client )
{
/* AWAY-Text liefern */
@@ -788,8 +770,8 @@ Client_Away( CLIENT *Client )
} /* Client_Away */
GLOBAL bool
Client_CheckNick( CLIENT *Client, char *Nick )
GLOBAL BOOLEAN
Client_CheckNick( CLIENT *Client, CHAR *Nick )
{
/* Nick ueberpruefen */
@@ -800,7 +782,7 @@ Client_CheckNick( CLIENT *Client, char *Nick )
if( ! Client_IsValidNick( Nick ))
{
IRC_WriteStrClient( Client, ERR_ERRONEUSNICKNAME_MSG, Client_ID( Client ), Nick );
return false;
return FALSE;
}
/* Nick bereits vergeben? */
@@ -808,19 +790,19 @@ Client_CheckNick( CLIENT *Client, char *Nick )
{
/* den Nick gibt es bereits */
IRC_WriteStrClient( Client, ERR_NICKNAMEINUSE_MSG, Client_ID( Client ), Nick );
return false;
return FALSE;
}
return true;
return TRUE;
} /* Client_CheckNick */
GLOBAL bool
Client_CheckID( CLIENT *Client, char *ID )
GLOBAL BOOLEAN
Client_CheckID( CLIENT *Client, CHAR *ID )
{
/* Nick ueberpruefen */
char str[COMMAND_LEN];
CHAR str[COMMAND_LEN];
CLIENT *c;
assert( Client != NULL );
@@ -831,7 +813,7 @@ Client_CheckID( CLIENT *Client, char *ID )
if( strlen( ID ) > CLIENT_ID_LEN )
{
IRC_WriteStrClient( Client, ERR_ERRONEUSNICKNAME_MSG, Client_ID( Client ), ID );
return false;
return FALSE;
}
/* ID bereits vergeben? */
@@ -844,18 +826,18 @@ Client_CheckID( CLIENT *Client, char *ID )
snprintf( str, sizeof( str ), "ID \"%s\" already registered", ID );
if( Client->conn_id != c->conn_id ) Log( LOG_ERR, "%s (on connection %d)!", str, c->conn_id );
else Log( LOG_ERR, "%s (via network)!", str );
Conn_Close( Client->conn_id, str, str, true);
return false;
Conn_Close( Client->conn_id, str, str, TRUE );
return FALSE;
}
c = (CLIENT *)c->next;
}
return true;
return TRUE;
} /* Client_CheckID */
GLOBAL CLIENT *
Client_First( void )
Client_First( VOID )
{
/* Ersten Client liefern. */
@@ -874,46 +856,46 @@ Client_Next( CLIENT *c )
} /* Client_Next */
GLOBAL long
Client_UserCount( void )
GLOBAL LONG
Client_UserCount( VOID )
{
return Count( CLIENT_USER );
} /* Client_UserCount */
GLOBAL long
Client_ServiceCount( void )
GLOBAL LONG
Client_ServiceCount( VOID )
{
return Count( CLIENT_SERVICE );;
} /* Client_ServiceCount */
GLOBAL long
Client_ServerCount( void )
GLOBAL LONG
Client_ServerCount( VOID )
{
return Count( CLIENT_SERVER );
} /* Client_ServerCount */
GLOBAL long
Client_MyUserCount( void )
GLOBAL LONG
Client_MyUserCount( VOID )
{
return MyCount( CLIENT_USER );
} /* Client_MyUserCount */
GLOBAL long
Client_MyServiceCount( void )
GLOBAL LONG
Client_MyServiceCount( VOID )
{
return MyCount( CLIENT_SERVICE );
} /* Client_MyServiceCount */
GLOBAL long
Client_MyServerCount( void )
GLOBAL LONG
Client_MyServerCount( VOID )
{
CLIENT *c;
long cnt;
LONG cnt;
cnt = 0;
c = My_Clients;
@@ -926,11 +908,11 @@ Client_MyServerCount( void )
} /* Client_MyServerCount */
GLOBAL long
Client_OperCount( void )
GLOBAL LONG
Client_OperCount( VOID )
{
CLIENT *c;
long cnt;
LONG cnt;
cnt = 0;
c = My_Clients;
@@ -943,11 +925,11 @@ Client_OperCount( void )
} /* Client_OperCount */
GLOBAL long
Client_UnknownCount( void )
GLOBAL LONG
Client_UnknownCount( VOID )
{
CLIENT *c;
long cnt;
LONG cnt;
cnt = 0;
c = My_Clients;
@@ -960,84 +942,52 @@ Client_UnknownCount( void )
} /* Client_UnknownCount */
GLOBAL long
Client_MaxUserCount( void )
GLOBAL LONG
Client_MaxUserCount( VOID )
{
return Max_Users;
} /* Client_MaxUserCount */
GLOBAL long
Client_MyMaxUserCount( void )
GLOBAL LONG
Client_MyMaxUserCount( VOID )
{
return My_Max_Users;
} /* Client_MyMaxUserCount */
GLOBAL bool
Client_IsValidNick( char *Nick )
GLOBAL BOOLEAN
Client_IsValidNick( CHAR *Nick )
{
/* Ist der Nick gueltig? */
char *ptr, goodchars[20];
CHAR *ptr, goodchars[20];
assert( Nick != NULL );
strcpy( goodchars, ";0123456789-" );
if( Nick[0] == '#' ) return false;
if( strchr( goodchars, Nick[0] )) return false;
if( strlen( Nick ) >= CLIENT_NICK_LEN ) return false;
if( Nick[0] == '#' ) return FALSE;
if( strchr( goodchars, Nick[0] )) return FALSE;
if( strlen( Nick ) >= CLIENT_NICK_LEN ) return FALSE;
ptr = Nick;
while( *ptr )
{
if(( *ptr < 'A' ) && ( ! strchr( goodchars, *ptr ))) return false;
if(( *ptr > '}' ) && ( ! strchr( goodchars, *ptr ))) return false;
if(( *ptr < 'A' ) && ( ! strchr( goodchars, *ptr ))) return FALSE;
if(( *ptr > '}' ) && ( ! strchr( goodchars, *ptr ))) return FALSE;
ptr++;
}
return true;
return TRUE;
} /* Client_IsValidNick */
/**
* Return pointer to "My_Whowas" structure.
*/
GLOBAL WHOWAS *
Client_GetWhowas( void )
{
return My_Whowas;
} /* Client_GetWhowas */
/**
* Return the index of the last used WHOWAS entry.
*/
GLOBAL int
Client_GetLastWhowasIndex( void )
{
return Last_Whowas;
} /* Client_GetLastWhowasIndex */
/**
* Get the start time of this client.
* The result is the start time in seconds since 1970-01-01, as reported
* by the C function time(NULL).
*/
GLOBAL time_t
Client_StartTime(CLIENT *Client)
{
assert( Client != NULL );
return Client->starttime;
} /* Client_Uptime */
LOCAL long
LOCAL LONG
Count( CLIENT_TYPE Type )
{
CLIENT *c;
long cnt;
LONG cnt;
cnt = 0;
c = My_Clients;
@@ -1050,11 +1000,11 @@ Count( CLIENT_TYPE Type )
} /* Count */
LOCAL long
LOCAL LONG
MyCount( CLIENT_TYPE Type )
{
CLIENT *c;
long cnt;
LONG cnt;
cnt = 0;
c = My_Clients;
@@ -1068,7 +1018,7 @@ MyCount( CLIENT_TYPE Type )
LOCAL CLIENT *
New_Client_Struct( void )
New_Client_Struct( VOID )
{
/* Neue CLIENT-Struktur pre-initialisieren */
@@ -1081,24 +1031,34 @@ New_Client_Struct( void )
return NULL;
}
memset( c, 0, sizeof ( CLIENT ));
c->next = NULL;
c->hash = 0;
c->type = CLIENT_UNKNOWN;
c->conn_id = NONE;
c->oper_by_me = false;
c->introducer = NULL;
c->topserver = NULL;
strcpy( c->id, "" );
strcpy( c->pwd, "" );
strcpy( c->host, "" );
strcpy( c->user, "" );
strcpy( c->info, "" );
strcpy( c->modes, "" );
c->oper_by_me = FALSE;
c->hops = -1;
c->token = -1;
c->mytoken = -1;
strcpy( c->away, "" );
strcpy( c->flags, "" );
return c;
} /* New_Client */
LOCAL void
LOCAL VOID
Generate_MyToken( CLIENT *Client )
{
CLIENT *c;
int token;
INT token;
c = My_Clients;
token = 2;
@@ -1118,10 +1078,10 @@ Generate_MyToken( CLIENT *Client )
} /* Generate_MyToken */
LOCAL void
LOCAL VOID
Adjust_Counters( CLIENT *Client )
{
long count;
LONG count;
assert( Client != NULL );
@@ -1138,44 +1098,4 @@ Adjust_Counters( CLIENT *Client )
} /* Adjust_Counters */
/**
* Register client in My_Whowas structure for further recall by WHOWAS.
* Note: Only clients that have been connected at least 30 seconds will be
* registered to prevent automated IRC bots to "destroy" a nice server
* history database.
*/
GLOBAL void
Client_RegisterWhowas( CLIENT *Client )
{
int slot;
assert( Client != NULL );
/* Don't register clients that were connected less than 30 seconds. */
if( time(NULL) - Client->starttime < 30 )
return;
slot = Last_Whowas + 1;
if( slot >= MAX_WHOWAS || slot < 0 ) slot = 0;
#ifdef DEBUG
Log( LOG_DEBUG, "Saving WHOWAS information to slot %d ...", slot );
#endif
My_Whowas[slot].time = time( NULL );
strlcpy( My_Whowas[slot].id, Client_ID( Client ),
sizeof( My_Whowas[slot].id ));
strlcpy( My_Whowas[slot].user, Client_User( Client ),
sizeof( My_Whowas[slot].user ));
strlcpy( My_Whowas[slot].host, Client_Hostname( Client ),
sizeof( My_Whowas[slot].host ));
strlcpy( My_Whowas[slot].info, Client_Info( Client ),
sizeof( My_Whowas[slot].info ));
strlcpy( My_Whowas[slot].server, Client_ID( Client_Introducer( Client )),
sizeof( My_Whowas[slot].server ));
Last_Whowas = slot;
} /* Client_RegisterWhowas */
/* -eof- */

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: client.h,v 1.39 2005/06/12 16:18:49 alex Exp $
* $Id: client.h,v 1.34 2003/01/15 14:28:25 alex Exp $
*
* Client management (header)
*/
@@ -28,30 +28,31 @@
#define CLIENT_SERVER 128 /* client is a server */
#define CLIENT_SERVICE 256 /* client is a service */
#define CLIENT_TYPE int
#define CLIENT_TYPE INT
#if defined(__client_c__) | defined(S_SPLINT_S)
#include "defines.h"
typedef struct _CLIENT
{
time_t starttime; /* Start time of link */
char id[CLIENT_ID_LEN]; /* nick (user) / ID (server) */
CHAR id[CLIENT_ID_LEN]; /* nick (user) / ID (server) */
UINT32 hash; /* hash of lower-case ID */
POINTER *next; /* pointer to next client structure */
CLIENT_TYPE type; /* type of client, see CLIENT_xxx */
CONN_ID conn_id; /* ID of the connection (if local) or NONE (remote) */
struct _CLIENT *introducer; /* ID of the servers which the client is connected to */
struct _CLIENT *topserver; /* toplevel servers (only valid if client is a server) */
char pwd[CLIENT_PASS_LEN]; /* password received of the client */
char host[CLIENT_HOST_LEN]; /* hostname of the client */
char user[CLIENT_USER_LEN]; /* user name ("login") */
char info[CLIENT_INFO_LEN]; /* long user name (user) / info text (server) */
char modes[CLIENT_MODE_LEN]; /* client modes */
int hops, token, mytoken; /* "hops" and "Token" (see SERVER command) */
bool oper_by_me; /* client is local IRC operator on this server? */
char away[CLIENT_AWAY_LEN]; /* AWAY text (valid if mode 'a' is set) */
char flags[CLIENT_FLAGS_LEN]; /* flags of the client */
CHAR pwd[CLIENT_PASS_LEN]; /* password received of the client */
CHAR host[CLIENT_HOST_LEN]; /* hostname of the client */
CHAR user[CLIENT_USER_LEN]; /* user name ("login") */
CHAR info[CLIENT_INFO_LEN]; /* long user name (user) / info text (server) */
CHAR modes[CLIENT_MODE_LEN]; /* client modes */
INT hops, token, mytoken; /* "hops" and "Token" (see SERVER command) */
BOOLEAN oper_by_me; /* client is local IRC operator on this server? */
CHAR away[CLIENT_AWAY_LEN]; /* AWAY text (valid if mode 'a' is set) */
CHAR flags[CLIENT_FLAGS_LEN]; /* flags of the client */
} CLIENT;
#else
@@ -61,98 +62,81 @@ typedef POINTER CLIENT;
#endif
typedef struct _WHOWAS
{
time_t time; /* time stamp of entry or 0 if unused */
char id[CLIENT_NICK_LEN]; /* client nick name */
char host[CLIENT_HOST_LEN]; /* hostname of the client */
char user[CLIENT_USER_LEN]; /* user name ("login") */
char info[CLIENT_INFO_LEN]; /* long user name */
char server[CLIENT_HOST_LEN]; /* server name */
} WHOWAS;
GLOBAL VOID Client_Init PARAMS(( VOID ));
GLOBAL VOID Client_Exit PARAMS(( VOID ));
GLOBAL CLIENT *Client_NewLocal PARAMS(( CONN_ID Idx, CHAR *Hostname, INT Type, BOOLEAN Idented ));
GLOBAL CLIENT *Client_NewRemoteServer PARAMS(( CLIENT *Introducer, CHAR *Hostname, CLIENT *TopServer, INT Hops, INT Token, CHAR *Info, BOOLEAN Idented ));
GLOBAL CLIENT *Client_NewRemoteUser PARAMS(( CLIENT *Introducer, CHAR *Nick, INT Hops, CHAR *User, CHAR *Hostname, INT Token, CHAR *Modes, CHAR *Info, BOOLEAN Idented ));
GLOBAL CLIENT *Client_New PARAMS(( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, INT Type, CHAR *ID, CHAR *User, CHAR *Hostname, CHAR *Info, INT Hops, INT Token, CHAR *Modes, BOOLEAN Idented ));
GLOBAL void Client_Init PARAMS(( void ));
GLOBAL void Client_Exit PARAMS(( void ));
GLOBAL CLIENT *Client_NewLocal PARAMS(( CONN_ID Idx, char *Hostname, int Type, bool Idented ));
GLOBAL CLIENT *Client_NewRemoteServer PARAMS(( CLIENT *Introducer, char *Hostname, CLIENT *TopServer, int Hops, int Token, char *Info, bool Idented ));
GLOBAL CLIENT *Client_NewRemoteUser PARAMS(( CLIENT *Introducer, char *Nick, int Hops, char *User, char *Hostname, int Token, char *Modes, char *Info, bool Idented ));
GLOBAL CLIENT *Client_New PARAMS(( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, int Type, char *ID, char *User, char *Hostname, char *Info, int Hops, int Token, char *Modes, bool Idented ));
GLOBAL void Client_Destroy PARAMS(( CLIENT *Client, char *LogMsg, char *FwdMsg, bool SendQuit ));
GLOBAL VOID Client_Destroy PARAMS(( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN SendQuit ));
#ifdef CONN_MODULE
GLOBAL void Client_DestroyNow PARAMS(( CLIENT *Client ));
GLOBAL VOID Client_DestroyNow PARAMS(( CLIENT *Client ));
#endif
GLOBAL CLIENT *Client_ThisServer PARAMS(( void ));
GLOBAL CLIENT *Client_ThisServer PARAMS(( VOID ));
GLOBAL CLIENT *Client_GetFromConn PARAMS(( CONN_ID Idx ));
GLOBAL CLIENT *Client_GetFromToken PARAMS(( CLIENT *Client, int Token ));
GLOBAL CLIENT *Client_GetFromToken PARAMS(( CLIENT *Client, INT Token ));
GLOBAL CLIENT *Client_Search PARAMS(( char *ID ));
GLOBAL CLIENT *Client_First PARAMS(( void ));
GLOBAL CLIENT *Client_Search PARAMS(( CHAR *ID ));
GLOBAL CLIENT *Client_First PARAMS(( VOID ));
GLOBAL CLIENT *Client_Next PARAMS(( CLIENT *c ));
GLOBAL int Client_Type PARAMS(( CLIENT *Client ));
GLOBAL INT Client_Type PARAMS(( CLIENT *Client ));
GLOBAL CONN_ID Client_Conn PARAMS(( CLIENT *Client ));
GLOBAL char *Client_ID PARAMS(( CLIENT *Client ));
GLOBAL char *Client_Mask PARAMS(( CLIENT *Client ));
GLOBAL char *Client_Info PARAMS(( CLIENT *Client ));
GLOBAL char *Client_User PARAMS(( CLIENT *Client ));
GLOBAL char *Client_Hostname PARAMS(( CLIENT *Client ));
GLOBAL char *Client_Password PARAMS(( CLIENT *Client ));
GLOBAL char *Client_Modes PARAMS(( CLIENT *Client ));
GLOBAL char *Client_Flags PARAMS(( CLIENT *Client ));
GLOBAL CHAR *Client_ID PARAMS(( CLIENT *Client ));
GLOBAL CHAR *Client_Mask PARAMS(( CLIENT *Client ));
GLOBAL CHAR *Client_Info PARAMS(( CLIENT *Client ));
GLOBAL CHAR *Client_User PARAMS(( CLIENT *Client ));
GLOBAL CHAR *Client_Hostname PARAMS(( CLIENT *Client ));
GLOBAL CHAR *Client_Password PARAMS(( CLIENT *Client ));
GLOBAL CHAR *Client_Modes PARAMS(( CLIENT *Client ));
GLOBAL CHAR *Client_Flags PARAMS(( CLIENT *Client ));
GLOBAL CLIENT *Client_Introducer PARAMS(( CLIENT *Client ));
GLOBAL bool Client_OperByMe PARAMS(( CLIENT *Client ));
GLOBAL int Client_Hops PARAMS(( CLIENT *Client ));
GLOBAL int Client_Token PARAMS(( CLIENT *Client ));
GLOBAL int Client_MyToken PARAMS(( CLIENT *Client ));
GLOBAL BOOLEAN Client_OperByMe PARAMS(( CLIENT *Client ));
GLOBAL INT Client_Hops PARAMS(( CLIENT *Client ));
GLOBAL INT Client_Token PARAMS(( CLIENT *Client ));
GLOBAL INT Client_MyToken PARAMS(( CLIENT *Client ));
GLOBAL CLIENT *Client_TopServer PARAMS(( CLIENT *Client ));
GLOBAL CLIENT *Client_NextHop PARAMS(( CLIENT *Client ));
GLOBAL char *Client_Away PARAMS(( CLIENT *Client ));
GLOBAL time_t Client_StartTime PARAMS(( CLIENT *Client ));
GLOBAL CHAR *Client_Away PARAMS(( CLIENT *Client ));
GLOBAL bool Client_HasMode PARAMS(( CLIENT *Client, char Mode ));
GLOBAL BOOLEAN Client_HasMode PARAMS(( CLIENT *Client, CHAR Mode ));
GLOBAL void Client_SetHostname PARAMS(( CLIENT *Client, char *Hostname ));
GLOBAL void Client_SetID PARAMS(( CLIENT *Client, char *Nick ));
GLOBAL void Client_SetUser PARAMS(( CLIENT *Client, char *User, bool Idented ));
GLOBAL void Client_SetInfo PARAMS(( CLIENT *Client, char *Info ));
GLOBAL void Client_SetPassword PARAMS(( CLIENT *Client, char *Pwd ));
GLOBAL void Client_SetType PARAMS(( CLIENT *Client, int Type ));
GLOBAL void Client_SetHops PARAMS(( CLIENT *Client, int Hops ));
GLOBAL void Client_SetToken PARAMS(( CLIENT *Client, int Token ));
GLOBAL void Client_SetOperByMe PARAMS(( CLIENT *Client, bool OperByMe ));
GLOBAL void Client_SetModes PARAMS(( CLIENT *Client, char *Modes ));
GLOBAL void Client_SetFlags PARAMS(( CLIENT *Client, char *Flags ));
GLOBAL void Client_SetIntroducer PARAMS(( CLIENT *Client, CLIENT *Introducer ));
GLOBAL void Client_SetAway PARAMS(( CLIENT *Client, char *Txt ));
GLOBAL VOID Client_SetHostname PARAMS(( CLIENT *Client, CHAR *Hostname ));
GLOBAL VOID Client_SetID PARAMS(( CLIENT *Client, CHAR *Nick ));
GLOBAL VOID Client_SetUser PARAMS(( CLIENT *Client, CHAR *User, BOOLEAN Idented ));
GLOBAL VOID Client_SetInfo PARAMS(( CLIENT *Client, CHAR *Info ));
GLOBAL VOID Client_SetPassword PARAMS(( CLIENT *Client, CHAR *Pwd ));
GLOBAL VOID Client_SetType PARAMS(( CLIENT *Client, INT Type ));
GLOBAL VOID Client_SetHops PARAMS(( CLIENT *Client, INT Hops ));
GLOBAL VOID Client_SetToken PARAMS(( CLIENT *Client, INT Token ));
GLOBAL VOID Client_SetOperByMe PARAMS(( CLIENT *Client, BOOLEAN OperByMe ));
GLOBAL VOID Client_SetModes PARAMS(( CLIENT *Client, CHAR *Modes ));
GLOBAL VOID Client_SetFlags PARAMS(( CLIENT *Client, CHAR *Flags ));
GLOBAL VOID Client_SetIntroducer PARAMS(( CLIENT *Client, CLIENT *Introducer ));
GLOBAL VOID Client_SetAway PARAMS(( CLIENT *Client, CHAR *Txt ));
GLOBAL bool Client_ModeAdd PARAMS(( CLIENT *Client, char Mode ));
GLOBAL bool Client_ModeDel PARAMS(( CLIENT *Client, char Mode ));
GLOBAL BOOLEAN Client_ModeAdd PARAMS(( CLIENT *Client, CHAR Mode ));
GLOBAL BOOLEAN Client_ModeDel PARAMS(( CLIENT *Client, CHAR Mode ));
GLOBAL bool Client_CheckNick PARAMS(( CLIENT *Client, char *Nick ));
GLOBAL bool Client_CheckID PARAMS(( CLIENT *Client, char *ID ));
GLOBAL BOOLEAN Client_CheckNick PARAMS(( CLIENT *Client, CHAR *Nick ));
GLOBAL BOOLEAN Client_CheckID PARAMS(( CLIENT *Client, CHAR *ID ));
GLOBAL long Client_UserCount PARAMS(( void ));
GLOBAL long Client_ServiceCount PARAMS(( void ));
GLOBAL long Client_ServerCount PARAMS(( void ));
GLOBAL long Client_OperCount PARAMS(( void ));
GLOBAL long Client_UnknownCount PARAMS(( void ));
GLOBAL long Client_MyUserCount PARAMS(( void ));
GLOBAL long Client_MyServiceCount PARAMS(( void ));
GLOBAL long Client_MyServerCount PARAMS(( void ));
GLOBAL long Client_MaxUserCount PARAMS(( void ));
GLOBAL long Client_MyMaxUserCount PARAMS(( void ));
GLOBAL LONG Client_UserCount PARAMS(( VOID ));
GLOBAL LONG Client_ServiceCount PARAMS(( VOID ));
GLOBAL LONG Client_ServerCount PARAMS(( VOID ));
GLOBAL LONG Client_OperCount PARAMS(( VOID ));
GLOBAL LONG Client_UnknownCount PARAMS(( VOID ));
GLOBAL LONG Client_MyUserCount PARAMS(( VOID ));
GLOBAL LONG Client_MyServiceCount PARAMS(( VOID ));
GLOBAL LONG Client_MyServerCount PARAMS(( VOID ));
GLOBAL LONG Client_MaxUserCount PARAMS(( VOID ));
GLOBAL LONG Client_MyMaxUserCount PARAMS(( VOID ));
GLOBAL bool Client_IsValidNick PARAMS(( char *Nick ));
GLOBAL WHOWAS *Client_GetWhowas PARAMS(( void ));
GLOBAL int Client_GetLastWhowasIndex PARAMS(( void ));
GLOBAL void Client_RegisterWhowas PARAMS(( CLIENT *Client ));
GLOBAL BOOLEAN Client_IsValidNick PARAMS(( CHAR *Nick ));
#endif

View File

@@ -14,16 +14,12 @@
#include "portab.h"
static char UNUSED id[] = "$Id: conf.c,v 1.77.2.1 2005/10/11 19:28:47 alex Exp $";
static char UNUSED id[] = "$Id: conf.c,v 1.63.2.2 2004/09/27 11:30:52 alex Exp $";
#include "imp.h"
#include <assert.h>
#include <errno.h>
#ifdef PROTOTYPES
# include <stdarg.h>
#else
# include <varargs.h>
#endif
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -50,64 +46,60 @@ static char UNUSED id[] = "$Id: conf.c,v 1.77.2.1 2005/10/11 19:28:47 alex Exp $
#include "conf.h"
LOCAL bool Use_Log = true;
LOCAL BOOLEAN Use_Log = TRUE;
LOCAL CONF_SERVER New_Server;
LOCAL int New_Server_Idx;
LOCAL INT New_Server_Idx;
LOCAL void Set_Defaults PARAMS(( bool InitServers ));
LOCAL void Read_Config PARAMS(( void ));
LOCAL void Validate_Config PARAMS(( bool TestOnly ));
LOCAL VOID Set_Defaults PARAMS(( BOOLEAN InitServers ));
LOCAL VOID Read_Config PARAMS(( VOID ));
LOCAL VOID Validate_Config PARAMS(( BOOLEAN TestOnly ));
LOCAL void Handle_GLOBAL PARAMS(( int Line, char *Var, char *Arg ));
LOCAL void Handle_OPERATOR PARAMS(( int Line, char *Var, char *Arg ));
LOCAL void Handle_SERVER PARAMS(( int Line, char *Var, char *Arg ));
LOCAL void Handle_CHANNEL PARAMS(( int Line, char *Var, char *Arg ));
LOCAL VOID Handle_GLOBAL PARAMS(( INT Line, CHAR *Var, CHAR *Arg ));
LOCAL VOID Handle_OPERATOR PARAMS(( INT Line, CHAR *Var, CHAR *Arg ));
LOCAL VOID Handle_SERVER PARAMS(( INT Line, CHAR *Var, CHAR *Arg ));
LOCAL VOID Handle_CHANNEL PARAMS(( INT Line, CHAR *Var, CHAR *Arg ));
LOCAL void Config_Error PARAMS(( const int Level, const char *Format, ... ));
LOCAL VOID Config_Error PARAMS(( CONST INT Level, CONST CHAR *Format, ... ));
LOCAL void Config_Error_NaN PARAMS(( const int LINE, const char *Value ));
LOCAL void Config_Error_TooLong PARAMS(( const int LINE, const char *Value ));
LOCAL void Init_Server_Struct PARAMS(( CONF_SERVER *Server ));
LOCAL VOID Init_Server_Struct PARAMS(( CONF_SERVER *Server ));
GLOBAL void
Conf_Init( void )
GLOBAL VOID
Conf_Init( VOID )
{
Set_Defaults( true );
Set_Defaults( TRUE );
Read_Config( );
Validate_Config( false );
Validate_Config( FALSE );
} /* Config_Init */
GLOBAL void
Conf_Rehash( void )
GLOBAL VOID
Conf_Rehash( VOID )
{
Set_Defaults( false );
Set_Defaults( FALSE );
Read_Config( );
Validate_Config( false );
Validate_Config( FALSE );
} /* Config_Rehash */
GLOBAL int
Conf_Test( void )
GLOBAL INT
Conf_Test( VOID )
{
/* Read configuration, validate and output it. */
struct passwd *pwd;
struct group *grp;
int i;
INT i;
Use_Log = false;
Set_Defaults( true );
Use_Log = FALSE;
Set_Defaults( TRUE );
Read_Config( );
Validate_Config( true );
Validate_Config( TRUE );
/* If stdin and stdout ("you can read our nice message and we can
* read in your keypress") are valid tty's, wait for a key: */
if( isatty( fileno( stdin )) && isatty( fileno( stdout )))
/* If stdin is a valid tty wait for a key: */
if( isatty( fileno( stdout )))
{
puts( "OK, press enter to see a dump of your service configuration ..." );
getchar( );
@@ -123,27 +115,25 @@ Conf_Test( void )
printf( " AdminEMail = %s\n", Conf_ServerAdminMail );
printf( " MotdFile = %s\n", Conf_MotdFile );
printf( " MotdPhrase = %s\n", Conf_MotdPhrase );
printf( " ChrootDir = %s\n", Conf_Chroot );
printf( " PidFile = %s\n", Conf_PidFile);
printf( " ChrootDir= %s\n", Conf_Chroot );
printf( " Ports = " );
for( i = 0; i < Conf_ListenPorts_Count; i++ )
{
if( i != 0 ) printf( ", " );
printf( "%u", (unsigned int) Conf_ListenPorts[i] );
printf( "%u", Conf_ListenPorts[i] );
}
puts( "" );
printf( " Listen = %s\n", Conf_ListenAddress );
pwd = getpwuid( Conf_UID );
if( pwd ) printf( " ServerUID = %s\n", pwd->pw_name );
else printf( " ServerUID = %ld\n", (long)Conf_UID );
else printf( " ServerUID = %ld\n", (LONG)Conf_UID );
grp = getgrgid( Conf_GID );
if( grp ) printf( " ServerGID = %s\n", grp->gr_name );
else printf( " ServerGID = %ld\n", (long)Conf_GID );
else printf( " ServerGID = %ld\n", (LONG)Conf_GID );
printf( " PingTimeout = %d\n", Conf_PingTimeout );
printf( " PongTimeout = %d\n", Conf_PongTimeout );
printf( " ConnectRetry = %d\n", Conf_ConnectRetry );
printf( " OperCanUseMode = %s\n", Conf_OperCanMode == true? "yes" : "no" );
printf( " OperServerMode = %s\n", Conf_OperServerMode == true? "yes" : "no" );
printf( " OperCanUseMode = %s\n", Conf_OperCanMode == TRUE ? "yes" : "no" );
if( Conf_MaxConnections > 0 ) printf( " MaxConnections = %ld\n", Conf_MaxConnections );
else printf( " MaxConnections = -1\n" );
if( Conf_MaxConnectionsIP > 0 ) printf( " MaxConnectionsIP = %d\n", Conf_MaxConnectionsIP );
@@ -160,7 +150,6 @@ Conf_Test( void )
puts( "[OPERATOR]" );
printf( " Name = %s\n", Conf_Oper[i].name );
printf( " Password = %s\n", Conf_Oper[i].pwd );
if ( Conf_Oper[i].mask ) printf( " Mask = %s\n", Conf_Oper[i].mask );
puts( "" );
}
@@ -195,7 +184,7 @@ Conf_Test( void )
} /* Conf_Test */
GLOBAL void
GLOBAL VOID
Conf_UnsetServer( CONN_ID Idx )
{
/* Set next time for next connection attempt, if this is a server
@@ -203,8 +192,7 @@ Conf_UnsetServer( CONN_ID Idx )
* "once", delete it from our configuration.
* Non-Server-Connections will be silently ignored. */
int i;
time_t t;
INT i;
/* Check all our configured servers */
for( i = 0; i < MAX_SERVERS; i++ )
@@ -222,21 +210,18 @@ Conf_UnsetServer( CONN_ID Idx )
else
{
/* Set time for next connect attempt */
t = time(NULL);
if (Conf_Server[i].lasttry < t - Conf_ConnectRetry) {
/* The connection has been "long", so we don't
* require the next attempt to be delayed. */
Conf_Server[i].lasttry =
t - Conf_ConnectRetry + RECONNECT_DELAY;
} else
Conf_Server[i].lasttry = t;
if( Conf_Server[i].lasttry < time( NULL ) - Conf_ConnectRetry )
{
/* Okay, the connection was established "long enough": */
Conf_Server[i].lasttry = time( NULL ) - Conf_ConnectRetry + RECONNECT_DELAY;
}
}
}
} /* Conf_UnsetServer */
GLOBAL void
Conf_SetServer( int ConfServer, CONN_ID Idx )
GLOBAL VOID
Conf_SetServer( INT ConfServer, CONN_ID Idx )
{
/* Set connection for specified configured server */
@@ -247,12 +232,12 @@ Conf_SetServer( int ConfServer, CONN_ID Idx )
} /* Conf_SetServer */
GLOBAL int
GLOBAL INT
Conf_GetServer( CONN_ID Idx )
{
/* Get index of server in configuration structure */
int i = 0;
INT i = 0;
assert( Idx > NONE );
@@ -264,12 +249,12 @@ Conf_GetServer( CONN_ID Idx )
} /* Conf_GetServer */
GLOBAL bool
Conf_EnableServer( char *Name, UINT16 Port )
GLOBAL BOOLEAN
Conf_EnableServer( CHAR *Name, INT Port )
{
/* Enable specified server and adjust port */
int i;
INT i;
assert( Name != NULL );
@@ -280,19 +265,19 @@ Conf_EnableServer( char *Name, UINT16 Port )
/* Gotcha! Set port and enable server: */
Conf_Server[i].port = Port;
Conf_Server[i].flags &= ~CONF_SFLAG_DISABLED;
return true;
return TRUE;
}
}
return false;
return FALSE;
} /* Conf_EnableServer */
GLOBAL bool
Conf_DisableServer( char *Name )
GLOBAL BOOLEAN
Conf_DisableServer( CHAR *Name )
{
/* Enable specified server and adjust port */
int i;
INT i;
assert( Name != NULL );
@@ -302,20 +287,20 @@ Conf_DisableServer( char *Name )
{
/* Gotcha! Disable and disconnect server: */
Conf_Server[i].flags |= CONF_SFLAG_DISABLED;
if( Conf_Server[i].conn_id > NONE ) Conn_Close( Conf_Server[i].conn_id, NULL, "Server link terminated on operator request", true);
return true;
if( Conf_Server[i].conn_id > NONE ) Conn_Close( Conf_Server[i].conn_id, NULL, "Server link terminated on operator request", TRUE );
return TRUE;
}
}
return false;
return FALSE;
} /* Conf_DisableServer */
GLOBAL bool
Conf_AddServer( char *Name, UINT16 Port, char *Host, char *MyPwd, char *PeerPwd )
GLOBAL BOOLEAN
Conf_AddServer( CHAR *Name, INT Port, CHAR *Host, CHAR *MyPwd, CHAR *PeerPwd )
{
/* Add new server to configuration */
int i;
INT i;
assert( Name != NULL );
assert( Host != NULL );
@@ -328,7 +313,7 @@ Conf_AddServer( char *Name, UINT16 Port, char *Host, char *MyPwd, char *PeerPwd
/* Is this item used? */
if( ! Conf_Server[i].name[0] ) break;
}
if( i >= MAX_SERVERS ) return false;
if( i >= MAX_SERVERS ) return FALSE;
Init_Server_Struct( &Conf_Server[i] );
strlcpy( Conf_Server[i].name, Name, sizeof( Conf_Server[i].name ));
@@ -338,19 +323,19 @@ Conf_AddServer( char *Name, UINT16 Port, char *Host, char *MyPwd, char *PeerPwd
Conf_Server[i].port = Port;
Conf_Server[i].flags = CONF_SFLAG_ONCE;
return true;
return TRUE;
} /* Conf_AddServer */
LOCAL void
Set_Defaults( bool InitServers )
LOCAL VOID
Set_Defaults( BOOLEAN InitServers )
{
/* Initialize configuration variables with default values. */
int i;
INT i;
strcpy( Conf_ServerName, "" );
snprintf( Conf_ServerInfo, sizeof Conf_ServerInfo, "%s %s", PACKAGE_NAME, PACKAGE_VERSION );
sprintf( Conf_ServerInfo, "%s %s", PACKAGE_NAME, PACKAGE_VERSION );
strcpy( Conf_ServerPwd, "" );
strcpy( Conf_ServerAdmin1, "" );
@@ -364,8 +349,6 @@ Set_Defaults( bool InitServers )
strlcpy( Conf_Chroot, CHROOT_DIR, sizeof( Conf_Chroot ));
strlcpy( Conf_PidFile, PID_FILE, sizeof( Conf_PidFile ));
Conf_ListenPorts_Count = 0;
strcpy( Conf_ListenAddress, "" );
@@ -379,8 +362,7 @@ Set_Defaults( bool InitServers )
Conf_Oper_Count = 0;
Conf_Channel_Count = 0;
Conf_OperCanMode = false;
Conf_OperServerMode = false;
Conf_OperCanMode = FALSE;
Conf_MaxConnections = -1;
Conf_MaxConnectionsIP = 5;
@@ -391,13 +373,13 @@ Set_Defaults( bool InitServers )
} /* Set_Defaults */
LOCAL void
Read_Config( void )
LOCAL VOID
Read_Config( VOID )
{
/* Read configuration file. */
char section[LINE_LEN], str[LINE_LEN], *var, *arg, *ptr;
int line, i, n;
CHAR section[LINE_LEN], str[LINE_LEN], *var, *arg, *ptr;
INT line, i, n;
FILE *fd;
/* Open configuration file */
@@ -454,7 +436,7 @@ Read_Config( void )
New_Server_Idx = NONE;
/* Read configuration file */
while( true )
while( TRUE )
{
if( ! fgets( str, LINE_LEN, fd )) break;
ngt_TrimStr( str );
@@ -474,12 +456,8 @@ Read_Config( void )
else
{
/* Initialize new operator structure */
Conf_Oper[Conf_Oper_Count].name[0] = '\0';
Conf_Oper[Conf_Oper_Count].pwd[0] = '\0';
if (Conf_Oper[Conf_Oper_Count].mask) {
free(Conf_Oper[Conf_Oper_Count].mask );
Conf_Oper[Conf_Oper_Count].mask = NULL;
}
strcpy( Conf_Oper[Conf_Oper_Count].name, "" );
strcpy( Conf_Oper[Conf_Oper_Count].pwd, "" );
Conf_Oper_Count++;
}
continue;
@@ -568,24 +546,13 @@ Read_Config( void )
} /* Read_Config */
LOCAL bool
Check_ArgIsTrue( const char *Arg )
{
if( strcasecmp( Arg, "yes" ) == 0 ) return true;
if( strcasecmp( Arg, "true" ) == 0 ) return true;
if( atoi( Arg ) != 0 ) return true;
return false;
} /* Check_ArgIsTrue */
LOCAL void
Handle_GLOBAL( int Line, char *Var, char *Arg )
LOCAL VOID
Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg )
{
struct passwd *pwd;
struct group *grp;
char *ptr;
long port;
CHAR *ptr;
LONG port;
assert( Line > 0 );
assert( Var != NULL );
@@ -594,43 +561,37 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
if( strcasecmp( Var, "Name" ) == 0 )
{
/* Server name */
if( strlcpy( Conf_ServerName, Arg, sizeof( Conf_ServerName )) >= sizeof( Conf_ServerName ))
Config_Error_TooLong( Line, Var );
if( strlcpy( Conf_ServerName, Arg, sizeof( Conf_ServerName )) >= sizeof( Conf_ServerName )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Name\" too long!", NGIRCd_ConfFile, Line );
return;
}
if( strcasecmp( Var, "Info" ) == 0 )
{
/* Info text of server */
if( strlcpy( Conf_ServerInfo, Arg, sizeof( Conf_ServerInfo )) >= sizeof( Conf_ServerInfo ))
Config_Error_TooLong ( Line, Var );
if( strlcpy( Conf_ServerInfo, Arg, sizeof( Conf_ServerInfo )) >= sizeof( Conf_ServerInfo )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Info\" too long!", NGIRCd_ConfFile, Line );
return;
}
if( strcasecmp( Var, "Password" ) == 0 )
{
/* Global server password */
if( strlcpy( Conf_ServerPwd, Arg, sizeof( Conf_ServerPwd )) >= sizeof( Conf_ServerPwd ))
Config_Error_TooLong( Line, Var );
if( strlcpy( Conf_ServerPwd, Arg, sizeof( Conf_ServerPwd )) >= sizeof( Conf_ServerPwd )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Password\" too long!", NGIRCd_ConfFile, Line );
return;
}
if( strcasecmp( Var, "AdminInfo1" ) == 0 )
{
/* Administrative info #1 */
if( strlcpy( Conf_ServerAdmin1, Arg, sizeof( Conf_ServerAdmin1 )) >= sizeof( Conf_ServerAdmin1 )) Config_Error_TooLong ( Line, Var );
if( strlcpy( Conf_ServerAdmin1, Arg, sizeof( Conf_ServerAdmin1 )) >= sizeof( Conf_ServerAdmin1 )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"AdminInfo1\" too long!", NGIRCd_ConfFile, Line );
return;
}
if( strcasecmp( Var, "AdminInfo2" ) == 0 )
{
/* Administrative info #2 */
if( strlcpy( Conf_ServerAdmin2, Arg, sizeof( Conf_ServerAdmin2 )) >= sizeof( Conf_ServerAdmin2 )) Config_Error_TooLong ( Line, Var );
if( strlcpy( Conf_ServerAdmin2, Arg, sizeof( Conf_ServerAdmin2 )) >= sizeof( Conf_ServerAdmin2 )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"AdminInfo2\" too long!", NGIRCd_ConfFile, Line );
return;
}
if( strcasecmp( Var, "AdminEMail" ) == 0 )
{
/* Administrative email contact */
if( strlcpy( Conf_ServerAdminMail, Arg, sizeof( Conf_ServerAdminMail )) >= sizeof( Conf_ServerAdminMail )) Config_Error_TooLong( Line, Var );
if( strlcpy( Conf_ServerAdminMail, Arg, sizeof( Conf_ServerAdminMail )) >= sizeof( Conf_ServerAdminMail )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"AdminEMail\" too long!", NGIRCd_ConfFile, Line );
return;
}
if( strcasecmp( Var, "Ports" ) == 0 )
@@ -645,7 +606,7 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
if( Conf_ListenPorts_Count + 1 > MAX_LISTEN_PORTS ) Config_Error( LOG_ERR, "Too many listen ports configured. Port %ld ignored.", port );
else
{
if( port > 0 && port < 0xFFFF ) Conf_ListenPorts[Conf_ListenPorts_Count++] = (UINT16)port;
if( port > 0 && port < 0xFFFF ) Conf_ListenPorts[Conf_ListenPorts_Count++] = (UINT)port;
else Config_Error( LOG_ERR, "%s, line %d (section \"Global\"): Illegal port number %ld!", NGIRCd_ConfFile, Line, port );
}
ptr = strtok( NULL, "," );
@@ -655,37 +616,21 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
if( strcasecmp( Var, "MotdFile" ) == 0 )
{
/* "Message of the day" (MOTD) file */
if( strlcpy( Conf_MotdFile, Arg, sizeof( Conf_MotdFile )) >= sizeof( Conf_MotdFile ))
Config_Error_TooLong( Line, Var );
if( strlcpy( Conf_MotdFile, Arg, sizeof( Conf_MotdFile )) >= sizeof( Conf_MotdFile )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"MotdFile\" too long!", NGIRCd_ConfFile, Line );
return;
}
if( strcasecmp( Var, "MotdPhrase" ) == 0 )
{
/* "Message of the day" phrase (instead of file) */
if( strlcpy( Conf_MotdPhrase, Arg, sizeof( Conf_MotdPhrase )) >= sizeof( Conf_MotdPhrase ))
Config_Error_TooLong( Line, Var );
if( strlcpy( Conf_MotdPhrase, Arg, sizeof( Conf_MotdPhrase )) >= sizeof( Conf_MotdPhrase )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"MotdPhrase\" too long!", NGIRCd_ConfFile, Line );
return;
}
if( strcasecmp( Var, "ChrootDir" ) == 0 )
{
/* directory for chroot() */
if( strlcpy( Conf_Chroot, Arg, sizeof( Conf_Chroot )) >= sizeof( Conf_Chroot ))
Config_Error_TooLong( Line, Var );
if( strlcpy( Conf_Chroot, Arg, sizeof( Conf_Chroot )) >= sizeof( Conf_Chroot )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"ChrootDir\" too long!", NGIRCd_ConfFile, Line );
return;
}
if ( strcasecmp( Var, "PidFile" ) == 0 )
{
/* name of pidfile */
if( strlcpy( Conf_PidFile, Arg, sizeof( Conf_PidFile )) >= sizeof( Conf_PidFile ))
Config_Error_TooLong( Line, Var );
return;
}
if( strcasecmp( Var, "ServerUID" ) == 0 )
{
/* UID the daemon should switch to */
@@ -694,10 +639,10 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
else
{
#ifdef HAVE_ISDIGIT
if( ! isdigit( (int)*Arg )) Config_Error_NaN( Line, Var );
if( ! isdigit( (INT)*Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"ServerUID\" is not a number!", NGIRCd_ConfFile, Line );
else
#endif
Conf_UID = (unsigned int)atoi( Arg );
Conf_UID = (UINT)atoi( Arg );
}
return;
}
@@ -709,10 +654,10 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
else
{
#ifdef HAVE_ISDIGIT
if( ! isdigit( (int)*Arg )) Config_Error_NaN( Line, Var );
if( ! isdigit( (INT)*Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"ServerGID\" is not a number!", NGIRCd_ConfFile, Line );
else
#endif
Conf_GID = (unsigned int)atoi( Arg );
Conf_GID = (UINT)atoi( Arg );
}
return;
}
@@ -752,20 +697,17 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
if( strcasecmp( Var, "OperCanUseMode" ) == 0 )
{
/* Are IRC operators allowed to use MODE in channels they aren't Op in? */
Conf_OperCanMode = Check_ArgIsTrue( Arg );
return;
}
if( strcasecmp( Var, "OperServerMode" ) == 0 )
{
/* Mask IRC operator as if coming from the server? (ircd-irc2 compat hack) */
Conf_OperServerMode = Check_ArgIsTrue( Arg );
if( strcasecmp( Arg, "yes" ) == 0 ) Conf_OperCanMode = TRUE;
else if( strcasecmp( Arg, "true" ) == 0 ) Conf_OperCanMode = TRUE;
else if( atoi( Arg ) != 0 ) Conf_OperCanMode = TRUE;
else Conf_OperCanMode = FALSE;
return;
}
if( strcasecmp( Var, "MaxConnections" ) == 0 )
{
/* Maximum number of connections. Values <= 0 are equal to "no limit". */
#ifdef HAVE_ISDIGIT
if( ! isdigit( (int)*Arg )) Config_Error_NaN( Line, Var);
if( ! isdigit( (INT)*Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"MaxConnections\" is not a number!", NGIRCd_ConfFile, Line );
else
#endif
Conf_MaxConnections = atol( Arg );
@@ -775,7 +717,7 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
{
/* Maximum number of simoultanous connections from one IP. Values <= 0 are equal to "no limit". */
#ifdef HAVE_ISDIGIT
if( ! isdigit( (int)*Arg )) Config_Error_NaN( Line, Var );
if( ! isdigit( (INT)*Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"MaxConnectionsIP\" is not a number!", NGIRCd_ConfFile, Line );
else
#endif
Conf_MaxConnectionsIP = atoi( Arg );
@@ -785,7 +727,7 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
{
/* Maximum number of channels a user can join. Values <= 0 are equal to "no limit". */
#ifdef HAVE_ISDIGIT
if( ! isdigit( (int)*Arg )) Config_Error_NaN( Line, Var );
if( ! isdigit( (INT)*Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"MaxJoins\" is not a number!", NGIRCd_ConfFile, Line );
else
#endif
Conf_MaxJoins = atoi( Arg );
@@ -796,7 +738,7 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
/* IP-Address to bind sockets */
if( strlcpy( Conf_ListenAddress, Arg, sizeof( Conf_ListenAddress )) >= sizeof( Conf_ListenAddress ))
{
Config_Error_TooLong( Line, Var );
Config_Error( LOG_WARNING, "%s, line %d: Value of \"Listen\" too long!", NGIRCd_ConfFile, Line );
}
return;
}
@@ -805,8 +747,8 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
} /* Handle_GLOBAL */
LOCAL void
Handle_OPERATOR( int Line, char *Var, char *Arg )
LOCAL VOID
Handle_OPERATOR( INT Line, CHAR *Var, CHAR *Arg )
{
assert( Line > 0 );
assert( Var != NULL );
@@ -816,34 +758,24 @@ Handle_OPERATOR( int Line, char *Var, char *Arg )
if( strcasecmp( Var, "Name" ) == 0 )
{
/* Name of IRC operator */
if( strlcpy( Conf_Oper[Conf_Oper_Count - 1].name, Arg, sizeof( Conf_Oper[Conf_Oper_Count - 1].name )) >= sizeof( Conf_Oper[Conf_Oper_Count - 1].name )) Config_Error_TooLong( Line, Var );
if( strlcpy( Conf_Oper[Conf_Oper_Count - 1].name, Arg, sizeof( Conf_Oper[Conf_Oper_Count - 1].name )) >= sizeof( Conf_Oper[Conf_Oper_Count - 1].name )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Name\" too long!", NGIRCd_ConfFile, Line );
return;
}
if( strcasecmp( Var, "Password" ) == 0 )
{
/* Password of IRC operator */
if( strlcpy( Conf_Oper[Conf_Oper_Count - 1].pwd, Arg, sizeof( Conf_Oper[Conf_Oper_Count - 1].pwd )) >= sizeof( Conf_Oper[Conf_Oper_Count - 1].pwd )) Config_Error_TooLong( Line, Var );
return;
}
if( strcasecmp( Var, "Mask" ) == 0 )
{
if (Conf_Oper[Conf_Oper_Count - 1].mask) return; /* Hostname already configured */
Conf_Oper[Conf_Oper_Count - 1].mask = strdup( Arg );
if (! Conf_Oper[Conf_Oper_Count - 1].mask) {
Config_Error( LOG_ERR, "%s, line %d: Cannot allocate memory for operator mask: %s", NGIRCd_ConfFile, Line, strerror(errno) );
return;
}
if( strlcpy( Conf_Oper[Conf_Oper_Count - 1].pwd, Arg, sizeof( Conf_Oper[Conf_Oper_Count - 1].pwd )) >= sizeof( Conf_Oper[Conf_Oper_Count - 1].pwd )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Password\" too long!", NGIRCd_ConfFile, Line );
return;
}
Config_Error( LOG_ERR, "%s, line %d (section \"Operator\"): Unknown variable \"%s\"!", NGIRCd_ConfFile, Line, Var );
} /* Handle_OPERATOR */
LOCAL void
Handle_SERVER( int Line, char *Var, char *Arg )
LOCAL VOID
Handle_SERVER( INT Line, CHAR *Var, CHAR *Arg )
{
long port;
LONG port;
assert( Line > 0 );
assert( Var != NULL );
@@ -855,35 +787,32 @@ Handle_SERVER( int Line, char *Var, char *Arg )
if( strcasecmp( Var, "Host" ) == 0 )
{
/* Hostname of the server */
if( strlcpy( New_Server.host, Arg, sizeof( New_Server.host )) >= sizeof( New_Server.host ))
Config_Error_TooLong ( Line, Var );
if( strlcpy( New_Server.host, Arg, sizeof( New_Server.host )) >= sizeof( New_Server.host )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Host\" too long!", NGIRCd_ConfFile, Line );
return;
}
if( strcasecmp( Var, "Name" ) == 0 )
{
/* Name of the server ("Nick"/"ID") */
if( strlcpy( New_Server.name, Arg, sizeof( New_Server.name )) >= sizeof( New_Server.name ))
Config_Error_TooLong( Line, Var );
if( strlcpy( New_Server.name, Arg, sizeof( New_Server.name )) >= sizeof( New_Server.name )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Name\" too long!", NGIRCd_ConfFile, Line );
return;
}
if( strcasecmp( Var, "MyPassword" ) == 0 )
{
/* Password of this server which is sent to the peer */
if( strlcpy( New_Server.pwd_in, Arg, sizeof( New_Server.pwd_in )) >= sizeof( New_Server.pwd_in )) Config_Error_TooLong( Line, Var );
if( strlcpy( New_Server.pwd_in, Arg, sizeof( New_Server.pwd_in )) >= sizeof( New_Server.pwd_in )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"MyPassword\" too long!", NGIRCd_ConfFile, Line );
return;
}
if( strcasecmp( Var, "PeerPassword" ) == 0 )
{
/* Passwort of the peer which must be received */
if( strlcpy( New_Server.pwd_out, Arg, sizeof( New_Server.pwd_out )) >= sizeof( New_Server.pwd_out )) Config_Error_TooLong( Line, Var );
if( strlcpy( New_Server.pwd_out, Arg, sizeof( New_Server.pwd_out )) >= sizeof( New_Server.pwd_out )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"PeerPassword\" too long!", NGIRCd_ConfFile, Line );
return;
}
if( strcasecmp( Var, "Port" ) == 0 )
{
/* Port to which this server should connect */
port = atol( Arg );
if( port > 0 && port < 0xFFFF ) New_Server.port = (UINT16)port;
if( port > 0 && port < 0xFFFF ) New_Server.port = (INT)port;
else Config_Error( LOG_ERR, "%s, line %d (section \"Server\"): Illegal port number %ld!", NGIRCd_ConfFile, Line, port );
return;
}
@@ -891,7 +820,7 @@ Handle_SERVER( int Line, char *Var, char *Arg )
{
/* Server group */
#ifdef HAVE_ISDIGIT
if( ! isdigit( (int)*Arg )) Config_Error_NaN( Line, Var );
if( ! isdigit( (INT)*Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Group\" is not a number!", NGIRCd_ConfFile, Line );
else
#endif
New_Server.group = atoi( Arg );
@@ -902,8 +831,8 @@ Handle_SERVER( int Line, char *Var, char *Arg )
} /* Handle_SERVER */
LOCAL void
Handle_CHANNEL( int Line, char *Var, char *Arg )
LOCAL VOID
Handle_CHANNEL( INT Line, CHAR *Var, CHAR *Arg )
{
assert( Line > 0 );
assert( Var != NULL );
@@ -912,23 +841,19 @@ Handle_CHANNEL( int Line, char *Var, char *Arg )
if( strcasecmp( Var, "Name" ) == 0 )
{
/* Name of the channel */
if( strlcpy( Conf_Channel[Conf_Channel_Count - 1].name, Arg, sizeof( Conf_Channel[Conf_Channel_Count - 1].name )) >= sizeof( Conf_Channel[Conf_Channel_Count - 1].name ))
Config_Error_TooLong( Line, Var );
if( strlcpy( Conf_Channel[Conf_Channel_Count - 1].name, Arg, sizeof( Conf_Channel[Conf_Channel_Count - 1].name )) >= sizeof( Conf_Channel[Conf_Channel_Count - 1].name )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Name\" too long!", NGIRCd_ConfFile, Line );
return;
}
if( strcasecmp( Var, "Modes" ) == 0 )
{
/* Initial modes */
if( strlcpy( Conf_Channel[Conf_Channel_Count - 1].modes, Arg, sizeof( Conf_Channel[Conf_Channel_Count - 1].modes )) >= sizeof( Conf_Channel[Conf_Channel_Count - 1].modes ))
Config_Error_TooLong( Line, Var );
if( strlcpy( Conf_Channel[Conf_Channel_Count - 1].modes, Arg, sizeof( Conf_Channel[Conf_Channel_Count - 1].modes )) >= sizeof( Conf_Channel[Conf_Channel_Count - 1].modes )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Modes\" too long!", NGIRCd_ConfFile, Line );
return;
}
if( strcasecmp( Var, "Topic" ) == 0 )
{
/* Initial topic */
if( strlcpy( Conf_Channel[Conf_Channel_Count - 1].topic, Arg, sizeof( Conf_Channel[Conf_Channel_Count - 1].topic )) >= sizeof( Conf_Channel[Conf_Channel_Count - 1].topic ))
Config_Error_TooLong( Line, Var );
if( strlcpy( Conf_Channel[Conf_Channel_Count - 1].topic, Arg, sizeof( Conf_Channel[Conf_Channel_Count - 1].topic )) >= sizeof( Conf_Channel[Conf_Channel_Count - 1].topic )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Topic\" too long!", NGIRCd_ConfFile, Line );
return;
}
@@ -936,13 +861,13 @@ Handle_CHANNEL( int Line, char *Var, char *Arg )
} /* Handle_CHANNEL */
LOCAL void
Validate_Config( bool Configtest )
LOCAL VOID
Validate_Config( BOOLEAN Configtest )
{
/* Validate configuration settings. */
#ifdef DEBUG
int i, servers, servers_once;
INT i, servers, servers_once;
#endif
if( ! Conf_ServerName[0] )
@@ -986,9 +911,9 @@ Validate_Config( bool Configtest )
Config_Error( LOG_WARNING, "No administrative information configured but required by RFC!" );
}
#ifdef FD_SETSIZE
if(( Conf_MaxConnections > (long)FD_SETSIZE ) || ( Conf_MaxConnections < 1 ))
if(( Conf_MaxConnections > (LONG)FD_SETSIZE ) || ( Conf_MaxConnections < 1 ))
{
Conf_MaxConnections = (long)FD_SETSIZE;
Conf_MaxConnections = (LONG)FD_SETSIZE;
Config_Error( LOG_ERR, "Setting MaxConnections to %ld, select() can't handle more file descriptors!", Conf_MaxConnections );
}
#else
@@ -1010,30 +935,18 @@ Validate_Config( bool Configtest )
} /* Validate_Config */
LOCAL void
Config_Error_TooLong ( const int Line, const char *Item )
{
Config_Error( LOG_WARNING, "%s, line %d: Value of \"%s\" too long!", NGIRCd_ConfFile, Line, Item );
}
LOCAL void
Config_Error_NaN( const int Line, const char *Item )
{
Config_Error( LOG_WARNING, "%s, line %d: Value of \"%s\" is not a number!", NGIRCd_ConfFile, Line, Item );
}
#ifdef PROTOTYPES
LOCAL void Config_Error( const int Level, const char *Format, ... )
LOCAL VOID Config_Error( CONST INT Level, CONST CHAR *Format, ... )
#else
LOCAL void Config_Error( Level, Format, va_alist )
const int Level;
const char *Format;
LOCAL VOID Config_Error( Level, Format, va_alist )
CONST INT Level;
CONST CHAR *Format;
va_dcl
#endif
{
/* Error! Write to console and/or logfile. */
char msg[MAX_LOG_MSG_LEN];
CHAR msg[MAX_LOG_MSG_LEN];
va_list ap;
assert( Format != NULL );
@@ -1054,20 +967,24 @@ va_dcl
} /* Config_Error */
LOCAL void
LOCAL VOID
Init_Server_Struct( CONF_SERVER *Server )
{
/* Initialize server configuration structur to default values */
assert( Server != NULL );
memset( Server, 0, sizeof (CONF_SERVER) );
strcpy( Server->host, "" );
strcpy( Server->ip, "" );
strcpy( Server->name, "" );
strcpy( Server->pwd_in, "" );
strcpy( Server->pwd_out, "" );
Server->port = 0;
Server->group = NONE;
Server->lasttry = time( NULL ) - Conf_ConnectRetry + STARTUP_DELAY;
Server->res_stat = NULL;
if( NGIRCd_Passive ) Server->flags = CONF_SFLAG_DISABLED;
else Server->flags = 0;
Server->conn_id = NONE;
} /* Init_Server_Struct */

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: conf.h,v 1.34 2005/03/20 13:54:06 fw Exp $
* $Id: conf.h,v 1.28.2.1 2004/05/07 11:24:18 alex Exp $
*
* Configuration management (header)
*/
@@ -20,35 +20,34 @@
#include <time.h>
#include "defines.h"
#include "portab.h"
typedef struct _Conf_Oper
{
char name[CLIENT_PASS_LEN]; /* Name (ID) of IRC operator */
char pwd[CLIENT_PASS_LEN]; /* Password */
char *mask;
CHAR name[CLIENT_PASS_LEN]; /* Name (ID) of IRC operator */
CHAR pwd[CLIENT_PASS_LEN]; /* Password */
} CONF_OPER;
typedef struct _Conf_Server
{
char host[HOST_LEN]; /* Hostname */
char ip[16]; /* IP address (Resolver) */
char name[CLIENT_ID_LEN]; /* IRC-Client-ID */
char pwd_in[CLIENT_PASS_LEN]; /* Password which must be received */
char pwd_out[CLIENT_PASS_LEN]; /* Password to send to peer */
UINT16 port; /* Server port */
int group; /* Group of server */
CHAR host[HOST_LEN]; /* Hostname */
CHAR ip[16]; /* IP address (Resolver) */
CHAR name[CLIENT_ID_LEN]; /* IRC-Client-ID */
CHAR pwd_in[CLIENT_PASS_LEN]; /* Password which must be received */
CHAR pwd_out[CLIENT_PASS_LEN]; /* Password to send to peer */
INT port; /* Server port */
INT group; /* Group of server */
time_t lasttry; /* Last connect attempt */
RES_STAT *res_stat; /* Status of the resolver */
int flags; /* Flags */
INT flags; /* Flags */
CONN_ID conn_id; /* ID of server connection or NONE */
} CONF_SERVER;
typedef struct _Conf_Channel
{
char name[CHANNEL_NAME_LEN]; /* Name of the channel */
char modes[CHANNEL_MODE_LEN]; /* Initial channel modes */
char topic[CHANNEL_TOPIC_LEN]; /* Initial topic */
CHAR name[CHANNEL_NAME_LEN]; /* Name of the channel */
CHAR modes[CHANNEL_MODE_LEN]; /* Initial channel modes */
CHAR topic[CHANNEL_TOPIC_LEN]; /* Initial topic */
} CONF_CHANNEL;
@@ -57,89 +56,81 @@ typedef struct _Conf_Channel
/* Name ("Nick") of the servers */
GLOBAL char Conf_ServerName[CLIENT_ID_LEN];
GLOBAL CHAR Conf_ServerName[CLIENT_ID_LEN];
/* Server info text */
GLOBAL char Conf_ServerInfo[CLIENT_INFO_LEN];
GLOBAL CHAR Conf_ServerInfo[CLIENT_INFO_LEN];
/* Global server passwort */
GLOBAL char Conf_ServerPwd[CLIENT_PASS_LEN];
GLOBAL CHAR Conf_ServerPwd[CLIENT_PASS_LEN];
/* Administrative information */
GLOBAL char Conf_ServerAdmin1[CLIENT_INFO_LEN];
GLOBAL char Conf_ServerAdmin2[CLIENT_INFO_LEN];
GLOBAL char Conf_ServerAdminMail[CLIENT_INFO_LEN];
GLOBAL CHAR Conf_ServerAdmin1[CLIENT_INFO_LEN];
GLOBAL CHAR Conf_ServerAdmin2[CLIENT_INFO_LEN];
GLOBAL CHAR Conf_ServerAdminMail[CLIENT_INFO_LEN];
/* File with MOTD text */
GLOBAL char Conf_MotdFile[FNAME_LEN];
GLOBAL CHAR Conf_MotdFile[FNAME_LEN];
/* Phrase with MOTD text */
GLOBAL char Conf_MotdPhrase[LINE_LEN];
GLOBAL CHAR Conf_MotdPhrase[LINE_LEN];
/* Ports the server should listen on */
GLOBAL UINT16 Conf_ListenPorts[MAX_LISTEN_PORTS];
GLOBAL int Conf_ListenPorts_Count;
GLOBAL UINT Conf_ListenPorts[MAX_LISTEN_PORTS];
GLOBAL INT Conf_ListenPorts_Count;
/* Address to which the socket should be bound or empty (=all) */
GLOBAL char Conf_ListenAddress[16];
GLOBAL CHAR Conf_ListenAddress[16];
/* User and group ID the server should run with */
GLOBAL unsigned int Conf_UID;
GLOBAL unsigned int Conf_GID;
GLOBAL UINT Conf_UID;
GLOBAL UINT Conf_GID;
/* A directory to chroot() in */
GLOBAL char Conf_Chroot[FNAME_LEN];
/* File with PID of daemon */
GLOBAL char Conf_PidFile[FNAME_LEN];
GLOBAL CHAR Conf_Chroot[FNAME_LEN];
/* Timeouts for PING and PONG */
GLOBAL int Conf_PingTimeout;
GLOBAL int Conf_PongTimeout;
GLOBAL INT Conf_PingTimeout;
GLOBAL INT Conf_PongTimeout;
/* Seconds between connect attempts to other servers */
GLOBAL int Conf_ConnectRetry;
GLOBAL INT Conf_ConnectRetry;
/* Operators */
GLOBAL CONF_OPER Conf_Oper[MAX_OPERATORS];
GLOBAL int Conf_Oper_Count;
GLOBAL INT Conf_Oper_Count;
/* Servers */
GLOBAL CONF_SERVER Conf_Server[MAX_SERVERS];
/* Pre-defined channels */
GLOBAL CONF_CHANNEL Conf_Channel[MAX_DEFCHANNELS];
GLOBAL int Conf_Channel_Count;
GLOBAL INT Conf_Channel_Count;
/* Are IRC operators allowed to always use MODE? */
GLOBAL bool Conf_OperCanMode;
/* If an IRC op gives chanop privileges without being a chanop,
* ircd2 will ignore the command. This enables a workaround:
* It masks the command as coming from the server */
GLOBAL bool Conf_OperServerMode;
GLOBAL BOOLEAN Conf_OperCanMode;
/* Maximum number of connections to this server */
GLOBAL long Conf_MaxConnections;
GLOBAL LONG Conf_MaxConnections;
/* Maximum number of channels a user can join */
GLOBAL int Conf_MaxJoins;
GLOBAL INT Conf_MaxJoins;
/* Maximum number of connections per IP address */
GLOBAL int Conf_MaxConnectionsIP;
GLOBAL INT Conf_MaxConnectionsIP;
GLOBAL void Conf_Init PARAMS((void ));
GLOBAL void Conf_Rehash PARAMS((void ));
GLOBAL int Conf_Test PARAMS((void ));
GLOBAL VOID Conf_Init PARAMS((VOID ));
GLOBAL VOID Conf_Rehash PARAMS((VOID ));
GLOBAL INT Conf_Test PARAMS((VOID ));
GLOBAL void Conf_UnsetServer PARAMS(( CONN_ID Idx ));
GLOBAL void Conf_SetServer PARAMS(( int ConfServer, CONN_ID Idx ));
GLOBAL int Conf_GetServer PARAMS(( CONN_ID Idx ));
GLOBAL VOID Conf_UnsetServer PARAMS(( CONN_ID Idx ));
GLOBAL VOID Conf_SetServer PARAMS(( INT ConfServer, CONN_ID Idx ));
GLOBAL INT Conf_GetServer PARAMS(( CONN_ID Idx ));
GLOBAL bool Conf_EnableServer PARAMS(( char *Name, UINT16 Port ));
GLOBAL bool Conf_DisableServer PARAMS(( char *Name ));
GLOBAL bool Conf_AddServer PARAMS(( char *Name, UINT16 Port, char *Host, char *MyPwd, char *PeerPwd ));
GLOBAL BOOLEAN Conf_EnableServer PARAMS(( CHAR *Name, INT Port ));
GLOBAL BOOLEAN Conf_DisableServer PARAMS(( CHAR *Name ));
GLOBAL BOOLEAN Conf_AddServer PARAMS(( CHAR *Name, INT Port, CHAR *Host, CHAR *MyPwd, CHAR *PeerPwd ));
#endif

View File

@@ -16,20 +16,19 @@
#include "portab.h"
static char UNUSED id[] = "$Id: conn-func.c,v 1.6 2005/06/12 16:32:17 alex Exp $";
static char UNUSED id[] = "$Id: conn-func.c,v 1.3 2003/12/26 15:55:07 alex Exp $";
#include "imp.h"
#include <assert.h>
#include <log.h>
#include "conn.h"
#include "client.h"
#include "exp.h"
#include "conn-func.h"
GLOBAL void
GLOBAL VOID
Conn_UpdateIdle( CONN_ID Idx )
{
/* Idle-Timer zuruecksetzen */
@@ -59,7 +58,7 @@ Conn_LastPing( CONN_ID Idx )
} /* Conn_LastPing */
GLOBAL void
GLOBAL VOID
Conn_SetPenalty( CONN_ID Idx, time_t Seconds )
{
/* Penalty-Delay fuer eine Verbindung (in Sekunden) setzen;
@@ -77,7 +76,7 @@ Conn_SetPenalty( CONN_ID Idx, time_t Seconds )
} /* Conn_SetPenalty */
GLOBAL void
GLOBAL VOID
Conn_ResetPenalty( CONN_ID Idx )
{
assert( Idx > NONE );
@@ -85,8 +84,8 @@ Conn_ResetPenalty( CONN_ID Idx )
} /* Conn_ResetPenalty */
GLOBAL void
Conn_ClearFlags( void )
GLOBAL VOID
Conn_ClearFlags( VOID )
{
/* Alle Connection auf "nicht-markiert" setzen */
@@ -96,18 +95,18 @@ Conn_ClearFlags( void )
} /* Conn_ClearFlags */
GLOBAL int
GLOBAL INT
Conn_Flag( CONN_ID Idx )
{
/* Ist eine Connection markiert (true) oder nicht? */
/* Ist eine Connection markiert (TRUE) oder nicht? */
assert( Idx > NONE );
return My_Connections[Idx].flag;
} /* Conn_Flag */
GLOBAL void
Conn_SetFlag( CONN_ID Idx, int Flag )
GLOBAL VOID
Conn_SetFlag( CONN_ID Idx, INT Flag )
{
/* Connection markieren */
@@ -117,7 +116,7 @@ Conn_SetFlag( CONN_ID Idx, int Flag )
GLOBAL CONN_ID
Conn_First( void )
Conn_First( VOID )
{
/* Connection-Struktur der ersten Verbindung liefern;
* Ist keine Verbindung vorhanden, wird NONE geliefert. */
@@ -150,7 +149,32 @@ Conn_Next( CONN_ID Idx )
} /* Conn_Next */
GLOBAL int
GLOBAL VOID
Conn_SetOption( CONN_ID Idx, INT Option )
{
/* Option fuer Verbindung setzen.
* Initial sind alle Optionen _nicht_ gesetzt. */
assert( Idx > NONE );
assert( Option != 0 );
My_Connections[Idx].options |= Option;
} /* Conn_SetOption */
GLOBAL VOID
Conn_UnsetOption( CONN_ID Idx, INT Option )
{
/* Option fuer Verbindung loeschen */
assert( Idx > NONE );
assert( Option != 0 );
My_Connections[Idx].options &= ~Option;
} /* Conn_UnsetOption */
GLOBAL INT
Conn_Options( CONN_ID Idx )
{
assert( Idx > NONE );
@@ -158,28 +182,17 @@ Conn_Options( CONN_ID Idx )
} /* Conn_Options */
/**
* Get the start time of the connection.
* The result is the start time in seconds since 1970-01-01, as reported
* by the C function time(NULL).
*/
GLOBAL time_t
Conn_StartTime( CONN_ID Idx )
{
CLIENT *c;
/* Zeitpunkt des Link-Starts liefern (in Sekunden) */
assert(Idx > NONE);
/* Search client structure for this link ... */
c = Client_GetFromConn(Idx);
if(c != NULL)
return Client_StartTime(c);
return 0;
} /* Conn_StartTime */
assert( Idx > NONE );
return My_Connections[Idx].starttime;
} /* Conn_Uptime */
GLOBAL int
GLOBAL INT
Conn_SendQ( CONN_ID Idx )
{
/* Laenge der Daten im Schreibbuffer liefern */
@@ -193,7 +206,7 @@ Conn_SendQ( CONN_ID Idx )
} /* Conn_SendQ */
GLOBAL long
GLOBAL LONG
Conn_SendMsg( CONN_ID Idx )
{
/* Anzahl gesendeter Nachrichten liefern */
@@ -203,7 +216,7 @@ Conn_SendMsg( CONN_ID Idx )
} /* Conn_SendMsg */
GLOBAL long
GLOBAL LONG
Conn_SendBytes( CONN_ID Idx )
{
/* Anzahl gesendeter Bytes (unkomprimiert) liefern */
@@ -213,7 +226,7 @@ Conn_SendBytes( CONN_ID Idx )
} /* Conn_SendBytes */
GLOBAL int
GLOBAL INT
Conn_RecvQ( CONN_ID Idx )
{
/* Laenge der Daten im Lesebuffer liefern */
@@ -227,7 +240,7 @@ Conn_RecvQ( CONN_ID Idx )
} /* Conn_RecvQ */
GLOBAL long
GLOBAL LONG
Conn_RecvMsg( CONN_ID Idx )
{
/* Anzahl empfangener Nachrichten liefern */
@@ -237,7 +250,7 @@ Conn_RecvMsg( CONN_ID Idx )
} /* Conn_RecvMsg */
GLOBAL long
GLOBAL LONG
Conn_RecvBytes( CONN_ID Idx )
{
/* Anzahl empfangener Bytes (unkomprimiert) liefern */
@@ -247,15 +260,15 @@ Conn_RecvBytes( CONN_ID Idx )
} /* Conn_RecvBytes */
GLOBAL void
Conn_ResetWCounter( void )
GLOBAL VOID
Conn_ResetWCounter( VOID )
{
WCounter = 0;
} /* Conn_ResetWCounter */
GLOBAL long
Conn_WCounter( void )
GLOBAL LONG
Conn_WCounter( VOID )
{
return WCounter;
} /* Conn_WCounter */

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: conn-func.h,v 1.4 2005/04/25 18:37:16 fw Exp $
* $Id: conn-func.h,v 1.1 2002/12/30 17:14:28 alex Exp $
*
* Connection management: Global functions (header)
*/
@@ -26,35 +26,34 @@
#endif
GLOBAL void Conn_UpdateIdle PARAMS(( CONN_ID Idx ));
GLOBAL VOID Conn_UpdateIdle PARAMS(( CONN_ID Idx ));
GLOBAL time_t Conn_GetIdle PARAMS(( CONN_ID Idx ));
GLOBAL time_t Conn_LastPing PARAMS(( CONN_ID Idx ));
GLOBAL time_t Conn_StartTime PARAMS(( CONN_ID Idx ));
GLOBAL int Conn_SendQ PARAMS(( CONN_ID Idx ));
GLOBAL int Conn_RecvQ PARAMS(( CONN_ID Idx ));
GLOBAL long Conn_SendMsg PARAMS(( CONN_ID Idx ));
GLOBAL long Conn_RecvMsg PARAMS(( CONN_ID Idx ));
GLOBAL long Conn_SendBytes PARAMS(( CONN_ID Idx ));
GLOBAL long Conn_RecvBytes PARAMS(( CONN_ID Idx ));
GLOBAL INT Conn_SendQ PARAMS(( CONN_ID Idx ));
GLOBAL INT Conn_RecvQ PARAMS(( CONN_ID Idx ));
GLOBAL LONG Conn_SendMsg PARAMS(( CONN_ID Idx ));
GLOBAL LONG Conn_RecvMsg PARAMS(( CONN_ID Idx ));
GLOBAL LONG Conn_SendBytes PARAMS(( CONN_ID Idx ));
GLOBAL LONG Conn_RecvBytes PARAMS(( CONN_ID Idx ));
GLOBAL void Conn_SetPenalty PARAMS(( CONN_ID Idx, time_t Seconds ));
GLOBAL void Conn_ResetPenalty PARAMS(( CONN_ID Idx ));
GLOBAL VOID Conn_SetPenalty PARAMS(( CONN_ID Idx, time_t Seconds ));
GLOBAL VOID Conn_ResetPenalty PARAMS(( CONN_ID Idx ));
GLOBAL void Conn_ClearFlags PARAMS(( void ));
GLOBAL int Conn_Flag PARAMS(( CONN_ID Idx ));
GLOBAL void Conn_SetFlag PARAMS(( CONN_ID Idx, int Flag ));
GLOBAL VOID Conn_ClearFlags PARAMS(( VOID ));
GLOBAL INT Conn_Flag PARAMS(( CONN_ID Idx ));
GLOBAL VOID Conn_SetFlag PARAMS(( CONN_ID Idx, INT Flag ));
GLOBAL CONN_ID Conn_First PARAMS(( void ));
GLOBAL CONN_ID Conn_First PARAMS(( VOID ));
GLOBAL CONN_ID Conn_Next PARAMS(( CONN_ID Idx ));
GLOBAL int Conn_Options PARAMS(( CONN_ID Idx ));
GLOBAL VOID Conn_SetOption PARAMS(( CONN_ID Idx, INT Option ));
GLOBAL VOID Conn_UnsetOption PARAMS(( CONN_ID Idx, INT Option ));
GLOBAL INT Conn_Options PARAMS(( CONN_ID Idx ));
GLOBAL void Conn_ResetWCounter PARAMS(( void ));
GLOBAL long Conn_WCounter PARAMS(( void ));
GLOBAL VOID Conn_ResetWCounter PARAMS(( VOID ));
GLOBAL LONG Conn_WCounter PARAMS(( VOID ));
#define Conn_OPTION_ADD( x, opt ) ( (x)->options |= opt )
#define Conn_OPTION_DEL( x, opt ) ( (x)->options &= ~opt )
#define Conn_OPTION_ISSET( x, opt ) ( (x)->options & opt )
#endif

View File

@@ -19,7 +19,7 @@
#ifdef ZLIB
static char UNUSED id[] = "$Id: conn-zip.c,v 1.7 2005/04/25 18:37:16 fw Exp $";
static char UNUSED id[] = "$Id: conn-zip.c,v 1.5 2004/04/25 13:55:36 alex Exp $";
#include "imp.h"
#include <assert.h>
@@ -34,7 +34,7 @@ static char UNUSED id[] = "$Id: conn-zip.c,v 1.7 2005/04/25 18:37:16 fw Exp $";
#include "conn-zip.h"
GLOBAL bool
GLOBAL BOOLEAN
Zip_InitConn( CONN_ID Idx )
{
/* Kompression fuer Link initialisieren */
@@ -52,7 +52,7 @@ Zip_InitConn( CONN_ID Idx )
{
/* Fehler! */
Log( LOG_ALERT, "Can't initialize compression on connection %d (zlib inflate)!", Idx );
return false;
return FALSE;
}
My_Connections[Idx].zip.out.total_in = 0;
@@ -65,24 +65,24 @@ Zip_InitConn( CONN_ID Idx )
{
/* Fehler! */
Log( LOG_ALERT, "Can't initialize compression on connection %d (zlib deflate)!", Idx );
return false;
return FALSE;
}
My_Connections[Idx].zip.bytes_in = My_Connections[Idx].bytes_in;
My_Connections[Idx].zip.bytes_out = My_Connections[Idx].bytes_out;
Log( LOG_INFO, "Enabled link compression (zlib) on connection %d.", Idx );
Conn_OPTION_ADD( &My_Connections[Idx], CONN_ZIP );
Conn_SetOption( Idx, CONN_ZIP );
return true;
return TRUE;
} /* Zip_InitConn */
GLOBAL bool
Zip_Buffer( CONN_ID Idx, char *Data, int Len )
GLOBAL BOOLEAN
Zip_Buffer( CONN_ID Idx, CHAR *Data, INT Len )
{
/* Daten zum Komprimieren im "Kompressions-Puffer" sammeln.
* Es wird true bei Erfolg, sonst false geliefert. */
* Es wird TRUE bei Erfolg, sonst FALSE geliefert. */
assert( Idx > NONE );
assert( Data != NULL );
@@ -92,39 +92,39 @@ Zip_Buffer( CONN_ID Idx, char *Data, int Len )
if( ZWRITEBUFFER_LEN - My_Connections[Idx].zip.wdatalen < Len + 50 )
{
/* Nein! Puffer zunaechst leeren ...*/
if( ! Zip_Flush( Idx )) return false;
if( ! Zip_Flush( Idx )) return FALSE;
}
/* Daten kopieren */
memmove( My_Connections[Idx].zip.wbuf + My_Connections[Idx].zip.wdatalen, Data, Len );
My_Connections[Idx].zip.wdatalen += Len;
return true;
return TRUE;
} /* Zip_Buffer */
GLOBAL bool
GLOBAL BOOLEAN
Zip_Flush( CONN_ID Idx )
{
/* Daten komprimieren und in Schreibpuffer kopieren.
* Es wird true bei Erfolg, sonst false geliefert. */
* Es wird TRUE bei Erfolg, sonst FALSE geliefert. */
int result, out_len;
INT result, out_len;
z_stream *out;
out = &My_Connections[Idx].zip.out;
out->next_in = (void *)My_Connections[Idx].zip.wbuf;
out->next_in = (VOID *)My_Connections[Idx].zip.wbuf;
out->avail_in = My_Connections[Idx].zip.wdatalen;
out->next_out = (void *)(My_Connections[Idx].wbuf + My_Connections[Idx].wdatalen);
out->next_out = (VOID *)(My_Connections[Idx].wbuf + My_Connections[Idx].wdatalen);
out->avail_out = WRITEBUFFER_LEN - My_Connections[Idx].wdatalen;
result = deflate( out, Z_SYNC_FLUSH );
if(( result != Z_OK ) || ( out->avail_in > 0 ))
{
Log( LOG_ALERT, "Compression error: code %d!?", result );
Conn_Close( Idx, "Compression error!", NULL, false );
return false;
Conn_Close( Idx, "Compression error!", NULL, FALSE );
return FALSE;
}
out_len = WRITEBUFFER_LEN - My_Connections[Idx].wdatalen - out->avail_out;
@@ -133,37 +133,37 @@ Zip_Flush( CONN_ID Idx )
My_Connections[Idx].zip.bytes_out += My_Connections[Idx].zip.wdatalen;
My_Connections[Idx].zip.wdatalen = 0;
return true;
return TRUE;
} /* Zip_Flush */
GLOBAL bool
GLOBAL BOOLEAN
Unzip_Buffer( CONN_ID Idx )
{
/* Daten entpacken und in Lesepuffer kopieren. Bei Fehlern
* wird false geliefert, ansonsten true. Der Fall, dass keine
* wird FALSE geliefert, ansonsten TRUE. Der Fall, dass keine
* Daten mehr zu entpacken sind, ist _kein_ Fehler! */
int result, in_len, out_len;
INT result, in_len, out_len;
z_stream *in;
assert( Idx > NONE );
if( My_Connections[Idx].zip.rdatalen <= 0 ) return true;
if( My_Connections[Idx].zip.rdatalen <= 0 ) return TRUE;
in = &My_Connections[Idx].zip.in;
in->next_in = (void *)My_Connections[Idx].zip.rbuf;
in->next_in = (VOID *)My_Connections[Idx].zip.rbuf;
in->avail_in = My_Connections[Idx].zip.rdatalen;
in->next_out = (void *)(My_Connections[Idx].rbuf + My_Connections[Idx].rdatalen);
in->next_out = (VOID *)(My_Connections[Idx].rbuf + My_Connections[Idx].rdatalen);
in->avail_out = READBUFFER_LEN - My_Connections[Idx].rdatalen - 1;
result = inflate( in, Z_SYNC_FLUSH );
if( result != Z_OK )
{
Log( LOG_ALERT, "Decompression error: %s (code=%d, ni=%d, ai=%d, no=%d, ao=%d)!?", in->msg, result, in->next_in, in->avail_in, in->next_out, in->avail_out );
Conn_Close( Idx, "Decompression error!", NULL, false );
return false;
Conn_Close( Idx, "Decompression error!", NULL, FALSE );
return FALSE;
}
in_len = My_Connections[Idx].zip.rdatalen - in->avail_in;
@@ -180,11 +180,11 @@ Unzip_Buffer( CONN_ID Idx )
else My_Connections[Idx].zip.rdatalen = 0;
My_Connections[Idx].zip.bytes_in += out_len;
return true;
return TRUE;
} /* Unzip_Buffer */
GLOBAL long
GLOBAL LONG
Zip_SendBytes( CONN_ID Idx )
{
/* Anzahl gesendeter Bytes (komprimiert!) liefern */
@@ -194,7 +194,7 @@ Zip_SendBytes( CONN_ID Idx )
} /* Zip_SendBytes */
GLOBAL long
GLOBAL LONG
Zip_RecvBytes( CONN_ID Idx )
{
/* Anzahl gesendeter Bytes (komprimiert!) liefern */

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: conn-zip.h,v 1.3 2005/03/19 18:43:48 fw Exp $
* $Id: conn-zip.h,v 1.2 2003/12/26 15:55:07 alex Exp $
*
* Connection compression using ZLIB (header)
*/
@@ -20,14 +20,14 @@
#define __conn_zip_h__
GLOBAL bool Zip_InitConn PARAMS(( CONN_ID Idx ));
GLOBAL BOOLEAN Zip_InitConn PARAMS(( CONN_ID Idx ));
GLOBAL bool Zip_Buffer PARAMS(( CONN_ID Idx, char *Data, int Len ));
GLOBAL bool Zip_Flush PARAMS(( CONN_ID Idx ));
GLOBAL bool Unzip_Buffer PARAMS(( CONN_ID Idx ));
GLOBAL BOOLEAN Zip_Buffer PARAMS(( CONN_ID Idx, CHAR *Data, INT Len ));
GLOBAL BOOLEAN Zip_Flush PARAMS(( CONN_ID Idx ));
GLOBAL BOOLEAN Unzip_Buffer PARAMS(( CONN_ID Idx ));
GLOBAL long Zip_SendBytes PARAMS(( CONN_ID Idx ));
GLOBAL long Zip_RecvBytes PARAMS(( CONN_ID Idx ));
GLOBAL LONG Zip_SendBytes PARAMS(( CONN_ID Idx ));
GLOBAL LONG Zip_RecvBytes PARAMS(( CONN_ID Idx ));
#endif /* __conn_zip_h__ */

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: conn.h,v 1.35.2.1 2005/07/30 23:24:50 alex Exp $
* $Id: conn.h,v 1.32 2003/12/26 15:55:07 alex Exp $
*
* Connection management (header)
*/
@@ -18,18 +18,17 @@
#define __conn_h__
#include <time.h> /* for time_t, see below */
#include <time.h> /* fro time_t, see below */
#define CONN_ISCLOSING 1 /* Conn_Close() already called */
#define CONN_ISCONNECTING 2 /* connect() in progress */
#define CONN_ISCLOSING 1 /* Conn_Close() already called */
#ifdef ZLIB
#define CONN_ZIP 4 /* zlib compressed link */
#define CONN_ZIP 2 /* zlib compressed link */
#endif
typedef int CONN_ID;
typedef INT CONN_ID;
#ifdef CONN_MODULE
@@ -43,32 +42,33 @@ typedef struct _ZipData
{
z_stream in; /* "Handle" for input stream */
z_stream out; /* "Handle" for output stream */
char rbuf[READBUFFER_LEN]; /* Read buffer */
int rdatalen; /* Length of data in read buffer (compressed) */
char wbuf[WRITEBUFFER_LEN]; /* Write buffer */
int wdatalen; /* Length of data in write buffer (uncompressed) */
long bytes_in, bytes_out; /* Counter for statistics (uncompressed!) */
CHAR rbuf[READBUFFER_LEN]; /* Read buffer */
INT rdatalen; /* Length of data in read buffer (compressed) */
CHAR wbuf[WRITEBUFFER_LEN]; /* Write buffer */
INT wdatalen; /* Length of data in write buffer (uncompressed) */
LONG bytes_in, bytes_out; /* Counter for statistics (uncompressed!) */
} ZIPDATA;
#endif /* ZLIB */
typedef struct _Connection
{
int sock; /* Socket handle */
INT sock; /* Socket handle */
struct sockaddr_in addr; /* Client address */
RES_STAT *res_stat; /* Status of resolver process, if any */
char host[HOST_LEN]; /* Hostname */
char rbuf[READBUFFER_LEN]; /* Read buffer */
int rdatalen; /* Length of data in read buffer */
char wbuf[WRITEBUFFER_LEN]; /* Write buffer */
int wdatalen; /* Length of data in write buffer */
CHAR host[HOST_LEN]; /* Hostname */
CHAR rbuf[READBUFFER_LEN]; /* Read buffer */
INT rdatalen; /* Length of data in read buffer */
CHAR wbuf[WRITEBUFFER_LEN]; /* Write buffer */
INT wdatalen; /* Length of data in write buffer */
time_t starttime; /* Start time of link */
time_t lastdata; /* Last activity */
time_t lastping; /* Last PING */
time_t lastprivmsg; /* Last PRIVMSG */
time_t delaytime; /* Ignore link ("penalty") */
long bytes_in, bytes_out; /* Received and sent bytes */
long msg_in, msg_out; /* Received and sent IRC messages */
int flag; /* Flag (see "irc-write" module) */
UINT16 options; /* Link options / connection state */
LONG bytes_in, bytes_out; /* Received and sent bytes */
LONG msg_in, msg_out; /* Received and sent IRC messages */
INT flag; /* Flag (see "irc-write" module) */
INT options; /* Link options */
#ifdef ZLIB
ZIPDATA zip; /* Compression information */
#endif /* ZLIB */
@@ -76,29 +76,29 @@ typedef struct _Connection
GLOBAL CONNECTION *My_Connections;
GLOBAL CONN_ID Pool_Size;
GLOBAL long WCounter;
GLOBAL LONG WCounter;
#endif /* CONN_MODULE */
GLOBAL void Conn_Init PARAMS((void ));
GLOBAL void Conn_Exit PARAMS(( void ));
GLOBAL VOID Conn_Init PARAMS((VOID ));
GLOBAL VOID Conn_Exit PARAMS(( VOID ));
GLOBAL int Conn_InitListeners PARAMS(( void ));
GLOBAL void Conn_ExitListeners PARAMS(( void ));
GLOBAL INT Conn_InitListeners PARAMS(( VOID ));
GLOBAL VOID Conn_ExitListeners PARAMS(( VOID ));
GLOBAL bool Conn_NewListener PARAMS(( const UINT16 Port ));
GLOBAL BOOLEAN Conn_NewListener PARAMS(( CONST UINT Port ));
GLOBAL void Conn_Handler PARAMS(( void ));
GLOBAL VOID Conn_Handler PARAMS(( VOID ));
GLOBAL bool Conn_Write PARAMS(( CONN_ID Idx, char *Data, int Len ));
GLOBAL bool Conn_WriteStr PARAMS(( CONN_ID Idx, char *Format, ... ));
GLOBAL BOOLEAN Conn_Write PARAMS(( CONN_ID Idx, CHAR *Data, INT Len ));
GLOBAL BOOLEAN Conn_WriteStr PARAMS(( CONN_ID Idx, CHAR *Format, ... ));
GLOBAL void Conn_Close PARAMS(( CONN_ID Idx, char *LogMsg, char *FwdMsg, bool InformClient ));
GLOBAL VOID Conn_Close PARAMS(( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformClient ));
GLOBAL void Conn_SyncServerStruct PARAMS(( void ));
GLOBAL VOID Conn_SyncServerStruct PARAMS(( VOID ));
GLOBAL int Conn_MaxFD;
GLOBAL INT Conn_MaxFD;
#endif

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: defines.h,v 1.52.2.2 2005/07/05 22:58:25 alex Exp $
* $Id: defines.h,v 1.45.2.1 2004/05/07 11:24:18 alex Exp $
*
* Global defines of ngIRCd.
*/
@@ -19,90 +19,83 @@
#define NONE -1
#define FNAME_LEN 256 /* max. length of file name */
#define FNAME_LEN 256 /* max. Laenge eines Dateinamen */
#define LINE_LEN 256 /* max. length of a line in the configuration file */
#define LINE_LEN 256 /* max. Laenge einer Konfigurationszeile */
#define HOST_LEN 256 /* max. lenght of fully qualified host names */
#define HOST_LEN 256 /* max. Laenge eines Hostnamen */
#define MAX_LISTEN_PORTS 16 /* max. count of listening ports */
#define MAX_LISTEN_PORTS 16 /* max. Anzahl von Listen-Ports */
#define MAX_OPERATORS 16 /* max. count of configurable operators */
#define MAX_OPERATORS 16 /* max. Anzahl konfigurierbarer Operatoren */
#define MAX_SERVERS 16 /* max. count of configurable servers ("peers") */
#define MAX_SERVERS 16 /* max. Anzahl konfigurierbarer Server ("Peers") */
#define MAX_DEFCHANNELS 16 /* max. count of preconfigurable channels */
#define MAX_DEFCHANNELS 16 /* max. Anzahl vorkonfigurierbarerr Channels */
#define MAX_SERVICES 8 /* max. number of configurable services */
#define MAX_SERVICES 8 /* maximum number of configurable services */
#define MAX_WHOWAS 64 /* max. number of WHOWAS items */
#define DEFAULT_WHOWAS 5 /* default count for WHOWAS command */
#define CONNECTION_POOL 100 /* Anzahl Verbindungs-Strukturen, die blockweise alloziert werden */
#define CONNECTION_POOL 100 /* size of default connection pool */
#define CLIENT_ID_LEN 64 /* max. ID-Laenge; vgl. RFC 2812, 1.1 und 1.2.1 */
#define CLIENT_NICK_LEN 10 /* max. Nick-Laenge; vgl. RFC 2812, 1.2.1 */
#define CLIENT_PASS_LEN 9 /* max. Laenge des Passwortes */
#define CLIENT_USER_LEN 9 /* max. Laenge des Benutzernamen ("Login") */
#define CLIENT_NAME_LEN 32 /* max. Laenge des "langen Benutzernamen" */
#define CLIENT_HOST_LEN 64 /* max. Laenge des Hostname */
#define CLIENT_MODE_LEN 8 /* max. Laenge der Client-Modes */
#define CLIENT_INFO_LEN 64 /* max. Infotext-Laenge (Server) */
#define CLIENT_AWAY_LEN 128 /* max. Laenger der AWAY-Nachricht */
#define CLIENT_FLAGS_LEN 100 /* max. Laenger der Client-Flags */
#define CLIENT_ID_LEN 64 /* max. length of an IRC ID; see RFC 2812, 1.1 and 1.2.1 */
#define CLIENT_NICK_LEN 10 /* max. nick length; see. RFC 2812, 1.2.1 */
#define CLIENT_PASS_LEN 21 /* max. password length */
#define CLIENT_USER_LEN 10 /* Max. length of user name ("login")
see RFC 2812, section 1.2.1 */
#define CLIENT_NAME_LEN 32 /* max. length of "real names" */
#define CLIENT_HOST_LEN 64 /* max. host name length */
#define CLIENT_MODE_LEN 8 /* max. lenth of all client modes */
#define CLIENT_INFO_LEN 64 /* max. length of server info texts */
#define CLIENT_AWAY_LEN 128 /* max. length of away messages */
#define CLIENT_FLAGS_LEN 100 /* max. length of client flags */
#define CHANNEL_NAME_LEN 51 /* max. Laenge eines Channel-Namens, vgl. RFC 2812, 1.3 */
#define CHANNEL_MODE_LEN 8 /* max. Laenge der Channel-Modes */
#define CHANNEL_TOPIC_LEN 128 /* max. Laenge eines Channel-Topics */
#define CHANNEL_NAME_LEN 51 /* max. length of a channel name, see. RFC 2812, 1.3 */
#define CHANNEL_MODE_LEN 9 /* max. length of channel modes */
#define CHANNEL_TOPIC_LEN 128 /* max. length of a channel topic */
#define COMMAND_LEN 513 /* max. Laenge eines Befehls, vgl. RFC 2812, 3.2 */
#define COMMAND_LEN 513 /* max. IRC command length, see. RFC 2812, 3.2 */
#define READBUFFER_LEN 2048 /* size of the read buffer of a connection (bytes) */
#define WRITEBUFFER_LEN 4096 /* size of the write buffer of a connection (bytes) */
#define READBUFFER_LEN 2048 /* Laenge des Lesepuffers je Verbindung (Bytes) */
#define WRITEBUFFER_LEN 4096 /* Laenge des Schreibpuffers je Verbindung (Bytes) */
#ifdef ZLIB
#define ZREADBUFFER_LEN 1024 /* compressed read buffer of a connection (bytes) */
#define ZWRITEBUFFER_LEN 4096 /* compressed write buffer of a connection (bytes) */
#define ZREADBUFFER_LEN 1024 /* Laenge des Lesepuffers je Verbindung (Bytes) */
#define ZWRITEBUFFER_LEN 4096 /* Laenge des Schreibpuffers fuer Kompression (Bytes) */
#endif
#define PROTOVER "0210" /* implemented IRC protocol version (see RFC 2813, 4.1.1) */
#define PROTOIRC "-IRC" /* protocol suffix (see RFC 2813, 4.1.1) */
#define PROTOIRCPLUS "-IRC+" /* protokol suffix for IRC+ protocol (see doc/Protocol.txt) */
#define PROTOVER "0210" /* implementierte Protokoll-Version (RFC 2813, 4.1.1) */
#define PROTOIRC "-IRC" /* Protokoll-Suffix (RFC 2813, 4.1.1) */
#define PROTOIRCPLUS "-IRC+" /* Protokoll-Suffix f<EFBFBD>r IRC+-Protokoll */
#ifdef IRCPLUS
# define IRCPLUSFLAGS "CL" /* standard IRC+ flags */
# define IRCPLUSFLAGS "CL" /* IRC+-Flags, die immer zutreffen */
#endif
#define STARTUP_DELAY 1 /* delay outgoing connections n seconds after startup */
#define RECONNECT_DELAY 3 /* time to delay re-connect attempts (seconds) */
#define STARTUP_DELAY 1 /* Erst n Sek. nach Start zu anderen Servern verbinden */
#define RECONNECT_DELAY 3 /* Server-Links erst nach 3 Sekunden versuchen, wieder aufzubauen */
#define USERMODES "aios" /* supported user modes */
#define CHANMODES "biklImnoPstv" /* supported channel modes */
#define USERMODES "aios" /* unterstuetzte User-Modes */
#define CHANMODES "biklImnoPtv" /* unterstuetzte Channel-Modes */
#define CONNECTED true /* internal status codes */
#define DISCONNECTED false
#define CONNECTED TRUE /* fuer die irc-xxx-Module */
#define DISCONNECTED FALSE
#define DEFAULT_AWAY_MSG "Away" /* away message for users connected to linked servers */
#define DEFAULT_AWAY_MSG "Away" /* Away-Meldung fuer User von anderen Servern */
#define CONFIG_FILE "/ngircd.conf"
#define MOTD_FILE "/ngircd.motd"
#define MOTD_PHRASE ""
#define CHROOT_DIR ""
#define PID_FILE ""
#define ERROR_DIR "/tmp"
#define MAX_LOG_MSG_LEN 256 /* max. length of a log message */
#define MAX_LOG_MSG_LEN 256 /* max. Laenge einer Log-Meldung */
#define TOKEN_OUTBOUND -2 /* tag for outbound server links */
#define TOKEN_OUTBOUND -2 /* Kennzeichnung fuer ausgehende Server-Links im Aufbau */
#define NOTICE_TXTPREFIX "" /* prefix for NOTICEs from the server to users */
#define NOTICE_TXTPREFIX "" /* Kennzeichnung fuer Server-NOTICEs an User */
#define CUT_TXTSUFFIX "[CUT]" /* Suffix for oversized messages that
have been shortened and cut off. */
#ifdef RENDEZVOUS
#define RENDEZVOUS_TYPE "_ircu._tcp." /* service type to register with Rendezvous */
#define RENDEZVOUS_TYPE "_ircu._tcp." /* Service type to register with Rendezvous */
#endif

View File

@@ -14,13 +14,14 @@
#include "portab.h"
static char UNUSED id[] = "$Id: hash.c,v 1.11 2005/03/19 18:43:48 fw Exp $";
static char UNUSED id[] = "$Id: hash.c,v 1.9 2002/12/26 16:25:43 alex Exp $";
#include "imp.h"
#include <assert.h>
#include <string.h>
#include "defines.h"
#include "log.h"
#include "tool.h"
#include "exp.h"
@@ -31,11 +32,11 @@ LOCAL UINT32 jenkins_hash PARAMS(( register UINT8 *k, register UINT32 length, re
GLOBAL UINT32
Hash( char *String )
Hash( CHAR *String )
{
/* Hash-Wert ueber String berechnen */
char buffer[LINE_LEN];
CHAR buffer[LINE_LEN];
strlcpy( buffer, String, sizeof( buffer ));
return jenkins_hash( (UINT8 *)ngt_LowerStr( buffer ), strlen( buffer ), 42 );
@@ -99,7 +100,7 @@ jenkins_hash( register UINT8 *k, register UINT32 length, register UINT32 initval
/* handle the last 11 bytes */
c += length;
switch( (int)len ) /* all the case statements fall through */
switch( (INT)len ) /* all the case statements fall through */
{
case 11: c+=((UINT32)k[10]<<24);
case 10: c+=((UINT32)k[9]<<16);

View File

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

View File

@@ -14,7 +14,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: irc-channel.c,v 1.30.2.2 2006/03/16 20:14:46 fw Exp $";
static char UNUSED id[] = "$Id: irc-channel.c,v 1.27 2004/04/09 20:46:48 alex Exp $";
#include "imp.h"
#include <assert.h>
@@ -40,11 +40,11 @@ static char UNUSED id[] = "$Id: irc-channel.c,v 1.30.2.2 2006/03/16 20:14:46 fw
#include "irc-channel.h"
GLOBAL bool
GLOBAL BOOLEAN
IRC_JOIN( CLIENT *Client, REQUEST *Req )
{
char *channame, *key, *flags, *topic, modes[8];
bool is_new_chan, is_invited, is_banned;
CHAR *channame, *key, *flags, *topic, modes[8];
BOOLEAN is_new_chan, is_invited, is_banned;
CLIENT *target;
CHANNEL *chan;
@@ -71,8 +71,8 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
chan = NULL; flags = NULL;
/* wird der Channel neu angelegt? */
if( Channel_Search( channame )) is_new_chan = false;
else is_new_chan = true;
if( Channel_Search( channame )) is_new_chan = FALSE;
else is_new_chan = TRUE;
/* Hat ein Server Channel-User-Modes uebergeben? */
if( Client_Type( Client ) == CLIENT_SERVER )
@@ -90,9 +90,14 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
if( Client_Type( Client ) == CLIENT_USER )
{
/* Test if the user has reached his maximum channel count */
if(( Conf_MaxJoins > 0 ) && ( Channel_CountForUser( Client ) >= Conf_MaxJoins ))
return IRC_WriteStrClient( Client, ERR_TOOMANYCHANNELS_MSG,
Client_ID( Client ), channame );
if( Client_Type( Client ) == CLIENT_USER )
{
if(( Conf_MaxJoins > 0 ) && ( Channel_CountForUser( Client ) >= Conf_MaxJoins ))
{
IRC_WriteStrClient( Client, ERR_TOOMANYCHANNELS_MSG, Client_ID( Client ), channame );
return CONNECTED;
}
}
/* Existiert der Channel bereits, oder wird er im Moment neu erzeugt? */
if( is_new_chan )
@@ -110,7 +115,7 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
is_invited = Lists_CheckInvited( target, chan );
/* Testen, ob Client gebanned ist */
if(( is_banned == true) && ( is_invited == false ))
if(( is_banned == TRUE ) && ( is_invited == FALSE ))
{
/* Client ist gebanned (und nicht invited): */
IRC_WriteStrClient( Client, ERR_BANNEDFROMCHAN_MSG, Client_ID( Client ), channame );
@@ -121,7 +126,7 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
}
/* Ist der Channel "invite-only"? */
if(( strchr( Channel_Modes( chan ), 'i' )) && ( is_invited == false ))
if(( strchr( Channel_Modes( chan ), 'i' )) && ( is_invited == FALSE ))
{
/* Channel ist "invite-only" und Client wurde nicht invited: */
IRC_WriteStrClient( Client, ERR_INVITEONLYCHAN_MSG, Client_ID( Client ), channame );
@@ -162,7 +167,7 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
* commands) in this list become deleted when a user
* joins a channel this way. */
chan = Channel_Search( channame );
if( chan != NULL ) (void)Lists_CheckInvited( target, chan );
if( chan != NULL ) (VOID)Lists_CheckInvited( target, chan );
}
/* Channel joinen (und ggf. anlegen) */
@@ -194,11 +199,11 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
IRC_WriteStrServersPrefix( Client, target, "JOIN :%s%s", channame, modes );
/* im Channel bekannt machen */
IRC_WriteStrChannelPrefix( Client, chan, target, false, "JOIN :%s", channame );
IRC_WriteStrChannelPrefix( Client, chan, target, FALSE, "JOIN :%s", channame );
if( modes[1] )
{
/* Modes im Channel bekannt machen */
IRC_WriteStrChannelPrefix( Client, chan, target, false, "MODE %s +%s %s", channame, &modes[1], Client_ID( target ));
IRC_WriteStrChannelPrefix( Client, chan, target, FALSE, "MODE %s +%s %s", channame, &modes[1], Client_ID( target ));
}
if( Client_Type( Client ) == CLIENT_USER )
@@ -222,11 +227,11 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
} /* IRC_JOIN */
GLOBAL bool
GLOBAL BOOLEAN
IRC_PART( CLIENT *Client, REQUEST *Req )
{
CLIENT *target;
char *chan;
CHAR *chan;
assert( Client != NULL );
assert( Req != NULL );
@@ -257,12 +262,12 @@ IRC_PART( CLIENT *Client, REQUEST *Req )
} /* IRC_PART */
GLOBAL bool
GLOBAL BOOLEAN
IRC_TOPIC( CLIENT *Client, REQUEST *Req )
{
CHANNEL *chan;
CLIENT *from;
char *topic;
CHAR *topic;
assert( Client != NULL );
assert( Req != NULL );
@@ -301,107 +306,78 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
/* im Channel bekannt machen und an Server weiterleiten */
IRC_WriteStrServersPrefix( Client, from, "TOPIC %s :%s", Req->argv[0], Req->argv[1] );
IRC_WriteStrChannelPrefix( Client, chan, from, false, "TOPIC %s :%s", Req->argv[0], Req->argv[1] );
IRC_WriteStrChannelPrefix( Client, chan, from, FALSE, "TOPIC %s :%s", Req->argv[0], Req->argv[1] );
if( Client_Type( Client ) == CLIENT_USER ) return IRC_WriteStrClientPrefix( Client, Client, "TOPIC %s :%s", Req->argv[0], Req->argv[1] );
else return CONNECTED;
} /* IRC_TOPIC */
/**
* Handler for the IRC "LIST" command.
* This implementation handles the local case as well as the forwarding of the
* LIST command to other servers in the IRC network.
*/
GLOBAL bool
GLOBAL BOOLEAN
IRC_LIST( CLIENT *Client, REQUEST *Req )
{
char *pattern;
CHAR *pattern;
CHANNEL *chan;
CLIENT *from, *target;
assert( Client != NULL );
assert( Req != NULL );
/* Bad number of prameters? */
if( Req->argc > 2 )
return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG,
Client_ID( Client ), Req->command );
/* Falsche Anzahl Parameter? */
if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
if( Req->argc > 0 )
pattern = strtok( Req->argv[0], "," );
else
pattern = "*";
if( Req->argc > 0 ) pattern = strtok( Req->argv[0], "," );
else pattern = "*";
/* Get sender from prefix, if any */
if( Client_Type( Client ) == CLIENT_SERVER )
from = Client_Search( Req->prefix );
else
from = Client;
if( ! from )
return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG,
Client_ID( Client ), Req->prefix );
/* From aus Prefix ermitteln */
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
else from = Client;
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix );
if( Req->argc == 2 )
{
/* Forward to other server? */
/* 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( Client ), Req->argv[1] );
if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER )) return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] );
if( target != Client_ThisServer( ))
{
/* Target is indeed an other server, forward it! */
return IRC_WriteStrClientPrefix( target, from,
"LIST %s :%s", Client_ID( from ),
Req->argv[1] );
/* Ok, anderer Server ist das Ziel: forwarden */
return IRC_WriteStrClientPrefix( target, from, "LIST %s :%s", from, Req->argv[1] );
}
}
while( pattern )
{
/* Loop through all the channels */
/* alle Channel durchgehen */
chan = Channel_First( );
while( chan )
{
/* Check search pattern */
/* Passt die Suchmaske auf diesen Channel? */
if( Match( pattern, Channel_Name( chan )))
{
/* Gotcha! */
if( ! strchr( Channel_Modes( chan ), 's' ) ||
Channel_IsMemberOf( chan, from ))
{
if( ! IRC_WriteStrClient( from,
RPL_LIST_MSG, Client_ID( from ),
Channel_Name( chan ),
Channel_MemberCount( chan ),
Channel_Topic( chan )))
return DISCONNECTED;
}
/* Treffer! */
if( ! IRC_WriteStrClient( from, RPL_LIST_MSG, from, Channel_Name( chan ), Channel_MemberCount( chan ), Channel_Topic( chan ))) return DISCONNECTED;
}
chan = Channel_Next( chan );
}
/* Get next name ... */
if( Req->argc > 0 )
pattern = strtok( NULL, "," );
else
pattern = NULL;
/* naechsten Namen ermitteln */
if( Req->argc > 0 ) pattern = strtok( NULL, "," );
else pattern = NULL;
}
return IRC_WriteStrClient( from, RPL_LISTEND_MSG, Client_ID( from ));
return IRC_WriteStrClient( from, RPL_LISTEND_MSG, from );
} /* IRC_LIST */
GLOBAL bool
GLOBAL BOOLEAN
IRC_CHANINFO( CLIENT *Client, REQUEST *Req )
{
char modes_add[COMMAND_LEN], l[16], *ptr;
CHAR modes_add[COMMAND_LEN], l[16], *ptr;
CLIENT *from;
CHANNEL *chan;
int arg_topic;
INT arg_topic;
assert( Client != NULL );
assert( Req != NULL );
@@ -461,7 +437,7 @@ IRC_CHANINFO( CLIENT *Client, REQUEST *Req )
}
/* Inform members of this channel */
IRC_WriteStrChannelPrefix( Client, chan, from, false, "MODE %s +%s%s", Req->argv[0], Channel_Modes( chan ), modes_add );
IRC_WriteStrChannelPrefix( Client, chan, from, FALSE, "MODE %s +%s%s", Req->argv[0], Channel_Modes( chan ), modes_add );
}
}
else Log( LOG_WARNING, "CHANINFO: invalid MODE format ignored!" );
@@ -474,7 +450,7 @@ IRC_CHANINFO( CLIENT *Client, REQUEST *Req )
{
/* OK, there is no topic jet */
Channel_SetTopic( chan, Req->argv[arg_topic] );
IRC_WriteStrChannelPrefix( Client, chan, from, false, "TOPIC %s :%s", Req->argv[0], Channel_Topic( chan ));
IRC_WriteStrChannelPrefix( Client, chan, from, FALSE, "TOPIC %s :%s", Req->argv[0], Channel_Topic( chan ));
}
}

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: irc-channel.h,v 1.7 2005/03/19 18:43:48 fw Exp $
* $Id: irc-channel.h,v 1.6 2002/12/12 12:23:43 alex Exp $
*
* IRC channel commands (header)
*/
@@ -18,13 +18,13 @@
#define __irc_channel_h__
GLOBAL bool IRC_JOIN PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_PART PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_TOPIC PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_JOIN PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_PART PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_TOPIC PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_LIST PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_LIST PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_CHANINFO PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_CHANINFO PARAMS((CLIENT *Client, REQUEST *Req ));
#endif

View File

@@ -1,6 +1,6 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001-2005 Alexander Barton (alex@barton.de)
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -14,13 +14,12 @@
#include "portab.h"
static char UNUSED id[] = "$Id: irc-info.c,v 1.30 2005/06/17 19:15:43 fw Exp $";
static char UNUSED id[] = "$Id: irc-info.c,v 1.21.2.2 2005/01/24 14:22:30 alex Exp $";
#include "imp.h"
#include <assert.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
@@ -43,7 +42,7 @@ static char UNUSED id[] = "$Id: irc-info.c,v 1.30 2005/06/17 19:15:43 fw Exp $";
#include "irc-info.h"
GLOBAL bool
GLOBAL BOOLEAN
IRC_ADMIN(CLIENT *Client, REQUEST *Req )
{
CLIENT *target, *prefix;
@@ -84,13 +83,13 @@ IRC_ADMIN(CLIENT *Client, REQUEST *Req )
} /* IRC_ADMIN */
GLOBAL bool
GLOBAL BOOLEAN
IRC_ISON( CLIENT *Client, REQUEST *Req )
{
char rpl[COMMAND_LEN];
CHAR rpl[COMMAND_LEN];
CLIENT *c;
char *ptr;
int i;
CHAR *ptr;
INT i;
assert( Client != NULL );
assert( Req != NULL );
@@ -98,7 +97,7 @@ IRC_ISON( CLIENT *Client, REQUEST *Req )
/* Falsche Anzahl Parameter? */
if(( Req->argc < 1 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
strlcpy( rpl, RPL_ISON_MSG, sizeof rpl );
strcpy( rpl, RPL_ISON_MSG );
for( i = 0; i < Req->argc; i++ )
{
ptr = strtok( Req->argv[i], " " );
@@ -115,17 +114,17 @@ IRC_ISON( CLIENT *Client, REQUEST *Req )
ptr = strtok( NULL, " " );
}
}
ngt_TrimLastChr(rpl, ' ');
if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0';
return IRC_WriteStrClient( Client, rpl, Client_ID( Client ) );
} /* IRC_ISON */
GLOBAL bool
GLOBAL BOOLEAN
IRC_LINKS( CLIENT *Client, REQUEST *Req )
{
CLIENT *target, *from, *c;
char *mask;
CHAR *mask;
assert( Client != NULL );
assert( Req != NULL );
@@ -170,7 +169,7 @@ IRC_LINKS( CLIENT *Client, REQUEST *Req )
} /* IRC_LINKS */
GLOBAL bool
GLOBAL BOOLEAN
IRC_LUSERS( CLIENT *Client, REQUEST *Req )
{
CLIENT *target, *from;
@@ -206,7 +205,7 @@ IRC_LUSERS( CLIENT *Client, REQUEST *Req )
} /* IRC_LUSERS */
GLOBAL bool
GLOBAL BOOLEAN
IRC_MOTD( CLIENT *Client, REQUEST *Req )
{
CLIENT *from, *target;
@@ -240,10 +239,10 @@ IRC_MOTD( CLIENT *Client, REQUEST *Req )
} /* IRC_MOTD */
GLOBAL bool
GLOBAL BOOLEAN
IRC_NAMES( CLIENT *Client, REQUEST *Req )
{
char rpl[COMMAND_LEN], *ptr;
CHAR rpl[COMMAND_LEN], *ptr;
CLIENT *target, *from, *c;
CHANNEL *chan;
@@ -335,12 +334,12 @@ IRC_NAMES( CLIENT *Client, REQUEST *Req )
} /* IRC_NAMES */
GLOBAL bool
GLOBAL BOOLEAN
IRC_STATS( CLIENT *Client, REQUEST *Req )
{
CLIENT *from, *target, *cl;
CONN_ID con;
char query;
CHAR query;
COMMAND *cmd;
assert( Client != NULL );
@@ -384,12 +383,12 @@ IRC_STATS( CLIENT *Client, REQUEST *Req )
#ifdef ZLIB
if( Conn_Options( con ) & CONN_ZIP )
{
if( ! IRC_WriteStrClient( from, RPL_STATSLINKINFOZIP_MSG, Client_ID( from ), Client_Mask( cl ), Conn_SendQ( con ), Conn_SendMsg( con ), Zip_SendBytes( con ), Conn_SendBytes( con ), Conn_RecvMsg( con ), Zip_RecvBytes( con ), Conn_RecvBytes( con ), (long)( time( NULL ) - Conn_StartTime( con )))) return DISCONNECTED;
if( ! IRC_WriteStrClient( from, RPL_STATSLINKINFOZIP_MSG, Client_ID( from ), Client_Mask( cl ), Conn_SendQ( con ), Conn_SendMsg( con ), Zip_SendBytes( con ), Conn_SendBytes( con ), Conn_RecvMsg( con ), Zip_RecvBytes( con ), Conn_RecvBytes( con ), (LONG)( time( NULL ) - Conn_StartTime( con )))) return DISCONNECTED;
}
else
#endif
{
if( ! IRC_WriteStrClient( from, RPL_STATSLINKINFO_MSG, Client_ID( from ), Client_Mask( cl ), Conn_SendQ( con ), Conn_SendMsg( con ), Conn_SendBytes( con ), Conn_RecvMsg( con ), Conn_RecvBytes( con ), (long)( time( NULL ) - Conn_StartTime( con )))) return DISCONNECTED;
if( ! IRC_WriteStrClient( from, RPL_STATSLINKINFO_MSG, Client_ID( from ), Client_Mask( cl ), Conn_SendQ( con ), Conn_SendMsg( con ), Conn_SendBytes( con ), Conn_RecvMsg( con ), Conn_RecvBytes( con ), (LONG)( time( NULL ) - Conn_StartTime( con )))) return DISCONNECTED;
}
}
con = Conn_Next( con );
@@ -414,11 +413,11 @@ IRC_STATS( CLIENT *Client, REQUEST *Req )
} /* IRC_STATS */
GLOBAL bool
GLOBAL BOOLEAN
IRC_TIME( CLIENT *Client, REQUEST *Req )
{
CLIENT *from, *target;
char t_str[64];
CHAR t_str[64];
time_t t;
assert( Client != NULL );
@@ -446,17 +445,17 @@ IRC_TIME( CLIENT *Client, REQUEST *Req )
}
t = time( NULL );
(void)strftime( t_str, 60, "%A %B %d %Y -- %H:%M %Z", localtime( &t ));
(VOID)strftime( t_str, 60, "%A %B %d %Y -- %H:%M %Z", localtime( &t ));
return IRC_WriteStrClient( from, RPL_TIME_MSG, Client_ID( from ), Client_ID( Client_ThisServer( )), t_str );
} /* IRC_TIME */
GLOBAL bool
GLOBAL BOOLEAN
IRC_USERHOST( CLIENT *Client, REQUEST *Req )
{
char rpl[COMMAND_LEN];
CHAR rpl[COMMAND_LEN];
CLIENT *c;
int max, i;
INT max, i;
assert( Client != NULL );
assert( Req != NULL );
@@ -467,7 +466,7 @@ IRC_USERHOST( CLIENT *Client, REQUEST *Req )
if( Req->argc > 5 ) max = 5;
else max = Req->argc;
strlcpy( rpl, RPL_USERHOST_MSG, sizeof rpl );
strcpy( rpl, RPL_USERHOST_MSG );
for( i = 0; i < max; i++ )
{
c = Client_Search( Req->argv[i] );
@@ -485,18 +484,18 @@ IRC_USERHOST( CLIENT *Client, REQUEST *Req )
strlcat( rpl, " ", sizeof( rpl ));
}
}
ngt_TrimLastChr( rpl, ' ');
if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0';
return IRC_WriteStrClient( Client, rpl, Client_ID( Client ) );
} /* IRC_USERHOST */
GLOBAL bool
GLOBAL BOOLEAN
IRC_VERSION( CLIENT *Client, REQUEST *Req )
{
CLIENT *target, *prefix;
#ifdef CVSDATE
char ver[12], vertxt[30];
CHAR ver[12], vertxt[30];
#endif
assert( Client != NULL );
@@ -531,20 +530,20 @@ IRC_VERSION( CLIENT *Client, REQUEST *Req )
strncpy( ver + 4, ver + 5, 2 );
strncpy( ver + 6, ver + 8, 3 );
snprintf( vertxt, sizeof( vertxt ), "%s(%s)", PACKAGE_VERSION, ver );
return IRC_WriteStrClient( Client, RPL_VERSION_MSG, Client_ID( prefix ), PACKAGE_NAME, vertxt, NGIRCd_DebugLevel, Conf_ServerName, NGIRCd_VersionAddition );
return IRC_WriteStrClient( Client, RPL_VERSION_MSG, Client_ID( prefix ), PACKAGE_NAME, vertxt, NGIRCd_DebugLevel, Conf_ServerName, NGIRCd_VersionAddition( ));
#else
return IRC_WriteStrClient( Client, RPL_VERSION_MSG, Client_ID( prefix ), PACKAGE_NAME, PACKAGE_VERSION, NGIRCd_DebugLevel, Conf_ServerName, NGIRCd_VersionAddition );
return IRC_WriteStrClient( Client, RPL_VERSION_MSG, Client_ID( prefix ), PACKAGE_NAME, PACKAGE_VERSION, NGIRCd_DebugLevel, Conf_ServerName, NGIRCd_VersionAddition( ));
#endif
} /* IRC_VERSION */
GLOBAL bool
GLOBAL BOOLEAN
IRC_WHO( CLIENT *Client, REQUEST *Req )
{
bool ok, only_ops;
char flags[8], *ptr;
BOOLEAN ok, only_ops;
CHAR flags[8], *ptr;
CL2CHAN *cl2chan;
CHANNEL *chan, *cn;
CHANNEL *chan;
CLIENT *c;
assert( Client != NULL );
@@ -553,13 +552,13 @@ IRC_WHO( CLIENT *Client, REQUEST *Req )
/* Falsche Anzahl Parameter? */
if(( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
only_ops = false;
only_ops = FALSE;
chan = NULL;
if( Req->argc == 2 )
{
/* Nur OPs anzeigen? */
if( strcmp( Req->argv[1], "o" ) == 0 ) only_ops = true;
if( strcmp( Req->argv[1], "o" ) == 0 ) only_ops = TRUE;
#ifdef STRICT_RFC
else return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
#endif
@@ -582,35 +581,24 @@ IRC_WHO( CLIENT *Client, REQUEST *Req )
{
if(( Client_Type( c ) == CLIENT_USER ) && ( ! strchr( Client_Modes( c ), 'i' )))
{
ok = false;
if( Req->argc == 0 ) ok = true;
ok = FALSE;
if( Req->argc == 0 ) ok = TRUE;
else
{
if( strcasecmp( Req->argv[0], Client_ID( c )) == 0 ) ok = true;
else if( strcmp( Req->argv[0], "0" ) == 0 ) ok = true;
if( strcasecmp( Req->argv[0], Client_ID( c )) == 0 ) ok = TRUE;
else if( strcmp( Req->argv[0], "0" ) == 0 ) ok = TRUE;
}
if( ok && (( ! only_ops ) || ( strchr( Client_Modes( c ), 'o' ))))
{
/* Get flags */
/* Flags zusammenbasteln */
strcpy( flags, "H" );
if( strchr( Client_Modes( c ), 'o' )) strlcat( flags, "*", sizeof( flags ));
/* Search suitable channel */
/* ausgeben */
cl2chan = Channel_FirstChannelOf( c );
while( cl2chan )
{
cn = Channel_GetChannel( cl2chan );
if( Channel_IsMemberOf( cn, Client ) ||
! strchr( Channel_Modes( cn ), 's' ))
{
ptr = Channel_Name( cn );
break;
}
cl2chan = Channel_NextChannelOf( c, cl2chan );
}
if( ! cl2chan ) ptr = "*";
if( cl2chan ) ptr = Channel_Name( Channel_GetChannel( cl2chan ));
else ptr = "*";
if( ! IRC_WriteStrClient( Client, RPL_WHOREPLY_MSG, Client_ID( Client ), ptr, Client_User( c ), Client_Hostname( c ), Client_ID( Client_Introducer( c )), Client_ID( c ), flags, Client_Hops( c ), Client_Info( c ))) return DISCONNECTED;
}
}
@@ -625,11 +613,11 @@ IRC_WHO( CLIENT *Client, REQUEST *Req )
} /* IRC_WHO */
GLOBAL bool
GLOBAL BOOLEAN
IRC_WHOIS( CLIENT *Client, REQUEST *Req )
{
CLIENT *from, *target, *c;
char str[LINE_LEN + 1];
CHAR str[LINE_LEN + 1];
CL2CHAN *cl2chan;
CHANNEL *chan;
@@ -675,12 +663,6 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req )
chan = Channel_GetChannel( cl2chan );
assert( chan != NULL );
/* next */
cl2chan = Channel_NextChannelOf( c, cl2chan );
/* Secret channel? */
if( strchr( Channel_Modes( chan ), 's' ) && ! Channel_IsMemberOf( chan, Client )) continue;
/* Concatenate channel names */
if( str[strlen( str ) - 1] != ':' ) strlcat( str, " ", sizeof( str ));
if( strchr( Channel_UserModes( chan, c ), 'o' )) strlcat( str, "@", sizeof( str ));
@@ -693,6 +675,9 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req )
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
snprintf( str, sizeof( str ), RPL_WHOISCHANNELS_MSG, Client_ID( from ), Client_ID( c ));
}
/* next */
cl2chan = Channel_NextChannelOf( c, cl2chan );
}
if( str[strlen( str ) - 1] != ':')
{
@@ -723,116 +708,25 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req )
} /* IRC_WHOIS */
/**
* IRC "WHOWAS" function.
* This function implements the IRC command "WHOWHAS". It handles local
* requests and request that should be forwarded to other servers.
*/
GLOBAL bool
GLOBAL BOOLEAN
IRC_WHOWAS( CLIENT *Client, REQUEST *Req )
{
CLIENT *target, *prefix;
WHOWAS *whowas;
int max, last, count, i;
char t_str[60];
assert( Client != NULL );
assert( Req != NULL );
/* Wrong number of parameters? */
if(( Req->argc < 1 ) || ( Req->argc > 3 ))
return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG,
Client_ID( Client ), Req->command );
/* Falsche Anzahl Parameter? */
if(( Req->argc < 1 ) || ( Req->argc > 3 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Search taget */
if( Req->argc == 3 )
target = Client_Search( Req->argv[2] );
else
target = Client_ThisServer( );
/* ... */
/* Get prefix */
if( Client_Type( Client ) == CLIENT_SERVER )
prefix = Client_Search( Req->prefix );
else
prefix = Client;
if( ! prefix )
return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG,
Client_ID( Client ), Req->prefix );
/* Forward to other server? */
if( target != Client_ThisServer( ))
{
if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER ))
return IRC_WriteStrClient( prefix, ERR_NOSUCHSERVER_MSG,
Client_ID( prefix ),
Req->argv[2] );
/* Forward */
IRC_WriteStrClientPrefix( target, prefix, "WHOWAS %s %s %s",
Req->argv[0], Req->argv[1],
Req->argv[2] );
return CONNECTED;
}
whowas = Client_GetWhowas( );
last = Client_GetLastWhowasIndex( );
if( last < 0 ) last = 0;
if( Req->argc > 1 )
{
max = atoi( Req->argv[1] );
if( max < 1 ) max = MAX_WHOWAS;
}
else
max = DEFAULT_WHOWAS;
i = last;
count = 0;
do
{
/* Used entry? */
if( whowas[i].time > 0 &&
strcasecmp( Req->argv[0], whowas[i].id ) == 0 )
{
(void)strftime( t_str, sizeof(t_str),
"%a %b %d %H:%M:%S %Y",
localtime( &whowas[i].time ));
if( ! IRC_WriteStrClient( prefix, RPL_WHOWASUSER_MSG,
Client_ID( prefix ),
whowas[i].id,
whowas[i].user,
whowas[i].host,
whowas[i].info ))
return DISCONNECTED;
if( ! IRC_WriteStrClient( prefix, RPL_WHOISSERVER_MSG,
Client_ID( prefix ),
whowas[i].id,
whowas[i].server, t_str ))
return DISCONNECTED;
count++;
if( count >= max ) break;
}
/* previos entry */
i--;
/* "underflow", wrap around */
if( i < 0 ) i = MAX_WHOWAS - 1;
} while( i != last );
return IRC_WriteStrClient( prefix, RPL_ENDOFWHOWAS_MSG,
Client_ID( prefix ), Req->argv[0] );
return CONNECTED;
} /* IRC_WHOWAS */
GLOBAL bool
GLOBAL BOOLEAN
IRC_Send_LUSERS( CLIENT *Client )
{
long cnt;
LONG cnt;
assert( Client != NULL );
@@ -870,12 +764,13 @@ IRC_Send_LUSERS( CLIENT *Client )
} /* IRC_Send_LUSERS */
GLOBAL bool
GLOBAL BOOLEAN
IRC_Show_MOTD( CLIENT *Client )
{
bool ok;
char line[127];
BOOLEAN ok;
CHAR line[127];
FILE *fd;
UINT line_len;
assert( Client != NULL );
@@ -894,16 +789,18 @@ IRC_Show_MOTD( CLIENT *Client )
}
if( ! IRC_WriteStrClient( Client, RPL_MOTDSTART_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )))) return DISCONNECTED;
while( true )
while( TRUE )
{
if( ! fgets( line, sizeof( line ), fd )) break;
ngt_TrimLastChr( line, '\n');
line_len = strlen( line );
if( line_len > 0 ) line_len--;
if( line[line_len] == '\n' ) line[line_len] = '\0';
if( ! IRC_WriteStrClient( Client, RPL_MOTD_MSG, Client_ID( Client ), line ))
{
fclose( fd );
return false;
return FALSE;
}
}
ok = IRC_WriteStrClient( Client, RPL_ENDOFMOTD_MSG, Client_ID( Client ) );
@@ -914,22 +811,19 @@ IRC_Show_MOTD( CLIENT *Client )
} /* IRC_Show_MOTD */
GLOBAL bool
GLOBAL BOOLEAN
IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan )
{
bool is_visible, is_member;
char str[LINE_LEN + 1];
BOOLEAN is_visible, is_member;
CHAR str[LINE_LEN + 1];
CL2CHAN *cl2chan;
CLIENT *cl;
assert( Client != NULL );
assert( Chan != NULL );
if( Channel_IsMemberOf( Chan, Client )) is_member = true;
else is_member = false;
/* Secret channel? */
if( ! is_member && strchr( Channel_Modes( Chan ), 's' )) return CONNECTED;
if( Channel_IsMemberOf( Chan, Client )) is_member = TRUE;
else is_member = FALSE;
/* Alle Mitglieder suchen */
snprintf( str, sizeof( str ), RPL_NAMREPLY_MSG, Client_ID( Client ), "=", Channel_Name( Chan ));
@@ -938,8 +832,8 @@ IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan )
{
cl = Channel_GetClient( cl2chan );
if( strchr( Client_Modes( cl ), 'i' )) is_visible = false;
else is_visible = true;
if( strchr( Client_Modes( cl ), 'i' )) is_visible = FALSE;
else is_visible = TRUE;
if( is_member || is_visible )
{
@@ -970,22 +864,19 @@ IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan )
} /* IRC_Send_NAMES */
GLOBAL bool
IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, bool OnlyOps )
GLOBAL BOOLEAN
IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps )
{
bool is_visible, is_member;
BOOLEAN is_visible, is_member;
CL2CHAN *cl2chan;
char flags[8];
CHAR flags[8];
CLIENT *c;
assert( Client != NULL );
assert( Chan != NULL );
if( Channel_IsMemberOf( Chan, Client )) is_member = true;
else is_member = false;
/* Secret channel? */
if( ! is_member && strchr( Channel_Modes( Chan ), 's' )) return CONNECTED;
if( Channel_IsMemberOf( Chan, Client )) is_member = TRUE;
else is_member = FALSE;
/* Alle Mitglieder suchen */
cl2chan = Channel_FirstMember( Chan );
@@ -993,8 +884,8 @@ IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, bool OnlyOps )
{
c = Channel_GetClient( cl2chan );
if( strchr( Client_Modes( c ), 'i' )) is_visible = false;
else is_visible = true;
if( strchr( Client_Modes( c ), 'i' )) is_visible = FALSE;
else is_visible = TRUE;
if( is_member || is_visible )
{

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: irc-info.h,v 1.3 2005/03/19 18:43:48 fw Exp $
* $Id: irc-info.h,v 1.2 2002/12/12 12:23:43 alex Exp $
*
* IRC info commands (header)
*/
@@ -18,24 +18,24 @@
#define __irc_info_h__
GLOBAL bool IRC_ADMIN PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_ISON PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_LINKS PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_LUSERS PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_MOTD PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_NAMES PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_STATS PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_TIME PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_USERHOST PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_VERSION PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_WHO PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_WHOIS PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_WHOWAS PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_ADMIN PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_ISON PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_LINKS PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_LUSERS PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_MOTD PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_NAMES PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_STATS PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_TIME PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_USERHOST PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_VERSION PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_WHO PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_WHOIS PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_WHOWAS PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL 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 BOOLEAN IRC_Send_LUSERS PARAMS(( CLIENT *Client ));
GLOBAL BOOLEAN IRC_Send_NAMES PARAMS(( CLIENT *Client, CHANNEL *Chan ));
GLOBAL BOOLEAN IRC_Show_MOTD PARAMS(( CLIENT *Client ));
GLOBAL BOOLEAN IRC_Send_WHO PARAMS(( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps ));
#endif

View File

@@ -14,7 +14,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: irc-login.c,v 1.44.2.1 2005/12/15 11:01:59 alex Exp $";
static char UNUSED id[] = "$Id: irc-login.c,v 1.40 2004/03/11 22:16:31 alex Exp $";
#include "imp.h"
#include <assert.h>
@@ -41,11 +41,11 @@ static char UNUSED id[] = "$Id: irc-login.c,v 1.44.2.1 2005/12/15 11:01:59 alex
#include "irc-login.h"
LOCAL bool Hello_User PARAMS(( CLIENT *Client ));
LOCAL void Kill_Nick PARAMS(( char *Nick, char *Reason ));
LOCAL BOOLEAN Hello_User PARAMS(( CLIENT *Client ));
LOCAL VOID Kill_Nick PARAMS(( CHAR *Nick, CHAR *Reason ));
GLOBAL bool
GLOBAL BOOLEAN
IRC_PASS( CLIENT *Client, REQUEST *Req )
{
assert( Client != NULL );
@@ -67,8 +67,8 @@ IRC_PASS( CLIENT *Client, REQUEST *Req )
}
else if((( Client_Type( Client ) == CLIENT_UNKNOWN ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER )) && (( Req->argc == 3 ) || ( Req->argc == 4 )))
{
char c2, c4, *type, *impl, *serverver, *flags, *ptr, *ircflags;
int protohigh, protolow;
CHAR c2, c4, *type, *impl, *serverver, *flags, *ptr, *ircflags;
INT protohigh, protolow;
/* noch nicht registrierte Server-Verbindung */
Log( LOG_DEBUG, "Connection %d: got PASS command (new server link) ...", Client_Conn( Client ));
@@ -143,138 +143,88 @@ IRC_PASS( CLIENT *Client, REQUEST *Req )
} /* IRC_PASS */
/**
* IRC "NICK" command.
* This function implements the IRC command "NICK" which is used to register
* with the server, to change already registered nicknames and to introduce
* new users which are connected to other servers.
*/
GLOBAL bool
GLOBAL BOOLEAN
IRC_NICK( CLIENT *Client, REQUEST *Req )
{
CLIENT *intr_c, *target, *c;
char *modes;
CHAR *modes;
assert( Client != NULL );
assert( Req != NULL );
/* Zumindest BitchX sendet NICK-USER in der falschen Reihenfolge. */
#ifndef STRICT_RFC
/* Some IRC clients, for example BitchX, send the NICK and USER
* commands in the wrong order ... */
if( Client_Type( Client ) == CLIENT_UNKNOWN
|| Client_Type( Client ) == CLIENT_GOTPASS
|| Client_Type( Client ) == CLIENT_GOTNICK
|| Client_Type( Client ) == CLIENT_GOTUSER
|| Client_Type( Client ) == CLIENT_USER
|| ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
if( Client_Type( Client ) == CLIENT_UNKNOWN || Client_Type( Client ) == CLIENT_GOTPASS || Client_Type( Client ) == CLIENT_GOTNICK || Client_Type( Client ) == CLIENT_GOTUSER || Client_Type( Client ) == CLIENT_USER || ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
#else
if( Client_Type( Client ) == CLIENT_UNKNOWN
|| Client_Type( Client ) == CLIENT_GOTPASS
|| Client_Type( Client ) == CLIENT_GOTNICK
|| Client_Type( Client ) == CLIENT_USER
|| ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
if( Client_Type( Client ) == CLIENT_UNKNOWN || Client_Type( Client ) == CLIENT_GOTPASS || Client_Type( Client ) == CLIENT_GOTNICK || Client_Type( Client ) == CLIENT_USER || ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
#endif
{
/* User registration or change of nickname */
/* User-Registrierung bzw. Nick-Aenderung */
/* Wrong number of arguments? */
if( Req->argc != 1 )
return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG,
Client_ID( Client ),
Req->command );
/* Falsche Anzahl Parameter? */
if( Req->argc != 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Search "target" client */
/* "Ziel-Client" ermitteln */
if( Client_Type( Client ) == CLIENT_SERVER )
{
target = Client_Search( Req->prefix );
if( ! target )
return IRC_WriteStrClient( Client,
ERR_NOSUCHNICK_MSG,
Client_ID( Client ),
Req->argv[0] );
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
}
else
{
/* Is this a restricted client? */
if( Client_HasMode( Client, 'r' ))
return IRC_WriteStrClient( Client,
ERR_RESTRICTED_MSG,
Client_ID( Client ));
/* Ist der Client "restricted"? */
if( Client_HasMode( Client, 'r' )) return IRC_WriteStrClient( Client, ERR_RESTRICTED_MSG, Client_ID( Client ));
target = Client;
}
#ifndef STRICT_RFC
/* If the clients tries to change to its own nickname we won't
* do anything. This is how the original ircd behaves and some
* clients (for example Snak) expect it to be like this.
* But I doubt that this is "really the right thing" ... */
if( strcmp( Client_ID( target ), Req->argv[0] ) == 0 )
return CONNECTED;
/* Wenn der Client zu seinem eigenen Nick wechseln will, so machen
* wir nichts. So macht es das Original und mind. Snak hat probleme,
* wenn wir es nicht so machen. Ob es so okay ist? Hm ... */
if( strcmp( Client_ID( target ), Req->argv[0] ) == 0 ) return CONNECTED;
#endif
/* Check that the new nickname is available. Special case:
* the client only changes from/to upper to lower case. */
/* pruefen, ob Nick bereits vergeben. Speziallfall: der Client
* will nur die Gross- und Kleinschreibung aendern. Das darf
* er natuerlich machen :-) */
if( strcasecmp( Client_ID( target ), Req->argv[0] ) != 0 )
{
if( ! Client_CheckNick( target, Req->argv[0] ))
return CONNECTED;
if( ! Client_CheckNick( target, Req->argv[0] )) return CONNECTED;
}
if(( Client_Type( target ) != CLIENT_USER )
&& ( Client_Type( target ) != CLIENT_SERVER ))
if(( Client_Type( target ) != CLIENT_USER ) && ( Client_Type( target ) != CLIENT_SERVER ))
{
/* New client */
Log( LOG_DEBUG, "Connection %d: got valid NICK command ...",
Client_Conn( Client ));
/* Neuer Client */
Log( LOG_DEBUG, "Connection %d: got valid NICK command ...", Client_Conn( Client ));
/* Register new nickname of this client */
/* Client-Nick registrieren */
Client_SetID( target, Req->argv[0] );
/* If we received a valid USER command already then
* register the new client! */
if( Client_Type( Client ) == CLIENT_GOTUSER )
return Hello_User( Client );
else
Client_SetType( Client, CLIENT_GOTNICK );
/* schon ein USER da? Dann registrieren! */
if( Client_Type( Client ) == CLIENT_GOTUSER ) return Hello_User( Client );
else Client_SetType( Client, CLIENT_GOTNICK );
}
else
{
/* Nickname change */
/* Nick-Aenderung */
if( Client_Conn( target ) > NONE )
{
/* Local client */
Log( LOG_INFO,
"User \"%s\" changed nick (connection %d): \"%s\" -> \"%s\".",
Client_Mask( target ), Client_Conn( target ),
Client_ID( target ), Req->argv[0] );
/* lokaler Client */
Log( LOG_INFO, "User \"%s\" changed nick (connection %d): \"%s\" -> \"%s\".", Client_Mask( target ), Client_Conn( target ), Client_ID( target ), Req->argv[0] );
}
else
{
/* Remote client */
Log( LOG_DEBUG,
"User \"%s\" changed nick: \"%s\" -> \"%s\".",
Client_Mask( target ), Client_ID( target ),
Req->argv[0] );
/* Remote-Client */
Log( LOG_DEBUG, "User \"%s\" changed nick: \"%s\" -> \"%s\".", Client_Mask( target ), Client_ID( target ), Req->argv[0] );
}
/* Inform all users and servers (which have to know)
* of this nickname change */
if( Client_Type( Client ) == CLIENT_USER )
IRC_WriteStrClientPrefix( Client, Client,
"NICK :%s",
Req->argv[0] );
IRC_WriteStrServersPrefix( Client, target,
"NICK :%s", Req->argv[0] );
IRC_WriteStrRelatedPrefix( target, target, false,
"NICK :%s", Req->argv[0] );
/* alle betroffenen User und Server ueber Nick-Aenderung informieren */
if( Client_Type( Client ) == CLIENT_USER ) IRC_WriteStrClientPrefix( Client, Client, "NICK :%s", Req->argv[0] );
IRC_WriteStrServersPrefix( Client, target, "NICK :%s", Req->argv[0] );
IRC_WriteStrRelatedPrefix( target, target, FALSE, "NICK :%s", Req->argv[0] );
/* Register old nickname for WHOWAS queries */
Client_RegisterWhowas( target );
/* Save new nickname */
/* neuen Client-Nick speichern */
Client_SetID( target, Req->argv[0] );
IRC_SetPenalty( target, 2 );
}
@@ -282,7 +232,7 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
}
else if( Client_Type( Client ) == CLIENT_SERVER )
{
/* Server introduces new client */
/* Server fuehrt neuen Client ein */
/* Falsche Anzahl Parameter? */
if( Req->argc != 7 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
@@ -309,7 +259,7 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
}
/* Neue Client-Struktur anlegen */
c = Client_NewRemoteUser( intr_c, Req->argv[0], atoi( Req->argv[1] ), Req->argv[2], Req->argv[3], atoi( Req->argv[4] ), Req->argv[5] + 1, Req->argv[6], true);
c = Client_NewRemoteUser( intr_c, Req->argv[0], atoi( Req->argv[1] ), Req->argv[2], Req->argv[3], atoi( Req->argv[4] ), Req->argv[5] + 1, Req->argv[6], TRUE );
if( ! c )
{
/* Eine neue Client-Struktur konnte nicht angelegt werden.
@@ -333,11 +283,11 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
} /* IRC_NICK */
GLOBAL bool
GLOBAL BOOLEAN
IRC_USER( CLIENT *Client, REQUEST *Req )
{
#ifdef IDENTAUTH
char *ptr;
CHAR *ptr;
#endif
assert( Client != NULL );
@@ -355,9 +305,9 @@ IRC_USER( CLIENT *Client, REQUEST *Req )
/* User name */
#ifdef IDENTAUTH
ptr = Client_User( Client );
if( ! ptr || ! *ptr || *ptr == '~' ) Client_SetUser( Client, Req->argv[0], false );
if( ! ptr || ! *ptr || *ptr == '~' ) Client_SetUser( Client, Req->argv[0], FALSE );
#else
Client_SetUser( Client, Req->argv[0], false );
Client_SetUser( Client, Req->argv[0], FALSE );
#endif
/* "Real name" or user info text: Don't set it to the empty string, the original ircd
@@ -378,25 +328,21 @@ IRC_USER( CLIENT *Client, REQUEST *Req )
} /* IRC_USER */
GLOBAL bool
GLOBAL BOOLEAN
IRC_QUIT( CLIENT *Client, REQUEST *Req )
{
CLIENT *target;
char quitmsg[LINE_LEN];
assert( Client != NULL );
assert( Req != NULL );
/* Wrong number of arguments? */
if( Req->argc > 1 )
return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
if (Req->argc == 1)
strlcpy(quitmsg, Req->argv[0], sizeof quitmsg);
if ( Client_Type( Client ) == CLIENT_SERVER )
{
/* Server */
/* Falsche Anzahl Parameter? */
if( Req->argc > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
target = Client_Search( Req->prefix );
if( ! target )
{
@@ -405,28 +351,27 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req )
return CONNECTED;
}
Client_Destroy( target, "Got QUIT command.", Req->argc == 1 ? quitmsg : NULL, true);
if( Req->argc == 0 ) Client_Destroy( target, "Got QUIT command.", NULL, TRUE );
else Client_Destroy( target, "Got QUIT command.", Req->argv[0], TRUE );
return CONNECTED;
}
else
{
if (Req->argc == 1 && quitmsg[0] != '\"') {
/* " " to avoid confusion */
strlcpy(quitmsg, "\"", sizeof quitmsg);
strlcat(quitmsg, Req->argv[0], sizeof quitmsg-1);
strlcat(quitmsg, "\"", sizeof quitmsg );
}
/* User, Service, oder noch nicht registriert */
Conn_Close( Client_Conn( Client ), "Got QUIT command.", Req->argc == 1 ? quitmsg : NULL, true);
/* Falsche Anzahl Parameter? */
if( Req->argc > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
if( Req->argc == 0 ) Conn_Close( Client_Conn( Client ), "Got QUIT command.", NULL, TRUE );
else Conn_Close( Client_Conn( Client ), "Got QUIT command.", Req->argv[0], TRUE );
return DISCONNECTED;
}
} /* IRC_QUIT */
GLOBAL bool
GLOBAL BOOLEAN
IRC_PING( CLIENT *Client, REQUEST *Req )
{
CLIENT *target, *from;
@@ -456,19 +401,11 @@ IRC_PING( CLIENT *Client, REQUEST *Req )
}
Log( LOG_DEBUG, "Connection %d: got PING, sending PONG ...", Client_Conn( Client ));
#ifdef STRICT_RFC
return IRC_WriteStrClient(Client, "PONG %s :%s",
Client_ID(Client_ThisServer()), Client_ID(Client));
#else
/* Some clients depend on the argument being returned in the PONG
* reply (not mentioned in any RFC, though) */
return IRC_WriteStrClient(Client, "PONG %s :%s",
Client_ID(Client_ThisServer( )), Req->argv[0]);
#endif
return IRC_WriteStrClient( Client, "PONG %s :%s", Client_ID( Client_ThisServer( )), Client_ID( Client ));
} /* IRC_PING */
GLOBAL bool
GLOBAL BOOLEAN
IRC_PONG( CLIENT *Client, REQUEST *Req )
{
CLIENT *target, *from;
@@ -505,11 +442,11 @@ IRC_PONG( CLIENT *Client, REQUEST *Req )
} /* IRC_PONG */
LOCAL bool
LOCAL BOOLEAN
Hello_User( CLIENT *Client )
{
#ifdef CVSDATE
char ver[12], vertxt[30];
CHAR ver[12], vertxt[30];
#endif
assert( Client != NULL );
@@ -519,7 +456,7 @@ Hello_User( CLIENT *Client )
{
/* Bad password! */
Log( LOG_ERR, "User \"%s\" rejected (connection %d): Bad password!", Client_Mask( Client ), Client_Conn( Client ));
Conn_Close( Client_Conn( Client ), NULL, "Bad password", true);
Conn_Close( Client_Conn( Client ), NULL, "Bad password", TRUE );
return DISCONNECTED;
}
@@ -529,24 +466,24 @@ Hello_User( CLIENT *Client )
IRC_WriteStrServers( NULL, "NICK %s 1 %s %s 1 +%s :%s", Client_ID( Client ), Client_User( Client ), Client_Hostname( Client ), Client_Modes( Client ), Client_Info( Client ));
/* Welcome :-) */
if( ! IRC_WriteStrClient( Client, RPL_WELCOME_MSG, Client_ID( Client ), Client_Mask( Client ))) return false;
if( ! IRC_WriteStrClient( Client, RPL_WELCOME_MSG, Client_ID( Client ), Client_Mask( Client ))) return FALSE;
/* Version and system type */
#ifdef CVSDATE
strlcpy( ver, CVSDATE, sizeof( ver ));
strncpy( ver + 4, ver + 5, 2 );
strncpy( ver + 6, ver + 8, 3 );
strlcpy( ver, CVSDATE, sizeof( ver ));
strncpy( ver + 4, ver + 5, 2 );
strncpy( ver + 6, ver + 8, 3 );
snprintf( vertxt, sizeof( vertxt ), "%s(%s)", PACKAGE_VERSION, ver );
if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), vertxt, TARGET_CPU, TARGET_VENDOR, TARGET_OS )) return false;
if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), vertxt, TARGET_CPU, TARGET_VENDOR, TARGET_OS )) return FALSE;
#else
if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), PACKAGE_VERSION, TARGET_CPU, TARGET_VENDOR, TARGET_OS )) return false;
if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), PACKAGE_VERSION, TARGET_CPU, TARGET_VENDOR, TARGET_OS )) return FALSE;
#endif
if( ! IRC_WriteStrClient( Client, RPL_CREATED_MSG, Client_ID( Client ), NGIRCd_StartStr )) return false;
if( ! IRC_WriteStrClient( Client, RPL_CREATED_MSG, Client_ID( Client ), NGIRCd_StartStr )) return FALSE;
#ifdef CVSDATE
if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), vertxt, USERMODES, CHANMODES )) return false;
if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), vertxt, USERMODES, CHANMODES )) return FALSE;
#else
if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), PACKAGE_VERSION, USERMODES, CHANMODES )) return false;
if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), PACKAGE_VERSION, USERMODES, CHANMODES )) return FALSE;
#endif
/* Features */
@@ -564,15 +501,15 @@ Hello_User( CLIENT *Client )
} /* Hello_User */
LOCAL void
Kill_Nick( char *Nick, char *Reason )
LOCAL VOID
Kill_Nick( CHAR *Nick, CHAR *Reason )
{
REQUEST r;
assert( Nick != NULL );
assert( Reason != NULL );
r.prefix = (char *)Client_ThisServer( );
r.prefix = (CHAR *)Client_ThisServer( );
r.argv[0] = Nick;
r.argv[1] = Reason;
r.argc = 2;

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: irc-login.h,v 1.6 2005/03/19 18:43:48 fw Exp $
* $Id: irc-login.h,v 1.5 2002/12/12 12:23:43 alex Exp $
*
* Login and logout (header)
*/
@@ -18,12 +18,12 @@
#define __irc_login_h__
GLOBAL bool IRC_PASS PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_NICK PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_USER PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_PING PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_PONG PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_QUIT PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_PASS PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_NICK PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_USER PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_PING PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_PONG PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_QUIT PARAMS((CLIENT *Client, REQUEST *Req ));
#endif

View File

@@ -1,6 +1,6 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001-2005 Alexander Barton (alex@barton.de)
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -14,7 +14,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: irc-mode.c,v 1.43 2005/06/17 19:14:58 fw Exp $";
static char UNUSED id[] = "$Id: irc-mode.c,v 1.35 2004/04/25 15:42:05 alex Exp $";
#include "imp.h"
#include <assert.h>
@@ -22,10 +22,10 @@ static char UNUSED id[] = "$Id: irc-mode.c,v 1.43 2005/06/17 19:14:58 fw Exp $";
#include <stdlib.h>
#include <string.h>
#include "defines.h"
#include "conn.h"
#include "client.h"
#include "channel.h"
#include "defines.h"
#include "irc-write.h"
#include "lists.h"
#include "log.h"
@@ -38,19 +38,19 @@ static char UNUSED id[] = "$Id: irc-mode.c,v 1.43 2005/06/17 19:14:58 fw Exp $";
#include "irc-mode.h"
LOCAL bool Client_Mode PARAMS(( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ));
LOCAL bool Channel_Mode PARAMS(( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel ));
LOCAL BOOLEAN Client_Mode PARAMS(( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ));
LOCAL BOOLEAN Channel_Mode PARAMS(( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel ));
LOCAL bool Add_Invite PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ));
LOCAL bool Add_Ban PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ));
LOCAL BOOLEAN Add_Invite PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern ));
LOCAL BOOLEAN Add_Ban PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern ));
LOCAL bool Del_Invite PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ));
LOCAL bool Del_Ban PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ));
LOCAL BOOLEAN Del_Invite PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern ));
LOCAL BOOLEAN Del_Ban PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern ));
LOCAL bool Send_ListChange PARAMS(( char *Mode, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Mask ));
LOCAL BOOLEAN Send_ListChange PARAMS(( CHAR *Mode, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Mask ));
GLOBAL bool
GLOBAL BOOLEAN
IRC_MODE( CLIENT *Client, REQUEST *Req )
{
CLIENT *cl, *origin;
@@ -83,15 +83,14 @@ IRC_MODE( CLIENT *Client, REQUEST *Req )
} /* IRC_MODE */
LOCAL bool
LOCAL BOOLEAN
Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
{
/* Handle client mode requests */
char the_modes[COMMAND_LEN], x[2], *mode_ptr;
bool ok, set;
int mode_arg;
size_t len;
CHAR the_modes[COMMAND_LEN], x[2], *mode_ptr;
BOOLEAN ok, set;
INT mode_arg;
/* Is the client allowed to request or change the modes? */
if( Client_Type( Client ) == CLIENT_USER )
@@ -107,8 +106,8 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
mode_ptr = Req->argv[mode_arg];
/* Initial state: set or unset modes? */
if( *mode_ptr == '+' ) set = true;
else if( *mode_ptr == '-' ) set = false;
if( *mode_ptr == '+' ) set = TRUE;
else if( *mode_ptr == '-' ) set = FALSE;
else return IRC_WriteStrClient( Origin, ERR_UMODEUNKNOWNFLAG_MSG, Client_ID( Origin ));
/* Prepare reply string */
@@ -135,11 +134,10 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
if((( *mode_ptr == '+' ) && ( ! set )) || (( *mode_ptr == '-' ) && ( set )))
{
/* Action modifier ("+"/"-") must be changed ... */
len = strlen( the_modes ) - 1;
if(( the_modes[len] == '+' ) || ( the_modes[len] == '-' ))
if(( the_modes[strlen( the_modes ) - 1] == '+' ) || ( the_modes[strlen( the_modes ) - 1] == '-' ))
{
/* Adjust last action modifier in result */
the_modes[len] = *mode_ptr;
the_modes[strlen( the_modes ) - 1] = *mode_ptr;
}
else
{
@@ -147,8 +145,8 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
x[0] = *mode_ptr;
strlcat( the_modes, x, sizeof( the_modes ));
}
if( *mode_ptr == '+' ) set = true;
else set = false;
if( *mode_ptr == '+' ) set = TRUE;
else set = FALSE;
}
continue;
}
@@ -157,34 +155,37 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
x[0] = '\0';
switch( *mode_ptr )
{
case 'i': /* Invisible */
case 's': /* Server messages */
x[0] = *mode_ptr;
break;
case 'a': /* Away */
case 'a':
/* Away */
if( Client_Type( Client ) == CLIENT_SERVER )
{
x[0] = 'a';
Client_SetAway( Origin, DEFAULT_AWAY_MSG );
Client_SetAway( Client, DEFAULT_AWAY_MSG );
}
else ok = IRC_WriteStrClient( Origin, ERR_NOPRIVILEGES_MSG, Client_ID( Origin ));
break;
case 'o': /* IRC operator (only unsettable!) */
case 'i':
/* Invisible */
x[0] = 'i';
break;
case 'o':
/* IRC operator (only unsetable!) */
if(( ! set ) || ( Client_Type( Client ) == CLIENT_SERVER ))
{
Client_SetOperByMe( Target, false );
Client_SetOperByMe( Target, FALSE );
x[0] = 'o';
}
else ok = IRC_WriteStrClient( Origin, ERR_NOPRIVILEGES_MSG, Client_ID( Origin ));
break;
case 'r': /* Restricted (only settable) */
case 'r':
/* Restricted (only setable) */
if(( set ) || ( Client_Type( Client ) == CLIENT_SERVER )) x[0] = 'r';
else ok = IRC_WriteStrClient( Origin, ERR_RESTRICTED_MSG, Client_ID( Origin ));
break;
case 's':
/* Server messages */
x[0] = 's';
break;
default:
Log( LOG_DEBUG, "Unknown mode \"%c%c\" from \"%s\"!?", set ? '+' : '-', *mode_ptr, Client_ID( Origin ));
if( Client_Type( Client ) != CLIENT_SERVER ) ok = IRC_WriteStrClient( Origin, ERR_UMODEUNKNOWNFLAG2_MSG, Client_ID( Origin ), set ? '+' : '-', *mode_ptr );
@@ -214,8 +215,7 @@ client_exit:
if( the_modes[1] )
{
/* Remoce needless action modifier characters */
len = strlen( the_modes ) - 1;
if(( the_modes[len] == '+' ) || ( the_modes[len] == '-' )) the_modes[len] = '\0';
if(( the_modes[strlen( the_modes ) - 1] == '+' ) || ( the_modes[strlen( the_modes ) - 1] == '-' )) the_modes[strlen( the_modes ) - 1] = '\0';
if( Client_Type( Client ) == CLIENT_SERVER )
{
@@ -236,17 +236,16 @@ client_exit:
} /* Client_Mode */
LOCAL bool
LOCAL BOOLEAN
Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
{
/* Handle channel and channel-user modes */
char the_modes[COMMAND_LEN], the_args[COMMAND_LEN], x[2], argadd[CLIENT_PASS_LEN], *mode_ptr;
bool ok, set, modeok = false, skiponce, use_servermode = false;
int mode_arg, arg_arg;
CHAR the_modes[COMMAND_LEN], the_args[COMMAND_LEN], x[2], argadd[CLIENT_PASS_LEN], *mode_ptr;
BOOLEAN ok, set, modeok, skiponce;
INT mode_arg, arg_arg;
CLIENT *client;
long l;
size_t len;
LONG l;
/* Mode request: let's answer it :-) */
if( Req->argc == 1 )
@@ -257,7 +256,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
/* The sender is a member: generate extended reply */
strlcpy( the_modes, Channel_Modes( Channel ), sizeof( the_modes ));
mode_ptr = the_modes;
the_args[0] = '\0';
strcpy( the_args, "" );
while( *mode_ptr )
{
switch( *mode_ptr )
@@ -285,17 +284,15 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
if( ! Channel_IsMemberOf( Channel, Origin )) return IRC_WriteStrClient( Origin, ERR_NOTONCHANNEL_MSG, Client_ID( Origin ), Channel_Name( Channel ));
/* Is he channel operator? */
if( strchr( Channel_UserModes( Channel, Origin ), 'o' )) modeok = true;
else if( Conf_OperCanMode )
if( strchr( Channel_UserModes( Channel, Origin ), 'o' )) modeok = TRUE;
else modeok = FALSE;
if( Conf_OperCanMode )
{
/* IRC-Operators can use MODE as well */
if( Client_OperByMe( Origin )) {
modeok = true;
if ( Conf_OperServerMode ) use_servermode = true; /* Change Origin to Server */
}
/* auch IRC-Operatoren duerfen MODE verwenden */
if( Client_OperByMe( Origin )) modeok = TRUE;
}
}
else modeok = true;
else modeok = TRUE;
mode_arg = 1;
mode_ptr = Req->argv[mode_arg];
@@ -303,10 +300,10 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
else arg_arg = -1;
/* Initial state: set or unset modes? */
skiponce = false;
if( *mode_ptr == '-' ) set = false;
else if( *mode_ptr == '+' ) set = true;
else set = skiponce = true;
skiponce = FALSE;
if( *mode_ptr == '-' ) set = FALSE;
else if( *mode_ptr == '+' ) set = TRUE;
else set = skiponce = TRUE;
/* Prepare reply string */
if( set ) strcpy( the_modes, "+" );
@@ -328,7 +325,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
if( Req->argc > mode_arg + 1 ) arg_arg = mode_arg + 1;
else arg_arg = -1;
}
skiponce = false;
skiponce = FALSE;
switch( *mode_ptr )
{
@@ -337,11 +334,10 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
if((( *mode_ptr == '+' ) && ( ! set )) || (( *mode_ptr == '-' ) && ( set )))
{
/* Action modifier ("+"/"-") must be changed ... */
len = strlen( the_modes ) - 1;
if(( the_modes[len] == '+' ) || ( the_modes[len] == '-' ))
if(( the_modes[strlen( the_modes ) - 1] == '+' ) || ( the_modes[strlen( the_modes ) - 1] == '-' ))
{
/* Adjust last action modifier in result */
the_modes[len] = *mode_ptr;
the_modes[strlen( the_modes ) - 1] = *mode_ptr;
}
else
{
@@ -349,8 +345,8 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
x[0] = *mode_ptr;
strlcat( the_modes, x, sizeof( the_modes ));
}
if( *mode_ptr == '+' ) set = true;
else set = false;
if( *mode_ptr == '+' ) set = TRUE;
else set = FALSE;
}
continue;
}
@@ -364,18 +360,62 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
client = NULL;
switch( *mode_ptr )
{
/* --- Channel modes --- */
case 'i': /* Invite only */
case 'm': /* Moderated */
case 'n': /* Only members can write */
case 's': /* Secret channel */
case 't': /* Topic locked */
if( modeok ) x[0] = *mode_ptr;
/* Channel modes */
case 'i':
/* Invite-Only */
if( modeok ) x[0] = 'i';
else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
break;
case 'm':
/* Moderated */
if( modeok ) x[0] = 'm';
else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
break;
case 'n':
/* kein Schreiben in den Channel von aussen */
if( modeok ) x[0] = 'n';
else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
break;
case 't':
/* Topic Lock */
if( modeok ) x[0] = 't';
else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
break;
case 'P':
/* Persistent channel */
if( modeok )
{
if( set && ( ! Client_OperByMe( Client )))
{
/* Only IRC operators are allowed to set P mode */
ok = IRC_WriteStrClient( Origin, ERR_NOPRIVILEGES_MSG, Client_ID( Origin ));
}
else x[0] = 'P';
}
else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
break;
case 'k': /* Channel key */
/* Channel user modes */
case 'o':
/* Channel operator */
case 'v':
/* Voice */
if( arg_arg > mode_arg )
{
if( modeok )
{
client = Client_Search( Req->argv[arg_arg] );
if( client ) x[0] = *mode_ptr;
else ok = IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[arg_arg] );
}
else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
Req->argv[arg_arg][0] = '\0';
arg_arg++;
}
else ok = IRC_WriteStrClient( Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID( Origin ), Req->command );
break;
case 'k':
/* Channel key */
if( ! set )
{
if( modeok ) x[0] = *mode_ptr;
@@ -397,8 +437,8 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
}
else ok = IRC_WriteStrClient( Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID( Origin ), Req->command );
break;
case 'l': /* Member limit */
case 'l':
/* Member limit */
if( ! set )
{
if( modeok ) x[0] = *mode_ptr;
@@ -425,41 +465,9 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
else ok = IRC_WriteStrClient( Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID( Origin ), Req->command );
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 ));
break;
/* --- Channel user modes --- */
case 'o': /* Channel operator */
case 'v': /* Voice */
if( arg_arg > mode_arg )
{
if( modeok )
{
client = Client_Search( Req->argv[arg_arg] );
if( client ) x[0] = *mode_ptr;
else ok = IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[arg_arg] );
}
else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
Req->argv[arg_arg][0] = '\0';
arg_arg++;
}
else ok = IRC_WriteStrClient( Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID( Origin ), Req->command );
break;
/* --- Channel lists --- */
case 'I': /* Invite lists */
/* Channel lists */
case 'I':
/* Invite lists */
if( arg_arg > mode_arg )
{
/* modify list */
@@ -474,8 +482,8 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
}
else Lists_ShowInvites( Origin, Channel );
break;
case 'b': /* Ban lists */
case 'b':
/* Ban lists */
if( arg_arg > mode_arg )
{
/* modify list */
@@ -561,8 +569,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 ));
if( the_args[strlen( the_args ) - 1] != ' ' ) strlcat( the_args, " ", sizeof( the_args ));
strlcat( the_args, argadd, sizeof( the_args ));
}
}
@@ -572,8 +579,7 @@ chan_exit:
if( the_modes[1] )
{
/* Clean up mode string */
len = strlen( the_modes ) - 1;
if(( the_modes[len] == '+' ) || ( the_modes[len] == '-' )) the_modes[len] = '\0';
if(( the_modes[strlen( the_modes ) - 1] == '+' ) || ( the_modes[strlen( the_modes ) - 1] == '-' )) the_modes[strlen( the_modes ) - 1] = '\0';
/* Clean up argument string if there are none */
if( ! the_args[1] ) the_args[0] = '\0';
@@ -582,16 +588,14 @@ chan_exit:
{
/* Forward mode changes to channel users and other servers */
IRC_WriteStrServersPrefix( Client, Origin, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args );
IRC_WriteStrChannelPrefix( Client, Channel, Origin, false, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args );
IRC_WriteStrChannelPrefix( Client, Channel, Origin, FALSE, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args );
}
else
{
if ( use_servermode ) Origin = Client_ThisServer();
/* Send reply to client and inform other servers and channel users */
ok = IRC_WriteStrClientPrefix( Client, Origin, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args );
IRC_WriteStrServersPrefix( Client, Origin, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args );
IRC_WriteStrChannelPrefix( Client, Channel, Origin, false, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args );
IRC_WriteStrChannelPrefix( Client, Channel, Origin, FALSE, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args );
}
}
@@ -600,7 +604,7 @@ chan_exit:
} /* Channel_Mode */
GLOBAL bool
GLOBAL BOOLEAN
IRC_AWAY( CLIENT *Client, REQUEST *Req )
{
assert( Client != NULL );
@@ -627,11 +631,11 @@ IRC_AWAY( CLIENT *Client, REQUEST *Req )
} /* IRC_AWAY */
LOCAL bool
Add_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
LOCAL BOOLEAN
Add_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern )
{
char *mask;
bool already;
CHAR *mask;
BOOLEAN already;
assert( Client != NULL );
assert( Channel != NULL );
@@ -641,19 +645,19 @@ Add_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
already = Lists_IsInviteEntry( mask, Channel );
if( ! Lists_AddInvited( mask, Channel, false )) return CONNECTED;
if( ! Lists_AddInvited( mask, Channel, FALSE )) return CONNECTED;
if(( Client_Type( Prefix ) == CLIENT_SERVER ) && ( already == true)) return CONNECTED;
if(( Client_Type( Prefix ) == CLIENT_SERVER ) && ( already == TRUE )) return CONNECTED;
return Send_ListChange( "+I", Prefix, Client, Channel, mask );
} /* Add_Invite */
LOCAL bool
Add_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
LOCAL BOOLEAN
Add_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern )
{
char *mask;
bool already;
CHAR *mask;
BOOLEAN already;
assert( Client != NULL );
assert( Channel != NULL );
@@ -665,16 +669,16 @@ Add_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
if( ! Lists_AddBanned( mask, Channel )) return CONNECTED;
if(( Client_Type( Prefix ) == CLIENT_SERVER ) && ( already == true)) return CONNECTED;
if(( Client_Type( Prefix ) == CLIENT_SERVER ) && ( already == TRUE )) return CONNECTED;
return Send_ListChange( "+b", Prefix, Client, Channel, mask );
} /* Add_Ban */
LOCAL bool
Del_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
LOCAL BOOLEAN
Del_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern )
{
char *mask;
CHAR *mask;
assert( Client != NULL );
assert( Channel != NULL );
@@ -686,10 +690,10 @@ Del_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
} /* Del_Invite */
LOCAL bool
Del_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
LOCAL BOOLEAN
Del_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern )
{
char *mask;
CHAR *mask;
assert( Client != NULL );
assert( Channel != NULL );
@@ -701,25 +705,25 @@ Del_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
} /* Del_Ban */
LOCAL bool
Send_ListChange( char *Mode, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Mask )
LOCAL BOOLEAN
Send_ListChange( CHAR *Mode, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Mask )
{
/* Bestaetigung an Client schicken & andere Server sowie Channel-User informieren */
bool ok;
BOOLEAN ok;
if( Client_Type( Client ) == CLIENT_USER )
{
/* Bestaetigung an Client */
ok = IRC_WriteStrClientPrefix( Client, Prefix, "MODE %s %s %s", Channel_Name( Channel ), Mode, Mask );
}
else ok = true;
else ok = TRUE;
/* an andere Server */
IRC_WriteStrServersPrefix( Client, Prefix, "MODE %s %s %s", Channel_Name( Channel ), Mode, Mask );
/* und lokale User im Channel */
IRC_WriteStrChannelPrefix( Client, Channel, Prefix, false, "MODE %s %s %s", Channel_Name( Channel ), Mode, Mask );
IRC_WriteStrChannelPrefix( Client, Channel, Prefix, FALSE, "MODE %s %s %s", Channel_Name( Channel ), Mode, Mask );
return ok;
} /* Send_ListChange */

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: irc-mode.h,v 1.6 2005/03/19 18:43:48 fw Exp $
* $Id: irc-mode.h,v 1.5 2002/12/12 12:23:43 alex Exp $
*
* IRC commands for mode changes (header)
*/
@@ -18,8 +18,8 @@
#define __irc_mode_h__
GLOBAL bool IRC_MODE PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_AWAY PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_MODE PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_AWAY PARAMS((CLIENT *Client, REQUEST *Req ));
#endif

View File

@@ -1,6 +1,6 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001-2005 by Alexander Barton (alex@barton.de)
* Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -14,17 +14,17 @@
#include "portab.h"
static char UNUSED id[] = "$Id: irc-op.c,v 1.15 2005/04/27 07:39:18 alex Exp $";
static char UNUSED id[] = "$Id: irc-op.c,v 1.13 2004/04/09 21:41:52 alex Exp $";
#include "imp.h"
#include <assert.h>
#include <string.h>
#include <stdio.h>
#include "defines.h"
#include "conn.h"
#include "client.h"
#include "channel.h"
#include "defines.h"
#include "irc-write.h"
#include "lists.h"
#include "log.h"
@@ -35,7 +35,7 @@ static char UNUSED id[] = "$Id: irc-op.c,v 1.15 2005/04/27 07:39:18 alex Exp $";
#include "irc-op.h"
GLOBAL bool
GLOBAL BOOLEAN
IRC_KICK( CLIENT *Client, REQUEST *Req )
{
CLIENT *target, *from;
@@ -59,12 +59,12 @@ IRC_KICK( CLIENT *Client, REQUEST *Req )
} /* IRC_KICK */
GLOBAL bool
GLOBAL BOOLEAN
IRC_INVITE( CLIENT *Client, REQUEST *Req )
{
CHANNEL *chan;
CLIENT *target, *from;
bool remember = false;
BOOLEAN remember = FALSE;
assert( Client != NULL );
assert( Req != NULL );
@@ -92,19 +92,19 @@ IRC_INVITE( CLIENT *Client, REQUEST *Req )
{
/* Yes. The user must be channel operator! */
if( ! strchr( Channel_UserModes( chan, from ), 'o' )) return IRC_WriteStrClient( from, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( from ), Channel_Name( chan ));
remember = true;
remember = TRUE;
}
/* Is the target user already member of the channel? */
if( Channel_IsMemberOf( chan, target )) return IRC_WriteStrClient( from, ERR_USERONCHANNEL_MSG, Client_ID( from ), Req->argv[0], Req->argv[1] );
/* If the target user is banned on that channel: remember invite */
if( Lists_CheckBanned( target, chan )) remember = true;
if( Lists_CheckBanned( target, chan )) remember = TRUE;
if( remember )
{
/* We must memember this invite */
if( ! Lists_AddInvited( Client_Mask( target ), chan, true)) return CONNECTED;
if( ! Lists_AddInvited( Client_Mask( target ), chan, TRUE )) return CONNECTED;
}
}

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: irc-op.h,v 1.4 2005/03/19 18:43:48 fw Exp $
* $Id: irc-op.h,v 1.3 2002/12/12 12:23:43 alex Exp $
*
* Channel operator commands (header)
*/
@@ -18,8 +18,8 @@
#define __irc_op_h__
GLOBAL bool IRC_KICK PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_INVITE PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_KICK PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_INVITE PARAMS(( CLIENT *Client, REQUEST *Req ));
#endif

View File

@@ -14,7 +14,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: irc-oper.c,v 1.22 2005/06/12 18:02:09 fw Exp $";
static char UNUSED id[] = "$Id: irc-oper.c,v 1.17 2002/12/31 16:10:55 alex Exp $";
#include "imp.h"
#include <assert.h>
@@ -29,7 +29,6 @@ static char UNUSED id[] = "$Id: irc-oper.c,v 1.22 2005/06/12 18:02:09 fw Exp $";
#include "channel.h"
#include "irc-write.h"
#include "log.h"
#include "match.h"
#include "messages.h"
#include "parse.h"
@@ -37,20 +36,10 @@ static char UNUSED id[] = "$Id: irc-oper.c,v 1.22 2005/06/12 18:02:09 fw Exp $";
#include "irc-oper.h"
LOCAL bool
Bad_OperPass(CLIENT *Client, char *errtoken, char *errmsg)
{
Log( LOG_WARNING, "Got invalid OPER from \"%s\": \"%s\" -- %s", Client_Mask( Client ),
errtoken, errmsg);
IRC_SetPenalty(Client, 3);
return IRC_WriteStrClient( Client, ERR_PASSWDMISMATCH_MSG, Client_ID( Client ));
}
GLOBAL bool
GLOBAL BOOLEAN
IRC_OPER( CLIENT *Client, REQUEST *Req )
{
int i;
INT i;
assert( Client != NULL );
assert( Req != NULL );
@@ -64,15 +53,17 @@ IRC_OPER( CLIENT *Client, REQUEST *Req )
if( Conf_Oper[i].name[0] && Conf_Oper[i].pwd[0] && ( strcmp( Conf_Oper[i].name, Req->argv[0] ) == 0 )) break;
}
if( i >= Conf_Oper_Count )
return Bad_OperPass(Client, Req->argv[0], "not configured");
{
Log( LOG_WARNING, "Got invalid OPER from \"%s\": Name \"%s\" not configured!", Client_Mask( Client ), Req->argv[0] );
return IRC_WriteStrClient( Client, ERR_PASSWDMISMATCH_MSG, Client_ID( Client ));
}
/* Stimmt das Passwort? */
if( strcmp( Conf_Oper[i].pwd, Req->argv[1] ) != 0 )
return Bad_OperPass(Client, Conf_Oper[i].name, "Bad password");
/* Authorized Mask? */
if( Conf_Oper[i].mask && (! Match( Conf_Oper[i].mask, Client_Mask( Client ) )))
return Bad_OperPass(Client, Conf_Oper[i].mask, "hostmask check failed" );
{
Log( LOG_WARNING, "Got invalid OPER from \"%s\": Bad password for \"%s\"!", Client_Mask( Client ), Conf_Oper[i].name );
return IRC_WriteStrClient( Client, ERR_PASSWDMISMATCH_MSG, Client_ID( Client ));
}
if( ! Client_HasMode( Client, 'o' ))
{
@@ -84,12 +75,12 @@ IRC_OPER( CLIENT *Client, REQUEST *Req )
if( ! Client_OperByMe( Client )) Log( LOG_NOTICE|LOG_snotice, "Got valid OPER from \"%s\", user is an IRC operator now.", Client_Mask( Client ));
Client_SetOperByMe( Client, true);
Client_SetOperByMe( Client, TRUE );
return IRC_WriteStrClient( Client, RPL_YOUREOPER_MSG, Client_ID( Client ));
} /* IRC_OPER */
GLOBAL bool
GLOBAL BOOLEAN
IRC_DIE( CLIENT *Client, REQUEST *Req )
{
/* Shut down server */
@@ -104,12 +95,12 @@ IRC_DIE( CLIENT *Client, REQUEST *Req )
if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
Log( LOG_NOTICE|LOG_snotice, "Got DIE command from \"%s\" ...", Client_Mask( Client ));
NGIRCd_SignalQuit = true;
NGIRCd_SignalQuit = TRUE;
return CONNECTED;
} /* IRC_DIE */
GLOBAL bool
GLOBAL BOOLEAN
IRC_REHASH( CLIENT *Client, REQUEST *Req )
{
/* Reload configuration file */
@@ -124,13 +115,13 @@ IRC_REHASH( CLIENT *Client, REQUEST *Req )
if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
Log( LOG_NOTICE|LOG_snotice, "Got REHASH command from \"%s\" ...", Client_Mask( Client ));
NGIRCd_SignalRehash = true;
NGIRCd_SignalRehash = TRUE;
return CONNECTED;
} /* IRC_REHASH */
GLOBAL bool
GLOBAL BOOLEAN
IRC_RESTART( CLIENT *Client, REQUEST *Req )
{
/* Restart IRC server (fork a new process) */
@@ -145,12 +136,12 @@ IRC_RESTART( CLIENT *Client, REQUEST *Req )
if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
Log( LOG_NOTICE|LOG_snotice, "Got RESTART command from \"%s\" ...", Client_Mask( Client ));
NGIRCd_SignalRestart = true;
NGIRCd_SignalRestart = TRUE;
return CONNECTED;
} /* IRC_RESTART */
GLOBAL bool
GLOBAL BOOLEAN
IRC_CONNECT(CLIENT *Client, REQUEST *Req )
{
/* Connect configured or new server */
@@ -183,7 +174,7 @@ IRC_CONNECT(CLIENT *Client, REQUEST *Req )
} /* IRC_CONNECT */
GLOBAL bool
GLOBAL BOOLEAN
IRC_DISCONNECT(CLIENT *Client, REQUEST *Req )
{
/* Disconnect and disable configured server */

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: irc-oper.h,v 1.11 2005/03/19 18:43:48 fw Exp $
* $Id: irc-oper.h,v 1.10 2002/12/31 16:11:06 alex Exp $
*
* IRC operator commands (header)
*/
@@ -18,12 +18,12 @@
#define __irc_oper_h__
GLOBAL bool IRC_OPER PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_DIE PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_REHASH PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_RESTART PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_CONNECT PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_DISCONNECT PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_OPER PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_DIE PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_REHASH PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_RESTART PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_CONNECT PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_DISCONNECT PARAMS((CLIENT *Client, REQUEST *Req ));
#endif

View File

@@ -14,7 +14,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: irc-server.c,v 1.38 2005/03/19 18:43:49 fw Exp $";
static char UNUSED id[] = "$Id: irc-server.c,v 1.36.2.1 2004/05/15 23:52:17 alex Exp $";
#include "imp.h"
#include <assert.h>
@@ -41,15 +41,15 @@ static char UNUSED id[] = "$Id: irc-server.c,v 1.38 2005/03/19 18:43:49 fw Exp $
#include "irc-server.h"
GLOBAL bool
GLOBAL BOOLEAN
IRC_SERVER( CLIENT *Client, REQUEST *Req )
{
char str[LINE_LEN], *ptr, *modes, *topic;
CHAR str[LINE_LEN], *ptr, *modes, *topic;
CLIENT *from, *c, *cl;
CL2CHAN *cl2chan;
int max_hops, i;
INT max_hops, i;
CHANNEL *chan;
bool ok;
BOOLEAN ok;
CONN_ID con;
assert( Client != NULL );
@@ -72,14 +72,14 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
{
/* Server ist nicht konfiguriert! */
Log( LOG_ERR, "Connection %d: Server \"%s\" not configured here!", Client_Conn( Client ), Req->argv[0] );
Conn_Close( Client_Conn( Client ), NULL, "Server not configured here", true);
Conn_Close( Client_Conn( Client ), NULL, "Server not configured here", TRUE );
return DISCONNECTED;
}
if( strcmp( Client_Password( Client ), Conf_Server[i].pwd_in ) != 0 )
{
/* Falsches Passwort */
Log( LOG_ERR, "Connection %d: Got bad password from server \"%s\"!", Client_Conn( Client ), Req->argv[0] );
Conn_Close( Client_Conn( Client ), NULL, "Bad password", true);
Conn_Close( Client_Conn( Client ), NULL, "Bad password", TRUE );
return DISCONNECTED;
}
@@ -97,12 +97,12 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
if( Client_Token( Client ) != TOKEN_OUTBOUND )
{
/* Eingehende Verbindung: Unseren SERVER- und PASS-Befehl senden */
ok = true;
if( ! IRC_WriteStrClient( Client, "PASS %s %s", Conf_Server[i].pwd_out, NGIRCd_ProtoID )) ok = false;
ok = TRUE;
if( ! IRC_WriteStrClient( Client, "PASS %s %s", Conf_Server[i].pwd_out, NGIRCd_ProtoID )) ok = FALSE;
else ok = IRC_WriteStrClient( Client, "SERVER %s 1 :%s", Conf_ServerName, Conf_ServerInfo );
if( ! ok )
{
Conn_Close( con, "Unexpected server behavior!", NULL, false );
Conn_Close( con, "Unexpected server behavior!", NULL, FALSE );
return DISCONNECTED;
}
Client_SetIntroducer( Client, Client );
@@ -127,7 +127,7 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
if( ! Zip_InitConn( con ))
{
/* Fehler! */
Conn_Close( con, "Can't inizialize compression (zlib)!", NULL, false );
Conn_Close( con, "Can't inizialize compression (zlib)!", NULL, FALSE );
return DISCONNECTED;
}
}
@@ -281,17 +281,17 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
{
/* Hm, Server, der diesen einfuehrt, ist nicht bekannt!? */
Log( LOG_ALERT, "Unknown ID in prefix of SERVER: \"%s\"! (on connection %d)", Req->prefix, Client_Conn( Client ));
Conn_Close( Client_Conn( Client ), NULL, "Unknown ID in prefix of SERVER", true);
Conn_Close( Client_Conn( Client ), NULL, "Unknown ID in prefix of SERVER", TRUE );
return DISCONNECTED;
}
/* Neue Client-Struktur anlegen */
c = Client_NewRemoteServer( Client, Req->argv[0], from, atoi( Req->argv[1] ), atoi( Req->argv[2] ), ptr, true);
c = Client_NewRemoteServer( Client, Req->argv[0], from, atoi( Req->argv[1] ), atoi( Req->argv[2] ), ptr, TRUE );
if( ! c )
{
/* Neue Client-Struktur konnte nicht angelegt werden */
Log( LOG_ALERT, "Can't create client structure for server! (on connection %d)", Client_Conn( Client ));
Conn_Close( Client_Conn( Client ), NULL, "Can't allocate client structure for remote server", true);
Conn_Close( Client_Conn( Client ), NULL, "Can't allocate client structure for remote server", TRUE );
return DISCONNECTED;
}
@@ -309,11 +309,11 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
} /* IRC_SERVER */
GLOBAL bool
GLOBAL BOOLEAN
IRC_NJOIN( CLIENT *Client, REQUEST *Req )
{
char nick_in[COMMAND_LEN], nick_out[COMMAND_LEN], *channame, *ptr, modes[8];
bool is_op, is_voiced;
CHAR nick_in[COMMAND_LEN], nick_out[COMMAND_LEN], *channame, *ptr, modes[8];
BOOLEAN is_op, is_voiced;
CHANNEL *chan;
CLIENT *c;
@@ -330,13 +330,13 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req )
ptr = strtok( nick_in, "," );
while( ptr )
{
is_op = is_voiced = false;
is_op = is_voiced = FALSE;
/* Prefixe abschneiden */
while(( *ptr == '@' ) || ( *ptr == '+' ))
{
if( *ptr == '@' ) is_op = true;
if( *ptr == '+' ) is_voiced = true;
if( *ptr == '@' ) is_op = TRUE;
if( *ptr == '+' ) is_voiced = TRUE;
ptr++;
}
@@ -351,14 +351,14 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req )
if( is_voiced ) Channel_UserModeAdd( chan, c, 'v' );
/* im Channel bekannt machen */
IRC_WriteStrChannelPrefix( Client, chan, c, false, "JOIN :%s", channame );
IRC_WriteStrChannelPrefix( Client, chan, c, FALSE, "JOIN :%s", channame );
/* Channel-User-Modes setzen */
strlcpy( modes, Channel_UserModes( chan, c ), sizeof( modes ));
if( modes[0] )
{
/* Modes im Channel bekannt machen */
IRC_WriteStrChannelPrefix( Client, chan, Client, false, "MODE %s +%s %s", channame, modes, Client_ID( c ));
IRC_WriteStrChannelPrefix( Client, chan, Client, FALSE, "MODE %s +%s %s", channame, modes, Client_ID( c ));
}
if( nick_out[0] != '\0' ) strlcat( nick_out, ",", sizeof( nick_out ));
@@ -379,11 +379,11 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req )
} /* IRC_NJOIN */
GLOBAL bool
GLOBAL BOOLEAN
IRC_SQUIT( CLIENT *Client, REQUEST *Req )
{
CLIENT *target;
char msg[LINE_LEN + 64];
CHAR msg[LINE_LEN + 64];
assert( Client != NULL );
assert( Req != NULL );
@@ -411,14 +411,14 @@ IRC_SQUIT( CLIENT *Client, REQUEST *Req )
if( Client_Conn( target ) > NONE )
{
/* dieser Server hat die Connection */
if( Req->argv[1][0] ) Conn_Close( Client_Conn( target ), msg, Req->argv[1], true);
else Conn_Close( Client_Conn( target ), msg, NULL, true);
if( Req->argv[1][0] ) Conn_Close( Client_Conn( target ), msg, Req->argv[1], TRUE );
else Conn_Close( Client_Conn( target ), msg, NULL, TRUE );
return DISCONNECTED;
}
else
{
/* Verbindung hielt anderer Server */
Client_Destroy( target, msg, Req->argv[1], false );
Client_Destroy( target, msg, Req->argv[1], FALSE );
return CONNECTED;
}
} /* IRC_SQUIT */

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: irc-server.h,v 1.5 2005/03/19 18:43:49 fw Exp $
* $Id: irc-server.h,v 1.4 2002/12/12 12:23:43 alex Exp $
*
* IRC commands for server links (header)
*/
@@ -18,9 +18,9 @@
#define __irc_server_h__
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 BOOLEAN IRC_SERVER PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_NJOIN PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_SQUIT PARAMS((CLIENT *Client, REQUEST *Req ));
#endif

View File

@@ -1,6 +1,6 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001-2005 by Alexander Barton (alex@barton.de)
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -14,22 +14,18 @@
#include "portab.h"
static char UNUSED id[] = "$Id: irc-write.c,v 1.18 2005/04/27 07:39:18 alex Exp $";
static char UNUSED id[] = "$Id: irc-write.c,v 1.15 2003/11/05 23:24:48 alex Exp $";
#include "imp.h"
#include <assert.h>
#ifdef PROTOTYPES
# include <stdarg.h>
#else
# include <varargs.h>
#endif
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include "defines.h"
#include "conn-func.h"
#include "client.h"
#include "channel.h"
#include "defines.h"
#include "exp.h"
#include "irc-write.h"
@@ -39,22 +35,22 @@ static char UNUSED id[] = "$Id: irc-write.c,v 1.18 2005/04/27 07:39:18 alex Exp
#define SEND_TO_SERVER 2
LOCAL char *Get_Prefix PARAMS(( CLIENT *Target, CLIENT *Client ));
LOCAL CHAR *Get_Prefix PARAMS(( CLIENT *Target, CLIENT *Client ));
#ifdef PROTOTYPES
GLOBAL bool
IRC_WriteStrClient( CLIENT *Client, char *Format, ... )
GLOBAL BOOLEAN
IRC_WriteStrClient( CLIENT *Client, CHAR *Format, ... )
#else
GLOBAL bool
GLOBAL BOOLEAN
IRC_WriteStrClient( Client, Format, va_alist )
CLIENT *Client;
char *Format;
CHAR *Format;
va_dcl
#endif
{
char buffer[1000];
bool ok = CONNECTED;
CHAR buffer[1000];
BOOLEAN ok = CONNECTED;
va_list ap;
assert( Client != NULL );
@@ -76,20 +72,20 @@ va_dcl
#ifdef PROTOTYPES
GLOBAL bool
IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, char *Format, ... )
GLOBAL BOOLEAN
IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, CHAR *Format, ... )
#else
GLOBAL bool
GLOBAL BOOLEAN
IRC_WriteStrClientPrefix( Client, Prefix, Format, va_alist )
CLIENT *Client;
CLIENT *Prefix;
char *Format;
CHAR *Format;
va_dcl
#endif
{
/* Text an Clients, lokal bzw. remote, senden. */
char buffer[1000];
CHAR buffer[1000];
va_list ap;
assert( Client != NULL );
@@ -109,19 +105,19 @@ va_dcl
#ifdef PROTOTYPES
GLOBAL bool
IRC_WriteStrChannel( CLIENT *Client, CHANNEL *Chan, bool Remote, char *Format, ... )
GLOBAL BOOLEAN
IRC_WriteStrChannel( CLIENT *Client, CHANNEL *Chan, BOOLEAN Remote, CHAR *Format, ... )
#else
GLOBAL bool
GLOBAL BOOLEAN
IRC_WriteStrChannel( Client, Chan, Remote, Format, va_alist )
CLIENT *Client;
CHANNEL *Chan;
bool Remote;
char *Format;
BOOLEAN Remote;
CHAR *Format;
va_dcl
#endif
{
char buffer[1000];
CHAR buffer[1000];
va_list ap;
assert( Client != NULL );
@@ -140,21 +136,21 @@ va_dcl
#ifdef PROTOTYPES
GLOBAL bool
IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, bool Remote, char *Format, ... )
GLOBAL BOOLEAN
IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )
#else
GLOBAL bool
GLOBAL BOOLEAN
IRC_WriteStrChannelPrefix( Client, Chan, Prefix, Remote, Format, va_alist )
CLIENT *Client;
CHANNEL *Chan;
CLIENT *Prefix;
bool Remote;
char *Format;
BOOLEAN Remote;
CHAR *Format;
va_dcl
#endif
{
bool ok = CONNECTED;
char buffer[1000];
BOOLEAN ok = CONNECTED;
CHAR buffer[1000];
CL2CHAN *cl2chan;
CONN_ID conn;
CLIENT *c;
@@ -216,17 +212,17 @@ va_dcl
#ifdef PROTOTYPES
GLOBAL void
IRC_WriteStrServers( CLIENT *ExceptOf, char *Format, ... )
GLOBAL VOID
IRC_WriteStrServers( CLIENT *ExceptOf, CHAR *Format, ... )
#else
GLOBAL void
GLOBAL VOID
IRC_WriteStrServers( ExceptOf, Format, va_alist )
CLIENT *ExceptOf;
char *Format;
CHAR *Format;
va_dcl
#endif
{
char buffer[1000];
CHAR buffer[1000];
va_list ap;
assert( Format != NULL );
@@ -245,18 +241,18 @@ va_dcl
#ifdef PROTOTYPES
GLOBAL void
IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, char *Format, ... )
GLOBAL VOID
IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *Format, ... )
#else
GLOBAL void
GLOBAL VOID
IRC_WriteStrServersPrefix( ExceptOf, Prefix, Format, va_alist )
CLIENT *ExceptOf;
CLIENT *Prefix;
char *Format;
CHAR *Format;
va_dcl
#endif
{
char buffer[1000];
CHAR buffer[1000];
va_list ap;
assert( Format != NULL );
@@ -275,19 +271,19 @@ va_dcl
#ifdef PROTOTYPES
GLOBAL void
IRC_WriteStrServersPrefixFlag( CLIENT *ExceptOf, CLIENT *Prefix, char Flag, char *Format, ... )
GLOBAL VOID
IRC_WriteStrServersPrefixFlag( CLIENT *ExceptOf, CLIENT *Prefix, CHAR Flag, CHAR *Format, ... )
#else
GLOBAL void
GLOBAL VOID
IRC_WriteStrServersPrefixFlag( ExceptOf, Prefix, Flag, Format, va_alist )
CLIENT *ExceptOf;
CLIENT *Prefix;
char Flag;
char *Format;
CHAR Flag;
CHAR *Format;
va_dcl
#endif
{
char buffer[1000];
CHAR buffer[1000];
CLIENT *c;
va_list ap;
@@ -316,21 +312,21 @@ va_dcl
#ifdef PROTOTYPES
GLOBAL bool
IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, bool Remote, char *Format, ... )
GLOBAL BOOLEAN
IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )
#else
GLOBAL bool
GLOBAL BOOLEAN
IRC_WriteStrRelatedPrefix( Client, Prefix, Remote, Format, va_alist )
CLIENT *Client;
CLIENT *Prefix;
bool Remote;
char *Format;
BOOLEAN Remote;
CHAR *Format;
va_dcl
#endif
{
bool ok = CONNECTED;
BOOLEAN ok = CONNECTED;
CL2CHAN *chan_cl2chan, *cl2chan;
char buffer[1000];
CHAR buffer[1000];
CHANNEL *chan;
CONN_ID conn;
va_list ap;
@@ -399,8 +395,8 @@ va_dcl
} /* IRC_WriteStrRelatedPrefix */
GLOBAL void
IRC_SetPenalty( CLIENT *Client, int Seconds )
GLOBAL VOID
IRC_SetPenalty( CLIENT *Client, INT Seconds )
{
CONN_ID c;
@@ -414,7 +410,7 @@ IRC_SetPenalty( CLIENT *Client, int Seconds )
} /* IRC_SetPenalty */
LOCAL char *
LOCAL CHAR *
Get_Prefix( CLIENT *Target, CLIENT *Client )
{
assert( Target != NULL );

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: irc-write.h,v 1.7 2005/03/19 18:43:49 fw Exp $
* $Id: irc-write.h,v 1.6 2003/11/05 23:24:48 alex Exp $
*
* Sending IRC commands over the network (header)
*/
@@ -18,19 +18,19 @@
#define __irc_write_h__
GLOBAL bool IRC_WriteStrClient PARAMS(( CLIENT *Client, char *Format, ... ));
GLOBAL bool IRC_WriteStrClientPrefix PARAMS(( CLIENT *Client, CLIENT *Prefix, char *Format, ... ));
GLOBAL BOOLEAN IRC_WriteStrClient PARAMS(( CLIENT *Client, CHAR *Format, ... ));
GLOBAL BOOLEAN IRC_WriteStrClientPrefix PARAMS(( CLIENT *Client, CLIENT *Prefix, CHAR *Format, ... ));
GLOBAL bool IRC_WriteStrChannel PARAMS(( CLIENT *Client, CHANNEL *Chan, bool Remote, char *Format, ... ));
GLOBAL bool IRC_WriteStrChannelPrefix PARAMS(( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, bool Remote, char *Format, ... ));
GLOBAL BOOLEAN IRC_WriteStrChannel PARAMS(( CLIENT *Client, CHANNEL *Chan, BOOLEAN Remote, CHAR *Format, ... ));
GLOBAL BOOLEAN IRC_WriteStrChannelPrefix PARAMS(( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... ));
GLOBAL void IRC_WriteStrServers PARAMS(( CLIENT *ExceptOf, char *Format, ... ));
GLOBAL void IRC_WriteStrServersPrefix PARAMS(( CLIENT *ExceptOf, CLIENT *Prefix, char *Format, ... ));
GLOBAL void IRC_WriteStrServersPrefixFlag PARAMS(( CLIENT *ExceptOf, CLIENT *Prefix, char Flag, char *Format, ... ));
GLOBAL VOID IRC_WriteStrServers PARAMS(( CLIENT *ExceptOf, CHAR *Format, ... ));
GLOBAL VOID IRC_WriteStrServersPrefix PARAMS(( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *Format, ... ));
GLOBAL VOID IRC_WriteStrServersPrefixFlag PARAMS(( CLIENT *ExceptOf, CLIENT *Prefix, CHAR Flag, CHAR *Format, ... ));
GLOBAL bool IRC_WriteStrRelatedPrefix PARAMS(( CLIENT *Client, CLIENT *Prefix, bool Remote, char *Format, ... ));
GLOBAL BOOLEAN IRC_WriteStrRelatedPrefix PARAMS(( CLIENT *Client, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... ));
GLOBAL void IRC_SetPenalty PARAMS(( CLIENT *Client, int Seconds ));
GLOBAL VOID IRC_SetPenalty PARAMS(( CLIENT *Client, INT Seconds ));
#endif

View File

@@ -14,7 +14,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: irc.c,v 1.126.2.1 2005/08/02 23:08:27 alex Exp $";
static char UNUSED id[] = "$Id: irc.c,v 1.124 2004/02/28 02:18:16 alex Exp $";
#include "imp.h"
#include <assert.h>
@@ -38,10 +38,10 @@ static char UNUSED id[] = "$Id: irc.c,v 1.126.2.1 2005/08/02 23:08:27 alex Exp $
#include "irc.h"
LOCAL char *Option_String PARAMS(( CONN_ID Idx ));
LOCAL CHAR *Option_String PARAMS(( CONN_ID Idx ));
GLOBAL bool
GLOBAL BOOLEAN
IRC_ERROR( CLIENT *Client, REQUEST *Req )
{
assert( Client != NULL );
@@ -54,120 +54,88 @@ IRC_ERROR( CLIENT *Client, REQUEST *Req )
} /* IRC_ERROR */
/**
* Kill client on request.
* This function implements the IRC command "KILL" wich is used to selectively
* disconnect clients. It can be used by IRC operators and servers, for example
* to "solve" nick collisions after netsplits.
* Please note that this function is also called internally, without a real
* KILL command beeing received over the network! Client is Client_ThisServer()
* in this case. */
GLOBAL bool
GLOBAL BOOLEAN
IRC_KILL( CLIENT *Client, REQUEST *Req )
{
CLIENT *prefix, *c;
char reason[COMMAND_LEN], *msg;
CHAR reason[COMMAND_LEN];
CONN_ID my_conn, conn;
assert( Client != NULL );
assert( Req != NULL );
if(( Client_Type( Client ) != CLIENT_SERVER ) &&
( ! Client_OperByMe( Client )))
{
/* The originator of the KILL is neither an IRC operator of
* this server nor a server. */
return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG,
Client_ID( Client ));
}
/* Is the user an IRC operator? */
if(( Client_Type( Client ) != CLIENT_SERVER ) && ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
if( Req->argc != 2 )
{
/* This command requires exactly 2 parameters! */
return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG,
Client_ID( Client ), Req->command );
}
/* Bad number of parameters? */
if(( Req->argc != 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
if( Req->prefix ) prefix = Client_Search( Req->prefix );
else prefix = Client;
if( ! prefix )
{
Log( LOG_WARNING, "Got KILL with invalid prefix: \"%s\"!",
Req->prefix );
Log( LOG_WARNING, "Got KILL with invalid prefix: \"%s\"!", Req->prefix );
prefix = Client_ThisServer( );
}
if( Client != Client_ThisServer( ))
{
/* This is a "real" KILL received from the network. */
Log( LOG_NOTICE|LOG_snotice, "Got KILL command from \"%s\" for \"%s\": %s",
Client_Mask( prefix ), Req->argv[0], Req->argv[1] );
}
if( Client != Client_ThisServer( )) Log( LOG_NOTICE|LOG_snotice, "Got KILL command from \"%s\" for \"%s\": %s", Client_Mask( prefix ), Req->argv[0], Req->argv[1] );
/* Build reason string */
if( Client_Type( Client ) == CLIENT_USER )
{
/* Prefix the "reason" if the originator is a regular user,
* so users can't spoof KILLs of servers. */
snprintf( reason, sizeof( reason ), "KILLed by %s: %s",
Client_ID( Client ), Req->argv[1] );
}
else
strlcpy( reason, Req->argv[1], sizeof( reason ));
if( Client_Type( Client ) == CLIENT_USER ) snprintf( reason, sizeof( reason ), "KILLed by %s: %s", Client_ID( Client ), Req->argv[1] );
else strlcpy( reason, Req->argv[1], sizeof( reason ));
/* Inform other servers */
IRC_WriteStrServersPrefix( Client, prefix, "KILL %s :%s",
Req->argv[0], reason );
IRC_WriteStrServersPrefix( Client, prefix, "KILL %s :%s", Req->argv[0], reason );
/* Save ID of this connection */
my_conn = Client_Conn( Client );
/* Do we host such a client? */
c = Client_Search( Req->argv[0] );
if( c )
{
if(( Client_Type( c ) != CLIENT_USER ) &&
( Client_Type( c ) != CLIENT_GOTNICK ))
/* Yes, there is such a client -- but is it a valid user? */
if( Client_Type( c ) == CLIENT_SERVER )
{
/* Target of this KILL is not a regular user, this is
* invalid! So we ignore this case if we received a
* regular KILL from the network and try to kill the
* client/connection anyway (but log an error!) if the
* origin is the local server. */
if( Client != Client_ThisServer( ))
if( Client != Client_ThisServer( )) IRC_WriteStrClient( Client, ERR_CANTKILLSERVER_MSG, Client_ID( Client ));
else
{
/* Invalid KILL received from remote */
if( Client_Type( c ) == CLIENT_SERVER )
msg = ERR_CANTKILLSERVER_MSG;
else
msg = ERR_NOPRIVILEGES_MSG;
return IRC_WriteStrClient( Client, msg,
Client_ID( Client ));
/* Oops, I should kill another server!? */
Log( LOG_ERR, "Can't KILL server \"%s\"!", Req->argv[0] );
conn = Client_Conn( Client_NextHop( c ));
assert( conn > NONE );
Conn_Close( conn, NULL, "Nick collision for server!?", TRUE );
}
Log( LOG_ERR, "Got KILL for invalid client type: %d, \"%s\"!",
Client_Type( c ), Req->argv[0] );
}
/* Kill client NOW! */
conn = Client_Conn( c );
Client_Destroy( c, NULL, reason, false );
if( conn > NONE )
Conn_Close( conn, NULL, reason, true );
else if( Client_Type( c ) != CLIENT_USER )
{
if( Client != Client_ThisServer( )) IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
else
{
/* Oops, what sould I close?? */
Log( LOG_ERR, "Can't KILL \"%s\": invalid client type!", Req->argv[0] );
conn = Client_Conn( Client_NextHop( c ));
assert( conn > NONE );
Conn_Close( conn, NULL, "Collision for invalid client type!?", TRUE );
}
}
else
{
/* Kill user NOW! */
conn = Client_Conn( c );
Client_Destroy( c, NULL, reason, FALSE );
if( conn != NONE ) Conn_Close( conn, NULL, reason, TRUE );
}
}
else
Log( LOG_NOTICE, "Client with nick \"%s\" is unknown here.", Req->argv[0] );
else Log( LOG_NOTICE, "Client with nick \"%s\" is unknown here.", Req->argv[0] );
/* Are we still connected or were we killed, too? */
if(( my_conn > NONE ) && ( Client_GetFromConn( my_conn )))
return CONNECTED;
else
return DISCONNECTED;
if(( my_conn > NONE ) && ( Client_GetFromConn( my_conn ))) return CONNECTED;
else return DISCONNECTED;
} /* IRC_KILL */
GLOBAL bool
GLOBAL BOOLEAN
IRC_NOTICE( CLIENT *Client, REQUEST *Req )
{
CLIENT *to, *from;
@@ -194,7 +162,7 @@ IRC_NOTICE( CLIENT *Client, REQUEST *Req )
} /* IRC_NOTICE */
GLOBAL bool
GLOBAL BOOLEAN
IRC_PRIVMSG( CLIENT *Client, REQUEST *Req )
{
CLIENT *cl, *from;
@@ -237,12 +205,12 @@ IRC_PRIVMSG( CLIENT *Client, REQUEST *Req )
} /* IRC_PRIVMSG */
GLOBAL bool
GLOBAL BOOLEAN
IRC_TRACE( CLIENT *Client, REQUEST *Req )
{
CLIENT *from, *target, *c;
CONN_ID idx, idx2;
char user[CLIENT_USER_LEN];
CHAR user[CLIENT_USER_LEN];
assert( Client != NULL );
assert( Req != NULL );
@@ -302,7 +270,7 @@ IRC_TRACE( CLIENT *Client, REQUEST *Req )
} /* IRC_TRACE */
GLOBAL bool
GLOBAL BOOLEAN
IRC_HELP( CLIENT *Client, REQUEST *Req )
{
COMMAND *cmd;
@@ -325,11 +293,11 @@ IRC_HELP( CLIENT *Client, REQUEST *Req )
} /* IRC_HELP */
LOCAL char *
LOCAL CHAR *
Option_String( CONN_ID Idx )
{
static char option_txt[8];
int options;
STATIC CHAR option_txt[8];
INT options;
options = Conn_Options( Idx );

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: irc.h,v 1.39 2005/03/19 18:43:49 fw Exp $
* $Id: irc.h,v 1.38 2003/01/15 13:49:20 alex Exp $
*
* IRC commands (header)
*/
@@ -18,12 +18,12 @@
#define __irc_h__
GLOBAL bool IRC_ERROR PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_KILL PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_NOTICE PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_PRIVMSG PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_TRACE PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_HELP PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_ERROR PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_KILL PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_NOTICE PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_PRIVMSG PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_TRACE PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL BOOLEAN IRC_HELP PARAMS(( CLIENT *Client, REQUEST *Req ));
#endif

View File

@@ -14,7 +14,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: lists.c,v 1.17 2005/03/19 18:43:49 fw Exp $";
static char UNUSED id[] = "$Id: lists.c,v 1.15.2.1 2005/01/26 13:27:01 alex Exp $";
#include "imp.h"
#include <assert.h>
@@ -42,24 +42,24 @@ static char UNUSED id[] = "$Id: lists.c,v 1.17 2005/03/19 18:43:49 fw Exp $";
typedef struct _C2C
{
struct _C2C *next;
char mask[MASK_LEN];
CHAR mask[MASK_LEN];
CHANNEL *channel;
bool onlyonce;
BOOLEAN onlyonce;
} C2C;
LOCAL C2C *My_Invites, *My_Bans;
LOCAL C2C *New_C2C PARAMS(( char *Mask, CHANNEL *Chan, bool OnlyOnce ));
LOCAL C2C *New_C2C PARAMS(( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce ));
LOCAL bool Check_List PARAMS(( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan ));
LOCAL bool Already_Registered PARAMS(( C2C *Cl2Chan, char *Mask, CHANNEL *Chan ));
LOCAL BOOLEAN Check_List PARAMS(( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan ));
LOCAL BOOLEAN Already_Registered PARAMS(( C2C *Cl2Chan, CHAR *Mask, CHANNEL *Chan ));
GLOBAL void
Lists_Init( void )
GLOBAL VOID
Lists_Init( VOID )
{
/* Modul initialisieren */
@@ -67,8 +67,8 @@ Lists_Init( void )
} /* Lists_Init */
GLOBAL void
Lists_Exit( void )
GLOBAL VOID
Lists_Exit( VOID )
{
/* Modul abmelden */
@@ -94,15 +94,15 @@ Lists_Exit( void )
} /* Lists_Exit */
GLOBAL bool
GLOBAL BOOLEAN
Lists_CheckInvited( CLIENT *Client, CHANNEL *Chan )
{
return Check_List( &My_Invites, Client, Chan );
} /* Lists_CheckInvited */
GLOBAL bool
Lists_IsInviteEntry( char *Mask, CHANNEL *Chan )
GLOBAL BOOLEAN
Lists_IsInviteEntry( CHAR *Mask, CHANNEL *Chan )
{
assert( Mask != NULL );
assert( Chan != NULL );
@@ -111,21 +111,21 @@ Lists_IsInviteEntry( char *Mask, CHANNEL *Chan )
} /* Lists_IsInviteEntry */
GLOBAL bool
Lists_AddInvited( char *Mask, CHANNEL *Chan, bool OnlyOnce )
GLOBAL BOOLEAN
Lists_AddInvited( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce )
{
C2C *c2c;
assert( Mask != NULL );
assert( Chan != NULL );
if( Already_Registered( My_Invites, Mask, Chan )) return true;
if( Already_Registered( My_Invites, Mask, Chan )) return TRUE;
c2c = New_C2C( Mask, Chan, OnlyOnce );
if( ! c2c )
{
Log( LOG_ERR, "Can't add new invite list entry!" );
return false;
return FALSE;
}
/* verketten */
@@ -133,12 +133,12 @@ Lists_AddInvited( char *Mask, CHANNEL *Chan, bool OnlyOnce )
My_Invites = c2c;
Log( LOG_DEBUG, "Added \"%s\" to invite list for \"%s\".", Mask, Channel_Name( Chan ));
return true;
return TRUE;
} /* Lists_AddInvited */
GLOBAL void
Lists_DelInvited( char *Mask, CHANNEL *Chan )
GLOBAL VOID
Lists_DelInvited( CHAR *Mask, CHANNEL *Chan )
{
C2C *c2c, *last, *next;
@@ -164,7 +164,7 @@ Lists_DelInvited( char *Mask, CHANNEL *Chan )
} /* Lists_DelInvited */
GLOBAL bool
GLOBAL BOOLEAN
Lists_ShowInvites( CLIENT *Client, CHANNEL *Channel )
{
C2C *c2c;
@@ -186,7 +186,7 @@ Lists_ShowInvites( CLIENT *Client, CHANNEL *Channel )
} /* Lists_ShowInvites */
GLOBAL bool
GLOBAL BOOLEAN
Lists_SendInvites( CLIENT *Client )
{
C2C *c2c;
@@ -203,7 +203,7 @@ Lists_SendInvites( CLIENT *Client )
} /* Lists_SendInvites */
GLOBAL bool
GLOBAL BOOLEAN
Lists_SendBans( CLIENT *Client )
{
C2C *c2c;
@@ -220,15 +220,15 @@ Lists_SendBans( CLIENT *Client )
} /* Lists_SendBans */
GLOBAL bool
GLOBAL BOOLEAN
Lists_CheckBanned( CLIENT *Client, CHANNEL *Chan )
{
return Check_List( &My_Bans, Client, Chan );
} /* Lists_CheckBanned */
GLOBAL bool
Lists_IsBanEntry( char *Mask, CHANNEL *Chan )
GLOBAL BOOLEAN
Lists_IsBanEntry( CHAR *Mask, CHANNEL *Chan )
{
assert( Mask != NULL );
assert( Chan != NULL );
@@ -237,21 +237,21 @@ Lists_IsBanEntry( char *Mask, CHANNEL *Chan )
} /* Lists_IsBanEntry */
GLOBAL bool
Lists_AddBanned( char *Mask, CHANNEL *Chan )
GLOBAL BOOLEAN
Lists_AddBanned( CHAR *Mask, CHANNEL *Chan )
{
C2C *c2c;
assert( Mask != NULL );
assert( Chan != NULL );
if( Already_Registered( My_Bans, Mask, Chan )) return true;
if( Already_Registered( My_Bans, Mask, Chan )) return TRUE;
c2c = New_C2C( Mask, Chan, false );
c2c = New_C2C( Mask, Chan, FALSE );
if( ! c2c )
{
Log( LOG_ERR, "Can't add new ban list entry!" );
return false;
return FALSE;
}
/* verketten */
@@ -259,12 +259,12 @@ Lists_AddBanned( char *Mask, CHANNEL *Chan )
My_Bans = c2c;
Log( LOG_DEBUG, "Added \"%s\" to ban list for \"%s\".", Mask, Channel_Name( Chan ));
return true;
return TRUE;
} /* Lists_AddBanned */
GLOBAL void
Lists_DelBanned( char *Mask, CHANNEL *Chan )
GLOBAL VOID
Lists_DelBanned( CHAR *Mask, CHANNEL *Chan )
{
C2C *c2c, *last, *next;
@@ -290,7 +290,7 @@ Lists_DelBanned( char *Mask, CHANNEL *Chan )
} /* Lists_DelBanned */
GLOBAL bool
GLOBAL BOOLEAN
Lists_ShowBans( CLIENT *Client, CHANNEL *Channel )
{
C2C *c2c;
@@ -312,7 +312,7 @@ Lists_ShowBans( CLIENT *Client, CHANNEL *Channel )
} /* Lists_ShowBans */
GLOBAL void
GLOBAL VOID
Lists_DeleteChannel( CHANNEL *Chan )
{
/* Channel wurde geloescht, Invite- und Ban-Lists aufraeumen */
@@ -357,16 +357,16 @@ Lists_DeleteChannel( CHANNEL *Chan )
} /* Lists_DeleteChannel */
GLOBAL char *
Lists_MakeMask( char *Pattern )
GLOBAL CHAR *
Lists_MakeMask( CHAR *Pattern )
{
/* This function generats a valid IRC mask of "any" string. This
* mask is only valid until the next call to Lists_MakeMask(),
* because a single global buffer is used. You have to copy the
* generated mask to some sane location yourself! */
static char TheMask[MASK_LEN];
char *excl, *at;
STATIC CHAR TheMask[MASK_LEN];
CHAR *excl, *at;
assert( Pattern != NULL );
@@ -408,7 +408,7 @@ Lists_MakeMask( char *Pattern )
LOCAL C2C *
New_C2C( char *Mask, CHANNEL *Chan, bool OnlyOnce )
New_C2C( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce )
{
C2C *c2c;
@@ -431,7 +431,7 @@ New_C2C( char *Mask, CHANNEL *Chan, bool OnlyOnce )
} /* New_C2C */
LOCAL bool
LOCAL BOOLEAN
Check_List( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan )
{
C2C *c2c, *last;
@@ -459,29 +459,29 @@ Check_List( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan )
else *Cl2Chan = c2c->next;
free( c2c );
}
return true;
return TRUE;
}
}
last = c2c;
c2c = c2c->next;
}
return false;
return FALSE;
} /* Check_List */
LOCAL bool
Already_Registered( C2C *List, char *Mask, CHANNEL *Chan )
LOCAL BOOLEAN
Already_Registered( C2C *List, CHAR *Mask, CHANNEL *Chan )
{
C2C *c2c;
c2c = List;
while( c2c )
{
if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 )) return true;
if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 )) return TRUE;
c2c = c2c->next;
}
return false;
return FALSE;
} /* Already_Registered */

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: lists.h,v 1.12 2005/03/19 18:43:49 fw Exp $
* $Id: lists.h,v 1.11 2004/04/25 15:40:19 alex Exp $
*
* Management of IRC lists: ban, invite, ... (header)
*/
@@ -18,26 +18,26 @@
#define __lists_h__
GLOBAL void Lists_Init PARAMS(( void ));
GLOBAL void Lists_Exit PARAMS(( void ));
GLOBAL VOID Lists_Init PARAMS(( VOID ));
GLOBAL VOID Lists_Exit PARAMS(( VOID ));
GLOBAL bool Lists_CheckInvited PARAMS(( CLIENT *Client, CHANNEL *Chan ));
GLOBAL bool Lists_AddInvited PARAMS(( char *Mask, CHANNEL *Chan, bool OnlyOnce ));
GLOBAL void Lists_DelInvited PARAMS(( char *Mask, CHANNEL *Chan ));
GLOBAL bool Lists_ShowInvites PARAMS(( CLIENT *Client, CHANNEL *Channel ));
GLOBAL bool Lists_SendInvites PARAMS(( CLIENT *Client ));
GLOBAL bool Lists_IsInviteEntry PARAMS(( char *Mask, CHANNEL *Chan ));
GLOBAL BOOLEAN Lists_CheckInvited PARAMS(( CLIENT *Client, CHANNEL *Chan ));
GLOBAL BOOLEAN Lists_AddInvited PARAMS(( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce ));
GLOBAL VOID Lists_DelInvited PARAMS(( CHAR *Mask, CHANNEL *Chan ));
GLOBAL BOOLEAN Lists_ShowInvites PARAMS(( CLIENT *Client, CHANNEL *Channel ));
GLOBAL BOOLEAN Lists_SendInvites PARAMS(( CLIENT *Client ));
GLOBAL BOOLEAN Lists_IsInviteEntry PARAMS(( CHAR *Mask, CHANNEL *Chan ));
GLOBAL bool Lists_CheckBanned PARAMS(( CLIENT *Client, CHANNEL *Chan ));
GLOBAL bool Lists_AddBanned PARAMS(( char *Mask, CHANNEL *Chan ));
GLOBAL void Lists_DelBanned PARAMS(( char *Mask, CHANNEL *Chan ));
GLOBAL bool Lists_ShowBans PARAMS(( CLIENT *Client, CHANNEL *Channel ));
GLOBAL bool Lists_SendBans PARAMS(( CLIENT *Client ));
GLOBAL bool Lists_IsBanEntry PARAMS(( char *Mask, CHANNEL *Chan ));
GLOBAL BOOLEAN Lists_CheckBanned PARAMS(( CLIENT *Client, CHANNEL *Chan ));
GLOBAL BOOLEAN Lists_AddBanned PARAMS(( CHAR *Mask, CHANNEL *Chan ));
GLOBAL VOID Lists_DelBanned PARAMS(( CHAR *Mask, CHANNEL *Chan ));
GLOBAL BOOLEAN Lists_ShowBans PARAMS(( CLIENT *Client, CHANNEL *Channel ));
GLOBAL BOOLEAN Lists_SendBans PARAMS(( CLIENT *Client ));
GLOBAL BOOLEAN Lists_IsBanEntry PARAMS(( CHAR *Mask, CHANNEL *Chan ));
GLOBAL void Lists_DeleteChannel PARAMS(( CHANNEL *Chan ));
GLOBAL VOID Lists_DeleteChannel PARAMS(( CHANNEL *Chan ));
GLOBAL char *Lists_MakeMask PARAMS(( char *Pattern ));
GLOBAL CHAR *Lists_MakeMask PARAMS(( CHAR *Pattern ));
#endif

View File

@@ -1,6 +1,6 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001-2005 Alexander Barton (alex@barton.de)
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -14,16 +14,12 @@
#include "portab.h"
static char UNUSED id[] = "$Id: log.c,v 1.57.2.2 2006/02/08 21:23:21 fw Exp $";
static char UNUSED id[] = "$Id: log.c,v 1.44.2.4 2005/02/03 09:27:09 alex Exp $";
#include "imp.h"
#include <assert.h>
#include <errno.h>
#ifdef PROTOTYPES
# include <stdarg.h>
#else
# include <varargs.h>
#endif
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
@@ -44,79 +40,64 @@ static char UNUSED id[] = "$Id: log.c,v 1.57.2.2 2006/02/08 21:23:21 fw Exp $";
#include "log.h"
static char Init_Txt[127];
static bool Is_Daemon;
#ifdef DEBUG
static char Error_File[FNAME_LEN];
#endif
LOCAL CHAR Error_File[FNAME_LEN];
LOCAL CHAR Init_Txt[127];
static void Wall_ServerNotice PARAMS(( char *Msg ));
LOCAL VOID Wall_ServerNotice PARAMS(( CHAR *Msg ));
GLOBAL void
Log_Init( bool Daemon_Mode )
GLOBAL VOID
Log_Init( VOID )
{
Is_Daemon = Daemon_Mode;
#ifdef SYSLOG
#ifndef LOG_CONS /* Kludge: mips-dec-ultrix4.5 has no LOG_CONS/LOG_LOCAL5 */
#define LOG_CONS 0
#endif
#ifndef LOG_LOCAL5
#define LOG_LOCAL5 0
#endif
/* Syslog initialisieren */
openlog( PACKAGE_NAME, LOG_CONS|LOG_PID, LOG_LOCAL5 );
#endif
/* Hello World! */
Log( LOG_NOTICE, "%s started.", NGIRCd_Version );
Log( LOG_NOTICE, "%s started.", NGIRCd_Version( ));
/* Informationen uebern den "Operation Mode" */
Init_Txt[0] = '\0';
strcpy( Init_Txt, "" );
#ifdef DEBUG
if( NGIRCd_Debug )
{
strlcpy( Init_Txt, "debug-mode", sizeof Init_Txt );
if( Init_Txt[0] ) strcat( Init_Txt, ", " );
strcat( Init_Txt, "debug-mode" );
}
#endif
if( ! Is_Daemon )
if( NGIRCd_NoDaemon )
{
if( Init_Txt[0] ) strlcat( Init_Txt, ", ", sizeof Init_Txt );
strlcat( Init_Txt, "no-daemon-mode", sizeof Init_Txt );
if( Init_Txt[0] ) strcat( Init_Txt, ", " );
strcat( Init_Txt, "no-daemon-mode" );
}
if( NGIRCd_Passive )
{
if( Init_Txt[0] ) strlcat( Init_Txt, ", ", sizeof Init_Txt );
strlcat( Init_Txt, "passive-mode", sizeof Init_Txt );
if( Init_Txt[0] ) strcat( Init_Txt, ", " );
strcat( Init_Txt, "passive-mode" );
}
#ifdef SNIFFER
if( NGIRCd_Sniffer )
{
if( Init_Txt[0] ) strlcat( Init_Txt, ", ", sizeof Init_Txt );
strlcat( Init_Txt, "network sniffer", sizeof Init_Txt );
if( Init_Txt[0] ) strcat( Init_Txt, ", " );
strcat( Init_Txt, "network sniffer" );
}
#endif
if( Init_Txt[0] ) Log( LOG_INFO, "Activating: %s.", Init_Txt );
#ifdef DEBUG
Error_File[0] = '\0';
#endif
} /* Log_Init */
#ifdef DEBUG
GLOBAL void
Log_InitErrorfile( void )
GLOBAL VOID
Log_InitErrorfile( VOID )
{
/* "Error-Log" initialisieren: stderr in Datei umlenken. Dort
* landen z.B. alle Ausgaben von assert()-Aufrufen. */
/* Dateiname zusammen bauen */
snprintf( Error_File, sizeof Error_File, "%s/%s-%ld.err", ERROR_DIR, PACKAGE_NAME, (long)getpid( ));
sprintf( Error_File, "%s/%s-%ld.err", ERROR_DIR, PACKAGE_NAME, (LONG)getpid( ));
/* stderr umlenken */
fflush( stderr );
@@ -128,32 +109,26 @@ Log_InitErrorfile( void )
/* Einige Infos in das Error-File schreiben */
fputs( ctime( &NGIRCd_Start ), stderr );
fprintf( stderr, "%s started.\n", NGIRCd_Version );
fprintf( stderr, "%s started.\n", NGIRCd_Version( ));
fprintf( stderr, "Activating: %s\n\n", Init_Txt[0] ? Init_Txt : "-" );
fflush( stderr );
#ifdef DEBUG
Log( LOG_DEBUG, "Redirected stderr to \"%s\".", Error_File );
#endif
} /* Log_InitErrfile */
#endif
GLOBAL void
Log_Exit( void )
GLOBAL VOID
Log_Exit( VOID )
{
/* Good Bye! */
if( NGIRCd_SignalRestart ) Log( LOG_NOTICE, "%s done (restarting).", PACKAGE_NAME );
else Log( LOG_NOTICE, "%s done.", PACKAGE_NAME );
#ifdef DEBUG
if( Error_File[0] )
{
/* Error-File (stderr) loeschen */
if( unlink( Error_File ) != 0 ) Log( LOG_ERR, "Can't delete \"%s\": %s", Error_File, strerror( errno ));
}
#endif
#ifdef SYSLOG
/* syslog abmelden */
@@ -162,49 +137,21 @@ Log_Exit( void )
} /* Log_Exit */
# ifdef PROTOTYPES
GLOBAL void
LogDebug( const char *Format, ... )
# else
GLOBAL void
LogDebug( Format, va_alist )
const char *Format;
va_dcl
# endif
#ifdef DEBUG
{
char msg[MAX_LOG_MSG_LEN];
va_list ap;
if (!NGIRCd_Debug) return;
#ifdef PROTOTYPES
va_start( ap, Format );
GLOBAL VOID
Log( INT Level, CONST CHAR *Format, ... )
#else
va_start( ap );
#endif
vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap );
va_end( ap );
Log(LOG_DEBUG, "%s", msg);
}
#else
{ /* do nothing */ }
#endif /* DEBUG */
#ifdef PROTOTYPES
GLOBAL void
Log( int Level, const char *Format, ... )
#else
GLOBAL void
GLOBAL VOID
Log( Level, Format, va_alist )
int Level;
const char *Format;
INT Level;
CONST CHAR *Format;
va_dcl
#endif
{
/* Eintrag in Logfile(s) schreiben */
char msg[MAX_LOG_MSG_LEN];
bool snotice;
CHAR msg[MAX_LOG_MSG_LEN];
BOOLEAN snotice;
va_list ap;
assert( Format != NULL );
@@ -212,10 +159,10 @@ va_dcl
if( Level & LOG_snotice )
{
/* Notice an User mit "s" Mode */
snotice = true;
snotice = TRUE;
Level &= ~LOG_snotice;
}
else snotice = false;
else snotice = FALSE;
#ifdef DEBUG
if(( Level == LOG_DEBUG ) && ( ! NGIRCd_Debug )) return;
@@ -232,10 +179,10 @@ va_dcl
vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap );
va_end( ap );
if( ! Is_Daemon )
if( NGIRCd_NoDaemon )
{
/* auf Konsole ausgeben */
fprintf( stdout, "[%d:%d] %s\n", (int)getpid( ), Level, msg );
fprintf( stdout, "[%d:%d] %s\n", (INT)getpid( ), Level, msg );
fflush( stdout );
}
#ifdef SYSLOG
@@ -248,7 +195,7 @@ va_dcl
if( Level <= LOG_CRIT )
{
/* log critical messages to stderr */
/* Kritische Meldungen in Error-File (stderr) */
fprintf( stderr, "%s\n", msg );
fflush( stderr );
}
@@ -261,24 +208,20 @@ va_dcl
} /* Log */
GLOBAL void
Log_Init_Resolver( void )
GLOBAL VOID
Log_Init_Resolver( VOID )
{
#ifdef SYSLOG
openlog( PACKAGE_NAME, LOG_CONS|LOG_PID, LOG_LOCAL5 );
#endif
#ifdef DEBUG
Log_Resolver( LOG_DEBUG, "Resolver sub-process starting, PID %d.", getpid( ));
#endif
} /* Log_Init_Resolver */
GLOBAL void
Log_Exit_Resolver( void )
GLOBAL VOID
Log_Exit_Resolver( VOID )
{
#ifdef DEBUG
Log_Resolver( LOG_DEBUG, "Resolver sub-process %d done.", getpid( ));
#endif
#ifdef SYSLOG
closelog( );
#endif
@@ -286,19 +229,19 @@ Log_Exit_Resolver( void )
#ifdef PROTOTYPES
GLOBAL void
Log_Resolver( const int Level, const char *Format, ... )
GLOBAL VOID
Log_Resolver( CONST INT Level, CONST CHAR *Format, ... )
#else
GLOBAL void
GLOBAL VOID
Log_Resolver( Level, Format, va_alist )
const int Level;
const char *Format;
CONST INT Level;
CONST CHAR *Format;
va_dcl
#endif
{
/* Eintrag des Resolver in Logfile(s) schreiben */
char msg[MAX_LOG_MSG_LEN];
CHAR msg[MAX_LOG_MSG_LEN];
va_list ap;
assert( Format != NULL );
@@ -318,10 +261,11 @@ va_dcl
vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap );
va_end( ap );
if( ! Is_Daemon )
/* Output */
if( NGIRCd_NoDaemon )
{
/* Output to console */
fprintf( stdout, "[%d:%d] %s\n", (int)getpid( ), Level, msg );
fprintf( stdout, "[%d:%d] %s\n", (INT)getpid( ), Level, msg );
fflush( stdout );
}
#ifdef SYSLOG
@@ -330,23 +274,19 @@ va_dcl
} /* Log_Resolver */
/**
* Send log messages to users flagged with the "s" mode.
* @param Msg The message to send.
*/
static void
Wall_ServerNotice( char *Msg )
LOCAL VOID
Wall_ServerNotice( CHAR *Msg )
{
/* Server-Notice an entsprechende User verschicken */
CLIENT *c;
assert( Msg != NULL );
c = Client_First( );
while(c) {
if (Client_Conn(c) > NONE && Client_HasMode(c, 's'))
IRC_WriteStrClient(c, "NOTICE %s :%s%s", Client_ID(c),
NOTICE_TXTPREFIX, Msg);
while( c )
{
if(( Client_Conn( c ) > NONE ) && ( Client_HasMode( c, 's' ))) IRC_WriteStrClient( c, "NOTICE %s :%s%s", Client_ThisServer( ), NOTICE_TXTPREFIX, Msg );
c = Client_Next( c );
}
} /* Wall_ServerNotice */

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: log.h,v 1.18.2.1 2006/02/08 21:23:21 fw Exp $
* $Id: log.h,v 1.14 2003/12/26 15:55:07 alex Exp $
*
* Logging functions (header)
*/
@@ -35,20 +35,16 @@
#define LOG_snotice 1024
GLOBAL void Log_Init PARAMS(( bool Daemon_Mode ));
GLOBAL void Log_Exit PARAMS(( void ));
GLOBAL VOID Log_Init PARAMS((VOID ));
GLOBAL VOID Log_Exit PARAMS((VOID ));
GLOBAL void Log PARAMS(( int Level, const char *Format, ... ));
GLOBAL void LogDebug PARAMS(( const char *Format, ... ));
GLOBAL VOID Log_InitErrorfile PARAMS((VOID ));
GLOBAL VOID Log PARAMS((INT Level, CONST CHAR *Format, ... ));
GLOBAL void Log_Init_Resolver PARAMS(( void ));
GLOBAL void Log_Exit_Resolver PARAMS(( void ));
GLOBAL VOID Log_Init_Resolver PARAMS((VOID ));
GLOBAL VOID Log_Exit_Resolver PARAMS((VOID ));
GLOBAL void Log_Resolver PARAMS(( const int Level, const char *Format, ... ));
#ifdef DEBUG
GLOBAL void Log_InitErrorfile PARAMS(( void ));
#endif
GLOBAL VOID Log_Resolver PARAMS((CONST INT Level, CONST CHAR *Format, ... ));
#endif

View File

@@ -14,7 +14,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: match.c,v 1.3 2005/03/19 18:43:49 fw Exp $";
static char UNUSED id[] = "$Id: match.c,v 1.2 2002/12/12 12:24:18 alex Exp $";
#include "imp.h"
#include <assert.h>
@@ -32,8 +32,8 @@ static char UNUSED id[] = "$Id: match.c,v 1.3 2005/03/19 18:43:49 fw Exp $";
*/
LOCAL int Matche PARAMS(( char *p, char *t ));
LOCAL int Matche_After_Star PARAMS(( char *p, char *t ));
LOCAL INT Matche PARAMS(( REGISTER CHAR *p, REGISTER CHAR *t ));
LOCAL INT Matche_After_Star PARAMS(( REGISTER CHAR *p, REGISTER CHAR *t ));
#define MATCH_PATTERN 6 /* bad pattern */
@@ -44,22 +44,22 @@ LOCAL int Matche_After_Star PARAMS(( char *p, char *t ));
#define MATCH_VALID 1 /* valid match */
GLOBAL bool
Match( char *Pattern, char *String )
GLOBAL BOOLEAN
Match( CHAR *Pattern, CHAR *String )
{
/* Pattern mit String vergleichen */
if( Matche( Pattern, String ) == MATCH_VALID ) return true;
else return false;
if( Matche( Pattern, String ) == MATCH_VALID ) return TRUE;
else return FALSE;
} /* Match */
LOCAL int
Matche( char *p, char *t )
LOCAL INT
Matche( REGISTER CHAR *p, REGISTER CHAR *t )
{
register char range_start, range_end;
bool invert;
bool member_match;
bool loop;
REGISTER CHAR range_start, range_end;
BOOLEAN invert;
BOOLEAN member_match;
BOOLEAN loop;
for( ; *p; p++, t++ )
{
@@ -83,25 +83,25 @@ Matche( char *p, char *t )
p++;
/* check if this is a member match or exclusion match */
invert = false;
invert = FALSE;
if( *p == '!' || *p == '^' )
{
invert = true;
invert = TRUE;
p++;
}
/* if closing bracket here or at range start then we have a malformed pattern */
if ( *p == ']' ) return MATCH_PATTERN;
member_match = false;
loop = true;
member_match = FALSE;
loop = TRUE;
while( loop )
{
/* if end of construct then loop is done */
if( *p == ']' )
{
loop = false;
loop = FALSE;
continue;
}
@@ -140,16 +140,16 @@ Matche( char *p, char *t )
{
if( *t >= range_start && *t <= range_end )
{
member_match = true;
loop = false;
member_match = TRUE;
loop = FALSE;
}
}
else
{
if( *t >= range_end && *t <= range_start )
{
member_match = true;
loop = false;
member_match = TRUE;
loop = FALSE;
}
}
}
@@ -200,10 +200,10 @@ Matche( char *p, char *t )
} /* Matche */
LOCAL int
Matche_After_Star( char *p, char *t )
LOCAL INT
Matche_After_Star( REGISTER CHAR *p, REGISTER CHAR *t )
{
register int nextp, match = 0;
REGISTER INT nextp, match = 0;
/* pass over existing ? and * in pattern */
while( *p == '?' || *p == '*' )

View File

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

View File

@@ -7,18 +7,14 @@
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* Main program -- main()
*/
#include "portab.h"
static char UNUSED id[] = "$Id: ngircd.c,v 1.102.2.2 2005/07/08 23:20:04 alex Exp $";
/**
* @file
* The main program, including the C function main() which is called
* by the loader of the operating system.
*/
static char UNUSED id[] = "$Id: ngircd.c,v 1.83.2.3 2005/01/26 22:02:36 alex Exp $";
#include "imp.h"
#include <assert.h>
@@ -32,7 +28,6 @@ static char UNUSED id[] = "$Id: ngircd.c,v 1.102.2.2 2005/07/08 23:20:04 alex Ex
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <pwd.h>
#include <grp.h>
@@ -56,56 +51,39 @@ static char UNUSED id[] = "$Id: ngircd.c,v 1.102.2.2 2005/07/08 23:20:04 alex Ex
#include "ngircd.h"
LOCAL void Initialize_Signal_Handler PARAMS(( void ));
LOCAL void Signal_Handler PARAMS(( int Signal ));
LOCAL VOID Initialize_Signal_Handler PARAMS(( VOID ));
LOCAL VOID Signal_Handler PARAMS(( INT Signal ));
LOCAL void Show_Version PARAMS(( void ));
LOCAL void Show_Help PARAMS(( void ));
LOCAL VOID Show_Version PARAMS(( VOID ));
LOCAL VOID Show_Help PARAMS(( VOID ));
LOCAL void Pidfile_Create PARAMS(( long ));
LOCAL void Pidfile_Delete PARAMS(( void ));
LOCAL void Fill_Version PARAMS(( void ));
LOCAL void Setup_FDStreams PARAMS(( void ));
LOCAL bool NGIRCd_Init PARAMS(( bool ));
/**
* The main() function of ngIRCd.
* Here all starts: this function is called by the operating system loader,
* it is the first portion of code executed of ngIRCd.
* @param argc The number of arguments passed to ngIRCd on the command line.
* @param argv An array containing all the arguments passed to ngIRCd.
* @return Global exit code of ngIRCd, zero on success.
*/
GLOBAL int
main( int argc, const char *argv[] )
{
bool ok, configtest = false;
bool NGIRCd_NoDaemon = false;
int i;
size_t n;
struct passwd *pwd;
struct group *grp;
BOOLEAN ok, configtest = FALSE;
LONG pid, n;
INT i;
umask( 0077 );
NGIRCd_SignalQuit = NGIRCd_SignalRestart = NGIRCd_SignalRehash = false;
NGIRCd_Passive = false;
NGIRCd_SignalQuit = NGIRCd_SignalRestart = NGIRCd_SignalRehash = FALSE;
NGIRCd_NoDaemon = NGIRCd_Passive = FALSE;
#ifdef DEBUG
NGIRCd_Debug = false;
NGIRCd_Debug = FALSE;
#endif
#ifdef SNIFFER
NGIRCd_Sniffer = false;
NGIRCd_Sniffer = FALSE;
#endif
strlcpy( NGIRCd_ConfFile, SYSCONFDIR, sizeof( NGIRCd_ConfFile ));
strlcat( NGIRCd_ConfFile, CONFIG_FILE, sizeof( NGIRCd_ConfFile ));
Fill_Version( );
/* Kommandozeile parsen */
for( i = 1; i < argc; i++ )
{
ok = false;
ok = FALSE;
if(( argv[i][0] == '-' ) && ( argv[i][1] == '-' ))
{
/* Lange Option */
@@ -118,19 +96,19 @@ main( int argc, const char *argv[] )
strlcpy( NGIRCd_ConfFile, argv[i + 1], sizeof( NGIRCd_ConfFile ));
/* next parameter */
i++; ok = true;
i++; ok = TRUE;
}
}
if( strcmp( argv[i], "--configtest" ) == 0 )
{
configtest = true;
ok = true;
configtest = TRUE;
ok = TRUE;
}
#ifdef DEBUG
if( strcmp( argv[i], "--debug" ) == 0 )
{
NGIRCd_Debug = true;
ok = true;
NGIRCd_Debug = TRUE;
ok = TRUE;
}
#endif
if( strcmp( argv[i], "--help" ) == 0 )
@@ -141,19 +119,19 @@ main( int argc, const char *argv[] )
}
if( strcmp( argv[i], "--nodaemon" ) == 0 )
{
NGIRCd_NoDaemon = true;
ok = true;
NGIRCd_NoDaemon = TRUE;
ok = TRUE;
}
if( strcmp( argv[i], "--passive" ) == 0 )
{
NGIRCd_Passive = true;
ok = true;
NGIRCd_Passive = TRUE;
ok = TRUE;
}
#ifdef SNIFFER
if( strcmp( argv[i], "--sniffer" ) == 0 )
{
NGIRCd_Sniffer = true;
ok = true;
NGIRCd_Sniffer = TRUE;
ok = TRUE;
}
#endif
if( strcmp( argv[i], "--version" ) == 0 )
@@ -165,14 +143,15 @@ main( int argc, const char *argv[] )
else if(( argv[i][0] == '-' ) && ( argv[i][1] != '-' ))
{
/* Kurze Option */
for( n = 1; n < strlen( argv[i] ); n++ )
for( n = 1; n < (LONG)strlen( argv[i] ); n++ )
{
ok = false;
ok = FALSE;
#ifdef DEBUG
if( argv[i][n] == 'd' )
{
NGIRCd_Debug = true;
ok = true;
NGIRCd_Debug = TRUE;
ok = TRUE;
}
#endif
if( argv[i][n] == 'f' )
@@ -183,32 +162,31 @@ main( int argc, const char *argv[] )
strlcpy( NGIRCd_ConfFile, argv[i + 1], sizeof( NGIRCd_ConfFile ));
/* go to the following parameter */
i++;
n = strlen( argv[i] );
ok = true;
i++; n = (LONG)strlen( argv[i] );
ok = TRUE;
}
}
if( argv[i][n] == 'n' )
{
NGIRCd_NoDaemon = true;
ok = true;
NGIRCd_NoDaemon = TRUE;
ok = TRUE;
}
if( argv[i][n] == 'p' )
{
NGIRCd_Passive = true;
ok = true;
NGIRCd_Passive = TRUE;
ok = TRUE;
}
#ifdef SNIFFER
if( argv[i][n] == 's' )
{
NGIRCd_Sniffer = true;
ok = true;
NGIRCd_Sniffer = TRUE;
ok = TRUE;
}
#endif
if( argv[i][n] == 't' )
{
configtest = true;
ok = true;
configtest = TRUE;
ok = TRUE;
}
if( ! ok )
@@ -229,14 +207,14 @@ main( int argc, const char *argv[] )
}
/* Debug-Level (fuer IRC-Befehl "VERSION") ermitteln */
NGIRCd_DebugLevel[0] = '\0';
strcpy( NGIRCd_DebugLevel, "" );
#ifdef DEBUG
if( NGIRCd_Debug ) strcpy( NGIRCd_DebugLevel, "1" );
#endif
#ifdef SNIFFER
if( NGIRCd_Sniffer )
{
NGIRCd_Debug = true;
NGIRCd_Debug = TRUE;
strcpy( NGIRCd_DebugLevel, "2" );
}
#endif
@@ -252,19 +230,59 @@ main( int argc, const char *argv[] )
{
/* Initialize global variables */
NGIRCd_Start = time( NULL );
(void)strftime( NGIRCd_StartStr, 64, "%a %b %d %Y at %H:%M:%S (%Z)", localtime( &NGIRCd_Start ));
(VOID)strftime( NGIRCd_StartStr, 64, "%a %b %d %Y at %H:%M:%S (%Z)", localtime( &NGIRCd_Start ));
NGIRCd_SignalRehash = false;
NGIRCd_SignalRestart = false;
NGIRCd_SignalQuit = false;
NGIRCd_SignalRehash = FALSE;
NGIRCd_SignalRestart = FALSE;
NGIRCd_SignalQuit = FALSE;
/* Initialize modules, part I */
Log_Init( ! NGIRCd_NoDaemon );
Log_Init( );
Conf_Init( );
if (!NGIRCd_Init( NGIRCd_NoDaemon )) {
Log(LOG_WARNING, "Fatal: Initialization failed");
exit(1);
if( Conf_Chroot[0] )
{
/* Chroot */
if( chdir( Conf_Chroot ) != 0 ) Log( LOG_ERR, "Can't chdir() in ChrootDir (%s): %s", Conf_Chroot, strerror( errno ));
if( chroot( Conf_Chroot ) != 0 ) Log( LOG_ERR, "Can't change root directory to \"%s\": %s", Conf_Chroot, strerror( errno ));
else Log( LOG_INFO, "Changed root and working directory to \"%s\".", Conf_Chroot );
}
if( Conf_GID != 0 )
{
/* Set new group ID */
if( setgid( Conf_GID ) != 0 ) Log( LOG_ERR, "Can't change group ID to %u: %s", Conf_GID, strerror( errno ));
}
if( Conf_UID != 0 )
{
/* Set new user ID */
if( setuid( Conf_UID ) != 0 ) Log( LOG_ERR, "Can't change user ID to %u: %s", Conf_UID, strerror( errno ));
}
/* In der Regel wird ein Sub-Prozess ge-fork()'t, der
* nicht mehr mit dem Terminal verbunden ist. Mit der
* Option "--nodaemon" kann dies (z.B. zum Debuggen)
* verhindert werden. */
if( ! NGIRCd_NoDaemon )
{
/* Daemon im Hintergrund erzeugen */
pid = (LONG)fork( );
if( pid > 0 )
{
/* "alter" Prozess */
exit( 0 );
}
if( pid < 0 )
{
/* Fehler */
printf( "%s: Can't fork: %s!\nFatal error, exiting now ...\n", PACKAGE_NAME, strerror( errno ));
exit( 1 );
}
/* Child-Prozess initialisieren */
(VOID)setsid( );
chdir( "/" );
}
/* Initialize modules, part II: these functions are eventually
@@ -278,11 +296,15 @@ main( int argc, const char *argv[] )
#endif
Conn_Init( );
#ifdef DEBUG
/* Redirect stderr handle to "error file" for debugging
* when not running in "no daemon" mode: */
if( ! NGIRCd_NoDaemon ) Log_InitErrorfile( );
#endif
/* Show user, group, and PID of the running daemon */
pwd = getpwuid( getuid( )); grp = getgrgid( getgid( ));
Log( LOG_INFO, "Running as user %s(%ld), group %s(%ld), with PID %ld.", pwd ? pwd->pw_name : "unknown", (LONG)getuid( ), grp ? grp->gr_name : "unknown", (LONG)getgid( ), (LONG)getpid( ));
/* Redirect stderr handle to "error file" for debugging.
* But don't try to write in the chroot jail, since it's more
* secure to have a chroot dir not writable by the daemon.
*/
if( ! Conf_Chroot[0] ) Log_InitErrorfile( );
/* Signal-Handler initialisieren */
Initialize_Signal_Handler( );
@@ -291,17 +313,17 @@ main( int argc, const char *argv[] )
* beim PASS-Befehl verwendete Syntax sowie die erweiterten Flags
* sind in doc/Protocol.txt beschrieben. */
#ifdef IRCPLUS
snprintf( NGIRCd_ProtoID, sizeof NGIRCd_ProtoID, "%s%s %s|%s:%s", PROTOVER, PROTOIRCPLUS, PACKAGE_NAME, PACKAGE_VERSION, IRCPLUSFLAGS );
sprintf( NGIRCd_ProtoID, "%s%s %s|%s:%s", PROTOVER, PROTOIRCPLUS, PACKAGE_NAME, PACKAGE_VERSION, IRCPLUSFLAGS );
#ifdef ZLIB
strcat( NGIRCd_ProtoID, "Z" );
#endif
if( Conf_OperCanMode ) strcat( NGIRCd_ProtoID, "o" );
#else
snprintf( NGIRCd_ProtoID, sizeof NGIRCd_ProtoID, "%s%s %s|%s", PROTOVER, PROTOIRC, PACKAGE_NAME, PACKAGE_VERSION );
sprintf( NGIRCd_ProtoID, "%s%s %s|%s", PROTOVER, PROTOIRC, PACKAGE_NAME, PACKAGE_VERSION );
#endif
strlcat( NGIRCd_ProtoID, " P", sizeof NGIRCd_ProtoID );
strcat( NGIRCd_ProtoID, " P" );
#ifdef ZLIB
strlcat( NGIRCd_ProtoID, "Z", sizeof NGIRCd_ProtoID );
strcat( NGIRCd_ProtoID, "Z" );
#endif
Log( LOG_DEBUG, "Protocol and server ID is \"%s\".", NGIRCd_ProtoID );
@@ -313,7 +335,6 @@ main( int argc, const char *argv[] )
{
Log( LOG_ALERT, "Server isn't listening on a single port!" );
Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME );
Pidfile_Delete( );
exit( 1 );
}
@@ -330,108 +351,93 @@ main( int argc, const char *argv[] )
Lists_Exit( );
Log_Exit( );
}
Pidfile_Delete( );
return 0;
} /* main */
/**
* Generate ngIRCd "version string".
* This string is generated once and then stored in NGIRCd_Version for
* further usage, for example by the IRC command VERSION and the --version
* command line switch.
*/
LOCAL void
Fill_Version( void )
GLOBAL CHAR *
NGIRCd_Version( VOID )
{
NGIRCd_VersionAddition[0] = '\0';
STATIC CHAR version[126];
#ifdef CVSDATE
sprintf( version, "%s %s(%s)-%s", PACKAGE_NAME, PACKAGE_VERSION, CVSDATE, NGIRCd_VersionAddition( ));
#else
sprintf( version, "%s %s-%s", PACKAGE_NAME, PACKAGE_VERSION, NGIRCd_VersionAddition( ));
#endif
return version;
} /* NGIRCd_Version */
GLOBAL CHAR *
NGIRCd_VersionAddition( VOID )
{
STATIC CHAR txt[200];
strcpy( txt, "" );
#ifdef SYSLOG
strlcpy( NGIRCd_VersionAddition, "SYSLOG", sizeof NGIRCd_VersionAddition );
if( txt[0] ) strcat( txt, "+" );
strcat( txt, "SYSLOG" );
#endif
#ifdef ZLIB
if( NGIRCd_VersionAddition[0] )
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
strlcat( NGIRCd_VersionAddition, "ZLIB", sizeof NGIRCd_VersionAddition );
if( txt[0] ) strcat( txt, "+" );
strcat( txt, "ZLIB" );
#endif
#ifdef TCPWRAP
if( NGIRCd_VersionAddition[0] )
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
strlcat( NGIRCd_VersionAddition, "TCPWRAP", sizeof NGIRCd_VersionAddition );
if( txt[0] ) strcat( txt, "+" );
strcat( txt, "TCPWRAP" );
#endif
#ifdef RENDEZVOUS
if( NGIRCd_VersionAddition[0] )
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
strlcat( NGIRCd_VersionAddition, "RENDEZVOUS", sizeof NGIRCd_VersionAddition );
if( txt[0] ) strcat( txt, "+" );
strcat( txt, "RENDEZVOUS" );
#endif
#ifdef IDENTAUTH
if( NGIRCd_VersionAddition[0] )
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
strlcat( NGIRCd_VersionAddition, "IDENT", sizeof NGIRCd_VersionAddition );
if( txt[0] ) strcat( txt, "+" );
strcat( txt, "IDENT" );
#endif
#ifdef DEBUG
if( NGIRCd_VersionAddition[0] )
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
strlcat( NGIRCd_VersionAddition, "DEBUG", sizeof NGIRCd_VersionAddition );
if( txt[0] ) strcat( txt, "+" );
strcat( txt, "DEBUG" );
#endif
#ifdef SNIFFER
if( NGIRCd_VersionAddition[0] )
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
strlcat( NGIRCd_VersionAddition, "SNIFFER", sizeof NGIRCd_VersionAddition );
if( txt[0] ) strcat( txt, "+" );
strcat( txt, "SNIFFER" );
#endif
#ifdef STRICT_RFC
if( NGIRCd_VersionAddition[0] )
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
strlcat( NGIRCd_VersionAddition, "RFC", sizeof NGIRCd_VersionAddition );
if( txt[0] ) strcat( txt, "+" );
strcat( txt, "RFC" );
#endif
#ifdef IRCPLUS
if( NGIRCd_VersionAddition[0] )
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
strlcat( NGIRCd_VersionAddition, "IRCPLUS", sizeof NGIRCd_VersionAddition );
if( txt[0] ) strcat( txt, "+" );
strcat( txt, "IRCPLUS" );
#endif
if( txt[0] ) strlcat( txt, "-", sizeof( txt ));
strlcat( txt, TARGET_CPU, sizeof( txt ));
strlcat( txt, "/", sizeof( txt ));
strlcat( txt, TARGET_VENDOR, sizeof( txt ));
strlcat( txt, "/", sizeof( txt ));
strlcat( txt, TARGET_OS, sizeof( txt ));
if( NGIRCd_VersionAddition[0] )
strlcat( NGIRCd_VersionAddition, "-", sizeof( NGIRCd_VersionAddition ));
strlcat( NGIRCd_VersionAddition, TARGET_CPU, sizeof( NGIRCd_VersionAddition ));
strlcat( NGIRCd_VersionAddition, "/", sizeof( NGIRCd_VersionAddition ));
strlcat( NGIRCd_VersionAddition, TARGET_VENDOR, sizeof( NGIRCd_VersionAddition ));
strlcat( NGIRCd_VersionAddition, "/", sizeof( NGIRCd_VersionAddition ));
strlcat( NGIRCd_VersionAddition, TARGET_OS, sizeof( NGIRCd_VersionAddition ));
#ifdef CVSDATE
snprintf( NGIRCd_Version, sizeof NGIRCd_Version,"%s %s(%s)-%s", PACKAGE_NAME, PACKAGE_VERSION, CVSDATE, NGIRCd_VersionAddition);
#else
snprintf( NGIRCd_Version, sizeof NGIRCd_Version, "%s %s-%s", PACKAGE_NAME, PACKAGE_VERSION, NGIRCd_VersionAddition);
#endif
} /* Fill_Version */
return txt;
} /* NGIRCd_VersionAddition */
/**
* Reload the server configuration file.
*/
GLOBAL void
NGIRCd_Rehash( void )
GLOBAL VOID
NGIRCd_Rehash( VOID )
{
char old_name[CLIENT_ID_LEN];
CHAR old_name[CLIENT_ID_LEN];
Log( LOG_NOTICE|LOG_snotice, "Re-reading configuration NOW!" );
NGIRCd_SignalRehash = false;
NGIRCd_SignalRehash = FALSE;
/* Close down all listening sockets */
Conn_ExitListeners( );
/* Remember old server name */
strlcpy( old_name, Conf_ServerName, sizeof old_name );
strcpy( old_name, Conf_ServerName );
/* Re-read configuration ... */
Conf_Rehash( );
@@ -456,11 +462,8 @@ NGIRCd_Rehash( void )
} /* NGIRCd_Rehash */
/**
* Initialize the signal handler.
*/
LOCAL void
Initialize_Signal_Handler( void )
LOCAL VOID
Initialize_Signal_Handler( VOID )
{
/* Signal-Handler initialisieren: einige Signale
* werden ignoriert, andere speziell behandelt. */
@@ -506,26 +509,24 @@ Initialize_Signal_Handler( void )
} /* Initialize_Signal_Handler */
/**
* Signal handler of ngIRCd.
* This function is called whenever ngIRCd catches a signal sent by the
* user and/or the system to it. For example SIGTERM and SIGHUP.
* @param Signal Number of the signal to handle.
*/
LOCAL void
Signal_Handler( int Signal )
LOCAL VOID
Signal_Handler( INT Signal )
{
/* Signal-Handler. Dieser wird aufgerufen, wenn eines der Signale eintrifft,
* fuer das wir uns registriert haben (vgl. Initialize_Signal_Handler). Die
* Nummer des eingetroffenen Signals wird der Funktion uebergeben. */
switch( Signal )
{
case SIGTERM:
case SIGINT:
case SIGQUIT:
/* wir soll(t)en uns wohl beenden ... */
NGIRCd_SignalQuit = true;
NGIRCd_SignalQuit = TRUE;
break;
case SIGHUP:
/* Konfiguration neu einlesen: */
NGIRCd_SignalRehash = true;
NGIRCd_SignalRehash = TRUE;
break;
case SIGCHLD:
/* Child-Prozess wurde beendet. Zombies vermeiden: */
@@ -540,13 +541,10 @@ Signal_Handler( int Signal )
} /* Signal_Handler */
/**
* Display copyright and version information of ngIRCd on the console.
*/
LOCAL void
Show_Version( void )
LOCAL VOID
Show_Version( VOID )
{
puts( NGIRCd_Version );
puts( NGIRCd_Version( ));
puts( "Copyright (c)2001-2005 by Alexander Barton (<alex@barton.de>)." );
puts( "Homepage: <http://arthur.ath.cx/~alex/ngircd/>\n" );
puts( "This is free software; see the source for copying conditions. There is NO" );
@@ -554,20 +552,15 @@ Show_Version( void )
} /* Show_Version */
/**
* Display a short help text on the console.
* This help depends on the configuration of the executable and only shows
* options that are actually enabled.
*/
LOCAL void
Show_Help( void )
LOCAL VOID
Show_Help( VOID )
{
#ifdef DEBUG
puts( " -d, --debug log extra debug messages" );
#endif
puts( " -f, --config <f> use file <f> as configuration file" );
puts( " -n, --nodaemon don't fork and don't detach from controlling terminal" );
puts( " -p, --passive disable automatic connections to other servers" );
puts( " -n, --nodaemon don't fork and don't detach from controlling terminal" );
puts( " -p, --passive disable automatic connections to other servers" );
#ifdef SNIFFER
puts( " -s, --sniffer enable network sniffer and display all IRC traffic" );
#endif
@@ -577,235 +570,4 @@ Show_Help( void )
} /* Show_Help */
/**
* Delete the file containing the process ID (PID).
*/
LOCAL void
Pidfile_Delete( void )
{
/* Pidfile configured? */
if( ! Conf_PidFile[0] ) return;
#ifdef DEBUG
Log( LOG_DEBUG, "Removing PID file (%s) ...", Conf_PidFile );
#endif
if( unlink( Conf_PidFile ))
Log( LOG_ERR, "Error unlinking PID file (%s): %s", Conf_PidFile, strerror( errno ));
} /* Pidfile_Delete */
/**
* Create the file containing the process ID of ngIRCd ("PID file").
* @param pid The process ID to be stored in this file.
*/
LOCAL void
Pidfile_Create( long pid )
{
int pidfd;
char pidbuf[64];
int len;
/* Pidfile configured? */
if( ! Conf_PidFile[0] ) return;
#ifdef DEBUG
Log( LOG_DEBUG, "Creating PID file (%s) ...", Conf_PidFile );
#endif
pidfd = open( Conf_PidFile, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
if ( pidfd < 0 ) {
Log( LOG_ERR, "Error writing PID file (%s): %s", Conf_PidFile, strerror( errno ));
return;
}
len = snprintf( pidbuf, sizeof pidbuf, "%ld\n", pid );
if (len < 0|| len < (int)sizeof pid) {
Log( LOG_ERR, "Error converting pid");
return;
}
if( write( pidfd, pidbuf, len) != len)
Log( LOG_ERR, "Can't write PID file (%s): %s", Conf_PidFile, strerror( errno ));
if( close(pidfd) != 0 )
Log( LOG_ERR, "Error closing PID file (%s): %s", Conf_PidFile, strerror( errno ));
} /* Pidfile_Create */
/**
* Redirect stdin, stdout and stderr to apropriate file handles.
*/
LOCAL void
Setup_FDStreams( void )
{
int fd;
/* Test if we can open /dev/null for reading and writing. If not
* we are most probably chrooted already and the server has been
* restarted. So we simply don't try to redirect stdXXX ... */
fd = open( "/dev/null", O_RDWR );
if ( fd < 0 ) {
Log(LOG_WARNING, "Could not open /dev/null: %s", strerror(errno));
return;
}
fflush(stdout);
fflush(stderr);
/* Create new stdin(0), stdout(1) and stderr(2) descriptors */
dup2( fd, 0 ); dup2( fd, 1 ); dup2( fd, 2 );
/* Close newly opened file descriptor if not stdin/out/err */
if( fd > 2 ) close( fd );
} /* Setup_FDStreams */
LOCAL bool
NGIRCd_getNobodyID(unsigned int *uid, unsigned int *gid )
{
struct passwd *pwd;
pwd = getpwnam("nobody");
if (!pwd) return false;
if ( !pwd->pw_uid || !pwd->pw_gid)
return false;
*uid = pwd->pw_uid;
*gid = pwd->pw_gid;
endpwent();
return true;
}
LOCAL bool
NGIRCd_Init( bool NGIRCd_NoDaemon )
{
static bool initialized;
bool chrooted = false;
struct passwd *pwd;
struct group *grp;
int real_errno;
long pid;
if (initialized)
return true;
if( Conf_Chroot[0] ) {
if( chdir( Conf_Chroot ) != 0 ) {
Log( LOG_ERR, "Can't chdir() in ChrootDir (%s): %s", Conf_Chroot, strerror( errno ));
return false;
}
if( chroot( Conf_Chroot ) != 0 ) {
if (errno != EPERM) {
Log( LOG_ERR, "Can't change root directory to \"%s\": %s",
Conf_Chroot, strerror( errno ));
return false;
}
} else {
chrooted = true;
Log( LOG_INFO, "Changed root and working directory to \"%s\".", Conf_Chroot );
}
}
if (Conf_UID == 0) {
Log(LOG_INFO, "ServerUID must not be 0, using \"nobody\" instead.", Conf_UID);
if (! NGIRCd_getNobodyID(&Conf_UID, &Conf_GID)) {
Log(LOG_WARNING, "Could not get user/group ID of user \"nobody\": %s",
errno ? strerror(errno) : "not found" );
return false;
}
}
if (getgid() != Conf_GID) {
/* Change group ID */
if (setgid(Conf_GID) != 0) {
real_errno = errno;
Log( LOG_ERR, "Can't change group ID to %u: %s", Conf_GID, strerror( errno ));
if (real_errno != EPERM)
return false;
}
}
if (getuid() != Conf_UID) {
/* Change user ID */
if (setuid(Conf_UID) != 0) {
real_errno = errno;
Log(LOG_ERR, "Can't change user ID to %u: %s", Conf_UID, strerror(errno));
if (real_errno != EPERM)
return false;
}
}
initialized = true;
/* Normally a child process is forked which isn't any longer
* connected to ther controlling terminal. Use "--nodaemon"
* to disable this "daemon mode" (useful for debugging). */
if ( ! NGIRCd_NoDaemon ) {
pid = (long)fork( );
if( pid > 0 ) {
/* "Old" process: exit. */
exit( 0 );
}
if( pid < 0 ) {
/* Error!? */
fprintf( stderr, "%s: Can't fork: %s!\nFatal error, exiting now ...\n",
PACKAGE_NAME, strerror( errno ));
exit( 1 );
}
/* New child process */
(void)setsid( );
chdir( "/" );
/* Detach stdin, stdout and stderr */
Setup_FDStreams( );
}
pid = getpid();
Pidfile_Create( pid );
/* Check UID/GID we are running as, can be different from values
* configured (e. g. if we were already started with a UID>0. */
Conf_UID = getuid();
Conf_GID = getgid();
pwd = getpwuid( Conf_UID );
grp = getgrgid( Conf_GID );
Log( LOG_INFO, "Running as user %s(%ld), group %s(%ld), with PID %ld.",
pwd ? pwd->pw_name : "unknown", Conf_UID,
grp ? grp->gr_name : "unknown", Conf_GID, pid);
if ( chrooted ) {
Log( LOG_INFO, "Running chrooted, chrootdir \"%s\".", Conf_Chroot );
return true;
} else {
Log( LOG_INFO, "Not running chrooted." );
}
/* Change working directory to home directory of the user
* we are running as (only when running in daemon mode and not in chroot) */
if ( pwd ) {
if (!NGIRCd_NoDaemon ) {
if( chdir( pwd->pw_dir ) == 0 )
Log( LOG_DEBUG, "Changed working directory to \"%s\" ...", pwd->pw_dir );
else
Log( LOG_ERR, "Can't change working directory to \"%s\": %s",
pwd->pw_dir, strerror( errno ));
}
} else {
Log( LOG_ERR, "Can't get user informaton for UID %d!?", Conf_UID );
}
return true;
}
/* -eof- */

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: ngircd.h,v 1.22 2005/06/24 19:20:56 fw Exp $
* $Id: ngircd.h,v 1.19 2002/12/26 16:48:14 alex Exp $
*
* Prototypes of the "main module".
*/
@@ -23,32 +23,35 @@
GLOBAL time_t NGIRCd_Start; /* Startzeitpunkt des Daemon */
GLOBAL char NGIRCd_StartStr[64];
GLOBAL char NGIRCd_Version[126];
GLOBAL char NGIRCd_VersionAddition[126];
GLOBAL CHAR NGIRCd_StartStr[64];
#ifdef DEBUG
GLOBAL bool NGIRCd_Debug; /* Debug-Modus aktivieren */
GLOBAL BOOLEAN NGIRCd_Debug; /* Debug-Modus aktivieren */
#endif
#ifdef SNIFFER
GLOBAL bool NGIRCd_Sniffer; /* Sniffer aktivieren */
GLOBAL BOOLEAN NGIRCd_Sniffer; /* Sniffer aktivieren */
#endif
GLOBAL bool NGIRCd_Passive; /* nicht zu anderen Servern connecten */
GLOBAL BOOLEAN NGIRCd_NoDaemon; /* nicht im Hintergrund laufen */
GLOBAL bool NGIRCd_SignalQuit; /* true: quit server*/
GLOBAL bool NGIRCd_SignalRestart; /* true: restart server */
GLOBAL bool NGIRCd_SignalRehash; /* true: reload configuration */
GLOBAL BOOLEAN NGIRCd_Passive; /* nicht zu anderen Servern connecten */
GLOBAL char NGIRCd_DebugLevel[2]; /* Debug-Level fuer IRC_VERSION() */
GLOBAL BOOLEAN NGIRCd_SignalQuit; /* TRUE: quit server*/
GLOBAL BOOLEAN NGIRCd_SignalRestart; /* TRUE: restart server */
GLOBAL BOOLEAN NGIRCd_SignalRehash; /* TRUE: reload configuration */
GLOBAL char NGIRCd_ConfFile[FNAME_LEN]; /* Konfigurationsdatei */
GLOBAL CHAR NGIRCd_DebugLevel[2]; /* Debug-Level fuer IRC_VERSION() */
GLOBAL char NGIRCd_ProtoID[COMMAND_LEN];/* Protokoll- und Server-Identifikation */
GLOBAL CHAR NGIRCd_ConfFile[FNAME_LEN]; /* Konfigurationsdatei */
GLOBAL CHAR NGIRCd_ProtoID[COMMAND_LEN];/* Protokoll- und Server-Identifikation */
GLOBAL void NGIRCd_Rehash PARAMS(( void ));
GLOBAL CHAR *NGIRCd_Version PARAMS((VOID ));
GLOBAL CHAR *NGIRCd_VersionAddition PARAMS((VOID ));
GLOBAL VOID NGIRCd_Rehash PARAMS(( VOID ));
#endif

View File

@@ -7,17 +7,14 @@
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* IRC command parser and validator
*/
#include "portab.h"
static char UNUSED id[] = "$Id: parse.c,v 1.63.2.1 2005/07/24 21:06:51 alex Exp $";
/**
* @file
* IRC command parser and validator.
*/
static char UNUSED id[] = "$Id: parse.c,v 1.60 2004/01/17 03:17:49 alex Exp $";
#include "imp.h"
#include <assert.h>
@@ -103,52 +100,32 @@ COMMAND My_Commands[] =
};
LOCAL void Init_Request PARAMS(( REQUEST *Req ));
LOCAL VOID Init_Request PARAMS(( REQUEST *Req ));
LOCAL bool Validate_Prefix PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed ));
LOCAL bool Validate_Command PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed ));
LOCAL bool Validate_Args PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed ));
LOCAL BOOLEAN Validate_Prefix PARAMS(( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed ));
LOCAL BOOLEAN Validate_Command PARAMS(( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed ));
LOCAL BOOLEAN Validate_Args PARAMS(( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed ));
LOCAL bool Handle_Request PARAMS(( CONN_ID Idx, REQUEST *Req ));
LOCAL BOOLEAN Handle_Request PARAMS(( CONN_ID Idx, REQUEST *Req ));
/**
* Return the pointer to the global "IRC command structure".
* This structure, an array of type "COMMAND" describes all the IRC commands
* implemented by ngIRCd and how to handle them.
* @return Pointer to the global command structure.
*/
GLOBAL COMMAND *
Parse_GetCommandStruct( void )
Parse_GetCommandStruct( VOID )
{
return My_Commands;
} /* Parse_GetCommandStruct */
/**
* Parse a command ("request") received from a client.
*
* This function is called after the connection layer received a valid CR+LF
* terminated line of text: we asume that this is a valid IRC command and
* try to do something useful with it :-)
*
* All errors are reported to the client from which the command has been
* received, and if the error is fatal this connection is closed down.
*
* This function is able to parse the syntax as described in RFC 2812,
* section 2.3.
*
* @param Idx Index of the connection from which the command has been received.
* @param Request NULL terminated line of text (the "command").
* @return true on success (valid command or "regular" error), false if a
* fatal error occured and the connection has been shut down.
*/
GLOBAL bool
Parse_Request( CONN_ID Idx, char *Request )
GLOBAL BOOLEAN
Parse_Request( CONN_ID Idx, CHAR *Request )
{
/* Client-Request parsen. Bei einem schwerwiegenden Fehler wird
* die Verbindung geschlossen und FALSE geliefert.
* Der Aufbau gueltiger Requests ist in RFC 2812, 2.3 definiert. */
REQUEST req;
char *start, *ptr;
bool closed;
CHAR *start, *ptr;
BOOLEAN closed;
assert( Idx >= 0 );
assert( Request != NULL );
@@ -243,16 +220,12 @@ Parse_Request( CONN_ID Idx, char *Request )
} /* Parse_Request */
/**
* Initialize request structure.
* @param Req Request structure to be initialized.
*/
LOCAL void
LOCAL VOID
Init_Request( REQUEST *Req )
{
/* Neue Request-Struktur initialisieren */
int i;
INT i;
assert( Req != NULL );
@@ -263,18 +236,18 @@ Init_Request( REQUEST *Req )
} /* Init_Request */
LOCAL bool
Validate_Prefix( CONN_ID Idx, REQUEST *Req, bool *Closed )
LOCAL BOOLEAN
Validate_Prefix( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed )
{
CLIENT *client, *c;
assert( Idx >= 0 );
assert( Req != NULL );
*Closed = false;
*Closed = FALSE;
/* ist ueberhaupt ein Prefix vorhanden? */
if( ! Req->prefix ) return true;
if( ! Req->prefix ) return TRUE;
/* Client-Struktur der Connection ermitteln */
client = Client_GetFromConn( Idx );
@@ -286,7 +259,7 @@ Validate_Prefix( CONN_ID Idx, REQUEST *Req, bool *Closed )
/* noch nicht registrierte Verbindung.
* Das Prefix wird ignoriert. */
Req->prefix = NULL;
return true;
return TRUE;
}
/* pruefen, ob der im Prefix angegebene Client bekannt ist */
@@ -295,8 +268,8 @@ Validate_Prefix( CONN_ID Idx, REQUEST *Req, bool *Closed )
{
/* im Prefix angegebener Client ist nicht bekannt */
Log( LOG_ERR, "Invalid prefix \"%s\", client not known (connection %d, command %s)!?", Req->prefix, Idx, Req->command );
if( ! Conn_WriteStr( Idx, "ERROR :Invalid prefix \"%s\", client not known!?", Req->prefix )) *Closed = true;
return false;
if( ! Conn_WriteStr( Idx, "ERROR :Invalid prefix \"%s\", client not known!?", Req->prefix )) *Closed = TRUE;
return FALSE;
}
/* pruefen, ob der Client mit dem angegebenen Prefix in Richtung
@@ -307,48 +280,48 @@ Validate_Prefix( CONN_ID Idx, REQUEST *Req, bool *Closed )
/* das angegebene Prefix ist aus dieser Richtung, also
* aus der gegebenen Connection, ungueltig! */
Log( LOG_ERR, "Spoofed prefix \"%s\" from \"%s\" (connection %d, command %s)!", Req->prefix, Client_Mask( Client_GetFromConn( Idx )), Idx, Req->command );
Conn_Close( Idx, NULL, "Spoofed prefix", true);
*Closed = true;
return false;
Conn_Close( Idx, NULL, "Spoofed prefix", TRUE );
*Closed = TRUE;
return FALSE;
}
return true;
return TRUE;
} /* Validate_Prefix */
LOCAL bool
Validate_Command( UNUSED CONN_ID Idx, UNUSED REQUEST *Req, bool *Closed )
LOCAL BOOLEAN
Validate_Command( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed )
{
assert( Idx >= 0 );
assert( Req != NULL );
*Closed = false;
*Closed = FALSE;
return true;
return TRUE;
} /* Validate_Comman */
LOCAL bool
Validate_Args( UNUSED CONN_ID Idx, UNUSED REQUEST *Req, bool *Closed )
LOCAL BOOLEAN
Validate_Args( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed )
{
assert( Idx >= 0 );
assert( Req != NULL );
*Closed = false;
*Closed = FALSE;
return true;
return TRUE;
} /* Validate_Args */
LOCAL bool
LOCAL BOOLEAN
Handle_Request( CONN_ID Idx, REQUEST *Req )
{
/* Client-Request verarbeiten. Bei einem schwerwiegenden Fehler
* wird die Verbindung geschlossen und false geliefert. */
* wird die Verbindung geschlossen und FALSE geliefert. */
CLIENT *client, *target, *prefix;
char str[LINE_LEN];
bool result;
CHAR str[LINE_LEN];
BOOLEAN result;
COMMAND *cmd;
int i;
INT i;
assert( Idx >= 0 );
assert( Req != NULL );
@@ -370,13 +343,13 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
/* Status code without target!? */
if( Req->argc > 0 ) Log( LOG_WARNING, "Unknown target for status code %s: \"%s\"", Req->command, Req->argv[0] );
else Log( LOG_WARNING, "Unknown target for status code %s!", Req->command );
return true;
return TRUE;
}
if( target == Client_ThisServer( ))
{
/* This server is the target, ignore it */
Log( LOG_DEBUG, "Ignored status code %s from \"%s\".", Req->command, Client_ID( client ));
return true;
return TRUE;
}
/* Determine source */
@@ -384,14 +357,14 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
{
/* Oops, no prefix!? */
Log( LOG_WARNING, "Got status code %s from \"%s\" without prefix!?", Req->command, Client_ID( client ));
return true;
return TRUE;
}
else prefix = Client_Search( Req->prefix );
if( ! prefix )
{
/* Oops, unknown prefix!? */
Log( LOG_WARNING, "Got status code %s from unknown source: \"%s\"", Req->command, Req->prefix );
return true;
return TRUE;
}
/* Forward status code */
@@ -433,23 +406,11 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
return IRC_WriteStrClient( client, ERR_NOTREGISTERED_MSG, Client_ID( client ));
}
}
if( Client_Type( client ) != CLIENT_USER &&
Client_Type( client ) != CLIENT_SERVER &&
Client_Type( client ) != CLIENT_SERVICE )
return true;
/* Unknown command and registered connection: generate error: */
Log( LOG_DEBUG, "Connection %d: Unknown command \"%s\", %d %s,%s prefix.",
Client_Conn( client ), Req->command, Req->argc,
Req->argc == 1 ? "parameter" : "parameters",
Req->prefix ? "" : " no" );
if( Client_Type( client ) != CLIENT_SERVER )
return IRC_WriteStrClient( client, ERR_UNKNOWNCOMMAND_MSG,
Client_ID( client ), Req->command );
return true;
/* Unbekannter Befehl */
Log( LOG_DEBUG, "Connection %d: Unknown command \"%s\", %d %s,%s prefix.", Client_Conn( client ), Req->command, Req->argc, Req->argc == 1 ? "parameter" : "parameters", Req->prefix ? "" : " no" );
if( Client_Type( client ) != CLIENT_SERVER ) return IRC_WriteStrClient( client, ERR_UNKNOWNCOMMAND_MSG, Client_ID( client ), Req->command );
else return TRUE;
} /* Handle_Request */

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: parse.h,v 1.11 2005/03/19 18:43:49 fw Exp $
* $Id: parse.h,v 1.10 2003/01/03 22:03:51 alex Exp $
*
* IRC command parser and validator (header)
*/
@@ -17,30 +17,29 @@
#ifndef __parse_h__
#define __parse_h__
#include "portab.h"
typedef struct _REQUEST /* vgl. RFC 2812, 2.3 */
{
char *prefix; /* Prefix */
char *command; /* IRC-Befehl */
char *argv[15]; /* Parameter (max. 15: 0..14) */
int argc; /* Anzahl vorhandener Parameter */
CHAR *prefix; /* Prefix */
CHAR *command; /* IRC-Befehl */
CHAR *argv[15]; /* Parameter (max. 15: 0..14) */
INT argc; /* Anzahl vorhandener Parameter */
} REQUEST;
typedef struct _COMMAND
{
char *name; /* command name */
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 */
CHAR *name; /* command name */
BOOLEAN (*function) PARAMS(( CLIENT *Client, REQUEST *Request ));
CLIENT_TYPE type; /* valid client types (bit mask) */
LONG lcount, rcount; /* number of local and remote calls */
LONG bytes; /* number of bytes created */
} COMMAND;
GLOBAL bool Parse_Request PARAMS((CONN_ID Idx, char *Request ));
GLOBAL BOOLEAN Parse_Request PARAMS((CONN_ID Idx, CHAR *Request ));
GLOBAL COMMAND *Parse_GetCommandStruct PARAMS(( void ));
GLOBAL COMMAND *Parse_GetCommandStruct PARAMS(( VOID ));
#endif

View File

@@ -1,6 +1,6 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001-2004 by Alexander Barton (alex@barton.de)
* Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -8,11 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* Rendezvous service registration.
*
* Supported APIs are:
* - Apple Mac OS X
* - Howl
* Rendezvous service registration (using Mach Ports, e.g. Mac OS X)
*/
@@ -21,7 +17,7 @@
#ifdef RENDEZVOUS
static char UNUSED id[] = "$Id: rendezvous.c,v 1.5 2005/03/19 18:43:49 fw Exp $";
static char UNUSED id[] = "$Id: rendezvous.c,v 1.2 2003/03/27 01:24:32 alex Exp $";
#include "imp.h"
#include <assert.h>
@@ -38,10 +34,6 @@ static char UNUSED id[] = "$Id: rendezvous.c,v 1.5 2005/03/19 18:43:49 fw Exp $"
#include <DNSServiceDiscovery/DNSServiceDiscovery.h>
#endif
#ifdef HAVE_RENDEZVOUS_RENDEZVOUS_H
#include <rendezvous/rendezvous.h>
#endif
#include "defines.h"
#include "log.h"
@@ -49,124 +41,73 @@ static char UNUSED id[] = "$Id: rendezvous.c,v 1.5 2005/03/19 18:43:49 fw Exp $"
#include "rendezvous.h"
#if defined(HAVE_DNSSERVICEREGISTRATIONCREATE)
# define APPLE
#elif defined(HAVE_SW_DISCOVERY_INIT)
# define HOWL
#else
# error "Can't detect Rendezvous API!?"
#endif
typedef struct _service
{
dns_service_discovery_ref Discovery_Ref;
mach_port_t Mach_Port;
CHAR Desc[CLIENT_ID_LEN];
} SERVICE;
LOCAL VOID Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrCode, VOID *Context );
LOCAL VOID Unregister( INT Idx );
#define MAX_RENDEZVOUS 1000
#define MAX_MACH_MSG_SIZE 512
typedef struct _service
{
char Desc[CLIENT_ID_LEN];
#ifdef APPLE
dns_service_discovery_ref Discovery_Ref;
mach_port_t Mach_Port;
#endif
#ifdef HOWL
sw_discovery_oid Id;
#endif
} SERVICE;
LOCAL SERVICE My_Rendezvous[MAX_RENDEZVOUS];
LOCAL void Unregister( int Idx );
/* -- Apple API -- */
#ifdef APPLE
#define MAX_MACH_MSG_SIZE 512
LOCAL void Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrCode, void *Context );
#endif /* Apple */
/* -- Howl API -- */
#ifdef HOWL
LOCAL sw_discovery My_Discovery_Session = NULL;
LOCAL sw_salt My_Salt;
LOCAL sw_result HOWL_API Registration_Reply_Handler( sw_discovery Session, sw_discovery_publish_status Status, sw_discovery_oid Id, sw_opaque Extra );
#endif /* Howl */
GLOBAL void Rendezvous_Init( void )
GLOBAL VOID Rendezvous_Init( VOID )
{
/* Initialize structures */
int i;
#ifdef HOWL
if( sw_discovery_init( &My_Discovery_Session ) != SW_OKAY )
{
Log( LOG_EMERG, "Can't initialize Rendezvous (Howl): sw_discovery_init() failed!" );
Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME );
exit( 1 );
}
if( sw_discovery_salt( My_Discovery_Session, &My_Salt ) != SW_OKAY )
{
Log( LOG_EMERG, "Can't initialize Rendezvous (Howl): sw_discovery_salt() failed!" );
Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME );
exit( 1 );
}
#endif
for( i = 0; i < MAX_RENDEZVOUS; i++ ) My_Rendezvous[i].Desc[0] = '\0';
} /* Rendezvous_Init */
GLOBAL void Rendezvous_Exit( void )
{
/* Clean up & exit module */
int i;
INT i;
for( i = 0; i < MAX_RENDEZVOUS; i++ )
{
if( My_Rendezvous[i].Desc[0] ) Unregister( i );
My_Rendezvous[i].Discovery_Ref = 0;
My_Rendezvous[i].Mach_Port = 0;
}
} /* Rendezvous_Init */
#ifdef HOWL
sw_discovery_fina( My_Discovery_Session );
#endif
GLOBAL VOID Rendezvous_Exit( VOID )
{
/* Clean up & exit module */
INT i;
for( i = 0; i < MAX_RENDEZVOUS; i++ )
{
if( My_Rendezvous[i].Discovery_Ref ) Unregister( i );
}
} /* Rendezvous_Exit */
GLOBAL bool Rendezvous_Register( char *Name, char *Type, unsigned int Port )
GLOBAL BOOLEAN Rendezvous_Register( CHAR *Name, CHAR *Type, UINT Port )
{
/* Register new service */
int i;
INT i;
/* Search free port structure */
for( i = 0; i < MAX_RENDEZVOUS; i++ ) if( ! My_Rendezvous[i].Desc[0] ) break;
for( i = 0; i < MAX_RENDEZVOUS; i++ ) if( ! My_Rendezvous[i].Discovery_Ref ) break;
if( i >= MAX_RENDEZVOUS )
{
Log( LOG_ERR, "Can't register \"%s\" with Rendezvous: limit (%d) reached!", Name, MAX_RENDEZVOUS );
return false;
return FALSE;
}
strlcpy( My_Rendezvous[i].Desc, Name, sizeof( My_Rendezvous[i].Desc ));
#ifdef APPLE
/* Register new service */
My_Rendezvous[i].Discovery_Ref = DNSServiceRegistrationCreate( Name, Type, "", htonl( Port ), "", Registration_Reply_Handler, &My_Rendezvous[i] );
My_Rendezvous[i].Discovery_Ref = DNSServiceRegistrationCreate( Name, Type, "", htonl( Port ), "", Registration_Reply_Handler, My_Rendezvous[i].Desc );
if( ! My_Rendezvous[i].Discovery_Ref )
{
Log( LOG_ERR, "Can't register \"%s\" with Rendezvous: can't register service!", My_Rendezvous[i].Desc );
My_Rendezvous[i].Desc[0] = '\0';
return false;
return FALSE;
}
/* Get and save the corresponding Mach Port */
@@ -176,39 +117,28 @@ GLOBAL bool Rendezvous_Register( char *Name, char *Type, unsigned int Port )
Log( LOG_ERR, "Can't register \"%s\" with Rendezvous: got no Mach Port!", My_Rendezvous[i].Desc );
/* Here we actually leek a descriptor :-( */
My_Rendezvous[i].Discovery_Ref = 0;
My_Rendezvous[i].Desc[0] = '\0';
return false;
return FALSE;
}
#endif /* Apple */
#ifdef HOWL
if( sw_discovery_publish( My_Discovery_Session, 0, Name, Type, NULL, NULL, Port, NULL, 0, Registration_Reply_Handler, &My_Rendezvous[i], &My_Rendezvous[i].Id ) != SW_OKAY )
{
Log( LOG_ERR, "Can't register \"%s\" with Rendezvous: can't register service!", My_Rendezvous[i].Desc );
My_Rendezvous[i].Desc[0] = '\0';
return false;
}
#endif /* Howl */
Log( LOG_DEBUG, "Rendezvous: Registering \"%s\" ...", My_Rendezvous[i].Desc );
return true;
return TRUE;
} /* Rendezvous_Register */
GLOBAL bool Rendezvous_Unregister( char *Name )
GLOBAL BOOLEAN Rendezvous_Unregister( CHAR *Name )
{
/* Unregister service from rendezvous */
int i;
bool ok;
INT i;
BOOLEAN ok;
ok = false;
ok = FALSE;
for( i = 0; i < MAX_RENDEZVOUS; i++ )
{
if( strcmp( Name, My_Rendezvous[i].Desc ) == 0 )
{
Unregister( i );
ok = true;
ok = TRUE;
}
}
@@ -216,27 +146,26 @@ GLOBAL bool Rendezvous_Unregister( char *Name )
} /* Rendezvous_Unregister */
GLOBAL void Rendezvous_UnregisterListeners( void )
GLOBAL VOID Rendezvous_UnregisterListeners( VOID )
{
/* Unregister all our listening sockets from Rendezvous */
int i;
INT i;
for( i = 0; i < MAX_RENDEZVOUS; i++ )
{
if( My_Rendezvous[i].Desc[0] ) Unregister( i );
if( My_Rendezvous[i].Discovery_Ref ) Unregister( i );
}
} /* Rendezvous_UnregisterListeners */
GLOBAL void Rendezvous_Handler( void )
GLOBAL VOID Rendezvous_Handler( VOID )
{
/* Handle all Rendezvous stuff; this function must be called
* periodically from the run loop of the main program */
#ifdef APPLE
int i;
char buffer[MAX_MACH_MSG_SIZE];
INT i;
CHAR buffer[MAX_MACH_MSG_SIZE];
mach_msg_return_t result;
mach_msg_header_t *msg;
@@ -251,53 +180,20 @@ GLOBAL void Rendezvous_Handler( void )
/* Handle message */
if( result == MACH_MSG_SUCCESS ) DNSServiceDiscovery_handleReply( msg );
#ifdef DEBUG
else if( result != MACH_RCV_TIMED_OUT ) Log( LOG_DEBUG, "mach_msg(): %ld", (long)result );
#endif /* Debug */
}
#endif /* Apple */
#ifdef HOWL
sw_ulong msecs = 10;
sw_salt_step( My_Salt, &msecs );
else if( result != MACH_RCV_TIMED_OUT ) Log( LOG_DEBUG, "mach_msg(): %ld", (LONG)result );
#endif
}
} /* Rendezvous_Handler */
LOCAL void Unregister( int Idx )
LOCAL VOID Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrCode, VOID *Context )
{
/* Unregister service */
#ifdef APPLE
DNSServiceDiscoveryDeallocate( My_Rendezvous[Idx].Discovery_Ref );
#endif /* Apple */
#ifdef HOWL
if( sw_discovery_cancel( My_Discovery_Session, My_Rendezvous[Idx].Id ) != SW_OKAY )
{
Log( LOG_ERR, "Rendezvous: Failed to unregister \"%s\"!", My_Rendezvous[Idx].Desc );
return;
}
#endif /* Howl */
Log( LOG_INFO, "Unregistered \"%s\" from Rendezvous.", My_Rendezvous[Idx].Desc );
My_Rendezvous[Idx].Desc[0] = '\0';
} /* Unregister */
/* -- Apple API -- */
#ifdef APPLE
LOCAL void Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrCode, void *Context )
{
SERVICE *s = (SERVICE *)Context;
char txt[50];
CHAR txt[50];
if( ErrCode == kDNSServiceDiscoveryNoError )
{
/* Success! */
Log( LOG_INFO, "Successfully registered \"%s\" with Rendezvous.", s->Desc );
Log( LOG_INFO, "Successfully registered \"%s\" with Rendezvous.", Context ? Context : "NULL" );
return;
}
@@ -310,54 +206,21 @@ LOCAL void Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrC
strcpy( txt, "name conflict!" );
break;
default:
sprintf( txt, "error code %ld!", (long)ErrCode );
sprintf( txt, "error code %ld!", (LONG)ErrCode );
}
Log( LOG_INFO, "Can't register \"%s\" with Rendezvous: %s", s->Desc, txt );
s->Desc[0] = '\0';
Log( LOG_INFO, "Can't register \"%s\" with Rendezvous: %s", Context ? Context : "NULL", txt );
} /* Registration_Reply_Handler */
#endif /* Apple */
/* -- Howl API -- */
#ifdef HOWL
LOCAL sw_result HOWL_API Registration_Reply_Handler( sw_discovery Session, sw_discovery_publish_status Status, UNUSED sw_discovery_oid Id, sw_opaque Extra )
LOCAL VOID Unregister( INT Idx )
{
SERVICE *s = (SERVICE *)Extra;
char txt[50];
/* Unregister service */
assert( Session == My_Discovery_Session );
assert( Extra != NULL );
if( Status == SW_DISCOVERY_PUBLISH_STARTED || Status == SW_DISCOVERY_PUBLISH_STOPPED )
{
/* Success! */
Log( LOG_INFO, "Successfully registered \"%s\" with Rendezvous.", s->Desc );
return SW_OKAY;
}
switch( Status )
{
case SW_DISCOVERY_PUBLISH_NAME_COLLISION:
strcpy( txt, "name conflict!" );
break;
default:
sprintf( txt, "error code %ld!", (long)Status );
}
Log( LOG_INFO, "Can't register \"%s\" with Rendezvous: %s", s->Desc, txt );
s->Desc[0] = '\0';
return SW_OKAY;
} /* Registration_Reply_Handler */
#endif /* Howl */
DNSServiceDiscoveryDeallocate( My_Rendezvous[Idx].Discovery_Ref );
Log( LOG_INFO, "Unregistered \"%s\" from Rendezvous.", My_Rendezvous[Idx].Desc );
My_Rendezvous[Idx].Discovery_Ref = 0;
} /* Unregister */
#endif /* RENDEZVOUS */

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: rendezvous.h,v 1.2 2005/03/19 18:43:49 fw Exp $
* $Id: rendezvous.h,v 1.1 2003/02/23 12:02:26 alex Exp $
*
* "Rendezvous" functions (Header)
*/
@@ -20,15 +20,15 @@
#define __rdezvous_h__
GLOBAL void Rendezvous_Init( void );
GLOBAL void Rendezvous_Exit( void );
GLOBAL VOID Rendezvous_Init( VOID );
GLOBAL VOID Rendezvous_Exit( VOID );
GLOBAL bool Rendezvous_Register( char *Name, char *Type, unsigned int Port );
GLOBAL BOOLEAN Rendezvous_Register( CHAR *Name, CHAR *Type, UINT Port );
GLOBAL bool Rendezvous_Unregister( char *Name );
GLOBAL void Rendezvous_UnregisterListeners( void );
GLOBAL BOOLEAN Rendezvous_Unregister( CHAR *Name );
GLOBAL VOID Rendezvous_UnregisterListeners( VOID );
GLOBAL void Rendezvous_Handler( void );
GLOBAL VOID Rendezvous_Handler( VOID );
#endif /* __rdezvous_h__ */

View File

@@ -14,7 +14,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: resolve.c,v 1.12.2.1 2005/09/02 22:07:38 fw Exp $";
static char UNUSED id[] = "$Id: resolve.c,v 1.8.2.1 2004/05/15 23:52:17 alex Exp $";
#include "imp.h"
#include <assert.h>
@@ -42,22 +42,20 @@ static char UNUSED id[] = "$Id: resolve.c,v 1.12.2.1 2005/09/02 22:07:38 fw Exp
#ifdef IDENTAUTH
LOCAL void Do_ResolveAddr PARAMS(( struct sockaddr_in *Addr, int Sock, int w_fd ));
LOCAL VOID Do_ResolveAddr PARAMS(( struct sockaddr_in *Addr, INT Sock, INT w_fd ));
#else
LOCAL void Do_ResolveAddr PARAMS(( struct sockaddr_in *Addr, int w_fd ));
LOCAL VOID Do_ResolveAddr PARAMS(( struct sockaddr_in *Addr, INT w_fd ));
#endif
LOCAL void Do_ResolveName PARAMS(( char *Host, int w_fd ));
LOCAL VOID Do_ResolveName PARAMS(( CHAR *Host, INT w_fd ));
#ifdef h_errno
LOCAL char *Get_Error PARAMS(( int H_Error ));
LOCAL CHAR *Get_Error PARAMS(( INT H_Error ));
#endif
LOCAL RES_STAT *New_Res_Stat PARAMS(( void ));
GLOBAL void
Resolve_Init( void )
GLOBAL VOID
Resolve_Init( VOID )
{
/* Initialize module */
@@ -77,10 +75,23 @@ Resolve_Addr( struct sockaddr_in *Addr )
* can't be forked, this functions returns NULL. */
RES_STAT *s;
int pid;
INT pid;
s = New_Res_Stat( );
if( ! s ) return NULL;
/* Allocate memory */
s = (RES_STAT *)malloc( sizeof( RES_STAT ));
if( ! s )
{
Log( LOG_EMERG, "Resolver: Can't allocate memory! [Resolve_Addr]" );
return NULL;
}
/* Initialize pipe for result */
if( pipe( s->pipe ) != 0 )
{
free( s );
Log( LOG_ALERT, "Resolver: Can't create output pipe: %s!", strerror( errno ));
return NULL;
}
/* For sub-process */
pid = fork( );
@@ -91,6 +102,8 @@ Resolve_Addr( struct sockaddr_in *Addr )
FD_SET( s->pipe[0], &Resolver_FDs );
if( s->pipe[0] > Conn_MaxFD ) Conn_MaxFD = s->pipe[0];
s->pid = pid;
s->stage = 0;
s->bufpos = 0;
return s;
}
else if( pid == 0 )
@@ -108,8 +121,6 @@ Resolve_Addr( struct sockaddr_in *Addr )
else
{
/* Error! */
close(s->pipe[0]);
close(s->pipe[1]);
free( s );
Log( LOG_CRIT, "Resolver: Can't fork: %s!", strerror( errno ));
return NULL;
@@ -118,16 +129,29 @@ Resolve_Addr( struct sockaddr_in *Addr )
GLOBAL RES_STAT *
Resolve_Name( char *Host )
Resolve_Name( CHAR *Host )
{
/* Resolve hostname (asynchronous!). On errors, e.g. if the child
* process can't be forked, this functions returns NULL. */
RES_STAT *s;
int pid;
INT pid;
s = New_Res_Stat( );
if( ! s ) return NULL;
/* Allocate memory */
s = (RES_STAT *)malloc( sizeof( RES_STAT ));
if( ! s )
{
Log( LOG_EMERG, "Resolver: Can't allocate memory! [Resolve_Name]" );
return NULL;
}
/* Initialize the pipe for the result */
if( pipe( s->pipe ) != 0 )
{
free( s );
Log( LOG_ALERT, "Resolver: Can't create output pipe: %s!", strerror( errno ));
return NULL;
}
/* Fork sub-process */
pid = fork( );
@@ -138,6 +162,8 @@ Resolve_Name( char *Host )
FD_SET( s->pipe[0], &Resolver_FDs );
if( s->pipe[0] > Conn_MaxFD ) Conn_MaxFD = s->pipe[0];
s->pid = pid;
s->stage = 0;
s->bufpos = 0;
return s;
}
else if( pid == 0 )
@@ -151,8 +177,6 @@ Resolve_Name( char *Host )
else
{
/* Error! */
close(s->pipe[0]);
close(s->pipe[1]);
free( s );
Log( LOG_CRIT, "Resolver: Can't fork: %s!", strerror( errno ));
return NULL;
@@ -161,26 +185,26 @@ Resolve_Name( char *Host )
#ifdef IDENTAUTH
LOCAL void
Do_ResolveAddr( struct sockaddr_in *Addr, int Sock, int w_fd )
LOCAL VOID
Do_ResolveAddr( struct sockaddr_in *Addr, int Sock, INT w_fd )
#else
LOCAL void
Do_ResolveAddr( struct sockaddr_in *Addr, int w_fd )
LOCAL VOID
Do_ResolveAddr( struct sockaddr_in *Addr, INT w_fd )
#endif
{
/* Resolver sub-process: resolve IP address and write result into
* pipe to parent. */
char hostname[HOST_LEN];
CHAR hostname[HOST_LEN];
struct hostent *h;
size_t len;
INT len;
#ifdef IDENTAUTH
char *res;
CHAR *res;
#endif
/* Resolve IP address */
Log_Resolver( LOG_DEBUG, "Now resolving %s ...", inet_ntoa( Addr->sin_addr ));
h = gethostbyaddr( (char *)&Addr->sin_addr, sizeof( Addr->sin_addr ), AF_INET );
h = gethostbyaddr( (CHAR *)&Addr->sin_addr, sizeof( Addr->sin_addr ), AF_INET );
if( h ) strlcpy( hostname, h->h_name, sizeof( hostname ));
else
{
@@ -210,12 +234,9 @@ Do_ResolveAddr( struct sockaddr_in *Addr, int w_fd )
Log_Resolver( LOG_DEBUG, "Ok, IDENT lookup on socket %d done: \"%s\"", Sock, res ? res : "" );
/* Write IDENT result into pipe to parent */
if (res) {
len = strlen(res);
res[len] = '\n';
len++;
} else len = 1;
len = strlen( res ? res : "" );
if( res != NULL ) res[len] = '\n';
len++;
if( (size_t)write( w_fd, res ? res : "\n", len ) != (size_t)len )
{
Log_Resolver( LOG_CRIT, "Resolver: Can't write to parent (IDENT): %s!", strerror( errno ));
@@ -226,16 +247,16 @@ Do_ResolveAddr( struct sockaddr_in *Addr, int w_fd )
} /* Do_ResolveAddr */
LOCAL void
Do_ResolveName( char *Host, int w_fd )
LOCAL VOID
Do_ResolveName( CHAR *Host, INT w_fd )
{
/* Resolver sub-process: resolve name and write result into pipe
* to parent. */
char ip[16];
CHAR ip[16];
struct hostent *h;
struct in_addr *addr;
int len;
INT len;
Log_Resolver( LOG_DEBUG, "Now resolving \"%s\" ...", Host );
@@ -253,7 +274,7 @@ Do_ResolveName( char *Host, int w_fd )
#else
Log_Resolver( LOG_WARNING, "Can't resolve \"%s\"!", Host );
#endif
ip[0] = '\0';
strcpy( ip, "" );
}
if( ip[0] ) Log_Resolver( LOG_DEBUG, "Ok, translated \"%s\" to %s.", Host, ip );
@@ -270,8 +291,8 @@ Do_ResolveName( char *Host, int w_fd )
#ifdef h_errno
LOCAL char *
Get_Error( int H_Error )
LOCAL CHAR *
Get_Error( INT H_Error )
{
/* Get error message for H_Error */
@@ -293,33 +314,4 @@ Get_Error( int H_Error )
#endif
LOCAL RES_STAT *
New_Res_Stat( void )
{
RES_STAT *s;
/* Allocate memory */
s = (RES_STAT *)malloc( sizeof( RES_STAT ));
if( ! s )
{
Log( LOG_EMERG, "Resolver: Can't allocate memory! [Resolve_Addr]" );
return NULL;
}
/* Initialize pipe for result */
if( pipe( s->pipe ) != 0 )
{
free( s );
Log( LOG_ALERT, "Resolver: Can't create output pipe: %s!", strerror( errno ));
return NULL;
}
s->stage = 0;
s->bufpos = 0;
s->pid = -1;
return s;
} /* New_Res_Stat */
/* -eof- */

View File

@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: resolve.h,v 1.8 2005/03/19 18:43:49 fw Exp $
* $Id: resolve.h,v 1.6.2.1 2004/05/15 23:52:17 alex Exp $
*
* Asynchronous resolver (header)
*/
@@ -27,18 +27,18 @@
typedef struct _Res_Stat
{
int pid; /* PID des Child-Prozess */
int pipe[2]; /* Pipe fuer IPC */
int stage; /* Hostname/IP(0) or IDENT(1)? */
int bufpos; /* Position in buffer */
char buffer[HOST_LEN]; /* Buffer */
INT pid; /* PID des Child-Prozess */
INT pipe[2]; /* Pipe fuer IPC */
INT stage; /* Hostname/IP(0) or IDENT(1)? */
INT bufpos; /* Position in buffer */
CHAR buffer[HOST_LEN]; /* Buffer */
} RES_STAT;
GLOBAL fd_set Resolver_FDs;
GLOBAL void Resolve_Init PARAMS(( void ));
GLOBAL VOID Resolve_Init PARAMS(( VOID ));
#ifdef IDENTAUTH
GLOBAL RES_STAT *Resolve_Addr PARAMS(( struct sockaddr_in *Addr, int Sock ));
@@ -46,7 +46,7 @@ GLOBAL RES_STAT *Resolve_Addr PARAMS(( struct sockaddr_in *Addr, int Sock ));
GLOBAL RES_STAT *Resolve_Addr PARAMS(( struct sockaddr_in *Addr ));
#endif
GLOBAL RES_STAT *Resolve_Name PARAMS(( char *Host ));
GLOBAL RES_STAT *Resolve_Name PARAMS(( CHAR *Host ));
#endif

View File

@@ -9,14 +9,14 @@
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
#
# $Id: Makefile.am,v 1.8 2005/04/16 09:23:01 fw Exp $
# $Id: Makefile.am,v 1.7 2003/01/03 22:04:14 alex Exp $
#
AUTOMAKE_OPTIONS = ansi2knr
noinst_LIBRARIES = libngportab.a
libngportab_a_SOURCES = strlcpy.c strdup.c vsnprintf.c
libngportab_a_SOURCES = strlcpy.c vsnprintf.c
check_PROGRAMS = portabtest

View File

@@ -1,6 +1,6 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001-2005 Alexander Barton (alex@barton.de)
* Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -8,7 +8,7 @@
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
* $Id: portab.h,v 1.21 2005/04/16 09:23:01 fw Exp $
* $Id: portab.h,v 1.17 2004/03/15 19:26:39 alex Exp $
*
* Portability functions and declarations (header for libngbportab).
*/
@@ -20,31 +20,10 @@
#include "config.h"
#ifndef DEBUG
# define NDEBUG
#endif
#ifdef HAVE_SYS_TYPES_H
# include <sys/types.h>
#endif
#ifdef HAVE_INTTYPES_H
# include <inttypes.h>
# define NGIRC_GOT_INTTYPES
#else
# ifdef HAVE_STDINT_H
# include <stdint.h>
# define NGIRC_GOT_INTTYPES
# endif
#endif
#ifdef HAVE_STDDEF_H
# include <stddef.h>
#endif
#ifdef HAVE_STDBOOL_H
# include <stdbool.h>
#endif
/* compiler features */
@@ -66,7 +45,13 @@
/* keywords */
#define EXTERN extern
#define STATIC static
#define LOCAL static
#define CONST const
#define REGISTER register
/* datatypes */
@@ -76,31 +61,40 @@
# endif
#endif
typedef void VOID;
typedef void POINTER;
#ifdef NGIRC_GOT_INTTYPES
typedef uint8_t UINT8;
typedef uint16_t UINT16;
typedef uint32_t UINT32;
#else
typedef signed int INT;
typedef unsigned int UINT;
typedef signed long LONG;
typedef unsigned long ULONG;
typedef signed char INT8;
typedef unsigned char UINT8;
typedef signed short INT16;
typedef unsigned short UINT16;
typedef unsigned int UINT32;
#endif
typedef signed long INT32;
typedef unsigned long UINT32;
#ifndef HAVE_STDBOOL_H
typedef unsigned char bool;
#define true (bool)1
#define false (bool)0
#endif
typedef double DOUBLE;
typedef float FLOAT;
#ifndef NULL
typedef char CHAR;
typedef UINT8 BOOLEAN;
#undef TRUE
#define TRUE (BOOLEAN)1
#undef FALSE
#define FALSE (BOOLEAN)0
#undef NULL
#ifdef PROTOTYPES
# define NULL (void *)0
# define NULL (VOID *)0
#else
# define NULL 0L
#endif
#endif
#undef GLOBAL
#define GLOBAL
@@ -132,28 +126,24 @@ typedef unsigned char bool;
/* configure options */
#ifndef HAVE_socklen_t
typedef int socklen_t; /* for Mac OS X, amongst others */
#define socklen_t int /* u.a. fuer Mac OS X */
#endif
#ifndef HAVE_SNPRINTF
extern int snprintf PARAMS(( char *str, size_t count, const char *fmt, ... ));
EXTERN INT snprintf PARAMS(( CHAR *str, size_t count, CONST CHAR *fmt, ... ));
#endif
#ifndef HAVE_STRLCAT
extern size_t strlcat PARAMS(( char *dst, const char *src, size_t size ));
EXTERN size_t strlcat PARAMS(( CHAR *dst, CONST CHAR *src, size_t size ));
#endif
#ifndef HAVE_STRLCPY
extern size_t strlcpy PARAMS(( char *dst, const char *src, size_t size ));
#endif
#ifndef HAVE_STRDUP
extern char * strdup PARAMS(( const char *s ));
EXTERN size_t strlcpy PARAMS(( CHAR *dst, CONST CHAR *src, size_t size ));
#endif
#ifndef HAVE_VSNPRINTF
#include <stdarg.h>
extern int vsnprintf PARAMS(( char *str, size_t count, const char *fmt, va_list args ));
EXTERN INT vsnprintf PARAMS(( CHAR *str, size_t count, CONST CHAR *fmt, va_list args ));
#endif
#ifndef PACKAGE_NAME

View File

@@ -14,7 +14,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: portabtest.c,v 1.12 2005/03/19 18:43:50 fw Exp $";
static char UNUSED id[] = "$Id: portabtest.c,v 1.11 2003/01/04 10:40:01 alex Exp $";
#include "imp.h"
#include <stdarg.h>
@@ -25,17 +25,20 @@ static char UNUSED id[] = "$Id: portabtest.c,v 1.12 2005/03/19 18:43:50 fw Exp $
#include "exp.h"
LOCAL void Panic PARAMS (( char *Reason, int Code ));
LOCAL VOID Panic PARAMS (( CHAR *Reason, INT Code ));
GLOBAL int
main( void )
main( VOID )
{
/* validate datatypes */
if( false != 0 ) Panic( "false", 1 );
if( true != 1 ) Panic( "true", 1 );
if( FALSE != 0 ) Panic( "FALSE", 1 );
if( TRUE != 1 ) Panic( "TRUE", 1 );
if( sizeof( INT8 ) != 1 ) Panic( "INT8", 1 );
if( sizeof( UINT8 ) != 1 ) Panic( "UINT8", 1 );
if( sizeof( INT16 ) != 2 ) Panic( "INT16", 1 );
if( sizeof( UINT16 ) != 2 ) Panic( "UINT16", 1 );
if( sizeof( INT32 ) != 4 ) Panic( "INT32", 1 );
if( sizeof( UINT32 ) != 4 ) Panic( "UINT32", 1 );
#ifdef PROTOTYPES
@@ -51,8 +54,8 @@ main( void )
} /* portab_check_types */
LOCAL void
Panic( char *Reason, int Code )
LOCAL VOID
Panic( CHAR *Reason, INT Code )
{
/* Oops, something failed!? */
fprintf( stderr, "Oops, test for %s failed!?", Reason );

View File

@@ -1,35 +0,0 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
*
* strdup() implementation. Public domain.
*
* $Id: strdup.c,v 1.1 2005/04/16 09:20:53 fw Exp $
*/
#include "portab.h"
#include "imp.h"
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include "exp.h"
#ifndef HAVE_STRDUP
GLOBAL char *
strdup( const char *s )
{
char *dup;
size_t len = strlen( s );
size_t alloc = len + 1;
if (len >= alloc ) return NULL;
dup = malloc( alloc );
if (dup) strlcpy(dup, s, alloc );
return dup;
}
#endif

View File

@@ -1,6 +1,6 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001-2005 Alexander Barton (alex@barton.de)
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -13,13 +13,13 @@
*
* Code partially borrowed from compat.c of rsync, written by Andrew
* Tridgell (1998) and Martin Pool (2002):
* <http://cvs.samba.org/cgi-bin/cvsweb/rsync/lib/compat.c>
* <http://samba.anu.edu.au/rsync/doxygen/head/lib_2compat_8c.html>
*/
#include "portab.h"
static char UNUSED id[] = "$Id: strlcpy.c,v 1.5 2005/03/19 18:43:50 fw Exp $";
static char UNUSED id[] = "$Id: strlcpy.c,v 1.2.4.1 2005/01/18 09:09:05 alex Exp $";
#include "imp.h"
#include <string.h>
@@ -31,7 +31,7 @@ static char UNUSED id[] = "$Id: strlcpy.c,v 1.5 2005/03/19 18:43:50 fw Exp $";
#ifndef HAVE_STRLCAT
GLOBAL size_t
strlcat( char *dst, const char *src, size_t size )
strlcat( CHAR *dst, CONST CHAR *src, size_t size )
{
/* Like strncat() but does not 0 fill the buffer and
* always null terminates. */
@@ -39,10 +39,10 @@ strlcat( char *dst, const char *src, size_t size )
size_t len1 = strlen( dst );
size_t len2 = strlen( src );
size_t ret = len1 + len2;
if( size && ( len1 < size - 1 )) {
if( len2 >= size - len1 )
len2 = size - len1 - 1;
if( len1 + len2 >= size ) len2 = size - ( len1 + 1 );
if( len2 > 0 )
{
memcpy( dst + len1, src, len2 );
dst[len1 + len2] = 0;
}
@@ -55,7 +55,7 @@ strlcat( char *dst, const char *src, size_t size )
#ifndef HAVE_STRLCPY
GLOBAL size_t
strlcpy( char *dst, const char *src, size_t size )
strlcpy( CHAR *dst, CONST CHAR *src, size_t size )
{
/* Like strncpy but does not 0 fill the buffer and
* always null terminates. */
@@ -63,11 +63,10 @@ strlcpy( char *dst, const char *src, size_t size )
size_t len = strlen( src );
size_t ret = len;
if( size > 0 ) {
if( len >= size ) len = size - 1;
memcpy( dst, src, len );
dst[len] = 0;
}
if( size <= 0 ) return 0;
if( len >= size ) len = size - 1;
memcpy( dst, src, len );
dst[len] = 0;
return ret;
} /* strlcpy */

View File

@@ -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.9.6.3 2004/09/08 09:45:53 alex Exp $
#
AUTOMAKE_OPTIONS = ../portab/ansi2knr

View File

@@ -69,4 +69,4 @@ stress-B.e
--
$Id: README,v 1.1 2004/09/04 13:58:31 alex Exp $
$Id: README,v 1.1.2.1 2004/09/04 20:49:36 alex Exp $

View File

@@ -1,4 +1,4 @@
# $Id: check-idle.e,v 1.2 2004/09/04 14:22:13 alex Exp $
# $Id: check-idle.e,v 1.1.8.1 2004/09/04 20:49:36 alex Exp $
spawn telnet localhost 6789
expect {

View File

@@ -9,7 +9,7 @@
# (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information.
#
# $Id: functions.inc,v 1.1 2004/09/06 22:04:06 alex Exp $
# $Id: functions.inc,v 1.1.2.1 2004/09/06 22:07:26 alex Exp $
#
# test how to call echo to get output without newline

View File

@@ -1,6 +1,6 @@
#!/bin/sh
# ngIRCd Test Suite
# $Id: start-server.sh,v 1.14 2004/09/06 22:04:06 alex Exp $
# $Id: start-server.sh,v 1.11.2.2 2004/09/06 22:07:26 alex Exp $
[ -z "$srcdir" ] && srcdir=`dirname $0`

View File

@@ -1,6 +1,6 @@
#!/bin/sh
# ngIRCd Test Suite
# $Id: stop-server.sh,v 1.13 2004/09/06 22:04:06 alex Exp $
# $Id: stop-server.sh,v 1.10.2.3 2004/09/06 22:07:26 alex Exp $
[ -z "$srcdir" ] && srcdir=`dirname $0`

View File

@@ -9,7 +9,7 @@
# (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information.
#
# $Id: stress-server.sh,v 1.15 2004/09/06 22:04:06 alex Exp $
# $Id: stress-server.sh,v 1.8.2.2 2004/09/06 22:07:26 alex Exp $
#
# detect source directory

View File

@@ -9,7 +9,7 @@
# (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information.
#
# $Id: test-loop.sh,v 1.2 2004/09/04 19:14:46 alex Exp $
# $Id: test-loop.sh,v 1.2.2.1 2004/09/04 20:49:36 alex Exp $
#
# detect source directory

View File

@@ -1,6 +1,6 @@
#!/bin/sh
# ngIRCd Test Suite
# $Id: tests.sh,v 1.7 2004/09/06 22:04:06 alex Exp $
# $Id: tests.sh,v 1.4.2.2 2004/09/06 22:07:26 alex Exp $
# detect source directory
[ -z "$srcdir" ] && srcdir=`dirname $0`

View File

@@ -9,7 +9,7 @@
# (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information.
#
# $Id: wait-tests.sh,v 1.4 2004/09/06 22:04:06 alex Exp $
# $Id: wait-tests.sh,v 1.3.2.2 2004/09/06 22:07:26 alex Exp $
#
[ "$1" -gt 0 ] 2> /dev/null && MAX="$1" || MAX=5

View File

@@ -1,6 +1,6 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001-2005 Alexander Barton (alex@barton.de)
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -14,7 +14,7 @@
#include "portab.h"
static char UNUSED id[] = "$Id: tool.c,v 1.3 2005/03/19 18:43:52 fw Exp $";
static char UNUSED id[] = "$Id: tool.c,v 1.1 2003/01/13 12:20:16 alex Exp $";
#include "imp.h"
#include <assert.h>
@@ -26,14 +26,14 @@ static char UNUSED id[] = "$Id: tool.c,v 1.3 2005/03/19 18:43:52 fw Exp $";
#include "tool.h"
GLOBAL void
ngt_TrimStr( char *String )
GLOBAL VOID
ngt_TrimStr( CHAR *String )
{
/* Mit ngt_TrimStr() werden fuehrende und folgende Leerzeichen,
* Tabulatoren und Zeilenumbrueche (ASCII 10 und ASCII 13) aus
* dem String entfernt. */
char *start, *ptr;
CHAR *start, *ptr;
assert( String != NULL );
@@ -51,14 +51,14 @@ ngt_TrimStr( char *String )
} /* ngt_TrimStr */
GLOBAL char *
ngt_LowerStr( char *String )
GLOBAL CHAR *
ngt_LowerStr( CHAR *String )
{
/* String in Kleinbuchstaben konvertieren. Der uebergebene
* Speicherbereich wird durch das Ergebnis ersetzt, zusaetzlich
* wird dieser auch als Pointer geliefert. */
char *ptr;
CHAR *ptr;
assert( String != NULL );
@@ -74,23 +74,4 @@ ngt_LowerStr( char *String )
} /* ngt_LowerStr */
GLOBAL void
ngt_TrimLastChr( char *String, const char Chr)
{
/* If last character in the string matches Chr, remove it.
* Empty strings are handled correctly. */
unsigned int len;
assert( String != NULL );
len = strlen( String );
if( len == 0 ) return;
len--;
if( String[len] == Chr ) String[len] = '\0';
} /* ngt_TrimLastChr */
/* -eof- */

View File

@@ -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.1 2003/01/13 12:20:16 alex Exp $
*
* Tool functions (Header)
*/
@@ -18,11 +18,9 @@
#define __tool_h__
GLOBAL void ngt_TrimLastChr PARAMS((char *String, const char Chr ));
GLOBAL VOID ngt_TrimStr PARAMS((CHAR *String ));
GLOBAL void ngt_TrimStr PARAMS((char *String ));
GLOBAL char *ngt_LowerStr PARAMS((char *String ));
GLOBAL CHAR *ngt_LowerStr PARAMS((CHAR *String ));
#endif