1
0
mirror of https://github.com/osmarks/ngircd.git synced 2025-09-25 13:34:05 +00:00

Compare commits

...

1105 Commits

Author SHA1 Message Date
Alexander Barton
ab1e81841b Debian package for 0.9.2. 2006-07-23 11:45:36 +00:00
Florian Westphal
957cdda1c0 fix format string (from HEAD) 2006-03-24 23:30:34 +00:00
Florian Westphal
c35b810b90 use strlcat return value; don't call time() repeatedly. [from HEAD] 2006-03-18 22:30:45 +00:00
Florian Westphal
3179bd3090 corrected return value (from HEAD) 2006-03-16 20:14:46 +00:00
Florian Westphal
f95d813064 removed redundant (foo) { if (foo){} } clause (from HEAD) 2006-03-16 20:03:14 +00:00
Florian Westphal
a854a38616 log.c and log.h from CVSHEAD (adds LogDebug() Function) 2006-02-08 21:23:21 +00:00
Alexander Barton
51b22759b6 Return PING argument in PONG reply if STRICT_RFC is not defined [from HEAD].
Fixes Debian Bug #343200.
2005-12-15 11:01:59 +00:00
Alexander Barton
521782ad05 Fixed my email address ... argl! 2005-10-15 12:59:19 +00:00
Alexander Barton
84e23f09fc Updated autoconf scripts. 2005-10-15 12:59:00 +00:00
Alexander Barton
4429afe3c2 Version 0.9.2 2005-10-15 12:44:08 +00:00
Alexander Barton
216eb30c73 Changed Handle_Write() to not close sockets itself but to call Conn_Close. 2005-10-11 19:28:47 +00:00
Alexander Barton
ff91c6db38 Updated Changelog: fixed file descriptor leak in resolver code. 2005-09-02 22:10:58 +00:00
Florian Westphal
a8d50a1ee4 fix fd leak on fork() failure (from HEAD) 2005-09-02 22:07:38 +00:00
Alexander Barton
7962ba5fe0 Changed version string to "0.9-CVS". 2005-08-30 20:21:58 +00:00
Alexander Barton
04766b8f3d Fixed server NOTICEs to users with "s" mode ("server messages"). [from HEAD] 2005-08-29 11:19:48 +00:00
Alexander Barton
2019324741 Fixed format string bug in "connection statistics" message [from HEAD]. 2005-08-25 09:04:23 +00:00
Alexander Barton
99e718eff9 Fixed my mail address ... once more :-/ 2005-08-03 16:37:12 +00:00
Alexander Barton
61776e9a57 Preparing ngIRCd 0.9.1 ... 2005-08-03 14:27:48 +00:00
Alexander Barton
eccf4ea5f2 The KILL command killed much more than desired (including server links!)
when the target user is connected to a remote server.
2005-08-02 23:08:26 +00:00
Alexander Barton
914fbac0f1 Removed "U" unsigned suffix: caused problems with older compilers and is
not necessary for this constants. [from HEAD]
2005-07-30 23:24:50 +00:00
Alexander Barton
b6ce4ce002 New Debian release: 0.9.0-0ab2 2005-07-26 19:34:09 +00:00
Alexander Barton
1246ec04b8 Run "basename" on your script name when it is a symlink as well. 2005-07-26 19:30:54 +00:00
Alexander Barton
6335461bc1 Release 0.9.0 2005-07-24 21:39:45 +00:00
Alexander Barton
8e5d37efc8 Updated config.guess and config.sub to latest release used in Debian. 2005-07-24 21:21:11 +00:00
Alexander Barton
ac8559171b Fixed wrong email address ... 2005-07-24 21:19:40 +00:00
Alexander Barton
d052fdff78 Release 0.9.0 2005-07-24 21:14:19 +00:00
Alexander Barton
fe9525d105 Eliminate some compiler warnings ("unused parameter"). [from HEAD] 2005-07-24 21:06:51 +00:00
Alexander Barton
5b29518ae5 Updated documentation. [from HEAD] 2005-07-09 14:41:39 +00:00
Alexander Barton
b715a5f061 ngIRCd 0.9.0-pre1 2005-07-09 11:57:07 +00:00
Alexander Barton
0b31b46353 Preparations for ngIRCd 0.9.0 :-) 2005-07-09 11:50:29 +00:00
Alexander Barton
8a7ae2dfc1 Prepare for "new upstream release". 2005-07-09 11:20:05 +00:00
Alexander Barton
01ee1bdf2c Updated documentation. 2005-07-09 11:16:38 +00:00
Alexander Barton
13ee3e62be Only setuid()/setgid() if it differs from current UID/GID.
Solves problems with Cygwin. [from HEAD]
2005-07-08 23:20:04 +00:00
Alexander Barton
fc038ae444 Use "ServerUID" (and not internal variable name) for error message. [HEAD] 2005-07-08 21:05:19 +00:00
Alexander Barton
8d1fe3b89a Updated documentation. 2005-07-08 12:50:43 +00:00
Alexander Barton
d74029851f Fixed maximum length of user names, now allow up to 9 characters. [from HEAD] 2005-07-05 22:58:25 +00:00
Alexander Barton
8ff1a4b666 Cut off oversized IRC messages that should be sent to the network instead
of shuttding down the (wrong) connection. [from HEAD]
2005-07-02 14:45:07 +00:00
Alexander Barton
5f68d5f1e1 New constant "CUT_TXTSUFFIX". [from HEAD] 2005-07-02 14:44:36 +00:00
Alexander Barton
db2a41e5bc Moving towards ngIRCd 0.0.9! :-) 2005-06-27 16:12:51 +00:00
Alexander Barton
eeccc193dd Prepare documentation for release 0.9.0 ... 2005-06-26 21:54:01 +00:00
Alexander Barton
0e3ce63ec1 Fix compiler warning "comparision between signed and unsigned". 2005-06-26 13:43:59 +00:00
Alexander Barton
0c33f46fc2 Fixed wrong order of #includes in test for "socklen_t" (caused problems on OpenBSD). 2005-06-26 13:42:11 +00:00
Alexander Barton
117a9e21e7 Updated URLs. 2005-06-24 20:59:13 +00:00
Alexander Barton
162338b8c8 Ignore unknown commands received before the client is registered. 2005-06-24 20:56:46 +00:00
Alexander Barton
de395db8e3 Get rid of Log_SetDaemonized(). 2005-06-24 19:55:10 +00:00
Florian Westphal
dbea187373 removed global variable NGIRCd_NoDaemon 2005-06-24 19:20:56 +00:00
Florian Westphal
d81dab99fa put badchars back in 2005-06-18 08:57:37 +00:00
Florian Westphal
9dc5e50226 fix embarassing cut&paste error (add missing } ) 2005-06-17 23:17:09 +00:00
Florian Westphal
c06c815c28 fix "Can't get user information for UID" error message 2005-06-17 23:13:41 +00:00
Florian Westphal
04169f34cf only chdir() to users home when running as daemon 2005-06-17 20:35:45 +00:00
Florian Westphal
aec535c8b6 s/sprintf/snprintf 2005-06-17 19:16:53 +00:00
Florian Westphal
2d4dd33627 use strlcpy 2005-06-17 19:15:43 +00:00
Florian Westphal
b0699efdab remove unneeded strpy() 2005-06-17 19:14:58 +00:00
Florian Westphal
1ca8bb5255 startup: fork only once, never run with uid 0 2005-06-17 19:04:53 +00:00
Florian Westphal
bc2dac3c74 startup: fork only once, never run with uid 0. 2005-06-17 18:22:45 +00:00
Alexander Barton
94dd7fa7d6 IRC_LIST(): Added missing calls of Client_ID() and cleand up the code. 2005-06-12 18:23:59 +00:00
Florian Westphal
fcf65beea4 changed formatting to match ngircd coding style 2005-06-12 18:02:09 +00:00
Florian Westphal
1cf8ccd8fe Make sure SimpleMessage() sends <= 512 chars 2005-06-12 17:21:46 +00:00
Florian Westphal
74424cb1a5 set 3 second penalty after failed /oper command. 2005-06-12 17:18:27 +00:00
Alexander Barton
5c20474fdb Only register clients that have been connected at least 30 sec. in WHOIS database. 2005-06-12 16:39:42 +00:00
Alexander Barton
8b0ac2306e Modified Conn_StartTime() to use information of the CLIENT structure. 2005-06-12 16:32:17 +00:00
Alexander Barton
5195555c5a Removed CONNECTION[].starttime, now saved in CLIENT structure. 2005-06-12 16:28:55 +00:00
Alexander Barton
a4660f40db New function Client_StartTime(). 2005-06-12 16:18:49 +00:00
Alexander Barton
9fa9c1fdda Updated manual pages. 2005-06-04 13:39:20 +00:00
Florian Westphal
cac9f279fa send RFC compliant netsplit messages. 2005-06-04 12:32:09 +00:00
Florian Westphal
517321807e Fix Handling of quit messages: always send only one QUIT message. 2005-06-04 11:53:24 +00:00
Florian Westphal
ae98008c1c remove Try_Write(), Call Handle_Write() directly instead. 2005-06-04 11:49:20 +00:00
Alexander Barton
45404a1644 Added some Doxygen documentation. 2005-06-01 21:52:18 +00:00
Alexander Barton
50338126e0 Fixed handling of symbolic links as used in /etc/rc.X directories. 2005-06-01 21:51:11 +00:00
Florian Westphal
8ac701d6c8 add FreeRes_stat(), wait for resolver timeout. 2005-06-01 21:28:50 +00:00
Florian Westphal
158bf554c3 minor cleanup 2005-05-28 10:46:50 +00:00
Alexander Barton
9c3c7e5a09 Handle splint errors more gracefully. 2005-05-23 00:11:15 +00:00
Alexander Barton
cd0dc8627d Don't exit server if closing of a socket fails; instead ignore it and
pray that this will be "the right thing" ...
2005-05-22 23:55:57 +00:00
Alexander Barton
44fdde7610 Added version information to summary text. 2005-05-21 21:34:47 +00:00
Alexander Barton
95f8b963a6 Reformatted and documented code of the first part of the IRC_NICK()
function; and register WHOWAS entries on nickname changes, too.
2005-05-17 23:24:43 +00:00
Alexander Barton
1aeaf64c66 New function Client_RegisterWhowas(). 2005-05-17 23:18:54 +00:00
Alexander Barton
06caecb0c4 Implemented IRC function "WHOWAS". 2005-05-16 12:25:15 +00:00
Alexander Barton
b1c14598e1 New functions Client_GetWhowas and Client_GetLastWhowasIndex; new structure WHOWAS. 2005-05-16 12:24:31 +00:00
Alexander Barton
7f0d101184 New functions Client_GetWhowas, Client_GetLastWhowasIndex, and Register_Whowas. 2005-05-16 12:23:48 +00:00
Alexander Barton
9f247ebd5a New defines MAX_WHOWAS and DEFAULT_WHOWAS. 2005-05-16 12:22:32 +00:00
Alexander Barton
dd9b4bc956 Away status texts set due to "a"-Modes received from other servers have
been fixed: the status text of the server has been set instead of the
away status text of the client (most probably introduced by patch 1.36).
2005-05-14 20:29:34 +00:00
Alexander Barton
6f97dd4938 Remove "doc/src" directory on "make distclean". 2005-04-27 07:52:29 +00:00
Alexander Barton
a02f25a810 Added #include of "defines.h", necessary due to removal of the #include of
"defines.h" in the client.h header file.
2005-04-27 07:46:50 +00:00
Alexander Barton
aa25cd7da2 Reorder #includes, necessary due to removal of #include "defines.h" in
the client.h header file.
2005-04-27 07:38:00 +00:00
Alexander Barton
70fcdf1b5c Removed "invalid" #include of "defines.h" (don't include further header
files from a header file!).
2005-04-27 07:36:25 +00:00
Alexander Barton
dfe662ad45 Added missing #include of "defines.h". 2005-04-27 07:34:25 +00:00
Florian Westphal
7daa7fb278 removed Conn_UnsetOption() function. It was not used anymore.
removed Conn_SetOption(). replaced its only call (in conn-zip.c) with Conn_OPTION_ADD() macro.
2005-04-25 18:37:16 +00:00
Florian Westphal
e7c2c86aee removed "my_connects" fd_set. 2005-04-23 14:28:44 +00:00
Florian Westphal
c4bc2114c9 conn.h: option filed in CONNECTION struct is now UINT16.
conn-func.h: add accessor Macros

Conn_OPTION_ADD( conn, CONN_OPTION )
Conn_OPTION_DEL( conn, CONN_OPTION )
Conn_OPTION_ISSET( conn, CONN_OPTION )

To add, remove or test for a certain option field attribute (e.g. CONN_ISCLOSING)
These Macros should be used instead of accessing conn->options directly.
2005-04-18 21:08:31 +00:00
Alexander Barton
129a22a29b Cleaned up (and documented) the IRC_KILL() function. 2005-04-18 15:44:39 +00:00
Florian Westphal
8304210c06 fix spelling 2005-04-16 20:50:03 +00:00
Florian Westphal
aee48a3b38 added kludge to make ngircd (with syslog) compile on mips-dec-ultrix4.5 2005-04-16 09:31:30 +00:00
Florian Westphal
77faf14b29 use strdup() to add oper hostname mask. 2005-04-16 09:23:01 +00:00
Florian Westphal
8b17579e60 private strdup() implementation in case libc does not provide it. 2005-04-16 09:20:53 +00:00
Florian Westphal
b4363162ce s/malloc(x*y)/calloc(x,y)/ 2005-04-16 09:19:49 +00:00
Florian Westphal
873edc6311 check for strdup() 2005-04-16 07:26:44 +00:00
Alexander Barton
6ed37415fc Used a spellchecker :-) 2005-04-13 21:40:49 +00:00
Alexander Barton
55fadbfb1d Fixed wrong location of "Doxyfile" ... argl. 2005-04-09 18:29:30 +00:00
Alexander Barton
ca8ab38cac Use typedef instead of #define to declare the socklen_t type if needed. 2005-04-09 18:27:16 +00:00
Alexander Barton
dec7eba531 Added "-unrecog" to splint command line. 2005-04-09 18:23:37 +00:00
Alexander Barton
b0ae15e01d Target "lint": check whether splint command is available and suppress
warnings related to the used command line in the output.
2005-04-09 12:30:55 +00:00
Alexander Barton
43ba1bc805 Two new targets: "srcdoc" to generate Doxygen source documentation, and
"xcode" to build ngIRCd using the Xcode command line tools on Mac OS X.
2005-04-09 12:27:40 +00:00
Alexander Barton
811ac48bd2 Added new target "srcdoc" to generate the Doxygen source documentation. 2005-04-09 12:22:41 +00:00
Alexander Barton
e936a79f6b Added the control file for the Doxygen source documentation system. 2005-04-09 12:21:51 +00:00
Alexander Barton
0545288ebd New build style "deployment", cleaned up options for build style
"development" (enabled "ZeroLink") and fixed path of "ngircd.spec".
2005-04-09 11:25:28 +00:00
Alexander Barton
e635ed43bf Don't enable assert() calls when not ./configure'd with --enable-debug. 2005-03-30 17:00:42 +00:00
Alexander Barton
4d0b03b423 Debine NDEBUG if DEBUG isn't defined to disable all assert() checks as well. 2005-03-30 16:37:02 +00:00
Alexander Barton
f6df13d5f8 When validationg the configuration file wait for a keypress only if both
stdin and(!) stdout are valid tty's.
2005-03-22 18:57:08 +00:00
Alexander Barton
f56a1bdf20 Use tabulator, not 8 spaces ... 2005-03-21 22:22:09 +00:00
Alexander Barton
9dfcc6504e Fixed ./configure test for TCP Wrappers: now it runs on Mac OS X as well. 2005-03-21 22:15:15 +00:00
Alexander Barton
a822153309 Enhanced configure script: now you can pass an (optional) search path
to all --with-XXX parameters, e. g. "--with-ident=/opt/ident".
2005-03-20 17:23:36 +00:00
Florian Westphal
49f5a4d454 Conf_Test(): check if stdin (and not stdout...) is connected to a terminal. 2005-03-20 15:00:25 +00:00
Florian Westphal
326607eea1 changed type of Conf_ListenPorts[] from "unsigned int" to UINT16. 2005-03-20 13:54:06 +00:00
Florian Westphal
bfba1f37ed Init_Conn_Struct(): Zero structure using memset(). 2005-03-20 11:00:31 +00:00
Florian Westphal
374f90f392 Add notice about typedef removal and stdbool.h/inttypes.h 2005-03-19 18:53:16 +00:00
Florian Westphal
8adff59223 Remove INT, LONG, BOOLEAN, STATIC, CONST, CHAR datatypes.
use stdbool.h / inttypes.h if available.
2005-03-19 18:43:48 +00:00
Florian Westphal
27d93d7d8c fix Config_Error_NaN prototype (first argument missed "const") 2005-03-19 15:46:38 +00:00
Florian Westphal
8a2ed0a75f removed unneeded log.h include. 2005-03-19 14:50:59 +00:00
Alexander Barton
5fdd5be12b Added login of Florian ("fw") to AUTHORS list. 2005-03-19 14:24:52 +00:00
Alexander Barton
795802f2b0 Removed indentation of preprocessor statements in test for socklen_t. 2005-03-19 14:09:32 +00:00
Alexander Barton
1869766331 Fixed too long lines. 2005-03-15 16:58:01 +00:00
Alexander Barton
1d08d51e2e New configuration option "OperServerMode". 2005-03-15 16:56:16 +00:00
Alexander Barton
5e929effca New function New_Res_Stat() to initialize RES_STAT structure. 2005-03-05 12:57:14 +00:00
Alexander Barton
e618041168 Reduce the number of calls of strlen(). Idea by Florin Westphal. 2005-03-05 11:44:01 +00:00
Alexander Barton
e7f8782831 Added missing include of "match.h". 2005-03-03 08:36:19 +00:00
Alexander Barton
4ef172d603 Implemented support for "secret channels" (channel mode "s"). 2005-03-02 16:35:10 +00:00
Alexander Barton
490c9d04d7 New configuration option "Mask" for [Operator] sections to limit OPER command. 2005-03-02 16:07:30 +00:00
Alexander Barton
8579b2a1e5 Clean up the mode handling code: remove redundant parts ... 2005-02-27 20:09:44 +00:00
Alexander Barton
3da942e237 Updated to latest strl{cat|cpy} code of rsync:
- Make sure that strlcpy() returns the right value when the bufsize is 0.
- Fixed a bug in strlcat() where it would not properly detect a no-change
  condition if called with an initial string longer than the specified
  size limit (due to an unsigned var's inability to go negative).
Patch by Florian Westphal, <westphal@foo.fh-furtwangen.de>.
2005-02-27 09:29:13 +00:00
Alexander Barton
bcb6cf3ffa Added AUTOMAKE_VERSION and AUTOCONF_VERSION (for OpenBSD). 2005-02-21 15:23:23 +00:00
Alexander Barton
972b07ff29 Fixed the detection of tools named like "tool-Major.Minor" (used on OpenBSD). 2005-02-21 09:48:50 +00:00
Alexander Barton
ba19fb8ff4 Enable Pidfile /var/run/ircd/ngircd.pid 2005-02-14 00:44:48 +00:00
Alexander Barton
8d8b133bdf Added description for "PidFile", fixed description of "Ports". 2005-02-14 00:42:41 +00:00
Alexander Barton
ec30cd4e5f Whitespace fixes. 2005-02-11 13:52:37 +00:00
Alexander Barton
f2fbf206b6 Don't play games with FILE* stdin/out/err, only touch "real" descriptors. 2005-02-10 16:55:52 +00:00
Alexander Barton
1fdd5478c6 Renamed NGIRCd_FillVersion() to Fill_Version(); Code cleanups. 2005-02-10 13:09:11 +00:00
Alexander Barton
9537542647 Write "error file" (/tmp/ngircd-XXX.err) only if compiled with debug
code ("--enable-debug") and running as daemon process.
2005-02-10 12:49:04 +00:00
Alexander Barton
0993ff81bb Added a note about the change of the maximum password length. 2005-02-10 08:20:09 +00:00
Alexander Barton
894cd2cd68 Don't create version information string each time a client connects but
insetead on server startup. By Florian Westphal.
2005-02-09 09:52:58 +00:00
Alexander Barton
c16d1b03aa Added an empty /etc/ngircd/ngircd.motd to the packages. And ngircd.conf
becomes modified to enable the PID file (/var/run/ircd/ngircd.cond) and
to change the user and group to "irc".
2005-02-07 23:09:31 +00:00
Alexander Barton
451315643f Set owner and group of /var/run/ircd to "irc:irc". 2005-02-07 23:07:52 +00:00
Alexander Barton
d77182e7a6 Updated debian changelog file from branch-0-8-x ... 2005-02-07 19:57:05 +00:00
Alexander Barton
8edeed8418 Make sure that errno of fopen() isn't overwritten by the logging code. 2005-02-07 19:31:34 +00:00
Alexander Barton
112102b10c New configuration variable "PidFile", section "[Global]": if defined,
the server writes its process ID (PID) to this file. Default: off.
Idea by Florian Westphal, <westphal@foo.fh-furtwangen.de>.
2005-02-04 14:24:20 +00:00
Alexander Barton
ae63ed04c5 ngIRCd 0.8.3. 2005-02-04 14:21:35 +00:00
Alexander Barton
85acb82469 Use ngt_TrimLastChr() where useful, by Florian Westphal. 2005-02-04 13:15:38 +00:00
Alexander Barton
51d09fb4f7 Add ngt_TrimLastChr() to header file. By Florian Westphal. 2005-02-04 13:09:03 +00:00
Alexander Barton
8308c170db 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!
(http://www.nosystem.com.ar/advisories/advisory-11.txt)
2005-02-03 09:26:42 +00:00
Alexander Barton
07fe19889b Updated ChangeLog for 0.8.2. 2005-02-03 09:11:43 +00:00
Alexander Barton
0c293ae988 Updated config.sub and config.guess 2005-01-27 00:15:53 +00:00
Alexander Barton
18c92d9de7 We are in the year 2005 now! :-) 2005-01-26 22:03:15 +00:00
Alexander Barton
2440ed080c Fixed a buffer overflow that could cause the daemon to crash. Bug found
by Florian Westphal, <westphal@foo.fh-furtwangen.de>.
2005-01-26 13:23:24 +00:00
Alexander Barton
669da58715 Updated list of contributors. 2005-01-26 13:21:00 +00:00
Alexander Barton
39f1ddd9d0 New function ngt_TrimLastChr(), prototype by Florian Westphal. 2005-01-25 16:16:48 +00:00
Alexander Barton
34e912d9f2 Fixed a typo in variable name ... 2005-01-24 14:19:04 +00:00
Alexander Barton
44172a8c7f Fixed a possible buffer underrun when reading the MOTD file. Thanks to
Florian Westphal, <westphal@foo.fh-furtwangen.de>.
2005-01-24 14:17:21 +00:00
Alexander Barton
a6d7fb8739 Code cleanups from Florian Westphal, <westphal@foo.fh-furtwangen.de>:
wrote functions for common error messages.
2005-01-20 00:13:08 +00:00
Alexander Barton
d16ce5a735 Code cleanups from Florian Westphal, <westphal@foo.fh-furtwangen.de>. 2005-01-20 00:11:49 +00:00
Alexander Barton
a40a026d15 Fixed detection of IRC lines which are too long to send. Detected by
Florian Westphal, <westphal@foo.fh-furtwangen.de>.
2005-01-19 23:33:53 +00:00
Alexander Barton
6c5f4beb53 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 :-/
2005-01-18 09:05:37 +00:00
Alexander Barton
26b0ddf200 Translated source code comments. 2005-01-17 13:14:36 +00:00
Alexander Barton
b6690df2be Raised the maximum length of passwords to 20 characters. 2005-01-17 13:01:34 +00:00
Alexander Barton
6dacec7ded Fixed typo: ports are separated by ",". Thanks to Florian Westphal. 2005-01-17 12:51:17 +00:00
Alexander Barton
429b5f3ec9 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>.
2005-01-17 11:57:39 +00:00
Alexander Barton
81bacda627 Added URLs for stunnel. 2004-12-27 01:11:40 +00:00
Alexander Barton
6960cb4c38 Added documentation for SSL support. 2004-12-27 01:04:35 +00:00
Alexander Barton
7b61b34c56 Make more clear that there can be more than one [Operator], [Server] and
[Channel] section in the configuration file.
2004-12-27 00:55:06 +00:00
Alexander Barton
386d3b9e67 Fixed wrong port number in example. 2004-12-27 00:48:59 +00:00
Alexander Barton
5049c5c694 Don't use a POSIX thread for the Howl "run loop". 2004-12-26 16:48:53 +00:00
Alexander Barton
292879aca4 Added support for the Howl (http://www.porchdogsoft.com/products/howl/)
Rendezvous API, in addition to the API of Apple (Mac OS X).
2004-12-26 00:14:33 +00:00
Alexander Barton
dcb9e2a004 Updated documentation for release 0.8.1 2004-12-25 00:22:00 +00:00
Alexander Barton
0d10c60b31 Updated config.guess and config.sub 2004-12-25 00:10:19 +00:00
Alexander Barton
08e0b277bc Updated documentation ... 2004-12-25 00:00:14 +00:00
Alexander Barton
58736b3902 Fixed indentation and added some more debug code. 2004-12-22 17:37:41 +00:00
Alexander Barton
f7354cdf28 Updated list of supported/tested platforms. 2004-11-09 11:00:33 +00:00
Alexander Barton
196f27c4ad Fixed spelling mistake. 2004-10-31 12:17:22 +00:00
Alexander Barton
c1f32e8214 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.
2004-10-20 13:47:32 +00:00
Alexander Barton
eee2762852 Changed "read buffer" to "receive buffer" as suggested by Goetz. 2004-10-04 23:23:41 +00:00
Alexander Barton
c79fa28a66 Added some missing words: "address" :-) 2004-10-04 23:09:04 +00:00
Alexander Barton
1e692e5890 Fixed wrong variable names in output of "ngircd --configtest". 2004-09-24 18:00:40 +00:00
Alexander Barton
ceafdf109b Added functions.inc to EXTRA_DIST files. 2004-09-08 09:40:51 +00:00
Alexander Barton
450251f082 Fixed echo without newline for systems not understanding "echo -n"; added
new file "functions.inc" for functions usable by all test scripts.
2004-09-06 22:04:06 +00:00
Alexander Barton
ceef058065 Reverted extension of the "make all" target in the test-suite. 2004-09-06 20:35:28 +00:00
Alexander Barton
b04a526a19 Fixed wrong exit code check of "kill -0". 2004-09-06 20:22:30 +00:00
Alexander Barton
2f195a07b2 Updated documentation. 2004-09-06 00:35:52 +00:00
Alexander Barton
f38eeedfd7 Fxied name of "default file" for ngircd-full package. And do the test if
the binary is executable after reading this file.
2004-09-06 00:32:20 +00:00
Alexander Barton
8ca1e4d548 If ServerUID is defined change the working directory to the home directory
of this user.
2004-09-04 20:28:51 +00:00
Alexander Barton
e07cc4bb63 Updated documentation :-) 2004-09-04 19:39:24 +00:00
Alexander Barton
c5bdd86f96 Enhanced messages and exit codes. 2004-09-04 19:14:46 +00:00
Alexander Barton
aa26e2ef36 Added all test scripts to target "all". 2004-09-04 19:14:02 +00:00
Alexander Barton
9445962237 Changed text "test scripts" to "processes": some versions of expect(1)
fork child processes ...
2004-09-04 18:22:42 +00:00
Alexander Barton
6b898b63f0 Removed counting of test processes; don't check running processes by default. 2004-09-04 18:20:16 +00:00
Alexander Barton
f7a4d03ba2 Added detection of flags for ps(1). 2004-09-04 16:14:47 +00:00
Alexander Barton
ade1e2eb7b Added README, test-loop.sh and wait-tests.sh to EXTRA_DIST files. 2004-09-04 15:46:56 +00:00
Alexander Barton
a9a605de3e Made stress-server.sh to use wait-tests.sh to limit number of parallel tests. 2004-09-04 15:45:27 +00:00
Alexander Barton
7ec11de523 Two new scripts: test-loop.sh and wait-tests.sh 2004-09-04 15:44:45 +00:00
Alexander Barton
18eb92a72b Added support for looping and other enhancements. 2004-09-04 14:23:09 +00:00
Alexander Barton
9ddb934784 Set $srcdir if not already set by make. 2004-09-04 14:22:38 +00:00
Alexander Barton
4f8ac179bf If nick name is already in use, interpret this as "clienst still connected". 2004-09-04 14:22:13 +00:00
Alexander Barton
02b8e51562 Added preliminary README text. 2004-09-04 13:58:31 +00:00
Alexander Barton
d27196e334 Information about configuring ngIRCd. 2004-09-03 20:01:12 +00:00
Alexander Barton
3edaa35d49 Removed empty "buildRules" variable (suggested by XCode 1.5 :-). 2004-08-10 01:55:33 +00:00
Alexander Barton
88258070c4 Added missing commas to debian control file, fixes bug #56.
Thanks to Kevin Otte (nivex@nivex.net) for the patch.
2004-07-15 09:03:15 +00:00
Alexander Barton
beb4edd3cf Updated documentation: note ngIRCd 0.8.0 :-) 2004-07-03 18:35:41 +00:00
Alexander Barton
364ff7087d Added cast to integer for Solaris. 2004-06-26 08:50:44 +00:00
Alexander Barton
0b3ee07a2a Updated documentation. 2004-05-30 16:29:05 +00:00
Alexander Barton
a49a580a77 Fixed wrong buffer size calculation for resolver results. 2004-05-30 16:25:51 +00:00
Alexander Barton
7080e9f83c Added "hppa/unknown/openbsd3.5". 2004-05-25 21:50:29 +00:00
Alexander Barton
59a48bfa1f Updated documentation. 2004-05-15 23:56:43 +00:00
Alexander Barton
42e8063a32 Enhanced ./configure checks for required C header files. 2004-05-15 12:24:30 +00:00
Alexander Barton
c23bbe6b65 Fixed a warning message of the compiler when not using IDENT lookups. 2004-05-11 00:53:14 +00:00
Alexander Barton
d8f47ed195 Updated documentation. 2004-05-11 00:41:53 +00:00
Alexander Barton
d7c975e8d8 "make maintainer-clean" removes Makefile.in now. 2004-05-11 00:34:26 +00:00
Alexander Barton
bf21dd1578 "make clean" works better now. 2004-05-11 00:32:31 +00:00
Alexander Barton
9013f56451 New Debian version. 2004-05-11 00:21:04 +00:00
Alexander Barton
3012c232eb Fixed resolver when using IDENT lookups, cleaned up code. 2004-05-11 00:01:11 +00:00
Alexander Barton
26390c60fb Added PID to all log messages on the console; enhanced logging of
resolver sub-processes in debug mode.
2004-05-10 23:57:46 +00:00
Alexander Barton
cdb039672c Enhanced output of "make lint". 2004-05-09 18:23:35 +00:00
Alexander Barton
7281b8dd4d New "chroot" feature (from Benjamin Pineau), introducing new configuration
variables "ChrootDir" and "MotdPhrase".
2004-05-07 11:19:20 +00:00
Alexander Barton
39fc76c4e4 Overview of "contributed" files. 2004-04-28 12:18:50 +00:00
Alexander Barton
a6d51c3a9e Added "README" and "systrace.policy" files. 2004-04-28 12:18:02 +00:00
Alexander Barton
18b2227a0a systrace policy for OpenBSD/NetBSD, thanks to Benjamin Pineau <ben@zouh.org> 2004-04-28 12:16:59 +00:00
Alexander Barton
47701feb08 New debian version including updates from CVS HEAD. 2004-04-25 23:57:19 +00:00
Alexander Barton
59b903f3bb Updated documentation. 2004-04-25 15:51:15 +00:00
Alexander Barton
d433eb3896 Add flag "L" to default IRC+ server flags: synchronize INVITE-
and BAN-lists.
2004-04-25 15:46:50 +00:00
Alexander Barton
c1e9841118 Document new server flag "L": synchronize INVITE- and
BAN-lists when establishing new server links.
2004-04-25 15:44:10 +00:00
Alexander Barton
dd59820051 Synchronize INVITE- and BAN-lists if the peer requests it:
server flag "L". And better debug logging.
2004-04-25 15:43:18 +00:00
Alexander Barton
967476799f Don't send MODE changes when origin is a server and
mask is already known.
2004-04-25 15:42:05 +00:00
Alexander Barton
6b1e322865 New functions: Lists_SendInvites(), Lists_IsInviteEntry(), 2004-04-25 15:40:19 +00:00
Alexander Barton
1d8da4b525 Fixed a wrong assert() which could cause the daemon to exit spuriously
when closing down connections.
2004-04-25 14:06:11 +00:00
Alexander Barton
292c7bd4c0 Better logging of decompression errors returned by zlib. 2004-04-25 13:55:34 +00:00
Alexander Barton
558fe6b453 Special handling for HP/UX: define _XOPEN_SOURCE_EXTENDED ... 2004-04-11 13:20:24 +00:00
Alexander Barton
bed119c9e5 New debian package. 2004-04-09 21:58:24 +00:00
Alexander Barton
64d330b726 Fixed handling of already existent entries in invite and ban lists:
the attempt to add an already existent entry is no error, it must
be propagated across servers (but not added to the list!).
2004-04-09 21:41:52 +00:00
Alexander Barton
cc25c52048 Updated XCode project for Mac OS X. 2004-04-09 20:48:27 +00:00
Alexander Barton
233210b906 Servers other than the destination server didn't clean up the invite
list of an "invite-only" channel properly when an INVITE'd user joined.
2004-04-09 20:46:46 +00:00
Alexander Barton
f68e92eb9a The command to test for the autoconf/automake tools is detected now as well. 2004-04-05 12:02:21 +00:00
Alexander Barton
b225081c2b Added DG/UX (m88k/dg/dgux5.4R3.10) to the list. 2004-04-05 11:11:05 +00:00
Alexander Barton
30bbc5e1e1 New debian package ;-) 2004-04-05 11:10:31 +00:00
Alexander Barton
0c07eb71a7 Updated manual page to reflect changes in daemon. 2004-04-05 10:59:10 +00:00
Alexander Barton
0b1202cd9e Use "which" when available; understand "GO=0"; made "VERBOSE=1" more verbose. 2004-03-19 11:47:51 +00:00
Alexander Barton
8212662d9d Enhanced autogen.sh script; added "inline" documentation. 2004-03-15 20:32:31 +00:00
Alexander Barton
f697923c48 Fixed detection of GNU C version and usability of __attribute__. 2004-03-15 19:26:39 +00:00
Alexander Barton
af77ce70b6 Added missing "return 0" ... oops. 2004-03-15 18:59:12 +00:00
Alexander Barton
507a9e9cb3 Reworked configure system: it should be more compatible to most systems
now, and it should even be more flexible and faster :-)
2004-03-11 22:21:20 +00:00
Alexander Barton
779446298c New upstream version. 2004-03-11 22:18:28 +00:00
Alexander Barton
cb76d96efb Fixed some warnings of non-gcc-compilers (e. g. original Apple compiler on
A/UX): "warning: illegal pointer combination, op =".
2004-03-11 22:16:31 +00:00
Alexander Barton
de1489b39b Updated tests to reflect last changes to MODE behaviour. 2004-03-10 20:40:06 +00:00
Alexander Barton
5155e1c67a Updated XCode project, added missing Makefile template for MacOXD directory. 2004-02-29 17:36:20 +00:00
Alexander Barton
1e9a958324 Added XCode project files (for Mac OS X) to "contrib" directory. 2004-02-29 17:19:43 +00:00
Alexander Barton
56227abc5e Changed the reply of the MODE command to match the syntax of the original
ircd exactly: the unnecessary but missing ":" before the last parameter
has been added.
2004-02-29 16:28:44 +00:00
Alexander Barton
f9e651b333 New Debian version. 2004-02-28 02:25:21 +00:00
Alexander Barton
bdaf53e799 Fixed TRACE: don't output "Serv" lines for ourself; display more info. 2004-02-28 02:18:16 +00:00
Alexander Barton
33f4e6763b Better logging while establishing and shutting down connections.
Results of the resolver are now discarded after the client is registered.
2004-02-28 02:01:01 +00:00
Alexander Barton
eaa550d690 Updated list of supported operating systems. 2004-02-24 00:37:42 +00:00
Alexander Barton
f275c66e95 Updated statistics :-) 2004-02-23 13:42:46 +00:00
Alexander Barton
17fffea873 Updated documentation (-t switch). 2004-02-22 22:12:44 +00:00
Alexander Barton
1e3363d2a4 Included updates of ngIRCd 0.7.7 2004-02-05 14:27:16 +00:00
Alexander Barton
6667bb6b77 The info text ("real name") of users is set to "-" if none has been
specified using the USER command (e. g. "USER user * * :"). Reason:
the original ircd doesn't like empty ones and would KILL such users.
2004-02-04 19:56:04 +00:00
Alexander Barton
b90bedbcb2 Fixed (optional) TCP Wrapper test which was broken and could result in
false results. Thanks to Fuminori Tanizaki <tany@mcnet.ad.jp>!
2004-02-03 20:28:30 +00:00
Alexander Barton
c2a154a33e New debian version. 2004-01-26 03:09:20 +00:00
Alexander Barton
6bbc086760 Updated some copyright notices to include the year 2004. 2004-01-26 02:23:54 +00:00
Alexander Barton
bb98fd8c85 The type of service (TOS) of all sockets is set to "interactive" now. 2004-01-25 16:06:34 +00:00
Alexander Barton
e9b0ec9148 Removed some debug code; translated some source code comments. 2004-01-19 21:54:59 +00:00
Alexander Barton
c53903eb3f Use "__attribute__" only if gcc is at least version 2.7 2004-01-17 03:22:46 +00:00
Alexander Barton
57c7e23622 Added #include for strings.h to fix compiler warnings. 2004-01-17 03:17:49 +00:00
Alexander Barton
cdb694aeb3 Added #include for strings.h and added some casts to remove compiler warnings. 2004-01-17 03:17:00 +00:00
Alexander Barton
6cafa16a56 Fixed order of #include's: time.h moves up! ;-) 2004-01-17 03:15:45 +00:00
Alexander Barton
5589ebd9c3 Clean up files for "ngircd-full" package, too ... 2004-01-13 01:10:11 +00:00
Alexander Barton
f645e5b62e Adjusted copyright notice to include 2004. 2004-01-02 19:23:30 +00:00
Alexander Barton
ad07c94c8d Restructured debian packaging system: now there are two packages, a "standard"
version that includes all the default options and a "full" version that
additionally includes support for TCP wrappers and IDENT lookups.
2004-01-01 22:24:48 +00:00
Alexander Barton
5a9c04619f Changes for new source code layout: contrib/Debian/. 2003-12-31 17:31:03 +00:00
Alexander Barton
ed94d5d5cd Removed outdated Mac OS X ProjectBuilder project files (will be re-added
and updated for XCode soon); moved the debian/ directory to contrib/Debian/.
2003-12-31 17:20:11 +00:00
Alexander Barton
ea076a28f2 Added some files to the maintainer-clean-local target which havn't beed
removed by "make maintainer-clean".
2003-12-31 17:09:40 +00:00
Alexander Barton
c9ccb66944 Added new short command line option "-t" as alternative to "--configtest". 2003-12-29 14:53:26 +00:00
Alexander Barton
cb6279f102 Added IDENT option to version string. 2003-12-27 13:09:24 +00:00
Alexander Barton
b79b315dd4 Added optional support for IDENT lookups (configure switch "--with-ident"). 2003-12-27 13:01:12 +00:00
Alexander Barton
c40592d2ce Removed "USE_" prefixes of configuration #defines. 2003-12-26 15:55:07 +00:00
Alexander Barton
05170bc94c Fixed error messages related to server name configuration; updated
sample configuration file. (from 0.7.x)
2003-12-19 14:32:59 +00:00
Alexander Barton
07ad774f0a Changes for version 0.7.6 2003-12-05 13:40:44 +00:00
Alexander Barton
a8da1afe05 Added missing postinst file to distribution list. (from branch-0-7-x) 2003-12-05 13:32:11 +00:00
Alexander Barton
ff2c1efae8 Fixed abort() when inviting users to nonexistent channels. 2003-12-05 11:57:28 +00:00
Alexander Barton
05e2c0f048 Extended version reporting of CVS builds. 2003-12-04 14:05:16 +00:00
Alexander Barton
d329a961bd Updated, corrected and extended (examples!) protocol documentation. 2003-11-30 20:30:56 +00:00
Alexander Barton
606cdb69bf Updated RPM and Debian package description and configuration. 2003-11-29 20:29:09 +00:00
Alexander Barton
a5695e7ef8 Updated config.guess and config.sub to new upstream versions. 2003-11-28 15:31:49 +00:00
Alexander Barton
2978b5edff Changes from branch-0-7-x for version 0.7.5. 2003-11-07 21:32:15 +00:00
Alexander Barton
be79fabcbf Fixed ban behavior: users which are banned from a channel can't no longer
send PRIVMSG's to this channel (fixes Bug #47).
2003-11-06 01:07:44 +00:00
Alexander Barton
ec2f16fa16 Fixed test suite: allow more connections ;-) 2003-11-05 23:31:43 +00:00
Alexander Barton
7b6e26628a Fixed and enhanced penalty handling; changed internal time resoluiton of
the server to one second. Code cleanup.
2003-11-05 23:24:48 +00:00
Alexander Barton
2981fe9eb7 New configuration option "MaxConnectionsIP". 2003-11-05 21:41:01 +00:00
Alexander Barton
20d002e155 Fixed build problems under Mac OS X 10.3 "Panther". 2003-11-04 00:41:06 +00:00
Alexander Barton
cfe6356531 Use "-pipe" when compiling with gcc, speeds things up a little :-) 2003-10-19 23:03:34 +00:00
Alexander Barton
e33ab90379 New configuration option "Listen" to bind the server to a specific ip. 2003-09-11 12:05:28 +00:00
Alexander Barton
d8f3c2b42b Suppress misleading error message of diff during make run. 2003-09-09 13:24:41 +00:00
Alexander Barton
3debe00581 Updated and fixed project file for Mac OS X ProjectBuilder.app 2003-09-03 11:54:21 +00:00
Alexander Barton
eb6113fc33 Updated documentation. 2003-09-02 16:09:29 +00:00
Alexander Barton
166c610957 Updated documentation. 2003-08-30 20:37:15 +00:00
Alexander Barton
b9f16c9635 Fixed typo in debug output. 2003-08-30 20:28:54 +00:00
Alexander Barton
1ed708ef39 Enhanced testsuite, should run under GNU/Hurd now. 2003-08-22 11:31:18 +00:00
Alexander Barton
5e4124d38d New Debian package for 0.7.1 2003-07-18 20:59:48 +00:00
Alexander Barton
0d00ce6e38 Updated documentation (for release 0.7.1). 2003-07-18 20:59:34 +00:00
Alexander Barton
057df41a9b Updated documentation. 2003-07-18 20:46:17 +00:00
Alexander Barton
5eb89619d6 Added debian packaging files from branch-0-7-x to HEAD. 2003-07-12 23:27:37 +00:00
Alexander Barton
6e03626eed Included debian/-subdirectory into build system. 2003-07-09 21:16:33 +00:00
Alexander Barton
d9efbe80e1 Updated debian changelog. 2003-07-09 20:41:32 +00:00
Alexander Barton
da9456dbca Included debian/-subdirectory with files required to build Debian packages. 2003-07-09 20:23:35 +00:00
Alexander Barton
ac9390f08c Updated config.guess and config.sub to newer upstream versions. 2003-07-09 20:13:17 +00:00
Alexander Barton
3f602e5a25 Updated ChangeLog. 2003-07-09 18:48:49 +00:00
Alexander Barton
6647da58fc NJOIN: Fixed propagation of user channel modes. 2003-07-09 18:45:56 +00:00
Alexander Barton
225a338139 Added SunOS 5.7 (Solaris 7). 2003-07-06 15:47:27 +00:00
Alexander Barton
bfdf17ff32 - Updated documentation. 2003-06-08 11:11:20 +00:00
Alexander Barton
260b8e5f36 VERSION shows the CVS date if apropriate now. 2003-06-06 20:46:11 +00:00
Alexander Barton
9a009b24da Fixed a compiler warning related to an unnecessary assert(). 2003-06-05 10:48:13 +00:00
Alexander Barton
83765a5a34 Updated documentation. 2003-05-15 21:47:57 +00:00
Alexander Barton
bdc08ae28e Updated documentation. 2003-05-15 21:33:47 +00:00
Alexander Barton
34ede2a91a Added support for GNU/Hurd. 2003-05-05 00:33:32 +00:00
Alexander Barton
0424747e95 Made Makefiles more compatible with "make -j<N>". 2003-05-03 16:29:57 +00:00
Alexander Barton
8d5e170091 Fixed typo: .IT instead of the correct.TP ... 2003-05-02 20:51:42 +00:00
Alexander Barton
68ee133f87 Changed version string to "CVSHEAD". 2003-05-01 10:17:50 +00:00
Alexander Barton
27cd1e0d05 Updated documentation (ngIRCd 0.7.0). 2003-05-01 10:17:24 +00:00
Goetz Hoffart
3dc4c92553 Added HP-UX 9.10/m68k. 2003-04-30 21:03:01 +00:00
Goetz Hoffart
188e95f680 Fixed small typo. 2003-04-29 13:37:36 +00:00
Goetz Hoffart
c5f4e9d095 Added "Why should I use ngIRCd?" 2003-04-29 13:36:55 +00:00
Alexander Barton
e541da2a8f "ServerName" is checked better now: a dot (".") is required. 2003-04-29 12:36:09 +00:00
Alexander Barton
e55399c667 The KILL comand verifies and logs more parameters. 2003-04-29 12:19:20 +00:00
Alexander Barton
e7102559b9 Updated documentation. 2003-04-28 00:14:48 +00:00
Alexander Barton
32f8eb46ee Updated documentation. 2003-04-27 11:48:06 +00:00
Alexander Barton
0e01a37a69 Fixed --configtest: there is no variable "ServerPwd", it's "Password". 2003-04-27 11:46:52 +00:00
Alexander Barton
927e626f03 Documented missing "Password" variable in section "[Global]". 2003-04-27 11:45:27 +00:00
Alexander Barton
277a048f4f Updated documentation. 2003-04-25 16:59:02 +00:00
Alexander Barton
dd0b37690b Updated documentation. 2003-04-25 16:49:11 +00:00
Alexander Barton
83194a23a3 The server tried to connect to other servers only once when DNS or socket
failures occured.
2003-04-25 16:47:52 +00:00
Alexander Barton
a1ff081b8a Updated documentation. 2003-04-25 15:05:40 +00:00
Alexander Barton
e1c70a3c93 Disabling "-ansi" on Cygwin: system headers are incompatible. 2003-04-25 15:04:43 +00:00
Alexander Barton
c43d47d69c Updated documentation: added i686/pc/cygwin platform. 2003-04-23 23:18:17 +00:00
Alexander Barton
bbf978dbcf Detecting broken gcc used by Mac OS X and disabling "-pedantic" in this case. 2003-04-23 01:07:59 +00:00
Alexander Barton
090756523e Updated documentation. 2003-04-23 01:07:16 +00:00
Alexander Barton
8497d28fba Updated documentation. 2003-04-22 23:55:06 +00:00
Alexander Barton
cef95681ff Added new documentation file "Platforms.txt". 2003-04-22 23:50:18 +00:00
Alexander Barton
52a24c4bbd New documentation file doc/Platforms.txt included. 2003-04-22 23:47:39 +00:00
Alexander Barton
e2968dd98d Updated documentation. 2003-04-22 20:42:28 +00:00
Alexander Barton
79b9592f27 Updated documentation. 2003-04-22 19:35:05 +00:00
Alexander Barton
0551f688f6 Made scripts mor portable (run on SunOS 5.6 now). 2003-04-22 19:27:50 +00:00
Alexander Barton
c74ac55832 Updated documentation. 2003-04-22 18:45:19 +00:00
Alexander Barton
b4dc216db3 Added defines for SunOS (5.6). 2003-04-22 18:44:03 +00:00
Alexander Barton
cbf87971a4 Made setting of WANT_AUTOMAKE more portable. 2003-04-22 10:15:46 +00:00
Alexander Barton
4d656d12e9 Updated documentation. 2003-04-21 23:31:39 +00:00
Alexander Barton
da78dc4785 Updated documentation. 2003-04-21 22:52:18 +00:00
Goetz Hoffart
bd52d4e49c Fixed tabs to spaces. 2003-04-21 21:59:34 +00:00
Goetz Hoffart
e0345e5e0a Translated documentation from German to English. 2003-04-21 21:46:57 +00:00
Alexander Barton
c1dd86d702 Updated documentation. 2003-04-21 21:33:18 +00:00
Alexander Barton
b25faf3c2a Updated documentation. 2003-04-21 12:55:39 +00:00
Alexander Barton
384d6b894a Translated Protocol.txt to english. 2003-04-21 12:48:40 +00:00
Alexander Barton
a061668b1a Added implicit initialisation of "i" in Conf_GetServer to workaround a egcs
2.91.66 bug which claims that this valiable could be used uninitialized.
2003-04-21 11:06:07 +00:00
Alexander Barton
489d8c5cd0 Removed unportable %z formater in strftime(). 2003-04-21 10:54:30 +00:00
Alexander Barton
daa996f177 Added missing prototype for dummy_snprintf(). 2003-04-21 10:53:38 +00:00
Alexander Barton
7deacbaa11 Added missing include for <sys/select.h>. 2003-04-21 10:53:10 +00:00
Alexander Barton
c3dfd63bf3 Fixed up some castings. 2003-04-21 10:52:26 +00:00
Alexander Barton
f5b91cd03d Added some defines for Linux/glibc, reverted unused test for poll(), and
enhanced summary output.
2003-04-21 10:51:44 +00:00
Alexander Barton
8e43b16d22 Using $(prefix)/share/doc/ngircd as documentation directory again. 2003-04-21 08:01:29 +00:00
Alexander Barton
4ef6dae1cd Updated documentation. 2003-04-20 23:12:57 +00:00
Alexander Barton
0b91df05e0 Fixed spelling mistake :-) 2003-04-20 23:09:43 +00:00
Alexander Barton
feafb6cb2e Don't forward NJOIN's for unknown nick names. 2003-04-20 23:09:26 +00:00
Alexander Barton
0391d35a67 Translated success message :-) 2003-04-13 22:34:17 +00:00
Alexander Barton
a93b4d9789 Updated documentation. 2003-04-05 11:37:17 +00:00
Alexander Barton
eefa1b1c64 Added WANT_AUTOMAKE=1.6 to autogen.sh. 2003-04-04 10:05:34 +00:00
Alexander Barton
016e547daa Re-corrected test for CVS version. 2003-03-31 19:01:02 +00:00
Alexander Barton
b588eaed02 Corrected path for documentation files in summary output. 2003-03-31 16:17:33 +00:00
Alexander Barton
36e0345ce6 Changed documentation directory to ".../share/doc/ngIRCd" (and removed the
variable PACKAGE for better Debian automake-1.4 compatibility).
2003-03-31 16:00:49 +00:00
Alexander Barton
62796722f1 Changed all PACKAGE's to PACKAGE_NAME and all VERSION's to PACKAGE_VERSION. 2003-03-31 15:54:21 +00:00
Alexander Barton
935ffd0dc0 Updated documentation. 2003-03-30 13:46:58 +00:00
Alexander Barton
fa54e6e2a4 Added documentation path to summary output. 2003-03-30 13:46:00 +00:00
Alexander Barton
179e760cf1 Implemented proper "uninstall" target for documentation files. 2003-03-30 13:45:29 +00:00
Alexander Barton
47faa8595a Install documentation files in $(datadir)/doc/ngircd. 2003-03-30 13:31:17 +00:00
Alexander Barton
9ab97b29ae Fixed up bad test during unregistering of services. 2003-03-27 01:24:32 +00:00
Alexander Barton
24df40eca7 Synchronize server connections with server configurations after reloading the configuration. 2003-03-27 01:22:44 +00:00
Alexander Barton
02a22611be Clean up duplicate servers correctly. 2003-03-27 01:21:38 +00:00
Alexander Barton
59a0fb8cd9 New function Conn_SyncServerStruct(). 2003-03-27 01:20:22 +00:00
Alexander Barton
d383703b78 Require at least GNU automake 1.6 to generate build scripts and Makefiles. 2003-03-26 22:43:58 +00:00
Alexander Barton
8291e10b96 Translated documentation to english. 2003-03-26 22:34:33 +00:00
Alexander Barton
312e4aeb86 Updated documentation. 2003-03-23 23:13:15 +00:00
Alexander Barton
ac4f25e3a7 Enhanced (and fiexd) IRC_TRACE(): now shows operators and correct link uptimes. 2003-03-19 21:16:53 +00:00
Alexander Barton
7646739431 New message constant RPL_TRACEOPERATOR_MSG. Changed RPL_TRACESERVER_MSG. 2003-03-19 21:16:16 +00:00
Alexander Barton
5f19a9418e Updated Mac OS X project for Project Builder. 2003-03-19 20:09:51 +00:00
Alexander Barton
3858e28e07 Fixed a "checking for ..." text string. 2003-03-19 17:27:05 +00:00
Alexander Barton
f53455977d Added #include for stdarg.h when using ower own version of vsnprintf(). 2003-03-17 01:12:10 +00:00
Alexander Barton
9ca1f6a988 Removed now obsolete test for A/UX: configure does this job now. 2003-03-17 00:53:52 +00:00
Alexander Barton
1a1ff404a8 - Updated documentation. 2003-03-15 11:00:31 +00:00
Alexander Barton
c755b82dd9 - Removed german documentation (no maintainer). 2003-03-15 10:56:20 +00:00
Alexander Barton
8fc69bb6fb Updated documentation. 2003-03-10 01:00:00 +00:00
Alexander Barton
10edb7c741 Fixed up and enhanced formating of manual pages. 2003-03-10 00:58:06 +00:00
Alexander Barton
ff019dd76f Updated manual page. 2003-03-10 00:35:51 +00:00
Alexander Barton
a004f34447 Updated manual page. 2003-03-10 00:23:50 +00:00
Alexander Barton
10bb43c66e Updated documentation. 2003-03-10 00:23:34 +00:00
Alexander Barton
b6999f10c0 Updated and enhanced the daemon manual page. 2003-03-09 23:08:24 +00:00
Alexander Barton
516064dc06 Fixed some spelling mistakes. 2003-03-09 22:17:35 +00:00
Alexander Barton
a84b9d99a1 Fixed some spelling mistakes -- thanks to ispell ;-) 2003-03-09 22:03:58 +00:00
Alexander Barton
5170ecf045 Updated documentation: translated headers ... 2003-03-09 20:04:44 +00:00
Alexander Barton
23a28fa336 Updated documentation. 2003-03-08 12:34:55 +00:00
Alexander Barton
15b5e1a6eb Translated & updated documentation. 2003-03-07 20:42:20 +00:00
Alexander Barton
ade2fdc9aa Updated documentation. 2003-03-07 17:17:23 +00:00
Alexander Barton
e744936d19 New function Simple_Message(). Better error reporting to clients on connect. 2003-03-07 17:16:49 +00:00
Alexander Barton
4a5b3f34a5 Enlarged buffer for version string ;-) 2003-03-07 14:50:13 +00:00
Alexander Barton
7640aa5190 Updated documentation. 2003-03-07 14:45:10 +00:00
Alexander Barton
35771fa776 Added support for TCP Wrappers; redesigned configuration result output;
Changed some "--enable"/"--disable" switches to "--with"/"--without".
2003-03-07 14:37:30 +00:00
Alexander Barton
439c945d56 Added support for TCP Wrappers. 2003-03-07 14:35:52 +00:00
Alexander Barton
93146b5718 Updated documentation. 2003-03-04 14:12:30 +00:00
Alexander Barton
fd4a6b5dd5 Updated documentation. 2003-03-04 13:46:53 +00:00
Alexander Barton
b896f8acda - better compatibility 2003-02-25 14:07:26 +00:00
Alexander Barton
29bd35bc4f - Added optional support for Rendezvous. 2003-02-23 12:04:05 +00:00
Alexander Barton
f179070113 - New constant RENDEZVOUS_TYPE. 2003-02-23 12:03:39 +00:00
Alexander Barton
f813833ba1 - New switch "--enable-rendezvous" to enable support for Rendezvous. 2003-02-23 12:03:10 +00:00
Alexander Barton
f349b18949 - Updated documentation. 2003-02-23 12:02:39 +00:00
Alexander Barton
aa15257936 - Added new source module "rendezvous". 2003-02-23 12:02:26 +00:00
Alexander Barton
6e0c5698e4 - Updated documentation. 2003-02-21 19:44:00 +00:00
Alexander Barton
cf4ad8d6f7 - Conn_Close() ignores recursive calls for the same link now. 2003-02-21 19:19:27 +00:00
Alexander Barton
2a3f8cc57d - new link "option" constant: CONN_ISCLOSING 2003-02-21 19:18:48 +00:00
Alexander Barton
560c79615c - Updated documentation. 2003-01-31 18:29:06 +00:00
Alexander Barton
d1b2a1c4f9 - Added AC_PREREQ(2.50) to configure.in for better autoconf compatibility. 2003-01-31 18:28:31 +00:00
Alexander Barton
9d8f425a9a Updated documentation. 2003-01-21 21:22:00 +00:00
Alexander Barton
fbec1f1070 The server didn't validate wheather the "target" client of a channel
user mode change is a valid channel member or not.
2003-01-21 21:04:16 +00:00
Alexander Barton
d978d8ddbb - Updated documentation. 2003-01-17 19:10:11 +00:00
Alexander Barton
e07542a1ff - Non-members of a channel could crash the server when trying to change its modes. Fixed. 2003-01-17 19:04:19 +00:00
Alexander Barton
155f26eee2 - Updated documentation. 2003-01-15 14:30:44 +00:00
Alexander Barton
9eee0c883b - Client structures are removed correctly now if an outgoing connection can't be estahlished. 2003-01-15 14:28:59 +00:00
Alexander Barton
939767d502 - New function Client_DestroyNow(). 2003-01-15 14:28:25 +00:00
Alexander Barton
dccb297678 - Updated ProjectBuilder project file for Mac OS X. 2003-01-15 13:52:46 +00:00
Alexander Barton
2152e37722 - Added "HELP" command. 2003-01-15 13:49:20 +00:00
Alexander Barton
28cd2c1191 - Updated documentation. 2003-01-15 13:45:59 +00:00
Alexander Barton
947c512435 - Updated documentation. 2003-01-13 18:58:07 +00:00
Alexander Barton
42c4e6c7b1 - Added support for "TRACE" command. 2003-01-13 18:56:30 +00:00
Alexander Barton
f9cb4a42a0 - Updated documentation. 2003-01-13 12:22:16 +00:00
Alexander Barton
0f3e84f415 - new library "libngtool", reorganized code and directory structure therefore. 2003-01-13 12:20:16 +00:00
Alexander Barton
6a0bd57ec4 - Updated documentation. 2003-01-12 22:19:54 +00:00
Alexander Barton
fc1118cb5a - Enhanced error detection for numerics ("status codes"). 2003-01-12 22:18:46 +00:00
Alexander Barton
070976e443 - removed needless warning/info message. 2003-01-11 15:35:47 +00:00
Alexander Barton
0bcaed3564 - Updated documentation. 2003-01-08 23:00:51 +00:00
Alexander Barton
df00b38a0b - MODE returns the key and user limit for channel members correctly now. 2003-01-08 23:00:12 +00:00
Alexander Barton
aca6310dac - Updated documentation. 2003-01-08 22:29:14 +00:00
Alexander Barton
ff98833136 - Kill_Nick() uses an "faked internal KILL" now. 2003-01-08 22:28:12 +00:00
Alexander Barton
1443bc381c - Enhanced IRC_KILL to get along with Client==Client_ThisServer() for "fake KILLs". 2003-01-08 22:27:13 +00:00
Alexander Barton
9d82635b15 - Fixed IRC_KILL: used wrong connection index. 2003-01-08 22:07:34 +00:00
Alexander Barton
fa80012e71 - Enhanced CHANINFO command for channel keys and user limits. 2003-01-08 22:04:43 +00:00
Alexander Barton
43d9a62473 - Enhanced (and fixed) CHANINFO command (channel keys, user limits). 2003-01-08 22:04:05 +00:00
Alexander Barton
51e1a2e04a - Changed semantics of Client_SetAway(). 2003-01-08 22:03:21 +00:00
Alexander Barton
b8a3178a1b - Updated documentation. 2003-01-08 17:45:56 +00:00
Alexander Barton
bb94d18115 - fixed up propagation of modes with arguments between servers. 2003-01-08 17:45:15 +00:00
Alexander Barton
3b79965e38 - Updated documentation. 2003-01-05 23:06:12 +00:00
Alexander Barton
e82e3c3fdc - Updated german documentation. 2003-01-04 13:14:46 +00:00
Alexander Barton
f39d628512 - Updated documentation. 2003-01-04 13:09:07 +00:00
Alexander Barton
5b33308528 - Restructured documentation: now the main language is english. 2003-01-04 13:07:54 +00:00
Alexander Barton
444fdcf905 - Check functions only on systems that support prototypes, elder cpmpilers
become confused instead!
2003-01-04 10:40:01 +00:00
Alexander Barton
1bf0426aaf - Fixed call of tail, should be more portable now ... 2003-01-04 10:39:14 +00:00
Alexander Barton
8139505829 - Link portabtest agains "true" library. 2003-01-03 22:04:14 +00:00
Alexander Barton
c9540015c8 - Added missing PARAMS(). 2003-01-03 22:03:51 +00:00
Alexander Barton
2070cfe107 - Updated configure.in to use newer semantics of AC_INIT und AM_INIT_AUTOMAKE. 2003-01-03 19:07:09 +00:00
Alexander Barton
91f4aeec20 - Updated documentation. 2003-01-02 17:58:31 +00:00
Alexander Barton
8c1df9ef8d - The server sets a correct away message now when receiving a "MODE +a". 2003-01-02 17:57:09 +00:00
Alexander Barton
c428ac7563 - Renamed RPL_FEATURE_MSG to RPL_ISUPPORT_MSG. 2003-01-02 17:55:28 +00:00
Alexander Barton
e12179aa92 - date in version string conforms to ISO now: YYYY-MM-DD 2003-01-02 16:42:33 +00:00
Alexander Barton
cd9650c07e - Updated documentation. 2003-01-01 13:32:47 +00:00
Alexander Barton
5e3e3ad445 - Adjusted copyright banner to include 2003 :-) 2003-01-01 13:32:23 +00:00
Alexander Barton
e6a352dcfe - Updated documentation. 2003-01-01 13:30:51 +00:00
Alexander Barton
e17976a172 - Fixed up command forwarding: only to servers!
- Forwarding of WHOIS was broken in some situations.
2003-01-01 13:30:35 +00:00
Alexander Barton
ae6a7e7c0b - Fixed up command forwarding: only to servers! 2003-01-01 13:29:40 +00:00
Alexander Barton
717a26e37d - Updated documentation. 2002-12-31 16:18:07 +00:00
Alexander Barton
8dadb17f83 - Changed "once"-server-config-flag into a generic flag.
- Changed semantics of "NGIRCd_Passive".
2002-12-31 16:13:29 +00:00
Alexander Barton
281f7583f5 - New functions Conf_EnableServer(), Conf_DisableServer() and Conf_AddServer().
- Changed "once"-server-config-flag into a generic flag.
2002-12-31 16:12:50 +00:00
Alexander Barton
a7956f334e - New command DISCONNECT. 2002-12-31 16:11:24 +00:00
Alexander Barton
3e026ded6f - New commands CONNECT and DISCONNECT. 2002-12-31 16:11:06 +00:00
Alexander Barton
4e485443d3 - New commands CONNECT and DISCONNECT.
- Validate operator status before syntax checks.
2002-12-31 16:10:55 +00:00
Alexander Barton
01b58a0582 - Fixed test if we are still connected after a KILL command. 2002-12-31 16:09:55 +00:00
Alexander Barton
f83ea4b124 - Updated documentation. 2002-12-30 17:16:39 +00:00
Alexander Barton
b8d7dcec77 - Adjusted includes for new "conn-func.h" header. 2002-12-30 17:15:42 +00:00
Alexander Barton
b77dae3499 - Reorganized code for new modules "conn-func.c" and "conn-func.h". 2002-12-30 17:14:59 +00:00
Alexander Barton
0b04bfa7c0 - New source module "conn-func.c" and "conn-func.h". 2002-12-30 17:14:28 +00:00
Alexander Barton
4953c15bdf - Updated dokumentation. 2002-12-30 16:09:39 +00:00
Alexander Barton
437f2c335f - Renamed functions now found in "conn-zip.c". 2002-12-30 16:07:50 +00:00
Alexander Barton
e68cdf304f - New source files "conn-zip.c" and "conn-zip.h". 2002-12-30 16:07:23 +00:00
Alexander Barton
a2544e496c - Cleaned up handling of server configuration structures. 2002-12-30 00:01:42 +00:00
Alexander Barton
e5b824388d - Fixed up some brackets ("[" and "]") ... 2002-12-28 21:58:02 +00:00
Alexander Barton
214842853c - Optimized tests for <sys/select.h> and <sys/poll.h>. 2002-12-28 21:39:06 +00:00
Alexander Barton
cf6b9e3ec1 - Enhanced check for select() and poll(). 2002-12-28 15:17:46 +00:00
Alexander Barton
50d354bc21 - Removed needless include of <sys/select.h>. 2002-12-28 15:01:45 +00:00
Alexander Barton
3c9da65652 - Added tests for <sys/poll.h> and poll(). 2002-12-28 14:56:21 +00:00
Alexander Barton
8340e4267c - Fixed prefix of error messages of KILL. 2002-12-27 13:35:19 +00:00
Alexander Barton
c9ee3ae4f0 - Updated documentation. 2002-12-27 13:24:55 +00:00
Alexander Barton
e21b9d842c - If the server can't close a socket, it panics now.
- Quite enhanced logging :-)
2002-12-27 13:20:13 +00:00
Alexander Barton
15e4f67402 - Nicer log messages ;-) 2002-12-27 13:17:32 +00:00
Alexander Barton
01bec0daa2 - KILL can't kill server-links any more. 2002-12-27 13:17:04 +00:00
Alexander Barton
d19813cc4b - new message ERR_CANTKILLSERVER_MSG. 2002-12-27 13:15:16 +00:00
Alexander Barton
cf7660c975 - Updated documentation. 2002-12-26 18:47:01 +00:00
Alexander Barton
9c5c0c7c84 - Updated documentation. 2002-12-26 18:44:41 +00:00
Alexander Barton
4d2f279d2d - fixed KILL: you can kill yourself now without crashing the server;
QUIT isn't send to other servers after the KILL any more.
2002-12-26 18:41:00 +00:00
Alexander Barton
371fc25967 - Updated documentation. 2002-12-26 17:19:55 +00:00
Alexander Barton
b316c380ad - replaced some calls to sprintf() with snprintf() -- more secure :-) 2002-12-26 17:14:48 +00:00
Alexander Barton
695631b298 - replaced a lot of strcpy() calls with strlcpy() which is more secure. 2002-12-26 17:04:54 +00:00
Alexander Barton
6626395c88 - replaced a lot of strcat() calls with strlcat() which is more secure. 2002-12-26 16:48:14 +00:00
Alexander Barton
0ced4181b0 - replaced all strncpy()'s and strncat()'s with strlcpy() and strlcat(). 2002-12-26 16:25:43 +00:00
Alexander Barton
4f6f84e7e1 - include <sys/types.h>, if available. 2002-12-26 14:48:05 +00:00
Alexander Barton
b8456d1ba6 - addes required libngircd.a library to portabcheck_LDADD. 2002-12-26 14:46:28 +00:00
Alexander Barton
fbdf85b553 - strlcat() and strlcpy() replacement functions. 2002-12-26 14:34:11 +00:00
Alexander Barton
e13cb291dd - added prototypes for replacement functions. 2002-12-26 13:26:34 +00:00
Alexander Barton
8193bf2070 - added tests for strlcpy() and strlcat(). 2002-12-26 13:20:07 +00:00
Alexander Barton
5efd0987f3 - added tests for replacement functions. 2002-12-26 13:19:36 +00:00
Alexander Barton
60cf07c875 - added strlcpy.c for strlcpy() and strlcat() replacement functions. 2002-12-26 13:18:46 +00:00
Alexander Barton
3c738ed46d - definition of CONFIG_FILE and MOTD_FILE is now compatible with -Wtraditional. 2002-12-26 13:17:56 +00:00
Alexander Barton
9353a4a9cb - reverted last patch: now compatible with -Wtraditional of GCC 3. 2002-12-26 13:16:54 +00:00
Alexander Barton
18dfd96635 - Updated documentation. 2002-12-25 13:33:54 +00:00
Alexander Barton
77751e0fbf - GCC: add "-Wtraditional -Wpointer-arith -Wstrict-prototypes" to CFLAGS. 2002-12-25 13:23:11 +00:00
Alexander Barton
d9a13b317e - fixed some warnings that showed up with -Wtraditional 2002-12-25 13:22:43 +00:00
Alexander Barton
d449496aa4 - Updated documentation. 2002-12-24 15:10:14 +00:00
Alexander Barton
2f90341225 - Updated documentation. 2002-12-22 23:51:46 +00:00
Alexander Barton
ab44e1c6cc - new messages: RPL_FEATURE, RPL_LOCALUSERS and RPL_NETUSERS. 2002-12-22 23:32:05 +00:00
Alexander Barton
a3f59f1a5b - new numeric on login: RPL_FEATURE 2002-12-22 23:31:21 +00:00
Alexander Barton
212d36a33c - enhanced LUSERS reply: RPL_LOCALUSERS, RPL_NETUSERS. 2002-12-22 23:30:33 +00:00
Alexander Barton
d0304b19a2 - new Functions: Client_MaxUserCount(), Client_MyMaxUserCount, Adjust_Counters(). 2002-12-22 23:29:09 +00:00
Alexander Barton
c69b208bd4 - Updated documentation. 2002-12-19 04:38:58 +00:00
Alexander Barton
397c5e2e02 - renamed variables to fit new signal handler.
- moved call to NGIRCd_Rehash() to Conn_Handler().
2002-12-19 04:35:26 +00:00
Alexander Barton
77c4c015e3 - renamed variables to fit new signal handler. 2002-12-19 04:33:27 +00:00
Alexander Barton
43a4bc5b8b - New signal handler. 2002-12-19 04:29:59 +00:00
Alexander Barton
1df4081e50 - Updated documentation. 2002-12-18 16:28:36 +00:00
Alexander Barton
b9d6a03e25 - Updated documentation. 2002-12-18 14:19:58 +00:00
Alexander Barton
8841d87365 - fixed user mode propagation over server-links (IRC operator, away, ...) 2002-12-18 14:16:21 +00:00
Alexander Barton
d9e3f834d7 - fixed RPL_STATSCOMMANDS_MSG 2002-12-18 14:03:14 +00:00
Alexander Barton
210282d00f - implemented subfunction "m" of STATS command. 2002-12-18 13:55:41 +00:00
Alexander Barton
17f7c6d3ed - new function Parse_GetCommandStruct(). 2002-12-18 13:53:20 +00:00
Alexander Barton
a02bf31d50 - new functions Conn_ResetWCounter() and Conn_WCounter(). 2002-12-18 13:50:22 +00:00
Alexander Barton
98677b4348 - "STATS l" now only shows server-server-links and the own connection. 2002-12-18 13:07:46 +00:00
Alexander Barton
03d5fd6cb7 - Updated documentation. 2002-12-18 12:19:07 +00:00
Alexander Barton
3a811ef563 - Validate_Config(): removed unused variable "i". 2002-12-18 02:53:36 +00:00
Alexander Barton
3e4f58e416 - If Conf_MaxConnections is "ulimited" (<1) it is limited to FD_SETSIZE. 2002-12-18 02:52:51 +00:00
Alexander Barton
b7be46ed8a - validate Conf_MaxConnections against FD_SETSIZE if available;
- fixed up some log messages and enhanced configuration validation.
2002-12-18 02:47:12 +00:00
Alexander Barton
902ad91212 - new allocated connection structures will be initialized correctly now. 2002-12-17 11:46:54 +00:00
Alexander Barton
ca584143c6 - Dokumentation aktualisiert. 2002-12-16 23:13:10 +00:00
Alexander Barton
892144dc71 - new constant RPL_YOURESERVICE_MSG, ERR_CHANNELISFULL_MSG, ERR_BADCHANNELKEY_MSG.
- fixed ERR_PASSWDMISMATCH_MSG.
2002-12-16 23:11:59 +00:00
Alexander Barton
8d024d05d2 - new constant MAX_SERVICES,
- added k and l modes to CHANMODES.
2002-12-16 23:10:56 +00:00
Alexander Barton
69ad0e386e - Implemented channel modes k (key) and l (user limit). 2002-12-16 23:06:46 +00:00
Alexander Barton
2e88dd72d1 - New functions Channel_[Set]Key(), Channel_[Set]MaxUsers. 2002-12-16 23:05:24 +00:00
Alexander Barton
7924fafb25 - fixed some error messages and prefixes. 2002-12-16 17:14:57 +00:00
Alexander Barton
7f61f413f4 - fixed broken handling of modes received from other servers. 2002-12-16 10:52:53 +00:00
Alexander Barton
865c43080a - Updated documentation. 2002-12-15 16:30:33 +00:00
Alexander Barton
c0d74a3860 - fixed some parsing bugs.
- better logging.
2002-12-15 16:29:18 +00:00
Alexander Barton
3c7909ccec - Dokumentation aktualisiert. 2002-12-15 15:54:11 +00:00
Alexander Barton
48ec815e99 - modified test suite to reflect changes in MODE parser. 2002-12-15 15:52:34 +00:00
Alexander Barton
80c6dc86ed - new (and much more flexible!) MODE parser 2002-12-15 15:51:24 +00:00
Alexander Barton
25ca2b3cc5 - removed Conf_MaxPChannels and reverted to old behavior. 2002-12-14 13:36:19 +00:00
Alexander Barton
f7fe170a5e Dokumentation aktualisiert. 2002-12-14 13:33:44 +00:00
Alexander Barton
e65ab4a3f7 - Dokumentation aktualisiert. 2002-12-14 13:32:30 +00:00
Alexander Barton
2694017426 - Conf_MaxPChannels is considered properly in channel mode changes now. 2002-12-14 13:24:09 +00:00
Alexander Barton
00e75ccd7d - fixed up Conf_MaxJoins test on JOIN. 2002-12-14 13:23:11 +00:00
Alexander Barton
e907816380 - fixed up Channel_PCount() and Channel_CountForUser(). 2002-12-14 13:21:56 +00:00
Alexander Barton
b55915c1fe - Dokumentation aktualisiert. 2002-12-14 13:19:39 +00:00
Alexander Barton
5b8b3b8384 - maximum channels per user limit implemented. 2002-12-13 17:53:32 +00:00
Alexander Barton
9f74b95015 - new message ERR_TOOMANYCHANNELS_MSG. 2002-12-13 17:51:41 +00:00
Alexander Barton
8b7b23cf8f - new configuration variables: MaxJoins, MaxPChannels. 2002-12-13 17:32:33 +00:00
Alexander Barton
b7eb5f66dc - new function Channel_CountForUser(). 2002-12-13 17:22:57 +00:00
Alexander Barton
427be23b6e - adjusted generation of cvs-version.h to new file header format. 2002-12-12 12:36:41 +00:00
Alexander Barton
ba767481d9 - removed old ID tag 2002-12-12 12:33:14 +00:00
Alexander Barton
490f28ffd1 - new file header format (in english);
- new file ident semantics.
2002-12-12 12:24:18 +00:00
Alexander Barton
c7f075236b - new file header format (in english). 2002-12-12 12:23:43 +00:00
Alexander Barton
44a2b3cf69 - added missing include of stdio.h header for sprintf(). 2002-12-12 11:40:41 +00:00
Alexander Barton
f0d633b5ac - new file header format. 2002-12-12 11:37:11 +00:00
Alexander Barton
0f3f03b51d - fixed up broken $Id field in new file header ... 2002-12-12 11:31:21 +00:00
Alexander Barton
fa7b3f0e4c - new file header format. 2002-12-12 11:30:23 +00:00
Alexander Barton
6725d7893c - translated file header and comments to english;
- new file ident semantics.
2002-12-12 11:26:08 +00:00
Alexander Barton
11c4e786fa - Dokumentation aktualisiert. 2002-12-06 17:03:46 +00:00
Alexander Barton
b99af4fa47 - IRC Operators can KILL users now. 2002-12-06 17:02:39 +00:00
Alexander Barton
6591f17f0a - Logging von Verbindungen, die geschlossen werden/wurden verbessert. 2002-12-03 18:57:10 +00:00
Alexander Barton
9f122037ae - Logging von doppelten ID's verbessert. 2002-12-03 18:56:33 +00:00
Alexander Barton
cde9dfdb77 - Verhalten von Conn_RecvQ() und Conn_SendQ() bei Kompression korrigiert. 2002-12-02 13:56:24 +00:00
Alexander Barton
f0349f5266 - bei ISON und USERHOST fehlte im Ergebnis-String der korrekte Absender. 2002-12-02 13:45:51 +00:00
Alexander Barton
4807c4e636 - Dokumentation aktualisiert. 2002-12-02 13:44:36 +00:00
Alexander Barton
c1cafbddfe - Dokumentation aktualisiert. 2002-12-02 13:20:41 +00:00
Alexander Barton
bad7ac62a7 - STATS: Unterfunktion "L" implementiert. 2002-12-02 13:20:02 +00:00
Alexander Barton
39219230b2 - neue Befehle: Conn_StartTime(), Conn_SendQ(), Conn_RecvQ(), Conn_SendMsg(),
Conn_RecvMsg(), Conn_SendBytes[Zip](), Conn_RecvBytes[Zip]().
2002-12-02 13:19:37 +00:00
Alexander Barton
1e5fa014ba - RPL_STATSLINKINFO_MSG ueberarbeitet, RPL_STATSLINKINFOZIP_MSG eingefuehrt. 2002-12-02 13:17:46 +00:00
Alexander Barton
0efec7c094 - Dokumentation aktualisiert. 2002-12-01 13:00:50 +00:00
Alexander Barton
c3a892e165 - Dokumentation aktualisiert. 2002-11-30 22:18:09 +00:00
Alexander Barton
2e02da291a - Konfiguration wird nun besser validiert (Laenge, Zahlen). 2002-11-30 22:15:49 +00:00
Alexander Barton
a39f479163 - Tests auf ctype.h und isdigit() hinzugefuegt. 2002-11-30 22:14:47 +00:00
Alexander Barton
e50d568f25 - bei STATS wurde der Target-Server aus dem falschen Argument bestimmt. 2002-11-30 18:10:01 +00:00
Alexander Barton
0c471b84f7 - neues Source-Modul "irc-info"; neuer Befehl STATS. 2002-11-30 17:39:56 +00:00
Alexander Barton
1e59617d2c - Parser auf Befehlstabelle umgestellt. 2002-11-30 15:04:57 +00:00
Alexander Barton
e93f545c74 - "Text-Prefix" fuer Server-Notices auf "" gesetzt. 2002-11-29 17:38:17 +00:00
Alexander Barton
a1437f1ad0 - der Server verschickt keine "NOTICE AUTH"'s mehr. 2002-11-29 17:36:50 +00:00
Alexander Barton
1d8cb34bc8 - "NOTICE AUTH" und Statistiken werden im Strict-RFC-Modus nicht mehr erzeugt. 2002-11-29 13:13:42 +00:00
Alexander Barton
7a6f99a607 - Dokumentation aktualisiert. 2002-11-29 11:42:58 +00:00
Alexander Barton
93a39e8782 - Vor dem Schliessen einer Verbindung wird versucht, den Buffer zu leeren. 2002-11-28 16:56:20 +00:00
Alexander Barton
a1dff15252 - Dokumentation aktualisiert. 2002-11-28 14:32:18 +00:00
Alexander Barton
ee2c0f7701 - SQUIT wird nicht mehr zweimal fuer einen Server verschickt. 2002-11-28 14:31:43 +00:00
Alexander Barton
d3a6537fce - beim Umschalten auf Kompression wurden evtl. bereits gelesene Daten nicht
entpackt, der Datenstrom war somit dann korrumpiert.
2002-11-28 12:17:38 +00:00
Alexander Barton
b0b797b396 - Logging bei Prefix-Fehlern verbessert. 2002-11-28 11:02:50 +00:00
Alexander Barton
2de5b5cf4a - Dokumentation aktualisiert. 2002-11-26 23:28:49 +00:00
Alexander Barton
2625ce7875 - Dokumentation aktualisiert. 2002-11-26 23:20:19 +00:00
Alexander Barton
65f3adca21 - Unterstuetzung fuer komprimierte Server-Server-Links implementiert. 2002-11-26 23:07:24 +00:00
Alexander Barton
ecde730ec4 - neue Funktionen: Conn_SetOption(), Conn_UnsetOption(), Conn_Options().
- wenn mit zlib-Support: Conn_InitZip().
2002-11-26 23:06:51 +00:00
Alexander Barton
e553829a59 - Test auf zlib sowie neue Option "--disable-zlib". 2002-11-26 23:05:06 +00:00
Alexander Barton
7cc12a3d63 - Projektdatei aktualisiert (u.a. Compiler- und Linker-Flags) 2002-11-26 08:37:35 +00:00
Alexander Barton
ad98f2c20d - Falsche Variable korrigiert ... 2002-11-26 08:36:34 +00:00
Alexander Barton
dc8ca3dfaf - nun ueberfluessige Meldung entfernt. 2002-11-25 01:01:59 +00:00
Alexander Barton
ae128734ac - Dokumentation aktualisiert. 2002-11-24 18:47:15 +00:00
Alexander Barton
f86bbd718d - neuer Befehl IRC_TIME(). 2002-11-24 18:45:53 +00:00
Alexander Barton
283aed75cf - neuer IRC-Befehl "TIME". 2002-11-24 18:45:43 +00:00
Alexander Barton
15d78412bc - neue Konstante RPL_TIME_MSG. 2002-11-24 18:45:31 +00:00
Alexander Barton
1fd9216ca4 - MOTD kann nun auch an andere Server delegiert werden. 2002-11-24 16:36:03 +00:00
Alexander Barton
a7eb18db4e - Dokumentation aktualisiert. 2002-11-24 16:14:54 +00:00
Alexander Barton
5ecb00ed23 - volle Lesebuffer und Timeouts behandelt Conn_Handle() nun besser.
- Handle_Buffer() liefert nun ein Ergebnis.
2002-11-23 17:04:07 +00:00
Alexander Barton
5e89b0c82d - Dokumentation aktualisiert. 2002-11-23 16:19:38 +00:00
Alexander Barton
22b7b07932 - select() in Try_Write() hat falschen (keinen!) Timeout verwendet;
- der Timeout fuer das select() in Conn_Handler() ist nun TIME_RES (=2).
2002-11-23 16:09:57 +00:00
Alexander Barton
57bc0d7895 - neue Konstante TIME_RES: "Zeitaufloesung" des Servers. 2002-11-23 16:08:18 +00:00
Alexander Barton
5334778dbd - Dokumentation aktualisiert ... 2002-11-23 15:04:28 +00:00
Alexander Barton
1dd953b0c0 - Test-Suite an korrigiertest RPL_UMODEIS angepasst. 2002-11-22 23:45:51 +00:00
Alexander Barton
fa3dbfd8d6 - RELOAD in REHASH umbenannt.
- neue Funktion WHOWAS.
2002-11-22 23:33:00 +00:00
Alexander Barton
4eb57b590b - IRC_RELOAD() in IRC_REHASH() umbenannt. 2002-11-22 23:32:29 +00:00
Alexander Barton
12bf203167 - neue Funktion IRC_WHOWAS() begonnen. 2002-11-22 23:31:56 +00:00
Alexander Barton
cf2d479437 - NGIRCd_Reload() in NGIRCd_Rehash() umbenannt. 2002-11-22 23:31:23 +00:00
Alexander Barton
413fed9858 - Dokumentation aktualisiert. 2002-11-22 23:30:36 +00:00
Alexander Barton
60f14cca38 - neue Meldungen: RPL_STATSLINKINFO, RPL_STATSCOMMANDS, RPL_ENDOFSTATS,
RPL_WHOWASUSER, RPL_ENDOFWHOWAS und ERR_WASNOSUCHNICK.
2002-11-22 23:08:04 +00:00
Alexander Barton
4f54760c4b - Dokumentation aktualisiert [RPL_UMODEIS] 2002-11-22 22:57:14 +00:00
Alexander Barton
c0e7a0124d - RPL_UMODEIS hat Code 221, nicht 211 ... *argl* 2002-11-22 22:56:58 +00:00
Alexander Barton
b8cf379fd6 - Dokumentation aktualisiert [ChanMode P nur noch fuer IRC-Op's] 2002-11-22 18:29:46 +00:00
Alexander Barton
085a03d107 - Channel-Mode "P" ("persistent") kann nur noch von IRC-Ops gesetzt werden. 2002-11-22 18:28:22 +00:00
Alexander Barton
ab788a2ed1 - Dokumentation aktualisiert [RELOAD]. 2002-11-22 18:01:59 +00:00
Alexander Barton
4c6e07c309 - neue Funktion NGIRCd_Reload(). 2002-11-22 17:59:54 +00:00
Alexander Barton
e311cc0140 - Listen-Sockets werden ueber neue Funktion Conn_InitListeners() erzeugt.
- neue Funktion NGIRCd_Reload().
- Logging bei empfangenen Signalen verbessert.
- SIGHUP ruft nun NGIRCd_Reload() auf.
2002-11-22 17:59:43 +00:00
Alexander Barton
a5c9229084 - neue Funktion IRC_RELOAD(). 2002-11-22 17:58:41 +00:00
Alexander Barton
a0c032b2ff - neue Funktionen Conn_InitListeners() und Conn_ExitListeners(). 2002-11-22 17:58:19 +00:00
Alexander Barton
03ec91f943 - bessere Log-Meldungen. 2002-11-22 17:57:40 +00:00
Alexander Barton
7233b72145 - Channel_InitPredefined() prueft nun, ob ein Channel bereits existiert. 2002-11-22 17:57:15 +00:00
Alexander Barton
1656841f25 - neuer Befehl IRC_RELOAD(). 2002-11-22 16:36:43 +00:00
Alexander Barton
799511d472 - Befehle sortiert,
- neuer Befehl RELOAD.
2002-11-22 16:36:02 +00:00
Alexander Barton
ffb90f4cb5 - Logging vom Resolver und Connection-Statistiken verbessert. 2002-11-22 16:35:19 +00:00
Alexander Barton
e46b124ca4 - Dokumentation aktualisiert. 2002-11-20 15:50:13 +00:00
Alexander Barton
c6b9f3a13d - angenommene Socketes werden nun korrekt auf "non-blocking" gestellt;
- beim Senden und Empfangen wird EAGAIN ("Blockierung") nun abgefangen.
2002-11-20 15:48:41 +00:00
Alexander Barton
6d5b606c46 - Dokumentation aktualisiert. 2002-11-20 11:14:16 +00:00
Alexander Barton
dd09b17eae - Fehler-Ausgaben verbessert (Prefix-Fehler). 2002-11-20 10:54:24 +00:00
Alexander Barton
caa7049e2b - Dokumentation aktualisiert [asyncrone Server-Passwoerter]. 2002-11-19 12:50:48 +00:00
Alexander Barton
b2615bcc76 - Server identifizieren sich nun mit asyncronen Passwoertern. 2002-11-19 12:50:20 +00:00
Alexander Barton
1c0ded41af - Rechtschreibfehler korrigiert ;-) 2002-11-18 18:49:34 +00:00
Alexander Barton
7bbdfb3d84 - anstelle von "ListenPorts" wird nun korrekt "Ports" ausgegeben. 2002-11-18 18:47:42 +00:00
Alexander Barton
0086d2771d - corrected a permission problem (Sean Reifschneider). 2002-11-18 14:11:45 +00:00
Alexander Barton
98bc7d4fb7 - ProjectBuilder-Projektdatei aktualisiert. 2002-11-18 14:06:47 +00:00
Alexander Barton
be9df69116 - doc/en/sample-ngircd.conf in Makefile-System ergaenzt. 2002-11-18 14:06:29 +00:00
Alexander Barton
f80a5ae1de - Dokumentation aktualisiert. 2002-11-15 22:08:30 +00:00
Alexander Barton
b1a148905a - unter HP-UX wird nun _XOPEN_SOURCE_EXTENDED definiert. Fuer den gcc
unter 11.11 ist dies erforderlich.
2002-11-15 22:08:19 +00:00
Alexander Barton
8457fca570 - Dokumentation aktualisiert. 2002-11-11 13:07:27 +00:00
Alexander Barton
999897f587 - Dokumentation aktualisiert. 2002-11-11 01:08:55 +00:00
Alexander Barton
ab2d1ca41e - Dokumentation fuer A/UX ueberarbeitet. 2002-11-11 00:59:11 +00:00
Alexander Barton
ee489ee6d7 - Dokumentation aktualisiert. 2002-11-11 00:54:44 +00:00
Alexander Barton
6250dcb1dc - Fehler-Handling von connect() gefixed: der Server kann sich nun auch
unter A/UX wieder zu anderen verbinden.
2002-11-11 00:54:25 +00:00
Alexander Barton
797f9170d7 - Test-Suite an A/UX angepasst. 2002-11-10 14:28:06 +00:00
Alexander Barton
071686ac6e - Dokumentation aktualisiert. 2002-11-10 13:39:17 +00:00
Alexander Barton
70c9c05153 - User und Gruppe werden nun sowohl numerisch als auch namentlich angezeigt. 2002-11-10 13:38:41 +00:00
Alexander Barton
bf84670aaa - Dokumentation aktualisiert bzw. begonnen. 2002-11-08 23:24:54 +00:00
Alexander Barton
d35c0137b7 - Dokumentation aktualisiert. 2002-11-08 23:11:48 +00:00
Alexander Barton
ae39724a63 - in ServerUID und ServerGID kann nun jeweils auch der Name (und nicht nur
die numerische ID) verwendet werden.
2002-11-08 23:09:26 +00:00
Alexander Barton
8da254ea74 - Dokumentation aktualisiert. 2002-11-08 22:19:48 +00:00
Alexander Barton
47c8bcc8c9 - Dokumentation aktualisiert. 2002-11-05 14:30:52 +00:00
Alexander Barton
9523e28179 - IRC_Server() ruft nun Conn_SetServer() zur Server-Registrierung auf. 2002-11-05 14:18:59 +00:00
Alexander Barton
a4d5ca633a - Neue Funktion Conn_SetServer().
- Einige assert()'s aufgeraumt.
2002-11-05 14:18:39 +00:00
Alexander Barton
3102c550ff - neue Funktion Conn_SetServer(). 2002-11-05 14:18:13 +00:00
Alexander Barton
51dd80c48b - Dokumentation aktualisiert. 2002-11-04 20:04:18 +00:00
Alexander Barton
14e870e2ec - Code-Formatierung korrigiert (da waren Tabs wo keine hin gehoerten). 2002-11-04 19:25:26 +00:00
Alexander Barton
a6265aa0df - falsche Konstante korrigiert ... *argl*! 2002-11-04 13:26:00 +00:00
Alexander Barton
4c870f4be9 - Server und "normale" Clients werden wieder korrekt unterschieden. 2002-11-04 12:34:22 +00:00
Alexander Barton
a29e37a4c1 - Semantik der Conn_xxxFlag()-Funktionen geaendert. 2002-11-04 12:31:27 +00:00
Alexander Barton
aabe013dd0 - Dokumentation aktualisiert: neue Variable MaxConnections. 2002-11-02 23:13:18 +00:00
Alexander Barton
07984e0b81 - Dokumentation aktualisiert. 2002-11-02 23:11:38 +00:00
Alexander Barton
7ec3603996 - Dokumentation aktualisiert. 2002-11-02 23:01:27 +00:00
Alexander Barton
b991de0f15 - Connection-Strukturen werden nun "pool-weise" verwaltet; der Pool wird
bei Bedarf bis zu einem konfigurierten Limit vergroessert.
- neue Funktionen Conn_First(), Conn_Next(), Conn_ClearFlags(), Conn_Flag()
  und Conn_SetFlag().
2002-11-02 23:00:45 +00:00
Alexander Barton
601f0ede61 - Modul an neues Connection-Handling angepasst. 2002-11-02 22:59:41 +00:00
Alexander Barton
0d32a3b4fe - neue Konfigurationsvariable "MaxConnections". 2002-11-02 22:59:01 +00:00
Alexander Barton
650f9a2d9e - neue Konfigurationsvariable "Conf_MaxConnections". 2002-11-02 22:58:41 +00:00
Alexander Barton
05839597bf Neue Funktionen: Conn_First(), Conn_Next(), Conn_ClearFlags(), Conn_SetFlag() und Conn_Flag(). 2002-11-02 22:58:19 +00:00
Alexander Barton
8eac8bcbfc MAX_CONNECTIONS durch CONNECTION_POOL ersetzt. 2002-11-02 22:57:41 +00:00
Alexander Barton
8dd5ea0729 - GCC-Option "-ansi" hat sich leider nicht bewaehrt ... wieder entfernt. 2002-10-22 23:36:04 +00:00
Alexander Barton
d98e7def76 - beim GCC wird nun die "-ansi"-Option gesetzt. 2002-10-22 23:26:28 +00:00
Alexander Barton
5b25c8ccd0 - Verbindungsstatistik ein wenig klarer formuliert. 2002-10-22 23:25:29 +00:00
Alexander Barton
135abb5d74 - AdminEMail ist nun auch korrekt gesetzt. 2002-10-21 13:45:23 +00:00
Alexander Barton
12cad28ee8 - Anpassungen bzw. Fixes fuer "strict RFC"-Mode. 2002-10-21 13:45:07 +00:00
Alexander Barton
b840be9875 - ausgehende Verbindungen mit ID 0 konnten nicht aufgebaut werden ... :-/
- einige Debug-Ausgaben erweitert.
2002-10-15 09:24:54 +00:00
Alexander Barton
863daa29cb - Dokumentation aktualisiert. 2002-10-14 22:53:41 +00:00
Alexander Barton
3cf845fbfb - Segfault unter hoher Netzaktivitaet behoben: in Conn_Close() wird die
Connection-Struktur nun frueher als "ungueltig" markiert.
- besseres Error-Logging.
2002-10-14 22:21:00 +00:00
Alexander Barton
c49bee8d0b - RPL_YOURHOST_MSG nochmals leicht geaendert ... 2002-10-11 02:32:09 +00:00
Alexander Barton
0dfb771671 - Dokumentation aktualisiert. 2002-10-11 02:27:33 +00:00
Alexander Barton
452d98f329 - RPL_YOURHOST_MSG ist nun ircII-kompatibel :-) 2002-10-11 02:16:14 +00:00
Alexander Barton
a981f517f3 - in der Uebersicht werden die Pfad-Defines nicht mehr in CFLAGS angezeigt. 2002-10-11 00:49:49 +00:00
Alexander Barton
736bacde90 - Es wird nun laenger auf Resolver-Ergebnisse gewartet, der Login aber
sofort fortgesetzt, so ein Ergebnis eintrifft.
2002-10-10 15:01:12 +00:00
Alexander Barton
df0eb17172 - neue Funktion Conn_ResetPenalty(). 2002-10-10 15:00:33 +00:00
Alexander Barton
f274ec0652 - Dokumentation aktualisiert. 2002-10-10 15:00:09 +00:00
Alexander Barton
b7593369fb - Dokumentation aktualisiert. 2002-10-09 21:17:50 +00:00
Alexander Barton
ef407ea50c - Dokumentation aktualisiert. 2002-10-09 17:10:15 +00:00
Alexander Barton
345b9a3217 - "schneller Server-Reconnect" wird nun nur dann ausgefuehrt, wenn die
Verbindung zuvor "lange genug" aufgebaut war (z.B. also nicht mehr, wenn
  der Peer sofort beim Connect ein fatales ERROR liefert).
2002-10-09 17:07:22 +00:00
Alexander Barton
af719e60c5 - double in DOUBLE geaendert (ist in portab.h nun definiert). 2002-10-09 17:02:49 +00:00
Alexander Barton
84022a12fd - neue Datentypen LONG, ULONG und DOUBLE. 2002-10-09 16:53:30 +00:00
Alexander Barton
c7b55aa6f4 - verwendete Datentypen aufgeraumt: beispielsweise INT32 ist nun oft ein LONG. 2002-10-09 16:53:02 +00:00
Alexander Barton
5e70a131e9 - Dokumentation aktualisiert. 2002-10-09 13:42:32 +00:00
Alexander Barton
1e83e6662f - fehlenden Return-Wert ergaenzt (ich Dubel). 2002-10-09 13:35:32 +00:00
Alexander Barton
b6c049cb3c - Client wird nun via NOTICEs ueber Resolver-Status informiert. 2002-10-09 13:34:19 +00:00
Alexander Barton
39d7b014cf - NOTICE liefert nun nie(!) einen Fehler, auch nicht, wenn Client noch nicht registriert. 2002-10-09 13:33:19 +00:00
Alexander Barton
bd645f5095 - neue Konstante NOTICE_TXTPREFIX. 2002-10-09 13:15:45 +00:00
Alexander Barton
856f24eb7e - Server-NOTICEs haben nun ein "Text-Prefix". 2002-10-09 13:15:18 +00:00
Alexander Barton
f060db5ec5 - Connection-Statistik implementiert.
- Server-NOTICEs haben nun ein "Text-Prefix".
2002-10-09 13:15:08 +00:00
Alexander Barton
180eb810cf - "make distcheck" lief seit der Aenderung gestern nicht mehr durch. Fixed. 2002-10-08 18:30:03 +00:00
Alexander Barton
25f32ce8b8 - bei CVS-Versionen wird nun das Datum der letzten CVS-Aenderung angezeigt,
Versionsnummer entsprechend angepasst.
2002-10-07 21:16:12 +00:00
Alexander Barton
5eaf15574a - Dokumentation aktualisiert. 2002-10-04 12:43:27 +00:00
Alexander Barton
467e76aa32 - der Puffer fuer das Prefix war zu klein. 2002-10-04 12:39:58 +00:00
Alexander Barton
63bda7de11 - Dokumentation aktualisiert. 2002-10-04 11:22:20 +00:00
Alexander Barton
ec474a4bd2 - "format-string-bugs", die zum Abbruch des Servers fuehrten, behoben. 2002-10-04 11:21:46 +00:00
Alexander Barton
74ff9828de - kleinere "code cleanups". 2002-10-03 21:49:59 +00:00
Alexander Barton
25530fff71 - Dokumentation aktualisiert. 2002-10-03 21:03:59 +00:00
Alexander Barton
df2bd0e6fb - buffer overflow behoben. 2002-10-03 21:03:11 +00:00
Alexander Barton
1ed0c6926e - Dokumentation aktualisiert. 2002-10-03 16:10:43 +00:00
Alexander Barton
7a2b49a629 - Dokumentation aktualisiert. 2002-10-03 16:04:29 +00:00
Alexander Barton
a33105dcd1 - Syntax von RPL_MYINFO_MSG korrigiert (liefert nun vier Parameter). 2002-10-03 15:49:17 +00:00
Alexander Barton
a5b5952598 - RPM "Spec-File" in Source-Tree aufgenommen. 2002-10-01 09:58:29 +00:00
Alexander Barton
c6e936d6c2 - Dokumentation aktualisiert. 2002-10-01 09:57:26 +00:00
Alexander Barton
ab2abee1fe - neues Verzeichnis "contrib" angelegt. 2002-10-01 09:57:08 +00:00
Alexander Barton
67d79b92e6 - fehlerhaften "Socket-Test-Patch" korrigiert. 2002-09-26 16:11:26 +00:00
Alexander Barton
9ba956ca8b - Dokumentation aktualisiert. 2002-09-26 16:02:38 +00:00
Alexander Barton
c50ecda715 - Conn_Write() prueft nun, ob der Socket noch offen ist, ehe Daten gesendet werden. 2002-09-26 15:59:02 +00:00
Alexander Barton
9d928b240b - Dokumentation aktualisiert. 2002-09-23 22:07:42 +00:00
Alexander Barton
870fa2797c - Dokumentation aktualisiert. 2002-09-23 21:52:58 +00:00
Alexander Barton
8d1efc81f6 - per Default werden nun nur noch 5 Sessions parallel gestartet. 2002-09-23 20:54:17 +00:00
Alexander Barton
2b6dbb07e8 - in RPL_YOURHOST_MSG wurde ein fehlerhafter Versionsstring geliefert. 2002-09-22 21:40:33 +00:00
Alexander Barton
7caf3f8429 - Dokumentation aktualisiert. 2002-09-22 21:40:15 +00:00
Alexander Barton
1a6f88f218 - Dokumentation aktualisiert. 2002-09-20 15:45:02 +00:00
Alexander Barton
06cb16580e - getpid.sh wird nun auf bei "make distcheck" gefunden. 2002-09-20 15:39:24 +00:00
Alexander Barton
2b690fff78 - Dokumentation aktualisiert. 2002-09-20 15:26:26 +00:00
Alexander Barton
7058a8c006 - das Test-Binary wurde nicht immer kopiert. 2002-09-20 15:12:42 +00:00
Alexander Barton
b71db1a9a5 - auch unter Cygwin wird ngircd-TEST bei "make clean" nun entfernt. 2002-09-20 15:09:44 +00:00
Alexander Barton
420c96d17b - das ngIRCd-Binary fuer die Tests wird nun kopiert, nicht mehr verlinkt. 2002-09-20 15:08:12 +00:00
Alexander Barton
6817978ddb - Dokumentation aktualisiert. 2002-09-20 14:57:17 +00:00
Alexander Barton
efedfe12ff - Die PID des Test-Servers wird nun mit dem Script "getpid.sh" ermittelt. 2002-09-20 14:46:55 +00:00
Alexander Barton
90ab7c7c48 - die ermittelte PID des ngIRCd wird besser validiert (leer?). 2002-09-20 13:57:01 +00:00
Alexander Barton
fa9e38b36f - Dokumentation aktualisiert. 2002-09-19 10:19:32 +00:00
Alexander Barton
33bda862da - Fehler bei Validierung von "AdminInfo2" behoben. 2002-09-19 10:19:12 +00:00
Alexander Barton
ef2b5eea53 - Versionsnummer fuer CVS-HEAD wieder auf "CurrentCVS" gesetzt. 2002-09-19 09:59:47 +00:00
Alexander Barton
45279951aa - Dokumentation aktualisiert. 2002-09-19 09:35:05 +00:00
Alexander Barton
47b4581907 - Dokumentation aktualisiert. 2002-09-19 09:27:26 +00:00
Alexander Barton
b5d6597c0a - Parameter fuer ps werden in anderer (besserer) Reihenfolge getestet. 2002-09-18 20:58:56 +00:00
Alexander Barton
4a87df8e79 - Dokumentation aktualisiert. 2002-09-17 17:30:09 +00:00
Alexander Barton
7715e4de61 - Versionsnummer auf 0.5.0-pre2 angehoben. 2002-09-17 17:12:24 +00:00
Alexander Barton
982a08b80d - katastrophalen Fix fuer Return-Wert korrigiert ... ARGL! 2002-09-17 17:11:56 +00:00
Alexander Barton
157718a7a3 - es wird nun auch auf "sys/select.h" geprueft. U.a. fuer AIX notwendig.
- Versionsnummer auf 0.5.0-pre1 angehoben.
2002-09-16 11:13:43 +00:00
Alexander Barton
72b95c4a66 - Dokumentation aktualisiert. 2002-09-16 11:11:21 +00:00
Alexander Barton
4fe894cbe7 - ProjectBuilder-Projektdatei aktualisiert. 2002-09-16 11:03:30 +00:00
Alexander Barton
0c9f22ac66 - Dokumentation aktualisiert. 2002-09-16 11:03:05 +00:00
Alexander Barton
bde8d2dd6b - "CC-Speed.txt" aus Distribution entfernt. 2002-09-16 10:35:06 +00:00
Alexander Barton
6e27c52336 - ueberholt, wird in Zukunft auf der Webseite verfuegbar sein. 2002-09-16 10:34:08 +00:00
Alexander Barton
efeba4a7f1 - Dokumentation aktualisiert. 2002-09-16 10:33:09 +00:00
Alexander Barton
a9d44b95bd - Dokumentation aktualisiert. 2002-09-16 10:00:28 +00:00
Alexander Barton
34bdaaa33f - CLIENTS-Konstante unter IRIX vermindet. 2002-09-16 09:54:17 +00:00
Alexander Barton
508fa48aa6 - es wird nun getestet, mit welchen Parametern "ps" aufgerufen werden muss. 2002-09-16 09:53:16 +00:00
Alexander Barton
66b461a5ab - neue Konstanten: RPL_ADMINME_MSG, RPL_ADMINLOC1_MSG, RPL_ADMINLOC2_MSG, RPL_ADMINEMAIL_MSG. 2002-09-16 09:23:40 +00:00
Alexander Barton
e3d70f2c43 - Auf Systemen, die "sys/select.h" kennen (z.B. AIX 3.2.5) wird dieses nun includiert. 2002-09-16 09:22:41 +00:00
Alexander Barton
5502fb271d - neuer Befehl: ADMIN 2002-09-16 09:20:27 +00:00
Alexander Barton
e6f96a7a86 - IRC_WriteStrServersPrefix() lieferte einen Return-Wert, obwohl als VOID deklariert. 2002-09-16 09:19:23 +00:00
Alexander Barton
005391ca5b - LIST kann nun auch an andere Server geforwarded werden. 2002-09-16 09:16:17 +00:00
Alexander Barton
3a3d6d7b9a - neuer Befehl IRC_ADMIN(). 2002-09-16 09:14:45 +00:00
Alexander Barton
4ded22b00b - Admin-Info eingebaut (Variablen "AdminInfo1", "AdminInfo2" und "AdminEMail"). 2002-09-16 09:13:40 +00:00
Alexander Barton
b615d12897 - Admin-Info eingebaut (Variablen "AdminInfo1", "AdminInfo2" und "AdminEMail");
- Bug bei zu langem Operator-Name behoben.
2002-09-16 09:13:06 +00:00
Alexander Barton
21244add31 - unter Darwin werden nur noch 20 Clients parallel gestartet. 2002-09-13 06:11:19 +00:00
Alexander Barton
e7b09536bf - ps wird nun (hoffentlich portabler) jeweils mit "ax" aufgerufen. 2002-09-13 06:04:49 +00:00
Alexander Barton
a0b06ecbd4 - ${srcdir} wird nun beachtet. 2002-09-12 02:28:44 +00:00
Alexander Barton
3f873b0c39 - PID des Test-Servers wird besser ermittelt. 2002-09-12 02:27:47 +00:00
Alexander Barton
05bf66dff0 - Test-Server wird in aktuelles Verzeichnis als "ngircd-TEST" verlinkt.
- die PID des Test-ngIRCd wird besser ermittelt.
2002-09-12 02:27:30 +00:00
Alexander Barton
069ca5df40 - $(srcdir) wird nun beachtet; fehlenden "\" ergaenzt; Dateien ergaenzt. 2002-09-12 02:26:17 +00:00
Alexander Barton
eb817807bc - Dokumentation aktualisiert. 2002-09-09 23:17:04 +00:00
Alexander Barton
fc6f64742c - EXTRA_DIST ergaenzt, clean-Target erweitert.
- neues Script "stress-server.sh" integriert.
2002-09-09 22:56:07 +00:00
Alexander Barton
d040fa2a7d - laeuft der ngIRCd im Vordergrund, so wird syslog nicht mehr benutzt. 2002-09-09 22:55:21 +00:00
Alexander Barton
4d46eac733 - Tests erweitert. 2002-09-09 21:26:00 +00:00
Alexander Barton
85691130b1 - nun ist auch ein Test-Operator konfiguriert. 2002-09-09 21:25:50 +00:00
Alexander Barton
c4d78a3469 - Test-Suite fuer den ngIRCd begonnen. 2002-09-09 10:16:24 +00:00
Alexander Barton
dd4535b7f1 - Testprogramm ueberarbeitet, macht nun selber keine Ausgaben mehr. 2002-09-09 10:05:10 +00:00
Alexander Barton
1734e53410 - Anpassungen an neue Test-Suite (Ausgabeformat). 2002-09-09 10:00:39 +00:00
Alexander Barton
843fe45dee - ngIRCd "Test-Suite" in Build-System aufgenommen. 2002-09-09 10:00:15 +00:00
Alexander Barton
51dabeafaa - Server-Versionsausgabe ueberarbeitet. 2002-09-09 03:34:33 +00:00
Alexander Barton
05fc4a4cb7 - Parameter von List_Add{Invited|Banned}() erweitert.
- neue Funktion Already_Registered().
- doppelte Ban- und Invite-Eintraege werden nun vermieden.
2002-09-08 17:06:07 +00:00
Alexander Barton
f3c0c7c0b3 - Parameter von List_Add{Invited|Banned}() erweitert. 2002-09-08 17:05:25 +00:00
Alexander Barton
c2aefbb3e1 - auch Nicht-ChanOps konnten Ban- und Invite-Lists veraendern. 2002-09-08 01:38:36 +00:00
Alexander Barton
296ddebed1 - Bans/Invites: andere Server wurden nicht informiert.
- neue Funktion Send_ListChange().
2002-09-08 01:16:58 +00:00
Alexander Barton
922b7dbd46 - Dokumentation aktualisiert. 2002-09-08 00:56:33 +00:00
Alexander Barton
ffcf5ab999 - neu: Lists_AddInvited(), Lists_DelInvited(), Lists_ShowInvites, Lists_AddBanned(), Lists_DelBanned(), Lists_ShowBanned und Lists_MakeMask(). 2002-09-08 00:56:14 +00:00
Alexander Barton
592565aef5 - neu: Check_List(), Check_List(), Lists_AddInvited(), Lists_DelInvited(), Lists_ShowInvites, Lists_AddBanned(), Lists_DelBanned(), Lists_ShowBanned und Lists_MakeMask().
- einige Bug-Fixes, bessere Debug-Meldungen.
2002-09-08 00:55:45 +00:00
Alexander Barton
53f76a1dad - den BAN-Befehl gibt es gar nicht ;-) 2002-09-08 00:52:55 +00:00
Alexander Barton
ce4b719459 - ein INVITE wird auch dann gespeichert (obwohl der Channel nicht +i ist), wenn der Client gebanned ist.
- den BAN-Befehl gibt es gar nicht ;-)
2002-09-08 00:52:39 +00:00
Alexander Barton
19ac723e48 - Invite- und Ban-Lists (MODE +I, MODE +b) implementiert. 2002-09-08 00:51:28 +00:00
Alexander Barton
a1ded68a49 - ein "banned client" darf in einen Channel, wenn er "invited" ist. 2002-09-08 00:50:25 +00:00
Alexander Barton
8a927a1b6a - Penalty-Delays gelten nun auch für Schreibvorgaenge.
- Conn_Handler() besser strukturiert ...
2002-09-07 22:34:44 +00:00
Alexander Barton
eab10c91b7 - "Timing" mal wieder geaendert: sollte schon 1 Sekunde sein, sonst kommen z.B. die PING-Timeouts falsch. 2002-09-07 21:35:06 +00:00
Alexander Barton
6c19b0e438 - "Timing" von Conn_Handler() geaendert: der Daemon sollte nun noch weniger CPU-Zeit brauchen :-) 2002-09-07 21:13:38 +00:00
Alexander Barton
6f15c062a3 - "check-version" an neuen Versionsstring angepasst. 2002-09-07 18:06:29 +00:00
Alexander Barton
afe3b1918d - Dokumentation aktualisiert. 2002-09-07 18:01:40 +00:00
Alexander Barton
eaeda12c54 - Konfigurations-Uebersicht am Ende des configure-Lauf.
- neue Option "--disable-ircplus".
2002-09-07 17:59:08 +00:00
Alexander Barton
60df88777e - IRC+-Protokoll ist nun abschaltbar.
- neue Konstante PROTOIRC.
2002-09-07 17:58:00 +00:00
Alexander Barton
3dc1621200 - IRC+-Protokoll ist nun abschaltbar. 2002-09-07 17:57:31 +00:00
Alexander Barton
14cbca87c8 - IRC+-Protokoll ist nun abschaltbar; Versionsstring angepasst. 2002-09-07 17:57:17 +00:00
Alexander Barton
ce1087165d - nun wird autoconf 2.50 als Minimum vorausgesetzt. 2002-09-04 22:11:34 +00:00
Alexander Barton
aafd21c7d9 - Dokumentation aktualisiert. 2002-09-04 00:06:19 +00:00
Alexander Barton
9611833e33 - Protokollbeschreibung fuer IRC+-Protokoll angepasst. 2002-09-04 00:00:43 +00:00
Alexander Barton
62d576880b - Dokumentation aktualisiert. 2002-09-03 23:59:37 +00:00
Alexander Barton
378e511e04 - New_Chan() in Channel_Create() umbenannt; entsprechende Anpassungen.
- Neue Funktion Channel_SetModes().
2002-09-03 23:57:57 +00:00
Alexander Barton
1f9ba7b326 - neuen Befehl CHANINFO implementiert: IRC_CHANINFO(). 2002-09-03 23:56:55 +00:00
Alexander Barton
3010f03414 - neue Funktion IRC_WriteStrServersPrefixFlag(). 2002-09-03 23:56:06 +00:00
Alexander Barton
938abb0236 - CHANINFO wird auf Server-Links gesendet, wenn unterstuetzt. 2002-09-03 23:55:44 +00:00
Alexander Barton
1256f34736 - neuen Befehl CONNECT begonnen zu implementieren. 2002-09-03 23:54:59 +00:00
Alexander Barton
d1ac40391e - neue Befehle CHANINFO und CONNECT. 2002-09-03 23:54:06 +00:00
Alexander Barton
33a3550df4 - neue Konstante IRCPLUSFLAGS. 2002-09-03 23:53:41 +00:00
Alexander Barton
1c668252c9 - IRC+-Protokoll-Flags erweitert. 2002-09-03 23:53:19 +00:00
Alexander Barton
55ee4c9553 - Das IRC+-Protokoll wird nun richtig erkannt ... 2002-09-03 20:58:43 +00:00
Alexander Barton
ad1cbe34b4 - Anpassungen/Umstellung auf IRC+-Protokoll. 2002-09-03 20:39:54 +00:00
Alexander Barton
aa58390673 - Dokumentation aktualisiert. 2002-09-03 20:38:50 +00:00
Alexander Barton
5aa9c8f44c - Flags von connecteten Servern werden nun gespeichert. 2002-09-03 18:55:03 +00:00
Alexander Barton
e62ad97937 - CLIENT-Struktur um Flags erweitert.
- neue Funktionen Client_SetFlags() und Client_Flags().
2002-09-03 18:54:31 +00:00
Alexander Barton
6d81286b08 - neue Konstante CLIENT_FLAGS_LEN. 2002-09-03 18:53:38 +00:00
Alexander Barton
40ebd4704a - Ausgaben auf der Console werden nun "geflushed". 2002-09-03 17:25:45 +00:00
Alexander Barton
241d033f37 - Dokumentation aktualisiert. 2002-09-03 11:32:58 +00:00
Alexander Barton
5e6c713d9c - Dokumentation aktualisiert. 2002-09-02 21:08:02 +00:00
Alexander Barton
c76e6769db - Server-Flag "o" ("OperCanUseMode") implementiert. 2002-09-02 21:06:11 +00:00
Alexander Barton
497b61f4ab - neue Datei "Protocol.txt" hinzugefuegt. 2002-09-02 21:05:36 +00:00
Alexander Barton
28c7f37204 - Dokumentation des vom ngIRCd verwendeten Protokolls begonnen. 2002-09-02 21:04:27 +00:00
Alexander Barton
c0910498e8 - Logmeldungen fuer Server- und Protokollversionen verbessert. 2002-09-02 19:31:26 +00:00
Alexander Barton
bfa5fd3add - Dokumentation aktualisiert. 2002-09-02 19:09:43 +00:00
Alexander Barton
f43e284b22 - Konstante PASSSERVERADD durch Variable NGIRCd_ProtoID ersetzt. 2002-09-02 19:05:44 +00:00
Alexander Barton
c67bb2ac9f - Version (Server und Protokoll) von connectierten Servern wird nun ausgewertet. 2002-09-02 19:04:30 +00:00
Alexander Barton
d58431a097 - PASS-Befehl auf NGIRCd_ProtoID umgestellt. 2002-09-02 19:03:09 +00:00
Alexander Barton
ff07226814 - neue Variable: NGIRCd_ProtoID (Protokoll- und Server-ID fuer "PASS"-Befehl) 2002-09-02 19:01:11 +00:00
Alexander Barton
65b31ffbb2 - NGIRCd_ProtoID (Protokoll- und Server-ID) wird erzeugt. 2002-09-02 19:00:25 +00:00
Alexander Barton
adcd9289c2 - vorkonfigurierte Channel: Fehlerhaften Test "kein Null-Name" korrigiert. 2002-09-02 18:23:35 +00:00
Alexander Barton
71ae473187 - Dokumentation aktualisiert 2002-09-02 15:00:07 +00:00
Alexander Barton
7e1b3b9157 - neue Konfigurationsoption "OperCanUseMode" (Sektion "Global"):
ist sie aktiv, koennen IRC-Operatoren immer Channel-Modes setzen.
2002-09-02 14:59:17 +00:00
Alexander Barton
f673fb960a - an Clients wurden Modes mit fuehrendem ":" geliefert. Das ist zwar RFC-
konform (IMO), macht aber leider grosse(!!) Probleme :-/
2002-08-27 13:57:03 +00:00
Alexander Barton
7d30c8cebc - Hmpf. "Verfruehtes" CVS-Update einiger Source-Files zurueckgenommen ... 2002-08-26 23:47:58 +00:00
Alexander Barton
d645ce86e9 - Bei einem JOIN in einen persistenten Channel werden nun evtl. zu setzende
User-Modes korrekt in den Channel gemeldet.
2002-08-26 23:39:22 +00:00
Alexander Barton
7b6cfc17c4 - neue Funktion Conn_SetPenalty() zum Setzen von sog. "Penalty Zeiten";
wird bisher nur beim Connect verwendet (eine Sekunde).
2002-08-26 00:03:15 +00:00
Alexander Barton
5063de59b1 - Prefixe werden nur noch bei reg. Verbindungen validiert, ansonsten ignoriert. 2002-07-29 20:35:33 +00:00
Alexander Barton
e0ed3aa141 - Semantik der Validate_XXX()-Funktionen verbessert,
- Validate_Prefix() mit "Leben" erfuellt ;-)
2002-07-26 21:12:24 +00:00
Alexander Barton
3b6c3d6d64 - Dokumentation aktualisiert. 2002-07-25 12:34:50 +00:00
Alexander Barton
e07fab17b1 - NJOIN wurde "zerhackt" an andere Server weitergegeben. 2002-07-25 12:33:19 +00:00
Alexander Barton
3da161131a - KILL konnte keine Remote-Clients toeten; zudem besseres Logging. 2002-07-25 11:37:01 +00:00
Alexander Barton
b1f4200608 - bei INVITE wurde im Antwort-Status-Code das falsche Prefix verschickt. 2002-07-25 11:36:16 +00:00
Alexander Barton
2d4f7847d8 - "portability header" werden nun bei Lint-Laeufen gefunden. 2002-07-22 13:23:28 +00:00
Alexander Barton
81a26d988a - Lists_AddInvited() kann nun einen Fehler liefern. 2002-07-15 16:35:21 +00:00
Alexander Barton
1d524784ff - Channel-Modes "b" und "I" in CHANMODES aufgenommen. 2002-07-15 16:34:46 +00:00
Alexander Barton
a6b61df983 - neue Konstanten fuer Invite- und Banlists: RPL_xxxLIST_MSG, RPL_ENDOFxxx_MSG
- neue Message ERR_UNKNOWNMODE_MSG.
2002-07-15 16:33:57 +00:00
Alexander Barton
72670833cb - Dokumentation aktualisiert. 2002-07-08 17:54:57 +00:00
Alexander Barton
1902c6bf94 - Projektdatei fuer den ProjectBuilder unter Mac OS X aktualisiert. 2002-06-26 15:47:36 +00:00
Alexander Barton
7a90d92aef - Dokumentation aktualisiert. 2002-06-26 15:47:08 +00:00
Alexander Barton
a5fb74f3f2 - Tests auf regex.h und regcomp() entfernt: werde nun doch nicht benoetigt. 2002-06-26 15:45:22 +00:00
Alexander Barton
adbb2e09df - neues Modul match.c/match.h hinzugefuegt. 2002-06-26 15:44:47 +00:00
Alexander Barton
39b9f65d0d - IRC_LIST ruft nun Match() auf und beherrscht somit nun Patterns. 2002-06-26 15:44:15 +00:00
Alexander Barton
cf9629b9c7 - neues #define: REGISTER 2002-06-26 15:43:38 +00:00
Alexander Barton
8907c8dd3d - neues Modul "match" begonnen. 2002-06-26 15:42:58 +00:00
Alexander Barton
c1a278b0eb - Reihenfolge der Tests geaendert. Ist "huebscher" :-) 2002-06-26 12:48:20 +00:00
Alexander Barton
21ab8f4640 - Mac OS X ProjectBuilder-Projektdatei aktualisiert. 2002-06-26 12:44:43 +00:00
Alexander Barton
e1ef0bd4fd - Dokumentation aktualisiert. 2002-06-11 21:53:23 +00:00
Alexander Barton
151babd168 - IRC_INVITE() validierte das Ziel eines INVITES nicht korrekt. 2002-06-11 13:59:07 +00:00
Alexander Barton
9fd8254ada - auch bei IRC_NOTICE() wurde das Ziel nicht korrekt validiert. 2002-06-11 13:58:43 +00:00
Alexander Barton
5329241831 - Dokumentation aktualisiert. 2002-06-10 21:12:34 +00:00
Alexander Barton
e876e210da - Code-Stelle in IRC_JOIN "klarer" gemacht :-) 2002-06-10 21:10:25 +00:00
Alexander Barton
e6d1bcdf82 - bessere Fehlermeldung, wenn malloc() fehl schlaegt. 2002-06-10 21:09:39 +00:00
Alexander Barton
c3d9c40a74 - wurde bei PRIVMSG als Ziel ein Server angegeben, so beendete sich der ngircd mit einem assert(). 2002-06-10 21:08:45 +00:00
Alexander Barton
4014a8ff0d - Dokumentation aktualisiert. 2002-06-09 13:21:28 +00:00
Alexander Barton
63c36773e4 - Bessere Logging, wenn malloc() fehl schlaegt. 2002-06-09 13:19:08 +00:00
Alexander Barton
e2b827d8b1 - Flag "OnlyOnce" bei Lists_AddInvited() ergaenzt.
- Neue Funktion Lists_DeleteChannel().
2002-06-09 13:18:40 +00:00
Alexander Barton
31a8dd2f2f - Invite-Lists weiter implementiert.
- Flag "OnlyOnce" bei Lists_AddInvited() ergaenzt.
- Neue Funktion Lists_DeleteChannel().
2002-06-09 13:18:23 +00:00
Alexander Barton
27a70171f1 - Flag "OnlyOnce" bei Lists_AddInvited() ergaenzt. 2002-06-09 13:17:29 +00:00
Alexander Barton
1fd7215def - Besseres Logging, wenn malloc() fehl schlaegt.
- Ban- und Invite-Lists werden korrekt aufgeraeumt.
2002-06-09 13:15:58 +00:00
Alexander Barton
acd91c0164 - der INCLUDE-Pfad wird nun anders gesetzt; loest Probleme mit ansi2knr. 2002-06-02 23:17:12 +00:00
Alexander Barton
9cb74e8135 - besseres Logging beim Restart des Servers. 2002-06-02 23:16:42 +00:00
Alexander Barton
b788a3daa5 - Pre-defined Channels werden spaeter erzeugt. 2002-06-02 17:13:33 +00:00
Alexander Barton
04162c3944 - Neue Funktion Channel_InitPredefined(). 2002-06-02 17:13:07 +00:00
Alexander Barton
5cac54044b - Log-Meldungen bezueglich Server-Restart verbessert. 2002-06-02 17:03:32 +00:00
Alexander Barton
ae958aa1a5 - Syntax von Conn_Handler() geaendert: kein Timeout mehr.
- Log-Meldungen bezueglich Server-Restart verbessert.
- Timeout von select() auf eine Sekunde erhoeht.
2002-06-02 17:03:08 +00:00
Alexander Barton
b966b2108d - Syntax von Conn_Handler() geaendert: kein Timeout mehr. 2002-06-02 17:02:34 +00:00
Alexander Barton
9ec32d15ab - die "umask" des Servers wird nun auf 077 gesetzt;
- Hauptschleife geaendert.
2002-06-02 17:01:21 +00:00
Alexander Barton
adc1eedda3 - IRC_INVITE() implementiert. 2002-06-02 15:23:46 +00:00
Alexander Barton
6d28127154 - neue Funktion Lists_AddInvited(). 2002-06-02 15:23:16 +00:00
Alexander Barton
646acbc0b2 - neue Konstanten ERR_INVITEONLYCHAN_MSG und ERR_BANNEDFROMCHAN_MSG. 2002-06-02 15:22:40 +00:00
Alexander Barton
74b1205783 - nicht unterstuetzte Channel-Modes entfernt. 2002-06-02 15:14:22 +00:00
Alexander Barton
f7567db01f - JOIN: Invite- und Ban-Lists werden nun beachtet. 2002-06-02 14:51:14 +00:00
Alexander Barton
ef328ab392 - neue Konstanten RPL_INVITING_MSG und ERR_USERONCHANNEL_MSG. 2002-06-02 14:15:50 +00:00
Alexander Barton
22365b2c55 - QUIT wurde mir falschem Prefix verschickt. 2002-06-01 15:55:17 +00:00
Alexander Barton
35507ce97e - Dokumentation aktualisiert. 2002-06-01 14:40:59 +00:00
Alexander Barton
d5b4c6dfd3 - neue Konstante ERR_USERNOTINCHANNEL_MSG definiert. 2002-06-01 14:40:00 +00:00
Alexander Barton
234f9472c2 - IRC_KICK() implementiert. 2002-06-01 14:39:34 +00:00
Alexander Barton
a2119a660a - fehlerhaften Fehlercode in IRC_TOPIC() gefixed. 2002-06-01 14:37:28 +00:00
Alexander Barton
dadebb2196 - Channel_RemoveClient() heisst nun Channel_Quit(). 2002-06-01 14:36:43 +00:00
Alexander Barton
bec858c77f - neue Funktionen Channel_Kick() und Channel_Quit();
- Channel_RemoveClient() ist entfallen.
2002-06-01 14:36:05 +00:00
Alexander Barton
cc1e8514f8 - neue Funktionen Channel_Kick() und Channel_Quit();
- Channel_RemoveClient() ist entfallen.
- Remove_Client() ueberarbeitet: nun mit Unterstuetzung fuer PART, QUIT und KICK.
2002-06-01 14:35:39 +00:00
Alexander Barton
b5d74751b1 - Konstanten aufgeraeumt, unnoetige entfernt. 2002-06-01 11:10:40 +00:00
Alexander Barton
9cdf8772b3 - Dokumentation aktualisiert. 2002-05-31 14:22:22 +00:00
Alexander Barton
bd041df0cc - Dokumentation aktualisiert. 2002-05-31 14:20:51 +00:00
Alexander Barton
124e28b14e - Dokumentation aktualisiert. 2002-05-30 16:54:04 +00:00
Alexander Barton
a6f2f1afce - Projektdatei aktualisiert. 2002-05-30 16:52:49 +00:00
Alexander Barton
f7327524fc - Weitere Anpassungen an pre-ANSI-Compiler. 2002-05-30 16:52:20 +00:00
Alexander Barton
e74ee37db5 - Dokumentation aktualisiert. 2002-05-28 09:19:34 +00:00
Alexander Barton
4bf5692888 - fehlerhafter Test auf "regex.h" korrigiert. 2002-05-27 13:12:47 +00:00
Alexander Barton
c2f60abe55 - Anpassungen an pre-ANSI-Compiler,
- Includes aufgeraumt: Header includieren keine anderen mehr.
2002-05-27 13:09:26 +00:00
Alexander Barton
be7683c79b - neue Module "lists", "irc-op" und "resolve" aufgenommen. 2002-05-27 13:08:51 +00:00
Alexander Barton
269a760f3d - Channel-Mode "i" in Feature-Konstante aufgenommen, 2002-05-27 13:04:07 +00:00
Alexander Barton
6430410158 - Tests auf regex.h,varargs.h und regcomp geaendert. 2002-05-27 13:03:11 +00:00
Alexander Barton
ba258e65a0 - Anpassungen an pre-ANSI-Compiler. 2002-05-27 13:00:50 +00:00
Alexander Barton
1934257636 - Anpassungen an pre-ANSI-Compiler. 2002-05-27 12:54:07 +00:00
Alexander Barton
fba52c45e8 - Aenderungen fuer pre-ANSI-Compiler. 2002-05-27 12:35:19 +00:00
Alexander Barton
2728c74b6c - neue Module "irc-op", "lists" und "resolve" integriert. 2002-05-27 11:25:17 +00:00
Alexander Barton
46ec0f24f6 - neues Modul "resolve" begonnen. 2002-05-27 11:23:27 +00:00
Alexander Barton
9dc44d9bab - neues Modul "lists" begonnen. 2002-05-27 11:22:39 +00:00
Alexander Barton
ea9b72ef79 - neues Modul "irc-op" begonnen. 2002-05-27 11:22:07 +00:00
Alexander Barton
9212f8a709 - Test auf malloc.h geaendert: der Header ist nun optional. 2002-05-24 23:42:37 +00:00
Alexander Barton
3862949a46 - Dokumentation aktualisiert. 2002-05-22 11:15:53 +00:00
Alexander Barton
c23535bc96 - bei "--configtest" werden keine leeren Bloecke mehr ausgegeben. 2002-05-22 11:14:36 +00:00
Alexander Barton
e7c1b19161 - Test auf stdint.h korrigiert: der Header ist optional. 2002-05-22 09:50:58 +00:00
Alexander Barton
cc0a694c36 - alten CVS-ID-Tag entfernt; ansi2knr.c ist direkt von automake uebernommen. 2002-05-22 09:44:50 +00:00
Alexander Barton
af9b97b55f - ansi2knr zum CVS-Tree hinzugefuegt. 2002-05-22 09:44:07 +00:00
Alexander Barton
f43b4e8cd8 - einige Tests ergaenzt bzw. aktualisiert. 2002-05-22 09:34:17 +00:00
Alexander Barton
8430c55733 - "ansi2knr" zur "DeANSIfikation" als automake-Option gesetzt. 2002-05-22 09:09:43 +00:00
Alexander Barton
ff043fa00f - Test, ob Compiler Funktions-Prototypen versteht, hinzugefuegt. 2002-05-22 09:09:05 +00:00
Alexander Barton
040f5422f2 - persistente und vordefinierte Channels implementiert. 2002-05-21 00:10:16 +00:00
Alexander Barton
c3aac8ddb4 - Dokumentation aktualisiert. 2002-05-21 00:09:53 +00:00
Alexander Barton
0b1635e371 - Dokumentation aktualisiert. 2002-05-20 12:02:58 +00:00
Alexander Barton
74f971284e - Dokumentation aktualisiert. 2002-05-19 14:55:47 +00:00
Alexander Barton
4f65cf8fb3 - Dokumentation aktualisiert. 2002-05-19 13:10:26 +00:00
Alexander Barton
b2d472fc50 - bessere Reaktionen, wenn DNS-Abfragen fehlschlagen. 2002-05-19 13:05:22 +00:00
Alexander Barton
0fb57ecffc - Definition von "signed" wieder entfernt: mehr Schaden als Nutzen :-/ 2002-05-19 10:49:23 +00:00
Alexander Barton
237c761f67 - Dummy fuer inet_aton() entfernt. "signed" wird bei Bedarf definiert. 2002-05-19 10:46:08 +00:00
Alexander Barton
c5461c4596 - Code aufgeraeumt, Tests auf C99-vsnprintf() entfernt (fuer ngIRCd unnoetig). 2002-05-19 10:44:52 +00:00
Alexander Barton
31a3bfed54 - inet_aton() wird nur noch verwendet, wenn vorhanden; ansonsten inet_addr(). 2002-05-19 10:44:02 +00:00
Alexander Barton
4432a8164a - vsnprintf.h und splint.h zu Projektdatei hinzugefuegt. 2002-05-19 10:43:01 +00:00
Alexander Barton
e9a9bdda13 - POSIX Regular Expressions werden nun vorausgesetzt,
- Test auf snprintf und vsnprintf geaendert.
2002-05-19 10:42:15 +00:00
Alexander Barton
75f1c5ec33 - Dokumentation aktualisiert. 2002-05-19 01:39:43 +00:00
Alexander Barton
509a34f0fa - die libngportab wurde "zu frueh" zum ngIRCd gelinkt ... 2002-05-19 01:30:29 +00:00
Alexander Barton
679565603a - neue Library "ngportab" begonnen: diese bildet Funktionen nach, die auf
dem Ziel-System nicht vorhanden sind -- wie z.B. vsnprintf().
2002-05-19 01:17:40 +00:00
Alexander Barton
cf029a81ac - ngircd wird nun gegen die libngportab gelinkt, die evtl. benoetigte
und nicht auf dem System vorhandene Funktionen nachbildet.
2002-05-19 01:15:55 +00:00
Alexander Barton
2aeb0025cf - Test auf ctype.h ergaenzt, Test auf vsnprintf() geaendert. 2002-05-19 01:14:42 +00:00
Alexander Barton
c11e5501aa - Dokumentation aktualisiert. 2002-05-18 22:46:06 +00:00
Alexander Barton
f0831174c3 - h_error wird nur noch ausgewertet, wenn vorhanden. 2002-05-18 21:53:53 +00:00
Alexander Barton
0c15d4977f - Dokumentation aktualisiert. 2002-05-18 12:21:04 +00:00
Alexander Barton
991da8ea2f - der Sniffer (--sniffer) aktiviert nun automatisch den Debug-Modus mit. 2002-05-18 12:20:02 +00:00
Alexander Barton
772de2596d - Makefile.am in doc/en wird nun auch erzeugt :-) 2002-05-09 10:17:05 +00:00
Alexander Barton
be54db83c9 - Dokumentation aktualisiert. 2002-05-08 15:44:43 +00:00
Alexander Barton
cfe1893d2c - Dokumentation aktualisiert (u.a. englische Versionen) 2002-05-08 15:43:00 +00:00
Alexander Barton
1536ae30ee - Dokumentation aktualisiert. 2002-04-29 14:19:48 +00:00
Alexander Barton
81297e6c23 - Dokumentation aktualisiert. 2002-04-29 14:11:51 +00:00
Alexander Barton
f73e403ae5 - Test auf POSIX Regular-Expression-Funktionen eingebaut. 2002-04-24 13:33:56 +00:00
Alexander Barton
f2b35c3aab - Dokumentation aktualisiert. 2002-04-23 19:53:01 +00:00
Alexander Barton
f22f1cf4f4 - neue Funktion Channel_MemberCount() implementiert. 2002-04-23 19:51:31 +00:00
Alexander Barton
3c0c3c3c5f - Neue Funktion IRC_LIST() begonnen zu implementieren. 2002-04-23 19:51:14 +00:00
Alexander Barton
9d2407dbc5 - Neue IRC-Funktion LIST implementiert. 2002-04-23 19:50:27 +00:00
Alexander Barton
28a58717be - zwei neue Konstanten definiert: RPL_LIST_MSG und RPL_LISTEND_MSG. 2002-04-23 19:50:06 +00:00
Alexander Barton
f0ebf6c120 - Dokumentation aktualisiert. 2002-04-14 14:03:45 +00:00
Alexander Barton
7f79591522 - IRC_QUIT(): der QUIT-Befehl wird nun auch von unreg. Clients akzeptiert. 2002-04-14 14:02:35 +00:00
Alexander Barton
3be7b9ef59 - Count_MyServers() zaehlt nun wieder richtig, LUSERS sollte nun wieder die
korrekte Anzahl eigener Server-Links anzeigen.
2002-04-14 13:54:51 +00:00
Alexander Barton
bd5de06c67 - Dokumentation aktualisiert. 2002-04-09 21:23:20 +00:00
Alexander Barton
49a57354f2 - Dokumentation aktualisiert. 2002-04-08 17:53:31 +00:00
Alexander Barton
5b4e9152ad - Format-String fuer Log-Meldung bei Nick-Aenderungen lokaler Clients
war corrupt, der Server stuerzte so in der Regel ab :-(
2002-04-08 16:37:50 +00:00
Alexander Barton
b8c153df54 - Dokumentation aktualisiert. 2002-04-08 01:25:44 +00:00
Alexander Barton
2310ac2c39 - Es wird nicht mehr anhand der Parameter-Anzahl, sondern des Token erkannt,
ob es sich beim SERVER-Befehl um ein- oder ausgehende Verbindungen handelt
  und somit die eigenen PASS- und SERVER-Befehle gesendet werden muessen.
2002-04-08 01:20:14 +00:00
Alexander Barton
89edc330f1 - neue Konstante TOKEN_OUTBOUND. 2002-04-08 01:18:14 +00:00
Alexander Barton
1f975b6e05 - ausgehende, sich im Aufbau befindende Server-Links werden nun mit einem
speziellen Token (TOKEN_OUTBOUND) versehen, damit der Server sie spaeter
  als solche wieder erkennen kann.
2002-04-08 01:17:54 +00:00
Alexander Barton
97d5e1b49b - MAX_OPERATORS und MAX_SERVERS auf je 16 angehoben :-) 2002-04-08 00:13:45 +00:00
Alexander Barton
75c0bd250e - stdlib.h wird nun includiert. 2002-04-04 13:03:55 +00:00
Alexander Barton
7d4e9a019f - string.h wird nun includiert. 2002-04-04 13:03:39 +00:00
Alexander Barton
ddbf2626d7 - das "new line" am Ende der Datei fehlte ... 2002-04-04 13:03:11 +00:00
Alexander Barton
8e803116f1 - Manual-Pages wurden bei "clean" nach wie vor geloescht ... Upsa! 2002-04-04 13:02:41 +00:00
Alexander Barton
4b17e86c96 - die Manual-Pages fehlten in Distributions-Archiven. 2002-04-04 12:28:29 +00:00
Alexander Barton
265dc87da9 - Formatierung des Author-Abschnitt korrigiert. 2002-04-02 20:44:27 +00:00
Alexander Barton
bc87234fed - Zeilenumbruch korrigiert. 2002-04-02 20:38:50 +00:00
Alexander Barton
1c6dec3ffe - Manual-Page enthaelt nun auch korrekte URLs. 2002-04-02 20:24:24 +00:00
Alexander Barton
bee32fb05a - Manual Page aktualisiert. 2002-04-02 20:19:22 +00:00
Alexander Barton
c98200aaa3 - nroff/groff werden doch nicht benoetigt, Test wieder entfernt. 2002-04-02 18:17:38 +00:00
Alexander Barton
ac5c8bea9c - Manual-Pages unter neuen Namen begonnen. 2002-04-02 18:14:33 +00:00
Alexander Barton
b2cf9efc3a - Manual-Pages heissen nun anders und werden auch nicht mehr "bereits
uebersetzt" installiert.
2002-04-02 18:13:47 +00:00
Alexander Barton
a189b3a5c4 - Dokumentation aktualisiert. 2002-04-01 17:21:48 +00:00
Alexander Barton
60e76ed474 - Dokumentation aus branch-0-4-x uebernommen. 2002-04-01 17:20:16 +00:00
Alexander Barton
5b27e491d4 - URL der Homepage zu Versionstext hinzugefueht (aus branch-0-4-x). 2002-04-01 17:05:48 +00:00
Alexander Barton
284a0afb1d - Dokumentation aktualisiert (uebernommen aus branch-0-4-x). 2002-03-31 23:34:56 +00:00
Alexander Barton
e8cd4d9b70 Manualpage verbessert. 2002-03-31 21:42:02 +00:00
Alexander Barton
ccf89512f6 - Manual-Page aktualisiert. 2002-03-31 21:36:44 +00:00
Alexander Barton
2ebc35e18b - nun wird groff oder nroff verwendet. Pfade angepasst. 2002-03-31 20:55:07 +00:00
Alexander Barton
69b05aca38 - Manual-Pages begonnen und in Source-Tree eingebunden. 2002-03-31 20:23:06 +00:00
Alexander Barton
c9a08ad178 - Dokumentation aktualisiert. 2002-03-31 17:59:00 +00:00
Alexander Barton
8e6ffa6a6f - die Versionsnummer des HEAD-Branch im CVS ist nun einfach nur noch "CVS". 2002-03-31 17:54:30 +00:00
Alexander Barton
b58ab32b9f - im Debug-Modus wird nun der Name der "Error-Datei" ausgegeben. 2002-03-31 16:46:15 +00:00
Alexander Barton
85aad86906 - Kommandozeilen-Option "-f" wurde falsch geparsed. 2002-03-31 13:20:42 +00:00
Alexander Barton
d79b2f0a35 - unter A/UX wird nun _POSIX_SOURCE definiert. 2002-03-30 18:02:39 +00:00
Alexander Barton
c5eaea7161 - Test auf ngircd.conf in -f geaendert: das test von A/UX kennt kein -e. 2002-03-30 15:33:14 +00:00
Alexander Barton
e506ae44e0 - falschen Patch rueckgaengig gemacht ... 2002-03-30 13:40:56 +00:00
Alexander Barton
bebf0383d0 - in das "Error-File" werden wieder "kritische" Meldungen geschrieben. 2002-03-30 13:37:12 +00:00
Alexander Barton
1c99b8377f - wenn kein ListenPort definiert ist, so wird nun 6667 als Default verwendet. 2002-03-30 13:08:10 +00:00
Alexander Barton
c9e8d4bbad - Dokumentation aktualisiert. 2002-03-30 13:03:12 +00:00
Alexander Barton
d68fb7a320 - in das Error-Log wurde eine nicht-initialisierte Start-Zeit geschrieben. 2002-03-29 23:58:10 +00:00
Alexander Barton
7efefd30f1 - Dokumentation aktualisiert. 2002-03-29 23:41:23 +00:00
Alexander Barton
fe06f6e990 - Error-Log wird nach User-Wechsel mit Log_InitErrorfile() initialisiert.
- Einige Tippfehler korrigiert ...
2002-03-29 23:34:18 +00:00
Alexander Barton
3d74a9c323 - Error-Log wird nach User-Wechsel initialisiert: Log_InitErrorfile(). 2002-03-29 23:33:42 +00:00
Alexander Barton
1c2d0ae5de - neue Konfigurations-Variablen ServerUID und ServerGID. 2002-03-29 23:33:05 +00:00
Alexander Barton
07c3e62e11 - der Daemon kann nun seine UID und GID wechseln. 2002-03-29 22:56:40 +00:00
Alexander Barton
773d886df6 - Handling des "Error-File" (stderr) geaendert. 2002-03-29 22:55:42 +00:00
Alexander Barton
d47f88427d - ERROR_DIR auf "/tmp" geaendert: dort darf i.d.R. jeder schreiben. 2002-03-29 22:55:02 +00:00
Alexander Barton
95d55c56c6 - Conn_NewListener() erwartet den Port nun als "unsigned int". 2002-03-29 22:54:35 +00:00
Alexander Barton
4cdc98154c - Conf_ListenPorts[] ist nun unsigned.
- Neue Konfigurations-Variablen Conf_UID und Conf_GID.
2002-03-29 22:53:59 +00:00
Alexander Barton
d4a9ceae75 - das "localstatedir" wird nicht mehr erzeugt, da nicht mehr benoetigt. 2002-03-29 22:52:12 +00:00
Alexander Barton
6fbb2b7a67 - LOCALSTATEDIR wird nicht mehr benoetigt. 2002-03-29 22:51:28 +00:00
Alexander Barton
1c00ddffec - das Error-File wird nun komplett durch das Log-Modul verwaltet, der
Dateiname enthaelt nun die PID: so koennen mehrere Instanzen laufen.
2002-03-29 20:59:22 +00:00
Alexander Barton
f4b23bfc96 - ERROR_FILE wurde durch ERROR_DIR ersetzt. 2002-03-29 20:58:36 +00:00
Alexander Barton
72accd4ee5 - neuer Kommandozeilen-Parameter "--config"/"-f". 2002-03-28 14:15:33 +00:00
Alexander Barton
d7ecb84847 - Dokumentation aktualisiert. 2002-03-28 14:15:19 +00:00
Alexander Barton
da8da1ce7d - Hmpf. NOTICE von Server Notices wurde ohne Absender verschickt :-/ 2002-03-27 21:03:09 +00:00
Alexander Barton
20a2ffef88 - Server Notices (User-Mode "s") implementiert. 2002-03-27 20:53:30 +00:00
Alexander Barton
6b58ab8427 - einige Log-Meldungen werden nun auch als Server Notice verschickt. 2002-03-27 20:52:58 +00:00
Alexander Barton
e9b98fefc6 - Dokumentation aktualisiert. 2002-03-27 20:51:45 +00:00
Alexander Barton
95be386e9d - Dokumentation aktualisiert. 2002-03-27 19:01:40 +00:00
Alexander Barton
a89dc54690 - neuer Kommandozeilen-Parameter "--configtest": gibt die verwendete Server-
Konfiguration aus. Diesbezuegliche Ausgaben bei "--help" sind entfallen.
2002-03-27 16:41:25 +00:00
Alexander Barton
e8668cf593 - NGIRCd_ConfFile definiert. 2002-03-27 16:40:31 +00:00
Alexander Barton
bdf53a6d29 - MAX_LOG_MSG_LEN ist nun global in defines.h definiert. 2002-03-27 16:40:06 +00:00
Alexander Barton
d09dfb3e36 - neues #define: MAX_LOG_MSG_LEN. 2002-03-27 16:39:50 +00:00
Alexander Barton
f86083a057 - neue Funktion Conf_Test() zum Testen der Konfiguration.
- Conf_File ist entfallen, ist nun NGIRCd_ConfFile.
2002-03-27 16:39:22 +00:00
Alexander Barton
bcc5138518 - Kommentar korrekt eingerueckt. Wow ;-) 2002-03-26 23:58:34 +00:00
Alexander Barton
e39925af9b - Ping-Timeouts geben als Debug-Meldung den konfigurierten Timeout mit aus. 2002-03-26 23:47:45 +00:00
Alexander Barton
d58fe2f185 - lint-Target in Haupt-Makefile aufgenommen. 2002-03-25 19:39:48 +00:00
Alexander Barton
b79ba679a1 - SPLint in Makefiles als Target "lint" eingebunden. 2002-03-25 19:38:16 +00:00
Alexander Barton
8d79f26721 - neuer Header splint.h fuer Code-Check mit SPLint. 2002-03-25 19:13:19 +00:00
Alexander Barton
95a4b1b158 - einige Anpassungen nach Code-Check mit SPLint ;-) 2002-03-25 19:11:01 +00:00
Alexander Barton
c0ef984273 - ChangeLog aktualisiert. 2002-03-25 17:24:03 +00:00
Alexander Barton
a323186926 - neue Konstante fuer "Server Messages" (User-Mode "s"). 2002-03-25 17:17:08 +00:00
Alexander Barton
117c1df65a - bei Get_Prefix() fehlte das "LOCAL". 2002-03-25 17:13:07 +00:00
Alexander Barton
d4fca86ae8 - alle Client_GetFromID() durch Client_Search() ersetzt.
- neuer Mode "s": Server Messages.
2002-03-25 17:11:45 +00:00
Alexander Barton
bc4ed22635 - alle Client_GetFromID() durch Client_Search() ersetzt. 2002-03-25 17:08:54 +00:00
Alexander Barton
c74083645a - alle Client_GetFromID() durch Client_Search() ersetzt.
- IRC_PRIVMSG() ruft nun intern Channel_Write() auf.
2002-03-25 17:04:02 +00:00
Alexander Barton
0ac6151be9 - Client_GetFromID() ist entfallen: Client_Search() benutzen!
- Client-Struktur um Hash-Wert ueber ID/Nick ergaenzt.
2002-03-25 17:01:07 +00:00
Alexander Barton
b5c16c228b - Client_SetID() berechnet Hash-Wert ueber ID/Nick.
- Client_GetFromID() heisst nun Client_Search(), zudem wird via Hash gesucht.
- Client_CheckNick() sucht nicht mehr selber.
- altes Client_Search() ist entfallen (s.o.).
2002-03-25 16:59:36 +00:00
Alexander Barton
cec0e2a4d7 - Channel-Struktur um Hash-Wert ueber Namen ergaenzt.
- Neue Funktion Channel_Write().
2002-03-25 16:55:14 +00:00
Alexander Barton
0e38d10bcd - New_Chan() berechnet Hash-Werte ueber den Namen.
- Channel_Search() verwendet nun Hash-Werte.
- Neue Funktion Channel_Write().
2002-03-25 16:54:26 +00:00
Alexander Barton
7bb2c6b012 - portabtest als neues Target im ProjectBuilder eingefuehrt. 2002-03-25 16:40:02 +00:00
Alexander Barton
281d8e454d - Default PONG-Timeout auf 20 Sekunden verdoppelt. 2002-03-25 16:14:15 +00:00
Alexander Barton
8e5a56cea7 - Dateien umsortiert. 2002-03-22 00:22:44 +00:00
Alexander Barton
0df6a76103 - Hast wird immer ueber in Kleinbuchstaben gewandelten String berechnet. 2002-03-22 00:21:51 +00:00
Alexander Barton
fdf23efef4 - neue Funktion ngt_LowerStr(). 2002-03-22 00:17:27 +00:00
Alexander Barton
d7d2ab3d7f - README aktualisiert. 2002-03-21 23:25:15 +00:00
Alexander Barton
b9a2c4a8ec - Meldungen im Error-File werden nun mit Zeitangabe versehen. 2002-03-21 12:00:23 +00:00
Alexander Barton
69f683070a - Nick-Aenderungen: Log-Eintrag nur noch im Debug-Modus bzw. fuer lokale User. 2002-03-19 16:38:37 +00:00
Alexander Barton
31015c8306 - portabtest wird nur noch compiliert, wenn benoetigt (z.B. "make check") 2002-03-15 15:41:55 +00:00
Alexander Barton
b422b11865 - API fuer Hash() definiert. 2002-03-14 15:49:36 +00:00
Alexander Barton
8a45b177ce - Implementation einer Hash-Funktion begonnen. 2002-03-14 15:31:22 +00:00
Alexander Barton
28c5a21fa0 - einige assert()-Pruefungen in Conn_WriteStr() ergaenzt. 2002-03-14 13:42:33 +00:00
Alexander Barton
239727b411 - A/UX kennt O_NONBLOCK nicht? Oder in einem anderen Header? ...? 2002-03-13 00:15:55 +00:00
Alexander Barton
34d5434478 - Test, ob bereits ein Server einer Gruppe aktiv ist, korrigiert. 2002-03-12 23:45:30 +00:00
Alexander Barton
03c3f3c990 - Netz-Split-Nachricht war so falsch. Nun ist sie korrekt aber nicht schoen. 2002-03-12 23:43:56 +00:00
Alexander Barton
9146fa2534 - Projektdatei an neue Quellcode-Struktur angepasst. 2002-03-12 23:42:59 +00:00
Alexander Barton
882c91280e - Versions-String um "Vendor" erweitert. 2002-03-12 22:08:24 +00:00
Alexander Barton
e298b83b92 - Informationen um "Vendor" ergaenzt. 2002-03-12 21:47:40 +00:00
Alexander Barton
c46f623d6f - Beispiel-Konfiguration besser dokumentiert (Kommentar-Zeichen). 2002-03-12 16:08:31 +00:00
Alexander Barton
27d131a177 - Dokumentation aktualisiert. 2002-03-12 15:35:55 +00:00
Alexander Barton
7049b60af4 - der System-Typ wird nun wieder korrekt ermittelt und verwendet. 2002-03-12 15:19:12 +00:00
Alexander Barton
7633e2f8c3 - config.sub und congfig.guess zu ngIRCd-Distribution hinzugefuegt. 2002-03-12 14:39:35 +00:00
Alexander Barton
ca33cbda05 - externe portab-Header werden nicht mehr benoetigt/benutzt, dadurch
einige Aenderungen an diversen Source-Dateien und Headern.
- Dateien enthalten keine CVS-History mehr.
2002-03-12 14:37:51 +00:00
Alexander Barton
d18ca0b85d - externe portab-Header werden nicht mehr benoetigt. Notwendige Teile sind
nun im ngIRCd-Source-Tree enthalten.
2002-03-12 14:36:44 +00:00
Alexander Barton
fbfb343176 - Datei ist faelschlicherweise in das CVS "geschliddert" ... ,-) 2002-03-11 22:08:26 +00:00
Alexander Barton
f7a0ff1f65 - SQUIT, QUIT: Loglevel bei unbekannten Clients wieder auf WARNING erhoeht. 2002-03-11 22:06:32 +00:00
Alexander Barton
50ec7a56a4 - Client_Destroy() hat neuen Paramter: QUITs fuer Clients verschicken? 2002-03-11 22:04:10 +00:00
Alexander Barton
92793d3114 - Log-Level von SQUIT und QUIT bei unbekannten Clients auf DEBUG herabgesetzt.... 2002-03-11 17:33:52 +00:00
Alexander Barton
9fc7e66f66 - Log-Level von SQUIT und QUIT bei unbekannten Clients auf DEBUG herabgesetzt. 2002-03-11 17:33:40 +00:00
Alexander Barton
590f2a3f0c - ein sofortiger Re-Connect wird nur dann versucht, wenn die Vernindung
"lange genug" bereits bestanden hatte.
2002-03-11 00:04:48 +00:00
Alexander Barton
221058009c - ChangeLog aktualisiert. 2002-03-10 22:41:52 +00:00
Alexander Barton
5fa05dcea8 - IRC_PING() ist, wenn nicht im "strict RFC"-Mode, toleranter und akzptiert
beliebig viele Parameter: z.B. BitchX sendet soetwas.
2002-03-10 22:40:22 +00:00
Alexander Barton
dce77559fa - Netz-Splits werden nun als soche ausgegeben. 2002-03-10 22:03:20 +00:00
Alexander Barton
df09e7afd3 *** empty log message *** 2002-03-10 18:47:02 +00:00
Alexander Barton
2464556a7d - Dokumentation aktualisiert. 2002-03-10 18:46:46 +00:00
Alexander Barton
a8aab6bfdd - Beispiel-Konfigurationsdatei besser dokumentiert und erweitert. 2002-03-10 18:46:31 +00:00
Alexander Barton
23add79c3e - bei WHO, WHOIS und NAMES wird nun nur noch der Status "Operator" oder
"voiced" geliefert -- nicht mehr beides.
2002-03-10 18:16:51 +00:00
Alexander Barton
e6faca1337 - ChangeLog aktualisiert. 2002-03-10 17:51:29 +00:00
Alexander Barton
d67d94ea04 - Handling von "--version" und "--help" nochmal geaendert ... 2002-03-10 17:50:48 +00:00
Alexander Barton
0777bca325 - ChangeLog aktualisiert. 2002-03-10 17:46:22 +00:00
Alexander Barton
0903e7763c - bei "ngircd --version" werden nun die eincompilierten Pfade angezeigt. 2002-03-10 17:45:41 +00:00
Alexander Barton
89f9522e22 - Dokumentation aktualisiert. 2002-03-10 17:19:29 +00:00
Alexander Barton
965855756b - der Bindestrich ("-") ist nun auch in Nicknames erlaubt. 2002-03-10 17:15:20 +00:00
Alexander Barton
5bd4734a88 - die Pfade der Konfigurationsdatei, des MOTD und das Error-Files werden
nun aus den Vorgaben von configure ermittelt.
2002-03-10 17:07:41 +00:00
Alexander Barton
37c7087c6f - das "localstatedir" wird fur "ngircd.err" angelegt. 2002-03-10 17:06:27 +00:00
Alexander Barton
317941d840 - die Beispiel-Konfigurationsdatei wird als ngircd.conf installiert,
wenn noch keine "echte" Konfigurationsdatei vorhanden ist.
2002-03-10 17:05:23 +00:00
Alexander Barton
652a003ef5 - es werden nun die Konstanten SYSCONFDIR und LOCALSTATEDIR definiert. 2002-03-10 17:03:18 +00:00
Alexander Barton
81889df4b7 - Anpassungen an neues GNU automake/autoconf: acconfig.h entfaellt nun. 2002-03-10 15:40:26 +00:00
Alexander Barton
0e092b3f06 - kleine Code-Umstellungen. 2002-03-06 15:50:14 +00:00
Alexander Barton
2006b6195e - Dokumentation aktualisiert. 2002-03-06 15:39:17 +00:00
Alexander Barton
fe2bc90e45 - stderr wird nun in eine Datei umgelenkt (ngircd.err). Wenn der Server
nicht im Debug-Modus laeuft, so wird diese bei Programmende geloescht.
2002-03-06 15:36:04 +00:00
Alexander Barton
10aa35cc91 - Dateinamen und Pfad sind nun in Konstanten definiert. 2002-03-06 15:35:19 +00:00
Alexander Barton
c68c092ce3 - ein paar assert()-Tests ergaenzt. 2002-03-06 14:30:43 +00:00
Alexander Barton
0a13ff41ea - kleinere Umstellungen. 2002-03-06 14:30:22 +00:00
Alexander Barton
ae6ab2c3e0 - Logging geaendert: detaillierter im Syslog, "allgemeiner" fuer Clients. 2002-03-04 23:16:23 +00:00
Alexander Barton
b3a64f5e08 - der WHO-Befehl (ohne Argumente) gat teilweise Channel-Names vergessen. 2002-03-04 01:43:20 +00:00
Alexander Barton
802a17b11d - der AWAY-Mode wurde nicht ueber mehrere Server-Links weitergegeben. 2002-03-04 01:06:24 +00:00
Alexander Barton
2b6309719f - ChangeLog aktualisiert. 2002-03-04 01:06:03 +00:00
Alexander Barton
5562f411c4 - neue Konstante DEFAULT_AWAY_MSG fuer die Default-Away-Meldung. 2002-03-04 01:05:10 +00:00
Alexander Barton
a1a3e67de6 - neuen Clients mit Mode "a" wird nun auch der Default-Away-Text gesetzt. 2002-03-04 01:04:46 +00:00
Alexander Barton
7de4683506 - WHO implementiert (bisher ohne Unterstuetzung von Masks) 2002-03-03 19:44:30 +00:00
Alexander Barton
360bddd600 - Aktualisierungen. 2002-03-03 19:41:59 +00:00
Alexander Barton
9d5551ba6d - neue Konstanten RPL_ENDOFWHO_MSG und RPL_WHOREPLY_MSG definiert. 2002-03-03 19:41:46 +00:00
Alexander Barton
14aba7c1b2 - Sourcen auf weitere Module fuer IRC-Befehle aufgesplitted.
- IRC-Befehl WHO implementiert.
2002-03-03 17:17:38 +00:00
Alexander Barton
10363b398e - strncpy() und vsnprintf() kopieren nun etwas "optimierter" (1 Byte weniger) :-) 2002-03-03 17:17:01 +00:00
Alexander Barton
2ee05c9a68 - Source in weitere Module fuer IRC-Befehle aufgesplitted. 2002-03-03 17:15:11 +00:00
Alexander Barton
8dd92fbcd8 - README aktualisiert. 2002-03-03 13:08:33 +00:00
Alexander Barton
e7214c151f - Dokumentation aktualisiert. 2002-03-03 13:07:01 +00:00
Alexander Barton
829f741ccd - Versionsnummer auf 0.3.0-CVS angehoben. 2002-03-02 03:57:56 +00:00
127 changed files with 22347 additions and 6530 deletions

32
AUTHORS
View File

@@ -1,13 +1,35 @@
ngIRCd - Next Generation IRC Server
(c)2001,2002 by Alexander Barton,
(c)2001-2005 Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd ist freie Software und steht unter
der GNU General Public License.
ngIRCd is free software and published under the
terms of the GNU General Public License.
-- AUTHORS / Autoren --
-- AUTHORS and CONTRIBUTORS --
Alexander Barton, alex@arthur.ath.cx
Main Authors
~~~~~~~~~~~~
Alexander Barton, <alex@barton.de> (alex)
Contributors
~~~~~~~~~~~~
Goetz Hoffart, <goetz@hoffart.de> (goetz)
Ilja Osthoff, <i.osthoff@gmx.net> (ilja)
Benjamin Pineau, <ben@zouh.org>
Sean Reifschneider, <jafo-rpms@tummy.com>
Florian Westphal, <westphal@foo.fh-furtwangen.de> (fw)
Code snippets
~~~~~~~~~~~~~
J. Kercheval: pattern matching functions
Patrick Powell, <papowell@astart.com>: snprintf()-function
Andrew Tridgell & Martin Pool: strl{cpy|cat}()-functions
--
$Id: AUTHORS,v 1.11 2005/03/19 14:24:52 alex Exp $

View File

@@ -2,7 +2,7 @@
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.

504
ChangeLog
View File

@@ -1,16 +1,507 @@
ngIRCd - Next Generation IRC Server
(c)2001,2002 by Alexander Barton,
(c)2001-2005 Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd ist freie Software und steht unter
der GNU General Public License.
ngIRCd is free software and published under the
terms of the GNU General Public License.
-- ChangeLog / Aenderungen --
-- ChangeLog --
ngIRCd 0.2.x, xx.xx.2002
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
to do IDENT lookups and is logging to syslog. Bug discovered by CoKi,
<coki@nosystem.com.ar>, thanks a lot!
(http://www.nosystem.com.ar/advisories/advisory-11.txt)
ngIRCd 0.8.2 (2005-01-26)
- Added doc/SSL.txt to distribution.
- Fixed a buffer overflow that could cause the daemon to crash. Bug found
by Florian Westphal, <westphal@foo.fh-furtwangen.de>.
- Fixed a possible buffer underrun when reading the MOTD file. Thanks
to Florian Westphal, <westphal@foo.fh-furtwangen.de>.
- Fixed detection of IRC lines which are too long to send. Detected by
Florian Westphal, <westphal@foo.fh-furtwangen.de>.
- 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 :-/
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)
- 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
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!
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)
- 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.
ngIRCd 0.8.0-pre1 (2004-05-07)
- Two new configuration options: "ChrootDir" and "MotdPhrase", thanks to
Benjamin Pineau <ben@zouh.org>. Now you can force the daemon to change
its root and working directory to something "safe". MotdPhrase is used
to define an "MOTD string" instead of a whole file, useful if the
"real" MOTD file would be outside the "jail".
- INVITE- and BAN-lists become synchronized between IRC+ servers when
establishing new connections, if the peer supports this as well.
- Reorganized autogen.sh and configure scripts.
- Fixed a wrong assert() which could cause the daemon to exit spuriously
when closing down connections.
- Better logging of decompression errors returned by zlib.
- Servers other than the destination server didn't clean up the invite
list of an "invite-only" channel properly when an INVITE'd user joined.
- Changed the reply of the MODE command to match the syntax of the
original ircd exactly: the unnecessary but missing ":" before the last
parameter has been added.
- Fixed TRACE: don't output "Serv" lines for ourself; display more info.
- Results of the resolver (hostnames and IDENT names) are discarded after
the client is successfully registered with the server.
- Better logging while establishing and shutting down connections.
- The type of service (TOS) of all sockets is set to "interactive" now.
- Added short command line option "-t" as alternative to "--configtest".
- Added optional support for "IDENT" lookups on incoming connections. You
have to enable this function with the ./configure switch "--with-ident".
The default is not to do IDENT lookups.
ngIRCd 0.7.7 (2004-02-05)
- The info text ("real name") of users is set to "-" if none has been
specified using the USER command (e. g. "USER user * * :"). Reason:
the original ircd doesn't like empty ones and would KILL such users.
- Fixed (optional) TCP Wrapper test which was broken and could result in
false results. Thanks to Fuminori Tanizaki <tany@mcnet.ad.jp>!
- Removed "USE_" prefixes of configuration #defines.
ngIRCd 0.7.6 (2003-12-05)
- Fixed abort() ("server crash") when INVITE'ing users to nonexistent
channels. Bug found by <hiddenx@wp.pl>.
- Extended version numbering of CVS versions (added date).
- Enhanced/fixed doc/Protocol.txt;
ngIRCd 0.7.5 (2003-11-07)
- Fixed ban behavior: users which are banned from a channel can't no
longer send PRIVMSG's to this channel (fixes Bug #47).
- Fixed and enhanced the "penalty handling" of the server: commands that
require more resources block the client for a short time.
- Changed the internal time resolution to one second.
- New configuration variable "MaxConnectionsIP" to limit the number of
simultaneous connections from a single IP that the server will accept.
This configuration options lowers the risk of denial of service attacks
(DoS), the default is 5 connections per client IP.
- Fixed build problems under Mac OS X 10.3.
- Use "-pipe" when compiling with gcc, speeds things up a little :-)
- Added new configuration variable "Listen" to bind all listening
sockets of the server to a single IP address.
- Suppress misleading error message of diff during make run.
- Enhanced test-suite and made it work on GNU/Hurd.
- Fixed minor typo in debug output :-)
ngIRCd 0.7.1 (2003-07-18)
- Included files to build Debian packages (located in "debian/").
- Updated config.guess and config.sub to newer upstream versions.
- NJOIN propagates user channel modes correctly again ... Upsa.
- Made Makefile more compatible with "make -j<n>".
- Added support for GNU/Hurd.
- Fixed a compiler warning related to an unnecessary assert().
- Enhanced VERSION command when using debug versions.
ngIRCd 0.7.0 (2003-05-01)
- "ServerName" is checked better now: a dot (".") is required.
- The KILL command verifies and logs more parameters.
ngIRCd 0.7.0-pre2 (2003-04-27)
- CVS build system fixes (made autogen.sh more portable).
- Fixed compilation and test-suite on Solaris (tested with 2.6).
- New documentation file "doc/Platforms.txt" describing the status of
ngIRCd on the various tested platforms.
- Test for broken GCC on Mac OS X and disable "-pedantic" in this case.
- Disable "-ansi" on Cygwin: system headers are incompatible.
- The server tried to connect to other servers only once when DNS or
socket failures occurred.
- Fixed --configtest: There is no variable "ServerPwd", it's "Password".
ngIRCd 0.7.0-pre1 (2003-04-22)
- New signal handler (more secure, actions are executed outside).
- GCC: the compiler is now called with more warning options enabled.
- Replaced a lot of str[n]cpy(), str[n]cat() and sprintf() calls with the
more secure functions strlcpy(), strlcat() and snprintf(). On systems
that don't support strlcpy() and strlcat(), these functions are included
in the libngportab now (with prototypes in portab.h).
- If the server can't close a socket, it panics now. This is an error that
can't occur during normal operation so there is something broken.
- The order of log messages during disconnects is more "natural" now ;-)
- Cleaned up handling of server configuration structures: modifying and
removing servers during runtime works more reliable now.
- Compression code from "conn.[ch]" is now found in new "conn-zip.[ch]"
- Moved some connection functions from "conn.[ch]" to "conn-func.[ch]".
- New command CONNECT to enable and add server links. The syntax is not
RFC-compatible: use "CONNECT <name> <port>" to enable and connect an
configured server and "CONNECT <name> <port> <host> <mypwd> <peerpwd>"
to add a new server (ngIRCd tries to connect new servers only once!).
- Added DISCONNECT command ("DISCONNECT <name>") to disable servers.
- Restructured the documentation: Now the main language is English. The
german documentation has been removed (until there is a maintainer).
- Enhanced killing of users caused by a nickname collision.
- Better error detection for status code ("numerics") forwarding.
- Moved tool functions to own library: "libngtool".
- New command TRACE (you can trace only servers at the moment).
- New command HELP that lists all understood commands.
- There should no longer remain "unknown connections" (see e.g. LUSERS)
if an outgoing server link can't be established.
- Added AC_PREREQ(2.50) to configure.in for better autoconf compatibility.
- Conn_Close() now handles recursive calls for the same link correctly.
- ngIRCd can register itself with Rendezvous: to enable support pass the
new switch "--with-rendezvous" to configure.
- 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",
"--with-tcp-wrappers", and "--with-rendezvous".
- Better error reporting to clients on connect.
- Enhanced manual pages ngircd(8) and ngircd.conf(5).
- Documentation is now installed in $(datadir)/doc/ngircd.
- Enhanced hanling of NJOIN in case of nick collisions.
ngIRCd 0.6.1, 2003-01-21
- Fixed KILL: you can't crash the server by killing yourself any more,
ngIRCd no longer sends a QUIT to other servers after the KILL, and you
can kill only valid users now.
- The server no longer forwards commands to ordinary users, instead it
answers with the correct error message ("no such server") now.
- WHOIS commands weren't always forwarded as requested.
- The server sets a correct default AWAY message now when propagating
between servers (bug introduced in 0.6.0).
- Fixed up and enhanced CHANINFO command: channel keys and user limits
are synchronized between servers now, too.
- MODE returns the key and user limit for channel members correctly now.
- Non-members of a channel could crash the server when trying to change
its modes or modes of its members.
- The server didn't validate weather a target user is a valid channel
member when changing his channel user modes which could crash ngIRCd.
Older changes (sorry, only available in german language):
ngIRCd 0.6.0, 2002-12-24
ngIRCd 0.6.0-pre2, 2002-12-23
- neuer Numeric 005 ("Features") beim Connect.
- LUSERS erweitert: nun wird die maximale Anzahl der lokalen und globalen
Clients, die dem Server bzw. im Netzwerk seit dem letzten (Re-)Start
dem Server gleichzeitig bekannt waren, angezeigt.
ngIRCd 0.6.0-pre1, 2002-12-18
- beim Schliessen einer Verbindung zeigt der Server nun vor dem ERROR
noch eine Statistik ueber die empfangene und gesendete Datenmenge an.
- der Server wartet bei einer eingehenden Verbindung nun laenger auf den
Resolver (4 Sekunden), wenn das Ergebnis eintrifft setzt er aber den
Login sofort fort (bisher wurde immer mind. 1 Sekunde gewartet).
- Connection-Strukturen werden nun "pool-weise" verwaltet; der Pool wird
bei Bedarf bis zu einem konfigurierten Limit vergroessert.
- Mit der neuen Konfigurationsvariable "MaxConnections" (Sektion "Global")
kann die maximale Anzahl gleichzeitiger Verbindungen begrenzt werden.
Der Default ist -1, "unlimitiert".
- der Server erkennt nun, ob bereits eine eingehende Verbindung von einem
Peer-Server besteht und versucht dann nicht mehr, selber eine eigene
ausgehende Verbindung zu diesem auufzubauen. Dadurch kann nun auf beiden
Servern in der Konfiguration ein Port fuer den Connect konfiguriert
werden (beide Server versuchen sich dann gegenseitig zu connectieren).
- Test-Suite und Dokumentation an A/UX angepasst.
- unter HP-UX definiert das configure-Script nun _XOPEN_SOURCE_EXTENDED.
- Server identifizieren sich nun mit asyncronen Passwoertern, d.h. das
Passwort, welches A an B schickt, kann ein anderes sein als das, welches
B als Antwort an A sendet. In der Konfig.-Datei, Abschnitt "Server",
wurde "Password" dazu durch "MyPassword" und "PeerPassword" ersetzt.
- Der Server kann nun zur Laufzeit die Konfiguration neu einlesen: dies
macht er nach dem Befehl REHASH oder wenn ein HUP-Signal empfangen wird.
- Channel-Mode "P" ("persistent") kann nur noch von IRC-Operatoren gesetzt
werden. Grund: User koennen den Server sonst leicht "Channel-Flooden".
- MOTD kann nun an andere Server geforwarded werden.
- IRC-Befehl "TIME" implementiert.
- Server-Server-Links koennen nun komprimiert werden, dazu wird die zlib
(www.zlib.org) benoetigt. Unterstuetzt die Gegenseite die Komprimierung
nicht, wird automatisch unkomprimiert kommuniziert. Das Verfahren ist
kompatibel mit dem Original-ircd 2.10.3, d.h. beide Server koennen
miteinander ueber komprimiert Links kommunizieren.
- Handling der Schreibpuffer umgestellt: Server sollte schneller arbeiten.
- Prefix-Fehler werden besser protokolliert (mit verursachendem Befehl).
- SQUIT wird nicht mehr doppelt an andere Server weitergeleitet.
- Der Server versucht nun vor dem Schliessen einer Verbindung Daten, die
noch im Schreibpuffer stehen, zu senden.
- Source in weiteres Modul "irc-info" aufgespalten.
- Konfigurationsvariablen werden besser validiert: Laengen, Zahlen, ...
- neuen Befehl STATS begonnen: bisher unterstuetzt wird "l" und "m".
- bei ISON und USERHOST fehlte im Ergebnis-String der korrekte Absender.
- IRC Operatoren koennen nun mit KILL User toeten. Achtung: ein Grund muss
zwingend als zweiter Parameter angegeben werden!
- neue Konfigurations-Variable "MaxJoins": Hiermit kann die maximale Zahl
der Channels, in denen ein User Mitglied sein kann, begrent werden.
- neuer, deutlich flexiblerer Parser fuer den MODE Befehl.
- neue Channel-Modes l (User-Limit) und k (Channel-Key) implementiert.
ngIRCd 0.5.4, 24.11.2002
- Fehler-Handling von connect() gefixed: der Server kann sich nun auch
unter A/UX wieder zu anderen verbinden.
- in den Konfigurationsvariablen ServerUID und ServerGID kann nun nicht
nur die numerische ID, sondern auch der Name des Users bzw. der Gruppe
verwendet werden. Beim Start des Daemons wird nun beides angezeigt.
- Besseres Logging von Prefix-Fehlern.
- angenommene Sockets werden nun korrekt auf "non-blocking" konfiguriert,
beim Senden und Empfangen werden Blockierungen besser abgefangen.
- RPL_UMODEIS hat Code 221, nicht 211 ... *argl*
- select() in Try_Write() hat falschen (keinen!) Timeout verwendet;
die "Zeit-Aufloesung" des Servers sind zudem nun 2 Sekunden (TIME_RES).
Insgesamt sollte die Reaktionszeit des Server nun besser sein.
ngIRCd 0.5.3, 08.11.2002
- NOTICE liefert nun wirklich nie mehr einen Fehler, auch dann nicht,
wenn der sendende Client noch gar nicht registriert ist.
- ein "schneller Server-Reconnect" wird nur noch dann versucht, wenn die
Verbindung zuvor ordentlich (="lange genug") in Ordnung war; somit also
nicht meht, wenn der Peer-Server gleich beim Connect ein ERROR liefert.
Das vermeidet "Connect-Orgien".
- einige Datentypen aufgeraumt: z.B. sind viele INT32s nun LONGs. Das ist
auf Platformen mit 8-Byte-Integern kompatibler.
- RPL_YOURHOST_MSG ist nun ircII- und RFC-kompatibel ;-)
- Segfault unter hoher Netzaktivitaet behoben: in Conn_Close() wird die
Connection-Struktur nun frueher als "ungueltig" markiert.
ngIRCd 0.5.2, 04.10.2002
- Buffer Overflow in Read_Resolver_Result() behoben.
- Format-String-Bugs, die zum Abbruch des Servers fuehrten, behoben.
- Maximale Laenge eines IRC-Prefix wurde falsch berechnet.
ngIRCd 0.5.1, 03.10.2002
- in RPL_YOURHOST_MSG wurde ein fehlerhafter Versionsstring geliefert.
- Test-Suite: start-server.sh, stop-server.sh und stress-server.sh koennen
nun "manuell" von der Kommandozeile gestartet werden, stress-server.sh
startet per Default nur noch 5 Sessions, eine andere Zahl kann auf der
Kommandozeile uebergeben werden (Syntax: "stress-server.sh <count>").
- In bestimmten Faellen hat der Server versucht auf einen bereits wieder
geschlossenen Socket Daten zu schreiben; das fuehrte zu einem Abbruch des
Servers durch ein assert(). Nun wird geprueft, ob der Socket noch ok ist.
- im "contrib"-Verzeichnis befindet sich nun eine RPM-Spec-Datei, aus den
.tar.gz's koennen nun mit "rpm -ta <archiv>" RPM's erzeugt werden. Danke
an Sean Reifschneider <jafo@tummy.com>!
- Syntax von RPL_MYINFO_MSG korrigiert: liefert nun vier Parameter.
ngIRCd 0.5.0, 20.09.2002
- Dokumentation aktualisiert.
- Fehler bei Validierung von "AdminInfo2" behoben.
- Test der Flags fuer "ps" in der Testsuite verbessert, ist nun zu mehr
Plattformen kompatibler.
ngIRCd 0.5.0-pre2, 17.09.2002
- Fix in IRC_WriteStrServersPrefix() war "badly broken" -- behoben.
ngIRCd 0.5.0-pre1, 16.09.2002
- Manual-Pages ngircd.8 und ngircd.conf.5 begonnen.
- Wird der Netzwerk-Sniffer aktiviert (--sniffer), so schaltet der
ngIRCd nun automatisch in den Debug-Modus.
- auf Systemen, die inet_aton() nicht kennen (wie z.B. A/UX), kann der
ngIRCd nun dennoch auch aktiv Server-Links aufbauen.
- h_errno wird auf Systemen, die das nicht kennen (wie z.B. HP-UX 10.20)
nicht mehr verwendet. Somit compiliert der ngIRCd nun auch dort :-)
- um auf dem Ziel-System nicht vorhandene Funktionen nachzubilden wird nun
die "libngportab" erzeugt; genutzt wird dies bisher fuer vsnprintf().
Nun compiliert der ngIRCd auch unter Solaris 2.5.1.
- "persistente Channels" (Mode 'P') implementiert: diese koennen in der
Konfigurationsdatei definiert werden (Sektion "Channel", vgl. Beispiel-
Konfiguration "sample-ngircd.conf") und bleiben auch dann bestehen,
wenn kein User mehr im Channel ist. Zu Channel-Operatoren werden bisher
nur IRC-Operatoren, die den Channel betreten. Die persistenten Channels
werden durch das Flag "P" gelennzeichnet, welches normal durch Channel-
Op's gesetzt und geloescht werden kann.
- bei "--configtest" werden keine leere Abschnitte mehr ausgegeben.
- Source in weitere Module aufgespalten: lists, irc-op und resolve.
- #include's aufgeraeumt: Header includieren keine anderen mehr.
- KICK implementiert (bisher kann nur ein User aus einem Channel geckicked
werden, Listen, wir im RFC vorgesehen, werden bisher nicht unterstuetzt).
- INVITE, den Channel-Mode "i" sowie Invite-Lists ueber den MODE-Befehl
(setzen, erfragen und loeschen) implementiert.
- Source an ansi2knr fuer pre-ANSI-Compiler angepasst; ansi2knr in Source-
Tree aufgenommen und in Build-System integriert; der ngIRCd compiliert
nun z.B. unter A/UX mit dem nativen Compiler von Apple.
- TOPIC lieferte bei unbekanntem Channel einen falschen Fehlercode.
- LIST versteht nun Wildcards und kann an andere Server geforwarded werden.
- wurde ein KILL fuer nicht-lokale Clients empfangen, so wurden die
Verwaltungs-Strukturen nicht korrekt freigegeben.
- empfangene NJOIN's wurden "zerhackt" an andere Server weitergegeben.
- neue Konfigurationsoption "OperCanUseMode" (Sektion "Global"):
ist sie aktiv, koennen IRC-Operatoren immer Channel-Modes setzen.
- Dokumentation des neuen IRC+-Protokolls begonnen: doc/Protocol.txt
- Protokoll- und Server-ID bei PASS-Befehlen auf neues Format umgestellt;
bei empfangenen PASS-Befehlen werden diese zudem nun auch ausgewertet.
Die unterstuetzten Flags sind in doc/Protocol.txt beschrieben.
- mit dem neuen Befehl CHANINFO syncronisieren Server, die das IRC+-
Protokoll unterstuetzen, Channel-Modes und Topics.
- neue Option "--disable-ircplus" fuer das configure-Script, um das
IRC+-Protokoll abzuschalten (per Default ist es aktiviert).
- Ban-Lists (setzen, erfragen und loeschen) implementiert.
- wird der Server mit "-n"/"--nodaemon" gestartet, so werden keine Mel-
dungen mehr ueber Syslog ausgegeben, sondern nur noch auf der Konsole.
- "Test-Suite" begonnen (in "make check" integriert): Dabei wird ein
speziell konfigurierter Server auf Port 6789 gestartet, mit dem dann
einige Tests durchgefuehrt werden (u.a. "Stress-Test" mit 50 Clients).
- zu lange Operator-Namen in der Konfiguration wurden falsch gekuerzt.
- kleine Anpassung an AIX 3.2.5: nun laeuft der ngIRCd auch dort :-)
- ADMIN-Befehl implementiert. Die Daten hierzu werden in der Konfig-Datei
im [Global]-Abschnitt mit den Variablen "AdminInfo1", "AdminInfo2" und
"AdminEMail" konfiguriert.
ngIRCd 0.4.3, 11.06.2002
- Bei PRIVMSG und NOTICE hat der ngIRCd nicht ueberpruft, ob das Ziel
ueberhaupt ein User ist. War es keiner, so fuehrte dies zu einem
Abbruch des Servers [es wurde assert() aufgerufen].
ngIRCd 0.4.2, 29.04.2002
- LUSERS verzaehlt sich bei eigenen Server-Links nicht mehr.
- QUIT wird nun auch von noch nicht registrierten Clients akzeptiert.
- IRC-Funktion LIST implementiert; bisher werden allerdings noch keine
Wildcards (bis auf "*") unterstuetzt.
ngIRCd 0.4.1, 08.04.2002
- Bei Server-Links wird nicht mehr an Hand der Anzahl der Parameter
eines empfangenen SERVER-Befehls, sondern "intern" erkannt, ob es
sich um eine ein- oder ausgehende Verbindung handelt und somit das
eigene PASS-SERVER-Paar gesendet werden muss oder nicht. Da sich
verschiedene Versionen des Original-ircd's anders verhalten, schlug
die Anmeldung je nach Gehenseite evtl. fehl.
- Bei einem NICK-Befehl eines lokalen Client konnte der Server ab-
stuerzen, da ein Format-String einer Log-Meldung fehlerhaft war.
ngIRCd 0.4.0, 01.04.2002
- IRC-Befehle nochmal auf weitere Source-Dateien aufgespalten.
- WHO implementiert (bisher ohne komplette Unterstuetzung von Masks).
- Der AWAY-Mode wurde nicht ueber mehrere Server-Links weitergegeben.
- stderr wird nun in eine Datei umgelenkt (/tmp/ngircd-<PID>.err).
Laeuft der Server nicht im Debug-Modus, so wird diese bei Programm-
ende geloescht. Sollte der Server abstuerzen, finden sich hier evtl.
zusaetzliche Informationen.
- In Nicknames wird das Zeichen "-" nun als zulaessig erkannt.
- die Beispiel-Konfigurationsdatei (doc/sample-ngircd.conf) wird als
ngircd.conf installiert, wenn noch keine "echte" Konfigurationsdatei
vorhanden ist.
- bei WHO, WHOIS und NAMES wird nun nur noch der Status "Operator" oder
"voiced" geliefert -- nicht mehr beides.
- Server-Gruppen implementiert: es wird immer nur zu einem Server in
einer Gruppe eine Verbindung aufgebaut, klappt es beim ersten Server
nicht, so wird der naechste probiert (Variable "Group" in der Kon-
figurationsdatei, Sektion [Server]).
- IRC_PING() ist, wenn nicht im "strict RFC"-Mode, toleranter und ak-
zeptiert beliebig viele Parameter (z.B. BitchX sendet soetwas).
- die "Portab-Header" werden nicht mehr benoetigt, die System-Erkennung
wird nun ausschliesslich vom configure-Script durchgefuehrt. System-
abhaengige Definitionen finden sich nun unter src/portrab/.
- Clients und Channels werden nicht mehr ueber ihren Namen, sondern
einen Hash-Wert gesucht: sollte deutlich schneller sein.
- neuer Kommandozeilen-Parameter "--configtest": die Konfiguration wird
gelesen und dann die verwendeten Werte angezeigt.
- Client-Mode "s" (Server Notices) implementiert.
- mit dem neuen Kommandozeilen-Parameter "--config"/"-f" kann eine
alternative Konfigurationsdatei angegeben werden.
- nach dem Start kann der ngIRCd, wenn er mit root-Rechten laeuft,
zu einer anderen User-ID und Group-ID wechseln.
- URL der Homepage wird u.a. bei "--version" mit angezeigt.
ngIRCd 0.3.0, 02.03.2002
- bekommt der Server ein HUP-Signal, so startet er neu -- genau so, wie
er auf den IRC-Befehl RESTART reagiert.
@@ -92,7 +583,6 @@ ngIRCd 0.1.0, 29.01.2002
- Clients werden nun korrekt sowohl nur ueber den Nickname als auch die
komplette "Host Mask" erkannt.
ngIRCd 0.0.3, 16.01.2002
- Server-Links vollstaendig implementiert: der ngIRCd kann nun auch
@@ -139,4 +629,4 @@ ngIRCd 0.0.1, 31.12.2001
--
$Id: ChangeLog,v 1.39 2002/03/02 01:36:35 alex Exp $
$Id: ChangeLog,v 1.276.2.12 2005/10/15 12:44:08 alex Exp $

205
INSTALL
View File

@@ -1,87 +1,186 @@
ngIRCd - Next Generation IRC Server
(c)2001,2002 by Alexander Barton,
(c)2001-2004 by Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd ist freie Software und steht unter
der GNU General Public License.
ngIRCd is free software and published under the
terms of the GNU General Public License.
-- INSTALL / Installation --
-- INSTALL --
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:
--disable-syslog -> --without-syslog
--disable-zlib -> --without-zlib
Please call "./configure --help" to review the full list of options!
Differences to version 0.5.x
- Starting with version 0.6.0, other servers are identified using asynchronous
passwords: therefore the variable "Password" in [Server]-sections has been
replaced by "MyPassword" and "PeerPassword".
- New configuration variables, section [Global]: MaxConnections, MaxJoins
(see example configuration file "doc/sample-ngircd.conf"!).
ngIRCd ist fuer UNIXoide-Systeme konzipiert. Dieser Text beschreibt den
"Standardfall": ein UNIX bzw. UNIX-aehnliches System, das von GNU automake
und GNU autoconf ("configure") unterstuetzt wird.
II. Standard Installation
~~~~~~~~~~~~~~~~~~~~~~~~~
ngIRCd is developed for UNIX-based systems, which means that the installation
on modern UNIX-like systems that are supported by GNU autoconf and GNU
automake ("configure") should be no problem.
The normal installation procedure after getting (and expanding) the source
files (using a distribution archive or CVS) is as following:
1) ./autogen.sh [only necessary when using CVS]
2) ./configure
3) make
4) make install
(Please see details below!)
Now the newly compiled executable "ngircd" is installed in its standard
location, /usr/local/sbin/.
The next step is to configure and afterwards starting the daemon. Please
have a look at the ngircd(8) and ngircd.conf(5) manual pages for details
and all possible options.
If no previous version of the configuration file exists (the standard name
is /usr/local/etc/ngircd.conf), a sample configuration file containing all
possible options will be installed there. You'll find its template in the
doc/ directory: sample-ngircd.conf.
I. Voraussetzungen
~~~~~~~~~~~~~~~~~~
1): "autogen.sh"
ngIRCd benoetigt "Alex' Portability Headers" (portab.h). Diese koennen von
der Homepage heruntergeladen werden:
The first step, autogen.sh, is only necessary if the configure-script isn't
already generated. This never happens in official ("stable") releases in
tar.gz-archives, but when using CVS.
<http://arthur.ath.cx/~alex/ngircd/#download>
This step is therefore only interesting for developers.
Vor dem configure-Lauf des ngIRCd muessen dies Header auf dem System in-
stalliert sein, anonsten bricht configure ab.
autogen.sh produces the Makefile.in's, which are necessary for the configure
script itself, and some more files for make. To run autogen.sh you'll need
GNU autoconf and GNU automake (use recent versions! autoconf 2.53 and
automake 1.6.1 are known to work).
Again: "end users" do not need this step!
II. Quick Start
~~~~~~~~~~~~~~~
2): "./configure"
In der Regel sind folgende Schritte ausreichend:
The configure-script is used to detect local system dependencies.
1) ./autogen.sh [nur erforderlich, wenn ueber CVS bezogen]
2) ./configure
3) make
In the perfect case, configure should recognise all needed libraries, header
files and so on. If this shouldn't work, "./configure --help" shows all
possible options.
In addition, you can pass some command line options to "configure" to enable
and/or disable some features of ngIRCd. All these options are shown using
"./configure --help", too.
Compiling a static binary will avoid you the hassle of feeding a chroot dir
(if you want use the chroot feature). Just do something like:
CFLAGS=-static ./configure [--your-options ...]
Then you can use a void directory as ChrootDir (like OpenSSH's /var/empty).
zu 1) autogen.sh:
3): "make"
Der erste Schritt, autogen.sh, ist nur notwendig, wenn das configure-Script
noch nicht vorhanden ist. Dies ist nie bei offiziellen ("stabilen") Versionen
in tar.gz-Archiven der Fall, jedoch nie, wenn der Source-Code ueber CVS
bezogen wurde.
Dieser Absatz ist also eigentlich ausschliesslich fuer Entwickler interessant.
autogen.sh erzeugt die fuer das configure-Script notwendigen Makefile.in's
sowie das configure-Script selber und weitere fuer den make-Lauf erforderliche
Dateien. Dazu wird sowohl GNU automake als auch GNU autoconf (in aktuellen
Versionen!) benoetigt.
(nochmal: "Endanwender" mussen diesen Schritt i.d.R. nicht ausfuehren!)
The make command uses the Makefiles produced by configure and compiles the
ngIRCd daemon.
zu 2) ./configure:
4): "make install"
Mit dem configure-Script wird ngIRCd, wie GNU Software meistens, an das
lokale System angepasst und die erforderlichen Makefile's erzeugt.
Use "make install" to install the server and a sample configuration file on
the local system. Normally, root privileges are necessary to complete this
step. If there is already an older configuration file present, it won't be
overwritten.
Im Optimalfall sollte configure alle benoetigten Libraries, Header etc. selber
erkennen und entsprechend reagieren. Sollte dies einmal nicht der Fall sein,
so zeigt "./configure --help" moegliche Optionen.
This files will be installed by default:
- /usr/local/sbin/ngircd: executable server
- /usr/local/etc/ngircd.conf: sample configuration (if not already present)
- /usr/local/share/doc/ngircd/: documentation
zu 3) make:
II. Useful make-targets
~~~~~~~~~~~~~~~~~~~~~~~
Der make-Befehl bearbeitet die vom configure-Script erzeugten Makefile's und
uebersetzt die comBase-Library und die Testprogramme.
The Makefile produced by the configure-script contains always these useful
targets:
- clean: delete every product from the compiler/linker
next step: -> make
- distclean: the above plus erase all generated Makefiles
next step: -> ./configure
- maintainer-clean: erase all automatic generated files
next step: -> ./autogen.sh
III. Nuetzliche make-Targets
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
III. Sample configuration file ngircd.conf
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Die vom configure-Script erzeugten Makefile's enthalten immer die folgenden
nuetzlichen Targets:
In the sample configuration file, there are comments beginning with "#" OR
";" -- this is only for the better understanding of the file.
- clean: alle Erzeugnisse des Compilers/Linkers loeschen.
Naechster Schritt: -> make
The file is separated in four blocks: [Global], [Operator], [Server], and
[Channel].
- distclean: zusaetzliche alle Makefile's loeschen.
Naechster Schritt: -> ./configure
In the [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 server are defined in [Operator] blocks. [Server] is the section
where server links are configured. And [Channel] blocks are used to
configure pre-defined ("persistent") IRC channels.
- maintainer-clean: alle automat. erzeugten Dateien loeschen.
Naechster Schritt: -> ./autogen.sh
The meaning of the variables in the configuration file is explained in the
"doc/sample-ngircd.conf", which is used as sample configuration file in
/usr/local/etc after running "make install" (if you don't already have one)
and in the "ngircd.conf" manual page.
IV. Command line options
~~~~~~~~~~~~~~~~~~~~~~~~
These parameters could be passed to the ngIRCd:
-f, --config <file>
The daemon uses the file <file> as configuration file rather than
the standard configuration /usr/local/etc/ngircd.conf.
-n, --nodaemon
ngIRCd should be running as a foreground process.
-p, --passive
Server-links won't be automatically established.
-t, --configtest
Reads, validates and dumps the configuration file as interpreted
by the server. Then exits.
Use "--help" to see a short help text describing all available parameters
the server understands, with "--version" the ngIRCd shows its version
number. In both cases the server exits after the output.
--
$Id: INSTALL,v 1.21 2005/02/10 08:20:09 alex Exp $

View File

@@ -1,705 +0,0 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 34;
objects = {
014CEA520018CE5811CA2923 = {
buildRules = (
);
buildSettings = {
COPY_PHASE_STRIP = NO;
OPTIMIZATION_CFLAGS = "-O0";
};
isa = PBXBuildStyle;
name = Development;
};
014CEA530018CE5811CA2923 = {
buildRules = (
);
buildSettings = {
COPY_PHASE_STRIP = YES;
};
isa = PBXBuildStyle;
name = Deployment;
};
//010
//011
//012
//013
//014
//030
//031
//032
//033
//034
034768E8FF38A79811DB9C8B = {
isa = PBXExecutableFileReference;
path = ngircd;
refType = 3;
};
//030
//031
//032
//033
//034
//080
//081
//082
//083
//084
08FB7793FE84155DC02AAC07 = {
buildStyles = (
014CEA520018CE5811CA2923,
014CEA530018CE5811CA2923,
);
isa = PBXProject;
mainGroup = 08FB7794FE84155DC02AAC07;
projectDirPath = "";
targets = (
08FB779FFE84155DC02AAC07,
);
};
08FB7794FE84155DC02AAC07 = {
children = (
1AB674ADFE9D54B511CA2CBB,
F51F791401DFD0DE01D13771,
F56D8B9E01E0BFA00155ADA7,
F52162B301C7B904012300F4,
F52162C201C7B904012300F4,
F52162C301C7B904012300F4,
F52162C401C7B904012300F4,
F52162C501C7B904012300F4,
F52162C601C7B904012300F4,
F52162C701C7B904012300F4,
F52162C801C7B904012300F4,
F52162C901C7B904012300F4,
F52162CA01C7B904012300F4,
F52162CB01C7B904012300F4,
);
isa = PBXGroup;
name = ngircd;
refType = 4;
};
08FB779FFE84155DC02AAC07 = {
buildPhases = (
08FB77A0FE84155DC02AAC07,
08FB77A1FE84155DC02AAC07,
08FB77A3FE84155DC02AAC07,
08FB77A5FE84155DC02AAC07,
);
buildSettings = {
FRAMEWORK_SEARCH_PATHS = "";
HEADER_SEARCH_PATHS = "";
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = "";
OTHER_CFLAGS = "";
OTHER_LDFLAGS = "";
OTHER_REZFLAGS = "";
PRODUCT_NAME = ngircd;
REZ_EXECUTABLE = YES;
SECTORDER_FLAGS = "";
WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas";
};
dependencies = (
);
isa = PBXToolTarget;
name = ngircd;
productInstallPath = "$(HOME)/bin";
productName = ngircd;
productReference = 034768E8FF38A79811DB9C8B;
shouldUseHeadermap = 1;
};
08FB77A0FE84155DC02AAC07 = {
buildActionMask = 2147483647;
files = (
F52162CC01C7B904012300F4,
F52162CD01C7B904012300F4,
F52162CE01C7B904012300F4,
F52162CF01C7B904012300F4,
F52162D001C7B904012300F4,
F52162D901C7BAAE012300F4,
F52162DC01C7BCDD012300F4,
F52162E401C7C79E012300F4,
F51D17FE01C8F5B701E11C2E,
F51D180401C8FDD001E11C2E,
F51D180501C8FDD001E11C2E,
F576ABFC01D5E77301A85B03,
F576ABFF01D61D7401A85B03,
F51F791301DFC95301D13771,
F51DBB15022D95E801A85B04,
F51DBB19022D995501A85B04,
F51DBB1D022D9D8F01A85B04,
);
isa = PBXHeadersBuildPhase;
name = Headers;
};
08FB77A1FE84155DC02AAC07 = {
buildActionMask = 2147483647;
files = (
F52162D101C7B904012300F4,
F52162D201C7B904012300F4,
F52162D301C7B904012300F4,
F52162DD01C7BCDD012300F4,
F52162E501C7C79E012300F4,
F51D17FF01C8F5B701E11C2E,
F51D180701C8FDD001E11C2E,
F576ABFD01D5E77301A85B03,
F5263AEE01E263D201CE8F8F,
F51DBB16022D95E801A85B04,
F51DBB1A022D995501A85B04,
F51DBB1E022D9D8F01A85B04,
);
isa = PBXSourcesBuildPhase;
name = Sources;
};
08FB77A3FE84155DC02AAC07 = {
buildActionMask = 2147483647;
files = (
);
isa = PBXFrameworksBuildPhase;
name = "Frameworks & Libraries";
};
08FB77A5FE84155DC02AAC07 = {
buildActionMask = 2147483647;
files = (
);
isa = PBXRezBuildPhase;
name = "ResourceManager Resources";
};
//080
//081
//082
//083
//084
//1A0
//1A1
//1A2
//1A3
//1A4
1AB674ADFE9D54B511CA2CBB = {
children = (
034768E8FF38A79811DB9C8B,
);
isa = PBXGroup;
name = Products;
refType = 4;
};
//1A0
//1A1
//1A2
//1A3
//1A4
//F50
//F51
//F52
//F53
//F54
F51D17FC01C8F5B701E11C2E = {
isa = PBXFileReference;
name = client.c;
path = ../src/ngircd/client.c;
refType = 2;
};
F51D17FD01C8F5B701E11C2E = {
isa = PBXFileReference;
name = client.h;
path = ../src/ngircd/client.h;
refType = 2;
};
F51D17FE01C8F5B701E11C2E = {
fileRef = F51D17FD01C8F5B701E11C2E;
isa = PBXBuildFile;
settings = {
};
};
F51D17FF01C8F5B701E11C2E = {
fileRef = F51D17FC01C8F5B701E11C2E;
isa = PBXBuildFile;
settings = {
};
};
F51D180001C8FDD001E11C2E = {
isa = PBXFileReference;
name = channel.c;
path = ../src/ngircd/channel.c;
refType = 2;
};
F51D180101C8FDD001E11C2E = {
isa = PBXFileReference;
name = channel.h;
path = ../src/ngircd/channel.h;
refType = 2;
};
F51D180201C8FDD001E11C2E = {
isa = PBXFileReference;
name = irc.c;
path = ../src/ngircd/irc.c;
refType = 2;
};
F51D180301C8FDD001E11C2E = {
isa = PBXFileReference;
name = irc.h;
path = ../src/ngircd/irc.h;
refType = 2;
};
F51D180401C8FDD001E11C2E = {
fileRef = F51D180101C8FDD001E11C2E;
isa = PBXBuildFile;
settings = {
};
};
F51D180501C8FDD001E11C2E = {
fileRef = F51D180301C8FDD001E11C2E;
isa = PBXBuildFile;
settings = {
};
};
F51D180701C8FDD001E11C2E = {
fileRef = F51D180201C8FDD001E11C2E;
isa = PBXBuildFile;
settings = {
};
};
F51DBB13022D95E801A85B04 = {
isa = PBXFileReference;
path = "irc-write.c";
refType = 4;
};
F51DBB14022D95E801A85B04 = {
isa = PBXFileReference;
path = "irc-write.h";
refType = 4;
};
F51DBB15022D95E801A85B04 = {
fileRef = F51DBB14022D95E801A85B04;
isa = PBXBuildFile;
settings = {
};
};
F51DBB16022D95E801A85B04 = {
fileRef = F51DBB13022D95E801A85B04;
isa = PBXBuildFile;
settings = {
};
};
F51DBB17022D995501A85B04 = {
isa = PBXFileReference;
path = "irc-mode.c";
refType = 4;
};
F51DBB18022D995501A85B04 = {
isa = PBXFileReference;
path = "irc-mode.h";
refType = 4;
};
F51DBB19022D995501A85B04 = {
fileRef = F51DBB18022D995501A85B04;
isa = PBXBuildFile;
settings = {
};
};
F51DBB1A022D995501A85B04 = {
fileRef = F51DBB17022D995501A85B04;
isa = PBXBuildFile;
settings = {
};
};
F51DBB1B022D9D8F01A85B04 = {
isa = PBXFileReference;
path = "irc-login.c";
refType = 4;
};
F51DBB1C022D9D8F01A85B04 = {
isa = PBXFileReference;
path = "irc-login.h";
refType = 4;
};
F51DBB1D022D9D8F01A85B04 = {
fileRef = F51DBB1C022D9D8F01A85B04;
isa = PBXBuildFile;
settings = {
};
};
F51DBB1E022D9D8F01A85B04 = {
fileRef = F51DBB1B022D9D8F01A85B04;
isa = PBXBuildFile;
settings = {
};
};
F51F791201DFC95301D13771 = {
isa = PBXFileReference;
name = defines.h;
path = ../src/ngircd/defines.h;
refType = 2;
};
F51F791301DFC95301D13771 = {
fileRef = F51F791201DFC95301D13771;
isa = PBXBuildFile;
settings = {
};
};
F51F791401DFD0DE01D13771 = {
children = (
F5263AEF01E2A9B801CE8F8F,
F51F791501DFD0DE01D13771,
F51F791601DFD0DE01D13771,
F51F791701DFD0DE01D13771,
);
isa = PBXGroup;
name = doc;
path = /Users/alex/Develop/ngircd/doc;
refType = 0;
};
F51F791501DFD0DE01D13771 = {
isa = PBXFileReference;
path = CVS.txt;
refType = 4;
};
F51F791601DFD0DE01D13771 = {
isa = PBXFileReference;
path = RFC.txt;
refType = 4;
};
F51F791701DFD0DE01D13771 = {
isa = PBXFileReference;
path = "sample-ngircd.conf";
refType = 4;
};
F52162B301C7B904012300F4 = {
children = (
F52162B801C7B904012300F4,
F52162D801C7BAAE012300F4,
F52162B901C7B904012300F4,
);
isa = PBXGroup;
name = src;
path = ../src;
refType = 2;
};
F52162B801C7B904012300F4 = {
isa = PBXFileReference;
path = Makefile.am;
refType = 4;
};
F52162B901C7B904012300F4 = {
children = (
F52162BD01C7B904012300F4,
F52162BA01C7B904012300F4,
F52162BE01C7B904012300F4,
F52162BF01C7B904012300F4,
F51D180001C8FDD001E11C2E,
F51D180101C8FDD001E11C2E,
F51D17FC01C8F5B701E11C2E,
F51D17FD01C8F5B701E11C2E,
F52162E201C7C77B012300F4,
F52162E301C7C77B012300F4,
F52162DA01C7BCDC012300F4,
F52162DB01C7BCDC012300F4,
F51D180201C8FDD001E11C2E,
F51D180301C8FDD001E11C2E,
F51DBB1B022D9D8F01A85B04,
F51DBB1C022D9D8F01A85B04,
F51DBB17022D995501A85B04,
F51DBB18022D995501A85B04,
F51DBB13022D95E801A85B04,
F51DBB14022D95E801A85B04,
F52162BB01C7B904012300F4,
F52162BC01C7B904012300F4,
F576ABFA01D5E77301A85B03,
F576ABFB01D5E77301A85B03,
F52162C001C7B904012300F4,
F52162C101C7B904012300F4,
F51F791201DFC95301D13771,
F576ABFE01D61D7401A85B03,
);
isa = PBXGroup;
path = ngircd;
refType = 4;
};
F52162BA01C7B904012300F4 = {
isa = PBXFileReference;
path = global.h;
refType = 4;
};
F52162BB01C7B904012300F4 = {
isa = PBXFileReference;
path = log.c;
refType = 4;
};
F52162BC01C7B904012300F4 = {
isa = PBXFileReference;
path = log.h;
refType = 4;
};
F52162BD01C7B904012300F4 = {
isa = PBXFileReference;
path = Makefile.am;
refType = 4;
};
F52162BE01C7B904012300F4 = {
isa = PBXFileReference;
path = ngircd.c;
refType = 4;
};
F52162BF01C7B904012300F4 = {
isa = PBXFileReference;
path = ngircd.h;
refType = 4;
};
F52162C001C7B904012300F4 = {
isa = PBXFileReference;
path = tool.c;
refType = 4;
};
F52162C101C7B904012300F4 = {
isa = PBXFileReference;
path = tool.h;
refType = 4;
};
F52162C201C7B904012300F4 = {
isa = PBXFileReference;
name = acconfig.h;
path = ../acconfig.h;
refType = 2;
};
F52162C301C7B904012300F4 = {
isa = PBXExecutableFileReference;
name = autogen.sh;
path = ../autogen.sh;
refType = 2;
};
F52162C401C7B904012300F4 = {
isa = PBXFileReference;
name = configure.in;
path = ../configure.in;
refType = 2;
};
F52162C501C7B904012300F4 = {
isa = PBXFileReference;
name = Makefile.am;
path = ../Makefile.am;
refType = 2;
};
F52162C601C7B904012300F4 = {
isa = PBXFileReference;
name = INSTALL;
path = ../INSTALL;
refType = 2;
};
F52162C701C7B904012300F4 = {
isa = PBXFileReference;
name = AUTHORS;
path = ../AUTHORS;
refType = 2;
};
F52162C801C7B904012300F4 = {
isa = PBXFileReference;
name = ChangeLog;
path = ../ChangeLog;
refType = 2;
};
F52162C901C7B904012300F4 = {
isa = PBXFileReference;
name = COPYING;
path = ../COPYING;
refType = 2;
};
F52162CA01C7B904012300F4 = {
isa = PBXFileReference;
name = NEWS;
path = ../NEWS;
refType = 2;
};
F52162CB01C7B904012300F4 = {
isa = PBXFileReference;
name = README;
path = ../README;
refType = 2;
};
F52162CC01C7B904012300F4 = {
fileRef = F52162C201C7B904012300F4;
isa = PBXBuildFile;
settings = {
};
};
F52162CD01C7B904012300F4 = {
fileRef = F52162BA01C7B904012300F4;
isa = PBXBuildFile;
settings = {
};
};
F52162CE01C7B904012300F4 = {
fileRef = F52162BC01C7B904012300F4;
isa = PBXBuildFile;
settings = {
};
};
F52162CF01C7B904012300F4 = {
fileRef = F52162BF01C7B904012300F4;
isa = PBXBuildFile;
settings = {
};
};
F52162D001C7B904012300F4 = {
fileRef = F52162C101C7B904012300F4;
isa = PBXBuildFile;
settings = {
};
};
F52162D101C7B904012300F4 = {
fileRef = F52162BB01C7B904012300F4;
isa = PBXBuildFile;
settings = {
};
};
F52162D201C7B904012300F4 = {
fileRef = F52162BE01C7B904012300F4;
isa = PBXBuildFile;
settings = {
};
};
F52162D301C7B904012300F4 = {
fileRef = F52162C001C7B904012300F4;
isa = PBXBuildFile;
settings = {
};
};
F52162D801C7BAAE012300F4 = {
isa = PBXFileReference;
name = config.h;
path = ../src/config.h;
refType = 2;
};
F52162D901C7BAAE012300F4 = {
fileRef = F52162D801C7BAAE012300F4;
isa = PBXBuildFile;
settings = {
};
};
F52162DA01C7BCDC012300F4 = {
isa = PBXFileReference;
name = conn.c;
path = ../src/ngircd/conn.c;
refType = 2;
};
F52162DB01C7BCDC012300F4 = {
isa = PBXFileReference;
name = conn.h;
path = ../src/ngircd/conn.h;
refType = 2;
};
F52162DC01C7BCDD012300F4 = {
fileRef = F52162DB01C7BCDC012300F4;
isa = PBXBuildFile;
settings = {
};
};
F52162DD01C7BCDD012300F4 = {
fileRef = F52162DA01C7BCDC012300F4;
isa = PBXBuildFile;
settings = {
};
};
F52162E201C7C77B012300F4 = {
isa = PBXFileReference;
name = conf.c;
path = ../src/ngircd/conf.c;
refType = 2;
};
F52162E301C7C77B012300F4 = {
isa = PBXFileReference;
name = conf.h;
path = ../src/ngircd/conf.h;
refType = 2;
};
F52162E401C7C79E012300F4 = {
fileRef = F52162E301C7C77B012300F4;
isa = PBXBuildFile;
settings = {
};
};
F52162E501C7C79E012300F4 = {
fileRef = F52162E201C7C77B012300F4;
isa = PBXBuildFile;
settings = {
};
};
F5263AEE01E263D201CE8F8F = {
fileRef = F51D180001C8FDD001E11C2E;
isa = PBXBuildFile;
settings = {
};
};
F5263AEF01E2A9B801CE8F8F = {
isa = PBXFileReference;
name = Makefile.am;
path = ../doc/Makefile.am;
refType = 2;
};
F56D8B9E01E0BFA00155ADA7 = {
children = (
F56D8B9F01E0BFA00155ADA7,
F56D8BA001E0BFA00155ADA7,
);
isa = PBXGroup;
name = MacOSX;
path = "";
refType = 2;
};
F56D8B9F01E0BFA00155ADA7 = {
isa = PBXFileReference;
path = Makefile.am;
refType = 4;
};
F56D8BA001E0BFA00155ADA7 = {
children = (
F56D8BA101E0BFA00155ADA7,
);
isa = PBXGroup;
path = ngircd.pbproj;
refType = 4;
};
F56D8BA101E0BFA00155ADA7 = {
isa = PBXFileReference;
path = Makefile.am;
refType = 4;
};
F576ABFA01D5E77301A85B03 = {
isa = PBXFileReference;
path = parse.c;
refType = 4;
};
F576ABFB01D5E77301A85B03 = {
isa = PBXFileReference;
path = parse.h;
refType = 4;
};
F576ABFC01D5E77301A85B03 = {
fileRef = F576ABFB01D5E77301A85B03;
isa = PBXBuildFile;
settings = {
};
};
F576ABFD01D5E77301A85B03 = {
fileRef = F576ABFA01D5E77301A85B03;
isa = PBXBuildFile;
settings = {
};
};
F576ABFE01D61D7401A85B03 = {
isa = PBXFileReference;
name = messages.h;
path = ../src/ngircd/messages.h;
refType = 2;
};
F576ABFF01D61D7401A85B03 = {
fileRef = F576ABFE01D61D7401A85B03;
isa = PBXBuildFile;
settings = {
};
};
};
rootObject = 08FB7793FE84155DC02AAC07;
}

View File

@@ -1,42 +1,46 @@
#
# ngIRCd -- The Next Generation IRC Daemon
# Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
# Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
#
# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
# der GNU General Public License (GPL), wie von der Free Software Foundation
# herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
# der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information.
#
# $Id: Makefile.am,v 1.5 2002/01/02 02:52:09 alex Exp $
#
# $Log: Makefile.am,v $
# Revision 1.5 2002/01/02 02:52:09 alex
# - Copyright-Texte angepasst ;-)
#
# Revision 1.4 2001/12/31 02:20:20 alex
# - Unterverzeichnis "doc" aufgenommen.
#
# Revision 1.3 2001/12/30 19:24:28 alex
# - acconfig.h in die "noinst_HEADERS" aufgenommen.
#
# Revision 1.2 2001/12/12 17:21:58 alex
# - Projektdatei fuer den Mac OS X Project Builder erstellt.
#
# Revision 1.1.1.1 2001/12/11 21:53:04 alex
# Imported sources to CVS.
# $Id: Makefile.am,v 1.16 2005/04/09 12:27:40 alex Exp $
#
AUTOMAKE_OPTIONS = gnu
SUBDIRS = doc MacOSX src
SUBDIRS = doc src man contrib
noinst_HEADERS = acconfig.h
clean-local:
rm -f build-stamp*
maintainer-clean-local:
rm -rf autom4te.cache
rm -f Makefile.in Makefile aclocal.m4 configure
rm -f mkinstalldirs missing depcomp install-sh
rm -f config.log
rm -f config.log debian
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
deb:
[ -f debian/rules ] || ln -s contrib/Debian debian
dpkg-buildpackage -rfakeroot
# -eof-

155
NEWS
View File

@@ -1,16 +1,159 @@
ngIRCd - Next Generation IRC Server
(c)2001,2002 by Alexander Barton,
(c)2001-2005 Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd ist freie Software und steht unter
der GNU General Public License.
ngIRCd is free software and published under the
terms of the GNU General Public License.
-- NEWS / Neuigkeiten --
-- NEWS --
ngIRCd 0.2.x, xx.xx.2002
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
Benjamin Pineau <ben@zouh.org>. Now you can force the daemon to change
its root and working directory to something "safe". MotdPhrase is used
to define an "MOTD string" instead of a whole file, useful if the
"real" MOTD file would be outside the "jail".
- INVITE- and BAN-lists become synchronized between IRC+ servers when
establishing new connections, if the peer supports this as well.
- The type of service (TOS) of all sockets is set to "interactive" now.
- Added short command line option "-t" as alternative to "--configtest".
- Added optional support for "IDENT" lookups on incoming connections. You
have to enable this function with the ./configure switch "--with-ident".
The default is not to do IDENT lookups.
ngIRCd 0.7.5 (2003-07-11)
- New configuration variable "MaxConnectionsIP" to limit the number of
simultaneous connections from a single IP that the server will accept.
This configuration options lowers the risk of denial of service attacks
(DoS), the default is 5 connections per client IP.
- Added new configuration variable "Listen" to bind all listening
sockets of the server to a single IP address.
ngIRCd 0.7.1 (2003-07-18)
- Added support for GNU/Hurd.
ngIRCd 0.7.0 (2003-05-01)
- New command CONNECT to enable and add server links. The syntax is not
RFC-compatible: use "CONNECT <name> <port>" to enable and connect an
configured server and "CONNECT <name> <port> <host> <mypwd> <peerpwd>"
to add a new server (ngIRCd tries to connect new servers only once!).
- Added DISCONNECT command ("DISCONNECT <name>") to disable servers.
- New command TRACE (you can trace only servers at the moment).
- New command HELP that lists all understood commands.
- ngIRCd can register itself with Rendezvous: to enable support pass the
new switch "--with-rendezvous" to configure.
- 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",
"--with-tcp-wrappers", and "--with-rendezvous".
- Enhanced manual pages ngircd(8) and ngircd.conf(5).
- Documentation is now installed in $(datadir)/doc/ngircd.
Older news (sorry, only available in german language):
ngIRCd 0.6.0, 2002-12-24
- beim Schliessen einer Verbindung zeigt der Server nun vor dem ERROR
noch eine Statistik ueber die empfangene und gesendete Datenmenge an.
- Connection-Strukturen werden nun "pool-weise" verwaltet; der Pool wird
bei Bedarf bis zu einem konfigurierten Limit vergroessert.
- Mit der neuen Konfigurationsvariable "MaxConnections" (Sekion "Global")
kann die maximale Anzahl gleichzeitiger Verbindungen begrenzt werden.
Der Default ist -1, "unlimitiert".
- der Server erkennt nun, ob bereits eine eingehende Verbindung von einem
Peer-Server besteht und versucht dann nicht mehr, selber eine eigene
ausgehende Verbindung zu diesem auufzubauen. Dadurch kann nun auf beiden
Servern in der Konfiguration ein Port fuer den Connect konfiguriert
werden (beide Server versuchen sich dann gegenseitig zu connectieren).
- Server identifizieren sich nun mit asyncronen Passwoertern, d.h. das
Passwort, welches A an B schickt, kann ein anderes sein als das, welches
B als Antwort an A sendet. In der Konfig.-Datei, Abschnitt "Server",
wurde "Password" dazu durch "MyPassword" und "PeerPassword" ersetzt.
- Der Server kann nun zur Laufzeit die Konfiguration neu einlesen: dies
macht er nach dem Befehl REHASH oder wenn ein HUP-Signal empfangen wird.
- Server-Server-Links koennen nun komprimiert werden, dazu wird die zlib
(www.zlib.org) benoetigt. Unterstuetzt die Gegenseite die Komprimierung
nicht, wird automatisch unkomprimiert kommuniziert. Das Verfahren ist
kompatibel mit dem Original-ircd 2.10.3, d.h. beide Server koennen
miteinander ueber komprimiert Links kommunizieren.
- neue Konfigurations-Variable "MaxJoins": Hiermit kann die maximale Zahl
der Channels, in denen ein User Mitglied sein kann, begrent werden.
- neue Channel-Modes l (User-Limit) und k (Channel-Key) implementiert.
ngIRCd 0.5.0, 20.09.2002
- AIX (3.2.5), HP-UX (10.20), IRIX (6.5), NetBSD (1.5.3/m68k) und Solaris
(2.5.1, 2.6) gehoeren nun auch zu den unterstuetzten Platformen.
- Unter A/UX (und evtl. weiteren Systemen) kompiliert der ngIRCd nun mit
dem "nativen" (ggf. pre-ANSI) Compiler.
- "persistente Channels" (Mode 'P') implementiert: diese koennen in der
Konfigurationsdatei definiert werden (Sektion "Channel", vgl. Beispiel-
Konfiguration "sample-ngircd.conf") und bleiben auch dann bestehen,
wenn kein User mehr im Channel ist.
- neue IRC-Befehle: KICK, INVITE, ADMIN, CHANINFO; LIST wurde erweitert.
Mit dem neuen Befehl CHANINFO syncronisieren Server, die das IRC+-
Protokoll unterstuetzen, Channel-Modes und Topics. Fuer den ADMIN-Befehl
gibt es neue Konfigurationsoptionen (Sektion "Global"): "AdminInfo1",
"AdminInfo2" und "AdminEMail".
- Invite- und Ban-Lists implementiert.
- neue Konfigurationsoption "OperCanUseMode" (Sektion "Global"):
ist sie aktiv, koennen IRC-Operatoren immer Channel-Modes setzen.
- "Test-Suite" begonnen: mit "make check" wird sie durchlaufen.
ngIRCd 0.4.2, 29.04.2002
- IRC-Funktion LIST implementiert; bisher werden allerdings noch keine
Regular Expressions (bis auf "*") unterstuetzt.
ngIRCd 0.4.0, 01.04.2002
- WHO implementiert (bisher ohne komplette Unterstuetzung von Masks).
- stderr wird nun in eine Datei umgelenkt (/ngircd-<PID>.err).
Laeuft der Server nicht im Debug-Modus, so wird diese bei Programm-
ende geloescht. Sollte der Server abstuerzen, finden sich hier evtl.
zusaetzliche Informationen.
- Server-Gruppen implementiert: es wird immer nur zu einem Server in
einer Gruppe eine Verbindung aufgebaut, klappt es beim ersten Server
nicht, so wird der naechste probiert.
- Clients und Channels werden nicht mehr ueber ihren Namen, sondern
einen Hash-Wert gesucht: sollte deutlich schneller sein.
- neuer Kommandozeilen-Parameter "--configtest": die Konfiguration wird
gelesen und die dann verwendeten Werte angezeigt.
- Client-Mode "s" (Server Notices) implementiert.
- mit dem neuen Kommandozeilen-Parameter "--config"/"-f" kann eine
alternative Konfigurationsdatei angegeben werden.
- nach dem Start kann der ngIRCd, wenn er mit root-Rechten laeuft,
zu einer anderen User-ID und Group-ID wechseln.
ngIRCd 0.3.0, 02.03.2002
- bekommt der Server ein HUP-Signal, so startet er neu -- genau so, wie
er auf den IRC-Befehl RESTART reagiert.
@@ -65,4 +208,4 @@ ngIRCd 0.0.1, 31.12.2001
--
$Id: NEWS,v 1.16 2002/03/02 01:36:35 alex Exp $
$Id: NEWS,v 1.74.2.1 2005/07/24 21:39:45 alex Exp $

106
README
View File

@@ -1,45 +1,87 @@
ngIRCd - Next Generation IRC Server
(c)2001,2002 by Alexander Barton,
(c)2001-2005 Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd ist freie Software und steht unter
der GNU General Public License.
ngIRCd is free software and published under the
terms of the GNU General Public License.
-- README / Liesmich --
-- README --
ngIRCd ist ein Server fuer den Internet Relay Chat (IRC). Er ist von Grund
auf neu geschrieben, also nicht wie die meisten anderen IRCd's vom Urvater,
dem Daemon des IRCNet abgeleitet.
I. Introduction
~~~~~~~~~~~~~~~
Zur Zeit befindet sich ngIRCd noch in Entwicklung, vieles ist noch nicht
implementiert bzw. nur "halbherzig": Channels gibt es noch nicht, genau so
wenig wie Server-Links. Das private Chatten (PRIVMSG) mit den Client-Befehlen
/msg und /query sollte hingegen funktionieren, ein wenig praktische Funk-
tionalitaet ist also tatsaechlich schon vorhanden ;-)
Bisher (mehr oder wenig vollstaendig) implementierte IRC-Befehle:
DIE, ERROR, ISON, JOIN, LINKS, LUSERS, MODE, MOTD, NAMES, NICK, NOTICE, NJOIN,
OPER, PART, PASS, PING, PONG, PRIVMSG, QUIT, RESTART, SERVER, SQUIT, USER,
USERHOST, WHOIS.
Ueber Rueckmeldungen, Bug-Reports und Patches freue ich mich! Also los, haut
in die Tasten! :-))
Via E-Mail erreichst du mich als <alex@arthur.ath.cx> bzw. <alex@barton.de>.
Die Homepage des ngIRCd findest du unter <http://arthur.ath.cx/~alex/ngircd/>.
[ ... more to come ... ]
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
"grandfather of IRC daemons", the daemon of the IRCNet.
Hinweise zur Installation findest du in der Datei INSTALL.
Alle Autoren von ngIRCd sind in AUTHORS aufgefuehrt.
In der Datei COPYING steht die GNU General Public License.
Das README liest du gerade ,-)
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.
In the meantime ngIRCd should be quite feature complete and stable to be
used in real IRC networks.
Implemented IRC-commands are:
ADMIN, AWAY, CHANINFO, CONNECT, DIE, DISCONNECT, ERROR, HELP, INVITE, ISON,
JOIN, KICK, KILL, LINKS, LIST, LUSERS, MODE, MOTD, NAMES, NICK, NJOIN, NOTICE,
OPER, PART, PASS, PING, PONG, PRIVMSG, QUIT, REHASH, RESTART, SERVER, SQUIT,
STATS, TIME, TOPIC, TRACE, USER, USERHOST, VERSION, WHO, WHOIS, WHOWAS.
III. Features (or: why use ngIRCd?)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- no problems with servers which have dynamic IP addresses
- 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.
IV. Documentation
~~~~~~~~~~~~~~~~~
More documentation can be found in the "doc/" directory and the homepage of
the ngIRCd: <http://ngircd.barton.de/>.
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.
If you are interested in the latest development versions (which are not
always stable), then please read the section "CVS" on the homepage and
the file "doc/CVS.txt" which describes the use of CVS, the "Concurrent
Versioning System".
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>
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>.
--
$Id: README,v 1.5 2002/02/15 15:15:48 anonymous Exp $
$Id: README,v 1.20.2.1 2005/07/09 14:41:39 alex Exp $

View File

@@ -1,49 +0,0 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: acconfig.h,v 1.7 2002/01/02 02:52:09 alex Exp $
*
* $Log: acconfig.h,v $
* Revision 1.7 2002/01/02 02:52:09 alex
* - Copyright-Texte angepasst ;-)
*
* Revision 1.6 2001/12/31 02:21:00 alex
* - "doc"-Unterverzeichnis aufgenommen.
*
* Revision 1.5 2001/12/29 03:04:35 alex
* - neue configure-Option "--enable-strict-rfc", #define STRICT_RFC.
*
* Revision 1.4 2001/12/27 01:44:49 alex
* - die Verwendung von syslog kann nun abgeschaltet werden.
*
* Revision 1.3 2001/12/25 22:01:47 alex
* - neue configure-Option "--enable-sniffer".
*
* Revision 1.2 2001/12/21 23:54:15 alex
* - zusaetzliche Debug-Ausgaben koennen eingeschaltet werden.
*
* Revision 1.1 2001/12/12 01:58:52 alex
* - Test auf socklen_t verbessert.
*/
#undef HAVE_socklen_t
#undef DEBUG
#undef SNIFFER
#undef USE_SYSLOG
#undef STRICT_RFC
/* -eof- */

View File

@@ -1,23 +1,187 @@
#!/bin/sh
#
# $Id: autogen.sh,v 1.2 2001/12/12 01:58:17 alex Exp $
# ngIRCd -- The Next Generation IRC Daemon
# Copyright (c)2001-2004 Alexander Barton <alex@barton.de>
#
# $Log: autogen.sh,v $
# Revision 1.2 2001/12/12 01:58:17 alex
# - fuer fehlende Dateien werden nun "nur noch" symbolische Links erzeugt.
# 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.
#
# Revision 1.1.1.1 2001/12/11 21:53:04 alex
# Imported sources to CVS.
# $Id: autogen.sh,v 1.14 2005/02/21 15:23:23 alex Exp $
#
if [ -f configure ]; then
echo "autogen.sh: configure-Skript existiert bereits ..."
#
# Usage: [VAR=<value>] ./autogen.sh [<configure-args>]
#
# This script generates the ./configure script using GNU automake and
# GNU autoconf. It tries to be smart in finding the correct/usable/available
# installed versions of these tools on your system.
#
# The following strategy is used for each of aclocal, autoheader, automake,
# and autoconf: first, "tool" (the regular name of the tool, e. g. "autoconf"
# or "automake") is checked. If this fails, "tool<major><minor>" (for example
# "automake16") and "tool-<major>.<minor>" (e. g. "autoconf-2.54") are tried
# with <major> being 2 for tool of GNU autoconf and 1 for tools of automake;
# <minor> is tried from 99 to 0. The first occurrence will be used.
#
# When you pass <configure-args> to autogen.sh it will call the generated
# ./configure script on success and pass these parameters to it.
#
# You can tweak the behaviour using these environment variables:
#
# - ACLOCAL=<cmd>, AUTOHEADER=<cmd>, AUTOMAKE=<cmd>, AUTOCONF=<cmd>
# Name and optionally path to the particular tool.
# - PREFIX=<path>
# Search the GNU autoconf and GNU automake tools in <path> first. If the
# generated ./configure script will be called, pass "--prefix=<path>" to it.
# - EXIST=<tool>
# Use <tool> to test for aclocal, autoheader etc. pp. ...
# When not specified, either "type" or "which" is used.
# - VERBOSE=1
# Output the detected names of the GNU automake and GNU autoconf tools.
# - GO=1
# Call ./configure even if no arguments have been passed to autogen.sh.
#
# Examples:
#
# - ./autogen.sh
# Generates the ./configure script.
# - GO=1 ./autogen.sh
# Generates the ./configure script and runs it as "./configure".
# - VERBOSE=1 ./autogen.sh --with-ident
# Show tool names, generates the ./configure script, and runs it with
# these arguments: "./configure --with-ident".
# - ACLOCAL=aclocal-1.6 GO=1 PREFIX=$HOME ./autogen.sh
# Uses "aclocal-1.6" as aclocal tool, generates the ./configure script,
# and runs it with these arguments: "./configure --prefix=$HOME".
#
Search()
{
[ $# -eq 2 ] || exit 1
searchlist="$1"
major="$2"
minor=99
[ -n "$PREFIX" ] && searchlist="${PREFIX}/$1 ${PREFIX}/bin/$1 $searchlist"
for name in $searchlist; do
$EXIST "${name}" >/dev/null 2>&1
if [ $? -eq 0 ]; then
echo "${name}"
return 0
fi
done
while [ $minor -ge 0 ]; do
for name in $searchlist; do
$EXIST "${name}${major}${minor}" >/dev/null 2>&1
if [ $? -eq 0 ]; then
echo "${name}${major}${minor}"
return 0
fi
$EXIST "${name}-${major}.${minor}" >/dev/null 2>&1
if [ $? -eq 0 ]; then
echo "${name}-${major}.${minor}"
return 0
fi
done
minor=`expr $minor - 1`
done
return 1
}
Notfound()
{
echo "Error: $* not found!"
echo "Please install recent versions of GNU autoconf and GNU automake."
exit 1
}
# Reset locale settings to suppress warning messages of Perl
unset LC_ALL
unset LANG
# Which command should be used to detect the automake/autoconf tools?
[ -z "$EXIST" ] && existlist="type which" || existlist="$EXIST"
EXIST=""
for t in $existlist; do
$t /bin/ls >/dev/null 2>&1
if [ $? -eq 0 ]; then
rm -f /tmp/test.$$
$t /tmp/test.$$ >/dev/null 2>&1
[ $? -ne 0 ] && EXIST="$t"
fi
[ -n "$EXIST" ] && break
done
if [ -z "$EXIST" ]; then
echo "Didn't detect a working command to test for the autoconf/automake tools!"
echo "Searchlist: $existlist"
exit 1
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
WANT_AUTOMAKE=1.7
export WANT_AUTOMAKE
# Try to detect the needed tools when no environment variable already
# spezifies one:
echo "Searching tools ..."
[ -z "$ACLOCAL" ] && ACLOCAL=`Search aclocal 1`
[ "$VERBOSE" = "1" ] && echo "ACLOCAL=$ACLOCAL"
[ -z "$AUTOHEADER" ] && AUTOHEADER=`Search autoheader 2`
[ "$VERBOSE" = "1" ] && echo "AUTOHEADER=$AUTOHEADER"
[ -z "$AUTOMAKE" ] && AUTOMAKE=`Search automake 1`
[ "$VERBOSE" = "1" ] && echo "AUTOMAKE=$AUTOMAKE"
[ -z "$AUTOCONF" ] && AUTOCONF=`Search autoconf 2`
[ "$VERBOSE" = "1" ] && echo "AUTOCONF=$AUTOCONF"
# Call ./configure when parameters have been passed to this script and
# GO isn't already defined.
[ -z "$GO" -a $# -gt 0 ] && GO=1
# Verify that all tools have been found
[ -z "$AUTOCONF" ] && Notfound autoconf
[ -z "$AUTOHEADER" ] && Notfound autoheader
[ -z "$AUTOMAKE" ] && Notfound automake
[ -z "$AUTOCONF" ] && Notfound autoconf
export AUTOCONF AUTOHEADER AUTOMAKE AUTOCONF
# Generate files
echo "Generating files ..."
$ACLOCAL && \
$AUTOHEADER && \
$AUTOMAKE --add-missing && \
$AUTOCONF
if [ $? -eq 0 -a -x ./configure ]; then
# Success: if we got some parameters we call ./configure and pass
# all of them to it.
if [ "$GO" = "1" ]; then
[ -n "$PREFIX" ] && p=" --prefix=$PREFIX" || p=""
[ -n "$*" ] && a=" $*" || a=""
c="./configure${p}${a}"
echo "Calling \"$c\" ..."
$c
exit $?
else
echo "Okay, autogen.sh done; now run the \"configure\" script."
exit 0
fi
else
# Failure!?
echo "Error! Check your installation of GNU automake and autoconf!"
exit 1
fi
aclocal && \
autoheader && \
automake --add-missing && \
autoconf && \
echo "Okay, autogen.sh war erfolgreich."
# -eof-

1465
config.guess vendored Normal file

File diff suppressed because it is too large Load Diff

1569
config.sub vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,129 +1,47 @@
#
# ngIRCd -- The Next Generation IRC Daemon
# Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
# Copyright (c)2001-2005 Alexander Barton <alex@barton.de>
#
# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
# der GNU General Public License (GPL), wie von der Free Software Foundation
# herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
# der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
# 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: configure.in,v 1.32 2002/03/02 03:36:14 alex Exp $
#
# $Log: configure.in,v $
# Revision 1.32 2002/03/02 03:36:14 alex
# - Version 0.3.0
#
# Revision 1.31 2002/02/25 11:45:28 alex
# - es wird auf sigaction() geprueft (u.a. fuer A/UX, welches das nicht kennt).
#
# Revision 1.30 2002/02/25 11:41:43 alex
# - es werden ein paar Funktionen mehr getestet: u.a. vsnprintf() und setsockopt().
# - libUTIL wird eingebunden, so vorhanden (unter A/UX notwendig!)
#
# Revision 1.29 2002/02/19 02:11:26 alex
# - auf die "libbe" wird nur noch getestet, wenn syslog ueberhaupt verwendet wird.
#
# Revision 1.28 2002/02/17 22:17:33 alex
# - Versionsnummer im CVS auf 0.2.2-pre angehoben ...
#
# Revision 1.27 2002/02/17 21:50:38 alex
# - Version 0.2.1.
#
# Revision 1.26 2002/02/17 18:47:26 alex
# - Tests auf netdb.h, stdlib.h, sys/wait.h, gethostbyaddr, gethostbyname,
# strftime und die "libbe" unter BeOS (fuer syslog) ergaenzt.
#
# Revision 1.25 2002/02/15 14:57:21 alex
# - Version auf 0.2.1-pre im CVS angehoben ...
#
# Revision 1.24 2002/02/15 14:35:55 alex
# - Version 0.2.0
#
# Revision 1.23 2002/01/29 01:07:15 alex
# - Version auf 0.1.1-pre im CVS angehoben.
#
# Revision 1.22 2002/01/29 00:24:17 alex
# - Version 0.1.0
#
# Revision 1.21 2002/01/16 23:06:16 alex
# - Version auf 0.0.4-pre im CVS angehoben.
#
# Revision 1.20 2002/01/16 22:55:45 alex
# - Version 0.0.3
#
# Revision 1.19 2002/01/06 16:21:09 alex
# - CVS-Version auf "0.0.3-pre" angehoben.
#
# Revision 1.18 2002/01/06 16:09:37 alex
# - Version 0.0.2
#
# Revision 1.17 2002/01/05 15:53:20 alex
# - Test auf Header "arpa/inet.h" und Funktion inet_aton() hinzugefuegt (BeOS).
#
# Revision 1.16 2002/01/02 13:41:36 alex
# - CFLAGS wird nur noch gesetzt, wenn der GCC verwendet wird.
#
# Revision 1.15 2002/01/02 02:52:09 alex
# - Copyright-Texte angepasst ;-)
#
# Revision 1.14 2001/12/31 16:11:13 alex
# - CVS-Version auf "0.0.2-pre" angehoben.
#
# Revision 1.13 2001/12/31 16:02:30 alex
# - Version 0.0.1
#
# Revision 1.12 2001/12/31 02:21:00 alex
# - "doc"-Unterverzeichnis aufgenommen.
#
# Revision 1.11 2001/12/29 03:04:06 alex
# - neue configure-Option "--enable-strict-rfc".
#
# Revision 1.10 2001/12/27 16:25:36 alex
# - neue configure-Option "--with-portab=DIR".
#
# Revision 1.9 2001/12/27 02:08:38 alex
# - da fehlte an zwei Stellen ein AC_MSG_ERROR ... ups!
#
# Revision 1.8 2001/12/27 01:44:49 alex
# - die Verwendung von syslog kann nun abgeschaltet werden.
#
# Revision 1.7 2001/12/27 00:37:07 alex
# - Erkennung der "portab header" geaendert, CFLAGS werden nun anders gesetzt.
#
# Revision 1.6 2001/12/25 22:01:47 alex
# - neue configure-Option "--enable-sniffer".
#
# Revision 1.5 2001/12/21 23:54:26 alex
# - zusaetzliche Debug-Ausgaben koennen eingeschaltet werden.
#
# Revision 1.4 2001/12/12 17:21:58 alex
# - Projektdatei fuer den Mac OS X Project Builder erstellt.
#
# Revision 1.3 2001/12/12 01:58:53 alex
# - Test auf socklen_t verbessert.
#
# Revision 1.2 2001/12/11 22:04:21 alex
# - Test auf stdint.h (HAVE_STDINT_H) hinzugefuegt.
#
# Revision 1.1.1.1 2001/12/11 21:53:04 alex
# Imported sources to CVS.
# $Id: configure.in,v 1.111.2.6 2005/10/15 12:44:08 alex Exp $
#
# -- Initialisierung --
# -- Initialisation --
AC_INIT
AC_PREREQ(2.50)
AC_INIT(ngircd, 0.9.2)
AC_CONFIG_SRCDIR(src/ngircd/ngircd.c)
AM_INIT_AUTOMAKE(ngircd,0.3.0)
AC_CANONICAL_TARGET
AM_INIT_AUTOMAKE(1.6)
AM_CONFIG_HEADER(src/config.h)
# -- Templates for config.h --
AH_TEMPLATE([DEBUG], [Define if debug-mode should be enabled])
AH_TEMPLATE([HAVE_socklen_t], [Define if socklen_t exists])
AH_TEMPLATE([SNIFFER], [Define if IRC sniffer should be enabled])
AH_TEMPLATE([STRICT_RFC], [Define if ngIRCd should behave strict RFC compliant])
AH_TEMPLATE([SYSLOG], [Define if syslog should be used for logging])
AH_TEMPLATE([ZLIB], [Define if zlib compression should be enabled])
AH_TEMPLATE([TCPWRAP], [Define if TCP wrappers should be used])
AH_TEMPLATE([IRCPLUS], [Define if IRC+ protocol should be used])
AH_TEMPLATE([RENDEZVOUS], [Define if Rendezvous support should be included])
AH_TEMPLATE([IDENTAUTH], [Define if the server should do IDENT requests])
AH_TEMPLATE([TARGET_OS], [Target operating system name])
AH_TEMPLATE([TARGET_VENDOR], [Target system vendor])
AH_TEMPLATE([TARGET_CPU], [Target CPU name])
# -- C Compiler --
AC_PROG_CC
AC_LANG_C
# -- Hilfsprogramme --
# -- Helper programs --
AC_PROG_AWK
AC_PROG_INSTALL
@@ -131,50 +49,50 @@ AC_PROG_LN_S
AC_PROG_MAKE_SET
AC_PROG_RANLIB
# -- Header --
# -- Compiler Features --
AM_C_PROTOTYPES
AC_C_CONST
# -- Hard coded system and compiler dependencies/features/options ... --
if test "$GCC" = "yes"; then
# We are using the GNU C compiler. Good!
CFLAGS="$CFLAGS -pipe -W -Wall -Wpointer-arith -Wstrict-prototypes"
fi
case "$target_os" in
hpux*)
# This is HP/UX, we need to define _XOPEN_SOURCE_EXTENDED
# (tested with HP/UX 11.11)
CFLAGS="$CFLAGS -D_XOPEN_SOURCE_EXTENDED"
;;
esac
# Add additional CFLAGS, eventually specified on the command line:
test -n "$CFLAGS_ADD" && CFLAGS="$CFLAGS $CFLAGS_ADD"
CFLAGS="$CFLAGS -DSYSCONFDIR='\"\$(sysconfdir)\"'"
# -- Headers --
AC_HEADER_STDC
AC_HEADER_TIME
AC_ARG_WITH(portab,
[ --with-portab=DIR search the "portab headers" in DIR],
[ if test "x$withval" != "xno"; then
CFLAGS="$CFLAGS -I${withval}"
if test -f ${withval}/portab.h; then
AC_MSG_RESULT([searching "portab headers" in ${withval}...])
else
AC_MSG_ERROR([${withval}/portab.h not found!])
fi
else
AC_MSG_ERROR([Can't disable Alex \"portability headers\"!])
fi
],
[ AC_CHECK_HEADER(portab.h,[
AC_CHECK_HEADER(imp.h,,AC_MSG_ERROR([Alex \"portability headers\" (portab.h an friends) not found!]))
AC_CHECK_HEADER(exp.h,,AC_MSG_ERROR([Alex \"portability headers\" (portab.h an friends) not found!]))
],[
AC_CHECK_HEADER(/usr/local/include/portab.h,,AC_MSG_ERROR([Alex \"portability headers\" (portab.h an friends) not found!]))
AC_CHECK_HEADER(/usr/local/include/imp.h,,AC_MSG_ERROR([Alex \"portability headers\" (portab.h an friends) not found!]))
AC_CHECK_HEADER(/usr/local/include/exp.h,,AC_MSG_ERROR([Alex \"portability headers\" (portab.h an friends) not found!]))
CFLAGS="$CFLAGS -I/usr/local/include"
])
]
)
AC_CHECK_HEADERS(arpa/inet.h)
AC_HEADER_SYS_WAIT
AC_CHECK_HEADERS([ \
errno.h fcntl.h netdb.h netinet/in.h stdlib.h string.h \
sys/socket.h sys/time.h sys/wait.h unistd.h \
ctype.h errno.h fcntl.h netdb.h netinet/in.h stdlib.h string.h \
strings.h sys/socket.h sys/time.h unistd.h \
],,AC_MSG_ERROR([required C header missing!]))
# -- Datentypen --
AC_CHECK_HEADERS([arpa/inet.h ctype.h malloc.h stdbool.h stddef.h varargs.h])
# -- Datatypes --
AC_MSG_CHECKING(whether socklen_t exists)
AC_TRY_COMPILE([
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/types.h>
#include <sys/socket.h>
],[
socklen_t a, b;
a = 2; b = 4; a += b;
@@ -184,61 +102,194 @@ AC_TRY_COMPILE([
AC_MSG_RESULT(no)
])
AC_TYPE_SIGNAL
AC_TYPE_SIZE_T
# -- Libraries --
AC_CHECK_LIB(UTIL,memmove)
AC_CHECK_LIB(socket,bind)
AC_CHECK_LIB(nsl,gethostent)
# -- Funktionen --
# -- Functions --
AC_FUNC_MALLOC
AC_FUNC_FORK
AC_FUNC_STRFTIME
AC_CHECK_FUNCS([ \
bind gethostbyaddr gethostbyname gethostname inet_ntoa memmove \
memset select setsockopt socket strcasecmp strchr strerror strftime \
strstr vsnprintf waitpid \
],,AC_MSG_ERROR([required function missing!]))
bind gethostbyaddr gethostbyname gethostname inet_ntoa malloc memmove \
memset realloc setsid setsockopt socket strcasecmp strchr strerror \
strstr waitpid],,AC_MSG_ERROR([required function missing!]))
AC_CHECK_FUNCS(inet_aton)
AC_CHECK_FUNCS(inet_aton isdigit sigaction snprintf vsnprintf strdup strlcpy strlcat)
AC_CHECK_FUNCS(sigaction)
AC_CHECK_FUNCS(select,[AC_CHECK_HEADERS(sys/select.h)],
AC_MSG_ERROR([required function select() is missing!])
)
# -- Konfigurationsoptionen --
# -- Configuration options --
AC_ARG_ENABLE(syslog,
[ --disable-syslog disable syslog (autodetected by default)],
[ if test "$enableval" = "yes"; then
AC_CHECK_HEADER(syslog.h,
[ AC_DEFINE(USE_SYSLOG, 1)
AC_CHECK_LIB(be,syslog)
],
AC_MSG_ERROR([Can't enable syslog: syslog.h not found!])
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
AC_CHECK_LIB(be, syslog)
AC_CHECK_FUNCS(syslog, x_syslog_on=yes,
AC_MSG_ERROR([Can't enable syslog!])
)
else
AC_MSG_RESULT([disabling syslog])
fi
],
[ AC_CHECK_HEADER(syslog.h,
[ AC_DEFINE(USE_SYSLOG, 1)
AC_CHECK_LIB(be,syslog)
]
)
[
AC_CHECK_LIB(be, syslog)
AC_CHECK_FUNCS(syslog, x_syslog_on=yes)
]
)
if test "$x_syslog_on" = "yes"; then
AC_DEFINE(SYSLOG, 1)
AC_CHECK_HEADERS(syslog.h,,AC_MSG_ERROR([required C header missing!]))
fi
x_zlib_on=no
AC_ARG_WITH(zlib,
[ --without-zlib disable zlib compression (autodetected by default)],
[ if test "$withval" != "no"; then
if test "$withval" != "yes"; then
CFLAGS="-I$withval/include $CFLAGS"
CPPFLAGS="-I$withval/include $CPPFLAGS"
LDFLAGS="-L$withval/lib $LDFLAGS"
fi
AC_CHECK_LIB(z, deflate)
AC_CHECK_FUNCS(deflate, x_zlib_on=yes,
AC_MSG_ERROR([Can't enable zlib!])
)
fi
],
[ AC_CHECK_LIB(z, deflate)
AC_CHECK_FUNCS(deflate, x_zlib_on=yes)
]
)
if test "$x_zlib_on" = "yes"; then
AC_DEFINE(ZLIB, 1)
AC_CHECK_HEADERS(zlib.h,,AC_MSG_ERROR([required C header missing!]))
fi
x_tcpwrap_on=no
AC_ARG_WITH(tcp-wrappers,
[ --with-tcp-wrappers enable TCP wrappers support],
[ if test "$withval" != "no"; then
if test "$withval" != "yes"; then
CFLAGS="-I$withval/include $CFLAGS"
CPPFLAGS="-I$withval/include $CPPFLAGS"
LDFLAGS="-L$withval/lib $LDFLAGS"
fi
AC_MSG_CHECKING(for hosts_access)
LIBS="-lwrap $LIBS"
AC_TRY_LINK([
#include <tcpd.h>
int allow_severity = 0;
int deny_severity = 0;
],[
tcpd_warn("link test");
],[
AC_MSG_RESULT(yes)
AC_DEFINE(TCPWRAP, 1)
x_tcpwrap_on=yes
],[
AC_MSG_RESULT(no)
AC_MSG_ERROR([Can't enable TCP wrappers!])
])
fi
]
)
AC_ARG_ENABLE(strict-rfc,
[ --enable-strict-rfc strict RFC conformance, may break clients],
if test "$enableval" = "yes"; then
AC_DEFINE(STRICT_RFC, 1)
AC_MSG_RESULT([enabling strict RFC conformance])
fi
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!]))
])
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!]))
AC_DEFINE(RENDEZVOUS, 1)
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
AC_CHECK_LIB(ident, ident_id)
AC_CHECK_FUNCS(ident_id, x_identauth_on=yes,
AC_MSG_ERROR([Can't enable IDENT support!])
)
fi
]
)
if test "$x_identauth_on" = "yes"; then
AC_DEFINE(IDENTAUTH, 1)
AC_CHECK_HEADERS(ident.h,,AC_MSG_ERROR([required C header missing!]))
fi
x_ircplus_on=yes
AC_ARG_ENABLE(ircplus,
[ --disable-ircplus disable IRC+ protocol],
if test "$enableval" = "no"; then x_ircplus_on=no; fi
)
if test "$x_ircplus_on" = "yes"; then
AC_DEFINE(IRCPLUS, 1)
fi
x_sniffer_on=no; x_debug_on=no
AC_ARG_ENABLE(sniffer,
[ --enable-sniffer enable network traffic monitor (enables debug mode!)],
[ --enable-sniffer enable IRC traffic sniffer (enables debug mode)],
if test "$enableval" = "yes"; then
AC_DEFINE(SNIFFER, 1)
AC_MSG_RESULT([enabling network traffic monitor])
x_debug_on=yes
x_sniffer_on=yes; x_debug_on=yes
fi
)
@@ -248,24 +299,120 @@ AC_ARG_ENABLE(debug,
)
if test "$x_debug_on" = "yes"; then
AC_DEFINE(DEBUG, 1)
AC_MSG_RESULT([enabling additional debug output])
test "$GCC" = "yes" && CFLAGS="-pedantic $CFLAGS"
fi
# -- Variablen II --
x_strict_rfc_on=no
AC_ARG_ENABLE(strict-rfc,
[ --enable-strict-rfc strict RFC conformance -- may break clients!],
if test "$enableval" = "yes"; then
AC_DEFINE(STRICT_RFC, 1)
x_strict_rfc_on=yes
fi
)
if test "$GCC" = "yes"; then
CFLAGS="-Wall $CFLAGS"
fi
# -- Definitions --
# -- Ausgabe --
AC_DEFINE_UNQUOTED(TARGET_CPU, "$target_cpu" )
AC_DEFINE_UNQUOTED(TARGET_VENDOR, "$target_vendor" )
AC_DEFINE_UNQUOTED(TARGET_OS, "$target_os" )
# Add additional CFLAGS, eventually specified on the command line, but after
# running this configure script. Useful for "-Werror" for example.
test -n "$CFLAGS_END" && CFLAGS="$CFLAGS $CFLAGS_END"
# -- Generate files --
AC_OUTPUT([ \
Makefile \
doc/Makefile \
MacOSX/Makefile \
MacOSX/ngircd.pbproj/Makefile \
src/Makefile \
src/portab/Makefile \
src/tool/Makefile \
src/ngircd/Makefile \
src/testsuite/Makefile \
man/Makefile \
contrib/Makefile \
contrib/Debian/Makefile \
contrib/MacOSX/Makefile \
])
type dpkg >/dev/null 2>&1
if test $? -eq 0; then
# Generate debian/ link if the dpkg command exists
# (read: if we are running on a debian compatible system)
echo "creating Debian-specific links ..."
test -f debian/rules || ln -s contrib/Debian debian
fi
# -- Result --
echo
echo "ngIRCd $PACKAGE_VERSION has been configured with the following options:"
echo
# Someone please show me a better way :) [borrowed by OpenSSH]
B=`eval echo ${bindir}` ; B=`eval echo ${B}`
S=`eval echo ${sbindir}` ; S=`eval echo ${S}`
C=`eval echo ${sysconfdir}` ; C=`eval echo ${C}`
M=`eval echo ${mandir}` ; M=`eval echo ${M}`
D=`eval echo ${datadir}/doc/${PACKAGE}` ; D=`eval echo ${D}`
echo " Target: ${target}"
test "$target" != "$host" && echo " Host: ${host}"
echo " Compiler: ${CC}"
test -n "$CFLAGS" && echo " Compiler flags: ${CFLAGS}"
test -n "$CPPFLAGS" && echo " Preprocessor flags: ${CPPFLAGS}"
test -n "$LDFLAGS" && echo " Linker flags: ${LDFLAGS}"
test -n "$LIBS" && echo " Libraries: ${LIBS}"
echo
echo " 'ngircd' binary: $S"
echo " Configuration file: $C"
echo " Manual pages: $M"
echo " Documentation: $D"
echo
echo $ECHO_N " Syslog support: $ECHO_C"
test "$x_syslog_on" = "yes" \
&& echo $ECHO_N "yes $ECHO_C" \
|| echo $ECHO_N "no $ECHO_C"
echo $ECHO_N " Enable debug code: $ECHO_C"
test "$x_debug_on" = "yes" \
&& echo "yes" \
|| echo "no"
echo $ECHO_N " zlib compression: $ECHO_C"
test "$x_zlib_on" = "yes" \
&& echo $ECHO_N "yes $ECHO_C" \
|| echo $ECHO_N "no $ECHO_C"
echo $ECHO_N " IRC sniffer: $ECHO_C"
test "$x_sniffer_on" = "yes" \
&& echo "yes" \
|| echo "no"
echo $ECHO_N " Use TCP Wrappers: $ECHO_C"
test "$x_tcpwrap_on" = "yes" \
&& echo $ECHO_N "yes $ECHO_C" \
|| echo $ECHO_N "no $ECHO_C"
echo $ECHO_N " Strict RFC mode: $ECHO_C"
test "$x_strict_rfc_on" = "yes" \
&& echo "yes" \
|| echo "no"
echo $ECHO_N " Rendezvous support: $ECHO_C"
test "$x_rendezvous_on" = "osx" -o "$x_rendezvous_on" = "howl" \
&& echo $ECHO_N "yes $ECHO_C" \
|| echo $ECHO_N "no $ECHO_C"
echo $ECHO_N " IRC+ protocol: $ECHO_C"
test "$x_ircplus_on" = "yes" \
&& echo "yes" \
|| echo "no"
echo $ECHO_N " IDENT support: $ECHO_C"
test "$x_identauth_on" = "yes" \
&& echo $ECHO_N "yes $ECHO_C" \
|| echo $ECHO_N "no $ECHO_C"
echo; echo
# -eof-

View File

@@ -0,0 +1,28 @@
#
# ngIRCd -- The Next Generation IRC Daemon
# 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
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information.
#
# $Id: Makefile.am,v 1.4 2004/05/11 00:32:31 alex Exp $
#
EXTRA_DIST = rules changelog compat control copyright \
ngircd.init ngircd.postinst
maintainer-clean-local:
rm -f Makefile Makefile.in
clean-local:
rm -f ngircd.postinst.debhelper ngircd.postrm.debhelper \
ngircd.prerm.debhelper ngircd.substvars
rm -f ngircd-full.postinst.debhelper ngircd-full.postrm.debhelper \
ngircd-full.prerm.debhelper ngircd-full.substvars
rm -rf ngircd ngircd-full
rm -f files
# -eof-

187
contrib/Debian/changelog Normal file
View File

@@ -0,0 +1,187 @@
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.
-- Alexander Barton <alex@Arthur.Ath.CX> Thu, 3 Feb 2005 10:41:55 +0100
ngircd (0.8.2-0ab1) unstable; urgency=high
* New "upstream release", including security fixes.
-- Alexander Barton <alex@Arthur.Ath.CX> Wed, 26 Jan 2005 23:14:12 +0100
ngircd (0.8.1-0ab1) unstable; urgency=low
* New "upstream release".
-- Alexander Barton <alex@Arthur.Ath.CX> Sat, 25 Dec 2004 01:18:32 +0100
ngircd (0.8.0-0ab2) unstable; urgency=low
* Added missing commas to debian control file, fixes bug #56.
Thanks to Kevin Otte.
-- Alexander Barton <alex@Arthur.Ath.CX> Thu, 15 Jul 2004 10:53:39 +0200
ngircd (0.8.0-0ab1) unstable; urgency=low
* New upstream version.
-- 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
become synchronized between IRC+ servers when establishing new
connections, if the peer supports this as well."
-- Alexander Barton <alex@Arthur.Ath.CX> Mon, 26 Apr 2004 01:53:15 +0200
ngircd (0.7.7+HEAD-0ab4) unstable; urgency=low
* This version includes fixes for INVITE command and the handling of the
invite and ban lists from CVS-HEAD.
-- Alexander Barton <alex@Arthur.Ath.CX> Fri, 9 Apr 2004 23:55:13 +0200
ngircd (0.7.7+HEAD-0ab3) unstable; urgency=low
* Included MODE fix from CVS-HEAD branch.
-- Alexander Barton <alex@Arthur.Ath.CX> Mon, 5 Apr 2004 13:09:24 +0200
ngircd (0.7.7+HEAD-0ab2) unstable; urgency=low
* Incorporated more fixes and enhancements of CVS-HEAD version,
e. g. better connection logging and fixed TRACE command.
-- Alexander Barton <alex@Arthur.Ath.CX> Sat, 28 Feb 2004 03:20:32 +0100
ngircd (0.7.7+HEAD-0ab1) unstable; urgency=low
* New upstream version. This debian package includes all features of
ngIRCd 0.7.7 and changes of the CVS-HEAD development tree.
-- Alexander Barton <alex@Arthur.Ath.CX> Thu, 5 Feb 2004 15:23:22 +0100
ngircd (0.7.6+HEAD-0ab2) unstable; urgency=low
* Included new fixes and additions from the CVS-HEAD upstream branch,
e. g. the setting of type of service (TOS) on sockets.
-- Alexander Barton <alex@Arthur.Ath.CX> Mon, 26 Jan 2004 04:05:41 +0100
ngircd (0.7.6+HEAD-0ab1) unstable; urgency=low
* Included all changes from the CVS-HEAD upstream version.
* Restructured debian packaging system: now there are two packages, a
"standard" version that includes all the default options and a "full"
version that additionally includes support for TCP wrappers and IDENT
lookups.
-- Alexander Barton <alex@Arthur.Ath.CX> Thu, 1 Jan 2004 23:12:11 +0100
ngircd (0.7.6-0ab1) unstable; urgency=medium
* New upstream version.
* Changed version numvering scheme of debian package.
-- Alexander Barton <alex@Arthur.Ath.CX> Fri, 5 Dec 2003 14:26:41 +0100
ngircd (0.7.5-0.2ab) unstable; urgency=low
* Updated RPM and Debian package description and configuration.
-- Alexander Barton <alex@Arthur.Ath.CX> Sat, 29 Nov 2003 21:24:32 +0100
ngircd (0.7.5-0.1ab) unstable; urgency=low
* New upstream version.
-- Alexander Barton <alex@Arthur.Ath.CX> Fri, 7 Nov 2003 21:59:58 +0100
ngircd (0.7.1-0.1ab) unstable; urgency=low
* New upstream version :-)
-- Alexander Barton <alex@Arthur.Ath.CX> Fri, 18 Jul 2003 22:53:02 +0200
ngircd (0.7.0-0.7ab) unstable; urgency=low
* Fixed up post installation script (added interpreter, fixed chmod call).
-- Alexander Barton <alex@Arthur.Ath.CX> Sun, 13 Jul 2003 00:52:38 +0200
ngircd (0.7.0-0.6ab) unstable; urgency=low
* Added /etc/default/ngircd.
* Included own post installation script.
-- Alexander Barton <alex@Arthur.Ath.CX> Sat, 12 Jul 2003 20:31:09 +0200
ngircd (0.7.0-0.5ab) unstable; urgency=low
* Enhanced init script.
* Included NJOIN fix from actual CVS "HEAD" branch.
-- Alexander Barton <alex@Arthur.Ath.CX> Wed, 9 Jul 2003 22:40:49 +0200
ngircd (0.7.0-0.4ab) unstable; urgency=low
* Reverted use of dh_installexamples.
-- Alexander Barton <alex@Arthur.Ath.CX> Thu, 22 May 2003 00:15:03 +0200
ngircd (0.7.0-0.3ab) unstable; urgency=low
* Removed "debian/docs" and "debian/conffiles"; debhelper takes care of
this for us automagically.
* Excluded "etc/ngircd.conf" from dh_fixperms.
-- Alexander Barton <alex@Arthur.Ath.CX> Wed, 21 May 2003 23:25:05 +0200
ngircd (0.7.0-0.2ab) unstable; urgency=low
* Fixed wrong variable substitution in init script.
* Added some CVS "Id-Tags" (but not checked in, yet).
* Removed own "Provides:" from control file.
-- Alexander Barton <alex@barton.de> Wed, 21 May 2003 12:32:34 +0200
ngircd (0.7.0-0.1ab) unstable; urgency=low
* Initial Release.
-- Alexander Barton <alex@barton.de> Wed, 21 May 2003 02:36:52 +0200

1
contrib/Debian/compat Normal file
View File

@@ -0,0 +1 @@
4

47
contrib/Debian/control Normal file
View File

@@ -0,0 +1,47 @@
Source: ngircd
Section: net
Priority: optional
Maintainer: Alexander Barton <alex@barton.de>
Build-Depends: debhelper (>> 4.0.0), libz-dev, libwrap-dev, libident-dev
Standards-Version: 3.5.8
Package: ngircd
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: A lightweight daemon for the Internet Relay Chat (IRC)
ngIRCd is a free open source daemon for the Internet Relay Chat (IRC)
network. It is written from scratch and is not based upon the original
IRCd like many others.
.
This package contains the "standard distribution", including support for
syslog logging and compressed server-links using zlib.
.
Advantages of ngIRCd:
- no problems with servers using changing/non-static IP addresses.
- small and lean configuration file.
- free, modern and open source C code.
- still under active development.
.
ngIRCd is compatible to the "original" ircd 2.10.3p3, so you can run
mixed networks.
Package: ngircd-full
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Conflicts: ngircd
Description: A lightweight daemon for the Internet Relay Chat (IRC)
ngIRCd is a free open source daemon for the Internet Relay Chat (IRC)
network. It is written from scratch and is not based upon the original
IRCd like many others.
.
This package includes support for TCP wrappers and IDENT requests in
addition to the features of the "standard package".
.
Advantages of ngIRCd:
- no problems with servers using changing/non-static IP addresses.
- small and lean configuration file.
- free, modern and open source C code.
- still under active development.
.
ngIRCd is compatible to the "original" ircd 2.10.3p3, so you can run
mixed networks.

13
contrib/Debian/copyright Normal file
View File

@@ -0,0 +1,13 @@
This package was debianized by Alexander Barton <alex@barton.de> on
Tue, 20 May 2003 15:47:40 +0200.
It was downloaded from ftp://Arthur.Ath.CX/pub/Users/alex/ngircd/
Upstream Author: Alexander Barton <alex@barton.de>
This software is copyright (c) 1999-2003 by Alexander Barton.
You are free to distribute this software under the terms of the
GNU General Public License.
On Debian systems, the complete text of the GNU General Public
License can be found in /usr/share/common-licenses/GPL file.

View File

@@ -0,0 +1,12 @@
#
# Defaults for ngIRCd start and stop script
#
# $Id: ngircd.default,v 1.1 2003/12/31 17:20:11 alex Exp $
#
# Parameters to pass to the ngircd daemon on startup, see ngircd(8) for
# possible options (default: empty).
PARAMS=""
# -eof-

75
contrib/Debian/ngircd.init Executable file
View File

@@ -0,0 +1,75 @@
#!/bin/sh
#
# 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 $
#
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/ngircd
NAME=ngIRCd
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
Check_Config()
{
$DAEMON --configtest >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "Configuration of $NAME is not valide, won't (re)start!"
echo "Please run \"$DAEMON --configtest\" manually and fix it up ..."
exit 1
fi
}
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!"
exit 1
fi
echo "$NAME."
}
case "$1" in
start)
Check_Config
echo -n "Starting $DESC: "
Try_Start
;;
stop)
echo -n "Stopping $DESC: "
start-stop-daemon --stop --quiet --pidfile /var/run/ircd/ngircd.pid --exec $DAEMON \
&& echo "$NAME." \
|| echo "(none running)"
;;
reload|force-reload)
Check_Config
echo "Reloading $DESC configuration files."
start-stop-daemon --stop --signal 1 --quiet --exec $DAEMON
;;
restart)
Check_Config
echo -n "Restarting $DESC: "
start-stop-daemon --stop --quiet --oknodo --exec $DAEMON
sleep 1
Try_Start
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
exit 1
;;
esac
exit 0
# -eof-

14
contrib/Debian/ngircd.postinst Executable file
View File

@@ -0,0 +1,14 @@
#!/bin/sh
#
# Debian post-installation script
# $Id: ngircd.postinst,v 1.1 2003/12/31 17:20:11 alex Exp $
#
if [ -f /etc/ngircd/ngircd.conf ]; then
# make sure that configuration file is not world readable
chmod o= /etc/ngircd/ngircd.conf
fi
#DEBHELPER#
# -eof-

172
contrib/Debian/rules Executable file
View File

@@ -0,0 +1,172 @@
#!/usr/bin/make -f
#
# ngIRCd -- The Next Generation IRC Daemon
# 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
# 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.
#
# debian/rules for ngIRCd
#
# $Id: rules,v 1.3 2005/02/07 23:09:31 alex Exp $
#
# Based on the sample debian/rules that uses debhelper,
# GNU copyright 1997 to 1999 by Joey Hess.
#
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
# These are used for cross-compiling and for saving the configure script
# from having to guess our platform (since we know it already)
DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
CFLAGS = -Wall -g
ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
CFLAGS += -O0
else
CFLAGS += -O2
endif
ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
INSTALL_PROGRAM += -s
endif
configure-ngircd: configure
dh_testdir
# configure "standard" variant:
./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) \
--prefix=/usr \
--sysconfdir=/etc/ngircd \
--mandir=\$${prefix}/share/man \
--with-syslog --with-zlib
configure-ngircd-full: configure
dh_testdir
# configure "full" variant:
./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) \
--prefix=/usr \
--sysconfdir=/etc/ngircd \
--mandir=\$${prefix}/share/man \
--with-syslog --with-zlib --with-tcp-wrappers --with-ident
build:
dh_clean -k
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:
dh_testdir
dh_testroot
rm -f build-stamp*
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
ifneq "$(wildcard /usr/share/misc/config.guess)" ""
cp -f /usr/share/misc/config.guess config.guess
endif
dh_clean
install: install-ngircd install-ngircd-full
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:
# We have nothing to do by default.
# Build architecture-dependent files here.
binary-arch: build install
ln -s $(CURDIR)/debian/ngircd.default \
$(CURDIR)/debian/ngircd-full.default
ln -s $(CURDIR)/debian/ngircd.init \
$(CURDIR)/debian/ngircd-full.init
ln -s $(CURDIR)/debian/ngircd.postinst \
$(CURDIR)/debian/ngircd-full.postinst
dh_testdir
dh_testroot
dh_installchangelogs -a -A ChangeLog
dh_installdocs -a
dh_installinit -a
dh_strip -a
dh_compress -a
dh_fixperms -a
dh_installdeb -a
dh_shlibdeps -a
dh_gencontrol -a
dh_md5sums -a
dh_builddeb -a
binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install
# -eof-

View File

@@ -0,0 +1,20 @@
#
# ngIRCd -- The Next Generation IRC Daemon
# Copyright (c)2001-2004 Alexander Barton <alex@barton.de>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information.
#
# $Id: Makefile.am,v 1.2 2004/05/11 00:34:26 alex Exp $
#
clean-local:
rm -rf build
maintainer-clean-local:
rm -f Makefile Makefile.in
# -eof-

File diff suppressed because it is too large Load Diff

22
contrib/Makefile.am Normal file
View File

@@ -0,0 +1,22 @@
#
# ngIRCd -- The Next Generation IRC Daemon
# Copyright (c)2001-2004 Alexander Barton <alex@barton.de>
#
# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
# der GNU General Public License (GPL), wie von der Free Software Foundation
# herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
# der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
#
# $Id: Makefile.am,v 1.4 2004/04/28 12:18:02 alex Exp $
#
SUBDIRS = Debian MacOSX
EXTRA_DIST = README ngircd.spec systrace.policy
maintainer-clean-local:
rm -f Makefile Makefile.in
# -eof-

27
contrib/README Normal file
View File

@@ -0,0 +1,27 @@
ngIRCd - Next Generation IRC Server
(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.
-- Contributions --
MacOSX/
- Project file for XCode "project builder" of Mac OS X.
Debian/
- Various files for building Debian packages.
ngircd.spec
- RPM "spec" file.
systrace.policy
- Systrace policy file for OpenBSD (and probably NetBSD).
--
$Id: README,v 1.1 2004/04/28 12:18:50 alex Exp $

55
contrib/ngircd.spec Normal file
View File

@@ -0,0 +1,55 @@
%define name ngircd
%define version 0.9.2
%define release 1
%define prefix %{_prefix}
Summary: A lightweight daemon for the Internet Relay Chat (IRC)
Name: %{name}
Version: %{version}
Release: %{release}
Copyright: GPL
Group: Networking/Daemons
URL: http://arthur.ath.cx/~alex/ngircd/
Source: %{name}-%{version}.tar.gz
Packager: Sean Reifschneider <jafo-rpms@tummy.com>
BuildRoot: /var/tmp/%{name}-root
%description
ngIRCd is a free open source daemon for the Internet Relay Chat (IRC),
developed under the GNU General Public License (GPL). It's written from
scratch and is not based upon the original IRCd like many others.
Advantages:
- no problems with servers using changing/non-static IP addresses.
- small and lean configuration file.
- free, modern and open source C code.
- still under active development.
ngIRCd is compatible to the "original" ircd 2.10.3p3, so you can run
mixed networks.
%prep
%setup
%build
%configure
make
%install
[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf "$RPM_BUILD_ROOT"
%makeinstall
(
cd "$RPM_BUILD_ROOT"
( cd usr/sbin; mv *-ngircd ngircd )
( cd usr/share/man/man5; mv *-ngircd.conf.5 ngircd.conf.5 )
( cd usr/share/man/man8; mv *-ngircd.8 ngircd.8 )
)
%clean
[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf "$RPM_BUILD_ROOT"
%files
%defattr(755,root,root)
%doc AUTHORS COPYING ChangeLog INSTALL NEWS README
%config(noreplace) /etc
%{_prefix}/sbin
%{_prefix}/share/man/

77
contrib/systrace.policy Normal file
View File

@@ -0,0 +1,77 @@
#
# Sample systrace policy for ngIRCd on OpenBSD
# Author: Benjamin Pineau <ben@zouh.org>
#
# $Id: systrace.policy,v 1.1 2004/04/28 12:16:59 alex Exp $
#
# Tune me, put me in /etc/systrace/usr_local_bin_ngircd and start ngIRCd
# (with root privileges) as:
#
# systrace -a /usr/local/bin/ngircd
#
# I didn't tried this on NetBSD, but it should work as is.
#
# On systems with pf, it can be supplemented by strict firewall rules:
# for a ngircd running as '$ircuser', binding on '$ircport' and accepting
# 30 connections:
#
# block out log quick proto tcp from any port $ircport to any \
# user != $ircuser
# pass in inet proto tcp from any to any port $ircport user $ircuser \
# keep state (max 30) flags S/SA
#
Policy: /usr/local/bin/ngircd, Emulation: native
native-__sysctl: permit
native-fsread: filename eq "/etc/malloc.conf" then permit
native-fsread: filename sub "/usr/share/zoneinfo/" then permit
native-fsread: filename eq "/usr/local/etc/ngircd.conf" then permit
native-fsread: filename eq "/usr/local/etc/ngircd.motd" then permit
native-fsread: filename eq "/etc/ngircd.conf" then permit
native-fsread: filename eq "/etc/ngircd.motd" then permit
native-fsread: filename eq "/etc/spwd.db" then deny[eperm]
native-fsread: filename eq "/etc/group" then permit
native-fsread: filename eq "/etc/resolv.conf" then permit
native-fsread: filename eq "/etc/localtime" then permit
native-fsread: filename eq "/etc/hosts" then permit
native-fsread: filename sub "<non-existent filename>" then deny[enoent]
native-socket: sockdom eq "AF_UNIX" and socktype eq "SOCK_DGRAM" then permit
native-socket: sockdom eq "AF_INET" and socktype eq "SOCK_STREAM" then permit
native-bind: sockaddr match "inet-*:6667" then permit, if user != root
native-connect: sockaddr eq "/dev/log" then permit, if user != root
native-connect: sockaddr match "inet-*:53" then permit, if user != root
native-setsockopt: permit, if user != root
native-listen: permit, if user != root
native-accept: permit, if user != root
native-sendto: true then permit, if user != root
native-recvfrom: permit, if user != root
native-read: permit
native-pread: permit
native-write: permit, if user != root
native-mmap: permit
native-munmap: permit
native-mprotect: permit
native-break: permit
native-umask: permit
native-fork: permit
native-setsid: permit
native-chdir: permit
native-chroot: permit
native-setgid: gid neq "0" then permit
native-setuid: uid neq "0" and uname neq "root" then permit
native-getuid: permit
native-getgid: permit
native-gettimeofday: permit
native-getpid: permit
native-select: permit
native-fcntl: permit
native-fstat: permit
native-issetugid: permit
native-sigaction: permit
native-pipe: permit
native-sigreturn: permit
native-close: permit
native-exit: permit
native-fswrite: deny[eperm]
# -eof-

View File

@@ -1,27 +0,0 @@
ngIRCd - Next Generation IRC Server
(c)2001,2002 by Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd ist freie Software und steht unter
der GNU General Public License.
-- CC-Speed.txt --
ngIRCd-0.2.1-pre (2002-02-25):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[nach make-Zeiten sortiert]
Intel PIII, 1 GHz, 256 MB Ram, FreeBSD 4.4: configure: 00:10, make: 00:05
Intel PIII, 1 GHz, 256 MB Ram, Linux 2.4.10: configure: 00:06, make: 00:06
Intel PIII, 1 GHz, 256 MB Ram, BeOS R5: configure: 00:19, make: 00:07
Intel PIII, 1 GHz, 256 MB Ram, Win2k+CygWin: configure: 00:27, make: 00:08
AMD K6/2, 400 Mhz, 256 MB Ram, Linux 2.4.12: configure: 00:14, make: 00:12
PowerMac G4, 400 Mhz, 768 MB Ram, Mac OS X 10.1.2: configure: 00:32, make: 00:19
Macintosh SE/30, 68030 16 MHz, 32 MB, A/UX 3.0.1: configure: 07:33, make: 12:02
--
$Id: CC-Speed.txt,v 1.1 2002/02/25 14:02:32 alex Exp $

View File

@@ -1,64 +1,56 @@
ngIRCd - Next Generation IRC Server
(c)2001,2002 by Alexander Barton,
(c)2001-2003 by Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd ist freie Software und steht unter
der GNU General Public License.
ngIRCd is free software and published under the
terms of the GNU General Public License.
-- CVS.txt --
Die Sourcen des ngIRCd werden mit dem "Concurrent Versions System" (CVS)
verwaltet. Somit koennen ohne Probleme mehrere Leute gleichzeitig die Sourcen
bearbeitet.
The source code of ngIRCd is maintained using the "Concurrent Versions
System" (CVS). Thereby several developers can work with the source tree at
the same time.
I. Anonymer "Nur-Lesen"-Zugang
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Anonymer Zugriff auf die CVS-Repository von ngIRCd ist im "nur-lesen"-Modus
moeglich. Dazu sind folgende Schritte noetig:
I. Anonymous read-only Access
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
To access the source tree anonymously in read-only mode, follow these steps:
Beim CVS-Server anmelden
Login to the CVS server:
$ cvs -d:pserver:anonymous@arthur.ath.cx:/usr/local/CVS/ngircd login
Als Benutzername wird "anonymous" mit einem leeren Passwort verwendet.
Nun ein "Check-Out" der Quellcodes durchfuehren:
Use "anonymous" as user name and no password (just hit Return). Now you can
check out the sources:
$ cvs -d:pserver:anonymous@arthur.ath.cx:/usr/local/CVS/ngircd checkout ngircd
Dadurch wird im aktuellen Verzeichnis der neue Ordner "ngircd" mit allen
Quell-Dateien des ngIRCd erzeugt.
Thereby a new folder "ngircd" will be created containing all the individual
source files.
Dieses ist der "Arbeitsordner", alle CVS-Befehle werden in Zukunft aus
diesem Ordner bzw. einem Unterordner davon ausgefuehrt.
This is the "working folder", all CVS commands will be executed from within
this folder in the future.
Wichtig: wenn ngIRCd "frisch" aus dem CVS compiliert werden soll, so
existiert das configure-Script noch nicht. Dieses muss zunaechst mit dem
Script "autogen.sh" erzeugt werden. Letzteres setzt ein installiertes GNU
automake und GNU autoconf voraus!
Please note: When checking out a fresh copy of ngIRCd from CVS, the
configure script doesn't exist; you have to run the autogen.sh shell script
(which is included in the source tree) to generate it. This requires you to
have GNU automake and GNU autoconf installed on your system.
CVS-Tree aktualisieren:
Updating the CVS tree:
$ cvs update
$ cvs update -d -P [<filename>]
Dieser Befehl aktualisiert alle Dateien im aktuellen Verzeichnis sowie allen
Unterverzeichnissen.
$ cvs update <filename>
So kann eine einzelne Datei aktualisiert werden (auch dann, wenn sie lokal
z.B. geloescht wurde -- praktisch, um eigene "Experimente" rueckgaengig zu
machen ;-))
You can update a single file or the complete source tree.
III. Schreibzugriff
~~~~~~~~~~~~~~~~~~~
Wer Schreibzugriff auf die CVS-Repository wuenscht, der moege sich bitte
mit Alex Barton, <alex@barton.de> in Verbindung setzen.
III. Write Access
~~~~~~~~~~~~~~~~~
If you want to contribute a couple of patches and write access to the CVS
repository would be handy, please contact Alex Barton, <alex@barton.de>.
--
$Id: CVS.txt,v 1.5 2002/02/15 15:15:22 alex Exp $
$Id: CVS.txt,v 1.7 2003/03/26 22:34:33 alex Exp $

View File

@@ -1,61 +1,79 @@
ngIRCd - Next Generation IRC Server
(c)2001,2002 by Alexander Barton,
(c)2001-2003 by Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd ist freie Software und steht unter
der GNU General Public License.
ngIRCd is free software and published under the
terms of the GNU General Public License.
-- FAQ: Frequently Asked Questions --
I. Allgemein
~~~~~~~~~~~~
Q: Kann der ngIRCd im Netz zusammen mit "normalen" Servern betrieben werden?
A: Ja. ngIRCd ist zum Original kompatibel, getestet wird dies zur Zeit mit
der Version 2.10.3p3 des ircd.
I. General
~~~~~~~~~~
Q: Is it possible to link the ngIRCd with non-ngIRCd servers?
A: Yes. ngIRCd is compatible to the original ircd used by IRCNet. Actually
this is being tested with version 2.10.3p3.
Q: Gibt es eine Homepage mit Informationen und Downloads?
A: Ja. Die URL ist <http://arthur.ath.cx/~alex/ngircd/>.
Q: Is there a homepage with further information and downloads?
A: Yes. Please visit <http://ngircd.barton.de/>.
Q: Why should I use ngIRCd instead of the original one?
A: ngIRCd offers several benefits: no problems with dynamic IPs, easy to
configure, open source (GPL), under active development.
II. Compilieren
II. Compilation
~~~~~~~~~~~~~~~
Q: Ich habe die Sourcen von ngIRCd ueber CVS installiert. Nun kann ich
./configure nicht ausfuehren, da es nicht existiert!?
A: Bei Builds direkt aus dem CVS-Tree muss das configure-Script zunaechst
durch GNU autoconf sowie die Makefile.in's durch GNU automake generiert
werden. Um dies zu vereinfachen existiert das Script "./autogen.sh".
GNU automake und GNU autoconf werden -- im Gegensatz zu Builds aus den
Sourcen eines .tar.gz-Archivs -- hierbei benoetigt!
Q: I did a "CVS checkout" but can't execute ./configure because the script
is missing in the generated directory!?
A: When using development versions via CVS, the configure script as well as
the Makefile.in templates must be generated using GNU automake and GNU
autoconf. To simplify this task run the ./autogen.sh script which will
execute the required tools for you; then continue with executing the
./configure script as usual.
Q: ./autogen.sh bricht mit der Meldung "autoheader: command not found" ab.
A: GNU autoconf ist nicht installiert, wird jedoch bei Builds direkt aus
dem CVS-Tree benoetigt.
Q: The ./autogen.sh script complains "aclocal: command not found".
A: GNU automake is missing on your system but required for building CVS
versions of ngIRCd. Install GNU automake 1.6 or later and try again.
Q: ./autogen.sh bricht mit der Meldung "autoconf: Undefined macros:
AC_FUNC_MALLOC" bzw. "AC_CONFIG_SRCDIR" ab.
A: Auf dem System ist eine zu alte Version von GNU autoconf installiert.
Ein Update auf z.B. Version 2.52 loest dieses Problem (eine installiete
alte Version sollte ggf. zunaechst entfernt werden, bei RPM-Paketen z.B.
mit dem Befehl "rpm -e autoconf").
Q: The ./autogen.sh script stops with "autoheader: command not found".
A: GNU autoconf is missing on your system but required for building CVS
versions of ngIRCd. Install GNU autoconf 2.52 or later and try again.
Q: The ./autogen.sh script fails and the message "automake: configure.in:
AM_INIT_AUTOMAKE must be used" is displayed.
A: Most probably you are using version 1.5 of GNU automake which seems to be
incompatible to the build system of ngIRCd. Solution: upgrade to at least
version 1.6 of GNU automake.
(If you are using Debian 3.0 "Woody" you can try to downgrade to version
1.4 of GNU automake shipped with this distribution; it should work, too.)
III. Bugs!?
~~~~~~~~~~~
Q: Gibt es eine Liste der bekannten Bugs bzw. Feature-Wuensche?
A: Ja. Es existiert ein Bug-Tracking-System fuer den ngIRCd (Bugzilla):
URL: <http://arthur.ath.cx/bugzilla/ngircd/>. Dort koennen Bugs ge-
meldet und Feature-Wunsche kundgetan werden. Bekannte Bugs koennen in
der Datenbank gesucht und aufgelistet werden.
Einen Account zum Suchen und Melden von Bugs bzw. Feature-Wuenschen
kannst du dir dort selber anlegen.
III. Runtime
~~~~~~~~~~~~
Q: Was mache ich, wenn ich einen Bug gefunden habe?
A: Am besten traegst du ihn in das Bug-Tracking-System des ngIRCd ein:
URL: <http://arthur.ath.cx/bugzilla/ngircd/>
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!?
~~~~~~~~~~
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.
Q: What should I do if I found a bug?
A: Please file a bug report at <http://ngircd.barton.de/bugzilla/index.cgi>!
The author of the particular component will be notified automagically :-)
--
$Id: FAQ.txt,v 1.2 2002/02/19 20:05:02 alex Exp $
$Id: FAQ.txt,v 1.7.4.1 2005/07/09 14:41:39 alex Exp $

View File

@@ -1,6 +1,6 @@
#
# ngIRCd -- The Next Generation IRC Daemon
# Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
# Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
#
# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
# der GNU General Public License (GPL), wie von der Free Software Foundation
@@ -9,26 +9,34 @@
# 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.4 2002/02/25 14:10:38 alex Exp $
#
# $Log: Makefile.am,v $
# Revision 1.4 2002/02/25 14:10:38 alex
# - die neuen Texte werden nun auch in Archive ("make dist") aufgenommen ;-)
#
# Revision 1.3 2002/01/02 02:40:31 alex
# - Copyright-Text ergaenzt.
#
# Revision 1.2 2001/12/31 02:45:24 alex
# - nun werden alle generierten Dateien bei "maintainer-clean" geloescht.
#
# Revision 1.1 2001/12/31 02:22:29 alex
# - Makefile.am fuer das "doc"-Verzeichnis begonnen.
# $Id: Makefile.am,v 1.18 2005/04/27 07:52:29 alex Exp $
#
EXTRA_DIST = CC-Speed.txt CVS.txt FAQ.txt README-AUX.txt README-BeOS.txt \
RFC.txt sample-ngircd.conf
EXTRA_DIST = CVS.txt FAQ.txt Protocol.txt Platforms.txt \
README-AUX.txt README-BeOS.txt RFC.txt sample-ngircd.conf
maintainer-clean-local:
rm -f Makefile Makefile.in
distclean-local:
rm -rf src
docdir = $(datadir)/doc/$(PACKAGE)
documents = $(EXTRA_DIST) ../AUTHORS ../COPYING ../ChangeLog ../INSTALL \
../NEWS ../README
install-data-hook:
$(mkinstalldirs) $(DESTDIR)$(sysconfdir)
if [ ! -f $(DESTDIR)$(sysconfdir)/ngircd.conf ]; then \
$(INSTALL) -m 600 -c $(srcdir)/sample-ngircd.conf $(DESTDIR)$(sysconfdir)/ngircd.conf; \
fi
$(mkinstalldirs) $(DESTDIR)$(docdir)
for f in $(documents); do \
$(INSTALL) -m 644 -c $(srcdir)/$$f $(DESTDIR)$(docdir)/; \
done
uninstall-hook:
rm -rf $(DESTDIR)$(docdir)
# -eof-

65
doc/Platforms.txt Normal file
View File

@@ -0,0 +1,65 @@
ngIRCd - Next Generation IRC Server
(c)2001-2005 Alexander Barton
alex@barton.de, http://www.barton.de/
ngIRCd is free software and published under the
terms of the GNU General Public License.
-- Platforms.txt --
This file lists the status of all platforms on which the ngIRCd has been
tested. Included is the date and version of the last "official" test and
the name of the tester/maintainer.
If you successfully compiled and tested ngIRCd on a platform that isn't
listed here, please contact Alexander Barton, <alex@barton.de>, so that this
list can be updated. Thanks for your help!
the executable works ("runs") as expected --+
tests run successfully ("make check") --+ |
ngIRCd compiles ("make") --+ | |
./configure works --+ | | |
| | | |
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/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)
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
sparc/unkn./netbsdelf1.6.1 gcc 2.95.3 0.8.0 04-05-30 alex Y Y Y Y
Notes
~~~~~
(1) i686/pc/linux-gnu:
ngIRCd has been tested with various Linux distributions, such as SuSE,
RedHat, Debian, and Gentoo using Kernels 2.2.x, 2.4.x and 2.6.x with
various versions of the GNU C compiler (2.95.3, 3.0, 3.2, and 3.3). The
eldest glibc used was glibc-2.0.7. ngIRCd compiled and run on all these
systems without problems.
(2) This compiler is an pre-ANSI C compiler, therefore the source code is
automatically converted using the included ansi2knr tool while building.
--
$Id: Platforms.txt,v 1.13.2.2 2005/07/09 11:16:38 alex Exp $

118
doc/Protocol.txt Normal file
View File

@@ -0,0 +1,118 @@
ngIRCd - Next Generation IRC Server
(c)2001-2003 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.
-- Protocol.txt --
I. Compatibility
~~~~~~~~~~~~~~~~
The ngIRCd implements the Internet Relay Chat (IRC) protocol version 2.10
as defined in RFC ("request for comment") 1459 and 2810-2813. These (and
probably further relevant RFCs) are listed in doc/RFC.txt.
Unfortunately, even the "original" ircd doesn't follow these specifications
in all details. But because the ngIRCd should be a fully compatible
replacement for this server ("ircd") it tries to emulate these differences.
If you don't like this behavior please ./configure the ngIRCd using the
"--enable-strict-rfc" command line option. But keep in mind: not all IRC
clients are compatible with a server configured that way, some can't even
connect at all! Therefore this option usually isn't desired for "normal
server operation".
II. The IRC+ Protocol
~~~~~~~~~~~~~~~~~~~~~
Starting with version 0.5.0, the ngIRCd extends the original IRC protocol
as defined in RFC 2810-2813. This enhanced protocol is named "IRC+". It is
backwards compatible to the "plain" IRC protocol and will only be used by
the ngIRCd if it detects that the peer supports it as well.
The "PASS" command is used to detect the protocol and peer versions see
RFC 2813 (section 4.1.1) and below.
II.1 Register new server link
Command: PASS
Parameters: <password> <version> <flags> [<options>]
Used by: servers only (with these parameters)
<password> is the password for this new server link as defined in the server
configuration which is sent to the peer or received from it.
<version> consists of two parts and is at least 4, at most 14 characters
long: the first four bytes contain the IRC protocol version number, whereas
the first two bytes represent the major version, the last two bytes the
minor version (the string "0210" indicates version 2.10, e.g.).
The following optional(!) 10 bytes contain an implementation-dependent
version number. Servers supporting the IRC+ protocol as defined in this
document provide the string "-IRC+" here.
Example for <version>: "0210-IRC+".
<flags> consists of two parts separated with the character "|" and is at
most 100 bytes long. The first part contains the name of the implementation
(ngIRCd sets this to "ngircd", the original ircd to "IRC", e.g.). The second
part is implementation-dependent and should only be parsed if the peer
supports the IRC+ protocol as well. In this case the following syntax is
used: "<serverversion>[:<serverflags>]".
<serverversion> is an ASCII representation of the clear-text server version
number, <serverflags> indicates the supported IRC+ protocol extensions (and
may be empty!).
The following <serverflags> are defined at the moment:
- C: The server supports the CHANINFO command.
- L: INVITE- and BAN-lists should be synchronized between servers: if the
peer understands this flag, it will send "MODE +I" and "MODE +b"
commands after the server link has been established.
- o: IRC operators are allowed to change channel- and channel-user-modes
even if they aren't channel-operator of the affected channel.
- Z: Compressed server links are supported by the server.
Example for a complete <flags> string: "ngircd|0.7.5:CZ".
The optional parameter <options> is used to propagate server options as
defined in RFC 2813, section 4.1.1.
II.2 Exchange channel-modes, topics, and persistent channels
Command: CHANINFO
Parameters: <channel> +<modes> <key> <maxusers> [<topic>]
Used by: servers only
CHANINFO is used by servers to inform each other about a channel: its
modes, channel key, user limits and its topic. <topic> is optional.
If the channel already exists on the server receiving the CHANINFO command,
it only adopts the <modes> (or the <topic>) if there are no modes (or topic)
already set. It there are already values set the server ignores the
corresponding parameter.
If the channel doesn't exists at all it will be created.
The parameter <key> must be ignored if a channel has no key (the parameter
<modes> doesn't list the "k" channel mode). In this case <key> should
contain "*" because the parameter <key> is required by the CHANINFO syntax
and therefore can't be omitted. The parameter <limit> must be ignored when
a channel has no user limit (the parameter <modes> doesn't list the "l"
channel mode). In this case <limit> should be "0".
--
$Id: Protocol.txt,v 1.12 2004/04/25 15:44:10 alex Exp $

View File

@@ -1,47 +1,67 @@
ngIRCd - Next Generation IRC Server
ngIRCd - Next Generation IRC Server
(c)2001,2002 by Alexander Barton,
alex@barton.de, http://www.barton.de/
(c)2001-2005 Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd ist freie Software und steht unter
der GNU General Public License.
-- README-AUX.txt --
ngIRCd is free software and published under the
terms of the GNU General Public License.
Seit Version 0.2.2-pre gehoert Apple A/UX zu den offiziell unterstuetzten
Platformen. Er ist im vollen Funktionsumfang nutzbar.
Folgende Software wird jedoch benoetigt:
- GNU C Compiler (gcc)
Bezugsquellen:
http://www.rezepte-im-web.de/appleux/gcc281.tar.gz
ftp://arthur.ath.cx/pub/AUX/Software/Development/gcc281.tar.gz
- GNU make
Bezugsquellen:
http://www.rezepte-im-web.de/appleux/make-3.79.tar.gz
ftp://arthur.ath.cx/pub/AUX/Software/Development/make-3.79.tar.gz
- GNU sed
Bezugsquellen:
http://www.rezepte-im-web.de/appleux/sed-3.02.tar.gz
ftp://arthur.ath.cx/pub/AUX/Software/Tools/sed-3.02.tar.gz
- libUTIL.a
Bezugsquellen:
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
Nachdem diese Pakete entsprechend installiert sind, reicht ein ganz normales
"./configure" und "make" aus, um den ngIRCd unter A/UX zu compilieren.
-- README-AUX.txt --
Hier die Zeiten von Alex System (Macintosh SE/30, 32 MB, A/UX 3.0.1):
configure: 7:33, make: 12:02
Since version 0.2.2-pre Apple's A/UX belongs to the officially supported
platforms. It is not restricted in any way.
Since version 0.5.0 ngIRCd's source compiles with the native A/UX c
compiler. GNU C isn't a must-have anymore.
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
A/UX comes with /bin/sed which isn't supporting all functions needed
by GNU automake/autoconf.
Warning: When installing GNU sed please make sure that A/UX doesn't
use the old one anymore which means set the $PATH or replace /bin/sed
at all.
- 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
This library contains functions that are common on other UNIX
systems but not on A/UX e.g. memmove(), strerror() und strdup().
After installation of these packages just do a "./configure" and "make" to
compile ngIRCd on A/UX.
A few hints in case of errors:
- Either there's an 'install' on your system which is completely broken
(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
- The precompiled binary of the old 'bash' shouldn't be installed within
/bin (better do this in /usr/local/bin) because 'configure' would
choose it as its shell which wouldn't work.
- Because of limitations of /bin/sh on A/UX it can't be used to create
the 'config.status' script. Better rename /bin/sh to /bin/sh.AUX and
replace it by a symbolic link to /bin/ksh (ln -s /bin/ksh /bin/sh as
root).
These procedure should'nt cause you into problems and is recommended
even if you don't use ngIRCd.
--
$Id: README-AUX.txt,v 1.1 2002/02/25 14:02:32 alex Exp $
$Id: README-AUX.txt,v 1.9 2005/06/24 20:59:13 alex Exp $

View File

@@ -1,15 +1,21 @@
ngIRCd - Next Generation IRC Server
(c)2001,2002 by Alexander Barton,
(c)2001-2003 by Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd ist freie Software und steht unter
der GNU General Public License.
ngIRCd is free software and published under the
terms of the GNU General Public License.
-- README-BeOS.txt --
+-------------------------------------------------------------+
| This text is only available in german at the moment, sorry! |
| Contributors for this text or the BeOS port are welcome :-) |
+-------------------------------------------------------------+
BeOS gehoert im Moment (noch?) nicht zu den offiziell unterstuetzten Plat-
formen: der ngIRCd enthaelt zwar bereits einige Anpassungen an BeOS und
compiliert auch, jedoch bricht er bei jedem Connect-Versuch eines Clients
@@ -22,7 +28,7 @@ von Pipes verschiedener Prozesse umgehen kann: sobald der Resolver asyncron
gestartet wird, also Pipe-Handles im select() vorhanden sind, fuehrt das zu
obiger Meldung.
Theoretische "L<EFBFBD>sung"/Workaround:
Theoretische "Loesung"/Workaround:
Den Resolver unter BeOS nicht verwenden, sondern mit IP-Adressen arbeiten.
Nachteil: der ngIRCd koennte sich nicht zu Servern verbinden, die dynamische
Adressen benutzen -- dazu muesste er den Namen aufloesen. Ansonsten sollte
@@ -32,5 +38,16 @@ Also: wenn es jemand implementieren will ... ;-))
Vielleicht mache ich es auch irgendwann mal selber. Mal sehen.
2002-05-19:
Ich habe gerade damit ein wenig gespielt und den Source hier so geaendert,
dass unter BeOS keine Resolver-Subprozesse mehr erzeugt werden, sondern mit
den "rohen" IP-Adressen gearbeitet wird. Das funktioniert so weit auch,
allerdings verschluckt sich BeOS nun bei anderen Funktionen, so zum Beispiel
bei close(), wenn ein Socket eines Clients geschlossen werden soll!?
Sehr komisch.
Wer Interesse daran hat, das weiter zu verfolgen, der moege sich bitte mit
mir in Verbindung setzen (alex@barton.de), ich maile gerne meine Patches zu.
Fuer eine Aenderung im CVS ist es aber meiner Meinung nach noch zu frueh ...
--
$Id: README-BeOS.txt,v 1.1 2002/02/25 14:02:32 alex Exp $
$Id: README-BeOS.txt,v 1.7 2003/05/15 21:47:57 alex Exp $

View File

@@ -1,16 +1,17 @@
ngIRCd - Next Generation IRC Server
(c)2001,2002 by Alexander Barton,
(c)2001-2003 by Alexander Barton,
alex@barton.de, http://www.barton.de/
ngIRCd ist freie Software und steht unter
der GNU General Public License.
ngIRCd is free software and published under the
terms of the GNU General Public License.
-- RFC.txt --
Das IRC-Protokoll ist in diesen RFC's (Request For Comments) dokumentiert:
The Internet Relay Chat (IRC) protocol is documented in these Request for
Comments (RFC), which you can get e.g. via <http://www.faqs.org/>:
1459 Oikarinen, J. & D. Reed, "Internet Relay Chat Protocol",
May 1993, [IRC].
@@ -29,4 +30,4 @@ Das IRC-Protokoll ist in diesen RFC's (Request For Comments) dokumentiert:
--
$Id: RFC.txt,v 1.4 2002/01/23 18:20:04 alex Exp $
$Id: RFC.txt,v 1.6 2003/03/07 20:42:20 alex Exp $

58
doc/SSL.txt Normal file
View File

@@ -0,0 +1,58 @@
ngIRCd - Next Generation IRC Server
(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.
-- SSL.txt --
ngIRCd actually doesn't support secure connections for client-server or
server-server links using SSL, the Secure Socket Layer, by itself. But you can
use the stunnel(8) command to make this work.
<http://stunnel.mirt.net/>
<http://www.stunnel.org/>
Stefan Sperling (stefan at binarchy dot net) mailed me the following text as a
short "how-to", thanks Stefan!
=== snip ===
! This guide applies to stunnel 4.x !
Put this in your stunnel.conf:
[ircs]
accept = 6667
connect = 6668
This makes stunnel listen for incoming connections
on port 6667 and forward decrypted data to port 6668.
We call the connection 'ircs'. Stunnel will use this
name when logging connection attempts via syslog.
You can also use the name in /etc/hosts.{allow,deny}
if you run tcp-wrappers.
To make sure ngircd is listening on the port where
the decrypted data arrives, set
Ports = 6668
in your ngircd.conf.
Start stunnel and restart ngircd.
That's it.
Don't forget to activate ssl support in your irc client ;)
=== snip ===
Probably ngIRCd will include support for SSL in the future ...
--
$Id: SSL.txt,v 1.2 2004/12/27 01:11:40 alex Exp $

View File

@@ -1,27 +1,181 @@
# $Id: sample-ngircd.conf,v 1.3 2002/02/17 17:34:50 alex Exp $
# $Id: sample-ngircd.conf,v 1.33 2005/03/15 16:58:01 alex Exp $
#
# This is a sample configuration file for the ngIRCd, which must be adepted
# to the local preferences and needs.
#
# Comments are started with "#" or ";".
#
# Use "ngircd --configtest" (see manual page ngircd(8)) to validate that the
# server interpreted the configuration file as expected!
#
[Global]
# The [Global] section of this file is used to define the main
# configuration of the server, like the server name and the ports
# on which the server should be listening.
# Server name in the IRC network, must contain at least one dot
# (".") and be unique in the IRC network. Required!
Name = irc.the.net
# Info text of the server. This will be shown by WHOIS and
# LINKS requests for example.
Info = Server Info Text
Ports = 6667, 6668, 6669
MotdFile = /usr/local/etc/ngircd.motd
PingTimeout = 120
PongTimeout = 10
ConnectRetry = 60
# Global password for all users needed to connect to the server
;Password = abc
# Information about the server and the administrator, used by the
# ADMIN command. Not required by server but by RFC!
;AdminInfo1 = Description
;AdminInfo2 = Location
;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
# IP address on which the server should listen. (Default: empty,
# so the server listens on all IP addresses of the system)
;Listen = 1.2.3.4
# Text file with the "message of the day" (MOTD). This message will
# be shown to all users connecting to the server:
;MotdFile = /usr/local/etc/ngircd.motd
# 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.
;MotdPhrase = "Hello world!"
# User ID under which the server should run; you can use the name
# of the user or the numerical ID. ATTENTION: For this to work the
# server must have been started with root privileges! In addition,
# the configuration and MOTD files must be readable by this user,
# otherwise RESTART and REHASH won't work!
;ServerUID = 65534
# Group ID under which the ngircd should run; you can use the name
# of the group or the numerical ID. ATTENTION: For this to work the
# server must have been started with root privileges!
;ServerGID = 65534
# A directory to chroot in when everything is initialized. It
# doesn't need to be populated if ngIRCd is compiled as a static
# binary. By default ngIRCd won't use the chroot() feature.
# ATTENTION: For this to work the server must have been started
# 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
# If a client fails to answer a PING with a PONG within <PongTimeout>
# seconds, it will be disconnected by the server.
;PongTimeout = 20
# The server tries every <ConnectRetry> seconds to establish a link
# to not yet (or no longer) connected servers.
;ConnectRetry = 60
# Should IRC Operators be allowed to use the MODE command even if
# 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
# Maximum number of simultaneous connections from a single IP address
# the server will accept (<=0: unlimited):
;MaxConnectionsIP = 5
# Maximum number of channels a user can be member of (<=0: no limit):
;MaxJoins = 10
[Operator]
; Name = TheOper
; Password = ThePwd
# [Operator] sections are used to define IRC Operators. There may be
# more than one [Operator] block, one for each local operator.
# ID of the operator (may be different of the nick name)
;Name = TheOper
# 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]
; Host = connect-to-host.the.net
; Name = irc2.the.net
; Port = 6666
; Password = ThePwd1
# Other servers are configured in [Server] sections. If you
# configure a port for the connection, then this ngircd tries to
# connect to to the other server on the given port; if not it waits
# for the other server to connect.
# There may be more than one server block.
#
# Server Groups:
# The ngIRCd allows "server groups": You can assign an "ID" to every
# server with which you want this ngIRCd to link. If a server of a
# group won't answer, the ngIRCd tries to connect to the next server
# in the given group. But the ngircd never tries to connect to two
# servers with the same group ID.
# IRC name of the server
;Name = irc2.the.net
# Internet host name of the peer
;Host = connect-to-host.the.net
# Port of the server to which the ngIRCd should connect. If you
# assign no port the ngIRCd waits for incoming connections.
;Port = 6666
# Own password for the connection. This password has to be configured
# as "PeerPassword" on the other server.
;MyPassword = MySecret
# Foreign password for this connection. This password has to be
# configured as "MyPassword" on the other server.
;PeerPassword = PeerSecret
# Group of this server (optional)
;Group = 123
[Server]
; Host = wait-for-host.the.net
; Name = irc3.the.net
; Password = ThePwd2
# 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
# persist when there are no more members left.
# Persistent channels are marked with the mode 'P', which can be set
# and unset by IRC operators like other modes on the fly.
# There may be more than one [Channel] block.
# Name of the channel
;Name = #TheName
# Topic for this channel
;Topic = a great topic
# Initial channel modes
;Modes = tn
[Channel]
# More [Channel] sections, if you like ...
# -eof-

View File

@@ -9,18 +9,12 @@
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
#
# $Id: Makefile.am,v 1.2 2002/01/02 02:40:15 alex Exp $
#
# $Log: Makefile.am,v $
# Revision 1.2 2002/01/02 02:40:15 alex
# - Copyright-Texte ergaenzt und aktualisiert,
# - fehlende Dateien in Projekt aufgenommen.
#
# Revision 1.1 2001/12/31 16:02:12 alex
# - Projektdateien von Mac OS X werden nun auch in die Distribution aufgenommen.
# $Id: Makefile.am,v 1.5 2002/04/04 13:02:41 alex Exp $
#
EXTRA_DIST = project.pbxproj
man_MANS = ngircd.conf.5 ngircd.8
EXTRA_DIST = $(man_MANS)
maintainer-clean-local:
rm -f Makefile Makefile.in

80
man/ngircd.8 Normal file
View File

@@ -0,0 +1,80 @@
.\"
.\" $Id: ngircd.8,v 1.10 2005/06/04 13:39:20 alex Exp $
.\"
.TH ngircd 8 "Juni 2005" ngircd "ngIRCd Manual"
.SH NAME
ngIRCd \- the next generation IRC daemon
.SH SYNOPSIS
.B ngircd [
.I Options
.B ]
.SH DESCRIPTION
.BR ngIRCd
is a free open source daemon for the Internet Relay Chat (IRC),
developed under the GNU General Public License (GPL).
.PP
It's written from scratch and is not based upon the original IRCd like
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.
.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.
.SH OPTIONS
The default behaviour of
.BR ngircd
is to read its standard configuration file (see below), to detach from the
controlling terminal and to wait for clients.
.PP
You can use these options to modify this default:
.TP
\fB\-f\fR \fIfile\fR, \fB\-\-config\fR \fIfile\fR
Use
.I file
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.
.TP
\fB\-p\fR, \fB\-\-passive\fR
Disable automatic connections to other servers. You can use the IRC command
CONNECT later on as IRC Operator to link this ngIRCd to other servers.
.TP
\fB\-t\fR, \fB\-\-configtest\fR
Read, validate and display the configuration; then exit.
.TP
\fB\-\-version\fR
Output version information and exit.
.TP
\fB\-\-help\fR
Display a brief help text and exit.
.SH FILES
.I /usr/local/etc/ngircd.conf
.RS
The system wide default configuration file.
.RE
.I /usr/local/etc/ngircd.motd
.RS
Default "message of the day" (MOTD).
.RE
.SH AUTHOR
Alexander Barton,
.UR mailto:alex@barton.de
alex@barton.de
.UE
.br
Homepage:
.UR http://arthur.ath.cx/~alex/ngircd/
http://arthur.ath.cx/~alex/ngircd/
.UE
.SH "SEE ALSO"
.BR ngircd.conf (5),
.BR ircd (8)
.\"
.\" -eof-

250
man/ngircd.conf.5 Normal file
View File

@@ -0,0 +1,250 @@
.\"
.\" $Id: ngircd.conf.5,v 1.18 2005/06/04 13:39:20 alex Exp $
.\"
.TH ngircd.conf 5 "Juni 2005" ngircd "ngIRCd Manual"
.SH NAME
ngircd.conf \- configuration file of ngIRCd
.SH SYNOPSIS
.B /usr/local/etc/ngircd.conf
.SH DESCRIPTION
.BR ngircd.conf
is the configuration file for
.BR ngircd (8)
which you should adept to your local preferences and needs.
.SH "FILE FORMAT"
The file consists of sections and parameters. A section begins with the name
of the section in square brackets and continues until the next section
begins.
.PP
Sections contain parameters of the form
.PP
.RS
.I name
=
.I value
.RE
.PP
Any line beginning with a semicolon (';') or a hash ('#') character is
treated as a comment and ignored.
.PP
The file format is line-based - that means, each newline-terminated line
represents either a comment, a section name or a parameter.
.PP
Section and parameter names are not case sensitive.
.SH "SECTION OVERVIEW"
The file can contain blocks of four types: [Global], [Operator], [Server],
and [Channel].
.PP
In the
.I [Global]
section, there is the main configuration like the server name and the
ports on which the server should be listening. IRC operators of this
server are defined in
.I [Operator]
blocks.
.I [Server]
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]
section is used to define the server main configuration, like the server
name and the ports on which the server should be listening.
.TP
\fBName\fR
Server name in the IRC network
.TP
\fBInfo\fR
Info text of the server. This will be shown by WHOIS and LINKS requests for
example.
.TP
\fBAdminInfo1\fR, \fBAdminInfo2\fR, \fBAdminEMail\fR
Information about the server and the administrator, used by the ADMIN
command.
.TP
\fBPorts\fR
Ports on which the server should listen. There may be more than one port,
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.
.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.
If it is set no MotdFile will be read at all.
.TP
\fBServerUID\fR
User ID under which the server should run; you can use the name of the user
or the numerical ID.
.PP
.RS
.B Attention:
.br
For this to work the server must have been
started with root privileges! In addition, the configuration and MOTD files
must be readable by this user, otherwise RESTART and REHASH won't work!
.RE
.TP
\fBServerGID\fR
Group ID under which the ngIRCd should run; you can use the name of the
group or the numerical ID.
.PP
.RS
.B Attention:
.br
For this to work the server must have
been started with root privileges!
.RE
.TP
\fBChrootDir\fR
A directory to chroot in when everything is initialized. It doesn't need
to be populated if ngIRCd is compiled as a static binary. By default ngIRCd
won't use the chroot() feature.
.PP
.RS
.B Attention:
.br
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.
.TP
\fBPongTimeout\fR
If a client fails to answer a PING with a PONG within <PongTimeout>
seconds, it will be disconnected by the server. Default: 20.
.TP
\fBConnectRetry\fR
The server tries every <ConnectRetry> seconds to establish a link to not yet
(or no longer) connected servers. Default: 60.
.TP
\fBOperCanUseMode\fR
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.
.TP
\fBMaxConnectionsIP\fR
Maximum number of simultaneous connections from a single IP address that
the server will accept (<=0: unlimited). This configuration options lowers
the risk of denial of service attacks (DoS). Default: 5.
.TP
\fBMaxJoins\fR
Maximum number of channels a user can be member of (<=0: no limit).
Default: 10.
.SH [OPERATOR]
.I [Operator]
sections are used to define IRC Operators. There may be more than one
.I [Operator]
block, one for each local operator.
.TP
\fBName\fR
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]
sections. If you configure a port for the connection, then this ngIRCd
tries to connect to to the other server on the given port; if not, it waits
for the other server to connect.
.PP
The ngIRCd allows "server groups": You can assign an "ID" to every server
with which you want this ngIRCd to link. If a server of a group won't
answer, the ngIRCd tries to connect to the next server in the given group.
But ngIRCd never tries to connect to two servers with the same group ID.
.PP
There may be more than one
.I [Server]
block.
.TP
\fBName\fR
IRC name of the server
.TP
\fBHost\fR
Internet host name of the peer
.TP
\fBPort\fR
Port of the server to which the ngIRCd should connect. If you assign no port
the ngIRCd waits for incoming connections.
.TP
\fBMyPassword\fR
Own password for this connection. This password has to be configured as
"PeerPassword" on the other server.
.TP
\fBPeerPassword\fR
Foreign password for this connection. This password has to be configured as
"MyPassword" on the other server.
.TP
\fBGroup\fR
Group of this server (optional).
.SH [CHANNEL]
Pre-defined channels can be configured in
.I [Channel]
sections. Such channels are created by the server when starting up and even
persist when there are no more members left.
.PP
Persistent channels are marked with the mode 'P', which can be set and unset
by IRC operators like other modes on the fly.
.PP
There may be more than one
.I [Channel]
block.
.TP
\fBName\fR
Name of the channel
.TP
\fBTopic\fR
Topic for this channel
.TP
\fBModes\fR
Initial channel modes.
.SH HINTS
It's wise to use "ngircd --configtest" to validate the configuration file
after changing it. See
.BR ngircd (8)
for details.
.SH AUTHOR
Alexander Barton,
.UR mailto:alex@barton.de
alex@barton.de
.UE
.br
Homepage:
.UR http://arthur.ath.cx/~alex/ngircd/
http://arthur.ath.cx/~alex/ngircd/
.UE
.SH "SEE ALSO"
.BR ngircd (8)
.\"
.\" -eof-

137
src/Doxyfile Normal file
View File

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

View File

@@ -2,26 +2,23 @@
# ngIRCd -- The Next Generation IRC Daemon
# Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
#
# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
# der GNU General Public License (GPL), wie von der Free Software Foundation
# herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
# der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information.
#
# $Id: Makefile.am,v 1.2 2002/01/02 02:41:11 alex Exp $
#
# $Log: Makefile.am,v $
# Revision 1.2 2002/01/02 02:41:11 alex
# - fehlenden Copyright-Text ergaenzt.
#
# Revision 1.1.1.1 2001/12/11 21:53:04 alex
# Imported sources to CVS.
# $Id: Makefile.am,v 1.6 2005/04/09 12:22:41 alex Exp $
#
SUBDIRS = ngircd
SUBDIRS = portab tool ngircd testsuite
maintainer-clean-local:
rm -f Makefile Makefile.in config.h config.h.in stamp-h.in
srcdoc:
@doxygen --version >/dev/null 2>&1 \
|| ( echo; echo "Error: \"doxygen\" not found!"; echo; exit 1 )
doxygen
# -eof-

View File

@@ -1,77 +1,49 @@
#
# ngIRCd -- The Next Generation IRC Daemon
# Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
# Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
#
# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
# der GNU General Public License (GPL), wie von der Free Software Foundation
# herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
# der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information.
#
# $Id: Makefile.am,v 1.13 2002/02/27 23:22:09 alex Exp $
#
# $Log: Makefile.am,v $
# Revision 1.13 2002/02/27 23:22:09 alex
# - einige Header umgestellt, neue Source-Dateien irc-xxx.c
#
# Revision 1.12 2002/02/21 18:47:49 alex
# - die Rechte der check-Scripts wurde nicht gesetzt.
#
# Revision 1.11 2002/02/21 17:25:16 alex
# - "check"-Target f<>r "make check" und "make distcheck" begonnen ...
#
# Revision 1.10 2002/01/02 02:43:50 alex
# - Copyright-Text ergaenzt bzw. aktualisiert.
#
# Revision 1.9 2001/12/31 02:18:51 alex
# - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
# - neuen Header "defines.h" mit (fast) allen Konstanten.
# - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
#
# Revision 1.8 2001/12/30 19:25:03 alex
# - in "noinst_HEADERS" waren einige Dateien als .c anstelle .h aufgefuehrt.
#
# Revision 1.7 2001/12/27 00:37:07 alex
# - Erkennung der "portab header" geaendert, CFLAGS werden nun anders gesetzt.
#
# Revision 1.6 2001/12/23 21:53:54 alex
# - Header messages.h eingefuegt.
#
# Revision 1.5 2001/12/21 22:25:30 alex
# - neues Modul "parse" eingebunden.
#
# Revision 1.4 2001/12/14 08:14:03 alex
# - neue Module (irc, client, channel) aufgenommen.
#
# Revision 1.3 2001/12/13 02:03:33 alex
# - beim Compilieren werden nun Informationen fuer den Debugger erzeugt.
#
# Revision 1.2 2001/12/12 17:20:02 alex
# - neue Sourcefiles und Header ergaenzt.
#
# Revision 1.1.1.1 2001/12/11 21:53:04 alex
# - Imported sources to CVS.
# $Id: Makefile.am,v 1.46 2005/05/23 00:11:15 alex Exp $
#
AUTOMAKE_OPTIONS = ../portab/ansi2knr
INCLUDES = -I$(srcdir)/../portab -I$(srcdir)/../tool
LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN \
-varuse -retvalother -emptyret -unrecog
sbin_PROGRAMS = ngircd
ngircd_SOURCES = ngircd.c channel.c client.c conf.c conn.c irc.c \
irc-login.c irc-mode.c irc-write.c log.c parse.c tool.c
ngircd_SOURCES = ngircd.c channel.c client.c conf.c conn.c conn-zip.c conn-func.c \
hash.c irc.c irc-channel.c irc-info.c irc-login.c irc-mode.c irc-op.c \
irc-oper.c irc-server.c irc-write.c lists.c log.c match.c parse.c \
rendezvous.c resolve.c
noinst_HEADERS = ngircd.h channel.h client.h conf.h conn.h irc.h \
irc-login.h irc-mode.h irc-write.h log.h parse.h tool.h \
global.h messages.h defines.h
ngircd_LDFLAGS = -L../portab -L../tool
ngircd_LDADD = -lngportab -lngtool
noinst_HEADERS = ngircd.h channel.h client.h conf.h conn.h conn-zip.h conn-func.h \
hash.h irc.h irc-channel.h irc-info.h irc-login.h irc-mode.h irc-op.h \
irc-oper.h irc-server.h irc-write.h lists.h log.h match.h parse.h \
rendezvous.h resolve.h \
messages.h defines.h
clean-local:
rm -f check-version check-help
rm -f check-version check-help lint.out cvs-version.*
maintainer-clean-local:
rm -f Makefile Makefile.in
check-version: Makefile
echo "#!/bin/sh" > check-version
echo "./ngircd --version | grep version > /dev/null 2>&1" >> check-version
echo "./ngircd --version | grep ngircd > /dev/null 2>&1" >> check-version
chmod 755 check-version
check-help: Makefile
@@ -79,6 +51,49 @@ check-help: Makefile
echo "./ngircd --help | grep help > /dev/null 2>&1" >> check-help
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; \
for f in *.c; do \
echo "checking $$f ..."; \
splint $$f $(LINTARGS) -I$(srcdir) -I$(srcdir)/.. \
$(INCLUDES) $(AM_CFLAGS) >lint.out 2>&1; \
grep "no warnings" lint.out > /dev/null 2>&1; \
if [ $$? -ne 0 ]; then \
waswarning=1; \
echo; grep -v "^Command Line: " lint.out; echo; \
w=$$( grep "code warning" lint.out | awk "{ print \$$4 }" ); \
[ "$$w" -gt 0 ] && warnings=`expr $$warnings + $$w`; \
files=`expr $$files + 1`; \
else \
waswarning=0; \
fi; \
rm -f lint.out; \
done; \
[ $$waswarning -eq 0 ] && echo; \
[ $$warnings -gt 0 ] \
&& echo "Result: $$warnings warning(s) in $$files file(s)!" \
|| echo "Result: no warnings found."; \
echo; [ $$warnings -gt 0 ] && exit 1
ngircd.c: cvs-version.h
irc-login.c: cvs-version.h
irc-info.c: cvs-version.h
cvs-version.h: cvs-date
cvs-date:
grep VERSION ../config.h | grep "CVS" \
&& echo "#define CVSDATE \"$$( grep "\$$Id" $(srcdir)/*.c \
| $(AWK) "{ print \$$9 }" | sort | tail -1 \
| sed -e "s/\//-/g" )\"" > cvs-version.new \
|| echo "" > cvs-version.new
diff cvs-version.h cvs-version.new 2>/dev/null \
|| cp cvs-version.new cvs-version.h
TESTS = check-version check-help
# -eof-

View File

@@ -1,119 +1,120 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
* Copyright (c)2001-2005 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* 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: channel.c,v 1.17 2002/03/02 01:35:50 alex Exp $
*
* channel.c: Management der Channels
*
* $Log: channel.c,v $
* Revision 1.17 2002/03/02 01:35:50 alex
* - Channel- und Nicknames werden nun ordentlich validiert.
*
* Revision 1.16 2002/02/27 23:23:53 alex
* - Includes fuer einige Header bereinigt.
*
* Revision 1.15 2002/02/27 20:32:10 alex
* - neue Funktionen Channel_Topic() und Channel_SetTopic().
*
* Revision 1.14 2002/02/27 15:21:21 alex
* - neue Funktion Channel_IsMemberOf() implementiert.
*
* Revision 1.13 2002/02/11 01:00:12 alex
* - neue Funktionen Channel_ModeAdd(), Channel_ModeDel(), Channel_UserModes(),
* Channel_UserModeAdd(), Channel_UserModeDel().
* - Modes in CL2CHAN-Struktur werden nun korrekt initialisiert.
*
* Revision 1.12 2002/02/06 16:48:48 alex
* - neue Funktion Channel_Modes() und Channel_IsValidName().
* - Channel-Namen werden (besser) validiert.
*
* Revision 1.11 2002/01/29 00:11:10 alex
* - neue Funktionen Channel_FirstChannelOf() und Channel_NextChannelOf().
*
* Revision 1.10 2002/01/28 01:16:15 alex
* - neue Funktionen Channel_Name(), Channel_First() und Channel_Next().
*
* Revision 1.9 2002/01/27 22:47:11 alex
* - PART wird nicht mehr an den Server verschickt, von dem es empfangen wurde.
*
* Revision 1.8 2002/01/27 21:56:54 alex
* - weitere Anpassungen an Chennals, v.a. ueber Server-Links.
*
* Revision 1.7 2002/01/27 17:14:33 alex
* - diverse Aenderungen fuer Channels ueber mehrere Server.
*
* Revision 1.6 2002/01/26 18:41:55 alex
* - CHANNEL- und CL2CHAN-Strukturen in Header verlegt,
* - einige neue Funktionen (Channel_GetChannel(), Channel_FirstMember(), ...)
*
* Revision 1.5 2002/01/21 00:12:29 alex
* - begonnen, Channels zu implementieren :-)
*
* Revision 1.4 2002/01/16 22:09:07 alex
* - neue Funktion Channel_Count().
*
* Revision 1.3 2002/01/02 02:42:58 alex
* - Copyright-Texte aktualisiert.
*
* Revision 1.2 2001/12/31 02:18:51 alex
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
* - neuen Header "defines.h" mit (fast) allen Konstanten.
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
*
* Revision 1.1 2001/12/14 08:13:43 alex
* - neues Modul begonnen :-)
* Channel management
*/
#define __channel_c__
#include <portab.h>
#include "global.h"
#include "portab.h"
#include <imp.h>
static char UNUSED id[] = "$Id: channel.c,v 1.50 2005/06/18 08:57:37 fw Exp $";
#include "imp.h"
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include "defines.h"
#include "conn-func.h"
#include "client.h"
#include "exp.h"
#include "channel.h"
#include "imp.h"
#include "irc-write.h"
#include "resolve.h"
#include "conf.h"
#include "hash.h"
#include "lists.h"
#include "log.h"
#include "messages.h"
#include <exp.h>
#include "channel.h"
#include "exp.h"
#define REMOVE_PART 0
#define REMOVE_QUIT 1
#define REMOVE_KICK 2
LOCAL CHANNEL *My_Channels;
LOCAL CL2CHAN *My_Cl2Chan;
LOCAL CHANNEL *New_Chan( CHAR *Name );
LOCAL CL2CHAN *Get_Cl2Chan( CHANNEL *Chan, CLIENT *Client );
LOCAL CL2CHAN *Add_Client( CHANNEL *Chan, CLIENT *Client );
LOCAL BOOLEAN Remove_Client( CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Reason, BOOLEAN ServerPART );
LOCAL CL2CHAN *Get_First_Cl2Chan( CLIENT *Client, CHANNEL *Chan );
LOCAL CL2CHAN *Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Chan );
LOCAL BOOLEAN Delete_Channel( CHANNEL *Chan );
LOCAL CL2CHAN *Get_Cl2Chan PARAMS(( CHANNEL *Chan, CLIENT *Client ));
LOCAL CL2CHAN *Add_Client PARAMS(( CHANNEL *Chan, CLIENT *Client ));
LOCAL bool Remove_Client PARAMS(( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Reason, bool InformServer ));
LOCAL CL2CHAN *Get_First_Cl2Chan PARAMS(( CLIENT *Client, CHANNEL *Chan ));
LOCAL CL2CHAN *Get_Next_Cl2Chan PARAMS(( CL2CHAN *Start, CLIENT *Client, CHANNEL *Chan ));
LOCAL bool Delete_Channel PARAMS(( CHANNEL *Chan ));
GLOBAL VOID Channel_Init( VOID )
GLOBAL void
Channel_Init( void )
{
My_Channels = NULL;
My_Cl2Chan = NULL;
} /* Channel_Init */
GLOBAL VOID Channel_Exit( VOID )
GLOBAL void
Channel_InitPredefined( void )
{
/* Vordefinierte persistente Channels erzeugen */
CHANNEL *chan;
char *c;
int i;
for( i = 0; i < Conf_Channel_Count; i++ )
{
/* Ist ein Name konfiguriert? */
if( ! Conf_Channel[i].name[0] ) continue;
/* Gueltiger Channel-Name? */
if( ! Channel_IsValidName( Conf_Channel[i].name ))
{
Log( LOG_ERR, "Can't create pre-defined channel: invalid name: \"%s\"!", Conf_Channel[i].name );
continue;
}
/* Gibt es den Channel bereits? */
chan = Channel_Search( Conf_Channel[i].name );
if( chan )
{
Log( LOG_INFO, "Can't create pre-defined channel \"%s\": name already in use.", Conf_Channel[i].name );
continue;
}
/* Channel anlegen */
chan = Channel_Create( Conf_Channel[i].name );
if( chan )
{
Channel_ModeAdd( chan, 'P' );
Channel_SetTopic( chan, Conf_Channel[i].topic );
c = Conf_Channel[i].modes;
while( *c ) Channel_ModeAdd( chan, *c++ );
Log( LOG_INFO, "Created pre-defined channel \"%s\".", Conf_Channel[i].name );
}
else Log( LOG_ERR, "Can't create pre-defined channel \"%s\"!", Conf_Channel[i].name );
}
} /* Channel_InitPredefined */
GLOBAL void
Channel_Exit( void )
{
CHANNEL *c, *c_next;
CL2CHAN *cl2chan, *cl2chan_next;
@@ -138,7 +139,8 @@ GLOBAL VOID Channel_Exit( VOID )
} /* Channel_Exit */
GLOBAL BOOLEAN Channel_Join( CLIENT *Client, CHAR *Name )
GLOBAL bool
Channel_Join( CLIENT *Client, char *Name )
{
CHANNEL *chan;
@@ -149,7 +151,7 @@ GLOBAL BOOLEAN 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 */
@@ -157,68 +159,113 @@ GLOBAL BOOLEAN 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 = New_Chan( Name );
if( ! chan ) return FALSE;
/* Verketten */
chan->next = My_Channels;
My_Channels = chan;
chan = Channel_Create( Name );
if( ! chan ) return false;
}
/* User dem Channel hinzufuegen */
if( ! Add_Client( chan, Client )) return FALSE;
else return TRUE;
if( ! Add_Client( chan, Client )) return false;
else return true;
} /* Channel_Join */
GLOBAL BOOLEAN Channel_Part( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason )
GLOBAL bool
Channel_Part( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason )
{
CHANNEL *chan;
assert( Client != NULL );
assert( Name != NULL );
assert( Reason != NULL );
/* Channel suchen */
chan = Channel_Search( Name );
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( 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_RemoveClient( CLIENT *Client, CHAR *Reason )
GLOBAL void
Channel_Kick( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason )
{
CHANNEL *chan;
assert( Client != NULL );
assert( Origin != NULL );
assert( Name != NULL );
assert( Reason != NULL );
/* Channel suchen */
chan = Channel_Search( Name );
if( ! chan )
{
IRC_WriteStrClient( Origin, ERR_NOSUCHCHANNEL_MSG, Client_ID( Origin ), Name );
return;
}
/* Ist der User Mitglied in dem Channel? */
if( ! Channel_IsMemberOf( chan, Origin ))
{
IRC_WriteStrClient( Origin, ERR_NOTONCHANNEL_MSG, Client_ID( Origin ), Name );
return;
}
/* Ist der User Channel-Operator? */
if( ! strchr( Channel_UserModes( chan, Origin ), 'o' ))
{
IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Name);
return;
}
/* Ist der Ziel-User Mitglied im Channel? */
if( ! Channel_IsMemberOf( chan, Client ))
{
IRC_WriteStrClient( Origin, ERR_USERNOTINCHANNEL_MSG, Client_ID( Origin ), Client_ID( Client ), Name );
return;
}
Remove_Client( REMOVE_KICK, chan, Client, Origin, Reason, true);
} /* Channel_Kick */
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( c, Client, Client_ThisServer( ), Reason, FALSE );
Remove_Client( REMOVE_QUIT, c, Client, Client, Reason, false );
c = next_c;
}
} /* Channel_RemoveClient */
} /* Channel_Quit */
GLOBAL INT Channel_Count( VOID )
GLOBAL long
Channel_Count( void )
{
CHANNEL *c;
INT count;
long count = 0;
count = 0;
c = My_Channels;
while( c )
{
@@ -229,58 +276,146 @@ GLOBAL INT Channel_Count( VOID )
} /* Channel_Count */
GLOBAL CHAR *Channel_Name( CHANNEL *Chan )
GLOBAL long
Channel_MemberCount( CHANNEL *Chan )
{
CL2CHAN *cl2chan;
long count = 0;
assert( Chan != NULL );
cl2chan = My_Cl2Chan;
while( cl2chan )
{
if( cl2chan->channel == Chan ) count++;
cl2chan = cl2chan->next;
}
return count;
} /* Channel_MemberCount */
GLOBAL int
Channel_CountForUser( CLIENT *Client )
{
/* Count number of channels a user is member of. */
CL2CHAN *cl2chan;
int count = 0;
assert( Client != NULL );
cl2chan = My_Cl2Chan;
while( cl2chan )
{
if( cl2chan->client == Client ) count++;
cl2chan = cl2chan->next;
}
return count;
} /* Channel_CountForUser */
GLOBAL int
Channel_PCount( void )
{
/* Count the number of persistent (mode 'P') channels */
CHANNEL *chan;
int count = 0;
chan = My_Channels;
while( chan )
{
if( strchr( chan->modes, 'P' )) count++;
chan = chan->next;
}
return count;
} /* Channel_PCount */
GLOBAL char *
Channel_Name( CHANNEL *Chan )
{
assert( Chan != NULL );
return Chan->name;
} /* Channel_Name */
GLOBAL CHAR *Channel_Modes( CHANNEL *Chan )
GLOBAL char *
Channel_Modes( CHANNEL *Chan )
{
assert( Chan != NULL );
return Chan->modes;
} /* Channel_Modes */
GLOBAL CHANNEL *Channel_First( VOID )
GLOBAL char *
Channel_Key( CHANNEL *Chan )
{
assert( Chan != NULL );
return Chan->key;
} /* Channel_Key */
GLOBAL long
Channel_MaxUsers( CHANNEL *Chan )
{
assert( Chan != NULL );
return Chan->maxusers;
} /* Channel_MaxUsers */
GLOBAL CHANNEL *
Channel_First( void )
{
return My_Channels;
} /* Channel_First */
GLOBAL CHANNEL *Channel_Next( CHANNEL *Chan )
GLOBAL CHANNEL *
Channel_Next( CHANNEL *Chan )
{
assert( Chan != NULL );
return Chan->next;
} /* Channel_Next */
GLOBAL CHANNEL *Channel_Search( CHAR *Name )
GLOBAL CHANNEL *
Channel_Search( char *Name )
{
/* Channel-Struktur suchen */
CHANNEL *c;
UINT32 search_hash;
assert( Name != NULL );
search_hash = Hash( Name );
c = My_Channels;
while( c )
{
if( strcasecmp( Name, c->name ) == 0 ) return c;
if( search_hash == c->hash )
{
/* lt. Hash-Wert: Treffer! */
if( strcasecmp( Name, c->name ) == 0 ) return c;
}
c = c->next;
}
return NULL;
} /* Channel_Search */
GLOBAL CL2CHAN *Channel_FirstMember( CHANNEL *Chan )
GLOBAL CL2CHAN *
Channel_FirstMember( CHANNEL *Chan )
{
assert( Chan != NULL );
return Get_First_Cl2Chan( NULL, Chan );
} /* Channel_FirstMember */
GLOBAL CL2CHAN *Channel_NextMember( CHANNEL *Chan, CL2CHAN *Cl2Chan )
GLOBAL CL2CHAN *
Channel_NextMember( CHANNEL *Chan, CL2CHAN *Cl2Chan )
{
assert( Chan != NULL );
assert( Cl2Chan != NULL );
@@ -288,14 +423,16 @@ GLOBAL CL2CHAN *Channel_NextMember( CHANNEL *Chan, CL2CHAN *Cl2Chan )
} /* Channel_NextMember */
GLOBAL CL2CHAN *Channel_FirstChannelOf( CLIENT *Client )
GLOBAL CL2CHAN *
Channel_FirstChannelOf( CLIENT *Client )
{
assert( Client != NULL );
return Get_First_Cl2Chan( Client, NULL );
} /* Channel_FirstChannelOf */
GLOBAL CL2CHAN *Channel_NextChannelOf( CLIENT *Client, CL2CHAN *Cl2Chan )
GLOBAL CL2CHAN *
Channel_NextChannelOf( CLIENT *Client, CL2CHAN *Cl2Chan )
{
assert( Client != NULL );
assert( Cl2Chan != NULL );
@@ -303,95 +440,104 @@ GLOBAL CL2CHAN *Channel_NextChannelOf( CLIENT *Client, CL2CHAN *Cl2Chan )
} /* Channel_NextChannelOf */
GLOBAL CLIENT *Channel_GetClient( CL2CHAN *Cl2Chan )
GLOBAL CLIENT *
Channel_GetClient( CL2CHAN *Cl2Chan )
{
assert( Cl2Chan != NULL );
return Cl2Chan->client;
} /* Channel_GetClient */
GLOBAL CHANNEL *Channel_GetChannel( CL2CHAN *Cl2Chan )
GLOBAL CHANNEL *
Channel_GetChannel( CL2CHAN *Cl2Chan )
{
assert( Cl2Chan != NULL );
return Cl2Chan->channel;
} /* Channel_GetChannel */
GLOBAL BOOLEAN Channel_IsValidName( CHAR *Name )
GLOBAL bool
Channel_IsValidName( char *Name )
{
/* Pr<EFBFBD>fen, ob Name als Channelname gueltig */
/* Pruefen, ob Name als Channelname gueltig */
CHAR *ptr, badchars[] = " ,:\x07";
char *ptr, badchars[10];
assert( Name != NULL );
if(( Name[0] != '#' ) || ( strlen( Name ) >= CHANNEL_NAME_LEN )) return FALSE;
if(( Name[0] != '#' ) || ( strlen( Name ) >= CHANNEL_NAME_LEN )) return false;
ptr = Name;
strcpy( badchars, " ,:\007" );
while( *ptr )
{
if( strchr( badchars, *ptr )) return FALSE;
if( strchr( badchars, *ptr )) return false;
ptr++;
}
return TRUE;
return true;
} /* Channel_IsValidName */
GLOBAL BOOLEAN Channel_ModeAdd( CHANNEL *Chan, CHAR Mode )
GLOBAL bool
Channel_ModeAdd( CHANNEL *Chan, char Mode )
{
/* Mode soll gesetzt werden. TRUE wird geliefert, wenn der
* Mode neu gesetzt wurde, FALSE, wenn der Channel den Mode
* bereits hatte. */
/* set Mode.
* If the channel already had this mode, return false.
* If the channel mode was newly set return true.
*/
CHAR x[2];
char x[2];
assert( Chan != NULL );
x[0] = Mode; x[1] = '\0';
if( ! strchr( Chan->modes, x[0] ))
{
/* Client hat den Mode noch nicht -> setzen */
strcat( Chan->modes, x );
return TRUE;
/* Channel does not have this mode yet, set it */
strlcat( Chan->modes, x, sizeof( Chan->modes ));
return true;
}
else return FALSE;
else return false;
} /* Channel_ModeAdd */
GLOBAL BOOLEAN Channel_ModeDel( CHANNEL *Chan, CHAR Mode )
GLOBAL bool
Channel_ModeDel( CHANNEL *Chan, char Mode )
{
/* Mode soll geloescht werden. TRUE wird geliefert, wenn der
* Mode entfernt wurde, FALSE, wenn der Channel den Mode
* ueberhaupt nicht hatte. */
CHAR x[2], *p;
/* Delete mode.
* if the mode was removed return true.
* if the channel did not have the mode, return false.
*/
char x[2], *p;
assert( Chan != NULL );
x[0] = Mode; x[1] = '\0';
p = strchr( Chan->modes, x[0] );
if( ! p ) return FALSE;
if( ! p ) return false;
/* Client hat den Mode -> loeschen */
/* Channel has mode -> delete */
while( *p )
{
*p = *(p + 1);
p++;
}
return TRUE;
return true;
} /* Channel_ModeDel */
GLOBAL BOOLEAN Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, CHAR Mode )
GLOBAL bool
Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, char Mode )
{
/* Channel-User-Mode soll gesetzt werden. TRUE wird geliefert,
* wenn der Mode neu gesetzt wurde, FALSE, wenn der User den
* Channel-Mode bereits hatte. */
/* Set Channel-User-Mode.
* if mode was newly set, return true.
* if the User already had this channel-mode, return false.
*/
CL2CHAN *cl2chan;
CHAR x[2];
char x[2];
assert( Chan != NULL );
assert( Client != NULL );
@@ -402,22 +548,24 @@ GLOBAL BOOLEAN Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, CHAR Mode )
x[0] = Mode; x[1] = '\0';
if( ! strchr( cl2chan->modes, x[0] ))
{
/* Client hat den Mode noch nicht -> setzen */
strcat( cl2chan->modes, x );
return TRUE;
/* mode not set, -> set it */
strlcat( cl2chan->modes, x, sizeof( cl2chan->modes ));
return true;
}
else return FALSE;
else return false;
} /* Channel_UserModeAdd */
GLOBAL BOOLEAN Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, CHAR Mode )
GLOBAL bool
Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, char Mode )
{
/* Channel-User-Mode soll geloescht werden. TRUE wird geliefert,
* wenn der Mode entfernt wurde, FALSE, wenn der User den Channel-Mode
* ueberhaupt nicht hatte. */
/* Delete Channel-User-Mode.
* If Mode was removed, return true.
* If User did not have the Channel-Mode, return false.
*/
CL2CHAN *cl2chan;
CHAR x[2], *p;
char x[2], *p;
assert( Chan != NULL );
assert( Client != NULL );
@@ -428,21 +576,22 @@ GLOBAL BOOLEAN 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 hat den Mode -> loeschen */
/* Client has Mode -> delete */
while( *p )
{
*p = *(p + 1);
p++;
}
return TRUE;
return true;
} /* Channel_UserModeDel */
GLOBAL CHAR *Channel_UserModes( CHANNEL *Chan, CLIENT *Client )
GLOBAL char *
Channel_UserModes( CHANNEL *Chan, CLIENT *Client )
{
/* Channel-Modes eines Users liefern */
/* return Users' Channel-Modes */
CL2CHAN *cl2chan;
@@ -456,62 +605,130 @@ GLOBAL CHAR *Channel_UserModes( CHANNEL *Chan, CLIENT *Client )
} /* Channel_UserModes */
GLOBAL BOOLEAN Channel_IsMemberOf( CHANNEL *Chan, CLIENT *Client )
GLOBAL bool
Channel_IsMemberOf( CHANNEL *Chan, CLIENT *Client )
{
/* Pruefen, ob Client Mitglied in Channel ist */
/* Test if Client is on Channel Chan */
assert( Chan != NULL );
assert( Client != NULL );
if( Get_Cl2Chan( Chan, Client )) return TRUE;
else return FALSE;
if( Get_Cl2Chan( Chan, Client )) return true;
else return false;
} /* Channel_IsMemberOf */
GLOBAL CHAR *Channel_Topic( CHANNEL *Chan )
GLOBAL char *
Channel_Topic( CHANNEL *Chan )
{
assert( Chan != NULL );
return Chan->topic;
} /* Channel_Topic */
GLOBAL VOID Channel_SetTopic( CHANNEL *Chan, CHAR *Topic )
GLOBAL void
Channel_SetTopic( CHANNEL *Chan, char *Topic )
{
assert( Chan != NULL );
assert( Topic != NULL );
strncpy( Chan->topic, Topic, CHANNEL_TOPIC_LEN );
Chan->topic[CHANNEL_TOPIC_LEN - 1] = '\0';
strlcpy( Chan->topic, Topic, sizeof( Chan->topic ));
} /* Channel_SetTopic */
LOCAL CHANNEL *New_Chan( CHAR *Name )
GLOBAL void
Channel_SetModes( CHANNEL *Chan, char *Modes )
{
/* Neue Channel-Struktur anlegen */
assert( Chan != NULL );
assert( Modes != NULL );
strlcpy( Chan->modes, Modes, sizeof( Chan->modes ));
} /* Channel_SetModes */
GLOBAL void
Channel_SetKey( CHANNEL *Chan, char *Key )
{
assert( Chan != NULL );
assert( Key != NULL );
strlcpy( Chan->key, Key, sizeof( Chan->key ));
Log( LOG_DEBUG, "Channel %s: Key is now \"%s\".", Chan->name, Chan->key );
} /* Channel_SetKey */
GLOBAL void
Channel_SetMaxUsers( CHANNEL *Chan, long Count )
{
assert( Chan != NULL );
Chan->maxusers = Count;
Log( LOG_DEBUG, "Channel %s: Member limit is now %ld.", Chan->name, Chan->maxusers );
} /* Channel_SetMaxUsers */
GLOBAL bool
Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, char *Text )
{
bool is_member, has_voice, is_op, ok;
/* Okay, target is a channel */
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 the client allowed to write to channel? */
ok = true;
if( strchr( Channel_Modes( Chan ), 'n' ) && ( ! is_member )) ok = false;
if( strchr( Channel_Modes( Chan ), 'm' ) && ( ! is_op ) && ( ! has_voice )) ok = false;
/* Is the client banned? */
if( Lists_CheckBanned( From, Chan ))
{
/* Client is banned, bus is he channel operator or has voice? */
if(( ! has_voice ) && ( ! is_op )) ok = false;
}
if( ! 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 );
} /* Channel_Write */
GLOBAL CHANNEL *
Channel_Create( char *Name )
{
/* Create new CHANNEL structure and add it to linked list */
CHANNEL *c;
assert( Name != NULL );
c = malloc( sizeof( CHANNEL ));
c = (CHANNEL *)malloc( sizeof( CHANNEL ));
if( ! c )
{
Log( LOG_EMERG, "Can't allocate memory!" );
Log( LOG_EMERG, "Can't allocate memory! [New_Chan]" );
return NULL;
}
c->next = NULL;
strncpy( c->name, Name, CHANNEL_NAME_LEN );
c->name[CHANNEL_NAME_LEN - 1] = '\0';
strcpy( c->modes, "" );
strcpy( c->topic, "" );
memset( c, 0, sizeof( CHANNEL ));
strlcpy( c->name, Name, sizeof( c->name ));
c->hash = Hash( c->name );
c->next = My_Channels;
My_Channels = c;
Log( LOG_DEBUG, "Created new channel structure for \"%s\".", Name );
return c;
} /* New_Chan */
} /* Channel_Create */
LOCAL CL2CHAN *Get_Cl2Chan( CHANNEL *Chan, CLIENT *Client )
LOCAL CL2CHAN *
Get_Cl2Chan( CHANNEL *Chan, CLIENT *Client )
{
CL2CHAN *cl2chan;
@@ -528,7 +745,8 @@ LOCAL CL2CHAN *Get_Cl2Chan( CHANNEL *Chan, CLIENT *Client )
} /* Get_Cl2Chan */
LOCAL CL2CHAN *Add_Client( CHANNEL *Chan, CLIENT *Client )
LOCAL CL2CHAN *
Add_Client( CHANNEL *Chan, CLIENT *Client )
{
CL2CHAN *cl2chan;
@@ -536,10 +754,10 @@ LOCAL CL2CHAN *Add_Client( CHANNEL *Chan, CLIENT *Client )
assert( Client != NULL );
/* neue CL2CHAN-Struktur anlegen */
cl2chan = malloc( sizeof( CL2CHAN ));
cl2chan = (CL2CHAN *)malloc( sizeof( CL2CHAN ));
if( ! cl2chan )
{
Log( LOG_EMERG, "Can't allocate memory!" );
Log( LOG_EMERG, "Can't allocate memory! [Add_Client]" );
return NULL;
}
cl2chan->channel = Chan;
@@ -556,7 +774,8 @@ LOCAL CL2CHAN *Add_Client( CHANNEL *Chan, CLIENT *Client )
} /* Add_Client */
LOCAL BOOLEAN Remove_Client( CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Reason, BOOLEAN ServerPART )
LOCAL bool
Remove_Client( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Reason, bool InformServer )
{
CL2CHAN *cl2chan, *last_cl2chan;
CHANNEL *c;
@@ -574,7 +793,7 @@ LOCAL BOOLEAN Remove_Client( CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR
last_cl2chan = cl2chan;
cl2chan = cl2chan->next;
}
if( ! cl2chan ) return FALSE;
if( ! cl2chan ) return false;
c = cl2chan->channel;
assert( c != NULL );
@@ -584,26 +803,49 @@ LOCAL BOOLEAN Remove_Client( CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR
else My_Cl2Chan = cl2chan->next;
free( cl2chan );
if( ServerPART ) IRC_WriteStrServersPrefix( Origin, Client, "PART %s :%s", c->name, Reason );
IRC_WriteStrChannelPrefix( Origin, c, Client, FALSE, "PART %s :%s", c->name, Reason );
if(( Client_Conn( Origin ) > NONE ) && ( Client_Type( Origin ) == CLIENT_USER )) IRC_WriteStrClientPrefix( Origin, Client, "PART %s :%s", c->name, Reason );
switch( Type )
{
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 );
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 );
if(( Client_Conn( Client ) > NONE ) && ( Client_Type( Client ) == CLIENT_USER )) IRC_WriteStrClientPrefix( Client, Origin, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason );
Log( LOG_DEBUG, "User \"%s\" has been kicked of \"%s\" by \"%s\": %s.", Client_Mask( Client ), c->name, Client_ID( Origin ), Reason );
break;
default:
/* PART */
if( InformServer ) IRC_WriteStrServersPrefix( Origin, Client, "PART %s :%s", c->name, Reason );
IRC_WriteStrChannelPrefix( Origin, c, Client, false, "PART %s :%s", c->name, Reason );
if(( Client_Conn( Origin ) > NONE ) && ( Client_Type( Origin ) == CLIENT_USER )) IRC_WriteStrClientPrefix( Origin, Client, "PART %s :%s", c->name, Reason );
Log( LOG_DEBUG, "User \"%s\" left channel \"%s\" (%s).", Client_Mask( Client ), c->name, Reason );
}
Log( LOG_DEBUG, "User \"%s\" left channel \"%s\" (%s).", Client_Mask( Client ), c->name, Reason );
/* Wenn Channel nun leer: loeschen */
if( ! Get_First_Cl2Chan( NULL, Chan )) Delete_Channel( Chan );
/* Wenn Channel nun leer und nicht pre-defined: loeschen */
if( ! strchr( Channel_Modes( Chan ), 'P' ))
{
if( ! Get_First_Cl2Chan( NULL, Chan )) Delete_Channel( Chan );
}
return TRUE;
return true;
} /* Remove_Client */
LOCAL CL2CHAN *Get_First_Cl2Chan( CLIENT *Client, CHANNEL *Chan )
LOCAL CL2CHAN *
Get_First_Cl2Chan( CLIENT *Client, CHANNEL *Chan )
{
return Get_Next_Cl2Chan( My_Cl2Chan, Client, Chan );
} /* Get_First_Cl2Chan */
LOCAL CL2CHAN *Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Channel )
LOCAL CL2CHAN *
Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Channel )
{
CL2CHAN *cl2chan;
@@ -620,7 +862,8 @@ LOCAL CL2CHAN *Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Channe
} /* Get_Next_Cl2Chan */
LOCAL BOOLEAN Delete_Channel( CHANNEL *Chan )
LOCAL bool
Delete_Channel( CHANNEL *Chan )
{
/* Channel-Struktur loeschen */
@@ -634,16 +877,19 @@ LOCAL BOOLEAN 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 );
/* Invite- und Ban-Lists aufraeumen */
Lists_DeleteChannel( chan );
/* Neu verketten und freigeben */
if( last_chan ) last_chan->next = chan->next;
else My_Channels = chan->next;
free( chan );
return TRUE;
return true;
} /* Delete_Channel */

View File

@@ -2,78 +2,35 @@
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* 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: channel.h,v 1.13 2002/02/27 20:32:10 alex Exp $
* $Id: channel.h,v 1.27 2005/03/19 18:43:48 fw Exp $
*
* channel.h: Management der Channels (Header)
*
* $Log: channel.h,v $
* Revision 1.13 2002/02/27 20:32:10 alex
* - neue Funktionen Channel_Topic() und Channel_SetTopic().
*
* Revision 1.12 2002/02/27 15:21:21 alex
* - neue Funktion Channel_IsMemberOf() implementiert.
*
* Revision 1.11 2002/02/11 01:00:22 alex
* - neue Funktionen Channel_ModeAdd(), Channel_ModeDel(), Channel_UserModes(),
* Channel_UserModeAdd(), Channel_UserModeDel().
*
* Revision 1.10 2002/02/06 16:49:10 alex
* - neue Funktionen Channel_Modes() und Channel_IsValidName().
*
* Revision 1.9 2002/01/29 00:11:19 alex
* - neue Funktionen Channel_FirstChannelOf() und Channel_NextChannelOf().
*
* Revision 1.8 2002/01/28 01:16:15 alex
* - neue Funktionen Channel_Name(), Channel_First() und Channel_Next().
*
* Revision 1.7 2002/01/26 18:41:55 alex
* - CHANNEL- und CL2CHAN-Strukturen in Header verlegt,
* - einige neue Funktionen (Channel_GetChannel(), Channel_FirstMember(), ...)
*
* Revision 1.6 2002/01/21 00:11:59 alex
* - Definition der CHANNEL-Struktur aus Header entfernt,
* - neue Funktionen Channel_Join(), Channel_Part() und Channel_RemoveClient().
*
* Revision 1.5 2002/01/16 22:09:07 alex
* - neue Funktion Channel_Count().
*
* Revision 1.4 2002/01/02 02:42:58 alex
* - Copyright-Texte aktualisiert.
*
* Revision 1.3 2001/12/31 02:18:51 alex
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
* - neuen Header "defines.h" mit (fast) allen Konstanten.
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
*
* Revision 1.2 2001/12/23 21:54:30 alex
* - Konstanten um Prefix "CHANNEL_" erweitert.
*
* Revision 1.1 2001/12/14 08:13:43 alex
* - neues Modul begonnen :-)
* Channel management (header)
*/
#ifndef __channel_h__
#define __channel_h__
#include "client.h"
#if defined(__channel_c__) | defined(S_SPLINT_S)
#ifdef __channel_c__
#include "defines.h"
typedef struct _CHANNEL
{
struct _CHANNEL *next;
CHAR name[CHANNEL_NAME_LEN]; /* Name des Channel */
CHAR modes[CHANNEL_MODE_LEN]; /* Channel-Modes */
CHAR topic[CHANNEL_TOPIC_LEN]; /* Topic des Channels */
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") */
} CHANNEL;
typedef struct _CLIENT2CHAN
@@ -81,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
@@ -92,45 +49,60 @@ typedef POINTER CL2CHAN;
#endif
GLOBAL VOID Channel_Init( VOID );
GLOBAL VOID Channel_Exit( VOID );
GLOBAL void Channel_Init PARAMS(( void ));
GLOBAL void Channel_InitPredefined PARAMS(( void ));
GLOBAL void Channel_Exit PARAMS(( void ));
GLOBAL BOOLEAN Channel_Join( CLIENT *Client, CHAR *Name );
GLOBAL BOOLEAN Channel_Part( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason );
GLOBAL bool Channel_Join PARAMS(( CLIENT *Client, char *Name ));
GLOBAL bool Channel_Part PARAMS(( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason ));
GLOBAL VOID Channel_RemoveClient( CLIENT *Client, CHAR *Reason );
GLOBAL void Channel_Quit PARAMS(( CLIENT *Client, char *Reason ));
GLOBAL INT Channel_Count( VOID );
GLOBAL void Channel_Kick PARAMS(( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason ));
GLOBAL CHAR *Channel_Name( CHANNEL *Chan );
GLOBAL CHAR *Channel_Modes( CHANNEL *Chan );
GLOBAL CHAR *Channel_Topic( CHANNEL *Chan );
GLOBAL long Channel_Count PARAMS(( void ));
GLOBAL long Channel_MemberCount PARAMS(( CHANNEL *Chan ));
GLOBAL int Channel_CountForUser PARAMS(( CLIENT *Client ));
GLOBAL int Channel_PCount PARAMS(( void ));
GLOBAL VOID Channel_SetTopic( CHANNEL *Chan, CHAR *Topic );
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 CHANNEL *Channel_Search( CHAR *Name );
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_First( VOID );
GLOBAL CHANNEL *Channel_Next( CHANNEL *Chan );
GLOBAL CHANNEL *Channel_Search PARAMS(( char *Name ));
GLOBAL CL2CHAN *Channel_FirstMember( CHANNEL *Chan );
GLOBAL CL2CHAN *Channel_NextMember( CHANNEL *Chan, CL2CHAN *Cl2Chan );
GLOBAL CL2CHAN *Channel_FirstChannelOf( CLIENT *Client );
GLOBAL CL2CHAN *Channel_NextChannelOf( CLIENT *Client, CL2CHAN *Cl2Chan );
GLOBAL CHANNEL *Channel_First PARAMS(( void ));
GLOBAL CHANNEL *Channel_Next PARAMS(( CHANNEL *Chan ));
GLOBAL CLIENT *Channel_GetClient( CL2CHAN *Cl2Chan );
GLOBAL CHANNEL *Channel_GetChannel( CL2CHAN *Cl2Chan );
GLOBAL CL2CHAN *Channel_FirstMember PARAMS(( CHANNEL *Chan ));
GLOBAL CL2CHAN *Channel_NextMember PARAMS(( CHANNEL *Chan, CL2CHAN *Cl2Chan ));
GLOBAL CL2CHAN *Channel_FirstChannelOf PARAMS(( CLIENT *Client ));
GLOBAL CL2CHAN *Channel_NextChannelOf PARAMS(( CLIENT *Client, CL2CHAN *Cl2Chan ));
GLOBAL BOOLEAN Channel_IsValidName( CHAR *Name );
GLOBAL CLIENT *Channel_GetClient PARAMS(( CL2CHAN *Cl2Chan ));
GLOBAL CHANNEL *Channel_GetChannel PARAMS(( CL2CHAN *Cl2Chan ));
GLOBAL BOOLEAN Channel_ModeAdd( CHANNEL *Chan, CHAR Mode );
GLOBAL BOOLEAN Channel_ModeDel( CHANNEL *Chan, CHAR Mode );
GLOBAL bool Channel_IsValidName PARAMS(( char *Name ));
GLOBAL BOOLEAN Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, CHAR Mode );
GLOBAL BOOLEAN Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, CHAR Mode );
GLOBAL CHAR *Channel_UserModes( CHANNEL *Chan, CLIENT *Client );
GLOBAL bool Channel_ModeAdd PARAMS(( CHANNEL *Chan, char Mode ));
GLOBAL bool Channel_ModeDel PARAMS(( CHANNEL *Chan, char Mode ));
GLOBAL BOOLEAN Channel_IsMemberOf( CHANNEL *Chan, CLIENT *Client );
GLOBAL bool Channel_UserModeAdd PARAMS(( CHANNEL *Chan, CLIENT *Client, char Mode ));
GLOBAL bool Channel_UserModeDel PARAMS(( CHANNEL *Chan, CLIENT *Client, char Mode ));
GLOBAL char *Channel_UserModes PARAMS(( CHANNEL *Chan, CLIENT *Client ));
GLOBAL bool Channel_IsMemberOf PARAMS(( CHANNEL *Chan, CLIENT *Client ));
GLOBAL bool Channel_Write PARAMS(( CHANNEL *Chan, CLIENT *From, CLIENT *Client, char *Text ));
GLOBAL CHANNEL *Channel_Create PARAMS(( char *Name ));
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -2,208 +2,157 @@
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* 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: client.h,v 1.23 2002/02/27 18:22:09 alex Exp $
* $Id: client.h,v 1.39 2005/06/12 16:18:49 alex Exp $
*
* client.h: Konfiguration des ngircd (Header)
*
* $Log: client.h,v $
* Revision 1.23 2002/02/27 18:22:09 alex
* - neue Funktion Client_SetAway() und Client_Away() implementiert.
*
* Revision 1.22 2002/02/06 16:49:56 alex
* - neue Funktion Client_IsValidNick().
*
* Revision 1.21 2002/01/29 00:14:49 alex
* - neue Funktion Client_TopServer(), Client_NewXXX() angepasst.
*
* Revision 1.20 2002/01/21 00:06:49 alex
* - Channel-Pointer aus Client-Struktur entfernt. Wird nun dynamisch verwaltet :-)
*
* Revision 1.19 2002/01/16 22:10:35 alex
* - neue Funktionen Client_xxxCount().
*
* Revision 1.18 2002/01/07 23:42:12 alex
* - Es werden fuer alle Server eigene Token generiert,
* - QUIT von einem Server fuer einen User wird an andere Server geforwarded,
* - ebenso NICK-Befehle, die "fremde" User einfuehren.
*
* Revision 1.17 2002/01/06 15:18:14 alex
* - Loglevel und Meldungen nochmals geaendert. Level passen nun besser.
*
* Revision 1.16 2002/01/05 23:26:05 alex
* - Vorbereitungen fuer Ident-Abfragen in Client-Strukturen.
*
* Revision 1.15 2002/01/05 20:08:17 alex
* - neue Funktion Client_NextHop().
*
* Revision 1.14 2002/01/04 01:21:22 alex
* - Client-Strukturen koennen von anderen Modulen nun nur noch ueber die
* enstprechenden (zum Teil neuen) Funktionen angesprochen werden.
*
* Revision 1.13 2002/01/03 02:28:06 alex
* - neue Funktion Client_CheckID(), diverse Aenderungen fuer Server-Links.
*
* Revision 1.12 2002/01/02 02:42:58 alex
* - Copyright-Texte aktualisiert.
*
* Revision 1.11 2001/12/31 15:33:13 alex
* - neuer Befehl NAMES, kleinere Bugfixes.
* - Bug bei PING behoben: war zu restriktiv implementiert :-)
*
* Revision 1.10 2001/12/31 02:18:51 alex
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
* - neuen Header "defines.h" mit (fast) allen Konstanten.
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
*
* Revision 1.9 2001/12/29 20:18:18 alex
* - neue Funktion Client_SetHostname().
*
* Revision 1.8 2001/12/29 03:10:47 alex
* - Client-Modes implementiert; Loglevel mal wieder angepasst.
*
* Revision 1.7 2001/12/27 19:13:47 alex
* - neue Funktion Client_Search(), besseres Logging.
*
* Revision 1.6 2001/12/27 16:54:51 alex
* - neue Funktion Client_GetID(), liefert die "Client ID".
*
* Revision 1.5 2001/12/26 14:45:37 alex
* - "Code Cleanups".
*
* Revision 1.4 2001/12/26 03:19:16 alex
* - neue Funktion Client_Nick().
*
* Revision 1.3 2001/12/25 19:21:26 alex
* - Client-Typ ("Status") besser unterteilt, My_Clients ist zudem nun global.
*
* Revision 1.2 2001/12/23 22:03:47 alex
* - einige neue Funktionen,
* - Konstanten um "CLIENT_"-Prefix erweitert.
*
* Revision 1.1 2001/12/14 08:13:43 alex
* - neues Modul begonnen :-)
* Client management (header)
*/
#ifndef __client_h__
#define __client_h__
#include "conn.h"
#define CLIENT_UNKNOWN 1 /* connection of unknown type */
#define CLIENT_GOTPASS 2 /* client did send PASS */
#define CLIENT_GOTNICK 4 /* client did send NICK */
#define CLIENT_GOTUSER 8 /* client did send USER */
#define CLIENT_USER 16 /* client is an IRC user */
#define CLIENT_UNKNOWNSERVER 32 /* unregistered server connection */
#define CLIENT_GOTPASSSERVER 64 /* client did send PASS in "server style" */
#define CLIENT_SERVER 128 /* client is a server */
#define CLIENT_SERVICE 256 /* client is a service */
#define CLIENT_TYPE int
typedef enum
{
CLIENT_UNKNOWN, /* Verbindung mit (noch) unbekanntem Typ */
CLIENT_GOTPASS, /* Client hat PASS gesendet */
CLIENT_GOTNICK, /* Client hat NICK gesendet */
CLIENT_GOTUSER, /* Client hat USER gesendet */
CLIENT_USER, /* Client ist ein Benutzer (USER wurde gesendet) */
CLIENT_UNKNOWNSERVER, /* unregistrierte Server-Verbindung */
CLIENT_GOTPASSSERVER, /* Client hat PASS nach "Server-Art" gesendet */
CLIENT_SERVER, /* Client ist ein Server */
CLIENT_SERVICE /* Client ist ein Service */
} CLIENT_TYPE;
#if defined(__client_c__) | defined(S_SPLINT_S)
#ifdef __client_c__
typedef struct _CLIENT
{
CHAR id[CLIENT_ID_LEN]; /* Nick (User) bzw. ID (Server) */
POINTER *next; /* Zeiger auf naechste Client-Struktur */
CLIENT_TYPE type; /* Typ des Client, vgl. CLIENT_TYPE */
CONN_ID conn_id; /* ID der Connection (wenn lokal) bzw. NONE (remote) */
struct _CLIENT *introducer; /* ID des Servers, der die Verbindung hat */
struct _CLIENT *topserver; /* Toplevel-Servers (nur gueltig, wenn Client ein Server ist) */
CHAR pwd[CLIENT_PASS_LEN]; /* Passwort, welches der Client angegeben hat */
CHAR host[CLIENT_HOST_LEN]; /* Hostname des Client */
CHAR user[CLIENT_USER_LEN]; /* Benutzername ("Login") */
CHAR info[CLIENT_INFO_LEN]; /* Langer Benutzername (User) bzw. Infotext (Server) */
CHAR modes[CLIENT_MODE_LEN]; /* Client Modes */
INT hops, token, mytoken; /* "Hops" und "Token" (-> SERVER-Befehl) */
BOOLEAN oper_by_me; /* IRC-Operator-Status durch diesen Server? */
CHAR away[CLIENT_AWAY_LEN]; /* AWAY-Text, wenn Mode 'a' gesetzt */
time_t starttime; /* Start time of link */
char id[CLIENT_ID_LEN]; /* nick (user) / ID (server) */
UINT32 hash; /* hash of lower-case ID */
POINTER *next; /* pointer to next client structure */
CLIENT_TYPE type; /* type of client, see CLIENT_xxx */
CONN_ID conn_id; /* ID of the connection (if local) or NONE (remote) */
struct _CLIENT *introducer; /* ID of the servers which the client is connected to */
struct _CLIENT *topserver; /* toplevel servers (only valid if client is a server) */
char pwd[CLIENT_PASS_LEN]; /* password received of the client */
char host[CLIENT_HOST_LEN]; /* hostname of the client */
char user[CLIENT_USER_LEN]; /* user name ("login") */
char info[CLIENT_INFO_LEN]; /* long user name (user) / info text (server) */
char modes[CLIENT_MODE_LEN]; /* client modes */
int hops, token, mytoken; /* "hops" and "Token" (see SERVER command) */
bool oper_by_me; /* client is local IRC operator on this server? */
char away[CLIENT_AWAY_LEN]; /* AWAY text (valid if mode 'a' is set) */
char flags[CLIENT_FLAGS_LEN]; /* flags of the client */
} CLIENT;
#else
typedef POINTER CLIENT;
#endif
GLOBAL VOID Client_Init( VOID );
GLOBAL VOID Client_Exit( VOID );
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 CLIENT *Client_NewLocal( CONN_ID Idx, CHAR *Hostname, INT Type, BOOLEAN Idented );
GLOBAL CLIENT *Client_NewRemoteServer( CLIENT *Introducer, CHAR *Hostname, CLIENT *TopServer, INT Hops, INT Token, CHAR *Info, BOOLEAN Idented );
GLOBAL CLIENT *Client_NewRemoteUser( CLIENT *Introducer, CHAR *Nick, INT Hops, CHAR *User, CHAR *Hostname, INT Token, CHAR *Modes, CHAR *Info, BOOLEAN Idented );
GLOBAL CLIENT *Client_New( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, INT Type, CHAR *ID, CHAR *User, CHAR *Hostname, CHAR *Info, INT Hops, INT Token, CHAR *Modes, BOOLEAN Idented );
GLOBAL VOID Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg );
GLOBAL void Client_Init PARAMS(( void ));
GLOBAL void Client_Exit PARAMS(( void ));
GLOBAL CLIENT *Client_ThisServer( 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 CLIENT *Client_GetFromConn( CONN_ID Idx );
GLOBAL CLIENT *Client_GetFromID( CHAR *Nick );
GLOBAL CLIENT *Client_GetFromToken( CLIENT *Client, INT Token );
GLOBAL void Client_Destroy PARAMS(( CLIENT *Client, char *LogMsg, char *FwdMsg, bool SendQuit ));
#ifdef CONN_MODULE
GLOBAL void Client_DestroyNow PARAMS(( CLIENT *Client ));
#endif
GLOBAL CLIENT *Client_Search( CHAR *ID );
GLOBAL CLIENT *Client_First( VOID );
GLOBAL CLIENT *Client_Next( CLIENT *c );
GLOBAL CLIENT *Client_ThisServer PARAMS(( void ));
GLOBAL INT Client_Type( CLIENT *Client );
GLOBAL CONN_ID Client_Conn( CLIENT *Client );
GLOBAL CHAR *Client_ID( CLIENT *Client );
GLOBAL CHAR *Client_Mask( CLIENT *Client );
GLOBAL CHAR *Client_Info( CLIENT *Client );
GLOBAL CHAR *Client_User( CLIENT *Client );
GLOBAL CHAR *Client_Hostname( CLIENT *Client );
GLOBAL CHAR *Client_Password( CLIENT *Client );
GLOBAL CHAR *Client_Modes( CLIENT *Client );
GLOBAL CLIENT *Client_Introducer( CLIENT *Client );
GLOBAL BOOLEAN Client_OperByMe( CLIENT *Client );
GLOBAL INT Client_Hops( CLIENT *Client );
GLOBAL INT Client_Token( CLIENT *Client );
GLOBAL INT Client_MyToken( CLIENT *Client );
GLOBAL CLIENT *Client_TopServer( CLIENT *Client );
GLOBAL CLIENT *Client_NextHop( CLIENT *Client );
GLOBAL CHAR *Client_Away( CLIENT *Client );
GLOBAL CLIENT *Client_GetFromConn PARAMS(( CONN_ID Idx ));
GLOBAL CLIENT *Client_GetFromToken PARAMS(( CLIENT *Client, int Token ));
GLOBAL BOOLEAN Client_HasMode( CLIENT *Client, CHAR Mode );
GLOBAL CLIENT *Client_Search PARAMS(( char *ID ));
GLOBAL CLIENT *Client_First PARAMS(( void ));
GLOBAL CLIENT *Client_Next PARAMS(( CLIENT *c ));
GLOBAL VOID Client_SetHostname( CLIENT *Client, CHAR *Hostname );
GLOBAL VOID Client_SetID( CLIENT *Client, CHAR *Nick );
GLOBAL VOID Client_SetUser( CLIENT *Client, CHAR *User, BOOLEAN Idented );
GLOBAL VOID Client_SetInfo( CLIENT *Client, CHAR *Info );
GLOBAL VOID Client_SetPassword( CLIENT *Client, CHAR *Pwd );
GLOBAL VOID Client_SetType( CLIENT *Client, INT Type );
GLOBAL VOID Client_SetHops( CLIENT *Client, INT Hops );
GLOBAL VOID Client_SetToken( CLIENT *Client, INT Token );
GLOBAL VOID Client_SetOperByMe( CLIENT *Client, BOOLEAN OperByMe );
GLOBAL VOID Client_SetModes( CLIENT *Client, CHAR *Modes );
GLOBAL VOID Client_SetIntroducer( CLIENT *Client, CLIENT *Introducer );
GLOBAL VOID Client_SetAway( CLIENT *Client, CHAR *Txt );
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 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 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 BOOLEAN Client_ModeAdd( CLIENT *Client, CHAR Mode );
GLOBAL BOOLEAN Client_ModeDel( CLIENT *Client, CHAR Mode );
GLOBAL bool Client_HasMode PARAMS(( CLIENT *Client, char Mode ));
GLOBAL BOOLEAN Client_CheckNick( CLIENT *Client, CHAR *Nick );
GLOBAL BOOLEAN Client_CheckID( CLIENT *Client, CHAR *ID );
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 INT Client_UserCount( VOID );
GLOBAL INT Client_ServiceCount( VOID );
GLOBAL INT Client_ServerCount( VOID );
GLOBAL INT Client_OperCount( VOID );
GLOBAL INT Client_UnknownCount( VOID );
GLOBAL INT Client_MyUserCount( VOID );
GLOBAL INT Client_MyServiceCount( VOID );
GLOBAL INT Client_MyServerCount( VOID );
GLOBAL bool Client_ModeAdd PARAMS(( CLIENT *Client, char Mode ));
GLOBAL bool Client_ModeDel PARAMS(( CLIENT *Client, char Mode ));
GLOBAL BOOLEAN Client_IsValidNick( CHAR *Nick );
GLOBAL bool Client_CheckNick PARAMS(( CLIENT *Client, char *Nick ));
GLOBAL bool Client_CheckID PARAMS(( CLIENT *Client, char *ID ));
GLOBAL long Client_UserCount PARAMS(( void ));
GLOBAL long Client_ServiceCount PARAMS(( void ));
GLOBAL long Client_ServerCount PARAMS(( void ));
GLOBAL long Client_OperCount PARAMS(( void ));
GLOBAL long Client_UnknownCount PARAMS(( void ));
GLOBAL long Client_MyUserCount PARAMS(( void ));
GLOBAL long Client_MyServiceCount PARAMS(( void ));
GLOBAL long Client_MyServerCount PARAMS(( void ));
GLOBAL long Client_MaxUserCount PARAMS(( void ));
GLOBAL long Client_MyMaxUserCount PARAMS(( void ));
GLOBAL 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 ));
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -2,47 +2,15 @@
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* 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: conf.h,v 1.10 2002/02/27 23:23:53 alex Exp $
* $Id: conf.h,v 1.34 2005/03/20 13:54:06 fw Exp $
*
* conf.h: Konfiguration des ngircd (Header)
*
* $Log: conf.h,v $
* Revision 1.10 2002/02/27 23:23:53 alex
* - Includes fuer einige Header bereinigt.
*
* Revision 1.9 2002/01/03 02:27:20 alex
* - das Server-Passwort kann nun konfiguriert werden.
*
* Revision 1.8 2002/01/02 02:49:16 alex
* - Konfigurationsdatei "Samba like" umgestellt.
* - es koennen nun mehrere Server und Oprtatoren konfiguriert werden.
*
* Revision 1.6 2001/12/31 02:18:51 alex
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
* - neuen Header "defines.h" mit (fast) allen Konstanten.
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
*
* Revision 1.5 2001/12/30 19:26:11 alex
* - Unterstuetzung fuer die Konfigurationsdatei eingebaut.
*
* Revision 1.4 2001/12/26 22:48:53 alex
* - MOTD-Datei ist nun konfigurierbar und wird gelesen.
*
* Revision 1.3 2001/12/26 14:45:37 alex
* - "Code Cleanups".
*
* Revision 1.2 2001/12/26 03:19:57 alex
* - erste Konfigurations-Variablen definiert: PING/PONG-Timeout.
*
* Revision 1.1 2001/12/12 17:18:20 alex
* - Modul fuer Server-Konfiguration begonnen.
* Configuration management (header)
*/
@@ -51,64 +19,127 @@
#include <time.h>
#include "conn.h"
#include "defines.h"
#include "portab.h"
typedef struct _Conf_Oper
{
CHAR name[CLIENT_PASS_LEN];
CHAR pwd[CLIENT_PASS_LEN];
char name[CLIENT_PASS_LEN]; /* Name (ID) of IRC operator */
char pwd[CLIENT_PASS_LEN]; /* Password */
char *mask;
} CONF_OPER;
typedef struct _Conf_Server
{
CHAR host[HOST_LEN];
CHAR ip[16];
CHAR name[CLIENT_ID_LEN];
CHAR pwd[CLIENT_PASS_LEN];
INT port;
time_t lasttry;
RES_STAT *res_stat;
char host[HOST_LEN]; /* Hostname */
char ip[16]; /* IP address (Resolver) */
char name[CLIENT_ID_LEN]; /* IRC-Client-ID */
char pwd_in[CLIENT_PASS_LEN]; /* Password which must be received */
char pwd_out[CLIENT_PASS_LEN]; /* Password to send to peer */
UINT16 port; /* Server port */
int group; /* Group of server */
time_t lasttry; /* Last connect attempt */
RES_STAT *res_stat; /* Status of the resolver */
int flags; /* Flags */
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 */
} CONF_CHANNEL;
/* Konfigurationsdatei */
GLOBAL CHAR Conf_File[FNAME_LEN];
/* Name ("Nick") des Servers */
GLOBAL CHAR Conf_ServerName[CLIENT_ID_LEN];
#define CONF_SFLAG_ONCE 1 /* Delete this entry after next disconnect */
#define CONF_SFLAG_DISABLED 2 /* This server configuration entry is disabled */
/* Servers-Info-Text */
GLOBAL CHAR Conf_ServerInfo[CLIENT_INFO_LEN];
/* Server-Passwort */
GLOBAL CHAR Conf_ServerPwd[CLIENT_PASS_LEN];
/* Name ("Nick") of the servers */
GLOBAL char Conf_ServerName[CLIENT_ID_LEN];
/* Datei mit MOTD-Text */
GLOBAL CHAR Conf_MotdFile[FNAME_LEN];
/* Server info text */
GLOBAL char Conf_ServerInfo[CLIENT_INFO_LEN];
/* Ports, auf denen der Server Verbindungen entgegen nimmt */
GLOBAL INT Conf_ListenPorts[MAX_LISTEN_PORTS];
GLOBAL INT Conf_ListenPorts_Count;
/* Global server passwort */
GLOBAL char Conf_ServerPwd[CLIENT_PASS_LEN];
/* Timeouts fuer PING und PONG */
GLOBAL INT Conf_PingTimeout;
GLOBAL INT Conf_PongTimeout;
/* Administrative information */
GLOBAL char Conf_ServerAdmin1[CLIENT_INFO_LEN];
GLOBAL char Conf_ServerAdmin2[CLIENT_INFO_LEN];
GLOBAL char Conf_ServerAdminMail[CLIENT_INFO_LEN];
/* Sekunden zwischen Verbindungsversuchen zu anderen Servern */
GLOBAL INT Conf_ConnectRetry;
/* File with MOTD text */
GLOBAL char Conf_MotdFile[FNAME_LEN];
/* Operatoren */
/* Phrase with MOTD text */
GLOBAL char Conf_MotdPhrase[LINE_LEN];
/* Ports the server should listen on */
GLOBAL UINT16 Conf_ListenPorts[MAX_LISTEN_PORTS];
GLOBAL int Conf_ListenPorts_Count;
/* Address to which the socket should be bound or empty (=all) */
GLOBAL char Conf_ListenAddress[16];
/* User and group ID the server should run with */
GLOBAL unsigned int Conf_UID;
GLOBAL unsigned int Conf_GID;
/* A directory to chroot() in */
GLOBAL char Conf_Chroot[FNAME_LEN];
/* File with PID of daemon */
GLOBAL char Conf_PidFile[FNAME_LEN];
/* Timeouts for PING and PONG */
GLOBAL int Conf_PingTimeout;
GLOBAL int Conf_PongTimeout;
/* Seconds between connect attempts to other servers */
GLOBAL int Conf_ConnectRetry;
/* Operators */
GLOBAL CONF_OPER Conf_Oper[MAX_OPERATORS];
GLOBAL INT Conf_Oper_Count;
GLOBAL int Conf_Oper_Count;
/* Server */
/* Servers */
GLOBAL CONF_SERVER Conf_Server[MAX_SERVERS];
GLOBAL INT Conf_Server_Count;
/* Pre-defined channels */
GLOBAL CONF_CHANNEL Conf_Channel[MAX_DEFCHANNELS];
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;
/* Maximum number of connections to this server */
GLOBAL long Conf_MaxConnections;
/* Maximum number of channels a user can join */
GLOBAL int Conf_MaxJoins;
/* Maximum number of connections per IP address */
GLOBAL int Conf_MaxConnectionsIP;
GLOBAL VOID Conf_Init( VOID );
GLOBAL VOID Conf_Exit( VOID );
GLOBAL void Conf_Init PARAMS((void ));
GLOBAL void Conf_Rehash PARAMS((void ));
GLOBAL int Conf_Test PARAMS((void ));
GLOBAL void Conf_UnsetServer PARAMS(( CONN_ID Idx ));
GLOBAL void Conf_SetServer PARAMS(( int ConfServer, CONN_ID Idx ));
GLOBAL int Conf_GetServer PARAMS(( CONN_ID Idx ));
GLOBAL bool Conf_EnableServer PARAMS(( char *Name, UINT16 Port ));
GLOBAL bool Conf_DisableServer PARAMS(( char *Name ));
GLOBAL bool Conf_AddServer PARAMS(( char *Name, UINT16 Port, char *Host, char *MyPwd, char *PeerPwd ));
#endif

264
src/ngircd/conn-func.c Normal file
View File

@@ -0,0 +1,264 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* 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
* 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.
*
* Connection management: Global functions
*/
#define CONN_MODULE
#include "portab.h"
static char UNUSED id[] = "$Id: conn-func.c,v 1.6 2005/06/12 16:32:17 alex Exp $";
#include "imp.h"
#include <assert.h>
#include <log.h>
#include "conn.h"
#include "client.h"
#include "exp.h"
#include "conn-func.h"
GLOBAL void
Conn_UpdateIdle( CONN_ID Idx )
{
/* Idle-Timer zuruecksetzen */
assert( Idx > NONE );
My_Connections[Idx].lastprivmsg = time( NULL );
}
GLOBAL time_t
Conn_GetIdle( CONN_ID Idx )
{
/* Idle-Time einer Verbindung liefern (in Sekunden) */
assert( Idx > NONE );
return time( NULL ) - My_Connections[Idx].lastprivmsg;
} /* Conn_GetIdle */
GLOBAL time_t
Conn_LastPing( CONN_ID Idx )
{
/* Zeitpunkt des letzten PING liefern */
assert( Idx > NONE );
return My_Connections[Idx].lastping;
} /* Conn_LastPing */
GLOBAL void
Conn_SetPenalty( CONN_ID Idx, time_t Seconds )
{
/* Penalty-Delay fuer eine Verbindung (in Sekunden) setzen;
* waehrend dieser Zeit wird der entsprechende Socket vom Server
* bei Lese-Operationen komplett ignoriert. Der Delay kann mit
* dieser Funktion nur erhoeht, nicht aber verringert werden. */
time_t t;
assert( Idx > NONE );
assert( Seconds >= 0 );
t = time( NULL ) + Seconds;
if( t > My_Connections[Idx].delaytime ) My_Connections[Idx].delaytime = t;
} /* Conn_SetPenalty */
GLOBAL void
Conn_ResetPenalty( CONN_ID Idx )
{
assert( Idx > NONE );
My_Connections[Idx].delaytime = 0;
} /* Conn_ResetPenalty */
GLOBAL void
Conn_ClearFlags( void )
{
/* Alle Connection auf "nicht-markiert" setzen */
CONN_ID i;
for( i = 0; i < Pool_Size; i++ ) My_Connections[i].flag = 0;
} /* Conn_ClearFlags */
GLOBAL int
Conn_Flag( CONN_ID Idx )
{
/* 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 )
{
/* Connection markieren */
assert( Idx > NONE );
My_Connections[Idx].flag = Flag;
} /* Conn_SetFlag */
GLOBAL CONN_ID
Conn_First( void )
{
/* Connection-Struktur der ersten Verbindung liefern;
* Ist keine Verbindung vorhanden, wird NONE geliefert. */
CONN_ID i;
for( i = 0; i < Pool_Size; i++ )
{
if( My_Connections[i].sock != NONE ) return i;
}
return NONE;
} /* Conn_First */
GLOBAL CONN_ID
Conn_Next( CONN_ID Idx )
{
/* Naechste Verbindungs-Struktur liefern; existiert keine
* weitere, so wird NONE geliefert. */
CONN_ID i = NONE;
assert( Idx > NONE );
for( i = Idx + 1; i < Pool_Size; i++ )
{
if( My_Connections[i].sock != NONE ) return i;
}
return NONE;
} /* Conn_Next */
GLOBAL int
Conn_Options( CONN_ID Idx )
{
assert( Idx > NONE );
return My_Connections[Idx].options;
} /* 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;
assert(Idx > NONE);
/* Search client structure for this link ... */
c = Client_GetFromConn(Idx);
if(c != NULL)
return Client_StartTime(c);
return 0;
} /* Conn_StartTime */
GLOBAL int
Conn_SendQ( CONN_ID Idx )
{
/* Laenge der Daten im Schreibbuffer liefern */
assert( Idx > NONE );
#ifdef ZLIB
if( My_Connections[Idx].options & CONN_ZIP ) return My_Connections[Idx].zip.wdatalen;
else
#endif
return My_Connections[Idx].wdatalen;
} /* Conn_SendQ */
GLOBAL long
Conn_SendMsg( CONN_ID Idx )
{
/* Anzahl gesendeter Nachrichten liefern */
assert( Idx > NONE );
return My_Connections[Idx].msg_out;
} /* Conn_SendMsg */
GLOBAL long
Conn_SendBytes( CONN_ID Idx )
{
/* Anzahl gesendeter Bytes (unkomprimiert) liefern */
assert( Idx > NONE );
return My_Connections[Idx].bytes_out;
} /* Conn_SendBytes */
GLOBAL int
Conn_RecvQ( CONN_ID Idx )
{
/* Laenge der Daten im Lesebuffer liefern */
assert( Idx > NONE );
#ifdef ZLIB
if( My_Connections[Idx].options & CONN_ZIP ) return My_Connections[Idx].zip.rdatalen;
else
#endif
return My_Connections[Idx].rdatalen;
} /* Conn_RecvQ */
GLOBAL long
Conn_RecvMsg( CONN_ID Idx )
{
/* Anzahl empfangener Nachrichten liefern */
assert( Idx > NONE );
return My_Connections[Idx].msg_in;
} /* Conn_RecvMsg */
GLOBAL long
Conn_RecvBytes( CONN_ID Idx )
{
/* Anzahl empfangener Bytes (unkomprimiert) liefern */
assert( Idx > NONE );
return My_Connections[Idx].bytes_in;
} /* Conn_RecvBytes */
GLOBAL void
Conn_ResetWCounter( void )
{
WCounter = 0;
} /* Conn_ResetWCounter */
GLOBAL long
Conn_WCounter( void )
{
return WCounter;
} /* Conn_WCounter */
/* -eof- */

62
src/ngircd/conn-func.h Normal file
View File

@@ -0,0 +1,62 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* 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
* 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: conn-func.h,v 1.4 2005/04/25 18:37:16 fw Exp $
*
* Connection management: Global functions (header)
*/
#ifndef __conn_func_h__
#define __conn_func_h__
/* Include the header conn.h if this header is _not_ included by any module
* containing connection handling functions. So other modules must only
* include this conn-func.h header. */
#ifndef CONN_MODULE
# include "conn.h"
#endif
GLOBAL void Conn_UpdateIdle PARAMS(( CONN_ID Idx ));
GLOBAL time_t Conn_GetIdle PARAMS(( CONN_ID Idx ));
GLOBAL time_t Conn_LastPing PARAMS(( CONN_ID Idx ));
GLOBAL time_t Conn_StartTime PARAMS(( CONN_ID Idx ));
GLOBAL int Conn_SendQ PARAMS(( CONN_ID Idx ));
GLOBAL int Conn_RecvQ PARAMS(( CONN_ID Idx ));
GLOBAL long Conn_SendMsg PARAMS(( CONN_ID Idx ));
GLOBAL long Conn_RecvMsg PARAMS(( CONN_ID Idx ));
GLOBAL long Conn_SendBytes PARAMS(( CONN_ID Idx ));
GLOBAL long Conn_RecvBytes PARAMS(( CONN_ID Idx ));
GLOBAL void Conn_SetPenalty PARAMS(( CONN_ID Idx, time_t Seconds ));
GLOBAL void Conn_ResetPenalty PARAMS(( CONN_ID Idx ));
GLOBAL void Conn_ClearFlags PARAMS(( void ));
GLOBAL int Conn_Flag PARAMS(( CONN_ID Idx ));
GLOBAL void Conn_SetFlag PARAMS(( CONN_ID Idx, int Flag ));
GLOBAL 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_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
/* -eof- */

210
src/ngircd/conn-zip.c Normal file
View File

@@ -0,0 +1,210 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* 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
* 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.
*
* Connection compression using ZLIB
*/
#include "portab.h"
#define CONN_MODULE
#ifdef ZLIB
static char UNUSED id[] = "$Id: conn-zip.c,v 1.7 2005/04/25 18:37:16 fw Exp $";
#include "imp.h"
#include <assert.h>
#include <string.h>
#include <zlib.h>
#include "conn.h"
#include "conn-func.h"
#include "log.h"
#include "exp.h"
#include "conn-zip.h"
GLOBAL bool
Zip_InitConn( CONN_ID Idx )
{
/* Kompression fuer Link initialisieren */
assert( Idx > NONE );
My_Connections[Idx].zip.in.avail_in = 0;
My_Connections[Idx].zip.in.total_in = 0;
My_Connections[Idx].zip.in.total_out = 0;
My_Connections[Idx].zip.in.zalloc = NULL;
My_Connections[Idx].zip.in.zfree = NULL;
My_Connections[Idx].zip.in.data_type = Z_ASCII;
if( inflateInit( &My_Connections[Idx].zip.in ) != Z_OK )
{
/* Fehler! */
Log( LOG_ALERT, "Can't initialize compression on connection %d (zlib inflate)!", Idx );
return false;
}
My_Connections[Idx].zip.out.total_in = 0;
My_Connections[Idx].zip.out.total_in = 0;
My_Connections[Idx].zip.out.zalloc = NULL;
My_Connections[Idx].zip.out.zfree = NULL;
My_Connections[Idx].zip.out.data_type = Z_ASCII;
if( deflateInit( &My_Connections[Idx].zip.out, Z_DEFAULT_COMPRESSION ) != Z_OK )
{
/* Fehler! */
Log( LOG_ALERT, "Can't initialize compression on connection %d (zlib deflate)!", Idx );
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 );
return true;
} /* Zip_InitConn */
GLOBAL bool
Zip_Buffer( CONN_ID Idx, char *Data, int Len )
{
/* Daten zum Komprimieren im "Kompressions-Puffer" sammeln.
* Es wird true bei Erfolg, sonst false geliefert. */
assert( Idx > NONE );
assert( Data != NULL );
assert( Len > 0 );
/* Ist noch Platz im Kompressions-Puffer? */
if( ZWRITEBUFFER_LEN - My_Connections[Idx].zip.wdatalen < Len + 50 )
{
/* Nein! Puffer zunaechst leeren ...*/
if( ! Zip_Flush( Idx )) return false;
}
/* Daten kopieren */
memmove( My_Connections[Idx].zip.wbuf + My_Connections[Idx].zip.wdatalen, Data, Len );
My_Connections[Idx].zip.wdatalen += Len;
return true;
} /* Zip_Buffer */
GLOBAL bool
Zip_Flush( CONN_ID Idx )
{
/* Daten komprimieren und in Schreibpuffer kopieren.
* Es wird true bei Erfolg, sonst false geliefert. */
int result, out_len;
z_stream *out;
out = &My_Connections[Idx].zip.out;
out->next_in = (void *)My_Connections[Idx].zip.wbuf;
out->avail_in = My_Connections[Idx].zip.wdatalen;
out->next_out = (void *)(My_Connections[Idx].wbuf + My_Connections[Idx].wdatalen);
out->avail_out = WRITEBUFFER_LEN - My_Connections[Idx].wdatalen;
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;
}
out_len = WRITEBUFFER_LEN - My_Connections[Idx].wdatalen - out->avail_out;
My_Connections[Idx].wdatalen += out_len;
My_Connections[Idx].bytes_out += out_len;
My_Connections[Idx].zip.bytes_out += My_Connections[Idx].zip.wdatalen;
My_Connections[Idx].zip.wdatalen = 0;
return true;
} /* Zip_Flush */
GLOBAL bool
Unzip_Buffer( CONN_ID Idx )
{
/* Daten entpacken und in Lesepuffer kopieren. Bei Fehlern
* wird false geliefert, ansonsten true. Der Fall, dass keine
* Daten mehr zu entpacken sind, ist _kein_ Fehler! */
int result, in_len, out_len;
z_stream *in;
assert( Idx > NONE );
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->avail_in = My_Connections[Idx].zip.rdatalen;
in->next_out = (void *)(My_Connections[Idx].rbuf + My_Connections[Idx].rdatalen);
in->avail_out = READBUFFER_LEN - My_Connections[Idx].rdatalen - 1;
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;
}
in_len = My_Connections[Idx].zip.rdatalen - in->avail_in;
out_len = READBUFFER_LEN - My_Connections[Idx].rdatalen - 1 - in->avail_out;
My_Connections[Idx].rdatalen += out_len;
if( in->avail_in > 0 )
{
/* es konnten nicht alle Daten entpackt werden, vermutlich war
* im Ziel-Puffer kein Platz mehr. Umkopieren ... */
My_Connections[Idx].zip.rdatalen -= in_len;
memmove( My_Connections[Idx].zip.rbuf, My_Connections[Idx].zip.rbuf + in_len, My_Connections[Idx].zip.rdatalen );
}
else My_Connections[Idx].zip.rdatalen = 0;
My_Connections[Idx].zip.bytes_in += out_len;
return true;
} /* Unzip_Buffer */
GLOBAL long
Zip_SendBytes( CONN_ID Idx )
{
/* Anzahl gesendeter Bytes (komprimiert!) liefern */
assert( Idx > NONE );
return My_Connections[Idx].zip.bytes_out;
} /* Zip_SendBytes */
GLOBAL long
Zip_RecvBytes( CONN_ID Idx )
{
/* Anzahl gesendeter Bytes (komprimiert!) liefern */
assert( Idx > NONE );
return My_Connections[Idx].zip.bytes_in;
} /* Zip_RecvBytes */
#endif
/* -eof- */

38
src/ngircd/conn-zip.h Normal file
View File

@@ -0,0 +1,38 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* 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
* 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: conn-zip.h,v 1.3 2005/03/19 18:43:48 fw Exp $
*
* Connection compression using ZLIB (header)
*/
#ifdef ZLIB
#ifndef __conn_zip_h__
#define __conn_zip_h__
GLOBAL bool 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 long Zip_SendBytes PARAMS(( CONN_ID Idx ));
GLOBAL long Zip_RecvBytes PARAMS(( CONN_ID Idx ));
#endif /* __conn_zip_h__ */
#endif /* ZLIB */
/* -eof- */

File diff suppressed because it is too large Load Diff

View File

@@ -2,55 +2,15 @@
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* 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: conn.h,v 1.12 2002/02/23 00:03:54 alex Exp $
* $Id: conn.h,v 1.35.2.1 2005/07/30 23:24:50 alex Exp $
*
* conn.h: Verwaltung aller Netz-Verbindungen ("connections") (Header)
*
* $Log: conn.h,v $
* Revision 1.12 2002/02/23 00:03:54 alex
* - Ergebnistyp von Conn_GetIdle() und Conn_LastPing() auf "time_t" geaendert.
*
* Revision 1.11 2002/02/11 01:00:50 alex
* - neue Funktion Conn_LastPing().
*
* Revision 1.10 2002/01/06 15:18:15 alex
* - Loglevel und Meldungen nochmals geaendert. Level passen nun besser.
*
* Revision 1.9 2002/01/02 02:44:36 alex
* - neue Defines fuer max. Anzahl Server und Operatoren.
*
* Revision 1.8 2001/12/31 02:18:51 alex
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
* - neuen Header "defines.h" mit (fast) allen Konstanten.
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
*
* Revision 1.7 2001/12/26 14:45:37 alex
* - "Code Cleanups".
*
* Revision 1.6 2001/12/25 22:03:47 alex
* - Conn_Close() eingefuehrt: war die lokale Funktion Close_Connection().
*
* Revision 1.5 2001/12/23 21:57:48 alex
* - Conn_WriteStr() unterstuetzt nun variable Parameter.
*
* Revision 1.4 2001/12/15 00:08:27 alex
* - neue globale Funktionen: Conn_Write() und Conn_WriteStr().
*
* Revision 1.3 2001/12/14 08:15:45 alex
* - CONN_ID wird definiert.
*
* Revision 1.2 2001/12/13 01:33:32 alex
* - Conn_Handler() unterstuetzt nun einen Timeout (in Sekunden).
*
* Revision 1.1 2001/12/12 17:18:38 alex
* - Modul zur Verwaltung aller Netzwerk-Verbindungen begonnen.
* Connection management (header)
*/
@@ -58,33 +18,87 @@
#define __conn_h__
#include <time.h>
#include <time.h> /* for time_t, see below */
typedef INT CONN_ID;
#define CONN_ISCLOSING 1 /* Conn_Close() already called */
#define CONN_ISCONNECTING 2 /* connect() in progress */
typedef struct _Res_Stat
#ifdef ZLIB
#define CONN_ZIP 4 /* zlib compressed link */
#endif
typedef int CONN_ID;
#ifdef CONN_MODULE
#include "defines.h"
#include "resolve.h"
#ifdef ZLIB
#include <zlib.h>
typedef struct _ZipData
{
INT pid; /* PID des Child-Prozess */
INT pipe[2]; /* Pipe fuer IPC */
} RES_STAT;
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!) */
} ZIPDATA;
#endif /* ZLIB */
typedef struct _Connection
{
int sock; /* Socket handle */
struct sockaddr_in addr; /* Client address */
RES_STAT *res_stat; /* Status of resolver process, if any */
char host[HOST_LEN]; /* Hostname */
char rbuf[READBUFFER_LEN]; /* Read buffer */
int rdatalen; /* Length of data in read buffer */
char wbuf[WRITEBUFFER_LEN]; /* Write buffer */
int wdatalen; /* Length of data in write buffer */
time_t 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 */
#ifdef ZLIB
ZIPDATA zip; /* Compression information */
#endif /* ZLIB */
} CONNECTION;
GLOBAL CONNECTION *My_Connections;
GLOBAL CONN_ID Pool_Size;
GLOBAL long WCounter;
#endif /* CONN_MODULE */
GLOBAL VOID Conn_Init( VOID );
GLOBAL VOID Conn_Exit( VOID );
GLOBAL void Conn_Init PARAMS((void ));
GLOBAL void Conn_Exit PARAMS(( void ));
GLOBAL BOOLEAN Conn_NewListener( CONST INT Port );
GLOBAL int Conn_InitListeners PARAMS(( void ));
GLOBAL void Conn_ExitListeners PARAMS(( void ));
GLOBAL VOID Conn_Handler( INT Timeout );
GLOBAL bool Conn_NewListener PARAMS(( const UINT16 Port ));
GLOBAL BOOLEAN Conn_Write( CONN_ID Idx, CHAR *Data, INT Len );
GLOBAL BOOLEAN Conn_WriteStr( CONN_ID Idx, CHAR *Format, ... );
GLOBAL void Conn_Handler PARAMS(( void ));
GLOBAL VOID Conn_Close( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformClient );
GLOBAL bool Conn_Write PARAMS(( CONN_ID Idx, char *Data, int Len ));
GLOBAL bool Conn_WriteStr PARAMS(( CONN_ID Idx, char *Format, ... ));
GLOBAL VOID Conn_UpdateIdle( CONN_ID Idx );
GLOBAL time_t Conn_GetIdle( CONN_ID Idx );
GLOBAL time_t Conn_LastPing( CONN_ID Idx );
GLOBAL void Conn_Close PARAMS(( CONN_ID Idx, char *LogMsg, char *FwdMsg, bool InformClient ));
GLOBAL void Conn_SyncServerStruct PARAMS(( void ));
GLOBAL int Conn_MaxFD;
#endif

View File

@@ -1,61 +1,16 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
* Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* 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: defines.h,v 1.13 2002/03/02 00:43:31 alex Exp $
* $Id: defines.h,v 1.52.2.2 2005/07/05 22:58:25 alex Exp $
*
* defines.h: (globale) Konstanten
*
* $Log: defines.h,v $
* Revision 1.13 2002/03/02 00:43:31 alex
* - bei abgebrochene ausgehende Server-Verbindungen wird der naechste Ver-
* bindungsversuch in RECONNECT_DELAY Sekunden (3) unternommen und nicht
* mehr "ConnectRetry" Sekunden gewartet.
*
* Revision 1.12 2002/02/27 23:24:58 alex
* - CONNECTED und DISCONNECTED fuer die irc-xxx-Module wird nun hier definiert.
*
* Revision 1.11 2002/02/27 20:32:34 alex
* - neue Konstante: CHANNEL_TOPIC_LEN
*
* Revision 1.10 2002/02/27 18:22:45 alex
* - Mode "a" (away) in USERMODES aufgenommen.
*
* Revision 1.9 2002/02/13 23:04:27 alex
* - CHANMODES um Operator (o) und Voiced User (v) ergaenzt.
*
* Revision 1.8 2002/02/13 17:45:57 alex
* - unterstuetzte User- und Channel-Modes stehen nun in Konstanten.
*
* Revision 1.7 2002/01/22 17:15:39 alex
* - die Fehlermeldung "interrupted system call" sollte nicht mehr auftreten.
*
* Revision 1.6 2002/01/21 00:03:16 alex
* - neue Konstante CHANNEL_MODE_LEN.
*
* Revision 1.5 2002/01/18 15:51:44 alex
* - Server-Verbinungen werden beim Start erst nach kurzer Pause aufgebaut.
*
* Revision 1.4 2002/01/07 15:29:53 alex
* - PASSSERVERADD definiert, wird beim PASS-Befehl an Server verwendet.
*
* Revision 1.3 2002/01/03 02:24:00 alex
* - Protokollversion und Suffix definiert.
*
* Revision 1.2 2002/01/02 02:44:36 alex
* - neue Defines fuer max. Anzahl Server und Operatoren.
*
* Revision 1.1 2001/12/31 02:18:51 alex
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
* - neuen Header "defines.h" mit (fast) allen Konstanten.
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
* Global defines of ngIRCd.
*/
#ifndef __defines_h__
@@ -64,52 +19,91 @@
#define NONE -1
#define FNAME_LEN 256 /* max. Laenge eines Dateinamen */
#define FNAME_LEN 256 /* max. length of file name */
#define LINE_LEN 256 /* max. Laenge einer Konfigurationszeile */
#define LINE_LEN 256 /* max. length of a line in the configuration file */
#define HOST_LEN 256 /* max. Laenge eines Hostnamen */
#define HOST_LEN 256 /* max. lenght of fully qualified host names */
#define MAX_LISTEN_PORTS 16 /* max. Anzahl von Listen-Ports */
#define MAX_LISTEN_PORTS 16 /* max. count of listening ports */
#define MAX_OPERATORS 8 /* max. Anzahl konfigurierbarer Operatoren */
#define MAX_OPERATORS 16 /* max. count of configurable operators */
#define MAX_SERVERS 8 /* max. Anzahl konfigurierbarer Server ("Peers") */
#define MAX_SERVERS 16 /* max. count of configurable servers ("peers") */
#define MAX_CONNECTIONS 100 /* max. Anzahl von Verbindungen an diesem Server */
#define MAX_DEFCHANNELS 16 /* max. count of preconfigurable channels */
#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 MAX_SERVICES 8 /* max. number of configurable services */
#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 MAX_WHOWAS 64 /* max. number of WHOWAS items */
#define DEFAULT_WHOWAS 5 /* default count for WHOWAS command */
#define COMMAND_LEN 513 /* max. Laenge eines Befehls, vgl. RFC 2812, 3.2 */
#define CONNECTION_POOL 100 /* size of default connection pool */
#define READBUFFER_LEN 2 * COMMAND_LEN /* Laenge des Lesepuffers je Verbindung (Bytes) */
#define WRITEBUFFER_LEN 4096 /* Laenge des Schreibpuffers je Verbindung (Bytes) */
#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 PROTOVER "0210" /* implementierte Protokoll-Version (RFC 2813, 4.1.1) */
#define PROTOSUFFIX "-ngIRCd" /* Protokoll-Suffix (RFC 2813, 4.1.1) */
#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 PASSSERVERADD PROTOVER""PROTOSUFFIX" IRC|"PACKAGE"-"VERSION" P"
#define COMMAND_LEN 513 /* max. IRC command length, see. RFC 2812, 3.2 */
#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 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 USERMODES "aio" /* unterstuetzte User-Modes */
#define CHANMODES "amnopqstv" /* unterstuetzte Channel-Modes */
#ifdef ZLIB
#define ZREADBUFFER_LEN 1024 /* compressed read buffer of a connection (bytes) */
#define ZWRITEBUFFER_LEN 4096 /* compressed write buffer of a connection (bytes) */
#endif
#define CONNECTED TRUE /* fuer die irc-xxx-Module */
#define DISCONNECTED FALSE
#define PROTOVER "0210" /* implemented IRC protocol version (see RFC 2813, 4.1.1) */
#define PROTOIRC "-IRC" /* protocol suffix (see RFC 2813, 4.1.1) */
#define PROTOIRCPLUS "-IRC+" /* protokol suffix for IRC+ protocol (see doc/Protocol.txt) */
#ifdef IRCPLUS
# define IRCPLUSFLAGS "CL" /* standard IRC+ flags */
#endif
#define STARTUP_DELAY 1 /* delay outgoing connections n seconds after startup */
#define RECONNECT_DELAY 3 /* time to delay re-connect attempts (seconds) */
#define USERMODES "aios" /* supported user modes */
#define CHANMODES "biklImnoPstv" /* supported channel modes */
#define CONNECTED true /* internal status codes */
#define DISCONNECTED false
#define DEFAULT_AWAY_MSG "Away" /* away message for users connected to linked servers */
#define 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 TOKEN_OUTBOUND -2 /* tag for outbound server links */
#define NOTICE_TXTPREFIX "" /* prefix for NOTICEs from the server to users */
#define CUT_TXTSUFFIX "[CUT]" /* Suffix for oversized messages that
have been shortened and cut off. */
#ifdef RENDEZVOUS
#define RENDEZVOUS_TYPE "_ircu._tcp." /* service type to register with Rendezvous */
#endif
#endif

View File

@@ -1,65 +0,0 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: global.h,v 1.7 2002/02/25 11:42:15 alex Exp $
*
* global.h: Globaler Header, wir in jedes(!) Modul eingebunden.
*
* $Log: global.h,v $
* Revision 1.7 2002/02/25 11:42:15 alex
* - unter A/UX wird _POSIX_SOURCE definiert: fuer Systemheader notwendig.
*
* Revision 1.6 2002/01/05 15:55:11 alex
* - Wrapper fuer inet_aton(): liefert immer Fehler.
*
* Revision 1.5 2002/01/02 02:42:58 alex
* - Copyright-Texte aktualisiert.
*
* Revision 1.4 2001/12/31 02:18:51 alex
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
* - neuen Header "defines.h" mit (fast) allen Konstanten.
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
*
* Revision 1.3 2001/12/14 08:14:34 alex
* - NONE als -1 definiert. Macht den Source lesbarer ;-)
*
* Revision 1.2 2001/12/12 01:58:53 alex
* - Test auf socklen_t verbessert.
*
* Revision 1.1.1.1 2001/12/11 21:53:04 alex
* Imported sources to CVS.
*/
#ifndef __global_h__
#define __global_h__
#include "config.h"
#include "defines.h"
#if OS_UNIX_AUX
#define _POSIX_SOURCE /* muss unter A/UX definiert sein */
#endif
#ifndef HAVE_socklen_t
#define socklen_t int /* u.a. fuer Mac OS X */
#endif
#ifndef HAVE_INET_ATON
#define inet_aton( opt, bind ) 0 /* Dummy fuer inet_aton() */
#endif
#endif
/* -eof- */

125
src/ngircd/hash.c Normal file
View File

@@ -0,0 +1,125 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* 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
* 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.
*
* Hash calculation
*/
#include "portab.h"
static char UNUSED id[] = "$Id: hash.c,v 1.11 2005/03/19 18:43:48 fw Exp $";
#include "imp.h"
#include <assert.h>
#include <string.h>
#include "defines.h"
#include "tool.h"
#include "exp.h"
#include "hash.h"
LOCAL UINT32 jenkins_hash PARAMS(( register UINT8 *k, register UINT32 length, register UINT32 initval ));
GLOBAL UINT32
Hash( char *String )
{
/* Hash-Wert ueber String berechnen */
char buffer[LINE_LEN];
strlcpy( buffer, String, sizeof( buffer ));
return jenkins_hash( (UINT8 *)ngt_LowerStr( buffer ), strlen( buffer ), 42 );
} /* Hash */
/*
* Die hier verwendete Hash-Funktion stammt aus lookup2.c von Bob Jenkins
* (URL: <http://burtleburtle.net/bob/c/lookup2.c>). Aus dem Header:
* --------------------------------------------------------------------
* lookup2.c, by Bob Jenkins, December 1996, Public Domain.
* hash(), hash2(), hash3, and mix() are externally useful functions.
* Routines to test the hash are included if SELF_TEST is defined.
* You can use this free for any purpose. It has no warranty.
* --------------------------------------------------------------------
* nicht alle seiner Funktionen werden hier genutzt.
*/
#define hashsize(n) ((UINT32)1<<(n))
#define hashmask(n) (hashsize(n)-1)
#define mix(a,b,c) \
{ \
a -= b; a -= c; a ^= (c>>13); \
b -= c; b -= a; b ^= (a<<8); \
c -= a; c -= b; c ^= (b>>13); \
a -= b; a -= c; a ^= (c>>12); \
b -= c; b -= a; b ^= (a<<16); \
c -= a; c -= b; c ^= (b>>5); \
a -= b; a -= c; a ^= (c>>3); \
b -= c; b -= a; b ^= (a<<10); \
c -= a; c -= b; c ^= (b>>15); \
} /* mix */
LOCAL UINT32
jenkins_hash( register UINT8 *k, register UINT32 length, register UINT32 initval )
{
/* k: the key
* length: length of the key
* initval: the previous hash, or an arbitrary value
*/
register UINT32 a,b,c,len;
/* Set up the internal state */
len = length;
a = b = 0x9e3779b9; /* the golden ratio; an arbitrary value */
c = initval; /* the previous hash value */
/* handle most of the key */
while (len >= 12)
{
a += (k[0] +((UINT32)k[1]<<8) +((UINT32)k[2]<<16) +((UINT32)k[3]<<24));
b += (k[4] +((UINT32)k[5]<<8) +((UINT32)k[6]<<16) +((UINT32)k[7]<<24));
c += (k[8] +((UINT32)k[9]<<8) +((UINT32)k[10]<<16)+((UINT32)k[11]<<24));
mix(a,b,c);
k += 12; len -= 12;
}
/* handle the last 11 bytes */
c += length;
switch( (int)len ) /* all the case statements fall through */
{
case 11: c+=((UINT32)k[10]<<24);
case 10: c+=((UINT32)k[9]<<16);
case 9 : c+=((UINT32)k[8]<<8);
/* the first byte of c is reserved for the length */
case 8 : b+=((UINT32)k[7]<<24);
case 7 : b+=((UINT32)k[6]<<16);
case 6 : b+=((UINT32)k[5]<<8);
case 5 : b+=k[4];
case 4 : a+=((UINT32)k[3]<<24);
case 3 : a+=((UINT32)k[2]<<16);
case 2 : a+=((UINT32)k[1]<<8);
case 1 : a+=k[0];
/* case 0: nothing left to add */
}
mix(a,b,c);
/* report the result */
return c;
} /* jenkins_hash */
/* -eof- */

27
src/ngircd/hash.h Normal file
View File

@@ -0,0 +1,27 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* 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
* 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: hash.h,v 1.5 2005/03/19 18:43:48 fw Exp $
*
* Hash calculation (header)
*/
#ifndef __hash_h__
#define __hash_h__
GLOBAL UINT32 Hash PARAMS((char *String ));
#endif
/* -eof- */

490
src/ngircd/irc-channel.c Normal file
View File

@@ -0,0 +1,490 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* 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
* 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 channel commands
*/
#include "portab.h"
static char UNUSED id[] = "$Id: irc-channel.c,v 1.30.2.2 2006/03/16 20:14:46 fw Exp $";
#include "imp.h"
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "defines.h"
#include "conn.h"
#include "client.h"
#include "channel.h"
#include "lists.h"
#include "log.h"
#include "match.h"
#include "messages.h"
#include "parse.h"
#include "irc-info.h"
#include "irc-write.h"
#include "resolve.h"
#include "conf.h"
#include "exp.h"
#include "irc-channel.h"
GLOBAL bool
IRC_JOIN( CLIENT *Client, REQUEST *Req )
{
char *channame, *key, *flags, *topic, modes[8];
bool is_new_chan, is_invited, is_banned;
CLIENT *target;
CHANNEL *chan;
assert( Client != NULL );
assert( Req != NULL );
/* Bad number of arguments? */
if(( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Who is the sender? */
if( Client_Type( Client ) == CLIENT_SERVER ) target = Client_Search( Req->prefix );
else target = Client;
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
/* Are channel keys given? */
if( Req->argc > 1 ) key = Req->argv[1];
else key = NULL;
/* Channel-Namen durchgehen */
chan = NULL;
channame = strtok( Req->argv[0], "," );
while( channame )
{
chan = NULL; flags = NULL;
/* wird der Channel neu angelegt? */
if( Channel_Search( channame )) is_new_chan = false;
else is_new_chan = true;
/* Hat ein Server Channel-User-Modes uebergeben? */
if( Client_Type( Client ) == CLIENT_SERVER )
{
/* Channel-Flags extrahieren */
flags = strchr( channame, 0x7 );
if( flags )
{
*flags = '\0';
flags++;
}
}
/* Local client? */
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 );
/* Existiert der Channel bereits, oder wird er im Moment neu erzeugt? */
if( is_new_chan )
{
/* Erster User im Channel: Operator-Flag setzen */
flags = "o";
}
else
{
/* Existierenden Channel suchen */
chan = Channel_Search( channame );
assert( chan != NULL );
is_banned = Lists_CheckBanned( target, chan );
is_invited = Lists_CheckInvited( target, chan );
/* Testen, ob Client gebanned ist */
if(( is_banned == true) && ( is_invited == false ))
{
/* Client ist gebanned (und nicht invited): */
IRC_WriteStrClient( Client, ERR_BANNEDFROMCHAN_MSG, Client_ID( Client ), channame );
/* Try next name, if any */
channame = strtok( NULL, "," );
continue;
}
/* Ist der Channel "invite-only"? */
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 );
/* Try next name, if any */
channame = strtok( NULL, "," );
continue;
}
/* Is the channel protected by a key? */
if(( strchr( Channel_Modes( chan ), 'k' )) && ( strcmp( Channel_Key( chan ), key ? key : "" ) != 0 ))
{
/* Bad channel key! */
IRC_WriteStrClient( Client, ERR_BADCHANNELKEY_MSG, Client_ID( Client ), channame );
/* Try next name, if any */
channame = strtok( NULL, "," );
continue;
}
/* Are there already too many members? */
if(( strchr( Channel_Modes( chan ), 'l' )) && ( Channel_MaxUsers( chan ) <= Channel_MemberCount( chan )))
{
/* Bad channel key! */
IRC_WriteStrClient( Client, ERR_CHANNELISFULL_MSG, Client_ID( Client ), channame );
/* Try next name, if any */
channame = strtok( NULL, "," );
continue;
}
}
}
else
{
/* Remote server: we don't need to know whether the
* client is invited or not, but we have to make sure
* that the "one shot" entries (generated by INVITE
* 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 );
}
/* Channel joinen (und ggf. anlegen) */
if( ! Channel_Join( target, channame ))
{
/* naechsten Namen ermitteln */
channame = strtok( NULL, "," );
continue;
}
if( ! chan ) chan = Channel_Search( channame );
assert( chan != NULL );
/* Modes setzen (wenn vorhanden) */
while( flags && *flags )
{
Channel_UserModeAdd( chan, target, *flags );
flags++;
}
/* Wenn persistenter Channel und IRC-Operator: zum Channel-OP machen */
if(( strchr( Channel_Modes( chan ), 'P' )) && ( strchr( Client_Modes( target ), 'o' ))) Channel_UserModeAdd( chan, target, 'o' );
/* Muessen Modes an andere Server gemeldet werden? */
strlcpy( &modes[1], Channel_UserModes( chan, target ), sizeof( modes ) - 1 );
if( modes[1] ) modes[0] = 0x7;
else modes[0] = '\0';
/* An andere Server weiterleiten */
IRC_WriteStrServersPrefix( Client, target, "JOIN :%s%s", channame, modes );
/* im Channel bekannt machen */
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 ));
}
if( Client_Type( Client ) == CLIENT_USER )
{
/* an Client bestaetigen */
IRC_WriteStrClientPrefix( Client, target, "JOIN :%s", channame );
/* Topic an Client schicken */
topic = Channel_Topic( chan );
if( *topic ) IRC_WriteStrClient( Client, RPL_TOPIC_MSG, Client_ID( Client ), channame, topic );
/* Mitglieder an Client Melden */
IRC_Send_NAMES( Client, chan );
IRC_WriteStrClient( Client, RPL_ENDOFNAMES_MSG, Client_ID( Client ), Channel_Name( chan ));
}
/* naechsten Namen ermitteln */
channame = strtok( NULL, "," );
}
return CONNECTED;
} /* IRC_JOIN */
GLOBAL bool
IRC_PART( CLIENT *Client, REQUEST *Req )
{
CLIENT *target;
char *chan;
assert( Client != NULL );
assert( Req != NULL );
/* Falsche Anzahl Parameter? */
if(( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Wer ist der Absender? */
if( Client_Type( Client ) == CLIENT_SERVER ) target = Client_Search( Req->prefix );
else target = Client;
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
/* Channel-Namen durchgehen */
chan = strtok( Req->argv[0], "," );
while( chan )
{
if( ! Channel_Part( target, Client, chan, Req->argc > 1 ? Req->argv[1] : Client_ID( target )))
{
/* naechsten Namen ermitteln */
chan = strtok( NULL, "," );
continue;
}
/* naechsten Namen ermitteln */
chan = strtok( NULL, "," );
}
return CONNECTED;
} /* IRC_PART */
GLOBAL bool
IRC_TOPIC( CLIENT *Client, REQUEST *Req )
{
CHANNEL *chan;
CLIENT *from;
char *topic;
assert( Client != NULL );
assert( Req != NULL );
/* Falsche Anzahl Parameter? */
if(( Req->argc < 1 ) || ( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
else from = Client;
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
/* Welcher Channel? */
chan = Channel_Search( Req->argv[0] );
if( ! chan ) return IRC_WriteStrClient( from, ERR_NOSUCHCHANNEL_MSG, Client_ID( from ), Req->argv[0] );
/* Ist der User Mitglied in dem Channel? */
if( ! Channel_IsMemberOf( chan, from )) return IRC_WriteStrClient( from, ERR_NOTONCHANNEL_MSG, Client_ID( from ), Req->argv[0] );
if( Req->argc == 1 )
{
/* Topic erfragen */
topic = Channel_Topic( chan );
if( *topic ) return IRC_WriteStrClient( from, RPL_TOPIC_MSG, Client_ID( from ), Channel_Name( chan ), topic );
else return IRC_WriteStrClient( from, RPL_NOTOPIC_MSG, Client_ID( from ), Channel_Name( chan ));
}
if( strchr( Channel_Modes( chan ), 't' ))
{
/* Topic Lock. Ist der User ein Channel Operator? */
if( ! strchr( Channel_UserModes( chan, from ), 'o' )) return IRC_WriteStrClient( from, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( from ), Channel_Name( chan ));
}
/* Topic setzen */
Channel_SetTopic( chan, Req->argv[1] );
Log( LOG_DEBUG, "User \"%s\" set topic on \"%s\": %s", Client_Mask( from ), Channel_Name( chan ), Req->argv[1][0] ? Req->argv[1] : "<none>" );
/* im Channel bekannt machen und an Server weiterleiten */
IRC_WriteStrServersPrefix( Client, from, "TOPIC %s :%s", Req->argv[0], Req->argv[1] );
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
IRC_LIST( CLIENT *Client, REQUEST *Req )
{
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 );
if( Req->argc > 0 )
pattern = strtok( Req->argv[0], "," );
else
pattern = "*";
/* Get sender from prefix, if any */
if( Client_Type( Client ) == CLIENT_SERVER )
from = Client_Search( Req->prefix );
else
from = Client;
if( ! from )
return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG,
Client_ID( Client ), Req->prefix );
if( Req->argc == 2 )
{
/* Forward to other server? */
target = Client_Search( Req->argv[1] );
if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER ))
return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG,
Client_ID( Client ), Req->argv[1] );
if( target != Client_ThisServer( ))
{
/* Target is indeed an other server, forward it! */
return IRC_WriteStrClientPrefix( target, from,
"LIST %s :%s", Client_ID( from ),
Req->argv[1] );
}
}
while( pattern )
{
/* Loop through all the channels */
chan = Channel_First( );
while( chan )
{
/* Check search pattern */
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;
}
}
chan = Channel_Next( chan );
}
/* Get next name ... */
if( Req->argc > 0 )
pattern = strtok( NULL, "," );
else
pattern = NULL;
}
return IRC_WriteStrClient( from, RPL_LISTEND_MSG, Client_ID( from ));
} /* IRC_LIST */
GLOBAL bool
IRC_CHANINFO( CLIENT *Client, REQUEST *Req )
{
char modes_add[COMMAND_LEN], l[16], *ptr;
CLIENT *from;
CHANNEL *chan;
int arg_topic;
assert( Client != NULL );
assert( Req != NULL );
/* Bad number of parameters? */
if(( Req->argc < 2 ) || ( Req->argc == 4 ) || ( Req->argc > 5 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Compatibility kludge */
if( Req->argc == 5 ) arg_topic = 4;
else if( Req->argc == 3 ) arg_topic = 2;
else arg_topic = -1;
/* Search origin */
from = Client_Search( Req->prefix );
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
/* Search or create channel */
chan = Channel_Search( Req->argv[0] );
if( ! chan ) chan = Channel_Create( Req->argv[0] );
if( ! chan ) return CONNECTED;
if( Req->argv[1][0] == '+' )
{
ptr = Channel_Modes( chan );
if( ! *ptr )
{
/* OK, this channel doesn't have modes jet, set the received ones: */
Channel_SetModes( chan, &Req->argv[1][1] );
if( Req->argc == 5 )
{
if( strchr( Channel_Modes( chan ), 'k' )) Channel_SetKey( chan, Req->argv[2] );
if( strchr( Channel_Modes( chan ), 'l' )) Channel_SetMaxUsers( chan, atol( Req->argv[3] ));
}
else
{
/* Delete modes which we never want to inherit */
Channel_ModeDel( chan, 'l' );
Channel_ModeDel( chan, 'k' );
}
strcpy( modes_add, "" );
ptr = Channel_Modes( chan );
while( *ptr )
{
if( *ptr == 'l' )
{
snprintf( l, sizeof( l ), " %ld", Channel_MaxUsers( chan ));
strlcat( modes_add, l, sizeof( modes_add ));
}
if( *ptr == 'k' )
{
strlcat( modes_add, " ", sizeof( modes_add ));
strlcat( modes_add, Channel_Key( chan ), sizeof( modes_add ));
}
ptr++;
}
/* Inform members of this channel */
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!" );
if( arg_topic > 0 )
{
/* We got a topic */
ptr = Channel_Topic( chan );
if(( ! *ptr ) && ( Req->argv[arg_topic][0] ))
{
/* 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 ));
}
}
/* Forward CHANINFO to other serevrs */
if( Req->argc == 5 ) IRC_WriteStrServersPrefixFlag( Client, from, 'C', "CHANINFO %s %s %s %s :%s", Req->argv[0], Req->argv[1], Req->argv[2], Req->argv[3], Req->argv[4] );
else if( Req->argc == 3 ) IRC_WriteStrServersPrefixFlag( Client, from, 'C', "CHANINFO %s %s :%s", Req->argv[0], Req->argv[1], Req->argv[2] );
else IRC_WriteStrServersPrefixFlag( Client, from, 'C', "CHANINFO %s %s", Req->argv[0], Req->argv[1] );
return CONNECTED;
} /* IRC_CHANINFO */
/* -eof- */

33
src/ngircd/irc-channel.h Normal file
View File

@@ -0,0 +1,33 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* 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
* 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: irc-channel.h,v 1.7 2005/03/19 18:43:48 fw Exp $
*
* IRC channel commands (header)
*/
#ifndef __irc_channel_h__
#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 bool IRC_LIST PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_CHANINFO PARAMS((CLIENT *Client, REQUEST *Req ));
#endif
/* -eof- */

1021
src/ngircd/irc-info.c Normal file

File diff suppressed because it is too large Load Diff

44
src/ngircd/irc-info.h Normal file
View File

@@ -0,0 +1,44 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* 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
* 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: irc-info.h,v 1.3 2005/03/19 18:43:48 fw Exp $
*
* IRC info commands (header)
*/
#ifndef __irc_info_h__
#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 bool IRC_Send_LUSERS PARAMS(( CLIENT *Client ));
GLOBAL bool IRC_Send_NAMES PARAMS(( CLIENT *Client, CHANNEL *Chan ));
GLOBAL bool IRC_Show_MOTD PARAMS(( CLIENT *Client ));
GLOBAL bool IRC_Send_WHO PARAMS(( CLIENT *Client, CHANNEL *Chan, bool OnlyOps ));
#endif
/* -eof- */

View File

@@ -2,53 +2,51 @@
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: irc-login.c,v 1.2 2002/03/02 00:49:11 alex Exp $
*
* irc-login.c: Anmeldung und Abmeldung im IRC
*
* $Log: irc-login.c,v $
* Revision 1.2 2002/03/02 00:49:11 alex
* - Bei der USER-Registrierung wird NICK nicht mehr sofort geforwarded,
* sondern erst dann, wenn auch ein gueltiges USER empfangen wurde.
*
* Revision 1.1 2002/02/27 23:26:21 alex
* - Modul aus irc.c bzw. irc.h ausgegliedert.
* 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.
*
* Login and logout
*/
#include <portab.h>
#include "global.h"
#include "portab.h"
#include <imp.h>
static char UNUSED id[] = "$Id: irc-login.c,v 1.44.2.1 2005/12/15 11:01:59 alex Exp $";
#include "imp.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include "ngircd.h"
#include "resolve.h"
#include "conn-func.h"
#include "conf.h"
#include "irc.h"
#include "irc-write.h"
#include "client.h"
#include "channel.h"
#include "log.h"
#include "messages.h"
#include "parse.h"
#include "irc.h"
#include "irc-info.h"
#include "irc-write.h"
#include "cvs-version.h"
#include <exp.h>
#include "exp.h"
#include "irc-login.h"
LOCAL BOOLEAN Hello_User( CLIENT *Client );
LOCAL VOID Kill_Nick( CHAR *Nick, CHAR *Reason );
LOCAL bool Hello_User PARAMS(( CLIENT *Client ));
LOCAL void Kill_Nick PARAMS(( char *Nick, char *Reason ));
GLOBAL BOOLEAN IRC_PASS( CLIENT *Client, REQUEST *Req )
GLOBAL bool
IRC_PASS( CLIENT *Client, REQUEST *Req )
{
assert( Client != NULL );
assert( Req != NULL );
@@ -69,13 +67,71 @@ GLOBAL BOOLEAN 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;
/* noch nicht registrierte Server-Verbindung */
Log( LOG_DEBUG, "Connection %d: got PASS command (new server link) ...", Client_Conn( Client ));
/* Passwort speichern */
Client_SetPassword( Client, Req->argv[0] );
/* Protokollversion ermitteln */
if( strlen( Req->argv[1] ) >= 4 )
{
c2 = Req->argv[1][2];
c4 = Req->argv[1][4];
Req->argv[1][4] = '\0';
protolow = atoi( &Req->argv[1][2] );
Req->argv[1][2] = '\0';
protohigh = atoi( Req->argv[1] );
Req->argv[1][2] = c2;
Req->argv[1][4] = c4;
}
else protohigh = protolow = 0;
/* Protokoll-Typ */
if( strlen( Req->argv[1] ) > 4 ) type = &Req->argv[1][4];
else type = NULL;
/* IRC-Flags (nach RFC 2813) */
if( Req->argc >= 4 ) ircflags = Req->argv[3];
else ircflags = "";
/* Implementation, Version und ngIRCd-Flags */
impl = Req->argv[2];
ptr = strchr( impl, '|' );
if( ptr ) *ptr = '\0';
if( type && ( strcmp( type, PROTOIRCPLUS ) == 0 ))
{
/* auf der anderen Seite laeuft ein Server, der
* ebenfalls das IRC+-Protokoll versteht */
serverver = ptr + 1;
flags = strchr( serverver, ':' );
if( flags )
{
*flags = '\0';
flags++;
}
else flags = "";
Log( LOG_INFO, "Peer announces itself as %s-%s using protocol %d.%d/IRC+ (flags: \"%s\").", impl, serverver, protohigh, protolow, flags );
}
else
{
/* auf der anderen Seite laeuft ein Server, der
* nur das Originalprotokoll unterstuetzt */
serverver = "";
if( strchr( ircflags, 'Z' )) flags = "Z";
else flags = "";
Log( LOG_INFO, "Peer announces itself as \"%s\" using protocol %d.%d (flags: \"%s\").", impl, protohigh, protolow, flags );
}
Client_SetType( Client, CLIENT_GOTPASSSERVER );
Client_SetFlags( Client, flags );
return CONNECTED;
}
else if(( Client_Type( Client ) == CLIENT_UNKNOWN ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER ))
@@ -87,356 +143,152 @@ GLOBAL BOOLEAN IRC_PASS( CLIENT *Client, REQUEST *Req )
} /* IRC_PASS */
GLOBAL BOOLEAN IRC_SERVER( CLIENT *Client, REQUEST *Req )
{
CHAR str[LINE_LEN], *ptr;
CLIENT *from, *c, *cl;
CL2CHAN *cl2chan;
INT max_hops, i;
CHANNEL *chan;
BOOLEAN ok;
assert( Client != NULL );
assert( Req != NULL );
/* Fehler liefern, wenn kein lokaler Client */
if( Client_Conn( Client ) <= NONE ) return IRC_WriteStrClient( Client, ERR_UNKNOWNCOMMAND_MSG, Client_ID( Client ), Req->command );
if( Client_Type( Client ) == CLIENT_GOTPASSSERVER )
{
/* Verbindung soll als Server-Server-Verbindung registriert werden */
Log( LOG_DEBUG, "Connection %d: got SERVER command (new server link) ...", Client_Conn( Client ));
/* Falsche Anzahl Parameter? */
if(( Req->argc != 2 ) && ( Req->argc != 3 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Ist dieser Server bei uns konfiguriert? */
for( i = 0; i < Conf_Server_Count; i++ ) if( strcasecmp( Req->argv[0], Conf_Server[i].name ) == 0 ) break;
if( i >= Conf_Server_Count )
{
/* 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 );
return DISCONNECTED;
}
if( strcmp( Client_Password( Client ), Conf_Server[i].pwd ) != 0 )
{
/* Falsches Passwort */
Log( LOG_ERR, "Connection %d: Bad password for server \"%s\"!", Client_Conn( Client ), Req->argv[0] );
Conn_Close( Client_Conn( Client ), NULL, "Bad password", TRUE );
return DISCONNECTED;
}
/* Ist ein Server mit dieser ID bereits registriert? */
if( ! Client_CheckID( Client, Req->argv[0] )) return DISCONNECTED;
/* Server-Strukturen fuellen ;-) */
Client_SetID( Client, Req->argv[0] );
Client_SetHops( Client, 1 );
Client_SetInfo( Client, Req->argv[Req->argc - 1] );
/* Meldet sich der Server bei uns an? */
if( Req->argc == 2 )
{
/* Unseren SERVER- und PASS-Befehl senden */
ok = TRUE;
if( ! IRC_WriteStrClient( Client, "PASS %s "PASSSERVERADD, Conf_Server[i].pwd )) ok = FALSE;
else ok = IRC_WriteStrClient( Client, "SERVER %s 1 :%s", Conf_ServerName, Conf_ServerInfo );
if( ! ok )
{
Conn_Close( Client_Conn( Client ), "Unexpected server behavior!", NULL, FALSE );
return DISCONNECTED;
}
Client_SetIntroducer( Client, Client );
Client_SetToken( Client, 1 );
}
else Client_SetToken( Client, atoi( Req->argv[1] ));
Log( LOG_NOTICE, "Server \"%s\" registered (connection %d, 1 hop - direct link).", Client_ID( Client ), Client_Conn( Client ));
Client_SetType( Client, CLIENT_SERVER );
/* maximalen Hop Count ermitteln */
max_hops = 0;
c = Client_First( );
while( c )
{
if( Client_Hops( c ) > max_hops ) max_hops = Client_Hops( c );
c = Client_Next( c );
}
/* Alle bisherigen Server dem neuen Server bekannt machen,
* die bisherigen Server ueber den neuen informierenn */
for( i = 0; i < ( max_hops + 1 ); i++ )
{
c = Client_First( );
while( c )
{
if(( Client_Type( c ) == CLIENT_SERVER ) && ( c != Client ) && ( c != Client_ThisServer( )) && ( Client_Hops( c ) == i ))
{
if( Client_Conn( c ) > NONE )
{
/* Dem gefundenen Server gleich den neuen
* Server bekannt machen */
if( ! IRC_WriteStrClient( c, "SERVER %s %d %d :%s", Client_ID( Client ), Client_Hops( Client ) + 1, Client_MyToken( Client ), Client_Info( Client ))) return DISCONNECTED;
}
/* Den neuen Server ueber den alten informieren */
if( ! IRC_WriteStrClientPrefix( Client, Client_Hops( c ) == 1 ? Client_ThisServer( ) : Client_Introducer( c ), "SERVER %s %d %d :%s", Client_ID( c ), Client_Hops( c ) + 1, Client_MyToken( c ), Client_Info( c ))) return DISCONNECTED;
}
c = Client_Next( c );
}
}
/* alle User dem neuen Server bekannt machen */
c = Client_First( );
while( c )
{
if( Client_Type( c ) == CLIENT_USER )
{
/* User an neuen Server melden */
if( ! IRC_WriteStrClient( Client, "NICK %s %d %s %s %d +%s :%s", Client_ID( c ), Client_Hops( c ) + 1, Client_User( c ), Client_Hostname( c ), Client_MyToken( Client_Introducer( c )), Client_Modes( c ), Client_Info( c ))) return DISCONNECTED;
}
c = Client_Next( c );
}
/* Channels dem neuen Server bekannt machen */
chan = Channel_First( );
while( chan )
{
sprintf( str, "NJOIN %s :", Channel_Name( chan ));
/* alle Member suchen */
cl2chan = Channel_FirstMember( chan );
while( cl2chan )
{
cl = Channel_GetClient( cl2chan );
assert( cl != NULL );
/* Nick, ggf. mit Modes, anhaengen */
if( str[strlen( str ) - 1] != ':' ) strcat( str, "," );
if( strchr( Channel_UserModes( chan, cl ), 'v' )) strcat( str, "+" );
if( strchr( Channel_UserModes( chan, cl ), 'o' )) strcat( str, "@" );
strcat( str, Client_ID( cl ));
if( strlen( str ) > ( LINE_LEN - CLIENT_NICK_LEN - 4 ))
{
/* Zeile senden */
if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED;
sprintf( str, "NJOIN %s :", Channel_Name( chan ));
}
cl2chan = Channel_NextMember( chan, cl2chan );
}
/* noch Daten da? */
if( str[strlen( str ) - 1] != ':')
{
/* Ja; Also senden ... */
if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED;
}
/* naechsten Channel suchen */
chan = Channel_Next( chan );
}
return CONNECTED;
}
else if( Client_Type( Client ) == CLIENT_SERVER )
{
/* Neuer Server wird im Netz angekuendigt */
/* Falsche Anzahl Parameter? */
if( Req->argc != 4 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Ist ein Server mit dieser ID bereits registriert? */
if( ! Client_CheckID( Client, Req->argv[0] )) return DISCONNECTED;
/* Ueberfluessige Hostnamen aus Info-Text entfernen */
ptr = strchr( Req->argv[3] + 2, '[' );
if( ! ptr ) ptr = Req->argv[3];
from = Client_GetFromID( Req->prefix );
if( ! from )
{
/* 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 );
return DISCONNECTED;
}
/* Neue Client-Struktur anlegen */
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 );
return DISCONNECTED;
}
/* Log-Meldung zusammenbauen und ausgeben */
if(( Client_Hops( c ) > 1 ) && ( Req->prefix[0] )) sprintf( str, "connected to %s, ", Client_ID( from ));
else strcpy( str, "" );
Log( LOG_NOTICE, "Server \"%s\" registered (via %s, %s%d hop%s).", Client_ID( c ), Client_ID( Client ), str, Client_Hops( c ), Client_Hops( c ) > 1 ? "s": "" );
/* Andere Server informieren */
IRC_WriteStrServersPrefix( Client, from, "SERVER %s %d %d :%s", Client_ID( c ), Client_Hops( c ) + 1, Client_MyToken( c ), Client_Info( c ));
return CONNECTED;
}
else return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
} /* IRC_SERVER */
GLOBAL BOOLEAN IRC_NJOIN( CLIENT *Client, REQUEST *Req )
{
CHAR *channame, *ptr, modes[8];
BOOLEAN is_op, is_voiced;
CHANNEL *chan;
CLIENT *c;
assert( Client != NULL );
assert( Req != NULL );
if( Client_Type( Client ) != CLIENT_SERVER ) return IRC_WriteStrClient( Client, ERR_NOTREGISTEREDSERVER_MSG, Client_ID( Client ));
/* Falsche Anzahl Parameter? */
if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
channame = Req->argv[0];
ptr = strtok( Req->argv[1], "," );
while( ptr )
{
is_op = is_voiced = FALSE;
/* Prefixe abschneiden */
while(( *ptr == '@' ) || ( *ptr == '+' ))
{
if( *ptr == '@' ) is_op = TRUE;
if( *ptr == '+' ) is_voiced = TRUE;
ptr++;
}
c = Client_GetFromID( ptr );
if( c )
{
Channel_Join( c, channame );
chan = Channel_Search( channame );
assert( chan != NULL );
if( is_op ) Channel_UserModeAdd( chan, c, 'o' );
if( is_voiced ) Channel_UserModeAdd( chan, c, 'v' );
/* im Channel bekannt machen */
IRC_WriteStrChannelPrefix( Client, chan, c, FALSE, "JOIN :%s", channame );
/* Channel-User-Modes setzen */
strcpy( modes, Channel_UserModes( chan, c ));
if( modes[0] )
{
/* Modes im Channel bekannt machen */
IRC_WriteStrChannelPrefix( Client, chan, Client, FALSE, "MODE %s +%s %s", channame, modes, Client_ID( c ));
}
}
else Log( LOG_ERR, "Got NJOIN for unknown nick \"%s\" for channel \"%s\"!", ptr, channame );
/* naechsten Nick suchen */
ptr = strtok( NULL, "," );
}
/* an andere Server weiterleiten */
IRC_WriteStrServersPrefix( Client, Client_ThisServer( ), "NJOIN %s :%s", Req->argv[0], Req->argv[1] );
return CONNECTED;
} /* IRC_NJOIN */
GLOBAL BOOLEAN IRC_NICK( CLIENT *Client, REQUEST *Req )
/**
* IRC "NICK" command.
* This function implements the IRC command "NICK" which is used to register
* with the server, to change already registered nicknames and to introduce
* new users which are connected to other servers.
*/
GLOBAL bool
IRC_NICK( CLIENT *Client, REQUEST *Req )
{
CLIENT *intr_c, *target, *c;
CHAR *modes;
char *modes;
assert( Client != NULL );
assert( Req != NULL );
/* Zumindest BitchX sendet NICK-USER in der falschen Reihenfolge. */
#ifndef STRICT_RFC
if( Client_Type( Client ) == CLIENT_UNKNOWN || Client_Type( Client ) == CLIENT_GOTPASS || Client_Type( Client ) == CLIENT_GOTNICK || Client_Type( Client ) == CLIENT_GOTUSER || Client_Type( Client ) == CLIENT_USER || ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
/* Some IRC clients, for example BitchX, send the NICK and USER
* commands in the wrong order ... */
if( Client_Type( Client ) == CLIENT_UNKNOWN
|| Client_Type( Client ) == CLIENT_GOTPASS
|| Client_Type( Client ) == CLIENT_GOTNICK
|| Client_Type( Client ) == CLIENT_GOTUSER
|| Client_Type( Client ) == CLIENT_USER
|| ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
#else
if( Client_Type( Client ) == CLIENT_UNKNOWN || Client_Type( Client ) == CLIENT_GOTPASS || Client_Type( Client ) == CLIENT_GOTNICK || Client_Type( Client ) == CLIENT_USER || ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
if( Client_Type( Client ) == CLIENT_UNKNOWN
|| Client_Type( Client ) == CLIENT_GOTPASS
|| Client_Type( Client ) == CLIENT_GOTNICK
|| Client_Type( Client ) == CLIENT_USER
|| ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
#endif
{
/* User-Registrierung bzw. Nick-Aenderung */
/* User registration or change of nickname */
/* Falsche Anzahl Parameter? */
if( Req->argc != 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Wrong number of arguments? */
if( Req->argc != 1 )
return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG,
Client_ID( Client ),
Req->command );
/* "Ziel-Client" ermitteln */
/* Search "target" client */
if( Client_Type( Client ) == CLIENT_SERVER )
{
target = Client_GetFromID( Req->prefix );
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
target = Client_Search( Req->prefix );
if( ! target )
return IRC_WriteStrClient( Client,
ERR_NOSUCHNICK_MSG,
Client_ID( Client ),
Req->argv[0] );
}
else
{
/* Ist der Client "restricted"? */
if( Client_HasMode( Client, 'r' )) return IRC_WriteStrClient( Client, ERR_RESTRICTED_MSG, Client_ID( Client ));
/* Is this a restricted client? */
if( Client_HasMode( Client, 'r' ))
return IRC_WriteStrClient( Client,
ERR_RESTRICTED_MSG,
Client_ID( Client ));
target = Client;
}
#ifndef STRICT_RFC
/* Wenn der Client zu seinem eigenen Nick wechseln will, so machen
* wir nichts. So macht es das Original und mind. Snak hat probleme,
* wenn wir es nicht so machen. Ob es so okay ist? Hm ... */
if( strcmp( Client_ID( target ), Req->argv[0] ) == 0 ) return CONNECTED;
/* If the clients tries to change to its own nickname we won't
* do anything. This is how the original ircd behaves and some
* clients (for example Snak) expect it to be like this.
* But I doubt that this is "really the right thing" ... */
if( strcmp( Client_ID( target ), Req->argv[0] ) == 0 )
return CONNECTED;
#endif
/* pruefen, ob Nick bereits vergeben. Speziallfall: der Client
* will nur die Gross- und Kleinschreibung aendern. Das darf
* er natuerlich machen :-) */
/* Check that the new nickname is available. Special case:
* the client only changes from/to upper to lower case. */
if( strcasecmp( Client_ID( target ), Req->argv[0] ) != 0 )
{
if( ! Client_CheckNick( target, Req->argv[0] )) return CONNECTED;
if( ! Client_CheckNick( target, Req->argv[0] ))
return CONNECTED;
}
if(( Client_Type( target ) != CLIENT_USER ) && ( Client_Type( target ) != CLIENT_SERVER ))
if(( Client_Type( target ) != CLIENT_USER )
&& ( Client_Type( target ) != CLIENT_SERVER ))
{
/* Neuer Client */
Log( LOG_DEBUG, "Connection %d: got valid NICK command ...", Client_Conn( Client ));
/* New client */
Log( LOG_DEBUG, "Connection %d: got valid NICK command ...",
Client_Conn( Client ));
/* Client-Nick registrieren */
/* Register new nickname of this client */
Client_SetID( target, Req->argv[0] );
/* schon ein USER da? Dann registrieren! */
if( Client_Type( Client ) == CLIENT_GOTUSER ) return Hello_User( Client );
else Client_SetType( Client, CLIENT_GOTNICK );
/* If we received a valid USER command already then
* register the new client! */
if( Client_Type( Client ) == CLIENT_GOTUSER )
return Hello_User( Client );
else
Client_SetType( Client, CLIENT_GOTNICK );
}
else
{
/* Nick-Aenderung */
Log( LOG_INFO, "User \"%s\" changed nick: \"%s\" -> \"%s\".", Client_Mask( target ), Client_ID( target ), Req->argv[0] );
/* Nickname change */
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] );
}
else
{
/* Remote client */
Log( LOG_DEBUG,
"User \"%s\" changed nick: \"%s\" -> \"%s\".",
Client_Mask( target ), Client_ID( target ),
Req->argv[0] );
}
/* alle betroffenen User und Server ueber Nick-Aenderung informieren */
if( Client_Type( Client ) == CLIENT_USER ) IRC_WriteStrClientPrefix( Client, Client, "NICK :%s", Req->argv[0] );
IRC_WriteStrServersPrefix( Client, target, "NICK :%s", Req->argv[0] );
IRC_WriteStrRelatedPrefix( target, target, FALSE, "NICK :%s", Req->argv[0] );
/* Inform all users and servers (which have to know)
* of this nickname change */
if( Client_Type( Client ) == CLIENT_USER )
IRC_WriteStrClientPrefix( Client, Client,
"NICK :%s",
Req->argv[0] );
IRC_WriteStrServersPrefix( Client, target,
"NICK :%s", Req->argv[0] );
IRC_WriteStrRelatedPrefix( target, target, false,
"NICK :%s", Req->argv[0] );
/* neuen Client-Nick speichern */
/* Register old nickname for WHOWAS queries */
Client_RegisterWhowas( target );
/* Save new nickname */
Client_SetID( target, Req->argv[0] );
IRC_SetPenalty( target, 2 );
}
return CONNECTED;
}
else if( Client_Type( Client ) == CLIENT_SERVER )
{
/* Server fuehrt neuen Client ein */
/* Server introduces new client */
/* Falsche Anzahl Parameter? */
if( Req->argc != 7 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Nick ueberpruefen */
c = Client_GetFromID( Req->argv[0] );
c = Client_Search( Req->argv[0] );
if( c )
{
/* Der neue Nick ist auf diesem Server bereits registriert:
@@ -457,7 +309,7 @@ GLOBAL BOOLEAN 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.
@@ -481,8 +333,13 @@ GLOBAL BOOLEAN IRC_NICK( CLIENT *Client, REQUEST *Req )
} /* IRC_NICK */
GLOBAL BOOLEAN IRC_USER( CLIENT *Client, REQUEST *Req )
GLOBAL bool
IRC_USER( CLIENT *Client, REQUEST *Req )
{
#ifdef IDENTAUTH
char *ptr;
#endif
assert( Client != NULL );
assert( Req != NULL );
@@ -492,11 +349,21 @@ GLOBAL BOOLEAN IRC_USER( CLIENT *Client, REQUEST *Req )
if( Client_Type( Client ) == CLIENT_GOTNICK || Client_Type( Client ) == CLIENT_GOTPASS )
#endif
{
/* Falsche Anzahl Parameter? */
/* Wrong number of parameters? */
if( Req->argc != 4 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
Client_SetUser( Client, Req->argv[0], FALSE );
Client_SetInfo( Client, Req->argv[3] );
/* User name */
#ifdef IDENTAUTH
ptr = Client_User( Client );
if( ! ptr || ! *ptr || *ptr == '~' ) Client_SetUser( Client, Req->argv[0], false );
#else
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
* can't deal with such "real names" (e. g. "USER user * * :") ... */
if( *Req->argv[3] ) Client_SetInfo( Client, Req->argv[3] );
else Client_SetInfo( Client, "-" );
Log( LOG_DEBUG, "Connection %d: got valid USER command ...", Client_Conn( Client ));
if( Client_Type( Client ) == CLIENT_GOTNICK ) return Hello_User( Client );
@@ -511,119 +378,77 @@ GLOBAL BOOLEAN IRC_USER( CLIENT *Client, REQUEST *Req )
} /* IRC_USER */
GLOBAL BOOLEAN IRC_QUIT( CLIENT *Client, REQUEST *Req )
GLOBAL bool
IRC_QUIT( CLIENT *Client, REQUEST *Req )
{
CLIENT *target;
char quitmsg[LINE_LEN];
assert( Client != NULL );
assert( Req != NULL );
if(( Client_Type( Client ) == CLIENT_USER ) || ( Client_Type( Client ) == CLIENT_SERVICE ))
{
/* User / Service */
/* Falsche Anzahl Parameter? */
if( Req->argc > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Wrong number of arguments? */
if( Req->argc > 1 )
return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
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;
}
else if ( Client_Type( Client ) == CLIENT_SERVER )
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 )
{
Log( LOG_ERR, "Got QUIT from %s for unknown client!?", Client_ID( Client ));
/* Den Client kennen wir nicht (mehr), also nichts zu tun. */
Log( LOG_WARNING, "Got QUIT from %s for unknown client!?", Client_ID( Client ));
return CONNECTED;
}
if( Req->argc == 0 ) Client_Destroy( target, "Got QUIT command.", NULL );
else Client_Destroy( target, "Got QUIT command.", Req->argv[0] );
Client_Destroy( target, "Got QUIT command.", Req->argc == 1 ? quitmsg : NULL, true);
return CONNECTED;
}
else return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
} /* IRC_QUIT */
GLOBAL BOOLEAN IRC_SQUIT( CLIENT *Client, REQUEST *Req )
{
CLIENT *target;
CHAR msg[LINE_LEN + 64];
assert( Client != NULL );
assert( Req != NULL );
/* SQUIT ist nur fuer Server erlaubt */
if( Client_Type( Client ) != CLIENT_SERVER ) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
/* Falsche Anzahl Parameter? */
if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
Log( LOG_DEBUG, "Got SQUIT from %s for \"%s\": \"%s\" ...", Client_ID( Client ), Req->argv[0], Req->argv[1] );
/* SQUIT an alle Server weiterleiten */
IRC_WriteStrServers( Client, "SQUIT %s :%s", Req->argv[0], Req->argv[1] );
target = Client_GetFromID( Req->argv[0] );
if( ! target )
{
Log( LOG_ERR, "Got SQUIT from %s for unknown server \"%s\"!?", Client_ID( Client ), Req->argv[0] );
return CONNECTED;
}
if( Req->argv[1][0] )
{
if( strlen( Req->argv[1] ) > LINE_LEN ) Req->argv[1][LINE_LEN] = '\0';
sprintf( msg, "%s (SQUIT from %s).", Req->argv[1], Client_ID( Client ));
}
else sprintf( msg, "Got SQUIT from %s.", Client_ID( Client ));
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 );
return DISCONNECTED;
}
else
{
/* Verbindung hielt anderer Server */
Client_Destroy( target, msg, Req->argv[1] );
return CONNECTED;
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);
return DISCONNECTED;
}
} /* IRC_SQUIT */
} /* IRC_QUIT */
GLOBAL BOOLEAN IRC_PING( CLIENT *Client, REQUEST *Req )
GLOBAL bool
IRC_PING( CLIENT *Client, REQUEST *Req )
{
CLIENT *target, *from;
assert( Client != NULL );
assert( Req != NULL );
if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
/* Falsche Anzahl Parameter? */
if( Req->argc < 1 ) return IRC_WriteStrClient( Client, ERR_NOORIGIN_MSG, Client_ID( Client ));
#ifdef STRICT_RFC
if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
#endif
if( Req->argc == 2 )
if( Req->argc > 1 )
{
/* es wurde ein Ziel-Client angegeben */
target = Client_GetFromID( Req->argv[1] );
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] );
target = Client_Search( Req->argv[1] );
if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] );
if( target != Client_ThisServer( ))
{
/* ok, forwarden */
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_GetFromID( Req->prefix );
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
else from = Client;
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix );
return IRC_WriteStrClientPrefix( target, from, "PING %s :%s", Client_ID( from ), Req->argv[1] );
@@ -631,19 +456,26 @@ GLOBAL BOOLEAN IRC_PING( CLIENT *Client, REQUEST *Req )
}
Log( LOG_DEBUG, "Connection %d: got PING, sending PONG ...", Client_Conn( Client ));
return IRC_WriteStrClient( Client, "PONG %s :%s", Client_ID( Client_ThisServer( )), Client_ID( 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
} /* IRC_PING */
GLOBAL BOOLEAN IRC_PONG( CLIENT *Client, REQUEST *Req )
GLOBAL bool
IRC_PONG( CLIENT *Client, REQUEST *Req )
{
CLIENT *target, *from;
assert( Client != NULL );
assert( Req != NULL );
if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
/* Falsche Anzahl Parameter? */
if( Req->argc < 1 ) return IRC_WriteStrClient( Client, ERR_NOORIGIN_MSG, Client_ID( Client ));
if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
@@ -651,12 +483,12 @@ GLOBAL BOOLEAN IRC_PONG( CLIENT *Client, REQUEST *Req )
/* forwarden? */
if( Req->argc == 2 )
{
target = Client_GetFromID( Req->argv[1] );
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] );
target = Client_Search( Req->argv[1] );
if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] );
if( target != Client_ThisServer( ))
{
/* ok, forwarden */
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_GetFromID( Req->prefix );
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
else from = Client;
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix );
return IRC_WriteStrClientPrefix( target, from, "PONG %s :%s", Client_ID( from ), Req->argv[1] );
@@ -664,7 +496,7 @@ GLOBAL BOOLEAN IRC_PONG( CLIENT *Client, REQUEST *Req )
}
/* Der Connection-Timestamp wurde schon beim Lesen aus dem Socket
* aktualisiert, daher muss das hier nicht mehr gemacht werden. */
* aktualisiert, daher muss das hier nicht mehr gemacht werden. */
if( Client_Conn( Client ) > NONE ) Log( LOG_DEBUG, "Connection %d: received PONG. Lag: %ld seconds.", Client_Conn( Client ), time( NULL ) - Conn_LastPing( Client_Conn( Client )));
else Log( LOG_DEBUG, "Connection %d: received PONG.", Client_Conn( Client ));
@@ -673,53 +505,80 @@ GLOBAL BOOLEAN IRC_PONG( CLIENT *Client, REQUEST *Req )
} /* IRC_PONG */
LOCAL BOOLEAN Hello_User( CLIENT *Client )
LOCAL bool
Hello_User( CLIENT *Client )
{
#ifdef CVSDATE
char ver[12], vertxt[30];
#endif
assert( Client != NULL );
/* Passwort ueberpruefen */
/* Check password ... */
if( strcmp( Client_Password( Client ), Conf_ServerPwd ) != 0 )
{
/* Falsches Passwort */
/* 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;
}
Log( LOG_NOTICE, "User \"%s\" registered (connection %d).", Client_Mask( Client ), Client_Conn( Client ));
/* Andere Server informieren */
/* Inform other servers */
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 ));
if( ! IRC_WriteStrClient( Client, RPL_WELCOME_MSG, Client_ID( Client ), Client_Mask( Client ))) return FALSE;
if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )))) return FALSE;
if( ! IRC_WriteStrClient( Client, RPL_CREATED_MSG, Client_ID( Client ), NGIRCd_StartStr )) return FALSE;
if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )))) return FALSE;
/* Welcome :-) */
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 );
snprintf( vertxt, sizeof( vertxt ), "%s(%s)", PACKAGE_VERSION, ver );
if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), vertxt, TARGET_CPU, TARGET_VENDOR, TARGET_OS )) return false;
#else
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;
#ifdef CVSDATE
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;
#endif
/* Features */
if( ! IRC_WriteStrClient( Client, RPL_ISUPPORT_MSG, Client_ID( Client ), CLIENT_NICK_LEN - 1, CHANNEL_TOPIC_LEN - 1, CLIENT_AWAY_LEN - 1, Conf_MaxJoins )) return DISCONNECTED;
Client_SetType( Client, CLIENT_USER );
if( ! IRC_Send_LUSERS( Client )) return DISCONNECTED;
if( ! IRC_Show_MOTD( Client )) return DISCONNECTED;
/* Suspend the client for a second ... */
IRC_SetPenalty( Client, 1 );
return CONNECTED;
} /* Hello_User */
LOCAL VOID Kill_Nick( CHAR *Nick, CHAR *Reason )
LOCAL void
Kill_Nick( char *Nick, char *Reason )
{
CLIENT *c;
REQUEST r;
assert( Nick != NULL );
assert( Reason != NULL );
r.prefix = (char *)Client_ThisServer( );
r.argv[0] = Nick;
r.argv[1] = Reason;
r.argc = 2;
Log( LOG_ERR, "User(s) with nick \"%s\" will be disconnected: %s", Nick, Reason );
/* andere Server benachrichtigen */
IRC_WriteStrServers( NULL, "KILL %s :%s", Nick, Reason );
/* Ggf. einen eigenen Client toeten */
c = Client_GetFromID( Nick );
if( c && ( Client_Conn( c ) != NONE )) Conn_Close( Client_Conn( c ), NULL, Reason, TRUE );
IRC_KILL( Client_ThisServer( ), &r );
} /* Kill_Nick */

View File

@@ -2,40 +2,28 @@
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* 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: irc-login.h,v 1.1 2002/02/27 23:26:21 alex Exp $
*
* irc-login.h: Anmeldung und Abmeldung im IRC (Header)
*
* $Log: irc-login.h,v $
* Revision 1.1 2002/02/27 23:26:21 alex
* - Modul aus irc.c bzw. irc.h ausgegliedert.
* $Id: irc-login.h,v 1.6 2005/03/19 18:43:48 fw Exp $
*
* Login and logout (header)
*/
#ifndef __irc_login_h__
#define __irc_login_h__
#include "parse.h"
#include "client.h"
GLOBAL BOOLEAN IRC_PASS( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_NICK( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_USER( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_SERVER( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_NJOIN( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_PING( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_PONG( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_QUIT( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_SQUIT( CLIENT *Client, REQUEST *Req );
GLOBAL bool IRC_PASS PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_NICK PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_USER PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_PING PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_PONG PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_QUIT PARAMS((CLIENT *Client, REQUEST *Req ));
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -2,36 +2,27 @@
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* 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: irc-mode.h,v 1.1 2002/02/27 23:26:21 alex Exp $
*
* irc-mode.h: IRC-Befehle zur Mode-Aenderung (MODE, AWAY, ...) (Header)
*
* $Log: irc-mode.h,v $
* Revision 1.1 2002/02/27 23:26:21 alex
* - Modul aus irc.c bzw. irc.h ausgegliedert.
* $Id: irc-mode.h,v 1.6 2005/03/19 18:43:48 fw Exp $
*
* IRC commands for mode changes (header)
*/
#ifndef __irc_mode_h__
#define __irc_mode_h__
#include "parse.h"
#include "client.h"
GLOBAL BOOLEAN IRC_MODE( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_AWAY( CLIENT *Client, REQUEST *Req );
GLOBAL bool IRC_MODE PARAMS((CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_AWAY PARAMS((CLIENT *Client, REQUEST *Req ));
#endif
/* -eof- */
/* -eof- */

126
src/ngircd/irc-op.c Normal file
View File

@@ -0,0 +1,126 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001-2005 by Alexander Barton (alex@barton.de)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* 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.
*
* Channel operator commands
*/
#include "portab.h"
static char UNUSED id[] = "$Id: irc-op.c,v 1.15 2005/04/27 07:39:18 alex Exp $";
#include "imp.h"
#include <assert.h>
#include <string.h>
#include <stdio.h>
#include "defines.h"
#include "conn.h"
#include "client.h"
#include "channel.h"
#include "irc-write.h"
#include "lists.h"
#include "log.h"
#include "messages.h"
#include "parse.h"
#include "exp.h"
#include "irc-op.h"
GLOBAL bool
IRC_KICK( CLIENT *Client, REQUEST *Req )
{
CLIENT *target, *from;
assert( Client != NULL );
assert( Req != NULL );
/* Falsche Anzahl Parameter? */
if(( Req->argc < 2) || ( Req->argc > 3 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
else from = Client;
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
/* Ziel-User suchen */
target = Client_Search( Req->argv[1] );
if( ! target ) return IRC_WriteStrClient( from, ERR_NOSUCHNICK_MSG, Client_ID( from ), Req->argv[1] );
Channel_Kick( target, from, Req->argv[0], Req->argc == 3 ? Req->argv[2] : Client_ID( from ));
return CONNECTED;
} /* IRC_KICK */
GLOBAL bool
IRC_INVITE( CLIENT *Client, REQUEST *Req )
{
CHANNEL *chan;
CLIENT *target, *from;
bool remember = false;
assert( Client != NULL );
assert( Req != NULL );
/* Wrong number of parameters? */
if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
else from = Client;
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
/* Search user */
target = Client_Search( Req->argv[0] );
if(( ! target ) || ( Client_Type( target ) != CLIENT_USER )) return IRC_WriteStrClient( from, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
chan = Channel_Search( Req->argv[1] );
if( chan )
{
/* Channel exists. Is the user a valid member of the channel? */
if( ! Channel_IsMemberOf( chan, from )) return IRC_WriteStrClient( from, ERR_NOTONCHANNEL_MSG, Client_ID( Client ), Req->argv[1] );
/* Is the channel "invite-only"? */
if( strchr( Channel_Modes( chan ), 'i' ))
{
/* 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;
}
/* 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( remember )
{
/* We must memember this invite */
if( ! Lists_AddInvited( Client_Mask( target ), chan, true)) return CONNECTED;
}
}
Log( LOG_DEBUG, "User \"%s\" invites \"%s\" to \"%s\" ...", Client_Mask( from ), Req->argv[0], Req->argv[1] );
/* Inform target client */
IRC_WriteStrClientPrefix( target, from, "INVITE %s %s", Req->argv[0], Req->argv[1] );
if( Client_Conn( target ) > NONE )
{
/* The target user is local, so we have to send the status code */
if( ! IRC_WriteStrClientPrefix( from, target, RPL_INVITING_MSG, Client_ID( from ), Req->argv[0], Req->argv[1] )) return DISCONNECTED;
}
return CONNECTED;
} /* IRC_INVITE */
/* -eof- */

28
src/ngircd/irc-op.h Normal file
View File

@@ -0,0 +1,28 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* 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
* 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: irc-op.h,v 1.4 2005/03/19 18:43:48 fw Exp $
*
* Channel operator commands (header)
*/
#ifndef __irc_op_h__
#define __irc_op_h__
GLOBAL bool IRC_KICK PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_INVITE PARAMS(( CLIENT *Client, REQUEST *Req ));
#endif
/* -eof- */

216
src/ngircd/irc-oper.c Normal file
View File

@@ -0,0 +1,216 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* 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
* 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 operator commands
*/
#include "portab.h"
static char UNUSED id[] = "$Id: irc-oper.c,v 1.22 2005/06/12 18:02:09 fw Exp $";
#include "imp.h"
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include "ngircd.h"
#include "resolve.h"
#include "conn.h"
#include "conf.h"
#include "client.h"
#include "channel.h"
#include "irc-write.h"
#include "log.h"
#include "match.h"
#include "messages.h"
#include "parse.h"
#include <exp.h>
#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
IRC_OPER( CLIENT *Client, REQUEST *Req )
{
int i;
assert( Client != NULL );
assert( Req != NULL );
/* Falsche Anzahl Parameter? */
if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Operator suchen */
for( i = 0; i < Conf_Oper_Count; i++)
{
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");
/* 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" );
if( ! Client_HasMode( Client, 'o' ))
{
/* noch kein o-Mode gesetzt */
Client_ModeAdd( Client, 'o' );
if( ! IRC_WriteStrClient( Client, "MODE %s :+o", Client_ID( Client ))) return DISCONNECTED;
IRC_WriteStrServersPrefix( NULL, Client, "MODE %s :+o", Client_ID( Client ));
}
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);
return IRC_WriteStrClient( Client, RPL_YOUREOPER_MSG, Client_ID( Client ));
} /* IRC_OPER */
GLOBAL bool
IRC_DIE( CLIENT *Client, REQUEST *Req )
{
/* Shut down server */
assert( Client != NULL );
assert( Req != NULL );
/* Not a local IRC operator? */
if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
/* Bad number of parameters? */
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;
return CONNECTED;
} /* IRC_DIE */
GLOBAL bool
IRC_REHASH( CLIENT *Client, REQUEST *Req )
{
/* Reload configuration file */
assert( Client != NULL );
assert( Req != NULL );
/* Not a local IRC operator? */
if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
/* Bad number of parameters? */
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;
return CONNECTED;
} /* IRC_REHASH */
GLOBAL bool
IRC_RESTART( CLIENT *Client, REQUEST *Req )
{
/* Restart IRC server (fork a new process) */
assert( Client != NULL );
assert( Req != NULL );
/* Not a local IRC operator? */
if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
/* Bad number of parameters? */
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;
return CONNECTED;
} /* IRC_RESTART */
GLOBAL bool
IRC_CONNECT(CLIENT *Client, REQUEST *Req )
{
/* Connect configured or new server */
assert( Client != NULL );
assert( Req != NULL );
/* Not a local IRC operator? */
if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
/* Bad number of parameters? */
if(( Req->argc != 2 ) && ( Req->argc != 5 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Invalid port number? */
if( atoi( Req->argv[1] ) < 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
Log( LOG_NOTICE|LOG_snotice, "Got CONNECT command from \"%s\" for \"%s\".", Client_Mask( Client ), Req->argv[0]);
if( Req->argc == 2 )
{
/* Connect configured server */
if( ! Conf_EnableServer( Req->argv[0], atoi( Req->argv[1] ))) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] );
}
else
{
/* Add server */
if( ! Conf_AddServer( Req->argv[0], atoi( Req->argv[1] ), Req->argv[2], Req->argv[3], Req->argv[4] )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] );
}
return CONNECTED;
} /* IRC_CONNECT */
GLOBAL bool
IRC_DISCONNECT(CLIENT *Client, REQUEST *Req )
{
/* Disconnect and disable configured server */
CONN_ID my_conn;
assert( Client != NULL );
assert( Req != NULL );
/* Not a local IRC operator? */
if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
/* Bad number of parameters? */
if( Req->argc != 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
Log( LOG_NOTICE|LOG_snotice, "Got DISCONNECT command from \"%s\" for0 \"%s\".", Client_Mask( Client ), Req->argv[0]);
/* Save ID of this connection */
my_conn = Client_Conn( Client );
/* Connect configured server */
if( ! Conf_DisableServer( Req->argv[0] )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] );
/* Are we still connected or were we killed, too? */
if( Client_GetFromConn( my_conn )) return CONNECTED;
else return DISCONNECTED;
} /* IRC_CONNECT */
/* -eof- */

32
src/ngircd/irc-oper.h Normal file
View File

@@ -0,0 +1,32 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* 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
* 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: irc-oper.h,v 1.11 2005/03/19 18:43:48 fw Exp $
*
* IRC operator commands (header)
*/
#ifndef __irc_oper_h__
#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 ));
#endif
/* -eof- */

427
src/ngircd/irc-server.c Normal file
View File

@@ -0,0 +1,427 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* 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
* 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 commands for server links
*/
#include "portab.h"
static char UNUSED id[] = "$Id: irc-server.c,v 1.38 2005/03/19 18:43:49 fw Exp $";
#include "imp.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include "defines.h"
#include "resolve.h"
#include "conn.h"
#include "conn-zip.h"
#include "conf.h"
#include "client.h"
#include "channel.h"
#include "irc-write.h"
#include "lists.h"
#include "log.h"
#include "messages.h"
#include "parse.h"
#include "ngircd.h"
#include "exp.h"
#include "irc-server.h"
GLOBAL bool
IRC_SERVER( CLIENT *Client, REQUEST *Req )
{
char str[LINE_LEN], *ptr, *modes, *topic;
CLIENT *from, *c, *cl;
CL2CHAN *cl2chan;
int max_hops, i;
CHANNEL *chan;
bool ok;
CONN_ID con;
assert( Client != NULL );
assert( Req != NULL );
/* Fehler liefern, wenn kein lokaler Client */
if( Client_Conn( Client ) <= NONE ) return IRC_WriteStrClient( Client, ERR_UNKNOWNCOMMAND_MSG, Client_ID( Client ), Req->command );
if( Client_Type( Client ) == CLIENT_GOTPASSSERVER )
{
/* Verbindung soll als Server-Server-Verbindung registriert werden */
Log( LOG_DEBUG, "Connection %d: got SERVER command (new server link) ...", Client_Conn( Client ));
/* Falsche Anzahl Parameter? */
if(( Req->argc != 2 ) && ( Req->argc != 3 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Ist dieser Server bei uns konfiguriert? */
for( i = 0; i < MAX_SERVERS; i++ ) if( strcasecmp( Req->argv[0], Conf_Server[i].name ) == 0 ) break;
if( i >= MAX_SERVERS )
{
/* 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);
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);
return DISCONNECTED;
}
/* Ist ein Server mit dieser ID bereits registriert? */
if( ! Client_CheckID( Client, Req->argv[0] )) return DISCONNECTED;
/* Server-Strukturen fuellen ;-) */
Client_SetID( Client, Req->argv[0] );
Client_SetHops( Client, 1 );
Client_SetInfo( Client, Req->argv[Req->argc - 1] );
/* Meldet sich der Server bei uns an (d.h., bauen nicht wir
* selber die Verbindung zu einem anderen Server auf)? */
con = Client_Conn( Client );
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;
else ok = IRC_WriteStrClient( Client, "SERVER %s 1 :%s", Conf_ServerName, Conf_ServerInfo );
if( ! ok )
{
Conn_Close( con, "Unexpected server behavior!", NULL, false );
return DISCONNECTED;
}
Client_SetIntroducer( Client, Client );
Client_SetToken( Client, 1 );
}
else
{
/* Ausgehende verbindung, SERVER und PASS wurden von uns bereits
* an die Gegenseite uerbermittelt */
Client_SetToken( Client, atoi( Req->argv[1] ));
}
Log( LOG_NOTICE|LOG_snotice, "Server \"%s\" registered (connection %d, 1 hop - direct link).", Client_ID( Client ), con );
Client_SetType( Client, CLIENT_SERVER );
Conf_SetServer( i, con );
#ifdef ZLIB
/* Kompression initialisieren, wenn erforderlich */
if( strchr( Client_Flags( Client ), 'Z' ))
{
if( ! Zip_InitConn( con ))
{
/* Fehler! */
Conn_Close( con, "Can't inizialize compression (zlib)!", NULL, false );
return DISCONNECTED;
}
}
#endif
/* maximalen Hop Count ermitteln */
max_hops = 0;
c = Client_First( );
while( c )
{
if( Client_Hops( c ) > max_hops ) max_hops = Client_Hops( c );
c = Client_Next( c );
}
/* Alle bisherigen Server dem neuen Server bekannt machen,
* die bisherigen Server ueber den neuen informierenn */
for( i = 0; i < ( max_hops + 1 ); i++ )
{
c = Client_First( );
while( c )
{
if(( Client_Type( c ) == CLIENT_SERVER ) && ( c != Client ) && ( c != Client_ThisServer( )) && ( Client_Hops( c ) == i ))
{
if( Client_Conn( c ) > NONE )
{
/* Dem gefundenen Server gleich den neuen
* Server bekannt machen */
if( ! IRC_WriteStrClient( c, "SERVER %s %d %d :%s", Client_ID( Client ), Client_Hops( Client ) + 1, Client_MyToken( Client ), Client_Info( Client ))) return DISCONNECTED;
}
/* Den neuen Server ueber den alten informieren */
if( ! IRC_WriteStrClientPrefix( Client, Client_Hops( c ) == 1 ? Client_ThisServer( ) : Client_Introducer( c ), "SERVER %s %d %d :%s", Client_ID( c ), Client_Hops( c ) + 1, Client_MyToken( c ), Client_Info( c ))) return DISCONNECTED;
}
c = Client_Next( c );
}
}
/* alle User dem neuen Server bekannt machen */
c = Client_First( );
while( c )
{
if( Client_Type( c ) == CLIENT_USER )
{
/* User an neuen Server melden */
if( ! IRC_WriteStrClient( Client, "NICK %s %d %s %s %d +%s :%s", Client_ID( c ), Client_Hops( c ) + 1, Client_User( c ), Client_Hostname( c ), Client_MyToken( Client_Introducer( c )), Client_Modes( c ), Client_Info( c ))) return DISCONNECTED;
}
c = Client_Next( c );
}
/* Channels dem neuen Server bekannt machen */
chan = Channel_First( );
while( chan )
{
#ifdef IRCPLUS
/* Send CHANINFO if the peer supports it */
if( strchr( Client_Flags( Client ), 'C' ))
{
#ifdef DEBUG
Log( LOG_DEBUG, "Sending CHANINFO commands ..." );
#endif
modes = Channel_Modes( chan );
topic = Channel_Topic( chan );
if( *modes || *topic )
{
/* send CHANINFO */
if(( ! strchr( Channel_Modes( chan ), 'k' )) && ( ! strchr( Channel_Modes( chan ), 'l' )) && ( ! *topic ))
{
/* "CHANINFO <chan> +<modes>" */
if( ! IRC_WriteStrClient( Client, "CHANINFO %s +%s", Channel_Name( chan ), modes )) return DISCONNECTED;
}
else if(( ! strchr( Channel_Modes( chan ), 'k' )) && ( ! strchr( Channel_Modes( chan ), 'l' )))
{
/* "CHANINFO <chan> +<modes> :<topic>" */
if( ! IRC_WriteStrClient( Client, "CHANINFO %s +%s :%s", Channel_Name( chan ), modes, topic )) return DISCONNECTED;
}
else
{
/* "CHANINFO <chan> +<modes> <key> <limit> :<topic>" */
if( ! IRC_WriteStrClient( Client, "CHANINFO %s +%s %s %ld :%s", Channel_Name( chan ), modes, strchr( Channel_Modes( chan ), 'k' ) ? Channel_Key( chan ) : "*", strchr( Channel_Modes( chan ), 'l' ) ? Channel_MaxUsers( chan ) : 0L, topic )) return DISCONNECTED;
}
}
}
#endif
/* alle Member suchen */
cl2chan = Channel_FirstMember( chan );
snprintf( str, sizeof( str ), "NJOIN %s :", Channel_Name( chan ));
while( cl2chan )
{
cl = Channel_GetClient( cl2chan );
assert( cl != NULL );
/* Nick, ggf. mit Modes, anhaengen */
if( str[strlen( str ) - 1] != ':' ) strlcat( str, ",", sizeof( str ));
if( strchr( Channel_UserModes( chan, cl ), 'v' )) strlcat( str, "+", sizeof( str ));
if( strchr( Channel_UserModes( chan, cl ), 'o' )) strlcat( str, "@", sizeof( str ));
strlcat( str, Client_ID( cl ), sizeof( str ));
if( strlen( str ) > ( LINE_LEN - CLIENT_NICK_LEN - 8 ))
{
/* Zeile senden */
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
snprintf( str, sizeof( str ), "NJOIN %s :", Channel_Name( chan ));
}
cl2chan = Channel_NextMember( chan, cl2chan );
}
/* noch Daten da? */
if( str[strlen( str ) - 1] != ':')
{
/* Ja; Also senden ... */
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
}
#ifdef IRCPLUS
if( strchr( Client_Flags( Client ), 'L' ))
{
#ifdef DEBUG
Log( LOG_DEBUG, "Synchronizing INVITE- and BAN-lists ..." );
#endif
/* Synchronize INVITE- and BAN-lists */
if( ! Lists_SendInvites( Client )) return DISCONNECTED;
if( ! Lists_SendBans( Client )) return DISCONNECTED;
}
#endif
/* naechsten Channel suchen */
chan = Channel_Next( chan );
}
return CONNECTED;
}
else if( Client_Type( Client ) == CLIENT_SERVER )
{
/* Neuer Server wird im Netz angekuendigt */
/* Falsche Anzahl Parameter? */
if( Req->argc != 4 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Ist ein Server mit dieser ID bereits registriert? */
if( ! Client_CheckID( Client, Req->argv[0] )) return DISCONNECTED;
/* Ueberfluessige Hostnamen aus Info-Text entfernen */
ptr = strchr( Req->argv[3] + 2, '[' );
if( ! ptr ) ptr = Req->argv[3];
from = Client_Search( Req->prefix );
if( ! from )
{
/* 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);
return DISCONNECTED;
}
/* Neue Client-Struktur anlegen */
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);
return DISCONNECTED;
}
/* Log-Meldung zusammenbauen und ausgeben */
if(( Client_Hops( c ) > 1 ) && ( Req->prefix[0] )) snprintf( str, sizeof( str ), "connected to %s, ", Client_ID( from ));
else strcpy( str, "" );
Log( LOG_NOTICE|LOG_snotice, "Server \"%s\" registered (via %s, %s%d hop%s).", Client_ID( c ), Client_ID( Client ), str, Client_Hops( c ), Client_Hops( c ) > 1 ? "s": "" );
/* Andere Server informieren */
IRC_WriteStrServersPrefix( Client, from, "SERVER %s %d %d :%s", Client_ID( c ), Client_Hops( c ) + 1, Client_MyToken( c ), Client_Info( c ));
return CONNECTED;
}
else return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
} /* IRC_SERVER */
GLOBAL bool
IRC_NJOIN( CLIENT *Client, REQUEST *Req )
{
char nick_in[COMMAND_LEN], nick_out[COMMAND_LEN], *channame, *ptr, modes[8];
bool is_op, is_voiced;
CHANNEL *chan;
CLIENT *c;
assert( Client != NULL );
assert( Req != NULL );
/* Falsche Anzahl Parameter? */
if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
strlcpy( nick_in, Req->argv[1], sizeof( nick_in ));
strcpy( nick_out, "" );
channame = Req->argv[0];
ptr = strtok( nick_in, "," );
while( ptr )
{
is_op = is_voiced = false;
/* Prefixe abschneiden */
while(( *ptr == '@' ) || ( *ptr == '+' ))
{
if( *ptr == '@' ) is_op = true;
if( *ptr == '+' ) is_voiced = true;
ptr++;
}
c = Client_Search( ptr );
if( c )
{
Channel_Join( c, channame );
chan = Channel_Search( channame );
assert( chan != NULL );
if( is_op ) Channel_UserModeAdd( chan, c, 'o' );
if( is_voiced ) Channel_UserModeAdd( chan, c, 'v' );
/* im Channel bekannt machen */
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 ));
}
if( nick_out[0] != '\0' ) strlcat( nick_out, ",", sizeof( nick_out ));
if( is_op ) strlcat( nick_out, "@", sizeof( nick_out ));
if( is_voiced ) strlcat( nick_out, "+", sizeof( nick_out ));
strlcat( nick_out, ptr, sizeof( nick_out ));
}
else Log( LOG_ERR, "Got NJOIN for unknown nick \"%s\" for channel \"%s\"!", ptr, channame );
/* naechsten Nick suchen */
ptr = strtok( NULL, "," );
}
/* an andere Server weiterleiten */
if( nick_out[0] != '\0' ) IRC_WriteStrServersPrefix( Client, Client_ThisServer( ), "NJOIN %s :%s", Req->argv[0], nick_out );
return CONNECTED;
} /* IRC_NJOIN */
GLOBAL bool
IRC_SQUIT( CLIENT *Client, REQUEST *Req )
{
CLIENT *target;
char msg[LINE_LEN + 64];
assert( Client != NULL );
assert( Req != NULL );
/* Falsche Anzahl Parameter? */
if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
Log( LOG_DEBUG, "Got SQUIT from %s for \"%s\": \"%s\" ...", Client_ID( Client ), Req->argv[0], Req->argv[1] );
target = Client_Search( Req->argv[0] );
if( ! target )
{
/* Den Server kennen wir nicht (mehr), also nichts zu tun. */
Log( LOG_WARNING, "Got SQUIT from %s for unknown server \"%s\"!?", Client_ID( Client ), Req->argv[0] );
return CONNECTED;
}
if( Req->argv[1][0] )
{
if( strlen( Req->argv[1] ) > LINE_LEN ) Req->argv[1][LINE_LEN] = '\0';
snprintf( msg, sizeof( msg ), "%s (SQUIT from %s).", Req->argv[1], Client_ID( Client ));
}
else snprintf( msg, sizeof( msg ), "Got SQUIT from %s.", Client_ID( Client ));
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);
return DISCONNECTED;
}
else
{
/* Verbindung hielt anderer Server */
Client_Destroy( target, msg, Req->argv[1], false );
return CONNECTED;
}
} /* IRC_SQUIT */
/* -eof- */

29
src/ngircd/irc-server.h Normal file
View File

@@ -0,0 +1,29 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* 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
* 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: irc-server.h,v 1.5 2005/03/19 18:43:49 fw Exp $
*
* IRC commands for server links (header)
*/
#ifndef __irc_server_h__
#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 ));
#endif
/* -eof- */

View File

@@ -1,72 +1,106 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
* Copyright (c)2001-2005 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: irc-write.c,v 1.1 2002/02/27 23:26:21 alex Exp $
*
* irc-write.c: IRC-Texte und Befehle ueber Netzwerk versenden
*
* $Log: irc-write.c,v $
* Revision 1.1 2002/02/27 23:26:21 alex
* - Modul aus irc.c bzw. irc.h ausgegliedert.
* 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.
*
* Sending IRC commands over the network
*/
#include <portab.h>
#include "global.h"
#include "portab.h"
#include <imp.h>
static char UNUSED id[] = "$Id: irc-write.c,v 1.18 2005/04/27 07:39:18 alex Exp $";
#include "imp.h"
#include <assert.h>
#include <stdarg.h>
#ifdef PROTOTYPES
# include <stdarg.h>
#else
# include <varargs.h>
#endif
#include <stdio.h>
#include <string.h>
#include <exp.h>
#include "defines.h"
#include "conn-func.h"
#include "client.h"
#include "channel.h"
#include "exp.h"
#include "irc-write.h"
CHAR *Get_Prefix( CLIENT *Target, CLIENT *Client );
#define SEND_TO_USER 1
#define SEND_TO_SERVER 2
GLOBAL BOOLEAN IRC_WriteStrClient( CLIENT *Client, CHAR *Format, ... )
LOCAL char *Get_Prefix PARAMS(( CLIENT *Target, CLIENT *Client ));
#ifdef PROTOTYPES
GLOBAL bool
IRC_WriteStrClient( CLIENT *Client, char *Format, ... )
#else
GLOBAL bool
IRC_WriteStrClient( Client, Format, va_alist )
CLIENT *Client;
char *Format;
va_dcl
#endif
{
CHAR buffer[1000];
BOOLEAN ok = CONNECTED;
char buffer[1000];
bool ok = CONNECTED;
va_list ap;
assert( Client != NULL );
assert( Format != NULL );
#ifdef PROTOTYPES
va_start( ap, Format );
#else
va_start( ap );
#endif
vsnprintf( buffer, 1000, Format, ap );
va_end( ap );
/* an den Client selber */
ok = IRC_WriteStrClientPrefix( Client, Client_ThisServer( ), buffer );
ok = IRC_WriteStrClientPrefix( Client, Client_ThisServer( ), "%s", buffer );
return ok;
} /* IRC_WriteStrClient */
GLOBAL BOOLEAN IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, CHAR *Format, ... )
#ifdef PROTOTYPES
GLOBAL bool
IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, char *Format, ... )
#else
GLOBAL bool
IRC_WriteStrClientPrefix( Client, Prefix, Format, va_alist )
CLIENT *Client;
CLIENT *Prefix;
char *Format;
va_dcl
#endif
{
/* Text an Clients, lokal bzw. remote, senden. */
CHAR buffer[1000];
char buffer[1000];
va_list ap;
assert( Client != NULL );
assert( Format != NULL );
assert( Prefix != NULL );
#ifdef PROTOTYPES
va_start( ap, Format );
#else
va_start( ap );
#endif
vsnprintf( buffer, 1000, Format, ap );
va_end( ap );
@@ -74,29 +108,56 @@ GLOBAL BOOLEAN IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, CHAR *F
} /* IRC_WriteStrClientPrefix */
GLOBAL BOOLEAN IRC_WriteStrChannel( CLIENT *Client, CHANNEL *Chan, BOOLEAN Remote, CHAR *Format, ... )
#ifdef PROTOTYPES
GLOBAL bool
IRC_WriteStrChannel( CLIENT *Client, CHANNEL *Chan, bool Remote, char *Format, ... )
#else
GLOBAL bool
IRC_WriteStrChannel( Client, Chan, Remote, Format, va_alist )
CLIENT *Client;
CHANNEL *Chan;
bool Remote;
char *Format;
va_dcl
#endif
{
CHAR buffer[1000];
char buffer[1000];
va_list ap;
assert( Client != NULL );
assert( Format != NULL );
#ifdef PROTOTYPES
va_start( ap, Format );
#else
va_start( ap );
#endif
vsnprintf( buffer, 1000, Format, ap );
va_end( ap );
return IRC_WriteStrChannelPrefix( Client, Chan, Client_ThisServer( ), Remote, buffer );
return IRC_WriteStrChannelPrefix( Client, Chan, Client_ThisServer( ), Remote, "%s", buffer );
} /* IRC_WriteStrChannel */
GLOBAL BOOLEAN IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )
#ifdef PROTOTYPES
GLOBAL bool
IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, bool Remote, char *Format, ... )
#else
GLOBAL bool
IRC_WriteStrChannelPrefix( Client, Chan, Prefix, Remote, Format, va_alist )
CLIENT *Client;
CHANNEL *Chan;
CLIENT *Prefix;
bool Remote;
char *Format;
va_dcl
#endif
{
BOOLEAN sock[MAX_CONNECTIONS], is_server[MAX_CONNECTIONS], ok = CONNECTED;
CHAR buffer[1000];
bool ok = CONNECTED;
char buffer[1000];
CL2CHAN *cl2chan;
CONN_ID conn;
CLIENT *c;
INT s, i;
va_list ap;
assert( Client != NULL );
@@ -104,11 +165,15 @@ GLOBAL BOOLEAN IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT
assert( Prefix != NULL );
assert( Format != NULL );
#ifdef PROTOTYPES
va_start( ap, Format );
#else
va_start( ap );
#endif
vsnprintf( buffer, 1000, Format, ap );
va_end( ap );
for( i = 0; i < MAX_CONNECTIONS; i++ ) sock[i] = FALSE;
Conn_ClearFlags( );
/* An alle Clients, die in den selben Channels sind.
* Dabei aber nur einmal je Remote-Server */
@@ -126,56 +191,114 @@ GLOBAL BOOLEAN IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT
if( c && ( c != Client ))
{
/* Ok, anderer Client */
s = Client_Conn( c );
assert( s >= 0 );
assert( s < MAX_CONNECTIONS );
sock[s] = TRUE;
if( Client_Type( c ) == CLIENT_SERVER ) is_server[s] = TRUE;
else is_server[s] = FALSE;
conn = Client_Conn( c );
if( Client_Type( c ) == CLIENT_SERVER ) Conn_SetFlag( conn, SEND_TO_SERVER );
else Conn_SetFlag( conn, SEND_TO_USER );
}
cl2chan = Channel_NextMember( Chan, cl2chan );
}
/* Senden ... */
for( i = 0; i < MAX_CONNECTIONS; i++ )
/* Senden: alle Verbindungen durchgehen ... */
conn = Conn_First( );
while( conn != NONE )
{
if( sock[i] )
{
if( is_server[i] ) ok = Conn_WriteStr( i, ":%s %s", Client_ID( Prefix ), buffer );
else ok = Conn_WriteStr( i, ":%s %s", Client_Mask( Prefix ), buffer );
if( ! ok ) break;
}
/* muessen Daten ueber diese Verbindung verschickt werden? */
if( Conn_Flag( conn ) == SEND_TO_SERVER) ok = Conn_WriteStr( conn, ":%s %s", Client_ID( Prefix ), buffer );
else if( Conn_Flag( conn ) == SEND_TO_USER ) ok = Conn_WriteStr( conn, ":%s %s", Client_Mask( Prefix ), buffer );
if( ! ok ) break;
/* naechste Verbindung testen */
conn = Conn_Next( conn );
}
return ok;
} /* IRC_WriteStrChannelPrefix */
GLOBAL VOID IRC_WriteStrServers( CLIENT *ExceptOf, CHAR *Format, ... )
#ifdef PROTOTYPES
GLOBAL void
IRC_WriteStrServers( CLIENT *ExceptOf, char *Format, ... )
#else
GLOBAL void
IRC_WriteStrServers( ExceptOf, Format, va_alist )
CLIENT *ExceptOf;
char *Format;
va_dcl
#endif
{
CHAR buffer[1000];
char buffer[1000];
va_list ap;
assert( Format != NULL );
#ifdef PROTOTYPES
va_start( ap, Format );
#else
va_start( ap );
#endif
vsnprintf( buffer, 1000, Format, ap );
va_end( ap );
/* an den Client selber */
return IRC_WriteStrServersPrefix( ExceptOf, Client_ThisServer( ), buffer );
IRC_WriteStrServersPrefix( ExceptOf, Client_ThisServer( ), "%s", buffer );
} /* IRC_WriteStrServers */
GLOBAL VOID IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *Format, ... )
#ifdef PROTOTYPES
GLOBAL void
IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, char *Format, ... )
#else
GLOBAL void
IRC_WriteStrServersPrefix( ExceptOf, Prefix, Format, va_alist )
CLIENT *ExceptOf;
CLIENT *Prefix;
char *Format;
va_dcl
#endif
{
CHAR buffer[1000];
char buffer[1000];
va_list ap;
assert( Format != NULL );
assert( Prefix != NULL );
#ifdef PROTOTYPES
va_start( ap, Format );
#else
va_start( ap );
#endif
vsnprintf( buffer, 1000, Format, ap );
va_end( ap );
IRC_WriteStrServersPrefixFlag( ExceptOf, Prefix, '\0', "%s", buffer );
} /* IRC_WriteStrServersPrefix */
#ifdef PROTOTYPES
GLOBAL void
IRC_WriteStrServersPrefixFlag( CLIENT *ExceptOf, CLIENT *Prefix, char Flag, char *Format, ... )
#else
GLOBAL void
IRC_WriteStrServersPrefixFlag( ExceptOf, Prefix, Flag, Format, va_alist )
CLIENT *ExceptOf;
CLIENT *Prefix;
char Flag;
char *Format;
va_dcl
#endif
{
char buffer[1000];
CLIENT *c;
va_list ap;
assert( Format != NULL );
assert( Prefix != NULL );
#ifdef PROTOTYPES
va_start( ap, Format );
#else
va_start( ap );
#endif
vsnprintf( buffer, 1000, Format, ap );
va_end( ap );
@@ -184,34 +307,49 @@ GLOBAL VOID IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *F
{
if(( Client_Type( c ) == CLIENT_SERVER ) && ( Client_Conn( c ) > NONE ) && ( c != Client_ThisServer( )) && ( c != ExceptOf ))
{
/* Ziel-Server gefunden */
IRC_WriteStrClientPrefix( c, Prefix, buffer );
/* Ziel-Server gefunden. Nun noch pruefen, ob Flags stimmen */
if(( Flag == '\0' ) || ( strchr( Client_Flags( c ), Flag ) != NULL )) IRC_WriteStrClientPrefix( c, Prefix, "%s", buffer );
}
c = Client_Next( c );
}
} /* IRC_WriteStrServersPrefix */
} /* IRC_WriteStrServersPrefixFlag */
GLOBAL BOOLEAN IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )
#ifdef PROTOTYPES
GLOBAL bool
IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, bool Remote, char *Format, ... )
#else
GLOBAL bool
IRC_WriteStrRelatedPrefix( Client, Prefix, Remote, Format, va_alist )
CLIENT *Client;
CLIENT *Prefix;
bool Remote;
char *Format;
va_dcl
#endif
{
BOOLEAN sock[MAX_CONNECTIONS], is_server[MAX_CONNECTIONS], ok = CONNECTED;
bool ok = CONNECTED;
CL2CHAN *chan_cl2chan, *cl2chan;
CHAR buffer[1000];
char buffer[1000];
CHANNEL *chan;
CONN_ID conn;
va_list ap;
CLIENT *c;
INT i, s;
assert( Client != NULL );
assert( Prefix != NULL );
assert( Format != NULL );
#ifdef PROTOTYPES
va_start( ap, Format );
#else
va_start( ap );
#endif
vsnprintf( buffer, 1000, Format, ap );
va_end( ap );
/* initialisieren */
for( i = 0; i < MAX_CONNECTIONS; i++ ) sock[i] = FALSE;
Conn_ClearFlags( );
/* An alle Clients, die in einem Channel mit dem "Ausloeser" sind,
* den Text schicken. An Remote-Server aber jeweils nur einmal. */
@@ -234,12 +372,9 @@ GLOBAL BOOLEAN IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, BOOLEA
if( c && ( c != Client ))
{
/* Ok, anderer Client */
s = Client_Conn( c );
assert( s >= 0 );
assert( s < MAX_CONNECTIONS );
sock[s] = TRUE;
if( Client_Type( c ) == CLIENT_SERVER ) is_server[s] = TRUE;
else is_server[s] = FALSE;
conn = Client_Conn( c );
if( Client_Type( c ) == CLIENT_SERVER ) Conn_SetFlag( conn, SEND_TO_SERVER );
else Conn_SetFlag( conn, SEND_TO_USER );
}
cl2chan = Channel_NextMember( chan, cl2chan );
}
@@ -248,21 +383,39 @@ GLOBAL BOOLEAN IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, BOOLEA
chan_cl2chan = Channel_NextChannelOf( Client, chan_cl2chan );
}
/* Senden ... */
for( i = 0; i < MAX_CONNECTIONS; i++ )
/* Senden: alle Verbindungen durchgehen ... */
conn = Conn_First( );
while( conn != NONE )
{
if( sock[i] )
{
if( is_server[i] ) ok = Conn_WriteStr( i, ":%s %s", Client_ID( Prefix ), buffer );
else ok = Conn_WriteStr( i, ":%s %s", Client_Mask( Prefix ), buffer );
if( ! ok ) break;
}
/* muessen ueber diese Verbindung Daten gesendet werden? */
if( Conn_Flag( conn ) == SEND_TO_SERVER ) ok = Conn_WriteStr( conn, ":%s %s", Client_ID( Prefix ), buffer );
else if( Conn_Flag( conn ) == SEND_TO_USER ) ok = Conn_WriteStr( conn, ":%s %s", Client_Mask( Prefix ), buffer );
if( ! ok ) break;
/* naechste Verbindung testen */
conn = Conn_Next( conn );
}
return ok;
} /* IRC_WriteStrRelatedPrefix */
CHAR *Get_Prefix( CLIENT *Target, CLIENT *Client )
GLOBAL void
IRC_SetPenalty( CLIENT *Client, int Seconds )
{
CONN_ID c;
assert( Client != NULL );
assert( Seconds > 0 );
if( Client_Type( Client ) == CLIENT_SERVER ) return;
c = Client_Conn( Client );
if( c > NONE ) Conn_SetPenalty( c, Seconds );
} /* IRC_SetPenalty */
LOCAL char *
Get_Prefix( CLIENT *Target, CLIENT *Client )
{
assert( Target != NULL );
assert( Client != NULL );

View File

@@ -2,40 +2,35 @@
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* 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: irc-write.h,v 1.1 2002/02/27 23:26:21 alex Exp $
*
* irc-write.h: IRC-Texte und Befehle ueber Netzwerk versenden (Header)
*
* $Log: irc-write.h,v $
* Revision 1.1 2002/02/27 23:26:21 alex
* - Modul aus irc.c bzw. irc.h ausgegliedert.
* $Id: irc-write.h,v 1.7 2005/03/19 18:43:49 fw Exp $
*
* Sending IRC commands over the network (header)
*/
#ifndef __irc_write_h__
#define __irc_write_h__
#include "channel.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( CLIENT *Client, CHAR *Format, ... );
GLOBAL BOOLEAN IRC_WriteStrClientPrefix( 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( CLIENT *Client, CHANNEL *Chan, BOOLEAN Remote, CHAR *Format, ... );
GLOBAL BOOLEAN IRC_WriteStrChannelPrefix( 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( CLIENT *ExceptOf, CHAR *Format, ... );
GLOBAL VOID IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *Format, ... );
GLOBAL bool IRC_WriteStrRelatedPrefix PARAMS(( CLIENT *Client, CLIENT *Prefix, bool Remote, char *Format, ... ));
GLOBAL BOOLEAN IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... );
GLOBAL void IRC_SetPenalty PARAMS(( CLIENT *Client, int Seconds ));
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -2,70 +2,28 @@
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* 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: irc.h,v 1.27 2002/02/27 23:26:36 alex Exp $
* $Id: irc.h,v 1.39 2005/03/19 18:43:49 fw Exp $
*
* irc.h: IRC-Befehle (Header)
*
* $Log: irc.h,v $
* Revision 1.27 2002/02/27 23:26:36 alex
* - einige Funktionen in irc-xxx-Module ausgegliedert.
*
* Revision 1.26 2002/02/27 20:33:13 alex
* - Channel-Topics implementiert.
*
* Revision 1.25 2002/02/27 18:23:46 alex
* - IRC-Befehl "AWAY" implementert.
*
* Revision 1.24 2002/02/23 21:39:48 alex
* - IRC-Befehl KILL sowie Kills bei Nick Collsisions implementiert.
*
* Revision 1.23 2002/02/17 23:38:58 alex
* - neuer IRC-Befehl VERSION implementiert: IRC_VERSION().
* IRC commands (header)
*/
#ifndef __irc_h__
#define __irc_h__
#include "parse.h"
#include "client.h"
#include "channel.h"
GLOBAL BOOLEAN IRC_MOTD( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_LUSERS( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_LINKS( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_VERSION( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_PRIVMSG( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_NOTICE( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_NAMES( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_ISON( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_WHOIS( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_USERHOST( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_OPER( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_DIE( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_RESTART( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_ERROR( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_KILL( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_JOIN( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_PART( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_TOPIC( CLIENT *Client, REQUEST *Req );
GLOBAL BOOLEAN IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan );
GLOBAL BOOLEAN IRC_Send_LUSERS( CLIENT *Client );
GLOBAL BOOLEAN IRC_Show_MOTD( CLIENT *Client );
GLOBAL bool IRC_ERROR PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_KILL PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_NOTICE PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_PRIVMSG PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_TRACE PARAMS(( CLIENT *Client, REQUEST *Req ));
GLOBAL bool IRC_HELP PARAMS(( CLIENT *Client, REQUEST *Req ));
#endif

488
src/ngircd/lists.c Normal file
View File

@@ -0,0 +1,488 @@
/*
* 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.
*
* Management of IRC lists: ban, invite, ...
*/
#include "portab.h"
static char UNUSED id[] = "$Id: lists.c,v 1.17 2005/03/19 18:43:49 fw Exp $";
#include "imp.h"
#include <assert.h>
#include "defines.h"
#include "conn.h"
#include "client.h"
#include "channel.h"
#include "log.h"
#include "match.h"
#include "messages.h"
#include "irc-write.h"
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include "exp.h"
#include "lists.h"
#define MASK_LEN 2*CLIENT_HOST_LEN
typedef struct _C2C
{
struct _C2C *next;
char mask[MASK_LEN];
CHANNEL *channel;
bool onlyonce;
} C2C;
LOCAL C2C *My_Invites, *My_Bans;
LOCAL C2C *New_C2C PARAMS(( char *Mask, CHANNEL *Chan, bool OnlyOnce ));
LOCAL bool Check_List PARAMS(( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan ));
LOCAL bool Already_Registered PARAMS(( C2C *Cl2Chan, char *Mask, CHANNEL *Chan ));
GLOBAL void
Lists_Init( void )
{
/* Modul initialisieren */
My_Invites = My_Bans = NULL;
} /* Lists_Init */
GLOBAL void
Lists_Exit( void )
{
/* Modul abmelden */
C2C *c2c, *next;
/* Invite-Lists freigeben */
c2c = My_Invites;
while( c2c )
{
next = c2c->next;
free( c2c );
c2c = next;
}
/* Ban-Lists freigeben */
c2c = My_Bans;
while( c2c )
{
next = c2c->next;
free( c2c );
c2c = next;
}
} /* Lists_Exit */
GLOBAL bool
Lists_CheckInvited( CLIENT *Client, CHANNEL *Chan )
{
return Check_List( &My_Invites, Client, Chan );
} /* Lists_CheckInvited */
GLOBAL bool
Lists_IsInviteEntry( char *Mask, CHANNEL *Chan )
{
assert( Mask != NULL );
assert( Chan != NULL );
return Already_Registered( My_Invites, Mask, Chan );
} /* Lists_IsInviteEntry */
GLOBAL bool
Lists_AddInvited( char *Mask, CHANNEL *Chan, bool OnlyOnce )
{
C2C *c2c;
assert( Mask != NULL );
assert( Chan != NULL );
if( Already_Registered( My_Invites, Mask, Chan )) return true;
c2c = New_C2C( Mask, Chan, OnlyOnce );
if( ! c2c )
{
Log( LOG_ERR, "Can't add new invite list entry!" );
return false;
}
/* verketten */
c2c->next = My_Invites;
My_Invites = c2c;
Log( LOG_DEBUG, "Added \"%s\" to invite list for \"%s\".", Mask, Channel_Name( Chan ));
return true;
} /* Lists_AddInvited */
GLOBAL void
Lists_DelInvited( char *Mask, CHANNEL *Chan )
{
C2C *c2c, *last, *next;
assert( Mask != NULL );
assert( Chan != NULL );
last = NULL;
c2c = My_Invites;
while( c2c )
{
next = c2c->next;
if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 ))
{
/* dieser Eintrag muss geloescht werden */
Log( LOG_DEBUG, "Deleted \"%s\" from invite list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
if( last ) last->next = next;
else My_Invites = next;
free( c2c );
}
else last = c2c;
c2c = next;
}
} /* Lists_DelInvited */
GLOBAL bool
Lists_ShowInvites( CLIENT *Client, CHANNEL *Channel )
{
C2C *c2c;
assert( Client != NULL );
assert( Channel != NULL );
c2c = My_Invites;
while( c2c )
{
if( c2c->channel == Channel )
{
/* Eintrag fuer Channel gefunden; ausgeben: */
if( ! IRC_WriteStrClient( Client, RPL_INVITELIST_MSG, Client_ID( Client ), Channel_Name( Channel ), c2c->mask )) return DISCONNECTED;
}
c2c = c2c->next;
}
return IRC_WriteStrClient( Client, RPL_ENDOFINVITELIST_MSG, Client_ID( Client ), Channel_Name( Channel ));
} /* Lists_ShowInvites */
GLOBAL bool
Lists_SendInvites( CLIENT *Client )
{
C2C *c2c;
assert( Client != NULL );
c2c = My_Invites;
while( c2c )
{
if( ! IRC_WriteStrClient( Client, "MODE %s +I %s", Channel_Name( c2c->channel ), c2c->mask )) return DISCONNECTED;
c2c = c2c->next;
}
return CONNECTED;
} /* Lists_SendInvites */
GLOBAL bool
Lists_SendBans( CLIENT *Client )
{
C2C *c2c;
assert( Client != NULL );
c2c = My_Bans;
while( c2c )
{
if( ! IRC_WriteStrClient( Client, "MODE %s +b %s", Channel_Name( c2c->channel ), c2c->mask )) return DISCONNECTED;
c2c = c2c->next;
}
return CONNECTED;
} /* Lists_SendBans */
GLOBAL bool
Lists_CheckBanned( CLIENT *Client, CHANNEL *Chan )
{
return Check_List( &My_Bans, Client, Chan );
} /* Lists_CheckBanned */
GLOBAL bool
Lists_IsBanEntry( char *Mask, CHANNEL *Chan )
{
assert( Mask != NULL );
assert( Chan != NULL );
return Already_Registered( My_Bans, Mask, Chan );
} /* Lists_IsBanEntry */
GLOBAL bool
Lists_AddBanned( char *Mask, CHANNEL *Chan )
{
C2C *c2c;
assert( Mask != NULL );
assert( Chan != NULL );
if( Already_Registered( My_Bans, Mask, Chan )) return true;
c2c = New_C2C( Mask, Chan, false );
if( ! c2c )
{
Log( LOG_ERR, "Can't add new ban list entry!" );
return false;
}
/* verketten */
c2c->next = My_Bans;
My_Bans = c2c;
Log( LOG_DEBUG, "Added \"%s\" to ban list for \"%s\".", Mask, Channel_Name( Chan ));
return true;
} /* Lists_AddBanned */
GLOBAL void
Lists_DelBanned( char *Mask, CHANNEL *Chan )
{
C2C *c2c, *last, *next;
assert( Mask != NULL );
assert( Chan != NULL );
last = NULL;
c2c = My_Bans;
while( c2c )
{
next = c2c->next;
if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 ))
{
/* dieser Eintrag muss geloescht werden */
Log( LOG_DEBUG, "Deleted \"%s\" from ban list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
if( last ) last->next = next;
else My_Bans = next;
free( c2c );
}
else last = c2c;
c2c = next;
}
} /* Lists_DelBanned */
GLOBAL bool
Lists_ShowBans( CLIENT *Client, CHANNEL *Channel )
{
C2C *c2c;
assert( Client != NULL );
assert( Channel != NULL );
c2c = My_Bans;
while( c2c )
{
if( c2c->channel == Channel )
{
/* Eintrag fuer Channel gefunden; ausgeben: */
if( ! IRC_WriteStrClient( Client, RPL_BANLIST_MSG, Client_ID( Client ), Channel_Name( Channel ), c2c->mask )) return DISCONNECTED;
}
c2c = c2c->next;
}
return IRC_WriteStrClient( Client, RPL_ENDOFBANLIST_MSG, Client_ID( Client ), Channel_Name( Channel ));
} /* Lists_ShowBans */
GLOBAL void
Lists_DeleteChannel( CHANNEL *Chan )
{
/* Channel wurde geloescht, Invite- und Ban-Lists aufraeumen */
C2C *c2c, *last, *next;
/* Invite-List */
last = NULL;
c2c = My_Invites;
while( c2c )
{
next = c2c->next;
if( c2c->channel == Chan )
{
/* dieser Eintrag muss geloescht werden */
Log( LOG_DEBUG, "Deleted \"%s\" from invite list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
if( last ) last->next = next;
else My_Invites = next;
free( c2c );
}
else last = c2c;
c2c = next;
}
/* Ban-List */
last = NULL;
c2c = My_Bans;
while( c2c )
{
next = c2c->next;
if( c2c->channel == Chan )
{
/* dieser Eintrag muss geloescht werden */
Log( LOG_DEBUG, "Deleted \"%s\" from ban list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
if( last ) last->next = next;
else My_Bans = next;
free( c2c );
}
else last = c2c;
c2c = next;
}
} /* Lists_DeleteChannel */
GLOBAL char *
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;
assert( Pattern != NULL );
excl = strchr( Pattern, '!' );
at = strchr( Pattern, '@' );
if(( at ) && ( at < excl )) excl = NULL;
if(( ! at ) && ( ! excl ))
{
/* Neither "!" nor "@" found: use string as nick name */
strlcpy( TheMask, Pattern, sizeof( TheMask ) - 5 );
strlcat( TheMask, "!*@*", sizeof( TheMask ));
return TheMask;
}
if(( ! at ) && ( excl ))
{
/* Domain part is missing */
strlcpy( TheMask, Pattern, sizeof( TheMask ) - 3 );
strlcat( TheMask, "@*", sizeof( TheMask ));
return TheMask;
}
if(( at ) && ( ! excl ))
{
/* User name is missing */
*at = '\0'; at++;
strlcpy( TheMask, Pattern, sizeof( TheMask ) - 5 );
strlcat( TheMask, "!*@", sizeof( TheMask ));
strlcat( TheMask, at, sizeof( TheMask ));
return TheMask;
}
/* All parts (nick, user and domain name) are given */
strlcpy( TheMask, Pattern, sizeof( TheMask ));
return TheMask;
} /* Lists_MakeMask */
LOCAL C2C *
New_C2C( char *Mask, CHANNEL *Chan, bool OnlyOnce )
{
C2C *c2c;
assert( Mask != NULL );
assert( Chan != NULL );
/* Speicher fuer Eintrag anfordern */
c2c = (C2C *)malloc( sizeof( C2C ));
if( ! c2c )
{
Log( LOG_EMERG, "Can't allocate memory! [New_C2C]" );
return NULL;
}
strlcpy( c2c->mask, Mask, sizeof( c2c->mask ));
c2c->channel = Chan;
c2c->onlyonce = OnlyOnce;
return c2c;
} /* New_C2C */
LOCAL bool
Check_List( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan )
{
C2C *c2c, *last;
assert( Cl2Chan != NULL );
assert( Client != NULL );
assert( Chan != NULL );
c2c = *Cl2Chan;
last = NULL;
while( c2c )
{
if( c2c->channel == Chan )
{
/* Ok, richtiger Channel. Passt die Maske? */
if( Match( c2c->mask, Client_Mask( Client )))
{
/* Treffer! */
if( c2c->onlyonce )
{
/* Eintrag loeschen */
Log( LOG_DEBUG, "Deleted \"%s\" from %s list for \"%s\".", c2c->mask, *Cl2Chan == My_Invites ? "invite" : "ban", Channel_Name( Chan ));
if( last ) last->next = c2c->next;
else *Cl2Chan = c2c->next;
free( c2c );
}
return true;
}
}
last = c2c;
c2c = c2c->next;
}
return false;
} /* Check_List */
LOCAL bool
Already_Registered( C2C *List, char *Mask, CHANNEL *Chan )
{
C2C *c2c;
c2c = List;
while( c2c )
{
if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 )) return true;
c2c = c2c->next;
}
return false;
} /* Already_Registered */
/* -eof- */

46
src/ngircd/lists.h Normal file
View File

@@ -0,0 +1,46 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* 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
* 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: lists.h,v 1.12 2005/03/19 18:43:49 fw Exp $
*
* Management of IRC lists: ban, invite, ... (header)
*/
#ifndef __lists_h__
#define __lists_h__
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 bool Lists_CheckBanned PARAMS(( CLIENT *Client, CHANNEL *Chan ));
GLOBAL bool Lists_AddBanned PARAMS(( char *Mask, CHANNEL *Chan ));
GLOBAL void Lists_DelBanned PARAMS(( char *Mask, CHANNEL *Chan ));
GLOBAL bool Lists_ShowBans PARAMS(( CLIENT *Client, CHANNEL *Channel ));
GLOBAL bool Lists_SendBans PARAMS(( CLIENT *Client ));
GLOBAL bool Lists_IsBanEntry PARAMS(( char *Mask, CHANNEL *Chan ));
GLOBAL void Lists_DeleteChannel PARAMS(( CHANNEL *Chan ));
GLOBAL char *Lists_MakeMask PARAMS(( char *Pattern ));
#endif
/* -eof- */

View File

@@ -1,163 +1,222 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
* Copyright (c)2001-2005 Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* 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: log.c,v 1.18 2002/02/19 20:07:13 alex Exp $
*
* log.c: Logging-Funktionen
*
* $Log: log.c,v $
* Revision 1.18 2002/02/19 20:07:13 alex
* - direkt nach dem Start werden die aktiven "Modes" ins Log geschrieben.
*
* Revision 1.17 2002/01/11 14:45:37 alex
* - Anpassungen an neue Kommandozeilen-Optionen "--debug" und "--nodaemon".
*
* Revision 1.16 2002/01/05 15:54:40 alex
* - syslog() etc. wurde verwendet, auch wenn USE_SYSLOG nicht definiert war.
*
* Revision 1.15 2002/01/02 02:42:58 alex
* - Copyright-Texte aktualisiert.
*
* Revision 1.14 2002/01/01 18:01:43 alex
* - Architektur und Betriebssystem in Start-Meldung aufgenommen.
*
* Revision 1.13 2001/12/31 02:18:51 alex
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
* - neuen Header "defines.h" mit (fast) allen Konstanten.
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
*
* Revision 1.12 2001/12/29 20:16:31 alex
* - Log-Funktionen fuer Resolver-Sub-Prozess implementiert.
*
* Revision 1.11 2001/12/29 03:08:49 alex
* - neue configure-Option "--enable-strict-rfc".
*
* Revision 1.10 2001/12/27 01:44:49 alex
* - die Verwendung von syslog kann nun abgeschaltet werden.
*
* Revision 1.9 2001/12/26 03:22:16 alex
* - string.h wird nun includiert.
*
* Revision 1.8 2001/12/25 23:13:00 alex
* - Versionsstring bei Programmstart verbessert.
*
* Revision 1.7 2001/12/25 22:04:26 alex
* - Aenderungen an den Debug- und Logging-Funktionen.
*
* Revision 1.6 2001/12/25 19:20:39 alex
* - es wird nun die Facility LOG_LOCAL5 zum Loggen verwendet.
*
* Revision 1.5 2001/12/15 00:07:56 alex
* - Log-Level der Start- und Stop-Meldungen angehoben.
*
* Revision 1.4 2001/12/13 02:04:16 alex
* - boesen "Speicherschiesser" in Log() gefixt.
*
* Revision 1.3 2001/12/12 23:31:24 alex
* - Zum Loggen wird nun auch syslog verwendet.
*
* Revision 1.2 2001/12/12 17:19:12 alex
* - in Log-Meldungen wird nun auch der Level der Meldung ausgegeben.
*
* Revision 1.1.1.1 2001/12/11 21:53:04 alex
* - Imported sources to CVS.
* Logging functions
*/
#define MAX_LOG_MSG_LEN 256
#include "portab.h"
static char UNUSED id[] = "$Id: log.c,v 1.57.2.2 2006/02/08 21:23:21 fw Exp $";
#include <portab.h>
#include "global.h"
#include <imp.h>
#include "imp.h"
#include <assert.h>
#include <stdarg.h>
#include <errno.h>
#ifdef PROTOTYPES
# include <stdarg.h>
#else
# include <varargs.h>
#endif
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#ifdef USE_SYSLOG
#ifdef SYSLOG
#include <syslog.h>
#endif
#include "global.h"
#include "ngircd.h"
#include "defines.h"
#include "conn.h"
#include "client.h"
#include "channel.h"
#include "irc-write.h"
#include <exp.h>
#include "exp.h"
#include "log.h"
GLOBAL VOID Log_Init( VOID )
{
CHAR txt[127];
static char Init_Txt[127];
static bool Is_Daemon;
#ifdef USE_SYSLOG
#ifdef DEBUG
static char Error_File[FNAME_LEN];
#endif
static void Wall_ServerNotice PARAMS(( char *Msg ));
GLOBAL void
Log_Init( bool Daemon_Mode )
{
Is_Daemon = Daemon_Mode;
#ifdef SYSLOG
#ifndef LOG_CONS /* Kludge: mips-dec-ultrix4.5 has no LOG_CONS/LOG_LOCAL5 */
#define LOG_CONS 0
#endif
#ifndef LOG_LOCAL5
#define LOG_LOCAL5 0
#endif
/* Syslog initialisieren */
openlog( PACKAGE, LOG_CONS|LOG_PID, LOG_LOCAL5 );
openlog( PACKAGE_NAME, LOG_CONS|LOG_PID, LOG_LOCAL5 );
#endif
/* Hello World! */
Log( LOG_NOTICE, "%s started.", NGIRCd_Version( ));
Log( LOG_NOTICE, "%s started.", NGIRCd_Version );
/* Informationen uebern den "Operation Mode" */
strcpy( txt, "" );
Init_Txt[0] = '\0';
#ifdef DEBUG
if( NGIRCd_Debug )
{
if( txt[0] ) strcat( txt, ", " );
strcat( txt, "debug-mode" );
strlcpy( Init_Txt, "debug-mode", sizeof Init_Txt );
}
#endif
if( NGIRCd_NoDaemon )
if( ! Is_Daemon )
{
if( txt[0] ) strcat( txt, ", " );
strcat( txt, "no-daemon-mode" );
if( Init_Txt[0] ) strlcat( Init_Txt, ", ", sizeof Init_Txt );
strlcat( Init_Txt, "no-daemon-mode", sizeof Init_Txt );
}
if( NGIRCd_Passive )
{
if( txt[0] ) strcat( txt, ", " );
strcat( txt, "passive-mode" );
if( Init_Txt[0] ) strlcat( Init_Txt, ", ", sizeof Init_Txt );
strlcat( Init_Txt, "passive-mode", sizeof Init_Txt );
}
#ifdef SNIFFER
if( NGIRCd_Sniffer )
{
if( txt[0] ) strcat( txt, ", " );
strcat( txt, "network sniffer" );
if( Init_Txt[0] ) strlcat( Init_Txt, ", ", sizeof Init_Txt );
strlcat( Init_Txt, "network sniffer", sizeof Init_Txt );
}
#endif
if( txt[0] ) Log( LOG_INFO, "Activating: %s.", txt );
if( Init_Txt[0] ) Log( LOG_INFO, "Activating: %s.", Init_Txt );
#ifdef DEBUG
Error_File[0] = '\0';
#endif
} /* Log_Init */
GLOBAL VOID Log_Exit( VOID )
#ifdef DEBUG
GLOBAL void
Log_InitErrorfile( void )
{
/* "Error-Log" initialisieren: stderr in Datei umlenken. Dort
* landen z.B. alle Ausgaben von assert()-Aufrufen. */
/* Dateiname zusammen bauen */
snprintf( Error_File, sizeof Error_File, "%s/%s-%ld.err", ERROR_DIR, PACKAGE_NAME, (long)getpid( ));
/* stderr umlenken */
fflush( stderr );
if( ! freopen( Error_File, "w", stderr ))
{
Log( LOG_ERR, "Can't reopen stderr (\"%s\"): %s", Error_File, strerror( errno ));
return;
}
/* Einige Infos in das Error-File schreiben */
fputs( ctime( &NGIRCd_Start ), stderr );
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 )
{
/* Good Bye! */
Log( LOG_NOTICE, PACKAGE" done.");
#ifdef USE_SYSLOG
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 */
closelog( );
#endif
} /* Log_Exit */
GLOBAL VOID Log( CONST INT Level, CONST CHAR *Format, ... )
# 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 );
#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
Log( Level, Format, va_alist )
int Level;
const char *Format;
va_dcl
#endif
{
/* Eintrag in Logfile(s) schreiben */
CHAR msg[MAX_LOG_MSG_LEN];
char msg[MAX_LOG_MSG_LEN];
bool snotice;
va_list ap;
assert( Format != NULL );
if( Level & LOG_snotice )
{
/* Notice an User mit "s" Mode */
snotice = true;
Level &= ~LOG_snotice;
}
else snotice = false;
#ifdef DEBUG
if(( Level == LOG_DEBUG ) && ( ! NGIRCd_Debug )) return;
#else
@@ -165,45 +224,81 @@ GLOBAL VOID Log( CONST INT Level, CONST CHAR *Format, ... )
#endif
/* String mit variablen Argumenten zusammenbauen ... */
#ifdef PROTOTYPES
va_start( ap, Format );
vsnprintf( msg, MAX_LOG_MSG_LEN - 1, Format, ap );
msg[MAX_LOG_MSG_LEN - 1] = '\0';
#else
va_start( ap );
#endif
vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap );
va_end( ap );
/* ... und ausgeben */
if( NGIRCd_NoDaemon ) printf( "[%d] %s\n", Level, msg );
#ifdef USE_SYSLOG
syslog( Level, msg );
if( ! Is_Daemon )
{
/* auf Konsole ausgeben */
fprintf( stdout, "[%d:%d] %s\n", (int)getpid( ), Level, msg );
fflush( stdout );
}
#ifdef SYSLOG
else
{
/* Syslog */
syslog( Level, "%s", msg );
}
#endif
va_end( ap );
if( Level <= LOG_CRIT )
{
/* log critical messages to stderr */
fprintf( stderr, "%s\n", msg );
fflush( stderr );
}
if( snotice )
{
/* NOTICE an lokale User mit "s"-Mode */
Wall_ServerNotice( msg );
}
} /* Log */
GLOBAL VOID Log_Init_Resolver( VOID )
GLOBAL void
Log_Init_Resolver( void )
{
#ifdef USE_SYSLOG
openlog( PACKAGE, LOG_CONS|LOG_PID, LOG_LOCAL5 );
#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 USE_SYSLOG
#ifdef DEBUG
Log_Resolver( LOG_DEBUG, "Resolver sub-process %d done.", getpid( ));
#endif
#ifdef SYSLOG
closelog( );
#endif
} /* Log_Exit_Resolver */
GLOBAL VOID Log_Resolver( CONST INT Level, CONST CHAR *Format, ... )
#ifdef PROTOTYPES
GLOBAL void
Log_Resolver( const int Level, const char *Format, ... )
#else
GLOBAL void
Log_Resolver( Level, Format, va_alist )
const int Level;
const char *Format;
va_dcl
#endif
{
/* Eintrag des Resolver in Logfile(s) schreiben */
#ifndef USE_SYSLOG
return;
#else
CHAR msg[MAX_LOG_MSG_LEN];
char msg[MAX_LOG_MSG_LEN];
va_list ap;
assert( Format != NULL );
@@ -215,16 +310,46 @@ GLOBAL VOID Log_Resolver( CONST INT Level, CONST CHAR *Format, ... )
#endif
/* String mit variablen Argumenten zusammenbauen ... */
#ifdef PROTOTYPES
va_start( ap, Format );
vsnprintf( msg, MAX_LOG_MSG_LEN - 1, Format, ap );
msg[MAX_LOG_MSG_LEN - 1] = '\0';
/* ... und ausgeben */
syslog( Level, msg );
#else
va_start( ap );
#endif
vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap );
va_end( ap );
if( ! Is_Daemon )
{
/* Output to console */
fprintf( stdout, "[%d:%d] %s\n", (int)getpid( ), Level, msg );
fflush( stdout );
}
#ifdef SYSLOG
else syslog( Level, "%s", msg );
#endif
} /* Log_Resolver */
/**
* Send log messages to users flagged with the "s" mode.
* @param Msg The message to send.
*/
static void
Wall_ServerNotice( char *Msg )
{
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);
c = Client_Next( c );
}
} /* Wall_ServerNotice */
/* -eof- */

View File

@@ -2,40 +2,15 @@
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* 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: log.h,v 1.7 2002/01/02 02:42:58 alex Exp $
* $Id: log.h,v 1.18.2.1 2006/02/08 21:23:21 fw Exp $
*
* log.h: Logging-Funktionen (Header)
*
* $Log: log.h,v $
* Revision 1.7 2002/01/02 02:42:58 alex
* - Copyright-Texte aktualisiert.
*
* Revision 1.6 2001/12/31 02:18:51 alex
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
* - neuen Header "defines.h" mit (fast) allen Konstanten.
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
*
* Revision 1.5 2001/12/29 20:16:31 alex
* - Log-Funktionen fuer Resolver-Sub-Prozess implementiert.
*
* Revision 1.4 2001/12/27 01:44:49 alex
* - die Verwendung von syslog kann nun abgeschaltet werden.
*
* Revision 1.3 2001/12/12 23:31:24 alex
* - Zum Loggen wird nun auch syslog verwendet.
*
* Revision 1.2 2001/12/12 17:19:29 alex
* - LOG_ERR heisst nun LOG_ERROR.
*
* Revision 1.1.1.1 2001/12/11 21:53:04 alex
* - Imported sources to CVS.
* Logging functions (header)
*/
@@ -43,7 +18,7 @@
#define __log_h__
#ifdef USE_SYSLOG
#ifdef SYSLOG
# include <syslog.h>
#else
# define LOG_EMERG 0
@@ -57,15 +32,23 @@
#endif
GLOBAL VOID Log_Init( VOID );
GLOBAL VOID Log_Exit( VOID );
#define LOG_snotice 1024
GLOBAL VOID Log( CONST INT Level, CONST CHAR *Format, ... );
GLOBAL VOID Log_Init_Resolver( VOID );
GLOBAL VOID Log_Exit_Resolver( VOID );
GLOBAL void Log_Init PARAMS(( bool Daemon_Mode ));
GLOBAL void Log_Exit PARAMS(( void ));
GLOBAL VOID Log_Resolver( CONST INT Level, CONST CHAR *Format, ... );
GLOBAL void Log PARAMS(( int Level, const char *Format, ... ));
GLOBAL void LogDebug PARAMS(( const char *Format, ... ));
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
#endif

253
src/ngircd/match.c Normal file
View File

@@ -0,0 +1,253 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* 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
* 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.
*
* Wildcard pattern matching
*/
#include "portab.h"
static char UNUSED id[] = "$Id: match.c,v 1.3 2005/03/19 18:43:49 fw Exp $";
#include "imp.h"
#include <assert.h>
#include <string.h>
#include "exp.h"
#include "match.h"
/*
* Die Pattern-Matching-Funkionen [Matche(), Matche_After_Star()] basieren
* auf Versionen von J. Kercheval. Die Version 1.1 wurde am 12.03.1991 als
* "public domain" freigegeben:
* <http://www.snippets.org/snippets/portable/MATCH+C.php3>
*/
LOCAL int Matche PARAMS(( char *p, char *t ));
LOCAL int Matche_After_Star PARAMS(( char *p, char *t ));
#define MATCH_PATTERN 6 /* bad pattern */
#define MATCH_LITERAL 5 /* match failure on literal match */
#define MATCH_RANGE 4 /* match failure on [..] construct */
#define MATCH_ABORT 3 /* premature end of text string */
#define MATCH_END 2 /* premature end of pattern string */
#define MATCH_VALID 1 /* valid match */
GLOBAL bool
Match( char *Pattern, char *String )
{
/* Pattern mit String vergleichen */
if( Matche( Pattern, String ) == MATCH_VALID ) return true;
else return false;
} /* Match */
LOCAL int
Matche( char *p, char *t )
{
register char range_start, range_end;
bool invert;
bool member_match;
bool loop;
for( ; *p; p++, t++ )
{
/* if this is the end of the text then this is the end of the match */
if( ! *t )
{
return ( *p == '*' && *++p == '\0' ) ? MATCH_VALID : MATCH_ABORT;
}
/* determine and react to pattern type */
switch( *p )
{
case '?': /* single any character match */
break;
case '*': /* multiple any character match */
return Matche_After_Star( p, t );
case '[': /* [..] construct, single member/exclusion character match */
/* move to beginning of range */
p++;
/* check if this is a member match or exclusion match */
invert = false;
if( *p == '!' || *p == '^' )
{
invert = true;
p++;
}
/* if closing bracket here or at range start then we have a malformed pattern */
if ( *p == ']' ) return MATCH_PATTERN;
member_match = false;
loop = true;
while( loop )
{
/* if end of construct then loop is done */
if( *p == ']' )
{
loop = false;
continue;
}
/* matching a '!', '^', '-', '\' or a ']' */
if( *p == '\\' ) range_start = range_end = *++p;
else range_start = range_end = *p;
/* if end of pattern then bad pattern (Missing ']') */
if( ! *p ) return MATCH_PATTERN;
/* check for range bar */
if( *++p == '-' )
{
/* get the range end */
range_end = *++p;
/* if end of pattern or construct then bad pattern */
if( range_end == '\0' || range_end == ']' ) return MATCH_PATTERN;
/* special character range end */
if( range_end == '\\' )
{
range_end = *++p;
/* if end of text then we have a bad pattern */
if ( ! range_end ) return MATCH_PATTERN;
}
/* move just beyond this range */
p++;
}
/* if the text character is in range then match found. make sure the range
* letters have the proper relationship to one another before comparison */
if( range_start < range_end )
{
if( *t >= range_start && *t <= range_end )
{
member_match = true;
loop = false;
}
}
else
{
if( *t >= range_end && *t <= range_start )
{
member_match = true;
loop = false;
}
}
}
/* if there was a match in an exclusion set then no match */
/* if there was no match in a member set then no match */
if(( invert && member_match ) || ! ( invert || member_match )) return MATCH_RANGE;
/* if this is not an exclusion then skip the rest of the [...]
* construct that already matched. */
if( member_match )
{
while( *p != ']' )
{
/* bad pattern (Missing ']') */
if( ! *p ) return MATCH_PATTERN;
/* skip exact match */
if( *p == '\\' )
{
p++;
/* if end of text then we have a bad pattern */
if( ! *p ) return MATCH_PATTERN;
}
/* move to next pattern char */
p++;
}
}
break;
case '\\': /* next character is quoted and must match exactly */
/* move pattern pointer to quoted char and fall through */
p++;
/* if end of text then we have a bad pattern */
if( ! *p ) return MATCH_PATTERN;
/* must match this character exactly */
default:
if( *p != *t ) return MATCH_LITERAL;
}
}
/* if end of text not reached then the pattern fails */
if( *t ) return MATCH_END;
else return MATCH_VALID;
} /* Matche */
LOCAL int
Matche_After_Star( char *p, char *t )
{
register int nextp, match = 0;
/* pass over existing ? and * in pattern */
while( *p == '?' || *p == '*' )
{
/* take one char for each ? and + */
if (*p == '?')
{
/* if end of text then no match */
if( ! *t++ ) return MATCH_ABORT;
}
/* move to next char in pattern */
p++;
}
/* if end of pattern we have matched regardless of text left */
if( ! *p ) return MATCH_VALID;
/* get the next character to match which must be a literal or '[' */
nextp = *p;
if( nextp == '\\' )
{
nextp = p[1];
/* if end of text then we have a bad pattern */
if( ! nextp ) return MATCH_PATTERN;
}
/* Continue until we run out of text or definite result seen */
do
{
/* a precondition for matching is that the next character
* in the pattern match the next character in the text or that
* the next pattern char is the beginning of a range. Increment
* text pointer as we go here */
if( nextp == *t || nextp == '[' ) match = Matche( p, t );
/* if the end of text is reached then no match */
if( ! *t++ ) match = MATCH_ABORT;
} while( match != MATCH_VALID && match != MATCH_ABORT && match != MATCH_PATTERN );
/* return result */
return match;
} /* Matche_After_Star */
/* -eof- */

27
src/ngircd/match.h Normal file
View File

@@ -0,0 +1,27 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* 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
* 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: match.h,v 1.3 2005/03/19 18:43:49 fw Exp $
*
* Wildcard pattern matching (header)
*/
#ifndef __match_h__
#define __match_h__
GLOBAL bool Match PARAMS(( char *Pattern, char *String ));
#endif
/* -eof- */

View File

@@ -1,123 +1,16 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
* Copyright (c)2001-2004 Alexander Barton <alex@barton.de>
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* 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: messages.h,v 1.33 2002/02/27 20:33:01 alex Exp $
* $Id: messages.h,v 1.66 2004/02/28 02:18:16 alex Exp $
*
* irc.h: IRC-Befehle (Header)
*
* $Log: messages.h,v $
* Revision 1.33 2002/02/27 20:33:01 alex
* - neue Text-Konstante: ERR_NOTONCHANNEL_MSG
*
* Revision 1.32 2002/02/27 18:23:24 alex
* - neue Text-Konstanten RPL_UNAWAY_MSG und RPL_NOWAWAY_MSG.
*
* Revision 1.31 2002/02/27 17:05:13 alex
* - neue Text-Konstante ERR_CANNOTSENDTOCHAN_MSG eingefuehrt.
*
* Revision 1.30 2002/02/17 23:39:24 alex
* - Konstanten sortiert, neue Konstante RPL_VERSION und RPL_VERSION_MSG.
*
* Revision 1.29 2002/02/17 17:42:53 alex
* - neue Text-Konstante ERR_UMODEUNKNOWNFLAG2_MSG.
*
* Revision 1.28 2002/02/13 23:04:50 alex
* - RPL_MYINFO_MSG korrigiert.
*
* Revision 1.27 2002/02/13 17:45:57 alex
* - unterstuetzte User- und Channel-Modes stehen nun in Konstanten.
*
* Revision 1.26 2002/02/11 23:33:12 alex
* - neue Message ERR_CHANOPRIVSNEEDED_MSG definiert.
*
* Revision 1.25 2002/02/11 15:48:39 alex
* - neue Nachricht RPL_CHANNELMODEIS definiert.
*
* Revision 1.24 2002/02/06 16:51:39 alex
* - neue Text-Konstante RPL_UMODEISCHAN_MSG.
*
* Revision 1.23 2002/01/29 00:14:05 alex
* - RPL_WHOISCHANNELS_MSG korrigiert.
*
* Revision 1.22 2002/01/28 13:06:19 alex
* - RPL_NAMREPLY_MSG an tatsaechliche Implementierung angepasst ;-)
*
* Revision 1.21 2002/01/27 17:13:37 alex
* - neue Defines fuer RPL_TOPIC und RPL_NOTOPIC.
*
* Revision 1.20 2002/01/21 00:02:34 alex
* - ERR_NOSUCHCHANNEL hinzugefuegt.
*
* Revision 1.19 2002/01/16 22:09:52 alex
* - RPL_LUSERME_MSG erweitert, kleinere Aenderungen.
*
* Revision 1.18 2002/01/11 23:50:55 alex
* - LINKS implementiert, LUSERS begonnen.
*
* Revision 1.17 2002/01/05 23:23:44 alex
* - neue Nachricht ERR_NOSUCHSERVER_MSG definiert.
*
* Revision 1.16 2002/01/03 02:24:21 alex
* - neue Message ERR_NOTREGISTEREDSERVER_MSG.
*
* Revision 1.15 2002/01/02 02:42:58 alex
* - Copyright-Texte aktualisiert.
*
* Revision 1.14 2001/12/31 16:00:57 alex
* - "o" zu den unterstuetzten Modes hinzugefuegt.
*
* Revision 1.13 2001/12/31 15:33:13 alex
* - neuer Befehl NAMES, kleinere Bugfixes.
* - Bug bei PING behoben: war zu restriktiv implementiert :-)
*
* Revision 1.12 2001/12/31 02:18:51 alex
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
* - neuen Header "defines.h" mit (fast) allen Konstanten.
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
*
* Revision 1.11 2001/12/30 19:25:39 alex
* - RPL_MYINFO_MSG um unterstuetzte User-Modes ergaengz.
*
* Revision 1.10 2001/12/30 11:42:00 alex
* - der Server meldet nun eine ordentliche "Start-Zeit".
*
* Revision 1.9 2001/12/29 03:06:56 alex
* - Texte ergaenzt, einige Bugs behoben (Leerzeichen falsch gesetzt, z.B.)
*
* Revision 1.8 2001/12/27 19:17:26 alex
* - neue Befehle PRIVMSG, NOTICE, PING.
*
* Revision 1.7 2001/12/27 16:56:06 alex
* - RPL_WELCOME an Client_GetID() angepasst.
*
* Revision 1.6 2001/12/26 22:48:53 alex
* - MOTD-Datei ist nun konfigurierbar und wird gelesen.
*
* Revision 1.5 2001/12/26 03:51:13 alex
* - in ERR_NOTREGISTERED_MSG fehlte ein "%s" - jetzt steht auch hier der Nick.
*
* Revision 1.4 2001/12/26 03:22:40 alex
* - Format der Meldungen ueberarbeitet: fast immer ist nun der Nick enthalten.
*
* Revision 1.3 2001/12/25 19:20:11 alex
* - neue Message: ERR_NICKNAMEINUSE[_MSG].
*
* Revision 1.2 2001/12/24 01:30:46 alex
* - einige Messages korrigiert, andere ergaenzt (u.a. fuer MOTD).
*
* Revision 1.1 2001/12/23 21:53:32 alex
* - Ich habe diesen Header begonnen.
*
* Revision 1.1 2001/12/14 08:13:43 alex
* - neues Modul begonnen :-)
* IRC numerics (Header)
*/
@@ -125,175 +18,108 @@
#define __messages_h__
#define RPL_WELCOME "001"
#define RPL_WELCOME_MSG RPL_WELCOME" %s :Welcome to the Internet Relay Network %s"
#define RPL_WELCOME_MSG "001 %s :Welcome to the Internet Relay Network %s"
#define RPL_YOURHOST_MSG "002 %s :Your host is %s, running version ngircd-%s (%s/%s/%s)"
#define RPL_CREATED_MSG "003 %s :This server has been started %s"
#define RPL_MYINFO_MSG "004 %s %s ngircd-%s %s %s"
#define RPL_ISUPPORT_MSG "005 %s NICKLEN=%d TOPICLEN=%d AWAYLEN=%d MAXCHANNELS=%d :are supported on this server"
#define RPL_YOURHOST "002"
#define RPL_YOURHOST_MSG RPL_YOURHOST" %s :Your host is %s, running ngircd "VERSION"-"P_OSNAME"/"P_ARCHNAME
#define RPL_TRACELINK_MSG "200 %s Link %s-%s %s %s V%s %ld %d %d"
#define RPL_TRACEOPERATOR_MSG "204 %s Oper 2 :%s"
#define RPL_TRACESERVER_MSG "206 %s Serv 1 0S 0C %s[%s@%s] *!*@%s :V%s"
#define RPL_STATSLINKINFO_MSG "211 %s %s %d %ld %ld %ld %ld :%ld"
#define RPL_STATSCOMMANDS_MSG "212 %s %s %ld %ld %ld"
#define RPL_ENDOFSTATS_MSG "219 %s %c :End of STATS report"
#define RPL_UMODEIS_MSG "221 %s +%s"
#define RPL_LUSERCLIENT_MSG "251 %s :There are %ld users and %ld services on %ld servers"
#define RPL_LUSEROP_MSG "252 %s %ld :operator(s) online"
#define RPL_LUSERUNKNOWN_MSG "253 %s %ld :unknown connection(s)"
#define RPL_LUSERCHANNELS_MSG "254 %s %ld :channels formed"
#define RPL_LUSERME_MSG "255 %s :I have %ld users, %ld services and %ld servers"
#define RPL_ADMINME_MSG "256 %s %s :Administrative info"
#define RPL_ADMINLOC1_MSG "257 %s :%s"
#define RPL_ADMINLOC2_MSG "258 %s :%s"
#define RPL_ADMINEMAIL_MSG "259 %s :%s"
#define RPL_TRACEEND_MSG "262 %s %s %s-%s.%s :End of TRACE"
#define RPL_LOCALUSERS_MSG "265 %s :Current local users: %ld, Max: %ld"
#define RPL_NETUSERS_MSG "266 %s :Current global users: %ld, Max: %ld"
#define RPL_CREATED "003"
#define RPL_CREATED_MSG RPL_CREATED" %s :This server was started %s"
#define RPL_AWAY_MSG "301 %s %s :%s"
#define RPL_USERHOST_MSG "302 %s :"
#define RPL_ISON_MSG "303 %s :"
#define RPL_UNAWAY_MSG "305 %s :You are no longer marked as being away"
#define RPL_NOWAWAY_MSG "306 %s :You have been marked as being away"
#define RPL_WHOISUSER_MSG "311 %s %s %s %s * :%s"
#define RPL_WHOISSERVER_MSG "312 %s %s %s :%s"
#define RPL_WHOISOPERATOR_MSG "313 %s %s :is an IRC operator"
#define RPL_WHOWASUSER_MSG "314 %s %s %s %s * :%s"
#define RPL_ENDOFWHO_MSG "315 %s %s :End of WHO list"
#define RPL_WHOISIDLE_MSG "317 %s %s %ld :seconds idle"
#define RPL_ENDOFWHOIS_MSG "318 %s %s :End of WHOIS list"
#define RPL_WHOISCHANNELS_MSG "319 %s %s :"
#define RPL_LIST_MSG "322 %s %s %ld :%s"
#define RPL_LISTEND_MSG "323 %s :End of LIST"
#define RPL_CHANNELMODEIS_MSG "324 %s %s +%s"
#define RPL_NOTOPIC_MSG "331 %s %s :No topic is set"
#define RPL_TOPIC_MSG "332 %s %s :%s"
#define RPL_INVITING_MSG "341 %s %s %s"
#define RPL_INVITELIST_MSG "346 %s %s %s"
#define RPL_ENDOFINVITELIST_MSG "347 %s %s :End of channel invite list"
#define RPL_VERSION_MSG "351 %s %s-%s.%s %s :%s"
#define RPL_WHOREPLY_MSG "352 %s %s %s %s %s %s %s :%d %s"
#define RPL_NAMREPLY_MSG "353 %s %s %s :"
#define RPL_LINKS_MSG "364 %s %s %s :%d %s"
#define RPL_ENDOFLINKS_MSG "365 %s %s :End of LINKS list"
#define RPL_ENDOFNAMES_MSG "366 %s %s :End of NAMES list"
#define RPL_BANLIST_MSG "367 %s %s %s"
#define RPL_ENDOFBANLIST_MSG "368 %s %s :End of channel ban list"
#define RPL_ENDOFWHOWAS_MSG "369 %s %s :End of WHOWAS list"
#define RPL_MOTD_MSG "372 %s :- %s"
#define RPL_MOTDSTART_MSG "375 %s :- %s message of the day"
#define RPL_ENDOFMOTD_MSG "376 %s :End of MOTD command"
#define RPL_YOUREOPER_MSG "381 %s :You are now an IRC Operator"
#define RPL_YOURESERVICE_MSG "383 %s :You are service %s"
#define RPL_TIME_MSG "391 %s %s :%s"
#define RPL_MYINFO "004"
#define RPL_MYINFO_MSG RPL_MYINFO" %s :%s ngircd-"VERSION" "USERMODES" "CHANMODES
#define ERR_NOSUCHNICK_MSG "401 %s %s :No such nick or channel name"
#define ERR_NOSUCHSERVER_MSG "402 %s %s :No such server"
#define ERR_NOSUCHCHANNEL_MSG "403 %s %s :No such channel"
#define ERR_CANNOTSENDTOCHAN_MSG "404 %s %s :Cannot send to channel"
#define ERR_TOOMANYCHANNELS_MSG "405 %s %s :You have joined too many channels"
#define ERR_WASNOSUCHNICK_MSG "406 %s %s :There was no such nickname"
#define ERR_NOORIGIN_MSG "409 %s :No origin specified"
#define ERR_NORECIPIENT_MSG "411 %s :No receipient given (%s)"
#define ERR_NOTEXTTOSEND_MSG "412 %s :No text to send"
#define ERR_UNKNOWNCOMMAND_MSG "421 %s %s :Unknown command"
#define ERR_NOMOTD_MSG "422 %s :MOTD file is missing"
#define ERR_ERRONEUSNICKNAME_MSG "432 %s %s :Erroneous nickname"
#define ERR_NICKNAMEINUSE_MSG "433 %s %s :Nickname already in use"
#define ERR_USERNOTINCHANNEL_MSG "441 %s %s %s :They aren't on that channel"
#define ERR_NOTONCHANNEL_MSG "442 %s %s :You are not on that channel"
#define ERR_USERONCHANNEL_MSG "443 %s %s %s :is already on channel"
#define ERR_NOTREGISTERED_MSG "451 %s :Connection not registered"
#define ERR_NOTREGISTEREDSERVER_MSG "451 %s :Connection not registered as server link"
#define ERR_NEEDMOREPARAMS_MSG "461 %s %s :Syntax error"
#define ERR_ALREADYREGISTRED_MSG "462 %s :Connection already registered"
#define ERR_PASSWDMISMATCH_MSG "464 %s :Invalid password"
#define ERR_CHANNELISFULL_MSG "471 %s %s :Cannot join channel (+l)"
#define ERR_UNKNOWNMODE_MSG "472 %s: %c :is unknown mode char for %s"
#define ERR_INVITEONLYCHAN_MSG "473 %s %s :Cannot join channel (+i)"
#define ERR_BANNEDFROMCHAN_MSG "474 %s %s :Cannot join channel (+b)"
#define ERR_BADCHANNELKEY_MSG "475 %s %s :Cannot join channel (+k)"
#define ERR_NOPRIVILEGES_MSG "481 %s :Permission denied"
#define ERR_CHANOPRIVSNEEDED_MSG "482 %s %s :You are not channel operator"
#define ERR_CANTKILLSERVER_MSG "483 %s :You can't kill a server!"
#define ERR_RESTRICTED_MSG "484 %s :Your connection is restricted"
#define ERR_NOOPERHOST_MSG "491 %s :Not configured for your host"
#define RPL_UMODEIS "211"
#define RPL_UMODEIS_MSG RPL_UMODEIS" %s +%s"
#define ERR_UMODEUNKNOWNFLAG_MSG "501 %s :Unknown mode"
#define ERR_UMODEUNKNOWNFLAG2_MSG "501 %s :Unknown mode \"%c%c\""
#define ERR_USERSDONTMATCH_MSG "502 %s :Can't set/get mode for other users"
#define RPL_LUSERCLIENT "251"
#define RPL_LUSERCLIENT_MSG RPL_LUSERCLIENT" %s :There are %d users and %d services on %d servers"
#define RPL_LUSEROP "252"
#define RPL_LUSEROP_MSG RPL_LUSEROP" %s %d :operator(s) online"
#define RPL_LUSERUNKNOWN "253"
#define RPL_LUSERUNKNOWN_MSG RPL_LUSERUNKNOWN" %s %d :unknown connection(s)"
#define RPL_LUSERCHANNELS "254"
#define RPL_LUSERCHANNELS_MSG RPL_LUSERCHANNELS" %s %d :channels formed"
#define RPL_LUSERME "255"
#define RPL_LUSERME_MSG RPL_LUSERME" %s :I have %d users, %d services and %d servers"
#define RPL_UNAWAY "305"
#define RPL_UNAWAY_MSG RPL_UNAWAY" %s :You are no longer marked as being away"
#define RPL_NOWAWAY "306"
#define RPL_NOWAWAY_MSG RPL_NOWAWAY" %s :You have been marked as being away"
#define RPL_MOTD "372"
#define RPL_MOTD_MSG RPL_MOTD" %s :- %s"
#define RPL_MOTDSTART "375"
#define RPL_MOTDSTART_MSG RPL_MOTDSTART" %s :- %s message of the day"
#define RPL_ENDOFMOTD "376"
#define RPL_ENDOFMOTD_MSG RPL_ENDOFMOTD" %s :End of MOTD command"
#define RPL_AWAY "301"
#define RPL_AWAY_MSG RPL_AWAY" %s %s :%s"
#define RPL_USERHOST "302"
#define RPL_USERHOST_MSG RPL_USERHOST" %s :"
#define RPL_ISON "303"
#define RPL_ISON_MSG RPL_ISON" %s :"
#define RPL_WHOISUSER "311"
#define RPL_WHOISUSER_MSG RPL_WHOISUSER" %s %s %s %s * :%s"
#define RPL_WHOISSERVER "312"
#define RPL_WHOISSERVER_MSG RPL_WHOISSERVER" %s %s %s :%s"
#define RPL_WHOISOPERATOR "313"
#define RPL_WHOISOPERATOR_MSG RPL_WHOISOPERATOR" %s %s :is an IRC operator"
#define RPL_WHOISIDLE "317"
#define RPL_WHOISIDLE_MSG RPL_WHOISIDLE" %s %s %ld :seconds idle"
#define RPL_ENDOFWHOIS "318"
#define RPL_ENDOFWHOIS_MSG RPL_ENDOFWHOIS" %s %s :End of WHOIS list"
#define RPL_WHOISCHANNELS "319"
#define RPL_WHOISCHANNELS_MSG RPL_WHOISCHANNELS" %s %s :"
#define RPL_CHANNELMODEIS "324"
#define RPL_CHANNELMODEIS_MSG RPL_CHANNELMODEIS" %s %s +%s"
#define RPL_NOTOPIC "331"
#define RPL_NOTOPIC_MSG RPL_NOTOPIC" %s %s :No topic is set"
#define RPL_TOPIC "332"
#define RPL_TOPIC_MSG RPL_TOPIC" %s %s :%s"
#define RPL_VERSION "351"
#define RPL_VERSION_MSG RPL_VERSION" %s "PACKAGE"-"VERSION".%s %s :%s"
#define RPL_NAMREPLY "353"
#define RPL_NAMREPLY_MSG RPL_NAMREPLY" %s %s %s :"
#define RPL_LINKS "364"
#define RPL_LINKS_MSG RPL_LINKS" %s %s %s :%d %s"
#define RPL_ENDOFLINKS "365"
#define RPL_ENDOFLINKS_MSG RPL_ENDOFLINKS" %s %s :End of LINKS list"
#define RPL_ENDOFNAMES "366"
#define RPL_ENDOFNAMES_MSG RPL_ENDOFNAMES" %s %s :End of NAMES list"
#define RPL_YOUREOPER "381"
#define RPL_YOUREOPER_MSG RPL_YOUREOPER" %s :You are now an IRC Operator"
#define ERR_NOSUCHNICK "401"
#define ERR_NOSUCHNICK_MSG ERR_NOSUCHNICK" %s %s :No such nick or channel name"
#define ERR_NOSUCHSERVER "402"
#define ERR_NOSUCHSERVER_MSG ERR_NOSUCHSERVER" %s %s :No such server"
#define ERR_NOSUCHCHANNEL "403"
#define ERR_NOSUCHCHANNEL_MSG ERR_NOSUCHCHANNEL" %s %s :No such channel"
#define ERR_CANNOTSENDTOCHAN "404"
#define ERR_CANNOTSENDTOCHAN_MSG ERR_CANNOTSENDTOCHAN" %s %s :Cannot send to channel"
#define ERR_NOORIGIN "409"
#define ERR_NOORIGIN_MSG ERR_NOORIGIN" %s :No origin specified"
#define ERR_NORECIPIENT "411"
#define ERR_NORECIPIENT_MSG ERR_NORECIPIENT" %s :No receipient given (%s)"
#define ERR_NOTEXTTOSEND "412"
#define ERR_NOTEXTTOSEND_MSG ERR_NOTEXTTOSEND" %s :No text to send"
#define ERR_UNKNOWNCOMMAND "421"
#define ERR_UNKNOWNCOMMAND_MSG ERR_UNKNOWNCOMMAND" %s %s :Unknown command"
#define ERR_NOMOTD "422"
#define ERR_NOMOTD_MSG ERR_NOMOTD" %s :MOTD file is missing"
#define ERR_ERRONEUSNICKNAME "432"
#define ERR_ERRONEUSNICKNAME_MSG ERR_ERRONEUSNICKNAME" %s %s :Erroneous nickname"
#define ERR_NICKNAMEINUSE "433"
#define ERR_NICKNAMEINUSE_MSG ERR_NICKNAMEINUSE" %s %s :Nickname already in use"
#define ERR_NOTONCHANNEL "442"
#define ERR_NOTONCHANNEL_MSG ERR_NOTONCHANNEL" %s %s :You are not on that channel"
#define ERR_NOTREGISTERED "451"
#define ERR_NOTREGISTERED_MSG ERR_NOTREGISTERED" %s :Connection not registered"
#define ERR_NOTREGISTEREDSERVER_MSG ERR_NOTREGISTERED" %s :Connection not registered as server link"
#define ERR_NEEDMOREPARAMS "461"
#define ERR_NEEDMOREPARAMS_MSG ERR_NEEDMOREPARAMS" %s %s :Syntax error"
#define ERR_ALREADYREGISTRED "462"
#define ERR_ALREADYREGISTRED_MSG ERR_ALREADYREGISTRED" %s :Connection already registered"
#define ERR_PASSWDMISMATCH "464"
#define ERR_PASSWDMISMATCH_MSG ERR_PASSWDMISMATCH" %s: Invalid password"
#define ERR_NOPRIVILEGES "481"
#define ERR_NOPRIVILEGES_MSG ERR_NOPRIVILEGES" %s :Permission denied"
#define ERR_CHANOPRIVSNEEDED "482"
#define ERR_CHANOPRIVSNEEDED_MSG ERR_CHANOPRIVSNEEDED" %s %s :You are not channel operator"
#define ERR_RESTRICTED "484"
#define ERR_RESTRICTED_MSG ERR_RESTRICTED" %s :Your connection is restricted"
#define ERR_NOOPERHOST "491"
#define ERR_NOOPERHOST_MSG ERR_NOOPERHOST" %s :Not configured for your host"
#define ERR_UMODEUNKNOWNFLAG "501"
#define ERR_UMODEUNKNOWNFLAG_MSG ERR_UMODEUNKNOWNFLAG" %s :Unknown mode"
#define ERR_UMODEUNKNOWNFLAG2_MSG ERR_UMODEUNKNOWNFLAG" %s :Unknown mode \"%c%c\""
#define ERR_USERSDONTMATCH "502"
#define ERR_USERSDONTMATCH_MSG ERR_USERSDONTMATCH" %s :Can't set/get mode for other users"
#ifdef ZLIB
#define RPL_STATSLINKINFOZIP_MSG "211 %s %s %d %ld %ld/%ld %ld %ld/%ld :%ld"
#endif
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -2,49 +2,15 @@
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* 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: ngircd.h,v 1.10 2002/02/19 20:07:48 alex Exp $
* $Id: ngircd.h,v 1.22 2005/06/24 19:20:56 fw Exp $
*
* ngircd.h: Prototypen aus dem "Haupt-Modul"
*
* $Log: ngircd.h,v $
* Revision 1.10 2002/02/19 20:07:48 alex
* - Neue Variablen NGIRCd_DebugVersion und NGIRCd_Passive.
*
* Revision 1.9 2002/02/17 23:40:32 alex
* - Neue Funktion NGIRCd_VersionAddition().
*
* Revision 1.8 2002/01/18 11:12:11 alex
* - der Sniffer wird nun nur noch aktiviert, wenn auf Kommandozeile angegeben.
*
* Revision 1.7 2002/01/11 14:45:18 alex
* - Kommandozeilen-Parser implementiert: Debug- und No-Daemon-Modus, Hilfe.
*
* Revision 1.6 2002/01/02 02:44:37 alex
* - neue Defines fuer max. Anzahl Server und Operatoren.
*
* Revision 1.5 2001/12/31 03:06:03 alex
* - das #include fuer time.h hat noch gefehlt.
*
* Revision 1.4 2001/12/31 02:18:51 alex
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
* - neuen Header "defines.h" mit (fast) allen Konstanten.
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
*
* Revision 1.3 2001/12/30 11:42:00 alex
* - der Server meldet nun eine ordentliche "Start-Zeit".
*
* Revision 1.2 2001/12/12 23:30:01 alex
* - NGIRCd_Quit ist nun das globale Flag zum Beenden des ngircd.
*
* Revision 1.1.1.1 2001/12/11 21:53:04 alex
* - Imported sources to CVS.
* Prototypes of the "main module".
*/
@@ -53,29 +19,36 @@
#include <time.h>
#include "defines.h"
GLOBAL time_t NGIRCd_Start; /* Startzeitpunkt des Daemon */
GLOBAL CHAR NGIRCd_StartStr[64];
GLOBAL char NGIRCd_StartStr[64];
GLOBAL char NGIRCd_Version[126];
GLOBAL char NGIRCd_VersionAddition[126];
#ifdef DEBUG
GLOBAL BOOLEAN NGIRCd_Debug; /* Debug-Modus aktivieren */
GLOBAL bool NGIRCd_Debug; /* Debug-Modus aktivieren */
#endif
#ifdef SNIFFER
GLOBAL BOOLEAN NGIRCd_Sniffer; /* Sniffer aktivieren */
GLOBAL bool NGIRCd_Sniffer; /* Sniffer aktivieren */
#endif
GLOBAL BOOLEAN NGIRCd_NoDaemon; /* nicht im Hintergrund laufen */
GLOBAL bool NGIRCd_Passive; /* nicht zu anderen Servern connecten */
GLOBAL BOOLEAN NGIRCd_Passive; /* nicht zu anderen Servern connecten */
GLOBAL bool NGIRCd_SignalQuit; /* true: quit server*/
GLOBAL bool NGIRCd_SignalRestart; /* true: restart server */
GLOBAL bool NGIRCd_SignalRehash; /* true: reload configuration */
GLOBAL BOOLEAN NGIRCd_Quit; /* TRUE: ngIRCd beenden */
GLOBAL BOOLEAN NGIRCd_Restart; /* TRUE: neu starten */
GLOBAL char NGIRCd_DebugLevel[2]; /* Debug-Level fuer IRC_VERSION() */
GLOBAL CHAR NGIRCd_DebugLevel[2]; /* Debug-Level fuer IRC_VERSION() */
GLOBAL char NGIRCd_ConfFile[FNAME_LEN]; /* Konfigurationsdatei */
GLOBAL CHAR *NGIRCd_Version( VOID );
GLOBAL CHAR *NGIRCd_VersionAddition( VOID );
GLOBAL char NGIRCd_ProtoID[COMMAND_LEN];/* Protokoll- und Server-Identifikation */
GLOBAL void NGIRCd_Rehash PARAMS(( void ));
#endif

View File

@@ -2,156 +2,153 @@
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: parse.c,v 1.28 2002/02/27 23:25:31 alex Exp $
*
* parse.c: Parsen der Client-Anfragen
*
* $Log: parse.c,v $
* Revision 1.28 2002/02/27 23:25:31 alex
* - Anpassungen an Aufteilung von irc.d, Init- und Exit-Funktionen entfernt.
*
* Revision 1.27 2002/02/27 20:33:13 alex
* - Channel-Topics implementiert.
*
* Revision 1.26 2002/02/27 18:23:46 alex
* - IRC-Befehl "AWAY" implementert.
*
* Revision 1.25 2002/02/26 20:52:15 alex
* - Fehler bei Fehlermeldung wg. unbekanntem Prefix behoben.
*
* Revision 1.24 2002/02/23 21:39:48 alex
* - IRC-Befehl KILL sowie Kills bei Nick Collsisions implementiert.
*
* Revision 1.23 2002/02/17 23:38:58 alex
* - neuer IRC-Befehl VERSION implementiert: IRC_VERSION().
*
* Revision 1.22 2002/01/21 00:01:37 alex
* - neue Befehle JOIN und PART.
*
* Revision 1.21 2002/01/18 11:12:11 alex
* - der Sniffer wird nun nur noch aktiviert, wenn auf Kommandozeile angegeben.
*
* Revision 1.20 2002/01/11 23:50:55 alex
* - LINKS implementiert, LUSERS begonnen.
*
* Revision 1.19 2002/01/09 01:08:42 alex
* - Parses handhabt Leerzeichen zw. Parametern nun etwas "lockerer".
*
* Revision 1.18 2002/01/07 15:29:11 alex
* - Status-Codes an den Server selber werden ignoriert, besseres Logging.
*
* Revision 1.17 2002/01/06 17:41:44 alex
* - die Fehlermeldung "unbekannter Befehl" hatte ein falsches Format.
*
* Revision 1.16 2002/01/05 23:23:20 alex
* - generisches Forwarding von Zahlen-Statuscodes implementiert.
*
* Revision 1.15 2002/01/05 01:42:08 alex
* - an Server werden keine ERRORS mehr wegen unbekannter Befehle geschickt.
*
* Revision 1.14 2002/01/04 17:56:45 alex
* - neuer Befehl SQUIT.
*
* Revision 1.13 2002/01/04 01:20:02 alex
* - Client-Strukruren werden nur noch ueber Funktionen angesprochen.
*
* Revision 1.12 2002/01/03 02:24:49 alex
* - neue Befehle NJOIN und SERVER begonnen.
*
* Revision 1.11 2002/01/02 02:43:22 alex
* - Copyright-Texte aktualisiert.
* - neuer Befehl ERROR.
*
* Revision 1.10 2001/12/31 15:33:13 alex
* - neuer Befehl NAMES, kleinere Bugfixes.
* - Bug bei PING behoben: war zu restriktiv implementiert :-)
*
* Revision 1.9 2001/12/31 02:18:51 alex
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
* - neuen Header "defines.h" mit (fast) allen Konstanten.
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
*
* Revision 1.8 2001/12/29 03:08:19 alex
* - Fuehrende und folgende Leerzeichen etc. in Requests werden geloescht.
* - Logmeldungen (mal wieder) ein wenig angepasst.
*
* Revision 1.7 2001/12/27 19:13:21 alex
* - neue Befehle NOTICE und PRIVMSG.
* - Debug-Logging ein wenig reduziert.
*
* Revision 1.6 2001/12/26 14:45:37 alex
* - "Code Cleanups".
*
* Revision 1.5 2001/12/26 03:23:03 alex
* - PING/PONG-Befehle implementiert.
*
* Revision 1.4 2001/12/25 22:04:26 alex
* - Aenderungen an den Debug- und Logging-Funktionen.
*
* Revision 1.3 2001/12/25 19:18:36 alex
* - Gross- und Kleinschreibung der IRC-Befehle wird ignoriert.
* - bessere Debug-Ausgaben.
*
* Revision 1.2 2001/12/23 21:56:47 alex
* - bessere Debug-Ausgaben,
* - Bug im Parameter-Parser behoben (bei "langem" Parameter)
* - erste IRC-Befehle werden erkannt :-)
*
* Revision 1.1 2001/12/21 23:53:16 alex
* - Modul zum Parsen von Client-Requests begonnen.
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*/
#include <portab.h>
#include "global.h"
#include "portab.h"
#include <imp.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.
*/
#include "imp.h"
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include "ngircd.h"
#include "defines.h"
#include "conn-func.h"
#include "client.h"
#include "conn.h"
#include "irc.h"
#include "irc-login.h"
#include "irc-mode.h"
#include "irc-write.h"
#include "channel.h"
#include "log.h"
#include "messages.h"
#include "tool.h"
#include <exp.h>
#include "exp.h"
#include "parse.h"
#include "imp.h"
#include "irc.h"
#include "irc-channel.h"
#include "irc-info.h"
#include "irc-login.h"
#include "irc-mode.h"
#include "irc-op.h"
#include "irc-oper.h"
#include "irc-server.h"
#include "irc-write.h"
LOCAL VOID Init_Request( REQUEST *Req );
LOCAL BOOLEAN Parse_Error( CONN_ID Idx, CHAR *Error );
LOCAL BOOLEAN Validate_Prefix( REQUEST *Req );
LOCAL BOOLEAN Validate_Command( REQUEST *Req );
LOCAL BOOLEAN Validate_Args( REQUEST *Req );
LOCAL BOOLEAN Handle_Request( CONN_ID Idx, REQUEST *Req );
#include "exp.h"
GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request )
COMMAND My_Commands[] =
{
/* 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. */
{ "ADMIN", IRC_ADMIN, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "AWAY", IRC_AWAY, CLIENT_USER, 0, 0, 0 },
{ "CONNECT", IRC_CONNECT, CLIENT_USER, 0, 0, 0 },
{ "DIE", IRC_DIE, CLIENT_USER, 0, 0, 0 },
{ "DISCONNECT", IRC_DISCONNECT, CLIENT_USER, 0, 0, 0 },
{ "ERROR", IRC_ERROR, 0xFFFF, 0, 0, 0 },
{ "HELP", IRC_HELP, CLIENT_USER, 0, 0, 0 },
{ "INVITE", IRC_INVITE, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "ISON", IRC_ISON, CLIENT_USER, 0, 0, 0 },
{ "JOIN", IRC_JOIN, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "KICK", IRC_KICK, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "KILL", IRC_KILL, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "LINKS", IRC_LINKS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "LIST", IRC_LIST, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "LUSERS", IRC_LUSERS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "MODE", IRC_MODE, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "MOTD", IRC_MOTD, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "NAMES", IRC_NAMES, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "NICK", IRC_NICK, 0xFFFF, 0, 0, 0 },
{ "NJOIN", IRC_NJOIN, CLIENT_SERVER, 0, 0, 0 },
{ "NOTICE", IRC_NOTICE, 0xFFFF, 0, 0, 0 },
{ "OPER", IRC_OPER, CLIENT_USER, 0, 0, 0 },
{ "PART", IRC_PART, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "PASS", IRC_PASS, 0xFFFF, 0, 0, 0 },
{ "PING", IRC_PING, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "PONG", IRC_PONG, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "PRIVMSG", IRC_PRIVMSG, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "QUIT", IRC_QUIT, 0xFFFF, 0, 0, 0 },
{ "REHASH", IRC_REHASH, CLIENT_USER, 0, 0, 0 },
{ "RESTART", IRC_RESTART, CLIENT_USER, 0, 0, 0 },
{ "SERVER", IRC_SERVER, 0xFFFF, 0, 0, 0 },
{ "SQUIT", IRC_SQUIT, CLIENT_SERVER, 0, 0, 0 },
{ "STATS", IRC_STATS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "TIME", IRC_TIME, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "TOPIC", IRC_TOPIC, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "TRACE", IRC_TRACE, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "USER", IRC_USER, 0xFFFF, 0, 0, 0 },
{ "USERHOST", IRC_USERHOST, CLIENT_USER, 0, 0, 0 },
{ "VERSION", IRC_VERSION, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "WHO", IRC_WHO, CLIENT_USER, 0, 0, 0 },
{ "WHOIS", IRC_WHOIS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "WHOWAS", IRC_WHOWAS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
#ifdef IRCPLUS
{ "CHANINFO", IRC_CHANINFO, CLIENT_SERVER, 0, 0, 0 },
#endif
{ NULL, NULL, 0x0, 0, 0, 0 } /* Ende-Marke */
};
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 bool Handle_Request PARAMS(( CONN_ID Idx, REQUEST *Req ));
/**
* Return the pointer to the global "IRC command structure".
* This structure, an array of type "COMMAND" describes all the IRC commands
* implemented by ngIRCd and how to handle them.
* @return Pointer to the global command structure.
*/
GLOBAL COMMAND *
Parse_GetCommandStruct( void )
{
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 )
{
REQUEST req;
CHAR *start, *ptr;
char *start, *ptr;
bool closed;
assert( Idx >= 0 );
assert( Request != NULL );
@@ -159,7 +156,7 @@ GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request )
#ifdef SNIFFER
if( NGIRCd_Sniffer ) Log( LOG_DEBUG, " <- connection %d: '%s'.", Idx, Request );
#endif
Init_Request( &req );
/* Fuehrendes und folgendes "Geraffel" verwerfen */
@@ -171,7 +168,11 @@ GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request )
/* Prefix vorhanden */
req.prefix = Request + 1;
ptr = strchr( Request, ' ' );
if( ! ptr ) return Parse_Error( Idx, "Prefix without command!?" );
if( ! ptr )
{
Log( LOG_DEBUG, "Connection %d: Parse error: prefix without command!?", Idx );
return Conn_WriteStr( Idx, "ERROR :Prefix without command!?" );
}
*ptr = '\0';
#ifndef STRICT_RFC
/* multiple Leerzeichen als Trenner zwischen
@@ -182,8 +183,6 @@ GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request )
}
else start = Request;
if( ! Validate_Prefix( &req )) return Parse_Error( Idx, "Invalid prefix");
/* Befehl */
ptr = strchr( start, ' ' );
if( ptr )
@@ -191,14 +190,12 @@ GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request )
*ptr = '\0';
#ifndef STRICT_RFC
/* multiple Leerzeichen als Trenner vor
*Parametertrennern ignorieren */
* Parametern ignorieren */
while( *(ptr + 1) == ' ' ) ptr++;
#endif
}
req.command = start;
if( ! Validate_Command( &req )) return Parse_Error( Idx, "Invalid command" );
/* Argumente, Parameter */
if( ptr )
{
@@ -226,29 +223,37 @@ GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request )
#endif
}
}
req.argc++;
if( start[0] == ':' ) break;
if( req.argc > 14 ) break;
if( ptr ) start = ptr + 1;
else start = NULL;
}
}
if( ! Validate_Args( &req )) return Parse_Error( Idx, "Invalid argument(s)" );
/* Daten validieren */
if( ! Validate_Prefix( Idx, &req, &closed )) return ! closed;
if( ! Validate_Command( Idx, &req, &closed )) return ! closed;
if( ! Validate_Args( Idx, &req, &closed )) return ! closed;
return Handle_Request( Idx, &req );
} /* Parse_Request */
LOCAL VOID Init_Request( REQUEST *Req )
/**
* Initialize request structure.
* @param Req Request structure to be initialized.
*/
LOCAL void
Init_Request( REQUEST *Req )
{
/* Neue Request-Struktur initialisieren */
INT i;
int i;
assert( Req != NULL );
Req->prefix = NULL;
@@ -258,49 +263,92 @@ LOCAL VOID Init_Request( REQUEST *Req )
} /* Init_Request */
LOCAL BOOLEAN Parse_Error( CONN_ID Idx, CHAR *Error )
LOCAL bool
Validate_Prefix( CONN_ID Idx, REQUEST *Req, bool *Closed )
{
/* Fehler beim Parsen. Fehlermeldung an den Client schicken.
* TRUE: Connection wurde durch diese Funktion nicht geschlossen,
* FALSE: Connection wurde terminiert. */
CLIENT *client, *c;
assert( Idx >= 0 );
assert( Error != NULL );
Log( LOG_DEBUG, "Connection %d: Parse error: %s", Idx, Error );
return Conn_WriteStr( Idx, "ERROR :Parse error: %s", Error );
} /* Parse_Error */
LOCAL BOOLEAN Validate_Prefix( REQUEST *Req )
{
assert( Req != NULL );
return TRUE;
*Closed = false;
/* ist ueberhaupt ein Prefix vorhanden? */
if( ! Req->prefix ) return true;
/* Client-Struktur der Connection ermitteln */
client = Client_GetFromConn( Idx );
assert( client != NULL );
/* nur validieren, wenn bereits registrierte Verbindung */
if(( Client_Type( client ) != CLIENT_USER ) && ( Client_Type( client ) != CLIENT_SERVER ) && ( Client_Type( client ) != CLIENT_SERVICE ))
{
/* noch nicht registrierte Verbindung.
* Das Prefix wird ignoriert. */
Req->prefix = NULL;
return true;
}
/* pruefen, ob der im Prefix angegebene Client bekannt ist */
c = Client_Search( Req->prefix );
if( ! c )
{
/* 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;
}
/* pruefen, ob der Client mit dem angegebenen Prefix in Richtung
* des Senders liegt, d.h. sicherstellen, dass das Prefix nicht
* gefaelscht ist */
if( Client_NextHop( c ) != client )
{
/* 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;
}
return true;
} /* Validate_Prefix */
LOCAL BOOLEAN Validate_Command( REQUEST *Req )
LOCAL bool
Validate_Command( UNUSED CONN_ID Idx, UNUSED REQUEST *Req, bool *Closed )
{
assert( Idx >= 0 );
assert( Req != NULL );
return TRUE;
*Closed = false;
return true;
} /* Validate_Comman */
LOCAL BOOLEAN Validate_Args( REQUEST *Req )
LOCAL bool
Validate_Args( UNUSED CONN_ID Idx, UNUSED REQUEST *Req, bool *Closed )
{
assert( Idx >= 0 );
assert( Req != NULL );
return TRUE;
*Closed = false;
return true;
} /* Validate_Args */
LOCAL BOOLEAN Handle_Request( CONN_ID Idx, REQUEST *Req )
LOCAL bool
Handle_Request( CONN_ID Idx, REQUEST *Req )
{
/* Client-Request verarbeiten. Bei einem schwerwiegenden Fehler
* wird die Verbindung geschlossen und FALSE geliefert. */
* wird die Verbindung geschlossen und false geliefert. */
CLIENT *client, *target, *prefix;
CHAR str[LINE_LEN];
INT i;
char str[LINE_LEN];
bool result;
COMMAND *cmd;
int i;
assert( Idx >= 0 );
assert( Req != NULL );
@@ -309,85 +357,99 @@ LOCAL BOOLEAN Handle_Request( CONN_ID Idx, REQUEST *Req )
client = Client_GetFromConn( Idx );
assert( client != NULL );
/* Statuscode, der geforwarded werden muss? */
if(( strlen( Req->command ) == 3 ) && ( atoi( Req->command ) > 100 ))
/* Statuscode? */
if(( Client_Type( client ) == CLIENT_SERVER ) && ( strlen( Req->command ) == 3 ) && ( atoi( Req->command ) > 100 ))
{
/* Befehl ist ein Statuscode */
/* Command is a status code from an other server */
/* Zielserver ermitteln */
if(( Client_Type( client ) == CLIENT_SERVER ) && ( Req->argc > 0 )) target = Client_GetFromID( Req->argv[0] );
/* Determine target */
if( Req->argc > 0 ) target = Client_Search( Req->argv[0] );
else target = NULL;
if( ! target )
{
if( Req->argc > 0 ) Log( LOG_WARNING, "Unknown target for status code: \"%s\"", Req->argv[0] );
else Log( LOG_WARNING, "Unknown target for status code!" );
return TRUE;
/* 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;
}
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;
}
/* Quell-Client ermitteln */
/* Determine source */
if( ! Req->prefix[0] )
{
Log( LOG_WARNING, "Got status code without prefix!?" );
return TRUE;
/* Oops, no prefix!? */
Log( LOG_WARNING, "Got status code %s from \"%s\" without prefix!?", Req->command, Client_ID( client ));
return true;
}
else prefix = Client_GetFromID( Req->prefix );
else prefix = Client_Search( Req->prefix );
if( ! prefix )
{
Log( LOG_WARNING, "Got status code from unknown source: \"%s\"", Req->prefix );
return TRUE;
/* Oops, unknown prefix!? */
Log( LOG_WARNING, "Got status code %s from unknown source: \"%s\"", Req->command, Req->prefix );
return true;
}
/* Statuscode weiterleiten */
strcpy( str, Req->command );
/* Forward status code */
strlcpy( str, Req->command, sizeof( str ));
for( i = 0; i < Req->argc; i++ )
{
if( i < Req->argc - 1 ) strcat( str, " " );
else strcat( str, " :" );
strcat( str, Req->argv[i] );
if( i < Req->argc - 1 ) strlcat( str, " ", sizeof( str ));
else strlcat( str, " :", sizeof( str ));
strlcat( str, Req->argv[i], sizeof( str ));
}
return IRC_WriteStrClientPrefix( target, prefix, str );
return IRC_WriteStrClientPrefix( target, prefix, "%s", str );
}
if( strcasecmp( Req->command, "PASS" ) == 0 ) return IRC_PASS( client, Req );
else if( strcasecmp( Req->command, "NICK" ) == 0 ) return IRC_NICK( client, Req );
else if( strcasecmp( Req->command, "USER" ) == 0 ) return IRC_USER( client, Req );
else if( strcasecmp( Req->command, "SERVER" ) == 0 ) return IRC_SERVER( client, Req );
else if( strcasecmp( Req->command, "NJOIN" ) == 0 ) return IRC_NJOIN( client, Req );
else if( strcasecmp( Req->command, "QUIT" ) == 0 ) return IRC_QUIT( client, Req );
else if( strcasecmp( Req->command, "SQUIT" ) == 0 ) return IRC_SQUIT( client, Req );
else if( strcasecmp( Req->command, "PING" ) == 0 ) return IRC_PING( client, Req );
else if( strcasecmp( Req->command, "PONG" ) == 0 ) return IRC_PONG( client, Req );
else if( strcasecmp( Req->command, "MOTD" ) == 0 ) return IRC_MOTD( client, Req );
else if( strcasecmp( Req->command, "PRIVMSG" ) == 0 ) return IRC_PRIVMSG( client, Req );
else if( strcasecmp( Req->command, "NOTICE" ) == 0 ) return IRC_NOTICE( client, Req );
else if( strcasecmp( Req->command, "MODE" ) == 0 ) return IRC_MODE( client, Req );
else if( strcasecmp( Req->command, "NAMES" ) == 0 ) return IRC_NAMES( client, Req );
else if( strcasecmp( Req->command, "ISON" ) == 0 ) return IRC_ISON( client, Req );
else if( strcasecmp( Req->command, "WHOIS" ) == 0 ) return IRC_WHOIS( client, Req );
else if( strcasecmp( Req->command, "USERHOST" ) == 0 ) return IRC_USERHOST( client, Req );
else if( strcasecmp( Req->command, "OPER" ) == 0 ) return IRC_OPER( client, Req );
else if( strcasecmp( Req->command, "DIE" ) == 0 ) return IRC_DIE( client, Req );
else if( strcasecmp( Req->command, "RESTART" ) == 0 ) return IRC_RESTART( client, Req );
else if( strcasecmp( Req->command, "ERROR" ) == 0 ) return IRC_ERROR( client, Req );
else if( strcasecmp( Req->command, "LUSERS" ) == 0 ) return IRC_LUSERS( client, Req );
else if( strcasecmp( Req->command, "LINKS" ) == 0 ) return IRC_LINKS( client, Req );
else if( strcasecmp( Req->command, "JOIN" ) == 0 ) return IRC_JOIN( client, Req );
else if( strcasecmp( Req->command, "PART" ) == 0 ) return IRC_PART( client, Req );
else if( strcasecmp( Req->command, "VERSION" ) == 0 ) return IRC_VERSION( client, Req );
else if( strcasecmp( Req->command, "KILL" ) == 0 ) return IRC_KILL( client, Req );
else if( strcasecmp( Req->command, "AWAY" ) == 0 ) return IRC_AWAY( client, Req );
else if( strcasecmp( Req->command, "TOPIC" ) == 0 ) return IRC_TOPIC( client, Req );
/* Unbekannter Befehl */
if( Client_Type( client ) != CLIENT_SERVER ) IRC_WriteStrClient( client, ERR_UNKNOWNCOMMAND_MSG, Client_ID( client ), Req->command );
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" );
cmd = My_Commands;
while( cmd->name )
{
/* Befehl suchen */
if( strcasecmp( Req->command, cmd->name ) != 0 )
{
cmd++; continue;
}
return TRUE;
if( Client_Type( client ) & cmd->type )
{
/* Command is allowed for this client: call it and count produced bytes */
Conn_ResetWCounter( );
result = (cmd->function)( client, Req );
cmd->bytes += Conn_WCounter( );
/* Adjust counters */
if( Client_Type( client ) != CLIENT_SERVER ) cmd->lcount++;
else cmd->rcount++;
return result;
}
else
{
/* Befehl ist fuer diesen Client-Typ nicht erlaubt! */
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;
} /* Handle_Request */

View File

@@ -2,53 +2,45 @@
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
* 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: parse.h,v 1.5 2002/02/27 23:24:29 alex Exp $
* $Id: parse.h,v 1.11 2005/03/19 18:43:49 fw Exp $
*
* parse.h: Parsen der Client-Anfragen (Header)
*
* $Log: parse.h,v $
* Revision 1.5 2002/02/27 23:24:29 alex
* - ueberfluessige Init- und Exit-Funktionen entfernt.
*
* Revision 1.4 2002/01/02 02:43:50 alex
* - Copyright-Text ergaenzt bzw. aktualisiert.
*
* Revision 1.3 2001/12/31 02:18:51 alex
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
* - neuen Header "defines.h" mit (fast) allen Konstanten.
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
*
* Revision 1.2 2001/12/26 14:45:37 alex
* - "Code Cleanups".
*
* Revision 1.1 2001/12/21 23:53:16 alex
* - Modul zum Parsen von Client-Requests begonnen.
* IRC command parser and validator (header)
*/
#ifndef __parse_h__
#define __parse_h__
#include "conn.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;
GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *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 */
} COMMAND;
GLOBAL bool Parse_Request PARAMS((CONN_ID Idx, char *Request ));
GLOBAL COMMAND *Parse_GetCommandStruct PARAMS(( void ));
#endif

366
src/ngircd/rendezvous.c Normal file
View File

@@ -0,0 +1,366 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001-2004 by Alexander Barton (alex@barton.de)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* 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.
*
* Rendezvous service registration.
*
* Supported APIs are:
* - Apple Mac OS X
* - Howl
*/
#include "portab.h"
#ifdef RENDEZVOUS
static char UNUSED id[] = "$Id: rendezvous.c,v 1.5 2005/03/19 18:43:49 fw Exp $";
#include "imp.h"
#include <assert.h>
#include <stdio.h>
#include <string.h>
#ifdef HAVE_MACH_PORT_H
#include "mach/port.h"
#include "mach/message.h"
#endif
#ifdef HAVE_DNSSERVICEDISCOVERY_DNSSERVICEDISCOVERY_H
#include <DNSServiceDiscovery/DNSServiceDiscovery.h>
#endif
#ifdef HAVE_RENDEZVOUS_RENDEZVOUS_H
#include <rendezvous/rendezvous.h>
#endif
#include "defines.h"
#include "log.h"
#include "exp.h"
#include "rendezvous.h"
#if defined(HAVE_DNSSERVICEREGISTRATIONCREATE)
# define APPLE
#elif defined(HAVE_SW_DISCOVERY_INIT)
# define HOWL
#else
# error "Can't detect Rendezvous API!?"
#endif
#define MAX_RENDEZVOUS 1000
typedef struct _service
{
char Desc[CLIENT_ID_LEN];
#ifdef APPLE
dns_service_discovery_ref Discovery_Ref;
mach_port_t Mach_Port;
#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 )
{
/* 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;
for( i = 0; i < MAX_RENDEZVOUS; i++ )
{
if( My_Rendezvous[i].Desc[0] ) Unregister( i );
}
#ifdef HOWL
sw_discovery_fina( My_Discovery_Session );
#endif
} /* Rendezvous_Exit */
GLOBAL bool Rendezvous_Register( char *Name, char *Type, unsigned int Port )
{
/* Register new service */
int i;
/* Search free port structure */
for( i = 0; i < MAX_RENDEZVOUS; i++ ) if( ! My_Rendezvous[i].Desc[0] ) break;
if( i >= MAX_RENDEZVOUS )
{
Log( LOG_ERR, "Can't register \"%s\" with Rendezvous: limit (%d) reached!", Name, MAX_RENDEZVOUS );
return false;
}
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] );
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;
}
/* Get and save the corresponding Mach Port */
My_Rendezvous[i].Mach_Port = DNSServiceDiscoveryMachPort( My_Rendezvous[i].Discovery_Ref );
if( ! My_Rendezvous[i].Mach_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;
}
#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;
} /* Rendezvous_Register */
GLOBAL bool Rendezvous_Unregister( char *Name )
{
/* Unregister service from rendezvous */
int i;
bool ok;
ok = false;
for( i = 0; i < MAX_RENDEZVOUS; i++ )
{
if( strcmp( Name, My_Rendezvous[i].Desc ) == 0 )
{
Unregister( i );
ok = true;
}
}
return ok;
} /* Rendezvous_Unregister */
GLOBAL void Rendezvous_UnregisterListeners( void )
{
/* Unregister all our listening sockets from Rendezvous */
int i;
for( i = 0; i < MAX_RENDEZVOUS; i++ )
{
if( My_Rendezvous[i].Desc[0] ) Unregister( i );
}
} /* Rendezvous_UnregisterListeners */
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];
mach_msg_return_t result;
mach_msg_header_t *msg;
for( i = 0; i < MAX_RENDEZVOUS; i++ )
{
if( ! My_Rendezvous[i].Discovery_Ref ) continue;
/* Read message from Mach Port */
msg = (mach_msg_header_t *)buffer;
result = mach_msg( msg, MACH_RCV_MSG|MACH_RCV_TIMEOUT, 0, MAX_MACH_MSG_SIZE, My_Rendezvous[i].Mach_Port, 1, 0 );
/* 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 );
#endif
} /* Rendezvous_Handler */
LOCAL void Unregister( int Idx )
{
/* Unregister service */
#ifdef APPLE
DNSServiceDiscoveryDeallocate( My_Rendezvous[Idx].Discovery_Ref );
#endif /* Apple */
#ifdef HOWL
if( sw_discovery_cancel( My_Discovery_Session, My_Rendezvous[Idx].Id ) != SW_OKAY )
{
Log( LOG_ERR, "Rendezvous: Failed to unregister \"%s\"!", My_Rendezvous[Idx].Desc );
return;
}
#endif /* Howl */
Log( LOG_INFO, "Unregistered \"%s\" from Rendezvous.", My_Rendezvous[Idx].Desc );
My_Rendezvous[Idx].Desc[0] = '\0';
} /* Unregister */
/* -- Apple API -- */
#ifdef APPLE
LOCAL void Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrCode, void *Context )
{
SERVICE *s = (SERVICE *)Context;
char txt[50];
if( ErrCode == kDNSServiceDiscoveryNoError )
{
/* Success! */
Log( LOG_INFO, "Successfully registered \"%s\" with Rendezvous.", s->Desc );
return;
}
switch( ErrCode )
{
case kDNSServiceDiscoveryAlreadyRegistered:
strcpy( txt, "name already registered!" );
break;
case kDNSServiceDiscoveryNameConflict:
strcpy( txt, "name conflict!" );
break;
default:
sprintf( txt, "error code %ld!", (long)ErrCode );
}
Log( LOG_INFO, "Can't register \"%s\" with Rendezvous: %s", s->Desc, txt );
s->Desc[0] = '\0';
} /* 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 )
{
SERVICE *s = (SERVICE *)Extra;
char txt[50];
assert( Session == My_Discovery_Session );
assert( Extra != NULL );
if( Status == SW_DISCOVERY_PUBLISH_STARTED || Status == SW_DISCOVERY_PUBLISH_STOPPED )
{
/* Success! */
Log( LOG_INFO, "Successfully registered \"%s\" with Rendezvous.", s->Desc );
return SW_OKAY;
}
switch( Status )
{
case SW_DISCOVERY_PUBLISH_NAME_COLLISION:
strcpy( txt, "name conflict!" );
break;
default:
sprintf( txt, "error code %ld!", (long)Status );
}
Log( LOG_INFO, "Can't register \"%s\" with Rendezvous: %s", s->Desc, txt );
s->Desc[0] = '\0';
return SW_OKAY;
} /* Registration_Reply_Handler */
#endif /* Howl */
#endif /* RENDEZVOUS */
/* -eof- */

39
src/ngircd/rendezvous.h Normal file
View File

@@ -0,0 +1,39 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* 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
* 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: rendezvous.h,v 1.2 2005/03/19 18:43:49 fw Exp $
*
* "Rendezvous" functions (Header)
*/
#ifdef RENDEZVOUS
#ifndef __rdezvous_h__
#define __rdezvous_h__
GLOBAL void Rendezvous_Init( void );
GLOBAL void Rendezvous_Exit( void );
GLOBAL bool Rendezvous_Register( char *Name, char *Type, unsigned int Port );
GLOBAL bool Rendezvous_Unregister( char *Name );
GLOBAL void Rendezvous_UnregisterListeners( void );
GLOBAL void Rendezvous_Handler( void );
#endif /* __rdezvous_h__ */
#endif /* RENDEZVOUS */
/* -eof- */

325
src/ngircd/resolve.c Normal file
View File

@@ -0,0 +1,325 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* 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
* 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.
*
* Asynchronous resolver
*/
#include "portab.h"
static char UNUSED id[] = "$Id: resolve.c,v 1.12.2.1 2005/09/02 22:07:38 fw Exp $";
#include "imp.h"
#include <assert.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#ifdef IDENTAUTH
#ifdef HAVE_IDENT_H
#include <ident.h>
#endif
#endif
#include "conn.h"
#include "defines.h"
#include "log.h"
#include "exp.h"
#include "resolve.h"
#ifdef IDENTAUTH
LOCAL void Do_ResolveAddr PARAMS(( struct sockaddr_in *Addr, int Sock, int w_fd ));
#else
LOCAL void Do_ResolveAddr PARAMS(( struct sockaddr_in *Addr, int w_fd ));
#endif
LOCAL void Do_ResolveName PARAMS(( char *Host, int w_fd ));
#ifdef h_errno
LOCAL char *Get_Error PARAMS(( int H_Error ));
#endif
LOCAL RES_STAT *New_Res_Stat PARAMS(( void ));
GLOBAL void
Resolve_Init( void )
{
/* Initialize module */
FD_ZERO( &Resolver_FDs );
} /* Resolve_Init */
#ifdef IDENTAUTH
GLOBAL RES_STAT *
Resolve_Addr( struct sockaddr_in *Addr, int Sock )
#else
GLOBAL RES_STAT *
Resolve_Addr( struct sockaddr_in *Addr )
#endif
{
/* Resolve IP (asynchronous!). On errors, e.g. if the child process
* can't be forked, this functions returns NULL. */
RES_STAT *s;
int pid;
s = New_Res_Stat( );
if( ! s ) return NULL;
/* For sub-process */
pid = fork( );
if( pid > 0 )
{
/* Main process */
Log( LOG_DEBUG, "Resolver for %s created (PID %d).", inet_ntoa( Addr->sin_addr ), pid );
FD_SET( s->pipe[0], &Resolver_FDs );
if( s->pipe[0] > Conn_MaxFD ) Conn_MaxFD = s->pipe[0];
s->pid = pid;
return s;
}
else if( pid == 0 )
{
/* Sub process */
Log_Init_Resolver( );
#ifdef IDENTAUTH
Do_ResolveAddr( Addr, Sock, s->pipe[1] );
#else
Do_ResolveAddr( Addr, s->pipe[1] );
#endif
Log_Exit_Resolver( );
exit( 0 );
}
else
{
/* Error! */
close(s->pipe[0]);
close(s->pipe[1]);
free( s );
Log( LOG_CRIT, "Resolver: Can't fork: %s!", strerror( errno ));
return NULL;
}
} /* Resolve_Addr */
GLOBAL RES_STAT *
Resolve_Name( char *Host )
{
/* Resolve hostname (asynchronous!). On errors, e.g. if the child
* process can't be forked, this functions returns NULL. */
RES_STAT *s;
int pid;
s = New_Res_Stat( );
if( ! s ) return NULL;
/* Fork sub-process */
pid = fork( );
if( pid > 0 )
{
/* Main process */
Log( LOG_DEBUG, "Resolver for \"%s\" created (PID %d).", Host, pid );
FD_SET( s->pipe[0], &Resolver_FDs );
if( s->pipe[0] > Conn_MaxFD ) Conn_MaxFD = s->pipe[0];
s->pid = pid;
return s;
}
else if( pid == 0 )
{
/* Sub process */
Log_Init_Resolver( );
Do_ResolveName( Host, s->pipe[1] );
Log_Exit_Resolver( );
exit( 0 );
}
else
{
/* Error! */
close(s->pipe[0]);
close(s->pipe[1]);
free( s );
Log( LOG_CRIT, "Resolver: Can't fork: %s!", strerror( errno ));
return NULL;
}
} /* Resolve_Name */
#ifdef IDENTAUTH
LOCAL void
Do_ResolveAddr( struct sockaddr_in *Addr, int Sock, int w_fd )
#else
LOCAL void
Do_ResolveAddr( struct sockaddr_in *Addr, int w_fd )
#endif
{
/* Resolver sub-process: resolve IP address and write result into
* pipe to parent. */
char hostname[HOST_LEN];
struct hostent *h;
size_t len;
#ifdef IDENTAUTH
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 );
if( h ) strlcpy( hostname, h->h_name, sizeof( hostname ));
else
{
#ifdef h_errno
Log_Resolver( LOG_WARNING, "Can't resolve address \"%s\": %s!", inet_ntoa( Addr->sin_addr ), Get_Error( h_errno ));
#else
Log_Resolver( LOG_WARNING, "Can't resolve address \"%s\"!", inet_ntoa( Addr->sin_addr ));
#endif
strlcpy( hostname, inet_ntoa( Addr->sin_addr ), sizeof( hostname ));
}
Log_Resolver( LOG_DEBUG, "Ok, translated %s to \"%s\".", inet_ntoa( Addr->sin_addr ), hostname );
/* Write resolver result into pipe to parent */
len = strlen( hostname );
hostname[len] = '\n'; len++;
if( (size_t)write( w_fd, hostname, len ) != (size_t)len )
{
Log_Resolver( LOG_CRIT, "Resolver: Can't write to parent: %s!", strerror( errno ));
close( w_fd );
return;
}
#ifdef IDENTAUTH
/* Do "IDENT" (aka "AUTH") lookup and write result to parent */
Log_Resolver( LOG_DEBUG, "Doing IDENT lookup on socket %d ...", Sock );
res = ident_id( Sock, 10 );
Log_Resolver( LOG_DEBUG, "Ok, IDENT lookup on socket %d done: \"%s\"", Sock, res ? res : "" );
/* Write IDENT result into pipe to parent */
if (res) {
len = strlen(res);
res[len] = '\n';
len++;
} else len = 1;
if( (size_t)write( w_fd, res ? res : "\n", len ) != (size_t)len )
{
Log_Resolver( LOG_CRIT, "Resolver: Can't write to parent (IDENT): %s!", strerror( errno ));
close( w_fd );
}
free( res );
#endif
} /* Do_ResolveAddr */
LOCAL void
Do_ResolveName( char *Host, int w_fd )
{
/* Resolver sub-process: resolve name and write result into pipe
* to parent. */
char ip[16];
struct hostent *h;
struct in_addr *addr;
int len;
Log_Resolver( LOG_DEBUG, "Now resolving \"%s\" ...", Host );
/* Resolve hostname */
h = gethostbyname( Host );
if( h )
{
addr = (struct in_addr *)h->h_addr;
strlcpy( ip, inet_ntoa( *addr ), sizeof( ip ));
}
else
{
#ifdef h_errno
Log_Resolver( LOG_WARNING, "Can't resolve \"%s\": %s!", Host, Get_Error( h_errno ));
#else
Log_Resolver( LOG_WARNING, "Can't resolve \"%s\"!", Host );
#endif
ip[0] = '\0';
}
if( ip[0] ) Log_Resolver( LOG_DEBUG, "Ok, translated \"%s\" to %s.", Host, ip );
/* Write result into pipe to parent */
len = strlen( ip );
ip[len] = '\n'; len++;
if( (size_t)write( w_fd, ip, len ) != (size_t)len )
{
Log_Resolver( LOG_CRIT, "Resolver: Can't write to parent: %s!", strerror( errno ));
close( w_fd );
}
} /* Do_ResolveName */
#ifdef h_errno
LOCAL char *
Get_Error( int H_Error )
{
/* Get error message for H_Error */
switch( H_Error )
{
case HOST_NOT_FOUND:
return "host not found";
case NO_DATA:
return "name valid but no IP address defined";
case NO_RECOVERY:
return "name server error";
case TRY_AGAIN:
return "name server temporary not available";
default:
return "unknown error";
}
} /* Get_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- */

55
src/ngircd/resolve.h Normal file
View File

@@ -0,0 +1,55 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* 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
* 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: resolve.h,v 1.8 2005/03/19 18:43:49 fw Exp $
*
* Asynchronous resolver (header)
*/
#ifndef __resolve_h__
#define __resolve_h__
#ifdef HAVE_SYS_SELECT_H
# include <sys/select.h>
#endif
#include <sys/types.h>
#include <netinet/in.h>
typedef struct _Res_Stat
{
int pid; /* PID des Child-Prozess */
int pipe[2]; /* Pipe fuer IPC */
int stage; /* Hostname/IP(0) or IDENT(1)? */
int bufpos; /* Position in buffer */
char buffer[HOST_LEN]; /* Buffer */
} RES_STAT;
GLOBAL fd_set Resolver_FDs;
GLOBAL void Resolve_Init PARAMS(( void ));
#ifdef IDENTAUTH
GLOBAL RES_STAT *Resolve_Addr PARAMS(( struct sockaddr_in *Addr, int Sock ));
#else
GLOBAL RES_STAT *Resolve_Addr PARAMS(( struct sockaddr_in *Addr ));
#endif
GLOBAL RES_STAT *Resolve_Name PARAMS(( char *Host ));
#endif
/* -eof- */

View File

@@ -1,76 +0,0 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: tool.c,v 1.6 2002/01/02 02:42:58 alex Exp $
*
* tool.c: Hilfsfunktionen, ggf. Platformabhaengig
*
* $Log: tool.c,v $
* Revision 1.6 2002/01/02 02:42:58 alex
* - Copyright-Texte aktualisiert.
*
* Revision 1.5 2001/12/31 02:44:36 alex
* - ngt_TrimStr() hatte noch einen boesen Bug: evtl. wurde ueber den Start
* des Strings nach vorne(!) hinaus gelesen. Hopsa!
*
* Revision 1.4 2001/12/31 02:18:51 alex
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
* - neuen Header "defines.h" mit (fast) allen Konstanten.
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
*
* Revision 1.3 2001/12/29 03:05:34 alex
* - Funktionsnamen etwas konsequenter umbenannt :-)
*
* Revision 1.2 2001/12/12 17:20:33 alex
* - Tool-Funktionen haben nun das Praefix "ngt_".
*
* Revision 1.1.1.1 2001/12/11 21:53:04 alex
* - Imported sources to CVS.
*/
#include <portab.h>
#include "global.h"
#include <imp.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <exp.h>
#include "tool.h"
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;
assert( String != NULL );
start = String;
/* Zeichen am Anfang pruefen ... */
while(( *start == ' ' ) || ( *start == 9 )) start++;
/* Zeichen am Ende pruefen ... */
ptr = strchr( start, '\0' ) - 1;
while((( *ptr == ' ' ) || ( *ptr == 9 ) || ( *ptr == 10 ) || ( *ptr == 13 )) && ptr >= start ) ptr--;
*(++ptr) = '\0';
memmove( String, start, strlen( start ) + 1 );
} /* ngt_TrimStr */
/* -eof- */

View File

@@ -1,46 +0,0 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: tool.h,v 1.5 2002/01/02 02:42:58 alex Exp $
*
* log.h: Hilfsfunktionen (Header)
*
* $Log: tool.h,v $
* Revision 1.5 2002/01/02 02:42:58 alex
* - Copyright-Texte aktualisiert.
*
* Revision 1.4 2001/12/31 02:18:51 alex
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
* - neuen Header "defines.h" mit (fast) allen Konstanten.
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
*
* Revision 1.3 2001/12/26 14:45:37 alex
* - "Code Cleanups".
*
* Revision 1.2 2001/12/12 17:20:33 alex
* - Tool-Funktionen haben nun das Praefix "ngt_".
*
* Revision 1.1.1.1 2001/12/11 21:53:04 alex
* - Imported sources to CVS.
*/
#ifndef __tool_h__
#define __tool_h__
GLOBAL VOID ngt_TrimStr( CHAR *String );
#endif
/* -eof- */

View File

@@ -9,24 +9,28 @@
# 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.3 2002/01/02 02:40:15 alex Exp $
#
# $Log: Makefile.am,v $
# Revision 1.3 2002/01/02 02:40:15 alex
# - Copyright-Texte ergaenzt und aktualisiert,
# - fehlende Dateien in Projekt aufgenommen.
#
# Revision 1.2 2001/12/31 16:02:12 alex
# - Projektdateien von Mac OS X werden nun auch in die Distribution aufgenommen.
#
# Revision 1.1 2001/12/12 17:21:58 alex
# - Projektdatei fuer den Mac OS X Project Builder erstellt.
# $Id: Makefile.am,v 1.8 2005/04/16 09:23:01 fw Exp $
#
SUBDIRS = ngircd.pbproj
AUTOMAKE_OPTIONS = ansi2knr
noinst_LIBRARIES = libngportab.a
libngportab_a_SOURCES = strlcpy.c strdup.c vsnprintf.c
check_PROGRAMS = portabtest
portabtest_SOURCES = portabtest.c
portabtest_LDFLAGS = -L.
portabtest_LDADD = -lngportab
noinst_HEADERS = imp.h exp.h portab.h
maintainer-clean-local:
rm -f Makefile Makefile.in
rm -rf build
TESTS = portabtest
# -eof-

36
src/portab/ansi2knr.1 Normal file
View File

@@ -0,0 +1,36 @@
.TH ANSI2KNR 1 "19 Jan 1996"
.SH NAME
ansi2knr \- convert ANSI C to Kernighan & Ritchie C
.SH SYNOPSIS
.I ansi2knr
[--varargs] input_file [output_file]
.SH DESCRIPTION
If no output_file is supplied, output goes to stdout.
.br
There are no error messages.
.sp
.I ansi2knr
recognizes function definitions by seeing a non-keyword identifier at the left
margin, followed by a left parenthesis, with a right parenthesis as the last
character on the line, and with a left brace as the first token on the
following line (ignoring possible intervening comments). It will recognize a
multi-line header provided that no intervening line ends with a left or right
brace or a semicolon. These algorithms ignore whitespace and comments, except
that the function name must be the first thing on the line.
.sp
The following constructs will confuse it:
.br
- Any other construct that starts at the left margin and follows the
above syntax (such as a macro or function call).
.br
- Some macros that tinker with the syntax of the function header.
.sp
The --varargs switch is obsolete, and is recognized only for
backwards compatibility. The present version of
.I ansi2knr
will always attempt to convert a ... argument to va_alist and va_dcl.
.SH AUTHOR
L. Peter Deutsch <ghost@aladdin.com> wrote the original ansi2knr and
continues to maintain the current version; most of the code in the current
version is his work. ansi2knr also includes contributions by Francois
Pinard <pinard@iro.umontreal.ca> and Jim Avera <jima@netcom.com>.

738
src/portab/ansi2knr.c Normal file
View File

@@ -0,0 +1,738 @@
/* Copyright (C) 1989, 2000 Aladdin Enterprises. All rights reserved. */
/* Convert ANSI C function definitions to K&R ("traditional C") syntax */
/*
ansi2knr is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY. No author or distributor accepts responsibility to anyone for the
consequences of using it or for whether it serves any particular purpose or
works at all, unless he says so in writing. Refer to the GNU General Public
License (the "GPL") for full details.
Everyone is granted permission to copy, modify and redistribute ansi2knr,
but only under the conditions described in the GPL. A copy of this license
is supposed to have been given to you along with ansi2knr so you can know
your rights and responsibilities. It should be in a file named COPYLEFT,
or, if there is no file named COPYLEFT, a file named COPYING. Among other
things, the copyright notice and this notice must be preserved on all
copies.
We explicitly state here what we believe is already implied by the GPL: if
the ansi2knr program is distributed as a separate set of sources and a
separate executable file which are aggregated on a storage medium together
with another program, this in itself does not bring the other program under
the GPL, nor does the mere fact that such a program or the procedures for
constructing it invoke the ansi2knr executable bring any other part of the
program under the GPL.
*/
/*
* Usage:
ansi2knr [--filename FILENAME] [INPUT_FILE [OUTPUT_FILE]]
* --filename provides the file name for the #line directive in the output,
* overriding input_file (if present).
* If no input_file is supplied, input is read from stdin.
* If no output_file is supplied, output goes to stdout.
* There are no error messages.
*
* ansi2knr recognizes function definitions by seeing a non-keyword
* identifier at the left margin, followed by a left parenthesis, with a
* right parenthesis as the last character on the line, and with a left
* brace as the first token on the following line (ignoring possible
* intervening comments and/or preprocessor directives), except that a line
* consisting of only
* identifier1(identifier2)
* will not be considered a function definition unless identifier2 is
* the word "void", and a line consisting of
* identifier1(identifier2, <<arbitrary>>)
* will not be considered a function definition.
* ansi2knr will recognize a multi-line header provided that no intervening
* line ends with a left or right brace or a semicolon. These algorithms
* ignore whitespace, comments, and preprocessor directives, except that
* the function name must be the first thing on the line. The following
* constructs will confuse it:
* - Any other construct that starts at the left margin and
* follows the above syntax (such as a macro or function call).
* - Some macros that tinker with the syntax of function headers.
*/
/*
* The original and principal author of ansi2knr is L. Peter Deutsch
* <ghost@aladdin.com>. Other authors are noted in the change history
* that follows (in reverse chronological order):
lpd 2000-04-12 backs out Eggert's changes because of bugs:
- concatlits didn't declare the type of its bufend argument;
- concatlits didn't't recognize when it was inside a comment;
- scanstring could scan backward past the beginning of the string; when
- the check for \ + newline in scanstring was unnecessary.
2000-03-05 Paul Eggert <eggert@twinsun.com>
Add support for concatenated string literals.
* ansi2knr.c (concatlits): New decl.
(main): Invoke concatlits to concatenate string literals.
(scanstring): Handle backslash-newline correctly. Work with
character constants. Fix bug when scanning backwards through
backslash-quote. Check for unterminated strings.
(convert1): Parse character constants, too.
(appendline, concatlits): New functions.
* ansi2knr.1: Document this.
lpd 1999-08-17 added code to allow preprocessor directives
wherever comments are allowed
lpd 1999-04-12 added minor fixes from Pavel Roskin
<pavel_roskin@geocities.com> for clean compilation with
gcc -W -Wall
lpd 1999-03-22 added hack to recognize lines consisting of
identifier1(identifier2, xxx) as *not* being procedures
lpd 1999-02-03 made indentation of preprocessor commands consistent
lpd 1999-01-28 fixed two bugs: a '/' in an argument list caused an
endless loop; quoted strings within an argument list
confused the parser
lpd 1999-01-24 added a check for write errors on the output,
suggested by Jim Meyering <meyering@ascend.com>
lpd 1998-11-09 added further hack to recognize identifier(void)
as being a procedure
lpd 1998-10-23 added hack to recognize lines consisting of
identifier1(identifier2) as *not* being procedures
lpd 1997-12-08 made input_file optional; only closes input and/or
output file if not stdin or stdout respectively; prints
usage message on stderr rather than stdout; adds
--filename switch (changes suggested by
<ceder@lysator.liu.se>)
lpd 1996-01-21 added code to cope with not HAVE_CONFIG_H and with
compilers that don't understand void, as suggested by
Tom Lane
lpd 1996-01-15 changed to require that the first non-comment token
on the line following a function header be a left brace,
to reduce sensitivity to macros, as suggested by Tom Lane
<tgl@sss.pgh.pa.us>
lpd 1995-06-22 removed #ifndefs whose sole purpose was to define
undefined preprocessor symbols as 0; changed all #ifdefs
for configuration symbols to #ifs
lpd 1995-04-05 changed copyright notice to make it clear that
including ansi2knr in a program does not bring the entire
program under the GPL
lpd 1994-12-18 added conditionals for systems where ctype macros
don't handle 8-bit characters properly, suggested by
Francois Pinard <pinard@iro.umontreal.ca>;
removed --varargs switch (this is now the default)
lpd 1994-10-10 removed CONFIG_BROKETS conditional
lpd 1994-07-16 added some conditionals to help GNU `configure',
suggested by Francois Pinard <pinard@iro.umontreal.ca>;
properly erase prototype args in function parameters,
contributed by Jim Avera <jima@netcom.com>;
correct error in writeblanks (it shouldn't erase EOLs)
lpd 1989-xx-xx original version
*/
/* Most of the conditionals here are to make ansi2knr work with */
/* or without the GNU configure machinery. */
#if HAVE_CONFIG_H
# include <config.h>
#endif
#include <stdio.h>
#include <ctype.h>
#if HAVE_CONFIG_H
/*
For properly autoconfiguring ansi2knr, use AC_CONFIG_HEADER(config.h).
This will define HAVE_CONFIG_H and so, activate the following lines.
*/
# if STDC_HEADERS || HAVE_STRING_H
# include <string.h>
# else
# include <strings.h>
# endif
#else /* not HAVE_CONFIG_H */
/* Otherwise do it the hard way */
# ifdef BSD
# include <strings.h>
# else
# ifdef VMS
extern int strlen(), strncmp();
# else
# include <string.h>
# endif
# endif
#endif /* not HAVE_CONFIG_H */
#if STDC_HEADERS
# include <stdlib.h>
#else
/*
malloc and free should be declared in stdlib.h,
but if you've got a K&R compiler, they probably aren't.
*/
# ifdef MSDOS
# include <malloc.h>
# else
# ifdef VMS
extern char *malloc();
extern void free();
# else
extern char *malloc();
extern int free();
# endif
# endif
#endif
/* Define NULL (for *very* old compilers). */
#ifndef NULL
# define NULL (0)
#endif
/*
* The ctype macros don't always handle 8-bit characters correctly.
* Compensate for this here.
*/
#ifdef isascii
# undef HAVE_ISASCII /* just in case */
# define HAVE_ISASCII 1
#else
#endif
#if STDC_HEADERS || !HAVE_ISASCII
# define is_ascii(c) 1
#else
# define is_ascii(c) isascii(c)
#endif
#define is_space(c) (is_ascii(c) && isspace(c))
#define is_alpha(c) (is_ascii(c) && isalpha(c))
#define is_alnum(c) (is_ascii(c) && isalnum(c))
/* Scanning macros */
#define isidchar(ch) (is_alnum(ch) || (ch) == '_')
#define isidfirstchar(ch) (is_alpha(ch) || (ch) == '_')
/* Forward references */
char *ppdirforward();
char *ppdirbackward();
char *skipspace();
char *scanstring();
int writeblanks();
int test1();
int convert1();
/* The main program */
int
main(argc, argv)
int argc;
char *argv[];
{ FILE *in = stdin;
FILE *out = stdout;
char *filename = 0;
char *program_name = argv[0];
char *output_name = 0;
#define bufsize 5000 /* arbitrary size */
char *buf;
char *line;
char *more;
char *usage =
"Usage: ansi2knr [--filename FILENAME] [INPUT_FILE [OUTPUT_FILE]]\n";
/*
* In previous versions, ansi2knr recognized a --varargs switch.
* If this switch was supplied, ansi2knr would attempt to convert
* a ... argument to va_alist and va_dcl; if this switch was not
* supplied, ansi2knr would simply drop any such arguments.
* Now, ansi2knr always does this conversion, and we only
* check for this switch for backward compatibility.
*/
int convert_varargs = 1;
int output_error;
while ( argc > 1 && argv[1][0] == '-' ) {
if ( !strcmp(argv[1], "--varargs") ) {
convert_varargs = 1;
argc--;
argv++;
continue;
}
if ( !strcmp(argv[1], "--filename") && argc > 2 ) {
filename = argv[2];
argc -= 2;
argv += 2;
continue;
}
fprintf(stderr, "%s: Unrecognized switch: %s\n", program_name,
argv[1]);
fprintf(stderr, usage);
exit(1);
}
switch ( argc )
{
default:
fprintf(stderr, usage);
exit(0);
case 3:
output_name = argv[2];
out = fopen(output_name, "w");
if ( out == NULL ) {
fprintf(stderr, "%s: Cannot open output file %s\n",
program_name, output_name);
exit(1);
}
/* falls through */
case 2:
in = fopen(argv[1], "r");
if ( in == NULL ) {
fprintf(stderr, "%s: Cannot open input file %s\n",
program_name, argv[1]);
exit(1);
}
if ( filename == 0 )
filename = argv[1];
/* falls through */
case 1:
break;
}
if ( filename )
fprintf(out, "#line 1 \"%s\"\n", filename);
buf = malloc(bufsize);
if ( buf == NULL )
{
fprintf(stderr, "Unable to allocate read buffer!\n");
exit(1);
}
line = buf;
while ( fgets(line, (unsigned)(buf + bufsize - line), in) != NULL )
{
test: line += strlen(line);
switch ( test1(buf) )
{
case 2: /* a function header */
convert1(buf, out, 1, convert_varargs);
break;
case 1: /* a function */
/* Check for a { at the start of the next line. */
more = ++line;
f: if ( line >= buf + (bufsize - 1) ) /* overflow check */
goto wl;
if ( fgets(line, (unsigned)(buf + bufsize - line), in) == NULL )
goto wl;
switch ( *skipspace(ppdirforward(more), 1) )
{
case '{':
/* Definitely a function header. */
convert1(buf, out, 0, convert_varargs);
fputs(more, out);
break;
case 0:
/* The next line was blank or a comment: */
/* keep scanning for a non-comment. */
line += strlen(line);
goto f;
default:
/* buf isn't a function header, but */
/* more might be. */
fputs(buf, out);
strcpy(buf, more);
line = buf;
goto test;
}
break;
case -1: /* maybe the start of a function */
if ( line != buf + (bufsize - 1) ) /* overflow check */
continue;
/* falls through */
default: /* not a function */
wl: fputs(buf, out);
break;
}
line = buf;
}
if ( line != buf )
fputs(buf, out);
free(buf);
if ( output_name ) {
output_error = ferror(out);
output_error |= fclose(out);
} else { /* out == stdout */
fflush(out);
output_error = ferror(out);
}
if ( output_error ) {
fprintf(stderr, "%s: error writing to %s\n", program_name,
(output_name ? output_name : "stdout"));
exit(1);
}
if ( in != stdin )
fclose(in);
return 0;
}
/*
* Skip forward or backward over one or more preprocessor directives.
*/
char *
ppdirforward(p)
char *p;
{
for (; *p == '#'; ++p) {
for (; *p != '\r' && *p != '\n'; ++p)
if (*p == 0)
return p;
if (*p == '\r' && p[1] == '\n')
++p;
}
return p;
}
char *
ppdirbackward(p, limit)
char *p;
char *limit;
{
char *np = p;
for (;; p = --np) {
if (*np == '\n' && np[-1] == '\r')
--np;
for (; np > limit && np[-1] != '\r' && np[-1] != '\n'; --np)
if (np[-1] == 0)
return np;
if (*np != '#')
return p;
}
}
/*
* Skip over whitespace, comments, and preprocessor directives,
* in either direction.
*/
char *
skipspace(p, dir)
char *p;
int dir; /* 1 for forward, -1 for backward */
{
for ( ; ; ) {
while ( is_space(*p) )
p += dir;
if ( !(*p == '/' && p[dir] == '*') )
break;
p += dir; p += dir;
while ( !(*p == '*' && p[dir] == '/') ) {
if ( *p == 0 )
return p; /* multi-line comment?? */
p += dir;
}
p += dir; p += dir;
}
return p;
}
/* Scan over a quoted string, in either direction. */
char *
scanstring(p, dir)
char *p;
int dir;
{
for (p += dir; ; p += dir)
if (*p == '"' && p[-dir] != '\\')
return p + dir;
}
/*
* Write blanks over part of a string.
* Don't overwrite end-of-line characters.
*/
int
writeblanks(start, end)
char *start;
char *end;
{ char *p;
for ( p = start; p < end; p++ )
if ( *p != '\r' && *p != '\n' )
*p = ' ';
return 0;
}
/*
* Test whether the string in buf is a function definition.
* The string may contain and/or end with a newline.
* Return as follows:
* 0 - definitely not a function definition;
* 1 - definitely a function definition;
* 2 - definitely a function prototype (NOT USED);
* -1 - may be the beginning of a function definition,
* append another line and look again.
* The reason we don't attempt to convert function prototypes is that
* Ghostscript's declaration-generating macros look too much like
* prototypes, and confuse the algorithms.
*/
int
test1(buf)
char *buf;
{ char *p = buf;
char *bend;
char *endfn;
int contin;
if ( !isidfirstchar(*p) )
return 0; /* no name at left margin */
bend = skipspace(ppdirbackward(buf + strlen(buf) - 1, buf), -1);
switch ( *bend )
{
case ';': contin = 0 /*2*/; break;
case ')': contin = 1; break;
case '{': return 0; /* not a function */
case '}': return 0; /* not a function */
default: contin = -1;
}
while ( isidchar(*p) )
p++;
endfn = p;
p = skipspace(p, 1);
if ( *p++ != '(' )
return 0; /* not a function */
p = skipspace(p, 1);
if ( *p == ')' )
return 0; /* no parameters */
/* Check that the apparent function name isn't a keyword. */
/* We only need to check for keywords that could be followed */
/* by a left parenthesis (which, unfortunately, is most of them). */
{ static char *words[] =
{ "asm", "auto", "case", "char", "const", "double",
"extern", "float", "for", "if", "int", "long",
"register", "return", "short", "signed", "sizeof",
"static", "switch", "typedef", "unsigned",
"void", "volatile", "while", 0
};
char **key = words;
char *kp;
unsigned len = endfn - buf;
while ( (kp = *key) != 0 )
{ if ( strlen(kp) == len && !strncmp(kp, buf, len) )
return 0; /* name is a keyword */
key++;
}
}
{
char *id = p;
int len;
/*
* Check for identifier1(identifier2) and not
* identifier1(void), or identifier1(identifier2, xxxx).
*/
while ( isidchar(*p) )
p++;
len = p - id;
p = skipspace(p, 1);
if (*p == ',' ||
(*p == ')' && (len != 4 || strncmp(id, "void", 4)))
)
return 0; /* not a function */
}
/*
* If the last significant character was a ), we need to count
* parentheses, because it might be part of a formal parameter
* that is a procedure.
*/
if (contin > 0) {
int level = 0;
for (p = skipspace(buf, 1); *p; p = skipspace(p + 1, 1))
level += (*p == '(' ? 1 : *p == ')' ? -1 : 0);
if (level > 0)
contin = -1;
}
return contin;
}
/* Convert a recognized function definition or header to K&R syntax. */
int
convert1(buf, out, header, convert_varargs)
char *buf;
FILE *out;
int header; /* Boolean */
int convert_varargs; /* Boolean */
{ char *endfn;
char *p;
/*
* The breaks table contains pointers to the beginning and end
* of each argument.
*/
char **breaks;
unsigned num_breaks = 2; /* for testing */
char **btop;
char **bp;
char **ap;
char *vararg = 0;
/* Pre-ANSI implementations don't agree on whether strchr */
/* is called strchr or index, so we open-code it here. */
for ( endfn = buf; *(endfn++) != '('; )
;
top: p = endfn;
breaks = (char **)malloc(sizeof(char *) * num_breaks * 2);
if ( breaks == NULL )
{ /* Couldn't allocate break table, give up */
fprintf(stderr, "Unable to allocate break table!\n");
fputs(buf, out);
return -1;
}
btop = breaks + num_breaks * 2 - 2;
bp = breaks;
/* Parse the argument list */
do
{ int level = 0;
char *lp = NULL;
char *rp = NULL;
char *end = NULL;
if ( bp >= btop )
{ /* Filled up break table. */
/* Allocate a bigger one and start over. */
free((char *)breaks);
num_breaks <<= 1;
goto top;
}
*bp++ = p;
/* Find the end of the argument */
for ( ; end == NULL; p++ )
{ switch(*p)
{
case ',':
if ( !level ) end = p;
break;
case '(':
if ( !level ) lp = p;
level++;
break;
case ')':
if ( --level < 0 ) end = p;
else rp = p;
break;
case '/':
if (p[1] == '*')
p = skipspace(p, 1) - 1;
break;
case '"':
p = scanstring(p, 1) - 1;
break;
default:
;
}
}
/* Erase any embedded prototype parameters. */
if ( lp && rp )
writeblanks(lp + 1, rp);
p--; /* back up over terminator */
/* Find the name being declared. */
/* This is complicated because of procedure and */
/* array modifiers. */
for ( ; ; )
{ p = skipspace(p - 1, -1);
switch ( *p )
{
case ']': /* skip array dimension(s) */
case ')': /* skip procedure args OR name */
{ int level = 1;
while ( level )
switch ( *--p )
{
case ']': case ')':
level++;
break;
case '[': case '(':
level--;
break;
case '/':
if (p > buf && p[-1] == '*')
p = skipspace(p, -1) + 1;
break;
case '"':
p = scanstring(p, -1) + 1;
break;
default: ;
}
}
if ( *p == '(' && *skipspace(p + 1, 1) == '*' )
{ /* We found the name being declared */
while ( !isidfirstchar(*p) )
p = skipspace(p, 1) + 1;
goto found;
}
break;
default:
goto found;
}
}
found: if ( *p == '.' && p[-1] == '.' && p[-2] == '.' )
{ if ( convert_varargs )
{ *bp++ = "va_alist";
vararg = p-2;
}
else
{ p++;
if ( bp == breaks + 1 ) /* sole argument */
writeblanks(breaks[0], p);
else
writeblanks(bp[-1] - 1, p);
bp--;
}
}
else
{ while ( isidchar(*p) ) p--;
*bp++ = p+1;
}
p = end;
}
while ( *p++ == ',' );
*bp = p;
/* Make a special check for 'void' arglist */
if ( bp == breaks+2 )
{ p = skipspace(breaks[0], 1);
if ( !strncmp(p, "void", 4) )
{ p = skipspace(p+4, 1);
if ( p == breaks[2] - 1 )
{ bp = breaks; /* yup, pretend arglist is empty */
writeblanks(breaks[0], p + 1);
}
}
}
/* Put out the function name and left parenthesis. */
p = buf;
while ( p != endfn ) putc(*p, out), p++;
/* Put out the declaration. */
if ( header )
{ fputs(");", out);
for ( p = breaks[0]; *p; p++ )
if ( *p == '\r' || *p == '\n' )
putc(*p, out);
}
else
{ for ( ap = breaks+1; ap < bp; ap += 2 )
{ p = *ap;
while ( isidchar(*p) )
putc(*p, out), p++;
if ( ap < bp - 1 )
fputs(", ", out);
}
fputs(") ", out);
/* Put out the argument declarations */
for ( ap = breaks+2; ap <= bp; ap += 2 )
(*ap)[-1] = ';';
if ( vararg != 0 )
{ *vararg = 0;
fputs(breaks[0], out); /* any prior args */
fputs("va_dcl", out); /* the final arg */
fputs(bp[0], out);
}
else
fputs(breaks[0], out);
}
free((char *)breaks);
return 0;
}

22
src/portab/exp.h Normal file
View File

@@ -0,0 +1,22 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
* $Id: exp.h,v 1.1 2002/03/12 14:36:44 alex Exp $
*
* exp.h: "Export Header"
*/
#undef GLOBAL
#define GLOBAL
/* -eof- */

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