mirror of
https://github.com/osmarks/ngircd.git
synced 2025-11-13 04:03:56 +00:00
Compare commits
218 Commits
rel-14-1
...
rel-17-rc2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8449e08245 | ||
|
|
05d1df97c3 | ||
|
|
01c39ba001 | ||
|
|
0c0cac641d | ||
|
|
8288878122 | ||
|
|
596bc096b0 | ||
|
|
5700329f8c | ||
|
|
3b74280879 | ||
|
|
f1267ca375 | ||
|
|
ccb175dce6 | ||
|
|
99e08eaced | ||
|
|
5f2bc55d36 | ||
|
|
1fa5b11995 | ||
|
|
d00a0f1e7c | ||
|
|
a988bbc86a | ||
|
|
4226db873f | ||
|
|
f579043671 | ||
|
|
50cb321bb1 | ||
|
|
ade8902b88 | ||
|
|
3a826b774a | ||
|
|
c51cc88eb0 | ||
|
|
5e82a91d13 | ||
|
|
4943bbb066 | ||
|
|
e2ba7e08b4 | ||
|
|
b1a117cd98 | ||
|
|
4a770e8e2d | ||
|
|
ba720fcbae | ||
|
|
b3cfbc3d28 | ||
|
|
74578890b7 | ||
|
|
212311efc5 | ||
|
|
fe5c7cb22d | ||
|
|
cdae82413d | ||
|
|
3600dc60fc | ||
|
|
cd954ee7e9 | ||
|
|
355828e64f | ||
|
|
755f54b150 | ||
|
|
ef3dbf96eb | ||
|
|
1fe17e246c | ||
|
|
c135d0dded | ||
|
|
1e281a8baa | ||
|
|
6349ec8bb3 | ||
|
|
8d68fe3f86 | ||
|
|
4f6c19712e | ||
|
|
4833f9e5c8 | ||
|
|
90a186158b | ||
|
|
b52d5e2a78 | ||
|
|
04e38f17ae | ||
|
|
32188d821b | ||
|
|
6f4a348b75 | ||
|
|
a51670005f | ||
|
|
0263fa4c66 | ||
|
|
31ea0f8ee9 | ||
|
|
fd4dfccc30 | ||
|
|
2a4bf67aac | ||
|
|
575485eb82 | ||
|
|
3fd4f320b7 | ||
|
|
6fdd3479f1 | ||
|
|
617640e0a3 | ||
|
|
f72e22d361 | ||
|
|
c65bf5d2ce | ||
|
|
9c6230e177 | ||
|
|
479a43b1c6 | ||
|
|
056de78e31 | ||
|
|
a02bc9cc6f | ||
|
|
01e40f4b55 | ||
|
|
acb66d6463 | ||
|
|
63a304755a | ||
|
|
6ebb31ab35 | ||
|
|
cf93881dfb | ||
|
|
560492a4a4 | ||
|
|
9cd3494de9 | ||
|
|
6131822af6 | ||
|
|
57a2faf4a7 | ||
|
|
41034950d9 | ||
|
|
6faf44bc6d | ||
|
|
f369177617 | ||
|
|
37ee0a3313 | ||
|
|
03457135b7 | ||
|
|
28424d013d | ||
|
|
583c50476b | ||
|
|
808d4f6e85 | ||
|
|
fb4b5acfb8 | ||
|
|
77870ddf2d | ||
|
|
1995af0ed6 | ||
|
|
761b2284b9 | ||
|
|
79be1c477e | ||
|
|
7b5e2fe38e | ||
|
|
bf8b646304 | ||
|
|
e4ffcd00bd | ||
|
|
4cc4c29e38 | ||
|
|
0db9a31e50 | ||
|
|
5462c6c50f | ||
|
|
3d49fa5bff | ||
|
|
2d4ea28835 | ||
|
|
d4632a727f | ||
|
|
60f5dd5b29 | ||
|
|
89e73ad4b4 | ||
|
|
54e67ea9ee | ||
|
|
cc336b7558 | ||
|
|
ae55d4f500 | ||
|
|
edfa215481 | ||
|
|
c6742192a6 | ||
|
|
0c0d4af55a | ||
|
|
8605e9c0fe | ||
|
|
a68103771c | ||
|
|
8ad1c23ae4 | ||
|
|
f76e0a1db6 | ||
|
|
51ed742054 | ||
|
|
60eac5e952 | ||
|
|
139d6303e7 | ||
|
|
28f8b50174 | ||
|
|
e2930f3f5e | ||
|
|
059e707249 | ||
|
|
b849e63fbf | ||
|
|
55190f2d3d | ||
|
|
6dc80bd195 | ||
|
|
df359835d1 | ||
|
|
defd7e09af | ||
|
|
29d448ed63 | ||
|
|
bdec5ac1f3 | ||
|
|
73fd26e9fa | ||
|
|
79e1ec2b1e | ||
|
|
615d09459e | ||
|
|
1338ade650 | ||
|
|
21140500f1 | ||
|
|
77ceb9f8ab | ||
|
|
b042363e88 | ||
|
|
6b0bb665c3 | ||
|
|
1caa3fb94b | ||
|
|
025342fe46 | ||
|
|
628c6c962b | ||
|
|
1ed49de83a | ||
|
|
bb914b93e9 | ||
|
|
50e8a62c5c | ||
|
|
aa32fec1b6 | ||
|
|
cbe41ec875 | ||
|
|
20276f7cc9 | ||
|
|
6e8cf51bb2 | ||
|
|
53fc0ebff6 | ||
|
|
9b3e143a26 | ||
|
|
f1bbc92b39 | ||
|
|
1da3e25e65 | ||
|
|
e1de769ab9 | ||
|
|
9f58418765 | ||
|
|
ef157715a0 | ||
|
|
ecad9f32c8 | ||
|
|
f58c8b94d9 | ||
|
|
3a2ac66f7f | ||
|
|
cf05bf31a7 | ||
|
|
a4d7c6f145 | ||
|
|
1ddc74f13e | ||
|
|
75dabcaae5 | ||
|
|
1b73e68e6e | ||
|
|
03cde2efd3 | ||
|
|
cb6faed61c | ||
|
|
c62c2d349b | ||
|
|
60137a7139 | ||
|
|
513a75c919 | ||
|
|
4f1b5400e9 | ||
|
|
cade80dcf5 | ||
|
|
28ca31e576 | ||
|
|
c414d0bd3a | ||
|
|
bc88b2cb06 | ||
|
|
bc1ac7fbc5 | ||
|
|
37e950a40c | ||
|
|
55c04e691d | ||
|
|
881b9af251 | ||
|
|
294320ed62 | ||
|
|
03b70229eb | ||
|
|
9918dfc1d5 | ||
|
|
e46cf64cc1 | ||
|
|
113bd34878 | ||
|
|
4a3e40bc95 | ||
|
|
45b1a45c97 | ||
|
|
7d6de7c352 | ||
|
|
30b584c2e8 | ||
|
|
eaaf0c3bd5 | ||
|
|
9a7499af8b | ||
|
|
bce16c2864 | ||
|
|
926204cacd | ||
|
|
3bf0c6f3b9 | ||
|
|
f78b0c61e9 | ||
|
|
fa09883c72 | ||
|
|
affa03b277 | ||
|
|
5b1efaee67 | ||
|
|
d5f80b2a8d | ||
|
|
60fc4d6335 | ||
|
|
536538968c | ||
|
|
4daf780f01 | ||
|
|
ed72bf4ceb | ||
|
|
d76910ce7b | ||
|
|
8fd0e29d46 | ||
|
|
bfa48f3448 | ||
|
|
66c6458ae7 | ||
|
|
3b37ad334b | ||
|
|
c191ea53a9 | ||
|
|
e1598e2670 | ||
|
|
44acf41cc1 | ||
|
|
933da741c6 | ||
|
|
cf7e19193b | ||
|
|
5f1e43416a | ||
|
|
5debe20509 | ||
|
|
a7eef6666b | ||
|
|
56a8abc253 | ||
|
|
21bb2bd658 | ||
|
|
bddfd67550 | ||
|
|
805bf03490 | ||
|
|
63cbc6cd42 | ||
|
|
b3cacf86df | ||
|
|
0ef94edad7 | ||
|
|
643ae1b48b | ||
|
|
9b1c47220f | ||
|
|
8e2c5816ee | ||
|
|
f31c3a3aa2 | ||
|
|
b0931f322b | ||
|
|
5196e9bcb1 | ||
|
|
57aa64e117 | ||
|
|
fd7e85b798 |
4
.mailmap
Normal file
4
.mailmap
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
# mailmap file for git-[short]log and git-blame
|
||||||
|
|
||||||
|
Alexander Barton <anonymous>
|
||||||
|
Ali Shemiran <ashemira@ucsd.edu>
|
||||||
2
AUTHORS
2
AUTHORS
@@ -19,7 +19,7 @@ directly, if possible!
|
|||||||
Main Authors
|
Main Authors
|
||||||
~~~~~~~~~~~~
|
~~~~~~~~~~~~
|
||||||
Alexander Barton, <alex@barton.de> (alex)
|
Alexander Barton, <alex@barton.de> (alex)
|
||||||
Florian Westphal, <westphal@foo.fh-furtwangen.de> (fw)
|
Florian Westphal, <fw@strlen.de>
|
||||||
|
|
||||||
|
|
||||||
Contributors
|
Contributors
|
||||||
|
|||||||
134
ChangeLog
134
ChangeLog
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
ngIRCd - Next Generation IRC Server
|
ngIRCd - Next Generation IRC Server
|
||||||
|
|
||||||
(c)2001-2009 Alexander Barton,
|
(c)2001-2010 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,138 @@
|
|||||||
-- ChangeLog --
|
-- ChangeLog --
|
||||||
|
|
||||||
|
|
||||||
|
ngIRCd Release 17
|
||||||
|
|
||||||
|
ngIRCd 17~rc2 (2010-10-25)
|
||||||
|
- ZeroConf: include header files missing since commit a988bbc86a.
|
||||||
|
- Generate ngIRCd version number from GIT tag.
|
||||||
|
- Make sourcecode compatible with ansi2knr again. This allows to compile
|
||||||
|
ngIRCd using a pre-ANSI K&R C compiler again.
|
||||||
|
- ./configure: check if C compiler can compile ISO Standard C.
|
||||||
|
- ./configure: check support for C prototypes again.
|
||||||
|
- Don't use PARAMS() macro for function implementations.
|
||||||
|
- Added m68k/apple/aux3.0.1 (gcc 2.7.2) to doc/Platforms.txt.
|
||||||
|
- Only try to set FD_CLOEXEC if this flag is defined.
|
||||||
|
- Only use "__attribute__ ((unused))" if GCC >=2.8 is used.
|
||||||
|
- doc/Makefile.am: don't set docdir, automake handles it already.
|
||||||
|
|
||||||
|
ngIRCd 17~rc1 (2010-10-11)
|
||||||
|
- New configuration option "NoZeroConf" to disable service registration at
|
||||||
|
runtime even if ngIRCd is compiled with support for ZeroConf (e.g. using
|
||||||
|
Howl, Avahi or on Mac OS X).
|
||||||
|
- New configuration option "SyslogFacility" to define the syslog "facility"
|
||||||
|
(the "target"), to which ngIRCd should send its log messages.
|
||||||
|
Possible values are system dependant, but most probably "auth", "daemon",
|
||||||
|
"user" and "local1" through "local7" are possible values; see syslog(3).
|
||||||
|
Default is "local5" for historical reasons.
|
||||||
|
- Dump the "internal server state" (configured servers, established
|
||||||
|
connections and known clients) to the console or syslog when receiving
|
||||||
|
the SIGUSR2 signal and debug mode is enabled.
|
||||||
|
- Enable the daemon to disable and enable "debug mode" on runtime using
|
||||||
|
signal SIGUSR1, when debug code is compiled in, not only on startup
|
||||||
|
using the command line parameters.
|
||||||
|
- Signal handler: added new 'delayed' signal handlers, including fallback
|
||||||
|
to deprecated sysv API. And removed global NGIRCd_SignalRehash variable.
|
||||||
|
- IO: add io_cloexec() to set close-on-exec flag.
|
||||||
|
- ng_ipaddr.h: include required assert.h header.
|
||||||
|
- Conn_SyncServerStruct(): test all connections; and work case insensitive
|
||||||
|
- configure script: correctly indent IPv6 yes/no summary output.
|
||||||
|
- Don't reset My_Connections[Idx].lastping when reading data, so the
|
||||||
|
client lag debug-output is working again.
|
||||||
|
- Implement user mode "x": hostname cloaking (closes: #102).
|
||||||
|
- Make configure switch "--docdir" work (closes: #108).
|
||||||
|
- Reformat and update FAQ.txt a little bit.
|
||||||
|
- INSTALL: mention SSL, IPv6, and changed handling of MotdFile.
|
||||||
|
- Change MOTD file handling: ngIRCd now caches the contens of the MOTD
|
||||||
|
file, so the daemon now requires a HUP signal or REHASH command to
|
||||||
|
re-read the MOTD file when its content changed.
|
||||||
|
- Startup: open /dev/null before chroot'ing the daemon.
|
||||||
|
- Allow IRC ops to change channel modes even without OperServerMode set.
|
||||||
|
- Allow IRC operators to use MODE command on any channel (closes: #100).
|
||||||
|
- Added mailmap file for git-[short]log and git-blame.
|
||||||
|
- Authenticated users should be registered without the "~" mark.
|
||||||
|
- Set NoPAM=yes in configuration files used for the testsuite.
|
||||||
|
- New configuration option "NoPAM" to disable PAM.
|
||||||
|
- Implement asynchronous user authentication using PAM, please see the
|
||||||
|
file doc/PAM.txt for details.
|
||||||
|
- Resolver: Implement signal handler and catch TERM signals.
|
||||||
|
- Don't set a penalty time when doing DNS lookups.
|
||||||
|
- Add some documentation for using BOPM with ngIRCd, see doc/Bopm.txt.
|
||||||
|
- Implement user mode "c": receive connect/disconnect NOTICEs. Note that
|
||||||
|
this new mode requires the user to be an IRC operator.
|
||||||
|
- ngircd.init: require "$network" and "$remote_fs" when stopping ngircd.
|
||||||
|
- Show SSL status in WHOIS output, numeric 275.
|
||||||
|
- Include correct header files when testing for arpa/inet.h (Closes: #105).
|
||||||
|
- Don't access already freed memory in IRC_KILL().
|
||||||
|
- Fix "beeing" typo ...
|
||||||
|
- SSL/TLS: fix bogus "socket closed" error message.
|
||||||
|
|
||||||
|
ngIRCd Release 16 (2010-05-02)
|
||||||
|
|
||||||
|
- doc/SSL: remove line continuation marker
|
||||||
|
|
||||||
|
ngIRCd 16~rc2 (2010-04-25)
|
||||||
|
- Updated some more copyright notices, it's 2010 already :-)
|
||||||
|
- Only compile in Get_Error() if really needed
|
||||||
|
- Fix gcc warning "ignoring return value of ..."
|
||||||
|
- Include netinet/in_systm.h alongside netinet/ip.h
|
||||||
|
- Include netinet/{in.h, in_systm.h} when checking for netinet/ip.h
|
||||||
|
- Only include <netinet/in_systm.h> if it exists
|
||||||
|
- Updated doc/Platforms.txt
|
||||||
|
- Enhace connection statistics counters: display total number of served
|
||||||
|
connections on daemon shutdown and when a new client connects using
|
||||||
|
the new numeric RPL_STATSCONN (250).
|
||||||
|
|
||||||
|
ngIRCd 16~rc1 (2010-03-25)
|
||||||
|
- Various fixes to the build system and code cleanups.
|
||||||
|
- contrib/platformtest.sh: Only show latest commit.
|
||||||
|
- Updatet doc/Platforms.txt, added new README-Interix.txt documenting
|
||||||
|
how to tun ngIRCd on Microsoft Services for UNIX (MS SFU, MS SUA).
|
||||||
|
- Updated links to the ngIRCd homepage (bug tracker, mailing list).
|
||||||
|
- Added missing modes to USERMODES #define
|
||||||
|
- Show our name (IRCD=ngIRCd) in ISUPPORT (005) numeric
|
||||||
|
- Quote received messages of ERROR commands in log output.
|
||||||
|
- ngircd.conf manual page: document missing "Password" variable.
|
||||||
|
- Implement WEBIRC command used by some Web-IRC frontends. The password
|
||||||
|
required to secure this command must be configured using the new
|
||||||
|
"WebircPassword" variable in the ngircd.conf file.
|
||||||
|
- Don't use port 6668 as example for both "Ports" and "SSLPorts".
|
||||||
|
- Remove limit on max number of configured irc operators.
|
||||||
|
- Only link "nsl" library when really needed.
|
||||||
|
- A new channel mode "secure connections only" (+z) has been implemented:
|
||||||
|
Only clients using a SSL encrypted connection to the server are allowed
|
||||||
|
to join such a channel.
|
||||||
|
But please note three things: a) already joined clients are not checked
|
||||||
|
when setting this mode, b) IRC operators are always allowed to join
|
||||||
|
every channel, and c) remote clients using a server not supporting this
|
||||||
|
mode are not checked either and therefore always allowed to join.
|
||||||
|
|
||||||
|
ngIRCd Release 15 (2009-11-07)
|
||||||
|
|
||||||
|
- "ngircd --configtest": print SSL configuration options even when unset.
|
||||||
|
|
||||||
|
ngIRCd 15~rc1 (2009-10-15)
|
||||||
|
- Do not add default listening port (6667) if SSL ports were specified, so
|
||||||
|
ngIRCd can be configured to only accept SSL-encrypted connections now.
|
||||||
|
- Enable IRC operators to use the IRC command SQUIT (insted of the already
|
||||||
|
implemented but non-standard DISCONNECT command).
|
||||||
|
- New configuration option "AllowRemoteOper" (disabled by default) that
|
||||||
|
enables remote IRC operators to use the IRC commands SQUIT and CONNECT
|
||||||
|
on the local server.
|
||||||
|
- Mac OS X: fix test for packagemaker(1) tool in Makefile and use gcc 4.0
|
||||||
|
for Mac OS X 10.4 compatibility in the Xcode project file.
|
||||||
|
- Fix --with-{openssl|gnutls} to accept path names.
|
||||||
|
- Fix LSB header of Debian init script.
|
||||||
|
- Updated doc/Platforms.txt and include new script contrib/platformtest.sh
|
||||||
|
to ease generating platform reports.
|
||||||
|
- Fix connection information for already registered connections.
|
||||||
|
- Enforce upper limit on maximum number of handled commands. This implements
|
||||||
|
a throttling scheme: an IRC client can send up to 3 commands or 256 bytes
|
||||||
|
per second before a one second pause is enforced.
|
||||||
|
- Fix connection counter.
|
||||||
|
- Fix a few error handling glitches for SSL/TLS connections.
|
||||||
|
- Minor fixes to manual pages and documentation.
|
||||||
|
|
||||||
ngIRCd Release 14.1 (2009-05-05)
|
ngIRCd Release 14.1 (2009-05-05)
|
||||||
|
|
||||||
- Security: fix remotely triggerable crash in SSL/TLS code.
|
- Security: fix remotely triggerable crash in SSL/TLS code.
|
||||||
|
|||||||
26
INSTALL
26
INSTALL
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
ngIRCd - Next Generation IRC Server
|
ngIRCd - Next Generation IRC Server
|
||||||
|
|
||||||
(c)2001-2007 Alexander Barton,
|
(c)2001-2010 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
|
||||||
@@ -9,11 +9,15 @@
|
|||||||
|
|
||||||
-- INSTALL --
|
-- INSTALL --
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
I. Upgrade Information
|
I. Upgrade Information
|
||||||
~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Differences to version 16
|
||||||
|
|
||||||
|
- Changes to the "MotdFile" specified in ngircd.conf now require a ngircd
|
||||||
|
configuration reload to take effect (HUP signal, REHASH command).
|
||||||
|
|
||||||
Differences to version 0.9.x
|
Differences to version 0.9.x
|
||||||
|
|
||||||
- The option of the configure script to enable support for Zeroconf/Bonjour/
|
- The option of the configure script to enable support for Zeroconf/Bonjour/
|
||||||
@@ -184,6 +188,24 @@ standard locations.
|
|||||||
to the daemon, for example by using "/etc/hosts.{allow|deny}".
|
to the daemon, for example by using "/etc/hosts.{allow|deny}".
|
||||||
The "libwrap" is required for this option.
|
The "libwrap" is required for this option.
|
||||||
|
|
||||||
|
* PAM:
|
||||||
|
--with-pam[=<path>]
|
||||||
|
|
||||||
|
Enable support for PAM, the Pluggable Authentication Modules library.
|
||||||
|
See doc/PAM.txt for details.
|
||||||
|
|
||||||
|
* SSL:
|
||||||
|
--with-openssl[=<path>]
|
||||||
|
--with-gnutls[=<path>]
|
||||||
|
|
||||||
|
Enable support for SSL/TLS using OpenSSL or gnutls libraries.
|
||||||
|
See doc/SSL.txt for details.
|
||||||
|
|
||||||
|
* IPv6:
|
||||||
|
--enable-ipv6
|
||||||
|
|
||||||
|
Adds support for version 6 of the Internet Protocol.
|
||||||
|
|
||||||
|
|
||||||
IV. Useful make-targets
|
IV. Useful make-targets
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ deb:
|
|||||||
dpkg-buildpackage -rfakeroot -i
|
dpkg-buildpackage -rfakeroot -i
|
||||||
|
|
||||||
osxpkg: have-xcodebuild
|
osxpkg: have-xcodebuild
|
||||||
@packagemaker >/dev/null 2>&1; [ $$? -ge 1 ] \
|
@packagemaker >/dev/null 2>&1; [ $$? -le 1 ] \
|
||||||
|| ( echo; echo "Error: \"packagemaker\" not found!"; echo; exit 2)
|
|| ( echo; echo "Error: \"packagemaker\" not found!"; echo; exit 2)
|
||||||
make clean
|
make clean
|
||||||
./configure --prefix=/opt/ngircd
|
./configure --prefix=/opt/ngircd
|
||||||
|
|||||||
72
NEWS
72
NEWS
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
ngIRCd - Next Generation IRC Server
|
ngIRCd - Next Generation IRC Server
|
||||||
|
|
||||||
(c)2001-2009 Alexander Barton,
|
(c)2001-2010 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,76 @@
|
|||||||
-- NEWS --
|
-- NEWS --
|
||||||
|
|
||||||
|
|
||||||
|
ngIRCd Release 17
|
||||||
|
|
||||||
|
ngIRCd 17~rc2 (2010-10-25)
|
||||||
|
- Generate ngIRCd version number from GIT tag.
|
||||||
|
- Make sourcecode compatible with ansi2knr again. This allows to compile
|
||||||
|
ngIRCd using a pre-ANSI K&R C compiler again.
|
||||||
|
|
||||||
|
ngIRCd 17~rc1 (2010-10-11)
|
||||||
|
- New configuration option "NoZeroConf" to disable service registration at
|
||||||
|
runtime even if ngIRCd is compiled with support for ZeroConf (e.g. using
|
||||||
|
Howl, Avahi or on Mac OS X).
|
||||||
|
- New configuration option "SyslogFacility" to define the syslog "facility"
|
||||||
|
(the "target"), to which ngIRCd should send its log messages.
|
||||||
|
Possible values are system dependant, but most probably "auth", "daemon",
|
||||||
|
"user" and "local1" through "local7" are possible values; see syslog(3).
|
||||||
|
Default is "local5" for historical reasons.
|
||||||
|
- Dump the "internal server state" (configured servers, established
|
||||||
|
connections and known clients) to the console or syslog when receiving
|
||||||
|
the SIGUSR2 signal and debug mode is enabled.
|
||||||
|
- Enable the daemon to disable and enable "debug mode" on runtime using
|
||||||
|
signal SIGUSR1, when debug code is compiled in, not only on startup
|
||||||
|
using the command line parameters.
|
||||||
|
- Implement user mode "x": hostname cloaking (closes: #102).
|
||||||
|
- Change MOTD file handling: ngIRCd now caches the contens of the MOTD
|
||||||
|
file, so the daemon now requires a HUP signal or REHASH command to
|
||||||
|
re-read the MOTD file when its content changed.
|
||||||
|
- Allow IRC ops to change channel modes even without OperServerMode set.
|
||||||
|
- Allow IRC operators to use MODE command on any channel (closes: #100).
|
||||||
|
- New configuration option "NoPAM" to disable PAM.
|
||||||
|
- Implement asynchronous user authentication using PAM, please see the
|
||||||
|
file doc/PAM.txt for details.
|
||||||
|
- Add some documentation for using BOPM with ngIRCd, see doc/Bopm.txt.
|
||||||
|
- Implement user mode "c": receive connect/disconnect NOTICEs. Note that
|
||||||
|
this new mode requires the user to be an IRC operator.
|
||||||
|
- Show SSL status in WHOIS output, numeric 275.
|
||||||
|
|
||||||
|
ngIRCd Release 16 (2010-05-02)
|
||||||
|
|
||||||
|
ngIRCd 16~rc2 (2010-04-25)
|
||||||
|
- Enhace connection statistics counters: display total number of served
|
||||||
|
connections on daemon shutdown and when a new client connects using
|
||||||
|
the new numeric RPL_STATSCONN (250).
|
||||||
|
|
||||||
|
ngIRCd 16~rc1 (2010-03-25)
|
||||||
|
- Implement WEBIRC command used by some Web-IRC frontends. The password
|
||||||
|
required to secure this command must be configured using the new
|
||||||
|
"WebircPassword" variable in the ngircd.conf file.
|
||||||
|
- Remove limit on max number of configured irc operators.
|
||||||
|
- A new channel mode "secure connections only" (+z) has been implemented:
|
||||||
|
Only clients using a SSL encrypted connection to the server are allowed
|
||||||
|
to join such a channel.
|
||||||
|
But please note three things: a) already joined clients are not checked
|
||||||
|
when setting this mode, b) IRC operators are always allowed to join
|
||||||
|
every channel, and c) remote clients using a server not supporting this
|
||||||
|
mode are not checked either and therefore always allowed to join.
|
||||||
|
|
||||||
|
ngIRCd Release 15 (2009-11-07)
|
||||||
|
|
||||||
|
ngIRCd 15~rc1 (2009-10-15)
|
||||||
|
- Do not add default listening port (6667) if SSL ports were specified, so
|
||||||
|
ngIRCd can be configured to only accept SSL-encrypted connections now.
|
||||||
|
- Enable IRC operators to use the IRC command SQUIT (insted of the already
|
||||||
|
implemented but non-standard DISCONNECT command).
|
||||||
|
- New configuration option "AllowRemoteOper" (disabled by default) that
|
||||||
|
enables remote IRC operators to use the IRC commands SQUIT and CONNECT
|
||||||
|
on the local server.
|
||||||
|
- Enforce upper limit on maximum number of handled commands. This implements
|
||||||
|
a throttling scheme: an IRC client can send up to 3 commands or 256 bytes
|
||||||
|
per second before a one second pause is enforced.
|
||||||
|
|
||||||
ngIRCd Release 14.1 (2009-05-05)
|
ngIRCd Release 14.1 (2009-05-05)
|
||||||
|
|
||||||
- Security: fix remotely triggerable crash in SSL/TLS code.
|
- Security: fix remotely triggerable crash in SSL/TLS code.
|
||||||
|
|||||||
4
README
4
README
@@ -78,10 +78,10 @@ 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://ngircd.barton.de/#bugs>
|
<http://ngircd.barton.de/bugtracker.php>
|
||||||
|
|
||||||
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 the ngIRCd mailing list: <ngircd-ml@arthur.ath.cx> (please see
|
mail to the ngIRCd mailing list: <ngircd-ml@arthur.ath.cx> (please see
|
||||||
<http://ngircd.barton.de/#ml> for details).
|
<http://ngircd.barton.de/support.php#ml> for details).
|
||||||
|
|||||||
@@ -150,20 +150,23 @@ echo "Generating files ..."
|
|||||||
$ACLOCAL && \
|
$ACLOCAL && \
|
||||||
$AUTOHEADER && \
|
$AUTOHEADER && \
|
||||||
$AUTOMAKE --add-missing && \
|
$AUTOMAKE --add-missing && \
|
||||||
$AUTOCONF
|
$AUTOCONF --force
|
||||||
|
|
||||||
if [ $? -eq 0 -a -x ./configure ]; then
|
if [ $? -eq 0 -a -x ./configure ]; then
|
||||||
# Success: if we got some parameters we call ./configure and pass
|
# Success: if we got some parameters we call ./configure and pass
|
||||||
# all of them to it.
|
# all of them to it.
|
||||||
|
NAME=`grep PACKAGE_STRING= configure | cut -d"'" -f2`
|
||||||
if [ "$GO" = "1" ]; then
|
if [ "$GO" = "1" ]; then
|
||||||
[ -n "$PREFIX" ] && p=" --prefix=$PREFIX" || p=""
|
[ -n "$PREFIX" ] && p=" --prefix=$PREFIX" || p=""
|
||||||
[ -n "$*" ] && a=" $*" || a=""
|
[ -n "$*" ] && a=" $*" || a=""
|
||||||
c="./configure${p}${a}"
|
c="./configure${p}${a}"
|
||||||
|
echo "Okay, autogen.sh for $NAME done."
|
||||||
echo "Calling \"$c\" ..."
|
echo "Calling \"$c\" ..."
|
||||||
$c
|
$c
|
||||||
exit $?
|
exit $?
|
||||||
else
|
else
|
||||||
echo "Okay, autogen.sh done; now run the \"configure\" script."
|
echo "Okay, autogen.sh for $NAME done."
|
||||||
|
echo "Now run the \"./configure\" script."
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
|
|||||||
86
configure.in
86
configure.in
@@ -1,6 +1,6 @@
|
|||||||
#
|
#
|
||||||
# ngIRCd -- The Next Generation IRC Daemon
|
# ngIRCd -- The Next Generation IRC Daemon
|
||||||
# Copyright (c)2001-2008 Alexander Barton <alex@barton.de>
|
# Copyright (c)2001-2010 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
|
||||||
@@ -9,15 +9,19 @@
|
|||||||
# Please read the file COPYING, README and AUTHORS for more information.
|
# Please read the file COPYING, README and AUTHORS for more information.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
define(VERSION_ID,esyscmd(git describe|sed -e 's/rel-//g'|sed -e 's/-/~/'|tr -d \\n))
|
||||||
|
|
||||||
# -- Initialisation --
|
# -- Initialisation --
|
||||||
|
|
||||||
AC_PREREQ(2.50)
|
AC_PREREQ(2.50)
|
||||||
AC_INIT(ngircd, 14.1)
|
AC_INIT(ngircd, VERSION_ID)
|
||||||
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)
|
||||||
AM_CONFIG_HEADER(src/config.h)
|
AM_CONFIG_HEADER(src/config.h)
|
||||||
|
|
||||||
|
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
|
||||||
|
|
||||||
# -- Templates for config.h --
|
# -- Templates for config.h --
|
||||||
|
|
||||||
AH_TEMPLATE([DEBUG], [Define if debug-mode should be enabled])
|
AH_TEMPLATE([DEBUG], [Define if debug-mode should be enabled])
|
||||||
@@ -31,6 +35,8 @@ AH_TEMPLATE([IRCPLUS], [Define if IRC+ protocol should be used])
|
|||||||
AH_TEMPLATE([WANT_IPV6], [Define if IPV6 protocol should be enabled])
|
AH_TEMPLATE([WANT_IPV6], [Define if IPV6 protocol should be enabled])
|
||||||
AH_TEMPLATE([ZEROCONF], [Define if support for Zeroconf should be included])
|
AH_TEMPLATE([ZEROCONF], [Define if support for Zeroconf should be included])
|
||||||
AH_TEMPLATE([IDENTAUTH], [Define if the server should do IDENT requests])
|
AH_TEMPLATE([IDENTAUTH], [Define if the server should do IDENT requests])
|
||||||
|
AH_TEMPLATE([PAM], [Define if PAM should be used])
|
||||||
|
AH_TEMPLATE([HAVE_sockaddr_in_len], [Define if sockaddr_in.sin_len exists])
|
||||||
|
|
||||||
AH_TEMPLATE([TARGET_OS], [Target operating system name])
|
AH_TEMPLATE([TARGET_OS], [Target operating system name])
|
||||||
AH_TEMPLATE([TARGET_VENDOR], [Target system vendor])
|
AH_TEMPLATE([TARGET_VENDOR], [Target system vendor])
|
||||||
@@ -39,6 +45,8 @@ AH_TEMPLATE([TARGET_CPU], [Target CPU name])
|
|||||||
# -- C Compiler --
|
# -- C Compiler --
|
||||||
|
|
||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
|
AC_PROG_CC_STDC
|
||||||
|
AC_C_PROTOTYPES
|
||||||
|
|
||||||
# -- Helper programs --
|
# -- Helper programs --
|
||||||
|
|
||||||
@@ -71,7 +79,6 @@ AC_DEFUN([GCC_STACK_PROTECT_CC],[
|
|||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
if test "$GCC" = "yes"; then
|
if test "$GCC" = "yes"; then
|
||||||
# We are using the GNU C compiler. Good!
|
# We are using the GNU C compiler. Good!
|
||||||
CFLAGS="$CFLAGS -pipe -W -Wall -Wpointer-arith -Wstrict-prototypes"
|
CFLAGS="$CFLAGS -pipe -W -Wall -Wpointer-arith -Wstrict-prototypes"
|
||||||
@@ -99,11 +106,24 @@ AC_HEADER_TIME
|
|||||||
AC_HEADER_SYS_WAIT
|
AC_HEADER_SYS_WAIT
|
||||||
|
|
||||||
AC_CHECK_HEADERS([ \
|
AC_CHECK_HEADERS([ \
|
||||||
ctype.h errno.h fcntl.h netdb.h netinet/in.h stdlib.h string.h \
|
ctype.h errno.h fcntl.h netdb.h netinet/in.h netinet/in_systm.h \
|
||||||
strings.h sys/socket.h sys/time.h unistd.h \
|
stdlib.h string.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 stdbool.h stddef.h varargs.h])
|
AC_CHECK_HEADERS([ \
|
||||||
|
arpa/inet.h ctype.h malloc.h netinet/ip.h stdbool.h stddef.h varargs.h \
|
||||||
|
],[],[],[[
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#endif
|
||||||
|
]]
|
||||||
|
)
|
||||||
|
|
||||||
# -- Datatypes --
|
# -- Datatypes --
|
||||||
|
|
||||||
@@ -123,12 +143,16 @@ AC_TRY_COMPILE([
|
|||||||
AC_TYPE_SIGNAL
|
AC_TYPE_SIGNAL
|
||||||
AC_TYPE_SIZE_T
|
AC_TYPE_SIZE_T
|
||||||
|
|
||||||
|
AC_CHECK_MEMBER([struct sockaddr_in.sin_len], AC_DEFINE(HAVE_sockaddr_in_len),,
|
||||||
|
[#include <arpa/inet.h>])
|
||||||
|
|
||||||
# -- Libraries --
|
# -- Libraries --
|
||||||
|
|
||||||
|
# A/UX needs this.
|
||||||
AC_CHECK_LIB(UTIL,memmove)
|
AC_CHECK_LIB(UTIL,memmove)
|
||||||
|
# needed on solaris. GNU libc also has a libnsl, but we do not need it.
|
||||||
|
AC_SEARCH_LIBS(gethostbyname,nsl)
|
||||||
AC_CHECK_LIB(socket,bind)
|
AC_CHECK_LIB(socket,bind)
|
||||||
AC_CHECK_LIB(nsl,gethostent)
|
|
||||||
|
|
||||||
# -- Functions --
|
# -- Functions --
|
||||||
|
|
||||||
@@ -139,7 +163,8 @@ AC_CHECK_FUNCS([ \
|
|||||||
bind gethostbyaddr gethostbyname gethostname inet_ntoa \
|
bind gethostbyaddr gethostbyname gethostname inet_ntoa \
|
||||||
setsid setsockopt socket strcasecmp waitpid],,AC_MSG_ERROR([required function missing!]))
|
setsid setsockopt socket strcasecmp waitpid],,AC_MSG_ERROR([required function missing!]))
|
||||||
|
|
||||||
AC_CHECK_FUNCS(inet_aton isdigit sigaction snprintf vsnprintf strdup strlcpy strlcat strtok_r)
|
AC_CHECK_FUNCS(getaddrinfo getnameinfo inet_aton isdigit sigaction sigprocmask snprintf \
|
||||||
|
vsnprintf strdup strlcpy strlcat strtok_r)
|
||||||
|
|
||||||
# -- Configuration options --
|
# -- Configuration options --
|
||||||
|
|
||||||
@@ -313,7 +338,7 @@ fi
|
|||||||
|
|
||||||
AC_ARG_WITH(openssl,
|
AC_ARG_WITH(openssl,
|
||||||
[ --with-openssl enable SSL support using OpenSSL],
|
[ --with-openssl enable SSL support using OpenSSL],
|
||||||
[ if test "$withval" = "yes"; then
|
[ if test "$withval" != "no"; then
|
||||||
if test "$withval" != "yes"; then
|
if test "$withval" != "yes"; then
|
||||||
CFLAGS="-I$withval/include $CFLAGS"
|
CFLAGS="-I$withval/include $CFLAGS"
|
||||||
CPPFLAGS="-I$withval/include $CPPFLAGS"
|
CPPFLAGS="-I$withval/include $CPPFLAGS"
|
||||||
@@ -330,7 +355,7 @@ AC_ARG_WITH(openssl,
|
|||||||
|
|
||||||
AC_ARG_WITH(gnutls,
|
AC_ARG_WITH(gnutls,
|
||||||
[ --with-gnutls enable SSL support using gnutls],
|
[ --with-gnutls enable SSL support using gnutls],
|
||||||
[ if test "$withval" = "yes"; then
|
[ if test "$withval" != "no"; then
|
||||||
if test "$withval" != "yes"; then
|
if test "$withval" != "yes"; then
|
||||||
CFLAGS="-I$withval/include $CFLAGS"
|
CFLAGS="-I$withval/include $CFLAGS"
|
||||||
CPPFLAGS="-I$withval/include $CPPFLAGS"
|
CPPFLAGS="-I$withval/include $CPPFLAGS"
|
||||||
@@ -459,6 +484,33 @@ if test "$x_identauth_on" = "yes"; then
|
|||||||
AC_CHECK_HEADERS(ident.h,,AC_MSG_ERROR([required C header missing!]))
|
AC_CHECK_HEADERS(ident.h,,AC_MSG_ERROR([required C header missing!]))
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# compile in PAM support?
|
||||||
|
|
||||||
|
x_pam_on=no
|
||||||
|
AC_ARG_WITH(pam,
|
||||||
|
[ --with-pam enable user authentication using PAM],
|
||||||
|
[ 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(pam, pam_authenticate)
|
||||||
|
AC_CHECK_FUNCS(pam_authenticate, x_pam_on=yes,
|
||||||
|
AC_MSG_ERROR([Can't enable PAM support!])
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
]
|
||||||
|
)
|
||||||
|
if test "$x_pam_on" = "yes"; then
|
||||||
|
AC_DEFINE(PAM, 1)
|
||||||
|
AC_CHECK_HEADERS(security/pam_appl.h,pam_ok=yes)
|
||||||
|
if test "$pam_ok" != "yes"; then
|
||||||
|
AC_CHECK_HEADERS(pam/pam_appl.h,pam_ok=yes,
|
||||||
|
AC_MSG_ERROR([required C header missing!]))
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# compile in IRC+ protocol support?
|
# compile in IRC+ protocol support?
|
||||||
|
|
||||||
x_ircplus_on=yes
|
x_ircplus_on=yes
|
||||||
@@ -477,6 +529,8 @@ AC_ARG_ENABLE(ipv6,
|
|||||||
if test "$enableval" = "yes"; then x_ipv6_on=yes; fi
|
if test "$enableval" = "yes"; then x_ipv6_on=yes; fi
|
||||||
)
|
)
|
||||||
if test "$x_ipv6_on" = "yes"; then
|
if test "$x_ipv6_on" = "yes"; then
|
||||||
|
# getaddrinfo() and getnameinfo() are optional when not compiling
|
||||||
|
# with IPv6 support, but are required for IPv6 to work!
|
||||||
AC_CHECK_FUNCS([ \
|
AC_CHECK_FUNCS([ \
|
||||||
getaddrinfo getnameinfo \
|
getaddrinfo getnameinfo \
|
||||||
],,AC_MSG_ERROR([required function missing for IPv6 support!]))
|
],,AC_MSG_ERROR([required function missing for IPv6 support!]))
|
||||||
@@ -566,7 +620,7 @@ B=`eval echo ${bindir}` ; B=`eval echo ${B}`
|
|||||||
S=`eval echo ${sbindir}` ; S=`eval echo ${S}`
|
S=`eval echo ${sbindir}` ; S=`eval echo ${S}`
|
||||||
C=`eval echo ${sysconfdir}` ; C=`eval echo ${C}`
|
C=`eval echo ${sysconfdir}` ; C=`eval echo ${C}`
|
||||||
M=`eval echo ${mandir}` ; M=`eval echo ${M}`
|
M=`eval echo ${mandir}` ; M=`eval echo ${M}`
|
||||||
D=`eval echo ${datadir}/doc/${PACKAGE}` ; D=`eval echo ${D}`
|
D=`eval echo ${docdir}` ; D=`eval echo ${D}`
|
||||||
|
|
||||||
echo " Target: ${target}"
|
echo " Target: ${target}"
|
||||||
test "$target" != "$host" && echo " Host: ${host}"
|
test "$target" != "$host" && echo " Host: ${host}"
|
||||||
@@ -634,11 +688,17 @@ echo $ECHO_N " I/O backend: $ECHO_C"
|
|||||||
echo "\"$x_io_backend\""
|
echo "\"$x_io_backend\""
|
||||||
|
|
||||||
echo $ECHO_N " IPv6 protocol: $ECHO_C"
|
echo $ECHO_N " IPv6 protocol: $ECHO_C"
|
||||||
echo $ECHO_N "$x_ipv6_on $ECHO_C"
|
test "$x_ipv6_on" = "yes" \
|
||||||
|
&& echo $ECHO_N "yes $ECHO_C" \
|
||||||
|
|| echo $ECHO_N "no $ECHO_C"
|
||||||
echo $ECHO_N " SSL support: $ECHO_C"
|
echo $ECHO_N " SSL support: $ECHO_C"
|
||||||
echo "$x_ssl_lib"
|
echo "$x_ssl_lib"
|
||||||
|
|
||||||
|
echo $ECHO_N " PAM support: $ECHO_C"
|
||||||
|
test "$x_pam_on" = "yes" \
|
||||||
|
&& echo "yes" \
|
||||||
|
|| echo "no"
|
||||||
|
|
||||||
echo
|
echo
|
||||||
|
|
||||||
# -eof-
|
# -eof-
|
||||||
|
|||||||
@@ -1,3 +1,45 @@
|
|||||||
|
ngircd (17~rc2-0ab1) unstable; urgency=low
|
||||||
|
|
||||||
|
* New "upstream" release candidate 2 for ngIRCd Release 17.
|
||||||
|
|
||||||
|
-- Alexander Barton <alex@barton.de> Mon, 25 Oct 2010 18:51:15 +0200
|
||||||
|
|
||||||
|
ngircd (17~rc1-0ab1) unstable; urgency=low
|
||||||
|
|
||||||
|
* New "upstream" release candidate 1 for ngIRCd Release 17.
|
||||||
|
|
||||||
|
-- Alexander Barton <alex@barton.de> Mon, 11 Oct 2010 16:57:47 +0200
|
||||||
|
|
||||||
|
ngircd (16-0ab1) unstable; urgency=low
|
||||||
|
|
||||||
|
* New "upstream" release: ngIRCd 16.
|
||||||
|
|
||||||
|
-- Alexander Barton <alex@barton.de> Sun, 02 May 2010 13:32:41 +0200
|
||||||
|
|
||||||
|
ngircd (16~rc2-0ab1) unstable; urgency=low
|
||||||
|
|
||||||
|
* New "upstream" release candidate 2 for ngIRCd Release 16.
|
||||||
|
|
||||||
|
-- Alexander Barton <alex@barton.de> Sun, 25 Apr 2010 13:12:42 +0200
|
||||||
|
|
||||||
|
ngircd (16~rc1-0ab1) unstable; urgency=low
|
||||||
|
|
||||||
|
* New "upstream" release candidate 1 for ngIRCd Release 16.
|
||||||
|
|
||||||
|
-- Alexander Barton <alex@barton.de> Thu, 25 Mar 2010 15:56:03 +0200
|
||||||
|
|
||||||
|
ngircd (15-0ab1) unstable; urgency=low
|
||||||
|
|
||||||
|
* New "upstream" release: ngIRCd 15.
|
||||||
|
|
||||||
|
-- Alexander Barton <alex@barton.de> Thu, 7 Nov 2009 12:07:08 +0200
|
||||||
|
|
||||||
|
ngircd (15~rc1-0ab1) unstable; urgency=low
|
||||||
|
|
||||||
|
* New "upstream" release candidate 1 for ngIRCd Release 15.
|
||||||
|
|
||||||
|
-- Alexander Barton <alex@barton.de> Thu, 15 Oct 2009 10:01:08 +0200
|
||||||
|
|
||||||
ngircd (14.1-0ab1) unstable; urgency=high
|
ngircd (14.1-0ab1) unstable; urgency=high
|
||||||
|
|
||||||
* New "upstream" release ngIRCd 14.1, fixing a security-related bug.
|
* New "upstream" release ngIRCd 14.1, fixing a security-related bug.
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
#
|
#
|
||||||
# ngIRCd start and stop script for Debian-based systems
|
# ngIRCd start and stop script for Debian-based systems
|
||||||
# Copyright 2008,2009 Alexander Barton <alex@barton.de>
|
# Copyright 2008-2010 Alexander Barton <alex@barton.de>
|
||||||
#
|
#
|
||||||
|
|
||||||
### BEGIN INIT INFO
|
### BEGIN INIT INFO
|
||||||
# Provides: ngircd ircd
|
# Provides: ngircd
|
||||||
# Required-Start: $network $local_fs
|
# Required-Start: $network $remote_fs
|
||||||
# Required-Stop:
|
# Required-Stop: $network $remote_fs
|
||||||
# Should-Start: $syslog $named
|
# Should-Start: $syslog $named
|
||||||
# Should-Stop: $syslog
|
# Should-Stop: $syslog
|
||||||
# Default-Start: 2 3 4 5
|
# Default-Start: 2 3 4 5
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ configure-ngircd-full: configure
|
|||||||
--sysconfdir=/etc/ngircd \
|
--sysconfdir=/etc/ngircd \
|
||||||
--mandir=\$${prefix}/share/man \
|
--mandir=\$${prefix}/share/man \
|
||||||
--with-syslog --with-zlib \
|
--with-syslog --with-zlib \
|
||||||
--with-gnutls --with-ident --with-tcp-wrappers \
|
--with-gnutls --with-ident --with-tcp-wrappers --with-pam \
|
||||||
--enable-ipv6
|
--enable-ipv6
|
||||||
|
|
||||||
configure-ngircd-full-dbg: configure
|
configure-ngircd-full-dbg: configure
|
||||||
@@ -66,7 +66,7 @@ configure-ngircd-full-dbg: configure
|
|||||||
--mandir=\$${prefix}/share/man \
|
--mandir=\$${prefix}/share/man \
|
||||||
--enable-debug --enable-sniffer \
|
--enable-debug --enable-sniffer \
|
||||||
--with-syslog --with-zlib \
|
--with-syslog --with-zlib \
|
||||||
--with-gnutls --with-ident --with-tcp-wrappers \
|
--with-gnutls --with-ident --with-tcp-wrappers --with-pam \
|
||||||
--enable-ipv6
|
--enable-ipv6
|
||||||
|
|
||||||
build:
|
build:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2009 Alexander Barton (alex@barton.de).
|
* Copyright (c)2001-2010 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
|
||||||
@@ -51,6 +51,9 @@
|
|||||||
/* Define if IPV6 protocol should be enabled */
|
/* Define if IPV6 protocol should be enabled */
|
||||||
#define WANT_IPV6 1
|
#define WANT_IPV6 1
|
||||||
|
|
||||||
|
/* Define if PAM should be used */
|
||||||
|
#define PAM 1
|
||||||
|
|
||||||
/* -- Supported features -- */
|
/* -- Supported features -- */
|
||||||
|
|
||||||
/* Define if SSP C support is enabled. */
|
/* Define if SSP C support is enabled. */
|
||||||
@@ -71,6 +74,8 @@
|
|||||||
#define HAVE_STDBOOL_H 1
|
#define HAVE_STDBOOL_H 1
|
||||||
/* Define to 1 if you have the <arpa/inet.h> header file. */
|
/* Define to 1 if you have the <arpa/inet.h> header file. */
|
||||||
#define HAVE_ARPA_INET_H 1
|
#define HAVE_ARPA_INET_H 1
|
||||||
|
/* Define to 1 if you have the <netinet/ip.h> header file. */
|
||||||
|
#define HAVE_NETINET_IP_H 1
|
||||||
|
|
||||||
/* Define to 1 if you have the `kqueue' function. */
|
/* Define to 1 if you have the `kqueue' function. */
|
||||||
#define HAVE_KQUEUE 1
|
#define HAVE_KQUEUE 1
|
||||||
@@ -92,6 +97,8 @@
|
|||||||
#define HAVE_GETADDRINFO 1
|
#define HAVE_GETADDRINFO 1
|
||||||
/* Define to 1 if you have the `getnameinfo' function. */
|
/* Define to 1 if you have the `getnameinfo' function. */
|
||||||
#define HAVE_GETNAMEINFO 1
|
#define HAVE_GETNAMEINFO 1
|
||||||
|
/* Define to 1 if you have the `sigaction' function. */
|
||||||
|
#define HAVE_SIGACTION 1
|
||||||
|
|
||||||
/* Define if socklen_t exists */
|
/* Define if socklen_t exists */
|
||||||
#define HAVE_socklen_t 1
|
#define HAVE_socklen_t 1
|
||||||
@@ -103,4 +110,11 @@
|
|||||||
#define HAVE_DNSSERVICEREGISTRATIONCREATE 1
|
#define HAVE_DNSSERVICEREGISTRATIONCREATE 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef PAM
|
||||||
|
/* Define to 1 if you have the `pam_authenticate' function. */
|
||||||
|
#define HAVE_PAM_AUTHENTICATE 1
|
||||||
|
/* Define to 1 if you have the <pam/pam_appl.h> header file. */
|
||||||
|
#define HAVE_PAM_PAM_APPL_H 1
|
||||||
|
#endif
|
||||||
|
|
||||||
/* -eof- */
|
/* -eof- */
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\qc\pardirnatural
|
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\qc\pardirnatural
|
||||||
|
|
||||||
\f0\i\fs24 \cf0 ngIRCd -- The Next Generation IRC Daemon\
|
\f0\i\fs24 \cf0 ngIRCd -- The Next Generation IRC Daemon\
|
||||||
Copyright (c)2001-2009 Alexander Barton and Contributors.\
|
Copyright (c)2001-2010 Alexander Barton and Contributors.\
|
||||||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural
|
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural
|
||||||
|
|
||||||
\i0 \cf0 \
|
\i0 \cf0 \
|
||||||
@@ -187,4 +187,4 @@ To disable automatic starting of ngIRCd, use this command:\
|
|||||||
\ls2\ilvl0
|
\ls2\ilvl0
|
||||||
\f1\fs24 \cf0 sudo launchctl unload -w \\\
|
\f1\fs24 \cf0 sudo launchctl unload -w \\\
|
||||||
/Library/LaunchDaemons/de.barton.ngircd.plist\
|
/Library/LaunchDaemons/de.barton.ngircd.plist\
|
||||||
}]]></resource></locale></resources><flags/><item type="file">01ngircd.xml</item><item type="file">02de.xml</item><mod>properties.customizeOption</mod><mod>properties.title</mod><mod>description</mod><mod>properties.anywhereDomain</mod><mod>properties.systemDomain</mod></pkmkdoc>
|
}]]></resource></locale></resources><flags/><item type="file">01ngircd.xml</item><item type="file">02de.xml</item><mod>properties.customizeOption</mod><mod>properties.title</mod><mod>description</mod><mod>properties.anywhereDomain</mod><mod>properties.systemDomain</mod></pkmkdoc>
|
||||||
|
|||||||
@@ -7,6 +7,8 @@
|
|||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
|
FA2D564A11EA158B00D37A35 /* pam.c in Sources */ = {isa = PBXBuildFile; fileRef = FA2D564911EA158B00D37A35 /* pam.c */; };
|
||||||
|
FA2D567B11EA1AB300D37A35 /* libpam.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FA2D567A11EA1AB300D37A35 /* libpam.dylib */; };
|
||||||
FA322D350CEF74B1001761B3 /* array.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CD90CEF74B1001761B3 /* array.c */; };
|
FA322D350CEF74B1001761B3 /* array.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CD90CEF74B1001761B3 /* array.c */; };
|
||||||
FA322D360CEF74B1001761B3 /* channel.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CDB0CEF74B1001761B3 /* channel.c */; };
|
FA322D360CEF74B1001761B3 /* channel.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CDB0CEF74B1001761B3 /* channel.c */; };
|
||||||
FA322D370CEF74B1001761B3 /* client.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CDD0CEF74B1001761B3 /* client.c */; };
|
FA322D370CEF74B1001761B3 /* client.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CDD0CEF74B1001761B3 /* client.c */; };
|
||||||
@@ -35,7 +37,10 @@
|
|||||||
FA322DBE0CEF7766001761B3 /* tool.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D330CEF74B1001761B3 /* tool.c */; };
|
FA322DBE0CEF7766001761B3 /* tool.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D330CEF74B1001761B3 /* tool.c */; };
|
||||||
FA322DC10CEF77CB001761B3 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FA322DC00CEF77CB001761B3 /* libz.dylib */; };
|
FA322DC10CEF77CB001761B3 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FA322DC00CEF77CB001761B3 /* libz.dylib */; };
|
||||||
FA407F2E0DB159F400271AF1 /* ng_ipaddr.c in Sources */ = {isa = PBXBuildFile; fileRef = FA407F2C0DB159F400271AF1 /* ng_ipaddr.c */; };
|
FA407F2E0DB159F400271AF1 /* ng_ipaddr.c in Sources */ = {isa = PBXBuildFile; fileRef = FA407F2C0DB159F400271AF1 /* ng_ipaddr.c */; };
|
||||||
|
FA85178C0FA061EC006A1F5A /* op.c in Sources */ = {isa = PBXBuildFile; fileRef = FA85178B0FA061EC006A1F5A /* op.c */; };
|
||||||
|
FA99428C10E82A27007F27ED /* proc.c in Sources */ = {isa = PBXBuildFile; fileRef = FA99428B10E82A27007F27ED /* proc.c */; };
|
||||||
FAA3D27B0F139CDC00B2447E /* conn-ssl.c in Sources */ = {isa = PBXBuildFile; fileRef = FAA3D2790F139CDC00B2447E /* conn-ssl.c */; };
|
FAA3D27B0F139CDC00B2447E /* conn-ssl.c in Sources */ = {isa = PBXBuildFile; fileRef = FAA3D2790F139CDC00B2447E /* conn-ssl.c */; };
|
||||||
|
FAA97C57124A271400D5BBA9 /* sighandlers.c in Sources */ = {isa = PBXBuildFile; fileRef = FAA97C55124A271400D5BBA9 /* sighandlers.c */; };
|
||||||
FAE5CC2E0CF2308A007D69B6 /* numeric.c in Sources */ = {isa = PBXBuildFile; fileRef = FAE5CC2D0CF2308A007D69B6 /* numeric.c */; };
|
FAE5CC2E0CF2308A007D69B6 /* numeric.c in Sources */ = {isa = PBXBuildFile; fileRef = FAE5CC2D0CF2308A007D69B6 /* numeric.c */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
@@ -54,6 +59,9 @@
|
|||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
FA1A6BBC0D6857BB00AA8F71 /* misc-test.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "misc-test.e"; sourceTree = "<group>"; };
|
FA1A6BBC0D6857BB00AA8F71 /* misc-test.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "misc-test.e"; sourceTree = "<group>"; };
|
||||||
FA1A6BBD0D6857D900AA8F71 /* who-test.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "who-test.e"; sourceTree = "<group>"; };
|
FA1A6BBD0D6857D900AA8F71 /* who-test.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "who-test.e"; sourceTree = "<group>"; };
|
||||||
|
FA2D564811EA158B00D37A35 /* pam.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pam.h; sourceTree = "<group>"; };
|
||||||
|
FA2D564911EA158B00D37A35 /* pam.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pam.c; sourceTree = "<group>"; };
|
||||||
|
FA2D567A11EA1AB300D37A35 /* libpam.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libpam.dylib; path = usr/lib/libpam.dylib; sourceTree = SDKROOT; };
|
||||||
FA322BBA0CEF72E4001761B3 /* ngIRCd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ngIRCd; sourceTree = BUILT_PRODUCTS_DIR; };
|
FA322BBA0CEF72E4001761B3 /* ngIRCd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ngIRCd; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
FA322CD60CEF74B1001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
|
FA322CD60CEF74B1001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
|
||||||
FA322CD90CEF74B1001761B3 /* array.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = array.c; sourceTree = "<group>"; };
|
FA322CD90CEF74B1001761B3 /* array.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = array.c; sourceTree = "<group>"; };
|
||||||
@@ -193,6 +201,10 @@
|
|||||||
FA407F2C0DB159F400271AF1 /* ng_ipaddr.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = ng_ipaddr.c; path = ipaddr/ng_ipaddr.c; sourceTree = "<group>"; };
|
FA407F2C0DB159F400271AF1 /* ng_ipaddr.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = ng_ipaddr.c; path = ipaddr/ng_ipaddr.c; sourceTree = "<group>"; };
|
||||||
FA407F2D0DB159F400271AF1 /* ng_ipaddr.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = ng_ipaddr.h; path = ipaddr/ng_ipaddr.h; sourceTree = "<group>"; };
|
FA407F2D0DB159F400271AF1 /* ng_ipaddr.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = ng_ipaddr.h; path = ipaddr/ng_ipaddr.h; sourceTree = "<group>"; };
|
||||||
FA407F380DB15AC700271AF1 /* GIT.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = GIT.txt; sourceTree = "<group>"; };
|
FA407F380DB15AC700271AF1 /* GIT.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = GIT.txt; sourceTree = "<group>"; };
|
||||||
|
FA85178A0FA061EC006A1F5A /* op.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = op.h; sourceTree = "<group>"; };
|
||||||
|
FA85178B0FA061EC006A1F5A /* op.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = op.c; sourceTree = "<group>"; };
|
||||||
|
FA99428A10E82A27007F27ED /* proc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = proc.h; sourceTree = "<group>"; };
|
||||||
|
FA99428B10E82A27007F27ED /* proc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = proc.c; sourceTree = "<group>"; };
|
||||||
FAA3D2700F139CB300B2447E /* invite-test.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "invite-test.e"; sourceTree = "<group>"; };
|
FAA3D2700F139CB300B2447E /* invite-test.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "invite-test.e"; sourceTree = "<group>"; };
|
||||||
FAA3D2710F139CB300B2447E /* join-test.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "join-test.e"; sourceTree = "<group>"; };
|
FAA3D2710F139CB300B2447E /* join-test.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "join-test.e"; sourceTree = "<group>"; };
|
||||||
FAA3D2720F139CB300B2447E /* kick-test.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "kick-test.e"; sourceTree = "<group>"; };
|
FAA3D2720F139CB300B2447E /* kick-test.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "kick-test.e"; sourceTree = "<group>"; };
|
||||||
@@ -215,6 +227,8 @@
|
|||||||
FAA3D2880F139D2E00B2447E /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
|
FAA3D2880F139D2E00B2447E /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
|
||||||
FAA3D28A0F139D2E00B2447E /* postinstall.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = postinstall.sh; sourceTree = "<group>"; };
|
FAA3D28A0F139D2E00B2447E /* postinstall.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = postinstall.sh; sourceTree = "<group>"; };
|
||||||
FAA3D28B0F139D2E00B2447E /* preinstall.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = preinstall.sh; sourceTree = "<group>"; };
|
FAA3D28B0F139D2E00B2447E /* preinstall.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = preinstall.sh; sourceTree = "<group>"; };
|
||||||
|
FAA97C55124A271400D5BBA9 /* sighandlers.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = sighandlers.c; sourceTree = "<group>"; };
|
||||||
|
FAA97C56124A271400D5BBA9 /* sighandlers.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = sighandlers.h; sourceTree = "<group>"; };
|
||||||
FAE5CC2C0CF2308A007D69B6 /* numeric.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = numeric.h; sourceTree = "<group>"; };
|
FAE5CC2C0CF2308A007D69B6 /* numeric.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = numeric.h; sourceTree = "<group>"; };
|
||||||
FAE5CC2D0CF2308A007D69B6 /* numeric.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = numeric.c; sourceTree = "<group>"; };
|
FAE5CC2D0CF2308A007D69B6 /* numeric.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = numeric.c; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
@@ -225,6 +239,7 @@
|
|||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
FA322DC10CEF77CB001761B3 /* libz.dylib in Frameworks */,
|
FA322DC10CEF77CB001761B3 /* libz.dylib in Frameworks */,
|
||||||
|
FA2D567B11EA1AB300D37A35 /* libpam.dylib in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -251,6 +266,7 @@
|
|||||||
FA322D630CEF750F001761B3 /* Makefile.am */,
|
FA322D630CEF750F001761B3 /* Makefile.am */,
|
||||||
1AB674ADFE9D54B511CA2CBB /* Products */,
|
1AB674ADFE9D54B511CA2CBB /* Products */,
|
||||||
FA322DC00CEF77CB001761B3 /* libz.dylib */,
|
FA322DC00CEF77CB001761B3 /* libz.dylib */,
|
||||||
|
FA2D567A11EA1AB300D37A35 /* libpam.dylib */,
|
||||||
);
|
);
|
||||||
name = ngIRCd;
|
name = ngIRCd;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -332,12 +348,20 @@
|
|||||||
FA322D070CEF74B1001761B3 /* ngircd.h */,
|
FA322D070CEF74B1001761B3 /* ngircd.h */,
|
||||||
FAE5CC2D0CF2308A007D69B6 /* numeric.c */,
|
FAE5CC2D0CF2308A007D69B6 /* numeric.c */,
|
||||||
FAE5CC2C0CF2308A007D69B6 /* numeric.h */,
|
FAE5CC2C0CF2308A007D69B6 /* numeric.h */,
|
||||||
|
FA85178A0FA061EC006A1F5A /* op.h */,
|
||||||
|
FA85178B0FA061EC006A1F5A /* op.c */,
|
||||||
FA322D080CEF74B1001761B3 /* parse.c */,
|
FA322D080CEF74B1001761B3 /* parse.c */,
|
||||||
FA322D090CEF74B1001761B3 /* parse.h */,
|
FA322D090CEF74B1001761B3 /* parse.h */,
|
||||||
|
FA99428B10E82A27007F27ED /* proc.c */,
|
||||||
|
FA99428A10E82A27007F27ED /* proc.h */,
|
||||||
FA322D0A0CEF74B1001761B3 /* rendezvous.c */,
|
FA322D0A0CEF74B1001761B3 /* rendezvous.c */,
|
||||||
FA322D0B0CEF74B1001761B3 /* rendezvous.h */,
|
FA322D0B0CEF74B1001761B3 /* rendezvous.h */,
|
||||||
FA322D0C0CEF74B1001761B3 /* resolve.c */,
|
FA322D0C0CEF74B1001761B3 /* resolve.c */,
|
||||||
FA322D0D0CEF74B1001761B3 /* resolve.h */,
|
FA322D0D0CEF74B1001761B3 /* resolve.h */,
|
||||||
|
FAA97C55124A271400D5BBA9 /* sighandlers.c */,
|
||||||
|
FAA97C56124A271400D5BBA9 /* sighandlers.h */,
|
||||||
|
FA2D564811EA158B00D37A35 /* pam.h */,
|
||||||
|
FA2D564911EA158B00D37A35 /* pam.c */,
|
||||||
);
|
);
|
||||||
path = ngircd;
|
path = ngircd;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -676,6 +700,10 @@
|
|||||||
FAE5CC2E0CF2308A007D69B6 /* numeric.c in Sources */,
|
FAE5CC2E0CF2308A007D69B6 /* numeric.c in Sources */,
|
||||||
FA407F2E0DB159F400271AF1 /* ng_ipaddr.c in Sources */,
|
FA407F2E0DB159F400271AF1 /* ng_ipaddr.c in Sources */,
|
||||||
FAA3D27B0F139CDC00B2447E /* conn-ssl.c in Sources */,
|
FAA3D27B0F139CDC00B2447E /* conn-ssl.c in Sources */,
|
||||||
|
FA85178C0FA061EC006A1F5A /* op.c in Sources */,
|
||||||
|
FA99428C10E82A27007F27ED /* proc.c in Sources */,
|
||||||
|
FA2D564A11EA158B00D37A35 /* pam.c in Sources */,
|
||||||
|
FAA97C57124A271400D5BBA9 /* sighandlers.c in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -712,10 +740,9 @@
|
|||||||
1DEB928B08733DD80010E9CD /* Default */ = {
|
1DEB928B08733DD80010E9CD /* Default */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ARCHS = (
|
ARCHS = "$(ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1)";
|
||||||
ppc,
|
ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1 = "x86_64 i386 ppc";
|
||||||
i386,
|
GCC_VERSION = 4.0;
|
||||||
);
|
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
PREBINDING = NO;
|
PREBINDING = NO;
|
||||||
@@ -723,6 +750,50 @@
|
|||||||
};
|
};
|
||||||
name = Default;
|
name = Default;
|
||||||
};
|
};
|
||||||
|
FAB0570C105D917F006AF9E2 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ARCHS = "$(ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1)";
|
||||||
|
ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1 = "x86_64 i386 ppc";
|
||||||
|
GCC_DEBUGGING_SYMBOLS = full;
|
||||||
|
GCC_OPTIMIZATION_LEVEL = 0;
|
||||||
|
GCC_VERSION = 4.0;
|
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||||
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
|
PREBINDING = NO;
|
||||||
|
SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
FAB0570D105D917F006AF9E2 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ARCHS = "$(NATIVE_ARCH_ACTUAL)";
|
||||||
|
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
|
||||||
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
|
GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
|
||||||
|
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
|
||||||
|
GCC_WARN_CHECK_SWITCH_STATEMENTS = YES;
|
||||||
|
GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
|
||||||
|
GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES;
|
||||||
|
GCC_WARN_MISSING_PARENTHESES = YES;
|
||||||
|
GCC_WARN_PEDANTIC = YES;
|
||||||
|
GCC_WARN_SHADOW = YES;
|
||||||
|
GCC_WARN_SIGN_COMPARE = YES;
|
||||||
|
GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
|
||||||
|
GCC_WARN_UNINITIALIZED_AUTOS = NO;
|
||||||
|
GCC_WARN_UNKNOWN_PRAGMAS = YES;
|
||||||
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
|
GCC_WARN_UNUSED_LABEL = YES;
|
||||||
|
GCC_WARN_UNUSED_PARAMETER = YES;
|
||||||
|
GCC_WARN_UNUSED_VALUE = YES;
|
||||||
|
INSTALL_PATH = /usr/local/bin;
|
||||||
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
|
PRODUCT_NAME = ngIRCd;
|
||||||
|
SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
/* End XCBuildConfiguration section */
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
/* Begin XCConfigurationList section */
|
/* Begin XCConfigurationList section */
|
||||||
@@ -730,6 +801,7 @@
|
|||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
1DEB928708733DD80010E9CD /* Default */,
|
1DEB928708733DD80010E9CD /* Default */,
|
||||||
|
FAB0570D105D917F006AF9E2 /* Debug */,
|
||||||
);
|
);
|
||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
defaultConfigurationName = Default;
|
defaultConfigurationName = Default;
|
||||||
@@ -738,6 +810,7 @@
|
|||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
1DEB928B08733DD80010E9CD /* Default */,
|
1DEB928B08733DD80010E9CD /* Default */,
|
||||||
|
FAB0570C105D917F006AF9E2 /* Debug */,
|
||||||
);
|
);
|
||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
defaultConfigurationName = Default;
|
defaultConfigurationName = Default;
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
SUBDIRS = Debian MacOSX
|
SUBDIRS = Debian MacOSX
|
||||||
|
|
||||||
EXTRA_DIST = README ngircd.spec systrace.policy ngindent ngircd-bsd.sh \
|
EXTRA_DIST = README ngircd.spec systrace.policy ngindent ngircd-bsd.sh \
|
||||||
ngircd-redhat.init
|
ngircd-redhat.init platformtest.sh
|
||||||
|
|
||||||
maintainer-clean-local:
|
maintainer-clean-local:
|
||||||
rm -f Makefile Makefile.in
|
rm -f Makefile Makefile.in
|
||||||
|
|||||||
@@ -28,5 +28,8 @@ ngircd-redhat.init
|
|||||||
ngircd.spec
|
ngircd.spec
|
||||||
- RPM "spec" file.
|
- RPM "spec" file.
|
||||||
|
|
||||||
|
platformtest.sh
|
||||||
|
- Build ngIRCd and output a "result line" suitable for doc/Platforms.txt.
|
||||||
|
|
||||||
systrace.policy
|
systrace.policy
|
||||||
- Systrace policy file for OpenBSD (and probably NetBSD).
|
- Systrace policy file for OpenBSD (and probably NetBSD).
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
%define name ngircd
|
%define name ngircd
|
||||||
%define version 14.1
|
%define version 17~rc2
|
||||||
%define release 1
|
%define release 1
|
||||||
%define prefix %{_prefix}
|
%define prefix %{_prefix}
|
||||||
|
|
||||||
|
|||||||
143
contrib/platformtest.sh
Executable file
143
contrib/platformtest.sh
Executable file
@@ -0,0 +1,143 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# ngIRCd -- The Next Generation IRC Daemon
|
||||||
|
# Copyright (c)2001-2010 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
# This script analyzes the build process of ngIRCd and generates output
|
||||||
|
# suitable for inclusion in doc/Platforms.txt -- please send reports
|
||||||
|
# to the ngIRCd mailing list: <ngircd-ml@ngircd.barton.de>.
|
||||||
|
|
||||||
|
NAME=`basename "$0"`
|
||||||
|
VERBOSE=
|
||||||
|
|
||||||
|
PLATFORM=
|
||||||
|
COMPILER="unknown"
|
||||||
|
VERSION="unknown"
|
||||||
|
DATE=`date "+%y-%m-%d"`
|
||||||
|
|
||||||
|
CONFIGURE=
|
||||||
|
MAKE=
|
||||||
|
CHECK=
|
||||||
|
RUN=
|
||||||
|
COMMENT=
|
||||||
|
|
||||||
|
while [ $# -gt 0 ]; do
|
||||||
|
case "$1" in
|
||||||
|
"-v")
|
||||||
|
VERBOSE=1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Usage: $NAME [-v]"
|
||||||
|
exit 2
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "$NAME: Checking ngIRCd base source directory ..."
|
||||||
|
grep "ngIRCd" ./ChangeLog >/dev/null 2>&1
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
grep "ngIRCd" ../ChangeLog >/dev/null 2>&1
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "$NAME: ngIRCd base source directory not found!?"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
cd ..
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$NAME: Checking for ./autogen.sh script ..."
|
||||||
|
if [ -e ./autogen.sh ]; then
|
||||||
|
echo "$NAME: Running ./autogen.sh ..."
|
||||||
|
[ -n "$VERBOSE" ] && ./autogen.sh || ./autogen.sh >/dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -e ./configure ]; then
|
||||||
|
echo "$NAME: Running \"./configure\" script ..."
|
||||||
|
[ -n "$VERBOSE" ] && ./configure || ./configure >/dev/null
|
||||||
|
if [ $? -eq 0 -a -e ./Makefile ]; then
|
||||||
|
CONFIGURE=1
|
||||||
|
echo "$NAME: Running \"make\" ..."
|
||||||
|
[ -n "$VERBOSE" ] && make || make >/dev/null
|
||||||
|
if [ $? -eq 0 -a -x src/ngircd/ngircd ]; then
|
||||||
|
MAKE=1
|
||||||
|
echo "$NAME: Running \"make check\" ..."
|
||||||
|
[ -n "$VERBOSE" ] && make check || make check >/dev/null
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
CHECK=1
|
||||||
|
RUN=$CHECK
|
||||||
|
else
|
||||||
|
./src/ngircd/ngircd --help 2>/dev/null \
|
||||||
|
| grep "^ngircd" >/dev/null
|
||||||
|
[ $? -eq 0 ] && RUN=1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Get target platform information
|
||||||
|
if [ -r "src/config.h" ]; then
|
||||||
|
CPU=`grep "TARGET_CPU" "src/config.h" | cut -d'"' -f2`
|
||||||
|
OS=`grep "TARGET_OS" "src/config.h" | cut -d'"' -f2`
|
||||||
|
VENDOR=`grep "TARGET_VENDOR" "src/config.h" | cut -d'"' -f2`
|
||||||
|
PLATFORM="$CPU/$VENDOR/$OS"
|
||||||
|
fi
|
||||||
|
if [ -z "$PLATFORM" ]; then
|
||||||
|
PLATFORM="`uname 2>/dev/null` `uname -r 2>/dev/null`, `uname -m 2>/dev/null`"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Get compiler information
|
||||||
|
if [ -r "Makefile" ]; then
|
||||||
|
CC=$(grep "^CC = " Makefile | cut -d' ' -f3)
|
||||||
|
$CC --version 2>&1 | grep -i "GCC" >/dev/null
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
COMPILER=$($CC --version | head -n 1 | awk "{ print \$3 }" \
|
||||||
|
| cut -d'-' -f1)
|
||||||
|
COMPILER="gcc $COMPILER"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Get ngIRCd version information
|
||||||
|
eval $(grep "^VERSION = " Makefile | sed -e 's/ //g')
|
||||||
|
case "$VERSION" in
|
||||||
|
*-*-*)
|
||||||
|
VERSION=`echo "$VERSION" | cut -d'-' -f3 | cut -b2-`
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
[ -n "$VERSION" ] || VERSION="unknown"
|
||||||
|
|
||||||
|
# Get IO interface information
|
||||||
|
if [ "$OS" = "linux-gnu" ]; then
|
||||||
|
COMMENT="(1)"
|
||||||
|
else
|
||||||
|
grep "^#define HAVE_SYS_DEVPOLL_H 1" src/config.h >/dev/null 2>&1
|
||||||
|
[ $? -eq 0 ] && COMMENT="(4)"
|
||||||
|
grep "^#define HAVE_EPOLL_CREATE 1" src/config.h >/dev/null 2>&1
|
||||||
|
[ $? -eq 0 ] && COMMENT="(5)"
|
||||||
|
grep "^#define HAVE_KQUEUE 1" src/config.h >/dev/null 2>&1
|
||||||
|
[ $? -eq 0 ] && COMMENT="(3)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
[ -n "$CONFIGURE" ] && C="Y" || C="N"
|
||||||
|
[ -n "$MAKE" ] && M="Y" || M="N"
|
||||||
|
[ -n "$CHECK" ] && T="Y" || T="N"
|
||||||
|
[ -n "$RUN" ] && R="Y" || R="N"
|
||||||
|
[ -n "$COMMENT" ] && COMMENT=" $COMMENT"
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo " the executable works (\"runs\") as expected --+"
|
||||||
|
echo " tests run successfully (\"make check\") --+ |"
|
||||||
|
echo " ngIRCd compiles (\"make\") --+ | |"
|
||||||
|
echo " ./configure works --+ | | |"
|
||||||
|
echo " | | | |"
|
||||||
|
echo "Platform Compiler ngIRCd Date Tester C M T R See"
|
||||||
|
echo "--------------------------- ------------ ---------- -------- ------ - - - - ---"
|
||||||
|
printf "%-27s %-12s %-10s %s %-6s %s %s %s %s%s" \
|
||||||
|
"$PLATFORM" "$COMPILER" "$VERSION" "$DATE" "$USER" \
|
||||||
|
"$C" "$M" "$T" "$R" "$COMMENT"
|
||||||
|
echo; echo
|
||||||
53
doc/Bopm.txt
Normal file
53
doc/Bopm.txt
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
|
||||||
|
ngIRCd - Next Generation IRC Server
|
||||||
|
|
||||||
|
(c)2001-2010 Alexander Barton,
|
||||||
|
alex@barton.de, http://www.barton.de/
|
||||||
|
|
||||||
|
ngIRCd is free software and published under the
|
||||||
|
terms of the GNU General Public License.
|
||||||
|
|
||||||
|
-- BOPM.txt --
|
||||||
|
|
||||||
|
|
||||||
|
I. Introduction
|
||||||
|
~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Citing <http://wiki.blitzed.org/BOPM>: "BOPM is an open source open proxy
|
||||||
|
monitor, designed for use with hybrid-based ircds, although it can be used
|
||||||
|
with slight modification on any server which has the ability to show connects
|
||||||
|
to opers and that supports KLINEs."
|
||||||
|
|
||||||
|
And starting with Release 17, ngIRCd supports all required log messages that
|
||||||
|
BOPM requires to be useful.
|
||||||
|
|
||||||
|
II. Installation
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Install BOPM as usual, please see the BOPM documentation for details.
|
||||||
|
Afterwards adjust the following configuration parameters that are important
|
||||||
|
for ngIRCd:
|
||||||
|
|
||||||
|
a) BOPM "IRC" section:
|
||||||
|
|
||||||
|
1) Set "server" and "port" accordingly,
|
||||||
|
|
||||||
|
2) adjust the "oper" line to match an [Operator] block in ngircd.conf,
|
||||||
|
|
||||||
|
3) change "mode" to "+ci" or "+c".
|
||||||
|
|
||||||
|
4) Set "connregex" to the following string, everything in one line(!):
|
||||||
|
"\\*\\*\\* Notice -- Client connecting: ([^ ]+) \\(([^@]+)@([^\\)]+)\\) \\[([0-9\\.]+)\\].*";
|
||||||
|
and comment all the other "connregex" examples (prepend a "#" character).
|
||||||
|
|
||||||
|
5) Set "kline" to "KILL %n :Open proxy found on your host!"; for example,
|
||||||
|
and comment all the other "kline" examples.
|
||||||
|
|
||||||
|
b) BOPM "scanner" section:
|
||||||
|
|
||||||
|
Make sure you configure a valid "target_ip" and "target_port" for the
|
||||||
|
configured scanners to test. And please note that you CAN'T USE the port
|
||||||
|
of ngIRCd, because ngIRCd doesn't send any banner message by default!
|
||||||
|
|
||||||
|
So you need a service what sends a banner, so for example POP3, SMTP,
|
||||||
|
IMAP, or SSH daemons should work ...
|
||||||
28
doc/FAQ.txt
28
doc/FAQ.txt
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
ngIRCd - Next Generation IRC Server
|
ngIRCd - Next Generation IRC Server
|
||||||
|
|
||||||
(c)2001-2003 by Alexander Barton,
|
(c)2001-2010 by 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
|
||||||
@@ -12,9 +12,11 @@
|
|||||||
|
|
||||||
I. General
|
I. General
|
||||||
~~~~~~~~~~
|
~~~~~~~~~~
|
||||||
|
|
||||||
Q: Is it possible to link the ngIRCd with non-ngIRCd servers?
|
Q: Is it possible to link the ngIRCd with non-ngIRCd servers?
|
||||||
A: Yes. ngIRCd is compatible to the original ircd used by IRCNet. Actually
|
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. Please note that newer
|
||||||
|
versions (2.11.x) aren't compatible any more!
|
||||||
|
|
||||||
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://ngircd.barton.de/>.
|
A: Yes. Please visit <http://ngircd.barton.de/>.
|
||||||
@@ -26,6 +28,7 @@ A: ngIRCd offers several benefits: no problems with dynamic IPs, easy to
|
|||||||
|
|
||||||
II. Compilation
|
II. Compilation
|
||||||
~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Q: I did a "CVS checkout" but can't execute ./configure because the script
|
Q: I did a "CVS checkout" but can't execute ./configure because the script
|
||||||
is missing in the generated directory!?
|
is missing in the generated directory!?
|
||||||
A: When using development versions via CVS, the configure script as well as
|
A: When using development versions via CVS, the configure script as well as
|
||||||
@@ -55,27 +58,33 @@ III. Runtime
|
|||||||
~~~~~~~~~~~~
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
Q: Where is the log file located?
|
Q: Where is the log file located?
|
||||||
A: ngIRCd does not write its own log file. Instead, ngIRCd uses
|
A: ngIRCd does not write its own log file. Instead, ngIRCd uses syslog(3).
|
||||||
syslog(3). Check the files in /var/log/ and/or consult the
|
Check the files in /var/log/ and/or consult the documentation for your
|
||||||
documentation for your system logger daemon.
|
system logger daemon.
|
||||||
|
|
||||||
Q: I cannot connect to remote peers when I use the chroot option, the
|
Q: I cannot connect to remote peers when I use the chroot option, the
|
||||||
following is logged: "Can't resolve example.com: unknown error!".
|
following is logged: "Can't resolve example.com: unknown error!".
|
||||||
A: On Linux/glibc with chroot enabled you need to put some libraries inside
|
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
|
the chroot as well, notably libnss_dns; maybe others. Unfortunately, even
|
||||||
linking ngircd statically does not help this. The only known workaround
|
linking ngIRCd statically does not help this. The only known workaround
|
||||||
is to either disable chroot support or to link against dietlibc instead
|
is to either disable chroot support or to link against dietlibc instead
|
||||||
of glibc. (tnx to Sebastian Siewior)
|
of glibc. (tnx to Sebastian Siewior)
|
||||||
|
|
||||||
Q: I have added an [Oper] section, how do i log on as IRC operator?
|
Q: I have added an [Oper] section, how do i log on as IRC operator?
|
||||||
A: You can use the /OPER command in your IRC client to become an IRC operator.
|
A: You can use the /OPER command in your IRC client to become an IRC operator.
|
||||||
ngIRCd will also log all OPER requests (using syslog), if OPER fails you
|
ngIRCd will also log all OPER requests (using syslog), if OPER fails you
|
||||||
can look there to determine why it did not work (bad password, unauthorized
|
can look there to determine why it did not work (bad password, unauthorized
|
||||||
host mask, etc.)
|
host mask, etc.)
|
||||||
|
|
||||||
Q: I am an IRC operator, but MODE doesn't work!
|
Q: I am an IRC operator, but MODE doesn't work!
|
||||||
A: You need to set 'OperCanUseMode = yes' in ngircd.conf to enable MODE for IRC
|
A: You need to set 'OperCanUseMode = yes' in ngircd.conf, then IRC operators
|
||||||
operators.
|
can use the MODE command for changing modes even when they are not joined
|
||||||
|
to the specific channel.
|
||||||
|
|
||||||
|
|
||||||
IV. Bugs!?
|
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://ngircd.barton.de/bugzilla/index.cgi>. There you can file bug
|
at <http://ngircd.barton.de/bugzilla/index.cgi>. There you can file bug
|
||||||
@@ -85,6 +94,3 @@ Q: What should I do if I found a bug?
|
|||||||
A: Please file a bug report at <http://ngircd.barton.de/bugzilla/index.cgi>!
|
A: Please file a bug report at <http://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.12 2008/01/02 22:47:58 alex Exp $
|
|
||||||
|
|||||||
77
doc/HowToRelease.txt
Normal file
77
doc/HowToRelease.txt
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
|
||||||
|
ngIRCd - Next Generation IRC Server
|
||||||
|
|
||||||
|
(c)2001-2010 Alexander Barton,
|
||||||
|
alex@barton.de, http://www.barton.de/
|
||||||
|
|
||||||
|
ngIRCd is free software and published under the
|
||||||
|
terms of the GNU General Public License.
|
||||||
|
|
||||||
|
-- HowToRelease.txt --
|
||||||
|
|
||||||
|
|
||||||
|
I. Introduction
|
||||||
|
~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Creating a new ngIRCd release requires a few steps to follow: the source
|
||||||
|
tree must be in a releasable state (be up to date, include all required
|
||||||
|
patches, be tested on as many platforms as possible), a name for the new
|
||||||
|
release must be chosen, and all the files describing the release must be
|
||||||
|
updated accordingly.
|
||||||
|
|
||||||
|
Since ngIRCd release 13 (2009-12-25) we use "simple" release numbers for
|
||||||
|
major releases (e.g. "13", "17", "42", ...) introducing new features and
|
||||||
|
sub-releases for bug fixes only (e.g. "14.1", "22.3", ...).
|
||||||
|
|
||||||
|
When creating pre-releases or release candidates, please use the tilde ("~")
|
||||||
|
character to separate the "postfix" in the release number (e.g. "17~rc2"
|
||||||
|
or "123.4~rc6").
|
||||||
|
|
||||||
|
The release/version number of a build is automatically generated using the
|
||||||
|
GIT "describe" command, see git-describe(1). Therefore it is required that
|
||||||
|
a new release is tagged in the GIT tree and that the configure script is
|
||||||
|
up-to-date (e.g. using ./autogen.sh) before generating the archives!
|
||||||
|
|
||||||
|
|
||||||
|
II. How to prepare a new ngIRCd release?
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
a) Make sure the source tree is in a releasable state ;-)
|
||||||
|
|
||||||
|
b) Make sure you have working versions of GNU autoconf and GNU automake
|
||||||
|
installed on the system you use for generating the release:
|
||||||
|
as of October 2010 we are using GNU autoconf 2.61 and GNU automake 1.10.1
|
||||||
|
which seem to work just fine.
|
||||||
|
|
||||||
|
c) Update the files describing the new release:
|
||||||
|
- ChangeLog
|
||||||
|
- NEWS
|
||||||
|
|
||||||
|
d) Update the version numbers in the following files:
|
||||||
|
- contrib/ngircd.spec
|
||||||
|
|
||||||
|
e) Generate a new Debian change log entry in the following file, e.g. using
|
||||||
|
the Debian "dch" tool of the "devscripts" package:
|
||||||
|
- contrib/Debian/changelog
|
||||||
|
|
||||||
|
f) Commit the above changes to GIT: "git add", "git commit"
|
||||||
|
|
||||||
|
g) Create a new signed GIT tag for the new release: "git tag -s".
|
||||||
|
Please note that we don't use the tilde ("~") here, instead use a simple
|
||||||
|
hyphen ("-") as delimiter: e.g. "rel-16" "rel-17-rc1", "rel-18-pre2", ...
|
||||||
|
|
||||||
|
h) Run "./autogen.sh" to update the ./configure script with the correct
|
||||||
|
release number (autogenerated using "git describe", see above).
|
||||||
|
|
||||||
|
i) Run "./configure" to rebuild all generated Makefiles.
|
||||||
|
|
||||||
|
j) Run "make distcheck" to generate the distribution archives.
|
||||||
|
|
||||||
|
k) Sign the distribution archive(s) using GnuPG: "gpg -b <archivefile>"
|
||||||
|
|
||||||
|
l) Upload and distribute the newly generated ngIRCd release archive(s)
|
||||||
|
and GnuPG signatures.
|
||||||
|
|
||||||
|
m) Write an announcement to the mailing list, freshmeat, Twitter, ...
|
||||||
|
|
||||||
|
n) Relax :-)
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#
|
#
|
||||||
# ngIRCd -- The Next Generation IRC Daemon
|
# ngIRCd -- The Next Generation IRC Daemon
|
||||||
# Copyright (c)2001-2008 Alexander Barton (alex@barton.de)
|
# Copyright (c)2001-2010 Alexander Barton (alex@barton.de)
|
||||||
#
|
#
|
||||||
# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||||
# der GNU General Public License (GPL), wie von der Free Software Foundation
|
# der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||||
@@ -14,13 +14,11 @@ SUBDIRS = src
|
|||||||
|
|
||||||
EXTRA_DIST = FAQ.txt GIT.txt Protocol.txt Platforms.txt README-AUX.txt \
|
EXTRA_DIST = FAQ.txt GIT.txt Protocol.txt Platforms.txt README-AUX.txt \
|
||||||
README-BeOS.txt RFC.txt Services.txt SSL.txt Zeroconf.txt \
|
README-BeOS.txt RFC.txt Services.txt SSL.txt Zeroconf.txt \
|
||||||
sample-ngircd.conf
|
HowToRelease.txt sample-ngircd.conf
|
||||||
|
|
||||||
maintainer-clean-local:
|
maintainer-clean-local:
|
||||||
rm -f Makefile Makefile.in
|
rm -f Makefile Makefile.in
|
||||||
|
|
||||||
docdir = $(datadir)/doc/$(PACKAGE)
|
|
||||||
|
|
||||||
documents = $(EXTRA_DIST) ../AUTHORS ../COPYING ../ChangeLog ../INSTALL \
|
documents = $(EXTRA_DIST) ../AUTHORS ../COPYING ../ChangeLog ../INSTALL \
|
||||||
../NEWS ../README
|
../NEWS ../README
|
||||||
|
|
||||||
|
|||||||
36
doc/PAM.txt
Normal file
36
doc/PAM.txt
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
|
||||||
|
ngIRCd - Next Generation IRC Server
|
||||||
|
|
||||||
|
(c)2001-2010 Alexander Barton,
|
||||||
|
alex@barton.de, http://www.barton.de/
|
||||||
|
|
||||||
|
ngIRCd is free software and published under the
|
||||||
|
terms of the GNU General Public License.
|
||||||
|
|
||||||
|
-- PAM.txt --
|
||||||
|
|
||||||
|
|
||||||
|
ngIRCd can optionally be compiled to use PAM, the Pluggable Authentication
|
||||||
|
Modules library, for user authentication. When compiled with PAM support,
|
||||||
|
ngIRCd will authenticate all users connecting to the daemon using the
|
||||||
|
configured PAM modules in an asynchronous child process.
|
||||||
|
|
||||||
|
To enable PAM, you have to pass the command line parameter "--with-pam" to
|
||||||
|
the "configure" script. Please see the PAM documentation ("man 7 pam") for
|
||||||
|
details and information about configuring PAM and its individual modules.
|
||||||
|
|
||||||
|
A very simple -- and quite useless ;-) -- example would be:
|
||||||
|
|
||||||
|
/etc/pam.d/ngircd:
|
||||||
|
auth required pam_debug.so
|
||||||
|
|
||||||
|
Here the "pam_debug" module will be called each time a client connects to
|
||||||
|
the ngIRCd and has sent its PASS, NICK, and USER commands.
|
||||||
|
|
||||||
|
Please note ONE VERY IMPORTANT THING:
|
||||||
|
|
||||||
|
All the PAM modules are executed with the privileges of the user ngIRCd
|
||||||
|
is running as. Therefore a lot of PAM modules aren't working as expected,
|
||||||
|
because they need root privileges ("pam_unix", for example)!
|
||||||
|
Only PAM modules not(!) requiring root privileges (such as "pam_pgsql",
|
||||||
|
"pam_mysql", "pam_opendirectory" ...) can be used in conjunction with ngIRCd.
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
ngIRCd - Next Generation IRC Server
|
ngIRCd - Next Generation IRC Server
|
||||||
|
|
||||||
(c)2001-2008 Alexander Barton
|
(c)2001-2010 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
|
||||||
@@ -30,26 +30,34 @@ alpha/unknown/netbsd3.0 gcc 3.3.3 CVSHEAD 06-05-07 fw Y Y Y Y (3)
|
|||||||
hppa/unknown/openbsd3.5 gcc 2.95.3 CVSHEAD 04-05-25 alex Y Y Y Y
|
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 13~rc1 08-12-02 alex Y Y Y Y
|
hppa2.0/unknown/linux-gnu gcc 3.3.5 13~rc1 08-12-02 alex Y Y Y Y
|
||||||
i386/apple/darwin9.5.1 gcc 4.0.1 13~rc1 08-12-02 alex Y Y Y Y (3)
|
hppa2.0w-hp-hpux11.11 gcc 4.2.3 14.1 09-07-22 goetz Y Y Y Y
|
||||||
|
i386/apple/darwin9.7.0 gcc 4.0.1 14.1 09-08-04 alex Y Y Y Y (3)
|
||||||
|
i386/apple/darwin10.4.0 gcc 4.2.1 17-dev 10-10-05 alex Y Y Y Y (3)
|
||||||
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/pc/solaris2.11 gcc 3.4.3 13~rc1 08-12-03 alex Y Y Y Y (4)
|
i386/pc/solaris2.11 gcc 3.4.3 14.1 09-08-03 alex Y Y Y Y (4)
|
||||||
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/freebsd6.0 gcc 3.4.4 0.10.0-p1 06-08-04 alex Y Y Y Y (3)
|
i386/unknown/freebsd6.0 gcc 3.4.4 0.10.0-p1 06-08-04 alex Y Y Y Y (3)
|
||||||
i386/unknown/freebsd6.1 gcc 3.4.4 CVSHEAD 06-05-07 fw Y Y Y Y (3)
|
i386/unknown/freebsd6.1 gcc 3.4.4 CVSHEAD 06-05-07 fw Y Y Y Y (3)
|
||||||
i386/unknown/freebsd6.2 gcc 3.4.6 13~rc1 08-12-04 alex Y Y Y Y (3)
|
i386/unknown/freebsd6.2 gcc 3.4.6 17-dev 10-10-05 alex Y Y Y Y (3)
|
||||||
i386/unknown/freebsd7.0 gcc 4.2.1 13~rc1 08-12-04 alex Y Y Y Y (3)
|
i386/unknown/freebsd7.0 gcc 4.2.1 14.1 09-07-28 alex Y Y Y Y (3)
|
||||||
|
i386/unknown/freebsd7.2 gcc 4.2.1 14.1 09-08-03 alex Y Y Y Y (3)
|
||||||
|
i386/unknown/freebsd7.3 gcc 4.2.1 17-dev 10-10-05 alex Y Y Y Y (3)
|
||||||
i386/unknown/gnu0.3 gcc 3.3.3 0.8.0 04-05-30 alex Y Y n Y
|
i386/unknown/gnu0.3 gcc 3.3.3 0.8.0 04-05-30 alex Y Y n Y
|
||||||
i686/unknown/gnu0.3 gcc 4.3.1 13~rc1 08-12-05 alex Y Y Y Y
|
i686/unknown/gnu0.3 gcc 4.3.1 14.1 09-07-28 alex Y Y Y Y
|
||||||
|
i686/unkn./kfreebsd7.2-gnu gcc 4.3.4 15 09-12-02 alex Y Y Y Y (3)
|
||||||
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
|
||||||
i386/unknown/netbsdelf3.0.1 gcc 3.3.3 0.10.0-p1 06-08-30 alex Y Y Y Y (3)
|
i386/unknown/netbsdelf3.0.1 gcc 3.3.3 0.10.0-p1 06-08-30 alex Y Y Y Y (3)
|
||||||
i386/unknown/netbsdelf4.0 gcc 4.1.2 13~rc1 08-12-05 alex Y Y Y Y (3)
|
i386/unknown/netbsdelf4.0 gcc 4.1.2 17-dev 10-10-05 alex Y Y Y Y (3)
|
||||||
|
i386/unknown/netbsdelf5.0.2 gcc 4.1.3 17-dev 10-10-07 alex Y Y Y Y (3)
|
||||||
i386/unknown/openbsd3.9 gcc 3.3.5 0.10.0-p1 06-08-30 alex Y Y Y Y (3)
|
i386/unknown/openbsd3.9 gcc 3.3.5 0.10.0-p1 06-08-30 alex Y Y Y Y (3)
|
||||||
i386/unknown/openbsd4.1 gcc 3.3.5 13~rc1 08-12-05 alex Y Y Y Y (3)
|
i386/unknown/openbsd4.1 gcc 3.3.5 16 10-04-11 alex Y Y Y Y (3)
|
||||||
|
i586/pc/interix3.5 gcc 3.3 15 10-01-22 alex Y Y N Y
|
||||||
i686/pc/cygwin gcc 3.3.1 0.8.0 04-05-30 alex Y Y n Y
|
i686/pc/cygwin gcc 3.3.1 0.8.0 04-05-30 alex Y Y n Y
|
||||||
i686/pc/linux-gnu gcc 2.95.4 0.8.0 04-05-30 alex Y Y Y Y (1)
|
i686/pc/linux-gnu gcc 2.95.4 0.8.0 04-05-30 alex Y Y Y Y (1)
|
||||||
i686/pc/linux-gnu gcc 3.3.5 13~rc1 08-12-05 alex Y Y Y Y (1)
|
i686/pc/linux-gnu gcc 3.3.5 14.1 09-08-04 alex Y Y Y Y (1)
|
||||||
i386/pc/linux-gnu gcc 4.1.2 13~rc1 08-12-05 alex Y Y Y Y (1)
|
i386/pc/linux-gnu gcc 4.1.2 13~rc1 08-12-05 alex Y Y Y Y (1)
|
||||||
i386/pc/linux-gnu gcc 4.3.2 13~rc1 08-12-05 alex Y Y Y Y (1)
|
i686/pc/linux-gnu gcc 4.3.2 14.1 09-08-04 alex Y Y Y Y (1)
|
||||||
|
m68k/apple/aux3.0.1 gcc 2.7.2 17~rc1 10-10-12 alex Y Y Y Y
|
||||||
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 ? ?
|
||||||
@@ -62,19 +70,22 @@ powerpc/unknown/openbsd3.6 gcc 2.95.3 0.10.0 06-10-08 alex Y Y n Y
|
|||||||
sparc/sun/solaris2.6 gcc 2.95.3 0.7.x-CVS 03-04-22 alex Y Y Y Y
|
sparc/sun/solaris2.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
|
||||||
sparc/unkn./netbsdelf1.6.1 gcc 2.95.3 0.8.0 04-05-30 alex Y Y Y Y
|
sparc/unkn./netbsdelf1.6.1 gcc 2.95.3 0.8.0 04-05-30 alex Y Y Y Y
|
||||||
x86_64/unknown/linux-gnu 4.3.2 13~rc1 08-12-05 alex Y Y Y Y (5)
|
x86_64/unknown/freebsd8.0 gcc 4.2.1 16 10-04-23 alex Y Y Y Y (3)
|
||||||
|
x86_64/unknown/freebsd8.1 gcc 4.2.1 17-dev 10-10-05 alex Y Y Y Y (3)
|
||||||
|
x86_64/unknown/linux-gnu gcc 4.3.2 17-dev 10-10-05 alex Y Y Y Y (1)
|
||||||
|
x86_64/unknown/openbsd4.7 gcc 3.3.5 17-dev 10-10-05 alex Y Y Y Y (3)
|
||||||
|
|
||||||
|
|
||||||
Notes
|
Notes
|
||||||
~~~~~
|
~~~~~
|
||||||
|
|
||||||
(1) i686/pc/linux-gnu:
|
(1) i686/pc/linux-gnu & x86_64/unknown/linux-gnu:
|
||||||
ngIRCd has been tested with various Linux distributions, such as SuSE,
|
ngIRCd has been tested with various Linux distributions, such as SuSE,
|
||||||
RedHat, Debian, and Gentoo using Kernels 2.2.x, 2.4.x and 2.6.x with
|
RedHat, Debian, and Gentoo using Kernels 2.2.x, 2.4.x and 2.6.x with
|
||||||
various versions of the GNU C compiler (starting with 2.95.x and up to
|
various versions of the GNU C compiler (starting with 2.95.x and up to
|
||||||
version 4.3.x). The eldest glibc used was glibc-2.0.7. ngIRCd compiled
|
version 4.3.x). The eldest glibc used was glibc-2.0.7. ngIRCd compiled
|
||||||
and run on all these systems without problems.
|
and run on all these systems without problems.
|
||||||
Actual Linux kernels (2.6.x) and glic's support the epoll() IO interface.
|
Actual Linux kernels (2.6.x) and glibc's support the epoll() IO interface.
|
||||||
|
|
||||||
(2) This compiler is an pre-ANSI C compiler, therefore the source code is
|
(2) This compiler is an pre-ANSI C compiler, therefore the source code is
|
||||||
automatically converted using the included ansi2knr tool while building.
|
automatically converted using the included ansi2knr tool while building.
|
||||||
|
|||||||
37
doc/README-Interix.txt
Normal file
37
doc/README-Interix.txt
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
|
||||||
|
ngIRCd - Next Generation IRC Server
|
||||||
|
|
||||||
|
(c)2001-2010 Alexander Barton,
|
||||||
|
alex@barton.de, http://www.barton.de/
|
||||||
|
|
||||||
|
ngIRCd is free software and published under the
|
||||||
|
terms of the GNU General Public License.
|
||||||
|
|
||||||
|
|
||||||
|
-- README-Interix.txt --
|
||||||
|
|
||||||
|
|
||||||
|
ngIRCd release 15 has successfully been tested on Microsoft Windows XP
|
||||||
|
Professional using the Services for UNIX (SFU) version 3.5 and Microsoft
|
||||||
|
Windows 7 with the bundled Subsystem for UNIX Applications (SUA).
|
||||||
|
|
||||||
|
SFU are supported on Windows 2000, Windows 2000 Server, Windows XP, and
|
||||||
|
Windows Server 2003. SUA is supported on Windows Server 2003 R2, Windows
|
||||||
|
Server 2008 & 2008 R2, Windows Vista, and Windows 7 -- so ngIRCd should be
|
||||||
|
able to run on all of these platforms.
|
||||||
|
|
||||||
|
But please note that the poll() API function is not fully implemented by
|
||||||
|
SFU/SUA and therefore can't be used by ngIRCd -- which normally would be
|
||||||
|
the default. Please see <http://www.suacommunity.com/faqs.aspx> section
|
||||||
|
4.25 for details:
|
||||||
|
|
||||||
|
"If you do try to use the poll() API your program will block on the
|
||||||
|
API call forever. You must direct your program to build using the
|
||||||
|
select() API."
|
||||||
|
|
||||||
|
So when running the ./configure script, you HAVE TO DISABLE poll() support:
|
||||||
|
|
||||||
|
./configure --without-poll
|
||||||
|
|
||||||
|
ngIRCd then defaults to using the select() API function which works fine.
|
||||||
|
|
||||||
@@ -49,8 +49,7 @@ Creating a self-signed certificate
|
|||||||
OpenSSL:
|
OpenSSL:
|
||||||
|
|
||||||
Creating a self-signed certificate and key:
|
Creating a self-signed certificate and key:
|
||||||
$ openssl req -newkey rsa:2048 -x509 -keyout server-key.pem \
|
$ openssl req -newkey rsa:2048 -x509 -keyout server-key.pem -out server-cert.pem -days 1461
|
||||||
-out server-cert.pem -days 1461
|
|
||||||
Create DH parameters (optional):
|
Create DH parameters (optional):
|
||||||
$ openssl dhparam -2 -out dhparams.pem 2048
|
$ openssl dhparam -2 -out dhparams.pem 2048
|
||||||
|
|
||||||
@@ -58,8 +57,7 @@ GnuTLS:
|
|||||||
|
|
||||||
Creating a self-signed certificate and key:
|
Creating a self-signed certificate and key:
|
||||||
$ certtool --generate-privkey --bits 2048 --outfile server-key.pem
|
$ certtool --generate-privkey --bits 2048 --outfile server-key.pem
|
||||||
$ certtool --generate-self-signed --load-privkey server-key.pem \
|
$ certtool --generate-self-signed --load-privkey server-key.pem --outfile server-cert.pem
|
||||||
--outfile server-cert.pem
|
|
||||||
Create DH parameters (optional):
|
Create DH parameters (optional):
|
||||||
$ certtool --generate-dh-params --bits 2048 --outfile dhparams.pem
|
$ certtool --generate-dh-params --bits 2048 --outfile dhparams.pem
|
||||||
|
|
||||||
|
|||||||
@@ -28,9 +28,15 @@
|
|||||||
# LINKS requests for example.
|
# LINKS requests for example.
|
||||||
Info = Server Info Text
|
Info = Server Info Text
|
||||||
|
|
||||||
# Global password for all users needed to connect to the server
|
# Global password for all users needed to connect to the server.
|
||||||
|
# (Default: not set)
|
||||||
;Password = abc
|
;Password = abc
|
||||||
|
|
||||||
|
# Password required for using the WEBIRC command used by some
|
||||||
|
# Web-to-IRC gateways. If not set/empty, the WEBIRC command can't
|
||||||
|
# be used. (Default: not set)
|
||||||
|
;WebircPassword = xyz
|
||||||
|
|
||||||
# Information about the server and the administrator, used by the
|
# Information about the server and the administrator, used by the
|
||||||
# ADMIN command. Not required by server but by RFC!
|
# ADMIN command. Not required by server but by RFC!
|
||||||
;AdminInfo1 = Description
|
;AdminInfo1 = Description
|
||||||
@@ -42,7 +48,7 @@
|
|||||||
;Ports = 6667, 6668, 6669
|
;Ports = 6667, 6668, 6669
|
||||||
|
|
||||||
# Additional Listen Ports that expect SSL/TLS encrypted connections
|
# Additional Listen Ports that expect SSL/TLS encrypted connections
|
||||||
;SSLPorts = 9999,6668
|
;SSLPorts = 6697, 9999
|
||||||
|
|
||||||
# SSL Server Key
|
# SSL Server Key
|
||||||
;SSLKeyFile = /usr/local/etc/ngircd/ssl/server-key.pem
|
;SSLKeyFile = /usr/local/etc/ngircd/ssl/server-key.pem
|
||||||
@@ -62,12 +68,18 @@
|
|||||||
# so the server listens on all IP addresses of the system by default.
|
# so the server listens on all IP addresses of the system by default.
|
||||||
;Listen = 127.0.0.1,192.168.0.1
|
;Listen = 127.0.0.1,192.168.0.1
|
||||||
|
|
||||||
|
# Syslog "facility" to which ngIRCd should send log messages.
|
||||||
|
# Possible values are system dependant, but most probably auth, daemon,
|
||||||
|
# user and local1 through local7 are possible values; see syslog(3).
|
||||||
|
# Default is "local5" for historical reasons, you probably want to
|
||||||
|
# change this to "daemon", for example.
|
||||||
|
SyslogFacility = local1
|
||||||
|
|
||||||
# Text file with the "message of the day" (MOTD). This message will
|
# Text file with the "message of the day" (MOTD). This message will
|
||||||
# be shown to all users connecting to the server:
|
# be shown to all users connecting to the server:
|
||||||
;MotdFile = /usr/local/etc/ngircd.motd
|
;MotdFile = /usr/local/etc/ngircd.motd
|
||||||
|
|
||||||
# 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.
|
|
||||||
;MotdPhrase = "Hello world!"
|
;MotdPhrase = "Hello world!"
|
||||||
|
|
||||||
# User ID under which the server should run; you can use the name
|
# User ID under which the server should run; you can use the name
|
||||||
@@ -115,6 +127,10 @@
|
|||||||
# server? (This is a compatibility hack for ircd-irc2 servers)
|
# server? (This is a compatibility hack for ircd-irc2 servers)
|
||||||
;OperServerMode = no
|
;OperServerMode = no
|
||||||
|
|
||||||
|
# Are remote IRC operators allowed to control this server, e. g.
|
||||||
|
# use commands like CONNECT, SQUIT, DIE, ...?
|
||||||
|
;AllowRemoteOper = no
|
||||||
|
|
||||||
# Allow Pre-Defined Channels only (see Section [Channels])
|
# Allow Pre-Defined Channels only (see Section [Channels])
|
||||||
;PredefChannelsOnly = no
|
;PredefChannelsOnly = no
|
||||||
|
|
||||||
@@ -125,6 +141,13 @@
|
|||||||
# with support for it.
|
# with support for it.
|
||||||
;NoIdent = no
|
;NoIdent = no
|
||||||
|
|
||||||
|
# Don't use PAM, even if ngIRCd has been compiled with support for it.
|
||||||
|
;NoPAM = no
|
||||||
|
|
||||||
|
# Don't use ZeroConf service registration, even if ngIRCd has been
|
||||||
|
# compiled with support for it (e.g. Howl, Avahi, Mac OS X).
|
||||||
|
;NoZeroConf = no
|
||||||
|
|
||||||
# try to connect to other irc servers using ipv4 and ipv6, if possible
|
# try to connect to other irc servers using ipv4 and ipv6, if possible
|
||||||
;ConnectIPv6 = yes
|
;ConnectIPv6 = yes
|
||||||
;ConnectIPv4 = yes
|
;ConnectIPv4 = yes
|
||||||
|
|||||||
@@ -69,13 +69,23 @@ IRC network and must contain at least one dot (".") character.
|
|||||||
Info text of the server. This will be shown by WHOIS and LINKS requests for
|
Info text of the server. This will be shown by WHOIS and LINKS requests for
|
||||||
example.
|
example.
|
||||||
.TP
|
.TP
|
||||||
|
\fBPassword\fR
|
||||||
|
Global password for all users needed to connect to the server. The default
|
||||||
|
is empty, so no password is required.
|
||||||
|
.TP
|
||||||
|
\fBWebircPassword\fR
|
||||||
|
Password required for using the WEBIRC command used by some Web-to-IRC
|
||||||
|
gateways. If not set or empty, the WEBIRC command can't be used.
|
||||||
|
Default: not set.
|
||||||
|
.TP
|
||||||
\fBAdminInfo1\fR, \fBAdminInfo2\fR, \fBAdminEMail\fR
|
\fBAdminInfo1\fR, \fBAdminInfo2\fR, \fBAdminEMail\fR
|
||||||
Information about the server and the administrator, used by the ADMIN
|
Information about the server and the administrator, used by the ADMIN
|
||||||
command.
|
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 commas (","). Default: 6667.
|
separated with commas (","). Default: 6667, unless \fBSSL_Ports\fR are also
|
||||||
|
specified.
|
||||||
.TP
|
.TP
|
||||||
\fBSSLPorts\fR
|
\fBSSLPorts\fR
|
||||||
Same as \fBPorts\fR , except that ngIRCd will expect incoming connections
|
Same as \fBPorts\fR , except that ngIRCd will expect incoming connections
|
||||||
@@ -106,14 +116,20 @@ If unset, the defaults value is "0.0.0.0" or, if ngIRCd was compiled
|
|||||||
with IPv6 support, "::,0.0.0.0". So the server listens on all configured
|
with IPv6 support, "::,0.0.0.0". So the server listens on all configured
|
||||||
IP addresses and interfaces by default.
|
IP addresses and interfaces by default.
|
||||||
.TP
|
.TP
|
||||||
|
\fBSyslogFacility\fR
|
||||||
|
Syslog "facility" to which ngIRCd should send log messages. Possible
|
||||||
|
values are system dependant, but most probably "auth", "daemon", "user"
|
||||||
|
and "local1" through "local7" are possible values; see syslog(3).
|
||||||
|
Default is "local5" for historical reasons, you probably want to
|
||||||
|
change this to "daemon", for example.
|
||||||
|
.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. Changes made to this file
|
||||||
|
take effect when ngircd is instructed to re-read its configuration file.
|
||||||
.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 this variable is set, no \fBMotdFile\fR will be read at all which can be
|
|
||||||
handy if the daemon should run inside a chroot directory.
|
|
||||||
.TP
|
.TP
|
||||||
\fBServerUID\fR
|
\fBServerUID\fR
|
||||||
User ID under which the server should run; you can use the name of the user
|
User ID under which the server should run; you can use the name of the user
|
||||||
@@ -178,6 +194,11 @@ If \fBOperCanUseMode\fR is enabled, this may lead the compatibility problems wit
|
|||||||
Servers that run the ircd-irc2 Software. This Option "masks" mode requests
|
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.
|
by non-chanops as if they were coming from the server. Default: no.
|
||||||
.TP
|
.TP
|
||||||
|
\fBAllowRemoteOper\fR
|
||||||
|
Are IRC operators connected to remote servers allowed to control this server,
|
||||||
|
e. g. are they allowed to use administrative commands like CONNECT, DIE,
|
||||||
|
SQUIT, ... that affect this server? Default: no.
|
||||||
|
.TP
|
||||||
\fBPredefChannelsOnly\fR
|
\fBPredefChannelsOnly\fR
|
||||||
If enabled, no new channels can be created. Useful if
|
If enabled, no new channels can be created. Useful if
|
||||||
you do not want to have channels other than those defined in
|
you do not want to have channels other than those defined in
|
||||||
@@ -195,6 +216,18 @@ If ngIRCd is compiled with IDENT support this can be used to disable IDENT
|
|||||||
lookups at run time.
|
lookups at run time.
|
||||||
Default: no.
|
Default: no.
|
||||||
.TP
|
.TP
|
||||||
|
\fBNoPAM\fR
|
||||||
|
If ngIRCd is compiled with PAM support this can be used to disable all calls
|
||||||
|
to the PAM library at runtime; all users connecting without password are
|
||||||
|
allowed to connect, all passwords given will fail.
|
||||||
|
Default: no.
|
||||||
|
.TP
|
||||||
|
\fBNoZeroConf\fR
|
||||||
|
If ngIRCd is compiled to register its services using ZeroConf (e.g. using
|
||||||
|
Howl, Avahi or on Mac OS X) this parameter can be used to disable service
|
||||||
|
registration at runtime.
|
||||||
|
Default: no.
|
||||||
|
.TP
|
||||||
\fBConnectIPv4\fR
|
\fBConnectIPv4\fR
|
||||||
Set this to no if you do not want ngIRCd to connect to other IRC servers using
|
Set this to no if you do not want ngIRCd to connect to other IRC servers using
|
||||||
IPv4. This allows usage of ngIRCd in IPv6-only setups.
|
IPv4. This allows usage of ngIRCd in IPv6-only setups.
|
||||||
@@ -221,9 +254,6 @@ Default: 10.
|
|||||||
Maximum length of an user nick name (Default: 9, as in RFC 2812). Please
|
Maximum length of an user nick name (Default: 9, as in RFC 2812). Please
|
||||||
note that all servers in an IRC network MUST use the same maximum nick name
|
note that all servers in an IRC network MUST use the same maximum nick name
|
||||||
length!
|
length!
|
||||||
.TP
|
|
||||||
\fBSSLConnect\fR
|
|
||||||
Connect to the remote server using TLS/SSL. Default: false.
|
|
||||||
.SH [OPERATOR]
|
.SH [OPERATOR]
|
||||||
.I [Operator]
|
.I [Operator]
|
||||||
sections are used to define IRC Operators. There may be more than one
|
sections are used to define IRC Operators. There may be more than one
|
||||||
@@ -287,6 +317,9 @@ Group of this server (optional).
|
|||||||
Disable automatic connection even if port value is specified. Default: false.
|
Disable automatic connection even if port value is specified. Default: false.
|
||||||
You can use the IRC Operator command CONNECT later on to create the link.
|
You can use the IRC Operator command CONNECT later on to create the link.
|
||||||
.TP
|
.TP
|
||||||
|
\fBSSLConnect\fR
|
||||||
|
Connect to the remote server using TLS/SSL. Default: false.
|
||||||
|
.TP
|
||||||
\fBServiceMask\fR
|
\fBServiceMask\fR
|
||||||
Define a (case insensitive) mask matching nick names that should be treated as
|
Define a (case insensitive) mask matching nick names that should be treated as
|
||||||
IRC services when introduced via this remote server. REGULAR SERVERS DON'T NEED
|
IRC services when introduced via this remote server. REGULAR SERVERS DON'T NEED
|
||||||
|
|||||||
@@ -30,6 +30,9 @@ ng_ipaddr_init(ng_ipaddr_t *addr, const char *ip_str, UINT16 port)
|
|||||||
|
|
||||||
memset(&hints, 0, sizeof(hints));
|
memset(&hints, 0, sizeof(hints));
|
||||||
hints.ai_flags = AI_NUMERICHOST;
|
hints.ai_flags = AI_NUMERICHOST;
|
||||||
|
#ifndef WANT_IPV6 /* do not convert ipv6 addresses */
|
||||||
|
hints.ai_family = AF_INET;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* some getaddrinfo implementations require that ai_socktype is set. */
|
/* some getaddrinfo implementations require that ai_socktype is set. */
|
||||||
hints.ai_socktype = SOCK_STREAM;
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
@@ -38,7 +41,6 @@ ng_ipaddr_init(ng_ipaddr_t *addr, const char *ip_str, UINT16 port)
|
|||||||
snprintf(portstr, sizeof(portstr), "%u", (unsigned int) port);
|
snprintf(portstr, sizeof(portstr), "%u", (unsigned int) port);
|
||||||
|
|
||||||
ret = getaddrinfo(ip_str, portstr, &hints, &res0);
|
ret = getaddrinfo(ip_str, portstr, &hints, &res0);
|
||||||
assert(ret == 0);
|
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -51,6 +53,10 @@ ng_ipaddr_init(ng_ipaddr_t *addr, const char *ip_str, UINT16 port)
|
|||||||
return ret == 0;
|
return ret == 0;
|
||||||
#else /* HAVE_GETADDRINFO */
|
#else /* HAVE_GETADDRINFO */
|
||||||
assert(ip_str);
|
assert(ip_str);
|
||||||
|
memset(addr, 0, sizeof *addr);
|
||||||
|
#ifdef HAVE_sockaddr_in_len
|
||||||
|
addr->sin4.sin_len = sizeof(addr->sin4);
|
||||||
|
#endif
|
||||||
addr->sin4.sin_family = AF_INET;
|
addr->sin4.sin_family = AF_INET;
|
||||||
# ifdef HAVE_INET_ATON
|
# ifdef HAVE_INET_ATON
|
||||||
if (inet_aton(ip_str, &addr->sin4.sin_addr) == 0)
|
if (inet_aton(ip_str, &addr->sin4.sin_addr) == 0)
|
||||||
@@ -151,7 +157,8 @@ ng_ipaddr_tostr_r(const ng_ipaddr_t *addr, char *str)
|
|||||||
if (*str == ':') {
|
if (*str == ':') {
|
||||||
char tmp[NG_INET_ADDRSTRLEN] = "0";
|
char tmp[NG_INET_ADDRSTRLEN] = "0";
|
||||||
ret = getnameinfo(sa, ng_ipaddr_salen(addr),
|
ret = getnameinfo(sa, ng_ipaddr_salen(addr),
|
||||||
tmp+1, sizeof(tmp) -1, NULL, 0, NI_NUMERICHOST);
|
tmp + 1, (socklen_t)sizeof(tmp) - 1,
|
||||||
|
NULL, 0, NI_NUMERICHOST);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
strlcpy(str, tmp, NG_INET_ADDRSTRLEN);
|
strlcpy(str, tmp, NG_INET_ADDRSTRLEN);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
#define NG_IPADDR_HDR
|
#define NG_IPADDR_HDR
|
||||||
#include "portab.h"
|
#include "portab.h"
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
|
||||||
@@ -58,10 +59,10 @@ ng_ipaddr_salen(const ng_ipaddr_t *a)
|
|||||||
#ifdef WANT_IPV6
|
#ifdef WANT_IPV6
|
||||||
assert(a->sa.sa_family == AF_INET || a->sa.sa_family == AF_INET6);
|
assert(a->sa.sa_family == AF_INET || a->sa.sa_family == AF_INET6);
|
||||||
if (a->sa.sa_family == AF_INET6)
|
if (a->sa.sa_family == AF_INET6)
|
||||||
return sizeof(a->sin6);
|
return (socklen_t)sizeof(a->sin6);
|
||||||
#endif
|
#endif
|
||||||
assert(a->sin4.sin_family == AF_INET);
|
assert(a->sin4.sin_family == AF_INET);
|
||||||
return sizeof(a->sin4);
|
return (socklen_t)sizeof(a->sin4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -102,8 +103,11 @@ GLOBAL const char *ng_ipaddr_tostr PARAMS((const ng_ipaddr_t *addr));
|
|||||||
/* convert struct sockaddr to string. dest must be NG_INET_ADDRSTRLEN bytes long */
|
/* convert struct sockaddr to string. dest must be NG_INET_ADDRSTRLEN bytes long */
|
||||||
GLOBAL bool ng_ipaddr_tostr_r PARAMS((const ng_ipaddr_t *addr, char *dest));
|
GLOBAL bool ng_ipaddr_tostr_r PARAMS((const ng_ipaddr_t *addr, char *dest));
|
||||||
#else
|
#else
|
||||||
static inline const char *
|
static inline const char*
|
||||||
ng_ipaddr_tostr(const ng_ipaddr_t *addr) { return inet_ntoa(addr->sin4.sin_addr); }
|
ng_ipaddr_tostr(const ng_ipaddr_t *addr)
|
||||||
|
{
|
||||||
|
return inet_ntoa(addr->sin4.sin_addr);
|
||||||
|
}
|
||||||
|
|
||||||
static inline bool
|
static inline bool
|
||||||
ng_ipaddr_tostr_r(const ng_ipaddr_t *addr, char *d)
|
ng_ipaddr_tostr_r(const ng_ipaddr_t *addr, char *d)
|
||||||
@@ -115,4 +119,3 @@ ng_ipaddr_tostr_r(const ng_ipaddr_t *addr, char *d)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* -eof- */
|
/* -eof- */
|
||||||
|
|
||||||
|
|||||||
@@ -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-2010 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,8 +8,6 @@
|
|||||||
# (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.51 2008/02/26 22:04:17 fw Exp $
|
|
||||||
#
|
|
||||||
|
|
||||||
AUTOMAKE_OPTIONS = ../portab/ansi2knr
|
AUTOMAKE_OPTIONS = ../portab/ansi2knr
|
||||||
|
|
||||||
@@ -23,7 +21,7 @@ sbin_PROGRAMS = ngircd
|
|||||||
ngircd_SOURCES = ngircd.c array.c channel.c client.c conf.c conn.c conn-func.c \
|
ngircd_SOURCES = ngircd.c array.c channel.c client.c conf.c conn.c conn-func.c \
|
||||||
conn-ssl.c conn-zip.c hash.c io.c irc.c irc-channel.c irc-info.c irc-login.c \
|
conn-ssl.c conn-zip.c hash.c io.c irc.c irc-channel.c irc-info.c irc-login.c \
|
||||||
irc-mode.c irc-op.c irc-oper.c irc-server.c irc-write.c lists.c log.c \
|
irc-mode.c irc-op.c irc-oper.c irc-server.c irc-write.c lists.c log.c \
|
||||||
match.c numeric.c parse.c rendezvous.c resolve.c
|
match.c op.c numeric.c pam.c parse.c proc.c rendezvous.c resolve.c sighandlers.c
|
||||||
|
|
||||||
ngircd_LDFLAGS = -L../portab -L../tool -L../ipaddr
|
ngircd_LDFLAGS = -L../portab -L../tool -L../ipaddr
|
||||||
|
|
||||||
@@ -32,8 +30,8 @@ ngircd_LDADD = -lngportab -lngtool -lngipaddr
|
|||||||
noinst_HEADERS = ngircd.h array.h channel.h client.h conf.h conf-ssl.h conn.h \
|
noinst_HEADERS = ngircd.h array.h channel.h client.h conf.h conf-ssl.h conn.h \
|
||||||
conn-func.h conn-ssl.h conn-zip.h hash.h io.h irc.h irc-channel.h \
|
conn-func.h conn-ssl.h conn-zip.h hash.h io.h irc.h irc-channel.h \
|
||||||
irc-info.h irc-login.h irc-mode.h irc-op.h irc-oper.h irc-server.h \
|
irc-info.h irc-login.h irc-mode.h irc-op.h irc-oper.h irc-server.h \
|
||||||
irc-write.h lists.h log.h match.h numeric.h parse.h rendezvous.h \
|
irc-write.h lists.h log.h match.h numeric.h op.h pam.h parse.h proc.h \
|
||||||
resolve.h defines.h messages.h
|
rendezvous.h resolve.h sighandlers.h defines.h messages.h
|
||||||
|
|
||||||
clean-local:
|
clean-local:
|
||||||
rm -f check-version check-help lint.out
|
rm -f check-version check-help lint.out
|
||||||
|
|||||||
@@ -27,14 +27,12 @@
|
|||||||
|
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "conn-func.h"
|
#include "conn-func.h"
|
||||||
#include "client.h"
|
|
||||||
|
|
||||||
#include "exp.h"
|
#include "exp.h"
|
||||||
#include "channel.h"
|
#include "channel.h"
|
||||||
|
|
||||||
#include "imp.h"
|
#include "imp.h"
|
||||||
#include "irc-write.h"
|
#include "irc-write.h"
|
||||||
#include "resolve.h"
|
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
#include "lists.h"
|
#include "lists.h"
|
||||||
@@ -1085,7 +1083,7 @@ Channel_CheckKey(CHANNEL *Chan, CLIENT *Client, const char *Key)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (fgets(line, sizeof(line), fd) != NULL) {
|
while (fgets(line, (int)sizeof(line), fd) != NULL) {
|
||||||
ngt_TrimStr(line);
|
ngt_TrimStr(line);
|
||||||
if (! (nick = strchr(line, ':')))
|
if (! (nick = strchr(line, ':')))
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2008 Alexander Barton (alex@barton.de)
|
* Copyright (c)2001-2010 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
|
||||||
@@ -35,7 +35,6 @@
|
|||||||
#include <imp.h>
|
#include <imp.h>
|
||||||
#include "ngircd.h"
|
#include "ngircd.h"
|
||||||
#include "channel.h"
|
#include "channel.h"
|
||||||
#include "resolve.h"
|
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
#include "irc-write.h"
|
#include "irc-write.h"
|
||||||
@@ -181,39 +180,48 @@ Client_NewRemoteUser(CLIENT *Introducer, const char *Nick, int Hops, const char
|
|||||||
*/
|
*/
|
||||||
static CLIENT *
|
static CLIENT *
|
||||||
Init_New_Client(CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer,
|
Init_New_Client(CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer,
|
||||||
int Type, const char *ID, const char *User, const char *Hostname, const char *Info, int Hops,
|
int Type, const char *ID, const char *User, const char *Hostname,
|
||||||
int Token, const char *Modes, bool Idented)
|
const char *Info, int Hops, int Token, const char *Modes, bool Idented)
|
||||||
{
|
{
|
||||||
CLIENT *client;
|
CLIENT *client;
|
||||||
|
|
||||||
assert( Idx >= NONE );
|
assert(Idx >= NONE);
|
||||||
assert( Introducer != NULL );
|
assert(Introducer != NULL);
|
||||||
assert( Hostname != NULL );
|
assert(Hostname != NULL);
|
||||||
|
|
||||||
client = New_Client_Struct( );
|
client = New_Client_Struct();
|
||||||
if( ! client ) return NULL;
|
if (!client)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
client->starttime = time(NULL);
|
client->starttime = time(NULL);
|
||||||
client->conn_id = Idx;
|
client->conn_id = Idx;
|
||||||
client->introducer = Introducer;
|
client->introducer = Introducer;
|
||||||
client->topserver = TopServer;
|
client->topserver = TopServer;
|
||||||
client->type = Type;
|
client->type = Type;
|
||||||
if( ID ) Client_SetID( client, ID );
|
if (ID)
|
||||||
if( User ) Client_SetUser( client, User, Idented );
|
Client_SetID(client, ID);
|
||||||
if( Hostname ) Client_SetHostname( client, Hostname );
|
if (User) {
|
||||||
if( Info ) Client_SetInfo( client, Info );
|
Client_SetUser(client, User, Idented);
|
||||||
|
Client_SetOrigUser(client, User);
|
||||||
|
}
|
||||||
|
if (Hostname)
|
||||||
|
Client_SetHostname(client, Hostname);
|
||||||
|
if (Info)
|
||||||
|
Client_SetInfo(client, Info);
|
||||||
client->hops = Hops;
|
client->hops = Hops;
|
||||||
client->token = Token;
|
client->token = Token;
|
||||||
if( Modes ) Client_SetModes( client, Modes );
|
if (Modes)
|
||||||
if( Type == CLIENT_SERVER ) Generate_MyToken( client );
|
Client_SetModes(client, Modes);
|
||||||
|
if (Type == CLIENT_SERVER)
|
||||||
|
Generate_MyToken(client);
|
||||||
|
|
||||||
if( strchr( client->modes, 'a' ))
|
if (strchr(client->modes, 'a'))
|
||||||
strlcpy( client->away, DEFAULT_AWAY_MSG, sizeof( client->away ));
|
strlcpy(client->away, DEFAULT_AWAY_MSG, sizeof(client->away));
|
||||||
|
|
||||||
client->next = (POINTER *)My_Clients;
|
client->next = (POINTER *)My_Clients;
|
||||||
My_Clients = client;
|
My_Clients = client;
|
||||||
|
|
||||||
Adjust_Counters( client );
|
Adjust_Counters(client);
|
||||||
|
|
||||||
return client;
|
return client;
|
||||||
} /* Init_New_Client */
|
} /* Init_New_Client */
|
||||||
@@ -346,6 +354,26 @@ Client_SetUser( CLIENT *Client, const char *User, bool Idented )
|
|||||||
} /* Client_SetUser */
|
} /* Client_SetUser */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set "original" user name of a client.
|
||||||
|
* This function saves the "original" user name, the user name specified by
|
||||||
|
* the peer using the USER command, into the CLIENT structure. This user
|
||||||
|
* name may be used for authentication, for example.
|
||||||
|
* @param Client The client.
|
||||||
|
* @param User User name to set.
|
||||||
|
*/
|
||||||
|
GLOBAL void
|
||||||
|
Client_SetOrigUser(CLIENT UNUSED *Client, const char UNUSED *User)
|
||||||
|
{
|
||||||
|
assert(Client != NULL);
|
||||||
|
assert(User != NULL);
|
||||||
|
|
||||||
|
#if defined(PAM) && defined(IDENTAUTH)
|
||||||
|
strlcpy(Client->orig_user, User, sizeof(Client->orig_user));
|
||||||
|
#endif
|
||||||
|
} /* Client_SetOrigUser */
|
||||||
|
|
||||||
|
|
||||||
GLOBAL void
|
GLOBAL void
|
||||||
Client_SetInfo( CLIENT *Client, const char *Info )
|
Client_SetInfo( CLIENT *Client, const char *Info )
|
||||||
{
|
{
|
||||||
@@ -595,14 +623,61 @@ Client_User( CLIENT *Client )
|
|||||||
} /* Client_User */
|
} /* Client_User */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef PAM
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the "original" user name as supplied by the USER command.
|
||||||
|
* The user name as given by the client is used for authentication instead
|
||||||
|
* of the one detected using IDENT requests.
|
||||||
|
* @param Client The client.
|
||||||
|
* @return Original user name.
|
||||||
|
*/
|
||||||
GLOBAL char *
|
GLOBAL char *
|
||||||
Client_Hostname( CLIENT *Client )
|
Client_OrigUser(CLIENT *Client) {
|
||||||
|
#ifndef IDENTAUTH
|
||||||
|
char *user = Client->user;
|
||||||
|
|
||||||
|
if (user[0] == '~')
|
||||||
|
user++;
|
||||||
|
return user;
|
||||||
|
#else
|
||||||
|
return Client->orig_user;
|
||||||
|
#endif
|
||||||
|
} /* Client_OrigUser */
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the hostname of a client.
|
||||||
|
* @param Client Pointer to client structure
|
||||||
|
* @return Pointer to client hostname
|
||||||
|
*/
|
||||||
|
GLOBAL char *
|
||||||
|
Client_Hostname(CLIENT *Client)
|
||||||
{
|
{
|
||||||
assert( Client != NULL );
|
assert (Client != NULL);
|
||||||
return Client->host;
|
return Client->host;
|
||||||
} /* Client_Hostname */
|
} /* Client_Hostname */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get potentially cloaked hostname of a client.
|
||||||
|
* If the client has not enabled cloaking, the real hostname is used.
|
||||||
|
* @param Client Pointer to client structure
|
||||||
|
* @return Pointer to client hostname
|
||||||
|
*/
|
||||||
|
GLOBAL char *
|
||||||
|
Client_HostnameCloaked(CLIENT *Client)
|
||||||
|
{
|
||||||
|
assert(Client != NULL);
|
||||||
|
if (Client_HasMode(Client, 'x'))
|
||||||
|
return Client_ID(Client->introducer);
|
||||||
|
else
|
||||||
|
return Client_Hostname(Client);
|
||||||
|
} /* Client_HostnameCloaked */
|
||||||
|
|
||||||
|
|
||||||
GLOBAL char *
|
GLOBAL char *
|
||||||
Client_Password( CLIENT *Client )
|
Client_Password( CLIENT *Client )
|
||||||
{
|
{
|
||||||
@@ -675,23 +750,56 @@ Client_NextHop( CLIENT *Client )
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* return Client-ID ("client!user@host"), this ID is needed for e.g.
|
* Return ID of a client: "client!user@host"
|
||||||
* prefixes. Returnes pointer to static buffer.
|
* This client ID is used for IRC prefixes, for example.
|
||||||
|
* Please note that this function uses a global static buffer, so you can't
|
||||||
|
* nest invocations without overwriting erlier results!
|
||||||
|
* @param Client Pointer to client structure
|
||||||
|
* @return Pointer to global buffer containing the client ID
|
||||||
*/
|
*/
|
||||||
GLOBAL char *
|
GLOBAL char *
|
||||||
Client_Mask( CLIENT *Client )
|
Client_Mask( CLIENT *Client )
|
||||||
{
|
{
|
||||||
static char GetID_Buffer[GETID_LEN];
|
static char Mask_Buffer[GETID_LEN];
|
||||||
|
|
||||||
assert( Client != NULL );
|
assert (Client != NULL);
|
||||||
|
|
||||||
if( Client->type == CLIENT_SERVER ) return Client->id;
|
/* Servers: return name only, there is no "mask" */
|
||||||
|
if (Client->type == CLIENT_SERVER)
|
||||||
|
return Client->id;
|
||||||
|
|
||||||
snprintf(GetID_Buffer, GETID_LEN, "%s!%s@%s", Client->id, Client->user, Client->host);
|
snprintf(Mask_Buffer, GETID_LEN, "%s!%s@%s",
|
||||||
return GetID_Buffer;
|
Client->id, Client->user, Client->host);
|
||||||
|
return Mask_Buffer;
|
||||||
} /* Client_Mask */
|
} /* Client_Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return ID of a client with cloaked hostname: "client!user@server-name"
|
||||||
|
* This client ID is used for IRC prefixes, for example.
|
||||||
|
* Please note that this function uses a global static buffer, so you can't
|
||||||
|
* nest invocations without overwriting erlier results!
|
||||||
|
* If the client has not enabled cloaking, the real hostname is used.
|
||||||
|
* @param Client Pointer to client structure
|
||||||
|
* @return Pointer to global buffer containing the client ID
|
||||||
|
*/
|
||||||
|
GLOBAL char *
|
||||||
|
Client_MaskCloaked(CLIENT *Client)
|
||||||
|
{
|
||||||
|
static char Mask_Buffer[GETID_LEN];
|
||||||
|
|
||||||
|
assert (Client != NULL);
|
||||||
|
|
||||||
|
/* Is the client using cloaking at all? */
|
||||||
|
if (!Client_HasMode(Client, 'x'))
|
||||||
|
return Client_Mask(Client);
|
||||||
|
|
||||||
|
snprintf(Mask_Buffer, GETID_LEN, "%s!%s@%s",
|
||||||
|
Client->id, Client->user, Client_ID(Client->introducer));
|
||||||
|
return Mask_Buffer;
|
||||||
|
} /* Client_MaskCloaked */
|
||||||
|
|
||||||
|
|
||||||
GLOBAL CLIENT *
|
GLOBAL CLIENT *
|
||||||
Client_Introducer( CLIENT *Client )
|
Client_Introducer( CLIENT *Client )
|
||||||
{
|
{
|
||||||
@@ -758,18 +866,18 @@ Client_CheckID( CLIENT *Client, char *ID )
|
|||||||
assert( Client->conn_id > NONE );
|
assert( Client->conn_id > NONE );
|
||||||
assert( ID != NULL );
|
assert( ID != NULL );
|
||||||
|
|
||||||
/* Nick too long? */
|
/* ID too long? */
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* does ID already exist? */
|
/* ID already in use? */
|
||||||
c = My_Clients;
|
c = My_Clients;
|
||||||
while (c) {
|
while (c) {
|
||||||
if (strcasecmp(c->id, ID) == 0) {
|
if (strcasecmp(c->id, ID) == 0) {
|
||||||
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)
|
if (c->conn_id != NONE)
|
||||||
Log(LOG_ERR, "%s (on connection %d)!", str, c->conn_id);
|
Log(LOG_ERR, "%s (on connection %d)!", str, c->conn_id);
|
||||||
else
|
else
|
||||||
Log(LOG_ERR, "%s (via network)!", str);
|
Log(LOG_ERR, "%s (via network)!", str);
|
||||||
@@ -1086,7 +1194,7 @@ Client_RegisterWhowas( CLIENT *Client )
|
|||||||
sizeof( My_Whowas[slot].id ));
|
sizeof( My_Whowas[slot].id ));
|
||||||
strlcpy( My_Whowas[slot].user, Client_User( Client ),
|
strlcpy( My_Whowas[slot].user, Client_User( Client ),
|
||||||
sizeof( My_Whowas[slot].user ));
|
sizeof( My_Whowas[slot].user ));
|
||||||
strlcpy( My_Whowas[slot].host, Client_Hostname( Client ),
|
strlcpy( My_Whowas[slot].host, Client_HostnameCloaked( Client ),
|
||||||
sizeof( My_Whowas[slot].host ));
|
sizeof( My_Whowas[slot].host ));
|
||||||
strlcpy( My_Whowas[slot].info, Client_Info( Client ),
|
strlcpy( My_Whowas[slot].info, Client_Info( Client ),
|
||||||
sizeof( My_Whowas[slot].info ));
|
sizeof( My_Whowas[slot].info ));
|
||||||
@@ -1097,7 +1205,7 @@ Client_RegisterWhowas( CLIENT *Client )
|
|||||||
} /* Client_RegisterWhowas */
|
} /* Client_RegisterWhowas */
|
||||||
|
|
||||||
|
|
||||||
GLOBAL char *
|
GLOBAL const char *
|
||||||
Client_TypeText(CLIENT *Client)
|
Client_TypeText(CLIENT *Client)
|
||||||
{
|
{
|
||||||
assert(Client != NULL);
|
assert(Client != NULL);
|
||||||
@@ -1129,6 +1237,9 @@ Destroy_UserOrService(CLIENT *Client, const char *Txt, const char *FwdMsg, bool
|
|||||||
"%s \"%s\" unregistered (connection %d): %s",
|
"%s \"%s\" unregistered (connection %d): %s",
|
||||||
Client_TypeText(Client), Client_Mask(Client),
|
Client_TypeText(Client), Client_Mask(Client),
|
||||||
Client->conn_id, Txt);
|
Client->conn_id, Txt);
|
||||||
|
Log_ServerNotice('c', "Client exiting: %s (%s@%s) [%s]",
|
||||||
|
Client_ID(Client), Client_User(Client),
|
||||||
|
Client_Hostname(Client), Txt);
|
||||||
|
|
||||||
if (SendQuit) {
|
if (SendQuit) {
|
||||||
/* Inforam all the other servers */
|
/* Inforam all the other servers */
|
||||||
@@ -1164,4 +1275,26 @@ Destroy_UserOrService(CLIENT *Client, const char *Txt, const char *FwdMsg, bool
|
|||||||
} /* Destroy_UserOrService */
|
} /* Destroy_UserOrService */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
|
||||||
|
GLOBAL void
|
||||||
|
Client_DebugDump(void)
|
||||||
|
{
|
||||||
|
CLIENT *c;
|
||||||
|
|
||||||
|
Log(LOG_DEBUG, "Client status:");
|
||||||
|
c = My_Clients;
|
||||||
|
while (c) {
|
||||||
|
Log(LOG_DEBUG,
|
||||||
|
" - %s: type=%d, host=%s, user=%s, conn=%d, start=%ld, flags=%s",
|
||||||
|
Client_ID(c), Client_Type(c), Client_Hostname(c),
|
||||||
|
Client_User(c), Client_Conn(c), Client_StartTime(c),
|
||||||
|
Client_Flags(c));
|
||||||
|
c = (CLIENT *)c->next;
|
||||||
|
}
|
||||||
|
} /* Client_DumpClients */
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* -eof- */
|
/* -eof- */
|
||||||
|
|||||||
@@ -43,6 +43,9 @@ typedef struct _CLIENT
|
|||||||
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") */
|
||||||
|
#if defined(PAM) && defined(IDENTAUTH)
|
||||||
|
char orig_user[CLIENT_USER_LEN];/* user name supplied by USER command */
|
||||||
|
#endif
|
||||||
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) */
|
||||||
@@ -90,9 +93,14 @@ 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_MaskCloaked 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 ));
|
||||||
|
#ifdef PAM
|
||||||
|
GLOBAL char *Client_OrigUser PARAMS(( CLIENT *Client ));
|
||||||
|
#endif
|
||||||
GLOBAL char *Client_Hostname PARAMS(( CLIENT *Client ));
|
GLOBAL char *Client_Hostname PARAMS(( CLIENT *Client ));
|
||||||
|
GLOBAL char *Client_HostnameCloaked 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 ));
|
||||||
@@ -111,6 +119,7 @@ GLOBAL bool Client_HasMode PARAMS(( CLIENT *Client, char Mode ));
|
|||||||
GLOBAL void Client_SetHostname PARAMS(( CLIENT *Client, const char *Hostname ));
|
GLOBAL void Client_SetHostname PARAMS(( CLIENT *Client, const char *Hostname ));
|
||||||
GLOBAL void Client_SetID PARAMS(( CLIENT *Client, const char *Nick ));
|
GLOBAL void Client_SetID PARAMS(( CLIENT *Client, const char *Nick ));
|
||||||
GLOBAL void Client_SetUser PARAMS(( CLIENT *Client, const char *User, bool Idented ));
|
GLOBAL void Client_SetUser PARAMS(( CLIENT *Client, const char *User, bool Idented ));
|
||||||
|
GLOBAL void Client_SetOrigUser PARAMS(( CLIENT *Client, const char *User ));
|
||||||
GLOBAL void Client_SetInfo PARAMS(( CLIENT *Client, const char *Info ));
|
GLOBAL void Client_SetInfo PARAMS(( CLIENT *Client, const char *Info ));
|
||||||
GLOBAL void Client_SetPassword PARAMS(( CLIENT *Client, const char *Pwd ));
|
GLOBAL void Client_SetPassword PARAMS(( CLIENT *Client, const char *Pwd ));
|
||||||
GLOBAL void Client_SetType PARAMS(( CLIENT *Client, int Type ));
|
GLOBAL void Client_SetType PARAMS(( CLIENT *Client, int Type ));
|
||||||
@@ -146,8 +155,14 @@ GLOBAL int Client_GetLastWhowasIndex PARAMS(( void ));
|
|||||||
|
|
||||||
GLOBAL void Client_RegisterWhowas PARAMS(( CLIENT *Client ));
|
GLOBAL void Client_RegisterWhowas PARAMS(( CLIENT *Client ));
|
||||||
|
|
||||||
GLOBAL char * Client_TypeText PARAMS((CLIENT *Client));
|
GLOBAL const char *Client_TypeText PARAMS((CLIENT *Client));
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
GLOBAL void Client_DebugDump PARAMS((void));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* -eof- */
|
/* -eof- */
|
||||||
|
|||||||
@@ -39,7 +39,8 @@ bool
|
|||||||
ConnSSL_InitLibrary(void);
|
ConnSSL_InitLibrary(void);
|
||||||
#else
|
#else
|
||||||
static inline bool
|
static inline bool
|
||||||
ConnSSL_InitLibrary(void) { return true; }
|
ConnSSL_InitLibrary(void)
|
||||||
|
{ return true; }
|
||||||
#endif /* SSL_SUPPORT */
|
#endif /* SSL_SUPPORT */
|
||||||
|
|
||||||
#endif /* conf_ssl_h */
|
#endif /* conf_ssl_h */
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2008 Alexander Barton (alex@barton.de)
|
* Copyright (c)2001-2010 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
|
||||||
@@ -39,12 +39,10 @@
|
|||||||
#include "array.h"
|
#include "array.h"
|
||||||
#include "ngircd.h"
|
#include "ngircd.h"
|
||||||
#include "conn.h"
|
#include "conn.h"
|
||||||
#include "client.h"
|
|
||||||
#include "channel.h"
|
#include "channel.h"
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "match.h"
|
#include "match.h"
|
||||||
#include "resolve.h"
|
|
||||||
#include "tool.h"
|
#include "tool.h"
|
||||||
|
|
||||||
#include "exp.h"
|
#include "exp.h"
|
||||||
@@ -55,7 +53,10 @@ static bool Use_Log = true;
|
|||||||
static CONF_SERVER New_Server;
|
static CONF_SERVER New_Server;
|
||||||
static int New_Server_Idx;
|
static int New_Server_Idx;
|
||||||
|
|
||||||
|
static size_t Conf_Oper_Count;
|
||||||
static size_t Conf_Channel_Count;
|
static size_t Conf_Channel_Count;
|
||||||
|
static char Conf_MotdFile[FNAME_LEN];
|
||||||
|
|
||||||
static void Set_Defaults PARAMS(( bool InitServers ));
|
static void Set_Defaults PARAMS(( bool InitServers ));
|
||||||
static bool Read_Config PARAMS(( bool ngircd_starting ));
|
static bool Read_Config PARAMS(( bool ngircd_starting ));
|
||||||
static bool Validate_Config PARAMS(( bool TestOnly, bool Rehash ));
|
static bool Validate_Config PARAMS(( bool TestOnly, bool Rehash ));
|
||||||
@@ -95,19 +96,46 @@ ConfSSL_Init(void)
|
|||||||
array_free_wipe(&Conf_SSLOptions.KeyFilePassword);
|
array_free_wipe(&Conf_SSLOptions.KeyFilePassword);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
ssl_print_configvar(const char *name, const char *file)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
|
||||||
static void
|
if (!file) {
|
||||||
|
printf(" %s =\n", name);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
fp = fopen(file, "r");
|
||||||
|
if (fp)
|
||||||
|
fclose(fp);
|
||||||
|
else
|
||||||
|
fprintf(stderr, "ERROR: %s \"%s\": %s\n",
|
||||||
|
name, file, strerror(errno));
|
||||||
|
|
||||||
|
printf(" %s = %s\n", name, file);
|
||||||
|
return fp != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
ConfSSL_Puts(void)
|
ConfSSL_Puts(void)
|
||||||
{
|
{
|
||||||
if (Conf_SSLOptions.KeyFile)
|
bool ret;
|
||||||
printf( " SSLKeyFile = %s\n", Conf_SSLOptions.KeyFile);
|
|
||||||
if (Conf_SSLOptions.CertFile)
|
ret = ssl_print_configvar("SSLKeyFile", Conf_SSLOptions.KeyFile);
|
||||||
printf( " SSLCertFile = %s\n", Conf_SSLOptions.CertFile);
|
|
||||||
if (Conf_SSLOptions.DHFile)
|
if (!ssl_print_configvar("SSLCertFile", Conf_SSLOptions.CertFile))
|
||||||
printf( " SSLDHFile = %s\n", Conf_SSLOptions.DHFile);
|
ret = false;
|
||||||
|
|
||||||
|
if (!ssl_print_configvar("SSLDHFile", Conf_SSLOptions.DHFile))
|
||||||
|
ret = false;
|
||||||
|
|
||||||
if (array_bytes(&Conf_SSLOptions.KeyFilePassword))
|
if (array_bytes(&Conf_SSLOptions.KeyFilePassword))
|
||||||
puts(" SSLKeyFilePassword = <secret>" );
|
puts(" SSLKeyFilePassword = <secret>");
|
||||||
|
|
||||||
array_free_wipe(&Conf_SSLOptions.KeyFilePassword);
|
array_free_wipe(&Conf_SSLOptions.KeyFilePassword);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -152,8 +180,8 @@ ports_parse(array *a, int Line, char *Arg)
|
|||||||
* must be separated by "," */
|
* must be separated by "," */
|
||||||
ptr = strtok( Arg, "," );
|
ptr = strtok( Arg, "," );
|
||||||
while (ptr) {
|
while (ptr) {
|
||||||
ngt_TrimStr( ptr );
|
ngt_TrimStr(ptr);
|
||||||
port = atol( ptr );
|
port = atoi(ptr);
|
||||||
if (port > 0 && port < 0xFFFF) {
|
if (port > 0 && port < 0xFFFF) {
|
||||||
port16 = (UINT16) port;
|
port16 = (UINT16) port;
|
||||||
if (!array_catb(a, (char*)&port16, sizeof port16))
|
if (!array_catb(a, (char*)&port16, sizeof port16))
|
||||||
@@ -199,6 +227,41 @@ yesno_to_str(int boolean_value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
opers_free(void)
|
||||||
|
{
|
||||||
|
struct Conf_Oper *op;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
len = array_length(&Conf_Opers, sizeof(*op));
|
||||||
|
op = array_start(&Conf_Opers);
|
||||||
|
while (len--) {
|
||||||
|
free(op->mask);
|
||||||
|
op++;
|
||||||
|
}
|
||||||
|
array_free(&Conf_Opers);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
opers_puts(void)
|
||||||
|
{
|
||||||
|
struct Conf_Oper *op;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
len = array_length(&Conf_Opers, sizeof(*op));
|
||||||
|
op = array_start(&Conf_Opers);
|
||||||
|
while (len--) {
|
||||||
|
assert(op->name[0]);
|
||||||
|
|
||||||
|
puts("[OPERATOR]");
|
||||||
|
printf(" Name = %s\n", op->name);
|
||||||
|
printf(" Password = %s\n", op->pwd);
|
||||||
|
printf(" Mask = %s\n\n", op->mask ? op->mask : "");
|
||||||
|
op++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
GLOBAL int
|
GLOBAL int
|
||||||
Conf_Test( void )
|
Conf_Test( void )
|
||||||
{
|
{
|
||||||
@@ -228,60 +291,65 @@ Conf_Test( void )
|
|||||||
}
|
}
|
||||||
|
|
||||||
puts( "[GLOBAL]" );
|
puts( "[GLOBAL]" );
|
||||||
printf( " Name = %s\n", Conf_ServerName );
|
printf(" Name = %s\n", Conf_ServerName);
|
||||||
printf( " Info = %s\n", Conf_ServerInfo );
|
printf(" Info = %s\n", Conf_ServerInfo);
|
||||||
printf( " Password = %s\n", Conf_ServerPwd );
|
#ifndef PAM
|
||||||
printf( " AdminInfo1 = %s\n", Conf_ServerAdmin1 );
|
printf(" Password = %s\n", Conf_ServerPwd);
|
||||||
printf( " AdminInfo2 = %s\n", Conf_ServerAdmin2 );
|
#endif
|
||||||
printf( " AdminEMail = %s\n", Conf_ServerAdminMail );
|
printf(" WebircPassword = %s\n", Conf_WebircPwd);
|
||||||
printf( " MotdFile = %s\n", Conf_MotdFile );
|
printf(" AdminInfo1 = %s\n", Conf_ServerAdmin1);
|
||||||
printf( " MotdPhrase = %s\n", Conf_MotdPhrase );
|
printf(" AdminInfo2 = %s\n", Conf_ServerAdmin2);
|
||||||
printf( " ChrootDir = %s\n", Conf_Chroot );
|
printf(" AdminEMail = %s\n", Conf_ServerAdminMail);
|
||||||
printf( " PidFile = %s\n", Conf_PidFile);
|
printf(" MotdFile = %s\n", Conf_MotdFile);
|
||||||
|
printf(" MotdPhrase = %.32s\n", array_bytes(&Conf_Motd) ? (const char*) array_start(&Conf_Motd) : "");
|
||||||
|
printf(" ChrootDir = %s\n", Conf_Chroot);
|
||||||
|
printf(" PidFile = %s\n", Conf_PidFile);
|
||||||
printf(" Listen = %s\n", Conf_ListenAddress);
|
printf(" Listen = %s\n", Conf_ListenAddress);
|
||||||
fputs(" Ports = ", stdout);
|
fputs(" Ports = ", stdout);
|
||||||
|
|
||||||
ports_puts(&Conf_ListenPorts);
|
ports_puts(&Conf_ListenPorts);
|
||||||
#ifdef SSL_SUPPORT
|
#ifdef SSL_SUPPORT
|
||||||
fputs(" SSLPorts = ", stdout);
|
fputs(" SSLPorts = ", stdout);
|
||||||
ports_puts(&Conf_SSLOptions.ListenPorts);
|
ports_puts(&Conf_SSLOptions.ListenPorts);
|
||||||
ConfSSL_Puts();
|
if (!ConfSSL_Puts())
|
||||||
|
config_valid = false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
pwd = getpwuid( Conf_UID );
|
pwd = getpwuid(Conf_UID);
|
||||||
if( pwd ) printf( " ServerUID = %s\n", pwd->pw_name );
|
if (pwd)
|
||||||
else printf( " ServerUID = %ld\n", (long)Conf_UID );
|
printf(" ServerUID = %s\n", pwd->pw_name);
|
||||||
grp = getgrgid( Conf_GID );
|
else
|
||||||
if( grp ) printf( " ServerGID = %s\n", grp->gr_name );
|
printf(" ServerUID = %ld\n", (long)Conf_UID);
|
||||||
else printf( " ServerGID = %ld\n", (long)Conf_GID );
|
grp = getgrgid(Conf_GID);
|
||||||
printf( " PingTimeout = %d\n", Conf_PingTimeout );
|
if (grp)
|
||||||
printf( " PongTimeout = %d\n", Conf_PongTimeout );
|
printf(" ServerGID = %s\n", grp->gr_name);
|
||||||
printf( " ConnectRetry = %d\n", Conf_ConnectRetry );
|
else
|
||||||
printf( " OperCanUseMode = %s\n", yesno_to_str(Conf_OperCanMode));
|
printf(" ServerGID = %ld\n", (long)Conf_GID);
|
||||||
printf( " OperServerMode = %s\n", yesno_to_str(Conf_OperServerMode));
|
#ifdef SYSLOG
|
||||||
printf( " PredefChannelsOnly = %s\n", yesno_to_str(Conf_PredefChannelsOnly));
|
printf(" SyslogFacility = %s\n",
|
||||||
printf( " NoDNS = %s\n", yesno_to_str(Conf_NoDNS));
|
ngt_SyslogFacilityName(Conf_SyslogFacility));
|
||||||
printf( " NoIdent = %s\n", yesno_to_str(Conf_NoIdent));
|
#endif
|
||||||
|
printf(" PingTimeout = %d\n", Conf_PingTimeout);
|
||||||
|
printf(" PongTimeout = %d\n", Conf_PongTimeout);
|
||||||
|
printf(" ConnectRetry = %d\n", Conf_ConnectRetry);
|
||||||
|
printf(" OperCanUseMode = %s\n", yesno_to_str(Conf_OperCanMode));
|
||||||
|
printf(" OperServerMode = %s\n", yesno_to_str(Conf_OperServerMode));
|
||||||
|
printf(" AllowRemoteOper = %s\n", yesno_to_str(Conf_AllowRemoteOper));
|
||||||
|
printf(" PredefChannelsOnly = %s\n", yesno_to_str(Conf_PredefChannelsOnly));
|
||||||
|
printf(" NoDNS = %s\n", yesno_to_str(Conf_NoDNS));
|
||||||
|
printf(" NoIdent = %s\n", yesno_to_str(Conf_NoIdent));
|
||||||
|
printf(" NoPAM = %s\n", yesno_to_str(Conf_NoPAM));
|
||||||
|
printf(" NoZeroConf = %s\n", yesno_to_str(Conf_NoZeroConf));
|
||||||
|
|
||||||
#ifdef WANT_IPV6
|
#ifdef WANT_IPV6
|
||||||
printf(" ConnectIPv4 = %s\n", yesno_to_str(Conf_ConnectIPv6));
|
printf(" ConnectIPv4 = %s\n", yesno_to_str(Conf_ConnectIPv6));
|
||||||
printf(" ConnectIPv6 = %s\n", yesno_to_str(Conf_ConnectIPv4));
|
printf(" ConnectIPv6 = %s\n", yesno_to_str(Conf_ConnectIPv4));
|
||||||
#endif
|
#endif
|
||||||
printf( " MaxConnections = %ld\n", Conf_MaxConnections);
|
printf(" MaxConnections = %ld\n", Conf_MaxConnections);
|
||||||
printf( " MaxConnectionsIP = %d\n", Conf_MaxConnectionsIP);
|
printf(" MaxConnectionsIP = %d\n", Conf_MaxConnectionsIP);
|
||||||
printf( " MaxJoins = %d\n", Conf_MaxJoins>0 ? Conf_MaxJoins : -1);
|
printf(" MaxJoins = %d\n", Conf_MaxJoins > 0 ? Conf_MaxJoins : -1);
|
||||||
printf( " MaxNickLength = %u\n\n", Conf_MaxNickLength - 1);
|
printf(" MaxNickLength = %u\n\n", Conf_MaxNickLength - 1);
|
||||||
|
|
||||||
for( i = 0; i < Conf_Oper_Count; i++ ) {
|
opers_puts();
|
||||||
if( ! Conf_Oper[i].name[0] ) continue;
|
|
||||||
|
|
||||||
/* Valid "Operator" section */
|
|
||||||
puts( "[OPERATOR]" );
|
|
||||||
printf( " Name = %s\n", Conf_Oper[i].name );
|
|
||||||
printf( " Password = %s\n", Conf_Oper[i].pwd );
|
|
||||||
if ( Conf_Oper[i].mask ) printf( " Mask = %s\n", Conf_Oper[i].mask );
|
|
||||||
puts( "" );
|
|
||||||
}
|
|
||||||
|
|
||||||
for( i = 0; i < MAX_SERVERS; i++ ) {
|
for( i = 0; i < MAX_SERVERS; i++ ) {
|
||||||
if( ! Conf_Server[i].name[0] ) continue;
|
if( ! Conf_Server[i].name[0] ) continue;
|
||||||
@@ -400,7 +468,7 @@ Conf_EnableServer( const char *Name, UINT16 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 (Conf_Server[i].port && Conf_Server[i].host[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -487,47 +555,48 @@ Conf_IsService(int ConfServer, const char *Nick)
|
|||||||
} /* Conf_IsService */
|
} /* Conf_IsService */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize configuration settings with their default values.
|
||||||
|
*/
|
||||||
static void
|
static void
|
||||||
Set_Defaults( bool InitServers )
|
Set_Defaults(bool InitServers)
|
||||||
{
|
{
|
||||||
/* Initialize configuration variables with default values. */
|
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
strcpy( Conf_ServerName, "" );
|
strcpy(Conf_ServerName, "");
|
||||||
snprintf( Conf_ServerInfo, sizeof Conf_ServerInfo, "%s %s", PACKAGE_NAME, PACKAGE_VERSION );
|
snprintf(Conf_ServerInfo, sizeof Conf_ServerInfo, "%s %s",
|
||||||
strcpy( Conf_ServerPwd, "" );
|
PACKAGE_NAME, PACKAGE_VERSION);
|
||||||
|
strcpy(Conf_ServerPwd, "");
|
||||||
|
|
||||||
strcpy( Conf_ServerAdmin1, "" );
|
strcpy(Conf_ServerAdmin1, "");
|
||||||
strcpy( Conf_ServerAdmin2, "" );
|
strcpy(Conf_ServerAdmin2, "");
|
||||||
strcpy( Conf_ServerAdminMail, "" );
|
strcpy(Conf_ServerAdminMail, "");
|
||||||
|
|
||||||
strlcpy( Conf_MotdFile, SYSCONFDIR, sizeof( Conf_MotdFile ));
|
strlcpy(Conf_MotdFile, SYSCONFDIR, sizeof(Conf_MotdFile));
|
||||||
strlcat( Conf_MotdFile, MOTD_FILE, sizeof( Conf_MotdFile ));
|
strlcat(Conf_MotdFile, MOTD_FILE, sizeof(Conf_MotdFile));
|
||||||
|
|
||||||
strlcpy( Conf_MotdPhrase, MOTD_PHRASE, sizeof( Conf_MotdPhrase ));
|
Conf_UID = Conf_GID = 0;
|
||||||
|
strlcpy(Conf_Chroot, CHROOT_DIR, sizeof(Conf_Chroot));
|
||||||
strlcpy( Conf_Chroot, CHROOT_DIR, sizeof( Conf_Chroot ));
|
strlcpy(Conf_PidFile, PID_FILE, sizeof(Conf_PidFile));
|
||||||
|
|
||||||
strlcpy( Conf_PidFile, PID_FILE, sizeof( Conf_PidFile ));
|
|
||||||
|
|
||||||
free(Conf_ListenAddress);
|
free(Conf_ListenAddress);
|
||||||
Conf_ListenAddress = NULL;
|
Conf_ListenAddress = NULL;
|
||||||
Conf_UID = Conf_GID = 0;
|
|
||||||
|
|
||||||
Conf_PingTimeout = 120;
|
Conf_PingTimeout = 120;
|
||||||
Conf_PongTimeout = 20;
|
Conf_PongTimeout = 20;
|
||||||
|
|
||||||
Conf_ConnectRetry = 60;
|
Conf_ConnectRetry = 60;
|
||||||
|
Conf_NoDNS = false;
|
||||||
|
Conf_NoIdent = false;
|
||||||
|
Conf_NoPAM = false;
|
||||||
|
Conf_NoZeroConf = false;
|
||||||
|
|
||||||
Conf_Oper_Count = 0;
|
Conf_Oper_Count = 0;
|
||||||
Conf_Channel_Count = 0;
|
Conf_Channel_Count = 0;
|
||||||
|
|
||||||
Conf_OperCanMode = false;
|
Conf_OperCanMode = false;
|
||||||
Conf_NoDNS = false;
|
|
||||||
Conf_NoIdent = false;
|
|
||||||
Conf_PredefChannelsOnly = false;
|
|
||||||
Conf_OperServerMode = false;
|
Conf_OperServerMode = false;
|
||||||
|
Conf_AllowRemoteOper = false;
|
||||||
|
Conf_PredefChannelsOnly = false;
|
||||||
|
|
||||||
Conf_ConnectIPv4 = true;
|
Conf_ConnectIPv4 = true;
|
||||||
Conf_ConnectIPv6 = true;
|
Conf_ConnectIPv6 = true;
|
||||||
@@ -537,11 +606,62 @@ Set_Defaults( bool InitServers )
|
|||||||
Conf_MaxJoins = 10;
|
Conf_MaxJoins = 10;
|
||||||
Conf_MaxNickLength = CLIENT_NICK_LEN_DEFAULT;
|
Conf_MaxNickLength = CLIENT_NICK_LEN_DEFAULT;
|
||||||
|
|
||||||
|
#ifdef SYSLOG
|
||||||
|
#ifdef LOG_LOCAL5
|
||||||
|
Conf_SyslogFacility = LOG_LOCAL5;
|
||||||
|
#else
|
||||||
|
Conf_SyslogFacility = 0;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Initialize server configuration structures */
|
/* Initialize server configuration structures */
|
||||||
if( InitServers ) for( i = 0; i < MAX_SERVERS; Init_Server_Struct( &Conf_Server[i++] ));
|
if (InitServers) {
|
||||||
|
for (i = 0; i < MAX_SERVERS;
|
||||||
|
Init_Server_Struct(&Conf_Server[i++]));
|
||||||
|
}
|
||||||
} /* Set_Defaults */
|
} /* Set_Defaults */
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
no_listenports(void)
|
||||||
|
{
|
||||||
|
size_t cnt = array_bytes(&Conf_ListenPorts);
|
||||||
|
#ifdef SSL_SUPPORT
|
||||||
|
cnt += array_bytes(&Conf_SSLOptions.ListenPorts);
|
||||||
|
#endif
|
||||||
|
return cnt == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
Read_Motd(const char *filename)
|
||||||
|
{
|
||||||
|
char line[127];
|
||||||
|
FILE *fp;
|
||||||
|
|
||||||
|
if (*filename == '\0')
|
||||||
|
return;
|
||||||
|
|
||||||
|
fp = fopen(filename, "r");
|
||||||
|
if (!fp) {
|
||||||
|
Log(LOG_WARNING, "Can't read MOTD file \"%s\": %s",
|
||||||
|
filename, strerror(errno));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
array_free(&Conf_Motd);
|
||||||
|
|
||||||
|
while (fgets(line, (int)sizeof line, fp)) {
|
||||||
|
ngt_TrimLastChr( line, '\n');
|
||||||
|
|
||||||
|
/* add text including \0 */
|
||||||
|
if (!array_catb(&Conf_Motd, line, strlen(line) + 1)) {
|
||||||
|
Log(LOG_WARNING, "Cannot add MOTD text: %s", strerror(errno));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
Read_Config( bool ngircd_starting )
|
Read_Config( bool ngircd_starting )
|
||||||
{
|
{
|
||||||
@@ -564,6 +684,7 @@ Read_Config( bool ngircd_starting )
|
|||||||
exit( 1 );
|
exit( 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
opers_free();
|
||||||
Set_Defaults( ngircd_starting );
|
Set_Defaults( ngircd_starting );
|
||||||
|
|
||||||
Config_Error( LOG_INFO, "Reading configuration from \"%s\" ...", NGIRCd_ConfFile );
|
Config_Error( LOG_INFO, "Reading configuration from \"%s\" ...", NGIRCd_ConfFile );
|
||||||
@@ -622,21 +743,6 @@ Read_Config( bool ngircd_starting )
|
|||||||
if( strcasecmp( section, "[GLOBAL]" ) == 0 )
|
if( strcasecmp( section, "[GLOBAL]" ) == 0 )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( strcasecmp( section, "[OPERATOR]" ) == 0 ) {
|
|
||||||
if( Conf_Oper_Count + 1 > MAX_OPERATORS )
|
|
||||||
Config_Error( LOG_ERR, "Too many operators configured.");
|
|
||||||
else {
|
|
||||||
/* Initialize new operator structure */
|
|
||||||
Conf_Oper[Conf_Oper_Count].name[0] = '\0';
|
|
||||||
Conf_Oper[Conf_Oper_Count].pwd[0] = '\0';
|
|
||||||
if (Conf_Oper[Conf_Oper_Count].mask) {
|
|
||||||
free(Conf_Oper[Conf_Oper_Count].mask );
|
|
||||||
Conf_Oper[Conf_Oper_Count].mask = NULL;
|
|
||||||
}
|
|
||||||
Conf_Oper_Count++;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if( strcasecmp( section, "[SERVER]" ) == 0 ) {
|
if( strcasecmp( section, "[SERVER]" ) == 0 ) {
|
||||||
/* Check if there is already a server to add */
|
/* Check if there is already a server to add */
|
||||||
if( New_Server.name[0] ) {
|
if( New_Server.name[0] ) {
|
||||||
@@ -665,6 +771,10 @@ Read_Config( bool ngircd_starting )
|
|||||||
Conf_Channel_Count++;
|
Conf_Channel_Count++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (strcasecmp(section, "[OPERATOR]") == 0) {
|
||||||
|
Conf_Oper_Count++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
Config_Error( LOG_ERR, "%s, line %d: Unknown section \"%s\"!", NGIRCd_ConfFile, line, section );
|
Config_Error( LOG_ERR, "%s, line %d: Unknown section \"%s\"!", NGIRCd_ConfFile, line, section );
|
||||||
section[0] = 0x1;
|
section[0] = 0x1;
|
||||||
@@ -698,12 +808,14 @@ Read_Config( bool ngircd_starting )
|
|||||||
Conf_Server[New_Server_Idx] = New_Server;
|
Conf_Server[New_Server_Idx] = New_Server;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 == array_length(&Conf_ListenPorts, sizeof(UINT16))) {
|
/* not a single listening port? Add default. */
|
||||||
if (!array_copyb(&Conf_ListenPorts, (char*) &defaultport, sizeof defaultport)) {
|
if (no_listenports() &&
|
||||||
Config_Error( LOG_ALERT, "Could not add default listening Port %u: %s",
|
!array_copyb(&Conf_ListenPorts, (char*) &defaultport, sizeof defaultport))
|
||||||
(unsigned int) defaultport, strerror(errno));
|
{
|
||||||
exit( 1 );
|
Config_Error(LOG_ALERT, "Could not add default listening Port %u: %s",
|
||||||
}
|
(unsigned int) defaultport, strerror(errno));
|
||||||
|
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Conf_ListenAddress)
|
if (!Conf_ListenAddress)
|
||||||
@@ -713,6 +825,10 @@ Read_Config( bool ngircd_starting )
|
|||||||
Config_Error(LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME);
|
Config_Error(LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* No MOTD phrase configured? (re)try motd file. */
|
||||||
|
if (array_bytes(&Conf_Motd) == 0)
|
||||||
|
Read_Motd(Conf_MotdFile);
|
||||||
return true;
|
return true;
|
||||||
} /* Read_Config */
|
} /* Read_Config */
|
||||||
|
|
||||||
@@ -728,7 +844,8 @@ Check_ArgIsTrue( const char *Arg )
|
|||||||
} /* Check_ArgIsTrue */
|
} /* Check_ArgIsTrue */
|
||||||
|
|
||||||
|
|
||||||
static unsigned int Handle_MaxNickLength(int Line, const char *Arg)
|
static unsigned int
|
||||||
|
Handle_MaxNickLength(int Line, const char *Arg)
|
||||||
{
|
{
|
||||||
unsigned new;
|
unsigned new;
|
||||||
|
|
||||||
@@ -749,6 +866,7 @@ static unsigned int Handle_MaxNickLength(int Line, const char *Arg)
|
|||||||
} /* Handle_MaxNickLength */
|
} /* Handle_MaxNickLength */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
Handle_GLOBAL( int Line, char *Var, char *Arg )
|
Handle_GLOBAL( int Line, char *Var, char *Arg )
|
||||||
{
|
{
|
||||||
@@ -781,6 +899,13 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
|
|||||||
Config_Error_TooLong( Line, Var );
|
Config_Error_TooLong( Line, Var );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (strcasecmp(Var, "WebircPassword") == 0) {
|
||||||
|
/* Password required for WEBIRC command */
|
||||||
|
len = strlcpy(Conf_WebircPwd, Arg, sizeof(Conf_WebircPwd));
|
||||||
|
if (len >= sizeof(Conf_WebircPwd))
|
||||||
|
Config_Error_TooLong(Line, Var);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if( strcasecmp( Var, "AdminInfo1" ) == 0 ) {
|
if( strcasecmp( Var, "AdminInfo1" ) == 0 ) {
|
||||||
/* Administrative info #1 */
|
/* Administrative info #1 */
|
||||||
len = strlcpy( Conf_ServerAdmin1, Arg, sizeof( Conf_ServerAdmin1 ));
|
len = strlcpy( Conf_ServerAdmin1, Arg, sizeof( Conf_ServerAdmin1 ));
|
||||||
@@ -808,17 +933,24 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if( strcasecmp( Var, "MotdFile" ) == 0 ) {
|
if( strcasecmp( Var, "MotdFile" ) == 0 ) {
|
||||||
/* "Message of the day" (MOTD) file */
|
|
||||||
len = strlcpy( Conf_MotdFile, Arg, sizeof( Conf_MotdFile ));
|
len = strlcpy( Conf_MotdFile, Arg, sizeof( Conf_MotdFile ));
|
||||||
if (len >= sizeof( Conf_MotdFile ))
|
if (len >= sizeof( Conf_MotdFile ))
|
||||||
Config_Error_TooLong( Line, Var );
|
Config_Error_TooLong( Line, Var );
|
||||||
|
Read_Motd(Arg);
|
||||||
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) */
|
||||||
len = strlcpy( Conf_MotdPhrase, Arg, sizeof( Conf_MotdPhrase ));
|
len = strlen(Arg);
|
||||||
if (len >= sizeof( Conf_MotdPhrase ))
|
if (len == 0)
|
||||||
|
return;
|
||||||
|
if (len >= LINE_LEN) {
|
||||||
Config_Error_TooLong( Line, Var );
|
Config_Error_TooLong( Line, Var );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!array_copyb(&Conf_Motd, Arg, len + 1))
|
||||||
|
Config_Error(LOG_WARNING, "%s, line %d: Could not append MotdPhrase: %s",
|
||||||
|
NGIRCd_ConfFile, Line, strerror(errno));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if( strcasecmp( Var, "ChrootDir" ) == 0 ) {
|
if( strcasecmp( Var, "ChrootDir" ) == 0 ) {
|
||||||
@@ -914,6 +1046,16 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
|
|||||||
#endif
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if(strcasecmp(Var, "NoPAM") == 0) {
|
||||||
|
/* don't use PAM library to authenticate users */
|
||||||
|
Conf_NoPAM = Check_ArgIsTrue(Arg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(strcasecmp(Var, "NoZeroConf") == 0) {
|
||||||
|
/* don't register services using ZeroConf */
|
||||||
|
Conf_NoZeroConf = Check_ArgIsTrue(Arg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
#ifdef WANT_IPV6
|
#ifdef WANT_IPV6
|
||||||
/* the default setting for all the WANT_IPV6 special options is 'true' */
|
/* the default setting for all the WANT_IPV6 special options is 'true' */
|
||||||
if( strcasecmp( Var, "ConnectIPv6" ) == 0 ) {
|
if( strcasecmp( Var, "ConnectIPv6" ) == 0 ) {
|
||||||
@@ -938,6 +1080,11 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
|
|||||||
Conf_OperServerMode = Check_ArgIsTrue( Arg );
|
Conf_OperServerMode = Check_ArgIsTrue( Arg );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if(strcasecmp(Var, "AllowRemoteOper") == 0) {
|
||||||
|
/* Are remote IRC operators allowed to control this server? */
|
||||||
|
Conf_AllowRemoteOper = Check_ArgIsTrue(Arg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if( strcasecmp( Var, "MaxConnections" ) == 0 ) {
|
if( strcasecmp( Var, "MaxConnections" ) == 0 ) {
|
||||||
/* Maximum number of connections. 0 -> "no limit". */
|
/* Maximum number of connections. 0 -> "no limit". */
|
||||||
#ifdef HAVE_ISDIGIT
|
#ifdef HAVE_ISDIGIT
|
||||||
@@ -1020,6 +1167,13 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
|
|||||||
Conf_SSLOptions.DHFile = strdup_warn( Arg );
|
Conf_SSLOptions.DHFile = strdup_warn( Arg );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef SYSLOG
|
||||||
|
if (strcasecmp(Var, "SyslogFacility") == 0) {
|
||||||
|
Conf_SyslogFacility = ngt_SyslogFacilityID(Arg,
|
||||||
|
Conf_SyslogFacility);
|
||||||
|
return;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
Config_Error(LOG_ERR, "%s, line %d (section \"Global\"): Unknown variable \"%s\"!",
|
Config_Error(LOG_ERR, "%s, line %d (section \"Global\"): Unknown variable \"%s\"!",
|
||||||
NGIRCd_ConfFile, Line, Var);
|
NGIRCd_ConfFile, Line, Var);
|
||||||
@@ -1029,36 +1183,38 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
|
|||||||
static void
|
static void
|
||||||
Handle_OPERATOR( int Line, char *Var, char *Arg )
|
Handle_OPERATOR( int Line, char *Var, char *Arg )
|
||||||
{
|
{
|
||||||
unsigned int opercount;
|
|
||||||
size_t len;
|
size_t len;
|
||||||
|
struct Conf_Oper *op;
|
||||||
|
|
||||||
assert( Line > 0 );
|
assert( Line > 0 );
|
||||||
assert( Var != NULL );
|
assert( Var != NULL );
|
||||||
assert( Arg != NULL );
|
assert( Arg != NULL );
|
||||||
assert( Conf_Oper_Count > 0 );
|
assert( Conf_Oper_Count > 0 );
|
||||||
|
|
||||||
if ( Conf_Oper_Count == 0 )
|
op = array_alloc(&Conf_Opers, sizeof(*op), Conf_Oper_Count - 1);
|
||||||
|
if (!op) {
|
||||||
|
Config_Error(LOG_ERR, "Could not allocate memory for operator (%d:%s = %s)", Line, Var, Arg);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
opercount = Conf_Oper_Count - 1;
|
if (strcasecmp(Var, "Name") == 0) {
|
||||||
|
|
||||||
if( strcasecmp( Var, "Name" ) == 0 ) {
|
|
||||||
/* Name of IRC operator */
|
/* Name of IRC operator */
|
||||||
len = strlcpy( Conf_Oper[opercount].name, Arg, sizeof( Conf_Oper[opercount].name ));
|
len = strlcpy(op->name, Arg, sizeof(op->name));
|
||||||
if (len >= sizeof( Conf_Oper[opercount].name ))
|
if (len >= sizeof(op->name))
|
||||||
Config_Error_TooLong( Line, Var );
|
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 */
|
||||||
len = strlcpy( Conf_Oper[opercount].pwd, Arg, sizeof( Conf_Oper[opercount].pwd ));
|
len = strlcpy(op->pwd, Arg, sizeof(op->pwd));
|
||||||
if (len >= sizeof( Conf_Oper[opercount].pwd ))
|
if (len >= sizeof(op->pwd))
|
||||||
Config_Error_TooLong( Line, Var );
|
Config_Error_TooLong(Line, Var);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if( strcasecmp( Var, "Mask" ) == 0 ) {
|
if (strcasecmp(Var, "Mask") == 0) {
|
||||||
if (Conf_Oper[opercount].mask) return; /* Hostname already configured */
|
if (op->mask)
|
||||||
|
return; /* Hostname already configured */
|
||||||
Conf_Oper[opercount].mask = strdup_warn( Arg );
|
op->mask = strdup_warn( Arg );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Config_Error( LOG_ERR, "%s, line %d (section \"Operator\"): Unknown variable \"%s\"!",
|
Config_Error( LOG_ERR, "%s, line %d (section \"Operator\"): Unknown variable \"%s\"!",
|
||||||
@@ -1324,6 +1480,12 @@ Validate_Config(bool Configtest, bool Rehash)
|
|||||||
"No administrative information configured but required by RFC!");
|
"No administrative information configured but required by RFC!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef PAM
|
||||||
|
if (Conf_ServerPwd[0])
|
||||||
|
Config_Error(LOG_ERR,
|
||||||
|
"This server uses PAM, \"Password\" will be ignored!");
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
servers = servers_once = 0;
|
servers = servers_once = 0;
|
||||||
for (i = 0; i < MAX_SERVERS; i++) {
|
for (i = 0; i < MAX_SERVERS; i++) {
|
||||||
@@ -1389,6 +1551,29 @@ va_dcl
|
|||||||
} /* Config_Error */
|
} /* Config_Error */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
|
||||||
|
GLOBAL void
|
||||||
|
Conf_DebugDump(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
Log(LOG_DEBUG, "Configured servers:");
|
||||||
|
for (i = 0; i < MAX_SERVERS; i++) {
|
||||||
|
if (! Conf_Server[i].name[0])
|
||||||
|
continue;
|
||||||
|
Log(LOG_DEBUG,
|
||||||
|
" - %s: %s:%d, last=%ld, group=%d, flags=%d, conn=%d",
|
||||||
|
Conf_Server[i].name, Conf_Server[i].host,
|
||||||
|
Conf_Server[i].port, Conf_Server[i].lasttry,
|
||||||
|
Conf_Server[i].group, Conf_Server[i].flags,
|
||||||
|
Conf_Server[i].conn_id);
|
||||||
|
}
|
||||||
|
} /* Conf_DebugDump */
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
Init_Server_Struct( CONF_SERVER *Server )
|
Init_Server_Struct( CONF_SERVER *Server )
|
||||||
{
|
{
|
||||||
@@ -1403,7 +1588,7 @@ Init_Server_Struct( CONF_SERVER *Server )
|
|||||||
|
|
||||||
if( NGIRCd_Passive ) Server->flags = CONF_SFLAG_DISABLED;
|
if( NGIRCd_Passive ) Server->flags = CONF_SFLAG_DISABLED;
|
||||||
|
|
||||||
Resolve_Init(&Server->res_stat);
|
Proc_InitStruct(&Server->res_stat);
|
||||||
Server->conn_id = NONE;
|
Server->conn_id = NONE;
|
||||||
memset(&Server->bind_addr, 0, sizeof(&Server->bind_addr));
|
memset(&Server->bind_addr, 0, sizeof(&Server->bind_addr));
|
||||||
} /* Init_Server_Struct */
|
} /* Init_Server_Struct */
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2008 Alexander Barton (alex@barton.de)
|
* Copyright (c)2001-2010 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
|
||||||
@@ -22,16 +22,15 @@
|
|||||||
#include "portab.h"
|
#include "portab.h"
|
||||||
#include "tool.h"
|
#include "tool.h"
|
||||||
#include "ng_ipaddr.h"
|
#include "ng_ipaddr.h"
|
||||||
#include "resolve.h"
|
#include "proc.h"
|
||||||
#include "conf-ssl.h"
|
#include "conf-ssl.h"
|
||||||
|
|
||||||
|
|
||||||
typedef struct _Conf_Oper
|
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;
|
char *mask; /* allowed host mask */
|
||||||
} CONF_OPER;
|
};
|
||||||
|
|
||||||
typedef struct _Conf_Server
|
typedef struct _Conf_Server
|
||||||
{
|
{
|
||||||
@@ -42,7 +41,7 @@ typedef struct _Conf_Server
|
|||||||
UINT16 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 */
|
PROC_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 */
|
||||||
ng_ipaddr_t bind_addr; /* source address to use for outgoing
|
ng_ipaddr_t bind_addr; /* source address to use for outgoing
|
||||||
@@ -95,11 +94,8 @@ 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 */
|
/* Message of the Day */
|
||||||
GLOBAL char Conf_MotdFile[FNAME_LEN];
|
GLOBAL array Conf_Motd;
|
||||||
|
|
||||||
/* Phrase with MOTD text */
|
|
||||||
GLOBAL char Conf_MotdPhrase[LINE_LEN];
|
|
||||||
|
|
||||||
/* Ports the server should listen on */
|
/* Ports the server should listen on */
|
||||||
GLOBAL array Conf_ListenPorts;
|
GLOBAL array Conf_ListenPorts;
|
||||||
@@ -125,8 +121,7 @@ GLOBAL int Conf_PongTimeout;
|
|||||||
GLOBAL int Conf_ConnectRetry;
|
GLOBAL int Conf_ConnectRetry;
|
||||||
|
|
||||||
/* Operators */
|
/* Operators */
|
||||||
GLOBAL CONF_OPER Conf_Oper[MAX_OPERATORS];
|
GLOBAL array Conf_Opers;
|
||||||
GLOBAL unsigned int Conf_Oper_Count;
|
|
||||||
|
|
||||||
/* Servers */
|
/* Servers */
|
||||||
GLOBAL CONF_SERVER Conf_Server[MAX_SERVERS];
|
GLOBAL CONF_SERVER Conf_Server[MAX_SERVERS];
|
||||||
@@ -140,12 +135,26 @@ GLOBAL bool Conf_PredefChannelsOnly;
|
|||||||
/* Are IRC operators allowed to always use MODE? */
|
/* Are IRC operators allowed to always use MODE? */
|
||||||
GLOBAL bool 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;
|
||||||
|
|
||||||
|
/* Are remote IRC operators allowed to manage this server? */
|
||||||
|
GLOBAL bool Conf_AllowRemoteOper;
|
||||||
|
|
||||||
/* Disable all DNS functions? */
|
/* Disable all DNS functions? */
|
||||||
GLOBAL bool Conf_NoDNS;
|
GLOBAL bool Conf_NoDNS;
|
||||||
|
|
||||||
/* Disable IDENT lookups, even when compiled with support for it */
|
/* Disable IDENT lookups, even when compiled with support for it */
|
||||||
GLOBAL bool Conf_NoIdent;
|
GLOBAL bool Conf_NoIdent;
|
||||||
|
|
||||||
|
/* Disable all usage of PAM, even when compiled with support for it */
|
||||||
|
GLOBAL bool Conf_NoPAM;
|
||||||
|
|
||||||
|
/* Disable service registration using "ZeroConf" */
|
||||||
|
GLOBAL bool Conf_NoZeroConf;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* try to connect to remote systems using the ipv6 protocol,
|
* try to connect to remote systems using the ipv6 protocol,
|
||||||
* if they have an ipv6 address? (default yes)
|
* if they have an ipv6 address? (default yes)
|
||||||
@@ -155,11 +164,6 @@ GLOBAL bool Conf_ConnectIPv6;
|
|||||||
/* same as above, but for ipv4 hosts, default: yes */
|
/* same as above, but for ipv4 hosts, default: yes */
|
||||||
GLOBAL bool Conf_ConnectIPv4;
|
GLOBAL bool Conf_ConnectIPv4;
|
||||||
|
|
||||||
/* 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;
|
||||||
|
|
||||||
@@ -172,6 +176,13 @@ GLOBAL int Conf_MaxConnectionsIP;
|
|||||||
/* Maximum length of a nick name */
|
/* Maximum length of a nick name */
|
||||||
GLOBAL unsigned int Conf_MaxNickLength;
|
GLOBAL unsigned int Conf_MaxNickLength;
|
||||||
|
|
||||||
|
#ifdef SYSLOG
|
||||||
|
|
||||||
|
/* Syslog "facility" */
|
||||||
|
GLOBAL int Conf_SyslogFacility;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
GLOBAL void Conf_Init PARAMS((void));
|
GLOBAL void Conf_Init PARAMS((void));
|
||||||
GLOBAL bool Conf_Rehash PARAMS((void));
|
GLOBAL bool Conf_Rehash PARAMS((void));
|
||||||
GLOBAL int Conf_Test PARAMS((void));
|
GLOBAL int Conf_Test PARAMS((void));
|
||||||
@@ -187,6 +198,13 @@ GLOBAL bool Conf_AddServer PARAMS(( const char *Name, UINT16 Port, const char *H
|
|||||||
|
|
||||||
GLOBAL bool Conf_IsService PARAMS((int ConfServer, const char *Nick));
|
GLOBAL bool Conf_IsService PARAMS((int ConfServer, const char *Nick));
|
||||||
|
|
||||||
|
/* Password required by WEBIRC command */
|
||||||
|
GLOBAL char Conf_WebircPwd[CLIENT_PASS_LEN];
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
GLOBAL void Conf_DebugDump PARAMS((void));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -273,6 +273,16 @@ Conn_RecvBytes( CONN_ID Idx )
|
|||||||
return My_Connections[Idx].bytes_in;
|
return My_Connections[Idx].bytes_in;
|
||||||
} /* Conn_RecvBytes */
|
} /* Conn_RecvBytes */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the remote IP address of this connection as string.
|
||||||
|
*/
|
||||||
|
GLOBAL const char *
|
||||||
|
Conn_IPA(CONN_ID Idx)
|
||||||
|
{
|
||||||
|
assert (Idx > NONE);
|
||||||
|
return ng_ipaddr_tostr(&My_Connections[Idx].addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
GLOBAL void
|
GLOBAL void
|
||||||
Conn_ResetWCounter( void )
|
Conn_ResetWCounter( void )
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ 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 const char *Conn_IPA 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 ));
|
||||||
|
|||||||
@@ -383,10 +383,10 @@ ConnSSL_Init_SSL(CONNECTION *c)
|
|||||||
int ret;
|
int ret;
|
||||||
assert(c != NULL);
|
assert(c != NULL);
|
||||||
#ifdef HAVE_LIBSSL
|
#ifdef HAVE_LIBSSL
|
||||||
assert(ssl_ctx);
|
if (!ssl_ctx) {
|
||||||
if (!ssl_ctx) /* NULL when library initialization failed */
|
Log(LOG_ERR, "Cannot init ssl_ctx: OpenSSL initialization failed at startup");
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
assert(c->ssl_state.ssl == NULL);
|
assert(c->ssl_state.ssl == NULL);
|
||||||
|
|
||||||
c->ssl_state.ssl = SSL_new(ssl_ctx);
|
c->ssl_state.ssl = SSL_new(ssl_ctx);
|
||||||
@@ -407,6 +407,7 @@ ConnSSL_Init_SSL(CONNECTION *c)
|
|||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
Log(LOG_ERR, "gnutls_set_default_priority: %s", gnutls_strerror(ret));
|
Log(LOG_ERR, "gnutls_set_default_priority: %s", gnutls_strerror(ret));
|
||||||
ConnSSL_Free(c);
|
ConnSSL_Free(c);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* The intermediate (long) cast is here to avoid a warning like:
|
* The intermediate (long) cast is here to avoid a warning like:
|
||||||
@@ -419,6 +420,7 @@ ConnSSL_Init_SSL(CONNECTION *c)
|
|||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
Log(LOG_ERR, "gnutls_credentials_set: %s", gnutls_strerror(ret));
|
Log(LOG_ERR, "gnutls_credentials_set: %s", gnutls_strerror(ret));
|
||||||
ConnSSL_Free(c);
|
ConnSSL_Free(c);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
gnutls_dh_set_prime_bits(c->ssl_state.gnutls_session, DH_BITS);
|
gnutls_dh_set_prime_bits(c->ssl_state.gnutls_session, DH_BITS);
|
||||||
#endif
|
#endif
|
||||||
@@ -433,10 +435,7 @@ ConnSSL_PrepareConnect(CONNECTION *c, UNUSED CONF_SERVER *s)
|
|||||||
bool ret;
|
bool ret;
|
||||||
#ifdef HAVE_LIBGNUTLS
|
#ifdef HAVE_LIBGNUTLS
|
||||||
int err;
|
int err;
|
||||||
#endif
|
|
||||||
assert(c != NULL);
|
|
||||||
assert(s != NULL);
|
|
||||||
#ifdef HAVE_LIBGNUTLS
|
|
||||||
err = gnutls_init(&c->ssl_state.gnutls_session, GNUTLS_CLIENT);
|
err = gnutls_init(&c->ssl_state.gnutls_session, GNUTLS_CLIENT);
|
||||||
if (err) {
|
if (err) {
|
||||||
Log(LOG_ERR, "gnutls_init: %s", gnutls_strerror(err));
|
Log(LOG_ERR, "gnutls_init: %s", gnutls_strerror(err));
|
||||||
@@ -471,8 +470,6 @@ ConnSSL_HandleError( CONNECTION *c, const int code, const char *fname )
|
|||||||
unsigned long sslerr;
|
unsigned long sslerr;
|
||||||
int real_errno = errno;
|
int real_errno = errno;
|
||||||
|
|
||||||
assert( fname );
|
|
||||||
|
|
||||||
ret = SSL_get_error(c->ssl_state.ssl, code);
|
ret = SSL_get_error(c->ssl_state.ssl, code);
|
||||||
switch (ret) {
|
switch (ret) {
|
||||||
case SSL_ERROR_WANT_READ:
|
case SSL_ERROR_WANT_READ:
|
||||||
@@ -518,15 +515,14 @@ ConnSSL_HandleError( CONNECTION *c, const int code, const char *fname )
|
|||||||
switch (code) {
|
switch (code) {
|
||||||
case GNUTLS_E_AGAIN:
|
case GNUTLS_E_AGAIN:
|
||||||
case GNUTLS_E_INTERRUPTED:
|
case GNUTLS_E_INTERRUPTED:
|
||||||
if (gnutls_record_get_direction(c->ssl_state.gnutls_session)) { /* need write */
|
if (gnutls_record_get_direction(c->ssl_state.gnutls_session)) {
|
||||||
io_event_del(c->sock, IO_WANTREAD);
|
Conn_OPTION_ADD(c, CONN_SSL_WANT_WRITE);
|
||||||
Conn_OPTION_ADD(c, CONN_SSL_WANT_WRITE); /* fall through */
|
io_event_del(c->sock, IO_WANTREAD);
|
||||||
|
} else {
|
||||||
|
Conn_OPTION_ADD(c, CONN_SSL_WANT_READ);
|
||||||
|
io_event_del(c->sock, IO_WANTWRITE);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
} else { /* need read */
|
|
||||||
io_event_del(c->sock, IO_WANTWRITE);
|
|
||||||
Conn_OPTION_ADD(c, CONN_SSL_WANT_READ);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
assert(code < 0);
|
assert(code < 0);
|
||||||
if (gnutls_error_is_fatal(code)) {
|
if (gnutls_error_is_fatal(code)) {
|
||||||
@@ -546,8 +542,7 @@ ConnSSL_LogCertInfo( CONNECTION *c )
|
|||||||
#ifdef HAVE_LIBSSL
|
#ifdef HAVE_LIBSSL
|
||||||
SSL *ssl = c->ssl_state.ssl;
|
SSL *ssl = c->ssl_state.ssl;
|
||||||
|
|
||||||
assert( c );
|
assert(ssl);
|
||||||
assert( ssl );
|
|
||||||
|
|
||||||
Log(LOG_INFO, "New %s connection using cipher %s on socket %d.",
|
Log(LOG_INFO, "New %s connection using cipher %s on socket %d.",
|
||||||
SSL_get_version(ssl), SSL_get_cipher(ssl), c->sock);
|
SSL_get_version(ssl), SSL_get_cipher(ssl), c->sock);
|
||||||
@@ -575,11 +570,8 @@ int
|
|||||||
ConnSSL_Accept( CONNECTION *c )
|
ConnSSL_Accept( CONNECTION *c )
|
||||||
{
|
{
|
||||||
assert(c != NULL);
|
assert(c != NULL);
|
||||||
#ifdef HAVE_LIBSSL
|
|
||||||
if (!c->ssl_state.ssl) {
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_LIBGNUTLS
|
|
||||||
if (!Conn_OPTION_ISSET(c, CONN_SSL)) {
|
if (!Conn_OPTION_ISSET(c, CONN_SSL)) {
|
||||||
|
#ifdef HAVE_LIBGNUTLS
|
||||||
int err = gnutls_init(&c->ssl_state.gnutls_session, GNUTLS_SERVER);
|
int err = gnutls_init(&c->ssl_state.gnutls_session, GNUTLS_SERVER);
|
||||||
if (err) {
|
if (err) {
|
||||||
Log(LOG_ERR, "gnutls_init: %s", gnutls_strerror(err));
|
Log(LOG_ERR, "gnutls_init: %s", gnutls_strerror(err));
|
||||||
@@ -601,9 +593,7 @@ ConnSSL_Connect( CONNECTION *c )
|
|||||||
#ifdef HAVE_LIBSSL
|
#ifdef HAVE_LIBSSL
|
||||||
assert(c->ssl_state.ssl);
|
assert(c->ssl_state.ssl);
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_LIBGNUTLS
|
|
||||||
assert(Conn_OPTION_ISSET(c, CONN_SSL));
|
assert(Conn_OPTION_ISSET(c, CONN_SSL));
|
||||||
#endif
|
|
||||||
return ConnectAccept(c, true);
|
return ConnectAccept(c, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -623,7 +613,6 @@ ConnectAccept( CONNECTION *c, bool connect)
|
|||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_LIBGNUTLS
|
#ifdef HAVE_LIBGNUTLS
|
||||||
(void) connect;
|
(void) connect;
|
||||||
assert(Conn_OPTION_ISSET(c, CONN_SSL));
|
|
||||||
ret = gnutls_handshake(c->ssl_state.gnutls_session);
|
ret = gnutls_handshake(c->ssl_state.gnutls_session);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ConnSSL_HandleError(c, ret, "gnutls_handshake");
|
return ConnSSL_HandleError(c, ret, "gnutls_handshake");
|
||||||
@@ -648,7 +637,8 @@ ConnSSL_Write(CONNECTION *c, const void *buf, size_t count)
|
|||||||
#ifdef HAVE_LIBGNUTLS
|
#ifdef HAVE_LIBGNUTLS
|
||||||
bw = gnutls_write(c->ssl_state.gnutls_session, buf, count);
|
bw = gnutls_write(c->ssl_state.gnutls_session, buf, count);
|
||||||
#endif
|
#endif
|
||||||
if ( bw > 0 ) return bw;
|
if (bw > 0)
|
||||||
|
return bw;
|
||||||
if (ConnSSL_HandleError( c, bw, "ConnSSL_Write") == 0)
|
if (ConnSSL_HandleError( c, bw, "ConnSSL_Write") == 0)
|
||||||
errno = EAGAIN; /* try again */
|
errno = EAGAIN; /* try again */
|
||||||
return -1;
|
return -1;
|
||||||
@@ -685,11 +675,8 @@ ConnSSL_GetCipherInfo(CONNECTION *c, char *buf, size_t len)
|
|||||||
{
|
{
|
||||||
#ifdef HAVE_LIBSSL
|
#ifdef HAVE_LIBSSL
|
||||||
char *nl;
|
char *nl;
|
||||||
|
SSL *ssl = c->ssl_state.ssl;
|
||||||
|
|
||||||
SSL *ssl;
|
|
||||||
assert(c != NULL);
|
|
||||||
assert(len >= 128);
|
|
||||||
ssl = c->ssl_state.ssl;
|
|
||||||
if (!ssl)
|
if (!ssl)
|
||||||
return false;
|
return false;
|
||||||
*buf = 0;
|
*buf = 0;
|
||||||
@@ -700,8 +687,6 @@ ConnSSL_GetCipherInfo(CONNECTION *c, char *buf, size_t len)
|
|||||||
return true;
|
return true;
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_LIBGNUTLS
|
#ifdef HAVE_LIBGNUTLS
|
||||||
assert(c != NULL);
|
|
||||||
assert(len >= 128);
|
|
||||||
if (Conn_OPTION_ISSET(c, CONN_SSL)) {
|
if (Conn_OPTION_ISSET(c, CONN_SSL)) {
|
||||||
const char *name_cipher, *name_mac, *name_proto, *name_keyexchange;
|
const char *name_cipher, *name_mac, *name_proto, *name_keyexchange;
|
||||||
unsigned keysize;
|
unsigned keysize;
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2008 by Alexander Barton (alex@barton.de)
|
* Copyright (c)2001-2010 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
|
||||||
@@ -41,14 +41,14 @@
|
|||||||
#define CONN_SSL_WANT_READ 128 /* SSL/TLS library needs to read protocol data */
|
#define CONN_SSL_WANT_READ 128 /* SSL/TLS library needs to read protocol data */
|
||||||
#define CONN_SSL_FLAGS_ALL (CONN_SSL_CONNECT|CONN_SSL|CONN_SSL_WANT_WRITE|CONN_SSL_WANT_READ)
|
#define CONN_SSL_FLAGS_ALL (CONN_SSL_CONNECT|CONN_SSL|CONN_SSL_WANT_WRITE|CONN_SSL_WANT_READ)
|
||||||
#endif
|
#endif
|
||||||
typedef int CONN_ID;
|
typedef long CONN_ID;
|
||||||
|
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
|
#include "proc.h"
|
||||||
|
|
||||||
#ifdef CONN_MODULE
|
#ifdef CONN_MODULE
|
||||||
|
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "resolve.h"
|
|
||||||
#include "array.h"
|
#include "array.h"
|
||||||
#include "tool.h"
|
#include "tool.h"
|
||||||
#include "ng_ipaddr.h"
|
#include "ng_ipaddr.h"
|
||||||
@@ -69,7 +69,7 @@ typedef struct _Connection
|
|||||||
{
|
{
|
||||||
int sock; /* Socket handle */
|
int sock; /* Socket handle */
|
||||||
ng_ipaddr_t addr; /* Client address */
|
ng_ipaddr_t addr; /* Client address */
|
||||||
RES_STAT res_stat; /* Status of resolver process */
|
PROC_STAT proc_stat; /* Status of resolver process */
|
||||||
char host[HOST_LEN]; /* Hostname */
|
char host[HOST_LEN]; /* Hostname */
|
||||||
array rbuf; /* Read buffer */
|
array rbuf; /* Read buffer */
|
||||||
array wbuf; /* Write buffer */
|
array wbuf; /* Write buffer */
|
||||||
@@ -82,12 +82,13 @@ typedef struct _Connection
|
|||||||
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) */
|
||||||
UINT16 options; /* Link options / connection state */
|
UINT16 options; /* Link options / connection state */
|
||||||
|
UINT16 bps; /* bytes processed within last second */
|
||||||
CLIENT *client; /* pointer to client structure */
|
CLIENT *client; /* pointer to client structure */
|
||||||
#ifdef ZLIB
|
#ifdef ZLIB
|
||||||
ZIPDATA zip; /* Compression information */
|
ZIPDATA zip; /* Compression information */
|
||||||
#endif /* ZLIB */
|
#endif /* ZLIB */
|
||||||
#ifdef SSL_SUPPORT
|
#ifdef SSL_SUPPORT
|
||||||
struct ConnSSL_State ssl_state; /* SSL/GNUTLS state information */
|
struct ConnSSL_State ssl_state; /* SSL/GNUTLS state information */
|
||||||
#endif
|
#endif
|
||||||
} CONNECTION;
|
} CONNECTION;
|
||||||
|
|
||||||
@@ -101,24 +102,40 @@ GLOBAL long WCounter;
|
|||||||
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 void Conn_CloseAllSockets PARAMS((void));
|
||||||
|
|
||||||
GLOBAL unsigned int Conn_InitListeners PARAMS(( void ));
|
GLOBAL unsigned int Conn_InitListeners PARAMS(( void ));
|
||||||
GLOBAL void Conn_ExitListeners PARAMS(( void ));
|
GLOBAL void Conn_ExitListeners PARAMS(( void ));
|
||||||
|
|
||||||
GLOBAL void Conn_Handler PARAMS(( void ));
|
GLOBAL void Conn_Handler PARAMS(( void ));
|
||||||
|
|
||||||
GLOBAL bool Conn_WriteStr PARAMS(( CONN_ID Idx, char *Format, ... ));
|
GLOBAL bool Conn_WriteStr PARAMS(( CONN_ID Idx, const char *Format, ... ));
|
||||||
|
|
||||||
GLOBAL void Conn_Close PARAMS(( CONN_ID Idx, const char *LogMsg, const char *FwdMsg, bool InformClient ));
|
GLOBAL void Conn_Close PARAMS(( CONN_ID Idx, const char *LogMsg, const char *FwdMsg, bool InformClient ));
|
||||||
|
|
||||||
GLOBAL void Conn_SyncServerStruct PARAMS(( void ));
|
GLOBAL void Conn_SyncServerStruct PARAMS(( void ));
|
||||||
|
|
||||||
|
GLOBAL CONN_ID Conn_GetFromProc PARAMS((int fd));
|
||||||
GLOBAL CLIENT* Conn_GetClient PARAMS((CONN_ID i));
|
GLOBAL CLIENT* Conn_GetClient PARAMS((CONN_ID i));
|
||||||
|
GLOBAL PROC_STAT* Conn_GetProcStat PARAMS((CONN_ID i));
|
||||||
#ifdef SSL_SUPPORT
|
#ifdef SSL_SUPPORT
|
||||||
GLOBAL bool Conn_GetCipherInfo PARAMS((CONN_ID Idx, char *buf, size_t len));
|
GLOBAL bool Conn_GetCipherInfo PARAMS((CONN_ID Idx, char *buf, size_t len));
|
||||||
GLOBAL bool Conn_UsesSSL PARAMS((CONN_ID Idx));
|
GLOBAL bool Conn_UsesSSL PARAMS((CONN_ID Idx));
|
||||||
#else
|
#else
|
||||||
static inline bool Conn_UsesSSL(UNUSED CONN_ID Idx) { return false; }
|
static inline bool
|
||||||
#endif
|
Conn_UsesSSL(UNUSED CONN_ID Idx)
|
||||||
|
{ return false; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
GLOBAL long Conn_Count PARAMS((void));
|
||||||
|
GLOBAL long Conn_CountMax PARAMS((void));
|
||||||
|
GLOBAL long Conn_CountAccepted PARAMS((void));
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
GLOBAL void Conn_DebugDump PARAMS((void));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* -eof- */
|
/* -eof- */
|
||||||
|
|||||||
@@ -1,14 +1,12 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2007 Alexander Barton (alex@barton.de)
|
* Copyright (c)2001-2010 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
|
||||||
* 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.
|
||||||
*
|
|
||||||
* $Id: defines.h,v 1.62 2007/11/21 12:16:36 alex Exp $
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -30,8 +28,6 @@
|
|||||||
#define HOST_LEN 256 /* Max. lenght of fully qualified host
|
#define HOST_LEN 256 /* Max. lenght of fully qualified host
|
||||||
names (e. g. "abc.domain.tld") */
|
names (e. g. "abc.domain.tld") */
|
||||||
|
|
||||||
#define MAX_OPERATORS 16 /* Max. count of configurable IRC Ops */
|
|
||||||
|
|
||||||
#define MAX_SERVERS 16 /* Max. count of configurable servers */
|
#define MAX_SERVERS 16 /* Max. count of configurable servers */
|
||||||
|
|
||||||
#define MAX_WHOWAS 64 /* Max. number of WHOWAS items */
|
#define MAX_WHOWAS 64 /* Max. number of WHOWAS items */
|
||||||
@@ -84,8 +80,8 @@
|
|||||||
#define RECONNECT_DELAY 3 /* Time to delay re-connect attempts
|
#define RECONNECT_DELAY 3 /* Time to delay re-connect attempts
|
||||||
in seconds. */
|
in seconds. */
|
||||||
|
|
||||||
#define USERMODES "aios" /* Supported user modes. */
|
#define USERMODES "aciorswx" /* Supported user modes. */
|
||||||
#define CHANMODES "biIklmnoPstv" /* Supported channel modes. */
|
#define CHANMODES "biIklmnoPstvz" /* Supported channel modes. */
|
||||||
|
|
||||||
#define CONNECTED true /* Internal status codes. */
|
#define CONNECTED true /* Internal status codes. */
|
||||||
#define DISCONNECTED false
|
#define DISCONNECTED false
|
||||||
@@ -97,7 +93,6 @@
|
|||||||
|
|
||||||
#define CONFIG_FILE "/ngircd.conf" /* Configuration file name. */
|
#define CONFIG_FILE "/ngircd.conf" /* Configuration file name. */
|
||||||
#define MOTD_FILE "/ngircd.motd" /* Name of the MOTD file. */
|
#define MOTD_FILE "/ngircd.motd" /* Name of the MOTD file. */
|
||||||
#define MOTD_PHRASE "" /* Default MOTD phrase string. */
|
|
||||||
#define CHROOT_DIR "" /* Default chroot() directory. */
|
#define CHROOT_DIR "" /* Default chroot() directory. */
|
||||||
#define PID_FILE "" /* Default file for the process ID. */
|
#define PID_FILE "" /* Default file for the process ID. */
|
||||||
|
|
||||||
|
|||||||
@@ -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-2009 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
|
||||||
@@ -37,8 +37,9 @@ Hash( const char *String )
|
|||||||
|
|
||||||
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),
|
||||||
|
(UINT32)strlen(buffer), 42);
|
||||||
} /* Hash */
|
} /* Hash */
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -104,8 +104,8 @@ static bool io_event_change_devpoll(int fd, short what);
|
|||||||
|
|
||||||
#ifdef IO_USE_SELECT
|
#ifdef IO_USE_SELECT
|
||||||
#include "defines.h" /* for conn.h */
|
#include "defines.h" /* for conn.h */
|
||||||
#include "conn.h" /* for CONN_IDX (needed by resolve.h) */
|
#include "proc.h" /* for PROC_STAT (needed by conf.h) */
|
||||||
#include "resolve.h" /* for RES_STAT (needed by conf.h) */
|
#include "conn.h" /* for CONN_ID (needed by conf.h) */
|
||||||
#include "conf.h" /* for Conf_MaxConnections */
|
#include "conf.h" /* for Conf_MaxConnections */
|
||||||
|
|
||||||
static fd_set readers;
|
static fd_set readers;
|
||||||
@@ -115,7 +115,7 @@ static fd_set writers;
|
|||||||
* the largest fd registered, plus one.
|
* the largest fd registered, plus one.
|
||||||
*/
|
*/
|
||||||
static int select_maxfd;
|
static int select_maxfd;
|
||||||
static int io_dispatch_select(struct timeval *tv);
|
static int io_dispatch_select PARAMS((struct timeval *tv));
|
||||||
|
|
||||||
#ifndef IO_USE_EPOLL
|
#ifndef IO_USE_EPOLL
|
||||||
#define io_masterfd -1
|
#define io_masterfd -1
|
||||||
@@ -127,12 +127,15 @@ static array io_events;
|
|||||||
static void io_docallback PARAMS((int fd, short what));
|
static void io_docallback PARAMS((int fd, short what));
|
||||||
|
|
||||||
#ifdef DEBUG_IO
|
#ifdef DEBUG_IO
|
||||||
static void io_debug(const char *s, int fd, int what)
|
static void
|
||||||
|
io_debug(const char *s, int fd, int what)
|
||||||
{
|
{
|
||||||
Log(LOG_DEBUG, "%s: %d, %d\n", s, fd, what);
|
Log(LOG_DEBUG, "%s: %d, %d\n", s, fd, what);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static inline void io_debug(const char UNUSED *s,int UNUSED a, int UNUSED b) {/*NOTHING*/}
|
static inline void
|
||||||
|
io_debug(const char UNUSED *s,int UNUSED a, int UNUSED b)
|
||||||
|
{ /* NOTHING */ }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static io_event *
|
static io_event *
|
||||||
@@ -227,8 +230,12 @@ io_library_init_devpoll(unsigned int eventsize)
|
|||||||
eventsize, io_masterfd);
|
eventsize, io_masterfd);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static inline void io_close_devpoll(int UNUSED x) {/* NOTHING */}
|
static inline void
|
||||||
static inline void io_library_init_devpoll(unsigned int UNUSED ev) {/*NOTHING*/}
|
io_close_devpoll(int UNUSED x)
|
||||||
|
{ /* NOTHING */ }
|
||||||
|
static inline void
|
||||||
|
io_library_init_devpoll(unsigned int UNUSED ev)
|
||||||
|
{ /* NOTHING */ }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -331,8 +338,12 @@ io_library_init_poll(unsigned int eventsize)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static inline void io_close_poll(int UNUSED x) {/* NOTHING */}
|
static inline void
|
||||||
static inline void io_library_init_poll(unsigned int UNUSED ev) {/*NOTHING*/}
|
io_close_poll(int UNUSED x)
|
||||||
|
{ /* NOTHING */ }
|
||||||
|
static inline void
|
||||||
|
io_library_init_poll(unsigned int UNUSED ev)
|
||||||
|
{ /* NOTHING */ }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -340,11 +351,15 @@ static inline void io_library_init_poll(unsigned int UNUSED ev) {/*NOTHING*/}
|
|||||||
static int
|
static int
|
||||||
io_dispatch_select(struct timeval *tv)
|
io_dispatch_select(struct timeval *tv)
|
||||||
{
|
{
|
||||||
fd_set readers_tmp = readers;
|
fd_set readers_tmp;
|
||||||
fd_set writers_tmp = writers;
|
fd_set writers_tmp;
|
||||||
short what;
|
short what;
|
||||||
int ret, i;
|
int ret, i;
|
||||||
int fds_ready;
|
int fds_ready;
|
||||||
|
|
||||||
|
readers_tmp = readers;
|
||||||
|
writers_tmp = writers;
|
||||||
|
|
||||||
ret = select(select_maxfd + 1, &readers_tmp, &writers_tmp, NULL, tv);
|
ret = select(select_maxfd + 1, &readers_tmp, &writers_tmp, NULL, tv);
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
return ret;
|
return ret;
|
||||||
@@ -418,8 +433,12 @@ io_close_select(int fd)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static inline void io_library_init_select(int UNUSED x) {/* NOTHING */}
|
static inline void
|
||||||
static inline void io_close_select(int UNUSED x) {/* NOTHING */}
|
io_library_init_select(int UNUSED x)
|
||||||
|
{ /* NOTHING */ }
|
||||||
|
static inline void
|
||||||
|
io_close_select(int UNUSED x)
|
||||||
|
{ /* NOTHING */ }
|
||||||
#endif /* SELECT */
|
#endif /* SELECT */
|
||||||
|
|
||||||
|
|
||||||
@@ -494,7 +513,9 @@ io_library_init_epoll(unsigned int eventsize)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static inline void io_library_init_epoll(unsigned int UNUSED ev) {/* NOTHING */}
|
static inline void
|
||||||
|
io_library_init_epoll(unsigned int UNUSED ev)
|
||||||
|
{ /* NOTHING */ }
|
||||||
#endif /* IO_USE_EPOLL */
|
#endif /* IO_USE_EPOLL */
|
||||||
|
|
||||||
|
|
||||||
@@ -620,7 +641,9 @@ io_library_init_kqueue(unsigned int eventsize)
|
|||||||
library_initialized = true;
|
library_initialized = true;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static inline void io_library_init_kqueue(unsigned int UNUSED ev) {/* NOTHING */}
|
static inline void
|
||||||
|
io_library_init_kqueue(unsigned int UNUSED ev)
|
||||||
|
{ /* NOTHING */ }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -785,6 +808,18 @@ io_setnonblock(int fd)
|
|||||||
return fcntl(fd, F_SETFL, flags) == 0;
|
return fcntl(fd, F_SETFL, flags) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
io_setcloexec(int fd)
|
||||||
|
{
|
||||||
|
int flags = fcntl(fd, F_GETFD);
|
||||||
|
if (flags == -1)
|
||||||
|
return false;
|
||||||
|
#ifdef FD_CLOEXEC
|
||||||
|
flags |= FD_CLOEXEC;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return fcntl(fd, F_SETFD, flags) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
io_close(int fd)
|
io_close(int fd)
|
||||||
|
|||||||
@@ -45,6 +45,9 @@ bool io_close PARAMS((int fd));
|
|||||||
/* set O_NONBLOCK */
|
/* set O_NONBLOCK */
|
||||||
bool io_setnonblock PARAMS((int fd));
|
bool io_setnonblock PARAMS((int fd));
|
||||||
|
|
||||||
|
/* set O_CLOEXEC */
|
||||||
|
bool io_setcloexec PARAMS((int fd));
|
||||||
|
|
||||||
/* watch fds for activity */
|
/* watch fds for activity */
|
||||||
int io_dispatch PARAMS((struct timeval *tv));
|
int io_dispatch PARAMS((struct timeval *tv));
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2008 Alexander Barton (alex@barton.de)
|
* Copyright (c)2001-2010 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
|
||||||
@@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "conn.h"
|
#include "conn.h"
|
||||||
#include "client.h"
|
|
||||||
#include "channel.h"
|
#include "channel.h"
|
||||||
#include "conn-func.h"
|
#include "conn-func.h"
|
||||||
#include "lists.h"
|
#include "lists.h"
|
||||||
@@ -32,7 +31,6 @@
|
|||||||
#include "parse.h"
|
#include "parse.h"
|
||||||
#include "irc-info.h"
|
#include "irc-info.h"
|
||||||
#include "irc-write.h"
|
#include "irc-write.h"
|
||||||
#include "resolve.h"
|
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
|
|
||||||
#include "exp.h"
|
#include "exp.h"
|
||||||
@@ -62,9 +60,18 @@ part_from_all_channels(CLIENT* client, CLIENT *target)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check weather a local client is allowed to join an already existing
|
||||||
|
* channel or not.
|
||||||
|
* @param Client Client that sent the JOIN command
|
||||||
|
* @param chan Channel to check
|
||||||
|
* @param channame Name of the channel
|
||||||
|
* @param key Provided channel key (or NULL if none has been provided)
|
||||||
|
* @return true if client is allowed to join channel, false otherwise
|
||||||
|
*/
|
||||||
static bool
|
static bool
|
||||||
join_allowed(CLIENT *Client, CLIENT *target, CHANNEL *chan,
|
join_allowed(CLIENT *Client, CHANNEL *chan, const char *channame,
|
||||||
const char *channame, const char *key)
|
const char *key)
|
||||||
{
|
{
|
||||||
bool is_invited, is_banned;
|
bool is_invited, is_banned;
|
||||||
const char *channel_modes;
|
const char *channel_modes;
|
||||||
@@ -73,32 +80,48 @@ join_allowed(CLIENT *Client, CLIENT *target, CHANNEL *chan,
|
|||||||
if (strchr(Client_Modes(Client), 'o'))
|
if (strchr(Client_Modes(Client), 'o'))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
is_banned = Lists_Check(Channel_GetListBans(chan), target);
|
is_banned = Lists_Check(Channel_GetListBans(chan), Client);
|
||||||
is_invited = Lists_Check(Channel_GetListInvites(chan), target);
|
is_invited = Lists_Check(Channel_GetListInvites(chan), Client);
|
||||||
|
|
||||||
if (is_banned && !is_invited) {
|
if (is_banned && !is_invited) {
|
||||||
IRC_WriteStrClient(Client, ERR_BANNEDFROMCHAN_MSG, Client_ID(Client), channame);
|
/* Client is banned from channel (and not on invite list) */
|
||||||
|
IRC_WriteStrClient(Client, ERR_BANNEDFROMCHAN_MSG,
|
||||||
|
Client_ID(Client), channame);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
channel_modes = Channel_Modes(chan);
|
channel_modes = Channel_Modes(chan);
|
||||||
if ((strchr(channel_modes, 'i')) && !is_invited) {
|
if (strchr(channel_modes, 'i') && !is_invited) {
|
||||||
/* Channel is "invite-only" (and Client wasn't invited) */
|
/* Channel is "invite-only" and client is not on invite list */
|
||||||
IRC_WriteStrClient(Client, ERR_INVITEONLYCHAN_MSG, Client_ID(Client), channame);
|
IRC_WriteStrClient(Client, ERR_INVITEONLYCHAN_MSG,
|
||||||
|
Client_ID(Client), channame);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Is the channel protected by a key? */
|
if (!Channel_CheckKey(chan, Client, key ? key : "")) {
|
||||||
if (!Channel_CheckKey(chan, target, key ? key : "")) {
|
/* Channel is protected by a channel key and the client
|
||||||
|
* didn't specify the correct one */
|
||||||
IRC_WriteStrClient(Client, ERR_BADCHANNELKEY_MSG,
|
IRC_WriteStrClient(Client, ERR_BADCHANNELKEY_MSG,
|
||||||
Client_ID(Client), channame);
|
Client_ID(Client), channame);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
/* Are there already too many members? */
|
|
||||||
if ((strchr(channel_modes, 'l')) && (Channel_MaxUsers(chan) <= Channel_MemberCount(chan))) {
|
if (strchr(channel_modes, 'l') &&
|
||||||
IRC_WriteStrClient(Client, ERR_CHANNELISFULL_MSG, Client_ID(Client), channame);
|
(Channel_MaxUsers(chan) <= Channel_MemberCount(chan))) {
|
||||||
|
/* There are more clints joined to this channel than allowed */
|
||||||
|
IRC_WriteStrClient(Client, ERR_CHANNELISFULL_MSG,
|
||||||
|
Client_ID(Client), channame);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (strchr(channel_modes, 'z') && !Conn_UsesSSL(Client_Conn(Client))) {
|
||||||
|
/* Only "secure" clients are allowed, but clients doesn't
|
||||||
|
* use SSL encryption */
|
||||||
|
IRC_WriteStrClient(Client, ERR_SECURECHANNEL_MSG,
|
||||||
|
Client_ID(Client), channame);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -270,20 +293,23 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
|||||||
|
|
||||||
/* Local client? */
|
/* Local client? */
|
||||||
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 the channel limit */
|
||||||
if ((Conf_MaxJoins > 0) && (Channel_CountForUser(Client) >= Conf_MaxJoins))
|
if ((Conf_MaxJoins > 0) &&
|
||||||
return IRC_WriteStrClient(Client, ERR_TOOMANYCHANNELS_MSG,
|
(Channel_CountForUser(Client) >= Conf_MaxJoins))
|
||||||
Client_ID(Client), channame);
|
return IRC_WriteStrClient(Client,
|
||||||
if (!chan) {
|
ERR_TOOMANYCHANNELS_MSG,
|
||||||
/*
|
Client_ID(Client), channame);
|
||||||
* New Channel: first user will be channel operator
|
if (chan) {
|
||||||
* unless this is a modeless channel.
|
/* Already existing channel: check if the
|
||||||
*/
|
* client is allowed to join */
|
||||||
|
if (!join_allowed(Client, chan, channame, key))
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
/* New channel: first user will become channel
|
||||||
|
* operator unless this is a modeless channel */
|
||||||
if (*channame != '+')
|
if (*channame != '+')
|
||||||
flags = "o";
|
flags = "o";
|
||||||
} else
|
}
|
||||||
if (!join_allowed(Client, target, chan, channame, key))
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* Local client: update idle time */
|
/* Local client: update idle time */
|
||||||
Conn_UpdateIdle(Client_Conn(Client));
|
Conn_UpdateIdle(Client_Conn(Client));
|
||||||
@@ -293,7 +319,9 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
|||||||
* that the "one shot" entries (generated by INVITE
|
* that the "one shot" entries (generated by INVITE
|
||||||
* 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. */
|
||||||
if (chan) (void)Lists_Check(Channel_GetListInvites(chan), target);
|
if (chan)
|
||||||
|
(void)Lists_Check(Channel_GetListInvites(chan),
|
||||||
|
target);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Join channel (and create channel if it doesn't exist) */
|
/* Join channel (and create channel if it doesn't exist) */
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2008 Alexander Barton (alex@barton.de)
|
* Copyright (c)2001-2010 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
|
||||||
@@ -25,9 +25,7 @@
|
|||||||
#include "ngircd.h"
|
#include "ngircd.h"
|
||||||
#include "conn-func.h"
|
#include "conn-func.h"
|
||||||
#include "conn-zip.h"
|
#include "conn-zip.h"
|
||||||
#include "client.h"
|
|
||||||
#include "channel.h"
|
#include "channel.h"
|
||||||
#include "resolve.h"
|
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
@@ -440,7 +438,7 @@ t_diff(time_t *t, const time_t d)
|
|||||||
remain = diff * d;
|
remain = diff * d;
|
||||||
*t -= remain;
|
*t -= remain;
|
||||||
|
|
||||||
return diff;
|
return (unsigned int)diff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -465,6 +463,10 @@ uptime_mins(time_t *now)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for the IRC command "STATS".
|
||||||
|
* See RFC 2812 section 3.4.4.
|
||||||
|
*/
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_STATS( CLIENT *Client, REQUEST *Req )
|
IRC_STATS( CLIENT *Client, REQUEST *Req )
|
||||||
{
|
{
|
||||||
@@ -475,11 +477,12 @@ IRC_STATS( CLIENT *Client, REQUEST *Req )
|
|||||||
time_t time_now;
|
time_t time_now;
|
||||||
unsigned int days, hrs, mins;
|
unsigned int days, hrs, mins;
|
||||||
|
|
||||||
assert( Client != NULL );
|
assert(Client != NULL);
|
||||||
assert( Req != NULL );
|
assert(Req != NULL);
|
||||||
|
|
||||||
if (Req->argc > 2)
|
if (Req->argc > 2)
|
||||||
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command);
|
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||||
|
Client_ID(Client), Req->command);
|
||||||
|
|
||||||
/* use prefix to determine "From" */
|
/* use prefix to determine "From" */
|
||||||
if (Client_Type(Client) == CLIENT_SERVER)
|
if (Client_Type(Client) == CLIENT_SERVER)
|
||||||
@@ -487,18 +490,21 @@ IRC_STATS( CLIENT *Client, REQUEST *Req )
|
|||||||
else
|
else
|
||||||
from = Client;
|
from = Client;
|
||||||
|
|
||||||
if (! from)
|
if (!from)
|
||||||
return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix);
|
return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG,
|
||||||
|
Client_ID(Client), Req->prefix);
|
||||||
|
|
||||||
if (Req->argc == 2) {
|
if (Req->argc == 2) {
|
||||||
/* forward to another server? */
|
/* forward to another server? */
|
||||||
target = Client_Search( Req->argv[1] );
|
target = Client_Search(Req->argv[1]);
|
||||||
if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER ))
|
if ((!target) || (Client_Type(target) != CLIENT_SERVER))
|
||||||
return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG, Client_ID( from ), Req->argv[1] );
|
return IRC_WriteStrClient(from, ERR_NOSUCHSERVER_MSG,
|
||||||
|
Client_ID(from), Req->argv[1]);
|
||||||
|
|
||||||
if( target != Client_ThisServer()) {
|
if (target != Client_ThisServer()) {
|
||||||
/* forward to another server */
|
/* forward to another server */
|
||||||
return IRC_WriteStrClientPrefix( target, from, "STATS %s %s", Req->argv[0], Req->argv[1] );
|
return IRC_WriteStrClientPrefix(target, from,
|
||||||
|
"STATS %s %s", Req->argv[0], Req->argv[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -508,57 +514,70 @@ IRC_STATS( CLIENT *Client, REQUEST *Req )
|
|||||||
query = '*';
|
query = '*';
|
||||||
|
|
||||||
switch (query) {
|
switch (query) {
|
||||||
case 'l': /* Links */
|
case 'l': /* Link status (servers and own link) */
|
||||||
case 'L':
|
case 'L':
|
||||||
time_now = time(NULL);
|
time_now = time(NULL);
|
||||||
for (con = Conn_First(); con != NONE ;con = Conn_Next(con)) {
|
for (con = Conn_First(); con != NONE; con = Conn_Next(con)) {
|
||||||
cl = Conn_GetClient(con);
|
cl = Conn_GetClient(con);
|
||||||
if (!cl)
|
if (!cl)
|
||||||
continue;
|
continue;
|
||||||
if ((Client_Type(cl) == CLIENT_SERVER) || (cl == Client)) {
|
if ((Client_Type(cl) == CLIENT_SERVER)
|
||||||
/* Server link or our own connection */
|
|| (cl == Client)) {
|
||||||
|
/* Server link or our own connection */
|
||||||
#ifdef ZLIB
|
#ifdef ZLIB
|
||||||
if (Conn_Options(con) & CONN_ZIP) {
|
if (Conn_Options(con) & CONN_ZIP) {
|
||||||
if (!IRC_WriteStrClient(from, RPL_STATSLINKINFOZIP_MSG,
|
if (!IRC_WriteStrClient
|
||||||
Client_ID(from), Client_Mask(cl), Conn_SendQ(con),
|
(from, RPL_STATSLINKINFOZIP_MSG,
|
||||||
Conn_SendMsg(con), Zip_SendBytes(con), Conn_SendBytes(con),
|
Client_ID(from), Client_Mask(cl),
|
||||||
Conn_RecvMsg(con), Zip_RecvBytes(con), Conn_RecvBytes(con), (long)(time_now - Conn_StartTime(con))))
|
Conn_SendQ(con), Conn_SendMsg(con),
|
||||||
return DISCONNECTED;
|
Zip_SendBytes(con),
|
||||||
continue;
|
Conn_SendBytes(con),
|
||||||
}
|
Conn_RecvMsg(con),
|
||||||
#endif
|
Zip_RecvBytes(con),
|
||||||
if (!IRC_WriteStrClient(from, RPL_STATSLINKINFO_MSG, Client_ID(from),
|
Conn_RecvBytes(con),
|
||||||
Client_Mask(cl), Conn_SendQ(con), Conn_SendMsg(con), Conn_SendBytes(con),
|
(long)(time_now - Conn_StartTime(con))))
|
||||||
Conn_RecvMsg(con), Conn_RecvBytes(con), (long)(time_now - Conn_StartTime(con))))
|
|
||||||
return DISCONNECTED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'm': /* IRC-Commands */
|
|
||||||
case 'M':
|
|
||||||
cmd = Parse_GetCommandStruct( );
|
|
||||||
for (; cmd->name ; cmd++) {
|
|
||||||
if (cmd->lcount == 0 && cmd->rcount == 0)
|
|
||||||
continue;
|
|
||||||
if (!IRC_WriteStrClient(from, RPL_STATSCOMMANDS_MSG, Client_ID(from),
|
|
||||||
cmd->name, cmd->lcount, cmd->bytes, cmd->rcount))
|
|
||||||
return DISCONNECTED;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'u': /* server uptime */
|
|
||||||
case 'U':
|
|
||||||
time_now = time(NULL) - NGIRCd_Start;
|
|
||||||
days = uptime_days(&time_now);
|
|
||||||
hrs = uptime_hrs(&time_now);
|
|
||||||
mins = uptime_mins(&time_now);
|
|
||||||
if (!IRC_WriteStrClient(from, RPL_STATSUPTIME, Client_ID(from),
|
|
||||||
days, hrs, mins, (unsigned int) time_now))
|
|
||||||
return DISCONNECTED;
|
return DISCONNECTED;
|
||||||
break;
|
continue;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (!IRC_WriteStrClient
|
||||||
|
(from, RPL_STATSLINKINFO_MSG,
|
||||||
|
Client_ID(from), Client_Mask(cl),
|
||||||
|
Conn_SendQ(con), Conn_SendMsg(con),
|
||||||
|
Conn_SendBytes(con), Conn_RecvMsg(con),
|
||||||
|
Conn_RecvBytes(con),
|
||||||
|
(long)(time_now - Conn_StartTime(con))))
|
||||||
|
return DISCONNECTED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'm': /* IRC command status (usage count) */
|
||||||
|
case 'M':
|
||||||
|
cmd = Parse_GetCommandStruct();
|
||||||
|
for (; cmd->name; cmd++) {
|
||||||
|
if (cmd->lcount == 0 && cmd->rcount == 0)
|
||||||
|
continue;
|
||||||
|
if (!IRC_WriteStrClient
|
||||||
|
(from, RPL_STATSCOMMANDS_MSG, Client_ID(from),
|
||||||
|
cmd->name, cmd->lcount, cmd->bytes, cmd->rcount))
|
||||||
|
return DISCONNECTED;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'u': /* Server uptime */
|
||||||
|
case 'U':
|
||||||
|
time_now = time(NULL) - NGIRCd_Start;
|
||||||
|
days = uptime_days(&time_now);
|
||||||
|
hrs = uptime_hrs(&time_now);
|
||||||
|
mins = uptime_mins(&time_now);
|
||||||
|
if (!IRC_WriteStrClient(from, RPL_STATSUPTIME, Client_ID(from),
|
||||||
|
days, hrs, mins, (unsigned int)time_now))
|
||||||
|
return DISCONNECTED;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
IRC_SetPenalty(from, 2);
|
IRC_SetPenalty(from, 2);
|
||||||
return IRC_WriteStrClient(from, RPL_ENDOFSTATS_MSG, Client_ID(from), query);
|
return IRC_WriteStrClient(from, RPL_ENDOFSTATS_MSG,
|
||||||
|
Client_ID(from), query);
|
||||||
} /* IRC_STATS */
|
} /* IRC_STATS */
|
||||||
|
|
||||||
|
|
||||||
@@ -608,42 +627,51 @@ IRC_TIME( CLIENT *Client, REQUEST *Req )
|
|||||||
} /* IRC_TIME */
|
} /* IRC_TIME */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for the IRC command "USERHOST".
|
||||||
|
* See RFC 2812 section 4.8.
|
||||||
|
*/
|
||||||
GLOBAL bool
|
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);
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
if( Req->argc > 5 ) max = 5;
|
if (Req->argc > 5)
|
||||||
else max = Req->argc;
|
max = 5;
|
||||||
|
else
|
||||||
|
max = Req->argc;
|
||||||
|
|
||||||
strlcpy( rpl, RPL_USERHOST_MSG, sizeof rpl );
|
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] );
|
if (c && (Client_Type(c) == CLIENT_USER)) {
|
||||||
if( c && ( Client_Type( c ) == CLIENT_USER ))
|
|
||||||
{
|
|
||||||
/* This Nick is "online" */
|
/* This Nick is "online" */
|
||||||
strlcat( rpl, Client_ID( c ), sizeof( rpl ));
|
strlcat(rpl, Client_ID(c), sizeof(rpl));
|
||||||
if( Client_HasMode( c, 'o' )) strlcat( rpl, "*", sizeof( rpl ));
|
if (Client_HasMode(c, 'o'))
|
||||||
strlcat( rpl, "=", sizeof( rpl ));
|
strlcat(rpl, "*", sizeof(rpl));
|
||||||
if( Client_HasMode( c, 'a' )) strlcat( rpl, "-", sizeof( rpl ));
|
strlcat(rpl, "=", sizeof(rpl));
|
||||||
else strlcat( rpl, "+", sizeof( rpl ));
|
if (Client_HasMode(c, 'a'))
|
||||||
strlcat( rpl, Client_User( c ), sizeof( rpl ));
|
strlcat(rpl, "-", sizeof(rpl));
|
||||||
strlcat( rpl, "@", sizeof( rpl ));
|
else
|
||||||
strlcat( rpl, Client_Hostname( c ), sizeof( rpl ));
|
strlcat(rpl, "+", sizeof(rpl));
|
||||||
strlcat( rpl, " ", sizeof( rpl ));
|
strlcat(rpl, Client_User(c), sizeof(rpl));
|
||||||
|
strlcat(rpl, "@", sizeof(rpl));
|
||||||
|
strlcat(rpl, Client_HostnameCloaked(c), sizeof(rpl));
|
||||||
|
strlcat(rpl, " ", sizeof(rpl));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ngt_TrimLastChr( rpl, ' ');
|
ngt_TrimLastChr(rpl, ' ');
|
||||||
|
|
||||||
return IRC_WriteStrClient( Client, rpl, Client_ID( Client ) );
|
return IRC_WriteStrClient(Client, rpl, Client_ID(Client));
|
||||||
} /* IRC_USERHOST */
|
} /* IRC_USERHOST */
|
||||||
|
|
||||||
|
|
||||||
@@ -700,9 +728,11 @@ IRC_VERSION( CLIENT *Client, REQUEST *Req )
|
|||||||
static bool
|
static bool
|
||||||
write_whoreply(CLIENT *Client, CLIENT *c, const char *channelname, const char *flags)
|
write_whoreply(CLIENT *Client, CLIENT *c, const char *channelname, const char *flags)
|
||||||
{
|
{
|
||||||
return IRC_WriteStrClient(Client, RPL_WHOREPLY_MSG, Client_ID(Client), channelname,
|
return IRC_WriteStrClient(Client, RPL_WHOREPLY_MSG, Client_ID(Client),
|
||||||
Client_User(c), Client_Hostname(c), Client_ID(Client_Introducer(c)), Client_ID(c),
|
channelname, Client_User(c),
|
||||||
flags, Client_Hops(c), Client_Info(c));
|
Client_HostnameCloaked(c),
|
||||||
|
Client_ID(Client_Introducer(c)), Client_ID(c),
|
||||||
|
flags, Client_Hops(c), Client_Info(c));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -920,8 +950,11 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req )
|
|||||||
|
|
||||||
if(( Client_NextHop( target ) != Client_ThisServer( )) && ( Client_Type( Client_NextHop( target )) == CLIENT_SERVER )) return IRC_WriteStrClientPrefix( target, from, "WHOIS %s :%s", Req->argv[0], Req->argv[1] );
|
if(( Client_NextHop( target ) != Client_ThisServer( )) && ( Client_Type( Client_NextHop( target )) == CLIENT_SERVER )) return IRC_WriteStrClientPrefix( target, from, "WHOIS %s :%s", Req->argv[0], Req->argv[1] );
|
||||||
|
|
||||||
/* Nick, user and name */
|
/* Nick, user, hostname and client info */
|
||||||
if( ! IRC_WriteStrClient( from, RPL_WHOISUSER_MSG, Client_ID( from ), Client_ID( c ), Client_User( c ), Client_Hostname( c ), Client_Info( c ))) return DISCONNECTED;
|
if (!IRC_WriteStrClient(from, RPL_WHOISUSER_MSG, Client_ID(from),
|
||||||
|
Client_ID(c), Client_User(c),
|
||||||
|
Client_HostnameCloaked(c), Client_Info(c)))
|
||||||
|
return DISCONNECTED;
|
||||||
|
|
||||||
/* Server */
|
/* Server */
|
||||||
if( ! IRC_WriteStrClient( from, RPL_WHOISSERVER_MSG, Client_ID( from ), Client_ID( c ), Client_ID( Client_Introducer( c )), Client_Info( Client_Introducer( c )))) return DISCONNECTED;
|
if( ! IRC_WriteStrClient( from, RPL_WHOISSERVER_MSG, Client_ID( from ), Client_ID( c ), Client_ID( Client_Introducer( c )), Client_Info( Client_Introducer( c )))) return DISCONNECTED;
|
||||||
@@ -972,6 +1005,13 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req )
|
|||||||
if( ! IRC_WriteStrClient( from, RPL_WHOISOPERATOR_MSG, Client_ID( from ), Client_ID( c ))) return DISCONNECTED;
|
if( ! IRC_WriteStrClient( from, RPL_WHOISOPERATOR_MSG, Client_ID( from ), Client_ID( c ))) return DISCONNECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Connected using SSL? */
|
||||||
|
if (Conn_UsesSSL(Client_Conn(c))) {
|
||||||
|
if (!IRC_WriteStrClient
|
||||||
|
(from, RPL_WHOISSSL_MSG, Client_ID(from), Client_ID(c)))
|
||||||
|
return DISCONNECTED;
|
||||||
|
}
|
||||||
|
|
||||||
/* Idle and signon time (local clients only!) */
|
/* Idle and signon time (local clients only!) */
|
||||||
if (Client_Conn(c) > NONE ) {
|
if (Client_Conn(c) > NONE ) {
|
||||||
if (! IRC_WriteStrClient(from, RPL_WHOISIDLE_MSG,
|
if (! IRC_WriteStrClient(from, RPL_WHOISIDLE_MSG,
|
||||||
@@ -1155,6 +1195,10 @@ IRC_Send_LUSERS( CLIENT *Client )
|
|||||||
if(! IRC_WriteStrClient(Client, RPL_NETUSERS_MSG, Client_ID(Client),
|
if(! IRC_WriteStrClient(Client, RPL_NETUSERS_MSG, Client_ID(Client),
|
||||||
cnt, max, cnt, max))
|
cnt, max, cnt, max))
|
||||||
return DISCONNECTED;
|
return DISCONNECTED;
|
||||||
|
/* Connection counters */
|
||||||
|
if (! IRC_WriteStrClient(Client, RPL_STATSCONN_MSG, Client_ID(Client),
|
||||||
|
Conn_CountMax(), Conn_CountAccepted()))
|
||||||
|
return DISCONNECTED;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return CONNECTED;
|
return CONNECTED;
|
||||||
@@ -1195,51 +1239,38 @@ static bool Show_MOTD_SSLInfo(CLIENT *Client)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static inline bool Show_MOTD_SSLInfo(UNUSED CLIENT *c) { return true; }
|
static inline bool
|
||||||
|
Show_MOTD_SSLInfo(UNUSED CLIENT *c)
|
||||||
|
{ return true; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_Show_MOTD( CLIENT *Client )
|
IRC_Show_MOTD( CLIENT *Client )
|
||||||
{
|
{
|
||||||
char line[127];
|
const char *line;
|
||||||
FILE *fd;
|
size_t len_tot, len_str;
|
||||||
|
|
||||||
assert( Client != NULL );
|
assert( Client != NULL );
|
||||||
|
|
||||||
if (Conf_MotdPhrase[0]) {
|
len_tot = array_bytes(&Conf_Motd);
|
||||||
if (!Show_MOTD_Start(Client))
|
if (len_tot == 0 && !Conn_UsesSSL(Client_Conn(Client)))
|
||||||
|
return IRC_WriteStrClient(Client, ERR_NOMOTD_MSG, Client_ID(Client));
|
||||||
|
|
||||||
|
if (!Show_MOTD_Start(Client))
|
||||||
|
return DISCONNECTED;
|
||||||
|
|
||||||
|
line = array_start(&Conf_Motd);
|
||||||
|
while (len_tot > 0) {
|
||||||
|
len_str = strlen(line) + 1;
|
||||||
|
|
||||||
|
assert(len_tot >= len_str);
|
||||||
|
len_tot -= len_str;
|
||||||
|
|
||||||
|
if (!Show_MOTD_Sendline(Client, line))
|
||||||
return DISCONNECTED;
|
return DISCONNECTED;
|
||||||
if (!Show_MOTD_Sendline(Client, Conf_MotdPhrase))
|
line += len_str;
|
||||||
return DISCONNECTED;
|
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fd = fopen( Conf_MotdFile, "r" );
|
|
||||||
if( ! fd ) {
|
|
||||||
Log( LOG_WARNING, "Can't read MOTD file \"%s\": %s", Conf_MotdFile, strerror( errno ));
|
|
||||||
if (Conn_UsesSSL(Client_Conn(Client))) {
|
|
||||||
if (!Show_MOTD_Start(Client))
|
|
||||||
return DISCONNECTED;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
return IRC_WriteStrClient( Client, ERR_NOMOTD_MSG, Client_ID( Client ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Show_MOTD_Start( Client )) {
|
|
||||||
fclose(fd);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (fgets( line, (int)sizeof line, fd )) {
|
|
||||||
ngt_TrimLastChr( line, '\n');
|
|
||||||
|
|
||||||
if( ! Show_MOTD_Sendline( Client, line)) {
|
|
||||||
fclose( fd );
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fclose(fd);
|
|
||||||
out:
|
|
||||||
if (!Show_MOTD_SSLInfo(Client))
|
if (!Show_MOTD_SSLInfo(Client))
|
||||||
return DISCONNECTED;
|
return DISCONNECTED;
|
||||||
return Show_MOTD_End(Client);
|
return Show_MOTD_End(Client);
|
||||||
@@ -1302,14 +1333,13 @@ IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan )
|
|||||||
} /* IRC_Send_NAMES */
|
} /* IRC_Send_NAMES */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send the ISUPPORT numeric (005).
|
* Send the ISUPPORT numeric (005).
|
||||||
* This numeric indicates the features that are supported by this server.
|
* This numeric indicates the features that are supported by this server.
|
||||||
* See <http://www.irc.org/tech_docs/005.html> for details.
|
* See <http://www.irc.org/tech_docs/005.html> for details.
|
||||||
*/
|
*/
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_Send_ISUPPORT PARAMS((CLIENT * Client))
|
IRC_Send_ISUPPORT(CLIENT * Client)
|
||||||
{
|
{
|
||||||
if (!IRC_WriteStrClient(Client, RPL_ISUPPORT1_MSG, Client_ID(Client),
|
if (!IRC_WriteStrClient(Client, RPL_ISUPPORT1_MSG, Client_ID(Client),
|
||||||
Conf_MaxJoins))
|
Conf_MaxJoins))
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2008 Alexander Barton (alex@barton.de)
|
* Copyright (c)2001-2010 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
|
||||||
@@ -20,15 +20,17 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "ngircd.h"
|
#include "ngircd.h"
|
||||||
#include "resolve.h"
|
|
||||||
#include "conn-func.h"
|
#include "conn-func.h"
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
#include "client.h"
|
|
||||||
#include "channel.h"
|
#include "channel.h"
|
||||||
|
#include "io.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "messages.h"
|
#include "messages.h"
|
||||||
|
#include "pam.h"
|
||||||
#include "parse.h"
|
#include "parse.h"
|
||||||
#include "irc.h"
|
#include "irc.h"
|
||||||
#include "irc-info.h"
|
#include "irc-info.h"
|
||||||
@@ -39,11 +41,17 @@
|
|||||||
|
|
||||||
|
|
||||||
static bool Hello_User PARAMS(( CLIENT *Client ));
|
static bool Hello_User PARAMS(( CLIENT *Client ));
|
||||||
|
static bool Hello_User_PostAuth PARAMS(( CLIENT *Client ));
|
||||||
static void Kill_Nick PARAMS(( char *Nick, char *Reason ));
|
static void Kill_Nick PARAMS(( char *Nick, char *Reason ));
|
||||||
static void Introduce_Client PARAMS((CLIENT *To, CLIENT *Client, int Type));
|
static void Introduce_Client PARAMS((CLIENT *To, CLIENT *Client, int Type));
|
||||||
|
static void Reject_Client PARAMS((CLIENT *Client));
|
||||||
|
|
||||||
static void cb_introduceClient PARAMS((CLIENT *Client, CLIENT *Prefix,
|
static void cb_introduceClient PARAMS((CLIENT *Client, CLIENT *Prefix,
|
||||||
void *i));
|
void *i));
|
||||||
|
|
||||||
|
#ifdef PAM
|
||||||
|
static void cb_Read_Auth_Result PARAMS((int r_fd, UNUSED short events));
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handler for the IRC command "PASS".
|
* Handler for the IRC command "PASS".
|
||||||
@@ -148,7 +156,6 @@ IRC_PASS( CLIENT *Client, REQUEST *Req )
|
|||||||
} else {
|
} else {
|
||||||
/* The peer seems to be a server supporting the
|
/* The peer seems to be a server supporting the
|
||||||
* "original" IRC protocol (RFC 2813). */
|
* "original" IRC protocol (RFC 2813). */
|
||||||
serverver = "";
|
|
||||||
if (strchr(orig_flags, 'Z'))
|
if (strchr(orig_flags, 'Z'))
|
||||||
flags = "Z";
|
flags = "Z";
|
||||||
else
|
else
|
||||||
@@ -357,7 +364,7 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
|
|||||||
* RFC 1459: announce the new client only after receiving the
|
* RFC 1459: announce the new client only after receiving the
|
||||||
* USER command, first we need more information! */
|
* USER command, first we need more information! */
|
||||||
if (Req->argc < 7) {
|
if (Req->argc < 7) {
|
||||||
LogDebug("Client \"%s\" is beeing registered (RFC 1459) ...",
|
LogDebug("Client \"%s\" is being registered (RFC 1459) ...",
|
||||||
Client_Mask(c));
|
Client_Mask(c));
|
||||||
Client_SetType(c, CLIENT_GOTNICK);
|
Client_SetType(c, CLIENT_GOTNICK);
|
||||||
} else
|
} else
|
||||||
@@ -404,6 +411,7 @@ IRC_USER(CLIENT * Client, REQUEST * Req)
|
|||||||
#else
|
#else
|
||||||
Client_SetUser(Client, Req->argv[0], false);
|
Client_SetUser(Client, Req->argv[0], false);
|
||||||
#endif
|
#endif
|
||||||
|
Client_SetOrigUser(Client, Req->argv[0]);
|
||||||
|
|
||||||
/* "Real name" or user info text: Don't set it to the empty
|
/* "Real name" or user info text: Don't set it to the empty
|
||||||
* string, the original ircd can't deal with such "real names"
|
* string, the original ircd can't deal with such "real names"
|
||||||
@@ -436,6 +444,7 @@ IRC_USER(CLIENT * Client, REQUEST * Req)
|
|||||||
Req->prefix);
|
Req->prefix);
|
||||||
|
|
||||||
Client_SetUser(c, Req->argv[0], true);
|
Client_SetUser(c, Req->argv[0], true);
|
||||||
|
Client_SetOrigUser(c, Req->argv[0]);
|
||||||
Client_SetHostname(c, Req->argv[1]);
|
Client_SetHostname(c, Req->argv[1]);
|
||||||
Client_SetInfo(c, Req->argv[3]);
|
Client_SetInfo(c, Req->argv[3]);
|
||||||
|
|
||||||
@@ -558,6 +567,32 @@ IRC_SERVICE(CLIENT *Client, REQUEST *Req)
|
|||||||
} /* IRC_SERVICE */
|
} /* IRC_SERVICE */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for the IRC command "WEBIRC".
|
||||||
|
* Syntax: WEBIRC <password> <username> <real-hostname> <real-IP-address>
|
||||||
|
*/
|
||||||
|
GLOBAL bool
|
||||||
|
IRC_WEBIRC(CLIENT *Client, REQUEST *Req)
|
||||||
|
{
|
||||||
|
/* Exactly 4 parameters are requited */
|
||||||
|
if (Req->argc != 4)
|
||||||
|
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||||
|
Client_ID(Client), Req->command);
|
||||||
|
|
||||||
|
if (!Conf_WebircPwd[0] || strcmp(Req->argv[0], Conf_WebircPwd) != 0)
|
||||||
|
return IRC_WriteStrClient(Client, ERR_PASSWDMISMATCH_MSG,
|
||||||
|
Client_ID(Client));
|
||||||
|
|
||||||
|
LogDebug("Connection %d: got valid WEBIRC command: user=%s, host=%s, ip=%s",
|
||||||
|
Client_Conn(Client), Req->argv[1], Req->argv[2], Req->argv[3]);
|
||||||
|
|
||||||
|
Client_SetUser(Client, Req->argv[1], true);
|
||||||
|
Client_SetOrigUser(Client, Req->argv[1]);
|
||||||
|
Client_SetHostname(Client, Req->argv[2]);
|
||||||
|
return CONNECTED;
|
||||||
|
} /* IRC_WEBIRC */
|
||||||
|
|
||||||
|
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_QUIT( CLIENT *Client, REQUEST *Req )
|
IRC_QUIT( CLIENT *Client, REQUEST *Req )
|
||||||
{
|
{
|
||||||
@@ -735,18 +770,116 @@ IRC_PONG(CLIENT *Client, REQUEST *Req)
|
|||||||
static bool
|
static bool
|
||||||
Hello_User(CLIENT * Client)
|
Hello_User(CLIENT * Client)
|
||||||
{
|
{
|
||||||
assert(Client != NULL);
|
#ifdef PAM
|
||||||
|
int pipefd[2], result;
|
||||||
|
CONN_ID conn;
|
||||||
|
pid_t pid;
|
||||||
|
|
||||||
/* Check password ... */
|
assert(Client != NULL);
|
||||||
if (strcmp(Client_Password(Client), Conf_ServerPwd) != 0) {
|
conn = Client_Conn(Client);
|
||||||
/* Bad password! */
|
|
||||||
Log(LOG_ERR,
|
if (Conf_NoPAM) {
|
||||||
"Client \"%s\" rejected (connection %d): Bad password!",
|
/* Don't do any PAM authentication at all, instead emulate
|
||||||
Client_Mask(Client), Client_Conn(Client));
|
* the beahiour of the daemon compiled without PAM support:
|
||||||
Conn_Close(Client_Conn(Client), NULL, "Bad password", true);
|
* because there can't be any "server password", all
|
||||||
|
* passwords supplied are classified as "wrong". */
|
||||||
|
if(Client_Password(Client)[0] == '\0')
|
||||||
|
return Hello_User_PostAuth(Client);
|
||||||
|
Reject_Client(Client);
|
||||||
return DISCONNECTED;
|
return DISCONNECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Fork child process for PAM authentication; and make sure that the
|
||||||
|
* process timeout is set higher than the login timeout! */
|
||||||
|
pid = Proc_Fork(Conn_GetProcStat(conn), pipefd,
|
||||||
|
cb_Read_Auth_Result, Conf_PongTimeout + 1);
|
||||||
|
if (pid > 0) {
|
||||||
|
LogDebug("Authenticator for connection %d created (PID %d).",
|
||||||
|
conn, pid);
|
||||||
|
return CONNECTED;
|
||||||
|
} else {
|
||||||
|
/* Sub process */
|
||||||
|
Log_Init_Subprocess("Auth");
|
||||||
|
result = PAM_Authenticate(Client);
|
||||||
|
write(pipefd[1], &result, sizeof(result));
|
||||||
|
Log_Exit_Subprocess("Auth");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
assert(Client != NULL);
|
||||||
|
|
||||||
|
/* Check global server password ... */
|
||||||
|
if (strcmp(Client_Password(Client), Conf_ServerPwd) != 0) {
|
||||||
|
/* Bad password! */
|
||||||
|
Reject_Client(Client);
|
||||||
|
return DISCONNECTED;
|
||||||
|
}
|
||||||
|
return Hello_User_PostAuth(Client);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef PAM
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read result of the authenticatior sub-process from pipe
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
cb_Read_Auth_Result(int r_fd, UNUSED short events)
|
||||||
|
{
|
||||||
|
CONN_ID conn;
|
||||||
|
CLIENT *client;
|
||||||
|
int result;
|
||||||
|
size_t len;
|
||||||
|
PROC_STAT *proc;
|
||||||
|
|
||||||
|
LogDebug("Auth: Got callback on fd %d, events %d", r_fd, events);
|
||||||
|
conn = Conn_GetFromProc(r_fd);
|
||||||
|
if (conn == NONE) {
|
||||||
|
/* Ops, none found? Probably the connection has already
|
||||||
|
* been closed!? We'll ignore that ... */
|
||||||
|
io_close(r_fd);
|
||||||
|
LogDebug("Auth: Got callback for unknown connection!?");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
proc = Conn_GetProcStat(conn);
|
||||||
|
client = Conn_GetClient(conn);
|
||||||
|
|
||||||
|
/* Read result from pipe */
|
||||||
|
len = Proc_Read(proc, &result, sizeof(result));
|
||||||
|
if (len == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (len != sizeof(result)) {
|
||||||
|
Log(LOG_CRIT, "Auth: Got malformed result!");
|
||||||
|
Reject_Client(client);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result == true) {
|
||||||
|
Client_SetUser(client, Client_OrigUser(client), true);
|
||||||
|
(void)Hello_User_PostAuth(client);
|
||||||
|
} else
|
||||||
|
Reject_Client(client);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
Reject_Client(CLIENT *Client)
|
||||||
|
{
|
||||||
|
Log(LOG_ERR,
|
||||||
|
"User \"%s\" rejected (connection %d): Access denied!",
|
||||||
|
Client_Mask(Client), Client_Conn(Client));
|
||||||
|
Conn_Close(Client_Conn(Client), NULL,
|
||||||
|
"Access denied! Bad password?", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
Hello_User_PostAuth(CLIENT *Client)
|
||||||
|
{
|
||||||
Introduce_Client(NULL, Client, CLIENT_USER);
|
Introduce_Client(NULL, Client, CLIENT_USER);
|
||||||
|
|
||||||
if (!IRC_WriteStrClient
|
if (!IRC_WriteStrClient
|
||||||
@@ -780,7 +913,7 @@ Hello_User(CLIENT * Client)
|
|||||||
IRC_SetPenalty(Client, 1);
|
IRC_SetPenalty(Client, 1);
|
||||||
|
|
||||||
return CONNECTED;
|
return CONNECTED;
|
||||||
} /* Hello_User */
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -816,10 +949,16 @@ Introduce_Client(CLIENT *From, CLIENT *Client, int Type)
|
|||||||
Client_Modes(Client), Client_ID(From),
|
Client_Modes(Client), Client_ID(From),
|
||||||
Client_ID(Client_Introducer(Client)),
|
Client_ID(Client_Introducer(Client)),
|
||||||
Client_Hops(Client), Client_Hops(Client) > 1 ? "s": "");
|
Client_Hops(Client), Client_Hops(Client) > 1 ? "s": "");
|
||||||
} else
|
} else {
|
||||||
Log(LOG_NOTICE, "%s \"%s\" registered (connection %d).",
|
Log(LOG_NOTICE, "%s \"%s\" registered (connection %d).",
|
||||||
Client_TypeText(Client), Client_Mask(Client),
|
Client_TypeText(Client), Client_Mask(Client),
|
||||||
Client_Conn(Client));
|
Client_Conn(Client));
|
||||||
|
Log_ServerNotice('c', "Client connecting: %s (%s@%s) [%s] - %s",
|
||||||
|
Client_ID(Client), Client_User(Client),
|
||||||
|
Client_Hostname(Client),
|
||||||
|
Conn_IPA(Client_Conn(Client)),
|
||||||
|
Client_TypeText(Client));
|
||||||
|
}
|
||||||
|
|
||||||
/* Inform other servers */
|
/* Inform other servers */
|
||||||
IRC_WriteStrServersPrefixFlag_CB(From,
|
IRC_WriteStrServersPrefixFlag_CB(From,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2008 Alexander Barton (alex@barton.de)
|
* Copyright (c)2001-2010 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
|
||||||
@@ -19,6 +19,7 @@ GLOBAL bool IRC_PASS PARAMS((CLIENT *Client, REQUEST *Req));
|
|||||||
GLOBAL bool IRC_NICK PARAMS((CLIENT *Client, REQUEST *Req));
|
GLOBAL bool IRC_NICK PARAMS((CLIENT *Client, REQUEST *Req));
|
||||||
GLOBAL bool IRC_USER PARAMS((CLIENT *Client, REQUEST *Req));
|
GLOBAL bool IRC_USER PARAMS((CLIENT *Client, REQUEST *Req));
|
||||||
GLOBAL bool IRC_SERVICE PARAMS((CLIENT *Client, REQUEST *Req));
|
GLOBAL bool IRC_SERVICE PARAMS((CLIENT *Client, REQUEST *Req));
|
||||||
|
GLOBAL bool IRC_WEBIRC PARAMS((CLIENT *Client, REQUEST *Req));
|
||||||
GLOBAL bool IRC_PING PARAMS((CLIENT *Client, REQUEST *Req));
|
GLOBAL bool IRC_PING PARAMS((CLIENT *Client, REQUEST *Req));
|
||||||
GLOBAL bool IRC_PONG PARAMS((CLIENT *Client, REQUEST *Req));
|
GLOBAL bool IRC_PONG PARAMS((CLIENT *Client, REQUEST *Req));
|
||||||
GLOBAL bool IRC_QUIT PARAMS((CLIENT *Client, REQUEST *Req));
|
GLOBAL bool IRC_QUIT PARAMS((CLIENT *Client, REQUEST *Req));
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2008 Alexander Barton (alex@barton.de)
|
* Copyright (c)2001-2010 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
|
||||||
@@ -22,27 +22,30 @@
|
|||||||
|
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "conn.h"
|
#include "conn.h"
|
||||||
#include "client.h"
|
|
||||||
#include "channel.h"
|
#include "channel.h"
|
||||||
#include "irc-write.h"
|
#include "irc-write.h"
|
||||||
#include "lists.h"
|
#include "lists.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "parse.h"
|
#include "parse.h"
|
||||||
#include "messages.h"
|
#include "messages.h"
|
||||||
#include "resolve.h"
|
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
|
|
||||||
#include "exp.h"
|
#include "exp.h"
|
||||||
#include "irc-mode.h"
|
#include "irc-mode.h"
|
||||||
|
|
||||||
|
|
||||||
static bool Client_Mode PARAMS(( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ));
|
static bool Client_Mode PARAMS(( CLIENT *Client, REQUEST *Req, CLIENT *Origin,
|
||||||
static bool Channel_Mode PARAMS(( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel ));
|
CLIENT *Target ));
|
||||||
|
static bool Channel_Mode PARAMS(( CLIENT *Client, REQUEST *Req, CLIENT *Origin,
|
||||||
|
CHANNEL *Channel ));
|
||||||
|
|
||||||
static bool Add_Ban_Invite PARAMS((int what, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, const char *Pattern));
|
static bool Add_Ban_Invite PARAMS((int what, CLIENT *Prefix, CLIENT *Client,
|
||||||
static bool Del_Ban_Invite PARAMS((int what, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, const char *Pattern));
|
CHANNEL *Channel, const char *Pattern));
|
||||||
|
static bool Del_Ban_Invite PARAMS((int what, CLIENT *Prefix, CLIENT *Client,
|
||||||
|
CHANNEL *Channel, const char *Pattern));
|
||||||
|
|
||||||
static bool Send_ListChange PARAMS(( char *Mode, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, const char *Mask ));
|
static bool Send_ListChange PARAMS((const char *Mode, CLIENT *Prefix,
|
||||||
|
CLIENT *Client, CHANNEL *Channel, const char *Mask));
|
||||||
|
|
||||||
|
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
@@ -172,6 +175,17 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
|
|||||||
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 'c': /* Receive connect notices
|
||||||
|
* (only settable by IRC operators!) */
|
||||||
|
if(!set || Client_OperByMe(Origin)
|
||||||
|
|| Client_Type(Client) == CLIENT_SERVER)
|
||||||
|
x[0] = 'c';
|
||||||
|
else
|
||||||
|
ok = IRC_WriteStrClient(Origin,
|
||||||
|
ERR_NOPRIVILEGES_MSG,
|
||||||
|
Client_ID(Origin));
|
||||||
|
break;
|
||||||
|
|
||||||
case 'o': /* IRC operator (only unsettable!) */
|
case 'o': /* IRC operator (only unsettable!) */
|
||||||
if(( ! set ) || ( Client_Type( Client ) == CLIENT_SERVER ))
|
if(( ! set ) || ( Client_Type( Client ) == CLIENT_SERVER ))
|
||||||
{
|
{
|
||||||
@@ -186,6 +200,15 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
|
|||||||
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 'x': /* Cloak hostname */
|
||||||
|
if (Client_HasMode(Client, 'r'))
|
||||||
|
IRC_WriteStrClient(Origin,
|
||||||
|
ERR_RESTRICTED_MSG,
|
||||||
|
Client_ID(Origin));
|
||||||
|
else
|
||||||
|
x[0] = 'x';
|
||||||
|
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 );
|
||||||
@@ -284,7 +307,8 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
|
|||||||
{
|
{
|
||||||
char the_modes[COMMAND_LEN], the_args[COMMAND_LEN], x[2],
|
char the_modes[COMMAND_LEN], the_args[COMMAND_LEN], x[2],
|
||||||
argadd[CLIENT_PASS_LEN], *mode_ptr;
|
argadd[CLIENT_PASS_LEN], *mode_ptr;
|
||||||
bool ok, set, modeok = true, skiponce, use_servermode = false, retval;
|
bool connected, set, skiponce, retval, onchannel;
|
||||||
|
bool modeok = true, use_servermode = false;
|
||||||
int mode_arg, arg_arg;
|
int mode_arg, arg_arg;
|
||||||
CLIENT *client;
|
CLIENT *client;
|
||||||
long l;
|
long l;
|
||||||
@@ -301,14 +325,13 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
|
|||||||
/* Is the user allowed to change modes? */
|
/* Is the user allowed to change modes? */
|
||||||
if (Client_Type(Client) == CLIENT_USER) {
|
if (Client_Type(Client) == CLIENT_USER) {
|
||||||
/* Is the originating user on that channel? */
|
/* Is the originating user on that channel? */
|
||||||
if (!Channel_IsMemberOf(Channel, Origin))
|
onchannel = Channel_IsMemberOf(Channel, Origin);
|
||||||
return IRC_WriteStrClient(Origin, ERR_NOTONCHANNEL_MSG,
|
|
||||||
Client_ID(Origin), Channel_Name(Channel));
|
|
||||||
modeok = false;
|
modeok = false;
|
||||||
/* channel operator? */
|
/* channel operator? */
|
||||||
if (strchr(Channel_UserModes(Channel, Origin), 'o'))
|
if (onchannel &&
|
||||||
|
strchr(Channel_UserModes(Channel, Origin), 'o')) {
|
||||||
modeok = true;
|
modeok = true;
|
||||||
else if (Conf_OperCanMode) {
|
} else if (Conf_OperCanMode) {
|
||||||
/* IRC-Operators can use MODE as well */
|
/* IRC-Operators can use MODE as well */
|
||||||
if (Client_OperByMe(Origin)) {
|
if (Client_OperByMe(Origin)) {
|
||||||
modeok = true;
|
modeok = true;
|
||||||
@@ -316,6 +339,10 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
|
|||||||
use_servermode = true; /* Change Origin to Server */
|
use_servermode = true; /* Change Origin to Server */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!onchannel && !modeok)
|
||||||
|
return IRC_WriteStrClient(Origin, ERR_NOTONCHANNEL_MSG,
|
||||||
|
Client_ID(Origin), Channel_Name(Channel));
|
||||||
}
|
}
|
||||||
|
|
||||||
mode_arg = 1;
|
mode_arg = 1;
|
||||||
@@ -344,7 +371,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
|
|||||||
the_args[0] = '\0';
|
the_args[0] = '\0';
|
||||||
|
|
||||||
x[1] = '\0';
|
x[1] = '\0';
|
||||||
ok = CONNECTED;
|
connected = CONNECTED;
|
||||||
while (mode_ptr) {
|
while (mode_ptr) {
|
||||||
if (!skiponce)
|
if (!skiponce)
|
||||||
mode_ptr++;
|
mode_ptr++;
|
||||||
@@ -401,10 +428,11 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
|
|||||||
case 'n': /* Only members can write */
|
case 'n': /* Only members can write */
|
||||||
case 's': /* Secret channel */
|
case 's': /* Secret channel */
|
||||||
case 't': /* Topic locked */
|
case 't': /* Topic locked */
|
||||||
|
case 'z': /* Secure connections only */
|
||||||
if (modeok)
|
if (modeok)
|
||||||
x[0] = *mode_ptr;
|
x[0] = *mode_ptr;
|
||||||
else
|
else
|
||||||
ok = IRC_WriteStrClient(Origin,
|
connected = IRC_WriteStrClient(Origin,
|
||||||
ERR_CHANOPRIVSNEEDED_MSG,
|
ERR_CHANOPRIVSNEEDED_MSG,
|
||||||
Client_ID(Origin), Channel_Name(Channel));
|
Client_ID(Origin), Channel_Name(Channel));
|
||||||
break;
|
break;
|
||||||
@@ -413,7 +441,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
|
|||||||
if (modeok)
|
if (modeok)
|
||||||
x[0] = *mode_ptr;
|
x[0] = *mode_ptr;
|
||||||
else
|
else
|
||||||
ok = IRC_WriteStrClient(Origin,
|
connected = IRC_WriteStrClient(Origin,
|
||||||
ERR_CHANOPRIVSNEEDED_MSG,
|
ERR_CHANOPRIVSNEEDED_MSG,
|
||||||
Client_ID(Origin),
|
Client_ID(Origin),
|
||||||
Channel_Name(Channel));
|
Channel_Name(Channel));
|
||||||
@@ -428,7 +456,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
|
|||||||
sizeof(argadd));
|
sizeof(argadd));
|
||||||
x[0] = *mode_ptr;
|
x[0] = *mode_ptr;
|
||||||
} else {
|
} else {
|
||||||
ok = IRC_WriteStrClient(Origin,
|
connected = IRC_WriteStrClient(Origin,
|
||||||
ERR_CHANOPRIVSNEEDED_MSG,
|
ERR_CHANOPRIVSNEEDED_MSG,
|
||||||
Client_ID(Origin),
|
Client_ID(Origin),
|
||||||
Channel_Name(Channel));
|
Channel_Name(Channel));
|
||||||
@@ -436,7 +464,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
|
|||||||
Req->argv[arg_arg][0] = '\0';
|
Req->argv[arg_arg][0] = '\0';
|
||||||
arg_arg++;
|
arg_arg++;
|
||||||
} else {
|
} else {
|
||||||
ok = IRC_WriteStrClient(Origin,
|
connected = IRC_WriteStrClient(Origin,
|
||||||
ERR_NEEDMOREPARAMS_MSG,
|
ERR_NEEDMOREPARAMS_MSG,
|
||||||
Client_ID(Origin), Req->command);
|
Client_ID(Origin), Req->command);
|
||||||
goto chan_exit;
|
goto chan_exit;
|
||||||
@@ -447,7 +475,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
|
|||||||
if (modeok)
|
if (modeok)
|
||||||
x[0] = *mode_ptr;
|
x[0] = *mode_ptr;
|
||||||
else
|
else
|
||||||
ok = IRC_WriteStrClient(Origin,
|
connected = IRC_WriteStrClient(Origin,
|
||||||
ERR_CHANOPRIVSNEEDED_MSG,
|
ERR_CHANOPRIVSNEEDED_MSG,
|
||||||
Client_ID(Origin),
|
Client_ID(Origin),
|
||||||
Channel_Name(Channel));
|
Channel_Name(Channel));
|
||||||
@@ -464,7 +492,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
|
|||||||
x[0] = *mode_ptr;
|
x[0] = *mode_ptr;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ok = IRC_WriteStrClient(Origin,
|
connected = IRC_WriteStrClient(Origin,
|
||||||
ERR_CHANOPRIVSNEEDED_MSG,
|
ERR_CHANOPRIVSNEEDED_MSG,
|
||||||
Client_ID(Origin),
|
Client_ID(Origin),
|
||||||
Channel_Name(Channel));
|
Channel_Name(Channel));
|
||||||
@@ -472,7 +500,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
|
|||||||
Req->argv[arg_arg][0] = '\0';
|
Req->argv[arg_arg][0] = '\0';
|
||||||
arg_arg++;
|
arg_arg++;
|
||||||
} else {
|
} else {
|
||||||
ok = IRC_WriteStrClient(Origin,
|
connected = IRC_WriteStrClient(Origin,
|
||||||
ERR_NEEDMOREPARAMS_MSG,
|
ERR_NEEDMOREPARAMS_MSG,
|
||||||
Client_ID(Origin), Req->command);
|
Client_ID(Origin), Req->command);
|
||||||
goto chan_exit;
|
goto chan_exit;
|
||||||
@@ -484,13 +512,13 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
|
|||||||
* set the 'P' channel mode! */
|
* set the 'P' channel mode! */
|
||||||
if (set && !(Client_OperByMe(Client)
|
if (set && !(Client_OperByMe(Client)
|
||||||
|| Client_Type(Client) == CLIENT_SERVER))
|
|| Client_Type(Client) == CLIENT_SERVER))
|
||||||
ok = IRC_WriteStrClient(Origin,
|
connected = IRC_WriteStrClient(Origin,
|
||||||
ERR_NOPRIVILEGES_MSG,
|
ERR_NOPRIVILEGES_MSG,
|
||||||
Client_ID(Origin));
|
Client_ID(Origin));
|
||||||
else
|
else
|
||||||
x[0] = 'P';
|
x[0] = 'P';
|
||||||
} else
|
} else
|
||||||
ok = IRC_WriteStrClient(Origin,
|
connected = IRC_WriteStrClient(Origin,
|
||||||
ERR_CHANOPRIVSNEEDED_MSG,
|
ERR_CHANOPRIVSNEEDED_MSG,
|
||||||
Client_ID(Origin),
|
Client_ID(Origin),
|
||||||
Channel_Name(Channel));
|
Channel_Name(Channel));
|
||||||
@@ -504,12 +532,12 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
|
|||||||
if (client)
|
if (client)
|
||||||
x[0] = *mode_ptr;
|
x[0] = *mode_ptr;
|
||||||
else
|
else
|
||||||
ok = IRC_WriteStrClient(Client,
|
connected = IRC_WriteStrClient(Client,
|
||||||
ERR_NOSUCHNICK_MSG,
|
ERR_NOSUCHNICK_MSG,
|
||||||
Client_ID(Client),
|
Client_ID(Client),
|
||||||
Req->argv[arg_arg]);
|
Req->argv[arg_arg]);
|
||||||
} else {
|
} else {
|
||||||
ok = IRC_WriteStrClient(Origin,
|
connected = IRC_WriteStrClient(Origin,
|
||||||
ERR_CHANOPRIVSNEEDED_MSG,
|
ERR_CHANOPRIVSNEEDED_MSG,
|
||||||
Client_ID(Origin),
|
Client_ID(Origin),
|
||||||
Channel_Name(Channel));
|
Channel_Name(Channel));
|
||||||
@@ -517,7 +545,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
|
|||||||
Req->argv[arg_arg][0] = '\0';
|
Req->argv[arg_arg][0] = '\0';
|
||||||
arg_arg++;
|
arg_arg++;
|
||||||
} else {
|
} else {
|
||||||
ok = IRC_WriteStrClient(Origin,
|
connected = IRC_WriteStrClient(Origin,
|
||||||
ERR_NEEDMOREPARAMS_MSG,
|
ERR_NEEDMOREPARAMS_MSG,
|
||||||
Client_ID(Origin), Req->command);
|
Client_ID(Origin), Req->command);
|
||||||
goto chan_exit;
|
goto chan_exit;
|
||||||
@@ -529,7 +557,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
|
|||||||
if (arg_arg > mode_arg) {
|
if (arg_arg > mode_arg) {
|
||||||
/* modify list */
|
/* modify list */
|
||||||
if (modeok) {
|
if (modeok) {
|
||||||
ok = set
|
connected = set
|
||||||
? Add_Ban_Invite(*mode_ptr, Origin,
|
? Add_Ban_Invite(*mode_ptr, Origin,
|
||||||
Client, Channel,
|
Client, Channel,
|
||||||
Req->argv[arg_arg])
|
Req->argv[arg_arg])
|
||||||
@@ -537,7 +565,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
|
|||||||
Client, Channel,
|
Client, Channel,
|
||||||
Req->argv[arg_arg]);
|
Req->argv[arg_arg]);
|
||||||
} else {
|
} else {
|
||||||
ok = IRC_WriteStrClient(Origin,
|
connected = IRC_WriteStrClient(Origin,
|
||||||
ERR_CHANOPRIVSNEEDED_MSG,
|
ERR_CHANOPRIVSNEEDED_MSG,
|
||||||
Client_ID(Origin),
|
Client_ID(Origin),
|
||||||
Channel_Name(Channel));
|
Channel_Name(Channel));
|
||||||
@@ -557,7 +585,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
|
|||||||
set ? '+' : '-', *mode_ptr, Client_ID(Origin),
|
set ? '+' : '-', *mode_ptr, Client_ID(Origin),
|
||||||
Channel_Name(Channel));
|
Channel_Name(Channel));
|
||||||
if (Client_Type(Client) != CLIENT_SERVER)
|
if (Client_Type(Client) != CLIENT_SERVER)
|
||||||
ok = IRC_WriteStrClient(Origin,
|
connected = IRC_WriteStrClient(Origin,
|
||||||
ERR_UMODEUNKNOWNFLAG2_MSG,
|
ERR_UMODEUNKNOWNFLAG2_MSG,
|
||||||
Client_ID(Origin),
|
Client_ID(Origin),
|
||||||
set ? '+' : '-', *mode_ptr);
|
set ? '+' : '-', *mode_ptr);
|
||||||
@@ -565,7 +593,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
|
|||||||
goto chan_exit;
|
goto chan_exit;
|
||||||
} /* switch() */
|
} /* switch() */
|
||||||
|
|
||||||
if (!ok)
|
if (!connected)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Is there a valid mode change? */
|
/* Is there a valid mode change? */
|
||||||
@@ -646,7 +674,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
|
|||||||
if (use_servermode)
|
if (use_servermode)
|
||||||
Origin = Client_ThisServer();
|
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,
|
connected = IRC_WriteStrClientPrefix(Client, Origin,
|
||||||
"MODE %s %s%s", Channel_Name(Channel),
|
"MODE %s %s%s", Channel_Name(Channel),
|
||||||
the_modes, the_args);
|
the_modes, the_args);
|
||||||
/* Only forward requests for non-local channels */
|
/* Only forward requests for non-local channels */
|
||||||
@@ -661,7 +689,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
|
|||||||
}
|
}
|
||||||
|
|
||||||
IRC_SetPenalty(Client, 1);
|
IRC_SetPenalty(Client, 1);
|
||||||
return CONNECTED;
|
return connected;
|
||||||
} /* Channel_Mode */
|
} /* Channel_Mode */
|
||||||
|
|
||||||
|
|
||||||
@@ -747,7 +775,8 @@ Del_Ban_Invite(int what, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, const
|
|||||||
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
Send_ListChange( char *Mode, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, const char *Mask )
|
Send_ListChange(const char *Mode, CLIENT *Prefix, CLIENT *Client,
|
||||||
|
CHANNEL *Channel, const char *Mask)
|
||||||
{
|
{
|
||||||
bool ok;
|
bool ok;
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,6 @@
|
|||||||
|
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "conn.h"
|
#include "conn.h"
|
||||||
#include "client.h"
|
|
||||||
#include "channel.h"
|
#include "channel.h"
|
||||||
#include "irc-write.h"
|
#include "irc-write.h"
|
||||||
#include "lists.h"
|
#include "lists.h"
|
||||||
|
|||||||
@@ -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-2008 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
|
||||||
@@ -16,57 +16,64 @@
|
|||||||
|
|
||||||
#include "imp.h"
|
#include "imp.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
#include "ngircd.h"
|
#include "ngircd.h"
|
||||||
#include "resolve.h"
|
|
||||||
#include "conn-func.h"
|
#include "conn-func.h"
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
#include "client.h"
|
|
||||||
#include "channel.h"
|
#include "channel.h"
|
||||||
#include "irc-write.h"
|
#include "irc-write.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "match.h"
|
#include "match.h"
|
||||||
#include "messages.h"
|
#include "messages.h"
|
||||||
#include "parse.h"
|
#include "parse.h"
|
||||||
|
#include "op.h"
|
||||||
|
|
||||||
#include <exp.h>
|
#include <exp.h>
|
||||||
#include "irc-oper.h"
|
#include "irc-oper.h"
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle invalid received OPER command.
|
||||||
|
* Log OPER attempt and send error message to client.
|
||||||
|
*/
|
||||||
static bool
|
static bool
|
||||||
Bad_OperPass(CLIENT *Client, char *errtoken, char *errmsg)
|
Bad_OperPass(CLIENT *Client, char *errtoken, char *errmsg)
|
||||||
{
|
{
|
||||||
Log( LOG_WARNING, "Got invalid OPER from \"%s\": \"%s\" -- %s", Client_Mask( Client ),
|
Log(LOG_WARNING, "Got invalid OPER from \"%s\": \"%s\" -- %s",
|
||||||
errtoken, errmsg);
|
Client_Mask(Client), errtoken, errmsg);
|
||||||
IRC_SetPenalty(Client, 3);
|
IRC_SetPenalty(Client, 3);
|
||||||
return IRC_WriteStrClient( Client, ERR_PASSWDMISMATCH_MSG, Client_ID( Client ));
|
return IRC_WriteStrClient(Client, ERR_PASSWDMISMATCH_MSG,
|
||||||
}
|
Client_ID(Client));
|
||||||
|
} /* Bad_OperPass */
|
||||||
|
|
||||||
|
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_OPER( CLIENT *Client, REQUEST *Req )
|
IRC_OPER( CLIENT *Client, REQUEST *Req )
|
||||||
{
|
{
|
||||||
unsigned int i;
|
struct Conf_Oper *op;
|
||||||
|
size_t len, i;
|
||||||
|
|
||||||
assert( Client != NULL );
|
assert( Client != NULL );
|
||||||
assert( Req != NULL );
|
assert( Req != NULL );
|
||||||
|
|
||||||
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 );
|
||||||
|
|
||||||
for( i = 0; i < Conf_Oper_Count; i++)
|
len = array_length(&Conf_Opers, sizeof(*op));
|
||||||
{
|
op = array_start(&Conf_Opers);
|
||||||
if( Conf_Oper[i].name[0] && Conf_Oper[i].pwd[0] && ( strcmp( Conf_Oper[i].name, Req->argv[0] ) == 0 )) break;
|
for (i = 0; i < len && strcmp(op[i].name, Req->argv[0]); i++)
|
||||||
}
|
;
|
||||||
if( i >= Conf_Oper_Count )
|
if (i >= len)
|
||||||
return Bad_OperPass(Client, Req->argv[0], "not configured");
|
return Bad_OperPass(Client, Req->argv[0], "not configured");
|
||||||
|
|
||||||
if( strcmp( Conf_Oper[i].pwd, Req->argv[1] ) != 0 )
|
if (strcmp(op[i].pwd, Req->argv[1]) != 0)
|
||||||
return Bad_OperPass(Client, Conf_Oper[i].name, "Bad password");
|
return Bad_OperPass(Client, op[i].name, "bad password");
|
||||||
|
|
||||||
if( Conf_Oper[i].mask && (! Match( Conf_Oper[i].mask, Client_Mask( Client ) )))
|
if (op[i].mask && (!Match(op[i].mask, Client_Mask(Client))))
|
||||||
return Bad_OperPass(Client, Conf_Oper[i].mask, "hostmask check failed" );
|
return Bad_OperPass(Client, op[i].mask, "hostmask check failed");
|
||||||
|
|
||||||
if( ! Client_HasMode( Client, 'o' ))
|
if( ! Client_HasMode( Client, 'o' ))
|
||||||
{
|
{
|
||||||
@@ -93,10 +100,8 @@ IRC_DIE(CLIENT * Client, REQUEST * Req)
|
|||||||
assert(Client != NULL);
|
assert(Client != NULL);
|
||||||
assert(Req != NULL);
|
assert(Req != NULL);
|
||||||
|
|
||||||
/* Not a local IRC operator? */
|
if (!Op_Check(Client, Req))
|
||||||
if ((!Client_HasMode(Client, 'o')) || (!Client_OperByMe(Client)))
|
return Op_NoPrivileges(Client, Req);
|
||||||
return IRC_WriteStrClient(Client, ERR_NOPRIVILEGES_MSG,
|
|
||||||
Client_ID(Client));
|
|
||||||
|
|
||||||
/* Bad number of parameters? */
|
/* Bad number of parameters? */
|
||||||
#ifdef STRICT_RFC
|
#ifdef STRICT_RFC
|
||||||
@@ -135,15 +140,15 @@ IRC_REHASH( CLIENT *Client, REQUEST *Req )
|
|||||||
assert( Client != NULL );
|
assert( Client != NULL );
|
||||||
assert( Req != NULL );
|
assert( Req != NULL );
|
||||||
|
|
||||||
/* Not a local IRC operator? */
|
if (!Op_Check(Client, Req))
|
||||||
if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
|
return Op_NoPrivileges(Client, Req);
|
||||||
|
|
||||||
/* Bad number of parameters? */
|
/* Bad number of parameters? */
|
||||||
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;
|
raise(SIGHUP);
|
||||||
|
|
||||||
return CONNECTED;
|
return CONNECTED;
|
||||||
} /* IRC_REHASH */
|
} /* IRC_REHASH */
|
||||||
|
|
||||||
@@ -156,8 +161,8 @@ IRC_RESTART( CLIENT *Client, REQUEST *Req )
|
|||||||
assert( Client != NULL );
|
assert( Client != NULL );
|
||||||
assert( Req != NULL );
|
assert( Req != NULL );
|
||||||
|
|
||||||
/* Not a local IRC operator? */
|
if (!Op_Check(Client, Req))
|
||||||
if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
|
return Op_NoPrivileges(Client, Req);
|
||||||
|
|
||||||
/* Bad number of parameters? */
|
/* Bad number of parameters? */
|
||||||
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 );
|
||||||
@@ -174,17 +179,18 @@ IRC_RESTART( CLIENT *Client, REQUEST *Req )
|
|||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_CONNECT(CLIENT * Client, REQUEST * Req)
|
IRC_CONNECT(CLIENT * Client, REQUEST * Req)
|
||||||
{
|
{
|
||||||
|
CLIENT *from, *target;
|
||||||
|
|
||||||
assert(Client != NULL);
|
assert(Client != NULL);
|
||||||
assert(Req != NULL);
|
assert(Req != NULL);
|
||||||
|
|
||||||
/* Not a local IRC operator? */
|
if (Client_Type(Client) != CLIENT_SERVER
|
||||||
if ((!Client_HasMode(Client, 'o')) || (!Client_OperByMe(Client)))
|
&& !Client_HasMode(Client, 'o'))
|
||||||
return IRC_WriteStrClient(Client, ERR_NOPRIVILEGES_MSG,
|
return Op_NoPrivileges(Client, Req);
|
||||||
Client_ID(Client));
|
|
||||||
|
|
||||||
/* Bad number of parameters? */
|
/* Bad number of parameters? */
|
||||||
if ((Req->argc != 1) && (Req->argc != 2) && (Req->argc != 5))
|
if (Req->argc != 1 && Req->argc != 2 && Req->argc != 3 &&
|
||||||
|
Req->argc != 5 && Req->argc != 6)
|
||||||
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||||
Client_ID(Client), Req->command);
|
Client_ID(Client), Req->command);
|
||||||
|
|
||||||
@@ -193,74 +199,125 @@ IRC_CONNECT(CLIENT * Client, REQUEST * Req)
|
|||||||
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||||
Client_ID(Client), Req->command);
|
Client_ID(Client), Req->command);
|
||||||
|
|
||||||
Log(LOG_NOTICE | LOG_snotice,
|
from = Client;
|
||||||
"Got CONNECT command from \"%s\" for \"%s\".", Client_Mask(Client),
|
target = Client_ThisServer();
|
||||||
Req->argv[0]);
|
|
||||||
|
if (Req->argc == 3 || Req->argc == 6) {
|
||||||
|
/* This CONNECT has a target parameter */
|
||||||
|
if (Client_Type(Client) == CLIENT_SERVER && Req->prefix)
|
||||||
|
from = Client_Search(Req->prefix);
|
||||||
|
if (! from)
|
||||||
|
return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG,
|
||||||
|
Client_ID(Client), Req->prefix);
|
||||||
|
|
||||||
|
target = (Req->argc == 3) ? Client_Search(Req->argv[2])
|
||||||
|
: Client_Search(Req->argv[5]);
|
||||||
|
if (! target || Client_Type(target) != CLIENT_SERVER)
|
||||||
|
return IRC_WriteStrClient(from, ERR_NOSUCHSERVER_MSG,
|
||||||
|
Client_ID(from), Req->argv[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (target != Client_ThisServer()) {
|
||||||
|
/* Forward CONNECT command ... */
|
||||||
|
if (Req->argc == 3)
|
||||||
|
IRC_WriteStrClientPrefix(target, from,
|
||||||
|
"CONNECT %s %s :%s", Req->argv[0],
|
||||||
|
Req->argv[1], Req->argv[2]);
|
||||||
|
else
|
||||||
|
IRC_WriteStrClientPrefix(target, from,
|
||||||
|
"CONNECT %s %s %s %s %s :%s", Req->argv[0],
|
||||||
|
Req->argv[1], Req->argv[2], Req->argv[3],
|
||||||
|
Req->argv[4], Req->argv[5]);
|
||||||
|
return CONNECTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Op_Check(from, Req))
|
||||||
|
return Op_NoPrivileges(Client, Req);
|
||||||
|
|
||||||
switch (Req->argc) {
|
switch (Req->argc) {
|
||||||
case 1:
|
case 1:
|
||||||
if (!Conf_EnablePassiveServer(Req->argv[0]))
|
if (!Conf_EnablePassiveServer(Req->argv[0]))
|
||||||
return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
|
return IRC_WriteStrClient(from, ERR_NOSUCHSERVER_MSG,
|
||||||
Client_ID(Client),
|
Client_ID(from),
|
||||||
Req->argv[0]);
|
Req->argv[0]);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
|
case 3:
|
||||||
/* Connect configured server */
|
/* Connect configured server */
|
||||||
if (!Conf_EnableServer
|
if (!Conf_EnableServer
|
||||||
(Req->argv[0], (UINT16) atoi(Req->argv[1])))
|
(Req->argv[0], (UINT16) atoi(Req->argv[1])))
|
||||||
return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
|
return IRC_WriteStrClient(from, ERR_NOSUCHSERVER_MSG,
|
||||||
Client_ID(Client),
|
Client_ID(from),
|
||||||
Req->argv[0]);
|
Req->argv[0]);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* Add server */
|
/* Add server */
|
||||||
if (!Conf_AddServer
|
if (!Conf_AddServer
|
||||||
(Req->argv[0], (UINT16) atoi(Req->argv[1]), Req->argv[2],
|
(Req->argv[0], (UINT16) atoi(Req->argv[1]), Req->argv[2],
|
||||||
Req->argv[3], Req->argv[4]))
|
Req->argv[3], Req->argv[4]))
|
||||||
return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
|
return IRC_WriteStrClient(from, ERR_NOSUCHSERVER_MSG,
|
||||||
Client_ID(Client),
|
Client_ID(from),
|
||||||
Req->argv[0]);
|
Req->argv[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Log(LOG_NOTICE | LOG_snotice,
|
||||||
|
"Got CONNECT command from \"%s\" for \"%s\".", Client_Mask(from),
|
||||||
|
Req->argv[0]);
|
||||||
|
IRC_SendWallops(Client_ThisServer(), Client_ThisServer(),
|
||||||
|
"Received CONNECT %s from %s",
|
||||||
|
Req->argv[0], Client_ID(from));
|
||||||
|
|
||||||
return CONNECTED;
|
return CONNECTED;
|
||||||
} /* IRC_CONNECT */
|
} /* IRC_CONNECT */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disconnect (and disable) configured server.
|
||||||
|
*/
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_DISCONNECT(CLIENT *Client, REQUEST *Req )
|
IRC_DISCONNECT(CLIENT * Client, REQUEST * Req)
|
||||||
{
|
{
|
||||||
/* Disconnect and disable configured server */
|
|
||||||
|
|
||||||
CONN_ID my_conn;
|
CONN_ID my_conn;
|
||||||
|
|
||||||
assert( Client != NULL );
|
assert(Client != NULL);
|
||||||
assert( Req != NULL );
|
assert(Req != NULL);
|
||||||
|
|
||||||
/* Not a local IRC operator? */
|
if (!Op_Check(Client, Req))
|
||||||
if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
|
return Op_NoPrivileges(Client, Req);
|
||||||
|
|
||||||
/* Bad number of parameters? */
|
/* Bad number of parameters? */
|
||||||
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);
|
||||||
|
|
||||||
Log( LOG_NOTICE|LOG_snotice, "Got DISCONNECT command from \"%s\" for0 \"%s\".", Client_Mask( Client ), Req->argv[0]);
|
IRC_SendWallops(Client_ThisServer(), Client_ThisServer(),
|
||||||
|
"Received DISCONNECT %s from %s",
|
||||||
|
Req->argv[0], Client_ID(Client));
|
||||||
|
|
||||||
|
Log(LOG_NOTICE | LOG_snotice,
|
||||||
|
"Got DISCONNECT command from \"%s\" for \"%s\".",
|
||||||
|
Client_Mask(Client), Req->argv[0]);
|
||||||
|
|
||||||
/* Save ID of this connection */
|
/* Save ID of this connection */
|
||||||
my_conn = Client_Conn( Client );
|
my_conn = Client_Conn(Client);
|
||||||
|
|
||||||
/* Connect configured server */
|
/* Disconnect configured server */
|
||||||
if( ! Conf_DisableServer( Req->argv[0] )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] );
|
if (!Conf_DisableServer(Req->argv[0]))
|
||||||
|
return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
|
||||||
|
Client_ID(Client), Req->argv[0]);
|
||||||
|
|
||||||
/* Are we still connected or were we killed, too? */
|
/* Are we still connected or were we killed, too? */
|
||||||
if( Conn_GetClient( my_conn )) return CONNECTED;
|
if (Conn_GetClient(my_conn))
|
||||||
else return DISCONNECTED;
|
return CONNECTED;
|
||||||
} /* IRC_CONNECT */
|
else
|
||||||
|
return DISCONNECTED;
|
||||||
|
} /* IRC_DISCONNECT */
|
||||||
|
|
||||||
|
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_WALLOPS( CLIENT *Client, REQUEST *Req )
|
IRC_WALLOPS( CLIENT *Client, REQUEST *Req )
|
||||||
{
|
{
|
||||||
CLIENT *to, *from;
|
CLIENT *from;
|
||||||
int client_type;
|
|
||||||
|
|
||||||
assert( Client != NULL );
|
assert( Client != NULL );
|
||||||
assert( Req != NULL );
|
assert( Req != NULL );
|
||||||
@@ -268,8 +325,7 @@ IRC_WALLOPS( CLIENT *Client, REQUEST *Req )
|
|||||||
if (Req->argc != 1)
|
if (Req->argc != 1)
|
||||||
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command);
|
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command);
|
||||||
|
|
||||||
client_type = Client_Type(Client);
|
switch (Client_Type(Client)) {
|
||||||
switch (client_type) {
|
|
||||||
case CLIENT_USER:
|
case CLIENT_USER:
|
||||||
if (!Client_OperByMe(Client))
|
if (!Client_OperByMe(Client))
|
||||||
return IRC_WriteStrClient(Client, ERR_NOPRIVILEGES_MSG, Client_ID(Client));
|
return IRC_WriteStrClient(Client, ERR_NOPRIVILEGES_MSG, Client_ID(Client));
|
||||||
@@ -285,25 +341,9 @@ IRC_WALLOPS( CLIENT *Client, REQUEST *Req )
|
|||||||
if (!from)
|
if (!from)
|
||||||
return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, Client_ID(Client), Req->prefix);
|
return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, Client_ID(Client), Req->prefix);
|
||||||
|
|
||||||
for (to=Client_First(); to != NULL; to=Client_Next(to)) {
|
IRC_SendWallops(Client, from, "%s", Req->argv[0]);
|
||||||
if (Client_Conn(to) < 0) /* no local connection or WALLOPS origin */
|
|
||||||
continue;
|
|
||||||
|
|
||||||
client_type = Client_Type(to);
|
|
||||||
switch (client_type) {
|
|
||||||
case CLIENT_USER:
|
|
||||||
if (Client_HasMode(to, 'w'))
|
|
||||||
IRC_WriteStrClientPrefix(to, from, "WALLOPS :%s", Req->argv[0]);
|
|
||||||
break;
|
|
||||||
case CLIENT_SERVER:
|
|
||||||
if (to != Client)
|
|
||||||
IRC_WriteStrClientPrefix(to, from, "WALLOPS :%s", Req->argv[0]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return CONNECTED;
|
return CONNECTED;
|
||||||
}
|
} /* IRC_WALLOPS */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* -eof- */
|
/* -eof- */
|
||||||
|
|||||||
@@ -22,12 +22,10 @@
|
|||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
|
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "resolve.h"
|
|
||||||
#include "conn.h"
|
#include "conn.h"
|
||||||
#include "conn-func.h"
|
#include "conn-func.h"
|
||||||
#include "conn-zip.h"
|
#include "conn-zip.h"
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
#include "client.h"
|
|
||||||
#include "channel.h"
|
#include "channel.h"
|
||||||
#include "irc-write.h"
|
#include "irc-write.h"
|
||||||
#include "lists.h"
|
#include "lists.h"
|
||||||
@@ -37,6 +35,7 @@
|
|||||||
#include "numeric.h"
|
#include "numeric.h"
|
||||||
#include "ngircd.h"
|
#include "ngircd.h"
|
||||||
#include "irc-info.h"
|
#include "irc-info.h"
|
||||||
|
#include "op.h"
|
||||||
|
|
||||||
#include "exp.h"
|
#include "exp.h"
|
||||||
#include "irc-server.h"
|
#include "irc-server.h"
|
||||||
@@ -51,7 +50,6 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
|||||||
{
|
{
|
||||||
char str[LINE_LEN];
|
char str[LINE_LEN];
|
||||||
CLIENT *from, *c;
|
CLIENT *from, *c;
|
||||||
bool ok;
|
|
||||||
int i;
|
int i;
|
||||||
CONN_ID con;
|
CONN_ID con;
|
||||||
|
|
||||||
@@ -97,25 +95,25 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
|||||||
|
|
||||||
/* Is this server registering on our side, or are we connecting to
|
/* Is this server registering on our side, or are we connecting to
|
||||||
* a remote server? */
|
* a remote server? */
|
||||||
con = Client_Conn( Client );
|
con = Client_Conn(Client);
|
||||||
if( Client_Token( Client ) != TOKEN_OUTBOUND )
|
if (Client_Token(Client) != TOKEN_OUTBOUND) {
|
||||||
{
|
|
||||||
/* Incoming connection, send user/pass */
|
/* Incoming connection, send user/pass */
|
||||||
ok = true;
|
if (!IRC_WriteStrClient(Client, "PASS %s %s",
|
||||||
if( ! IRC_WriteStrClient( Client, "PASS %s %s", Conf_Server[i].pwd_out, NGIRCd_ProtoID )) ok = false;
|
Conf_Server[i].pwd_out,
|
||||||
else ok = IRC_WriteStrClient( Client, "SERVER %s 1 :%s", Conf_ServerName, Conf_ServerInfo );
|
NGIRCd_ProtoID)
|
||||||
if( ! ok )
|
|| !IRC_WriteStrClient(Client, "SERVER %s 1 :%s",
|
||||||
{
|
Conf_ServerName,
|
||||||
Conn_Close( con, "Unexpected server behavior!", NULL, false );
|
Conf_ServerInfo)) {
|
||||||
return DISCONNECTED;
|
Conn_Close(con, "Unexpected server behavior!",
|
||||||
|
NULL, false);
|
||||||
|
return DISCONNECTED;
|
||||||
}
|
}
|
||||||
Client_SetIntroducer( Client, Client );
|
Client_SetIntroducer(Client, Client);
|
||||||
Client_SetToken( Client, 1 );
|
Client_SetToken(Client, 1);
|
||||||
}
|
} else {
|
||||||
else
|
/* outgoing connect, we already sent a SERVER and PASS
|
||||||
{
|
* command to the peer */
|
||||||
/* outgoing connect, we already sent SERVER and PASS to the peer */
|
Client_SetToken(Client, atoi(Req->argv[1]));
|
||||||
Client_SetToken( Client, atoi( Req->argv[1] ));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Mark this connection as belonging to an configured server */
|
/* Mark this connection as belonging to an configured server */
|
||||||
@@ -267,46 +265,99 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req )
|
|||||||
} /* IRC_NJOIN */
|
} /* IRC_NJOIN */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for the IRC command "SQUIT".
|
||||||
|
* See RFC 2813 section 4.1.2 and RFC 2812 section 3.1.8.
|
||||||
|
*/
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_SQUIT( CLIENT *Client, REQUEST *Req )
|
IRC_SQUIT(CLIENT * Client, REQUEST * Req)
|
||||||
{
|
{
|
||||||
CLIENT *target;
|
char msg[COMMAND_LEN], logmsg[COMMAND_LEN];
|
||||||
char msg[LINE_LEN + 64];
|
CLIENT *from, *target;
|
||||||
|
CONN_ID con;
|
||||||
|
|
||||||
assert( Client != NULL );
|
assert(Client != NULL);
|
||||||
assert( Req != NULL );
|
assert(Req != NULL);
|
||||||
|
|
||||||
if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
if (Client_Type(Client) != CLIENT_SERVER
|
||||||
|
&& !Client_HasMode(Client, 'o'))
|
||||||
|
return Op_NoPrivileges(Client, Req);
|
||||||
|
|
||||||
Log( LOG_DEBUG, "Got SQUIT from %s for \"%s\": \"%s\" ...", Client_ID( Client ), Req->argv[0], Req->argv[1] );
|
/* Bad number of arguments? */
|
||||||
|
if (Req->argc != 2)
|
||||||
|
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||||
|
Client_ID(Client), Req->command);
|
||||||
|
|
||||||
target = Client_Search( Req->argv[0] );
|
if (Client_Type(Client) == CLIENT_SERVER && Req->prefix) {
|
||||||
if( ! target )
|
from = Client_Search(Req->prefix);
|
||||||
{
|
if (Client_Type(from) != CLIENT_SERVER
|
||||||
Log( LOG_WARNING, "Got SQUIT from %s for unknown server \"%s\"!?", Client_ID( Client ), Req->argv[0] );
|
&& !Op_Check(Client, Req))
|
||||||
|
return Op_NoPrivileges(Client, Req);
|
||||||
|
} else
|
||||||
|
from = Client;
|
||||||
|
if (!from)
|
||||||
|
return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG,
|
||||||
|
Client_ID(Client), Req->prefix);
|
||||||
|
|
||||||
|
Log(LOG_DEBUG, "Got SQUIT from %s for \"%s\": \"%s\" ...",
|
||||||
|
Client_ID(from), Req->argv[0], Req->argv[1]);
|
||||||
|
|
||||||
|
target = Client_Search(Req->argv[0]);
|
||||||
|
if (Client_Type(Client) != CLIENT_SERVER &&
|
||||||
|
target == Client_ThisServer())
|
||||||
|
return Op_NoPrivileges(Client, Req);
|
||||||
|
if (!target) {
|
||||||
|
/* The server is (already) unknown */
|
||||||
|
Log(LOG_WARNING,
|
||||||
|
"Got SQUIT from %s for unknown server \"%s\"!?",
|
||||||
|
Client_ID(Client), Req->argv[0]);
|
||||||
return CONNECTED;
|
return CONNECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( Req->argv[1][0] )
|
con = Client_Conn(target);
|
||||||
{
|
|
||||||
if( strlen( Req->argv[1] ) > LINE_LEN ) Req->argv[1][LINE_LEN] = '\0';
|
|
||||||
snprintf( msg, sizeof( msg ), "%s (SQUIT from %s).", Req->argv[1], Client_ID( Client ));
|
|
||||||
}
|
|
||||||
else snprintf( msg, sizeof( msg ), "Got SQUIT from %s.", Client_ID( Client ));
|
|
||||||
|
|
||||||
if( Client_Conn( target ) > NONE )
|
if (Req->argv[1][0])
|
||||||
{
|
if (Client_NextHop(from) != Client || con > NONE)
|
||||||
/* This server has the connection */
|
snprintf(msg, sizeof(msg), "%s (SQUIT from %s)",
|
||||||
if( Req->argv[1][0] ) Conn_Close( Client_Conn( target ), msg, Req->argv[1], true);
|
Req->argv[1], Client_ID(from));
|
||||||
else Conn_Close( Client_Conn( target ), msg, NULL, true);
|
else
|
||||||
return DISCONNECTED;
|
strlcpy(msg, Req->argv[1], sizeof(msg));
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
snprintf(msg, sizeof(msg), "Got SQUIT from %s",
|
||||||
/* connection was on another server */
|
Client_ID(from));
|
||||||
Client_Destroy( target, msg, Req->argv[1], false );
|
|
||||||
return CONNECTED;
|
if (con > NONE) {
|
||||||
|
/* We are directly connected to the target server, so we
|
||||||
|
* have to tear down the connection and to inform all the
|
||||||
|
* other remaining servers in the network */
|
||||||
|
IRC_SendWallops(Client_ThisServer(), Client_ThisServer(),
|
||||||
|
"Received SQUIT %s from %s: %s",
|
||||||
|
Req->argv[0], Client_ID(from),
|
||||||
|
Req->argv[1][0] ? Req->argv[1] : "-");
|
||||||
|
Conn_Close(con, NULL, msg, true);
|
||||||
|
if (con == Client_Conn(Client))
|
||||||
|
return DISCONNECTED;
|
||||||
|
} else {
|
||||||
|
/* This server is not directly connected, so the SQUIT must
|
||||||
|
* be forwarded ... */
|
||||||
|
if (Client_Type(from) != CLIENT_SERVER) {
|
||||||
|
/* The origin is not an IRC server, so don't evaluate
|
||||||
|
* this SQUIT but simply forward it */
|
||||||
|
IRC_WriteStrClientPrefix(Client_NextHop(target),
|
||||||
|
from, "SQUIT %s :%s", Req->argv[0], Req->argv[1]);
|
||||||
|
} else {
|
||||||
|
/* SQUIT has been generated by another server, so
|
||||||
|
* remove the target server from the network! */
|
||||||
|
logmsg[0] = '\0';
|
||||||
|
if (!strchr(msg, '('))
|
||||||
|
snprintf(logmsg, sizeof(logmsg),
|
||||||
|
"%s (SQUIT from %s)", Req->argv[1],
|
||||||
|
Client_ID(from));
|
||||||
|
Client_Destroy(target, logmsg[0] ? logmsg : msg,
|
||||||
|
msg, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return CONNECTED;
|
||||||
} /* IRC_SQUIT */
|
} /* IRC_SQUIT */
|
||||||
|
|
||||||
/* -eof- */
|
/* -eof- */
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2005 by Alexander Barton (alex@barton.de)
|
* Copyright (c)2001-2008 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
|
||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "conn-func.h"
|
#include "conn-func.h"
|
||||||
#include "client.h"
|
|
||||||
#include "channel.h"
|
#include "channel.h"
|
||||||
|
|
||||||
#include "exp.h"
|
#include "exp.h"
|
||||||
@@ -37,19 +36,20 @@
|
|||||||
#define SEND_TO_SERVER 2
|
#define SEND_TO_SERVER 2
|
||||||
|
|
||||||
|
|
||||||
static char *Get_Prefix PARAMS((CLIENT *Target, CLIENT *Client));
|
static const char *Get_Prefix PARAMS((CLIENT *Target, CLIENT *Client));
|
||||||
static void cb_writeStrServersPrefixFlag PARAMS((CLIENT *Client,
|
static void cb_writeStrServersPrefixFlag PARAMS((CLIENT *Client,
|
||||||
CLIENT *Prefix, void *Buffer));
|
CLIENT *Prefix, void *Buffer));
|
||||||
|
static bool Send_Marked_Connections PARAMS((CLIENT *Prefix, const char *Buffer));
|
||||||
|
|
||||||
|
|
||||||
#ifdef PROTOTYPES
|
#ifdef PROTOTYPES
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_WriteStrClient( CLIENT *Client, char *Format, ... )
|
IRC_WriteStrClient( CLIENT *Client, const char *Format, ... )
|
||||||
#else
|
#else
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_WriteStrClient( Client, Format, va_alist )
|
IRC_WriteStrClient( Client, Format, va_alist )
|
||||||
CLIENT *Client;
|
CLIENT *Client;
|
||||||
char *Format;
|
const char *Format;
|
||||||
va_dcl
|
va_dcl
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
@@ -77,13 +77,13 @@ va_dcl
|
|||||||
|
|
||||||
#ifdef PROTOTYPES
|
#ifdef PROTOTYPES
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, char *Format, ... )
|
IRC_WriteStrClientPrefix(CLIENT *Client, CLIENT *Prefix, const char *Format, ...)
|
||||||
#else
|
#else
|
||||||
GLOBAL bool
|
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;
|
const char *Format;
|
||||||
va_dcl
|
va_dcl
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
@@ -104,20 +104,22 @@ va_dcl
|
|||||||
vsnprintf( buffer, 1000, Format, ap );
|
vsnprintf( buffer, 1000, Format, ap );
|
||||||
va_end( ap );
|
va_end( ap );
|
||||||
|
|
||||||
return Conn_WriteStr( Client_Conn( Client_NextHop( Client )), ":%s %s", Get_Prefix( Client_NextHop( Client ), Prefix ), buffer );
|
return Conn_WriteStr(Client_Conn(Client_NextHop(Client)), ":%s %s",
|
||||||
|
Get_Prefix(Client_NextHop(Client), Prefix), buffer);
|
||||||
} /* IRC_WriteStrClientPrefix */
|
} /* IRC_WriteStrClientPrefix */
|
||||||
|
|
||||||
|
|
||||||
#ifdef PROTOTYPES
|
#ifdef PROTOTYPES
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_WriteStrChannel( CLIENT *Client, CHANNEL *Chan, bool Remote, char *Format, ... )
|
IRC_WriteStrChannel(CLIENT *Client, CHANNEL *Chan, bool Remote,
|
||||||
|
const char *Format, ...)
|
||||||
#else
|
#else
|
||||||
GLOBAL bool
|
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;
|
||||||
bool Remote;
|
bool Remote;
|
||||||
char *Format;
|
const char *Format;
|
||||||
va_dcl
|
va_dcl
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
@@ -146,19 +148,19 @@ va_dcl
|
|||||||
*/
|
*/
|
||||||
#ifdef PROTOTYPES
|
#ifdef PROTOTYPES
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, bool Remote, char *Format, ... )
|
IRC_WriteStrChannelPrefix(CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix,
|
||||||
|
bool Remote, const char *Format, ...)
|
||||||
#else
|
#else
|
||||||
GLOBAL bool
|
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;
|
||||||
bool Remote;
|
bool Remote;
|
||||||
char *Format;
|
const char *Format;
|
||||||
va_dcl
|
va_dcl
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
bool ok = CONNECTED;
|
|
||||||
char buffer[1000];
|
char buffer[1000];
|
||||||
CL2CHAN *cl2chan;
|
CL2CHAN *cl2chan;
|
||||||
CONN_ID conn;
|
CONN_ID conn;
|
||||||
@@ -200,30 +202,18 @@ va_dcl
|
|||||||
}
|
}
|
||||||
cl2chan = Channel_NextMember( Chan, cl2chan );
|
cl2chan = Channel_NextMember( Chan, cl2chan );
|
||||||
}
|
}
|
||||||
|
return Send_Marked_Connections(Prefix, buffer);
|
||||||
conn = Conn_First( );
|
|
||||||
while( conn != NONE )
|
|
||||||
{
|
|
||||||
/* do we need to send data via this connection? */
|
|
||||||
if( Conn_Flag( conn ) == SEND_TO_SERVER) ok = Conn_WriteStr( conn, ":%s %s", Client_ID( Prefix ), buffer );
|
|
||||||
else if( Conn_Flag( conn ) == SEND_TO_USER ) ok = Conn_WriteStr( conn, ":%s %s", Client_Mask( Prefix ), buffer );
|
|
||||||
if( ! ok ) break;
|
|
||||||
|
|
||||||
conn = Conn_Next( conn );
|
|
||||||
}
|
|
||||||
|
|
||||||
return ok;
|
|
||||||
} /* IRC_WriteStrChannelPrefix */
|
} /* IRC_WriteStrChannelPrefix */
|
||||||
|
|
||||||
|
|
||||||
#ifdef PROTOTYPES
|
#ifdef PROTOTYPES
|
||||||
GLOBAL void
|
GLOBAL void
|
||||||
IRC_WriteStrServers( CLIENT *ExceptOf, char *Format, ... )
|
IRC_WriteStrServers(CLIENT *ExceptOf, const 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;
|
const char *Format;
|
||||||
va_dcl
|
va_dcl
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
@@ -246,13 +236,14 @@ va_dcl
|
|||||||
|
|
||||||
#ifdef PROTOTYPES
|
#ifdef PROTOTYPES
|
||||||
GLOBAL void
|
GLOBAL void
|
||||||
IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, char *Format, ... )
|
IRC_WriteStrServersPrefix(CLIENT *ExceptOf, CLIENT *Prefix,
|
||||||
|
const 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;
|
const char *Format;
|
||||||
va_dcl
|
va_dcl
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
@@ -276,14 +267,15 @@ 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,
|
||||||
|
const 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;
|
const char *Format;
|
||||||
va_dcl
|
va_dcl
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
@@ -331,18 +323,18 @@ IRC_WriteStrServersPrefixFlag_CB(CLIENT *ExceptOf, CLIENT *Prefix, char Flag,
|
|||||||
*/
|
*/
|
||||||
#ifdef PROTOTYPES
|
#ifdef PROTOTYPES
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, bool Remote, char *Format, ... )
|
IRC_WriteStrRelatedPrefix(CLIENT *Client, CLIENT *Prefix, bool Remote,
|
||||||
|
const char *Format, ...)
|
||||||
#else
|
#else
|
||||||
GLOBAL bool
|
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;
|
||||||
bool Remote;
|
bool Remote;
|
||||||
char *Format;
|
const char *Format;
|
||||||
va_dcl
|
va_dcl
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
bool ok = CONNECTED;
|
|
||||||
CL2CHAN *chan_cl2chan, *cl2chan;
|
CL2CHAN *chan_cl2chan, *cl2chan;
|
||||||
char buffer[1000];
|
char buffer[1000];
|
||||||
CHANNEL *chan;
|
CHANNEL *chan;
|
||||||
@@ -390,21 +382,57 @@ va_dcl
|
|||||||
|
|
||||||
chan_cl2chan = Channel_NextChannelOf( Client, chan_cl2chan );
|
chan_cl2chan = Channel_NextChannelOf( Client, chan_cl2chan );
|
||||||
}
|
}
|
||||||
|
return Send_Marked_Connections(Prefix, buffer);
|
||||||
conn = Conn_First( );
|
|
||||||
while( conn != NONE )
|
|
||||||
{
|
|
||||||
/* send data via this connection? */
|
|
||||||
if( Conn_Flag( conn ) == SEND_TO_SERVER ) ok = Conn_WriteStr( conn, ":%s %s", Client_ID( Prefix ), buffer );
|
|
||||||
else if( Conn_Flag( conn ) == SEND_TO_USER ) ok = Conn_WriteStr( conn, ":%s %s", Client_Mask( Prefix ), buffer );
|
|
||||||
if( ! ok ) break;
|
|
||||||
|
|
||||||
conn = Conn_Next( conn );
|
|
||||||
}
|
|
||||||
return ok;
|
|
||||||
} /* IRC_WriteStrRelatedPrefix */
|
} /* IRC_WriteStrRelatedPrefix */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send WALLOPS message.
|
||||||
|
*/
|
||||||
|
#ifdef PROTOTYPES
|
||||||
|
GLOBAL void
|
||||||
|
IRC_SendWallops(CLIENT *Client, CLIENT *From, const char *Format, ...)
|
||||||
|
#else
|
||||||
|
GLOBAL void
|
||||||
|
IRC_SendWallops(Client, From, Format, va_alist )
|
||||||
|
CLIENT *Client;
|
||||||
|
CLIENT *From;
|
||||||
|
const char *Format;
|
||||||
|
va_dcl
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
char msg[1000];
|
||||||
|
CLIENT *to;
|
||||||
|
|
||||||
|
#ifdef PROTOTYPES
|
||||||
|
va_start(ap, Format);
|
||||||
|
#else
|
||||||
|
va_start(ap);
|
||||||
|
#endif
|
||||||
|
vsnprintf(msg, 1000, Format, ap);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
for (to=Client_First(); to != NULL; to=Client_Next(to)) {
|
||||||
|
if (Client_Conn(to) == NONE) /* no local connection */
|
||||||
|
continue;
|
||||||
|
|
||||||
|
switch (Client_Type(to)) {
|
||||||
|
case CLIENT_USER:
|
||||||
|
if (Client_HasMode(to, 'w'))
|
||||||
|
IRC_WriteStrClientPrefix(to, From,
|
||||||
|
"WALLOPS :%s", msg);
|
||||||
|
break;
|
||||||
|
case CLIENT_SERVER:
|
||||||
|
if (to != Client)
|
||||||
|
IRC_WriteStrClientPrefix(to, From,
|
||||||
|
"WALLOPS :%s", msg);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} /* IRC_SendWallops */
|
||||||
|
|
||||||
|
|
||||||
GLOBAL void
|
GLOBAL void
|
||||||
IRC_SetPenalty( CLIENT *Client, time_t Seconds )
|
IRC_SetPenalty( CLIENT *Client, time_t Seconds )
|
||||||
{
|
{
|
||||||
@@ -421,14 +449,16 @@ IRC_SetPenalty( CLIENT *Client, time_t Seconds )
|
|||||||
} /* IRC_SetPenalty */
|
} /* IRC_SetPenalty */
|
||||||
|
|
||||||
|
|
||||||
static char *
|
static const char *
|
||||||
Get_Prefix( CLIENT *Target, CLIENT *Client )
|
Get_Prefix(CLIENT *Target, CLIENT *Client)
|
||||||
{
|
{
|
||||||
assert( Target != NULL );
|
assert (Target != NULL);
|
||||||
assert( Client != NULL );
|
assert (Client != NULL);
|
||||||
|
|
||||||
if( Client_Type( Target ) == CLIENT_SERVER ) return Client_ID( Client );
|
if (Client_Type(Target) == CLIENT_SERVER)
|
||||||
else return Client_Mask( Client );
|
return Client_ID(Client);
|
||||||
|
else
|
||||||
|
return Client_MaskCloaked(Client);
|
||||||
} /* Get_Prefix */
|
} /* Get_Prefix */
|
||||||
|
|
||||||
|
|
||||||
@@ -439,4 +469,29 @@ cb_writeStrServersPrefixFlag(CLIENT *Client, CLIENT *Prefix, void *Buffer)
|
|||||||
} /* cb_writeStrServersPrefixFlag */
|
} /* cb_writeStrServersPrefixFlag */
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
Send_Marked_Connections(CLIENT *Prefix, const char *Buffer)
|
||||||
|
{
|
||||||
|
CONN_ID conn;
|
||||||
|
bool ok = CONNECTED;
|
||||||
|
|
||||||
|
assert(Prefix != NULL);
|
||||||
|
assert(Buffer != NULL);
|
||||||
|
|
||||||
|
conn = Conn_First();
|
||||||
|
while (conn != NONE) {
|
||||||
|
if (Conn_Flag(conn) == SEND_TO_SERVER)
|
||||||
|
ok = Conn_WriteStr(conn, ":%s %s",
|
||||||
|
Client_ID(Prefix), Buffer);
|
||||||
|
else if (Conn_Flag(conn) == SEND_TO_USER)
|
||||||
|
ok = Conn_WriteStr(conn, ":%s %s",
|
||||||
|
Client_MaskCloaked(Prefix), Buffer);
|
||||||
|
if (!ok)
|
||||||
|
break;
|
||||||
|
conn = Conn_Next( conn );
|
||||||
|
}
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* -eof- */
|
/* -eof- */
|
||||||
|
|||||||
@@ -14,26 +14,30 @@
|
|||||||
#ifndef __irc_write_h__
|
#ifndef __irc_write_h__
|
||||||
#define __irc_write_h__
|
#define __irc_write_h__
|
||||||
|
|
||||||
GLOBAL bool IRC_WriteStrClient PARAMS((CLIENT *Client, char *Format, ...));
|
GLOBAL bool IRC_WriteStrClient PARAMS((CLIENT *Client, const char *Format, ...));
|
||||||
GLOBAL bool IRC_WriteStrClientPrefix PARAMS((CLIENT *Client, CLIENT *Prefix,
|
GLOBAL bool IRC_WriteStrClientPrefix PARAMS((CLIENT *Client, CLIENT *Prefix,
|
||||||
char *Format, ...));
|
const char *Format, ...));
|
||||||
|
|
||||||
GLOBAL bool IRC_WriteStrChannel PARAMS((CLIENT *Client, CHANNEL *Chan,
|
GLOBAL bool IRC_WriteStrChannel PARAMS((CLIENT *Client, CHANNEL *Chan,
|
||||||
bool Remote, char *Format, ...));
|
bool Remote, const char *Format, ...));
|
||||||
GLOBAL bool IRC_WriteStrChannelPrefix PARAMS((CLIENT *Client, CHANNEL *Chan,
|
GLOBAL bool IRC_WriteStrChannelPrefix PARAMS((CLIENT *Client, CHANNEL *Chan,
|
||||||
CLIENT *Prefix, bool Remote, char *Format, ...));
|
CLIENT *Prefix, bool Remote, const char *Format, ...));
|
||||||
|
|
||||||
GLOBAL void IRC_WriteStrServers PARAMS((CLIENT *ExceptOf, char *Format, ...));
|
GLOBAL void IRC_WriteStrServers PARAMS((CLIENT *ExceptOf,
|
||||||
|
const char *Format, ...));
|
||||||
GLOBAL void IRC_WriteStrServersPrefix PARAMS((CLIENT *ExceptOf, CLIENT *Prefix,
|
GLOBAL void IRC_WriteStrServersPrefix PARAMS((CLIENT *ExceptOf, CLIENT *Prefix,
|
||||||
char *Format, ...));
|
const char *Format, ...));
|
||||||
GLOBAL void IRC_WriteStrServersPrefixFlag PARAMS((CLIENT *ExceptOf,
|
GLOBAL void IRC_WriteStrServersPrefixFlag PARAMS((CLIENT *ExceptOf,
|
||||||
CLIENT *Prefix, char Flag, char *Format, ...));
|
CLIENT *Prefix, char Flag, const char *Format, ...));
|
||||||
GLOBAL void IRC_WriteStrServersPrefixFlag_CB PARAMS((CLIENT *ExceptOf,
|
GLOBAL void IRC_WriteStrServersPrefixFlag_CB PARAMS((CLIENT *ExceptOf,
|
||||||
CLIENT *Prefix, char Flag,
|
CLIENT *Prefix, char Flag,
|
||||||
void (*callback)(CLIENT *, CLIENT *, void *), void *cb_data));
|
void (*callback)(CLIENT *, CLIENT *, void *), void *cb_data));
|
||||||
|
|
||||||
GLOBAL bool IRC_WriteStrRelatedPrefix PARAMS((CLIENT *Client, CLIENT *Prefix,
|
GLOBAL bool IRC_WriteStrRelatedPrefix PARAMS((CLIENT *Client, CLIENT *Prefix,
|
||||||
bool Remote, char *Format, ...));
|
bool Remote, const char *Format, ...));
|
||||||
|
|
||||||
|
GLOBAL void IRC_SendWallops PARAMS((CLIENT *Client, CLIENT *From,
|
||||||
|
const char *Format, ...));
|
||||||
|
|
||||||
GLOBAL void IRC_SetPenalty PARAMS((CLIENT *Client, time_t Seconds));
|
GLOBAL void IRC_SetPenalty PARAMS((CLIENT *Client, time_t Seconds));
|
||||||
|
|
||||||
|
|||||||
@@ -22,10 +22,8 @@ static char UNUSED id[] = "$Id: irc.c,v 1.132 2008/01/15 22:28:14 fw Exp $";
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "ngircd.h"
|
#include "ngircd.h"
|
||||||
#include "resolve.h"
|
|
||||||
#include "conn-func.h"
|
#include "conn-func.h"
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
#include "client.h"
|
|
||||||
#include "channel.h"
|
#include "channel.h"
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "irc-write.h"
|
#include "irc-write.h"
|
||||||
@@ -53,8 +51,12 @@ IRC_ERROR( CLIENT *Client, REQUEST *Req )
|
|||||||
assert( Client != NULL );
|
assert( Client != NULL );
|
||||||
assert( Req != NULL );
|
assert( Req != NULL );
|
||||||
|
|
||||||
if( Req->argc < 1 ) Log( LOG_NOTICE, "Got ERROR from \"%s\"!", Client_Mask( Client ));
|
if (Req->argc < 1)
|
||||||
else Log( LOG_NOTICE, "Got ERROR from \"%s\": %s!", Client_Mask( Client ), Req->argv[0] );
|
Log(LOG_NOTICE, "Got ERROR from \"%s\"!",
|
||||||
|
Client_Mask(Client));
|
||||||
|
else
|
||||||
|
Log(LOG_NOTICE, "Got ERROR from \"%s\": \"%s\"!",
|
||||||
|
Client_Mask(Client), Req->argv[0]);
|
||||||
|
|
||||||
return CONNECTED;
|
return CONNECTED;
|
||||||
} /* IRC_ERROR */
|
} /* IRC_ERROR */
|
||||||
@@ -66,7 +68,7 @@ IRC_ERROR( CLIENT *Client, REQUEST *Req )
|
|||||||
* disconnect clients. It can be used by IRC operators and servers, for example
|
* disconnect clients. It can be used by IRC operators and servers, for example
|
||||||
* to "solve" nick collisions after netsplits.
|
* to "solve" nick collisions after netsplits.
|
||||||
* Please note that this function is also called internally, without a real
|
* Please note that this function is also called internally, without a real
|
||||||
* KILL command beeing received over the network! Client is Client_ThisServer()
|
* KILL command being received over the network! Client is Client_ThisServer()
|
||||||
* in this case. */
|
* in this case. */
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_KILL( CLIENT *Client, REQUEST *Req )
|
IRC_KILL( CLIENT *Client, REQUEST *Req )
|
||||||
@@ -156,11 +158,15 @@ IRC_KILL( CLIENT *Client, REQUEST *Req )
|
|||||||
Client_Type( c ), Req->argv[0] );
|
Client_Type( c ), Req->argv[0] );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Kill client NOW! */
|
/* Kill the client NOW:
|
||||||
|
* - Close the local connection (if there is one),
|
||||||
|
* - Destroy the CLIENT structure for remote clients.
|
||||||
|
* Note: Conn_Close() removes the CLIENT structure as well. */
|
||||||
conn = Client_Conn( c );
|
conn = Client_Conn( c );
|
||||||
Client_Destroy( c, NULL, reason, false );
|
if(conn > NONE)
|
||||||
if( conn > NONE )
|
Conn_Close(conn, NULL, reason, true);
|
||||||
Conn_Close( conn, NULL, reason, true );
|
else
|
||||||
|
Client_Destroy(c, NULL, reason, false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Log( LOG_NOTICE, "Client with nick \"%s\" is unknown here.", Req->argv[0] );
|
Log( LOG_NOTICE, "Client with nick \"%s\" is unknown here.", Req->argv[0] );
|
||||||
@@ -406,7 +412,7 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
|
|||||||
if (nick != NULL && host != NULL) {
|
if (nick != NULL && host != NULL) {
|
||||||
if (strcmp(nick, Client_ID(cl)) == 0 &&
|
if (strcmp(nick, Client_ID(cl)) == 0 &&
|
||||||
strcmp(user, Client_User(cl)) == 0 &&
|
strcmp(user, Client_User(cl)) == 0 &&
|
||||||
strcasecmp(host, Client_Hostname(cl)) == 0)
|
strcasecmp(host, Client_HostnameCloaked(cl)) == 0)
|
||||||
break;
|
break;
|
||||||
else
|
else
|
||||||
continue;
|
continue;
|
||||||
@@ -414,7 +420,7 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
|
|||||||
if (strcasecmp(user, Client_User(cl)) != 0)
|
if (strcasecmp(user, Client_User(cl)) != 0)
|
||||||
continue;
|
continue;
|
||||||
if (host != NULL && strcasecmp(host,
|
if (host != NULL && strcasecmp(host,
|
||||||
Client_Hostname(cl)) != 0)
|
Client_HostnameCloaked(cl)) != 0)
|
||||||
continue;
|
continue;
|
||||||
if (server != NULL && strcasecmp(server,
|
if (server != NULL && strcasecmp(server,
|
||||||
Client_ID(Client_Introducer(cl))) != 0)
|
Client_ID(Client_Introducer(cl))) != 0)
|
||||||
|
|||||||
@@ -19,7 +19,6 @@
|
|||||||
|
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "conn.h"
|
#include "conn.h"
|
||||||
#include "client.h"
|
|
||||||
#include "channel.h"
|
#include "channel.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "match.h"
|
#include "match.h"
|
||||||
|
|||||||
100
src/ngircd/log.c
100
src/ngircd/log.c
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2005 Alexander Barton (alex@barton.de)
|
* Copyright (c)2001-2010 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
|
||||||
@@ -34,9 +34,9 @@
|
|||||||
#include "ngircd.h"
|
#include "ngircd.h"
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "conn.h"
|
#include "conn.h"
|
||||||
#include "client.h"
|
|
||||||
#include "channel.h"
|
#include "channel.h"
|
||||||
#include "irc-write.h"
|
#include "irc-write.h"
|
||||||
|
#include "conf.h"
|
||||||
|
|
||||||
#include "exp.h"
|
#include "exp.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
@@ -50,8 +50,6 @@ static char Error_File[FNAME_LEN];
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static void Wall_ServerNotice PARAMS(( char *Msg ));
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
Log_Message(int Level, const char *msg)
|
Log_Message(int Level, const char *msg)
|
||||||
{
|
{
|
||||||
@@ -75,13 +73,10 @@ Log_Init( bool Daemon_Mode )
|
|||||||
Is_Daemon = Daemon_Mode;
|
Is_Daemon = Daemon_Mode;
|
||||||
|
|
||||||
#ifdef SYSLOG
|
#ifdef SYSLOG
|
||||||
#ifndef LOG_CONS /* Kludge: mips-dec-ultrix4.5 has no LOG_CONS/LOG_LOCAL5 */
|
#ifndef LOG_CONS /* Kludge: mips-dec-ultrix4.5 has no LOG_CONS */
|
||||||
#define LOG_CONS 0
|
#define LOG_CONS 0
|
||||||
#endif
|
#endif
|
||||||
#ifndef LOG_LOCAL5
|
openlog(PACKAGE_NAME, LOG_CONS|LOG_PID, Conf_SyslogFacility);
|
||||||
#define LOG_LOCAL5 0
|
|
||||||
#endif
|
|
||||||
openlog( PACKAGE_NAME, LOG_CONS|LOG_PID, LOG_LOCAL5 );
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Log( LOG_NOTICE, "%s started.", NGIRCd_Version );
|
Log( LOG_NOTICE, "%s started.", NGIRCd_Version );
|
||||||
@@ -146,8 +141,8 @@ GLOBAL void
|
|||||||
Log_Exit( void )
|
Log_Exit( void )
|
||||||
{
|
{
|
||||||
/* Good Bye! */
|
/* Good Bye! */
|
||||||
if( NGIRCd_SignalRestart ) Log( LOG_NOTICE, "%s done (restarting).", PACKAGE_NAME );
|
Log(LOG_NOTICE, "%s done%s, served %lu connections.", PACKAGE_NAME,
|
||||||
else Log( LOG_NOTICE, "%s done.", PACKAGE_NAME );
|
NGIRCd_SignalRestart ? " (restarting)" : "", Conn_CountAccepted());
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if( Error_File[0] )
|
if( Error_File[0] )
|
||||||
@@ -260,93 +255,110 @@ va_dcl
|
|||||||
if (snotice) {
|
if (snotice) {
|
||||||
/* Send NOTICE to all local users with mode +s and to the
|
/* Send NOTICE to all local users with mode +s and to the
|
||||||
* local &SERVER channel */
|
* local &SERVER channel */
|
||||||
Wall_ServerNotice(msg);
|
Log_ServerNotice('s', "%s", msg);
|
||||||
Channel_LogServer(msg);
|
Channel_LogServer(msg);
|
||||||
}
|
}
|
||||||
} /* Log */
|
} /* Log */
|
||||||
|
|
||||||
|
|
||||||
GLOBAL void
|
GLOBAL void
|
||||||
Log_Init_Resolver( void )
|
Log_Init_Subprocess(char UNUSED *Name)
|
||||||
{
|
{
|
||||||
#ifdef SYSLOG
|
#ifdef SYSLOG
|
||||||
openlog( PACKAGE_NAME, LOG_CONS|LOG_PID, LOG_LOCAL5 );
|
openlog(PACKAGE_NAME, LOG_CONS|LOG_PID, Conf_SyslogFacility);
|
||||||
#endif
|
#endif
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Log_Resolver(LOG_DEBUG, "Resolver sub-process starting, PID %ld.", (long)getpid());
|
Log_Subprocess(LOG_DEBUG, "%s sub-process starting, PID %ld.",
|
||||||
|
Name, (long)getpid());
|
||||||
#endif
|
#endif
|
||||||
} /* Log_Init_Resolver */
|
}
|
||||||
|
|
||||||
|
|
||||||
GLOBAL void
|
GLOBAL void
|
||||||
Log_Exit_Resolver( void )
|
Log_Exit_Subprocess(char UNUSED *Name)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Log_Resolver(LOG_DEBUG, "Resolver sub-process %ld done.", (long)getpid());
|
Log_Subprocess(LOG_DEBUG, "%s sub-process %ld done.",
|
||||||
|
Name, (long)getpid());
|
||||||
#endif
|
#endif
|
||||||
#ifdef SYSLOG
|
#ifdef SYSLOG
|
||||||
closelog( );
|
closelog( );
|
||||||
#endif
|
#endif
|
||||||
} /* Log_Exit_Resolver */
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef PROTOTYPES
|
#ifdef PROTOTYPES
|
||||||
GLOBAL void
|
GLOBAL void
|
||||||
Log_Resolver( const int Level, const char *Format, ... )
|
Log_Subprocess(const int Level, const char *Format, ...)
|
||||||
#else
|
#else
|
||||||
GLOBAL void
|
GLOBAL void
|
||||||
Log_Resolver( Level, Format, va_alist )
|
Log_Subprocess(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 */
|
|
||||||
|
|
||||||
char msg[MAX_LOG_MSG_LEN];
|
char msg[MAX_LOG_MSG_LEN];
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
assert( Format != NULL );
|
assert(Format != NULL);
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if(( Level == LOG_DEBUG ) && ( ! NGIRCd_Debug )) return;
|
if ((Level == LOG_DEBUG) && (!NGIRCd_Debug))
|
||||||
|
return;
|
||||||
#else
|
#else
|
||||||
if( Level == LOG_DEBUG ) return;
|
if (Level == LOG_DEBUG)
|
||||||
|
return;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* String mit variablen Argumenten zusammenbauen ... */
|
|
||||||
#ifdef PROTOTYPES
|
#ifdef PROTOTYPES
|
||||||
va_start( ap, Format );
|
va_start(ap, Format);
|
||||||
#else
|
#else
|
||||||
va_start( ap );
|
va_start(ap);
|
||||||
#endif
|
#endif
|
||||||
vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap );
|
vsnprintf(msg, MAX_LOG_MSG_LEN, Format, ap);
|
||||||
va_end( ap );
|
va_end(ap);
|
||||||
|
|
||||||
Log_Message(Level, msg);
|
Log_Message(Level, msg);
|
||||||
} /* Log_Resolver */
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send log messages to users flagged with the "s" mode.
|
* Send a log message to all local users flagged with the given user mode.
|
||||||
* @param Msg The message to send.
|
* @param UserMode User mode which the target user must have set,
|
||||||
|
* @param Format The format string.
|
||||||
*/
|
*/
|
||||||
static void
|
#ifdef PROTOTYPES
|
||||||
Wall_ServerNotice( char *Msg )
|
GLOBAL void
|
||||||
|
Log_ServerNotice(const char UserMode, const char *Format, ... )
|
||||||
|
#else
|
||||||
|
GLOBAL void
|
||||||
|
Log_ServerNotice(UserMode, Format, va_alist)
|
||||||
|
const char UserMode;
|
||||||
|
const char *Format;
|
||||||
|
va_dcl
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
CLIENT *c;
|
CLIENT *c;
|
||||||
|
char msg[MAX_LOG_MSG_LEN];
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
assert( Msg != NULL );
|
assert(Format != NULL);
|
||||||
|
|
||||||
c = Client_First( );
|
#ifdef PROTOTYPES
|
||||||
while(c) {
|
va_start(ap, Format);
|
||||||
if (Client_Conn(c) > NONE && Client_HasMode(c, 's'))
|
#else
|
||||||
|
va_start(ap);
|
||||||
|
#endif
|
||||||
|
vsnprintf(msg, MAX_LOG_MSG_LEN, Format, ap);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
for(c=Client_First(); c != NULL; c=Client_Next(c)) {
|
||||||
|
if (Client_Conn(c) > NONE && Client_HasMode(c, UserMode))
|
||||||
IRC_WriteStrClient(c, "NOTICE %s :%s%s", Client_ID(c),
|
IRC_WriteStrClient(c, "NOTICE %s :%s%s", Client_ID(c),
|
||||||
NOTICE_TXTPREFIX, Msg);
|
NOTICE_TXTPREFIX, msg);
|
||||||
|
|
||||||
c = Client_Next( c );
|
|
||||||
}
|
}
|
||||||
} /* Wall_ServerNotice */
|
} /* Log_ServerNotice */
|
||||||
|
|
||||||
|
|
||||||
/* -eof- */
|
/* -eof- */
|
||||||
|
|||||||
@@ -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-2010 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,8 +8,6 @@
|
|||||||
* (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.20 2006/08/05 09:16:21 fw Exp $
|
|
||||||
*
|
|
||||||
* Logging functions (header)
|
* Logging functions (header)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -40,17 +38,18 @@ GLOBAL void Log_Exit PARAMS(( void ));
|
|||||||
|
|
||||||
GLOBAL void Log PARAMS(( int Level, const char *Format, ... ));
|
GLOBAL void Log PARAMS(( int Level, const char *Format, ... ));
|
||||||
|
|
||||||
|
GLOBAL void Log_ServerNotice PARAMS((char UserMode, const char *Format, ...));
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
GLOBAL void LogDebug PARAMS(( const char *Format, ... ));
|
GLOBAL void LogDebug PARAMS(( const char *Format, ... ));
|
||||||
#else
|
#else
|
||||||
static inline void LogDebug PARAMS(( UNUSED const char *Format, ... )){/* Do nothing. The compiler should optimize this out, please ;-) */}
|
static inline void LogDebug PARAMS(( UNUSED const char *Format, ... )){/* Do nothing. The compiler should optimize this out, please ;-) */}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
GLOBAL void Log_Init_Subprocess PARAMS((char *Name));
|
||||||
|
GLOBAL void Log_Exit_Subprocess PARAMS((char *Name));
|
||||||
|
|
||||||
GLOBAL void Log_Init_Resolver PARAMS(( void ));
|
GLOBAL void Log_Subprocess PARAMS((const int Level, const char *Format, ...));
|
||||||
GLOBAL void Log_Exit_Resolver PARAMS(( void ));
|
|
||||||
|
|
||||||
GLOBAL void Log_Resolver PARAMS(( const int Level, const char *Format, ... ));
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
GLOBAL void Log_InitErrorfile PARAMS(( void ));
|
GLOBAL void Log_InitErrorfile PARAMS(( void ));
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2008 Alexander Barton <alex@barton.de>
|
* Copyright (c)2001-2010 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
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
#define RPL_YOURHOST_MSG "002 %s :Your host is %s, running version ngircd-%s (%s/%s/%s)"
|
#define RPL_YOURHOST_MSG "002 %s :Your host is %s, running version ngircd-%s (%s/%s/%s)"
|
||||||
#define RPL_CREATED_MSG "003 %s :This server has been started %s"
|
#define RPL_CREATED_MSG "003 %s :This server has been started %s"
|
||||||
#define RPL_MYINFO_MSG "004 %s %s ngircd-%s %s %s"
|
#define RPL_MYINFO_MSG "004 %s %s ngircd-%s %s %s"
|
||||||
#define RPL_ISUPPORT1_MSG "005 %s RFC2812 CASEMAPPING=ascii PREFIX=(ov)@+ CHANTYPES=#&+ CHANMODES=bI,k,l,imnPst CHANLIMIT=#&+:%d :are supported on this server"
|
#define RPL_ISUPPORT1_MSG "005 %s RFC2812 IRCD=ngIRCd CASEMAPPING=ascii PREFIX=(ov)@+ CHANTYPES=#&+ CHANMODES=bI,k,l,imnPst CHANLIMIT=#&+:%d :are supported on this server"
|
||||||
#define RPL_ISUPPORT2_MSG "005 %s CHANNELLEN=%d NICKLEN=%d TOPICLEN=%d AWAYLEN=%d KICKLEN=%d PENALTY :are supported on this server"
|
#define RPL_ISUPPORT2_MSG "005 %s CHANNELLEN=%d NICKLEN=%d TOPICLEN=%d AWAYLEN=%d KICKLEN=%d PENALTY :are supported on this server"
|
||||||
|
|
||||||
#define RPL_TRACELINK_MSG "200 %s Link %s-%s %s %s V%s %ld %d %d"
|
#define RPL_TRACELINK_MSG "200 %s Link %s-%s %s %s V%s %ld %d %d"
|
||||||
@@ -46,6 +46,8 @@
|
|||||||
#define RPL_TRACEEND_MSG "262 %s %s %s-%s.%s :End of TRACE"
|
#define RPL_TRACEEND_MSG "262 %s %s %s-%s.%s :End of TRACE"
|
||||||
#define RPL_LOCALUSERS_MSG "265 %s %lu %lu :Current local users: %lu, Max: %lu"
|
#define RPL_LOCALUSERS_MSG "265 %s %lu %lu :Current local users: %lu, Max: %lu"
|
||||||
#define RPL_NETUSERS_MSG "266 %s %lu %lu :Current global users: %lu, Max: %lu"
|
#define RPL_NETUSERS_MSG "266 %s %lu %lu :Current global users: %lu, Max: %lu"
|
||||||
|
#define RPL_STATSCONN_MSG "250 %s :Highest connection count: %lu (%lu connections received)"
|
||||||
|
#define RPL_WHOISSSL_MSG "275 %s %s :is connected via SSL (secure link)"
|
||||||
|
|
||||||
#define RPL_AWAY_MSG "301 %s %s :%s"
|
#define RPL_AWAY_MSG "301 %s %s :%s"
|
||||||
#define RPL_USERHOST_MSG "302 %s :"
|
#define RPL_USERHOST_MSG "302 %s :"
|
||||||
@@ -113,6 +115,7 @@
|
|||||||
#define ERR_ALREADYREGISTRED_MSG "462 %s :Connection already registered"
|
#define ERR_ALREADYREGISTRED_MSG "462 %s :Connection already registered"
|
||||||
#define ERR_PASSWDMISMATCH_MSG "464 %s :Invalid password"
|
#define ERR_PASSWDMISMATCH_MSG "464 %s :Invalid password"
|
||||||
#define ERR_CHANNELISFULL_MSG "471 %s %s :Cannot join channel (+l)"
|
#define ERR_CHANNELISFULL_MSG "471 %s %s :Cannot join channel (+l)"
|
||||||
|
#define ERR_SECURECHANNEL_MSG "471 %s %s :Cannot join channel (+z)"
|
||||||
#define ERR_UNKNOWNMODE_MSG "472 %s: %c :is unknown mode char for %s"
|
#define ERR_UNKNOWNMODE_MSG "472 %s: %c :is unknown mode char for %s"
|
||||||
#define ERR_INVITEONLYCHAN_MSG "473 %s %s :Cannot join channel (+i)"
|
#define ERR_INVITEONLYCHAN_MSG "473 %s %s :Cannot join channel (+i)"
|
||||||
#define ERR_BANNEDFROMCHAN_MSG "474 %s %s :Cannot join channel (+b)"
|
#define ERR_BANNEDFROMCHAN_MSG "474 %s %s :Cannot join channel (+b)"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2008 Alexander Barton (alex@barton.de).
|
* Copyright (c)2001-2010 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
|
||||||
@@ -29,7 +29,6 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/wait.h>
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
#include <grp.h>
|
#include <grp.h>
|
||||||
@@ -39,15 +38,15 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "resolve.h"
|
|
||||||
#include "conn.h"
|
#include "conn.h"
|
||||||
#include "conf-ssl.h"
|
#include "conf-ssl.h"
|
||||||
#include "client.h"
|
|
||||||
#include "channel.h"
|
#include "channel.h"
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
#include "lists.h"
|
#include "lists.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "parse.h"
|
#include "parse.h"
|
||||||
|
#include "sighandlers.h"
|
||||||
|
#include "io.h"
|
||||||
#include "irc.h"
|
#include "irc.h"
|
||||||
|
|
||||||
#ifdef ZEROCONF
|
#ifdef ZEROCONF
|
||||||
@@ -58,9 +57,6 @@
|
|||||||
#include "ngircd.h"
|
#include "ngircd.h"
|
||||||
|
|
||||||
|
|
||||||
static void Initialize_Signal_Handler PARAMS(( void ));
|
|
||||||
static void Signal_Handler PARAMS(( int Signal ));
|
|
||||||
|
|
||||||
static void Show_Version PARAMS(( void ));
|
static void Show_Version PARAMS(( void ));
|
||||||
static void Show_Help PARAMS(( void ));
|
static void Show_Help PARAMS(( void ));
|
||||||
|
|
||||||
@@ -69,10 +65,11 @@ static void Pidfile_Delete PARAMS(( void ));
|
|||||||
|
|
||||||
static void Fill_Version PARAMS(( void ));
|
static void Fill_Version PARAMS(( void ));
|
||||||
|
|
||||||
static void Setup_FDStreams PARAMS(( void ));
|
static void Setup_FDStreams PARAMS(( int fd ));
|
||||||
|
|
||||||
static bool NGIRCd_Init PARAMS(( bool ));
|
static bool NGIRCd_Init PARAMS(( bool ));
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The main() function of ngIRCd.
|
* The main() function of ngIRCd.
|
||||||
* Here all starts: this function is called by the operating system loader,
|
* Here all starts: this function is called by the operating system loader,
|
||||||
@@ -97,7 +94,7 @@ main( int argc, const char *argv[] )
|
|||||||
|
|
||||||
umask( 0077 );
|
umask( 0077 );
|
||||||
|
|
||||||
NGIRCd_SignalQuit = NGIRCd_SignalRestart = NGIRCd_SignalRehash = false;
|
NGIRCd_SignalQuit = NGIRCd_SignalRestart = false;
|
||||||
NGIRCd_Passive = false;
|
NGIRCd_Passive = false;
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
NGIRCd_Debug = false;
|
NGIRCd_Debug = false;
|
||||||
@@ -265,7 +262,6 @@ main( int argc, const char *argv[] )
|
|||||||
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_SignalRestart = false;
|
NGIRCd_SignalRestart = false;
|
||||||
NGIRCd_SignalQuit = false;
|
NGIRCd_SignalQuit = false;
|
||||||
|
|
||||||
@@ -294,8 +290,15 @@ main( int argc, const char *argv[] )
|
|||||||
* when not running in "no daemon" mode: */
|
* when not running in "no daemon" mode: */
|
||||||
if( ! NGIRCd_NoDaemon ) Log_InitErrorfile( );
|
if( ! NGIRCd_NoDaemon ) Log_InitErrorfile( );
|
||||||
#endif
|
#endif
|
||||||
|
if (!io_library_init(CONNECTION_POOL)) {
|
||||||
|
Log(LOG_ALERT, "Fatal: Cannot initialize IO routines: %s", strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
Initialize_Signal_Handler( );
|
if (!Signals_Init()) {
|
||||||
|
Log(LOG_ALERT, "Fatal: Could not set up signal handlers: %s", strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* create protocol and server identification.
|
* create protocol and server identification.
|
||||||
@@ -362,7 +365,6 @@ Fill_Version( void )
|
|||||||
#ifdef ZLIB
|
#ifdef ZLIB
|
||||||
if( NGIRCd_VersionAddition[0] )
|
if( NGIRCd_VersionAddition[0] )
|
||||||
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
||||||
|
|
||||||
strlcat( NGIRCd_VersionAddition, "ZLIB", sizeof NGIRCd_VersionAddition );
|
strlcat( NGIRCd_VersionAddition, "ZLIB", sizeof NGIRCd_VersionAddition );
|
||||||
#endif
|
#endif
|
||||||
#ifdef SSL_SUPPORT
|
#ifdef SSL_SUPPORT
|
||||||
@@ -372,49 +374,46 @@ Fill_Version( void )
|
|||||||
#ifdef TCPWRAP
|
#ifdef TCPWRAP
|
||||||
if( NGIRCd_VersionAddition[0] )
|
if( NGIRCd_VersionAddition[0] )
|
||||||
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
||||||
|
|
||||||
strlcat( NGIRCd_VersionAddition, "TCPWRAP", sizeof NGIRCd_VersionAddition );
|
strlcat( NGIRCd_VersionAddition, "TCPWRAP", sizeof NGIRCd_VersionAddition );
|
||||||
#endif
|
#endif
|
||||||
#ifdef ZEROCONF
|
#ifdef ZEROCONF
|
||||||
if( NGIRCd_VersionAddition[0] )
|
if( NGIRCd_VersionAddition[0] )
|
||||||
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
||||||
|
|
||||||
strlcat( NGIRCd_VersionAddition, "ZEROCONF", sizeof NGIRCd_VersionAddition );
|
strlcat( NGIRCd_VersionAddition, "ZEROCONF", sizeof NGIRCd_VersionAddition );
|
||||||
#endif
|
#endif
|
||||||
#ifdef IDENTAUTH
|
#ifdef IDENTAUTH
|
||||||
if( NGIRCd_VersionAddition[0] )
|
if( NGIRCd_VersionAddition[0] )
|
||||||
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
||||||
|
|
||||||
strlcat( NGIRCd_VersionAddition, "IDENT", sizeof NGIRCd_VersionAddition );
|
strlcat( NGIRCd_VersionAddition, "IDENT", sizeof NGIRCd_VersionAddition );
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef PAM
|
||||||
|
if (NGIRCd_VersionAddition[0])
|
||||||
|
strlcat(NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition);
|
||||||
|
strlcat(NGIRCd_VersionAddition, "PAM", sizeof NGIRCd_VersionAddition);
|
||||||
|
#endif
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if( NGIRCd_VersionAddition[0] )
|
if( NGIRCd_VersionAddition[0] )
|
||||||
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
||||||
|
|
||||||
strlcat( NGIRCd_VersionAddition, "DEBUG", sizeof NGIRCd_VersionAddition );
|
strlcat( NGIRCd_VersionAddition, "DEBUG", sizeof NGIRCd_VersionAddition );
|
||||||
#endif
|
#endif
|
||||||
#ifdef SNIFFER
|
#ifdef SNIFFER
|
||||||
if( NGIRCd_VersionAddition[0] )
|
if( NGIRCd_VersionAddition[0] )
|
||||||
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
||||||
|
|
||||||
strlcat( NGIRCd_VersionAddition, "SNIFFER", sizeof NGIRCd_VersionAddition );
|
strlcat( NGIRCd_VersionAddition, "SNIFFER", sizeof NGIRCd_VersionAddition );
|
||||||
#endif
|
#endif
|
||||||
#ifdef STRICT_RFC
|
#ifdef STRICT_RFC
|
||||||
if( NGIRCd_VersionAddition[0] )
|
if( NGIRCd_VersionAddition[0] )
|
||||||
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
||||||
|
|
||||||
strlcat( NGIRCd_VersionAddition, "RFC", sizeof NGIRCd_VersionAddition );
|
strlcat( NGIRCd_VersionAddition, "RFC", sizeof NGIRCd_VersionAddition );
|
||||||
#endif
|
#endif
|
||||||
#ifdef IRCPLUS
|
#ifdef IRCPLUS
|
||||||
if( NGIRCd_VersionAddition[0] )
|
if( NGIRCd_VersionAddition[0] )
|
||||||
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
||||||
|
|
||||||
strlcat( NGIRCd_VersionAddition, "IRCPLUS", sizeof NGIRCd_VersionAddition );
|
strlcat( NGIRCd_VersionAddition, "IRCPLUS", sizeof NGIRCd_VersionAddition );
|
||||||
#endif
|
#endif
|
||||||
#ifdef WANT_IPV6
|
#ifdef WANT_IPV6
|
||||||
if (NGIRCd_VersionAddition[0])
|
if (NGIRCd_VersionAddition[0])
|
||||||
strlcat(NGIRCd_VersionAddition, "+", sizeof(NGIRCd_VersionAddition));
|
strlcat(NGIRCd_VersionAddition, "+", sizeof(NGIRCd_VersionAddition));
|
||||||
|
|
||||||
strlcat(NGIRCd_VersionAddition, "IPv6", sizeof(NGIRCd_VersionAddition));
|
strlcat(NGIRCd_VersionAddition, "IPv6", sizeof(NGIRCd_VersionAddition));
|
||||||
#endif
|
#endif
|
||||||
if( NGIRCd_VersionAddition[0] )
|
if( NGIRCd_VersionAddition[0] )
|
||||||
@@ -431,130 +430,6 @@ Fill_Version( void )
|
|||||||
} /* Fill_Version */
|
} /* Fill_Version */
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reload the server configuration file.
|
|
||||||
*/
|
|
||||||
GLOBAL void
|
|
||||||
NGIRCd_Rehash( void )
|
|
||||||
{
|
|
||||||
char old_name[CLIENT_ID_LEN];
|
|
||||||
unsigned old_nicklen;
|
|
||||||
|
|
||||||
Log( LOG_NOTICE|LOG_snotice, "Re-reading configuration NOW!" );
|
|
||||||
NGIRCd_SignalRehash = false;
|
|
||||||
|
|
||||||
/* Remember old server name and nick name length */
|
|
||||||
strlcpy( old_name, Conf_ServerName, sizeof old_name );
|
|
||||||
old_nicklen = Conf_MaxNickLength;
|
|
||||||
|
|
||||||
/* Re-read configuration ... */
|
|
||||||
if (!Conf_Rehash( ))
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Close down all listening sockets */
|
|
||||||
Conn_ExitListeners( );
|
|
||||||
|
|
||||||
/* Recover old server name and nick name length: these values can't
|
|
||||||
* be changed during run-time */
|
|
||||||
if (strcmp(old_name, Conf_ServerName) != 0 ) {
|
|
||||||
strlcpy(Conf_ServerName, old_name, sizeof Conf_ServerName);
|
|
||||||
Log(LOG_ERR, "Can't change \"ServerName\" on runtime! Ignored new name.");
|
|
||||||
}
|
|
||||||
if (old_nicklen != Conf_MaxNickLength) {
|
|
||||||
Conf_MaxNickLength = old_nicklen;
|
|
||||||
Log(LOG_ERR, "Can't change \"MaxNickLength\" on runtime! Ignored new value.");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Create new pre-defined channels */
|
|
||||||
Channel_InitPredefined( );
|
|
||||||
|
|
||||||
if (!ConnSSL_InitLibrary())
|
|
||||||
Log(LOG_WARNING, "Re-Initializing SSL failed, using old keys");
|
|
||||||
|
|
||||||
/* Start listening on sockets */
|
|
||||||
Conn_InitListeners( );
|
|
||||||
|
|
||||||
/* Sync configuration with established connections */
|
|
||||||
Conn_SyncServerStruct( );
|
|
||||||
|
|
||||||
Log( LOG_NOTICE|LOG_snotice, "Re-reading of configuration done." );
|
|
||||||
} /* NGIRCd_Rehash */
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize the signal handler.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
Initialize_Signal_Handler( void )
|
|
||||||
{
|
|
||||||
#ifdef HAVE_SIGACTION
|
|
||||||
struct sigaction saction;
|
|
||||||
|
|
||||||
memset( &saction, 0, sizeof( saction ));
|
|
||||||
saction.sa_handler = Signal_Handler;
|
|
||||||
#ifdef SA_RESTART
|
|
||||||
saction.sa_flags |= SA_RESTART;
|
|
||||||
#endif
|
|
||||||
#ifdef SA_NOCLDWAIT
|
|
||||||
saction.sa_flags |= SA_NOCLDWAIT;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
sigaction(SIGINT, &saction, NULL);
|
|
||||||
sigaction(SIGQUIT, &saction, NULL);
|
|
||||||
sigaction(SIGTERM, &saction, NULL);
|
|
||||||
sigaction(SIGHUP, &saction, NULL);
|
|
||||||
sigaction(SIGCHLD, &saction, NULL);
|
|
||||||
|
|
||||||
/* we handle write errors properly; ignore SIGPIPE */
|
|
||||||
saction.sa_handler = SIG_IGN;
|
|
||||||
sigaction(SIGPIPE, &saction, NULL);
|
|
||||||
#else
|
|
||||||
signal(SIGINT, Signal_Handler);
|
|
||||||
signal(SIGQUIT, Signal_Handler);
|
|
||||||
signal(SIGTERM, Signal_Handler);
|
|
||||||
signal(SIGHUP, Signal_Handler);
|
|
||||||
signal(SIGCHLD, Signal_Handler);
|
|
||||||
|
|
||||||
signal(SIGPIPE, SIG_IGN);
|
|
||||||
#endif
|
|
||||||
} /* Initialize_Signal_Handler */
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Signal handler of ngIRCd.
|
|
||||||
* This function is called whenever ngIRCd catches a signal sent by the
|
|
||||||
* user and/or the system to it. For example SIGTERM and SIGHUP.
|
|
||||||
* @param Signal Number of the signal to handle.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
Signal_Handler( int Signal )
|
|
||||||
{
|
|
||||||
switch( Signal )
|
|
||||||
{
|
|
||||||
case SIGTERM:
|
|
||||||
case SIGINT:
|
|
||||||
case SIGQUIT:
|
|
||||||
/* shut down sever */
|
|
||||||
NGIRCd_SignalQuit = true;
|
|
||||||
break;
|
|
||||||
case SIGHUP:
|
|
||||||
/* re-read configuration */
|
|
||||||
NGIRCd_SignalRehash = true;
|
|
||||||
break;
|
|
||||||
case SIGCHLD:
|
|
||||||
/* child-process exited, avoid zombies */
|
|
||||||
while (waitpid( -1, NULL, WNOHANG) > 0)
|
|
||||||
;
|
|
||||||
break;
|
|
||||||
#ifdef DEBUG
|
|
||||||
default:
|
|
||||||
/* unbekanntes bzw. unbehandeltes Signal */
|
|
||||||
Log( LOG_DEBUG, "Got signal %d! Ignored.", Signal );
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
} /* Signal_Handler */
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Display copyright and version information of ngIRCd on the console.
|
* Display copyright and version information of ngIRCd on the console.
|
||||||
*/
|
*/
|
||||||
@@ -562,7 +437,7 @@ static void
|
|||||||
Show_Version( void )
|
Show_Version( void )
|
||||||
{
|
{
|
||||||
puts( NGIRCd_Version );
|
puts( NGIRCd_Version );
|
||||||
puts( "Copyright (c)2001-2008 Alexander Barton (<alex@barton.de>) and Contributors." );
|
puts( "Copyright (c)2001-2010 Alexander Barton (<alex@barton.de>) and Contributors." );
|
||||||
puts( "Homepage: <http://ngircd.barton.de/>\n" );
|
puts( "Homepage: <http://ngircd.barton.de/>\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" );
|
||||||
puts( "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." );
|
puts( "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." );
|
||||||
@@ -652,27 +527,16 @@ Pidfile_Create(pid_t pid)
|
|||||||
* Redirect stdin, stdout and stderr to apropriate file handles.
|
* Redirect stdin, stdout and stderr to apropriate file handles.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
Setup_FDStreams( void )
|
Setup_FDStreams(int fd)
|
||||||
{
|
{
|
||||||
int fd;
|
if (fd < 0)
|
||||||
|
|
||||||
/* 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;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
fflush(stderr);
|
fflush(stderr);
|
||||||
|
|
||||||
/* Create new stdin(0), stdout(1) and stderr(2) descriptors */
|
/* Create new stdin(0), stdout(1) and stderr(2) descriptors */
|
||||||
dup2( fd, 0 ); dup2( fd, 1 ); dup2( fd, 2 );
|
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 */
|
} /* Setup_FDStreams */
|
||||||
|
|
||||||
|
|
||||||
@@ -715,12 +579,19 @@ NGIRCd_Init( bool NGIRCd_NoDaemon )
|
|||||||
bool chrooted = false;
|
bool chrooted = false;
|
||||||
struct passwd *pwd;
|
struct passwd *pwd;
|
||||||
struct group *grp;
|
struct group *grp;
|
||||||
int real_errno;
|
int real_errno, fd = -1;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
|
|
||||||
if (initialized)
|
if (initialized)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
if (!NGIRCd_NoDaemon) {
|
||||||
|
/* open /dev/null before chroot() */
|
||||||
|
fd = open( "/dev/null", O_RDWR);
|
||||||
|
if (fd < 0)
|
||||||
|
Log(LOG_WARNING, "Could not open /dev/null: %s", strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
if (!ConnSSL_InitLibrary())
|
if (!ConnSSL_InitLibrary())
|
||||||
Log(LOG_WARNING,
|
Log(LOG_WARNING,
|
||||||
"Warning: Error during SSL initialization, continuing ...");
|
"Warning: Error during SSL initialization, continuing ...");
|
||||||
@@ -728,15 +599,14 @@ NGIRCd_Init( bool NGIRCd_NoDaemon )
|
|||||||
if( Conf_Chroot[0] ) {
|
if( Conf_Chroot[0] ) {
|
||||||
if( chdir( Conf_Chroot ) != 0 ) {
|
if( chdir( Conf_Chroot ) != 0 ) {
|
||||||
Log( LOG_ERR, "Can't chdir() in ChrootDir (%s): %s", Conf_Chroot, strerror( errno ));
|
Log( LOG_ERR, "Can't chdir() in ChrootDir (%s): %s", Conf_Chroot, strerror( errno ));
|
||||||
return false;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( chroot( Conf_Chroot ) != 0 ) {
|
if( chroot( Conf_Chroot ) != 0 ) {
|
||||||
if (errno != EPERM) {
|
if (errno != EPERM) {
|
||||||
Log( LOG_ERR, "Can't change root directory to \"%s\": %s",
|
Log( LOG_ERR, "Can't change root directory to \"%s\": %s",
|
||||||
Conf_Chroot, strerror( errno ));
|
Conf_Chroot, strerror( errno ));
|
||||||
|
goto out;
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
chrooted = true;
|
chrooted = true;
|
||||||
@@ -750,7 +620,7 @@ NGIRCd_Init( bool NGIRCd_NoDaemon )
|
|||||||
if (! NGIRCd_getNobodyID(&Conf_UID, &Conf_GID)) {
|
if (! NGIRCd_getNobodyID(&Conf_UID, &Conf_GID)) {
|
||||||
Log(LOG_WARNING, "Could not get user/group ID of user \"nobody\": %s",
|
Log(LOG_WARNING, "Could not get user/group ID of user \"nobody\": %s",
|
||||||
errno ? strerror(errno) : "not found" );
|
errno ? strerror(errno) : "not found" );
|
||||||
return false;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -760,7 +630,7 @@ NGIRCd_Init( bool NGIRCd_NoDaemon )
|
|||||||
real_errno = errno;
|
real_errno = errno;
|
||||||
Log( LOG_ERR, "Can't change group ID to %u: %s", Conf_GID, strerror( errno ));
|
Log( LOG_ERR, "Can't change group ID to %u: %s", Conf_GID, strerror( errno ));
|
||||||
if (real_errno != EPERM)
|
if (real_errno != EPERM)
|
||||||
return false;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -770,7 +640,7 @@ NGIRCd_Init( bool NGIRCd_NoDaemon )
|
|||||||
real_errno = errno;
|
real_errno = errno;
|
||||||
Log(LOG_ERR, "Can't change user ID to %u: %s", Conf_UID, strerror(errno));
|
Log(LOG_ERR, "Can't change user ID to %u: %s", Conf_UID, strerror(errno));
|
||||||
if (real_errno != EPERM)
|
if (real_errno != EPERM)
|
||||||
return false;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -798,10 +668,16 @@ NGIRCd_Init( bool NGIRCd_NoDaemon )
|
|||||||
#else
|
#else
|
||||||
setpgrp(0, getpid());
|
setpgrp(0, getpid());
|
||||||
#endif
|
#endif
|
||||||
chdir( "/" );
|
if (chdir( "/" ) != 0)
|
||||||
|
Log(LOG_ERR, "Can't change directory to '/': %s",
|
||||||
|
strerror(errno));
|
||||||
|
|
||||||
/* Detach stdin, stdout and stderr */
|
/* Detach stdin, stdout and stderr */
|
||||||
Setup_FDStreams( );
|
Setup_FDStreams(fd);
|
||||||
|
if (fd > 2) {
|
||||||
|
close(fd);
|
||||||
|
fd = -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
pid = getpid();
|
pid = getpid();
|
||||||
|
|
||||||
@@ -828,8 +704,8 @@ NGIRCd_Init( bool NGIRCd_NoDaemon )
|
|||||||
|
|
||||||
/* Change working directory to home directory of the user
|
/* Change working directory to home directory of the user
|
||||||
* we are running as (only when running in daemon mode and not in chroot) */
|
* we are running as (only when running in daemon mode and not in chroot) */
|
||||||
|
|
||||||
if ( pwd ) {
|
if (pwd) {
|
||||||
if (!NGIRCd_NoDaemon ) {
|
if (!NGIRCd_NoDaemon ) {
|
||||||
if( chdir( pwd->pw_dir ) == 0 )
|
if( chdir( pwd->pw_dir ) == 0 )
|
||||||
Log( LOG_DEBUG, "Changed working directory to \"%s\" ...", pwd->pw_dir );
|
Log( LOG_DEBUG, "Changed working directory to \"%s\" ...", pwd->pw_dir );
|
||||||
@@ -841,7 +717,12 @@ NGIRCd_Init( bool NGIRCd_NoDaemon )
|
|||||||
Log( LOG_ERR, "Can't get user informaton for UID %d!?", Conf_UID );
|
Log( LOG_ERR, "Can't get user informaton for UID %d!?", Conf_UID );
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
out:
|
||||||
|
if (fd > 2)
|
||||||
|
close(fd);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* -eof- */
|
/* -eof- */
|
||||||
|
|||||||
@@ -21,6 +21,8 @@
|
|||||||
|
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
|
|
||||||
|
#define C_ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
|
||||||
|
|
||||||
|
|
||||||
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];
|
||||||
@@ -39,7 +41,6 @@ GLOBAL bool NGIRCd_Passive; /* nicht zu anderen Servern connecten */
|
|||||||
|
|
||||||
GLOBAL bool NGIRCd_SignalQuit; /* true: quit server*/
|
GLOBAL bool NGIRCd_SignalQuit; /* true: quit server*/
|
||||||
GLOBAL bool NGIRCd_SignalRestart; /* true: restart server */
|
GLOBAL bool NGIRCd_SignalRestart; /* true: restart server */
|
||||||
GLOBAL bool NGIRCd_SignalRehash; /* true: reload configuration */
|
|
||||||
|
|
||||||
GLOBAL char NGIRCd_DebugLevel[2]; /* Debug-Level fuer IRC_VERSION() */
|
GLOBAL char NGIRCd_DebugLevel[2]; /* Debug-Level fuer IRC_VERSION() */
|
||||||
|
|
||||||
@@ -48,9 +49,6 @@ 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 void NGIRCd_Rehash PARAMS(( void ));
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -20,12 +20,10 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "resolve.h"
|
|
||||||
#include "conn.h"
|
#include "conn.h"
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
#include "conn.h"
|
#include "conn.h"
|
||||||
#include "conn-func.h"
|
#include "conn-func.h"
|
||||||
#include "client.h"
|
|
||||||
#include "channel.h"
|
#include "channel.h"
|
||||||
#include "irc-write.h"
|
#include "irc-write.h"
|
||||||
#include "lists.h"
|
#include "lists.h"
|
||||||
|
|||||||
81
src/ngircd/op.c
Normal file
81
src/ngircd/op.c
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
/*
|
||||||
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
|
* Copyright (c)2001-2008 Alexander Barton (alex@barton.de)
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
* Please read the file COPYING, README and AUTHORS for more information.
|
||||||
|
*
|
||||||
|
* IRC operator functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "portab.h"
|
||||||
|
|
||||||
|
#include "imp.h"
|
||||||
|
#include <assert.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "conn.h"
|
||||||
|
#include "channel.h"
|
||||||
|
#include "conf.h"
|
||||||
|
#include "log.h"
|
||||||
|
#include "parse.h"
|
||||||
|
#include "messages.h"
|
||||||
|
#include "irc-write.h"
|
||||||
|
|
||||||
|
#include <exp.h>
|
||||||
|
#include "op.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return and log a "no privileges" message.
|
||||||
|
*/
|
||||||
|
GLOBAL bool
|
||||||
|
Op_NoPrivileges(CLIENT * Client, REQUEST * Req)
|
||||||
|
{
|
||||||
|
CLIENT *from = NULL;
|
||||||
|
|
||||||
|
if (Req->prefix)
|
||||||
|
from = Client_Search(Req->prefix);
|
||||||
|
|
||||||
|
if (from) {
|
||||||
|
Log(LOG_NOTICE, "No privileges: client \"%s\" (%s), command \"%s\"",
|
||||||
|
Req->prefix, Client_Mask(Client), Req->command);
|
||||||
|
return IRC_WriteStrClient(from, ERR_NOPRIVILEGES_MSG,
|
||||||
|
Client_ID(from));
|
||||||
|
} else {
|
||||||
|
Log(LOG_NOTICE, "No privileges: client \"%s\", command \"%s\"",
|
||||||
|
Client_Mask(Client), Req->command);
|
||||||
|
return IRC_WriteStrClient(Client, ERR_NOPRIVILEGES_MSG,
|
||||||
|
Client_ID(Client));
|
||||||
|
}
|
||||||
|
} /* Op_NoPrivileges */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check that the client is an IRC operator allowed to administer this server.
|
||||||
|
*/
|
||||||
|
GLOBAL bool
|
||||||
|
Op_Check(CLIENT * Client, REQUEST * Req)
|
||||||
|
{
|
||||||
|
CLIENT *c;
|
||||||
|
|
||||||
|
assert(Client != NULL);
|
||||||
|
assert(Req != NULL);
|
||||||
|
|
||||||
|
if (Client_Type(Client) == CLIENT_SERVER && Req->prefix)
|
||||||
|
c = Client_Search(Req->prefix);
|
||||||
|
else
|
||||||
|
c = Client;
|
||||||
|
if (!c)
|
||||||
|
return false;
|
||||||
|
if (!Client_HasMode(c, 'o'))
|
||||||
|
return false;
|
||||||
|
if (!Client_OperByMe(c) && !Conf_AllowRemoteOper)
|
||||||
|
return false;
|
||||||
|
/* The client is an local IRC operator, or this server is configured
|
||||||
|
* to trust remote operators. */
|
||||||
|
return true;
|
||||||
|
} /* Op_Check */
|
||||||
22
src/ngircd/op.h
Normal file
22
src/ngircd/op.h
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
|
* Copyright (c)2001-2009 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.
|
||||||
|
*
|
||||||
|
* Operator management (header)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __oper_h__
|
||||||
|
#define __oper_h__
|
||||||
|
|
||||||
|
GLOBAL bool Op_NoPrivileges PARAMS((CLIENT * Client, REQUEST * Req));
|
||||||
|
GLOBAL bool Op_Check PARAMS((CLIENT * Client, REQUEST * Req));
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* -eof- */
|
||||||
139
src/ngircd/pam.c
Normal file
139
src/ngircd/pam.c
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
/*
|
||||||
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
|
* Copyright (c)2001-2010 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.
|
||||||
|
*
|
||||||
|
* PAM User Authentification
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "portab.h"
|
||||||
|
|
||||||
|
#ifdef PAM
|
||||||
|
|
||||||
|
#include "imp.h"
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include "defines.h"
|
||||||
|
#include "log.h"
|
||||||
|
#include "conn.h"
|
||||||
|
#include "client.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_SECURITY_PAM_APPL_H
|
||||||
|
#include <security/pam_appl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_PAM_PAM_APPL_H
|
||||||
|
#include <pam/pam_appl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "exp.h"
|
||||||
|
#include "pam.h"
|
||||||
|
|
||||||
|
static char *password;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PAM "conversation function".
|
||||||
|
* This is a callback function used by the PAM library to get the password.
|
||||||
|
* Please see the PAM documentation for details :-)
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
password_conversation(int num_msg, const struct pam_message **msg,
|
||||||
|
struct pam_response **resp, void *appdata_ptr) {
|
||||||
|
LogDebug("PAM: conv(%d, %d, '%s', '%s')",
|
||||||
|
num_msg, msg[0]->msg_style, msg[0]->msg, appdata_ptr);
|
||||||
|
|
||||||
|
/* Can we deal with this request? */
|
||||||
|
if (num_msg != 1 || msg[0]->msg_style != PAM_PROMPT_ECHO_OFF) {
|
||||||
|
Log(LOG_ERR, "PAM: Unexpected PAM conversation '%d:%s'!",
|
||||||
|
msg[0]->msg_style, msg[0]->msg);
|
||||||
|
return PAM_CONV_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!appdata_ptr) {
|
||||||
|
/* Sometimes appdata_ptr gets lost!? */
|
||||||
|
appdata_ptr = password;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Duplicate password ("application data") for the PAM library */
|
||||||
|
*resp = calloc(num_msg, sizeof(struct pam_response));
|
||||||
|
if (!*resp) {
|
||||||
|
Log(LOG_ERR, "PAM: Out of memory!");
|
||||||
|
return PAM_CONV_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
(*resp)[0].resp = strdup((char *)appdata_ptr);
|
||||||
|
(*resp)[0].resp_retcode = 0;
|
||||||
|
|
||||||
|
return ((*resp)[0].resp ? PAM_SUCCESS : PAM_CONV_ERR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PAM "conversation" structure.
|
||||||
|
*/
|
||||||
|
static struct pam_conv conv = {
|
||||||
|
&password_conversation,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Authenticate a connectiong client using PAM.
|
||||||
|
* @param Client The client to authenticate.
|
||||||
|
* @return true when authentication succeeded, false otherwise.
|
||||||
|
*/
|
||||||
|
GLOBAL bool
|
||||||
|
PAM_Authenticate(CLIENT *Client) {
|
||||||
|
pam_handle_t *pam;
|
||||||
|
int retval = PAM_SUCCESS;
|
||||||
|
|
||||||
|
LogDebug("PAM: Authenticate \"%s\" (%s) ...",
|
||||||
|
Client_OrigUser(Client), Client_Mask(Client));
|
||||||
|
|
||||||
|
/* Set supplied client password */
|
||||||
|
if (password)
|
||||||
|
free(password);
|
||||||
|
password = strdup(Client_Password(Client));
|
||||||
|
conv.appdata_ptr = password;
|
||||||
|
|
||||||
|
/* Initialize PAM */
|
||||||
|
retval = pam_start("ngircd", Client_OrigUser(Client), &conv, &pam);
|
||||||
|
if (retval != PAM_SUCCESS) {
|
||||||
|
Log(LOG_ERR, "PAM: Failed to create authenticator! (%d)", retval);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
pam_set_item(pam, PAM_RUSER, Client_User(Client));
|
||||||
|
pam_set_item(pam, PAM_RHOST, Client_Hostname(Client));
|
||||||
|
#ifdef HAVE_PAM_FAIL_DELAY
|
||||||
|
pam_fail_delay(pam, 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* PAM authentication ... */
|
||||||
|
retval = pam_authenticate(pam, 0);
|
||||||
|
|
||||||
|
/* Success? */
|
||||||
|
if (retval == PAM_SUCCESS)
|
||||||
|
Log(LOG_INFO, "PAM: Authenticated \"%s\" (%s).",
|
||||||
|
Client_OrigUser(Client), Client_Mask(Client));
|
||||||
|
else
|
||||||
|
Log(LOG_ERR, "PAM: Error on \"%s\" (%s): %s",
|
||||||
|
Client_OrigUser(Client), Client_Mask(Client),
|
||||||
|
pam_strerror(pam, retval));
|
||||||
|
|
||||||
|
/* Free PAM structures */
|
||||||
|
if (pam_end(pam, retval) != PAM_SUCCESS)
|
||||||
|
Log(LOG_ERR, "PAM: Failed to release authenticator!");
|
||||||
|
|
||||||
|
return (retval == PAM_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* PAM */
|
||||||
|
|
||||||
|
/* -eof- */
|
||||||
25
src/ngircd/pam.h
Normal file
25
src/ngircd/pam.h
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
|
* Copyright (c)2001-2010 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.
|
||||||
|
*
|
||||||
|
* PAM User Authentification (header)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef PAM
|
||||||
|
|
||||||
|
#ifndef __pam_h__
|
||||||
|
#define __pam_h__
|
||||||
|
|
||||||
|
GLOBAL bool PAM_Authenticate PARAMS((CLIENT *Client));
|
||||||
|
|
||||||
|
#endif /* __pam_h__ */
|
||||||
|
|
||||||
|
#endif /* PAM */
|
||||||
|
|
||||||
|
/* -eof- */
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2008 Alexander Barton (alex@barton.de)
|
* Copyright (c)2001-2010 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
|
||||||
@@ -26,7 +26,6 @@
|
|||||||
#include "ngircd.h"
|
#include "ngircd.h"
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "conn-func.h"
|
#include "conn-func.h"
|
||||||
#include "client.h"
|
|
||||||
#include "channel.h"
|
#include "channel.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "messages.h"
|
#include "messages.h"
|
||||||
@@ -59,7 +58,7 @@ static COMMAND My_Commands[] =
|
|||||||
{
|
{
|
||||||
{ "ADMIN", IRC_ADMIN, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "ADMIN", IRC_ADMIN, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
{ "AWAY", IRC_AWAY, CLIENT_USER, 0, 0, 0 },
|
{ "AWAY", IRC_AWAY, CLIENT_USER, 0, 0, 0 },
|
||||||
{ "CONNECT", IRC_CONNECT, CLIENT_USER, 0, 0, 0 },
|
{ "CONNECT", IRC_CONNECT, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
{ "DIE", IRC_DIE, CLIENT_USER, 0, 0, 0 },
|
{ "DIE", IRC_DIE, CLIENT_USER, 0, 0, 0 },
|
||||||
{ "DISCONNECT", IRC_DISCONNECT, CLIENT_USER, 0, 0, 0 },
|
{ "DISCONNECT", IRC_DISCONNECT, CLIENT_USER, 0, 0, 0 },
|
||||||
{ "ERROR", IRC_ERROR, 0xFFFF, 0, 0, 0 },
|
{ "ERROR", IRC_ERROR, 0xFFFF, 0, 0, 0 },
|
||||||
@@ -92,7 +91,7 @@ static COMMAND My_Commands[] =
|
|||||||
{ "SERVICE", IRC_SERVICE, 0xFFFF, 0, 0, 0 },
|
{ "SERVICE", IRC_SERVICE, 0xFFFF, 0, 0, 0 },
|
||||||
{ "SERVLIST", IRC_SERVLIST, CLIENT_USER, 0, 0, 0 },
|
{ "SERVLIST", IRC_SERVLIST, CLIENT_USER, 0, 0, 0 },
|
||||||
{ "SQUERY", IRC_SQUERY, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "SQUERY", IRC_SQUERY, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
{ "SQUIT", IRC_SQUIT, CLIENT_SERVER, 0, 0, 0 },
|
{ "SQUIT", IRC_SQUIT, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
{ "STATS", IRC_STATS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "STATS", IRC_STATS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
{ "SUMMON", IRC_SUMMON, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "SUMMON", IRC_SUMMON, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
{ "TIME", IRC_TIME, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "TIME", IRC_TIME, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
@@ -103,6 +102,7 @@ static COMMAND My_Commands[] =
|
|||||||
{ "USERS", IRC_USERS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "USERS", IRC_USERS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
{ "VERSION", IRC_VERSION, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "VERSION", IRC_VERSION, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
{ "WALLOPS", IRC_WALLOPS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "WALLOPS", IRC_WALLOPS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
|
{ "WEBIRC", IRC_WEBIRC, CLIENT_UNKNOWN, 0, 0, 0 },
|
||||||
{ "WHO", IRC_WHO, CLIENT_USER, 0, 0, 0 },
|
{ "WHO", IRC_WHO, CLIENT_USER, 0, 0, 0 },
|
||||||
{ "WHOIS", IRC_WHOIS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "WHOIS", IRC_WHOIS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
{ "WHOWAS", IRC_WHOWAS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "WHOWAS", IRC_WHOWAS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
@@ -120,8 +120,6 @@ static bool Validate_Args PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed ));
|
|||||||
|
|
||||||
static bool Handle_Request PARAMS(( CONN_ID Idx, REQUEST *Req ));
|
static bool Handle_Request PARAMS(( CONN_ID Idx, REQUEST *Req ));
|
||||||
|
|
||||||
#define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the pointer to the global "IRC command structure".
|
* Return the pointer to the global "IRC command structure".
|
||||||
* This structure, an array of type "COMMAND" describes all the IRC commands
|
* This structure, an array of type "COMMAND" describes all the IRC commands
|
||||||
@@ -397,7 +395,7 @@ Handle_Numeric(CLIENT *client, REQUEST *Req)
|
|||||||
/* This server is the target of the numeric */
|
/* This server is the target of the numeric */
|
||||||
num = atoi(Req->command);
|
num = atoi(Req->command);
|
||||||
|
|
||||||
for (i = 0; i < (int) ARRAY_SIZE(Numerics); i++) {
|
for (i = 0; i < (int) C_ARRAY_SIZE(Numerics); i++) {
|
||||||
if (num == Numerics[i].numeric) {
|
if (num == Numerics[i].numeric) {
|
||||||
if (!Numerics[i].function)
|
if (!Numerics[i].function)
|
||||||
return CONNECTED;
|
return CONNECTED;
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ typedef struct _REQUEST /* vgl. RFC 2812, 2.3 */
|
|||||||
|
|
||||||
typedef struct _COMMAND
|
typedef struct _COMMAND
|
||||||
{
|
{
|
||||||
char *name; /* command name */
|
const char *name; /* command name */
|
||||||
bool (*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 */
|
||||||
|
|||||||
145
src/ngircd/proc.c
Normal file
145
src/ngircd/proc.c
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
/*
|
||||||
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
|
* Copyright (c)2001-2010 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.
|
||||||
|
*
|
||||||
|
* Process management
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "portab.h"
|
||||||
|
|
||||||
|
#include "imp.h"
|
||||||
|
#include <assert.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "log.h"
|
||||||
|
#include "io.h"
|
||||||
|
#include "conn.h"
|
||||||
|
|
||||||
|
#include "exp.h"
|
||||||
|
#include "sighandlers.h"
|
||||||
|
#include "proc.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize process structure.
|
||||||
|
*/
|
||||||
|
GLOBAL void
|
||||||
|
Proc_InitStruct (PROC_STAT *proc)
|
||||||
|
{
|
||||||
|
assert(proc != NULL);
|
||||||
|
proc->pid = 0;
|
||||||
|
proc->pipe_fd = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fork a child process.
|
||||||
|
*/
|
||||||
|
GLOBAL pid_t
|
||||||
|
Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short), int timeout)
|
||||||
|
{
|
||||||
|
pid_t pid;
|
||||||
|
|
||||||
|
assert(proc != NULL);
|
||||||
|
assert(pipefds != NULL);
|
||||||
|
assert(cbfunc != NULL);
|
||||||
|
|
||||||
|
if (pipe(pipefds) != 0) {
|
||||||
|
Log(LOG_ALERT, "Can't create output pipe for child process: %s!",
|
||||||
|
strerror(errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pid = fork();
|
||||||
|
switch (pid) {
|
||||||
|
case -1:
|
||||||
|
/* Error on fork: */
|
||||||
|
Log(LOG_CRIT, "Can't fork child process: %s!", strerror(errno));
|
||||||
|
close(pipefds[0]);
|
||||||
|
close(pipefds[1]);
|
||||||
|
return -1;
|
||||||
|
case 0:
|
||||||
|
/* New child process: */
|
||||||
|
Signals_Exit();
|
||||||
|
signal(SIGTERM, Proc_GenericSignalHandler);
|
||||||
|
signal(SIGALRM, Proc_GenericSignalHandler);
|
||||||
|
close(pipefds[0]);
|
||||||
|
alarm(timeout);
|
||||||
|
Conn_CloseAllSockets();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Old parent process: */
|
||||||
|
close(pipefds[1]);
|
||||||
|
|
||||||
|
if (!io_setnonblock(pipefds[0])
|
||||||
|
|| !io_event_create(pipefds[0], IO_WANTREAD, cbfunc)) {
|
||||||
|
Log(LOG_CRIT, "Can't register callback for child process: %s!",
|
||||||
|
strerror(errno));
|
||||||
|
close(pipefds[0]);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
proc->pid = pid;
|
||||||
|
proc->pipe_fd = pipefds[0];
|
||||||
|
return pid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generic signal handler for forked child processes.
|
||||||
|
*/
|
||||||
|
GLOBAL void
|
||||||
|
Proc_GenericSignalHandler(int Signal)
|
||||||
|
{
|
||||||
|
switch(Signal) {
|
||||||
|
case SIGTERM:
|
||||||
|
#ifdef DEBUG
|
||||||
|
Log_Subprocess(LOG_DEBUG, "Child got TERM signal, exiting.");
|
||||||
|
#endif
|
||||||
|
exit(1);
|
||||||
|
case SIGALRM:
|
||||||
|
#ifdef DEBUG
|
||||||
|
Log_Subprocess(LOG_DEBUG, "Child got ALARM signal, exiting.");
|
||||||
|
#endif
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read bytes from a pipe of a forked child process.
|
||||||
|
* In addition, this function makes sure that the child process is ignored
|
||||||
|
* after all data has been read or a fatal error occurred.
|
||||||
|
*/
|
||||||
|
GLOBAL size_t
|
||||||
|
Proc_Read(PROC_STAT *proc, void *buffer, size_t buflen)
|
||||||
|
{
|
||||||
|
ssize_t bytes_read = 0;
|
||||||
|
|
||||||
|
assert(buffer != NULL);
|
||||||
|
assert(buflen > 0);
|
||||||
|
|
||||||
|
bytes_read = read(proc->pipe_fd, buffer, buflen);
|
||||||
|
if (bytes_read < 0) {
|
||||||
|
if (errno == EAGAIN)
|
||||||
|
return 0;
|
||||||
|
Log(LOG_CRIT, "Can't read from child process %ld: %s",
|
||||||
|
proc->pid, strerror(errno));
|
||||||
|
bytes_read = 0;
|
||||||
|
}
|
||||||
|
#if DEBUG
|
||||||
|
else if (bytes_read == 0)
|
||||||
|
LogDebug("Can't read from child process %ld: EOF", proc->pid);
|
||||||
|
#endif
|
||||||
|
Proc_InitStruct(proc);
|
||||||
|
return (size_t)bytes_read;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -eof- */
|
||||||
37
src/ngircd/proc.h
Normal file
37
src/ngircd/proc.h
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
|
* Copyright (c)2001-2010 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.
|
||||||
|
*
|
||||||
|
* Process management (header)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __proc_h__
|
||||||
|
#define __proc_h__
|
||||||
|
|
||||||
|
/* This struct must not be accessed directly! */
|
||||||
|
typedef struct _Proc_Stat {
|
||||||
|
pid_t pid; /* PID of the child process or 0 if none */
|
||||||
|
int pipe_fd; /* Pipe file descriptor or -1 if none */
|
||||||
|
} PROC_STAT;
|
||||||
|
|
||||||
|
#define Proc_InProgress(x) ((x)->pid != 0)
|
||||||
|
#define Proc_GetPipeFd(x) ((x)->pipe_fd)
|
||||||
|
|
||||||
|
GLOBAL void Proc_InitStruct PARAMS((PROC_STAT *proc));
|
||||||
|
|
||||||
|
GLOBAL pid_t Proc_Fork PARAMS((PROC_STAT *proc, int *pipefds,
|
||||||
|
void (*cbfunc)(int, short), int timeout));
|
||||||
|
|
||||||
|
GLOBAL void Proc_GenericSignalHandler PARAMS((int Signal));
|
||||||
|
|
||||||
|
GLOBAL size_t Proc_Read PARAMS((PROC_STAT *proc, void *buffer, size_t buflen));
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* -eof- */
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2004 by Alexander Barton (alex@barton.de)
|
* Copyright (c)2001-2010 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
|
||||||
@@ -21,8 +21,6 @@
|
|||||||
#ifdef ZEROCONF
|
#ifdef ZEROCONF
|
||||||
|
|
||||||
|
|
||||||
static char UNUSED id[] = "$Id: rendezvous.c,v 1.8 2006/05/10 21:24:01 alex Exp $";
|
|
||||||
|
|
||||||
#include "imp.h"
|
#include "imp.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
@@ -43,6 +41,8 @@ static char UNUSED id[] = "$Id: rendezvous.c,v 1.8 2006/05/10 21:24:01 alex Exp
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
|
#include "conn.h"
|
||||||
|
#include "conf.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
#include "exp.h"
|
#include "exp.h"
|
||||||
@@ -144,12 +144,16 @@ GLOBAL void Rendezvous_Exit( void )
|
|||||||
} /* Rendezvous_Exit */
|
} /* Rendezvous_Exit */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register ZeroConf service
|
||||||
|
*/
|
||||||
GLOBAL bool Rendezvous_Register( char *Name, char *Type, UINT16 Port )
|
GLOBAL bool Rendezvous_Register( char *Name, char *Type, UINT16 Port )
|
||||||
{
|
{
|
||||||
/* Register new service */
|
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
if (Conf_NoZeroConf)
|
||||||
|
return true;
|
||||||
|
|
||||||
/* Search free port structure */
|
/* Search free port structure */
|
||||||
for( i = 0; i < MAX_RENDEZVOUS; i++ ) if( ! My_Rendezvous[i].Desc[0] ) break;
|
for( i = 0; i < MAX_RENDEZVOUS; i++ ) if( ! My_Rendezvous[i].Desc[0] ) break;
|
||||||
if( i >= MAX_RENDEZVOUS )
|
if( i >= MAX_RENDEZVOUS )
|
||||||
|
|||||||
@@ -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-2009 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
|
||||||
@@ -12,6 +12,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#define RESOLVER_TIMEOUT (Conf_PongTimeout*3)/4
|
||||||
|
|
||||||
#include "portab.h"
|
#include "portab.h"
|
||||||
|
|
||||||
#include "imp.h"
|
#include "imp.h"
|
||||||
@@ -23,6 +25,7 @@
|
|||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
#ifdef IDENTAUTH
|
#ifdef IDENTAUTH
|
||||||
#ifdef HAVE_IDENT_H
|
#ifdef HAVE_IDENT_H
|
||||||
@@ -30,9 +33,12 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "array.h"
|
||||||
#include "conn.h"
|
#include "conn.h"
|
||||||
|
#include "conf.h"
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
#include "ng_ipaddr.h"
|
||||||
|
|
||||||
#include "exp.h"
|
#include "exp.h"
|
||||||
#include "resolve.h"
|
#include "resolve.h"
|
||||||
@@ -41,46 +47,18 @@
|
|||||||
|
|
||||||
static void Do_ResolveAddr PARAMS(( const ng_ipaddr_t *Addr, int Sock, int w_fd ));
|
static void Do_ResolveAddr PARAMS(( const ng_ipaddr_t *Addr, int Sock, int w_fd ));
|
||||||
static void Do_ResolveName PARAMS(( const char *Host, int w_fd ));
|
static void Do_ResolveName PARAMS(( const char *Host, int w_fd ));
|
||||||
static bool register_callback PARAMS((RES_STAT *s, void (*cbfunc)(int, short)));
|
|
||||||
|
|
||||||
#ifdef WANT_IPV6
|
#ifdef WANT_IPV6
|
||||||
extern bool Conf_ConnectIPv4;
|
extern bool Conf_ConnectIPv4;
|
||||||
extern bool Conf_ConnectIPv6;
|
extern bool Conf_ConnectIPv6;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static pid_t
|
|
||||||
Resolver_fork(int *pipefds)
|
|
||||||
{
|
|
||||||
pid_t pid;
|
|
||||||
|
|
||||||
if (pipe(pipefds) != 0) {
|
|
||||||
Log( LOG_ALERT, "Resolver: Can't create output pipe: %s!", strerror( errno ));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
pid = fork();
|
|
||||||
switch(pid) {
|
|
||||||
case -1:
|
|
||||||
Log( LOG_CRIT, "Resolver: Can't fork: %s!", strerror( errno ));
|
|
||||||
close(pipefds[0]);
|
|
||||||
close(pipefds[1]);
|
|
||||||
return -1;
|
|
||||||
case 0: /* child */
|
|
||||||
close(pipefds[0]);
|
|
||||||
Log_Init_Resolver( );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/* parent */
|
|
||||||
close(pipefds[1]);
|
|
||||||
return pid;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resolve IP (asynchronous!).
|
* Resolve IP (asynchronous!).
|
||||||
*/
|
*/
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
Resolve_Addr(RES_STAT * s, const ng_ipaddr_t *Addr, int identsock,
|
Resolve_Addr(PROC_STAT * s, const ng_ipaddr_t *Addr, int identsock,
|
||||||
void (*cbfunc) (int, short))
|
void (*cbfunc) (int, short))
|
||||||
{
|
{
|
||||||
int pipefd[2];
|
int pipefd[2];
|
||||||
@@ -88,17 +66,15 @@ Resolve_Addr(RES_STAT * s, const ng_ipaddr_t *Addr, int identsock,
|
|||||||
|
|
||||||
assert(s != NULL);
|
assert(s != NULL);
|
||||||
|
|
||||||
pid = Resolver_fork(pipefd);
|
pid = Proc_Fork(s, pipefd, cbfunc, RESOLVER_TIMEOUT);
|
||||||
if (pid > 0) {
|
if (pid > 0) {
|
||||||
LogDebug("Resolver for %s created (PID %d).", ng_ipaddr_tostr(Addr), pid);
|
LogDebug("Resolver for %s created (PID %d).", ng_ipaddr_tostr(Addr), pid);
|
||||||
|
return true;
|
||||||
s->pid = pid;
|
|
||||||
s->resolver_fd = pipefd[0];
|
|
||||||
return register_callback(s, cbfunc);
|
|
||||||
} else if( pid == 0 ) {
|
} else if( pid == 0 ) {
|
||||||
/* Sub process */
|
/* Sub process */
|
||||||
|
Log_Init_Subprocess("Resolver");
|
||||||
Do_ResolveAddr( Addr, identsock, pipefd[1]);
|
Do_ResolveAddr( Addr, identsock, pipefd[1]);
|
||||||
Log_Exit_Resolver( );
|
Log_Exit_Subprocess("Resolver");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -109,43 +85,33 @@ Resolve_Addr(RES_STAT * s, const ng_ipaddr_t *Addr, int identsock,
|
|||||||
* Resolve hostname (asynchronous!).
|
* Resolve hostname (asynchronous!).
|
||||||
*/
|
*/
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
Resolve_Name( RES_STAT *s, const char *Host, void (*cbfunc)(int, short))
|
Resolve_Name( PROC_STAT *s, const char *Host, void (*cbfunc)(int, short))
|
||||||
{
|
{
|
||||||
int pipefd[2];
|
int pipefd[2];
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
|
|
||||||
assert(s != NULL);
|
assert(s != NULL);
|
||||||
|
|
||||||
pid = Resolver_fork(pipefd);
|
pid = Proc_Fork(s, pipefd, cbfunc, RESOLVER_TIMEOUT);
|
||||||
if (pid > 0) {
|
if (pid > 0) {
|
||||||
/* Main process */
|
/* Main process */
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Log( LOG_DEBUG, "Resolver for \"%s\" created (PID %d).", Host, pid );
|
Log( LOG_DEBUG, "Resolver for \"%s\" created (PID %d).", Host, pid );
|
||||||
#endif
|
#endif
|
||||||
s->pid = pid;
|
return true;
|
||||||
s->resolver_fd = pipefd[0];
|
|
||||||
return register_callback(s, cbfunc);
|
|
||||||
} else if( pid == 0 ) {
|
} else if( pid == 0 ) {
|
||||||
/* Sub process */
|
/* Sub process */
|
||||||
|
Log_Init_Subprocess("Resolver");
|
||||||
Do_ResolveName(Host, pipefd[1]);
|
Do_ResolveName(Host, pipefd[1]);
|
||||||
Log_Exit_Resolver( );
|
Log_Exit_Subprocess("Resolver");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
} /* Resolve_Name */
|
} /* Resolve_Name */
|
||||||
|
|
||||||
|
|
||||||
GLOBAL void
|
#if !defined(HAVE_GETADDRINFO) || !defined(HAVE_GETNAMEINFO)
|
||||||
Resolve_Init(RES_STAT *s)
|
#if !defined(WANT_IPV6) && defined(h_errno)
|
||||||
{
|
|
||||||
assert(s != NULL);
|
|
||||||
s->resolver_fd = -1;
|
|
||||||
s->pid = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef WANT_IPV6
|
|
||||||
#ifdef h_errno
|
|
||||||
static char *
|
static char *
|
||||||
Get_Error( int H_Error )
|
Get_Error( int H_Error )
|
||||||
{
|
{
|
||||||
@@ -162,8 +128,8 @@ Get_Error( int H_Error )
|
|||||||
}
|
}
|
||||||
return "unknown error";
|
return "unknown error";
|
||||||
}
|
}
|
||||||
#endif /* h_errno */
|
#endif
|
||||||
#endif /* WANT_IPV6 */
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Do "IDENT" (aka "AUTH") lookup and append result to resolved_addr array */
|
/* Do "IDENT" (aka "AUTH") lookup and append result to resolved_addr array */
|
||||||
@@ -177,17 +143,20 @@ Do_IdentQuery(int identsock, array *resolved_addr)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Log_Resolver(LOG_DEBUG, "Doing IDENT lookup on socket %d ...", identsock);
|
Log_Subprocess(LOG_DEBUG, "Doing IDENT lookup on socket %d ...",
|
||||||
|
identsock);
|
||||||
#endif
|
#endif
|
||||||
res = ident_id( identsock, 10 );
|
res = ident_id( identsock, 10 );
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Log_Resolver(LOG_DEBUG, "Ok, IDENT lookup on socket %d done: \"%s\"",
|
Log_Subprocess(LOG_DEBUG, "Ok, IDENT lookup on socket %d done: \"%s\"",
|
||||||
identsock, res ? res : "(NULL)" );
|
identsock, res ? res : "(NULL)");
|
||||||
#endif
|
#endif
|
||||||
if (!res) /* no result */
|
if (!res) /* no result */
|
||||||
return;
|
return;
|
||||||
if (!array_cats(resolved_addr, res))
|
if (!array_cats(resolved_addr, res))
|
||||||
Log_Resolver(LOG_WARNING, "Resolver: Cannot copy IDENT result: %s!", strerror(errno));
|
Log_Subprocess(LOG_WARNING,
|
||||||
|
"Resolver: Cannot copy IDENT result: %s!",
|
||||||
|
strerror(errno));
|
||||||
|
|
||||||
free(res);
|
free(res);
|
||||||
#else
|
#else
|
||||||
@@ -203,7 +172,7 @@ Do_IdentQuery(int identsock, array *resolved_addr)
|
|||||||
* the IP address in resbuf and returns false.
|
* the IP address in resbuf and returns false.
|
||||||
* @param IpAddr ip address to resolve
|
* @param IpAddr ip address to resolve
|
||||||
* @param resbuf result buffer to store DNS name/string representation of ip address
|
* @param resbuf result buffer to store DNS name/string representation of ip address
|
||||||
* @reslen size of result buffer (must be >= NGT_INET_ADDRSTRLEN)
|
* @param reslen size of result buffer (must be >= NGT_INET_ADDRSTRLEN)
|
||||||
* @return true if reverse lookup successful, false otherwise
|
* @return true if reverse lookup successful, false otherwise
|
||||||
*/
|
*/
|
||||||
static bool
|
static bool
|
||||||
@@ -218,7 +187,7 @@ ReverseLookup(const ng_ipaddr_t *IpAddr, char *resbuf, size_t reslen)
|
|||||||
*resbuf = 0;
|
*resbuf = 0;
|
||||||
|
|
||||||
res = getnameinfo((struct sockaddr *) IpAddr, ng_ipaddr_salen(IpAddr),
|
res = getnameinfo((struct sockaddr *) IpAddr, ng_ipaddr_salen(IpAddr),
|
||||||
resbuf, reslen, NULL, 0, NI_NAMEREQD);
|
resbuf, (socklen_t)reslen, NULL, 0, NI_NAMEREQD);
|
||||||
if (res == 0)
|
if (res == 0)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
@@ -249,7 +218,7 @@ ReverseLookup(const ng_ipaddr_t *IpAddr, char *resbuf, size_t reslen)
|
|||||||
assert(reslen >= NG_INET_ADDRSTRLEN);
|
assert(reslen >= NG_INET_ADDRSTRLEN);
|
||||||
ng_ipaddr_tostr_r(IpAddr, tmp_ip_str);
|
ng_ipaddr_tostr_r(IpAddr, tmp_ip_str);
|
||||||
|
|
||||||
Log_Resolver(LOG_WARNING, "%s: Can't resolve address \"%s\": %s",
|
Log_Subprocess(LOG_WARNING, "%s: Can't resolve address \"%s\": %s",
|
||||||
funcname, tmp_ip_str, errmsg);
|
funcname, tmp_ip_str, errmsg);
|
||||||
strlcpy(resbuf, tmp_ip_str, reslen);
|
strlcpy(resbuf, tmp_ip_str, reslen);
|
||||||
return false;
|
return false;
|
||||||
@@ -291,14 +260,16 @@ ForwardLookup(const char *hostname, array *IpAddr)
|
|||||||
if (!Conf_ConnectIPv4)
|
if (!Conf_ConnectIPv4)
|
||||||
hints.ai_family = AF_INET6;
|
hints.ai_family = AF_INET6;
|
||||||
#endif
|
#endif
|
||||||
|
memset(&addr, 0, sizeof(addr));
|
||||||
|
|
||||||
res = getaddrinfo(hostname, NULL, &hints, &ai_results);
|
res = getaddrinfo(hostname, NULL, &hints, &ai_results);
|
||||||
switch (res) {
|
switch (res) {
|
||||||
case 0: break;
|
case 0: break;
|
||||||
case EAI_SYSTEM:
|
case EAI_SYSTEM:
|
||||||
Log_Resolver(LOG_WARNING, "Can't resolve \"%s\": %s", hostname, strerror(errno));
|
Log_Subprocess(LOG_WARNING, "Can't resolve \"%s\": %s", hostname, strerror(errno));
|
||||||
return false;
|
return false;
|
||||||
default:
|
default:
|
||||||
Log_Resolver(LOG_WARNING, "Can't resolve \"%s\": %s", hostname, gai_strerror(res));
|
Log_Subprocess(LOG_WARNING, "Can't resolve \"%s\": %s", hostname, gai_strerror(res));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -321,9 +292,10 @@ ForwardLookup(const char *hostname, array *IpAddr)
|
|||||||
|
|
||||||
if (!h) {
|
if (!h) {
|
||||||
#ifdef h_errno
|
#ifdef h_errno
|
||||||
Log_Resolver(LOG_WARNING, "Can't resolve \"%s\": %s", hostname, Get_Error(h_errno));
|
Log_Subprocess(LOG_WARNING, "Can't resolve \"%s\": %s",
|
||||||
|
hostname, Get_Error(h_errno));
|
||||||
#else
|
#else
|
||||||
Log_Resolver(LOG_WARNING, "Can't resolve \"%s\"", hostname);
|
Log_Subprocess(LOG_WARNING, "Can't resolve \"%s\"", hostname);
|
||||||
#endif
|
#endif
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -359,7 +331,7 @@ Addr_in_list(const array *resolved_addr, const ng_ipaddr_t *Addr)
|
|||||||
tmpAddrs = array_start(resolved_addr);
|
tmpAddrs = array_start(resolved_addr);
|
||||||
|
|
||||||
while (len > 0) {
|
while (len > 0) {
|
||||||
Log_Resolver(LOG_WARNING, "Address mismatch: %s != %s",
|
Log_Subprocess(LOG_WARNING, "Address mismatch: %s != %s",
|
||||||
tmp_ip_str, ng_ipaddr_tostr(tmpAddrs));
|
tmp_ip_str, ng_ipaddr_tostr(tmpAddrs));
|
||||||
tmpAddrs++;
|
tmpAddrs++;
|
||||||
len--;
|
len--;
|
||||||
@@ -372,15 +344,15 @@ Addr_in_list(const array *resolved_addr, const ng_ipaddr_t *Addr)
|
|||||||
static void
|
static void
|
||||||
Log_Forgery_NoIP(const char *ip, const char *host)
|
Log_Forgery_NoIP(const char *ip, const char *host)
|
||||||
{
|
{
|
||||||
Log_Resolver(LOG_WARNING, "Possible forgery: %s resolved to %s "
|
Log_Subprocess(LOG_WARNING,
|
||||||
"(which has no ip address)", ip, host);
|
"Possible forgery: %s resolved to %s (which has no ip address)", ip, host);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
Log_Forgery_WrongIP(const char *ip, const char *host)
|
Log_Forgery_WrongIP(const char *ip, const char *host)
|
||||||
{
|
{
|
||||||
Log_Resolver(LOG_WARNING,"Possible forgery: %s resolved to %s "
|
Log_Subprocess(LOG_WARNING,
|
||||||
"(which points to different address)", ip, host);
|
"Possible forgery: %s resolved to %s (which points to different address)", ip, host);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -393,7 +365,7 @@ ArrayWrite(int fd, const array *a)
|
|||||||
assert(data);
|
assert(data);
|
||||||
|
|
||||||
if( (size_t)write(fd, data, len) != len )
|
if( (size_t)write(fd, data, len) != len )
|
||||||
Log_Resolver( LOG_CRIT, "Resolver: Can't write to parent: %s!",
|
Log_Subprocess( LOG_CRIT, "Resolver: Can't write to parent: %s!",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -411,7 +383,7 @@ Do_ResolveAddr(const ng_ipaddr_t *Addr, int identsock, int w_fd)
|
|||||||
array_init(&resolved_addr);
|
array_init(&resolved_addr);
|
||||||
ng_ipaddr_tostr_r(Addr, tmp_ip_str);
|
ng_ipaddr_tostr_r(Addr, tmp_ip_str);
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Log_Resolver(LOG_DEBUG, "Now resolving %s ...", tmp_ip_str);
|
Log_Subprocess(LOG_DEBUG, "Now resolving %s ...", tmp_ip_str);
|
||||||
#endif
|
#endif
|
||||||
if (!ReverseLookup(Addr, hostname, sizeof(hostname)))
|
if (!ReverseLookup(Addr, hostname, sizeof(hostname)))
|
||||||
goto dns_done;
|
goto dns_done;
|
||||||
@@ -426,13 +398,15 @@ Do_ResolveAddr(const ng_ipaddr_t *Addr, int identsock, int w_fd)
|
|||||||
strlcpy(hostname, tmp_ip_str, sizeof(hostname));
|
strlcpy(hostname, tmp_ip_str, sizeof(hostname));
|
||||||
}
|
}
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Log_Resolver(LOG_DEBUG, "Ok, translated %s to \"%s\".", tmp_ip_str, hostname);
|
Log_Subprocess(LOG_DEBUG, "Ok, translated %s to \"%s\".", tmp_ip_str, hostname);
|
||||||
#endif
|
#endif
|
||||||
dns_done:
|
dns_done:
|
||||||
len = strlen(hostname);
|
len = strlen(hostname);
|
||||||
hostname[len] = '\n';
|
hostname[len] = '\n';
|
||||||
if (!array_copyb(&resolved_addr, hostname, ++len)) {
|
if (!array_copyb(&resolved_addr, hostname, ++len)) {
|
||||||
Log_Resolver(LOG_CRIT, "Resolver: Can't copy resolved name: %s!", strerror(errno));
|
Log_Subprocess(LOG_CRIT,
|
||||||
|
"Resolver: Can't copy resolved name: %s!",
|
||||||
|
strerror(errno));
|
||||||
array_free(&resolved_addr);
|
array_free(&resolved_addr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -455,7 +429,7 @@ Do_ResolveName( const char *Host, int w_fd )
|
|||||||
ng_ipaddr_t *addr;
|
ng_ipaddr_t *addr;
|
||||||
size_t len;
|
size_t len;
|
||||||
#endif
|
#endif
|
||||||
Log_Resolver(LOG_DEBUG, "Now resolving \"%s\" ...", Host);
|
Log_Subprocess(LOG_DEBUG, "Now resolving \"%s\" ...", Host);
|
||||||
|
|
||||||
array_init(&IpAddrs);
|
array_init(&IpAddrs);
|
||||||
/* Resolve hostname */
|
/* Resolve hostname */
|
||||||
@@ -469,7 +443,7 @@ Do_ResolveName( const char *Host, int w_fd )
|
|||||||
addr = array_start(&IpAddrs);
|
addr = array_start(&IpAddrs);
|
||||||
assert(addr);
|
assert(addr);
|
||||||
for (; len > 0; --len,addr++) {
|
for (; len > 0; --len,addr++) {
|
||||||
Log_Resolver(LOG_DEBUG, "translated \"%s\" to %s.",
|
Log_Subprocess(LOG_DEBUG, "translated \"%s\" to %s.",
|
||||||
Host, ng_ipaddr_tostr(addr));
|
Host, ng_ipaddr_tostr(addr));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -480,65 +454,4 @@ Do_ResolveName( const char *Host, int w_fd )
|
|||||||
} /* Do_ResolveName */
|
} /* Do_ResolveName */
|
||||||
|
|
||||||
|
|
||||||
static bool
|
|
||||||
register_callback( RES_STAT *s, void (*cbfunc)(int, short))
|
|
||||||
{
|
|
||||||
assert(cbfunc != NULL);
|
|
||||||
assert(s != NULL);
|
|
||||||
assert(s->resolver_fd >= 0);
|
|
||||||
|
|
||||||
if (io_setnonblock(s->resolver_fd) &&
|
|
||||||
io_event_create(s->resolver_fd, IO_WANTREAD, cbfunc))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
Log( LOG_CRIT, "Resolver: Could not register callback function: %s!", strerror(errno));
|
|
||||||
close(s->resolver_fd);
|
|
||||||
Resolve_Init(s);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
GLOBAL bool
|
|
||||||
Resolve_Shutdown( RES_STAT *s)
|
|
||||||
{
|
|
||||||
bool ret = false;
|
|
||||||
|
|
||||||
assert(s != NULL);
|
|
||||||
assert(s->resolver_fd >= 0);
|
|
||||||
|
|
||||||
if (s->resolver_fd >= 0)
|
|
||||||
ret = io_close(s->resolver_fd);
|
|
||||||
|
|
||||||
Resolve_Init(s);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Read result of resolver sub-process from pipe
|
|
||||||
*/
|
|
||||||
GLOBAL size_t
|
|
||||||
Resolve_Read( RES_STAT *s, void* readbuf, size_t buflen)
|
|
||||||
{
|
|
||||||
ssize_t bytes_read;
|
|
||||||
|
|
||||||
assert(buflen > 0);
|
|
||||||
|
|
||||||
/* Read result from pipe */
|
|
||||||
bytes_read = read(s->resolver_fd, readbuf, buflen);
|
|
||||||
if (bytes_read < 0) {
|
|
||||||
if (errno == EAGAIN)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
Log( LOG_CRIT, "Resolver: Can't read result: %s!", strerror(errno));
|
|
||||||
bytes_read = 0;
|
|
||||||
}
|
|
||||||
#ifdef DEBUG
|
|
||||||
else if (bytes_read == 0)
|
|
||||||
Log( LOG_DEBUG, "Resolver: Can't read result: EOF");
|
|
||||||
#endif
|
|
||||||
Resolve_Shutdown(s);
|
|
||||||
return (size_t)bytes_read;
|
|
||||||
}
|
|
||||||
/* -eof- */
|
/* -eof- */
|
||||||
|
|
||||||
|
|||||||
@@ -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-2010 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,34 +8,17 @@
|
|||||||
* (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.14 2008/02/26 22:04:17 fw Exp $
|
|
||||||
*
|
|
||||||
* Asynchronous resolver (header)
|
* Asynchronous resolver (header)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __resolve_h__
|
#ifndef __resolve_h__
|
||||||
#define __resolve_h__
|
#define __resolve_h__
|
||||||
|
|
||||||
#include "array.h"
|
GLOBAL bool Resolve_Addr PARAMS((PROC_STAT * s, const ng_ipaddr_t * Addr,
|
||||||
#include "tool.h"
|
int identsock, void (*cbfunc) (int, short)));
|
||||||
#include "ng_ipaddr.h"
|
GLOBAL bool Resolve_Name PARAMS((PROC_STAT * s, const char *Host,
|
||||||
|
void (*cbfunc) (int, short)));
|
||||||
/* This struct must not be accessed directly */
|
|
||||||
typedef struct _Res_Stat {
|
|
||||||
pid_t pid; /* PID of resolver process */
|
|
||||||
int resolver_fd; /* pipe fd for lookup result. */
|
|
||||||
} RES_STAT;
|
|
||||||
|
|
||||||
|
|
||||||
#define Resolve_Getfd(x) ((x)->resolver_fd)
|
|
||||||
#define Resolve_INPROGRESS(x) ((x)->resolver_fd >= 0)
|
|
||||||
|
|
||||||
GLOBAL bool Resolve_Addr PARAMS(( RES_STAT *s, const ng_ipaddr_t *Addr, int identsock, void (*cbfunc)(int, short)));
|
|
||||||
GLOBAL bool Resolve_Name PARAMS(( RES_STAT *s, const char *Host, void (*cbfunc)(int, short) ));
|
|
||||||
GLOBAL size_t Resolve_Read PARAMS(( RES_STAT *s, void *buf, size_t buflen));
|
|
||||||
GLOBAL void Resolve_Init PARAMS(( RES_STAT *s));
|
|
||||||
GLOBAL bool Resolve_Shutdown PARAMS(( RES_STAT *s));
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* -eof- */
|
/* -eof- */
|
||||||
|
|||||||
336
src/ngircd/sighandlers.c
Normal file
336
src/ngircd/sighandlers.c
Normal file
@@ -0,0 +1,336 @@
|
|||||||
|
/*
|
||||||
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
* Please read the file COPYING, README and AUTHORS for more information.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "portab.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* Signal Handlers: Actions to be performed when the program
|
||||||
|
* receives a signal.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
|
||||||
|
#include "imp.h"
|
||||||
|
#include "conn.h"
|
||||||
|
#include "conf-ssl.h"
|
||||||
|
#include "channel.h"
|
||||||
|
#include "conf.h"
|
||||||
|
#include "io.h"
|
||||||
|
#include "log.h"
|
||||||
|
#include "ngircd.h"
|
||||||
|
#include "sighandlers.h"
|
||||||
|
|
||||||
|
static int signalpipe[2];
|
||||||
|
|
||||||
|
static const int signals_catch[] = {
|
||||||
|
SIGINT, SIGQUIT, SIGTERM, SIGHUP, SIGCHLD, SIGUSR1, SIGUSR2
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
|
||||||
|
static void
|
||||||
|
Dump_State(void)
|
||||||
|
{
|
||||||
|
Log(LOG_DEBUG, "--- Internal server state: %s ---",
|
||||||
|
Client_ID(Client_ThisServer()));
|
||||||
|
Log(LOG_DEBUG, "time()=%ld", time(NULL));
|
||||||
|
Conf_DebugDump();
|
||||||
|
Conn_DebugDump();
|
||||||
|
Client_DebugDump();
|
||||||
|
Log(LOG_DEBUG, "--- End of state dump ---");
|
||||||
|
} /* Dump_State */
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
Signal_Block(int sig)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_SIGPROCMASK
|
||||||
|
sigset_t set;
|
||||||
|
|
||||||
|
sigemptyset(&set);
|
||||||
|
sigaddset(&set, sig);
|
||||||
|
|
||||||
|
sigprocmask(SIG_BLOCK, &set, NULL);
|
||||||
|
#else
|
||||||
|
sigblock(sig);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
Signal_Unblock(int sig)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_SIGPROCMASK
|
||||||
|
sigset_t set;
|
||||||
|
|
||||||
|
sigemptyset(&set);
|
||||||
|
sigaddset(&set, sig);
|
||||||
|
|
||||||
|
sigprocmask(SIG_UNBLOCK, &set, NULL);
|
||||||
|
#else
|
||||||
|
int old = sigblock(0) & ~sig;
|
||||||
|
sigsetmask(old);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reload the server configuration file.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
Rehash(void)
|
||||||
|
{
|
||||||
|
char old_name[CLIENT_ID_LEN];
|
||||||
|
unsigned old_nicklen;
|
||||||
|
|
||||||
|
Log( LOG_NOTICE|LOG_snotice, "Re-reading configuration NOW!" );
|
||||||
|
|
||||||
|
/* Remember old server name and nick name length */
|
||||||
|
strlcpy( old_name, Conf_ServerName, sizeof old_name );
|
||||||
|
old_nicklen = Conf_MaxNickLength;
|
||||||
|
|
||||||
|
/* Re-read configuration ... */
|
||||||
|
if (!Conf_Rehash( ))
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Close down all listening sockets */
|
||||||
|
Conn_ExitListeners( );
|
||||||
|
|
||||||
|
/* Recover old server name and nick name length: these values can't
|
||||||
|
* be changed during run-time */
|
||||||
|
if (strcmp(old_name, Conf_ServerName) != 0 ) {
|
||||||
|
strlcpy(Conf_ServerName, old_name, sizeof Conf_ServerName);
|
||||||
|
Log(LOG_ERR, "Can't change \"ServerName\" on runtime! Ignored new name.");
|
||||||
|
}
|
||||||
|
if (old_nicklen != Conf_MaxNickLength) {
|
||||||
|
Conf_MaxNickLength = old_nicklen;
|
||||||
|
Log(LOG_ERR, "Can't change \"MaxNickLength\" on runtime! Ignored new value.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create new pre-defined channels */
|
||||||
|
Channel_InitPredefined( );
|
||||||
|
|
||||||
|
if (!ConnSSL_InitLibrary())
|
||||||
|
Log(LOG_WARNING, "Re-Initializing SSL failed, using old keys");
|
||||||
|
|
||||||
|
/* Start listening on sockets */
|
||||||
|
Conn_InitListeners( );
|
||||||
|
|
||||||
|
/* Sync configuration with established connections */
|
||||||
|
Conn_SyncServerStruct( );
|
||||||
|
|
||||||
|
Log( LOG_NOTICE|LOG_snotice, "Re-reading of configuration done." );
|
||||||
|
} /* Rehash */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* It blocks the signal and queues it for later execution by Signal_Handler_BH.
|
||||||
|
* @param Signal Number of the signal to handle.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
Signal_Handler(int Signal)
|
||||||
|
{
|
||||||
|
switch (Signal) {
|
||||||
|
case SIGTERM:
|
||||||
|
case SIGINT:
|
||||||
|
case SIGQUIT:
|
||||||
|
/* shut down sever */
|
||||||
|
NGIRCd_SignalQuit = true;
|
||||||
|
return;
|
||||||
|
case SIGCHLD:
|
||||||
|
/* child-process exited, avoid zombies */
|
||||||
|
while (waitpid( -1, NULL, WNOHANG) > 0)
|
||||||
|
;
|
||||||
|
return;
|
||||||
|
#ifdef DEBUG
|
||||||
|
case SIGUSR1:
|
||||||
|
if (! NGIRCd_Debug) {
|
||||||
|
Log(LOG_INFO|LOG_snotice,
|
||||||
|
"Got SIGUSR1, debug mode activated.");
|
||||||
|
#ifdef SNIFFER
|
||||||
|
strcpy(NGIRCd_DebugLevel, "2");
|
||||||
|
NGIRCd_Debug = true;
|
||||||
|
NGIRCd_Sniffer = true;
|
||||||
|
#else
|
||||||
|
strcpy(NGIRCd_DebugLevel, "1");
|
||||||
|
NGIRCd_Debug = true;
|
||||||
|
#endif /* SNIFFER */
|
||||||
|
} else {
|
||||||
|
Log(LOG_INFO|LOG_snotice,
|
||||||
|
"Got SIGUSR1, debug mode deactivated.");
|
||||||
|
strcpy(NGIRCd_DebugLevel, "");
|
||||||
|
NGIRCd_Debug = false;
|
||||||
|
#ifdef SNIFFER
|
||||||
|
NGIRCd_Sniffer = false;
|
||||||
|
#endif /* SNIFFER */
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* other signal: queue for later execution.
|
||||||
|
* This has the advantage that we are not restricted
|
||||||
|
* to functions that can be called safely from signal handlers.
|
||||||
|
*/
|
||||||
|
if (write(signalpipe[1], &Signal, sizeof(Signal)) != -1)
|
||||||
|
Signal_Block(Signal);
|
||||||
|
} /* Signal_Handler */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Signal processing handler of ngIRCd.
|
||||||
|
* This function is called from the main conn event loop in (io_dispatch)
|
||||||
|
* whenever ngIRCd has queued a signal.
|
||||||
|
*
|
||||||
|
* This function runs in normal context, not from the real signal handler,
|
||||||
|
* thus its not necessary to only use functions that are signal safe.
|
||||||
|
* @param Signal Number of the signal that was queued.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
Signal_Handler_BH(int Signal)
|
||||||
|
{
|
||||||
|
switch (Signal) {
|
||||||
|
case SIGHUP:
|
||||||
|
/* re-read configuration */
|
||||||
|
Rehash();
|
||||||
|
break;
|
||||||
|
#ifdef DEBUG
|
||||||
|
case SIGUSR2:
|
||||||
|
if (NGIRCd_Debug)
|
||||||
|
Dump_State();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Log(LOG_DEBUG, "Got signal %d! Ignored.", Signal);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
Signal_Unblock(Signal);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
Signal_Callback(int fd, short UNUSED what)
|
||||||
|
{
|
||||||
|
int sig, ret;
|
||||||
|
(void) what;
|
||||||
|
|
||||||
|
do {
|
||||||
|
ret = (int)read(fd, &sig, sizeof(sig));
|
||||||
|
if (ret == sizeof(int))
|
||||||
|
Signal_Handler_BH(sig);
|
||||||
|
} while (ret == sizeof(int));
|
||||||
|
|
||||||
|
if (ret == -1) {
|
||||||
|
if (errno == EAGAIN || errno == EINTR)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Log(LOG_EMERG, "read from signal pipe: %s", strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
Log(LOG_EMERG, "EOF on signal pipe");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the signal handlers, catch
|
||||||
|
* those signals we are interested in and sets SIGPIPE to be ignored.
|
||||||
|
* @return true if initialization was sucessful.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
Signals_Init(void)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
#ifdef HAVE_SIGACTION
|
||||||
|
struct sigaction saction;
|
||||||
|
#endif
|
||||||
|
if (signalpipe[0] > 0 || signalpipe[1] > 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (pipe(signalpipe))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!io_setnonblock(signalpipe[0]) ||
|
||||||
|
!io_setnonblock(signalpipe[1]))
|
||||||
|
return false;
|
||||||
|
if (!io_setcloexec(signalpipe[0]) ||
|
||||||
|
!io_setcloexec(signalpipe[1]))
|
||||||
|
return false;
|
||||||
|
#ifdef HAVE_SIGACTION
|
||||||
|
memset( &saction, 0, sizeof( saction ));
|
||||||
|
saction.sa_handler = Signal_Handler;
|
||||||
|
#ifdef SA_RESTART
|
||||||
|
saction.sa_flags |= SA_RESTART;
|
||||||
|
#endif
|
||||||
|
#ifdef SA_NOCLDWAIT
|
||||||
|
saction.sa_flags |= SA_NOCLDWAIT;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (i=0; i < C_ARRAY_SIZE(signals_catch) ; i++)
|
||||||
|
sigaction(signals_catch[i], &saction, NULL);
|
||||||
|
|
||||||
|
/* we handle write errors properly; ignore SIGPIPE */
|
||||||
|
saction.sa_handler = SIG_IGN;
|
||||||
|
sigaction(SIGPIPE, &saction, NULL);
|
||||||
|
#else
|
||||||
|
for (i=0; i < C_ARRAY_SIZE(signals_catch) ; i++)
|
||||||
|
signal(signals_catch[i], Signal_Handler);
|
||||||
|
|
||||||
|
signal(SIGPIPE, SIG_IGN);
|
||||||
|
#endif
|
||||||
|
return io_event_create(signalpipe[0], IO_WANTREAD, Signal_Callback);
|
||||||
|
} /* Signals_Init */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Restores signals to their default behaviour.
|
||||||
|
*
|
||||||
|
* This should be called after a fork() in the new
|
||||||
|
* child prodcess, especially when we are about to call
|
||||||
|
* 3rd party code (e.g. PAM).
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Signals_Exit(void)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
#ifdef HAVE_SIGACTION
|
||||||
|
struct sigaction saction;
|
||||||
|
|
||||||
|
memset(&saction, 0, sizeof(saction));
|
||||||
|
saction.sa_handler = SIG_DFL;
|
||||||
|
|
||||||
|
for (i=0; i < C_ARRAY_SIZE(signals_catch) ; i++)
|
||||||
|
sigaction(signals_catch[i], &saction, NULL);
|
||||||
|
sigaction(SIGPIPE, &saction, NULL);
|
||||||
|
#else
|
||||||
|
for (i=0; i < C_ARRAY_SIZE(signals_catch) ; i++)
|
||||||
|
signal(signals_catch[i], SIG_DFL);
|
||||||
|
signal(SIGPIPE, SIG_DFL);
|
||||||
|
#endif
|
||||||
|
close(signalpipe[1]);
|
||||||
|
close(signalpipe[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -eof- */
|
||||||
19
src/ngircd/sighandlers.h
Normal file
19
src/ngircd/sighandlers.h
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef signals_included_
|
||||||
|
#define signals_included_
|
||||||
|
|
||||||
|
#include "portab.h"
|
||||||
|
|
||||||
|
bool Signals_Init PARAMS((void));
|
||||||
|
void Signals_Exit PARAMS((void));
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2005 Alexander Barton (alex@barton.de)
|
* Copyright (c)2001-2010 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,8 +8,6 @@
|
|||||||
* (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.22 2005/07/31 20:13:11 alex Exp $
|
|
||||||
*
|
|
||||||
* Portability functions and declarations (header for libngbportab).
|
* Portability functions and declarations (header for libngbportab).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -48,7 +46,7 @@
|
|||||||
|
|
||||||
/* compiler features */
|
/* compiler features */
|
||||||
|
|
||||||
#if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7))
|
#if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 7))
|
||||||
# define PUNUSED(x) __attribute__ ((unused)) x
|
# define PUNUSED(x) __attribute__ ((unused)) x
|
||||||
# define UNUSED __attribute__ ((unused))
|
# define UNUSED __attribute__ ((unused))
|
||||||
#else
|
#else
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
OperCanUseMode = yes
|
OperCanUseMode = yes
|
||||||
MaxJoins = 4
|
MaxJoins = 4
|
||||||
NoIdent = yes
|
NoIdent = yes
|
||||||
|
NoPAM = yes
|
||||||
|
|
||||||
[Operator]
|
[Operator]
|
||||||
Name = TestOp
|
Name = TestOp
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
OperCanUseMode = yes
|
OperCanUseMode = yes
|
||||||
MaxJoins = 4
|
MaxJoins = 4
|
||||||
NoIdent = yes
|
NoIdent = yes
|
||||||
|
NoPAM = yes
|
||||||
|
|
||||||
[Operator]
|
[Operator]
|
||||||
Name = TestOp
|
Name = TestOp
|
||||||
|
|||||||
108
src/tool/tool.c
108
src/tool/tool.c
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2008 Alexander Barton (alex@barton.de)
|
* Copyright (c)2001-2010 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
|
||||||
@@ -22,6 +22,11 @@
|
|||||||
|
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
|
||||||
|
#ifdef SYSLOG
|
||||||
|
#define SYSLOG_NAMES 1
|
||||||
|
#include <syslog.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "exp.h"
|
#include "exp.h"
|
||||||
#include "tool.h"
|
#include "tool.h"
|
||||||
|
|
||||||
@@ -107,16 +112,107 @@ ngt_TrimLastChr( char *String, const char Chr)
|
|||||||
/* If last character in the string matches Chr, remove it.
|
/* If last character in the string matches Chr, remove it.
|
||||||
* Empty strings are handled correctly. */
|
* Empty strings are handled correctly. */
|
||||||
|
|
||||||
unsigned int len;
|
size_t len;
|
||||||
|
|
||||||
assert( String != NULL );
|
assert(String != NULL);
|
||||||
|
|
||||||
len = strlen( String );
|
len = strlen(String);
|
||||||
if( len == 0 ) return;
|
if(len == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
len--;
|
len--;
|
||||||
|
|
||||||
if( String[len] == Chr ) String[len] = '\0';
|
if(String[len] == Chr)
|
||||||
|
String[len] = '\0';
|
||||||
} /* ngt_TrimLastChr */
|
} /* ngt_TrimLastChr */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef SYSLOG
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef INTERNAL_MARK
|
||||||
|
|
||||||
|
#ifndef _code
|
||||||
|
typedef struct _code {
|
||||||
|
char *c_name;
|
||||||
|
int c_val;
|
||||||
|
} CODE;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CODE facilitynames[] = {
|
||||||
|
#ifdef LOG_AUTH
|
||||||
|
{ "auth", LOG_AUTH },
|
||||||
|
#endif
|
||||||
|
#ifdef LOG_AUTHPRIV
|
||||||
|
{ "authpriv", LOG_AUTHPRIV },
|
||||||
|
#endif
|
||||||
|
#ifdef LOG_CRON
|
||||||
|
{ "cron", LOG_CRON },
|
||||||
|
#endif
|
||||||
|
#ifdef LOG_DAEMON
|
||||||
|
{ "daemon", LOG_DAEMON },
|
||||||
|
#endif
|
||||||
|
#ifdef LOG_FTP
|
||||||
|
{ "ftp", LOG_FTP },
|
||||||
|
#endif
|
||||||
|
#ifdef LOG_LPR
|
||||||
|
{ "lpr", LOG_LPR },
|
||||||
|
#endif
|
||||||
|
#ifdef LOG_MAIL
|
||||||
|
{ "mail", LOG_MAIL },
|
||||||
|
#endif
|
||||||
|
#ifdef LOG_NEWS
|
||||||
|
{ "news", LOG_NEWS },
|
||||||
|
#endif
|
||||||
|
#ifdef LOG_UUCP
|
||||||
|
{ "uucp", LOG_UUCP },
|
||||||
|
#endif
|
||||||
|
#ifdef LOG_USER
|
||||||
|
{ "user", LOG_USER },
|
||||||
|
#endif
|
||||||
|
#ifdef LOG_LOCAL7
|
||||||
|
{ "local0", LOG_LOCAL0 },
|
||||||
|
{ "local1", LOG_LOCAL1 },
|
||||||
|
{ "local2", LOG_LOCAL2 },
|
||||||
|
{ "local3", LOG_LOCAL3 },
|
||||||
|
{ "local4", LOG_LOCAL4 },
|
||||||
|
{ "local5", LOG_LOCAL5 },
|
||||||
|
{ "local6", LOG_LOCAL6 },
|
||||||
|
{ "local7", LOG_LOCAL7 },
|
||||||
|
#endif
|
||||||
|
{ 0, -1 }
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
GLOBAL const char*
|
||||||
|
ngt_SyslogFacilityName(int Facility)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
while(facilitynames[i].c_name) {
|
||||||
|
if (facilitynames[i].c_val == Facility)
|
||||||
|
return facilitynames[i].c_name;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GLOBAL int
|
||||||
|
ngt_SyslogFacilityID(char *Name, int DefaultFacility)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
while(facilitynames[i].c_name) {
|
||||||
|
if (strcasecmp(facilitynames[i].c_name, Name) == 0)
|
||||||
|
return facilitynames[i].c_val;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return DefaultFacility;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* -eof- */
|
/* -eof- */
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2008 by Alexander Barton (alex@barton.de)
|
* Copyright (c)2001-2010 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
|
||||||
@@ -29,6 +29,11 @@ GLOBAL void ngt_TrimStr PARAMS((char *String ));
|
|||||||
GLOBAL char *ngt_UpperStr PARAMS((char *String ));
|
GLOBAL char *ngt_UpperStr PARAMS((char *String ));
|
||||||
GLOBAL char *ngt_LowerStr PARAMS((char *String ));
|
GLOBAL char *ngt_LowerStr PARAMS((char *String ));
|
||||||
|
|
||||||
|
#ifdef SYSLOG
|
||||||
|
GLOBAL const char *ngt_SyslogFacilityName PARAMS((int Facility));
|
||||||
|
GLOBAL int ngt_SyslogFacilityID PARAMS((char *Name, int DefaultFacility));
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user