1
0
mirror of https://github.com/osmarks/ngircd.git synced 2025-09-22 12:14:03 +00:00

Compare commits

..

218 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
92 changed files with 3900 additions and 2529 deletions

View File

@@ -21,7 +21,7 @@ Goetz Hoffart, <goetz@hoffart.de> (goetz)
Ilja Osthoff, <i.osthoff@gmx.net> (ilja) Ilja Osthoff, <i.osthoff@gmx.net> (ilja)
Benjamin Pineau, <ben@zouh.org> Benjamin Pineau, <ben@zouh.org>
Sean Reifschneider, <jafo-rpms@tummy.com> Sean Reifschneider, <jafo-rpms@tummy.com>
Florian Westphal, <westphal@foo.fh-furtwangen.de> Florian Westphal, <westphal@foo.fh-furtwangen.de> (fw)
Code snippets Code snippets
@@ -32,4 +32,4 @@ Andrew Tridgell & Martin Pool: strl{cpy|cat}()-functions
-- --
$Id: AUTHORS,v 1.8.2.2 2005/01/26 13:26:41 alex Exp $ $Id: AUTHORS,v 1.11 2005/03/19 14:24:52 alex Exp $

View File

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

View File

@@ -14,6 +14,12 @@
I. Upgrade Information 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 Differences to version 0.6.x
- Some options of the configure script have been renamed: - Some options of the configure script have been renamed:
@@ -177,4 +183,4 @@ number. In both cases the server exits after the output.
-- --
$Id: INSTALL,v 1.18.2.2 2004/09/03 20:02:02 alex Exp $ $Id: INSTALL,v 1.21 2005/02/10 08:20:09 alex Exp $

View File

@@ -8,7 +8,7 @@
# (at your option) any later version. # (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information. # Please read the file COPYING, README and AUTHORS for more information.
# #
# $Id: Makefile.am,v 1.14.2.1 2004/05/11 00:38:17 alex Exp $ # $Id: Makefile.am,v 1.16 2005/04/09 12:27:40 alex Exp $
# #
AUTOMAKE_OPTIONS = gnu AUTOMAKE_OPTIONS = gnu
@@ -27,6 +27,15 @@ maintainer-clean-local:
lint: lint:
make -C src/ngircd 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: distcheck
rpm -ta ngircd-*.tar.gz rpm -ta ngircd-*.tar.gz

25
NEWS
View File

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

42
README
View File

@@ -1,21 +1,19 @@
ngIRCd - Next Generation IRC Server ngIRCd - Next Generation IRC Server
(c)2001-2004 by Alexander Barton, (c)2001-2005 Alexander Barton,
alex@barton.de, http://www.barton.de/ alex@barton.de, http://www.barton.de/
ngIRCd is free software and published under the ngIRCd is free software and published under the
terms of the GNU General Public License. terms of the GNU General Public License.
-- README -- -- README --
Ilja Osthoff, <ilja@glide.ath.cx>
I. Introduction I. Introduction
~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~
ngIRCd is an Open-Source server for the Internet Relay Chat (IRC), which ngIRCd is an Open Source server for the Internet Relay Chat (IRC), which
is developed and published under the terms of the GNU General Public is developed and published under the terms of the GNU General Public
Licence (URL: http://www.gnu.org/licenses/gpl.html). ngIRCd means "next 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 generation IRC daemon", it's written from scratch and not deduced from the
@@ -25,15 +23,19 @@ generation IRC daemon", it's written from scratch and not deduced from the
II. Status II. Status
~~~~~~~~~~~ ~~~~~~~~~~~
At present, the ngIRCd is under active development, some features are not It is not the goal of ngIRCd to implement all the nasty behaviours of the
implemented, some only partly. original ircd, but to implement most of the useful commands and semantics
specified by the RFCs.
Till today (more or less complete) implemented IRC-commands: 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, ADMIN, AWAY, CHANINFO, CONNECT, DIE, DISCONNECT, ERROR, HELP, INVITE, ISON,
JOIN, KICK, KILL, LINKS, LIST, LUSERS, MODE, MOTD, NAMES, NICK, NJOIN, JOIN, KICK, KILL, LINKS, LIST, LUSERS, MODE, MOTD, NAMES, NICK, NJOIN, NOTICE,
NOTICE, OPER, PART, PASS, PING, PONG, PRIVMSG, QUIT, REHASH, RESTART, SERVER, OPER, PART, PASS, PING, PONG, PRIVMSG, QUIT, REHASH, RESTART, SERVER, SQUIT,
SQUIT, STATS, TIME, TOPIC, TRACE, USER, USERHOST, VERSION, WHO, WHOIS. STATS, TIME, TOPIC, TRACE, USER, USERHOST, VERSION, WHO, WHOIS, WHOWAS.
III. Features (or: why use ngIRCd?) III. Features (or: why use ngIRCd?)
@@ -43,25 +45,23 @@ III. Features (or: why use ngIRCd?)
- simple, easy understandable configuration file, - simple, easy understandable configuration file,
- freely published open-source C source code, - freely published open-source C source code,
- ngIRCd will be developed on in the future. - ngIRCd will be developed on in the future.
- supported platforms (tested versions): AIX (3.2.5), A/UX (3.0.1), FreeBSD - wide field of supported platforms, including AIX, A/UX, FreeBSD, HP-UX,
(4.5), HP-UX (10.20), IRIX (6.5), Linux (2.x), Mac OS X (10.x), NetBSD IRIX, Linux, Mac OS X, NetBSD, OpenBSD, Solaris, and Windows with Cygwin.
(1.5.2/i386, 1.5.3/m68k), Solaris (2.5.1, 2.6), Windows with Cygwin, and
OpenBSD (3.4/i386).
IV. Documentation IV. Documentation
~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~
More documentation can be found in the "doc/" directory and the homepage of More documentation can be found in the "doc/" directory and the homepage of
the ngIRCd: <http://arthur.ath.cx/~alex/ngircd/>. the ngIRCd: <http://ngircd.barton.de/>.
V. Download V. Download
~~~~~~~~~~~ ~~~~~~~~~~~
The homepage of the ngIRCd is: <http://arthur.ath.cx/~alex/ngircd>; you The homepage of the ngIRCd is: <http://ngircd.barton.de/>; you will find
will find the newest information about the ngIRCd and the most recent the newest information about the ngIRCd and the most recent ("stable")
("stable") releases there. releases there.
If you are interested in the latest development versions (which are not If you are interested in the latest development versions (which are not
always stable), then please read the section "CVS" on the homepage and always stable), then please read the section "CVS" on the homepage and
@@ -75,13 +75,13 @@ VI. Bugs
If you find bugs in the ngIRCd (which might be there :-), please report If you find bugs in the ngIRCd (which might be there :-), please report
them at the following URL: them at the following URL:
<http://arthur.ath.cx/~alex/ngircd/#bugs> <http://ngircd.barton.de/#bugs>
There you can read about known bugs and limitations, too. There you can read about known bugs and limitations, too.
If you have critics, patches or something else, please feel free to post a If you have critics, patches or something else, please feel free to post a
mail to: <alex@barton.de> or <alex@arthur.ath.cx> mail to <alex@barton.de>.
-- --
$Id: README,v 1.18.2.1 2004/05/07 11:24:17 alex Exp $ $Id: README,v 1.20.2.1 2005/07/09 14:41:39 alex Exp $

View File

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

20
config.guess vendored
View File

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

19
config.sub vendored
View File

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

View File

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

View File

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

View File

@@ -1,3 +1,28 @@
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 ngircd (0.8.3-0ab1) unstable; urgency=high
* New "upstream release", including security fixes. * New "upstream release", including security fixes.
@@ -29,6 +54,13 @@ ngircd (0.8.0-0ab1) unstable; urgency=low
-- Alexander Barton <alex@Arthur.Ath.CX> Sat, 26 Jun 2004 11:25:59 +0200 -- 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 ngircd (0.7.7+HEAD-0ab5) unstable; urgency=low
* Updates from CVS HEAD branch, most notably: "INVITE- and BAN-lists * Updates from CVS HEAD branch, most notably: "INVITE- and BAN-lists

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -9,7 +9,7 @@
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste # Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. # der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
# #
# $Id: Makefile.am,v 1.17 2003/04/22 23:50:18 alex Exp $ # $Id: Makefile.am,v 1.18 2005/04/27 07:52:29 alex Exp $
# #
EXTRA_DIST = CVS.txt FAQ.txt Protocol.txt Platforms.txt \ EXTRA_DIST = CVS.txt FAQ.txt Protocol.txt Platforms.txt \
@@ -18,6 +18,9 @@ EXTRA_DIST = CVS.txt FAQ.txt Protocol.txt Platforms.txt \
maintainer-clean-local: maintainer-clean-local:
rm -f Makefile Makefile.in rm -f Makefile Makefile.in
distclean-local:
rm -rf src
docdir = $(datadir)/doc/$(PACKAGE) docdir = $(datadir)/doc/$(PACKAGE)
documents = $(EXTRA_DIST) ../AUTHORS ../COPYING ../ChangeLog ../INSTALL \ documents = $(EXTRA_DIST) ../AUTHORS ../COPYING ../ChangeLog ../INSTALL \

View File

@@ -1,7 +1,7 @@
ngIRCd - Next Generation IRC Server ngIRCd - Next Generation IRC Server
(c)2001-2004 Alexander Barton (c)2001-2005 Alexander Barton
alex@barton.de, http://www.barton.de/ alex@barton.de, http://www.barton.de/
ngIRCd is free software and published under the ngIRCd is free software and published under the
@@ -28,18 +28,20 @@ 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 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 hppa1.1/unknown/linux-gnu gcc 3.3.3 0.8.0 04-05-30 alex Y Y Y Y
hppa2.0/unknown/linux-gnu gcc 3.3.5 0.9.x-CVS 05-06-27 alex Y Y Y Y
i386/pc/solaris2.9 gcc 3.2.2 CVSHEAD 04-02-24 alex Y Y Y Y i386/pc/solaris2.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/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/gnu0.3 gcc 3.3.3 0.8.0 04-05-30 alex Y Y n Y
i386/unknown/netbsdelf1.6.1 gcc 2.95.3 CVSHEAD 04-02-24 alex Y Y Y Y i386/unknown/netbsdelf1.6.1 gcc 2.95.3 CVSHEAD 04-02-24 alex Y Y Y Y
i686/pc/cygwin gcc 3.3.1 0.8.0 04-05-30 alex Y Y n Y i686/pc/cygwin gcc 3.3.1 0.9.x-CVS 05-07-08 alex Y Y n Y
i686/pc/linux-gnu gcc 2.95.4 0.8.0 04-05-30 alex Y Y Y Y (1) i686/pc/linux-gnu gcc 2.95.4 0.8.0 04-05-30 alex Y Y Y Y (1)
i686/pc/linux-gnu gcc 3.3.3 0.8.0 04-05-30 alex Y Y Y Y (1) 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/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 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 ? ? 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/darwin6.5 gcc 3.1 0.7.x-CVS 03-04-23 alex Y Y Y Y
powerpc/apple/darwin7.4.0 gcc 3.3 0.8.0 04-05-30 alex Y Y Y Y powerpc/apple/darwin7.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 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.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/sun/solaris2.7 gcc 3.3 0.8.0 04-05-30 alex Y Y Y Y
@@ -60,4 +62,4 @@ Notes
-- --
$Id: Platforms.txt,v 1.11.2.1 2004/11/09 10:58:01 alex Exp $ $Id: Platforms.txt,v 1.13.2.2 2005/07/09 11:16:38 alex Exp $

View File

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

View File

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

View File

@@ -1,4 +1,4 @@
# $Id: sample-ngircd.conf,v 1.25.2.1 2004/05/07 11:24:17 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 # This is a sample configuration file for the ngIRCd, which must be adepted
@@ -11,7 +11,6 @@
# #
[Global] [Global]
# The [Global] section of this file is used to define the main # The [Global] section of this file is used to define the main
# configuration of the server, like the server name and the ports # configuration of the server, like the server name and the ports
# on which the server should be listening. # on which the server should be listening.
@@ -34,8 +33,8 @@
;AdminEMail = admin@irc.server ;AdminEMail = admin@irc.server
# Ports on which the server should listen. There may be more than # Ports on which the server should listen. There may be more than
# one port, separated with ";". (Default: 6667) # one port, separated with ",". (Default: 6667)
;Ports = 6667, 6668, 66694 ;Ports = 6667, 6668, 6669
# IP address on which the server should listen. (Default: empty, # IP address on which the server should listen. (Default: empty,
# so the server listens on all IP addresses of the system) # so the server listens on all IP addresses of the system)
@@ -68,6 +67,12 @@
# with root privileges! # with root privileges!
;ChrootDir = /var/empty ;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 # After <PingTimeout> seconds of inactivity the server will send a
# PING to the peer to test whether it is alive or not. # PING to the peer to test whether it is alive or not.
;PingTimeout = 120 ;PingTimeout = 120
@@ -84,6 +89,10 @@
# they are not(!) channel-operators? # they are not(!) channel-operators?
;OperCanUseMode = no ;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 # Maximum number of simultaneous connection the server is allowed
# to accept (<=0: unlimited): # to accept (<=0: unlimited):
;MaxConnections = -1 ;MaxConnections = -1
@@ -105,6 +114,12 @@
# Password of the IRC operator # Password of the IRC operator
;Password = ThePwd ;Password = ThePwd
# Optional Mask from which /OPER will be accepted
;Mask = *!ident@somewhere.example.com
[Operator]
# More [Operator] sections, if you like ...
[Server] [Server]
# Other servers are configured in [Server] sections. If you # Other servers are configured in [Server] sections. If you
# configure a port for the connection, then this ngircd tries to # configure a port for the connection, then this ngircd tries to
@@ -140,6 +155,9 @@
# Group of this server (optional) # Group of this server (optional)
;Group = 123 ;Group = 123
[Server]
# More [Server] sections, if you like ...
[Channel] [Channel]
# Pre-defined channels can be configured in [Channel] sections. # Pre-defined channels can be configured in [Channel] sections.
# Such channels are created by the server when starting up and even # Such channels are created by the server when starting up and even
@@ -157,4 +175,7 @@
# Initial channel modes # Initial channel modes
;Modes = tn ;Modes = tn
[Channel]
# More [Channel] sections, if you like ...
# -eof- # -eof-

View File

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

View File

@@ -1,7 +1,7 @@
.\" .\"
.\" $Id: ngircd.conf.5,v 1.12.2.1 2004/05/07 11:24:18 alex Exp $ .\" $Id: ngircd.conf.5,v 1.18 2005/06/04 13:39:20 alex Exp $
.\" .\"
.TH ngircd.conf 5 "Mai 2003" ngircd "ngIRCd Manual" .TH ngircd.conf 5 "Juni 2005" ngircd "ngIRCd Manual"
.SH NAME .SH NAME
ngircd.conf \- configuration file of ngIRCd ngircd.conf \- configuration file of ngIRCd
.SH SYNOPSIS .SH SYNOPSIS
@@ -32,13 +32,13 @@ represents either a comment, a section name or a parameter.
.PP .PP
Section and parameter names are not case sensitive. Section and parameter names are not case sensitive.
.SH "SECTION OVERVIEW" .SH "SECTION OVERVIEW"
The file is separated in four blocks: [Global], [Operator], [Server], The file can contain blocks of four types: [Global], [Operator], [Server],
and [Channel]. and [Channel].
.PP .PP
In the In the
.I [Global] .I [Global]
section, there is the main configuration like the server name and the section, there is the main configuration like the server name and the
ports, on which the server should be listening. IRC operators of this ports on which the server should be listening. IRC operators of this
server are defined in server are defined in
.I [Operator] .I [Operator]
blocks. blocks.
@@ -46,6 +46,9 @@ blocks.
is the section where server links are configured. And is the section where server links are configured. And
.I [Channel] .I [Channel]
blocks are used to configure pre-defined ("persistent") IRC channels. 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] .SH [GLOBAL]
The The
.I [Global] .I [Global]
@@ -65,18 +68,18 @@ command.
.TP .TP
\fBPorts\fR \fBPorts\fR
Ports on which the server should listen. There may be more than one port, Ports on which the server should listen. There may be more than one port,
separated with ';'. Default: 6667. separated with ','. Default: 6667.
.TP .TP
\fBListen\fR \fBListen\fR
The ip address on which the server should listen. Default is empty, so The IP address on which the server should listen. Default is empty, so
the server listens on all configured ip addresses and interfaces. the server listens on all configured IP addresses and interfaces.
.TP .TP
\fBMotdFile\fR \fBMotdFile\fR
Text file with the "message of the day" (MOTD). This message will be shown Text file with the "message of the day" (MOTD). This message will be shown
to all users connecting to the server. to all users connecting to the server.
.TP .TP
\fBMotdPhrase\fR \fBMotdPhrase\fR
A simple Phrase (<256 chars) if you don't want to use a motd file. A simple Phrase (<256 chars) if you don't want to use a MOTD file.
If it is set no MotdFile will be read at all. If it is set no MotdFile will be read at all.
.TP .TP
\fBServerUID\fR \fBServerUID\fR
@@ -114,6 +117,13 @@ For this to work the server must have
been started with root privileges! been started with root privileges!
.RE .RE
.TP .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 \fBPingTimeout\fR
After <PingTimeout> seconds of inactivity the server will send a PING to After <PingTimeout> seconds of inactivity the server will send a PING to
the peer to test whether it is alive or not. Default: 120. the peer to test whether it is alive or not. Default: 120.
@@ -130,6 +140,11 @@ The server tries every <ConnectRetry> seconds to establish a link to not yet
Should IRC Operators be allowed to use the MODE command even if they are Should IRC Operators be allowed to use the MODE command even if they are
not(!) channel-operators? Default: no. not(!) channel-operators? Default: no.
.TP .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 \fBMaxConnections\fR
Maximum number of simultaneous connection the server is allowed to accept Maximum number of simultaneous connection the server is allowed to accept
(<=0: unlimited). Default: -1. (<=0: unlimited). Default: -1.
@@ -153,6 +168,10 @@ ID of the operator (may be different of the nick name).
.TP .TP
\fBPassword\fR \fBPassword\fR
Password of the IRC operator. 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] .SH [SERVER]
Other servers are configured in Other servers are configured in
.I [Server] .I [Server]

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

@@ -8,7 +8,7 @@
# (at your option) any later version. # (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information. # Please read the file COPYING, README and AUTHORS for more information.
# #
# $Id: Makefile.am,v 1.5 2003/01/13 12:20:16 alex Exp $ # $Id: Makefile.am,v 1.6 2005/04/09 12:22:41 alex Exp $
# #
SUBDIRS = portab tool ngircd testsuite SUBDIRS = portab tool ngircd testsuite
@@ -16,4 +16,9 @@ SUBDIRS = portab tool ngircd testsuite
maintainer-clean-local: maintainer-clean-local:
rm -f Makefile Makefile.in config.h config.h.in stamp-h.in 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- # -eof-

View File

@@ -8,14 +8,15 @@
# (at your option) any later version. # (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information. # Please read the file COPYING, README and AUTHORS for more information.
# #
# $Id: Makefile.am,v 1.42 2003/12/04 14:05:16 alex Exp $ # $Id: Makefile.am,v 1.46 2005/05/23 00:11:15 alex Exp $
# #
AUTOMAKE_OPTIONS = ../portab/ansi2knr AUTOMAKE_OPTIONS = ../portab/ansi2knr
INCLUDES = -I$(srcdir)/../portab -I$(srcdir)/../tool INCLUDES = -I$(srcdir)/../portab -I$(srcdir)/../tool
LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN \
-varuse -retvalother -emptyret -unrecog
sbin_PROGRAMS = ngircd sbin_PROGRAMS = ngircd
@@ -51,15 +52,30 @@ check-help: Makefile
chmod 755 check-help chmod 755 check-help
lint: lint:
rm -f lint.out @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 \ for f in *.c; do \
echo "checking $$f ..."; \ echo "checking $$f ..."; \
splint $$f $(LINTARGS) -I./.. -I./../portab $(AM_CFLAGS) > lint.out 2>&1; \ splint $$f $(LINTARGS) -I$(srcdir) -I$(srcdir)/.. \
$(INCLUDES) $(AM_CFLAGS) >lint.out 2>&1; \
grep "no warnings" lint.out > /dev/null 2>&1; \ grep "no warnings" lint.out > /dev/null 2>&1; \
if [ $$? -ne 0 ]; then \ if [ $$? -ne 0 ]; then \
echo; cat lint.out; echo; \ 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; \ fi; \
done; 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 ngircd.c: cvs-version.h

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -7,14 +7,17 @@
* the Free Software Foundation; either version 2 of the License, or * the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version. * (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information. * Please read the file COPYING, README and AUTHORS for more information.
*
* IRC command parser and validator
*/ */
#include "portab.h" #include "portab.h"
static char UNUSED id[] = "$Id: parse.c,v 1.60 2004/01/17 03:17:49 alex Exp $"; 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 "imp.h"
#include <assert.h> #include <assert.h>
@@ -100,32 +103,52 @@ COMMAND My_Commands[] =
}; };
LOCAL VOID Init_Request PARAMS(( REQUEST *Req )); LOCAL void Init_Request PARAMS(( REQUEST *Req ));
LOCAL BOOLEAN Validate_Prefix PARAMS(( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed )); LOCAL bool Validate_Prefix PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed ));
LOCAL BOOLEAN Validate_Command PARAMS(( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed )); LOCAL bool Validate_Command PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed ));
LOCAL BOOLEAN Validate_Args PARAMS(( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed )); LOCAL bool Validate_Args PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed ));
LOCAL BOOLEAN Handle_Request PARAMS(( CONN_ID Idx, REQUEST *Req )); 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 * GLOBAL COMMAND *
Parse_GetCommandStruct( VOID ) Parse_GetCommandStruct( void )
{ {
return My_Commands; return My_Commands;
} /* Parse_GetCommandStruct */ } /* Parse_GetCommandStruct */
GLOBAL BOOLEAN /**
Parse_Request( CONN_ID Idx, CHAR *Request ) * 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 )
{ {
/* Client-Request parsen. Bei einem schwerwiegenden Fehler wird
* die Verbindung geschlossen und FALSE geliefert.
* Der Aufbau gueltiger Requests ist in RFC 2812, 2.3 definiert. */
REQUEST req; REQUEST req;
CHAR *start, *ptr; char *start, *ptr;
BOOLEAN closed; bool closed;
assert( Idx >= 0 ); assert( Idx >= 0 );
assert( Request != NULL ); assert( Request != NULL );
@@ -220,12 +243,16 @@ Parse_Request( CONN_ID Idx, CHAR *Request )
} /* Parse_Request */ } /* Parse_Request */
LOCAL VOID /**
* Initialize request structure.
* @param Req Request structure to be initialized.
*/
LOCAL void
Init_Request( REQUEST *Req ) Init_Request( REQUEST *Req )
{ {
/* Neue Request-Struktur initialisieren */ /* Neue Request-Struktur initialisieren */
INT i; int i;
assert( Req != NULL ); assert( Req != NULL );
@@ -236,18 +263,18 @@ Init_Request( REQUEST *Req )
} /* Init_Request */ } /* Init_Request */
LOCAL BOOLEAN LOCAL bool
Validate_Prefix( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed ) Validate_Prefix( CONN_ID Idx, REQUEST *Req, bool *Closed )
{ {
CLIENT *client, *c; CLIENT *client, *c;
assert( Idx >= 0 ); assert( Idx >= 0 );
assert( Req != NULL ); assert( Req != NULL );
*Closed = FALSE; *Closed = false;
/* ist ueberhaupt ein Prefix vorhanden? */ /* ist ueberhaupt ein Prefix vorhanden? */
if( ! Req->prefix ) return TRUE; if( ! Req->prefix ) return true;
/* Client-Struktur der Connection ermitteln */ /* Client-Struktur der Connection ermitteln */
client = Client_GetFromConn( Idx ); client = Client_GetFromConn( Idx );
@@ -259,7 +286,7 @@ Validate_Prefix( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed )
/* noch nicht registrierte Verbindung. /* noch nicht registrierte Verbindung.
* Das Prefix wird ignoriert. */ * Das Prefix wird ignoriert. */
Req->prefix = NULL; Req->prefix = NULL;
return TRUE; return true;
} }
/* pruefen, ob der im Prefix angegebene Client bekannt ist */ /* pruefen, ob der im Prefix angegebene Client bekannt ist */
@@ -268,8 +295,8 @@ Validate_Prefix( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed )
{ {
/* im Prefix angegebener Client ist nicht bekannt */ /* 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 ); 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; if( ! Conn_WriteStr( Idx, "ERROR :Invalid prefix \"%s\", client not known!?", Req->prefix )) *Closed = true;
return FALSE; return false;
} }
/* pruefen, ob der Client mit dem angegebenen Prefix in Richtung /* pruefen, ob der Client mit dem angegebenen Prefix in Richtung
@@ -280,48 +307,48 @@ Validate_Prefix( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed )
/* das angegebene Prefix ist aus dieser Richtung, also /* das angegebene Prefix ist aus dieser Richtung, also
* aus der gegebenen Connection, ungueltig! */ * 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 ); 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 ); Conn_Close( Idx, NULL, "Spoofed prefix", true);
*Closed = TRUE; *Closed = true;
return FALSE; return false;
} }
return TRUE; return true;
} /* Validate_Prefix */ } /* Validate_Prefix */
LOCAL BOOLEAN LOCAL bool
Validate_Command( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed ) Validate_Command( UNUSED CONN_ID Idx, UNUSED REQUEST *Req, bool *Closed )
{ {
assert( Idx >= 0 ); assert( Idx >= 0 );
assert( Req != NULL ); assert( Req != NULL );
*Closed = FALSE; *Closed = false;
return TRUE; return true;
} /* Validate_Comman */ } /* Validate_Comman */
LOCAL BOOLEAN LOCAL bool
Validate_Args( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed ) Validate_Args( UNUSED CONN_ID Idx, UNUSED REQUEST *Req, bool *Closed )
{ {
assert( Idx >= 0 ); assert( Idx >= 0 );
assert( Req != NULL ); assert( Req != NULL );
*Closed = FALSE; *Closed = false;
return TRUE; return true;
} /* Validate_Args */ } /* Validate_Args */
LOCAL BOOLEAN LOCAL bool
Handle_Request( CONN_ID Idx, REQUEST *Req ) Handle_Request( CONN_ID Idx, REQUEST *Req )
{ {
/* Client-Request verarbeiten. Bei einem schwerwiegenden Fehler /* 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; CLIENT *client, *target, *prefix;
CHAR str[LINE_LEN]; char str[LINE_LEN];
BOOLEAN result; bool result;
COMMAND *cmd; COMMAND *cmd;
INT i; int i;
assert( Idx >= 0 ); assert( Idx >= 0 );
assert( Req != NULL ); assert( Req != NULL );
@@ -343,13 +370,13 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
/* Status code without target!? */ /* Status code without target!? */
if( Req->argc > 0 ) Log( LOG_WARNING, "Unknown target for status code %s: \"%s\"", Req->command, Req->argv[0] ); 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 ); else Log( LOG_WARNING, "Unknown target for status code %s!", Req->command );
return TRUE; return true;
} }
if( target == Client_ThisServer( )) if( target == Client_ThisServer( ))
{ {
/* This server is the target, ignore it */ /* This server is the target, ignore it */
Log( LOG_DEBUG, "Ignored status code %s from \"%s\".", Req->command, Client_ID( client )); Log( LOG_DEBUG, "Ignored status code %s from \"%s\".", Req->command, Client_ID( client ));
return TRUE; return true;
} }
/* Determine source */ /* Determine source */
@@ -357,14 +384,14 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
{ {
/* Oops, no prefix!? */ /* Oops, no prefix!? */
Log( LOG_WARNING, "Got status code %s from \"%s\" without prefix!?", Req->command, Client_ID( client )); Log( LOG_WARNING, "Got status code %s from \"%s\" without prefix!?", Req->command, Client_ID( client ));
return TRUE; return true;
} }
else prefix = Client_Search( Req->prefix ); else prefix = Client_Search( Req->prefix );
if( ! prefix ) if( ! prefix )
{ {
/* Oops, unknown prefix!? */ /* Oops, unknown prefix!? */
Log( LOG_WARNING, "Got status code %s from unknown source: \"%s\"", Req->command, Req->prefix ); Log( LOG_WARNING, "Got status code %s from unknown source: \"%s\"", Req->command, Req->prefix );
return TRUE; return true;
} }
/* Forward status code */ /* Forward status code */
@@ -406,11 +433,23 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
return IRC_WriteStrClient( client, ERR_NOTREGISTERED_MSG, Client_ID( client )); 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;
/* Unbekannter Befehl */ /* 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" ); Log( LOG_DEBUG, "Connection %d: Unknown command \"%s\", %d %s,%s prefix.",
if( Client_Type( client ) != CLIENT_SERVER ) return IRC_WriteStrClient( client, ERR_UNKNOWNCOMMAND_MSG, Client_ID( client ), Req->command ); Client_Conn( client ), Req->command, Req->argc,
else return TRUE; 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 */ } /* Handle_Request */

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

35
src/portab/strdup.c Normal file
View File

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

View File

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

View File

@@ -9,7 +9,7 @@
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste # Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. # der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
# #
# $Id: Makefile.am,v 1.9.6.3 2004/09/08 09:45:53 alex Exp $ # $Id: Makefile.am,v 1.14 2004/09/08 09:40:51 alex Exp $
# #
AUTOMAKE_OPTIONS = ../portab/ansi2knr AUTOMAKE_OPTIONS = ../portab/ansi2knr

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -8,7 +8,7 @@
* (at your option) any later version. * (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information. * Please read the file COPYING, README and AUTHORS for more information.
* *
* $Id: tool.h,v 1.1 2003/01/13 12:20:16 alex Exp $ * $Id: tool.h,v 1.3 2005/03/19 18:43:53 fw Exp $
* *
* Tool functions (Header) * Tool functions (Header)
*/ */
@@ -18,9 +18,11 @@
#define __tool_h__ #define __tool_h__
GLOBAL VOID ngt_TrimStr PARAMS((CHAR *String )); GLOBAL void ngt_TrimLastChr PARAMS((char *String, const char Chr ));
GLOBAL CHAR *ngt_LowerStr PARAMS((CHAR *String )); GLOBAL void ngt_TrimStr PARAMS((char *String ));
GLOBAL char *ngt_LowerStr PARAMS((char *String ));
#endif #endif