mirror of
https://github.com/osmarks/ngircd.git
synced 2025-10-24 02:27:38 +00:00
Compare commits
508 Commits
rel-0-8-3
...
branch-0-1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3b69da0c52 | ||
|
|
04933f5b8b | ||
|
|
45df522bcb | ||
|
|
51260c2e9f | ||
|
|
55865d7fc6 | ||
|
|
082a92beef | ||
|
|
e92c889580 | ||
|
|
de4676f066 | ||
|
|
64a98338d5 | ||
|
|
f4709082fe | ||
|
|
997abc6889 | ||
|
|
b7047f2e3b | ||
|
|
e990d96c61 | ||
|
|
d986cd372f | ||
|
|
762aec0e08 | ||
|
|
f8cb8e3f20 | ||
|
|
478a8c01f9 | ||
|
|
61e6b5c0aa | ||
|
|
91a6fffaa0 | ||
|
|
2ce5b734bd | ||
|
|
f99f9a8f02 | ||
|
|
4715ccf9ca | ||
|
|
8974e90552 | ||
|
|
2fe13f0a45 | ||
|
|
20ce56cc5b | ||
|
|
47a0379e2b | ||
|
|
37563537a9 | ||
|
|
82d32ffb28 | ||
|
|
024588dbe7 | ||
|
|
47ca178a21 | ||
|
|
12db0bdc4f | ||
|
|
53b98fd7e9 | ||
|
|
c7d4d85666 | ||
|
|
4659dae6eb | ||
|
|
68f896eee0 | ||
|
|
06bfb3adfb | ||
|
|
2f305331a1 | ||
|
|
ad7361dfe0 | ||
|
|
e47c9d750f | ||
|
|
001c00b273 | ||
|
|
b861f536b2 | ||
|
|
877bcc55f2 | ||
|
|
8f162f4e17 | ||
|
|
089ca21b3d | ||
|
|
137a139112 | ||
|
|
b160f574de | ||
|
|
d223b587e4 | ||
|
|
77939c382d | ||
|
|
f586052f2b | ||
|
|
d4ed056147 | ||
|
|
9021ea2070 | ||
|
|
640367e886 | ||
|
|
4b9e52eb4d | ||
|
|
69081851ac | ||
|
|
efcca62a35 | ||
|
|
cd65e0a56e | ||
|
|
2275add327 | ||
|
|
fd1091541b | ||
|
|
5675be4cd9 | ||
|
|
f1486e6a53 | ||
|
|
22a9ed6694 | ||
|
|
ddf56cbe5f | ||
|
|
255edf7eab | ||
|
|
5930a29197 | ||
|
|
07d8da60de | ||
|
|
44afe042d1 | ||
|
|
a073bc89c4 | ||
|
|
63e89ceb21 | ||
|
|
09416f36bf | ||
|
|
508b55126f | ||
|
|
9f65979979 | ||
|
|
2e34ddae53 | ||
|
|
09deb857ce | ||
|
|
8c14d397ba | ||
|
|
99eab1e216 | ||
|
|
c93d089736 | ||
|
|
429f85b77a | ||
|
|
ea2a4b3370 | ||
|
|
f9b9850662 | ||
|
|
1b852fce72 | ||
|
|
82aaffe55d | ||
|
|
40199e0b56 | ||
|
|
95b7dbcc18 | ||
|
|
43f8d149bb | ||
|
|
949a4ef793 | ||
|
|
f74781647a | ||
|
|
5c78230283 | ||
|
|
ee568cc444 | ||
|
|
2d9a3ec484 | ||
|
|
262d945284 | ||
|
|
f6ce2d557a | ||
|
|
4243cae985 | ||
|
|
40226d26b2 | ||
|
|
d2f7d3087d | ||
|
|
3f1e03edd9 | ||
|
|
23e7f7f0dd | ||
|
|
f36746a4d0 | ||
|
|
8cb0e3af68 | ||
|
|
eb3ddace46 | ||
|
|
5040d56489 | ||
|
|
fb0fbe908d | ||
|
|
fa7bb2790a | ||
|
|
5877bca4bc | ||
|
|
37602d1523 | ||
|
|
a09034563a | ||
|
|
5b35b101f2 | ||
|
|
058d3085a9 | ||
|
|
74883f57da | ||
|
|
018e351630 | ||
|
|
6e105bf87e | ||
|
|
61966a6088 | ||
|
|
27c96632f1 | ||
|
|
4108e16be6 | ||
|
|
4e02bdc322 | ||
|
|
ca5e09865e | ||
|
|
fb0c7ad252 | ||
|
|
d8950c5dd0 | ||
|
|
257312b102 | ||
|
|
27d947fb7d | ||
|
|
bed98979dc | ||
|
|
bddb4914b4 | ||
|
|
4c6c6ecf0e | ||
|
|
a2f5a05ff8 | ||
|
|
639eb40035 | ||
|
|
0d6f9d4e3e | ||
|
|
147de9dfa9 | ||
|
|
f6e729443e | ||
|
|
e426c131c7 | ||
|
|
b9661ae65d | ||
|
|
035f7fb2fe | ||
|
|
1b2c228de5 | ||
|
|
4d7d1d23be | ||
|
|
e2aacff7d4 | ||
|
|
0eccdbc137 | ||
|
|
939ee6a39b | ||
|
|
8423b89996 | ||
|
|
7d87318b04 | ||
|
|
83caef4598 | ||
|
|
7378860aea | ||
|
|
6eb3f3055d | ||
|
|
c888c81adf | ||
|
|
fac4682212 | ||
|
|
47026e14ce | ||
|
|
63626449f8 | ||
|
|
184eb1c54b | ||
|
|
5ce6bf28d1 | ||
|
|
f1f94f07e1 | ||
|
|
c8fd051e06 | ||
|
|
3e8978d836 | ||
|
|
9a2d4eef44 | ||
|
|
0d5fc770d3 | ||
|
|
5590f8624b | ||
|
|
fdc7ae22e9 | ||
|
|
179d61c588 | ||
|
|
47e581e453 | ||
|
|
65573d7a07 | ||
|
|
155056f386 | ||
|
|
3833f8aae3 | ||
|
|
161340d486 | ||
|
|
e9e1fa459b | ||
|
|
581f5479a2 | ||
|
|
00ab67dcdb | ||
|
|
dd3a3bc603 | ||
|
|
0a3f562f36 | ||
|
|
9dfd42a7e6 | ||
|
|
a65eb347ec | ||
|
|
2af87e9152 | ||
|
|
d0045afb09 | ||
|
|
1f5bdaec84 | ||
|
|
185004cb30 | ||
|
|
4a2eea2939 | ||
|
|
6d3686e73d | ||
|
|
5d0ba011c7 | ||
|
|
87f4b1c6f6 | ||
|
|
8067bab106 | ||
|
|
097c7bd741 | ||
|
|
c7bd9da446 | ||
|
|
3d0ab6bd2e | ||
|
|
bebfbedf3f | ||
|
|
cba9270845 | ||
|
|
2a9ffe7037 | ||
|
|
4000e01b28 | ||
|
|
68d3d36dd6 | ||
|
|
eedfc35bbc | ||
|
|
d39d3ec4b9 | ||
|
|
79dfd60a0c | ||
|
|
29ad5e0d94 | ||
|
|
7e8ac0afcf | ||
|
|
93df629b69 | ||
|
|
66060dbce9 | ||
|
|
0701afedee | ||
|
|
a17745d6d7 | ||
|
|
1249acfdba | ||
|
|
c8fb6a2258 | ||
|
|
7215737038 | ||
|
|
6eb2e37234 | ||
|
|
fb9707de98 | ||
|
|
db9afbbf0e | ||
|
|
e1b9409e63 | ||
|
|
4b2f966b7e | ||
|
|
a293088027 | ||
|
|
bd043449f2 | ||
|
|
0570e13cac | ||
|
|
6b21249151 | ||
|
|
4f8d646e2a | ||
|
|
ac55a80d9f | ||
|
|
bc09a3e487 | ||
|
|
ff218617db | ||
|
|
b65358b17c | ||
|
|
e9f3e69f36 | ||
|
|
5b2364b236 | ||
|
|
4db29b0076 | ||
|
|
0aae3ec5d7 | ||
|
|
468a1c7767 | ||
|
|
ab3ac4e466 | ||
|
|
4d18ac83a2 | ||
|
|
660b529c10 | ||
|
|
565129f992 | ||
|
|
b2a3bc3257 | ||
|
|
bcf8a5bee6 | ||
|
|
fc4cd39202 | ||
|
|
b5b7c7f174 | ||
|
|
6444442931 | ||
|
|
e899c75d7e | ||
|
|
cae9a3aee5 | ||
|
|
e708790566 | ||
|
|
0dd0015d16 | ||
|
|
dd3d2e2c39 | ||
|
|
9275dc4dc4 | ||
|
|
af9123fd82 | ||
|
|
ca32c1b311 | ||
|
|
342f20f889 | ||
|
|
a5b5a6a99a | ||
|
|
c65343e719 | ||
|
|
a7197f579c | ||
|
|
30c11b2313 | ||
|
|
b7033e1478 | ||
|
|
db992975eb | ||
|
|
c12dc45f17 | ||
|
|
a2e4eb5aaf | ||
|
|
58b8fb5d12 | ||
|
|
8efeae1714 | ||
|
|
21ad5dcfff | ||
|
|
4074fd9149 | ||
|
|
2f105b1c0a | ||
|
|
a2cdc08c39 | ||
|
|
e728bd2e1a | ||
|
|
12e288c062 | ||
|
|
733e15bb64 | ||
|
|
99544e8d5d | ||
|
|
f36337fab3 | ||
|
|
1a46b37bd5 | ||
|
|
5f87474a74 | ||
|
|
6434d0b23e | ||
|
|
d5c5d2a37f | ||
|
|
ac96fe5877 | ||
|
|
a6d1d26a43 | ||
|
|
c2f5399b51 | ||
|
|
ae6e6616a6 | ||
|
|
a5915f75c9 | ||
|
|
f2ba8abec5 | ||
|
|
701c259394 | ||
|
|
a32b404863 | ||
|
|
b15d906dff | ||
|
|
1c14e2e0a2 | ||
|
|
77f54693ef | ||
|
|
b61407713d | ||
|
|
b120c2a271 | ||
|
|
51ccb5928a | ||
|
|
890c3d9d72 | ||
|
|
84706af7fe | ||
|
|
46a191caf6 | ||
|
|
20ff63a8a1 | ||
|
|
21a067e0b1 | ||
|
|
8c7521af25 | ||
|
|
e96b4aad2e | ||
|
|
2e794a6943 | ||
|
|
1e9e16fa3b | ||
|
|
6ecccd2644 | ||
|
|
9db49e8f2c | ||
|
|
74cb2e2768 | ||
|
|
e5097bf2e6 | ||
|
|
3237d28bfb | ||
|
|
317841529b | ||
|
|
68dc35b548 | ||
|
|
d6e6350523 | ||
|
|
7036111a6c | ||
|
|
987559e46d | ||
|
|
fca29bfa23 | ||
|
|
63db3daafe | ||
|
|
2e858755c5 | ||
|
|
b682a5e485 | ||
|
|
efbfe4ae83 | ||
|
|
c92e57fec3 | ||
|
|
ca130e6db6 | ||
|
|
248d75e566 | ||
|
|
4715b17106 | ||
|
|
70facb7f6e | ||
|
|
76604f847a | ||
|
|
c7693f625e | ||
|
|
e50d049074 | ||
|
|
dd003e23b7 | ||
|
|
178b564c51 | ||
|
|
b976ec032f | ||
|
|
8916b201fa | ||
|
|
ead79d3e39 | ||
|
|
0e2f5a4f3d | ||
|
|
78692f1e87 | ||
|
|
02b0a51517 | ||
|
|
a874c26c25 | ||
|
|
1eca0aea4f | ||
|
|
7b5a1bbe3c | ||
|
|
b88e97f193 | ||
|
|
6b4ecf8c83 | ||
|
|
6093af49d5 | ||
|
|
0d180a913f | ||
|
|
60ae9c827e | ||
|
|
c857e9c887 | ||
|
|
579fce1831 | ||
|
|
2bf77fb0c3 | ||
|
|
774c6cda4d | ||
|
|
afef7dee82 | ||
|
|
7eca418465 | ||
|
|
ebbf92898e | ||
|
|
733ef4c815 | ||
|
|
e5a19fa3a0 | ||
|
|
ccb747cb3b | ||
|
|
9a6b6f527b | ||
|
|
43d644ed92 | ||
|
|
eeccc193dd | ||
|
|
0e3ce63ec1 | ||
|
|
0c33f46fc2 | ||
|
|
117a9e21e7 | ||
|
|
162338b8c8 | ||
|
|
de395db8e3 | ||
|
|
dbea187373 | ||
|
|
d81dab99fa | ||
|
|
9dc5e50226 | ||
|
|
c06c815c28 | ||
|
|
04169f34cf | ||
|
|
aec535c8b6 | ||
|
|
2d4dd33627 | ||
|
|
b0699efdab | ||
|
|
1ca8bb5255 | ||
|
|
bc2dac3c74 | ||
|
|
94dd7fa7d6 | ||
|
|
fcf65beea4 | ||
|
|
1cf8ccd8fe | ||
|
|
74424cb1a5 | ||
|
|
5c20474fdb | ||
|
|
8b0ac2306e | ||
|
|
5195555c5a | ||
|
|
a4660f40db | ||
|
|
9fa9c1fdda | ||
|
|
cac9f279fa | ||
|
|
517321807e | ||
|
|
ae98008c1c | ||
|
|
45404a1644 | ||
|
|
50338126e0 | ||
|
|
8ac701d6c8 | ||
|
|
158bf554c3 | ||
|
|
9c3c7e5a09 | ||
|
|
cd0dc8627d | ||
|
|
44fdde7610 | ||
|
|
95f8b963a6 | ||
|
|
1aeaf64c66 | ||
|
|
06caecb0c4 | ||
|
|
b1c14598e1 | ||
|
|
7f0d101184 | ||
|
|
9f247ebd5a | ||
|
|
dd9b4bc956 | ||
|
|
6f97dd4938 | ||
|
|
a02f25a810 | ||
|
|
aa25cd7da2 | ||
|
|
70fcdf1b5c | ||
|
|
dfe662ad45 | ||
|
|
7daa7fb278 | ||
|
|
e7c2c86aee | ||
|
|
c4bc2114c9 | ||
|
|
129a22a29b | ||
|
|
8304210c06 | ||
|
|
aee48a3b38 | ||
|
|
77faf14b29 | ||
|
|
8b17579e60 | ||
|
|
b4363162ce | ||
|
|
873edc6311 | ||
|
|
6ed37415fc | ||
|
|
55fadbfb1d | ||
|
|
ca8ab38cac | ||
|
|
dec7eba531 | ||
|
|
b0ae15e01d | ||
|
|
43ba1bc805 | ||
|
|
811ac48bd2 | ||
|
|
e936a79f6b | ||
|
|
0545288ebd | ||
|
|
e635ed43bf | ||
|
|
4d0b03b423 | ||
|
|
f6df13d5f8 | ||
|
|
f56a1bdf20 | ||
|
|
9dfcc6504e | ||
|
|
a822153309 | ||
|
|
49f5a4d454 | ||
|
|
326607eea1 | ||
|
|
bfba1f37ed | ||
|
|
374f90f392 | ||
|
|
8adff59223 | ||
|
|
27d93d7d8c | ||
|
|
8a2ed0a75f | ||
|
|
5fdd5be12b | ||
|
|
795802f2b0 | ||
|
|
1869766331 | ||
|
|
1d08d51e2e | ||
|
|
5e929effca | ||
|
|
e618041168 | ||
|
|
e7f8782831 | ||
|
|
4ef172d603 | ||
|
|
490c9d04d7 | ||
|
|
8579b2a1e5 | ||
|
|
3da942e237 | ||
|
|
bcb6cf3ffa | ||
|
|
972b07ff29 | ||
|
|
ba19fb8ff4 | ||
|
|
8d8b133bdf | ||
|
|
ec30cd4e5f | ||
|
|
f2fbf206b6 | ||
|
|
1fdd5478c6 | ||
|
|
9537542647 | ||
|
|
0993ff81bb | ||
|
|
894cd2cd68 | ||
|
|
c16d1b03aa | ||
|
|
451315643f | ||
|
|
d77182e7a6 | ||
|
|
8edeed8418 | ||
|
|
112102b10c | ||
|
|
ae63ed04c5 | ||
|
|
85acb82469 | ||
|
|
51d09fb4f7 | ||
|
|
8308c170db | ||
|
|
07fe19889b | ||
|
|
0c293ae988 | ||
|
|
18c92d9de7 | ||
|
|
2440ed080c | ||
|
|
669da58715 | ||
|
|
39f1ddd9d0 | ||
|
|
34e912d9f2 | ||
|
|
44172a8c7f | ||
|
|
a6d7fb8739 | ||
|
|
d16ce5a735 | ||
|
|
a40a026d15 | ||
|
|
6c5f4beb53 | ||
|
|
26b0ddf200 | ||
|
|
b6690df2be | ||
|
|
6dacec7ded | ||
|
|
429b5f3ec9 | ||
|
|
81bacda627 | ||
|
|
6960cb4c38 | ||
|
|
7b61b34c56 | ||
|
|
386d3b9e67 | ||
|
|
5049c5c694 | ||
|
|
292879aca4 | ||
|
|
dcb9e2a004 | ||
|
|
0d10c60b31 | ||
|
|
08e0b277bc | ||
|
|
58736b3902 | ||
|
|
f7354cdf28 | ||
|
|
196f27c4ad | ||
|
|
c1f32e8214 | ||
|
|
eee2762852 | ||
|
|
c79fa28a66 | ||
|
|
1e692e5890 | ||
|
|
ceafdf109b | ||
|
|
450251f082 | ||
|
|
ceef058065 | ||
|
|
b04a526a19 | ||
|
|
2f195a07b2 | ||
|
|
f38eeedfd7 | ||
|
|
8ca1e4d548 | ||
|
|
e07cc4bb63 | ||
|
|
c5bdd86f96 | ||
|
|
aa26e2ef36 | ||
|
|
9445962237 | ||
|
|
6b898b63f0 | ||
|
|
f7a4d03ba2 | ||
|
|
ade1e2eb7b | ||
|
|
a9a605de3e | ||
|
|
7ec11de523 | ||
|
|
18eb92a72b | ||
|
|
9ddb934784 | ||
|
|
4f8ac179bf | ||
|
|
02b8e51562 | ||
|
|
d27196e334 | ||
|
|
3edaa35d49 | ||
|
|
88258070c4 | ||
|
|
beb4edd3cf | ||
|
|
364ff7087d | ||
|
|
0b3ee07a2a | ||
|
|
a49a580a77 | ||
|
|
7080e9f83c | ||
|
|
59a48bfa1f | ||
|
|
42e8063a32 | ||
|
|
c23bbe6b65 | ||
|
|
d8f47ed195 | ||
|
|
d7c975e8d8 | ||
|
|
bf21dd1578 | ||
|
|
9013f56451 | ||
|
|
3012c232eb | ||
|
|
26390c60fb | ||
|
|
cdb039672c |
7
.cvsignore
Normal file
7
.cvsignore
Normal file
@@ -0,0 +1,7 @@
|
||||
Makefile
|
||||
Makefile.in
|
||||
aclocal.m4
|
||||
autom4te.cache
|
||||
config.log
|
||||
config.status
|
||||
configure
|
||||
11
AUTHORS
11
AUTHORS
@@ -1,7 +1,7 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001-2004 by Alexander Barton,
|
||||
(c)2001-2007 Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd is free software and published under the
|
||||
@@ -10,9 +10,16 @@
|
||||
-- AUTHORS and CONTRIBUTORS --
|
||||
|
||||
|
||||
Note: If you have critics, patches or something else, please feel free to
|
||||
post a mail to the ngIRCd mailing list: <ngircd-ml@arthur.ath.cx> (please see
|
||||
<http://ngircd.barton.de/#ml> for details). Don't mail the contributors
|
||||
directly, if possible!
|
||||
|
||||
|
||||
Main Authors
|
||||
~~~~~~~~~~~~
|
||||
Alexander Barton, <alex@barton.de> (alex)
|
||||
Florian Westphal, <westphal@foo.fh-furtwangen.de> (fw)
|
||||
|
||||
|
||||
Contributors
|
||||
@@ -31,4 +38,4 @@ Andrew Tridgell & Martin Pool: strl{cpy|cat}()-functions
|
||||
|
||||
|
||||
--
|
||||
$Id: AUTHORS,v 1.9 2004/05/07 11:19:20 alex Exp $
|
||||
$Id: AUTHORS,v 1.13 2007/10/04 15:18:48 alex Exp $
|
||||
|
||||
227
ChangeLog
227
ChangeLog
@@ -1,7 +1,7 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001-2004 by Alexander Barton,
|
||||
(c)2001-2008 Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd is free software and published under the
|
||||
@@ -10,8 +10,229 @@
|
||||
-- ChangeLog --
|
||||
|
||||
|
||||
ngIRCd CVSHEAD
|
||||
ngIRCd 0.11.1 (2008-02-26)
|
||||
|
||||
- Fix sending of JOIN commands between servers when remote server appended
|
||||
mode flags. (Rolf Eike Beer) [from HEAD]
|
||||
- Send "G" instead of "H" flag in WHO replies. (reported by Dana Dahlstrom)
|
||||
- Under some circumstances ngIRCd issued channel MODE message with a
|
||||
trailing space. (Dana Dahlstrom) [from HEAD]
|
||||
|
||||
ngIRCd 0.11.0 (2008-01-15)
|
||||
|
||||
ngIRCd 0.11.0-pre2 (2008-01-07)
|
||||
- SECURITY: IRC_PART could reference invalid memory, causing
|
||||
ngircd to crash [from HEAD].
|
||||
|
||||
ngIRCd 0.11.0-pre1 (2008-01-02)
|
||||
- Use dotted-decimal IP address if hostname is >= 64.
|
||||
- Add support for /STAT u (server uptime) command.
|
||||
- New [Server] configuration Option "Bind" allows to specify
|
||||
the source ip adress to use when connecting to remote server.
|
||||
- New configuration option "MaxNickLength" to specify the allowed maximum
|
||||
length of user nick names. Note: must be unique in an IRC network!
|
||||
- Enhanced the IRC+ protocol to support an enhanced "server handshake" and
|
||||
enable server to recognice numeric 005 (ISUPPORT) and 376 (ENDOFMOTD).
|
||||
See doc/Protocol.txt for details.
|
||||
- Re-added doc/SSL.txt to distribution -- got lost somewhere!?
|
||||
- Fixes the wrong logging output when nested servers are introduced
|
||||
to the network as well as the wrong output of the LINKS command.
|
||||
- Update Mac OS X Xcode project file for Xcode 3.
|
||||
- Adjust test suite to be usable on HP/UX 11.11 :-)
|
||||
- Fix code to compile using K&R C compiler and ansi2kr again.
|
||||
- New config option NoDNS: Disables DNS lookups when clients connect.
|
||||
- Fixed propagation of channel mode 'P' on server links.
|
||||
- Numeric 317: implemented "signon time" (displayed in WHOIS result).
|
||||
- Fixed code that prevented GCC 2.95 to compile ngIRCd.
|
||||
- Adjust path names in manual pages according to "./configure" settings.
|
||||
- Added new server configuration option "Passive" for "Server" blocks to
|
||||
disable automatic outgoing connections (similar to -p option to ngircd,
|
||||
but only for the specified server). (Tassilo Schweyer)
|
||||
- Don't connect to a server if a connection to another server within the
|
||||
same group is already in progress.
|
||||
- Added support for the WALLOPS command. Usage is restricted to IRC
|
||||
operators.
|
||||
|
||||
ngIRCd 0.10.4 (2008-01-07)
|
||||
|
||||
- SECURITY: IRC_PART could reference invalid memory, causing
|
||||
ngircd to crash [from HEAD].
|
||||
|
||||
ngIRCd 0.10.3 (2007-08-01)
|
||||
|
||||
- SECURITY: Fixed a severe bug in handling JOIN commands, which could
|
||||
cause the server to crash. Thanks to Sebastian Vesper, <net@veoson.net>.
|
||||
|
||||
ngIRCd 0.10.2 (2007-06-08)
|
||||
|
||||
ngIRCd 0.10.2-pre2 (2007-05-19)
|
||||
- Server links are allowed to use larger write buffers now (up to 50 KB).
|
||||
|
||||
ngIRCd 0.10.2-pre1 (2007-05-05)
|
||||
- Fix compressed server links (broken since 0.10.0).
|
||||
- Predefined Channel configuration now allows specification of channel key
|
||||
(mode k) and maximum user count (mode l).
|
||||
- When using epoll() IO interface, compile in the select() interface as
|
||||
well and fall back to it when epoll() isn't available on runtime.
|
||||
- New configure option "--without-select" to disable select() IO API
|
||||
(even when using epoll(), see above).
|
||||
- Added support for IO APIs "poll()" and "/dev/poll".
|
||||
- Reorganized internal handling of invite and ban lists.
|
||||
|
||||
ngIRCd 0.10.1 (2006-12-17)
|
||||
|
||||
- Fixed validation of server names containing digits.
|
||||
- Update the "info text" of the local server after re-reading configuration.
|
||||
- Changed Numerics 265 and 266 to follow ircd 2.11.x "standards".
|
||||
- Allow PASS syntax defined in RFC 1459 for server links, too.
|
||||
- Enhanced ISUPPORT message (005 numeric).
|
||||
- New configuration option "PredefChannelsOnly": if set, clients can only
|
||||
join predefined channels.
|
||||
- Code cleanups: use "LogDebug(...)" instead of "Log(LOG_DEBUG, ...)", use
|
||||
"strcspn()", unsigned vs. signed, use "const", fix whitespaces, ...
|
||||
|
||||
ngIRCd 0.10.0 (2006-10-01)
|
||||
|
||||
- Fixed file handle leak when daemon is not able to send MOTD to a client.
|
||||
|
||||
ngIRCd 0.10.0-pre2 (2006-09-09)
|
||||
- Fixed build problems with GCC option -fstack-protector.
|
||||
- Minor documentation updates.
|
||||
|
||||
ngIRCd 0.10.0-pre1 (2006-08-02)
|
||||
- Validate "ServerName" (see RFC 2812, section 2.3.1).
|
||||
- Enhanced DIE to accept a single parameter ("comment text") which is sent
|
||||
to all locally connected clients before the server goes down.
|
||||
- The ngIRCd handles time shifts backwards more gracefully now (the
|
||||
timeout handling doesn't disconnect clients by mistake any more).
|
||||
- Internal: Restructured connection handling (the connection ID is equal
|
||||
to the file descriptor of the connection).
|
||||
- Internal: Simplified resolver code.
|
||||
- JOIN now supports more than one channel key at a time.
|
||||
- Implemented numeric "333": Time and user name who set a channel topic.
|
||||
- Enhanced the handler for PING and PONG commands: fix forwarding and enable
|
||||
back-passing of a client supplied additional argument of PING.
|
||||
- Changed handling of timeouts for unregistered connections: don't reset
|
||||
the counter if data is received and disconnect clients earlier.
|
||||
- Removed unnecessary #define of "LOCAL", now use plain C "static" instead.
|
||||
- Channel topics are no longer limited to 127 characters: now the only limit
|
||||
is the maximum length of an IRC command, i. e. 512 bytes (in practice, this
|
||||
limits the topic to about 490 characters due to protocol overhead).
|
||||
- Reverse DNS lookup code now checks the result by doing an additional
|
||||
lookup to prevent spoofing.
|
||||
- Added new IO layer which (optionally) supports epoll() and kqueue() in
|
||||
addition to the select() interface.
|
||||
|
||||
ngIRCd 0.9.2 (2005-10-15)
|
||||
|
||||
- Fixed a bug that could cause the daemon to crash when outgoing server
|
||||
connections can't be established.
|
||||
- Fixed a bug that caused the daemon to leak file descriptors when no
|
||||
resolver subprocesses could be created.
|
||||
- Fixed server NOTICEs to users with "s" mode ("server messages").
|
||||
- Fixed a format string bug in "connection statistics" messages to clients.
|
||||
|
||||
ngIRCd 0.9.1 (2005-08-03)
|
||||
|
||||
- The KILL command killed much more than desired (including server links!)
|
||||
when the target user is connected to a remote server. Bug introduced in
|
||||
ngIRCd 0.9.0 ... Reported by <qssl@fastmail.fm>, Thanks!
|
||||
- Changed some constants to be "signed" (instead of unsigned) to solve
|
||||
problems with old (pre-ANSI) compilers.
|
||||
|
||||
ngIRCd 0.9.0 (2005-07-24)
|
||||
|
||||
ngIRCd 0.9.0-pre1 (2005-07-09)
|
||||
- Fixed maximum length of user names, now allow up to 9 characters.
|
||||
- Cut off oversized IRC messages that should be sent to the network instead
|
||||
of shutting down the (wrong) connection.
|
||||
- Don't generate error messages for unknown commands received before the
|
||||
client is registered with the server (like the original ircd).
|
||||
- Never run with root privileges but always switch the user ID.
|
||||
- Make "netsplit" messages RFC compliant.
|
||||
- Fix handling of QUIT Messages: send only one message, even if the client
|
||||
is member of multiple channels.
|
||||
- Don't exit server if closing of a socket fails; instead ignore it and
|
||||
pray that this will be "the right thing" ...
|
||||
- Implemented the IRC function "WHOWAS".
|
||||
- Don't enable assert() calls when not ./configure'd with --enable-debug.
|
||||
- Fixed ./configure test for TCP Wrappers: now it runs on Mac OS X as well.
|
||||
- Enhanced configure script: now you can pass an (optional) search path
|
||||
to all --with-XXX parameters, e. g. "--with-ident=/opt/ident".
|
||||
- Removed typedefs for the native C datatypes.
|
||||
Use stdbool.h / inttypes.h if available.
|
||||
- New configuration option "OperServerMode" to enable a workaround needed
|
||||
when running an network with ircd2 servers and "OperCanUseMode" enabled
|
||||
to prevent the ircd2 daemon to drop mode changes of IRC operators.
|
||||
Patch by Florian Westphal, <westphal@foo.fh-furtwangen.de>.
|
||||
- Implemented support for "secret channels" (channel mode "s").
|
||||
- New configuration option "Mask" for [Operator] sections to limit OPER
|
||||
commands to users with a specific IRC mask. Patch from Florian Westphal.
|
||||
- Write "error file" (/tmp/ngircd-XXX.err) only if compiled with debug
|
||||
code ("--enable-debug") and running as daemon process.
|
||||
- Don't create version information string each time a client connects
|
||||
but instead on server startup. By Florian Westphal.
|
||||
- New configuration variable "PidFile", section "[Global]": if defined,
|
||||
the server writes its process ID (PID) to this file. Default: off.
|
||||
Idea of Florian Westphal, <westphal@foo.fh-furtwangen.de>.
|
||||
- Code cleanups from Florian Westphal, <westphal@foo.fh-furtwangen.de>.
|
||||
- Raised the maximum length of passwords to 20 characters.
|
||||
- Fixed a memory leak when resizing the connection pool and realloc()
|
||||
failed. Now we don't fall back to malloc(), which should be sane anyway.
|
||||
Patch from Florian Westphal, <westphal@foo.fh-furtwangen.de>.
|
||||
- Added support for the Howl (http://www.porchdogsoft.com/products/howl/)
|
||||
Rendezvous API, in addition to the API of Apple (Mac OS X). The available
|
||||
API will be autodetected when you call "./configure --with-rendezvous".
|
||||
- Made ngIRCd compile on HP/UX 10.20 with native HP pre-ANSI C compiler and
|
||||
most probably other older C compilers on other systems.
|
||||
- When the daemon should switch to another user ID (ServerID is defined in
|
||||
the configuration file) and is not running in a chroot environment, it
|
||||
changes its working directory to the home directory of this user. This
|
||||
should enable the system to write proper core files when not running with
|
||||
root privileges ...
|
||||
|
||||
ngIRCd 0.8.3 (2005-02-03)
|
||||
|
||||
- Fixed a bug that could case a root exploit when the daemon is compiled
|
||||
to do IDENT lookups and is logging to syslog. Bug discovered by CoKi,
|
||||
<coki@nosystem.com.ar>, thanks a lot!
|
||||
(http://www.nosystem.com.ar/advisories/advisory-11.txt)
|
||||
|
||||
ngIRCd 0.8.2 (2005-01-26)
|
||||
|
||||
- Added doc/SSL.txt to distribution.
|
||||
- Fixed a buffer overflow that could cause the daemon to crash. Bug found
|
||||
by Florian Westphal, <westphal@foo.fh-furtwangen.de>.
|
||||
- Fixed a possible buffer underrun when reading the MOTD file. Thanks
|
||||
to Florian Westphal, <westphal@foo.fh-furtwangen.de>.
|
||||
- Fixed detection of IRC lines which are too long to send. Detected by
|
||||
Florian Westphal, <westphal@foo.fh-furtwangen.de>.
|
||||
- Fixed return values of our own implementation of strlcpy(). The code has
|
||||
been taken from rsync and they fixed it, but we didn't until today :-/
|
||||
It has only been used when the system didn't implement strlcpy by itself,
|
||||
not on "modern" systems. Florian Westphal, <westphal@foo.fh-furtwangen.de>.
|
||||
|
||||
ngIRCd 0.8.1 (2004-12-25)
|
||||
|
||||
- Autoconf: Updated config.guess and config.sub
|
||||
- Added some more debug code ...
|
||||
- Fixed wrong variable names in output of "ngircd --configtest".
|
||||
- Debian: Fixed the name of the "default file" in the init script for
|
||||
ngircd-full packages. And do the test if the binary is executable after
|
||||
reading this file.
|
||||
- Enhanced the "test suite": please have a look at src/testsuite/README!
|
||||
|
||||
ngIRCd 0.8.0 (2004-06-26)
|
||||
|
||||
- Fixed wrong buffer size calculation for results of the resolver.
|
||||
|
||||
ngircd 0.8.0-pre2 (2004-05-16)
|
||||
- Enhanced logging to console when running in "no-detached mode": added
|
||||
PID and log messages of resolver sub-processes.
|
||||
- Fixed host name lookups when using IDENT user lookups.
|
||||
- "make clean" and "make maintainer-clean" remove more files now.
|
||||
|
||||
ngIRCd 0.8.0-pre1 (2004-05-07)
|
||||
- Two new configuration options: "ChrootDir" and "MotdPhrase", thanks to
|
||||
Benjamin Pineau <ben@zouh.org>. Now you can force the daemon to change
|
||||
its root and working directory to something "safe". MotdPhrase is used
|
||||
@@ -521,4 +742,4 @@ ngIRCd 0.0.1, 31.12.2001
|
||||
|
||||
|
||||
--
|
||||
$Id: ChangeLog,v 1.234 2004/05/07 11:19:20 alex Exp $
|
||||
$Id: ChangeLog,v 1.332.2.11 2008/02/26 20:35:05 alex Exp $
|
||||
|
||||
96
INSTALL
96
INSTALL
@@ -1,7 +1,7 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001-2004 by Alexander Barton,
|
||||
(c)2001-2007 Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd is free software and published under the
|
||||
@@ -14,6 +14,18 @@
|
||||
I. Upgrade Information
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Differences to version 0.9.x
|
||||
|
||||
- The option of the configure script to enable support for Zeroconf/Bonjour/
|
||||
Rendezvous/WhateverItIsNamedToday has been renamed:
|
||||
--with-rendezvous -> --with-zeroconf
|
||||
|
||||
Differences to version 0.8.x
|
||||
|
||||
- The maximum length of passwords has been raised to 20 characters (instead
|
||||
of 8 characters). If your passwords are longer than 8 characters then they
|
||||
are cut at an other position now.
|
||||
|
||||
Differences to version 0.6.x
|
||||
|
||||
- Some options of the configure script have been renamed:
|
||||
@@ -46,6 +58,20 @@ files (using a distribution archive or CVS) is as following:
|
||||
3) make
|
||||
4) make install
|
||||
|
||||
(Please see details below!)
|
||||
|
||||
Now the newly compiled executable "ngircd" is installed in its standard
|
||||
location, /usr/local/sbin/.
|
||||
|
||||
The next step is to configure and afterwards starting the daemon. Please
|
||||
have a look at the ngircd(8) and ngircd.conf(5) manual pages for details
|
||||
and all possible options.
|
||||
|
||||
If no previous version of the configuration file exists (the standard name
|
||||
is /usr/local/etc/ngircd.conf), a sample configuration file containing all
|
||||
possible options will be installed there. You'll find its template in the
|
||||
doc/ directory: sample-ngircd.conf.
|
||||
|
||||
|
||||
1): "autogen.sh"
|
||||
|
||||
@@ -101,7 +127,65 @@ This files will be installed by default:
|
||||
- /usr/local/share/doc/ngircd/: documentation
|
||||
|
||||
|
||||
II. Useful make-targets
|
||||
III. Additional features
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The following optional features can be compiled into the daemon by passing
|
||||
options to the "configure" script. Most options can handle a <path> argument
|
||||
which will be used to search for the required libraries and header files in
|
||||
the given paths ("<path>/lib/...", "<path>/include/...") in addition to the
|
||||
standard locations.
|
||||
|
||||
* Syslog Logging (autodetected by default):
|
||||
--with-syslog[=<path>] / --without-syslog
|
||||
|
||||
Enable (disable) support for logging to "syslog", which should be
|
||||
available on most modern UNIX-like operating systems by default.
|
||||
|
||||
* ZLib Compression (autodetected by default):
|
||||
--with-zlib[=<path>] / --without-zlib
|
||||
|
||||
Enable (disable) support for compressed server-server links.
|
||||
The Z compression library ("libz") is required for this option.
|
||||
|
||||
* IO Backend (autodetected by default):
|
||||
--with-select[=<path>] / --without-select
|
||||
--with-poll[=<path>] / --without-poll
|
||||
--with-devpoll[=<path>] / --without-devpoll
|
||||
--with-epoll[=<path>] / --without-epoll
|
||||
--with-kqueue[=<path>] / --without-kqueue
|
||||
|
||||
ngIRCd can use different IO "backends": the "old school" select() and poll()
|
||||
API which should be supported by most UNIX-like operating systems, or the
|
||||
more efficient and flexible epoll() (Linux >=2.6), kqueue() (BSD) and
|
||||
/dev/poll APIs.
|
||||
By default the IO backend is autodetected, but you can use "--without-xxx"
|
||||
to disable a more enhanced API.
|
||||
When using the epoll() API, support for select() is compiled in as well by
|
||||
default to enable the binary to run on older Linux kernels (<2.6), too.
|
||||
|
||||
* IDENT-Support:
|
||||
--with-ident[=<path>]
|
||||
|
||||
Include support for IDENT ("AUTH") lookups. The "ident" library is
|
||||
required for this option.
|
||||
|
||||
* ZeroConf Support:
|
||||
--with-zeroconf[=<path>]
|
||||
|
||||
Compile ngIRCd with support for ZeroConf multicast DNS service registration.
|
||||
Either the Apple ZeroConf implementation (e. g. Mac OS X) or the Howl
|
||||
library is required. Which one is available is autodetected.
|
||||
|
||||
* TCP-Wrappers:
|
||||
--with-tcp-wrappers[=<path>]
|
||||
|
||||
Include support for Wietse Venemas "TCP Wrappers" to limit client access
|
||||
to the daemon, for example by using "/etc/hosts.{allow|deny}".
|
||||
The "libwrap" is required for this option.
|
||||
|
||||
|
||||
IV. Useful make-targets
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The Makefile produced by the configure-script contains always these useful
|
||||
@@ -117,8 +201,8 @@ targets:
|
||||
next step: -> ./autogen.sh
|
||||
|
||||
|
||||
III. Sample configuration file ngircd.conf
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
V. Sample configuration file ngircd.conf
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
In the sample configuration file, there are comments beginning with "#" OR
|
||||
";" -- this is only for the better understanding of the file.
|
||||
@@ -138,7 +222,7 @@ The meaning of the variables in the configuration file is explained in the
|
||||
and in the "ngircd.conf" manual page.
|
||||
|
||||
|
||||
IV. Command line options
|
||||
VI. Command line options
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
These parameters could be passed to the ngIRCd:
|
||||
@@ -163,4 +247,4 @@ number. In both cases the server exits after the output.
|
||||
|
||||
|
||||
--
|
||||
$Id: INSTALL,v 1.19 2004/05/07 11:19:20 alex Exp $
|
||||
$Id: INSTALL,v 1.26 2007/04/08 11:39:08 alex Exp $
|
||||
|
||||
16
Makefile.am
16
Makefile.am
@@ -8,22 +8,34 @@
|
||||
# (at your option) any later version.
|
||||
# Please read the file COPYING, README and AUTHORS for more information.
|
||||
#
|
||||
# $Id: Makefile.am,v 1.14 2004/01/01 22:24:48 alex Exp $
|
||||
# $Id: Makefile.am,v 1.17 2005/07/22 21:01:52 alex Exp $
|
||||
#
|
||||
|
||||
AUTOMAKE_OPTIONS = gnu
|
||||
|
||||
SUBDIRS = doc src man contrib
|
||||
|
||||
clean-local:
|
||||
rm -f build-stamp*
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -rf autom4te.cache
|
||||
rm -f Makefile.in Makefile aclocal.m4 configure
|
||||
rm -f mkinstalldirs missing depcomp install-sh
|
||||
rm -f config.log build-stamp* debian
|
||||
rm -f config.log debian
|
||||
|
||||
lint:
|
||||
make -C src/ngircd lint
|
||||
|
||||
srcdoc:
|
||||
make -C doc srcdoc
|
||||
|
||||
xcode:
|
||||
@xcodebuild -project contrib/MacOSX/ngIRCd.xcode -list >/dev/null 2>&1 \
|
||||
|| ( echo; echo "Error: \"xcodebuild\" not found!"; echo; exit 1 )
|
||||
xcodebuild -project contrib/MacOSX/ngIRCd.xcode -alltargets \
|
||||
-buildstyle Development
|
||||
|
||||
rpm: distcheck
|
||||
rpm -ta ngircd-*.tar.gz
|
||||
|
||||
|
||||
70
NEWS
70
NEWS
@@ -1,7 +1,7 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001-2004 by Alexander Barton,
|
||||
(c)2001-2008 Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd is free software and published under the
|
||||
@@ -10,7 +10,69 @@
|
||||
-- NEWS --
|
||||
|
||||
|
||||
ngIRCd CVSHEAD
|
||||
ngIRCd 0.11.0 (2008-01-15)
|
||||
|
||||
- Add support for /STAT u (server uptime) command.
|
||||
- New [Server] configuration Option "Bind" allows to specify
|
||||
the source ip adress to use when connecting to remote server.
|
||||
- New configuration option "MaxNickLength" to specify the allowed maximum
|
||||
length of user nick names. Note: must be unique in an IRC network!
|
||||
- Numeric 317: implemented "signon time" (displayed in WHOIS result).
|
||||
- Added new server configuration option "Passive" for "Server" blocks to
|
||||
disable automatic outgoing connections (similar to -p option to ngircd,
|
||||
but only for the specified server). (Tassilo Schweyer)
|
||||
- Added support for the WALLOPS command. Usage is restricted to IRC
|
||||
operators.
|
||||
|
||||
ngIRCd 0.10.2 (2007-06-08)
|
||||
|
||||
- Predefined channel configuration now allows specification of channel key
|
||||
(mode k) and maximum user count (mode l): variables "Key" and "MaxUsers".
|
||||
- When using the epoll() IO interface, compile in the select() interface as
|
||||
well and fall back to it when epoll() isn't available on runtime.
|
||||
- Added support for IO APIs "poll()" and "/dev/poll".
|
||||
|
||||
ngIRCd 0.10.1 (2006-12-17)
|
||||
|
||||
- Allow PASS syntax defined in RFC 1459 for server links, too.
|
||||
- New configuration option "PredefChannelsOnly": if set, clients can only
|
||||
join predefined channels.
|
||||
|
||||
ngIRCd 0.10.0 (2006-10-01)
|
||||
|
||||
ngIRCd 0.10.0-pre1 (2006-08-02)
|
||||
- Enhanced DIE to accept a single parameter ("comment text") which is sent
|
||||
to all locally connected clients before the server goes down.
|
||||
- JOIN now supports more than one channel key at a time.
|
||||
- Implemented numeric "333": Time and user name who set a channel topic.
|
||||
- Channel topics are no longer limited to 127 characters: now the only limit
|
||||
is the maximum length of an IRC command, i. e. 512 bytes (in practice, this
|
||||
limits the topic to about 490 characters due to protocol overhead).
|
||||
- Reverse DNS lookup code now checks the result by doing an additional
|
||||
lookup to prevent spoofing.
|
||||
- Added new IO layer which (optionally) supports epoll() and kqueue() in
|
||||
addition to the select() interface.
|
||||
|
||||
ngIRCd 0.9.0 (2005-07-24)
|
||||
|
||||
- Never run with root privileges but always switch the user ID.
|
||||
- Make "netsplit" messages RFC compliant.
|
||||
- Implemented the IRC function "WHOWAS".
|
||||
- New configuration option "OperServerMode" to enable a workaround needed
|
||||
when running an network with ircd2 servers and "OperCanUseMode" enabled
|
||||
to prevent the ircd2 daemon to drop mode changes of IRC operators.
|
||||
Patch by Florian Westphal, <westphal@foo.fh-furtwangen.de>.
|
||||
- Implemented support for "secret channels" (channel mode "s").
|
||||
- New configuration option "Mask" for [Operator] sections to limit OPER
|
||||
commands to users with a specific IRC mask. Patch from Florian Westphal.
|
||||
- New configuration variable "PidFile", section "[Global]": if defined,
|
||||
the server writes its process ID (PID) to this file. Default: off.
|
||||
Idea of Florian Westphal, <westphal@foo.fh-furtwangen.de>.
|
||||
- Added support for the Howl (http://www.porchdogsoft.com/products/howl/)
|
||||
Rendezvous API, in addition to the API of Apple (Mac OS X). The available
|
||||
API will be autodetected when you call "./configure --with-rendezvous".
|
||||
|
||||
ngIRCd 0.8.0 (2004-06-26)
|
||||
|
||||
- Two new configuration options: "ChrootDir" and "MotdPhrase", thanks to
|
||||
Benjamin Pineau <ben@zouh.org>. Now you can force the daemon to change
|
||||
@@ -52,7 +114,7 @@ ngIRCd 0.7.0 (2003-05-01)
|
||||
- Added support for TCP Wrappers library: pass "--with-tcp-wrappers" to
|
||||
configure to enable it.
|
||||
- Changed some configure options to use "--with"/"--without" as prefix
|
||||
insetead of "--enable"/"--disable": "--without-syslog", "--without-zlib",
|
||||
instead of "--enable"/"--disable": "--without-syslog", "--without-zlib",
|
||||
"--with-tcp-wrappers", and "--with-rendezvous".
|
||||
- Enhanced manual pages ngircd(8) and ngircd.conf(5).
|
||||
- Documentation is now installed in $(datadir)/doc/ngircd.
|
||||
@@ -189,4 +251,4 @@ ngIRCd 0.0.1, 31.12.2001
|
||||
|
||||
|
||||
--
|
||||
$Id: NEWS,v 1.65 2004/05/07 11:19:20 alex Exp $
|
||||
$Id: NEWS,v 1.83.2.4 2008/02/26 19:22:07 alex Exp $
|
||||
|
||||
46
README
46
README
@@ -1,39 +1,44 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001-2004 by Alexander Barton,
|
||||
(c)2001-2007 Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd is free software and published under the
|
||||
terms of the GNU General Public License.
|
||||
|
||||
-- README --
|
||||
|
||||
Ilja Osthoff, <ilja@glide.ath.cx>
|
||||
|
||||
|
||||
I. Introduction
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
ngIRCd is an Open-Source server for the Internet Relay Chat (IRC), which
|
||||
ngIRCd is an Open Source server for the Internet Relay Chat (IRC), which
|
||||
is developed and published under the terms of the GNU General Public
|
||||
Licence (URL: http://www.gnu.org/licenses/gpl.html). ngIRCd means "next
|
||||
generation IRC daemon", it's written from scratch and not deduced from the
|
||||
"grandfather of IRC daemons", the daemon of the IRCNet.
|
||||
|
||||
Please see the INSTALL document for installation and upgrade information!
|
||||
|
||||
|
||||
II. Status
|
||||
~~~~~~~~~~~
|
||||
|
||||
At present, the ngIRCd is under active development, some features are not
|
||||
implemented, some only partly.
|
||||
It is not the goal of ngIRCd to implement all the nasty behaviours of the
|
||||
original ircd, but to implement most of the useful commands and semantics
|
||||
specified by the RFCs.
|
||||
|
||||
Till today (more or less complete) implemented IRC-commands:
|
||||
In the meantime ngIRCd should be quite feature complete and stable to be
|
||||
used in real IRC networks.
|
||||
|
||||
Implemented IRC-commands are:
|
||||
|
||||
ADMIN, AWAY, CHANINFO, CONNECT, DIE, DISCONNECT, ERROR, HELP, INVITE, ISON,
|
||||
JOIN, KICK, KILL, LINKS, LIST, LUSERS, MODE, MOTD, NAMES, NICK, NJOIN,
|
||||
NOTICE, OPER, PART, PASS, PING, PONG, PRIVMSG, QUIT, REHASH, RESTART, SERVER,
|
||||
SQUIT, STATS, TIME, TOPIC, TRACE, USER, USERHOST, VERSION, WHO, WHOIS.
|
||||
JOIN, KICK, KILL, LINKS, LIST, LUSERS, MODE, MOTD, NAMES, NICK, NJOIN, NOTICE,
|
||||
OPER, PART, PASS, PING, PONG, PRIVMSG, QUIT, REHASH, RESTART, SERVER, SQUIT,
|
||||
STATS, TIME, TOPIC, TRACE, USER, USERHOST, VERSION, WALLOPS, WHO, WHOIS,
|
||||
WHOWAS.
|
||||
|
||||
|
||||
III. Features (or: why use ngIRCd?)
|
||||
@@ -43,25 +48,23 @@ III. Features (or: why use ngIRCd?)
|
||||
- simple, easy understandable configuration file,
|
||||
- freely published open-source C source code,
|
||||
- ngIRCd will be developed on in the future.
|
||||
- supported platforms (tested versions): AIX (3.2.5), A/UX (3.0.1), FreeBSD
|
||||
(4.5), HP-UX (10.20), IRIX (6.5), Linux (2.x), Mac OS X (10.x), NetBSD
|
||||
(1.5.2/i386, 1.5.3/m68k), Solaris (2.5.1, 2.6), Windows with Cygwin, and
|
||||
OpenBSD (3.4/i386).
|
||||
- wide field of supported platforms, including AIX, A/UX, FreeBSD, HP-UX,
|
||||
IRIX, Linux, Mac OS X, NetBSD, OpenBSD, Solaris, and Windows with Cygwin.
|
||||
|
||||
|
||||
IV. Documentation
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
More documentation can be found in the "doc/" directory and the homepage of
|
||||
the ngIRCd: <http://arthur.ath.cx/~alex/ngircd/>.
|
||||
the ngIRCd: <http://ngircd.barton.de/>.
|
||||
|
||||
|
||||
V. Download
|
||||
~~~~~~~~~~~
|
||||
|
||||
The homepage of the ngIRCd is: <http://arthur.ath.cx/~alex/ngircd>; you
|
||||
will find the newest information about the ngIRCd and the most recent
|
||||
("stable") releases there.
|
||||
The homepage of the ngIRCd is: <http://ngircd.barton.de/>; you will find
|
||||
the newest information about the ngIRCd and the most recent ("stable")
|
||||
releases there.
|
||||
|
||||
If you are interested in the latest development versions (which are not
|
||||
always stable), then please read the section "CVS" on the homepage and
|
||||
@@ -75,13 +78,14 @@ VI. Bugs
|
||||
If you find bugs in the ngIRCd (which might be there :-), please report
|
||||
them at the following URL:
|
||||
|
||||
<http://arthur.ath.cx/~alex/ngircd/#bugs>
|
||||
<http://ngircd.barton.de/#bugs>
|
||||
|
||||
There you can read about known bugs and limitations, too.
|
||||
|
||||
If you have critics, patches or something else, please feel free to post a
|
||||
mail to: <alex@barton.de> or <alex@arthur.ath.cx>
|
||||
mail to the ngIRCd mailing list: <ngircd-ml@arthur.ath.cx> (please see
|
||||
<http://ngircd.barton.de/#ml> for details).
|
||||
|
||||
|
||||
--
|
||||
$Id: README,v 1.19 2004/05/07 11:19:20 alex Exp $
|
||||
$Id: README,v 1.25 2007/10/04 15:18:48 alex Exp $
|
||||
|
||||
23
autogen.sh
23
autogen.sh
@@ -9,7 +9,7 @@
|
||||
# (at your option) any later version.
|
||||
# Please read the file COPYING, README and AUTHORS for more information.
|
||||
#
|
||||
# $Id: autogen.sh,v 1.12 2004/04/05 12:02:21 alex Exp $
|
||||
# $Id: autogen.sh,v 1.15 2007/10/07 13:02:15 alex Exp $
|
||||
#
|
||||
|
||||
#
|
||||
@@ -85,7 +85,7 @@ Search()
|
||||
fi
|
||||
$EXIST "${name}-${major}.${minor}" >/dev/null 2>&1
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "${name}-${major}.${minor}" >/dev/null 2>&1
|
||||
echo "${name}-${major}.${minor}"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
@@ -124,13 +124,22 @@ if [ -z "$EXIST" ]; then
|
||||
fi
|
||||
[ "$VERBOSE" = "1" ] && echo "Using \"$EXIST\" to test for tools."
|
||||
|
||||
# We want to use GNU automake 1.7, if available (WANT_AUTOMAKE is used by
|
||||
# the wrapper scripts of Gentoo Linux):
|
||||
WANT_AUTOMAKE=1.7
|
||||
export WANT_AUTOMAKE
|
||||
# We want to use GNU automake 1.9, if available (WANT_AUTOMAKE is used by
|
||||
# the wrapper scripts of Gentoo Linux, AUTOMAKE_VERSION is used by OpenBSD);
|
||||
# same applies for GNU autoconf, we want to use version 2.59. -- But only
|
||||
# set these preferences if not already set!
|
||||
if [ -z "$AUTOMAKE_VERSION" -a -z "$WANT_AUTOMAKE" ]; then
|
||||
AUTOMAKE_VERSION=1.9
|
||||
WANT_AUTOMAKE=1.9
|
||||
fi
|
||||
if [ -z "$AUTOCONF_VERSION" -a -z "$WANT_AUTOCONF" ]; then
|
||||
AUTOCONF_VERSION=2.59
|
||||
WANT_AUTOCONF=2.59
|
||||
fi
|
||||
export AUTOMAKE_VERSION WANT_AUTOMAKE AUTOCONF_VERSION WANT_AUTOCONF
|
||||
|
||||
# Try to detect the needed tools when no environment variable already
|
||||
# spezifies one:
|
||||
# specifies one:
|
||||
echo "Searching tools ..."
|
||||
[ -z "$ACLOCAL" ] && ACLOCAL=`Search aclocal 1`
|
||||
[ "$VERBOSE" = "1" ] && echo "ACLOCAL=$ACLOCAL"
|
||||
|
||||
664
config.guess
vendored
664
config.guess
vendored
File diff suppressed because it is too large
Load Diff
199
config.sub
vendored
199
config.sub
vendored
@@ -1,9 +1,10 @@
|
||||
#! /bin/sh
|
||||
# Configuration validation subroutine script.
|
||||
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
||||
# 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
|
||||
# Inc.
|
||||
|
||||
timestamp='2004-01-05'
|
||||
timestamp='2007-01-18'
|
||||
|
||||
# This file is (in principle) common to ALL GNU software.
|
||||
# The presence of a machine in this file suggests that SOME GNU software
|
||||
@@ -21,14 +22,15 @@ timestamp='2004-01-05'
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
# Boston, MA 02111-1307, USA.
|
||||
|
||||
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
|
||||
# 02110-1301, USA.
|
||||
#
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
|
||||
|
||||
# Please send patches to <config-patches@gnu.org>. Submit a context
|
||||
# diff and a properly formatted ChangeLog entry.
|
||||
#
|
||||
@@ -70,7 +72,7 @@ Report bugs and patches to <config-patches@gnu.org>."
|
||||
version="\
|
||||
GNU config.sub ($timestamp)
|
||||
|
||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
|
||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This is free software; see the source for copying conditions. There is NO
|
||||
@@ -83,11 +85,11 @@ Try \`$me --help' for more information."
|
||||
while test $# -gt 0 ; do
|
||||
case $1 in
|
||||
--time-stamp | --time* | -t )
|
||||
echo "$timestamp" ; exit 0 ;;
|
||||
echo "$timestamp" ; exit ;;
|
||||
--version | -v )
|
||||
echo "$version" ; exit 0 ;;
|
||||
echo "$version" ; exit ;;
|
||||
--help | --h* | -h )
|
||||
echo "$usage"; exit 0 ;;
|
||||
echo "$usage"; exit ;;
|
||||
-- ) # Stop option processing
|
||||
shift; break ;;
|
||||
- ) # Use stdin as input.
|
||||
@@ -99,7 +101,7 @@ while test $# -gt 0 ; do
|
||||
*local*)
|
||||
# First pass through any local machine types.
|
||||
echo $1
|
||||
exit 0;;
|
||||
exit ;;
|
||||
|
||||
* )
|
||||
break ;;
|
||||
@@ -118,8 +120,9 @@ esac
|
||||
# Here we must recognize all the valid KERNEL-OS combinations.
|
||||
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
|
||||
case $maybe_os in
|
||||
nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \
|
||||
kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
|
||||
nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
|
||||
uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
|
||||
storm-chaos* | os2-emx* | rtmk-nova*)
|
||||
os=-$maybe_os
|
||||
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
|
||||
;;
|
||||
@@ -145,7 +148,7 @@ case $os in
|
||||
-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
|
||||
-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
|
||||
-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
|
||||
-apple | -axis)
|
||||
-apple | -axis | -knuth | -cray)
|
||||
os=
|
||||
basic_machine=$1
|
||||
;;
|
||||
@@ -170,6 +173,10 @@ case $os in
|
||||
-hiux*)
|
||||
os=-hiuxwe2
|
||||
;;
|
||||
-sco6)
|
||||
os=-sco5v6
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||
;;
|
||||
-sco5)
|
||||
os=-sco3.2v5
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||
@@ -186,6 +193,10 @@ case $os in
|
||||
# Don't forget version if it is 3.2v4 or newer.
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||
;;
|
||||
-sco5v6*)
|
||||
# Don't forget version if it is 3.2v4 or newer.
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||
;;
|
||||
-sco*)
|
||||
os=-sco3.2v2
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||
@@ -230,14 +241,16 @@ case $basic_machine in
|
||||
| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
|
||||
| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
|
||||
| am33_2.0 \
|
||||
| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
|
||||
| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
|
||||
| bfin \
|
||||
| c4x | clipper \
|
||||
| d10v | d30v | dlx | dsp16xx \
|
||||
| fr30 | frv \
|
||||
| fido | fr30 | frv \
|
||||
| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
|
||||
| i370 | i860 | i960 | ia64 \
|
||||
| ip2k | iq2000 \
|
||||
| m32r | m68000 | m68k | m88k | mcore \
|
||||
| m32c | m32r | m32rle | m68000 | m68k | m88k \
|
||||
| maxq | mb | microblaze | mcore | mep \
|
||||
| mips | mipsbe | mipseb | mipsel | mipsle \
|
||||
| mips16 \
|
||||
| mips64 | mips64el \
|
||||
@@ -246,6 +259,7 @@ case $basic_machine in
|
||||
| mips64vr4100 | mips64vr4100el \
|
||||
| mips64vr4300 | mips64vr4300el \
|
||||
| mips64vr5000 | mips64vr5000el \
|
||||
| mips64vr5900 | mips64vr5900el \
|
||||
| mipsisa32 | mipsisa32el \
|
||||
| mipsisa32r2 | mipsisa32r2el \
|
||||
| mipsisa64 | mipsisa64el \
|
||||
@@ -254,20 +268,24 @@ case $basic_machine in
|
||||
| mipsisa64sr71k | mipsisa64sr71kel \
|
||||
| mipstx39 | mipstx39el \
|
||||
| mn10200 | mn10300 \
|
||||
| mt \
|
||||
| msp430 \
|
||||
| nios | nios2 \
|
||||
| ns16k | ns32k \
|
||||
| openrisc | or32 \
|
||||
| or32 \
|
||||
| pdp10 | pdp11 | pj | pjl \
|
||||
| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
|
||||
| pyramid \
|
||||
| sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
|
||||
| score \
|
||||
| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
|
||||
| sh64 | sh64le \
|
||||
| sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \
|
||||
| strongarm \
|
||||
| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
|
||||
| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
|
||||
| spu | strongarm \
|
||||
| tahoe | thumb | tic4x | tic80 | tron \
|
||||
| v850 | v850e \
|
||||
| we32k \
|
||||
| x86 | xscale | xstormy16 | xtensa \
|
||||
| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
|
||||
| z8k)
|
||||
basic_machine=$basic_machine-unknown
|
||||
;;
|
||||
@@ -278,6 +296,9 @@ case $basic_machine in
|
||||
;;
|
||||
m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
|
||||
;;
|
||||
ms1)
|
||||
basic_machine=mt-unknown
|
||||
;;
|
||||
|
||||
# We use `pc' rather than `unknown'
|
||||
# because (1) that's what they normally are, and
|
||||
@@ -297,20 +318,20 @@ case $basic_machine in
|
||||
| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
|
||||
| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
|
||||
| arm-* | armbe-* | armle-* | armeb-* | armv*-* \
|
||||
| avr-* \
|
||||
| bs2000-* \
|
||||
| avr-* | avr32-* \
|
||||
| bfin-* | bs2000-* \
|
||||
| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
|
||||
| clipper-* | cydra-* \
|
||||
| clipper-* | craynv-* | cydra-* \
|
||||
| d10v-* | d30v-* | dlx-* \
|
||||
| elxsi-* \
|
||||
| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
|
||||
| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
|
||||
| h8300-* | h8500-* \
|
||||
| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
|
||||
| i*86-* | i860-* | i960-* | ia64-* \
|
||||
| ip2k-* | iq2000-* \
|
||||
| m32r-* \
|
||||
| m32c-* | m32r-* | m32rle-* \
|
||||
| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
|
||||
| m88110-* | m88k-* | mcore-* \
|
||||
| m88110-* | m88k-* | maxq-* | mcore-* \
|
||||
| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
|
||||
| mips16-* \
|
||||
| mips64-* | mips64el-* \
|
||||
@@ -319,6 +340,7 @@ case $basic_machine in
|
||||
| mips64vr4100-* | mips64vr4100el-* \
|
||||
| mips64vr4300-* | mips64vr4300el-* \
|
||||
| mips64vr5000-* | mips64vr5000el-* \
|
||||
| mips64vr5900-* | mips64vr5900el-* \
|
||||
| mipsisa32-* | mipsisa32el-* \
|
||||
| mipsisa32r2-* | mipsisa32r2el-* \
|
||||
| mipsisa64-* | mipsisa64el-* \
|
||||
@@ -326,24 +348,28 @@ case $basic_machine in
|
||||
| mipsisa64sb1-* | mipsisa64sb1el-* \
|
||||
| mipsisa64sr71k-* | mipsisa64sr71kel-* \
|
||||
| mipstx39-* | mipstx39el-* \
|
||||
| mmix-* \
|
||||
| mt-* \
|
||||
| msp430-* \
|
||||
| none-* | np1-* | nv1-* | ns16k-* | ns32k-* \
|
||||
| nios-* | nios2-* \
|
||||
| none-* | np1-* | ns16k-* | ns32k-* \
|
||||
| orion-* \
|
||||
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
|
||||
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
|
||||
| pyramid-* \
|
||||
| romp-* | rs6000-* \
|
||||
| sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \
|
||||
| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
|
||||
| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
|
||||
| sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \
|
||||
| sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
|
||||
| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
|
||||
| sparclite-* \
|
||||
| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
|
||||
| tahoe-* | thumb-* \
|
||||
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
|
||||
| tron-* \
|
||||
| v850-* | v850e-* | vax-* \
|
||||
| we32k-* \
|
||||
| x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \
|
||||
| xtensa-* \
|
||||
| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
|
||||
| xstormy16-* | xtensa-* \
|
||||
| ymp-* \
|
||||
| z8k-*)
|
||||
;;
|
||||
@@ -363,6 +389,9 @@ case $basic_machine in
|
||||
basic_machine=a29k-amd
|
||||
os=-udi
|
||||
;;
|
||||
abacus)
|
||||
basic_machine=abacus-unknown
|
||||
;;
|
||||
adobe68k)
|
||||
basic_machine=m68010-adobe
|
||||
os=-scout
|
||||
@@ -442,12 +471,27 @@ case $basic_machine in
|
||||
basic_machine=j90-cray
|
||||
os=-unicos
|
||||
;;
|
||||
craynv)
|
||||
basic_machine=craynv-cray
|
||||
os=-unicosmp
|
||||
;;
|
||||
cr16c)
|
||||
basic_machine=cr16c-unknown
|
||||
os=-elf
|
||||
;;
|
||||
crds | unos)
|
||||
basic_machine=m68k-crds
|
||||
;;
|
||||
crisv32 | crisv32-* | etraxfs*)
|
||||
basic_machine=crisv32-axis
|
||||
;;
|
||||
cris | cris-* | etrax*)
|
||||
basic_machine=cris-axis
|
||||
;;
|
||||
crx)
|
||||
basic_machine=crx-unknown
|
||||
os=-elf
|
||||
;;
|
||||
da30 | da30-*)
|
||||
basic_machine=m68k-da30
|
||||
;;
|
||||
@@ -470,6 +514,10 @@ case $basic_machine in
|
||||
basic_machine=m88k-motorola
|
||||
os=-sysv3
|
||||
;;
|
||||
djgpp)
|
||||
basic_machine=i586-pc
|
||||
os=-msdosdjgpp
|
||||
;;
|
||||
dpx20 | dpx20-*)
|
||||
basic_machine=rs6000-bull
|
||||
os=-bosx
|
||||
@@ -648,10 +696,6 @@ case $basic_machine in
|
||||
mips3*)
|
||||
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
|
||||
;;
|
||||
mmix*)
|
||||
basic_machine=mmix-knuth
|
||||
os=-mmixware
|
||||
;;
|
||||
monitor)
|
||||
basic_machine=m68k-rom68k
|
||||
os=-coff
|
||||
@@ -664,6 +708,9 @@ case $basic_machine in
|
||||
basic_machine=i386-pc
|
||||
os=-msdos
|
||||
;;
|
||||
ms1-*)
|
||||
basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
|
||||
;;
|
||||
mvs)
|
||||
basic_machine=i370-ibm
|
||||
os=-mvs
|
||||
@@ -732,10 +779,6 @@ case $basic_machine in
|
||||
np1)
|
||||
basic_machine=np1-gould
|
||||
;;
|
||||
nv1)
|
||||
basic_machine=nv1-cray
|
||||
os=-unicosmp
|
||||
;;
|
||||
nsr-tandem)
|
||||
basic_machine=nsr-tandem
|
||||
;;
|
||||
@@ -743,9 +786,8 @@ case $basic_machine in
|
||||
basic_machine=hppa1.1-oki
|
||||
os=-proelf
|
||||
;;
|
||||
or32 | or32-*)
|
||||
openrisc | openrisc-*)
|
||||
basic_machine=or32-unknown
|
||||
os=-coff
|
||||
;;
|
||||
os400)
|
||||
basic_machine=powerpc-ibm
|
||||
@@ -776,6 +818,12 @@ case $basic_machine in
|
||||
pc532 | pc532-*)
|
||||
basic_machine=ns32k-pc532
|
||||
;;
|
||||
pc98)
|
||||
basic_machine=i386-pc
|
||||
;;
|
||||
pc98-*)
|
||||
basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
pentium | p5 | k5 | k6 | nexgen | viac3)
|
||||
basic_machine=i586-pc
|
||||
;;
|
||||
@@ -832,6 +880,10 @@ case $basic_machine in
|
||||
basic_machine=i586-unknown
|
||||
os=-pw32
|
||||
;;
|
||||
rdos)
|
||||
basic_machine=i386-pc
|
||||
os=-rdos
|
||||
;;
|
||||
rom68k)
|
||||
basic_machine=m68k-rom68k
|
||||
os=-coff
|
||||
@@ -858,6 +910,10 @@ case $basic_machine in
|
||||
sb1el)
|
||||
basic_machine=mipsisa64sb1el-unknown
|
||||
;;
|
||||
sde)
|
||||
basic_machine=mipsisa32-sde
|
||||
os=-elf
|
||||
;;
|
||||
sei)
|
||||
basic_machine=mips-sei
|
||||
os=-seiux
|
||||
@@ -869,6 +925,9 @@ case $basic_machine in
|
||||
basic_machine=sh-hitachi
|
||||
os=-hms
|
||||
;;
|
||||
sh5el)
|
||||
basic_machine=sh5le-unknown
|
||||
;;
|
||||
sh64)
|
||||
basic_machine=sh64-unknown
|
||||
;;
|
||||
@@ -1018,6 +1077,10 @@ case $basic_machine in
|
||||
basic_machine=hppa1.1-winbond
|
||||
os=-proelf
|
||||
;;
|
||||
xbox)
|
||||
basic_machine=i686-pc
|
||||
os=-mingw32
|
||||
;;
|
||||
xps | xps100)
|
||||
basic_machine=xps100-honeywell
|
||||
;;
|
||||
@@ -1048,6 +1111,9 @@ case $basic_machine in
|
||||
romp)
|
||||
basic_machine=romp-ibm
|
||||
;;
|
||||
mmix)
|
||||
basic_machine=mmix-knuth
|
||||
;;
|
||||
rs6000)
|
||||
basic_machine=rs6000-ibm
|
||||
;;
|
||||
@@ -1064,13 +1130,10 @@ case $basic_machine in
|
||||
we32k)
|
||||
basic_machine=we32k-att
|
||||
;;
|
||||
sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele)
|
||||
sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
|
||||
basic_machine=sh-unknown
|
||||
;;
|
||||
sh64)
|
||||
basic_machine=sh64-unknown
|
||||
;;
|
||||
sparc | sparcv9 | sparcv9b)
|
||||
sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
|
||||
basic_machine=sparc-sun
|
||||
;;
|
||||
cydra)
|
||||
@@ -1143,19 +1206,23 @@ case $os in
|
||||
| -aos* \
|
||||
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
|
||||
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
|
||||
| -hiux* | -386bsd* | -knetbsd* | -netbsd* | -openbsd* | -kfreebsd* | -freebsd* | -riscix* \
|
||||
| -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
|
||||
| -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
|
||||
| -openbsd* | -solidbsd* \
|
||||
| -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
|
||||
| -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
|
||||
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
|
||||
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
|
||||
| -chorusos* | -chorusrdb* \
|
||||
| -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
|
||||
| -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \
|
||||
| -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
|
||||
| -uxpv* | -beos* | -mpeix* | -udk* \
|
||||
| -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
|
||||
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
|
||||
| -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
|
||||
| -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
|
||||
| -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
|
||||
| -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*)
|
||||
| -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
|
||||
| -skyos* | -haiku* | -rdos* | -toppers* | -drops*)
|
||||
# Remember, each alternative MUST END IN *, to match a version number.
|
||||
;;
|
||||
-qnx*)
|
||||
@@ -1173,7 +1240,7 @@ case $os in
|
||||
os=`echo $os | sed -e 's|nto|nto-qnx|'`
|
||||
;;
|
||||
-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
|
||||
| -windows* | -osx | -abug | -netware* | -os9* | -beos* \
|
||||
| -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
|
||||
| -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
|
||||
;;
|
||||
-mac*)
|
||||
@@ -1282,6 +1349,9 @@ case $os in
|
||||
-kaos*)
|
||||
os=-kaos
|
||||
;;
|
||||
-zvmoe)
|
||||
os=-zvmoe
|
||||
;;
|
||||
-none)
|
||||
;;
|
||||
*)
|
||||
@@ -1304,6 +1374,12 @@ else
|
||||
# system, and we'll never get to this point.
|
||||
|
||||
case $basic_machine in
|
||||
score-*)
|
||||
os=-elf
|
||||
;;
|
||||
spu-*)
|
||||
os=-elf
|
||||
;;
|
||||
*-acorn)
|
||||
os=-riscix1.2
|
||||
;;
|
||||
@@ -1313,9 +1389,9 @@ case $basic_machine in
|
||||
arm*-semi)
|
||||
os=-aout
|
||||
;;
|
||||
c4x-* | tic4x-*)
|
||||
os=-coff
|
||||
;;
|
||||
c4x-* | tic4x-*)
|
||||
os=-coff
|
||||
;;
|
||||
# This must come before the *-dec entry.
|
||||
pdp10-*)
|
||||
os=-tops20
|
||||
@@ -1341,6 +1417,9 @@ case $basic_machine in
|
||||
m68*-cisco)
|
||||
os=-aout
|
||||
;;
|
||||
mep-*)
|
||||
os=-elf
|
||||
;;
|
||||
mips*-cisco)
|
||||
os=-elf
|
||||
;;
|
||||
@@ -1359,9 +1438,15 @@ case $basic_machine in
|
||||
*-be)
|
||||
os=-beos
|
||||
;;
|
||||
*-haiku)
|
||||
os=-haiku
|
||||
;;
|
||||
*-ibm)
|
||||
os=-aix
|
||||
;;
|
||||
*-knuth)
|
||||
os=-mmixware
|
||||
;;
|
||||
*-wec)
|
||||
os=-proelf
|
||||
;;
|
||||
@@ -1527,7 +1612,7 @@ case $basic_machine in
|
||||
esac
|
||||
|
||||
echo $basic_machine$os
|
||||
exit 0
|
||||
exit
|
||||
|
||||
# Local variables:
|
||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||
|
||||
308
configure.in
308
configure.in
@@ -1,6 +1,6 @@
|
||||
#
|
||||
# ngIRCd -- The Next Generation IRC Daemon
|
||||
# Copyright (c)2001-2004 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
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
@@ -8,13 +8,13 @@
|
||||
# (at your option) any later version.
|
||||
# Please read the file COPYING, README and AUTHORS for more information.
|
||||
#
|
||||
# $Id: configure.in,v 1.102 2004/04/11 13:20:24 alex Exp $
|
||||
# $Id: configure.in,v 1.125.2.4 2008/02/26 19:37:34 alex Exp $
|
||||
#
|
||||
|
||||
# -- Initialisation --
|
||||
|
||||
AC_PREREQ(2.50)
|
||||
AC_INIT(ngircd, CVSHEAD)
|
||||
AC_INIT(ngircd, 0.11.1)
|
||||
AC_CONFIG_SRCDIR(src/ngircd/ngircd.c)
|
||||
AC_CANONICAL_TARGET
|
||||
AM_INIT_AUTOMAKE(1.6)
|
||||
@@ -30,7 +30,7 @@ AH_TEMPLATE([SYSLOG], [Define if syslog should be used for logging])
|
||||
AH_TEMPLATE([ZLIB], [Define if zlib compression should be enabled])
|
||||
AH_TEMPLATE([TCPWRAP], [Define if TCP wrappers should be used])
|
||||
AH_TEMPLATE([IRCPLUS], [Define if IRC+ protocol should be used])
|
||||
AH_TEMPLATE([RENDEZVOUS], [Define if Rendezvous support should be included])
|
||||
AH_TEMPLATE([ZEROCONF], [Define if support for Zeroconf should be included])
|
||||
AH_TEMPLATE([IDENTAUTH], [Define if the server should do IDENT requests])
|
||||
|
||||
AH_TEMPLATE([TARGET_OS], [Target operating system name])
|
||||
@@ -53,12 +53,31 @@ AC_PROG_RANLIB
|
||||
|
||||
AM_C_PROTOTYPES
|
||||
AC_C_CONST
|
||||
AC_C_INLINE
|
||||
|
||||
# -- Hard coded system and compiler dependencies/features/options ... --
|
||||
|
||||
AC_DEFUN([GCC_STACK_PROTECT_CC],[
|
||||
ssp_cc=yes
|
||||
# we use -fstack-protector-all for the test to enfoce the use of the guard variable
|
||||
AC_MSG_CHECKING([whether ${CC} accepts -fstack-protector])
|
||||
ssp_old_cflags="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -fstack-protector-all"
|
||||
AC_TRY_LINK(,,, ssp_cc=no)
|
||||
echo $ssp_cc
|
||||
CFLAGS="$ssp_old_cflags"
|
||||
if test "X$ssp_cc" = "Xyes"; then
|
||||
CFLAGS="$CFLAGS -fstack-protector"
|
||||
AC_DEFINE([ENABLE_SSP_CC], 1, [Define if SSP C support is enabled.])
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
if test "$GCC" = "yes"; then
|
||||
# We are using the GNU C compiler. Good!
|
||||
CFLAGS="$CFLAGS -pipe -W -Wall -Wpointer-arith -Wstrict-prototypes"
|
||||
|
||||
GCC_STACK_PROTECT_CC
|
||||
fi
|
||||
|
||||
case "$target_os" in
|
||||
@@ -85,14 +104,14 @@ AC_CHECK_HEADERS([ \
|
||||
strings.h sys/socket.h sys/time.h unistd.h \
|
||||
],,AC_MSG_ERROR([required C header missing!]))
|
||||
|
||||
AC_CHECK_HEADERS([arpa/inet.h ctype.h malloc.h stdint.h varargs.h])
|
||||
AC_CHECK_HEADERS([arpa/inet.h ctype.h malloc.h stdbool.h stddef.h varargs.h])
|
||||
|
||||
# -- Datatypes --
|
||||
|
||||
AC_MSG_CHECKING(whether socklen_t exists)
|
||||
AC_TRY_COMPILE([
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
],[
|
||||
socklen_t a, b;
|
||||
a = 2; b = 4; a += b;
|
||||
@@ -105,6 +124,7 @@ AC_TRY_COMPILE([
|
||||
AC_TYPE_SIGNAL
|
||||
AC_TYPE_SIZE_T
|
||||
|
||||
|
||||
# -- Libraries --
|
||||
|
||||
AC_CHECK_LIB(UTIL,memmove)
|
||||
@@ -118,21 +138,24 @@ AC_FUNC_STRFTIME
|
||||
|
||||
AC_CHECK_FUNCS([ \
|
||||
bind gethostbyaddr gethostbyname gethostname inet_ntoa malloc memmove \
|
||||
memset realloc setsid setsockopt socket strcasecmp strchr strerror \
|
||||
memset realloc setsid setsockopt socket strcasecmp strchr strcspn strerror \
|
||||
strstr waitpid],,AC_MSG_ERROR([required function missing!]))
|
||||
|
||||
AC_CHECK_FUNCS(inet_aton isdigit sigaction snprintf vsnprintf strlcpy strlcat)
|
||||
|
||||
AC_CHECK_FUNCS(select,[AC_CHECK_HEADERS(sys/select.h)],
|
||||
AC_MSG_ERROR([required function select() is missing!])
|
||||
)
|
||||
AC_CHECK_FUNCS(inet_aton isdigit sigaction snprintf vsnprintf strdup strlcpy strlcat)
|
||||
|
||||
# -- Configuration options --
|
||||
|
||||
# use syslog?
|
||||
|
||||
x_syslog_on=no
|
||||
AC_ARG_WITH(syslog,
|
||||
[ --without-syslog disable syslog (autodetected by default)],
|
||||
[ if test "$withval" = "yes"; then
|
||||
[ if test "$withval" != "no"; then
|
||||
if test "$withval" != "yes"; then
|
||||
CFLAGS="-I$withval/include $CFLAGS"
|
||||
CPPFLAGS="-I$withval/include $CPPFLAGS"
|
||||
LDFLAGS="-L$withval/lib $LDFLAGS"
|
||||
fi
|
||||
AC_CHECK_LIB(be, syslog)
|
||||
AC_CHECK_FUNCS(syslog, x_syslog_on=yes,
|
||||
AC_MSG_ERROR([Can't enable syslog!])
|
||||
@@ -146,13 +169,20 @@ AC_ARG_WITH(syslog,
|
||||
)
|
||||
if test "$x_syslog_on" = "yes"; then
|
||||
AC_DEFINE(SYSLOG, 1)
|
||||
AC_CHECK_HEADERS(syslog.h)
|
||||
AC_CHECK_HEADERS(syslog.h,,AC_MSG_ERROR([required C header missing!]))
|
||||
fi
|
||||
|
||||
# use zlib compression?
|
||||
|
||||
x_zlib_on=no
|
||||
AC_ARG_WITH(zlib,
|
||||
[ --without-zlib disable zlib compression (autodetected by default)],
|
||||
[ if test "$withval" = "yes"; then
|
||||
[ if test "$withval" != "no"; then
|
||||
if test "$withval" != "yes"; then
|
||||
CFLAGS="-I$withval/include $CFLAGS"
|
||||
CPPFLAGS="-I$withval/include $CPPFLAGS"
|
||||
LDFLAGS="-L$withval/lib $LDFLAGS"
|
||||
fi
|
||||
AC_CHECK_LIB(z, deflate)
|
||||
AC_CHECK_FUNCS(deflate, x_zlib_on=yes,
|
||||
AC_MSG_ERROR([Can't enable zlib!])
|
||||
@@ -165,20 +195,141 @@ AC_ARG_WITH(zlib,
|
||||
)
|
||||
if test "$x_zlib_on" = "yes"; then
|
||||
AC_DEFINE(ZLIB, 1)
|
||||
AC_CHECK_HEADERS(zlib.h)
|
||||
AC_CHECK_HEADERS(zlib.h,,AC_MSG_ERROR([required C header missing!]))
|
||||
fi
|
||||
|
||||
# detect which IO API to use:
|
||||
|
||||
x_io_backend=none
|
||||
|
||||
AC_ARG_WITH(select,
|
||||
[ --without-select disable select IO support (autodetected by default)],
|
||||
[ if test "$withval" != "no"; then
|
||||
if test "$withval" != "yes"; then
|
||||
CFLAGS="-I$withval/include $CFLAGS"
|
||||
CPPFLAGS="-I$withval/include $CPPFLAGS"
|
||||
LDFLAGS="-L$withval/lib $LDFLAGS"
|
||||
fi
|
||||
AC_CHECK_FUNCS(select, x_io_select=yes,
|
||||
AC_MSG_ERROR([Can't enable select IO support!])
|
||||
)
|
||||
fi
|
||||
],
|
||||
[
|
||||
AC_CHECK_FUNCS(select, x_io_select=yes)
|
||||
]
|
||||
)
|
||||
|
||||
AC_ARG_WITH(poll,
|
||||
[ --without-poll disable poll support (autodetected by default)],
|
||||
[ if test "$withval" != "no"; then
|
||||
if test "$withval" != "yes"; then
|
||||
CFLAGS="-I$withval/include $CFLAGS"
|
||||
CPPFLAGS="-I$withval/include $CPPFLAGS"
|
||||
LDFLAGS="-L$withval/lib $LDFLAGS"
|
||||
fi
|
||||
AC_CHECK_FUNCS(poll, x_io_backend=poll\(\),
|
||||
AC_MSG_ERROR([Can't enable poll IO support!])
|
||||
)
|
||||
fi
|
||||
],
|
||||
[
|
||||
AC_CHECK_FUNCS(poll, x_io_backend=poll\(\))
|
||||
]
|
||||
)
|
||||
|
||||
AC_ARG_WITH(devpoll,
|
||||
[ --without-devpoll disable /dev/poll IO support (autodetected by default)],
|
||||
[ if test "$withval" != "no"; then
|
||||
if test "$withval" != "yes"; then
|
||||
CFLAGS="-I$withval/include $CFLAGS"
|
||||
CPPFLAGS="-I$withval/include $CPPFLAGS"
|
||||
LDFLAGS="-L$withval/lib $LDFLAGS"
|
||||
fi
|
||||
|
||||
AC_CHECK_HEADERS(sys/devpoll.h,,AC_MSG_ERROR([required C header missing!]))
|
||||
fi
|
||||
],
|
||||
[
|
||||
AC_CHECK_HEADERS(sys/devpoll.h, x_io_backend=/dev/poll)
|
||||
]
|
||||
)
|
||||
|
||||
AC_ARG_WITH(epoll,
|
||||
[ --without-epoll disable epoll IO support (autodetected by default)],
|
||||
[ if test "$withval" != "no"; then
|
||||
if test "$withval" != "yes"; then
|
||||
CFLAGS="-I$withval/include $CFLAGS"
|
||||
CPPFLAGS="-I$withval/include $CPPFLAGS"
|
||||
LDFLAGS="-L$withval/lib $LDFLAGS"
|
||||
fi
|
||||
AC_CHECK_FUNCS(epoll_create, x_io_epoll=yes,
|
||||
AC_MSG_ERROR([Can't enable epoll IO support!])
|
||||
)
|
||||
fi
|
||||
],
|
||||
[
|
||||
AC_CHECK_FUNCS(epoll_create, x_io_epoll=yes)
|
||||
]
|
||||
)
|
||||
|
||||
AC_ARG_WITH(kqueue,
|
||||
[ --without-kqueue disable kqueue IO support (autodetected by default)],
|
||||
[ if test "$withval" != "no"; then
|
||||
if test "$withval" != "yes"; then
|
||||
CFLAGS="-I$withval/include $CFLAGS"
|
||||
CPPFLAGS="-I$withval/include $CPPFLAGS"
|
||||
LDFLAGS="-L$withval/lib $LDFLAGS"
|
||||
fi
|
||||
AC_CHECK_FUNCS(kqueue, x_io_backend=kqueue\(\),
|
||||
AC_MSG_ERROR([Can't enable kqueue IO support!])
|
||||
)
|
||||
fi
|
||||
],
|
||||
[
|
||||
AC_CHECK_FUNCS(kqueue, x_io_backend=kqueue\(\))
|
||||
]
|
||||
)
|
||||
|
||||
if test "$x_io_epoll" = "yes" -a "$x_io_select" = "yes"; then
|
||||
# when epoll() and select() are available, we'll use both!
|
||||
x_io_backend="epoll(), select()"
|
||||
else
|
||||
if test "$x_io_epoll" = "yes"; then
|
||||
# we prefere epoll() if it is available
|
||||
x_io_backend="epoll()"
|
||||
else
|
||||
if test "$x_io_select" = "yes" -a "$x_io_backend" = "none"; then
|
||||
# we'll use select, when available and no "better"
|
||||
# interface has been detected ...
|
||||
x_io_backend="select()"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "$x_io_backend" = "none"; then
|
||||
AC_MSG_ERROR([No useabe IO API activated/found!?])
|
||||
fi
|
||||
|
||||
# use TCP wrappers?
|
||||
|
||||
x_tcpwrap_on=no
|
||||
AC_ARG_WITH(tcp-wrappers,
|
||||
[ --with-tcp-wrappers enable TCP wrappers support],
|
||||
[ if test "$withval" = "yes"; then
|
||||
AC_CHECK_LIB(wrap, tcpd_warn)
|
||||
[ if test "$withval" != "no"; then
|
||||
if test "$withval" != "yes"; then
|
||||
CFLAGS="-I$withval/include $CFLAGS"
|
||||
CPPFLAGS="-I$withval/include $CPPFLAGS"
|
||||
LDFLAGS="-L$withval/lib $LDFLAGS"
|
||||
fi
|
||||
AC_MSG_CHECKING(for hosts_access)
|
||||
LIBS="-lwrap $LIBS"
|
||||
AC_TRY_LINK([
|
||||
#include <tcpd.h>
|
||||
#include <tcpd.h>
|
||||
int allow_severity = 0;
|
||||
int deny_severity = 0;
|
||||
],[
|
||||
void *ptr;
|
||||
ptr = hosts_access;
|
||||
tcpd_warn("link test");
|
||||
],[
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(TCPWRAP, 1)
|
||||
@@ -191,25 +342,67 @@ AC_ARG_WITH(tcp-wrappers,
|
||||
]
|
||||
)
|
||||
|
||||
x_rendezvous_on=no
|
||||
AC_ARG_WITH(rendezvous,
|
||||
[ --with-rendezvous enable support for "Rendezvous"],
|
||||
[ if test "$withval" = "yes"; then
|
||||
AC_CHECK_FUNCS(DNSServiceRegistrationCreate, x_rendezvous_on=yes,
|
||||
AC_MSG_ERROR([Can't enable Rendezvous!])
|
||||
)
|
||||
# include support for "zeroconf"?
|
||||
|
||||
x_zeroconf_on=no
|
||||
AC_ARG_WITH(zeroconf,
|
||||
[ --with-zeroconf enable support for "Zeroconf"],
|
||||
[ if test "$withval" != "no"; then
|
||||
if test "$withval" != "yes"; then
|
||||
CFLAGS="-I$withval/include $CFLAGS"
|
||||
CPPFLAGS="-I$withval/include $CPPFLAGS"
|
||||
LDFLAGS="-L$withval/lib $LDFLAGS"
|
||||
fi
|
||||
AC_CHECK_FUNCS(DNSServiceRegistrationCreate, x_zeroconf_on=osx,
|
||||
[
|
||||
AC_CHECK_LIB(pthread, pthread_mutexattr_init)
|
||||
AC_CHECK_LIB(howl, sw_discovery_init)
|
||||
AC_CHECK_FUNCS(sw_discovery_init, \
|
||||
x_zeroconf_on=howl, \
|
||||
AC_MSG_ERROR([Can't enable Zeroconf!]))
|
||||
])
|
||||
fi
|
||||
]
|
||||
)
|
||||
if test "$x_rendezvous_on" = "yes"; then
|
||||
AC_DEFINE(RENDEZVOUS, 1)
|
||||
AC_CHECK_HEADERS(DNSServiceDiscovery/DNSServiceDiscovery.h mach/port.h)
|
||||
if test "$x_zeroconf_on" = "osx"; then
|
||||
AC_CHECK_HEADERS([DNSServiceDiscovery/DNSServiceDiscovery.h \
|
||||
mach/port.h],,AC_MSG_ERROR([required C header missing!]))
|
||||
AC_DEFINE(ZEROCONF, 1)
|
||||
fi
|
||||
if test "$x_zeroconf_on" = "howl"; then
|
||||
for dir in /usr/local/include /usr/local/include/howl* \
|
||||
/usr/include /usr/include/howl* \
|
||||
/usr/local/include/avahi* /usr/include/avahi*; do
|
||||
test -d "$dir" || continue
|
||||
AC_MSG_CHECKING([for Howl headers in $dir])
|
||||
if test -f "$dir/rendezvous/rendezvous.h"; then
|
||||
if test "$dir" != "/usr/local/include" -a \
|
||||
"$dir" != "/usr/include"; then
|
||||
CFLAGS="-I$dir $CFLAGS"
|
||||
CPPFLAGS="-I$dir $CPPFLAGS"
|
||||
fi
|
||||
AC_MSG_RESULT(yes)
|
||||
break
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
fi
|
||||
done
|
||||
AC_CHECK_HEADERS([rendezvous/rendezvous.h],, \
|
||||
AC_MSG_ERROR([required C header missing!]))
|
||||
AC_DEFINE(ZEROCONF, 1)
|
||||
fi
|
||||
|
||||
# do IDENT requests using libident?
|
||||
|
||||
x_identauth_on=no
|
||||
AC_ARG_WITH(ident,
|
||||
[ --with-ident enable "IDENT" ("AUTH") protocol support],
|
||||
[ if test "$withval" = "yes"; then
|
||||
[ if test "$withval" != "no"; then
|
||||
if test "$withval" != "yes"; then
|
||||
CFLAGS="-I$withval/include $CFLAGS"
|
||||
CPPFLAGS="-I$withval/include $CPPFLAGS"
|
||||
LDFLAGS="-L$withval/lib $LDFLAGS"
|
||||
fi
|
||||
AC_CHECK_LIB(ident, ident_id)
|
||||
AC_CHECK_FUNCS(ident_id, x_identauth_on=yes,
|
||||
AC_MSG_ERROR([Can't enable IDENT support!])
|
||||
@@ -219,9 +412,11 @@ AC_ARG_WITH(ident,
|
||||
)
|
||||
if test "$x_identauth_on" = "yes"; then
|
||||
AC_DEFINE(IDENTAUTH, 1)
|
||||
AC_CHECK_HEADERS(ident.h)
|
||||
AC_CHECK_HEADERS(ident.h,,AC_MSG_ERROR([required C header missing!]))
|
||||
fi
|
||||
|
||||
# compile in IRC+ protocol support?
|
||||
|
||||
x_ircplus_on=yes
|
||||
AC_ARG_ENABLE(ircplus,
|
||||
[ --disable-ircplus disable IRC+ protocol],
|
||||
@@ -231,6 +426,8 @@ if test "$x_ircplus_on" = "yes"; then
|
||||
AC_DEFINE(IRCPLUS, 1)
|
||||
fi
|
||||
|
||||
# compile in IRC "sniffer"?
|
||||
|
||||
x_sniffer_on=no; x_debug_on=no
|
||||
AC_ARG_ENABLE(sniffer,
|
||||
[ --enable-sniffer enable IRC traffic sniffer (enables debug mode)],
|
||||
@@ -240,6 +437,8 @@ AC_ARG_ENABLE(sniffer,
|
||||
fi
|
||||
)
|
||||
|
||||
# enable additional debugging code?
|
||||
|
||||
AC_ARG_ENABLE(debug,
|
||||
[ --enable-debug show additional debug output],
|
||||
if test "$enableval" = "yes"; then x_debug_on=yes; fi
|
||||
@@ -249,6 +448,8 @@ if test "$x_debug_on" = "yes"; then
|
||||
test "$GCC" = "yes" && CFLAGS="-pedantic $CFLAGS"
|
||||
fi
|
||||
|
||||
# enable "strict RFC rules"?
|
||||
|
||||
x_strict_rfc_on=no
|
||||
AC_ARG_ENABLE(strict-rfc,
|
||||
[ --enable-strict-rfc strict RFC conformance -- may break clients!],
|
||||
@@ -273,6 +474,7 @@ test -n "$CFLAGS_END" && CFLAGS="$CFLAGS $CFLAGS_END"
|
||||
AC_OUTPUT([ \
|
||||
Makefile \
|
||||
doc/Makefile \
|
||||
doc/src/Makefile \
|
||||
src/Makefile \
|
||||
src/portab/Makefile \
|
||||
src/tool/Makefile \
|
||||
@@ -295,7 +497,7 @@ fi
|
||||
# -- Result --
|
||||
|
||||
echo
|
||||
echo "ngIRCd has been configured with the following options:"
|
||||
echo "ngIRCd $PACKAGE_VERSION has been configured with the following options:"
|
||||
echo
|
||||
|
||||
# Someone please show me a better way :) [borrowed by OpenSSH]
|
||||
@@ -321,8 +523,8 @@ echo
|
||||
|
||||
echo $ECHO_N " Syslog support: $ECHO_C"
|
||||
test "$x_syslog_on" = "yes" \
|
||||
&& echo $ECHO_N "yes $ECHO_C" \
|
||||
|| echo $ECHO_N "no $ECHO_C"
|
||||
&& echo $ECHO_N "yes $ECHO_C" \
|
||||
|| echo $ECHO_N "no $ECHO_C"
|
||||
echo $ECHO_N " Enable debug code: $ECHO_C"
|
||||
test "$x_debug_on" = "yes" \
|
||||
&& echo "yes" \
|
||||
@@ -330,8 +532,8 @@ test "$x_debug_on" = "yes" \
|
||||
|
||||
echo $ECHO_N " zlib compression: $ECHO_C"
|
||||
test "$x_zlib_on" = "yes" \
|
||||
&& echo $ECHO_N "yes $ECHO_C" \
|
||||
|| echo $ECHO_N "no $ECHO_C"
|
||||
&& echo $ECHO_N "yes $ECHO_C" \
|
||||
|| echo $ECHO_N "no $ECHO_C"
|
||||
echo $ECHO_N " IRC sniffer: $ECHO_C"
|
||||
test "$x_sniffer_on" = "yes" \
|
||||
&& echo "yes" \
|
||||
@@ -339,17 +541,25 @@ test "$x_sniffer_on" = "yes" \
|
||||
|
||||
echo $ECHO_N " Use TCP Wrappers: $ECHO_C"
|
||||
test "$x_tcpwrap_on" = "yes" \
|
||||
&& echo $ECHO_N "yes $ECHO_C" \
|
||||
|| echo $ECHO_N "no $ECHO_C"
|
||||
&& echo $ECHO_N "yes $ECHO_C" \
|
||||
|| echo $ECHO_N "no $ECHO_C"
|
||||
echo $ECHO_N " Strict RFC mode: $ECHO_C"
|
||||
test "$x_strict_rfc_on" = "yes" \
|
||||
&& echo "yes" \
|
||||
|| echo "no"
|
||||
|
||||
echo $ECHO_N " Rendezvous support: $ECHO_C"
|
||||
test "$x_rendezvous_on" = "yes" \
|
||||
&& echo $ECHO_N "yes $ECHO_C" \
|
||||
|| echo $ECHO_N "no $ECHO_C"
|
||||
echo $ECHO_N " Zeroconf support: $ECHO_C"
|
||||
case "$x_zeroconf_on" in
|
||||
osx)
|
||||
echo $ECHO_N "Apple $ECHO_C"
|
||||
;;
|
||||
howl)
|
||||
echo $ECHO_N "Howl $ECHO_C"
|
||||
;;
|
||||
*)
|
||||
echo $ECHO_N "no $ECHO_C"
|
||||
;;
|
||||
esac
|
||||
echo $ECHO_N " IRC+ protocol: $ECHO_C"
|
||||
test "$x_ircplus_on" = "yes" \
|
||||
&& echo "yes" \
|
||||
@@ -357,9 +567,11 @@ test "$x_ircplus_on" = "yes" \
|
||||
|
||||
echo $ECHO_N " IDENT support: $ECHO_C"
|
||||
test "$x_identauth_on" = "yes" \
|
||||
&& echo $ECHO_N "yes $ECHO_C" \
|
||||
|| echo $ECHO_N "no $ECHO_C"
|
||||
&& echo $ECHO_N "yes $ECHO_C" \
|
||||
|| echo $ECHO_N "no $ECHO_C"
|
||||
echo $ECHO_N " I/O backend: $ECHO_C"
|
||||
echo "\"$x_io_backend\""
|
||||
|
||||
echo; echo
|
||||
echo
|
||||
|
||||
# -eof-
|
||||
|
||||
2
contrib/.cvsignore
Normal file
2
contrib/.cvsignore
Normal file
@@ -0,0 +1,2 @@
|
||||
Makefile
|
||||
Makefile.in
|
||||
2
contrib/Debian/.cvsignore
Normal file
2
contrib/Debian/.cvsignore
Normal file
@@ -0,0 +1,2 @@
|
||||
Makefile
|
||||
Makefile.in
|
||||
@@ -8,7 +8,7 @@
|
||||
# (at your option) any later version.
|
||||
# Please read the file COPYING, README and AUTHORS for more information.
|
||||
#
|
||||
# $Id: Makefile.am,v 1.3 2004/01/13 01:10:11 alex Exp $
|
||||
# $Id: Makefile.am,v 1.4 2004/05/11 00:32:31 alex Exp $
|
||||
#
|
||||
|
||||
EXTRA_DIST = rules changelog compat control copyright \
|
||||
@@ -16,11 +16,12 @@ EXTRA_DIST = rules changelog compat control copyright \
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -f Makefile Makefile.in
|
||||
|
||||
clean-local:
|
||||
rm -f ngircd.postinst.debhelper ngircd.postrm.debhelper \
|
||||
ngircd.prerm.debhelper ngircd.substvars
|
||||
rm -f ngircd-full.postinst.debhelper ngircd-full.postrm.debhelper \
|
||||
ngircd-full.prerm.debhelper ngircd-full.substvars
|
||||
|
||||
rm -rf ngircd ngircd-full
|
||||
rm -f files
|
||||
|
||||
|
||||
@@ -1,3 +1,121 @@
|
||||
ngircd (0.11.1-0ab1) unstable; urgency=low
|
||||
|
||||
* New "upstream" release 0.11.1.
|
||||
|
||||
-- Alexander Barton <alex@barton.de> Tue, 26 Feb 2008 20:24:55 +0100
|
||||
|
||||
ngircd (0.11.0-0ab1) unstable; urgency=low
|
||||
|
||||
* New "upstream" release 0.11.0.
|
||||
|
||||
-- Alexander Barton <alex@barton.de> Tue, 15 Jan 2008 21:43:46 +0100
|
||||
|
||||
ngircd (0.11.0-0ab0-pre2) unstable; urgency=low
|
||||
|
||||
* Second prerelease of upcoming new "upstream release".
|
||||
|
||||
-- Alexander Barton <alex@barton.de> Mon, 7 Jan 2008 15:32:42 +0100
|
||||
|
||||
ngircd (0.11.0-0ab0-pre1) unstable; urgency=low
|
||||
|
||||
* Prerelease of upcoming new "upstream release".
|
||||
|
||||
-- Alexander Barton <alex@barton.de> Wed, 2 Jan 2008 21:33:15 +0100
|
||||
|
||||
ngircd (0.10.4-0ab1) unstable; urgency=high
|
||||
|
||||
* New "upstream" release: 0.10.4 - fixing a security bug.
|
||||
|
||||
-- Alexander Barton <alex@barton.de> Mon, 7 Jan 2008 22:04:44 +0100
|
||||
|
||||
ngircd (0.10.0-0ab1) unstable; urgency=low
|
||||
|
||||
* New "upstream" release: 0.10.0
|
||||
|
||||
-- Alexander Barton <alex@barton.de> Sun, 1 Oct 2006 18:14:21 +0200
|
||||
|
||||
ngircd (0.10.0-0ab0-pre2-1) unstable; urgency=low
|
||||
|
||||
* Bumped standards version to 3.7.2.1.
|
||||
* Added "Provides: ircd" to Debian control file.
|
||||
|
||||
-- Alexander Barton <alex@barton.de> Sun, 1 Oct 2006 16:25:33 +0200
|
||||
|
||||
ngircd (0.10.0-0ab0-pre2) unstable; urgency=low
|
||||
|
||||
* Second "upstream" prerelease of upcoming 0.10.0 release.
|
||||
|
||||
-- Alexander Barton <alex@barton.de> Sat, 9 Sep 2006 20:57:52 +0200
|
||||
|
||||
ngircd (0.10.0-0ab0-pre1) unstable; urgency=low
|
||||
|
||||
* Prerelease of upcoming new "upstream release".
|
||||
|
||||
-- Alexander Barton <alex@barton.de> Wed, 2 Aug 2006 12:01:07 +0200
|
||||
|
||||
ngircd (0.9.2-0ab1) unstable; urgency=low
|
||||
|
||||
* New "upstream release" fixing a few bugs in 0.9.1.
|
||||
|
||||
-- Alexander Barton <alex@barton.de> Sat, 15 Oct 2005 14:10:34 +0200
|
||||
|
||||
ngircd (0.9.1-0ab1) unstable; urgency=medium
|
||||
|
||||
* New "upstream release" addressing two problems in ngIRCd 0.9.0.
|
||||
|
||||
-- Alexander Barton <alex@barton.de> Wed, 3 Aug 2005 15:10:41 +0200
|
||||
|
||||
ngircd (0.9.0-0ab2) unstable; urgency=medium
|
||||
|
||||
* Init script: fixed a problem with symbolic links in runlevel directories
|
||||
that could prevent the init script from working correctly.
|
||||
|
||||
-- Alexander Barton <alex@barton.de> Tue, 26 Jul 2005 21:31:18 +0200
|
||||
|
||||
ngircd (0.9.0-0ab1) unstable; urgency=low
|
||||
|
||||
* New "upstream release".
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Sat, 24 Jul 2005 23:30:00 +0200
|
||||
|
||||
ngircd (0.8.3-0ab1) unstable; urgency=high
|
||||
|
||||
* New "upstream release", including security fixes.
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Thu, 3 Feb 2005 10:41:55 +0100
|
||||
|
||||
ngircd (0.8.2-0ab1) unstable; urgency=high
|
||||
|
||||
* New "upstream release", including security fixes.
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Wed, 26 Jan 2005 23:14:12 +0100
|
||||
|
||||
ngircd (0.8.1-0ab1) unstable; urgency=low
|
||||
|
||||
* New "upstream release".
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Sat, 25 Dec 2004 01:18:32 +0100
|
||||
|
||||
ngircd (0.8.0-0ab2) unstable; urgency=low
|
||||
|
||||
* Added missing commas to debian control file, fixes bug #56.
|
||||
Thanks to Kevin Otte.
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Thu, 15 Jul 2004 10:53:39 +0200
|
||||
|
||||
ngircd (0.8.0-0ab1) unstable; urgency=low
|
||||
|
||||
* New upstream version.
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Sat, 26 Jun 2004 11:25:59 +0200
|
||||
|
||||
ngircd (0.7.7+HEAD-0ab6) unstable; urgency=low
|
||||
|
||||
* Incorporated actual CVS HEAD version which includes all features of
|
||||
version 0.8.0-pre1 and patches for the resolver and logger.
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Tue, 11 May 2004 02:18:50 +0200
|
||||
|
||||
ngircd (0.7.7+HEAD-0ab5) unstable; urgency=low
|
||||
|
||||
* Updates from CVS HEAD branch, most notably: "INVITE- and BAN-lists
|
||||
|
||||
@@ -3,11 +3,12 @@ Section: net
|
||||
Priority: optional
|
||||
Maintainer: Alexander Barton <alex@barton.de>
|
||||
Build-Depends: debhelper (>> 4.0.0), libz-dev, libwrap-dev, libident-dev
|
||||
Standards-Version: 3.5.8
|
||||
Standards-Version: 3.7.2.1
|
||||
|
||||
Package: ngircd
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends} ${misc:Depends}
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}
|
||||
Provides: ircd
|
||||
Description: A lightweight daemon for the Internet Relay Chat (IRC)
|
||||
ngIRCd is a free open source daemon for the Internet Relay Chat (IRC)
|
||||
network. It is written from scratch and is not based upon the original
|
||||
@@ -27,7 +28,8 @@ Description: A lightweight daemon for the Internet Relay Chat (IRC)
|
||||
|
||||
Package: ngircd-full
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends} ${misc:Depends}
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}
|
||||
Provides: ircd
|
||||
Conflicts: ngircd
|
||||
Description: A lightweight daemon for the Internet Relay Chat (IRC)
|
||||
ngIRCd is a free open source daemon for the Internet Relay Chat (IRC)
|
||||
|
||||
@@ -2,18 +2,32 @@
|
||||
#
|
||||
# ngIRCd start and stop script for Debian-based systems
|
||||
#
|
||||
# $Id: ngircd.init,v 1.1 2003/12/31 17:20:11 alex Exp $
|
||||
# $Id: ngircd.init,v 1.7 2006/12/26 14:43:46 alex Exp $
|
||||
#
|
||||
|
||||
### BEGIN INIT INFO
|
||||
# Provides: ircd
|
||||
# Required-Start: $local_fs
|
||||
# Required-Stop: $local_fs
|
||||
# Should-Start: $syslog $network
|
||||
# Should-Stop: $syslog $network
|
||||
# Default-Start: 2 3 4 5
|
||||
# Default-Stop: 0 1 6
|
||||
# Short-Description: Next Generation IRC Server
|
||||
### END INIT INFO
|
||||
|
||||
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
|
||||
DAEMON=/usr/sbin/ngircd
|
||||
NAME=ngIRCd
|
||||
DESC="IRC daemon"
|
||||
PARAMS=""
|
||||
|
||||
test -x $DAEMON || exit 0
|
||||
test -h "$0" && me=`readlink $0` || me="$0"
|
||||
BASENAME=`basename $me`
|
||||
|
||||
test -f /etc/default/ngircd && . /etc/default/ngircd
|
||||
test -f /etc/default/$BASENAME && . /etc/default/$BASENAME
|
||||
|
||||
test -x $DAEMON || exit 0
|
||||
|
||||
Check_Config()
|
||||
{
|
||||
@@ -27,6 +41,7 @@ Check_Config()
|
||||
|
||||
Try_Start()
|
||||
{
|
||||
[ ! -d /var/run/ircd ] || chown irc:irc /var/run/ircd
|
||||
start-stop-daemon --start --quiet --exec $DAEMON -- $PARAMS
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "$NAME failed!"
|
||||
@@ -43,7 +58,7 @@ case "$1" in
|
||||
;;
|
||||
stop)
|
||||
echo -n "Stopping $DESC: "
|
||||
start-stop-daemon --stop --quiet --exec $DAEMON \
|
||||
start-stop-daemon --stop --quiet --pidfile /var/run/ircd/ngircd.pid --exec $DAEMON \
|
||||
&& echo "$NAME." \
|
||||
|| echo "(none running)"
|
||||
;;
|
||||
|
||||
@@ -1,13 +1,20 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Debian post-installation script
|
||||
# $Id: ngircd.postinst,v 1.1 2003/12/31 17:20:11 alex Exp $
|
||||
# $Id: ngircd.postinst,v 1.2 2006/12/26 14:44:40 alex Exp $
|
||||
#
|
||||
|
||||
if [ -f /etc/ngircd/ngircd.conf ]; then
|
||||
# make sure that configuration file is not world readable
|
||||
chmod o= /etc/ngircd/ngircd.conf
|
||||
fi
|
||||
set -e
|
||||
|
||||
case "$1" in
|
||||
configure)
|
||||
if [ -f /etc/ngircd/ngircd.conf ]; then
|
||||
# make sure that the configuration file is not
|
||||
# world-readable, it contains passwords!
|
||||
chmod o= /etc/ngircd/ngircd.conf
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
#DEBHELPER#
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
#
|
||||
# debian/rules for ngIRCd
|
||||
#
|
||||
# $Id: rules,v 1.2 2004/01/01 22:24:48 alex Exp $
|
||||
# $Id: rules,v 1.3 2005/02/07 23:09:31 alex Exp $
|
||||
#
|
||||
# Based on the sample debian/rules that uses debhelper,
|
||||
# GNU copyright 1997 to 1999 by Joey Hess.
|
||||
@@ -38,7 +38,7 @@ endif
|
||||
|
||||
configure-ngircd: configure
|
||||
dh_testdir
|
||||
|
||||
|
||||
# configure "standard" variant:
|
||||
./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) \
|
||||
--prefix=/usr \
|
||||
@@ -48,7 +48,7 @@ configure-ngircd: configure
|
||||
|
||||
configure-ngircd-full: configure
|
||||
dh_testdir
|
||||
|
||||
|
||||
# configure "full" variant:
|
||||
./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) \
|
||||
--prefix=/usr \
|
||||
@@ -63,20 +63,20 @@ build-ngircd: build-stamp-ngircd
|
||||
build-stamp-ngircd: configure-ngircd
|
||||
dh_testdir
|
||||
rm -f build-stamp-*
|
||||
|
||||
|
||||
# Add here commands to compile the "standard" package:
|
||||
$(MAKE)
|
||||
|
||||
|
||||
touch build-stamp-ngircd
|
||||
|
||||
build-ngircd-full: build-stamp-ngircd-full
|
||||
build-stamp-ngircd-full: configure-ngircd-full
|
||||
dh_testdir
|
||||
rm -f build-stamp-*
|
||||
|
||||
|
||||
# Add here commands to compile the "full" package:
|
||||
$(MAKE)
|
||||
|
||||
|
||||
touch build-stamp-ngircd-full
|
||||
|
||||
clean:
|
||||
@@ -86,10 +86,10 @@ clean:
|
||||
rm -f $(CURDIR)/debian/ngircd-full.default
|
||||
rm -f $(CURDIR)/debian/ngircd-full.init
|
||||
rm -f $(CURDIR)/debian/ngircd-full.postinst
|
||||
|
||||
|
||||
# Add here commands to clean up after the build process:
|
||||
-$(MAKE) clean
|
||||
|
||||
|
||||
ifneq "$(wildcard /usr/share/misc/config.sub)" ""
|
||||
cp -f /usr/share/misc/config.sub config.sub
|
||||
endif
|
||||
@@ -104,23 +104,39 @@ install-ngircd: build-ngircd
|
||||
dh_testdir
|
||||
dh_testroot
|
||||
dh_installdirs
|
||||
|
||||
|
||||
# Add here commands to install the "standard" package into debian/ngircd:
|
||||
$(MAKE) install DESTDIR=$(CURDIR)/debian/ngircd
|
||||
rm $(CURDIR)/debian/ngircd/usr/share/doc/ngircd/INSTALL*
|
||||
rm $(CURDIR)/debian/ngircd/usr/share/doc/ngircd/COPYING*
|
||||
mkdir -p $(CURDIR)/debian/ngircd/var/run/ircd
|
||||
cat $(CURDIR)/debian/ngircd/usr/share/doc/ngircd/sample-ngircd.conf | \
|
||||
sed -e "s/;ServerUID = 65534/ServerUID = irc/g" | \
|
||||
sed -e "s/;ServerGID = 65534/ServerGID = irc/g" | \
|
||||
sed -e "s/;MotdFile = \/usr\/local\/etc\/ngircd.motd/MotdFile = \/etc\/ngircd\/ngircd.motd/g" | \
|
||||
sed -e "s/;PidFile = \/var\/run\/ngircd\/ngircd.pid/PidFile = \/var\/run\/ircd\/ngircd.pid/g" \
|
||||
>$(CURDIR)/debian/ngircd/etc/ngircd/ngircd.conf
|
||||
touch $(CURDIR)/debian/ngircd/etc/ngircd/ngircd.motd
|
||||
|
||||
install-ngircd-full: build-ngircd-full
|
||||
dh_testdir
|
||||
dh_testroot
|
||||
dh_installdirs
|
||||
|
||||
|
||||
# Add here commands to install the "full" package into debian/ngircd-full:
|
||||
$(MAKE) install DESTDIR=$(CURDIR)/debian/ngircd-full
|
||||
rm $(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd/INSTALL*
|
||||
rm $(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd/COPYING*
|
||||
mv $(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd \
|
||||
$(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd-full
|
||||
mkdir -p $(CURDIR)/debian/ngircd-full/var/run/ircd
|
||||
cat $(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd-full/sample-ngircd.conf | \
|
||||
sed -e "s/;ServerUID = 65534/ServerUID = irc/g" | \
|
||||
sed -e "s/;ServerGID = 65534/ServerGID = irc/g" | \
|
||||
sed -e "s/;MotdFile = \/usr\/local\/etc\/ngircd.motd/MotdFile = \/etc\/ngircd\/ngircd.motd/g" | \
|
||||
sed -e "s/;PidFile = \/var\/run\/ngircd\/ngircd.pid/PidFile = \/var\/run\/ircd\/ngircd.pid/g" \
|
||||
>$(CURDIR)/debian/ngircd-full/etc/ngircd/ngircd.conf
|
||||
touch $(CURDIR)/debian/ngircd-full/etc/ngircd/ngircd.motd
|
||||
|
||||
# Build architecture-independent files here.
|
||||
binary-indep:
|
||||
|
||||
2
contrib/MacOSX/.cvsignore
Normal file
2
contrib/MacOSX/.cvsignore
Normal file
@@ -0,0 +1,2 @@
|
||||
Makefile
|
||||
Makefile.in
|
||||
@@ -8,10 +8,13 @@
|
||||
# (at your option) any later version.
|
||||
# Please read the file COPYING, README and AUTHORS for more information.
|
||||
#
|
||||
# $Id: Makefile.am,v 1.1 2004/02/29 17:19:43 alex Exp $
|
||||
# $Id: Makefile.am,v 1.2 2004/05/11 00:34:26 alex Exp $
|
||||
#
|
||||
|
||||
clean-local:
|
||||
rm -rf build
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -f Makefile Makefile.in
|
||||
|
||||
# -eof-
|
||||
|
||||
92
contrib/MacOSX/config.h
Normal file
92
contrib/MacOSX/config.h
Normal file
@@ -0,0 +1,92 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001-2007 Alexander Barton (alex@barton.de).
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: config.h,v 1.1 2007/11/19 22:11:36 alex Exp $
|
||||
*
|
||||
* Static configuration file for Mac OS X Xcode project
|
||||
*/
|
||||
|
||||
#define PACKAGE_NAME "ngircd"
|
||||
#define VERSION "??"
|
||||
#define SYSCONFDIR "/etc/ngircd"
|
||||
|
||||
/* -- Build options -- */
|
||||
|
||||
/* Define if debug-mode should be enabled */
|
||||
#define DEBUG 1
|
||||
|
||||
/* Define if the server should do IDENT requests */
|
||||
/*#define IDENTAUTH 1*/
|
||||
|
||||
/* Define if IRC+ protocol should be used */
|
||||
#define IRCPLUS 1
|
||||
|
||||
/* Define if IRC sniffer should be enabled */
|
||||
/*#define SNIFFER 1*/
|
||||
|
||||
/* Define if syslog should be used for logging */
|
||||
#define SYSLOG 1
|
||||
|
||||
/* Define if TCP wrappers should be used */
|
||||
/*#define TCPWRAP 1*/
|
||||
|
||||
/* Define if support for Zeroconf should be included */
|
||||
/*#define ZEROCONF 1*/
|
||||
|
||||
/* Define if zlib compression should be enabled */
|
||||
#define ZLIB 1
|
||||
|
||||
/* -- Supported features -- */
|
||||
|
||||
/* Define if SSP C support is enabled. */
|
||||
#define ENABLE_SSP_CC 1
|
||||
|
||||
/* Define to 1 if the C compiler supports function prototypes. */
|
||||
#define PROTOTYPES 1
|
||||
/* Define like PROTOTYPES; this can be used by system headers. */
|
||||
#define __PROTOTYPES 1
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#define HAVE_SYS_TYPES_H 1
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#define HAVE_INTTYPES_H 1
|
||||
/* Define to 1 if you have the <stddef.h> header file. */
|
||||
#define HAVE_STDDEF_H 1
|
||||
/* Define to 1 if you have the <stdbool.h> header file. */
|
||||
#define HAVE_STDBOOL_H 1
|
||||
/* Define to 1 if you have the <arpa/inet.h> header file. */
|
||||
#define HAVE_ARPA_INET_H 1
|
||||
|
||||
/* Define to 1 if you have the `kqueue' function. */
|
||||
#define HAVE_KQUEUE 1
|
||||
/* Define to 1 if you have the `inet_ntoa' function. */
|
||||
#define HAVE_INET_NTOA 1
|
||||
/* Define to 1 if you have the `snprintf' function. */
|
||||
#define HAVE_SNPRINTF 1
|
||||
/* Define to 1 if you have the `strlcat' function. */
|
||||
#define HAVE_STRLCAT 1
|
||||
/* Define to 1 if you have the `strlcpy' function. */
|
||||
#define HAVE_STRLCPY 1
|
||||
/* Define to 1 if you have the `strdup' function. */
|
||||
#define HAVE_STRDUP 1
|
||||
/* Define to 1 if you have the `vsnprintf' function. */
|
||||
#define HAVE_VSNPRINTF 1
|
||||
|
||||
/* Define if socklen_t exists */
|
||||
#define HAVE_socklen_t 1
|
||||
|
||||
#ifdef ZEROCONF
|
||||
/* Define to 1 if you have the <DNSServiceDiscovery/DNSServiceDiscovery.h> header file. */
|
||||
#define HAVE_DNSSERVICEDISCOVERY_DNSSERVICEDISCOVERY_H 1
|
||||
/* Define to 1 if you have the `DNSServiceRegistrationCreate' function. */
|
||||
#define HAVE_DNSSERVICEREGISTRATIONCREATE 1
|
||||
#endif
|
||||
|
||||
/* -eof- */
|
||||
0
contrib/MacOSX/cvs-version.h
Normal file
0
contrib/MacOSX/cvs-version.h
Normal file
File diff suppressed because it is too large
Load Diff
683
contrib/MacOSX/ngIRCd.xcodeproj/project.pbxproj
Normal file
683
contrib/MacOSX/ngIRCd.xcodeproj/project.pbxproj
Normal file
@@ -0,0 +1,683 @@
|
||||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 44;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
FA322D350CEF74B1001761B3 /* array.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CD90CEF74B1001761B3 /* array.c */; };
|
||||
FA322D360CEF74B1001761B3 /* channel.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CDB0CEF74B1001761B3 /* channel.c */; };
|
||||
FA322D370CEF74B1001761B3 /* client.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CDD0CEF74B1001761B3 /* client.c */; };
|
||||
FA322D380CEF74B1001761B3 /* conf.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CDF0CEF74B1001761B3 /* conf.c */; };
|
||||
FA322D390CEF74B1001761B3 /* conn-func.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CE10CEF74B1001761B3 /* conn-func.c */; };
|
||||
FA322D3A0CEF74B1001761B3 /* conn-zip.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CE30CEF74B1001761B3 /* conn-zip.c */; };
|
||||
FA322D3B0CEF74B1001761B3 /* conn.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CE50CEF74B1001761B3 /* conn.c */; };
|
||||
FA322D3C0CEF74B1001761B3 /* hash.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CE80CEF74B1001761B3 /* hash.c */; };
|
||||
FA322D3D0CEF74B1001761B3 /* io.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CEA0CEF74B1001761B3 /* io.c */; };
|
||||
FA322D3E0CEF74B1001761B3 /* irc-channel.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CEC0CEF74B1001761B3 /* irc-channel.c */; };
|
||||
FA322D3F0CEF74B1001761B3 /* irc-info.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CEE0CEF74B1001761B3 /* irc-info.c */; };
|
||||
FA322D400CEF74B1001761B3 /* irc-login.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CF00CEF74B1001761B3 /* irc-login.c */; };
|
||||
FA322D410CEF74B1001761B3 /* irc-mode.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CF20CEF74B1001761B3 /* irc-mode.c */; };
|
||||
FA322D420CEF74B1001761B3 /* irc-op.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CF40CEF74B1001761B3 /* irc-op.c */; };
|
||||
FA322D430CEF74B1001761B3 /* irc-oper.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CF60CEF74B1001761B3 /* irc-oper.c */; };
|
||||
FA322D440CEF74B1001761B3 /* irc-server.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CF80CEF74B1001761B3 /* irc-server.c */; };
|
||||
FA322D450CEF74B1001761B3 /* irc-write.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CFA0CEF74B1001761B3 /* irc-write.c */; };
|
||||
FA322D460CEF74B1001761B3 /* irc.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CFC0CEF74B1001761B3 /* irc.c */; };
|
||||
FA322D470CEF74B1001761B3 /* lists.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CFE0CEF74B1001761B3 /* lists.c */; };
|
||||
FA322D480CEF74B1001761B3 /* log.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D000CEF74B1001761B3 /* log.c */; };
|
||||
FA322D490CEF74B1001761B3 /* match.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D030CEF74B1001761B3 /* match.c */; };
|
||||
FA322D4A0CEF74B1001761B3 /* ngircd.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D060CEF74B1001761B3 /* ngircd.c */; };
|
||||
FA322D4B0CEF74B1001761B3 /* parse.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D080CEF74B1001761B3 /* parse.c */; };
|
||||
FA322D4C0CEF74B1001761B3 /* rendezvous.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D0A0CEF74B1001761B3 /* rendezvous.c */; };
|
||||
FA322D4D0CEF74B1001761B3 /* resolve.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D0C0CEF74B1001761B3 /* resolve.c */; };
|
||||
FA322DBE0CEF7766001761B3 /* tool.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D330CEF74B1001761B3 /* tool.c */; };
|
||||
FA322DC10CEF77CB001761B3 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FA322DC00CEF77CB001761B3 /* libz.dylib */; };
|
||||
FAE5CC2E0CF2308A007D69B6 /* numeric.c in Sources */ = {isa = PBXBuildFile; fileRef = FAE5CC2D0CF2308A007D69B6 /* numeric.c */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
8DD76FAF0486AB0100D96B5E /* CopyFiles */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 8;
|
||||
dstPath = /usr/share/man/man1/;
|
||||
dstSubfolderSpec = 0;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 1;
|
||||
};
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
FA322BBA0CEF72E4001761B3 /* ngIRCd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ngIRCd; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
FA322CD50CEF74B1001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
|
||||
FA322CD60CEF74B1001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
|
||||
FA322CD80CEF74B1001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
|
||||
FA322CD90CEF74B1001761B3 /* array.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = array.c; sourceTree = "<group>"; };
|
||||
FA322CDA0CEF74B1001761B3 /* array.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = array.h; sourceTree = "<group>"; };
|
||||
FA322CDB0CEF74B1001761B3 /* channel.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = channel.c; sourceTree = "<group>"; };
|
||||
FA322CDC0CEF74B1001761B3 /* channel.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = channel.h; sourceTree = "<group>"; };
|
||||
FA322CDD0CEF74B1001761B3 /* client.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = client.c; sourceTree = "<group>"; };
|
||||
FA322CDE0CEF74B1001761B3 /* client.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = client.h; sourceTree = "<group>"; };
|
||||
FA322CDF0CEF74B1001761B3 /* conf.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = conf.c; sourceTree = "<group>"; };
|
||||
FA322CE00CEF74B1001761B3 /* conf.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = conf.h; sourceTree = "<group>"; };
|
||||
FA322CE10CEF74B1001761B3 /* conn-func.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "conn-func.c"; sourceTree = "<group>"; };
|
||||
FA322CE20CEF74B1001761B3 /* conn-func.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "conn-func.h"; sourceTree = "<group>"; };
|
||||
FA322CE30CEF74B1001761B3 /* conn-zip.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "conn-zip.c"; sourceTree = "<group>"; };
|
||||
FA322CE40CEF74B1001761B3 /* conn-zip.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "conn-zip.h"; sourceTree = "<group>"; };
|
||||
FA322CE50CEF74B1001761B3 /* conn.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = conn.c; sourceTree = "<group>"; };
|
||||
FA322CE60CEF74B1001761B3 /* conn.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = conn.h; sourceTree = "<group>"; };
|
||||
FA322CE70CEF74B1001761B3 /* defines.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = defines.h; sourceTree = "<group>"; };
|
||||
FA322CE80CEF74B1001761B3 /* hash.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = hash.c; sourceTree = "<group>"; };
|
||||
FA322CE90CEF74B1001761B3 /* hash.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = hash.h; sourceTree = "<group>"; };
|
||||
FA322CEA0CEF74B1001761B3 /* io.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = io.c; sourceTree = "<group>"; };
|
||||
FA322CEB0CEF74B1001761B3 /* io.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = io.h; sourceTree = "<group>"; };
|
||||
FA322CEC0CEF74B1001761B3 /* irc-channel.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-channel.c"; sourceTree = "<group>"; };
|
||||
FA322CED0CEF74B1001761B3 /* irc-channel.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-channel.h"; sourceTree = "<group>"; };
|
||||
FA322CEE0CEF74B1001761B3 /* irc-info.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-info.c"; sourceTree = "<group>"; };
|
||||
FA322CEF0CEF74B1001761B3 /* irc-info.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-info.h"; sourceTree = "<group>"; };
|
||||
FA322CF00CEF74B1001761B3 /* irc-login.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-login.c"; sourceTree = "<group>"; };
|
||||
FA322CF10CEF74B1001761B3 /* irc-login.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-login.h"; sourceTree = "<group>"; };
|
||||
FA322CF20CEF74B1001761B3 /* irc-mode.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-mode.c"; sourceTree = "<group>"; };
|
||||
FA322CF30CEF74B1001761B3 /* irc-mode.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-mode.h"; sourceTree = "<group>"; };
|
||||
FA322CF40CEF74B1001761B3 /* irc-op.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-op.c"; sourceTree = "<group>"; };
|
||||
FA322CF50CEF74B1001761B3 /* irc-op.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-op.h"; sourceTree = "<group>"; };
|
||||
FA322CF60CEF74B1001761B3 /* irc-oper.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-oper.c"; sourceTree = "<group>"; };
|
||||
FA322CF70CEF74B1001761B3 /* irc-oper.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-oper.h"; sourceTree = "<group>"; };
|
||||
FA322CF80CEF74B1001761B3 /* irc-server.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-server.c"; sourceTree = "<group>"; };
|
||||
FA322CF90CEF74B1001761B3 /* irc-server.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-server.h"; sourceTree = "<group>"; };
|
||||
FA322CFA0CEF74B1001761B3 /* irc-write.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-write.c"; sourceTree = "<group>"; };
|
||||
FA322CFB0CEF74B1001761B3 /* irc-write.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-write.h"; sourceTree = "<group>"; };
|
||||
FA322CFC0CEF74B1001761B3 /* irc.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = irc.c; sourceTree = "<group>"; };
|
||||
FA322CFD0CEF74B1001761B3 /* irc.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = irc.h; sourceTree = "<group>"; };
|
||||
FA322CFE0CEF74B1001761B3 /* lists.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = lists.c; sourceTree = "<group>"; };
|
||||
FA322CFF0CEF74B1001761B3 /* lists.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = lists.h; sourceTree = "<group>"; };
|
||||
FA322D000CEF74B1001761B3 /* log.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = log.c; sourceTree = "<group>"; };
|
||||
FA322D010CEF74B1001761B3 /* log.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = log.h; sourceTree = "<group>"; };
|
||||
FA322D020CEF74B1001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
|
||||
FA322D030CEF74B1001761B3 /* match.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = match.c; sourceTree = "<group>"; };
|
||||
FA322D040CEF74B1001761B3 /* match.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = match.h; sourceTree = "<group>"; };
|
||||
FA322D050CEF74B1001761B3 /* messages.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = messages.h; sourceTree = "<group>"; };
|
||||
FA322D060CEF74B1001761B3 /* ngircd.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = ngircd.c; sourceTree = "<group>"; };
|
||||
FA322D070CEF74B1001761B3 /* ngircd.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = ngircd.h; sourceTree = "<group>"; };
|
||||
FA322D080CEF74B1001761B3 /* parse.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = parse.c; sourceTree = "<group>"; };
|
||||
FA322D090CEF74B1001761B3 /* parse.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = parse.h; sourceTree = "<group>"; };
|
||||
FA322D0A0CEF74B1001761B3 /* rendezvous.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = rendezvous.c; sourceTree = "<group>"; };
|
||||
FA322D0B0CEF74B1001761B3 /* rendezvous.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = rendezvous.h; sourceTree = "<group>"; };
|
||||
FA322D0C0CEF74B1001761B3 /* resolve.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = resolve.c; sourceTree = "<group>"; };
|
||||
FA322D0D0CEF74B1001761B3 /* resolve.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = resolve.h; sourceTree = "<group>"; };
|
||||
FA322D0F0CEF74B1001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
|
||||
FA322D100CEF74B1001761B3 /* ansi2knr.1 */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.man; path = ansi2knr.1; sourceTree = "<group>"; };
|
||||
FA322D110CEF74B1001761B3 /* ansi2knr.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = ansi2knr.c; sourceTree = "<group>"; };
|
||||
FA322D120CEF74B1001761B3 /* exp.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = exp.h; sourceTree = "<group>"; };
|
||||
FA322D130CEF74B1001761B3 /* imp.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = imp.h; sourceTree = "<group>"; };
|
||||
FA322D140CEF74B1001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
|
||||
FA322D150CEF74B1001761B3 /* portab.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = portab.h; sourceTree = "<group>"; };
|
||||
FA322D160CEF74B1001761B3 /* portabtest.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = portabtest.c; sourceTree = "<group>"; };
|
||||
FA322D170CEF74B1001761B3 /* splint.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = splint.h; sourceTree = "<group>"; };
|
||||
FA322D180CEF74B1001761B3 /* strdup.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = strdup.c; sourceTree = "<group>"; };
|
||||
FA322D190CEF74B1001761B3 /* strlcpy.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = strlcpy.c; sourceTree = "<group>"; };
|
||||
FA322D1A0CEF74B1001761B3 /* vsnprintf.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = vsnprintf.c; sourceTree = "<group>"; };
|
||||
FA322D1C0CEF74B1001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
|
||||
FA322D1D0CEF74B1001761B3 /* channel-test.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "channel-test.e"; sourceTree = "<group>"; };
|
||||
FA322D1E0CEF74B1001761B3 /* check-idle.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "check-idle.e"; sourceTree = "<group>"; };
|
||||
FA322D1F0CEF74B1001761B3 /* connect-test.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "connect-test.e"; sourceTree = "<group>"; };
|
||||
FA322D200CEF74B1001761B3 /* functions.inc */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.pascal; path = functions.inc; sourceTree = "<group>"; };
|
||||
FA322D210CEF74B1001761B3 /* getpid.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = getpid.sh; sourceTree = "<group>"; };
|
||||
FA322D220CEF74B1001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
|
||||
FA322D230CEF74B1001761B3 /* mode-test.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "mode-test.e"; sourceTree = "<group>"; };
|
||||
FA322D240CEF74B1001761B3 /* ngircd-test.conf */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "ngircd-test.conf"; sourceTree = "<group>"; };
|
||||
FA322D250CEF74B1001761B3 /* README */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = README; sourceTree = "<group>"; };
|
||||
FA322D260CEF74B1001761B3 /* start-server.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = "start-server.sh"; sourceTree = "<group>"; };
|
||||
FA322D270CEF74B1001761B3 /* stop-server.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = "stop-server.sh"; sourceTree = "<group>"; };
|
||||
FA322D280CEF74B1001761B3 /* stress-A.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "stress-A.e"; sourceTree = "<group>"; };
|
||||
FA322D290CEF74B1001761B3 /* stress-B.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "stress-B.e"; sourceTree = "<group>"; };
|
||||
FA322D2A0CEF74B1001761B3 /* stress-server.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = "stress-server.sh"; sourceTree = "<group>"; };
|
||||
FA322D2B0CEF74B1001761B3 /* test-loop.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = "test-loop.sh"; sourceTree = "<group>"; };
|
||||
FA322D2C0CEF74B1001761B3 /* tests.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = tests.sh; sourceTree = "<group>"; };
|
||||
FA322D2D0CEF74B1001761B3 /* wait-tests.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = "wait-tests.sh"; sourceTree = "<group>"; };
|
||||
FA322D2F0CEF74B1001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
|
||||
FA322D300CEF74B1001761B3 /* ansi2knr.1 */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.man; path = ansi2knr.1; sourceTree = "<group>"; };
|
||||
FA322D310CEF74B1001761B3 /* ansi2knr.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = ansi2knr.c; sourceTree = "<group>"; };
|
||||
FA322D320CEF74B1001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
|
||||
FA322D330CEF74B1001761B3 /* tool.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = tool.c; sourceTree = "<group>"; };
|
||||
FA322D340CEF74B1001761B3 /* tool.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = tool.h; sourceTree = "<group>"; };
|
||||
FA322D5A0CEF750F001761B3 /* AUTHORS */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = AUTHORS; path = ../../AUTHORS; sourceTree = SOURCE_ROOT; };
|
||||
FA322D5B0CEF750F001761B3 /* autogen.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; name = autogen.sh; path = ../../autogen.sh; sourceTree = SOURCE_ROOT; };
|
||||
FA322D5C0CEF750F001761B3 /* ChangeLog */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = ChangeLog; path = ../../ChangeLog; sourceTree = SOURCE_ROOT; };
|
||||
FA322D5E0CEF750F001761B3 /* config.guess */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; name = config.guess; path = ../../config.guess; sourceTree = SOURCE_ROOT; };
|
||||
FA322D5F0CEF750F001761B3 /* config.sub */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; name = config.sub; path = ../../config.sub; sourceTree = SOURCE_ROOT; };
|
||||
FA322D600CEF750F001761B3 /* configure.in */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = configure.in; path = ../../configure.in; sourceTree = SOURCE_ROOT; };
|
||||
FA322D610CEF750F001761B3 /* COPYING */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = COPYING; path = ../../COPYING; sourceTree = SOURCE_ROOT; };
|
||||
FA322D620CEF750F001761B3 /* INSTALL */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = INSTALL; path = ../../INSTALL; sourceTree = SOURCE_ROOT; };
|
||||
FA322D630CEF750F001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = Makefile.am; path = ../../Makefile.am; sourceTree = SOURCE_ROOT; };
|
||||
FA322D640CEF750F001761B3 /* NEWS */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = NEWS; path = ../../NEWS; sourceTree = SOURCE_ROOT; };
|
||||
FA322D650CEF750F001761B3 /* README */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = README; path = ../../README; sourceTree = SOURCE_ROOT; };
|
||||
FA322D670CEF7523001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
|
||||
FA322D690CEF7523001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
|
||||
FA322D6A0CEF7523001761B3 /* changelog */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = changelog; sourceTree = "<group>"; };
|
||||
FA322D6B0CEF7523001761B3 /* compat */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = compat; sourceTree = "<group>"; };
|
||||
FA322D6C0CEF7523001761B3 /* control */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = control; sourceTree = "<group>"; };
|
||||
FA322D6D0CEF7523001761B3 /* copyright */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = copyright; sourceTree = "<group>"; };
|
||||
FA322D6E0CEF7523001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
|
||||
FA322D6F0CEF7523001761B3 /* ngircd.default */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = ngircd.default; sourceTree = "<group>"; };
|
||||
FA322D700CEF7523001761B3 /* ngircd.init */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = ngircd.init; sourceTree = "<group>"; };
|
||||
FA322D710CEF7523001761B3 /* ngircd.postinst */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = ngircd.postinst; sourceTree = "<group>"; };
|
||||
FA322D720CEF7523001761B3 /* rules */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = rules; sourceTree = "<group>"; };
|
||||
FA322D740CEF7523001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
|
||||
FA322D8D0CEF7523001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
|
||||
FA322D8E0CEF7523001761B3 /* ngIRCd.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = ngIRCd.xcodeproj; sourceTree = "<group>"; };
|
||||
FA322D910CEF7523001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
|
||||
FA322D920CEF7523001761B3 /* ngindent */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = ngindent; sourceTree = "<group>"; };
|
||||
FA322D930CEF7523001761B3 /* ngircd.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = ngircd.sh; sourceTree = "<group>"; };
|
||||
FA322D940CEF7523001761B3 /* ngircd.spec */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = ngircd.spec; sourceTree = "<group>"; };
|
||||
FA322D950CEF7523001761B3 /* README */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = README; sourceTree = "<group>"; };
|
||||
FA322D960CEF7523001761B3 /* systrace.policy */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = systrace.policy; sourceTree = "<group>"; };
|
||||
FA322D980CEF752C001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
|
||||
FA322D990CEF752C001761B3 /* CVS.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = CVS.txt; sourceTree = "<group>"; };
|
||||
FA322D9A0CEF752C001761B3 /* FAQ.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = FAQ.txt; sourceTree = "<group>"; };
|
||||
FA322D9B0CEF752C001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
|
||||
FA322D9C0CEF752C001761B3 /* Platforms.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Platforms.txt; sourceTree = "<group>"; };
|
||||
FA322D9D0CEF752C001761B3 /* Protocol.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Protocol.txt; sourceTree = "<group>"; };
|
||||
FA322D9E0CEF752C001761B3 /* README-AUX.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "README-AUX.txt"; sourceTree = "<group>"; };
|
||||
FA322D9F0CEF752C001761B3 /* README-BeOS.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "README-BeOS.txt"; sourceTree = "<group>"; };
|
||||
FA322DA00CEF752C001761B3 /* RFC.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = RFC.txt; sourceTree = "<group>"; };
|
||||
FA322DA10CEF752C001761B3 /* sample-ngircd.conf */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "sample-ngircd.conf"; sourceTree = "<group>"; };
|
||||
FA322DA30CEF752C001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
|
||||
FA322DA40CEF752C001761B3 /* Doxyfile */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Doxyfile; sourceTree = "<group>"; };
|
||||
FA322DA50CEF752C001761B3 /* footer.inc.html */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.html; path = footer.inc.html; sourceTree = "<group>"; };
|
||||
FA322DA60CEF752C001761B3 /* header.inc.html */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.html; path = header.inc.html; sourceTree = "<group>"; };
|
||||
FA322DA70CEF752C001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
|
||||
FA322DA80CEF752C001761B3 /* ngircd-doc.css */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.css; path = "ngircd-doc.css"; sourceTree = "<group>"; };
|
||||
FA322DA90CEF752C001761B3 /* SSL.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = SSL.txt; sourceTree = "<group>"; };
|
||||
FA322DAA0CEF752C001761B3 /* Zeroconf.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Zeroconf.txt; sourceTree = "<group>"; };
|
||||
FA322DAC0CEF7538001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
|
||||
FA322DAD0CEF7538001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
|
||||
FA322DAE0CEF7538001761B3 /* ngircd.8.tmpl */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = ngircd.8.tmpl; sourceTree = "<group>"; };
|
||||
FA322DAF0CEF7538001761B3 /* ngircd.conf.5.tmpl */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = ngircd.conf.5.tmpl; sourceTree = "<group>"; };
|
||||
FA322DB10CEF7565001761B3 /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = "<group>"; };
|
||||
FA322DBB0CEF773C001761B3 /* cvs-version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "cvs-version.h"; sourceTree = "<group>"; };
|
||||
FA322DC00CEF77CB001761B3 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = /usr/lib/libz.dylib; sourceTree = "<absolute>"; };
|
||||
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>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
8DD76FAD0486AB0100D96B5E /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
FA322DC10CEF77CB001761B3 /* libz.dylib in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
08FB7794FE84155DC02AAC07 /* ngIRCd */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FA322D970CEF752C001761B3 /* doc */,
|
||||
FA322D660CEF7523001761B3 /* contrib */,
|
||||
FA322DAB0CEF7538001761B3 /* man */,
|
||||
FA322CD40CEF74B0001761B3 /* src */,
|
||||
FA322D5A0CEF750F001761B3 /* AUTHORS */,
|
||||
FA322D610CEF750F001761B3 /* COPYING */,
|
||||
FA322D620CEF750F001761B3 /* INSTALL */,
|
||||
FA322D640CEF750F001761B3 /* NEWS */,
|
||||
FA322D650CEF750F001761B3 /* README */,
|
||||
FA322D5B0CEF750F001761B3 /* autogen.sh */,
|
||||
FA322D5C0CEF750F001761B3 /* ChangeLog */,
|
||||
FA322D5E0CEF750F001761B3 /* config.guess */,
|
||||
FA322D5F0CEF750F001761B3 /* config.sub */,
|
||||
FA322D600CEF750F001761B3 /* configure.in */,
|
||||
FA322D630CEF750F001761B3 /* Makefile.am */,
|
||||
1AB674ADFE9D54B511CA2CBB /* Products */,
|
||||
FA322DC00CEF77CB001761B3 /* libz.dylib */,
|
||||
);
|
||||
name = ngIRCd;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
1AB674ADFE9D54B511CA2CBB /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FA322BBA0CEF72E4001761B3 /* ngIRCd */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
FA322CD40CEF74B0001761B3 /* src */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FA322CD70CEF74B1001761B3 /* ngircd */,
|
||||
FA322D0E0CEF74B1001761B3 /* portab */,
|
||||
FA322D1B0CEF74B1001761B3 /* testsuite */,
|
||||
FA322D2E0CEF74B1001761B3 /* tool */,
|
||||
FA322CD50CEF74B1001761B3 /* .cvsignore */,
|
||||
FA322CD60CEF74B1001761B3 /* Makefile.am */,
|
||||
);
|
||||
name = src;
|
||||
path = ../../src;
|
||||
sourceTree = SOURCE_ROOT;
|
||||
};
|
||||
FA322CD70CEF74B1001761B3 /* ngircd */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FA322CD80CEF74B1001761B3 /* .cvsignore */,
|
||||
FA322CD90CEF74B1001761B3 /* array.c */,
|
||||
FA322CDA0CEF74B1001761B3 /* array.h */,
|
||||
FA322CDB0CEF74B1001761B3 /* channel.c */,
|
||||
FA322CDC0CEF74B1001761B3 /* channel.h */,
|
||||
FA322CDD0CEF74B1001761B3 /* client.c */,
|
||||
FA322CDE0CEF74B1001761B3 /* client.h */,
|
||||
FA322CDF0CEF74B1001761B3 /* conf.c */,
|
||||
FA322CE00CEF74B1001761B3 /* conf.h */,
|
||||
FA322CE10CEF74B1001761B3 /* conn-func.c */,
|
||||
FA322CE20CEF74B1001761B3 /* conn-func.h */,
|
||||
FA322CE30CEF74B1001761B3 /* conn-zip.c */,
|
||||
FA322CE40CEF74B1001761B3 /* conn-zip.h */,
|
||||
FA322CE50CEF74B1001761B3 /* conn.c */,
|
||||
FA322CE60CEF74B1001761B3 /* conn.h */,
|
||||
FA322CE70CEF74B1001761B3 /* defines.h */,
|
||||
FA322CE80CEF74B1001761B3 /* hash.c */,
|
||||
FA322CE90CEF74B1001761B3 /* hash.h */,
|
||||
FA322CEA0CEF74B1001761B3 /* io.c */,
|
||||
FA322CEB0CEF74B1001761B3 /* io.h */,
|
||||
FA322CEC0CEF74B1001761B3 /* irc-channel.c */,
|
||||
FA322CED0CEF74B1001761B3 /* irc-channel.h */,
|
||||
FA322CEE0CEF74B1001761B3 /* irc-info.c */,
|
||||
FA322CEF0CEF74B1001761B3 /* irc-info.h */,
|
||||
FA322CF00CEF74B1001761B3 /* irc-login.c */,
|
||||
FA322CF10CEF74B1001761B3 /* irc-login.h */,
|
||||
FA322CF20CEF74B1001761B3 /* irc-mode.c */,
|
||||
FA322CF30CEF74B1001761B3 /* irc-mode.h */,
|
||||
FA322CF40CEF74B1001761B3 /* irc-op.c */,
|
||||
FA322CF50CEF74B1001761B3 /* irc-op.h */,
|
||||
FA322CF60CEF74B1001761B3 /* irc-oper.c */,
|
||||
FA322CF70CEF74B1001761B3 /* irc-oper.h */,
|
||||
FA322CF80CEF74B1001761B3 /* irc-server.c */,
|
||||
FA322CF90CEF74B1001761B3 /* irc-server.h */,
|
||||
FA322CFA0CEF74B1001761B3 /* irc-write.c */,
|
||||
FA322CFB0CEF74B1001761B3 /* irc-write.h */,
|
||||
FA322CFC0CEF74B1001761B3 /* irc.c */,
|
||||
FA322CFD0CEF74B1001761B3 /* irc.h */,
|
||||
FA322CFE0CEF74B1001761B3 /* lists.c */,
|
||||
FA322CFF0CEF74B1001761B3 /* lists.h */,
|
||||
FA322D000CEF74B1001761B3 /* log.c */,
|
||||
FA322D010CEF74B1001761B3 /* log.h */,
|
||||
FA322D020CEF74B1001761B3 /* Makefile.am */,
|
||||
FA322D030CEF74B1001761B3 /* match.c */,
|
||||
FA322D040CEF74B1001761B3 /* match.h */,
|
||||
FA322D050CEF74B1001761B3 /* messages.h */,
|
||||
FA322D060CEF74B1001761B3 /* ngircd.c */,
|
||||
FA322D070CEF74B1001761B3 /* ngircd.h */,
|
||||
FAE5CC2D0CF2308A007D69B6 /* numeric.c */,
|
||||
FAE5CC2C0CF2308A007D69B6 /* numeric.h */,
|
||||
FA322D080CEF74B1001761B3 /* parse.c */,
|
||||
FA322D090CEF74B1001761B3 /* parse.h */,
|
||||
FA322D0A0CEF74B1001761B3 /* rendezvous.c */,
|
||||
FA322D0B0CEF74B1001761B3 /* rendezvous.h */,
|
||||
FA322D0C0CEF74B1001761B3 /* resolve.c */,
|
||||
FA322D0D0CEF74B1001761B3 /* resolve.h */,
|
||||
);
|
||||
path = ngircd;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
FA322D0E0CEF74B1001761B3 /* portab */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FA322D0F0CEF74B1001761B3 /* .cvsignore */,
|
||||
FA322D100CEF74B1001761B3 /* ansi2knr.1 */,
|
||||
FA322D110CEF74B1001761B3 /* ansi2knr.c */,
|
||||
FA322D120CEF74B1001761B3 /* exp.h */,
|
||||
FA322D130CEF74B1001761B3 /* imp.h */,
|
||||
FA322D140CEF74B1001761B3 /* Makefile.am */,
|
||||
FA322D150CEF74B1001761B3 /* portab.h */,
|
||||
FA322D160CEF74B1001761B3 /* portabtest.c */,
|
||||
FA322D170CEF74B1001761B3 /* splint.h */,
|
||||
FA322D180CEF74B1001761B3 /* strdup.c */,
|
||||
FA322D190CEF74B1001761B3 /* strlcpy.c */,
|
||||
FA322D1A0CEF74B1001761B3 /* vsnprintf.c */,
|
||||
);
|
||||
path = portab;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
FA322D1B0CEF74B1001761B3 /* testsuite */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FA322D1C0CEF74B1001761B3 /* .cvsignore */,
|
||||
FA322D1D0CEF74B1001761B3 /* channel-test.e */,
|
||||
FA322D1E0CEF74B1001761B3 /* check-idle.e */,
|
||||
FA322D1F0CEF74B1001761B3 /* connect-test.e */,
|
||||
FA322D200CEF74B1001761B3 /* functions.inc */,
|
||||
FA322D210CEF74B1001761B3 /* getpid.sh */,
|
||||
FA322D220CEF74B1001761B3 /* Makefile.am */,
|
||||
FA322D230CEF74B1001761B3 /* mode-test.e */,
|
||||
FA322D240CEF74B1001761B3 /* ngircd-test.conf */,
|
||||
FA322D250CEF74B1001761B3 /* README */,
|
||||
FA322D260CEF74B1001761B3 /* start-server.sh */,
|
||||
FA322D270CEF74B1001761B3 /* stop-server.sh */,
|
||||
FA322D280CEF74B1001761B3 /* stress-A.e */,
|
||||
FA322D290CEF74B1001761B3 /* stress-B.e */,
|
||||
FA322D2A0CEF74B1001761B3 /* stress-server.sh */,
|
||||
FA322D2B0CEF74B1001761B3 /* test-loop.sh */,
|
||||
FA322D2C0CEF74B1001761B3 /* tests.sh */,
|
||||
FA322D2D0CEF74B1001761B3 /* wait-tests.sh */,
|
||||
);
|
||||
path = testsuite;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
FA322D2E0CEF74B1001761B3 /* tool */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FA322D2F0CEF74B1001761B3 /* .cvsignore */,
|
||||
FA322D300CEF74B1001761B3 /* ansi2knr.1 */,
|
||||
FA322D310CEF74B1001761B3 /* ansi2knr.c */,
|
||||
FA322D320CEF74B1001761B3 /* Makefile.am */,
|
||||
FA322D330CEF74B1001761B3 /* tool.c */,
|
||||
FA322D340CEF74B1001761B3 /* tool.h */,
|
||||
);
|
||||
path = tool;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
FA322D660CEF7523001761B3 /* contrib */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FA322D670CEF7523001761B3 /* .cvsignore */,
|
||||
FA322D680CEF7523001761B3 /* Debian */,
|
||||
FA322D730CEF7523001761B3 /* MacOSX */,
|
||||
FA322D910CEF7523001761B3 /* Makefile.am */,
|
||||
FA322D920CEF7523001761B3 /* ngindent */,
|
||||
FA322D930CEF7523001761B3 /* ngircd.sh */,
|
||||
FA322D940CEF7523001761B3 /* ngircd.spec */,
|
||||
FA322D950CEF7523001761B3 /* README */,
|
||||
FA322D960CEF7523001761B3 /* systrace.policy */,
|
||||
);
|
||||
name = contrib;
|
||||
path = ..;
|
||||
sourceTree = SOURCE_ROOT;
|
||||
};
|
||||
FA322D680CEF7523001761B3 /* Debian */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FA322D690CEF7523001761B3 /* .cvsignore */,
|
||||
FA322D6A0CEF7523001761B3 /* changelog */,
|
||||
FA322D6B0CEF7523001761B3 /* compat */,
|
||||
FA322D6C0CEF7523001761B3 /* control */,
|
||||
FA322D6D0CEF7523001761B3 /* copyright */,
|
||||
FA322D6E0CEF7523001761B3 /* Makefile.am */,
|
||||
FA322D6F0CEF7523001761B3 /* ngircd.default */,
|
||||
FA322D700CEF7523001761B3 /* ngircd.init */,
|
||||
FA322D710CEF7523001761B3 /* ngircd.postinst */,
|
||||
FA322D720CEF7523001761B3 /* rules */,
|
||||
);
|
||||
path = Debian;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
FA322D730CEF7523001761B3 /* MacOSX */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FA322D740CEF7523001761B3 /* .cvsignore */,
|
||||
FA322D750CEF7523001761B3 /* build */,
|
||||
FA322D8D0CEF7523001761B3 /* Makefile.am */,
|
||||
FA322D8E0CEF7523001761B3 /* ngIRCd.xcodeproj */,
|
||||
FA322DB10CEF7565001761B3 /* config.h */,
|
||||
FA322DBB0CEF773C001761B3 /* cvs-version.h */,
|
||||
);
|
||||
path = MacOSX;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
FA322D750CEF7523001761B3 /* build */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FA322D760CEF7523001761B3 /* ngIRCd.build */,
|
||||
);
|
||||
path = build;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
FA322D760CEF7523001761B3 /* ngIRCd.build */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FA322D770CEF7523001761B3 /* Default */,
|
||||
FA322D7F0CEF7523001761B3 /* ngIRCd.pbxindex */,
|
||||
);
|
||||
path = ngIRCd.build;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
FA322D770CEF7523001761B3 /* Default */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FA322D780CEF7523001761B3 /* ngIRCd.build */,
|
||||
);
|
||||
path = Default;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
FA322D780CEF7523001761B3 /* ngIRCd.build */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FA322D7A0CEF7523001761B3 /* Objects-normal */,
|
||||
);
|
||||
path = ngIRCd.build;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
FA322D7A0CEF7523001761B3 /* Objects-normal */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FA322D7B0CEF7523001761B3 /* i386 */,
|
||||
FA322D7D0CEF7523001761B3 /* ppc */,
|
||||
);
|
||||
path = "Objects-normal";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
FA322D7B0CEF7523001761B3 /* i386 */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
);
|
||||
path = i386;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
FA322D7D0CEF7523001761B3 /* ppc */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
);
|
||||
path = ppc;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
FA322D7F0CEF7523001761B3 /* ngIRCd.pbxindex */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FA322D880CEF7523001761B3 /* strings.pbxstrings */,
|
||||
);
|
||||
path = ngIRCd.pbxindex;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
FA322D880CEF7523001761B3 /* strings.pbxstrings */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
);
|
||||
path = strings.pbxstrings;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
FA322D8F0CEF7523001761B3 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
FA322D970CEF752C001761B3 /* doc */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FA322D980CEF752C001761B3 /* .cvsignore */,
|
||||
FA322D990CEF752C001761B3 /* CVS.txt */,
|
||||
FA322D9A0CEF752C001761B3 /* FAQ.txt */,
|
||||
FA322D9B0CEF752C001761B3 /* Makefile.am */,
|
||||
FA322D9C0CEF752C001761B3 /* Platforms.txt */,
|
||||
FA322D9D0CEF752C001761B3 /* Protocol.txt */,
|
||||
FA322D9E0CEF752C001761B3 /* README-AUX.txt */,
|
||||
FA322D9F0CEF752C001761B3 /* README-BeOS.txt */,
|
||||
FA322DA00CEF752C001761B3 /* RFC.txt */,
|
||||
FA322DA10CEF752C001761B3 /* sample-ngircd.conf */,
|
||||
FA322DA20CEF752C001761B3 /* src */,
|
||||
FA322DA90CEF752C001761B3 /* SSL.txt */,
|
||||
FA322DAA0CEF752C001761B3 /* Zeroconf.txt */,
|
||||
);
|
||||
name = doc;
|
||||
path = ../../doc;
|
||||
sourceTree = SOURCE_ROOT;
|
||||
};
|
||||
FA322DA20CEF752C001761B3 /* src */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FA322DA30CEF752C001761B3 /* .cvsignore */,
|
||||
FA322DA40CEF752C001761B3 /* Doxyfile */,
|
||||
FA322DA50CEF752C001761B3 /* footer.inc.html */,
|
||||
FA322DA60CEF752C001761B3 /* header.inc.html */,
|
||||
FA322DA70CEF752C001761B3 /* Makefile.am */,
|
||||
FA322DA80CEF752C001761B3 /* ngircd-doc.css */,
|
||||
);
|
||||
path = src;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
FA322DAB0CEF7538001761B3 /* man */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FA322DAC0CEF7538001761B3 /* .cvsignore */,
|
||||
FA322DAD0CEF7538001761B3 /* Makefile.am */,
|
||||
FA322DAE0CEF7538001761B3 /* ngircd.8.tmpl */,
|
||||
FA322DAF0CEF7538001761B3 /* ngircd.conf.5.tmpl */,
|
||||
);
|
||||
name = man;
|
||||
path = ../../man;
|
||||
sourceTree = SOURCE_ROOT;
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
8DD76FA90486AB0100D96B5E /* ngIRCd */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 1DEB928508733DD80010E9CD /* Build configuration list for PBXNativeTarget "ngIRCd" */;
|
||||
buildPhases = (
|
||||
8DD76FAB0486AB0100D96B5E /* Sources */,
|
||||
8DD76FAD0486AB0100D96B5E /* Frameworks */,
|
||||
8DD76FAF0486AB0100D96B5E /* CopyFiles */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = ngIRCd;
|
||||
productInstallPath = "$(HOME)/bin";
|
||||
productName = ngIRCd;
|
||||
productReference = FA322BBA0CEF72E4001761B3 /* ngIRCd */;
|
||||
productType = "com.apple.product-type.tool";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
08FB7793FE84155DC02AAC07 /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
buildConfigurationList = 1DEB928908733DD80010E9CD /* Build configuration list for PBXProject "ngIRCd" */;
|
||||
compatibilityVersion = "Xcode 3.0";
|
||||
hasScannedForEncodings = 1;
|
||||
mainGroup = 08FB7794FE84155DC02AAC07 /* ngIRCd */;
|
||||
projectDirPath = "";
|
||||
projectReferences = (
|
||||
{
|
||||
ProductGroup = FA322D8F0CEF7523001761B3 /* Products */;
|
||||
ProjectRef = FA322D8E0CEF7523001761B3 /* ngIRCd.xcodeproj */;
|
||||
},
|
||||
);
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
8DD76FA90486AB0100D96B5E /* ngIRCd */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
8DD76FAB0486AB0100D96B5E /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
FA322D350CEF74B1001761B3 /* array.c in Sources */,
|
||||
FA322D360CEF74B1001761B3 /* channel.c in Sources */,
|
||||
FA322D370CEF74B1001761B3 /* client.c in Sources */,
|
||||
FA322D380CEF74B1001761B3 /* conf.c in Sources */,
|
||||
FA322D390CEF74B1001761B3 /* conn-func.c in Sources */,
|
||||
FA322D3A0CEF74B1001761B3 /* conn-zip.c in Sources */,
|
||||
FA322D3B0CEF74B1001761B3 /* conn.c in Sources */,
|
||||
FA322D3C0CEF74B1001761B3 /* hash.c in Sources */,
|
||||
FA322D3D0CEF74B1001761B3 /* io.c in Sources */,
|
||||
FA322D3E0CEF74B1001761B3 /* irc-channel.c in Sources */,
|
||||
FA322D3F0CEF74B1001761B3 /* irc-info.c in Sources */,
|
||||
FA322D400CEF74B1001761B3 /* irc-login.c in Sources */,
|
||||
FA322D410CEF74B1001761B3 /* irc-mode.c in Sources */,
|
||||
FA322D420CEF74B1001761B3 /* irc-op.c in Sources */,
|
||||
FA322D430CEF74B1001761B3 /* irc-oper.c in Sources */,
|
||||
FA322D440CEF74B1001761B3 /* irc-server.c in Sources */,
|
||||
FA322D450CEF74B1001761B3 /* irc-write.c in Sources */,
|
||||
FA322D460CEF74B1001761B3 /* irc.c in Sources */,
|
||||
FA322D470CEF74B1001761B3 /* lists.c in Sources */,
|
||||
FA322D480CEF74B1001761B3 /* log.c in Sources */,
|
||||
FA322D490CEF74B1001761B3 /* match.c in Sources */,
|
||||
FA322D4A0CEF74B1001761B3 /* ngircd.c in Sources */,
|
||||
FA322D4B0CEF74B1001761B3 /* parse.c in Sources */,
|
||||
FA322D4C0CEF74B1001761B3 /* rendezvous.c in Sources */,
|
||||
FA322D4D0CEF74B1001761B3 /* resolve.c in Sources */,
|
||||
FA322DBE0CEF7766001761B3 /* tool.c in Sources */,
|
||||
FAE5CC2E0CF2308A007D69B6 /* numeric.c in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
1DEB928708733DD80010E9CD /* Default */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
GCC_MODEL_TUNING = G5;
|
||||
INSTALL_PATH = /usr/local/bin;
|
||||
PRODUCT_NAME = ngIRCd;
|
||||
};
|
||||
name = Default;
|
||||
};
|
||||
1DEB928B08733DD80010E9CD /* Default */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ARCHS = (
|
||||
ppc,
|
||||
i386,
|
||||
);
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
PREBINDING = NO;
|
||||
SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk";
|
||||
};
|
||||
name = Default;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
1DEB928508733DD80010E9CD /* Build configuration list for PBXNativeTarget "ngIRCd" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
1DEB928708733DD80010E9CD /* Default */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Default;
|
||||
};
|
||||
1DEB928908733DD80010E9CD /* Build configuration list for PBXProject "ngIRCd" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
1DEB928B08733DD80010E9CD /* Default */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Default;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001-2004 by Alexander Barton,
|
||||
(c)2001-2005 Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd is free software and published under the
|
||||
@@ -10,11 +10,17 @@
|
||||
-- Contributions --
|
||||
|
||||
|
||||
MacOSX/
|
||||
- Project file for XCode "project builder" of Mac OS X.
|
||||
|
||||
Debian/
|
||||
- Various files for building Debian packages.
|
||||
- Various files for building Debian GNU/Linux packages (".deb's").
|
||||
|
||||
MacOSX/
|
||||
- Project files for XCode, the "project builder" of Apple Mac OS X.
|
||||
|
||||
ngindent
|
||||
- Script to indent the code of ngIRCd in the "standard way".
|
||||
|
||||
ngircd.sh
|
||||
- Start script for FreeBSD.
|
||||
|
||||
ngircd.spec
|
||||
- RPM "spec" file.
|
||||
@@ -24,4 +30,4 @@ systrace.policy
|
||||
|
||||
|
||||
--
|
||||
$Id: README,v 1.1 2004/04/28 12:18:50 alex Exp $
|
||||
$Id: README,v 1.3 2006/07/23 11:34:32 alex Exp $
|
||||
|
||||
16
contrib/ngindent
Executable file
16
contrib/ngindent
Executable file
@@ -0,0 +1,16 @@
|
||||
#/bin/sh
|
||||
|
||||
INDENTARGS="-kr -i8 -ts8 -l80 -c3 -cd41 -ss -ncs -psl"
|
||||
|
||||
# check if indent(1) is available
|
||||
type indent >/dev/null 2>&1 && INDENT="indent"
|
||||
type gnuindent >/dev/null 2>&1 && INDENT="gnuindent"
|
||||
|
||||
if [ -z "$INDENT" ]; then
|
||||
echo "Error: GNU \"indent\" not found!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
$INDENT -v $INDENTARGS $*
|
||||
|
||||
# -eof-
|
||||
51
contrib/ngircd.sh
Normal file
51
contrib/ngircd.sh
Normal file
@@ -0,0 +1,51 @@
|
||||
#!/bin/sh
|
||||
|
||||
# PROVIDE: ngircd
|
||||
# REQUIRE: NETWORKING SERVERS
|
||||
# BEFORE: DAEMON
|
||||
# KEYWORD: FreeBSD shutdown
|
||||
|
||||
# Add the following line to /etc/rc.conf to enable `ngircd':
|
||||
#
|
||||
#ngircd_enable="YES"
|
||||
#
|
||||
|
||||
. "/etc/rc.subr"
|
||||
|
||||
name="ngircd"
|
||||
rcvar=`set_rcvar`
|
||||
|
||||
command="/usr/local/sbin/ngircd"
|
||||
command_args=""
|
||||
|
||||
load_rc_config "$name"
|
||||
: ${ngircd_enable="NO"}
|
||||
: ${ngircd_flags=""}
|
||||
|
||||
required_files="/usr/local/etc/$name.conf"
|
||||
pidfile="${ngircd_pidfile:-/var/run/${name}/${name}.pid}"
|
||||
|
||||
if [ ! x"${ngircd_chrootdir}" = x ];then
|
||||
# Mount a devfs in the chroot directory if needed
|
||||
if [ ! -c ${ngircd_chrootdir}/dev/random \
|
||||
-o ! -c ${ngircd_chrootdir}/dev/null ]; then
|
||||
umount ${ngircd_chrootdir}/dev 2>/dev/null
|
||||
mount_devfs devfs ${ngircd_chrootdir}/dev
|
||||
fi
|
||||
|
||||
devfs -m ${ngircd_chrootdir}/dev rule apply hide
|
||||
devfs -m ${ngircd_chrootdir}/dev rule apply path null unhide
|
||||
devfs -m ${ngircd_chrootdir}/dev rule apply path random unhide
|
||||
|
||||
# Copy local timezone information if it is not up to date.
|
||||
if [ -f /etc/localtime ]; then
|
||||
cmp -s /etc/localtime "${named_chrootdir}/etc/localtime" || \
|
||||
cp -p /etc/localtime "${named_chrootdir}/etc/localtime"
|
||||
fi
|
||||
|
||||
pidfile="${ngircd_chrootdir}${pidfile}"
|
||||
fi
|
||||
|
||||
run_rc_command "$1"
|
||||
|
||||
# -eof-
|
||||
@@ -1,5 +1,5 @@
|
||||
%define name ngircd
|
||||
%define version CVSHEAD
|
||||
%define version 0.11.1
|
||||
%define release 1
|
||||
%define prefix %{_prefix}
|
||||
|
||||
|
||||
2
doc/.cvsignore
Normal file
2
doc/.cvsignore
Normal file
@@ -0,0 +1,2 @@
|
||||
Makefile
|
||||
Makefile.in
|
||||
19
doc/CVS.txt
19
doc/CVS.txt
@@ -1,7 +1,7 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001-2003 by Alexander Barton,
|
||||
(c)2001-2006 Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd is free software and published under the
|
||||
@@ -21,18 +21,19 @@ To access the source tree anonymously in read-only mode, follow these steps:
|
||||
|
||||
Login to the CVS server:
|
||||
|
||||
$ cvs -d:pserver:anonymous@arthur.ath.cx:/usr/local/CVS/ngircd login
|
||||
$ cvs -d:pserver:anonymous@ngircd.barton.de:/srv/cvs/ngircd login
|
||||
|
||||
Use "anonymous" as user name and no password (just hit Return). Now you can
|
||||
check out the sources:
|
||||
|
||||
$ cvs -d:pserver:anonymous@arthur.ath.cx:/usr/local/CVS/ngircd checkout ngircd
|
||||
$ cvs -d:pserver:anonymous@ngircd.barton.de:/srv/cvs/ngircd checkout ngircd
|
||||
|
||||
Thereby a new folder "ngircd" will be created containing all the individual
|
||||
source files.
|
||||
source files. (Substitute the last "ngircd" with "website" to check out all
|
||||
the files of the homepage of ngIRCd.)
|
||||
|
||||
This is the "working folder", all CVS commands will be executed from within
|
||||
this folder in the future.
|
||||
The newly created folder ("ngircd" or "website") is the "working folder", all
|
||||
CVS commands will be executed from within this folder in the future.
|
||||
|
||||
Please note: When checking out a fresh copy of ngIRCd from CVS, the
|
||||
configure script doesn't exist; you have to run the autogen.sh shell script
|
||||
@@ -46,11 +47,11 @@ Updating the CVS tree:
|
||||
You can update a single file or the complete source tree.
|
||||
|
||||
|
||||
III. Write Access
|
||||
~~~~~~~~~~~~~~~~~
|
||||
II. Write Access
|
||||
~~~~~~~~~~~~~~~~
|
||||
If you want to contribute a couple of patches and write access to the CVS
|
||||
repository would be handy, please contact Alex Barton, <alex@barton.de>.
|
||||
|
||||
|
||||
--
|
||||
$Id: CVS.txt,v 1.7 2003/03/26 22:34:33 alex Exp $
|
||||
$Id: CVS.txt,v 1.9 2006/08/03 14:37:29 alex Exp $
|
||||
|
||||
26
doc/FAQ.txt
26
doc/FAQ.txt
@@ -17,7 +17,7 @@ A: Yes. ngIRCd is compatible to the original ircd used by IRCNet. Actually
|
||||
this is being tested with version 2.10.3p3.
|
||||
|
||||
Q: Is there a homepage with further information and downloads?
|
||||
A: Yes. Please visit <http://arthur.ath.cx/~alex/ngircd/>.
|
||||
A: Yes. Please visit <http://ngircd.barton.de/>.
|
||||
|
||||
Q: Why should I use ngIRCd instead of the original one?
|
||||
A: ngIRCd offers several benefits: no problems with dynamic IPs, easy to
|
||||
@@ -51,17 +51,29 @@ A: Most probably you are using version 1.5 of GNU automake which seems to be
|
||||
1.4 of GNU automake shipped with this distribution; it should work, too.)
|
||||
|
||||
|
||||
III. Bugs!?
|
||||
~~~~~~~~~~~
|
||||
III. Runtime
|
||||
~~~~~~~~~~~~
|
||||
|
||||
Q: I cannot connect to remote peers when I use the chroot option, the
|
||||
following is logged: "Can't resolve example.com: unknown error!".
|
||||
A: On Linux/glibc with chroot enabled you need to put some libraries inside
|
||||
the chroot as well, notably libnss_dns; maybe others. Unfortunately, even
|
||||
linking ngircd statically does not help this. The only known workaround
|
||||
is to either disable chroot support or to link against dietlibc instead
|
||||
of glibc. (tnx to Sebastian Siewior)
|
||||
|
||||
|
||||
IV. Bugs!?
|
||||
~~~~~~~~~~
|
||||
Q: Is there a list of known bugs and desired feature enhancements?
|
||||
A: Yes. Have a look at the bug tracking system (Bugzilla) for ngIRCd located
|
||||
at <http://arthur.ath.cx/bugzilla/ngircd/>. There you can file bug reports
|
||||
and feature requests as well as search the bug database.
|
||||
at <http://ngircd.barton.de/bugzilla/index.cgi>. There you can file bug
|
||||
reports and feature requests as well as search the bug database.
|
||||
|
||||
Q: What should I do if I found a bug?
|
||||
A: Please file a bug report at <http://arthur.ath.cx/bugzilla/ngircd/>!
|
||||
A: Please file a bug report at <http://ngircd.barton.de/bugzilla/index.cgi>!
|
||||
The author of the particular component will be notified automagically :-)
|
||||
|
||||
|
||||
--
|
||||
$Id: FAQ.txt,v 1.7 2003/11/07 21:32:15 alex Exp $
|
||||
$Id: FAQ.txt,v 1.11.4.1 2008/01/02 22:36:48 fw Exp $
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#
|
||||
# ngIRCd -- The Next Generation IRC Daemon
|
||||
# Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
|
||||
# Copyright (c)2001-2007 by Alexander Barton (alex@barton.de)
|
||||
#
|
||||
# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
# der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
@@ -9,11 +9,13 @@
|
||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
#
|
||||
# $Id: Makefile.am,v 1.17 2003/04/22 23:50:18 alex Exp $
|
||||
# $Id: Makefile.am,v 1.22 2007/11/20 21:39:35 alex Exp $
|
||||
#
|
||||
|
||||
EXTRA_DIST = CVS.txt FAQ.txt Protocol.txt Platforms.txt \
|
||||
README-AUX.txt README-BeOS.txt RFC.txt sample-ngircd.conf
|
||||
SUBDIRS = src
|
||||
|
||||
EXTRA_DIST = CVS.txt FAQ.txt Protocol.txt Platforms.txt README-AUX.txt \
|
||||
README-BeOS.txt RFC.txt SSL.txt Zeroconf.txt sample-ngircd.conf
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -f Makefile Makefile.in
|
||||
@@ -36,4 +38,7 @@ install-data-hook:
|
||||
uninstall-hook:
|
||||
rm -rf $(DESTDIR)$(docdir)
|
||||
|
||||
srcdoc:
|
||||
make -C src srcdoc
|
||||
|
||||
# -eof-
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001-2004 Alexander Barton
|
||||
(c)2001-2006 Alexander Barton
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd is free software and published under the
|
||||
@@ -26,34 +26,52 @@ list can be updated. Thanks for your help!
|
||||
| | | |
|
||||
Platform Compiler ngIRCd Date Tester C M T R See
|
||||
--------------------------- ------------ ---------- -------- ------ - - - - ---
|
||||
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
|
||||
hppa1.1/unknown/linux-gnu gcc 3.3.3 0.8.0 04-05-30 alex Y Y Y Y
|
||||
hppa2.0/unknown/linux-gnu gcc 3.3.5 0.9.x-CVS 05-06-27 alex Y Y Y Y
|
||||
i386/pc/solaris2.9 gcc 3.2.2 CVSHEAD 04-02-24 alex Y Y Y Y
|
||||
i386/unknown/freebsd5.0 gcc 3.2.1 0.7.0 03-05-15 alex Y Y Y Y
|
||||
i386/unknown/gnu0.3 gcc 3.2.3 CVSHEAD 03-05-05 alex Y Y n Y
|
||||
i386/pc/solaris2.11 gcc 3.4.3 CVSHEAD 06-08-04 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.1 gcc 3.4.4 CVSHEAD 06-05-07 fw 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/netbsdelf1.6.1 gcc 2.95.3 CVSHEAD 04-02-24 alex Y Y Y Y
|
||||
i686/pc/cygwin gcc 3.2 0.7.x-CVS 03-04-24 alex Y Y n Y
|
||||
i686/pc/linux-gnu gcc 2.95 0.7.0 03-05-15 alex Y Y Y Y (1)
|
||||
i686/pc/linux-gnu gcc 3.3.3 CVSHEAD 04-02-22 alex Y Y Y Y (1)
|
||||
i386/unknown/netbsdelf3.0.1 gcc 3.3.3 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)
|
||||
i686/pc/cygwin gcc 3.3.1 0.8.0 04-05-30 alex Y Y n Y
|
||||
i686/pc/linux-gnu gcc 2.95.4 0.8.0 04-05-30 alex Y Y Y Y (1)
|
||||
i686/pc/linux-gnu gcc 3.3.3 0.8.0 04-05-30 alex Y Y Y Y (1)
|
||||
i386/pc/linux-gnu gcc 4.1.2 0.10.0-p1 06-08-30 alex Y Y Y Y (1)
|
||||
m68k/apple/aux3.1.1 Orig. A/UX 0.7.x-CVS 03-04-22 alex Y Y Y Y (2)
|
||||
m68k/hp/hp-ux9.10 Orig. HPUX 0.7.x-CVS 03-04-30 goetz Y Y Y Y
|
||||
m88k/dg/dgux5.4R3.10 gcc 2.5.8 CVSHEAD 04-03-15 alex Y Y ? ?
|
||||
powerpc/apple/darwin6.5 gcc 3.1 0.7.x-CVS 03-04-23 alex Y Y Y Y
|
||||
powerpc/apple/darwin7.2.0 gcc 3.3 CVSHEAD 04-02-22 alex Y Y Y Y
|
||||
powerpc/apple/darwin7.4.0 gcc 3.3 0.8.0 04-05-30 alex Y Y Y Y
|
||||
powerpc/apple/darwin7.9.0 gcc 3.3 CVSHEAD 06-05-07 fw Y Y Y Y (3)
|
||||
powerpc/apple/darwin8.1.0 gcc 4.0 0.9.x-CVS 05-06-27 alex Y Y Y Y
|
||||
powerpc/unknown/linux-gnu gcc 3.3.3 0.8.0 04-05-30 alex Y Y Y Y
|
||||
powerpc/unknown/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.7 gcc 3.3 CVSHEAD 04-02-24 alex Y Y Y Y
|
||||
sparc/sun/solaris2.7 gcc 3.3 0.8.0 04-05-30 alex Y Y Y Y
|
||||
sparc/unkn./netbsdelf1.6.1 gcc 2.95.3 0.8.0 04-05-30 alex Y Y Y Y
|
||||
|
||||
|
||||
Notes
|
||||
~~~~~
|
||||
|
||||
(1) i686/pc/linux-gnu:
|
||||
ngIRCd has been tested with various Linux distributions, such as SuSE,
|
||||
RedHat, Debian, and Gentoo using Kernels 2.2.x, 2.4.x and 2.6.x with
|
||||
various versions of the GNU C compiler (2.95.3, 3.0, 3.2, and 3.3). The
|
||||
eldest glibc used was glibc-2.0.7. ngIRCd compiled and run on all these
|
||||
systems without problems.
|
||||
various versions of the GNU C compiler (starting with 2.95.x and up to
|
||||
version 4.1.x). The eldest glibc used was glibc-2.0.7. ngIRCd compiled
|
||||
and run on all these systems without problems.
|
||||
Actual Linux kernels (2.6.x) and glic's support the epoll() IO interface.
|
||||
|
||||
(2) This compiler is an pre-ANSI C compiler, therefore the source code is
|
||||
automatically converted using the included ansi2knr tool while building.
|
||||
|
||||
|
||||
(3) Using the kqueue() IO interface.
|
||||
|
||||
--
|
||||
$Id: Platforms.txt,v 1.11 2004/04/05 11:11:05 alex Exp $
|
||||
$Id: Platforms.txt,v 1.18 2006/10/08 14:09:16 alex Exp $
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001-2003 by Alexander Barton,
|
||||
(c)2001-2007 Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd is free software and published under the
|
||||
@@ -79,6 +79,9 @@ The following <serverflags> are defined at the moment:
|
||||
peer understands this flag, it will send "MODE +I" and "MODE +b"
|
||||
commands after the server link has been established.
|
||||
|
||||
- H: The server supports the "enhanced server handshake", see section II.2
|
||||
for a detailed description.
|
||||
|
||||
- o: IRC operators are allowed to change channel- and channel-user-modes
|
||||
even if they aren't channel-operator of the affected channel.
|
||||
|
||||
@@ -90,10 +93,53 @@ The optional parameter <options> is used to propagate server options as
|
||||
defined in RFC 2813, section 4.1.1.
|
||||
|
||||
|
||||
II.2 Exchange channel-modes, topics, and persistent channels
|
||||
II.2 Enhanced Server Handshake
|
||||
|
||||
The "enhanced server handshake" is used when both servers support this IRC+
|
||||
extension, which is indicated by the 'H' flag in the <serverflags> sent with
|
||||
the PASS command, see section II.1.
|
||||
|
||||
It basically means, that after exchanging the PASS and SERVER commands the
|
||||
server is not registered in the network (as usual), but that IRC numerics
|
||||
are exchanged until the numeric 376 (ENDOFMOTD) is received. Afterwards the
|
||||
peer is registered in the network as with the regular IRC protocol.
|
||||
|
||||
A server implementing the enhanced server handshake (and indicating this
|
||||
using 'H' in the <serverflags>) MUST ignore all unknown numerics to it
|
||||
silently.
|
||||
|
||||
In addition, such a server should at least send the numeric 005 (ISUPPORT)
|
||||
to its peer, containing the following information. Syntax: <key>=<value>,
|
||||
one token per IRC parameter. If the server has to send more than 12 token
|
||||
it must send separate ISUPPORT numerics (this is a limitation of the IRC
|
||||
protocol which allows at max 15 arguments per command).
|
||||
|
||||
- NICKLEN: Maximum nickname length. Default: 9.
|
||||
- CASEMAPPING: Case mapping used for nick- and channel name comparing.
|
||||
Default: "ascii", the chars [a-z] are lowercase of [A-Z].
|
||||
- PREFIX: List of channel modes a person can get and the respective prefix
|
||||
a channel or nickname will get in case the person has it. The order of the
|
||||
modes goes from most powerful to least powerful. Default: "(ov)@+"
|
||||
- CHANTYPES: Supported channel prefixes. Default: "#".
|
||||
- CHANMODES: List of channel modes for 4 types, separated by comma (","):
|
||||
Mode that adds or removes a nick or address to a list, mode that changes
|
||||
a setting (both have always has a parameter), mode that changes a setting
|
||||
and only has a parameter when set, and mode that changes a setting and
|
||||
never has a parameter. For example "bI,k,l,imnPst".
|
||||
- CHANLIMIT: Maximum number of channels allowed to join by channel prefix,
|
||||
for example "#:10".
|
||||
|
||||
Please see <http://www.irc.org/tech_docs/005.html> for details.
|
||||
|
||||
The information exchanged using ISUPPORT can be used to detect configuration
|
||||
incompatibilities (different maximum nick name length, for example) and
|
||||
therefore to disconnect the peer prior to registering it in the network.
|
||||
|
||||
|
||||
II.3 Exchange channel-modes, topics, and persistent channels
|
||||
|
||||
Command: CHANINFO
|
||||
Parameters: <channel> +<modes> <key> <maxusers> [<topic>]
|
||||
Parameters: <channel> +<modes> <key> <limit> [<topic>]
|
||||
Used by: servers only
|
||||
|
||||
CHANINFO is used by servers to inform each other about a channel: its
|
||||
@@ -115,4 +161,4 @@ channel mode). In this case <limit> should be "0".
|
||||
|
||||
|
||||
--
|
||||
$Id: Protocol.txt,v 1.12 2004/04/25 15:44:10 alex Exp $
|
||||
$Id: Protocol.txt,v 1.14 2007/11/21 12:16:35 alex Exp $
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001-2003 by Alexander Barton,
|
||||
(c)2001-2005 Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd is free software and published under the
|
||||
@@ -22,7 +22,7 @@ The following software packages are needed:
|
||||
- GNU sed
|
||||
Source:
|
||||
http://www.rezepte-im-web.de/appleux/sed-3.02.tar.gz
|
||||
ftp://arthur.ath.cx/pub/AUX/Software/Tools/sed-3.02.tar.gz
|
||||
ftp://arthur.barton.de/pub/unix/aux/tools/sed-3.02.tar.gz
|
||||
|
||||
A/UX comes with /bin/sed which isn't supporting all functions needed
|
||||
by GNU automake/autoconf.
|
||||
@@ -33,8 +33,8 @@ The following software packages are needed:
|
||||
|
||||
- libUTIL.a
|
||||
Source:
|
||||
http://ftp.mayn.de/pub/apple/apple_unix/Sys_stuff/libUTIL-2.1.tar.gz
|
||||
ftp://arthur.ath.cx/pub/AUX/Software/Libraries/libUTIL-2.1.tar.gz
|
||||
ftp://ftp.mayn.de/pub/really_old_stuff/apple/apple_unix/Sys_stuff/libUTIL-2.1.tar.gz>
|
||||
ftp://arthur.barton.de/pub/unix/aux/libraries/libUTIL-2.1.tar.gz
|
||||
|
||||
This library contains functions that are common on other UNIX
|
||||
systems but not on A/UX e.g. memmove(), strerror() und strdup().
|
||||
@@ -50,7 +50,7 @@ A few hints in case of errors:
|
||||
(so 'configure' uses its own shell script) or use a fully functionable one.
|
||||
There's at least one binary "out there" causing problems. The one
|
||||
of the GNU fileutils works fine:
|
||||
ftp://arthur.ath.cx/pub/UNIX/AUX/Software/Tools/fileutils-4.0.tar.gz
|
||||
ftp://arthur.barton.de/pub/unix/aux/tools/fileutils-4.0.tar.gz
|
||||
|
||||
- The precompiled binary of the old 'bash' shouldn't be installed within
|
||||
/bin (better do this in /usr/local/bin) because 'configure' would
|
||||
@@ -64,4 +64,4 @@ A few hints in case of errors:
|
||||
even if you don't use ngIRCd.
|
||||
|
||||
--
|
||||
$Id: README-AUX.txt,v 1.8 2003/04/21 21:59:34 goetz Exp $
|
||||
$Id: README-AUX.txt,v 1.10 2006/07/23 12:19:57 alex Exp $
|
||||
|
||||
58
doc/SSL.txt
Normal file
58
doc/SSL.txt
Normal file
@@ -0,0 +1,58 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001-2004 by Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd is free software and published under the
|
||||
terms of the GNU General Public License.
|
||||
|
||||
-- SSL.txt --
|
||||
|
||||
|
||||
ngIRCd actually doesn't support secure connections for client-server or
|
||||
server-server links using SSL, the Secure Socket Layer, by itself. But you can
|
||||
use the stunnel(8) command to make this work.
|
||||
|
||||
<http://stunnel.mirt.net/>
|
||||
<http://www.stunnel.org/>
|
||||
|
||||
Stefan Sperling (stefan at binarchy dot net) mailed me the following text as a
|
||||
short "how-to", thanks Stefan!
|
||||
|
||||
|
||||
=== snip ===
|
||||
! This guide applies to stunnel 4.x !
|
||||
|
||||
Put this in your stunnel.conf:
|
||||
|
||||
[ircs]
|
||||
accept = 6667
|
||||
connect = 6668
|
||||
|
||||
This makes stunnel listen for incoming connections
|
||||
on port 6667 and forward decrypted data to port 6668.
|
||||
We call the connection 'ircs'. Stunnel will use this
|
||||
name when logging connection attempts via syslog.
|
||||
You can also use the name in /etc/hosts.{allow,deny}
|
||||
if you run tcp-wrappers.
|
||||
|
||||
To make sure ngircd is listening on the port where
|
||||
the decrypted data arrives, set
|
||||
|
||||
Ports = 6668
|
||||
|
||||
in your ngircd.conf.
|
||||
|
||||
Start stunnel and restart ngircd.
|
||||
|
||||
That's it.
|
||||
Don't forget to activate ssl support in your irc client ;)
|
||||
=== snip ===
|
||||
|
||||
|
||||
Probably ngIRCd will include support for SSL in the future ...
|
||||
|
||||
|
||||
--
|
||||
$Id: SSL.txt,v 1.2 2004/12/27 01:11:40 alex Exp $
|
||||
40
doc/Zeroconf.txt
Normal file
40
doc/Zeroconf.txt
Normal file
@@ -0,0 +1,40 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001-2006 Alexander Barton
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd is free software and published under the
|
||||
terms of the GNU General Public License.
|
||||
|
||||
-- Zeroconf.txt --
|
||||
|
||||
|
||||
ngIRCd supports one aspect of Zeroconf Networking[1]: Multicast DNS (mDNS[2])
|
||||
with DNS Service Discovery (DNS-SD[3]).
|
||||
|
||||
To use this features you can use one of two APIs:
|
||||
|
||||
a) Apple "Bonjour" API as used by Mac OS X,
|
||||
b) the Howl[4] Zeroconf library or the Howl compatibility layer
|
||||
of the newer Avahi[5] library.
|
||||
|
||||
When calling the configure script using the "--with-zeroconf" switch the
|
||||
avalable API will be autodetected and the required additional libraries will
|
||||
be linked to the ngircd binary as required.
|
||||
|
||||
ngIRCd then registers a DNS-SD service for each port it is listening on using
|
||||
the service type "_ircu._tcp.".
|
||||
|
||||
|
||||
Links:
|
||||
|
||||
[1] http://www.zeroconf.org/
|
||||
[2] http://www.multicastdns.org/
|
||||
[3] http://www.dns-sd.org/
|
||||
[4] http://www.porchdogsoft.com/products/howl/
|
||||
[5] http://avahi.org/
|
||||
|
||||
|
||||
--
|
||||
$Id: Zeroconf.txt,v 1.2 2006/08/03 14:37:29 alex Exp $
|
||||
@@ -1,4 +1,4 @@
|
||||
# $Id: sample-ngircd.conf,v 1.26 2004/05/07 11:19:20 alex Exp $
|
||||
# $Id: sample-ngircd.conf,v 1.43.2.1 2008/01/07 23:10:28 alex Exp $
|
||||
|
||||
#
|
||||
# This is a sample configuration file for the ngIRCd, which must be adepted
|
||||
@@ -6,27 +6,30 @@
|
||||
#
|
||||
# Comments are started with "#" or ";".
|
||||
#
|
||||
# A lot of configuration options in this file start with a ";". You have
|
||||
# to remove the ";" in front of each variable to actually set a value!
|
||||
# The disabled variables are shown with example values for completeness.
|
||||
#
|
||||
# Use "ngircd --configtest" (see manual page ngircd(8)) to validate that the
|
||||
# server interpreted the configuration file as expected!
|
||||
# server interprets the configuration file as expected!
|
||||
#
|
||||
|
||||
[Global]
|
||||
|
||||
# The [Global] section of this file is used to define the main
|
||||
# configuration of the server, like the server name and the ports
|
||||
# on which the server should be listening.
|
||||
|
||||
|
||||
# Server name in the IRC network, must contain at least one dot
|
||||
# (".") and be unique in the IRC network. Required!
|
||||
Name = irc.the.net
|
||||
|
||||
|
||||
# Info text of the server. This will be shown by WHOIS and
|
||||
# LINKS requests for example.
|
||||
Info = Server Info Text
|
||||
|
||||
# Global password for all users needed to connect to the server
|
||||
;Password = abc
|
||||
|
||||
|
||||
# Information about the server and the administrator, used by the
|
||||
# ADMIN command. Not required by server but by RFC!
|
||||
;AdminInfo1 = Description
|
||||
@@ -34,13 +37,13 @@
|
||||
;AdminEMail = admin@irc.server
|
||||
|
||||
# Ports on which the server should listen. There may be more than
|
||||
# one port, separated with ";". (Default: 6667)
|
||||
;Ports = 6667, 6668, 66694
|
||||
# one port, separated with ",". (Default: 6667)
|
||||
;Ports = 6667, 6668, 6669
|
||||
|
||||
# IP address on which the server should listen. (Default: empty,
|
||||
# so the server listens on all IP addresses of the system)
|
||||
;Listen = 1.2.3.4
|
||||
|
||||
|
||||
# Text file with the "message of the day" (MOTD). This message will
|
||||
# be shown to all users connecting to the server:
|
||||
;MotdFile = /usr/local/etc/ngircd.motd
|
||||
@@ -68,6 +71,12 @@
|
||||
# with root privileges!
|
||||
;ChrootDir = /var/empty
|
||||
|
||||
# This tells ngircd to write its current process id to a file.
|
||||
# Note that the pidfile is written AFTER chroot and switching uid,
|
||||
# i. e. the Directory the pidfile resides in must be writeable by
|
||||
# the ngircd user and exist in the chroot directory.
|
||||
;PidFile = /var/run/ngircd/ngircd.pid
|
||||
|
||||
# After <PingTimeout> seconds of inactivity the server will send a
|
||||
# PING to the peer to test whether it is alive or not.
|
||||
;PingTimeout = 120
|
||||
@@ -84,33 +93,54 @@
|
||||
# they are not(!) channel-operators?
|
||||
;OperCanUseMode = no
|
||||
|
||||
# Mask IRC Operator mode requests as if they were coming from the
|
||||
# server? (This is a compatibility hack for ircd-irc2 servers)
|
||||
;OperServerMode = no
|
||||
|
||||
# Allow Pre-Defined Channels only (see Section [Channels])
|
||||
;PredefChannelsOnly = no
|
||||
|
||||
# Don't do any DNS lookups when a client connects to the server.
|
||||
;NoDNS = no
|
||||
|
||||
# Maximum number of simultaneous connection the server is allowed
|
||||
# to accept (<=0: unlimited):
|
||||
;MaxConnections = -1
|
||||
|
||||
# to accept (0: unlimited):
|
||||
;MaxConnections = 0
|
||||
|
||||
# Maximum number of simultaneous connections from a single IP address
|
||||
# the server will accept (<=0: unlimited):
|
||||
# the server will accept (0: unlimited):
|
||||
;MaxConnectionsIP = 5
|
||||
|
||||
# Maximum number of channels a user can be member of (<=0: no limit):
|
||||
# Maximum number of channels a user can be member of (0: no limit):
|
||||
;MaxJoins = 10
|
||||
|
||||
# Maximum length of an user nick name (Default: 9, as in RFC 2812).
|
||||
# Please note that all servers in an IRC network MUST use the same
|
||||
# maximum nick name length!
|
||||
;MaxNickLength = 9
|
||||
|
||||
[Operator]
|
||||
# [Operator] sections are used to define IRC Operators. There may be
|
||||
# more than one [Operator] block, one for each local operator.
|
||||
|
||||
|
||||
# ID of the operator (may be different of the nick name)
|
||||
;Name = TheOper
|
||||
|
||||
# Password of the IRC operator
|
||||
;Password = ThePwd
|
||||
|
||||
# Optional Mask from which /OPER will be accepted
|
||||
;Mask = *!ident@somewhere.example.com
|
||||
|
||||
[Operator]
|
||||
# More [Operator] sections, if you like ...
|
||||
|
||||
[Server]
|
||||
# Other servers are configured in [Server] sections. If you
|
||||
# configure a port for the connection, then this ngircd tries to
|
||||
# connect to to the other server on the given port; if not it waits
|
||||
# for the other server to connect.
|
||||
# There may be more than one server block.
|
||||
# There may be more than one server block, one for each server.
|
||||
#
|
||||
# Server Groups:
|
||||
# The ngIRCd allows "server groups": You can assign an "ID" to every
|
||||
@@ -118,16 +148,22 @@
|
||||
# group won't answer, the ngIRCd tries to connect to the next server
|
||||
# in the given group. But the ngircd never tries to connect to two
|
||||
# servers with the same group ID.
|
||||
|
||||
# IRC name of the server
|
||||
|
||||
# IRC name of the remote server, must match the "Name" variable in
|
||||
# the [Global] section of the other server (when using ngIRCd).
|
||||
;Name = irc2.the.net
|
||||
|
||||
# Internet host name of the peer
|
||||
|
||||
# Internet host name or IP address of the peer (only required when
|
||||
# this server should establish the connection).
|
||||
;Host = connect-to-host.the.net
|
||||
|
||||
# IP address to use as _source_ address for the connection. if unspecified,
|
||||
# ngircd will let the operating system pick an address.
|
||||
;Bind = 10.0.0.1
|
||||
|
||||
# Port of the server to which the ngIRCd should connect. If you
|
||||
# assign no port the ngIRCd waits for incoming connections.
|
||||
;Port = 6666
|
||||
;Port = 6667
|
||||
|
||||
# Own password for the connection. This password has to be configured
|
||||
# as "PeerPassword" on the other server.
|
||||
@@ -136,25 +172,44 @@
|
||||
# Foreign password for this connection. This password has to be
|
||||
# configured as "MyPassword" on the other server.
|
||||
;PeerPassword = PeerSecret
|
||||
|
||||
|
||||
# Group of this server (optional)
|
||||
;Group = 123
|
||||
|
||||
# Set the "Passive" option to "yes" if you don't want this ngIRCd to
|
||||
# connect to the configured peer (same as leaving the "Port" variable
|
||||
# empty). The advantage of this option is that you can actually configure
|
||||
# a port an use the IRC command CONNECT more easily to manually connect
|
||||
# this specific server later.
|
||||
;Passive = no
|
||||
|
||||
[Server]
|
||||
# More [Server] sections, if you like ...
|
||||
|
||||
[Channel]
|
||||
# Pre-defined channels can be configured in [Channel] sections.
|
||||
# Such channels are created by the server when starting up and even
|
||||
# persist when there are no more members left.
|
||||
# Persistent channels are marked with the mode 'P', which can be set
|
||||
# and unset by IRC operators like other modes on the fly.
|
||||
# There may be more than one [Channel] block.
|
||||
|
||||
# There may be more than one [Channel] block, one for each channel.
|
||||
|
||||
# Name of the channel
|
||||
;Name = #TheName
|
||||
|
||||
# Topic for this channel
|
||||
;Topic = a great topic
|
||||
|
||||
|
||||
# Initial channel modes
|
||||
;Modes = tn
|
||||
;Modes = tnk
|
||||
|
||||
# initial channel password (mode k)
|
||||
;Key = Secret
|
||||
|
||||
# maximum users per channel (mode l)
|
||||
;MaxUsers = 23
|
||||
|
||||
[Channel]
|
||||
# More [Channel] sections, if you like ...
|
||||
|
||||
# -eof-
|
||||
|
||||
3
doc/src/.cvsignore
Normal file
3
doc/src/.cvsignore
Normal file
@@ -0,0 +1,3 @@
|
||||
Makefile
|
||||
Makefile.in
|
||||
html
|
||||
153
doc/src/Doxyfile
Normal file
153
doc/src/Doxyfile
Normal file
@@ -0,0 +1,153 @@
|
||||
#
|
||||
# ngIRCd -- The Next Generation IRC Daemon
|
||||
# Copyright (c)2001-2005 Alexander Barton (alex@barton.de)
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
# Please read the file COPYING, README and AUTHORS for more information.
|
||||
#
|
||||
# $Id: Doxyfile,v 1.2 2005/07/23 00:48:38 alex Exp $
|
||||
#
|
||||
|
||||
# This file describes the settings to be used by the documentation system
|
||||
# doxygen (www.doxygen.org) for ngIRCd.
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Project related configuration options
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
|
||||
# by quotes) that should identify the project.
|
||||
|
||||
PROJECT_NAME = ngIRCd
|
||||
|
||||
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
|
||||
# base path where the generated documentation will be put.
|
||||
# If a relative path is entered, it will be relative to the location
|
||||
# where doxygen was started. If left blank the current directory will be used.
|
||||
|
||||
OUTPUT_DIRECTORY = .
|
||||
|
||||
# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
|
||||
# can be used to strip a user-defined part of the path. Stripping is
|
||||
# only done if one of the specified strings matches the left-hand part of
|
||||
# the path. The tag can be used to show relative paths in the file list.
|
||||
# If left blank the directory from which doxygen is run is used as the
|
||||
# path to strip.
|
||||
|
||||
STRIP_FROM_PATH = ../..
|
||||
|
||||
# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
|
||||
# will interpret the first line (until the first dot) of a JavaDoc-style
|
||||
# comment as the brief description. If set to NO, the JavaDoc
|
||||
# comments will behave just like the Qt-style comments (thus requiring an
|
||||
# explicit @brief command for a brief description.
|
||||
|
||||
JAVADOC_AUTOBRIEF = YES
|
||||
|
||||
# If the DETAILS_AT_TOP tag is set to YES then Doxygen
|
||||
# will output the detailed description near the top, like JavaDoc.
|
||||
# If set to NO, the detailed description appears after the member
|
||||
# documentation.
|
||||
|
||||
DETAILS_AT_TOP = NO
|
||||
|
||||
# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
|
||||
# sources only. Doxygen will then generate output that is more tailored for C.
|
||||
# For instance, some of the names that are used will be different. The list
|
||||
# of all members will be omitted, etc.
|
||||
|
||||
OPTIMIZE_OUTPUT_FOR_C = YES
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Build related configuration options
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
|
||||
# documentation are documented, even if no documentation was available.
|
||||
# Private class members and static file members will be hidden unless
|
||||
# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
|
||||
|
||||
EXTRACT_ALL = YES
|
||||
|
||||
# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
|
||||
# will be included in the documentation.
|
||||
|
||||
EXTRACT_PRIVATE = YES
|
||||
|
||||
# If the EXTRACT_STATIC tag is set to YES all static members of a file
|
||||
# will be included in the documentation.
|
||||
|
||||
EXTRACT_STATIC = YES
|
||||
|
||||
# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
|
||||
# defined locally in source files will be included in the documentation.
|
||||
# If set to NO only classes defined in header files are included.
|
||||
|
||||
EXTRACT_LOCAL_CLASSES = YES
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the input files
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# The INPUT tag can be used to specify the files and/or directories that
|
||||
# contain documented source files. You may enter file names like "myfile.cpp"
|
||||
# or directories like "/usr/src/myproject". Separate the files or directories
|
||||
# with spaces.
|
||||
|
||||
INPUT = ../../src
|
||||
|
||||
# The RECURSIVE tag can be used to turn specify whether or not subdirectories
|
||||
# should be searched for input files as well. Possible values are YES and NO.
|
||||
# If left blank NO is used.
|
||||
|
||||
RECURSIVE = YES
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to source browsing
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# If the SOURCE_BROWSER tag is set to YES then a list of source files will
|
||||
# be generated. Documented entities will be cross-referenced with these sources.
|
||||
# Note: To get rid of all source code in the generated output, make sure also
|
||||
# VERBATIM_HEADERS is set to NO.
|
||||
|
||||
SOURCE_BROWSER = YES
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Output formats
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
GENERATE_HTML = YES
|
||||
|
||||
HTML_OUTPUT = html
|
||||
HTML_FILE_EXTENSION = .html
|
||||
HTML_HEADER = header.inc.html
|
||||
HTML_FOOTER = footer.inc.html
|
||||
HTML_STYLESHEET = ngircd-doc.css
|
||||
|
||||
GENERATE_HTMLHELP = NO
|
||||
GENERATE_LATEX = NO
|
||||
GENERATE_RTF = NO
|
||||
GENERATE_MAN = NO
|
||||
GENERATE_XML = NO
|
||||
GENERATE_AUTOGEN_DEF = NO
|
||||
GENERATE_PERLMOD = NO
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the preprocessor
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# The PREDEFINED tag can be used to specify one or more macro names that
|
||||
# are defined before the preprocessor is started (similar to the -D option of
|
||||
# gcc). The argument of the tag is a list of macros of the form: name
|
||||
# or name=definition (no spaces). If the definition and the = are
|
||||
# omitted =1 is assumed. To prevent a macro definition from being
|
||||
# undefined via #undef or recursively expanded use the := operator
|
||||
# instead of the = operator.
|
||||
|
||||
PREDEFINED = CONN_MODULE __client_c__
|
||||
|
||||
# -eof-
|
||||
25
doc/src/Makefile.am
Normal file
25
doc/src/Makefile.am
Normal file
@@ -0,0 +1,25 @@
|
||||
#
|
||||
# ngIRCd -- The Next Generation IRC Daemon
|
||||
# Copyright (c)2001-2006 Alexander Barton (alex@barton.de)
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
# Please read the file COPYING, README and AUTHORS for more information.
|
||||
#
|
||||
# $Id: Makefile.am,v 1.3 2006/12/28 14:04:28 alex Exp $
|
||||
#
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -f Makefile Makefile.in
|
||||
|
||||
distclean-local:
|
||||
rm -rf html
|
||||
|
||||
srcdoc:
|
||||
@doxygen --version >/dev/null 2>&1 \
|
||||
|| ( echo; echo "Error: \"doxygen\" not found!"; echo; exit 1 )
|
||||
doxygen
|
||||
|
||||
# -eof-
|
||||
11
doc/src/footer.inc.html
Normal file
11
doc/src/footer.inc.html
Normal file
@@ -0,0 +1,11 @@
|
||||
|
||||
<hr class="footer">
|
||||
<p>
|
||||
ngIRCd
|
||||
<a href="http://ngircd.barton.de/">Homepage</a>,
|
||||
<a href="http://arthur.barton.de/cgi-bin/viewcvs.cgi/ngircd/">CVS-Repository</a>,
|
||||
<a href="http://ngircd.barton.de/bugzilla/index.cgi">Bug-Tracker</a>.
|
||||
</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
10
doc/src/header.inc.html
Normal file
10
doc/src/header.inc.html
Normal file
@@ -0,0 +1,10 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
|
||||
<title>ngIRCd Source Documentation</title>
|
||||
<link href="ngircd-doc.css" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
77
doc/src/ngircd-doc.css
Normal file
77
doc/src/ngircd-doc.css
Normal file
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
* Cascading Style Sheet for the ngIRCd source documentation
|
||||
*
|
||||
* $Id: ngircd-doc.css,v 1.2 2005/07/22 21:23:22 alex Exp $
|
||||
*/
|
||||
|
||||
BODY {
|
||||
background-color: white;
|
||||
color: black;
|
||||
margin: 30px;
|
||||
font-family: Geneva, sans-serif;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
A:visited { color: purple; background: transparent; }
|
||||
A:link { color: navy; background: transparent; }
|
||||
A:active { color: red; background: transparent; }
|
||||
A:hover { background: #ffa; }
|
||||
|
||||
H1, H2, H3 {
|
||||
font-family: Verdana, sans-serif;
|
||||
background-color: white;
|
||||
color: #005555;
|
||||
}
|
||||
H1 { margin-bottom: 10px; }
|
||||
H2 {
|
||||
margin-top: 20px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
P, LI, TD, TH, DT {
|
||||
font-family: Geneva, sans-serif;
|
||||
font-size: 12px;
|
||||
line-height: 1.2
|
||||
}
|
||||
|
||||
DD { margin-bottom: 1em; }
|
||||
|
||||
UL { list-style-type: square; }
|
||||
|
||||
HR { margin: 2em 0px; }
|
||||
|
||||
BODY>TABLE { padding: 1em 0px; }
|
||||
|
||||
TD.mdRow {
|
||||
border: 1px dotted silver;
|
||||
background-color: #fff9dd;
|
||||
}
|
||||
|
||||
TD.md { font-weight: bold; }
|
||||
|
||||
TD.memItemLeft { padding-top: 4px; }
|
||||
TD.memItemRight { padding-top: 4px; }
|
||||
TD.mdescRight { font-style: italic; }
|
||||
|
||||
DIV.qindex {
|
||||
background-color: #eee;
|
||||
border: 1px dotted silver;
|
||||
padding: 3px;
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
|
||||
DIV.nav {
|
||||
margin: 1em 0px;
|
||||
}
|
||||
|
||||
HR.footer { margin-top: 50px; }
|
||||
|
||||
.comment {
|
||||
color: gray;
|
||||
font-style: italic;
|
||||
}
|
||||
.preprocessor { color: #f90; }
|
||||
.keyword, .keywordflow, .keywordtype { color: red; }
|
||||
.stringliteral { color: green; }
|
||||
|
||||
/* -eof- */
|
||||
4
man/.cvsignore
Normal file
4
man/.cvsignore
Normal file
@@ -0,0 +1,4 @@
|
||||
Makefile
|
||||
Makefile.in
|
||||
ngircd.8
|
||||
ngircd.conf.5
|
||||
@@ -9,12 +9,25 @@
|
||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
#
|
||||
# $Id: Makefile.am,v 1.5 2002/04/04 13:02:41 alex Exp $
|
||||
# $Id: Makefile.am,v 1.6 2006/12/25 16:13:26 alex Exp $
|
||||
#
|
||||
|
||||
TEMPLATE_MANS = ngircd.conf.5.tmpl ngircd.8.tmpl
|
||||
|
||||
SUFFIXES = .tmpl .
|
||||
|
||||
.tmpl:
|
||||
sed \
|
||||
-e s@:SBINDIR:@${sbindir}@ \
|
||||
-e s@:BINDIR:@${bindir}@ \
|
||||
-e s@:ETCDIR:@${sysconfdir}@ \
|
||||
<$< >$@
|
||||
|
||||
man_MANS = ngircd.conf.5 ngircd.8
|
||||
|
||||
EXTRA_DIST = $(man_MANS)
|
||||
CLEANFILES = $(man_MANS)
|
||||
|
||||
EXTRA_DIST = $(TEMPLATE_MANS)
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -f Makefile Makefile.in
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
.\"
|
||||
.\" $Id: ngircd.8,v 1.9 2004/04/05 10:59:10 alex Exp $
|
||||
.\" $Id: ngircd.8.tmpl,v 1.2 2007/11/15 01:03:29 fw Exp $
|
||||
.\"
|
||||
.TH ngircd 8 "March 2003" ngircd "ngIRCd Manual"
|
||||
.TH ngircd 8 "August 2005" ngircd "ngIRCd Manual"
|
||||
.SH NAME
|
||||
ngircd \- the next generation IRC daemon
|
||||
ngIRCd \- the next generation IRC daemon
|
||||
.SH SYNOPSIS
|
||||
.B ngircd [
|
||||
.I Options
|
||||
.B ]
|
||||
.SH DESCRIPTION
|
||||
.BR ngircd
|
||||
.BR ngIRCd
|
||||
is a free open source daemon for the Internet Relay Chat (IRC),
|
||||
developed under the GNU General Public License (GPL).
|
||||
.PP
|
||||
@@ -18,16 +18,13 @@ many others. It is easy to configure, supports server links (even with
|
||||
original ircd's) and runs on hosts with changing IP addresses (such as
|
||||
dial-in networks).
|
||||
.PP
|
||||
Currently supported platforms (tested versions) are: AIX (3.2.5 with IBM XL
|
||||
C Compiler), A/UX (3.x, Apple pre-ANSI C Compiler and GNU C), FreeBSD
|
||||
(4.5/i386, GNU C), HP-UX (10.20, GNU C), IRIX (6.5, SGI MIPSpro C 7.30),
|
||||
Linux (2.2.x/i386, 2.4.x/i386 and 2.4.x/hppa, GNU C), Mac OS X (10.x, GNU C),
|
||||
NetBSD (1.5.2/i386 and 1.5.3/m68k, GNU C), Solaris (2.5.1 and 2.6, GNU C),
|
||||
and Windows with Cygwin (GNU C).
|
||||
Currently supported platforms include AIX, A/UX, FreeBSD, HP-UX, IRIX,
|
||||
Linux, Mac OS X, NetBSD, OpenBSD, Solaris, and Windows with Cygwin.
|
||||
.PP
|
||||
As ngIRCd relies on UNIX standards and uses GNU automake and GNU autoconf
|
||||
there are good chances that it also supports other UNIX-based operating
|
||||
systems.
|
||||
systems as well. By default, ngIRCd writes diagnostic and informational messages using
|
||||
the syslog mechanism.
|
||||
.SH OPTIONS
|
||||
The default behaviour of
|
||||
.BR ngircd
|
||||
@@ -43,7 +40,8 @@ as configuration file.
|
||||
.TP
|
||||
\fB\-n\fR, \fB\-\-nodaemon\fR
|
||||
Don't fork a child and don't detach from controlling terminal.
|
||||
All log messages go to the console.
|
||||
All log messages go to the console and you can use CTRL-C to
|
||||
terminate the server.
|
||||
.TP
|
||||
\fB\-p\fR, \fB\-\-passive\fR
|
||||
Disable automatic connections to other servers. You can use the IRC command
|
||||
@@ -58,11 +56,11 @@ Output version information and exit.
|
||||
\fB\-\-help\fR
|
||||
Display a brief help text and exit.
|
||||
.SH FILES
|
||||
.I /usr/local/etc/ngircd.conf
|
||||
.I :ETCDIR:/ngircd.conf
|
||||
.RS
|
||||
The system wide default configuration file.
|
||||
.RE
|
||||
.I /usr/local/etc/ngircd.motd
|
||||
.I :ETCDIR:/ngircd.motd
|
||||
.RS
|
||||
Default "message of the day" (MOTD).
|
||||
.RE
|
||||
@@ -73,8 +71,8 @@ alex@barton.de
|
||||
.UE
|
||||
.br
|
||||
Homepage:
|
||||
.UR http://arthur.ath.cx/~alex/ngircd/
|
||||
http://arthur.ath.cx/~alex/ngircd/
|
||||
.UR http://ngircd.barton.de/
|
||||
http://ngircd.barton.de/
|
||||
.UE
|
||||
.SH "SEE ALSO"
|
||||
.BR ngircd.conf (5),
|
||||
@@ -1,16 +1,17 @@
|
||||
.\"
|
||||
.\" $Id: ngircd.conf.5,v 1.13 2004/05/07 11:19:20 alex Exp $
|
||||
.\" $Id: ngircd.conf.5.tmpl,v 1.7 2007/11/23 16:26:03 fw Exp $
|
||||
.\"
|
||||
.TH ngircd.conf 5 "Mai 2003" ngircd "ngIRCd Manual"
|
||||
.TH ngircd.conf 5 "August 2005" ngircd "ngIRCd Manual"
|
||||
.SH NAME
|
||||
ngircd.conf \- configuration file of ngIRCd
|
||||
.SH SYNOPSIS
|
||||
.B /usr/local/etc/ngircd.conf
|
||||
.B :ETCDIR:/ngircd.conf
|
||||
.SH DESCRIPTION
|
||||
.BR ngircd.conf
|
||||
is the configuration file for
|
||||
is the configuration file of the
|
||||
.BR ngircd (8)
|
||||
which you should adept to your local preferences and needs.
|
||||
Internet Relay Chat (IRC) daemon which you should adept to your local
|
||||
preferences and needs.
|
||||
.SH "FILE FORMAT"
|
||||
The file consists of sections and parameters. A section begins with the name
|
||||
of the section in square brackets and continues until the next section
|
||||
@@ -24,21 +25,21 @@ Sections contain parameters of the form
|
||||
.I value
|
||||
.RE
|
||||
.PP
|
||||
Any line beginning with a semicolon (';') or a hash ('#') character is
|
||||
treated as a comment and ignored.
|
||||
Empty lines and any line beginning with a semicolon (';') or a hash ('#')
|
||||
character is treated as a comment and will be ignored.
|
||||
.PP
|
||||
The file format is line-based - that means, each newline-terminated line
|
||||
represents either a comment, a section name or a parameter.
|
||||
.PP
|
||||
Section and parameter names are not case sensitive.
|
||||
.SH "SECTION OVERVIEW"
|
||||
The file is separated in four blocks: [Global], [Operator], [Server],
|
||||
The file can contain blocks of four types: [Global], [Operator], [Server],
|
||||
and [Channel].
|
||||
.PP
|
||||
In the
|
||||
.I [Global]
|
||||
section, there is the main configuration like the server name and the
|
||||
ports, on which the server should be listening. IRC operators of this
|
||||
ports on which the server should be listening. IRC operators of this
|
||||
server are defined in
|
||||
.I [Operator]
|
||||
blocks.
|
||||
@@ -46,6 +47,9 @@ blocks.
|
||||
is the section where server links are configured. And
|
||||
.I [Channel]
|
||||
blocks are used to configure pre-defined ("persistent") IRC channels.
|
||||
.PP
|
||||
There can be more than one [Operator], [Server] and [Channel] sections
|
||||
per configuration file, but only one [Global] section.
|
||||
.SH [GLOBAL]
|
||||
The
|
||||
.I [Global]
|
||||
@@ -65,18 +69,18 @@ command.
|
||||
.TP
|
||||
\fBPorts\fR
|
||||
Ports on which the server should listen. There may be more than one port,
|
||||
separated with ';'. Default: 6667.
|
||||
separated with ','. Default: 6667.
|
||||
.TP
|
||||
\fBListen\fR
|
||||
The ip address on which the server should listen. Default is empty, so
|
||||
the server listens on all configured ip addresses and interfaces.
|
||||
The IP address on which the server should listen. Default is empty, so
|
||||
the server listens on all configured IP addresses and interfaces.
|
||||
.TP
|
||||
\fBMotdFile\fR
|
||||
Text file with the "message of the day" (MOTD). This message will be shown
|
||||
to all users connecting to the server.
|
||||
.TP
|
||||
\fBMotdPhrase\fR
|
||||
A simple Phrase (<256 chars) if you don't want to use a motd file.
|
||||
A simple Phrase (<256 chars) if you don't want to use a MOTD file.
|
||||
If it is set no MotdFile will be read at all.
|
||||
.TP
|
||||
\fBServerUID\fR
|
||||
@@ -114,6 +118,13 @@ For this to work the server must have
|
||||
been started with root privileges!
|
||||
.RE
|
||||
.TP
|
||||
\fBPidFile\fR
|
||||
This tells ngIRCd to write its current process ID to a file. Note that the
|
||||
pidfile is written AFTER chroot and switching the user ID, i. e. the
|
||||
directory the pidfile resides in must be writeable by the ngIRCd user and
|
||||
exist in the chroot directory (if configured, see above).
|
||||
.RE
|
||||
.TP
|
||||
\fBPingTimeout\fR
|
||||
After <PingTimeout> seconds of inactivity the server will send a PING to
|
||||
the peer to test whether it is alive or not. Default: 120.
|
||||
@@ -130,18 +141,40 @@ The server tries every <ConnectRetry> seconds to establish a link to not yet
|
||||
Should IRC Operators be allowed to use the MODE command even if they are
|
||||
not(!) channel-operators? Default: no.
|
||||
.TP
|
||||
\fBOperServerMode\fR
|
||||
If OperCanUseMode is enabled, this may lead the compatibility problems with
|
||||
Servers that run the ircd-irc2 Software. This Option "masks" mode requests
|
||||
by non-chanops as if they were coming from the server. Default: no.
|
||||
.TP
|
||||
\fBPredefChannelsOnly\fR
|
||||
If enabled, no new channels can be created. Useful if
|
||||
you do not want to have channels other than those defined in
|
||||
the config file.
|
||||
Default: No.
|
||||
.TP
|
||||
\fBNoDNS\fR
|
||||
If enabled, ngircd will not make DNS lookups when clients connect.
|
||||
If you configure ngircd to connect to other servers, ngircd may still
|
||||
perform a DNS lookup if required.
|
||||
Default: No.
|
||||
.TP
|
||||
\fBMaxConnections\fR
|
||||
Maximum number of simultaneous connection the server is allowed to accept
|
||||
(<=0: unlimited). Default: -1.
|
||||
(0: unlimited). Default: 0.
|
||||
.TP
|
||||
\fBMaxConnectionsIP\fR
|
||||
Maximum number of simultaneous connections from a single IP address that
|
||||
the server will accept (<=0: unlimited). This configuration options lowers
|
||||
the server will accept (0: unlimited). This configuration options lowers
|
||||
the risk of denial of service attacks (DoS). Default: 5.
|
||||
.TP
|
||||
\fBMaxJoins\fR
|
||||
Maximum number of channels a user can be member of (<=0: no limit).
|
||||
Maximum number of channels a user can be member of (0: no limit).
|
||||
Default: 10.
|
||||
.TP
|
||||
\fBMaxNickLength\fR
|
||||
Maximum length of an user nick name (Default: 9, as in RFC 2812). Please
|
||||
note that all servers in an IRC network MUST use the same maximum nick name
|
||||
length!
|
||||
.SH [OPERATOR]
|
||||
.I [Operator]
|
||||
sections are used to define IRC Operators. There may be more than one
|
||||
@@ -153,6 +186,10 @@ ID of the operator (may be different of the nick name).
|
||||
.TP
|
||||
\fBPassword\fR
|
||||
Password of the IRC operator.
|
||||
.TP
|
||||
\fBMask\fR
|
||||
Mask that is to be checked before an /OPER for this account is accepted.
|
||||
Example: nick!ident@*.example.com
|
||||
.SH [SERVER]
|
||||
Other servers are configured in
|
||||
.I [Server]
|
||||
@@ -175,13 +212,17 @@ IRC name of the server
|
||||
\fBHost\fR
|
||||
Internet host name of the peer
|
||||
.TP
|
||||
\fBBind\fR
|
||||
IP address to use as source IP for the outgoing connection. Default ist
|
||||
to let the operating system decide.
|
||||
.TP
|
||||
\fBPort\fR
|
||||
Port of the server to which the ngIRCd should connect. If you assign no port
|
||||
the ngIRCd waits for incoming connections.
|
||||
.TP
|
||||
\fBMyPassword\fR
|
||||
Own password for this connection. This password has to be configured as
|
||||
"PeerPassword" on the other server.
|
||||
"PeerPassword" on the other server. Must not have ':' as first character.
|
||||
.TP
|
||||
\fBPeerPassword\fR
|
||||
Foreign password for this connection. This password has to be configured as
|
||||
@@ -189,6 +230,9 @@ Foreign password for this connection. This password has to be configured as
|
||||
.TP
|
||||
\fBGroup\fR
|
||||
Group of this server (optional).
|
||||
\fBPassive\fR
|
||||
Disable automatic connection even if port value is specified. Default: false.
|
||||
You can use the IRC Operator command CONNECT later on to create the link.
|
||||
.SH [CHANNEL]
|
||||
Pre-defined channels can be configured in
|
||||
.I [Channel]
|
||||
@@ -210,6 +254,12 @@ Topic for this channel
|
||||
.TP
|
||||
\fBModes\fR
|
||||
Initial channel modes.
|
||||
.TP
|
||||
\fBKey\fR
|
||||
Sets initial channel key (only relevant if mode k is set)
|
||||
.TP
|
||||
\fBMaxUsers\fR
|
||||
Set maximum user limit for this channel (only relevant if mode l is set)
|
||||
.SH HINTS
|
||||
It's wise to use "ngircd --configtest" to validate the configuration file
|
||||
after changing it. See
|
||||
@@ -222,8 +272,8 @@ alex@barton.de
|
||||
.UE
|
||||
.br
|
||||
Homepage:
|
||||
.UR http://arthur.ath.cx/~alex/ngircd/
|
||||
http://arthur.ath.cx/~alex/ngircd/
|
||||
.UR http://ngircd.barton.de/
|
||||
http://ngircd.barton.de/
|
||||
.UE
|
||||
.SH "SEE ALSO"
|
||||
.BR ngircd (8)
|
||||
5
src/.cvsignore
Normal file
5
src/.cvsignore
Normal file
@@ -0,0 +1,5 @@
|
||||
Makefile
|
||||
Makefile.in
|
||||
config.h
|
||||
config.h.in
|
||||
stamp-h1
|
||||
@@ -8,7 +8,7 @@
|
||||
# (at your option) any later version.
|
||||
# Please read the file COPYING, README and AUTHORS for more information.
|
||||
#
|
||||
# $Id: Makefile.am,v 1.5 2003/01/13 12:20:16 alex Exp $
|
||||
# $Id: Makefile.am,v 1.7 2005/07/22 21:01:03 alex Exp $
|
||||
#
|
||||
|
||||
SUBDIRS = portab tool ngircd testsuite
|
||||
|
||||
8
src/ngircd/.cvsignore
Normal file
8
src/ngircd/.cvsignore
Normal file
@@ -0,0 +1,8 @@
|
||||
Makefile
|
||||
Makefile.in
|
||||
.deps
|
||||
check-help
|
||||
check-version
|
||||
cvs-version.h
|
||||
cvs-version.new
|
||||
ngircd
|
||||
@@ -8,31 +8,32 @@
|
||||
# (at your option) any later version.
|
||||
# Please read the file COPYING, README and AUTHORS for more information.
|
||||
#
|
||||
# $Id: Makefile.am,v 1.42 2003/12/04 14:05:16 alex Exp $
|
||||
# $Id: Makefile.am,v 1.50 2007/11/21 12:16:36 alex Exp $
|
||||
#
|
||||
|
||||
AUTOMAKE_OPTIONS = ../portab/ansi2knr
|
||||
|
||||
INCLUDES = -I$(srcdir)/../portab -I$(srcdir)/../tool
|
||||
|
||||
LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN
|
||||
LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN \
|
||||
-varuse -retvalother -emptyret -unrecog
|
||||
|
||||
sbin_PROGRAMS = ngircd
|
||||
|
||||
ngircd_SOURCES = ngircd.c channel.c client.c conf.c conn.c conn-zip.c conn-func.c \
|
||||
hash.c irc.c irc-channel.c irc-info.c irc-login.c irc-mode.c irc-op.c \
|
||||
irc-oper.c irc-server.c irc-write.c lists.c log.c match.c parse.c \
|
||||
rendezvous.c resolve.c
|
||||
ngircd_SOURCES = ngircd.c array.c channel.c client.c conf.c conn.c conn-func.c \
|
||||
conn-zip.c hash.c io.c irc.c irc-channel.c irc-info.c irc-login.c \
|
||||
irc-mode.c irc-op.c irc-oper.c irc-server.c irc-write.c lists.c log.c \
|
||||
match.c numeric.c parse.c rendezvous.c resolve.c
|
||||
|
||||
ngircd_LDFLAGS = -L../portab -L../tool
|
||||
|
||||
ngircd_LDADD = -lngportab -lngtool
|
||||
|
||||
noinst_HEADERS = ngircd.h channel.h client.h conf.h conn.h conn-zip.h conn-func.h \
|
||||
hash.h irc.h irc-channel.h irc-info.h irc-login.h irc-mode.h irc-op.h \
|
||||
irc-oper.h irc-server.h irc-write.h lists.h log.h match.h parse.h \
|
||||
rendezvous.h resolve.h \
|
||||
messages.h defines.h
|
||||
noinst_HEADERS = ngircd.h array.h channel.h client.h conf.h conn.h conn-func.h \
|
||||
conn-zip.h hash.h io.h irc.h irc-channel.h irc-info.h irc-login.h \
|
||||
irc-mode.h irc-op.h irc-oper.h irc-server.h irc-write.h lists.h log.h \
|
||||
match.h numeric.h parse.h rendezvous.h resolve.h \
|
||||
defines.h messages.h
|
||||
|
||||
clean-local:
|
||||
rm -f check-version check-help lint.out cvs-version.*
|
||||
@@ -42,24 +43,39 @@ maintainer-clean-local:
|
||||
|
||||
check-version: Makefile
|
||||
echo "#!/bin/sh" > check-version
|
||||
echo "./ngircd --version | grep ngircd > /dev/null 2>&1" >> check-version
|
||||
echo "./ngircd --version | grep ngircd >/dev/null 2>&1" >>check-version
|
||||
chmod 755 check-version
|
||||
|
||||
check-help: Makefile
|
||||
echo "#!/bin/sh" > check-help
|
||||
echo "./ngircd --help | grep help > /dev/null 2>&1" >> check-help
|
||||
echo "./ngircd --help | grep help >/dev/null 2>&1" >>check-help
|
||||
chmod 755 check-help
|
||||
|
||||
lint:
|
||||
rm -f lint.out
|
||||
@splint --version >/dev/null 2>&1 \
|
||||
|| ( echo; echo "Error: \"splint\" not found!"; echo; exit 1 )
|
||||
@echo; warnings=0; files=0; \
|
||||
for f in *.c; do \
|
||||
echo "checking $$f ..."; \
|
||||
splint $$f $(LINTARGS) -I./.. -I./../portab $(AM_CFLAGS) > lint.out 2>&1; \
|
||||
splint $$f $(LINTARGS) -I$(srcdir) -I$(srcdir)/.. \
|
||||
$(INCLUDES) $(AM_CFLAGS) >lint.out 2>&1; \
|
||||
grep "no warnings" lint.out > /dev/null 2>&1; \
|
||||
if [ $$? -ne 0 ]; then \
|
||||
echo; cat lint.out; echo; \
|
||||
waswarning=1; \
|
||||
echo; grep -v "^Command Line: " lint.out; echo; \
|
||||
w=$$( grep "code warning" lint.out | $(AWK) "{ print \$$4 }" ); \
|
||||
[ "$$w" -gt 0 ] && warnings=`expr $$warnings + $$w`; \
|
||||
files=`expr $$files + 1`; \
|
||||
else \
|
||||
waswarning=0; \
|
||||
fi; \
|
||||
done;
|
||||
rm -f lint.out; \
|
||||
done; \
|
||||
[ $$waswarning -eq 0 ] && echo; \
|
||||
[ $$warnings -gt 0 ] \
|
||||
&& echo "Result: $$warnings warning(s) in $$files file(s)!" \
|
||||
|| echo "Result: no warnings found."; \
|
||||
echo; [ $$warnings -gt 0 ] && exit 1
|
||||
|
||||
ngircd.c: cvs-version.h
|
||||
|
||||
|
||||
345
src/ngircd/array.c
Normal file
345
src/ngircd/array.c
Normal file
@@ -0,0 +1,345 @@
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* functions to dynamically allocate arrays.
|
||||
* Copyright (c) 2005 Florian Westphal (westphal@foo.fh-furtwangen.de)
|
||||
*
|
||||
*/
|
||||
|
||||
#include "array.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: array.c,v 1.15 2007/11/18 15:05:35 alex Exp $";
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "log.h"
|
||||
|
||||
/* Enable more Debug messages in alloc / append / memmove code. */
|
||||
/* #define DEBUG_ARRAY */
|
||||
|
||||
|
||||
|
||||
#define array_UNUSABLE(x) ( !(x)->mem || (0 == (x)->allocated) )
|
||||
|
||||
#define ALIGN_32U(x) (((x)+(unsigned)31 ) & ~((unsigned)31))
|
||||
#define ALIGN_1024U(x) (((x)+(unsigned)1023) & ~((unsigned)1023))
|
||||
#define ALIGN_4096U(x) (((x)+(unsigned)4095) & ~((unsigned)4095))
|
||||
|
||||
|
||||
static bool
|
||||
safemult_sizet(size_t a, size_t b, size_t *res)
|
||||
{
|
||||
size_t tmp = a * b;
|
||||
|
||||
if (b && (tmp / b != a))
|
||||
return false;
|
||||
|
||||
*res = tmp;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
array_init(array *a)
|
||||
{
|
||||
assert(a != NULL);
|
||||
a->mem = NULL;
|
||||
a->allocated = 0;
|
||||
a->used = 0;
|
||||
}
|
||||
|
||||
|
||||
/* if realloc() fails, array_alloc return NULL. otherwise return pointer to elem pos in array */
|
||||
void *
|
||||
array_alloc(array * a, size_t size, size_t pos)
|
||||
{
|
||||
size_t alloc, pos_plus1 = pos + 1;
|
||||
size_t aligned = 0;
|
||||
char *tmp;
|
||||
|
||||
assert(size > 0);
|
||||
|
||||
if (pos_plus1 == 0 || !safemult_sizet(size, pos_plus1, &alloc))
|
||||
return NULL;
|
||||
|
||||
if (a->allocated < alloc) {
|
||||
if (alloc < 128) {
|
||||
aligned = ALIGN_32U(alloc);
|
||||
} else {
|
||||
if (alloc < 4096) {
|
||||
aligned = ALIGN_1024U(alloc);
|
||||
} else {
|
||||
aligned = ALIGN_4096U(alloc);
|
||||
}
|
||||
}
|
||||
#ifdef DEBUG_ARRAY
|
||||
Log(LOG_DEBUG, "array_alloc(): rounded %u to %u bytes.", alloc, aligned);
|
||||
#endif
|
||||
|
||||
assert(aligned >= alloc);
|
||||
|
||||
if (aligned < alloc) /* rounding overflow */
|
||||
return NULL;
|
||||
|
||||
alloc = aligned;
|
||||
#ifdef DEBUG_ARRAY
|
||||
Log(LOG_DEBUG, "array_alloc(): changing size from %u to %u bytes.",
|
||||
a->allocated, aligned);
|
||||
#endif
|
||||
|
||||
tmp = realloc(a->mem, alloc);
|
||||
if (!tmp)
|
||||
return NULL;
|
||||
|
||||
a->mem = tmp;
|
||||
a->allocated = alloc;
|
||||
|
||||
assert(a->allocated > a->used);
|
||||
|
||||
memset(a->mem + a->used, 0, a->allocated - a->used);
|
||||
|
||||
a->used = alloc;
|
||||
}
|
||||
return a->mem + (pos * size);
|
||||
}
|
||||
|
||||
|
||||
/*return number of initialized ELEMS in a. */
|
||||
size_t
|
||||
array_length(const array * const a, size_t membersize)
|
||||
{
|
||||
assert(a != NULL);
|
||||
assert(membersize > 0);
|
||||
|
||||
if (array_UNUSABLE(a))
|
||||
return 0;
|
||||
|
||||
return membersize ? a->used / membersize : 0;
|
||||
}
|
||||
|
||||
|
||||
/* copy array src to array dest */
|
||||
bool
|
||||
array_copy(array * dest, const array * const src)
|
||||
{
|
||||
if (array_UNUSABLE(src))
|
||||
return false;
|
||||
|
||||
return array_copyb(dest, src->mem, src->used);
|
||||
}
|
||||
|
||||
|
||||
/* return false on failure (realloc failure, invalid src/dest array) */
|
||||
bool
|
||||
array_copyb(array * dest, const char *src, size_t len)
|
||||
{
|
||||
assert(dest != NULL);
|
||||
assert(src != NULL );
|
||||
|
||||
if (!src || !dest)
|
||||
return false;
|
||||
|
||||
array_trunc(dest);
|
||||
return array_catb(dest, src, len);
|
||||
}
|
||||
|
||||
|
||||
/* copy string to dest */
|
||||
bool
|
||||
array_copys(array * dest, const char *src)
|
||||
{
|
||||
return array_copyb(dest, src, strlen(src));
|
||||
}
|
||||
|
||||
|
||||
/* append len bytes from src to the array dest.
|
||||
return false if we could not append all bytes (realloc failure, invalid src/dest array) */
|
||||
bool
|
||||
array_catb(array * dest, const char *src, size_t len)
|
||||
{
|
||||
size_t tmp;
|
||||
size_t used;
|
||||
char *ptr;
|
||||
|
||||
assert(dest != NULL);
|
||||
assert(src != NULL);
|
||||
|
||||
if (!len)
|
||||
return true;
|
||||
|
||||
if (!src || !dest)
|
||||
return false;
|
||||
|
||||
used = dest->used;
|
||||
tmp = used + len;
|
||||
|
||||
if (tmp < used || tmp < len) /* integer overflow */
|
||||
return false;
|
||||
|
||||
if (!array_alloc(dest, 1, tmp))
|
||||
return false;
|
||||
|
||||
ptr = dest->mem;
|
||||
|
||||
assert(ptr != NULL);
|
||||
|
||||
#ifdef DEBUG_ARRAY
|
||||
Log(LOG_DEBUG,
|
||||
"array_catb(): appending %u bytes to array (now %u bytes in array).",
|
||||
len, tmp);
|
||||
#endif
|
||||
memcpy(ptr + used, src, len);
|
||||
dest->used = tmp;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/* append string to dest */
|
||||
bool
|
||||
array_cats(array * dest, const char *src)
|
||||
{
|
||||
return array_catb(dest, src, strlen(src));
|
||||
}
|
||||
|
||||
|
||||
/* append trailing NUL byte to array */
|
||||
bool
|
||||
array_cat0(array * a)
|
||||
{
|
||||
return array_catb(a, "", 1);
|
||||
}
|
||||
|
||||
|
||||
/* append trailing NUL byte to array, but do not count it. */
|
||||
bool
|
||||
array_cat0_temporary(array * a)
|
||||
{
|
||||
char *endpos = array_alloc(a, 1, array_bytes(a));
|
||||
if (!endpos)
|
||||
return false;
|
||||
|
||||
*endpos = '\0';
|
||||
return true;
|
||||
}
|
||||
|
||||
/* add contents of array src to array dest. */
|
||||
bool
|
||||
array_cat(array * dest, const array * const src)
|
||||
{
|
||||
if (array_UNUSABLE(src))
|
||||
return false;
|
||||
|
||||
return array_catb(dest, src->mem, src->used);
|
||||
}
|
||||
|
||||
|
||||
/* return pointer to the element at pos.
|
||||
return NULL if the array is unallocated, or if pos is larger than
|
||||
the number of elements stored int the array. */
|
||||
void *
|
||||
array_get(array * a, size_t membersize, size_t pos)
|
||||
{
|
||||
size_t totalsize;
|
||||
size_t posplus1 = pos + 1;
|
||||
|
||||
assert(membersize > 0);
|
||||
assert(a != NULL);
|
||||
|
||||
if (!posplus1 || array_UNUSABLE(a))
|
||||
return NULL;
|
||||
|
||||
if (!safemult_sizet(posplus1, membersize, &totalsize))
|
||||
return NULL;
|
||||
|
||||
if (a->allocated < totalsize)
|
||||
return NULL;
|
||||
|
||||
totalsize = pos * membersize;
|
||||
return a->mem + totalsize;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
array_free(array * a)
|
||||
{
|
||||
assert(a != NULL);
|
||||
#ifdef DEBUG_ARRAY
|
||||
Log(LOG_DEBUG,
|
||||
"array_free(): %u bytes free'd (%u bytes still used at time of free()).",
|
||||
a->allocated, a->used);
|
||||
#endif
|
||||
free(a->mem);
|
||||
a->mem = NULL;
|
||||
a->allocated = 0;
|
||||
a->used = 0;
|
||||
}
|
||||
|
||||
|
||||
void *
|
||||
array_start(const array * const a)
|
||||
{
|
||||
assert(a != NULL);
|
||||
return a->mem;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
array_trunc(array * a)
|
||||
{
|
||||
assert(a != NULL);
|
||||
a->used = 0;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
array_truncate(array * a, size_t membersize, size_t len)
|
||||
{
|
||||
size_t newlen;
|
||||
assert(a != NULL);
|
||||
if (!safemult_sizet(membersize, len, &newlen))
|
||||
return;
|
||||
|
||||
if (newlen <= a->allocated)
|
||||
a->used = newlen;
|
||||
}
|
||||
|
||||
|
||||
/* move elements starting at pos to beginning of array */
|
||||
void
|
||||
array_moveleft(array * a, size_t membersize, size_t pos)
|
||||
{
|
||||
size_t bytepos;
|
||||
|
||||
assert(a != NULL);
|
||||
assert(membersize > 0);
|
||||
|
||||
if (!safemult_sizet(membersize, pos, &bytepos)) {
|
||||
a->used = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!bytepos)
|
||||
return; /* nothing to do */
|
||||
|
||||
#ifdef DEBUG_ARRAY
|
||||
Log(LOG_DEBUG,
|
||||
"array_moveleft(): %u bytes used in array, starting at position %u.",
|
||||
a->used, bytepos);
|
||||
#endif
|
||||
if (a->used <= bytepos) {
|
||||
a->used = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
a->used -= bytepos;
|
||||
memmove(a->mem, a->mem + bytepos, a->used);
|
||||
}
|
||||
|
||||
/* -eof- */
|
||||
101
src/ngircd/array.h
Normal file
101
src/ngircd/array.h
Normal file
@@ -0,0 +1,101 @@
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* libarray - dynamically allocate arrays.
|
||||
* Copyright (c) 2005 Florian Westphal (westphal@foo.fh-furtwangen.de)
|
||||
*
|
||||
* $Id: array.h,v 1.4 2005/08/30 13:36:32 fw Exp $
|
||||
*/
|
||||
|
||||
#ifndef array_h_included
|
||||
#define array_h_included
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
typedef struct {
|
||||
char * mem;
|
||||
size_t allocated;
|
||||
size_t used;
|
||||
} array;
|
||||
|
||||
/* allocated: mem != NULL, used >= 0 && used <= allocated, allocated > 0
|
||||
unallocated: mem == NULL, allocated == 0, used == 0 */
|
||||
|
||||
#define array_unallocated(x) (array_bytes(x)==0)
|
||||
#define INIT_ARRAY { NULL, 0, 0 }
|
||||
|
||||
/* set all variables in a to 0 */
|
||||
extern void array_init PARAMS((array *a));
|
||||
|
||||
/* allocates space for at least nmemb+1 elements of size bytes each.
|
||||
return pointer to elem at pos, or NULL if realloc() fails */
|
||||
extern void * array_alloc PARAMS((array *a, size_t size, size_t pos));
|
||||
|
||||
/* returns the number of initialized BYTES in a. */
|
||||
#define array_bytes(array) ( (array)->used )
|
||||
|
||||
/* returns the number of initialized ELEMS in a. */
|
||||
extern size_t array_length PARAMS((const array* const a, size_t elemsize));
|
||||
|
||||
/* _copy functions: copy src to dest.
|
||||
return true if OK, else false (e. g. realloc failure, invalid src/dest
|
||||
array, ...). In that case dest is left unchanged. */
|
||||
|
||||
/* copy array src to dest */
|
||||
extern bool array_copy PARAMS((array* dest, const array* const src));
|
||||
|
||||
/* copy len bytes from src to array dest. */
|
||||
extern bool array_copyb PARAMS((array* dest, const char* src, size_t len));
|
||||
|
||||
/* copy string to dest */
|
||||
extern bool array_copys PARAMS((array* dest, const char* src));
|
||||
|
||||
/* _cat functions: append src to dest.
|
||||
return true if OK, else false (e. g. realloc failure, invalid src/dest
|
||||
array, ...). In that case dest is left unchanged. */
|
||||
|
||||
/* append len bytes from src to array dest. */
|
||||
extern bool array_catb PARAMS((array* dest, const char* src, size_t len));
|
||||
|
||||
/* append string to dest */
|
||||
extern bool array_cats PARAMS((array* dest, const char* src));
|
||||
|
||||
/* append NUL byte to dest */
|
||||
extern bool array_cat0 PARAMS((array* dest));
|
||||
|
||||
/* append NUL byte to dest, but do not count null byte */
|
||||
extern bool array_cat0_temporary PARAMS((array* dest));
|
||||
|
||||
/* append contents of array src to array dest. */
|
||||
extern bool array_cat PARAMS((array* dest, const array* const src));
|
||||
|
||||
/* return pointer to element at pos.
|
||||
return NULL if the array is unallocated or if pos is larger than the number
|
||||
of elements stored int the array. */
|
||||
extern void* array_get PARAMS((array* a, size_t membersize, size_t pos));
|
||||
|
||||
/* free the contents of this array. */
|
||||
extern void array_free PARAMS((array* a));
|
||||
|
||||
/* overwrite array with zeroes before free */
|
||||
extern void array_free_wipe PARAMS((array* a));
|
||||
|
||||
/* return pointer to first element in this array */
|
||||
extern void* array_start PARAMS((const array* const a));
|
||||
|
||||
/* reset this array (the memory is not free'd */
|
||||
extern void array_trunc PARAMS((array* a));
|
||||
|
||||
/* set number of used elements in this array to len */
|
||||
extern void array_truncate PARAMS((array* a, size_t membersize, size_t len));
|
||||
|
||||
/* move elements starting at pos to beginning of array */
|
||||
extern void array_moveleft PARAMS((array* a, size_t membersize, size_t pos));
|
||||
|
||||
#endif
|
||||
|
||||
/* -eof- */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -8,7 +8,7 @@
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: channel.h,v 1.26 2002/12/16 23:05:24 alex Exp $
|
||||
* $Id: channel.h,v 1.33 2006/12/07 22:23:39 fw Exp $
|
||||
*
|
||||
* Channel management (header)
|
||||
*/
|
||||
@@ -20,17 +20,25 @@
|
||||
|
||||
#if defined(__channel_c__) | defined(S_SPLINT_S)
|
||||
|
||||
#include "lists.h"
|
||||
#include "defines.h"
|
||||
#include "array.h"
|
||||
|
||||
typedef struct _CHANNEL
|
||||
{
|
||||
struct _CHANNEL *next;
|
||||
CHAR name[CHANNEL_NAME_LEN]; /* Name of the channel */
|
||||
char name[CHANNEL_NAME_LEN]; /* Name of the channel */
|
||||
UINT32 hash; /* Hash of the (lowecase!) name */
|
||||
CHAR modes[CHANNEL_MODE_LEN]; /* Channel modes */
|
||||
CHAR topic[CHANNEL_TOPIC_LEN]; /* Topic of the channel */
|
||||
CHAR key[CLIENT_PASS_LEN]; /* Channel key ("password", mode "k" ) */
|
||||
LONG maxusers; /* Maximum number of members (mode "l") */
|
||||
char modes[CHANNEL_MODE_LEN]; /* Channel modes */
|
||||
array topic; /* Topic of the channel */
|
||||
#ifndef STRICT_RFC
|
||||
time_t topic_time; /* Time when topic was set */
|
||||
char topic_who[CLIENT_NICK_LEN];/* Nickname of user that set topic */
|
||||
#endif
|
||||
char key[CLIENT_PASS_LEN]; /* Channel key ("password", mode "k" ) */
|
||||
unsigned long maxusers; /* Maximum number of members (mode "l") */
|
||||
struct list_head list_bans; /* list head of banned users */
|
||||
struct list_head list_invites; /* list head of invited users */
|
||||
} CHANNEL;
|
||||
|
||||
typedef struct _CLIENT2CHAN
|
||||
@@ -38,7 +46,7 @@ typedef struct _CLIENT2CHAN
|
||||
struct _CLIENT2CHAN *next;
|
||||
CLIENT *client;
|
||||
CHANNEL *channel;
|
||||
CHAR modes[CHANNEL_MODE_LEN]; /* User-Modes in dem Channel */
|
||||
char modes[CHANNEL_MODE_LEN]; /* User-Modes in dem Channel */
|
||||
} CL2CHAN;
|
||||
|
||||
#else
|
||||
@@ -48,37 +56,38 @@ typedef POINTER CL2CHAN;
|
||||
|
||||
#endif
|
||||
|
||||
GLOBAL struct list_head *Channel_GetListBans PARAMS((CHANNEL *c));
|
||||
GLOBAL struct list_head *Channel_GetListInvites PARAMS((CHANNEL *c));
|
||||
|
||||
GLOBAL VOID Channel_Init PARAMS(( VOID ));
|
||||
GLOBAL VOID Channel_InitPredefined PARAMS(( VOID ));
|
||||
GLOBAL VOID Channel_Exit PARAMS(( VOID ));
|
||||
GLOBAL void Channel_Init PARAMS(( void ));
|
||||
GLOBAL void Channel_InitPredefined PARAMS(( void ));
|
||||
GLOBAL void Channel_Exit PARAMS(( void ));
|
||||
|
||||
GLOBAL BOOLEAN Channel_Join PARAMS(( CLIENT *Client, CHAR *Name ));
|
||||
GLOBAL BOOLEAN Channel_Part PARAMS(( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason ));
|
||||
GLOBAL bool Channel_Join PARAMS(( CLIENT *Client, char *Name ));
|
||||
GLOBAL bool Channel_Part PARAMS(( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason ));
|
||||
|
||||
GLOBAL VOID Channel_Quit PARAMS(( CLIENT *Client, CHAR *Reason ));
|
||||
GLOBAL void Channel_Quit PARAMS(( CLIENT *Client, char *Reason ));
|
||||
|
||||
GLOBAL VOID Channel_Kick PARAMS(( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason ));
|
||||
GLOBAL void Channel_Kick PARAMS(( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason ));
|
||||
|
||||
GLOBAL LONG Channel_Count PARAMS(( VOID ));
|
||||
GLOBAL LONG Channel_MemberCount PARAMS(( CHANNEL *Chan ));
|
||||
GLOBAL INT Channel_CountForUser PARAMS(( CLIENT *Client ));
|
||||
GLOBAL INT Channel_PCount PARAMS(( VOID ));
|
||||
GLOBAL unsigned long Channel_Count PARAMS(( void ));
|
||||
GLOBAL unsigned long Channel_MemberCount PARAMS(( CHANNEL *Chan ));
|
||||
GLOBAL int Channel_CountForUser PARAMS(( CLIENT *Client ));
|
||||
|
||||
GLOBAL CHAR *Channel_Name PARAMS(( CHANNEL *Chan ));
|
||||
GLOBAL CHAR *Channel_Modes PARAMS(( CHANNEL *Chan ));
|
||||
GLOBAL CHAR *Channel_Topic PARAMS(( CHANNEL *Chan ));
|
||||
GLOBAL CHAR *Channel_Key PARAMS(( CHANNEL *Chan ));
|
||||
GLOBAL LONG Channel_MaxUsers PARAMS(( CHANNEL *Chan ));
|
||||
GLOBAL const char *Channel_Name PARAMS(( const CHANNEL *Chan ));
|
||||
GLOBAL char *Channel_Modes PARAMS(( CHANNEL *Chan ));
|
||||
GLOBAL char *Channel_Topic PARAMS(( CHANNEL *Chan ));
|
||||
GLOBAL char *Channel_Key PARAMS(( CHANNEL *Chan ));
|
||||
GLOBAL unsigned long Channel_MaxUsers PARAMS(( CHANNEL *Chan ));
|
||||
|
||||
GLOBAL VOID Channel_SetTopic PARAMS(( CHANNEL *Chan, CHAR *Topic ));
|
||||
GLOBAL VOID Channel_SetModes PARAMS(( CHANNEL *Chan, CHAR *Modes ));
|
||||
GLOBAL VOID Channel_SetKey PARAMS(( CHANNEL *Chan, CHAR *Key ));
|
||||
GLOBAL VOID Channel_SetMaxUsers PARAMS(( CHANNEL *Chan, LONG Count ));
|
||||
GLOBAL void Channel_SetTopic PARAMS(( CHANNEL *Chan, CLIENT *Client, char *Topic ));
|
||||
GLOBAL void Channel_SetModes PARAMS(( CHANNEL *Chan, char *Modes ));
|
||||
GLOBAL void Channel_SetKey PARAMS(( CHANNEL *Chan, char *Key ));
|
||||
GLOBAL void Channel_SetMaxUsers PARAMS(( CHANNEL *Chan, unsigned long Count ));
|
||||
|
||||
GLOBAL CHANNEL *Channel_Search PARAMS(( CHAR *Name ));
|
||||
GLOBAL CHANNEL *Channel_Search PARAMS(( char *Name ));
|
||||
|
||||
GLOBAL CHANNEL *Channel_First PARAMS(( VOID ));
|
||||
GLOBAL CHANNEL *Channel_First PARAMS(( void ));
|
||||
GLOBAL CHANNEL *Channel_Next PARAMS(( CHANNEL *Chan ));
|
||||
|
||||
GLOBAL CL2CHAN *Channel_FirstMember PARAMS(( CHANNEL *Chan ));
|
||||
@@ -89,23 +98,30 @@ GLOBAL CL2CHAN *Channel_NextChannelOf PARAMS(( CLIENT *Client, CL2CHAN *Cl2Chan
|
||||
GLOBAL CLIENT *Channel_GetClient PARAMS(( CL2CHAN *Cl2Chan ));
|
||||
GLOBAL CHANNEL *Channel_GetChannel PARAMS(( CL2CHAN *Cl2Chan ));
|
||||
|
||||
GLOBAL BOOLEAN Channel_IsValidName PARAMS(( CHAR *Name ));
|
||||
GLOBAL bool Channel_IsValidName PARAMS(( const char *Name ));
|
||||
|
||||
GLOBAL BOOLEAN Channel_ModeAdd PARAMS(( CHANNEL *Chan, CHAR Mode ));
|
||||
GLOBAL BOOLEAN Channel_ModeDel PARAMS(( CHANNEL *Chan, CHAR Mode ));
|
||||
GLOBAL bool Channel_ModeAdd PARAMS(( CHANNEL *Chan, char Mode ));
|
||||
GLOBAL bool Channel_ModeDel PARAMS(( CHANNEL *Chan, char Mode ));
|
||||
|
||||
GLOBAL BOOLEAN Channel_UserModeAdd PARAMS(( CHANNEL *Chan, CLIENT *Client, CHAR Mode ));
|
||||
GLOBAL BOOLEAN Channel_UserModeDel PARAMS(( CHANNEL *Chan, CLIENT *Client, CHAR Mode ));
|
||||
GLOBAL CHAR *Channel_UserModes PARAMS(( CHANNEL *Chan, CLIENT *Client ));
|
||||
GLOBAL bool Channel_UserModeAdd PARAMS(( CHANNEL *Chan, CLIENT *Client, char Mode ));
|
||||
GLOBAL bool Channel_UserModeDel PARAMS(( CHANNEL *Chan, CLIENT *Client, char Mode ));
|
||||
GLOBAL char *Channel_UserModes PARAMS(( CHANNEL *Chan, CLIENT *Client ));
|
||||
|
||||
GLOBAL BOOLEAN Channel_IsMemberOf PARAMS(( CHANNEL *Chan, CLIENT *Client ));
|
||||
GLOBAL bool Channel_IsMemberOf PARAMS(( CHANNEL *Chan, CLIENT *Client ));
|
||||
|
||||
GLOBAL BOOLEAN Channel_Write PARAMS(( CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR *Text ));
|
||||
|
||||
GLOBAL CHANNEL *Channel_Create PARAMS(( CHAR *Name ));
|
||||
GLOBAL bool Channel_Write PARAMS(( CHANNEL *Chan, CLIENT *From, CLIENT *Client, char *Text ));
|
||||
|
||||
GLOBAL CHANNEL *Channel_Create PARAMS(( char *Name ));
|
||||
|
||||
#ifndef STRICT_RFC
|
||||
GLOBAL unsigned int Channel_TopicTime PARAMS(( CHANNEL *Chan ));
|
||||
GLOBAL char *Channel_TopicWho PARAMS(( CHANNEL *Chan ));
|
||||
#endif
|
||||
|
||||
GLOBAL bool Channel_AddInvite PARAMS((CHANNEL *c, const char *Mask, bool OnlyOnce ));
|
||||
GLOBAL bool Channel_AddBan PARAMS((CHANNEL *c, const char *Mask ));
|
||||
|
||||
GLOBAL bool Channel_ShowBans PARAMS((CLIENT *client, CHANNEL *c));
|
||||
GLOBAL bool Channel_ShowInvites PARAMS((CLIENT *client, CHANNEL *c));
|
||||
#endif
|
||||
/* -eof- */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -8,7 +8,7 @@
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: client.h,v 1.34 2003/01/15 14:28:25 alex Exp $
|
||||
* $Id: client.h,v 1.46 2007/01/23 16:07:19 alex Exp $
|
||||
*
|
||||
* Client management (header)
|
||||
*/
|
||||
@@ -23,36 +23,35 @@
|
||||
#define CLIENT_GOTNICK 4 /* client did send NICK */
|
||||
#define CLIENT_GOTUSER 8 /* client did send USER */
|
||||
#define CLIENT_USER 16 /* client is an IRC user */
|
||||
#define CLIENT_UNKNOWNSERVER 32 /* unregistered server connection */
|
||||
#define CLIENT_GOTPASSSERVER 64 /* client did send PASS in "server style" */
|
||||
#define CLIENT_SERVER 128 /* client is a server */
|
||||
#define CLIENT_SERVICE 256 /* client is a service */
|
||||
#define CLIENT_SERVER 32 /* client is a server */
|
||||
#define CLIENT_SERVICE 64 /* client is a service */
|
||||
#define CLIENT_UNKNOWNSERVER 128 /* unregistered server connection */
|
||||
|
||||
#define CLIENT_TYPE INT
|
||||
|
||||
|
||||
#if defined(__client_c__) | defined(S_SPLINT_S)
|
||||
#define CLIENT_TYPE int
|
||||
|
||||
#include "defines.h"
|
||||
|
||||
#if defined(__client_c__) | defined(S_SPLINT_S)
|
||||
|
||||
typedef struct _CLIENT
|
||||
{
|
||||
CHAR id[CLIENT_ID_LEN]; /* nick (user) / ID (server) */
|
||||
time_t starttime; /* Start time of link */
|
||||
char id[CLIENT_ID_LEN]; /* nick (user) / ID (server) */
|
||||
UINT32 hash; /* hash of lower-case ID */
|
||||
POINTER *next; /* pointer to next client structure */
|
||||
CLIENT_TYPE type; /* type of client, see CLIENT_xxx */
|
||||
CONN_ID conn_id; /* ID of the connection (if local) or NONE (remote) */
|
||||
struct _CLIENT *introducer; /* ID of the servers which the client is connected to */
|
||||
struct _CLIENT *topserver; /* toplevel servers (only valid if client is a server) */
|
||||
CHAR pwd[CLIENT_PASS_LEN]; /* password received of the client */
|
||||
CHAR host[CLIENT_HOST_LEN]; /* hostname of the client */
|
||||
CHAR user[CLIENT_USER_LEN]; /* user name ("login") */
|
||||
CHAR info[CLIENT_INFO_LEN]; /* long user name (user) / info text (server) */
|
||||
CHAR modes[CLIENT_MODE_LEN]; /* client modes */
|
||||
INT hops, token, mytoken; /* "hops" and "Token" (see SERVER command) */
|
||||
BOOLEAN oper_by_me; /* client is local IRC operator on this server? */
|
||||
CHAR away[CLIENT_AWAY_LEN]; /* AWAY text (valid if mode 'a' is set) */
|
||||
CHAR flags[CLIENT_FLAGS_LEN]; /* flags of the client */
|
||||
char pwd[CLIENT_PASS_LEN]; /* password received of the client */
|
||||
char host[CLIENT_HOST_LEN]; /* hostname of the client */
|
||||
char user[CLIENT_USER_LEN]; /* user name ("login") */
|
||||
char info[CLIENT_INFO_LEN]; /* long user name (user) / info text (server) */
|
||||
char modes[CLIENT_MODE_LEN]; /* client modes */
|
||||
int hops, token, mytoken; /* "hops" and "Token" (see SERVER command) */
|
||||
bool oper_by_me; /* client is local IRC operator on this server? */
|
||||
char away[CLIENT_AWAY_LEN]; /* AWAY text (valid if mode 'a' is set) */
|
||||
char flags[CLIENT_FLAGS_LEN]; /* flags of the client */
|
||||
} CLIENT;
|
||||
|
||||
#else
|
||||
@@ -62,81 +61,93 @@ typedef POINTER CLIENT;
|
||||
#endif
|
||||
|
||||
|
||||
GLOBAL VOID Client_Init PARAMS(( VOID ));
|
||||
GLOBAL VOID Client_Exit PARAMS(( VOID ));
|
||||
typedef struct _WHOWAS
|
||||
{
|
||||
time_t time; /* time stamp of entry or 0 if unused */
|
||||
char id[CLIENT_NICK_LEN]; /* client nick name */
|
||||
char host[CLIENT_HOST_LEN]; /* hostname of the client */
|
||||
char user[CLIENT_USER_LEN]; /* user name ("login") */
|
||||
char info[CLIENT_INFO_LEN]; /* long user name */
|
||||
char server[CLIENT_HOST_LEN]; /* server name */
|
||||
} WHOWAS;
|
||||
|
||||
GLOBAL CLIENT *Client_NewLocal PARAMS(( CONN_ID Idx, CHAR *Hostname, INT Type, BOOLEAN Idented ));
|
||||
GLOBAL CLIENT *Client_NewRemoteServer PARAMS(( CLIENT *Introducer, CHAR *Hostname, CLIENT *TopServer, INT Hops, INT Token, CHAR *Info, BOOLEAN Idented ));
|
||||
GLOBAL CLIENT *Client_NewRemoteUser PARAMS(( CLIENT *Introducer, CHAR *Nick, INT Hops, CHAR *User, CHAR *Hostname, INT Token, CHAR *Modes, CHAR *Info, BOOLEAN Idented ));
|
||||
GLOBAL CLIENT *Client_New PARAMS(( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, INT Type, CHAR *ID, CHAR *User, CHAR *Hostname, CHAR *Info, INT Hops, INT Token, CHAR *Modes, BOOLEAN Idented ));
|
||||
|
||||
GLOBAL VOID Client_Destroy PARAMS(( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN SendQuit ));
|
||||
#ifdef CONN_MODULE
|
||||
GLOBAL VOID Client_DestroyNow PARAMS(( CLIENT *Client ));
|
||||
#endif
|
||||
GLOBAL void Client_Init PARAMS(( void ));
|
||||
GLOBAL void Client_Exit PARAMS(( void ));
|
||||
|
||||
GLOBAL CLIENT *Client_ThisServer PARAMS(( VOID ));
|
||||
GLOBAL CLIENT *Client_NewLocal PARAMS(( CONN_ID Idx, char *Hostname, int Type, bool Idented ));
|
||||
GLOBAL CLIENT *Client_NewRemoteServer PARAMS(( CLIENT *Introducer, char *Hostname, CLIENT *TopServer, int Hops, int Token, char *Info, bool Idented ));
|
||||
GLOBAL CLIENT *Client_NewRemoteUser PARAMS(( CLIENT *Introducer, char *Nick, int Hops, char *User, char *Hostname, int Token, char *Modes, char *Info, bool Idented ));
|
||||
|
||||
GLOBAL CLIENT *Client_GetFromConn PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL CLIENT *Client_GetFromToken PARAMS(( CLIENT *Client, INT Token ));
|
||||
GLOBAL void Client_Destroy PARAMS(( CLIENT *Client, char *LogMsg, char *FwdMsg, bool SendQuit ));
|
||||
|
||||
GLOBAL CLIENT *Client_Search PARAMS(( CHAR *ID ));
|
||||
GLOBAL CLIENT *Client_First PARAMS(( VOID ));
|
||||
GLOBAL CLIENT *Client_ThisServer PARAMS(( void ));
|
||||
|
||||
GLOBAL CLIENT *Client_GetFromToken PARAMS(( CLIENT *Client, int Token ));
|
||||
|
||||
GLOBAL CLIENT *Client_Search PARAMS(( char *ID ));
|
||||
GLOBAL CLIENT *Client_First PARAMS(( void ));
|
||||
GLOBAL CLIENT *Client_Next PARAMS(( CLIENT *c ));
|
||||
|
||||
GLOBAL INT Client_Type PARAMS(( CLIENT *Client ));
|
||||
GLOBAL int Client_Type PARAMS(( CLIENT *Client ));
|
||||
GLOBAL CONN_ID Client_Conn PARAMS(( CLIENT *Client ));
|
||||
GLOBAL CHAR *Client_ID PARAMS(( CLIENT *Client ));
|
||||
GLOBAL CHAR *Client_Mask PARAMS(( CLIENT *Client ));
|
||||
GLOBAL CHAR *Client_Info PARAMS(( CLIENT *Client ));
|
||||
GLOBAL CHAR *Client_User PARAMS(( CLIENT *Client ));
|
||||
GLOBAL CHAR *Client_Hostname PARAMS(( CLIENT *Client ));
|
||||
GLOBAL CHAR *Client_Password PARAMS(( CLIENT *Client ));
|
||||
GLOBAL CHAR *Client_Modes PARAMS(( CLIENT *Client ));
|
||||
GLOBAL CHAR *Client_Flags PARAMS(( CLIENT *Client ));
|
||||
GLOBAL char *Client_ID PARAMS(( CLIENT *Client ));
|
||||
GLOBAL char *Client_Mask PARAMS(( CLIENT *Client ));
|
||||
GLOBAL char *Client_Info PARAMS(( CLIENT *Client ));
|
||||
GLOBAL char *Client_User PARAMS(( CLIENT *Client ));
|
||||
GLOBAL char *Client_Hostname PARAMS(( CLIENT *Client ));
|
||||
GLOBAL char *Client_Password PARAMS(( CLIENT *Client ));
|
||||
GLOBAL char *Client_Modes PARAMS(( CLIENT *Client ));
|
||||
GLOBAL char *Client_Flags PARAMS(( CLIENT *Client ));
|
||||
GLOBAL CLIENT *Client_Introducer PARAMS(( CLIENT *Client ));
|
||||
GLOBAL BOOLEAN Client_OperByMe PARAMS(( CLIENT *Client ));
|
||||
GLOBAL INT Client_Hops PARAMS(( CLIENT *Client ));
|
||||
GLOBAL INT Client_Token PARAMS(( CLIENT *Client ));
|
||||
GLOBAL INT Client_MyToken PARAMS(( CLIENT *Client ));
|
||||
GLOBAL bool Client_OperByMe PARAMS(( CLIENT *Client ));
|
||||
GLOBAL int Client_Hops PARAMS(( CLIENT *Client ));
|
||||
GLOBAL int Client_Token PARAMS(( CLIENT *Client ));
|
||||
GLOBAL int Client_MyToken PARAMS(( CLIENT *Client ));
|
||||
GLOBAL CLIENT *Client_TopServer PARAMS(( CLIENT *Client ));
|
||||
GLOBAL CLIENT *Client_NextHop PARAMS(( CLIENT *Client ));
|
||||
GLOBAL CHAR *Client_Away PARAMS(( CLIENT *Client ));
|
||||
GLOBAL char *Client_Away PARAMS(( CLIENT *Client ));
|
||||
GLOBAL time_t Client_StartTime PARAMS(( CLIENT *Client ));
|
||||
|
||||
GLOBAL BOOLEAN Client_HasMode PARAMS(( CLIENT *Client, CHAR Mode ));
|
||||
GLOBAL bool Client_HasMode PARAMS(( CLIENT *Client, char Mode ));
|
||||
|
||||
GLOBAL VOID Client_SetHostname PARAMS(( CLIENT *Client, CHAR *Hostname ));
|
||||
GLOBAL VOID Client_SetID PARAMS(( CLIENT *Client, CHAR *Nick ));
|
||||
GLOBAL VOID Client_SetUser PARAMS(( CLIENT *Client, CHAR *User, BOOLEAN Idented ));
|
||||
GLOBAL VOID Client_SetInfo PARAMS(( CLIENT *Client, CHAR *Info ));
|
||||
GLOBAL VOID Client_SetPassword PARAMS(( CLIENT *Client, CHAR *Pwd ));
|
||||
GLOBAL VOID Client_SetType PARAMS(( CLIENT *Client, INT Type ));
|
||||
GLOBAL VOID Client_SetHops PARAMS(( CLIENT *Client, INT Hops ));
|
||||
GLOBAL VOID Client_SetToken PARAMS(( CLIENT *Client, INT Token ));
|
||||
GLOBAL VOID Client_SetOperByMe PARAMS(( CLIENT *Client, BOOLEAN OperByMe ));
|
||||
GLOBAL VOID Client_SetModes PARAMS(( CLIENT *Client, CHAR *Modes ));
|
||||
GLOBAL VOID Client_SetFlags PARAMS(( CLIENT *Client, CHAR *Flags ));
|
||||
GLOBAL VOID Client_SetIntroducer PARAMS(( CLIENT *Client, CLIENT *Introducer ));
|
||||
GLOBAL VOID Client_SetAway PARAMS(( CLIENT *Client, CHAR *Txt ));
|
||||
GLOBAL void Client_SetHostname PARAMS(( CLIENT *Client, char *Hostname ));
|
||||
GLOBAL void Client_SetID PARAMS(( CLIENT *Client, char *Nick ));
|
||||
GLOBAL void Client_SetUser PARAMS(( CLIENT *Client, char *User, bool Idented ));
|
||||
GLOBAL void Client_SetInfo PARAMS(( CLIENT *Client, char *Info ));
|
||||
GLOBAL void Client_SetPassword PARAMS(( CLIENT *Client, char *Pwd ));
|
||||
GLOBAL void Client_SetType PARAMS(( CLIENT *Client, int Type ));
|
||||
GLOBAL void Client_SetHops PARAMS(( CLIENT *Client, int Hops ));
|
||||
GLOBAL void Client_SetToken PARAMS(( CLIENT *Client, int Token ));
|
||||
GLOBAL void Client_SetOperByMe PARAMS(( CLIENT *Client, bool OperByMe ));
|
||||
GLOBAL void Client_SetModes PARAMS(( CLIENT *Client, char *Modes ));
|
||||
GLOBAL void Client_SetFlags PARAMS(( CLIENT *Client, char *Flags ));
|
||||
GLOBAL void Client_SetIntroducer PARAMS(( CLIENT *Client, CLIENT *Introducer ));
|
||||
GLOBAL void Client_SetAway PARAMS(( CLIENT *Client, char *Txt ));
|
||||
|
||||
GLOBAL BOOLEAN Client_ModeAdd PARAMS(( CLIENT *Client, CHAR Mode ));
|
||||
GLOBAL BOOLEAN Client_ModeDel PARAMS(( CLIENT *Client, CHAR Mode ));
|
||||
GLOBAL bool Client_ModeAdd PARAMS(( CLIENT *Client, char Mode ));
|
||||
GLOBAL bool Client_ModeDel PARAMS(( CLIENT *Client, char Mode ));
|
||||
|
||||
GLOBAL BOOLEAN Client_CheckNick PARAMS(( CLIENT *Client, CHAR *Nick ));
|
||||
GLOBAL BOOLEAN Client_CheckID PARAMS(( CLIENT *Client, CHAR *ID ));
|
||||
GLOBAL bool Client_CheckNick PARAMS(( CLIENT *Client, char *Nick ));
|
||||
GLOBAL bool Client_CheckID PARAMS(( CLIENT *Client, char *ID ));
|
||||
|
||||
GLOBAL LONG Client_UserCount PARAMS(( VOID ));
|
||||
GLOBAL LONG Client_ServiceCount PARAMS(( VOID ));
|
||||
GLOBAL LONG Client_ServerCount PARAMS(( VOID ));
|
||||
GLOBAL LONG Client_OperCount PARAMS(( VOID ));
|
||||
GLOBAL LONG Client_UnknownCount PARAMS(( VOID ));
|
||||
GLOBAL LONG Client_MyUserCount PARAMS(( VOID ));
|
||||
GLOBAL LONG Client_MyServiceCount PARAMS(( VOID ));
|
||||
GLOBAL LONG Client_MyServerCount PARAMS(( VOID ));
|
||||
GLOBAL LONG Client_MaxUserCount PARAMS(( VOID ));
|
||||
GLOBAL LONG Client_MyMaxUserCount PARAMS(( VOID ));
|
||||
GLOBAL long Client_UserCount PARAMS(( void ));
|
||||
GLOBAL long Client_ServiceCount PARAMS(( void ));
|
||||
GLOBAL long Client_ServerCount PARAMS(( void ));
|
||||
GLOBAL unsigned long Client_OperCount PARAMS(( void ));
|
||||
GLOBAL unsigned long Client_UnknownCount PARAMS(( void ));
|
||||
GLOBAL long Client_MyUserCount PARAMS(( void ));
|
||||
GLOBAL long Client_MyServiceCount PARAMS(( void ));
|
||||
GLOBAL unsigned long Client_MyServerCount PARAMS(( void ));
|
||||
GLOBAL long Client_MaxUserCount PARAMS(( void ));
|
||||
GLOBAL long Client_MyMaxUserCount PARAMS(( void ));
|
||||
|
||||
GLOBAL BOOLEAN Client_IsValidNick PARAMS(( CHAR *Nick ));
|
||||
GLOBAL bool Client_IsValidNick PARAMS(( const char *Nick ));
|
||||
|
||||
GLOBAL WHOWAS *Client_GetWhowas PARAMS(( void ));
|
||||
GLOBAL int Client_GetLastWhowasIndex PARAMS(( void ));
|
||||
|
||||
GLOBAL void Client_RegisterWhowas PARAMS(( CLIENT *Client ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
1002
src/ngircd/conf.c
1002
src/ngircd/conf.c
File diff suppressed because it is too large
Load Diff
@@ -8,7 +8,7 @@
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: conf.h,v 1.29 2004/05/07 11:19:21 alex Exp $
|
||||
* $Id: conf.h,v 1.47 2007/11/23 16:28:37 fw Exp $
|
||||
*
|
||||
* Configuration management (header)
|
||||
*/
|
||||
@@ -20,34 +20,38 @@
|
||||
#include <time.h>
|
||||
|
||||
#include "defines.h"
|
||||
|
||||
#include "array.h"
|
||||
#include "portab.h"
|
||||
|
||||
typedef struct _Conf_Oper
|
||||
{
|
||||
CHAR name[CLIENT_PASS_LEN]; /* Name (ID) of IRC operator */
|
||||
CHAR pwd[CLIENT_PASS_LEN]; /* Password */
|
||||
char name[CLIENT_PASS_LEN]; /* Name (ID) of IRC operator */
|
||||
char pwd[CLIENT_PASS_LEN]; /* Password */
|
||||
char *mask;
|
||||
} CONF_OPER;
|
||||
|
||||
typedef struct _Conf_Server
|
||||
{
|
||||
CHAR host[HOST_LEN]; /* Hostname */
|
||||
CHAR ip[16]; /* IP address (Resolver) */
|
||||
CHAR name[CLIENT_ID_LEN]; /* IRC-Client-ID */
|
||||
CHAR pwd_in[CLIENT_PASS_LEN]; /* Password which must be received */
|
||||
CHAR pwd_out[CLIENT_PASS_LEN]; /* Password to send to peer */
|
||||
INT port; /* Server port */
|
||||
INT group; /* Group of server */
|
||||
char host[HOST_LEN]; /* Hostname */
|
||||
char name[CLIENT_ID_LEN]; /* IRC-Client-ID */
|
||||
char pwd_in[CLIENT_PASS_LEN]; /* Password which must be received */
|
||||
char pwd_out[CLIENT_PASS_LEN]; /* Password to send to peer */
|
||||
UINT16 port; /* Server port */
|
||||
int group; /* Group of server */
|
||||
time_t lasttry; /* Last connect attempt */
|
||||
RES_STAT *res_stat; /* Status of the resolver */
|
||||
INT flags; /* Flags */
|
||||
RES_STAT res_stat; /* Status of the resolver */
|
||||
int flags; /* Flags */
|
||||
CONN_ID conn_id; /* ID of server connection or NONE */
|
||||
struct in_addr bind_addr; /* source address to use for outgoing connections */
|
||||
} CONF_SERVER;
|
||||
|
||||
typedef struct _Conf_Channel
|
||||
{
|
||||
CHAR name[CHANNEL_NAME_LEN]; /* Name of the channel */
|
||||
CHAR modes[CHANNEL_MODE_LEN]; /* Initial channel modes */
|
||||
CHAR topic[CHANNEL_TOPIC_LEN]; /* Initial topic */
|
||||
char name[CHANNEL_NAME_LEN]; /* Name of the channel */
|
||||
char modes[CHANNEL_MODE_LEN]; /* Initial channel modes */
|
||||
char key[CLIENT_PASS_LEN]; /* Channel key ("password", mode "k" ) */
|
||||
unsigned long maxusers; /* maximum usercount for this channel, mode "l" */
|
||||
array topic; /* Initial topic */
|
||||
} CONF_CHANNEL;
|
||||
|
||||
|
||||
@@ -56,81 +60,96 @@ typedef struct _Conf_Channel
|
||||
|
||||
|
||||
/* Name ("Nick") of the servers */
|
||||
GLOBAL CHAR Conf_ServerName[CLIENT_ID_LEN];
|
||||
GLOBAL char Conf_ServerName[CLIENT_ID_LEN];
|
||||
|
||||
/* Server info text */
|
||||
GLOBAL CHAR Conf_ServerInfo[CLIENT_INFO_LEN];
|
||||
GLOBAL char Conf_ServerInfo[CLIENT_INFO_LEN];
|
||||
|
||||
/* Global server passwort */
|
||||
GLOBAL CHAR Conf_ServerPwd[CLIENT_PASS_LEN];
|
||||
GLOBAL char Conf_ServerPwd[CLIENT_PASS_LEN];
|
||||
|
||||
/* Administrative information */
|
||||
GLOBAL CHAR Conf_ServerAdmin1[CLIENT_INFO_LEN];
|
||||
GLOBAL CHAR Conf_ServerAdmin2[CLIENT_INFO_LEN];
|
||||
GLOBAL CHAR Conf_ServerAdminMail[CLIENT_INFO_LEN];
|
||||
GLOBAL char Conf_ServerAdmin1[CLIENT_INFO_LEN];
|
||||
GLOBAL char Conf_ServerAdmin2[CLIENT_INFO_LEN];
|
||||
GLOBAL char Conf_ServerAdminMail[CLIENT_INFO_LEN];
|
||||
|
||||
/* File with MOTD text */
|
||||
GLOBAL CHAR Conf_MotdFile[FNAME_LEN];
|
||||
GLOBAL char Conf_MotdFile[FNAME_LEN];
|
||||
|
||||
/* Phrase with MOTD text */
|
||||
GLOBAL CHAR Conf_MotdPhrase[LINE_LEN];
|
||||
GLOBAL char Conf_MotdPhrase[LINE_LEN];
|
||||
|
||||
/* Ports the server should listen on */
|
||||
GLOBAL UINT Conf_ListenPorts[MAX_LISTEN_PORTS];
|
||||
GLOBAL INT Conf_ListenPorts_Count;
|
||||
GLOBAL array Conf_ListenPorts;
|
||||
|
||||
/* Address to which the socket should be bound or empty (=all) */
|
||||
GLOBAL CHAR Conf_ListenAddress[16];
|
||||
GLOBAL char Conf_ListenAddress[16];
|
||||
|
||||
/* User and group ID the server should run with */
|
||||
GLOBAL UINT Conf_UID;
|
||||
GLOBAL UINT Conf_GID;
|
||||
GLOBAL uid_t Conf_UID;
|
||||
GLOBAL gid_t Conf_GID;
|
||||
|
||||
/* A directory to chroot() in */
|
||||
GLOBAL CHAR Conf_Chroot[FNAME_LEN];
|
||||
GLOBAL char Conf_Chroot[FNAME_LEN];
|
||||
|
||||
/* File with PID of daemon */
|
||||
GLOBAL char Conf_PidFile[FNAME_LEN];
|
||||
|
||||
/* Timeouts for PING and PONG */
|
||||
GLOBAL INT Conf_PingTimeout;
|
||||
GLOBAL INT Conf_PongTimeout;
|
||||
GLOBAL int Conf_PingTimeout;
|
||||
GLOBAL int Conf_PongTimeout;
|
||||
|
||||
/* Seconds between connect attempts to other servers */
|
||||
GLOBAL INT Conf_ConnectRetry;
|
||||
GLOBAL int Conf_ConnectRetry;
|
||||
|
||||
/* Operators */
|
||||
GLOBAL CONF_OPER Conf_Oper[MAX_OPERATORS];
|
||||
GLOBAL INT Conf_Oper_Count;
|
||||
GLOBAL unsigned int Conf_Oper_Count;
|
||||
|
||||
/* Servers */
|
||||
GLOBAL CONF_SERVER Conf_Server[MAX_SERVERS];
|
||||
|
||||
/* Pre-defined channels */
|
||||
GLOBAL CONF_CHANNEL Conf_Channel[MAX_DEFCHANNELS];
|
||||
GLOBAL INT Conf_Channel_Count;
|
||||
GLOBAL unsigned int Conf_Channel_Count;
|
||||
/* Pre-defined channels only */
|
||||
GLOBAL bool Conf_PredefChannelsOnly;
|
||||
|
||||
/* Are IRC operators allowed to always use MODE? */
|
||||
GLOBAL BOOLEAN Conf_OperCanMode;
|
||||
GLOBAL bool Conf_OperCanMode;
|
||||
|
||||
/* Disable all DNS functions? */
|
||||
GLOBAL bool Conf_NoDNS;
|
||||
|
||||
/* If an IRC op gives chanop privileges without being a chanop,
|
||||
* ircd2 will ignore the command. This enables a workaround:
|
||||
* It masks the command as coming from the server */
|
||||
GLOBAL bool Conf_OperServerMode;
|
||||
|
||||
/* Maximum number of connections to this server */
|
||||
GLOBAL LONG Conf_MaxConnections;
|
||||
GLOBAL long Conf_MaxConnections;
|
||||
|
||||
/* Maximum number of channels a user can join */
|
||||
GLOBAL INT Conf_MaxJoins;
|
||||
GLOBAL int Conf_MaxJoins;
|
||||
|
||||
/* Maximum number of connections per IP address */
|
||||
GLOBAL INT Conf_MaxConnectionsIP;
|
||||
GLOBAL int Conf_MaxConnectionsIP;
|
||||
|
||||
/* Maximum length of a nick name */
|
||||
GLOBAL unsigned int Conf_MaxNickLength;
|
||||
|
||||
GLOBAL VOID Conf_Init PARAMS((VOID ));
|
||||
GLOBAL VOID Conf_Rehash PARAMS((VOID ));
|
||||
GLOBAL INT Conf_Test PARAMS((VOID ));
|
||||
GLOBAL void Conf_Init PARAMS((void));
|
||||
GLOBAL void Conf_Rehash PARAMS((void));
|
||||
GLOBAL int Conf_Test PARAMS((void));
|
||||
|
||||
GLOBAL VOID Conf_UnsetServer PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL VOID Conf_SetServer PARAMS(( INT ConfServer, CONN_ID Idx ));
|
||||
GLOBAL INT Conf_GetServer PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL void Conf_UnsetServer PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL void Conf_SetServer PARAMS(( int ConfServer, CONN_ID Idx ));
|
||||
GLOBAL int Conf_GetServer PARAMS(( CONN_ID Idx ));
|
||||
|
||||
GLOBAL BOOLEAN Conf_EnableServer PARAMS(( CHAR *Name, INT Port ));
|
||||
GLOBAL BOOLEAN Conf_DisableServer PARAMS(( CHAR *Name ));
|
||||
GLOBAL BOOLEAN Conf_AddServer PARAMS(( CHAR *Name, INT Port, CHAR *Host, CHAR *MyPwd, CHAR *PeerPwd ));
|
||||
GLOBAL bool Conf_EnableServer PARAMS(( char *Name, UINT16 Port ));
|
||||
GLOBAL bool Conf_EnablePassiveServer PARAMS((const char *Name));
|
||||
GLOBAL bool Conf_DisableServer PARAMS(( char *Name ));
|
||||
GLOBAL bool Conf_AddServer PARAMS(( char *Name, UINT16 Port, char *Host, char *MyPwd, char *PeerPwd ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -16,19 +16,20 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: conn-func.c,v 1.3 2003/12/26 15:55:07 alex Exp $";
|
||||
static char UNUSED id[] = "$Id: conn-func.c,v 1.11 2007/10/04 15:03:56 alex Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <log.h>
|
||||
|
||||
#include "conn.h"
|
||||
#include "client.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "conn-func.h"
|
||||
|
||||
|
||||
GLOBAL VOID
|
||||
GLOBAL void
|
||||
Conn_UpdateIdle( CONN_ID Idx )
|
||||
{
|
||||
/* Idle-Timer zuruecksetzen */
|
||||
@@ -38,6 +39,16 @@ Conn_UpdateIdle( CONN_ID Idx )
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Get signon time of a connection.
|
||||
*/
|
||||
GLOBAL time_t
|
||||
Conn_GetSignon(CONN_ID Idx)
|
||||
{
|
||||
assert(Idx > NONE);
|
||||
return My_Connections[Idx].signon;
|
||||
}
|
||||
|
||||
GLOBAL time_t
|
||||
Conn_GetIdle( CONN_ID Idx )
|
||||
{
|
||||
@@ -58,7 +69,7 @@ Conn_LastPing( CONN_ID Idx )
|
||||
} /* Conn_LastPing */
|
||||
|
||||
|
||||
GLOBAL VOID
|
||||
GLOBAL void
|
||||
Conn_SetPenalty( CONN_ID Idx, time_t Seconds )
|
||||
{
|
||||
/* Penalty-Delay fuer eine Verbindung (in Sekunden) setzen;
|
||||
@@ -72,11 +83,17 @@ Conn_SetPenalty( CONN_ID Idx, time_t Seconds )
|
||||
assert( Seconds >= 0 );
|
||||
|
||||
t = time( NULL ) + Seconds;
|
||||
if( t > My_Connections[Idx].delaytime ) My_Connections[Idx].delaytime = t;
|
||||
if (t > My_Connections[Idx].delaytime)
|
||||
My_Connections[Idx].delaytime = t;
|
||||
|
||||
#ifdef DEBUG
|
||||
Log(LOG_DEBUG, "Add penalty time on connection %d: %ld second(s).",
|
||||
Idx, (long)Seconds);
|
||||
#endif
|
||||
} /* Conn_SetPenalty */
|
||||
|
||||
|
||||
GLOBAL VOID
|
||||
GLOBAL void
|
||||
Conn_ResetPenalty( CONN_ID Idx )
|
||||
{
|
||||
assert( Idx > NONE );
|
||||
@@ -84,8 +101,8 @@ Conn_ResetPenalty( CONN_ID Idx )
|
||||
} /* Conn_ResetPenalty */
|
||||
|
||||
|
||||
GLOBAL VOID
|
||||
Conn_ClearFlags( VOID )
|
||||
GLOBAL void
|
||||
Conn_ClearFlags( void )
|
||||
{
|
||||
/* Alle Connection auf "nicht-markiert" setzen */
|
||||
|
||||
@@ -95,18 +112,18 @@ Conn_ClearFlags( VOID )
|
||||
} /* Conn_ClearFlags */
|
||||
|
||||
|
||||
GLOBAL INT
|
||||
GLOBAL int
|
||||
Conn_Flag( CONN_ID Idx )
|
||||
{
|
||||
/* Ist eine Connection markiert (TRUE) oder nicht? */
|
||||
/* Ist eine Connection markiert (true) oder nicht? */
|
||||
|
||||
assert( Idx > NONE );
|
||||
return My_Connections[Idx].flag;
|
||||
} /* Conn_Flag */
|
||||
|
||||
|
||||
GLOBAL VOID
|
||||
Conn_SetFlag( CONN_ID Idx, INT Flag )
|
||||
GLOBAL void
|
||||
Conn_SetFlag( CONN_ID Idx, int Flag )
|
||||
{
|
||||
/* Connection markieren */
|
||||
|
||||
@@ -116,7 +133,7 @@ Conn_SetFlag( CONN_ID Idx, INT Flag )
|
||||
|
||||
|
||||
GLOBAL CONN_ID
|
||||
Conn_First( VOID )
|
||||
Conn_First( void )
|
||||
{
|
||||
/* Connection-Struktur der ersten Verbindung liefern;
|
||||
* Ist keine Verbindung vorhanden, wird NONE geliefert. */
|
||||
@@ -149,32 +166,7 @@ Conn_Next( CONN_ID Idx )
|
||||
} /* Conn_Next */
|
||||
|
||||
|
||||
GLOBAL VOID
|
||||
Conn_SetOption( CONN_ID Idx, INT Option )
|
||||
{
|
||||
/* Option fuer Verbindung setzen.
|
||||
* Initial sind alle Optionen _nicht_ gesetzt. */
|
||||
|
||||
assert( Idx > NONE );
|
||||
assert( Option != 0 );
|
||||
|
||||
My_Connections[Idx].options |= Option;
|
||||
} /* Conn_SetOption */
|
||||
|
||||
|
||||
GLOBAL VOID
|
||||
Conn_UnsetOption( CONN_ID Idx, INT Option )
|
||||
{
|
||||
/* Option fuer Verbindung loeschen */
|
||||
|
||||
assert( Idx > NONE );
|
||||
assert( Option != 0 );
|
||||
|
||||
My_Connections[Idx].options &= ~Option;
|
||||
} /* Conn_UnsetOption */
|
||||
|
||||
|
||||
GLOBAL INT
|
||||
GLOBAL UINT16
|
||||
Conn_Options( CONN_ID Idx )
|
||||
{
|
||||
assert( Idx > NONE );
|
||||
@@ -182,31 +174,43 @@ Conn_Options( CONN_ID Idx )
|
||||
} /* Conn_Options */
|
||||
|
||||
|
||||
/**
|
||||
* Get the start time of the connection.
|
||||
* The result is the start time in seconds since 1970-01-01, as reported
|
||||
* by the C function time(NULL).
|
||||
*/
|
||||
GLOBAL time_t
|
||||
Conn_StartTime( CONN_ID Idx )
|
||||
{
|
||||
/* Zeitpunkt des Link-Starts liefern (in Sekunden) */
|
||||
CLIENT *c;
|
||||
|
||||
assert( Idx > NONE );
|
||||
return My_Connections[Idx].starttime;
|
||||
} /* Conn_Uptime */
|
||||
assert(Idx > NONE);
|
||||
|
||||
/* Search client structure for this link ... */
|
||||
c = Conn_GetClient(Idx);
|
||||
if(c != NULL)
|
||||
return Client_StartTime(c);
|
||||
|
||||
return 0;
|
||||
} /* Conn_StartTime */
|
||||
|
||||
|
||||
GLOBAL INT
|
||||
GLOBAL size_t
|
||||
Conn_SendQ( CONN_ID Idx )
|
||||
{
|
||||
/* Laenge der Daten im Schreibbuffer liefern */
|
||||
|
||||
assert( Idx > NONE );
|
||||
#ifdef ZLIB
|
||||
if( My_Connections[Idx].options & CONN_ZIP ) return My_Connections[Idx].zip.wdatalen;
|
||||
if( My_Connections[Idx].options & CONN_ZIP )
|
||||
return array_bytes(&My_Connections[Idx].zip.wbuf);
|
||||
else
|
||||
#endif
|
||||
return My_Connections[Idx].wdatalen;
|
||||
return array_bytes(&My_Connections[Idx].wbuf);
|
||||
} /* Conn_SendQ */
|
||||
|
||||
|
||||
GLOBAL LONG
|
||||
GLOBAL long
|
||||
Conn_SendMsg( CONN_ID Idx )
|
||||
{
|
||||
/* Anzahl gesendeter Nachrichten liefern */
|
||||
@@ -216,7 +220,7 @@ Conn_SendMsg( CONN_ID Idx )
|
||||
} /* Conn_SendMsg */
|
||||
|
||||
|
||||
GLOBAL LONG
|
||||
GLOBAL long
|
||||
Conn_SendBytes( CONN_ID Idx )
|
||||
{
|
||||
/* Anzahl gesendeter Bytes (unkomprimiert) liefern */
|
||||
@@ -226,21 +230,22 @@ Conn_SendBytes( CONN_ID Idx )
|
||||
} /* Conn_SendBytes */
|
||||
|
||||
|
||||
GLOBAL INT
|
||||
GLOBAL size_t
|
||||
Conn_RecvQ( CONN_ID Idx )
|
||||
{
|
||||
/* Laenge der Daten im Lesebuffer liefern */
|
||||
|
||||
assert( Idx > NONE );
|
||||
#ifdef ZLIB
|
||||
if( My_Connections[Idx].options & CONN_ZIP ) return My_Connections[Idx].zip.rdatalen;
|
||||
if( My_Connections[Idx].options & CONN_ZIP )
|
||||
return array_bytes(&My_Connections[Idx].zip.rbuf);
|
||||
else
|
||||
#endif
|
||||
return My_Connections[Idx].rdatalen;
|
||||
return array_bytes(&My_Connections[Idx].rbuf);
|
||||
} /* Conn_RecvQ */
|
||||
|
||||
|
||||
GLOBAL LONG
|
||||
GLOBAL long
|
||||
Conn_RecvMsg( CONN_ID Idx )
|
||||
{
|
||||
/* Anzahl empfangener Nachrichten liefern */
|
||||
@@ -250,7 +255,7 @@ Conn_RecvMsg( CONN_ID Idx )
|
||||
} /* Conn_RecvMsg */
|
||||
|
||||
|
||||
GLOBAL LONG
|
||||
GLOBAL long
|
||||
Conn_RecvBytes( CONN_ID Idx )
|
||||
{
|
||||
/* Anzahl empfangener Bytes (unkomprimiert) liefern */
|
||||
@@ -260,15 +265,15 @@ Conn_RecvBytes( CONN_ID Idx )
|
||||
} /* Conn_RecvBytes */
|
||||
|
||||
|
||||
GLOBAL VOID
|
||||
Conn_ResetWCounter( VOID )
|
||||
GLOBAL void
|
||||
Conn_ResetWCounter( void )
|
||||
{
|
||||
WCounter = 0;
|
||||
} /* Conn_ResetWCounter */
|
||||
|
||||
|
||||
GLOBAL LONG
|
||||
Conn_WCounter( VOID )
|
||||
GLOBAL long
|
||||
Conn_WCounter( void )
|
||||
{
|
||||
return WCounter;
|
||||
} /* Conn_WCounter */
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: conn-func.h,v 1.1 2002/12/30 17:14:28 alex Exp $
|
||||
* $Id: conn-func.h,v 1.7 2007/10/04 15:03:56 alex Exp $
|
||||
*
|
||||
* Connection management: Global functions (header)
|
||||
*/
|
||||
@@ -26,34 +26,36 @@
|
||||
#endif
|
||||
|
||||
|
||||
GLOBAL VOID Conn_UpdateIdle PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL void Conn_UpdateIdle PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL time_t Conn_GetSignon PARAMS((CONN_ID Idx));
|
||||
GLOBAL time_t Conn_GetIdle PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL time_t Conn_LastPing PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL time_t Conn_StartTime PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL INT Conn_SendQ PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL INT Conn_RecvQ PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL LONG Conn_SendMsg PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL LONG Conn_RecvMsg PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL LONG Conn_SendBytes PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL LONG Conn_RecvBytes PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL size_t Conn_SendQ PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL size_t Conn_RecvQ PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL long Conn_SendMsg PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL long Conn_RecvMsg PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL long Conn_SendBytes PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL long Conn_RecvBytes PARAMS(( CONN_ID Idx ));
|
||||
|
||||
GLOBAL VOID Conn_SetPenalty PARAMS(( CONN_ID Idx, time_t Seconds ));
|
||||
GLOBAL VOID Conn_ResetPenalty PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL void Conn_SetPenalty PARAMS(( CONN_ID Idx, time_t Seconds ));
|
||||
GLOBAL void Conn_ResetPenalty PARAMS(( CONN_ID Idx ));
|
||||
|
||||
GLOBAL VOID Conn_ClearFlags PARAMS(( VOID ));
|
||||
GLOBAL INT Conn_Flag PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL VOID Conn_SetFlag PARAMS(( CONN_ID Idx, INT Flag ));
|
||||
GLOBAL void Conn_ClearFlags PARAMS(( void ));
|
||||
GLOBAL int Conn_Flag PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL void Conn_SetFlag PARAMS(( CONN_ID Idx, int Flag ));
|
||||
|
||||
GLOBAL CONN_ID Conn_First PARAMS(( VOID ));
|
||||
GLOBAL CONN_ID Conn_First PARAMS(( void ));
|
||||
GLOBAL CONN_ID Conn_Next PARAMS(( CONN_ID Idx ));
|
||||
|
||||
GLOBAL VOID Conn_SetOption PARAMS(( CONN_ID Idx, INT Option ));
|
||||
GLOBAL VOID Conn_UnsetOption PARAMS(( CONN_ID Idx, INT Option ));
|
||||
GLOBAL INT Conn_Options PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL UINT16 Conn_Options PARAMS(( CONN_ID Idx ));
|
||||
|
||||
GLOBAL VOID Conn_ResetWCounter PARAMS(( VOID ));
|
||||
GLOBAL LONG Conn_WCounter PARAMS(( VOID ));
|
||||
GLOBAL void Conn_ResetWCounter PARAMS(( void ));
|
||||
GLOBAL long Conn_WCounter PARAMS(( void ));
|
||||
|
||||
#define Conn_OPTION_ADD( x, opt ) ( (x)->options |= (opt) )
|
||||
#define Conn_OPTION_DEL( x, opt ) ( (x)->options &= ~(opt) )
|
||||
#define Conn_OPTION_ISSET( x, opt ) ( ((x)->options & (opt)) != 0)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
* Copyright (c)2001-2007 Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -19,7 +19,10 @@
|
||||
|
||||
#ifdef ZLIB
|
||||
|
||||
static char UNUSED id[] = "$Id: conn-zip.c,v 1.5 2004/04/25 13:55:36 alex Exp $";
|
||||
/* enable more zlib related debug messages: */
|
||||
/* #define DEBUG_ZLIB */
|
||||
|
||||
static char UNUSED id[] = "$Id: conn-zip.c,v 1.16 2007/05/17 23:34:24 alex Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
@@ -30,11 +33,12 @@ static char UNUSED id[] = "$Id: conn-zip.c,v 1.5 2004/04/25 13:55:36 alex Exp $"
|
||||
#include "conn-func.h"
|
||||
#include "log.h"
|
||||
|
||||
#include "array.h"
|
||||
#include "exp.h"
|
||||
#include "conn-zip.h"
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
Zip_InitConn( CONN_ID Idx )
|
||||
{
|
||||
/* Kompression fuer Link initialisieren */
|
||||
@@ -52,7 +56,7 @@ Zip_InitConn( CONN_ID Idx )
|
||||
{
|
||||
/* Fehler! */
|
||||
Log( LOG_ALERT, "Can't initialize compression on connection %d (zlib inflate)!", Idx );
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
My_Connections[Idx].zip.out.total_in = 0;
|
||||
@@ -65,126 +69,187 @@ Zip_InitConn( CONN_ID Idx )
|
||||
{
|
||||
/* Fehler! */
|
||||
Log( LOG_ALERT, "Can't initialize compression on connection %d (zlib deflate)!", Idx );
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
My_Connections[Idx].zip.bytes_in = My_Connections[Idx].bytes_in;
|
||||
My_Connections[Idx].zip.bytes_out = My_Connections[Idx].bytes_out;
|
||||
|
||||
Log( LOG_INFO, "Enabled link compression (zlib) on connection %d.", Idx );
|
||||
Conn_SetOption( Idx, CONN_ZIP );
|
||||
Conn_OPTION_ADD( &My_Connections[Idx], CONN_ZIP );
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
} /* Zip_InitConn */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
Zip_Buffer( CONN_ID Idx, CHAR *Data, INT Len )
|
||||
/**
|
||||
* Copy data to the compression buffer of a connection. We do collect
|
||||
* some data there until it's full so that we can achieve better
|
||||
* compression ratios.
|
||||
* If the (pre-)compression buffer is full, we try to flush it ("actually
|
||||
* compress some data") and to add the new (uncompressed) data afterwards.
|
||||
* @param Idx Connection handle.
|
||||
* @param Data Pointer to the data.
|
||||
* @param Len Length of the data to add.
|
||||
* @return true on success, false otherwise. */
|
||||
GLOBAL bool
|
||||
Zip_Buffer( CONN_ID Idx, char *Data, size_t Len )
|
||||
{
|
||||
/* Daten zum Komprimieren im "Kompressions-Puffer" sammeln.
|
||||
* Es wird TRUE bei Erfolg, sonst FALSE geliefert. */
|
||||
size_t buflen;
|
||||
|
||||
assert( Idx > NONE );
|
||||
assert( Data != NULL );
|
||||
assert( Len > 0 );
|
||||
|
||||
/* Ist noch Platz im Kompressions-Puffer? */
|
||||
if( ZWRITEBUFFER_LEN - My_Connections[Idx].zip.wdatalen < Len + 50 )
|
||||
{
|
||||
/* Nein! Puffer zunaechst leeren ...*/
|
||||
if( ! Zip_Flush( Idx )) return FALSE;
|
||||
buflen = array_bytes(&My_Connections[Idx].zip.wbuf);
|
||||
if (buflen + Len >= WRITEBUFFER_SLINK_LEN) {
|
||||
/* compression buffer is full, flush */
|
||||
if( ! Zip_Flush( Idx )) return false;
|
||||
}
|
||||
|
||||
/* Daten kopieren */
|
||||
memmove( My_Connections[Idx].zip.wbuf + My_Connections[Idx].zip.wdatalen, Data, Len );
|
||||
My_Connections[Idx].zip.wdatalen += Len;
|
||||
/* check again; if zip buf is still too large do not append data:
|
||||
* otherwise the zip wbuf would grow too large */
|
||||
buflen = array_bytes(&My_Connections[Idx].zip.wbuf);
|
||||
if (buflen + Len >= WRITEBUFFER_SLINK_LEN)
|
||||
return false;
|
||||
|
||||
return TRUE;
|
||||
return array_catb(&My_Connections[Idx].zip.wbuf, Data, Len);
|
||||
} /* Zip_Buffer */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
/**
|
||||
* Compress data in ZIP buffer and move result to the write buffer of
|
||||
* the connection.
|
||||
* @param Idx Connection handle.
|
||||
* @retrun true on success, false otherwise.
|
||||
*/
|
||||
GLOBAL bool
|
||||
Zip_Flush( CONN_ID Idx )
|
||||
{
|
||||
/* Daten komprimieren und in Schreibpuffer kopieren.
|
||||
* Es wird TRUE bei Erfolg, sonst FALSE geliefert. */
|
||||
|
||||
INT result, out_len;
|
||||
int result;
|
||||
unsigned char zipbuf[WRITEBUFFER_SLINK_LEN];
|
||||
int zipbuf_used = 0;
|
||||
z_stream *out;
|
||||
|
||||
out = &My_Connections[Idx].zip.out;
|
||||
|
||||
out->next_in = (VOID *)My_Connections[Idx].zip.wbuf;
|
||||
out->avail_in = My_Connections[Idx].zip.wdatalen;
|
||||
out->next_out = (VOID *)(My_Connections[Idx].wbuf + My_Connections[Idx].wdatalen);
|
||||
out->avail_out = WRITEBUFFER_LEN - My_Connections[Idx].wdatalen;
|
||||
out->avail_in = (uInt)array_bytes(&My_Connections[Idx].zip.wbuf);
|
||||
if (!out->avail_in)
|
||||
return true; /* nothing to do. */
|
||||
|
||||
out->next_in = array_start(&My_Connections[Idx].zip.wbuf);
|
||||
assert(out->next_in != NULL);
|
||||
|
||||
out->next_out = zipbuf;
|
||||
out->avail_out = (uInt)sizeof zipbuf;
|
||||
|
||||
#ifdef DEBUG_ZIP
|
||||
Log(LOG_DEBUG, "out->avail_in %d, out->avail_out %d",
|
||||
out->avail_in, out->avail_out);
|
||||
#endif
|
||||
result = deflate( out, Z_SYNC_FLUSH );
|
||||
if(( result != Z_OK ) || ( out->avail_in > 0 ))
|
||||
{
|
||||
Log( LOG_ALERT, "Compression error: code %d!?", result );
|
||||
Conn_Close( Idx, "Compression error!", NULL, FALSE );
|
||||
return FALSE;
|
||||
Conn_Close( Idx, "Compression error!", NULL, false );
|
||||
return false;
|
||||
}
|
||||
|
||||
out_len = WRITEBUFFER_LEN - My_Connections[Idx].wdatalen - out->avail_out;
|
||||
My_Connections[Idx].wdatalen += out_len;
|
||||
My_Connections[Idx].bytes_out += out_len;
|
||||
My_Connections[Idx].zip.bytes_out += My_Connections[Idx].zip.wdatalen;
|
||||
My_Connections[Idx].zip.wdatalen = 0;
|
||||
if (out->avail_out <= 0) {
|
||||
/* Not all data was compressed, because data became
|
||||
* bigger while compressing it. */
|
||||
Log (LOG_ALERT, "Compression error: buffer overvlow!?");
|
||||
Conn_Close(Idx, "Compression error!", NULL, false);
|
||||
return false;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
assert(out->avail_out <= WRITEBUFFER_SLINK_LEN);
|
||||
|
||||
zipbuf_used = WRITEBUFFER_SLINK_LEN - out->avail_out;
|
||||
#ifdef DEBUG_ZIP
|
||||
Log(LOG_DEBUG, "zipbuf_used: %d", zipbuf_used);
|
||||
#endif
|
||||
if (!array_catb(&My_Connections[Idx].wbuf,
|
||||
(char *)zipbuf, (size_t) zipbuf_used)) {
|
||||
Log (LOG_ALERT, "Compression error: can't copy data!?");
|
||||
Conn_Close(Idx, "Compression error!", NULL, false);
|
||||
return false;
|
||||
}
|
||||
|
||||
My_Connections[Idx].bytes_out += zipbuf_used;
|
||||
My_Connections[Idx].zip.bytes_out += array_bytes(&My_Connections[Idx].zip.wbuf);
|
||||
array_trunc(&My_Connections[Idx].zip.wbuf);
|
||||
|
||||
return true;
|
||||
} /* Zip_Flush */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
Unzip_Buffer( CONN_ID Idx )
|
||||
{
|
||||
/* Daten entpacken und in Lesepuffer kopieren. Bei Fehlern
|
||||
* wird FALSE geliefert, ansonsten TRUE. Der Fall, dass keine
|
||||
* wird false geliefert, ansonsten true. Der Fall, dass keine
|
||||
* Daten mehr zu entpacken sind, ist _kein_ Fehler! */
|
||||
|
||||
INT result, in_len, out_len;
|
||||
int result;
|
||||
unsigned char unzipbuf[READBUFFER_LEN];
|
||||
int unzipbuf_used = 0;
|
||||
unsigned int z_rdatalen;
|
||||
unsigned int in_len;
|
||||
|
||||
z_stream *in;
|
||||
|
||||
assert( Idx > NONE );
|
||||
|
||||
if( My_Connections[Idx].zip.rdatalen <= 0 ) return TRUE;
|
||||
z_rdatalen = (unsigned int)array_bytes(&My_Connections[Idx].zip.rbuf);
|
||||
if (z_rdatalen == 0)
|
||||
return true;
|
||||
|
||||
in = &My_Connections[Idx].zip.in;
|
||||
|
||||
in->next_in = (VOID *)My_Connections[Idx].zip.rbuf;
|
||||
in->avail_in = My_Connections[Idx].zip.rdatalen;
|
||||
in->next_out = (VOID *)(My_Connections[Idx].rbuf + My_Connections[Idx].rdatalen);
|
||||
in->avail_out = READBUFFER_LEN - My_Connections[Idx].rdatalen - 1;
|
||||
in->next_in = array_start(&My_Connections[Idx].zip.rbuf);
|
||||
assert(in->next_in != NULL);
|
||||
|
||||
in->avail_in = z_rdatalen;
|
||||
in->next_out = unzipbuf;
|
||||
in->avail_out = (uInt)sizeof unzipbuf;
|
||||
|
||||
#ifdef DEBUG_ZIP
|
||||
Log(LOG_DEBUG, "in->avail_in %d, in->avail_out %d",
|
||||
in->avail_in, in->avail_out);
|
||||
#endif
|
||||
result = inflate( in, Z_SYNC_FLUSH );
|
||||
if( result != Z_OK )
|
||||
{
|
||||
Log( LOG_ALERT, "Decompression error: %s (code=%d, ni=%d, ai=%d, no=%d, ao=%d)!?", in->msg, result, in->next_in, in->avail_in, in->next_out, in->avail_out );
|
||||
Conn_Close( Idx, "Decompression error!", NULL, FALSE );
|
||||
return FALSE;
|
||||
Conn_Close( Idx, "Decompression error!", NULL, false );
|
||||
return false;
|
||||
}
|
||||
|
||||
in_len = My_Connections[Idx].zip.rdatalen - in->avail_in;
|
||||
out_len = READBUFFER_LEN - My_Connections[Idx].rdatalen - 1 - in->avail_out;
|
||||
My_Connections[Idx].rdatalen += out_len;
|
||||
assert(z_rdatalen >= in->avail_in);
|
||||
in_len = z_rdatalen - in->avail_in;
|
||||
unzipbuf_used = READBUFFER_LEN - in->avail_out;
|
||||
#ifdef DEBUG_ZIP
|
||||
Log(LOG_DEBUG, "unzipbuf_used: %d - %d = %d", READBUFFER_LEN,
|
||||
in->avail_out, unzipbuf_used);
|
||||
#endif
|
||||
assert(unzipbuf_used <= READBUFFER_LEN);
|
||||
if (!array_catb(&My_Connections[Idx].rbuf, (char*) unzipbuf,
|
||||
(size_t)unzipbuf_used))
|
||||
return false;
|
||||
|
||||
if( in->avail_in > 0 )
|
||||
{
|
||||
/* es konnten nicht alle Daten entpackt werden, vermutlich war
|
||||
* im Ziel-Puffer kein Platz mehr. Umkopieren ... */
|
||||
My_Connections[Idx].zip.rdatalen -= in_len;
|
||||
memmove( My_Connections[Idx].zip.rbuf, My_Connections[Idx].zip.rbuf + in_len, My_Connections[Idx].zip.rdatalen );
|
||||
if( in->avail_in > 0 ) {
|
||||
array_moveleft(&My_Connections[Idx].zip.rbuf, 1, in_len );
|
||||
} else {
|
||||
array_trunc( &My_Connections[Idx].zip.rbuf );
|
||||
My_Connections[Idx].zip.bytes_in += unzipbuf_used;
|
||||
}
|
||||
else My_Connections[Idx].zip.rdatalen = 0;
|
||||
My_Connections[Idx].zip.bytes_in += out_len;
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
} /* Unzip_Buffer */
|
||||
|
||||
|
||||
GLOBAL LONG
|
||||
GLOBAL long
|
||||
Zip_SendBytes( CONN_ID Idx )
|
||||
{
|
||||
/* Anzahl gesendeter Bytes (komprimiert!) liefern */
|
||||
@@ -194,7 +259,7 @@ Zip_SendBytes( CONN_ID Idx )
|
||||
} /* Zip_SendBytes */
|
||||
|
||||
|
||||
GLOBAL LONG
|
||||
GLOBAL long
|
||||
Zip_RecvBytes( CONN_ID Idx )
|
||||
{
|
||||
/* Anzahl gesendeter Bytes (komprimiert!) liefern */
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: conn-zip.h,v 1.2 2003/12/26 15:55:07 alex Exp $
|
||||
* $Id: conn-zip.h,v 1.4 2006/05/10 21:24:01 alex Exp $
|
||||
*
|
||||
* Connection compression using ZLIB (header)
|
||||
*/
|
||||
@@ -20,14 +20,14 @@
|
||||
#define __conn_zip_h__
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Zip_InitConn PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL bool Zip_InitConn PARAMS(( CONN_ID Idx ));
|
||||
|
||||
GLOBAL BOOLEAN Zip_Buffer PARAMS(( CONN_ID Idx, CHAR *Data, INT Len ));
|
||||
GLOBAL BOOLEAN Zip_Flush PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL BOOLEAN Unzip_Buffer PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL bool Zip_Buffer PARAMS(( CONN_ID Idx, char *Data, size_t Len ));
|
||||
GLOBAL bool Zip_Flush PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL bool Unzip_Buffer PARAMS(( CONN_ID Idx ));
|
||||
|
||||
GLOBAL LONG Zip_SendBytes PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL LONG Zip_RecvBytes PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL long Zip_SendBytes PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL long Zip_RecvBytes PARAMS(( CONN_ID Idx ));
|
||||
|
||||
|
||||
#endif /* __conn_zip_h__ */
|
||||
|
||||
2091
src/ngircd/conn.c
2091
src/ngircd/conn.c
File diff suppressed because it is too large
Load Diff
@@ -8,7 +8,7 @@
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: conn.h,v 1.32 2003/12/26 15:55:07 alex Exp $
|
||||
* $Id: conn.h,v 1.45 2007/10/04 15:03:56 alex Exp $
|
||||
*
|
||||
* Connection management (header)
|
||||
*/
|
||||
@@ -18,23 +18,26 @@
|
||||
#define __conn_h__
|
||||
|
||||
|
||||
#include <time.h> /* fro time_t, see below */
|
||||
#include <time.h> /* for time_t, see below */
|
||||
|
||||
|
||||
#define CONN_ISCLOSING 1 /* Conn_Close() already called */
|
||||
#define CONN_ISCLOSING 1 /* Conn_Close() already called */
|
||||
#define CONN_ISCONNECTING 2 /* connect() in progress */
|
||||
|
||||
#ifdef ZLIB
|
||||
#define CONN_ZIP 2 /* zlib compressed link */
|
||||
#define CONN_ZIP 4 /* zlib compressed link */
|
||||
#endif
|
||||
|
||||
|
||||
typedef INT CONN_ID;
|
||||
typedef int CONN_ID;
|
||||
|
||||
#include "client.h"
|
||||
|
||||
#ifdef CONN_MODULE
|
||||
|
||||
#include "defines.h"
|
||||
#include "resolve.h"
|
||||
#include "array.h"
|
||||
|
||||
#ifdef ZLIB
|
||||
#include <zlib.h>
|
||||
@@ -42,33 +45,30 @@ typedef struct _ZipData
|
||||
{
|
||||
z_stream in; /* "Handle" for input stream */
|
||||
z_stream out; /* "Handle" for output stream */
|
||||
CHAR rbuf[READBUFFER_LEN]; /* Read buffer */
|
||||
INT rdatalen; /* Length of data in read buffer (compressed) */
|
||||
CHAR wbuf[WRITEBUFFER_LEN]; /* Write buffer */
|
||||
INT wdatalen; /* Length of data in write buffer (uncompressed) */
|
||||
LONG bytes_in, bytes_out; /* Counter for statistics (uncompressed!) */
|
||||
array rbuf; /* Read buffer (compressed) */
|
||||
array wbuf; /* Write buffer (uncompressed) */
|
||||
long bytes_in, bytes_out; /* Counter for statistics (uncompressed!) */
|
||||
} ZIPDATA;
|
||||
#endif /* ZLIB */
|
||||
|
||||
typedef struct _Connection
|
||||
{
|
||||
INT sock; /* Socket handle */
|
||||
int sock; /* Socket handle */
|
||||
struct sockaddr_in addr; /* Client address */
|
||||
RES_STAT *res_stat; /* Status of resolver process, if any */
|
||||
CHAR host[HOST_LEN]; /* Hostname */
|
||||
CHAR rbuf[READBUFFER_LEN]; /* Read buffer */
|
||||
INT rdatalen; /* Length of data in read buffer */
|
||||
CHAR wbuf[WRITEBUFFER_LEN]; /* Write buffer */
|
||||
INT wdatalen; /* Length of data in write buffer */
|
||||
time_t starttime; /* Start time of link */
|
||||
RES_STAT res_stat; /* Status of resolver process */
|
||||
char host[HOST_LEN]; /* Hostname */
|
||||
array rbuf; /* Read buffer */
|
||||
array wbuf; /* Write buffer */
|
||||
time_t signon; /* Signon ("connect") time */
|
||||
time_t lastdata; /* Last activity */
|
||||
time_t lastping; /* Last PING */
|
||||
time_t lastprivmsg; /* Last PRIVMSG */
|
||||
time_t delaytime; /* Ignore link ("penalty") */
|
||||
LONG bytes_in, bytes_out; /* Received and sent bytes */
|
||||
LONG msg_in, msg_out; /* Received and sent IRC messages */
|
||||
INT flag; /* Flag (see "irc-write" module) */
|
||||
INT options; /* Link options */
|
||||
long bytes_in, bytes_out; /* Received and sent bytes */
|
||||
long msg_in, msg_out; /* Received and sent IRC messages */
|
||||
int flag; /* Flag (see "irc-write" module) */
|
||||
UINT16 options; /* Link options / connection state */
|
||||
CLIENT *client; /* pointer to client structure */
|
||||
#ifdef ZLIB
|
||||
ZIPDATA zip; /* Compression information */
|
||||
#endif /* ZLIB */
|
||||
@@ -76,32 +76,26 @@ typedef struct _Connection
|
||||
|
||||
GLOBAL CONNECTION *My_Connections;
|
||||
GLOBAL CONN_ID Pool_Size;
|
||||
GLOBAL LONG WCounter;
|
||||
GLOBAL long WCounter;
|
||||
|
||||
#endif /* CONN_MODULE */
|
||||
|
||||
|
||||
GLOBAL VOID Conn_Init PARAMS((VOID ));
|
||||
GLOBAL VOID Conn_Exit PARAMS(( VOID ));
|
||||
GLOBAL void Conn_Init PARAMS((void ));
|
||||
GLOBAL void Conn_Exit PARAMS(( void ));
|
||||
|
||||
GLOBAL INT Conn_InitListeners PARAMS(( VOID ));
|
||||
GLOBAL VOID Conn_ExitListeners PARAMS(( VOID ));
|
||||
GLOBAL unsigned int Conn_InitListeners PARAMS(( void ));
|
||||
GLOBAL void Conn_ExitListeners PARAMS(( void ));
|
||||
|
||||
GLOBAL BOOLEAN Conn_NewListener PARAMS(( CONST UINT Port ));
|
||||
GLOBAL void Conn_Handler PARAMS(( void ));
|
||||
|
||||
GLOBAL VOID Conn_Handler PARAMS(( VOID ));
|
||||
GLOBAL bool Conn_WriteStr PARAMS(( CONN_ID Idx, char *Format, ... ));
|
||||
|
||||
GLOBAL BOOLEAN Conn_Write PARAMS(( CONN_ID Idx, CHAR *Data, INT Len ));
|
||||
GLOBAL BOOLEAN Conn_WriteStr PARAMS(( CONN_ID Idx, CHAR *Format, ... ));
|
||||
|
||||
GLOBAL VOID Conn_Close PARAMS(( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformClient ));
|
||||
|
||||
GLOBAL VOID Conn_SyncServerStruct PARAMS(( VOID ));
|
||||
|
||||
GLOBAL INT Conn_MaxFD;
|
||||
GLOBAL void Conn_Close PARAMS(( CONN_ID Idx, char *LogMsg, char *FwdMsg, bool InformClient ));
|
||||
|
||||
GLOBAL void Conn_SyncServerStruct PARAMS(( void ));
|
||||
|
||||
GLOBAL CLIENT* Conn_GetClient PARAMS((CONN_ID i));
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
|
||||
* Copyright (c)2001-2007 Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -8,94 +8,119 @@
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: defines.h,v 1.46 2004/05/07 11:19:21 alex Exp $
|
||||
*
|
||||
* Global defines of ngIRCd.
|
||||
* $Id: defines.h,v 1.62 2007/11/21 12:16:36 alex Exp $
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __defines_h__
|
||||
#define __defines_h__
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Global constants ("#defines") used by the ngIRCd.
|
||||
*/
|
||||
|
||||
#define NONE -1
|
||||
|
||||
#define FNAME_LEN 256 /* max. Laenge eines Dateinamen */
|
||||
#define FNAME_LEN 256 /* Max. length of file name */
|
||||
|
||||
#define LINE_LEN 256 /* max. Laenge einer Konfigurationszeile */
|
||||
#define LINE_LEN 256 /* Max. length of a line in the
|
||||
configuration file */
|
||||
|
||||
#define HOST_LEN 256 /* max. Laenge eines Hostnamen */
|
||||
#define HOST_LEN 256 /* Max. lenght of fully qualified host
|
||||
names (e. g. "abc.domain.tld") */
|
||||
|
||||
#define MAX_LISTEN_PORTS 16 /* max. Anzahl von Listen-Ports */
|
||||
#define MAX_LISTEN_PORTS 16 /* Max. count of listening ports */
|
||||
|
||||
#define MAX_OPERATORS 16 /* max. Anzahl konfigurierbarer Operatoren */
|
||||
#define MAX_OPERATORS 16 /* Max. count of configurable IRC Ops */
|
||||
|
||||
#define MAX_SERVERS 16 /* max. Anzahl konfigurierbarer Server ("Peers") */
|
||||
#define MAX_SERVERS 16 /* Max. count of configurable servers */
|
||||
|
||||
#define MAX_DEFCHANNELS 16 /* max. Anzahl vorkonfigurierbarerr Channels */
|
||||
#define MAX_DEFCHANNELS 16 /* Max. count of predefined channels */
|
||||
|
||||
#define MAX_SERVICES 8 /* maximum number of configurable services */
|
||||
#define MAX_SERVICES 8 /* Max. count of services */
|
||||
|
||||
#define CONNECTION_POOL 100 /* Anzahl Verbindungs-Strukturen, die blockweise alloziert werden */
|
||||
#define MAX_WHOWAS 64 /* Max. number of WHOWAS items */
|
||||
#define DEFAULT_WHOWAS 5 /* default count for WHOWAS command */
|
||||
|
||||
#define CLIENT_ID_LEN 64 /* max. ID-Laenge; vgl. RFC 2812, 1.1 und 1.2.1 */
|
||||
#define CLIENT_NICK_LEN 10 /* max. Nick-Laenge; vgl. RFC 2812, 1.2.1 */
|
||||
#define CLIENT_PASS_LEN 9 /* max. Laenge des Passwortes */
|
||||
#define CLIENT_USER_LEN 9 /* max. Laenge des Benutzernamen ("Login") */
|
||||
#define CLIENT_NAME_LEN 32 /* max. Laenge des "langen Benutzernamen" */
|
||||
#define CLIENT_HOST_LEN 64 /* max. Laenge des Hostname */
|
||||
#define CLIENT_MODE_LEN 8 /* max. Laenge der Client-Modes */
|
||||
#define CLIENT_INFO_LEN 64 /* max. Infotext-Laenge (Server) */
|
||||
#define CLIENT_AWAY_LEN 128 /* max. Laenger der AWAY-Nachricht */
|
||||
#define CLIENT_FLAGS_LEN 100 /* max. Laenger der Client-Flags */
|
||||
#define CONNECTION_POOL 100 /* Size of default connection pool */
|
||||
|
||||
#define CHANNEL_NAME_LEN 51 /* max. Laenge eines Channel-Namens, vgl. RFC 2812, 1.3 */
|
||||
#define CHANNEL_MODE_LEN 8 /* max. Laenge der Channel-Modes */
|
||||
#define CHANNEL_TOPIC_LEN 128 /* max. Laenge eines Channel-Topics */
|
||||
#define CLIENT_ID_LEN 64 /* Max. length of an IRC ID; see RFC
|
||||
RFC 2812 section 1.1 and 1.2.1 */
|
||||
#define CLIENT_NICK_LEN_DEFAULT 10 /* Default nick length, see. RFC 2812
|
||||
* section 1.2.1 */
|
||||
#define CLIENT_NICK_LEN 32 /* Maximum nick name length */
|
||||
#define CLIENT_PASS_LEN 21 /* Max. password length */
|
||||
#define CLIENT_USER_LEN 10 /* Max. length of user name ("login")
|
||||
see RFC 2812, section 1.2.1 */
|
||||
#define CLIENT_NAME_LEN 32 /* Max. length of "real names" */
|
||||
#define CLIENT_HOST_LEN 64 /* Max. host name length */
|
||||
#define CLIENT_MODE_LEN 9 /* Max. lenth of all client modes */
|
||||
#define CLIENT_INFO_LEN 64 /* Max. length of server info texts */
|
||||
#define CLIENT_AWAY_LEN 128 /* Max. length of away messages */
|
||||
#define CLIENT_FLAGS_LEN 100 /* Max. length of client flags */
|
||||
|
||||
#define COMMAND_LEN 513 /* max. Laenge eines Befehls, vgl. RFC 2812, 3.2 */
|
||||
#define CHANNEL_NAME_LEN 51 /* Max. length of a channel name, see
|
||||
RFC 2812 section 1.3 */
|
||||
#define CHANNEL_MODE_LEN 9 /* Max. length of channel modes */
|
||||
|
||||
#define READBUFFER_LEN 2048 /* Laenge des Lesepuffers je Verbindung (Bytes) */
|
||||
#define WRITEBUFFER_LEN 4096 /* Laenge des Schreibpuffers je Verbindung (Bytes) */
|
||||
#define COMMAND_LEN 513 /* Max. IRC command length, see. RFC
|
||||
2812 section 3.2 */
|
||||
|
||||
#ifdef ZLIB
|
||||
#define ZREADBUFFER_LEN 1024 /* Laenge des Lesepuffers je Verbindung (Bytes) */
|
||||
#define ZWRITEBUFFER_LEN 4096 /* Laenge des Schreibpuffers fuer Kompression (Bytes) */
|
||||
#endif
|
||||
#define READBUFFER_LEN 2048 /* Size of the read buffer of a
|
||||
connection in bytes. */
|
||||
#define WRITEBUFFER_LEN 4096 /* Size of the write buffer of a
|
||||
connection in bytes. */
|
||||
#define WRITEBUFFER_SLINK_LEN 51200 /* Size of the write buffer of a
|
||||
server link connection in bytes. */
|
||||
|
||||
#define PROTOVER "0210" /* implementierte Protokoll-Version (RFC 2813, 4.1.1) */
|
||||
#define PROTOIRC "-IRC" /* Protokoll-Suffix (RFC 2813, 4.1.1) */
|
||||
#define PROTOIRCPLUS "-IRC+" /* Protokoll-Suffix f<>r IRC+-Protokoll */
|
||||
#define PROTOVER "0210" /* Implemented IRC protocol version,
|
||||
see RFC 2813 section 4.1.1. */
|
||||
#define PROTOIRC "-IRC" /* Protocol suffix, see RFC 2813
|
||||
section 4.1.1 */
|
||||
#define PROTOIRCPLUS "-IRC+" /* Protocol suffix used by the IRC+
|
||||
protocol, see doc/Protocol.txt */
|
||||
|
||||
#ifdef IRCPLUS
|
||||
# define IRCPLUSFLAGS "CL" /* IRC+-Flags, die immer zutreffen */
|
||||
# define IRCPLUSFLAGS "CHL" /* Standard IRC+ flags */
|
||||
#endif
|
||||
|
||||
#define STARTUP_DELAY 1 /* Erst n Sek. nach Start zu anderen Servern verbinden */
|
||||
#define RECONNECT_DELAY 3 /* Server-Links erst nach 3 Sekunden versuchen, wieder aufzubauen */
|
||||
#define STARTUP_DELAY 1 /* Delay outgoing connections n seconds
|
||||
after startup. */
|
||||
#define RECONNECT_DELAY 3 /* Time to delay re-connect attempts
|
||||
in seconds. */
|
||||
|
||||
#define USERMODES "aios" /* unterstuetzte User-Modes */
|
||||
#define CHANMODES "biklImnoPtv" /* unterstuetzte Channel-Modes */
|
||||
#define USERMODES "aios" /* Supported user modes. */
|
||||
#define CHANMODES "biIklmnoPstv" /* Supported channel modes. */
|
||||
|
||||
#define CONNECTED TRUE /* fuer die irc-xxx-Module */
|
||||
#define DISCONNECTED FALSE
|
||||
#define CONNECTED true /* Internal status codes. */
|
||||
#define DISCONNECTED false
|
||||
|
||||
#define DEFAULT_AWAY_MSG "Away" /* Away-Meldung fuer User von anderen Servern */
|
||||
#define DEFAULT_AWAY_MSG "Away" /* Away message for users connected to
|
||||
linked servers. */
|
||||
|
||||
#define CONFIG_FILE "/ngircd.conf"
|
||||
#define MOTD_FILE "/ngircd.motd"
|
||||
#define MOTD_PHRASE ""
|
||||
#define CHROOT_DIR ""
|
||||
#define DEFAULT_TOPIC_ID "-Server-" /* Default ID for "topic owner". */
|
||||
|
||||
#define ERROR_DIR "/tmp"
|
||||
#define CONFIG_FILE "/ngircd.conf" /* Configuration file name. */
|
||||
#define MOTD_FILE "/ngircd.motd" /* Name of the MOTD file. */
|
||||
#define MOTD_PHRASE "" /* Default MOTD phrase string. */
|
||||
#define CHROOT_DIR "" /* Default chroot() directory. */
|
||||
#define PID_FILE "" /* Default file for the process ID. */
|
||||
|
||||
#define MAX_LOG_MSG_LEN 256 /* max. Laenge einer Log-Meldung */
|
||||
#define ERROR_DIR "/tmp" /* Error directory used in debug mode */
|
||||
|
||||
#define TOKEN_OUTBOUND -2 /* Kennzeichnung fuer ausgehende Server-Links im Aufbau */
|
||||
#define MAX_LOG_MSG_LEN 256 /* Max. length of a log message. */
|
||||
|
||||
#define NOTICE_TXTPREFIX "" /* Kennzeichnung fuer Server-NOTICEs an User */
|
||||
#define TOKEN_OUTBOUND -2 /* Tag for outbound server links. */
|
||||
|
||||
#ifdef RENDEZVOUS
|
||||
#define RENDEZVOUS_TYPE "_ircu._tcp." /* Service type to register with Rendezvous */
|
||||
#define NOTICE_TXTPREFIX "" /* Prefix for NOTICEs from the server
|
||||
to users. Some servers use '*'. */
|
||||
|
||||
#define CUT_TXTSUFFIX "[CUT]" /* Suffix for oversized messages that
|
||||
have been shortened and cut off. */
|
||||
|
||||
#ifdef ZEROCONF
|
||||
#define MDNS_TYPE "_ircu._tcp." /* Service type to register with mDNS */
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -14,29 +14,28 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: hash.c,v 1.9 2002/12/26 16:25:43 alex Exp $";
|
||||
static char UNUSED id[] = "$Id: hash.c,v 1.13 2006/10/06 21:23:47 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "defines.h"
|
||||
#include "log.h"
|
||||
#include "tool.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "hash.h"
|
||||
|
||||
|
||||
LOCAL UINT32 jenkins_hash PARAMS(( register UINT8 *k, register UINT32 length, register UINT32 initval ));
|
||||
static UINT32 jenkins_hash PARAMS(( register UINT8 *k, register UINT32 length, register UINT32 initval ));
|
||||
|
||||
|
||||
GLOBAL UINT32
|
||||
Hash( CHAR *String )
|
||||
Hash( const char *String )
|
||||
{
|
||||
/* Hash-Wert ueber String berechnen */
|
||||
|
||||
CHAR buffer[LINE_LEN];
|
||||
char buffer[LINE_LEN];
|
||||
|
||||
strlcpy( buffer, String, sizeof( buffer ));
|
||||
return jenkins_hash( (UINT8 *)ngt_LowerStr( buffer ), strlen( buffer ), 42 );
|
||||
@@ -73,7 +72,7 @@ Hash( CHAR *String )
|
||||
} /* mix */
|
||||
|
||||
|
||||
LOCAL UINT32
|
||||
static UINT32
|
||||
jenkins_hash( register UINT8 *k, register UINT32 length, register UINT32 initval )
|
||||
{
|
||||
/* k: the key
|
||||
@@ -100,7 +99,7 @@ jenkins_hash( register UINT8 *k, register UINT32 length, register UINT32 initval
|
||||
|
||||
/* handle the last 11 bytes */
|
||||
c += length;
|
||||
switch( (INT)len ) /* all the case statements fall through */
|
||||
switch( (int)len ) /* all the case statements fall through */
|
||||
{
|
||||
case 11: c+=((UINT32)k[10]<<24);
|
||||
case 10: c+=((UINT32)k[9]<<16);
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: hash.h,v 1.4 2002/12/12 12:23:43 alex Exp $
|
||||
* $Id: hash.h,v 1.6 2006/10/06 21:23:47 fw Exp $
|
||||
*
|
||||
* Hash calculation (header)
|
||||
*/
|
||||
@@ -17,8 +17,7 @@
|
||||
#ifndef __hash_h__
|
||||
#define __hash_h__
|
||||
|
||||
|
||||
GLOBAL UINT32 Hash PARAMS((CHAR *String ));
|
||||
GLOBAL UINT32 Hash PARAMS((const char *String ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
931
src/ngircd/io.c
Normal file
931
src/ngircd/io.c
Normal file
@@ -0,0 +1,931 @@
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* I/O abstraction interface.
|
||||
* Copyright (c) 2005 Florian Westphal (westphal@foo.fh-furtwangen.de)
|
||||
*
|
||||
*/
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: io.c,v 1.28.2.1 2008/04/03 14:16:35 fw Exp $";
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "array.h"
|
||||
#include "io.h"
|
||||
#include "log.h"
|
||||
|
||||
/* Enables extra debug messages in event add/delete/callback code. */
|
||||
/* #define DEBUG_IO */
|
||||
|
||||
typedef struct {
|
||||
#ifdef PROTOTYPES
|
||||
void (*callback)(int, short);
|
||||
#else
|
||||
void (*callback)();
|
||||
#endif
|
||||
short what;
|
||||
} io_event;
|
||||
|
||||
#define INIT_IOEVENT { NULL, -1, 0, NULL }
|
||||
#define IO_ERROR 4
|
||||
|
||||
#ifdef HAVE_EPOLL_CREATE
|
||||
# define IO_USE_EPOLL 1
|
||||
# ifdef HAVE_SELECT
|
||||
# define IO_USE_SELECT 1
|
||||
# endif
|
||||
#else
|
||||
# ifdef HAVE_KQUEUE
|
||||
# define IO_USE_KQUEUE 1
|
||||
# else
|
||||
# ifdef HAVE_SYS_DEVPOLL_H
|
||||
# define IO_USE_DEVPOLL 1
|
||||
# else
|
||||
# ifdef HAVE_POLL
|
||||
# define IO_USE_POLL 1
|
||||
# else
|
||||
# ifdef HAVE_SELECT
|
||||
# define IO_USE_SELECT 1
|
||||
# else
|
||||
# error "no IO API available!?"
|
||||
# endif /* HAVE_SELECT */
|
||||
# endif /* HAVE_POLL */
|
||||
# endif /* HAVE_SYS_DEVPOLL_H */
|
||||
# endif /* HAVE_KQUEUE */
|
||||
#endif /* HAVE_EPOLL_CREATE */
|
||||
|
||||
static bool library_initialized = false;
|
||||
|
||||
#ifdef IO_USE_EPOLL
|
||||
#include <sys/epoll.h>
|
||||
|
||||
static int io_masterfd = -1;
|
||||
static bool io_event_change_epoll(int fd, short what, const int action);
|
||||
static int io_dispatch_epoll(struct timeval *tv);
|
||||
#endif
|
||||
|
||||
#ifdef IO_USE_KQUEUE
|
||||
#include <sys/types.h>
|
||||
#include <sys/event.h>
|
||||
static array io_evcache;
|
||||
static int io_masterfd;
|
||||
|
||||
static int io_dispatch_kqueue(struct timeval *tv);
|
||||
static bool io_event_change_kqueue(int, short, const int action);
|
||||
#endif
|
||||
|
||||
#ifdef IO_USE_POLL
|
||||
#include <poll.h>
|
||||
|
||||
static array pollfds;
|
||||
static int poll_maxfd;
|
||||
|
||||
static bool io_event_change_poll PARAMS((int fd, short what));
|
||||
#endif
|
||||
|
||||
#ifdef IO_USE_DEVPOLL
|
||||
#include <sys/devpoll.h>
|
||||
static int io_masterfd;
|
||||
|
||||
static bool io_event_change_devpoll(int fd, short what);
|
||||
#endif
|
||||
|
||||
#ifdef IO_USE_SELECT
|
||||
#include "defines.h" /* for conn.h */
|
||||
#include "conn.h" /* for CONN_IDX (needed by resolve.h) */
|
||||
#include "resolve.h" /* for RES_STAT (needed by conf.h) */
|
||||
#include "conf.h" /* for Conf_MaxConnections */
|
||||
|
||||
static fd_set readers;
|
||||
static fd_set writers;
|
||||
static int select_maxfd; /* the select() interface sucks badly */
|
||||
static int io_dispatch_select(struct timeval *tv);
|
||||
|
||||
#ifndef IO_USE_EPOLL
|
||||
#define io_masterfd -1
|
||||
#endif
|
||||
#endif /* IO_USE_SELECT */
|
||||
|
||||
static array io_events;
|
||||
|
||||
static void io_docallback PARAMS((int fd, short what));
|
||||
|
||||
static io_event *
|
||||
io_event_get(int fd)
|
||||
{
|
||||
io_event *i;
|
||||
|
||||
assert(fd >= 0);
|
||||
|
||||
i = (io_event *) array_get(&io_events, sizeof(io_event), (size_t) fd);
|
||||
|
||||
assert(i != NULL);
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
|
||||
#ifdef IO_USE_DEVPOLL
|
||||
static void
|
||||
io_library_init_devpoll(unsigned int eventsize)
|
||||
{
|
||||
io_masterfd = open("/dev/poll", O_RDWR);
|
||||
if (io_masterfd >= 0)
|
||||
library_initialized = true;
|
||||
Log(LOG_INFO, "IO subsystem: /dev/poll (initial maxfd %u, masterfd %d).",
|
||||
eventsize, io_masterfd);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef IO_USE_POLL
|
||||
static void
|
||||
io_library_init_poll(unsigned int eventsize)
|
||||
{
|
||||
struct pollfd *p;
|
||||
array_init(&pollfds);
|
||||
poll_maxfd = 0;
|
||||
Log(LOG_INFO, "IO subsystem: poll (initial maxfd %u).",
|
||||
eventsize);
|
||||
p = array_alloc(&pollfds, sizeof(struct pollfd), eventsize);
|
||||
if (p) {
|
||||
unsigned i;
|
||||
p = array_start(&pollfds);
|
||||
for (i = 0; i < eventsize; i++)
|
||||
p[i].fd = -1;
|
||||
|
||||
library_initialized = true;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef IO_USE_SELECT
|
||||
static void
|
||||
io_library_init_select(unsigned int eventsize)
|
||||
{
|
||||
Log(LOG_INFO, "IO subsystem: select (initial maxfd %u).",
|
||||
eventsize);
|
||||
FD_ZERO(&readers);
|
||||
FD_ZERO(&writers);
|
||||
#ifdef FD_SETSIZE
|
||||
if (Conf_MaxConnections >= (int)FD_SETSIZE) {
|
||||
Log(LOG_WARNING,
|
||||
"MaxConnections (%d) exceeds limit (%u), changed MaxConnections to %u.",
|
||||
Conf_MaxConnections, FD_SETSIZE, FD_SETSIZE - 1);
|
||||
|
||||
Conf_MaxConnections = FD_SETSIZE - 1;
|
||||
}
|
||||
#endif /* FD_SETSIZE */
|
||||
library_initialized = true;
|
||||
}
|
||||
#endif /* SELECT */
|
||||
|
||||
|
||||
#ifdef IO_USE_EPOLL
|
||||
static void
|
||||
io_library_init_epoll(unsigned int eventsize)
|
||||
{
|
||||
int ecreate_hint = (int)eventsize;
|
||||
if (ecreate_hint <= 0)
|
||||
ecreate_hint = 128;
|
||||
io_masterfd = epoll_create(ecreate_hint);
|
||||
if (io_masterfd >= 0) {
|
||||
library_initialized = true;
|
||||
Log(LOG_INFO,
|
||||
"IO subsystem: epoll (hint size %d, initial maxfd %u, masterfd %d).",
|
||||
ecreate_hint, eventsize, io_masterfd);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef IO_USE_KQUEUE
|
||||
static void
|
||||
io_library_init_kqueue(unsigned int eventsize)
|
||||
{
|
||||
io_masterfd = kqueue();
|
||||
|
||||
Log(LOG_INFO,
|
||||
"IO subsystem: kqueue (initial maxfd %u, masterfd %d)",
|
||||
eventsize, io_masterfd);
|
||||
if (io_masterfd >= 0)
|
||||
library_initialized = true;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
bool
|
||||
io_library_init(unsigned int eventsize)
|
||||
{
|
||||
if (library_initialized)
|
||||
return true;
|
||||
#ifdef IO_USE_SELECT
|
||||
#ifndef FD_SETSIZE
|
||||
Log(LOG_WARNING,
|
||||
"FD_SETSIZE undefined, don't know how many descriptors select() can handle on your platform ...");
|
||||
#else
|
||||
if (eventsize >= FD_SETSIZE)
|
||||
eventsize = FD_SETSIZE - 1;
|
||||
#endif /* FD_SETSIZE */
|
||||
#endif /* IO_USE_SELECT */
|
||||
if ((eventsize > 0) && !array_alloc(&io_events, sizeof(io_event), (size_t)eventsize))
|
||||
eventsize = 0;
|
||||
#ifdef IO_USE_EPOLL
|
||||
io_library_init_epoll(eventsize);
|
||||
#ifdef IO_USE_SELECT
|
||||
if (io_masterfd < 0)
|
||||
Log(LOG_INFO, "Can't initialize epoll() IO interface, falling back to select() ...");
|
||||
#endif
|
||||
#endif
|
||||
#ifdef IO_USE_KQUEUE
|
||||
io_library_init_kqueue(eventsize);
|
||||
#endif
|
||||
#ifdef IO_USE_DEVPOLL
|
||||
io_library_init_devpoll(eventsize);
|
||||
#endif
|
||||
#ifdef IO_USE_POLL
|
||||
io_library_init_poll(eventsize);
|
||||
#endif
|
||||
#ifdef IO_USE_SELECT
|
||||
if (! library_initialized)
|
||||
io_library_init_select(eventsize);
|
||||
#endif
|
||||
return library_initialized;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
io_library_shutdown(void)
|
||||
{
|
||||
#ifdef IO_USE_SELECT
|
||||
FD_ZERO(&readers);
|
||||
FD_ZERO(&writers);
|
||||
#endif
|
||||
#ifdef IO_USE_EPOLL
|
||||
if (io_masterfd >= 0)
|
||||
close(io_masterfd);
|
||||
io_masterfd = -1;
|
||||
#endif
|
||||
#ifdef IO_USE_KQUEUE
|
||||
close(io_masterfd);
|
||||
io_masterfd = -1;
|
||||
array_free(&io_evcache);
|
||||
#endif
|
||||
library_initialized = false;
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
io_event_setcb(int fd, void (*cbfunc) (int, short))
|
||||
{
|
||||
io_event *i = io_event_get(fd);
|
||||
if (!i)
|
||||
return false;
|
||||
|
||||
i->callback = cbfunc;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
io_event_create(int fd, short what, void (*cbfunc) (int, short))
|
||||
{
|
||||
bool ret;
|
||||
io_event *i;
|
||||
|
||||
assert(fd >= 0);
|
||||
#if defined(IO_USE_SELECT) && defined(FD_SETSIZE)
|
||||
if (io_masterfd < 0 && fd >= FD_SETSIZE) {
|
||||
Log(LOG_ERR,
|
||||
"fd %d exceeds FD_SETSIZE (%u) (select can't handle more file descriptors)",
|
||||
fd, FD_SETSIZE);
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
i = (io_event *) array_alloc(&io_events, sizeof(io_event), (size_t) fd);
|
||||
if (!i) {
|
||||
Log(LOG_WARNING,
|
||||
"array_alloc failed: could not allocate space for %d io_event structures",
|
||||
fd);
|
||||
return false;
|
||||
}
|
||||
|
||||
i->callback = cbfunc;
|
||||
i->what = 0;
|
||||
#ifdef IO_USE_DEVPOLL
|
||||
ret = io_event_change_devpoll(fd, what);
|
||||
#endif
|
||||
#ifdef IO_USE_POLL
|
||||
ret = io_event_change_poll(fd, what);
|
||||
#endif
|
||||
#ifdef IO_USE_EPOLL
|
||||
ret = io_event_change_epoll(fd, what, EPOLL_CTL_ADD);
|
||||
#endif
|
||||
#ifdef IO_USE_KQUEUE
|
||||
ret = io_event_change_kqueue(fd, what, EV_ADD|EV_ENABLE);
|
||||
#endif
|
||||
#ifdef IO_USE_SELECT
|
||||
if (io_masterfd < 0)
|
||||
ret = io_event_add(fd, what);
|
||||
#endif
|
||||
if (ret) i->what = what;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
#ifdef IO_USE_DEVPOLL
|
||||
static bool
|
||||
io_event_change_devpoll(int fd, short what)
|
||||
{
|
||||
struct pollfd p;
|
||||
|
||||
p.events = 0;
|
||||
|
||||
if (what & IO_WANTREAD)
|
||||
p.events = POLLIN | POLLPRI;
|
||||
if (what & IO_WANTWRITE)
|
||||
p.events |= POLLOUT;
|
||||
|
||||
p.fd = fd;
|
||||
return write(io_masterfd, &p, sizeof p) == (ssize_t)sizeof p;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#ifdef IO_USE_POLL
|
||||
static bool
|
||||
io_event_change_poll(int fd, short what)
|
||||
{
|
||||
struct pollfd *p;
|
||||
short events = 0;
|
||||
|
||||
if (what & IO_WANTREAD)
|
||||
events = POLLIN | POLLPRI;
|
||||
if (what & IO_WANTWRITE)
|
||||
events |= POLLOUT;
|
||||
|
||||
p = array_alloc(&pollfds, sizeof *p, fd);
|
||||
if (p) {
|
||||
p->events = events;
|
||||
p->fd = fd;
|
||||
if (fd > poll_maxfd)
|
||||
poll_maxfd = fd;
|
||||
}
|
||||
return p != NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef IO_USE_EPOLL
|
||||
static bool
|
||||
io_event_change_epoll(int fd, short what, const int action)
|
||||
{
|
||||
struct epoll_event ev = { 0, {0} };
|
||||
ev.data.fd = fd;
|
||||
|
||||
if (what & IO_WANTREAD)
|
||||
ev.events = EPOLLIN | EPOLLPRI;
|
||||
if (what & IO_WANTWRITE)
|
||||
ev.events |= EPOLLOUT;
|
||||
|
||||
return epoll_ctl(io_masterfd, action, fd, &ev) == 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef IO_USE_KQUEUE
|
||||
static bool
|
||||
io_event_kqueue_commit_cache(void)
|
||||
{
|
||||
struct kevent *events;
|
||||
bool ret;
|
||||
int len = (int) array_length(&io_evcache, sizeof (struct kevent));
|
||||
|
||||
if (!len) /* nothing to do */
|
||||
return true;
|
||||
|
||||
assert(len>0);
|
||||
|
||||
if (len < 0) {
|
||||
array_free(&io_evcache);
|
||||
return false;
|
||||
}
|
||||
|
||||
events = array_start(&io_evcache);
|
||||
|
||||
assert(events != NULL);
|
||||
|
||||
ret = kevent(io_masterfd, events, len, NULL, 0, NULL) == 0;
|
||||
if (ret)
|
||||
array_trunc(&io_evcache);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static bool
|
||||
io_event_change_kqueue(int fd, short what, const int action)
|
||||
{
|
||||
struct kevent kev;
|
||||
bool ret = true;
|
||||
|
||||
if (what & IO_WANTREAD) {
|
||||
EV_SET(&kev, fd, EVFILT_READ, action, 0, 0, 0);
|
||||
ret = array_catb(&io_evcache, (char*) &kev, sizeof (kev));
|
||||
if (!ret)
|
||||
ret = kevent(io_masterfd, &kev,1, NULL, 0, NULL) == 0;
|
||||
}
|
||||
|
||||
if (ret && (what & IO_WANTWRITE)) {
|
||||
EV_SET(&kev, fd, EVFILT_WRITE, action, 0, 0, 0);
|
||||
ret = array_catb(&io_evcache, (char*) &kev, sizeof (kev));
|
||||
if (!ret)
|
||||
ret = kevent(io_masterfd, &kev, 1, NULL, 0, NULL) == 0;
|
||||
}
|
||||
|
||||
if (array_length(&io_evcache, sizeof kev) >= 100)
|
||||
io_event_kqueue_commit_cache();
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
bool
|
||||
io_event_add(int fd, short what)
|
||||
{
|
||||
io_event *i = io_event_get(fd);
|
||||
|
||||
if (!i) return false;
|
||||
|
||||
if ((i->what & what) == what) /* event type is already registered */
|
||||
return true;
|
||||
#ifdef DEBUG_IO
|
||||
Log(LOG_DEBUG, "io_event_add(): fd %d, what %d.", fd, what);
|
||||
#endif
|
||||
i->what |= what;
|
||||
#ifdef IO_USE_EPOLL
|
||||
if (io_masterfd >= 0)
|
||||
return io_event_change_epoll(fd, i->what, EPOLL_CTL_MOD);
|
||||
#endif
|
||||
|
||||
#ifdef IO_USE_KQUEUE
|
||||
return io_event_change_kqueue(fd, what, EV_ADD | EV_ENABLE);
|
||||
#endif
|
||||
#ifdef IO_USE_DEVPOLL
|
||||
return io_event_change_devpoll(fd, i->what);
|
||||
#endif
|
||||
#ifdef IO_USE_POLL
|
||||
return io_event_change_poll(fd, i->what);
|
||||
#endif
|
||||
#ifdef IO_USE_SELECT
|
||||
if (fd > select_maxfd)
|
||||
select_maxfd = fd;
|
||||
|
||||
if (what & IO_WANTREAD)
|
||||
FD_SET(fd, &readers);
|
||||
if (what & IO_WANTWRITE)
|
||||
FD_SET(fd, &writers);
|
||||
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
io_setnonblock(int fd)
|
||||
{
|
||||
int flags = fcntl(fd, F_GETFL);
|
||||
if (flags == -1)
|
||||
return false;
|
||||
|
||||
#ifndef O_NONBLOCK
|
||||
#define O_NONBLOCK O_NDELAY
|
||||
#endif
|
||||
flags |= O_NONBLOCK;
|
||||
|
||||
return fcntl(fd, F_SETFL, flags) == 0;
|
||||
}
|
||||
|
||||
|
||||
#ifdef IO_USE_DEVPOLL
|
||||
static void
|
||||
io_close_devpoll(int fd)
|
||||
{
|
||||
struct pollfd p;
|
||||
p.events = POLLREMOVE;
|
||||
p.fd = fd;
|
||||
write(io_masterfd, &p, sizeof p);
|
||||
}
|
||||
#else
|
||||
static inline void
|
||||
io_close_devpoll(int UNUSED x)
|
||||
{
|
||||
/* NOTHING */
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#ifdef IO_USE_POLL
|
||||
static void
|
||||
io_close_poll(int fd)
|
||||
{
|
||||
struct pollfd *p;
|
||||
p = array_get(&pollfds, sizeof *p, fd);
|
||||
if (!p) return;
|
||||
|
||||
p->fd = -1;
|
||||
if (fd == poll_maxfd) {
|
||||
while (poll_maxfd > 0) {
|
||||
--poll_maxfd;
|
||||
p = array_get(&pollfds, sizeof *p, poll_maxfd);
|
||||
if (p && p->fd >= 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
static inline void io_close_poll(int UNUSED x) { /* NOTHING */ }
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef IO_USE_SELECT
|
||||
static void
|
||||
io_close_select(int fd)
|
||||
{
|
||||
io_event *i;
|
||||
|
||||
if (io_masterfd >= 0) /* Are we using epoll()? */
|
||||
return;
|
||||
|
||||
FD_CLR(fd, &writers);
|
||||
FD_CLR(fd, &readers);
|
||||
|
||||
i = io_event_get(fd);
|
||||
if (!i) return;
|
||||
|
||||
if (fd == select_maxfd) {
|
||||
while (select_maxfd>0) {
|
||||
--select_maxfd; /* find largest fd */
|
||||
i = io_event_get(select_maxfd);
|
||||
if (i && i->callback) break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
static inline void
|
||||
io_close_select(int UNUSED x)
|
||||
{
|
||||
/* NOTHING */
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
bool
|
||||
io_close(int fd)
|
||||
{
|
||||
io_event *i;
|
||||
|
||||
i = io_event_get(fd);
|
||||
#ifdef IO_USE_KQUEUE
|
||||
if (array_length(&io_evcache, sizeof (struct kevent))) /* pending data in cache? */
|
||||
io_event_kqueue_commit_cache();
|
||||
|
||||
/* both kqueue and epoll remove fd from all sets automatically on the last close
|
||||
* of the descriptor. since we don't know if this is the last close we'll have
|
||||
* to remove the set explicitly. */
|
||||
if (i) {
|
||||
io_event_change_kqueue(fd, i->what, EV_DELETE);
|
||||
io_event_kqueue_commit_cache();
|
||||
}
|
||||
#endif
|
||||
|
||||
io_close_devpoll(fd);
|
||||
io_close_poll(fd);
|
||||
io_close_select(fd);
|
||||
|
||||
#ifdef IO_USE_EPOLL
|
||||
io_event_change_epoll(fd, 0, EPOLL_CTL_DEL);
|
||||
#endif
|
||||
if (i) {
|
||||
i->callback = NULL;
|
||||
i->what = 0;
|
||||
}
|
||||
return close(fd) == 0;
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
io_event_del(int fd, short what)
|
||||
{
|
||||
io_event *i = io_event_get(fd);
|
||||
#ifdef DEBUG_IO
|
||||
Log(LOG_DEBUG, "io_event_del(): trying to delete eventtype %d on fd %d", what, fd);
|
||||
#endif
|
||||
if (!i) return false;
|
||||
|
||||
if (!(i->what & what)) /* event is already disabled */
|
||||
return true;
|
||||
|
||||
i->what &= ~what;
|
||||
|
||||
#ifdef IO_USE_DEVPOLL
|
||||
return io_event_change_devpoll(fd, i->what);
|
||||
#endif
|
||||
#ifdef IO_USE_POLL
|
||||
return io_event_change_poll(fd, i->what);
|
||||
#endif
|
||||
#ifdef IO_USE_EPOLL
|
||||
if (io_masterfd >= 0)
|
||||
return io_event_change_epoll(fd, i->what, EPOLL_CTL_MOD);
|
||||
#endif
|
||||
|
||||
#ifdef IO_USE_KQUEUE
|
||||
return io_event_change_kqueue(fd, what, EV_DISABLE);
|
||||
#endif
|
||||
#ifdef IO_USE_SELECT
|
||||
if (what & IO_WANTWRITE)
|
||||
FD_CLR(fd, &writers);
|
||||
|
||||
if (what & IO_WANTREAD)
|
||||
FD_CLR(fd, &readers);
|
||||
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
#ifdef IO_USE_SELECT
|
||||
static int
|
||||
io_dispatch_select(struct timeval *tv)
|
||||
{
|
||||
fd_set readers_tmp = readers;
|
||||
fd_set writers_tmp = writers;
|
||||
short what;
|
||||
int ret, i;
|
||||
int fds_ready;
|
||||
ret = select(select_maxfd + 1, &readers_tmp, &writers_tmp, NULL, tv);
|
||||
if (ret <= 0)
|
||||
return ret;
|
||||
|
||||
fds_ready = ret;
|
||||
|
||||
for (i = 0; i <= select_maxfd; i++) {
|
||||
what = 0;
|
||||
if (FD_ISSET(i, &readers_tmp)) {
|
||||
what = IO_WANTREAD;
|
||||
fds_ready--;
|
||||
}
|
||||
|
||||
if (FD_ISSET(i, &writers_tmp)) {
|
||||
what |= IO_WANTWRITE;
|
||||
fds_ready--;
|
||||
}
|
||||
if (what)
|
||||
io_docallback(i, what);
|
||||
if (fds_ready <= 0)
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef IO_USE_DEVPOLL
|
||||
static int
|
||||
io_dispatch_devpoll(struct timeval *tv)
|
||||
{
|
||||
struct dvpoll dvp;
|
||||
time_t sec = tv->tv_sec * 1000;
|
||||
int i, total, ret, timeout = tv->tv_usec + sec;
|
||||
short what;
|
||||
struct pollfd p[100];
|
||||
|
||||
if (timeout < 0)
|
||||
timeout = 1000;
|
||||
|
||||
total = 0;
|
||||
do {
|
||||
dvp.dp_timeout = timeout;
|
||||
dvp.dp_nfds = 100;
|
||||
dvp.dp_fds = p;
|
||||
ret = ioctl(io_masterfd, DP_POLL, &dvp);
|
||||
total += ret;
|
||||
if (ret <= 0)
|
||||
return total;
|
||||
for (i=0; i < ret ; i++) {
|
||||
what = 0;
|
||||
if (p[i].revents & (POLLIN|POLLPRI))
|
||||
what = IO_WANTREAD;
|
||||
|
||||
if (p[i].revents & POLLOUT)
|
||||
what |= IO_WANTWRITE;
|
||||
|
||||
if (p[i].revents && !what) {
|
||||
/* other flag is set, probably POLLERR */
|
||||
what = IO_ERROR;
|
||||
}
|
||||
io_docallback(p[i].fd, what);
|
||||
}
|
||||
} while (ret == 100);
|
||||
|
||||
return total;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef IO_USE_POLL
|
||||
static int
|
||||
io_dispatch_poll(struct timeval *tv)
|
||||
{
|
||||
time_t sec = tv->tv_sec * 1000;
|
||||
int i, ret, timeout = tv->tv_usec + sec;
|
||||
int fds_ready;
|
||||
short what;
|
||||
struct pollfd *p = array_start(&pollfds);
|
||||
|
||||
if (timeout < 0)
|
||||
timeout = 1000;
|
||||
|
||||
ret = poll(p, poll_maxfd + 1, timeout);
|
||||
if (ret <= 0)
|
||||
return ret;
|
||||
|
||||
fds_ready = ret;
|
||||
for (i=0; i <= poll_maxfd; i++) {
|
||||
what = 0;
|
||||
if (p[i].revents & (POLLIN|POLLPRI))
|
||||
what = IO_WANTREAD;
|
||||
|
||||
if (p[i].revents & POLLOUT)
|
||||
what |= IO_WANTWRITE;
|
||||
|
||||
if (p[i].revents && !what) {
|
||||
/* other flag is set, probably POLLERR */
|
||||
what = IO_ERROR;
|
||||
}
|
||||
if (what) {
|
||||
fds_ready--;
|
||||
io_docallback(i, what);
|
||||
}
|
||||
if (fds_ready <= 0)
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef IO_USE_EPOLL
|
||||
static int
|
||||
io_dispatch_epoll(struct timeval *tv)
|
||||
{
|
||||
time_t sec = tv->tv_sec * 1000;
|
||||
int i, total = 0, ret, timeout = tv->tv_usec + sec;
|
||||
struct epoll_event epoll_ev[100];
|
||||
short type;
|
||||
|
||||
if (timeout < 0)
|
||||
timeout = 1000;
|
||||
|
||||
do {
|
||||
ret = epoll_wait(io_masterfd, epoll_ev, 100, timeout);
|
||||
total += ret;
|
||||
if (ret <= 0)
|
||||
return total;
|
||||
|
||||
for (i = 0; i < ret; i++) {
|
||||
type = 0;
|
||||
if (epoll_ev[i].events & (EPOLLERR | EPOLLHUP))
|
||||
type = IO_ERROR;
|
||||
|
||||
if (epoll_ev[i].events & (EPOLLIN | EPOLLPRI))
|
||||
type |= IO_WANTREAD;
|
||||
|
||||
if (epoll_ev[i].events & EPOLLOUT)
|
||||
type |= IO_WANTWRITE;
|
||||
|
||||
io_docallback(epoll_ev[i].data.fd, type);
|
||||
}
|
||||
|
||||
timeout = 0;
|
||||
} while (ret == 100);
|
||||
|
||||
return total;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef IO_USE_KQUEUE
|
||||
static int
|
||||
io_dispatch_kqueue(struct timeval *tv)
|
||||
{
|
||||
int i, total = 0, ret;
|
||||
struct kevent kev[100];
|
||||
struct kevent *newevents;
|
||||
struct timespec ts;
|
||||
int newevents_len;
|
||||
ts.tv_sec = tv->tv_sec;
|
||||
ts.tv_nsec = tv->tv_usec * 1000;
|
||||
|
||||
do {
|
||||
newevents_len = (int) array_length(&io_evcache, sizeof (struct kevent));
|
||||
newevents = (newevents_len > 0) ? array_start(&io_evcache) : NULL;
|
||||
assert(newevents_len >= 0);
|
||||
|
||||
ret = kevent(io_masterfd, newevents, newevents_len, kev, 100, &ts);
|
||||
if (newevents && ret != -1)
|
||||
array_trunc(&io_evcache);
|
||||
|
||||
total += ret;
|
||||
if (ret <= 0)
|
||||
return total;
|
||||
|
||||
for (i = 0; i < ret; i++) {
|
||||
#ifdef DEBUG_IO
|
||||
LogDebug("fd %d, kev.flags: %x", (int)kev[i].ident, kev[i].flags);
|
||||
#endif
|
||||
if (kev[i].flags & (EV_EOF|EV_ERROR)) {
|
||||
if (kev[i].flags & EV_ERROR)
|
||||
Log(LOG_ERR, "kevent fd %d: EV_ERROR (%s)",
|
||||
(int)kev[i].ident, strerror((int)kev[i].data));
|
||||
io_docallback((int)kev[i].ident, IO_ERROR);
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (kev[i].filter) {
|
||||
case EVFILT_READ:
|
||||
io_docallback((int)kev[i].ident, IO_WANTREAD);
|
||||
break;
|
||||
case EVFILT_WRITE:
|
||||
io_docallback((int)kev[i].ident, IO_WANTWRITE);
|
||||
break;
|
||||
default:
|
||||
LogDebug("Unknown kev.filter number %d for fd %d",
|
||||
kev[i].filter, kev[i].ident);
|
||||
/* Fall through */
|
||||
case EV_ERROR:
|
||||
io_docallback((int)kev[i].ident, IO_ERROR);
|
||||
break;
|
||||
}
|
||||
}
|
||||
ts.tv_sec = 0;
|
||||
ts.tv_nsec = 0;
|
||||
} while (ret == 100);
|
||||
|
||||
return total;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
int
|
||||
io_dispatch(struct timeval *tv)
|
||||
{
|
||||
#ifdef IO_USE_EPOLL
|
||||
if (io_masterfd >= 0)
|
||||
return io_dispatch_epoll(tv);
|
||||
#endif
|
||||
#ifdef IO_USE_SELECT
|
||||
return io_dispatch_select(tv);
|
||||
#endif
|
||||
#ifdef IO_USE_KQUEUE
|
||||
return io_dispatch_kqueue(tv);
|
||||
#endif
|
||||
#ifdef IO_USE_DEVPOLL
|
||||
return io_dispatch_devpoll(tv);
|
||||
#endif
|
||||
#ifdef IO_USE_POLL
|
||||
return io_dispatch_poll(tv);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/* call the callback function inside the struct matching fd */
|
||||
static void
|
||||
io_docallback(int fd, short what)
|
||||
{
|
||||
io_event *i;
|
||||
#ifdef DEBUG_IO
|
||||
Log(LOG_DEBUG, "doing callback for fd %d, what %d", fd, what);
|
||||
#endif
|
||||
i = io_event_get(fd);
|
||||
|
||||
if (i->callback) { /* callback might be NULL if a previous callback function
|
||||
called io_close on this fd */
|
||||
i->callback(fd, (what & IO_ERROR) ? i->what : what);
|
||||
}
|
||||
/* if error indicator is set, we return the event(s) that were registered */
|
||||
}
|
||||
51
src/ngircd/io.h
Normal file
51
src/ngircd/io.h
Normal file
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* I/O abstraction interface header
|
||||
*
|
||||
* $Id: io.h,v 1.4 2006/12/25 22:53:52 alex Exp $
|
||||
*/
|
||||
|
||||
#ifndef io_H_included
|
||||
#define io_H_included
|
||||
|
||||
#include "portab.h"
|
||||
#include <sys/time.h>
|
||||
|
||||
#define IO_WANTREAD 1
|
||||
#define IO_WANTWRITE 2
|
||||
|
||||
/* init library.
|
||||
sets up epoll/kqueue descriptors and tries to allocate space for ioevlen
|
||||
file descriptors. ioevlen is just the _initial_ size, not a limit. */
|
||||
bool io_library_init PARAMS((unsigned int ioevlen));
|
||||
|
||||
/* shutdown and free all internal data structures */
|
||||
void io_library_shutdown PARAMS((void));
|
||||
|
||||
/* add fd to internal set, enable readability check, set callback */
|
||||
bool io_event_create PARAMS((int fd, short what, void (*cbfunc)(int, short)));
|
||||
|
||||
/* change callback function associated with fd */
|
||||
bool io_event_setcb PARAMS((int fd, void (*cbfunc)(int, short)));
|
||||
|
||||
/* watch fd for event of type what */
|
||||
bool io_event_add PARAMS((int fd, short what));
|
||||
|
||||
/* do not watch fd for event of type what */
|
||||
bool io_event_del PARAMS((int fd, short what));
|
||||
|
||||
/* remove fd from watchlist, close() fd. */
|
||||
bool io_close PARAMS((int fd));
|
||||
|
||||
/* set O_NONBLOCK */
|
||||
bool io_setnonblock PARAMS((int fd));
|
||||
|
||||
/* watch fds for activity */
|
||||
int io_dispatch PARAMS((struct timeval *tv));
|
||||
|
||||
#endif /* io_H_included */
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: irc-channel.c,v 1.27 2004/04/09 20:46:48 alex Exp $";
|
||||
static char UNUSED id[] = "$Id: irc-channel.c,v 1.40.2.2 2008/02/26 12:07:41 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
@@ -40,19 +40,21 @@ static char UNUSED id[] = "$Id: irc-channel.c,v 1.27 2004/04/09 20:46:48 alex Ex
|
||||
#include "irc-channel.h"
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CHAR *channame, *key, *flags, *topic, modes[8];
|
||||
BOOLEAN is_new_chan, is_invited, is_banned;
|
||||
char *channame, *channame_ptr, *key, *key_ptr, *flags, *topic, modes[8];
|
||||
bool is_new_chan, is_invited, is_banned;
|
||||
CLIENT *target;
|
||||
CHANNEL *chan;
|
||||
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Bad number of arguments? */
|
||||
if(( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
if (Req->argc < 1 || Req->argc > 2)
|
||||
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||
Client_ID(Client), Req->command);
|
||||
|
||||
/* Who is the sender? */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER ) target = Client_Search( Req->prefix );
|
||||
@@ -60,44 +62,51 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
||||
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
|
||||
|
||||
/* Are channel keys given? */
|
||||
if( Req->argc > 1 ) key = Req->argv[1];
|
||||
else key = NULL;
|
||||
if (Req->argc > 1) {
|
||||
key = Req->argv[1];
|
||||
key_ptr = strchr(key, ',');
|
||||
if (key_ptr) *key_ptr = '\0';
|
||||
}
|
||||
else
|
||||
key = key_ptr = NULL;
|
||||
|
||||
channame = Req->argv[0];
|
||||
channame_ptr = strchr(channame, ',');
|
||||
if (channame_ptr) *channame_ptr = '\0';
|
||||
|
||||
/* Channel-Namen durchgehen */
|
||||
chan = NULL;
|
||||
channame = strtok( Req->argv[0], "," );
|
||||
while( channame )
|
||||
while (channame)
|
||||
{
|
||||
chan = NULL; flags = NULL;
|
||||
|
||||
/* wird der Channel neu angelegt? */
|
||||
if( Channel_Search( channame )) is_new_chan = FALSE;
|
||||
else is_new_chan = TRUE;
|
||||
|
||||
/* Hat ein Server Channel-User-Modes uebergeben? */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
/* Channel-Flags extrahieren */
|
||||
if (Client_Type(Client) == CLIENT_SERVER) {
|
||||
flags = strchr( channame, 0x7 );
|
||||
if( flags )
|
||||
{
|
||||
if( flags ) {
|
||||
*flags = '\0';
|
||||
flags++;
|
||||
}
|
||||
}
|
||||
|
||||
/* wird der Channel neu angelegt? */
|
||||
if( Channel_Search( channame )) {
|
||||
is_new_chan = false;
|
||||
} else {
|
||||
if (Conf_PredefChannelsOnly) { /* this server does not allow creation of channels */
|
||||
IRC_WriteStrClient( Client, ERR_BANNEDFROMCHAN_MSG, Client_ID( Client ), channame );
|
||||
/* Try next name, if any */
|
||||
channame = strchr(channame, ',');
|
||||
continue;
|
||||
}
|
||||
is_new_chan = true;
|
||||
}
|
||||
|
||||
/* Local client? */
|
||||
if( Client_Type( Client ) == CLIENT_USER )
|
||||
{
|
||||
/* Test if the user has reached his maximum channel count */
|
||||
if( Client_Type( Client ) == CLIENT_USER )
|
||||
{
|
||||
if(( Conf_MaxJoins > 0 ) && ( Channel_CountForUser( Client ) >= Conf_MaxJoins ))
|
||||
{
|
||||
IRC_WriteStrClient( Client, ERR_TOOMANYCHANNELS_MSG, Client_ID( Client ), channame );
|
||||
return CONNECTED;
|
||||
}
|
||||
}
|
||||
if(( Conf_MaxJoins > 0 ) && ( Channel_CountForUser( Client ) >= Conf_MaxJoins ))
|
||||
return IRC_WriteStrClient( Client, ERR_TOOMANYCHANNELS_MSG,
|
||||
Client_ID( Client ), channame );
|
||||
|
||||
/* Existiert der Channel bereits, oder wird er im Moment neu erzeugt? */
|
||||
if( is_new_chan )
|
||||
@@ -111,28 +120,28 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
||||
chan = Channel_Search( channame );
|
||||
assert( chan != NULL );
|
||||
|
||||
is_banned = Lists_CheckBanned( target, chan );
|
||||
is_invited = Lists_CheckInvited( target, chan );
|
||||
is_banned = Lists_Check(Channel_GetListBans(chan), target );
|
||||
is_invited = Lists_Check(Channel_GetListInvites(chan), target );
|
||||
|
||||
/* Testen, ob Client gebanned ist */
|
||||
if(( is_banned == TRUE ) && ( is_invited == FALSE ))
|
||||
if(( is_banned == true) && ( is_invited == false ))
|
||||
{
|
||||
/* Client ist gebanned (und nicht invited): */
|
||||
IRC_WriteStrClient( Client, ERR_BANNEDFROMCHAN_MSG, Client_ID( Client ), channame );
|
||||
|
||||
/* Try next name, if any */
|
||||
channame = strtok( NULL, "," );
|
||||
channame = strchr(channame, ',');
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Ist der Channel "invite-only"? */
|
||||
if(( strchr( Channel_Modes( chan ), 'i' )) && ( is_invited == FALSE ))
|
||||
if(( strchr( Channel_Modes( chan ), 'i' )) && ( is_invited == false ))
|
||||
{
|
||||
/* Channel ist "invite-only" und Client wurde nicht invited: */
|
||||
IRC_WriteStrClient( Client, ERR_INVITEONLYCHAN_MSG, Client_ID( Client ), channame );
|
||||
|
||||
/* Try next name, if any */
|
||||
channame = strtok( NULL, "," );
|
||||
channame = strchr(channame, ',');
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -143,7 +152,7 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
||||
IRC_WriteStrClient( Client, ERR_BADCHANNELKEY_MSG, Client_ID( Client ), channame );
|
||||
|
||||
/* Try next name, if any */
|
||||
channame = strtok( NULL, "," );
|
||||
channame = strchr(channame, ',');
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -154,7 +163,7 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
||||
IRC_WriteStrClient( Client, ERR_CHANNELISFULL_MSG, Client_ID( Client ), channame );
|
||||
|
||||
/* Try next name, if any */
|
||||
channame = strtok( NULL, "," );
|
||||
channame = strchr(channame, ',');
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@@ -167,14 +176,14 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
||||
* commands) in this list become deleted when a user
|
||||
* joins a channel this way. */
|
||||
chan = Channel_Search( channame );
|
||||
if( chan != NULL ) (VOID)Lists_CheckInvited( target, chan );
|
||||
if( chan != NULL ) (void)Lists_Check(Channel_GetListInvites(chan), target);
|
||||
}
|
||||
|
||||
/* Channel joinen (und ggf. anlegen) */
|
||||
if( ! Channel_Join( target, channame ))
|
||||
{
|
||||
/* naechsten Namen ermitteln */
|
||||
channame = strtok( NULL, "," );
|
||||
channame = strchr(channame, ',');
|
||||
continue;
|
||||
}
|
||||
if( ! chan ) chan = Channel_Search( channame );
|
||||
@@ -199,11 +208,11 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
||||
IRC_WriteStrServersPrefix( Client, target, "JOIN :%s%s", channame, modes );
|
||||
|
||||
/* im Channel bekannt machen */
|
||||
IRC_WriteStrChannelPrefix( Client, chan, target, FALSE, "JOIN :%s", channame );
|
||||
IRC_WriteStrChannelPrefix( Client, chan, target, false, "JOIN :%s", channame );
|
||||
if( modes[1] )
|
||||
{
|
||||
/* Modes im Channel bekannt machen */
|
||||
IRC_WriteStrChannelPrefix( Client, chan, target, FALSE, "MODE %s +%s %s", channame, &modes[1], Client_ID( target ));
|
||||
IRC_WriteStrChannelPrefix( Client, chan, target, false, "MODE %s +%s %s", channame, &modes[1], Client_ID( target ));
|
||||
}
|
||||
|
||||
if( Client_Type( Client ) == CLIENT_USER )
|
||||
@@ -211,33 +220,54 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
||||
/* an Client bestaetigen */
|
||||
IRC_WriteStrClientPrefix( Client, target, "JOIN :%s", channame );
|
||||
|
||||
/* Topic an Client schicken */
|
||||
topic = Channel_Topic( chan );
|
||||
if( *topic ) IRC_WriteStrClient( Client, RPL_TOPIC_MSG, Client_ID( Client ), channame, topic );
|
||||
/* Send topic to client, if any */
|
||||
topic = Channel_Topic(chan);
|
||||
if (*topic) {
|
||||
IRC_WriteStrClient(Client, RPL_TOPIC_MSG,
|
||||
Client_ID(Client), channame, topic);
|
||||
#ifndef STRICT_RFC
|
||||
IRC_WriteStrClient(Client, RPL_TOPICSETBY_MSG,
|
||||
Client_ID(Client), channame,
|
||||
Channel_TopicWho(chan),
|
||||
Channel_TopicTime(chan));
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Mitglieder an Client Melden */
|
||||
IRC_Send_NAMES( Client, chan );
|
||||
IRC_WriteStrClient( Client, RPL_ENDOFNAMES_MSG, Client_ID( Client ), Channel_Name( chan ));
|
||||
}
|
||||
|
||||
/* naechsten Namen ermitteln */
|
||||
channame = strtok( NULL, "," );
|
||||
/* next channel? */
|
||||
channame = channame_ptr;
|
||||
if (channame) {
|
||||
channame++;
|
||||
channame_ptr = strchr(channame, ',');
|
||||
if (channame_ptr) *channame_ptr = '\0';
|
||||
|
||||
if (key_ptr) {
|
||||
key = ++key_ptr;
|
||||
key_ptr = strchr(key, ',');
|
||||
if (key_ptr) *key_ptr = '\0';
|
||||
}
|
||||
}
|
||||
}
|
||||
return CONNECTED;
|
||||
} /* IRC_JOIN */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_PART( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target;
|
||||
CHAR *chan;
|
||||
char *chan;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if(( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
if (Req->argc < 1 || Req->argc > 2)
|
||||
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||
Client_ID(Client), Req->command);
|
||||
|
||||
/* Wer ist der Absender? */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER ) target = Client_Search( Req->prefix );
|
||||
@@ -245,29 +275,23 @@ IRC_PART( CLIENT *Client, REQUEST *Req )
|
||||
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
|
||||
|
||||
/* Channel-Namen durchgehen */
|
||||
chan = strtok( Req->argv[0], "," );
|
||||
while( chan )
|
||||
{
|
||||
if( ! Channel_Part( target, Client, chan, Req->argc > 1 ? Req->argv[1] : Client_ID( target )))
|
||||
{
|
||||
/* naechsten Namen ermitteln */
|
||||
chan = strtok( NULL, "," );
|
||||
continue;
|
||||
}
|
||||
chan = strtok(Req->argv[0], ",");
|
||||
while (chan) {
|
||||
Channel_Part(target, Client, chan, Req->argc > 1 ? Req->argv[1] : Client_ID(target));
|
||||
|
||||
/* naechsten Namen ermitteln */
|
||||
chan = strtok( NULL, "," );
|
||||
chan = strtok(NULL, ",");
|
||||
}
|
||||
return CONNECTED;
|
||||
} /* IRC_PART */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_TOPIC( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CHANNEL *chan;
|
||||
CLIENT *from;
|
||||
CHAR *topic;
|
||||
char *topic;
|
||||
bool r;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
@@ -288,10 +312,22 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
|
||||
|
||||
if( Req->argc == 1 )
|
||||
{
|
||||
/* Topic erfragen */
|
||||
topic = Channel_Topic( chan );
|
||||
if( *topic ) return IRC_WriteStrClient( from, RPL_TOPIC_MSG, Client_ID( from ), Channel_Name( chan ), topic );
|
||||
else return IRC_WriteStrClient( from, RPL_NOTOPIC_MSG, Client_ID( from ), Channel_Name( chan ));
|
||||
/* Request actual topic */
|
||||
topic = Channel_Topic(chan);
|
||||
if (*topic) {
|
||||
r = IRC_WriteStrClient(from, RPL_TOPIC_MSG,
|
||||
Client_ID(Client), Channel_Name(chan), topic);
|
||||
#ifndef STRICT_RFC
|
||||
r = IRC_WriteStrClient(from, RPL_TOPICSETBY_MSG,
|
||||
Client_ID(Client), Channel_Name(chan),
|
||||
Channel_TopicWho(chan),
|
||||
Channel_TopicTime(chan));
|
||||
#endif
|
||||
return r;
|
||||
}
|
||||
else
|
||||
return IRC_WriteStrClient(from, RPL_NOTOPIC_MSG,
|
||||
Client_ID(from), Channel_Name(chan));
|
||||
}
|
||||
|
||||
if( strchr( Channel_Modes( chan ), 't' ))
|
||||
@@ -300,84 +336,115 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
|
||||
if( ! strchr( Channel_UserModes( chan, from ), 'o' )) return IRC_WriteStrClient( from, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( from ), Channel_Name( chan ));
|
||||
}
|
||||
|
||||
/* Topic setzen */
|
||||
Channel_SetTopic( chan, Req->argv[1] );
|
||||
Log( LOG_DEBUG, "User \"%s\" set topic on \"%s\": %s", Client_Mask( from ), Channel_Name( chan ), Req->argv[1][0] ? Req->argv[1] : "<none>" );
|
||||
/* Set new topic */
|
||||
Channel_SetTopic(chan, from, Req->argv[1]);
|
||||
Log(LOG_DEBUG, "User \"%s\" set topic on \"%s\": %s",
|
||||
Client_Mask(from), Channel_Name(chan),
|
||||
Req->argv[1][0] ? Req->argv[1] : "<none>");
|
||||
|
||||
/* im Channel bekannt machen und an Server weiterleiten */
|
||||
IRC_WriteStrServersPrefix( Client, from, "TOPIC %s :%s", Req->argv[0], Req->argv[1] );
|
||||
IRC_WriteStrChannelPrefix( Client, chan, from, FALSE, "TOPIC %s :%s", Req->argv[0], Req->argv[1] );
|
||||
IRC_WriteStrChannelPrefix( Client, chan, from, false, "TOPIC %s :%s", Req->argv[0], Req->argv[1] );
|
||||
|
||||
if( Client_Type( Client ) == CLIENT_USER ) return IRC_WriteStrClientPrefix( Client, Client, "TOPIC %s :%s", Req->argv[0], Req->argv[1] );
|
||||
else return CONNECTED;
|
||||
} /* IRC_TOPIC */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
/**
|
||||
* Handler for the IRC "LIST" command.
|
||||
* This implementation handles the local case as well as the forwarding of the
|
||||
* LIST command to other servers in the IRC network.
|
||||
*/
|
||||
GLOBAL bool
|
||||
IRC_LIST( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CHAR *pattern;
|
||||
char *pattern;
|
||||
CHANNEL *chan;
|
||||
CLIENT *from, *target;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
/* Bad number of prameters? */
|
||||
if( Req->argc > 2 )
|
||||
return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG,
|
||||
Client_ID( Client ), Req->command );
|
||||
|
||||
if( Req->argc > 0 ) pattern = strtok( Req->argv[0], "," );
|
||||
else pattern = "*";
|
||||
if( Req->argc > 0 )
|
||||
pattern = strtok( Req->argv[0], "," );
|
||||
else
|
||||
pattern = "*";
|
||||
|
||||
/* From aus Prefix ermitteln */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
|
||||
else from = Client;
|
||||
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix );
|
||||
/* Get sender from prefix, if any */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
from = Client_Search( Req->prefix );
|
||||
else
|
||||
from = Client;
|
||||
|
||||
if( ! from )
|
||||
return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG,
|
||||
Client_ID( Client ), Req->prefix );
|
||||
|
||||
if( Req->argc == 2 )
|
||||
{
|
||||
/* an anderen Server forwarden */
|
||||
/* Forward to other server? */
|
||||
target = Client_Search( Req->argv[1] );
|
||||
if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER )) return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] );
|
||||
if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER ))
|
||||
return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG,
|
||||
Client_ID( Client ), Req->argv[1] );
|
||||
|
||||
if( target != Client_ThisServer( ))
|
||||
{
|
||||
/* Ok, anderer Server ist das Ziel: forwarden */
|
||||
return IRC_WriteStrClientPrefix( target, from, "LIST %s :%s", from, Req->argv[1] );
|
||||
/* Target is indeed an other server, forward it! */
|
||||
return IRC_WriteStrClientPrefix( target, from,
|
||||
"LIST %s :%s", Client_ID( from ),
|
||||
Req->argv[1] );
|
||||
}
|
||||
}
|
||||
|
||||
while( pattern )
|
||||
{
|
||||
/* alle Channel durchgehen */
|
||||
/* Loop through all the channels */
|
||||
chan = Channel_First( );
|
||||
while( chan )
|
||||
{
|
||||
/* Passt die Suchmaske auf diesen Channel? */
|
||||
/* Check search pattern */
|
||||
if( Match( pattern, Channel_Name( chan )))
|
||||
{
|
||||
/* Treffer! */
|
||||
if( ! IRC_WriteStrClient( from, RPL_LIST_MSG, from, Channel_Name( chan ), Channel_MemberCount( chan ), Channel_Topic( chan ))) return DISCONNECTED;
|
||||
/* Gotcha! */
|
||||
if( ! strchr( Channel_Modes( chan ), 's' ) ||
|
||||
Channel_IsMemberOf( chan, from ))
|
||||
{
|
||||
if( ! IRC_WriteStrClient( from,
|
||||
RPL_LIST_MSG, Client_ID( from ),
|
||||
Channel_Name( chan ),
|
||||
Channel_MemberCount( chan ),
|
||||
Channel_Topic( chan )))
|
||||
return DISCONNECTED;
|
||||
}
|
||||
}
|
||||
chan = Channel_Next( chan );
|
||||
}
|
||||
|
||||
/* naechsten Namen ermitteln */
|
||||
if( Req->argc > 0 ) pattern = strtok( NULL, "," );
|
||||
else pattern = NULL;
|
||||
/* Get next name ... */
|
||||
if( Req->argc > 0 )
|
||||
pattern = strtok( NULL, "," );
|
||||
else
|
||||
pattern = NULL;
|
||||
}
|
||||
|
||||
return IRC_WriteStrClient( from, RPL_LISTEND_MSG, from );
|
||||
return IRC_WriteStrClient( from, RPL_LISTEND_MSG, Client_ID( from ));
|
||||
} /* IRC_LIST */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_CHANINFO( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CHAR modes_add[COMMAND_LEN], l[16], *ptr;
|
||||
char modes_add[COMMAND_LEN], l[16], *ptr;
|
||||
CLIENT *from;
|
||||
CHANNEL *chan;
|
||||
INT arg_topic;
|
||||
int arg_topic;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
@@ -425,7 +492,7 @@ IRC_CHANINFO( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
if( *ptr == 'l' )
|
||||
{
|
||||
snprintf( l, sizeof( l ), " %ld", Channel_MaxUsers( chan ));
|
||||
snprintf( l, sizeof( l ), " %lu", Channel_MaxUsers( chan ));
|
||||
strlcat( modes_add, l, sizeof( modes_add ));
|
||||
}
|
||||
if( *ptr == 'k' )
|
||||
@@ -437,7 +504,7 @@ IRC_CHANINFO( CLIENT *Client, REQUEST *Req )
|
||||
}
|
||||
|
||||
/* Inform members of this channel */
|
||||
IRC_WriteStrChannelPrefix( Client, chan, from, FALSE, "MODE %s +%s%s", Req->argv[0], Channel_Modes( chan ), modes_add );
|
||||
IRC_WriteStrChannelPrefix( Client, chan, from, false, "MODE %s +%s%s", Req->argv[0], Channel_Modes( chan ), modes_add );
|
||||
}
|
||||
}
|
||||
else Log( LOG_WARNING, "CHANINFO: invalid MODE format ignored!" );
|
||||
@@ -449,8 +516,9 @@ IRC_CHANINFO( CLIENT *Client, REQUEST *Req )
|
||||
if(( ! *ptr ) && ( Req->argv[arg_topic][0] ))
|
||||
{
|
||||
/* OK, there is no topic jet */
|
||||
Channel_SetTopic( chan, Req->argv[arg_topic] );
|
||||
IRC_WriteStrChannelPrefix( Client, chan, from, FALSE, "TOPIC %s :%s", Req->argv[0], Channel_Topic( chan ));
|
||||
Channel_SetTopic(chan, Client, Req->argv[arg_topic]);
|
||||
IRC_WriteStrChannelPrefix(Client, chan, from, false,
|
||||
"TOPIC %s :%s", Req->argv[0], Channel_Topic(chan));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: irc-channel.h,v 1.6 2002/12/12 12:23:43 alex Exp $
|
||||
* $Id: irc-channel.h,v 1.7 2005/03/19 18:43:48 fw Exp $
|
||||
*
|
||||
* IRC channel commands (header)
|
||||
*/
|
||||
@@ -18,13 +18,13 @@
|
||||
#define __irc_channel_h__
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_JOIN PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_PART PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_TOPIC PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_JOIN PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_PART PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_TOPIC PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
GLOBAL BOOLEAN IRC_LIST PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_LIST PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
GLOBAL BOOLEAN IRC_CHANINFO PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_CHANINFO PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
* Copyright (c)2001-2005 Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -14,12 +14,13 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: irc-info.c,v 1.22 2004/05/07 11:19:21 alex Exp $";
|
||||
static char UNUSED id[] = "$Id: irc-info.c,v 1.41.2.1 2008/02/26 12:06:57 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <strings.h>
|
||||
|
||||
@@ -42,7 +43,7 @@ static char UNUSED id[] = "$Id: irc-info.c,v 1.22 2004/05/07 11:19:21 alex Exp $
|
||||
#include "irc-info.h"
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_ADMIN(CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target, *prefix;
|
||||
@@ -83,13 +84,13 @@ IRC_ADMIN(CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_ADMIN */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_ISON( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CHAR rpl[COMMAND_LEN];
|
||||
char rpl[COMMAND_LEN];
|
||||
CLIENT *c;
|
||||
CHAR *ptr;
|
||||
INT i;
|
||||
char *ptr;
|
||||
int i;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
@@ -97,7 +98,7 @@ IRC_ISON( CLIENT *Client, REQUEST *Req )
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if(( Req->argc < 1 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
strcpy( rpl, RPL_ISON_MSG );
|
||||
strlcpy( rpl, RPL_ISON_MSG, sizeof rpl );
|
||||
for( i = 0; i < Req->argc; i++ )
|
||||
{
|
||||
ptr = strtok( Req->argv[i], " " );
|
||||
@@ -114,17 +115,17 @@ IRC_ISON( CLIENT *Client, REQUEST *Req )
|
||||
ptr = strtok( NULL, " " );
|
||||
}
|
||||
}
|
||||
if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0';
|
||||
ngt_TrimLastChr(rpl, ' ');
|
||||
|
||||
return IRC_WriteStrClient( Client, rpl, Client_ID( Client ) );
|
||||
} /* IRC_ISON */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_LINKS( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target, *from, *c;
|
||||
CHAR *mask;
|
||||
char *mask;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
@@ -169,7 +170,7 @@ IRC_LINKS( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_LINKS */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_LUSERS( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target, *from;
|
||||
@@ -205,7 +206,7 @@ IRC_LUSERS( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_LUSERS */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_MOTD( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *from, *target;
|
||||
@@ -239,10 +240,10 @@ IRC_MOTD( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_MOTD */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_NAMES( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CHAR rpl[COMMAND_LEN], *ptr;
|
||||
char rpl[COMMAND_LEN], *ptr;
|
||||
CLIENT *target, *from, *c;
|
||||
CHANNEL *chan;
|
||||
|
||||
@@ -334,90 +335,144 @@ IRC_NAMES( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_NAMES */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
static unsigned int
|
||||
t_diff(time_t *t, const time_t div)
|
||||
{
|
||||
time_t diff, remain;
|
||||
|
||||
diff = *t / div;
|
||||
|
||||
remain = diff * div;
|
||||
*t -= remain;
|
||||
|
||||
return diff;
|
||||
}
|
||||
|
||||
|
||||
static unsigned int
|
||||
uptime_days(time_t *now)
|
||||
{
|
||||
return t_diff(now, 60 * 60 * 24);
|
||||
}
|
||||
|
||||
|
||||
static unsigned int
|
||||
uptime_hrs(time_t *now)
|
||||
{
|
||||
return t_diff(now, 60 * 60);
|
||||
}
|
||||
|
||||
|
||||
static unsigned int
|
||||
uptime_mins(time_t *now)
|
||||
{
|
||||
return t_diff(now, 60);
|
||||
}
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
IRC_STATS( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *from, *target, *cl;
|
||||
CONN_ID con;
|
||||
CHAR query;
|
||||
char query;
|
||||
COMMAND *cmd;
|
||||
time_t time_now;
|
||||
unsigned int days, hrs, mins;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
if (Req->argc > 2)
|
||||
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command);
|
||||
|
||||
/* From aus Prefix ermitteln */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
|
||||
else from = Client;
|
||||
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
|
||||
if (Client_Type(Client) == CLIENT_SERVER)
|
||||
from = Client_Search(Req->prefix);
|
||||
else
|
||||
from = Client;
|
||||
|
||||
if( Req->argc == 2 )
|
||||
{
|
||||
if (! from)
|
||||
return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix);
|
||||
|
||||
if (Req->argc == 2) {
|
||||
/* an anderen Server forwarden */
|
||||
target = Client_Search( Req->argv[1] );
|
||||
if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER )) return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG, Client_ID( from ), Req->argv[1] );
|
||||
if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER ))
|
||||
return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG, Client_ID( from ), Req->argv[1] );
|
||||
|
||||
if( target != Client_ThisServer( ))
|
||||
{
|
||||
if( target != Client_ThisServer()) {
|
||||
/* Ok, anderer Server ist das Ziel: forwarden */
|
||||
return IRC_WriteStrClientPrefix( target, from, "STATS %s %s", Req->argv[0], Req->argv[1] );
|
||||
}
|
||||
}
|
||||
|
||||
if( Req->argc > 0 ) query = Req->argv[0][0] ? Req->argv[0][0] : '*';
|
||||
else query = '*';
|
||||
if (Req->argc > 0)
|
||||
query = Req->argv[0][0] ? Req->argv[0][0] : '*';
|
||||
else
|
||||
query = '*';
|
||||
|
||||
switch ( query )
|
||||
{
|
||||
switch (query) {
|
||||
case 'l': /* Links */
|
||||
case 'L':
|
||||
con = Conn_First( );
|
||||
while( con != NONE )
|
||||
{
|
||||
cl = Client_GetFromConn( con );
|
||||
if( cl && (( Client_Type( cl ) == CLIENT_SERVER ) || ( cl == Client )))
|
||||
{
|
||||
time_now = time(NULL);
|
||||
for (con = Conn_First(); con != NONE ;con = Conn_Next(con)) {
|
||||
cl = Conn_GetClient(con);
|
||||
if (!cl)
|
||||
continue;
|
||||
if ((Client_Type(cl) == CLIENT_SERVER) || (cl == Client)) {
|
||||
/* Server link or our own connection */
|
||||
#ifdef ZLIB
|
||||
if( Conn_Options( con ) & CONN_ZIP )
|
||||
{
|
||||
if( ! IRC_WriteStrClient( from, RPL_STATSLINKINFOZIP_MSG, Client_ID( from ), Client_Mask( cl ), Conn_SendQ( con ), Conn_SendMsg( con ), Zip_SendBytes( con ), Conn_SendBytes( con ), Conn_RecvMsg( con ), Zip_RecvBytes( con ), Conn_RecvBytes( con ), (LONG)( time( NULL ) - Conn_StartTime( con )))) return DISCONNECTED;
|
||||
if (Conn_Options(con) & CONN_ZIP) {
|
||||
if (!IRC_WriteStrClient(from, RPL_STATSLINKINFOZIP_MSG,
|
||||
Client_ID(from), Client_Mask(cl), Conn_SendQ(con),
|
||||
Conn_SendMsg(con), Zip_SendBytes(con), Conn_SendBytes(con),
|
||||
Conn_RecvMsg(con), Zip_RecvBytes(con), Conn_RecvBytes(con), (long)(time_now - Conn_StartTime(con))))
|
||||
return DISCONNECTED;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
if( ! IRC_WriteStrClient( from, RPL_STATSLINKINFO_MSG, Client_ID( from ), Client_Mask( cl ), Conn_SendQ( con ), Conn_SendMsg( con ), Conn_SendBytes( con ), Conn_RecvMsg( con ), Conn_RecvBytes( con ), (LONG)( time( NULL ) - Conn_StartTime( con )))) return DISCONNECTED;
|
||||
}
|
||||
if (!IRC_WriteStrClient(from, RPL_STATSLINKINFO_MSG, Client_ID(from),
|
||||
Client_Mask(cl), Conn_SendQ(con), Conn_SendMsg(con), Conn_SendBytes(con),
|
||||
Conn_RecvMsg(con), Conn_RecvBytes(con), (long)(time_now - Conn_StartTime(con))))
|
||||
return DISCONNECTED;
|
||||
}
|
||||
con = Conn_Next( con );
|
||||
}
|
||||
break;
|
||||
case 'm': /* IRC-Befehle */
|
||||
case 'm': /* IRC-Commands */
|
||||
case 'M':
|
||||
cmd = Parse_GetCommandStruct( );
|
||||
while( cmd->name )
|
||||
{
|
||||
if( cmd->lcount > 0 || cmd->rcount > 0 )
|
||||
{
|
||||
if( ! IRC_WriteStrClient( from, RPL_STATSCOMMANDS_MSG, Client_ID( from ), cmd->name, cmd->lcount, cmd->bytes, cmd->rcount )) return DISCONNECTED;
|
||||
}
|
||||
cmd++;
|
||||
for (; cmd->name ; cmd++) {
|
||||
if (cmd->lcount == 0 && cmd->rcount == 0)
|
||||
continue;
|
||||
if (!IRC_WriteStrClient(from, RPL_STATSCOMMANDS_MSG, Client_ID(from),
|
||||
cmd->name, cmd->lcount, cmd->bytes, cmd->rcount))
|
||||
return DISCONNECTED;
|
||||
}
|
||||
break;
|
||||
case 'u': /* server uptime */
|
||||
case 'U':
|
||||
time_now = time(NULL) - NGIRCd_Start;
|
||||
days = uptime_days(&time_now);
|
||||
hrs = uptime_hrs(&time_now);
|
||||
mins = uptime_mins(&time_now);
|
||||
if (!IRC_WriteStrClient(from, RPL_STATSUPTIME, Client_ID(from),
|
||||
days, hrs, mins, (unsigned int) time_now))
|
||||
return DISCONNECTED;
|
||||
break;
|
||||
}
|
||||
|
||||
IRC_SetPenalty( from, 2 );
|
||||
return IRC_WriteStrClient( from, RPL_ENDOFSTATS_MSG, Client_ID( from ), query );
|
||||
IRC_SetPenalty(from, 2);
|
||||
return IRC_WriteStrClient(from, RPL_ENDOFSTATS_MSG, Client_ID(from), query);
|
||||
} /* IRC_STATS */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_TIME( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *from, *target;
|
||||
CHAR t_str[64];
|
||||
char t_str[64];
|
||||
time_t t;
|
||||
|
||||
assert( Client != NULL );
|
||||
@@ -445,17 +500,17 @@ IRC_TIME( CLIENT *Client, REQUEST *Req )
|
||||
}
|
||||
|
||||
t = time( NULL );
|
||||
(VOID)strftime( t_str, 60, "%A %B %d %Y -- %H:%M %Z", localtime( &t ));
|
||||
(void)strftime( t_str, 60, "%A %B %d %Y -- %H:%M %Z", localtime( &t ));
|
||||
return IRC_WriteStrClient( from, RPL_TIME_MSG, Client_ID( from ), Client_ID( Client_ThisServer( )), t_str );
|
||||
} /* IRC_TIME */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_USERHOST( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CHAR rpl[COMMAND_LEN];
|
||||
char rpl[COMMAND_LEN];
|
||||
CLIENT *c;
|
||||
INT max, i;
|
||||
int max, i;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
@@ -466,7 +521,7 @@ IRC_USERHOST( CLIENT *Client, REQUEST *Req )
|
||||
if( Req->argc > 5 ) max = 5;
|
||||
else max = Req->argc;
|
||||
|
||||
strcpy( rpl, RPL_USERHOST_MSG );
|
||||
strlcpy( rpl, RPL_USERHOST_MSG, sizeof rpl );
|
||||
for( i = 0; i < max; i++ )
|
||||
{
|
||||
c = Client_Search( Req->argv[i] );
|
||||
@@ -484,18 +539,18 @@ IRC_USERHOST( CLIENT *Client, REQUEST *Req )
|
||||
strlcat( rpl, " ", sizeof( rpl ));
|
||||
}
|
||||
}
|
||||
if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0';
|
||||
ngt_TrimLastChr( rpl, ' ');
|
||||
|
||||
return IRC_WriteStrClient( Client, rpl, Client_ID( Client ) );
|
||||
} /* IRC_USERHOST */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_VERSION( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target, *prefix;
|
||||
#ifdef CVSDATE
|
||||
CHAR ver[12], vertxt[30];
|
||||
char ver[12], vertxt[30];
|
||||
#endif
|
||||
|
||||
assert( Client != NULL );
|
||||
@@ -530,20 +585,21 @@ IRC_VERSION( CLIENT *Client, REQUEST *Req )
|
||||
strncpy( ver + 4, ver + 5, 2 );
|
||||
strncpy( ver + 6, ver + 8, 3 );
|
||||
snprintf( vertxt, sizeof( vertxt ), "%s(%s)", PACKAGE_VERSION, ver );
|
||||
return IRC_WriteStrClient( Client, RPL_VERSION_MSG, Client_ID( prefix ), PACKAGE_NAME, vertxt, NGIRCd_DebugLevel, Conf_ServerName, NGIRCd_VersionAddition( ));
|
||||
return IRC_WriteStrClient( Client, RPL_VERSION_MSG, Client_ID( prefix ), PACKAGE_NAME, vertxt, NGIRCd_DebugLevel, Conf_ServerName, NGIRCd_VersionAddition );
|
||||
#else
|
||||
return IRC_WriteStrClient( Client, RPL_VERSION_MSG, Client_ID( prefix ), PACKAGE_NAME, PACKAGE_VERSION, NGIRCd_DebugLevel, Conf_ServerName, NGIRCd_VersionAddition( ));
|
||||
return IRC_WriteStrClient( Client, RPL_VERSION_MSG, Client_ID( prefix ), PACKAGE_NAME, PACKAGE_VERSION, NGIRCd_DebugLevel, Conf_ServerName, NGIRCd_VersionAddition );
|
||||
#endif
|
||||
} /* IRC_VERSION */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_WHO( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
BOOLEAN ok, only_ops;
|
||||
CHAR flags[8], *ptr;
|
||||
bool ok, only_ops;
|
||||
char flags[8];
|
||||
const char *ptr;
|
||||
CL2CHAN *cl2chan;
|
||||
CHANNEL *chan;
|
||||
CHANNEL *chan, *cn;
|
||||
CLIENT *c;
|
||||
|
||||
assert( Client != NULL );
|
||||
@@ -552,13 +608,13 @@ IRC_WHO( CLIENT *Client, REQUEST *Req )
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if(( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
only_ops = FALSE;
|
||||
only_ops = false;
|
||||
chan = NULL;
|
||||
|
||||
if( Req->argc == 2 )
|
||||
{
|
||||
/* Nur OPs anzeigen? */
|
||||
if( strcmp( Req->argv[1], "o" ) == 0 ) only_ops = TRUE;
|
||||
if( strcmp( Req->argv[1], "o" ) == 0 ) only_ops = true;
|
||||
#ifdef STRICT_RFC
|
||||
else return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
#endif
|
||||
@@ -581,24 +637,39 @@ IRC_WHO( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
if(( Client_Type( c ) == CLIENT_USER ) && ( ! strchr( Client_Modes( c ), 'i' )))
|
||||
{
|
||||
ok = FALSE;
|
||||
if( Req->argc == 0 ) ok = TRUE;
|
||||
ok = false;
|
||||
if( Req->argc == 0 ) ok = true;
|
||||
else
|
||||
{
|
||||
if( strcasecmp( Req->argv[0], Client_ID( c )) == 0 ) ok = TRUE;
|
||||
else if( strcmp( Req->argv[0], "0" ) == 0 ) ok = TRUE;
|
||||
if( strcasecmp( Req->argv[0], Client_ID( c )) == 0 ) ok = true;
|
||||
else if( strcmp( Req->argv[0], "0" ) == 0 ) ok = true;
|
||||
}
|
||||
|
||||
if( ok && (( ! only_ops ) || ( strchr( Client_Modes( c ), 'o' ))))
|
||||
{
|
||||
/* Flags zusammenbasteln */
|
||||
strcpy( flags, "H" );
|
||||
/* Get flags */
|
||||
if (strchr(Client_Modes( c ), 'a'))
|
||||
strcpy(flags, "G"); /* away */
|
||||
else
|
||||
strcpy(flags, "H");
|
||||
|
||||
if( strchr( Client_Modes( c ), 'o' )) strlcat( flags, "*", sizeof( flags ));
|
||||
|
||||
/* ausgeben */
|
||||
/* Search suitable channel */
|
||||
cl2chan = Channel_FirstChannelOf( c );
|
||||
if( cl2chan ) ptr = Channel_Name( Channel_GetChannel( cl2chan ));
|
||||
else ptr = "*";
|
||||
while( cl2chan )
|
||||
{
|
||||
cn = Channel_GetChannel( cl2chan );
|
||||
if( Channel_IsMemberOf( cn, Client ) ||
|
||||
! strchr( Channel_Modes( cn ), 's' ))
|
||||
{
|
||||
ptr = Channel_Name( cn );
|
||||
break;
|
||||
}
|
||||
cl2chan = Channel_NextChannelOf( c, cl2chan );
|
||||
}
|
||||
if( ! cl2chan ) ptr = "*";
|
||||
|
||||
if( ! IRC_WriteStrClient( Client, RPL_WHOREPLY_MSG, Client_ID( Client ), ptr, Client_User( c ), Client_Hostname( c ), Client_ID( Client_Introducer( c )), Client_ID( c ), flags, Client_Hops( c ), Client_Info( c ))) return DISCONNECTED;
|
||||
}
|
||||
}
|
||||
@@ -613,11 +684,11 @@ IRC_WHO( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_WHO */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_WHOIS( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *from, *target, *c;
|
||||
CHAR str[LINE_LEN + 1];
|
||||
char str[LINE_LEN + 1];
|
||||
CL2CHAN *cl2chan;
|
||||
CHANNEL *chan;
|
||||
|
||||
@@ -663,6 +734,12 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req )
|
||||
chan = Channel_GetChannel( cl2chan );
|
||||
assert( chan != NULL );
|
||||
|
||||
/* next */
|
||||
cl2chan = Channel_NextChannelOf( c, cl2chan );
|
||||
|
||||
/* Secret channel? */
|
||||
if( strchr( Channel_Modes( chan ), 's' ) && ! Channel_IsMemberOf( chan, Client )) continue;
|
||||
|
||||
/* Concatenate channel names */
|
||||
if( str[strlen( str ) - 1] != ':' ) strlcat( str, " ", sizeof( str ));
|
||||
if( strchr( Channel_UserModes( chan, c ), 'o' )) strlcat( str, "@", sizeof( str ));
|
||||
@@ -675,9 +752,6 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req )
|
||||
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
|
||||
snprintf( str, sizeof( str ), RPL_WHOISCHANNELS_MSG, Client_ID( from ), Client_ID( c ));
|
||||
}
|
||||
|
||||
/* next */
|
||||
cl2chan = Channel_NextChannelOf( c, cl2chan );
|
||||
}
|
||||
if( str[strlen( str ) - 1] != ':')
|
||||
{
|
||||
@@ -691,10 +765,13 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req )
|
||||
if( ! IRC_WriteStrClient( from, RPL_WHOISOPERATOR_MSG, Client_ID( from ), Client_ID( c ))) return DISCONNECTED;
|
||||
}
|
||||
|
||||
/* Idle (only local clients) */
|
||||
if( Client_Conn( c ) > NONE )
|
||||
{
|
||||
if( ! IRC_WriteStrClient( from, RPL_WHOISIDLE_MSG, Client_ID( from ), Client_ID( c ), Conn_GetIdle( Client_Conn ( c )))) return DISCONNECTED;
|
||||
/* Idle and signon time (local clients only!) */
|
||||
if (Client_Conn(c) > NONE ) {
|
||||
if (! IRC_WriteStrClient(from, RPL_WHOISIDLE_MSG,
|
||||
Client_ID(from), Client_ID(c),
|
||||
(unsigned long)Conn_GetIdle(Client_Conn(c)),
|
||||
(unsigned long)Conn_GetSignon(Client_Conn(c))))
|
||||
return DISCONNECTED;
|
||||
}
|
||||
|
||||
/* Away? */
|
||||
@@ -708,25 +785,119 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_WHOIS */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
/**
|
||||
* IRC "WHOWAS" function.
|
||||
* This function implements the IRC command "WHOWHAS". It handles local
|
||||
* requests and request that should be forwarded to other servers.
|
||||
*/
|
||||
GLOBAL bool
|
||||
IRC_WHOWAS( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target, *prefix;
|
||||
WHOWAS *whowas;
|
||||
int max, last, count, i;
|
||||
char t_str[60];
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if(( Req->argc < 1 ) || ( Req->argc > 3 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
/* Wrong number of parameters? */
|
||||
if(( Req->argc < 1 ) || ( Req->argc > 3 ))
|
||||
return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG,
|
||||
Client_ID( Client ), Req->command );
|
||||
|
||||
/* ... */
|
||||
/* Search taget */
|
||||
if( Req->argc == 3 )
|
||||
target = Client_Search( Req->argv[2] );
|
||||
else
|
||||
target = Client_ThisServer( );
|
||||
|
||||
return CONNECTED;
|
||||
/* Get prefix */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
prefix = Client_Search( Req->prefix );
|
||||
else
|
||||
prefix = Client;
|
||||
|
||||
if( ! prefix )
|
||||
return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG,
|
||||
Client_ID( Client ), Req->prefix );
|
||||
|
||||
/* Forward to other server? */
|
||||
if( target != Client_ThisServer( ))
|
||||
{
|
||||
if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER ))
|
||||
return IRC_WriteStrClient( prefix, ERR_NOSUCHSERVER_MSG,
|
||||
Client_ID( prefix ),
|
||||
Req->argv[2] );
|
||||
|
||||
/* Forward */
|
||||
IRC_WriteStrClientPrefix( target, prefix, "WHOWAS %s %s %s",
|
||||
Req->argv[0], Req->argv[1],
|
||||
Req->argv[2] );
|
||||
return CONNECTED;
|
||||
}
|
||||
|
||||
whowas = Client_GetWhowas( );
|
||||
last = Client_GetLastWhowasIndex( );
|
||||
if( last < 0 ) last = 0;
|
||||
|
||||
if( Req->argc > 1 )
|
||||
{
|
||||
max = atoi( Req->argv[1] );
|
||||
if( max < 1 ) max = MAX_WHOWAS;
|
||||
}
|
||||
else
|
||||
max = DEFAULT_WHOWAS;
|
||||
|
||||
i = last;
|
||||
count = 0;
|
||||
do
|
||||
{
|
||||
/* Used entry? */
|
||||
if( whowas[i].time > 0 &&
|
||||
strcasecmp( Req->argv[0], whowas[i].id ) == 0 )
|
||||
{
|
||||
(void)strftime( t_str, sizeof(t_str),
|
||||
"%a %b %d %H:%M:%S %Y",
|
||||
localtime( &whowas[i].time ));
|
||||
|
||||
if( ! IRC_WriteStrClient( prefix, RPL_WHOWASUSER_MSG,
|
||||
Client_ID( prefix ),
|
||||
whowas[i].id,
|
||||
whowas[i].user,
|
||||
whowas[i].host,
|
||||
whowas[i].info ))
|
||||
return DISCONNECTED;
|
||||
|
||||
if( ! IRC_WriteStrClient( prefix, RPL_WHOISSERVER_MSG,
|
||||
Client_ID( prefix ),
|
||||
whowas[i].id,
|
||||
whowas[i].server, t_str ))
|
||||
return DISCONNECTED;
|
||||
|
||||
count++;
|
||||
if( count >= max ) break;
|
||||
}
|
||||
|
||||
/* previos entry */
|
||||
i--;
|
||||
|
||||
/* "underflow", wrap around */
|
||||
if( i < 0 ) i = MAX_WHOWAS - 1;
|
||||
} while( i != last );
|
||||
|
||||
return IRC_WriteStrClient( prefix, RPL_ENDOFWHOWAS_MSG,
|
||||
Client_ID( prefix ), Req->argv[0] );
|
||||
} /* IRC_WHOWAS */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_Send_LUSERS( CLIENT *Client )
|
||||
{
|
||||
LONG cnt;
|
||||
unsigned long cnt;
|
||||
#ifndef STRICT_RFC
|
||||
unsigned long max;
|
||||
#endif
|
||||
|
||||
assert( Client != NULL );
|
||||
|
||||
@@ -755,70 +926,100 @@ IRC_Send_LUSERS( CLIENT *Client )
|
||||
|
||||
#ifndef STRICT_RFC
|
||||
/* Maximum number of local users */
|
||||
if( ! IRC_WriteStrClient( Client, RPL_LOCALUSERS_MSG, Client_ID( Client ), Client_MyUserCount( ), Client_MyMaxUserCount( ))) return DISCONNECTED;
|
||||
cnt = Client_MyUserCount();
|
||||
max = Client_MyMaxUserCount();
|
||||
if (! IRC_WriteStrClient(Client, RPL_LOCALUSERS_MSG, Client_ID(Client),
|
||||
cnt, max, cnt, max))
|
||||
return DISCONNECTED;
|
||||
/* Maximum number of users in the network */
|
||||
if( ! IRC_WriteStrClient( Client, RPL_NETUSERS_MSG, Client_ID( Client ), Client_UserCount( ), Client_MaxUserCount( ))) return DISCONNECTED;
|
||||
cnt = Client_UserCount();
|
||||
max = Client_MaxUserCount();
|
||||
if(! IRC_WriteStrClient(Client, RPL_NETUSERS_MSG, Client_ID(Client),
|
||||
cnt, max, cnt, max))
|
||||
return DISCONNECTED;
|
||||
#endif
|
||||
|
||||
return CONNECTED;
|
||||
} /* IRC_Send_LUSERS */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
static bool
|
||||
Show_MOTD_Start(CLIENT *Client)
|
||||
{
|
||||
return IRC_WriteStrClient(Client, RPL_MOTDSTART_MSG,
|
||||
Client_ID( Client ), Client_ID( Client_ThisServer( )));
|
||||
}
|
||||
|
||||
static bool
|
||||
Show_MOTD_Sendline(CLIENT *Client, const char *msg)
|
||||
{
|
||||
return IRC_WriteStrClient(Client, RPL_MOTD_MSG, Client_ID( Client ), msg);
|
||||
}
|
||||
|
||||
static bool
|
||||
Show_MOTD_End(CLIENT *Client)
|
||||
{
|
||||
return IRC_WriteStrClient( Client, RPL_ENDOFMOTD_MSG, Client_ID( Client ));
|
||||
}
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
IRC_Show_MOTD( CLIENT *Client )
|
||||
{
|
||||
BOOLEAN ok;
|
||||
CHAR line[127];
|
||||
char line[127];
|
||||
FILE *fd;
|
||||
|
||||
assert( Client != NULL );
|
||||
|
||||
if( Conf_MotdPhrase[0] )
|
||||
{
|
||||
if( ! IRC_WriteStrClient( Client, RPL_MOTDSTART_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )))) return DISCONNECTED;
|
||||
if( ! IRC_WriteStrClient( Client, RPL_MOTD_MSG, Client_ID( Client ), Conf_MotdPhrase )) return DISCONNECTED;
|
||||
return IRC_WriteStrClient( Client, RPL_ENDOFMOTD_MSG, Client_ID( Client ));
|
||||
if (Conf_MotdPhrase[0]) {
|
||||
if (!Show_MOTD_Start(Client))
|
||||
return DISCONNECTED;
|
||||
if (!Show_MOTD_Sendline(Client, Conf_MotdPhrase))
|
||||
return DISCONNECTED;
|
||||
|
||||
return Show_MOTD_End(Client);
|
||||
}
|
||||
|
||||
fd = fopen( Conf_MotdFile, "r" );
|
||||
if( ! fd )
|
||||
{
|
||||
if( ! fd ) {
|
||||
Log( LOG_WARNING, "Can't read MOTD file \"%s\": %s", Conf_MotdFile, strerror( errno ));
|
||||
return IRC_WriteStrClient( Client, ERR_NOMOTD_MSG, Client_ID( Client ) );
|
||||
}
|
||||
|
||||
if( ! IRC_WriteStrClient( Client, RPL_MOTDSTART_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )))) return DISCONNECTED;
|
||||
while( TRUE )
|
||||
{
|
||||
if( ! fgets( line, 126, fd )) break;
|
||||
if( line[strlen( line ) - 1] == '\n' ) line[strlen( line ) - 1] = '\0';
|
||||
if( ! IRC_WriteStrClient( Client, RPL_MOTD_MSG, Client_ID( Client ), line ))
|
||||
{
|
||||
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;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
ok = IRC_WriteStrClient( Client, RPL_ENDOFMOTD_MSG, Client_ID( Client ) );
|
||||
|
||||
fclose( fd );
|
||||
|
||||
return ok;
|
||||
fclose(fd);
|
||||
return Show_MOTD_End(Client);
|
||||
} /* IRC_Show_MOTD */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan )
|
||||
{
|
||||
BOOLEAN is_visible, is_member;
|
||||
CHAR str[LINE_LEN + 1];
|
||||
bool is_visible, is_member;
|
||||
char str[LINE_LEN + 1];
|
||||
CL2CHAN *cl2chan;
|
||||
CLIENT *cl;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Chan != NULL );
|
||||
|
||||
if( Channel_IsMemberOf( Chan, Client )) is_member = TRUE;
|
||||
else is_member = FALSE;
|
||||
if( Channel_IsMemberOf( Chan, Client )) is_member = true;
|
||||
else is_member = false;
|
||||
|
||||
/* Secret channel? */
|
||||
if( ! is_member && strchr( Channel_Modes( Chan ), 's' )) return CONNECTED;
|
||||
|
||||
/* Alle Mitglieder suchen */
|
||||
snprintf( str, sizeof( str ), RPL_NAMREPLY_MSG, Client_ID( Client ), "=", Channel_Name( Chan ));
|
||||
@@ -827,8 +1028,8 @@ IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan )
|
||||
{
|
||||
cl = Channel_GetClient( cl2chan );
|
||||
|
||||
if( strchr( Client_Modes( cl ), 'i' )) is_visible = FALSE;
|
||||
else is_visible = TRUE;
|
||||
if( strchr( Client_Modes( cl ), 'i' )) is_visible = false;
|
||||
else is_visible = true;
|
||||
|
||||
if( is_member || is_visible )
|
||||
{
|
||||
@@ -859,19 +1060,22 @@ IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan )
|
||||
} /* IRC_Send_NAMES */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps )
|
||||
GLOBAL bool
|
||||
IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, bool OnlyOps )
|
||||
{
|
||||
BOOLEAN is_visible, is_member;
|
||||
bool is_visible, is_member;
|
||||
CL2CHAN *cl2chan;
|
||||
CHAR flags[8];
|
||||
char flags[8];
|
||||
CLIENT *c;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Chan != NULL );
|
||||
|
||||
if( Channel_IsMemberOf( Chan, Client )) is_member = TRUE;
|
||||
else is_member = FALSE;
|
||||
if( Channel_IsMemberOf( Chan, Client )) is_member = true;
|
||||
else is_member = false;
|
||||
|
||||
/* Secret channel? */
|
||||
if( ! is_member && strchr( Channel_Modes( Chan ), 's' )) return CONNECTED;
|
||||
|
||||
/* Alle Mitglieder suchen */
|
||||
cl2chan = Channel_FirstMember( Chan );
|
||||
@@ -879,13 +1083,15 @@ IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps )
|
||||
{
|
||||
c = Channel_GetClient( cl2chan );
|
||||
|
||||
if( strchr( Client_Modes( c ), 'i' )) is_visible = FALSE;
|
||||
else is_visible = TRUE;
|
||||
if( strchr( Client_Modes( c ), 'i' )) is_visible = false;
|
||||
else is_visible = true;
|
||||
|
||||
if( is_member || is_visible ) {
|
||||
if (strchr(Client_Modes( c ), 'a'))
|
||||
strcpy(flags, "G"); /* away */
|
||||
else
|
||||
strcpy(flags, "H");
|
||||
|
||||
if( is_member || is_visible )
|
||||
{
|
||||
/* Flags zusammenbasteln */
|
||||
strcpy( flags, "H" );
|
||||
if( strchr( Client_Modes( c ), 'o' )) strlcat( flags, "*", sizeof( flags ));
|
||||
if( strchr( Channel_UserModes( Chan, c ), 'o' )) strlcat( flags, "@", sizeof( flags ));
|
||||
else if( strchr( Channel_UserModes( Chan, c ), 'v' )) strlcat( flags, "+", sizeof( flags ));
|
||||
@@ -904,4 +1110,22 @@ IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps )
|
||||
} /* IRC_Send_WHO */
|
||||
|
||||
|
||||
/**
|
||||
* Send the ISUPPORT numeric (005).
|
||||
* This numeric indicates the features that are supported by this server.
|
||||
* See <http://www.irc.org/tech_docs/005.html> for details.
|
||||
*/
|
||||
GLOBAL bool
|
||||
IRC_Send_ISUPPORT PARAMS((CLIENT * Client))
|
||||
{
|
||||
if (!IRC_WriteStrClient(Client, RPL_ISUPPORT1_MSG, Client_ID(Client),
|
||||
Conf_MaxJoins))
|
||||
return DISCONNECTED;
|
||||
return IRC_WriteStrClient(Client, RPL_ISUPPORT2_MSG, Client_ID(Client),
|
||||
CHANNEL_NAME_LEN - 1, Conf_MaxNickLength - 1,
|
||||
COMMAND_LEN - 23, CLIENT_AWAY_LEN - 1,
|
||||
COMMAND_LEN - 113);
|
||||
} /* IRC_Send_ISUPPORT */
|
||||
|
||||
|
||||
/* -eof- */
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: irc-info.h,v 1.2 2002/12/12 12:23:43 alex Exp $
|
||||
* $Id: irc-info.h,v 1.4 2007/11/21 12:16:36 alex Exp $
|
||||
*
|
||||
* IRC info commands (header)
|
||||
*/
|
||||
@@ -18,24 +18,25 @@
|
||||
#define __irc_info_h__
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_ADMIN PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_ISON PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_LINKS PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_LUSERS PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_MOTD PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_NAMES PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_STATS PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_TIME PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_USERHOST PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_VERSION PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_WHO PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_WHOIS PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_WHOWAS PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_ADMIN PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_ISON PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_LINKS PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_LUSERS PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_MOTD PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_NAMES PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_STATS PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_TIME PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_USERHOST PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_VERSION PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_WHO PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_WHOIS PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_WHOWAS PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
GLOBAL BOOLEAN IRC_Send_LUSERS PARAMS(( CLIENT *Client ));
|
||||
GLOBAL BOOLEAN IRC_Send_NAMES PARAMS(( CLIENT *Client, CHANNEL *Chan ));
|
||||
GLOBAL BOOLEAN IRC_Show_MOTD PARAMS(( CLIENT *Client ));
|
||||
GLOBAL BOOLEAN IRC_Send_WHO PARAMS(( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps ));
|
||||
GLOBAL bool IRC_Send_LUSERS PARAMS(( CLIENT *Client ));
|
||||
GLOBAL bool IRC_Send_NAMES PARAMS(( CLIENT *Client, CHANNEL *Chan ));
|
||||
GLOBAL bool IRC_Show_MOTD PARAMS(( CLIENT *Client ));
|
||||
GLOBAL bool IRC_Send_WHO PARAMS(( CLIENT *Client, CHANNEL *Chan, bool OnlyOps ));
|
||||
GLOBAL bool IRC_Send_ISUPPORT PARAMS(( CLIENT *Client ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: irc-login.c,v 1.40 2004/03/11 22:16:31 alex Exp $";
|
||||
static char UNUSED id[] = "$Id: irc-login.c,v 1.54.2.1 2008/02/05 11:48:37 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
@@ -41,190 +41,258 @@ static char UNUSED id[] = "$Id: irc-login.c,v 1.40 2004/03/11 22:16:31 alex Exp
|
||||
#include "irc-login.h"
|
||||
|
||||
|
||||
LOCAL BOOLEAN Hello_User PARAMS(( CLIENT *Client ));
|
||||
LOCAL VOID Kill_Nick PARAMS(( CHAR *Nick, CHAR *Reason ));
|
||||
static bool Hello_User PARAMS(( CLIENT *Client ));
|
||||
static void Kill_Nick PARAMS(( char *Nick, char *Reason ));
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
/**
|
||||
* Handler for the IRC command "PASS".
|
||||
* See RFC 2813 section 4.1.1, and RFC 2812 section 3.1.1.
|
||||
*/
|
||||
GLOBAL bool
|
||||
IRC_PASS( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
char *type, *orig_flags;
|
||||
int protohigh, protolow;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Fehler liefern, wenn kein lokaler Client */
|
||||
if( Client_Conn( Client ) <= NONE ) return IRC_WriteStrClient( Client, ERR_UNKNOWNCOMMAND_MSG, Client_ID( Client ), Req->command );
|
||||
/* Return an error if this is not a local client */
|
||||
if (Client_Conn(Client) <= NONE)
|
||||
return IRC_WriteStrClient(Client, ERR_UNKNOWNCOMMAND_MSG,
|
||||
Client_ID(Client), Req->command);
|
||||
|
||||
if(( Client_Type( Client ) == CLIENT_UNKNOWN ) && ( Req->argc == 1))
|
||||
{
|
||||
/* noch nicht registrierte unbekannte Verbindung */
|
||||
Log( LOG_DEBUG, "Connection %d: got PASS command ...", Client_Conn( Client ));
|
||||
|
||||
/* Passwort speichern */
|
||||
Client_SetPassword( Client, Req->argv[0] );
|
||||
|
||||
Client_SetType( Client, CLIENT_GOTPASS );
|
||||
return CONNECTED;
|
||||
if (Client_Type(Client) == CLIENT_UNKNOWN && Req->argc == 1) {
|
||||
/* Not yet registered "unknown" connection, PASS with one
|
||||
* argument: either a regular client, service, or server
|
||||
* using the old RFC 1459 section 4.1.1 syntax. */
|
||||
LogDebug("Connection %d: got PASS command ...",
|
||||
Client_Conn(Client));
|
||||
} else if ((Client_Type(Client) == CLIENT_UNKNOWN ||
|
||||
Client_Type(Client) == CLIENT_UNKNOWNSERVER) &&
|
||||
(Req->argc == 3 || Req->argc == 4)) {
|
||||
/* Not yet registered "unknown" connection or outgoing server
|
||||
* link, PASS with three or four argument: server using the
|
||||
* RFC 2813 section 4.1.1 syntax. */
|
||||
LogDebug("Connection %d: got PASS command (new server link) ...",
|
||||
Client_Conn(Client));
|
||||
} else if (Client_Type(Client) == CLIENT_UNKNOWN ||
|
||||
Client_Type(Client) == CLIENT_UNKNOWNSERVER) {
|
||||
/* Unregistered connection, but wrong number of arguments: */
|
||||
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||
Client_ID(Client), Req->command);
|
||||
} else {
|
||||
/* Registered connection, PASS command is not allowed! */
|
||||
return IRC_WriteStrClient(Client, ERR_ALREADYREGISTRED_MSG,
|
||||
Client_ID(Client));
|
||||
}
|
||||
else if((( Client_Type( Client ) == CLIENT_UNKNOWN ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER )) && (( Req->argc == 3 ) || ( Req->argc == 4 )))
|
||||
{
|
||||
CHAR c2, c4, *type, *impl, *serverver, *flags, *ptr, *ircflags;
|
||||
INT protohigh, protolow;
|
||||
|
||||
/* noch nicht registrierte Server-Verbindung */
|
||||
Log( LOG_DEBUG, "Connection %d: got PASS command (new server link) ...", Client_Conn( Client ));
|
||||
Client_SetPassword(Client, Req->argv[0]);
|
||||
Client_SetType(Client, CLIENT_GOTPASS);
|
||||
|
||||
/* Passwort speichern */
|
||||
Client_SetPassword( Client, Req->argv[0] );
|
||||
/* Protocol version */
|
||||
if (Req->argc >= 2 && strlen(Req->argv[1]) >= 4) {
|
||||
int c2, c4;
|
||||
|
||||
/* Protokollversion ermitteln */
|
||||
if( strlen( Req->argv[1] ) >= 4 )
|
||||
{
|
||||
c2 = Req->argv[1][2];
|
||||
c4 = Req->argv[1][4];
|
||||
c2 = Req->argv[1][2];
|
||||
c4 = Req->argv[1][4];
|
||||
|
||||
Req->argv[1][4] = '\0';
|
||||
protolow = atoi( &Req->argv[1][2] );
|
||||
Req->argv[1][2] = '\0';
|
||||
protohigh = atoi( Req->argv[1] );
|
||||
Req->argv[1][4] = '\0';
|
||||
protolow = atoi(&Req->argv[1][2]);
|
||||
Req->argv[1][2] = '\0';
|
||||
protohigh = atoi(Req->argv[1]);
|
||||
|
||||
Req->argv[1][2] = c2;
|
||||
Req->argv[1][4] = c4;
|
||||
}
|
||||
else protohigh = protolow = 0;
|
||||
Req->argv[1][2] = c2;
|
||||
Req->argv[1][4] = c4;
|
||||
} else
|
||||
protohigh = protolow = 0;
|
||||
|
||||
/* Protokoll-Typ */
|
||||
if( strlen( Req->argv[1] ) > 4 ) type = &Req->argv[1][4];
|
||||
else type = NULL;
|
||||
/* Protocol type, see doc/Protocol.txt */
|
||||
if (Req->argc >= 2 && strlen(Req->argv[1]) > 4)
|
||||
type = &Req->argv[1][4];
|
||||
else
|
||||
type = NULL;
|
||||
|
||||
/* Protocol flags/options */
|
||||
if (Req->argc >= 4)
|
||||
orig_flags = Req->argv[3];
|
||||
else
|
||||
orig_flags = "";
|
||||
|
||||
/* IRC-Flags (nach RFC 2813) */
|
||||
if( Req->argc >= 4 ) ircflags = Req->argv[3];
|
||||
else ircflags = "";
|
||||
/* Implementation, version and IRC+ flags */
|
||||
if (Req->argc >= 3) {
|
||||
char *impl, *ptr, *serverver, *flags;
|
||||
|
||||
/* Implementation, Version und ngIRCd-Flags */
|
||||
impl = Req->argv[2];
|
||||
ptr = strchr( impl, '|' );
|
||||
if( ptr ) *ptr = '\0';
|
||||
ptr = strchr(impl, '|');
|
||||
if (ptr)
|
||||
*ptr = '\0';
|
||||
|
||||
if( type && ( strcmp( type, PROTOIRCPLUS ) == 0 ))
|
||||
{
|
||||
/* auf der anderen Seite laeuft ein Server, der
|
||||
* ebenfalls das IRC+-Protokoll versteht */
|
||||
if (type && strcmp(type, PROTOIRCPLUS) == 0) {
|
||||
/* The peer seems to be a server which supports the
|
||||
* IRC+ protocol (see doc/Protocol.txt). */
|
||||
serverver = ptr + 1;
|
||||
flags = strchr( serverver, ':' );
|
||||
if( flags )
|
||||
{
|
||||
flags = strchr(serverver, ':');
|
||||
if (flags) {
|
||||
*flags = '\0';
|
||||
flags++;
|
||||
}
|
||||
else flags = "";
|
||||
Log( LOG_INFO, "Peer announces itself as %s-%s using protocol %d.%d/IRC+ (flags: \"%s\").", impl, serverver, protohigh, protolow, flags );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* auf der anderen Seite laeuft ein Server, der
|
||||
* nur das Originalprotokoll unterstuetzt */
|
||||
} else
|
||||
flags = "";
|
||||
Log(LOG_INFO,
|
||||
"Peer announces itself as %s-%s using protocol %d.%d/IRC+ (flags: \"%s\").",
|
||||
impl, serverver, protohigh, protolow, flags);
|
||||
} else {
|
||||
/* The peer seems to be a server supporting the
|
||||
* "original" IRC protocol (RFC 2813). */
|
||||
serverver = "";
|
||||
if( strchr( ircflags, 'Z' )) flags = "Z";
|
||||
else flags = "";
|
||||
Log( LOG_INFO, "Peer announces itself as \"%s\" using protocol %d.%d (flags: \"%s\").", impl, protohigh, protolow, flags );
|
||||
if (strchr(orig_flags, 'Z'))
|
||||
flags = "Z";
|
||||
else
|
||||
flags = "";
|
||||
Log(LOG_INFO,
|
||||
"Peer announces itself as \"%s\" using protocol %d.%d (flags: \"%s\").",
|
||||
impl, protohigh, protolow, flags);
|
||||
}
|
||||
|
||||
Client_SetType( Client, CLIENT_GOTPASSSERVER );
|
||||
Client_SetFlags( Client, flags );
|
||||
|
||||
return CONNECTED;
|
||||
Client_SetFlags(Client, flags);
|
||||
}
|
||||
else if(( Client_Type( Client ) == CLIENT_UNKNOWN ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER ))
|
||||
{
|
||||
/* Falsche Anzahl Parameter? */
|
||||
return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
}
|
||||
else return IRC_WriteStrClient( Client, ERR_ALREADYREGISTRED_MSG, Client_ID( Client ));
|
||||
|
||||
return CONNECTED;
|
||||
} /* IRC_PASS */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
/**
|
||||
* IRC "NICK" command.
|
||||
* This function implements the IRC command "NICK" which is used to register
|
||||
* with the server, to change already registered nicknames and to introduce
|
||||
* new users which are connected to other servers.
|
||||
*/
|
||||
GLOBAL bool
|
||||
IRC_NICK( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *intr_c, *target, *c;
|
||||
CHAR *modes;
|
||||
char *modes;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Zumindest BitchX sendet NICK-USER in der falschen Reihenfolge. */
|
||||
#ifndef STRICT_RFC
|
||||
if( Client_Type( Client ) == CLIENT_UNKNOWN || Client_Type( Client ) == CLIENT_GOTPASS || Client_Type( Client ) == CLIENT_GOTNICK || Client_Type( Client ) == CLIENT_GOTUSER || Client_Type( Client ) == CLIENT_USER || ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
|
||||
/* Some IRC clients, for example BitchX, send the NICK and USER
|
||||
* commands in the wrong order ... */
|
||||
if( Client_Type( Client ) == CLIENT_UNKNOWN
|
||||
|| Client_Type( Client ) == CLIENT_GOTPASS
|
||||
|| Client_Type( Client ) == CLIENT_GOTNICK
|
||||
|| Client_Type( Client ) == CLIENT_GOTUSER
|
||||
|| Client_Type( Client ) == CLIENT_USER
|
||||
|| ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
|
||||
#else
|
||||
if( Client_Type( Client ) == CLIENT_UNKNOWN || Client_Type( Client ) == CLIENT_GOTPASS || Client_Type( Client ) == CLIENT_GOTNICK || Client_Type( Client ) == CLIENT_USER || ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
|
||||
if( Client_Type( Client ) == CLIENT_UNKNOWN
|
||||
|| Client_Type( Client ) == CLIENT_GOTPASS
|
||||
|| Client_Type( Client ) == CLIENT_GOTNICK
|
||||
|| Client_Type( Client ) == CLIENT_USER
|
||||
|| ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
|
||||
#endif
|
||||
{
|
||||
/* User-Registrierung bzw. Nick-Aenderung */
|
||||
/* User registration or change of nickname */
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc != 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
/* Wrong number of arguments? */
|
||||
if( Req->argc != 1 )
|
||||
return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG,
|
||||
Client_ID( Client ),
|
||||
Req->command );
|
||||
|
||||
/* "Ziel-Client" ermitteln */
|
||||
/* Search "target" client */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
target = Client_Search( Req->prefix );
|
||||
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
|
||||
if( ! target )
|
||||
return IRC_WriteStrClient( Client,
|
||||
ERR_NOSUCHNICK_MSG,
|
||||
Client_ID( Client ),
|
||||
Req->argv[0] );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Ist der Client "restricted"? */
|
||||
if( Client_HasMode( Client, 'r' )) return IRC_WriteStrClient( Client, ERR_RESTRICTED_MSG, Client_ID( Client ));
|
||||
/* Is this a restricted client? */
|
||||
if( Client_HasMode( Client, 'r' ))
|
||||
return IRC_WriteStrClient( Client,
|
||||
ERR_RESTRICTED_MSG,
|
||||
Client_ID( Client ));
|
||||
|
||||
target = Client;
|
||||
}
|
||||
|
||||
#ifndef STRICT_RFC
|
||||
/* Wenn der Client zu seinem eigenen Nick wechseln will, so machen
|
||||
* wir nichts. So macht es das Original und mind. Snak hat probleme,
|
||||
* wenn wir es nicht so machen. Ob es so okay ist? Hm ... */
|
||||
if( strcmp( Client_ID( target ), Req->argv[0] ) == 0 ) return CONNECTED;
|
||||
/* If the clients tries to change to its own nickname we won't
|
||||
* do anything. This is how the original ircd behaves and some
|
||||
* clients (for example Snak) expect it to be like this.
|
||||
* But I doubt that this is "really the right thing" ... */
|
||||
if( strcmp( Client_ID( target ), Req->argv[0] ) == 0 )
|
||||
return CONNECTED;
|
||||
#endif
|
||||
|
||||
/* pruefen, ob Nick bereits vergeben. Speziallfall: der Client
|
||||
* will nur die Gross- und Kleinschreibung aendern. Das darf
|
||||
* er natuerlich machen :-) */
|
||||
/* Check that the new nickname is available. Special case:
|
||||
* the client only changes from/to upper to lower case. */
|
||||
if( strcasecmp( Client_ID( target ), Req->argv[0] ) != 0 )
|
||||
{
|
||||
if( ! Client_CheckNick( target, Req->argv[0] )) return CONNECTED;
|
||||
if( ! Client_CheckNick( target, Req->argv[0] ))
|
||||
return CONNECTED;
|
||||
}
|
||||
|
||||
if(( Client_Type( target ) != CLIENT_USER ) && ( Client_Type( target ) != CLIENT_SERVER ))
|
||||
if(( Client_Type( target ) != CLIENT_USER )
|
||||
&& ( Client_Type( target ) != CLIENT_SERVER ))
|
||||
{
|
||||
/* Neuer Client */
|
||||
Log( LOG_DEBUG, "Connection %d: got valid NICK command ...", Client_Conn( Client ));
|
||||
/* New client */
|
||||
Log( LOG_DEBUG, "Connection %d: got valid NICK command ...",
|
||||
Client_Conn( Client ));
|
||||
|
||||
/* Client-Nick registrieren */
|
||||
/* Register new nickname of this client */
|
||||
Client_SetID( target, Req->argv[0] );
|
||||
|
||||
/* schon ein USER da? Dann registrieren! */
|
||||
if( Client_Type( Client ) == CLIENT_GOTUSER ) return Hello_User( Client );
|
||||
else Client_SetType( Client, CLIENT_GOTNICK );
|
||||
/* If we received a valid USER command already then
|
||||
* register the new client! */
|
||||
if( Client_Type( Client ) == CLIENT_GOTUSER )
|
||||
return Hello_User( Client );
|
||||
else
|
||||
Client_SetType( Client, CLIENT_GOTNICK );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Nick-Aenderung */
|
||||
/* Nickname change */
|
||||
if( Client_Conn( target ) > NONE )
|
||||
{
|
||||
/* lokaler Client */
|
||||
Log( LOG_INFO, "User \"%s\" changed nick (connection %d): \"%s\" -> \"%s\".", Client_Mask( target ), Client_Conn( target ), Client_ID( target ), Req->argv[0] );
|
||||
/* Local client */
|
||||
Log( LOG_INFO,
|
||||
"User \"%s\" changed nick (connection %d): \"%s\" -> \"%s\".",
|
||||
Client_Mask( target ), Client_Conn( target ),
|
||||
Client_ID( target ), Req->argv[0] );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Remote-Client */
|
||||
Log( LOG_DEBUG, "User \"%s\" changed nick: \"%s\" -> \"%s\".", Client_Mask( target ), Client_ID( target ), Req->argv[0] );
|
||||
/* Remote client */
|
||||
Log( LOG_DEBUG,
|
||||
"User \"%s\" changed nick: \"%s\" -> \"%s\".",
|
||||
Client_Mask( target ), Client_ID( target ),
|
||||
Req->argv[0] );
|
||||
}
|
||||
|
||||
/* alle betroffenen User und Server ueber Nick-Aenderung informieren */
|
||||
if( Client_Type( Client ) == CLIENT_USER ) IRC_WriteStrClientPrefix( Client, Client, "NICK :%s", Req->argv[0] );
|
||||
IRC_WriteStrServersPrefix( Client, target, "NICK :%s", Req->argv[0] );
|
||||
IRC_WriteStrRelatedPrefix( target, target, FALSE, "NICK :%s", Req->argv[0] );
|
||||
|
||||
/* neuen Client-Nick speichern */
|
||||
/* Inform all users and servers (which have to know)
|
||||
* of this nickname change */
|
||||
if( Client_Type( Client ) == CLIENT_USER )
|
||||
IRC_WriteStrClientPrefix( Client, Client,
|
||||
"NICK :%s",
|
||||
Req->argv[0] );
|
||||
IRC_WriteStrServersPrefix( Client, target,
|
||||
"NICK :%s", Req->argv[0] );
|
||||
IRC_WriteStrRelatedPrefix( target, target, false,
|
||||
"NICK :%s", Req->argv[0] );
|
||||
|
||||
/* Register old nickname for WHOWAS queries */
|
||||
Client_RegisterWhowas( target );
|
||||
|
||||
/* Save new nickname */
|
||||
Client_SetID( target, Req->argv[0] );
|
||||
|
||||
IRC_SetPenalty( target, 2 );
|
||||
}
|
||||
|
||||
@@ -232,7 +300,7 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
|
||||
}
|
||||
else if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
/* Server fuehrt neuen Client ein */
|
||||
/* Server introduces new client */
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc != 7 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
@@ -259,7 +327,7 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
|
||||
}
|
||||
|
||||
/* Neue Client-Struktur anlegen */
|
||||
c = Client_NewRemoteUser( intr_c, Req->argv[0], atoi( Req->argv[1] ), Req->argv[2], Req->argv[3], atoi( Req->argv[4] ), Req->argv[5] + 1, Req->argv[6], TRUE );
|
||||
c = Client_NewRemoteUser( intr_c, Req->argv[0], atoi( Req->argv[1] ), Req->argv[2], Req->argv[3], atoi( Req->argv[4] ), Req->argv[5] + 1, Req->argv[6], true);
|
||||
if( ! c )
|
||||
{
|
||||
/* Eine neue Client-Struktur konnte nicht angelegt werden.
|
||||
@@ -283,11 +351,11 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_NICK */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_USER( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
#ifdef IDENTAUTH
|
||||
CHAR *ptr;
|
||||
char *ptr;
|
||||
#endif
|
||||
|
||||
assert( Client != NULL );
|
||||
@@ -305,9 +373,9 @@ IRC_USER( CLIENT *Client, REQUEST *Req )
|
||||
/* User name */
|
||||
#ifdef IDENTAUTH
|
||||
ptr = Client_User( Client );
|
||||
if( ! ptr || ! *ptr || *ptr == '~' ) Client_SetUser( Client, Req->argv[0], FALSE );
|
||||
if( ! ptr || ! *ptr || *ptr == '~' ) Client_SetUser( Client, Req->argv[0], false );
|
||||
#else
|
||||
Client_SetUser( Client, Req->argv[0], FALSE );
|
||||
Client_SetUser( Client, Req->argv[0], false );
|
||||
#endif
|
||||
|
||||
/* "Real name" or user info text: Don't set it to the empty string, the original ircd
|
||||
@@ -328,21 +396,25 @@ IRC_USER( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_USER */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_QUIT( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target;
|
||||
char quitmsg[LINE_LEN];
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Wrong number of arguments? */
|
||||
if( Req->argc > 1 )
|
||||
return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
if (Req->argc == 1)
|
||||
strlcpy(quitmsg, Req->argv[0], sizeof quitmsg);
|
||||
|
||||
if ( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
/* Server */
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
target = Client_Search( Req->prefix );
|
||||
if( ! target )
|
||||
{
|
||||
@@ -351,102 +423,160 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req )
|
||||
return CONNECTED;
|
||||
}
|
||||
|
||||
if( Req->argc == 0 ) Client_Destroy( target, "Got QUIT command.", NULL, TRUE );
|
||||
else Client_Destroy( target, "Got QUIT command.", Req->argv[0], TRUE );
|
||||
Client_Destroy( target, "Got QUIT command.", Req->argc == 1 ? quitmsg : NULL, true);
|
||||
|
||||
return CONNECTED;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* User, Service, oder noch nicht registriert */
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
if (Req->argc == 1 && quitmsg[0] != '\"') {
|
||||
/* " " to avoid confusion */
|
||||
strlcpy(quitmsg, "\"", sizeof quitmsg);
|
||||
strlcat(quitmsg, Req->argv[0], sizeof quitmsg-1);
|
||||
strlcat(quitmsg, "\"", sizeof quitmsg );
|
||||
}
|
||||
|
||||
if( Req->argc == 0 ) Conn_Close( Client_Conn( Client ), "Got QUIT command.", NULL, TRUE );
|
||||
else Conn_Close( Client_Conn( Client ), "Got QUIT command.", Req->argv[0], TRUE );
|
||||
/* User, Service, oder noch nicht registriert */
|
||||
Conn_Close( Client_Conn( Client ), "Got QUIT command.", Req->argc == 1 ? quitmsg : NULL, true);
|
||||
|
||||
return DISCONNECTED;
|
||||
}
|
||||
} /* IRC_QUIT */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
IRC_PING( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL bool
|
||||
IRC_PING(CLIENT *Client, REQUEST *Req)
|
||||
{
|
||||
CLIENT *target, *from;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
assert(Client != NULL);
|
||||
assert(Req != NULL);
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc < 1 ) return IRC_WriteStrClient( Client, ERR_NOORIGIN_MSG, Client_ID( Client ));
|
||||
/* Wrong number of arguments? */
|
||||
if (Req->argc < 1)
|
||||
return IRC_WriteStrClient(Client, ERR_NOORIGIN_MSG,
|
||||
Client_ID(Client));
|
||||
#ifdef STRICT_RFC
|
||||
if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
/* Don't ignore additional arguments when in "strict" mode */
|
||||
if (Req->argc > 2)
|
||||
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||
Client_ID(Client), Req->command);
|
||||
#endif
|
||||
|
||||
if( Req->argc > 1 )
|
||||
{
|
||||
/* es wurde ein Ziel-Client angegeben */
|
||||
target = Client_Search( Req->argv[1] );
|
||||
if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] );
|
||||
if( target != Client_ThisServer( ))
|
||||
{
|
||||
/* ok, forwarden */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
|
||||
else from = Client;
|
||||
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix );
|
||||
return IRC_WriteStrClientPrefix( target, from, "PING %s :%s", Client_ID( from ), Req->argv[1] );
|
||||
if (Req->argc > 1) {
|
||||
/* A target has been specified ... */
|
||||
target = Client_Search(Req->argv[1]);
|
||||
|
||||
if (!target || Client_Type(target) != CLIENT_SERVER)
|
||||
return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
|
||||
Client_ID(Client), Req->argv[1]);
|
||||
|
||||
if (target != Client_ThisServer()) {
|
||||
/* Ok, we have to forward the PING */
|
||||
if (Client_Type(Client) == CLIENT_SERVER)
|
||||
from = Client_Search(Req->prefix);
|
||||
else
|
||||
from = Client;
|
||||
if (!from)
|
||||
return IRC_WriteStrClient(Client,
|
||||
ERR_NOSUCHSERVER_MSG,
|
||||
Client_ID(Client), Req->prefix);
|
||||
|
||||
return IRC_WriteStrClientPrefix(target, from,
|
||||
"PING %s :%s", Req->argv[0],
|
||||
Req->argv[1] );
|
||||
}
|
||||
}
|
||||
|
||||
Log( LOG_DEBUG, "Connection %d: got PING, sending PONG ...", Client_Conn( Client ));
|
||||
return IRC_WriteStrClient( Client, "PONG %s :%s", Client_ID( Client_ThisServer( )), Client_ID( Client ));
|
||||
if (Client_Type(Client) == CLIENT_SERVER) {
|
||||
if (Req->prefix)
|
||||
from = Client_Search(Req->prefix);
|
||||
else
|
||||
from = Client;
|
||||
} else
|
||||
from = Client_ThisServer();
|
||||
if (!from)
|
||||
return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
|
||||
Client_ID(Client), Req->prefix);
|
||||
|
||||
Log(LOG_DEBUG, "Connection %d: got PING, sending PONG ...",
|
||||
Client_Conn(Client));
|
||||
|
||||
#ifdef STRICT_RFC
|
||||
return IRC_WriteStrClient(Client, "PONG %s :%s",
|
||||
Client_ID(from), Client_ID(Client));
|
||||
#else
|
||||
/* Some clients depend on the argument being returned in the PONG
|
||||
* reply (not mentioned in any RFC, though) */
|
||||
return IRC_WriteStrClient(Client, "PONG %s :%s",
|
||||
Client_ID(from), Req->argv[0]);
|
||||
#endif
|
||||
} /* IRC_PING */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
IRC_PONG( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL bool
|
||||
IRC_PONG(CLIENT *Client, REQUEST *Req)
|
||||
{
|
||||
CLIENT *target, *from;
|
||||
char *s;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
assert(Client != NULL);
|
||||
assert(Req != NULL);
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc < 1 ) return IRC_WriteStrClient( Client, ERR_NOORIGIN_MSG, Client_ID( Client ));
|
||||
if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
/* Wrong number of arguments? */
|
||||
if (Req->argc < 1)
|
||||
return IRC_WriteStrClient(Client, ERR_NOORIGIN_MSG,
|
||||
Client_ID(Client));
|
||||
if (Req->argc > 2)
|
||||
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||
Client_ID(Client), Req->command);
|
||||
|
||||
/* forwarden? */
|
||||
if( Req->argc == 2 )
|
||||
{
|
||||
target = Client_Search( Req->argv[1] );
|
||||
if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] );
|
||||
if( target != Client_ThisServer( ))
|
||||
{
|
||||
/* ok, forwarden */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
|
||||
else from = Client;
|
||||
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix );
|
||||
return IRC_WriteStrClientPrefix( target, from, "PONG %s :%s", Client_ID( from ), Req->argv[1] );
|
||||
/* Forward? */
|
||||
if (Req->argc == 2 && Client_Type(Client) == CLIENT_SERVER) {
|
||||
target = Client_Search(Req->argv[0]);
|
||||
if (!target)
|
||||
return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
|
||||
Client_ID(Client), Req->argv[0]);
|
||||
|
||||
from = Client_Search(Req->prefix);
|
||||
|
||||
if (target != Client_ThisServer() && target != from) {
|
||||
/* Ok, we have to forward the message. */
|
||||
if (!from)
|
||||
return IRC_WriteStrClient(Client,
|
||||
ERR_NOSUCHSERVER_MSG,
|
||||
Client_ID(Client), Req->prefix);
|
||||
|
||||
if (Client_Type(Client_NextHop(target)) != CLIENT_SERVER)
|
||||
s = Client_ID(from);
|
||||
else
|
||||
s = Req->argv[0];
|
||||
return IRC_WriteStrClientPrefix(target, from,
|
||||
"PONG %s :%s", s, Req->argv[1]);
|
||||
}
|
||||
}
|
||||
|
||||
/* Der Connection-Timestamp wurde schon beim Lesen aus dem Socket
|
||||
* aktualisiert, daher muss das hier nicht mehr gemacht werden. */
|
||||
/* The connection timestamp has already been updated when the data has
|
||||
* been read from so socket, so we don't need to update it here. */
|
||||
|
||||
if( Client_Conn( Client ) > NONE ) Log( LOG_DEBUG, "Connection %d: received PONG. Lag: %ld seconds.", Client_Conn( Client ), time( NULL ) - Conn_LastPing( Client_Conn( Client )));
|
||||
else Log( LOG_DEBUG, "Connection %d: received PONG.", Client_Conn( Client ));
|
||||
if (Client_Conn(Client) > NONE)
|
||||
Log(LOG_DEBUG,
|
||||
"Connection %d: received PONG. Lag: %ld seconds.",
|
||||
Client_Conn(Client),
|
||||
time(NULL) - Conn_LastPing(Client_Conn(Client)));
|
||||
else
|
||||
Log(LOG_DEBUG,
|
||||
"Connection %d: received PONG.", Client_Conn(Client));
|
||||
|
||||
return CONNECTED;
|
||||
} /* IRC_PONG */
|
||||
|
||||
|
||||
LOCAL BOOLEAN
|
||||
static bool
|
||||
Hello_User( CLIENT *Client )
|
||||
{
|
||||
#ifdef CVSDATE
|
||||
CHAR ver[12], vertxt[30];
|
||||
char ver[12], vertxt[30];
|
||||
#endif
|
||||
|
||||
assert( Client != NULL );
|
||||
@@ -456,7 +586,7 @@ Hello_User( CLIENT *Client )
|
||||
{
|
||||
/* Bad password! */
|
||||
Log( LOG_ERR, "User \"%s\" rejected (connection %d): Bad password!", Client_Mask( Client ), Client_Conn( Client ));
|
||||
Conn_Close( Client_Conn( Client ), NULL, "Bad password", TRUE );
|
||||
Conn_Close( Client_Conn( Client ), NULL, "Bad password", true);
|
||||
return DISCONNECTED;
|
||||
}
|
||||
|
||||
@@ -466,28 +596,30 @@ Hello_User( CLIENT *Client )
|
||||
IRC_WriteStrServers( NULL, "NICK %s 1 %s %s 1 +%s :%s", Client_ID( Client ), Client_User( Client ), Client_Hostname( Client ), Client_Modes( Client ), Client_Info( Client ));
|
||||
|
||||
/* Welcome :-) */
|
||||
if( ! IRC_WriteStrClient( Client, RPL_WELCOME_MSG, Client_ID( Client ), Client_Mask( Client ))) return FALSE;
|
||||
if( ! IRC_WriteStrClient( Client, RPL_WELCOME_MSG, Client_ID( Client ), Client_Mask( Client ))) return false;
|
||||
|
||||
/* Version and system type */
|
||||
#ifdef CVSDATE
|
||||
strlcpy( ver, CVSDATE, sizeof( ver ));
|
||||
strncpy( ver + 4, ver + 5, 2 );
|
||||
strncpy( ver + 6, ver + 8, 3 );
|
||||
strlcpy( ver, CVSDATE, sizeof( ver ));
|
||||
memmove( ver + 4, ver + 5, 2 );
|
||||
memmove( ver + 6, ver + 8, 3 );
|
||||
snprintf( vertxt, sizeof( vertxt ), "%s(%s)", PACKAGE_VERSION, ver );
|
||||
if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), vertxt, TARGET_CPU, TARGET_VENDOR, TARGET_OS )) return FALSE;
|
||||
if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), vertxt, TARGET_CPU, TARGET_VENDOR, TARGET_OS )) return false;
|
||||
#else
|
||||
if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), PACKAGE_VERSION, TARGET_CPU, TARGET_VENDOR, TARGET_OS )) return FALSE;
|
||||
if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), PACKAGE_VERSION, TARGET_CPU, TARGET_VENDOR, TARGET_OS )) return false;
|
||||
#endif
|
||||
|
||||
if( ! IRC_WriteStrClient( Client, RPL_CREATED_MSG, Client_ID( Client ), NGIRCd_StartStr )) return FALSE;
|
||||
if( ! IRC_WriteStrClient( Client, RPL_CREATED_MSG, Client_ID( Client ), NGIRCd_StartStr )) return false;
|
||||
#ifdef CVSDATE
|
||||
if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), vertxt, USERMODES, CHANMODES )) return FALSE;
|
||||
if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), vertxt, USERMODES, CHANMODES )) return false;
|
||||
#else
|
||||
if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), PACKAGE_VERSION, USERMODES, CHANMODES )) return FALSE;
|
||||
if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), PACKAGE_VERSION, USERMODES, CHANMODES )) return false;
|
||||
#endif
|
||||
|
||||
/* Features */
|
||||
if( ! IRC_WriteStrClient( Client, RPL_ISUPPORT_MSG, Client_ID( Client ), CLIENT_NICK_LEN - 1, CHANNEL_TOPIC_LEN - 1, CLIENT_AWAY_LEN - 1, Conf_MaxJoins )) return DISCONNECTED;
|
||||
/* Features supported by this server (005 numeric, ISUPPORT),
|
||||
* see <http://www.irc.org/tech_docs/005.html> for details. */
|
||||
if (! IRC_Send_ISUPPORT(Client))
|
||||
return DISCONNECTED;
|
||||
|
||||
Client_SetType( Client, CLIENT_USER );
|
||||
|
||||
@@ -501,15 +633,15 @@ Hello_User( CLIENT *Client )
|
||||
} /* Hello_User */
|
||||
|
||||
|
||||
LOCAL VOID
|
||||
Kill_Nick( CHAR *Nick, CHAR *Reason )
|
||||
static void
|
||||
Kill_Nick( char *Nick, char *Reason )
|
||||
{
|
||||
REQUEST r;
|
||||
|
||||
assert( Nick != NULL );
|
||||
assert( Reason != NULL );
|
||||
|
||||
r.prefix = (CHAR *)Client_ThisServer( );
|
||||
r.prefix = (char *)Client_ThisServer( );
|
||||
r.argv[0] = Nick;
|
||||
r.argv[1] = Reason;
|
||||
r.argc = 2;
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: irc-login.h,v 1.5 2002/12/12 12:23:43 alex Exp $
|
||||
* $Id: irc-login.h,v 1.6 2005/03/19 18:43:48 fw Exp $
|
||||
*
|
||||
* Login and logout (header)
|
||||
*/
|
||||
@@ -18,12 +18,12 @@
|
||||
#define __irc_login_h__
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_PASS PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_NICK PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_USER PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_PING PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_PONG PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_QUIT PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_PASS PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_NICK PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_USER PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_PING PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_PONG PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_QUIT PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
* Copyright (c)2001-2005 Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: irc-mode.c,v 1.35 2004/04/25 15:42:05 alex Exp $";
|
||||
static char UNUSED id[] = "$Id: irc-mode.c,v 1.50.2.1 2008/02/16 11:26:12 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
@@ -22,10 +22,10 @@ static char UNUSED id[] = "$Id: irc-mode.c,v 1.35 2004/04/25 15:42:05 alex Exp $
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "defines.h"
|
||||
#include "conn.h"
|
||||
#include "client.h"
|
||||
#include "channel.h"
|
||||
#include "defines.h"
|
||||
#include "irc-write.h"
|
||||
#include "lists.h"
|
||||
#include "log.h"
|
||||
@@ -38,19 +38,19 @@ static char UNUSED id[] = "$Id: irc-mode.c,v 1.35 2004/04/25 15:42:05 alex Exp $
|
||||
#include "irc-mode.h"
|
||||
|
||||
|
||||
LOCAL BOOLEAN Client_Mode PARAMS(( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ));
|
||||
LOCAL BOOLEAN Channel_Mode PARAMS(( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel ));
|
||||
static bool Client_Mode PARAMS(( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ));
|
||||
static bool Channel_Mode PARAMS(( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel ));
|
||||
|
||||
LOCAL BOOLEAN Add_Invite PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern ));
|
||||
LOCAL BOOLEAN Add_Ban PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern ));
|
||||
static bool Add_Invite PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ));
|
||||
static bool Add_Ban PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ));
|
||||
|
||||
LOCAL BOOLEAN Del_Invite PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern ));
|
||||
LOCAL BOOLEAN Del_Ban PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern ));
|
||||
static bool Del_Invite PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ));
|
||||
static bool Del_Ban PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ));
|
||||
|
||||
LOCAL BOOLEAN Send_ListChange PARAMS(( CHAR *Mode, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Mask ));
|
||||
static bool Send_ListChange PARAMS(( char *Mode, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Mask ));
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_MODE( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *cl, *origin;
|
||||
@@ -69,28 +69,34 @@ IRC_MODE( CLIENT *Client, REQUEST *Req )
|
||||
if( ! origin ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
|
||||
}
|
||||
else origin = Client;
|
||||
|
||||
/* Channel or user mode? */
|
||||
cl = chan = NULL;
|
||||
if( Client_IsValidNick( Req->argv[0] )) cl = Client_Search( Req->argv[0] );
|
||||
if( Channel_IsValidName( Req->argv[0] )) chan = Channel_Search( Req->argv[0] );
|
||||
|
||||
if( cl ) return Client_Mode( Client, Req, origin, cl );
|
||||
if( chan ) return Channel_Mode( Client, Req, origin, chan );
|
||||
/* Channel or user mode? */
|
||||
cl = NULL; chan = NULL;
|
||||
if (Client_IsValidNick(Req->argv[0]))
|
||||
cl = Client_Search(Req->argv[0]);
|
||||
if (Channel_IsValidName(Req->argv[0]))
|
||||
chan = Channel_Search(Req->argv[0]);
|
||||
|
||||
if (cl)
|
||||
return Client_Mode(Client, Req, origin, cl);
|
||||
if (chan)
|
||||
return Channel_Mode(Client, Req, origin, chan);
|
||||
|
||||
/* No target found! */
|
||||
return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
|
||||
return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG,
|
||||
Client_ID(Client), Req->argv[0]);
|
||||
} /* IRC_MODE */
|
||||
|
||||
|
||||
LOCAL BOOLEAN
|
||||
static bool
|
||||
Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
|
||||
{
|
||||
/* Handle client mode requests */
|
||||
|
||||
CHAR the_modes[COMMAND_LEN], x[2], *mode_ptr;
|
||||
BOOLEAN ok, set;
|
||||
INT mode_arg;
|
||||
char the_modes[COMMAND_LEN], x[2], *mode_ptr;
|
||||
bool ok, set;
|
||||
int mode_arg;
|
||||
size_t len;
|
||||
|
||||
/* Is the client allowed to request or change the modes? */
|
||||
if( Client_Type( Client ) == CLIENT_USER )
|
||||
@@ -106,8 +112,8 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
|
||||
mode_ptr = Req->argv[mode_arg];
|
||||
|
||||
/* Initial state: set or unset modes? */
|
||||
if( *mode_ptr == '+' ) set = TRUE;
|
||||
else if( *mode_ptr == '-' ) set = FALSE;
|
||||
if( *mode_ptr == '+' ) set = true;
|
||||
else if( *mode_ptr == '-' ) set = false;
|
||||
else return IRC_WriteStrClient( Origin, ERR_UMODEUNKNOWNFLAG_MSG, Client_ID( Origin ));
|
||||
|
||||
/* Prepare reply string */
|
||||
@@ -134,10 +140,11 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
|
||||
if((( *mode_ptr == '+' ) && ( ! set )) || (( *mode_ptr == '-' ) && ( set )))
|
||||
{
|
||||
/* Action modifier ("+"/"-") must be changed ... */
|
||||
if(( the_modes[strlen( the_modes ) - 1] == '+' ) || ( the_modes[strlen( the_modes ) - 1] == '-' ))
|
||||
len = strlen( the_modes ) - 1;
|
||||
if(( the_modes[len] == '+' ) || ( the_modes[len] == '-' ))
|
||||
{
|
||||
/* Adjust last action modifier in result */
|
||||
the_modes[strlen( the_modes ) - 1] = *mode_ptr;
|
||||
the_modes[len] = *mode_ptr;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -145,8 +152,8 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
|
||||
x[0] = *mode_ptr;
|
||||
strlcat( the_modes, x, sizeof( the_modes ));
|
||||
}
|
||||
if( *mode_ptr == '+' ) set = TRUE;
|
||||
else set = FALSE;
|
||||
if( *mode_ptr == '+' ) set = true;
|
||||
else set = false;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
@@ -155,37 +162,35 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
|
||||
x[0] = '\0';
|
||||
switch( *mode_ptr )
|
||||
{
|
||||
case 'a':
|
||||
/* Away */
|
||||
case 'i': /* Invisible */
|
||||
case 's': /* Server messages */
|
||||
case 'w': /* Wallops messages */
|
||||
x[0] = *mode_ptr;
|
||||
break;
|
||||
|
||||
case 'a': /* Away */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
x[0] = 'a';
|
||||
Client_SetAway( Client, DEFAULT_AWAY_MSG );
|
||||
Client_SetAway( Origin, DEFAULT_AWAY_MSG );
|
||||
}
|
||||
else ok = IRC_WriteStrClient( Origin, ERR_NOPRIVILEGES_MSG, Client_ID( Origin ));
|
||||
break;
|
||||
case 'i':
|
||||
/* Invisible */
|
||||
x[0] = 'i';
|
||||
break;
|
||||
case 'o':
|
||||
/* IRC operator (only unsetable!) */
|
||||
|
||||
case 'o': /* IRC operator (only unsettable!) */
|
||||
if(( ! set ) || ( Client_Type( Client ) == CLIENT_SERVER ))
|
||||
{
|
||||
Client_SetOperByMe( Target, FALSE );
|
||||
Client_SetOperByMe( Target, false );
|
||||
x[0] = 'o';
|
||||
}
|
||||
else ok = IRC_WriteStrClient( Origin, ERR_NOPRIVILEGES_MSG, Client_ID( Origin ));
|
||||
break;
|
||||
case 'r':
|
||||
/* Restricted (only setable) */
|
||||
|
||||
case 'r': /* Restricted (only settable) */
|
||||
if(( set ) || ( Client_Type( Client ) == CLIENT_SERVER )) x[0] = 'r';
|
||||
else ok = IRC_WriteStrClient( Origin, ERR_RESTRICTED_MSG, Client_ID( Origin ));
|
||||
break;
|
||||
case 's':
|
||||
/* Server messages */
|
||||
x[0] = 's';
|
||||
break;
|
||||
|
||||
default:
|
||||
Log( LOG_DEBUG, "Unknown mode \"%c%c\" from \"%s\"!?", set ? '+' : '-', *mode_ptr, Client_ID( Origin ));
|
||||
if( Client_Type( Client ) != CLIENT_SERVER ) ok = IRC_WriteStrClient( Origin, ERR_UMODEUNKNOWNFLAG2_MSG, Client_ID( Origin ), set ? '+' : '-', *mode_ptr );
|
||||
@@ -215,7 +220,8 @@ client_exit:
|
||||
if( the_modes[1] )
|
||||
{
|
||||
/* Remoce needless action modifier characters */
|
||||
if(( the_modes[strlen( the_modes ) - 1] == '+' ) || ( the_modes[strlen( the_modes ) - 1] == '-' )) the_modes[strlen( the_modes ) - 1] = '\0';
|
||||
len = strlen( the_modes ) - 1;
|
||||
if(( the_modes[len] == '+' ) || ( the_modes[len] == '-' )) the_modes[len] = '\0';
|
||||
|
||||
if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
@@ -236,16 +242,17 @@ client_exit:
|
||||
} /* Client_Mode */
|
||||
|
||||
|
||||
LOCAL BOOLEAN
|
||||
static bool
|
||||
Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
||||
{
|
||||
/* Handle channel and channel-user modes */
|
||||
|
||||
CHAR the_modes[COMMAND_LEN], the_args[COMMAND_LEN], x[2], argadd[CLIENT_PASS_LEN], *mode_ptr;
|
||||
BOOLEAN ok, set, modeok, skiponce;
|
||||
INT mode_arg, arg_arg;
|
||||
char the_modes[COMMAND_LEN], the_args[COMMAND_LEN], x[2], argadd[CLIENT_PASS_LEN], *mode_ptr;
|
||||
bool ok, set, modeok = false, skiponce, use_servermode = false;
|
||||
int mode_arg, arg_arg;
|
||||
CLIENT *client;
|
||||
LONG l;
|
||||
long l;
|
||||
size_t len;
|
||||
|
||||
/* Mode request: let's answer it :-) */
|
||||
if( Req->argc == 1 )
|
||||
@@ -256,13 +263,13 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
||||
/* The sender is a member: generate extended reply */
|
||||
strlcpy( the_modes, Channel_Modes( Channel ), sizeof( the_modes ));
|
||||
mode_ptr = the_modes;
|
||||
strcpy( the_args, "" );
|
||||
the_args[0] = '\0';
|
||||
while( *mode_ptr )
|
||||
{
|
||||
switch( *mode_ptr )
|
||||
{
|
||||
case 'l':
|
||||
snprintf( argadd, sizeof( argadd ), " %ld", Channel_MaxUsers( Channel ));
|
||||
snprintf( argadd, sizeof( argadd ), " %lu", Channel_MaxUsers( Channel ));
|
||||
strlcat( the_args, argadd, sizeof( the_args ));
|
||||
break;
|
||||
case 'k':
|
||||
@@ -284,15 +291,17 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
||||
if( ! Channel_IsMemberOf( Channel, Origin )) return IRC_WriteStrClient( Origin, ERR_NOTONCHANNEL_MSG, Client_ID( Origin ), Channel_Name( Channel ));
|
||||
|
||||
/* Is he channel operator? */
|
||||
if( strchr( Channel_UserModes( Channel, Origin ), 'o' )) modeok = TRUE;
|
||||
else modeok = FALSE;
|
||||
if( Conf_OperCanMode )
|
||||
if( strchr( Channel_UserModes( Channel, Origin ), 'o' )) modeok = true;
|
||||
else if( Conf_OperCanMode )
|
||||
{
|
||||
/* auch IRC-Operatoren duerfen MODE verwenden */
|
||||
if( Client_OperByMe( Origin )) modeok = TRUE;
|
||||
/* IRC-Operators can use MODE as well */
|
||||
if( Client_OperByMe( Origin )) {
|
||||
modeok = true;
|
||||
if ( Conf_OperServerMode ) use_servermode = true; /* Change Origin to Server */
|
||||
}
|
||||
}
|
||||
}
|
||||
else modeok = TRUE;
|
||||
else modeok = true;
|
||||
|
||||
mode_arg = 1;
|
||||
mode_ptr = Req->argv[mode_arg];
|
||||
@@ -300,15 +309,15 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
||||
else arg_arg = -1;
|
||||
|
||||
/* Initial state: set or unset modes? */
|
||||
skiponce = FALSE;
|
||||
if( *mode_ptr == '-' ) set = FALSE;
|
||||
else if( *mode_ptr == '+' ) set = TRUE;
|
||||
else set = skiponce = TRUE;
|
||||
skiponce = false;
|
||||
if( *mode_ptr == '-' ) set = false;
|
||||
else if( *mode_ptr == '+' ) set = true;
|
||||
else set = skiponce = true;
|
||||
|
||||
/* Prepare reply string */
|
||||
if( set ) strcpy( the_modes, "+" );
|
||||
else strcpy( the_modes, "-" );
|
||||
strcpy( the_args, " " );
|
||||
the_args[0] = '\0';
|
||||
|
||||
x[1] = '\0';
|
||||
ok = CONNECTED;
|
||||
@@ -325,7 +334,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
||||
if( Req->argc > mode_arg + 1 ) arg_arg = mode_arg + 1;
|
||||
else arg_arg = -1;
|
||||
}
|
||||
skiponce = FALSE;
|
||||
skiponce = false;
|
||||
|
||||
switch( *mode_ptr )
|
||||
{
|
||||
@@ -334,10 +343,11 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
||||
if((( *mode_ptr == '+' ) && ( ! set )) || (( *mode_ptr == '-' ) && ( set )))
|
||||
{
|
||||
/* Action modifier ("+"/"-") must be changed ... */
|
||||
if(( the_modes[strlen( the_modes ) - 1] == '+' ) || ( the_modes[strlen( the_modes ) - 1] == '-' ))
|
||||
len = strlen( the_modes ) - 1;
|
||||
if(( the_modes[len] == '+' ) || ( the_modes[len] == '-' ))
|
||||
{
|
||||
/* Adjust last action modifier in result */
|
||||
the_modes[strlen( the_modes ) - 1] = *mode_ptr;
|
||||
the_modes[len] = *mode_ptr;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -345,8 +355,8 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
||||
x[0] = *mode_ptr;
|
||||
strlcat( the_modes, x, sizeof( the_modes ));
|
||||
}
|
||||
if( *mode_ptr == '+' ) set = TRUE;
|
||||
else set = FALSE;
|
||||
if( *mode_ptr == '+' ) set = true;
|
||||
else set = false;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
@@ -360,62 +370,18 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
||||
client = NULL;
|
||||
switch( *mode_ptr )
|
||||
{
|
||||
/* Channel modes */
|
||||
case 'i':
|
||||
/* Invite-Only */
|
||||
if( modeok ) x[0] = 'i';
|
||||
else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
|
||||
break;
|
||||
case 'm':
|
||||
/* Moderated */
|
||||
if( modeok ) x[0] = 'm';
|
||||
else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
|
||||
break;
|
||||
case 'n':
|
||||
/* kein Schreiben in den Channel von aussen */
|
||||
if( modeok ) x[0] = 'n';
|
||||
else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
|
||||
break;
|
||||
case 't':
|
||||
/* Topic Lock */
|
||||
if( modeok ) x[0] = 't';
|
||||
else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
|
||||
break;
|
||||
case 'P':
|
||||
/* Persistent channel */
|
||||
if( modeok )
|
||||
{
|
||||
if( set && ( ! Client_OperByMe( Client )))
|
||||
{
|
||||
/* Only IRC operators are allowed to set P mode */
|
||||
ok = IRC_WriteStrClient( Origin, ERR_NOPRIVILEGES_MSG, Client_ID( Origin ));
|
||||
}
|
||||
else x[0] = 'P';
|
||||
}
|
||||
/* --- Channel modes --- */
|
||||
|
||||
case 'i': /* Invite only */
|
||||
case 'm': /* Moderated */
|
||||
case 'n': /* Only members can write */
|
||||
case 's': /* Secret channel */
|
||||
case 't': /* Topic locked */
|
||||
if( modeok ) x[0] = *mode_ptr;
|
||||
else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
|
||||
break;
|
||||
|
||||
/* Channel user modes */
|
||||
case 'o':
|
||||
/* Channel operator */
|
||||
case 'v':
|
||||
/* Voice */
|
||||
if( arg_arg > mode_arg )
|
||||
{
|
||||
if( modeok )
|
||||
{
|
||||
client = Client_Search( Req->argv[arg_arg] );
|
||||
if( client ) x[0] = *mode_ptr;
|
||||
else ok = IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[arg_arg] );
|
||||
}
|
||||
else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
|
||||
Req->argv[arg_arg][0] = '\0';
|
||||
arg_arg++;
|
||||
}
|
||||
else ok = IRC_WriteStrClient( Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID( Origin ), Req->command );
|
||||
break;
|
||||
case 'k':
|
||||
/* Channel key */
|
||||
case 'k': /* Channel key */
|
||||
if( ! set )
|
||||
{
|
||||
if( modeok ) x[0] = *mode_ptr;
|
||||
@@ -437,8 +403,8 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
||||
}
|
||||
else ok = IRC_WriteStrClient( Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID( Origin ), Req->command );
|
||||
break;
|
||||
case 'l':
|
||||
/* Member limit */
|
||||
|
||||
case 'l': /* Member limit */
|
||||
if( ! set )
|
||||
{
|
||||
if( modeok ) x[0] = *mode_ptr;
|
||||
@@ -465,9 +431,46 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
||||
else ok = IRC_WriteStrClient( Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID( Origin ), Req->command );
|
||||
break;
|
||||
|
||||
/* Channel lists */
|
||||
case 'I':
|
||||
/* Invite lists */
|
||||
case 'P': /* Persistent channel */
|
||||
if (modeok) {
|
||||
/* Only IRC operators are allowed to
|
||||
* set the 'P' channel mode! */
|
||||
if (set && ! (Client_OperByMe(Client)
|
||||
|| Client_Type(Client) == CLIENT_SERVER)) {
|
||||
ok = IRC_WriteStrClient(Origin,
|
||||
ERR_NOPRIVILEGES_MSG,
|
||||
Client_ID(Origin));
|
||||
} else
|
||||
x[0] = 'P';
|
||||
} else
|
||||
ok = IRC_WriteStrClient(Origin,
|
||||
ERR_CHANOPRIVSNEEDED_MSG,
|
||||
Client_ID(Origin),
|
||||
Channel_Name(Channel));
|
||||
break;
|
||||
|
||||
/* --- Channel user modes --- */
|
||||
|
||||
case 'o': /* Channel operator */
|
||||
case 'v': /* Voice */
|
||||
if( arg_arg > mode_arg )
|
||||
{
|
||||
if( modeok )
|
||||
{
|
||||
client = Client_Search( Req->argv[arg_arg] );
|
||||
if( client ) x[0] = *mode_ptr;
|
||||
else ok = IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[arg_arg] );
|
||||
}
|
||||
else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
|
||||
Req->argv[arg_arg][0] = '\0';
|
||||
arg_arg++;
|
||||
}
|
||||
else ok = IRC_WriteStrClient( Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID( Origin ), Req->command );
|
||||
break;
|
||||
|
||||
/* --- Channel lists --- */
|
||||
|
||||
case 'I': /* Invite lists */
|
||||
if( arg_arg > mode_arg )
|
||||
{
|
||||
/* modify list */
|
||||
@@ -480,10 +483,10 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
||||
Req->argv[arg_arg][0] = '\0';
|
||||
arg_arg++;
|
||||
}
|
||||
else Lists_ShowInvites( Origin, Channel );
|
||||
else Channel_ShowInvites( Origin, Channel );
|
||||
break;
|
||||
case 'b':
|
||||
/* Ban lists */
|
||||
|
||||
case 'b': /* Ban lists */
|
||||
if( arg_arg > mode_arg )
|
||||
{
|
||||
/* modify list */
|
||||
@@ -496,7 +499,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
||||
Req->argv[arg_arg][0] = '\0';
|
||||
arg_arg++;
|
||||
}
|
||||
else Lists_ShowBans( Origin, Channel );
|
||||
else Channel_ShowBans( Origin, Channel );
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -525,8 +528,8 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
||||
/* Channel-User-Mode */
|
||||
if( Channel_UserModeAdd( Channel, client, x[0] ))
|
||||
{
|
||||
strlcat( the_args, Client_ID( client ), sizeof( the_args ));
|
||||
strlcat( the_args, " ", sizeof( the_args ));
|
||||
strlcat( the_args, Client_ID( client ), sizeof( the_args ));
|
||||
strlcat( the_modes, x, sizeof( the_modes ));
|
||||
Log( LOG_DEBUG, "User \"%s\": Mode change on %s, now \"%s\"", Client_Mask( client ), Channel_Name( Channel ), Channel_UserModes( Channel, client ));
|
||||
}
|
||||
@@ -549,8 +552,8 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
||||
/* Channel-User-Mode */
|
||||
if( Channel_UserModeDel( Channel, client, x[0] ))
|
||||
{
|
||||
strlcat( the_args, Client_ID( client ), sizeof( the_args ));
|
||||
strlcat( the_args, " ", sizeof( the_args ));
|
||||
strlcat( the_args, Client_ID( client ), sizeof( the_args ));
|
||||
strlcat( the_modes, x, sizeof( the_modes ));
|
||||
Log( LOG_DEBUG, "User \"%s\": Mode change on %s, now \"%s\"", Client_Mask( client ), Channel_Name( Channel ), Channel_UserModes( Channel, client ));
|
||||
}
|
||||
@@ -569,7 +572,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
||||
/* Are there additional arguments to add? */
|
||||
if( argadd[0] )
|
||||
{
|
||||
if( the_args[strlen( the_args ) - 1] != ' ' ) strlcat( the_args, " ", sizeof( the_args ));
|
||||
strlcat( the_args, " ", sizeof( the_args ));
|
||||
strlcat( the_args, argadd, sizeof( the_args ));
|
||||
}
|
||||
}
|
||||
@@ -579,23 +582,23 @@ chan_exit:
|
||||
if( the_modes[1] )
|
||||
{
|
||||
/* Clean up mode string */
|
||||
if(( the_modes[strlen( the_modes ) - 1] == '+' ) || ( the_modes[strlen( the_modes ) - 1] == '-' )) the_modes[strlen( the_modes ) - 1] = '\0';
|
||||
|
||||
/* Clean up argument string if there are none */
|
||||
if( ! the_args[1] ) the_args[0] = '\0';
|
||||
len = strlen( the_modes ) - 1;
|
||||
if(( the_modes[len] == '+' ) || ( the_modes[len] == '-' )) the_modes[len] = '\0';
|
||||
|
||||
if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
/* Forward mode changes to channel users and other servers */
|
||||
IRC_WriteStrServersPrefix( Client, Origin, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args );
|
||||
IRC_WriteStrChannelPrefix( Client, Channel, Origin, FALSE, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args );
|
||||
IRC_WriteStrChannelPrefix( Client, Channel, Origin, false, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( use_servermode ) Origin = Client_ThisServer();
|
||||
|
||||
/* Send reply to client and inform other servers and channel users */
|
||||
ok = IRC_WriteStrClientPrefix( Client, Origin, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args );
|
||||
IRC_WriteStrServersPrefix( Client, Origin, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args );
|
||||
IRC_WriteStrChannelPrefix( Client, Channel, Origin, FALSE, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args );
|
||||
IRC_WriteStrChannelPrefix( Client, Channel, Origin, false, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -604,7 +607,7 @@ chan_exit:
|
||||
} /* Channel_Mode */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_AWAY( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
@@ -631,11 +634,11 @@ IRC_AWAY( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_AWAY */
|
||||
|
||||
|
||||
LOCAL BOOLEAN
|
||||
Add_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern )
|
||||
static bool
|
||||
Add_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
|
||||
{
|
||||
CHAR *mask;
|
||||
BOOLEAN already;
|
||||
char *mask;
|
||||
bool already;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Channel != NULL );
|
||||
@@ -643,21 +646,23 @@ Add_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern )
|
||||
|
||||
mask = Lists_MakeMask( Pattern );
|
||||
|
||||
already = Lists_IsInviteEntry( mask, Channel );
|
||||
|
||||
if( ! Lists_AddInvited( mask, Channel, FALSE )) return CONNECTED;
|
||||
|
||||
if(( Client_Type( Prefix ) == CLIENT_SERVER ) && ( already == TRUE )) return CONNECTED;
|
||||
already = Lists_CheckDupeMask(Channel_GetListInvites(Channel), mask );
|
||||
if (!already) {
|
||||
if( ! Channel_AddInvite(Channel, mask, false ))
|
||||
return CONNECTED;
|
||||
}
|
||||
if ( already && ( Client_Type( Prefix ) == CLIENT_SERVER ))
|
||||
return CONNECTED;
|
||||
|
||||
return Send_ListChange( "+I", Prefix, Client, Channel, mask );
|
||||
} /* Add_Invite */
|
||||
|
||||
|
||||
LOCAL BOOLEAN
|
||||
Add_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern )
|
||||
static bool
|
||||
Add_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
|
||||
{
|
||||
CHAR *mask;
|
||||
BOOLEAN already;
|
||||
char *mask;
|
||||
bool already;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Channel != NULL );
|
||||
@@ -665,65 +670,67 @@ Add_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern )
|
||||
|
||||
mask = Lists_MakeMask( Pattern );
|
||||
|
||||
already = Lists_IsBanEntry( mask, Channel );
|
||||
|
||||
if( ! Lists_AddBanned( mask, Channel )) return CONNECTED;
|
||||
|
||||
if(( Client_Type( Prefix ) == CLIENT_SERVER ) && ( already == TRUE )) return CONNECTED;
|
||||
already = Lists_CheckDupeMask(Channel_GetListBans(Channel), mask );
|
||||
if (!already) {
|
||||
if( ! Channel_AddBan(Channel, mask))
|
||||
return CONNECTED;
|
||||
}
|
||||
if ( already && ( Client_Type( Prefix ) == CLIENT_SERVER ))
|
||||
return CONNECTED;
|
||||
|
||||
return Send_ListChange( "+b", Prefix, Client, Channel, mask );
|
||||
} /* Add_Ban */
|
||||
|
||||
|
||||
LOCAL BOOLEAN
|
||||
Del_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern )
|
||||
static bool
|
||||
Del_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
|
||||
{
|
||||
CHAR *mask;
|
||||
char *mask;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Channel != NULL );
|
||||
assert( Pattern != NULL );
|
||||
|
||||
mask = Lists_MakeMask( Pattern );
|
||||
Lists_DelInvited( mask, Channel );
|
||||
Lists_Del(Channel_GetListInvites(Channel), mask);
|
||||
return Send_ListChange( "-I", Prefix, Client, Channel, mask );
|
||||
} /* Del_Invite */
|
||||
|
||||
|
||||
LOCAL BOOLEAN
|
||||
Del_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern )
|
||||
static bool
|
||||
Del_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
|
||||
{
|
||||
CHAR *mask;
|
||||
char *mask;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Channel != NULL );
|
||||
assert( Pattern != NULL );
|
||||
|
||||
mask = Lists_MakeMask( Pattern );
|
||||
Lists_DelBanned( mask, Channel );
|
||||
Lists_Del(Channel_GetListBans(Channel), mask);
|
||||
return Send_ListChange( "-b", Prefix, Client, Channel, mask );
|
||||
} /* Del_Ban */
|
||||
|
||||
|
||||
LOCAL BOOLEAN
|
||||
Send_ListChange( CHAR *Mode, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Mask )
|
||||
static bool
|
||||
Send_ListChange( char *Mode, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Mask )
|
||||
{
|
||||
/* Bestaetigung an Client schicken & andere Server sowie Channel-User informieren */
|
||||
|
||||
BOOLEAN ok;
|
||||
bool ok;
|
||||
|
||||
if( Client_Type( Client ) == CLIENT_USER )
|
||||
{
|
||||
/* Bestaetigung an Client */
|
||||
ok = IRC_WriteStrClientPrefix( Client, Prefix, "MODE %s %s %s", Channel_Name( Channel ), Mode, Mask );
|
||||
}
|
||||
else ok = TRUE;
|
||||
else ok = true;
|
||||
|
||||
/* an andere Server */
|
||||
IRC_WriteStrServersPrefix( Client, Prefix, "MODE %s %s %s", Channel_Name( Channel ), Mode, Mask );
|
||||
|
||||
/* und lokale User im Channel */
|
||||
IRC_WriteStrChannelPrefix( Client, Channel, Prefix, FALSE, "MODE %s %s %s", Channel_Name( Channel ), Mode, Mask );
|
||||
IRC_WriteStrChannelPrefix( Client, Channel, Prefix, false, "MODE %s %s %s", Channel_Name( Channel ), Mode, Mask );
|
||||
|
||||
return ok;
|
||||
} /* Send_ListChange */
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: irc-mode.h,v 1.5 2002/12/12 12:23:43 alex Exp $
|
||||
* $Id: irc-mode.h,v 1.6 2005/03/19 18:43:48 fw Exp $
|
||||
*
|
||||
* IRC commands for mode changes (header)
|
||||
*/
|
||||
@@ -18,8 +18,8 @@
|
||||
#define __irc_mode_h__
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_MODE PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_AWAY PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_MODE PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_AWAY PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
|
||||
* Copyright (c)2001-2005 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -14,17 +14,17 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: irc-op.c,v 1.13 2004/04/09 21:41:52 alex Exp $";
|
||||
static char UNUSED id[] = "$Id: irc-op.c,v 1.17 2006/12/07 17:57:20 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "defines.h"
|
||||
#include "conn.h"
|
||||
#include "client.h"
|
||||
#include "channel.h"
|
||||
#include "defines.h"
|
||||
#include "irc-write.h"
|
||||
#include "lists.h"
|
||||
#include "log.h"
|
||||
@@ -35,7 +35,7 @@ static char UNUSED id[] = "$Id: irc-op.c,v 1.13 2004/04/09 21:41:52 alex Exp $";
|
||||
#include "irc-op.h"
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_KICK( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target, *from;
|
||||
@@ -59,12 +59,12 @@ IRC_KICK( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_KICK */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_INVITE( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CHANNEL *chan;
|
||||
CLIENT *target, *from;
|
||||
BOOLEAN remember = FALSE;
|
||||
bool remember = false;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
@@ -92,24 +92,24 @@ IRC_INVITE( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
/* Yes. The user must be channel operator! */
|
||||
if( ! strchr( Channel_UserModes( chan, from ), 'o' )) return IRC_WriteStrClient( from, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( from ), Channel_Name( chan ));
|
||||
remember = TRUE;
|
||||
remember = true;
|
||||
}
|
||||
|
||||
/* Is the target user already member of the channel? */
|
||||
if( Channel_IsMemberOf( chan, target )) return IRC_WriteStrClient( from, ERR_USERONCHANNEL_MSG, Client_ID( from ), Req->argv[0], Req->argv[1] );
|
||||
|
||||
/* If the target user is banned on that channel: remember invite */
|
||||
if( Lists_CheckBanned( target, chan )) remember = TRUE;
|
||||
if( Lists_Check(Channel_GetListBans(chan), target )) remember = true;
|
||||
|
||||
if( remember )
|
||||
{
|
||||
/* We must memember this invite */
|
||||
if( ! Lists_AddInvited( Client_Mask( target ), chan, TRUE )) return CONNECTED;
|
||||
if (remember) {
|
||||
/* We must remember this invite */
|
||||
if( ! Channel_AddInvite(chan, Client_Mask( target ), true))
|
||||
return CONNECTED;
|
||||
}
|
||||
}
|
||||
|
||||
Log( LOG_DEBUG, "User \"%s\" invites \"%s\" to \"%s\" ...", Client_Mask( from ), Req->argv[0], Req->argv[1] );
|
||||
|
||||
LogDebug("User \"%s\" invites \"%s\" to \"%s\" ...", Client_Mask(from), Req->argv[0], Req->argv[1]);
|
||||
|
||||
/* Inform target client */
|
||||
IRC_WriteStrClientPrefix( target, from, "INVITE %s %s", Req->argv[0], Req->argv[1] );
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: irc-op.h,v 1.3 2002/12/12 12:23:43 alex Exp $
|
||||
* $Id: irc-op.h,v 1.4 2005/03/19 18:43:48 fw Exp $
|
||||
*
|
||||
* Channel operator commands (header)
|
||||
*/
|
||||
@@ -18,8 +18,8 @@
|
||||
#define __irc_op_h__
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_KICK PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_INVITE PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_KICK PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_INVITE PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: irc-oper.c,v 1.17 2002/12/31 16:10:55 alex Exp $";
|
||||
static char UNUSED id[] = "$Id: irc-oper.c,v 1.29 2007/08/02 10:14:26 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
@@ -23,12 +23,13 @@ static char UNUSED id[] = "$Id: irc-oper.c,v 1.17 2002/12/31 16:10:55 alex Exp $
|
||||
|
||||
#include "ngircd.h"
|
||||
#include "resolve.h"
|
||||
#include "conn.h"
|
||||
#include "conn-func.h"
|
||||
#include "conf.h"
|
||||
#include "client.h"
|
||||
#include "channel.h"
|
||||
#include "irc-write.h"
|
||||
#include "log.h"
|
||||
#include "match.h"
|
||||
#include "messages.h"
|
||||
#include "parse.h"
|
||||
|
||||
@@ -36,10 +37,20 @@ static char UNUSED id[] = "$Id: irc-oper.c,v 1.17 2002/12/31 16:10:55 alex Exp $
|
||||
#include "irc-oper.h"
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
static bool
|
||||
Bad_OperPass(CLIENT *Client, char *errtoken, char *errmsg)
|
||||
{
|
||||
Log( LOG_WARNING, "Got invalid OPER from \"%s\": \"%s\" -- %s", Client_Mask( Client ),
|
||||
errtoken, errmsg);
|
||||
IRC_SetPenalty(Client, 3);
|
||||
return IRC_WriteStrClient( Client, ERR_PASSWDMISMATCH_MSG, Client_ID( Client ));
|
||||
}
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
IRC_OPER( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
INT i;
|
||||
unsigned int i;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
@@ -53,17 +64,15 @@ IRC_OPER( CLIENT *Client, REQUEST *Req )
|
||||
if( Conf_Oper[i].name[0] && Conf_Oper[i].pwd[0] && ( strcmp( Conf_Oper[i].name, Req->argv[0] ) == 0 )) break;
|
||||
}
|
||||
if( i >= Conf_Oper_Count )
|
||||
{
|
||||
Log( LOG_WARNING, "Got invalid OPER from \"%s\": Name \"%s\" not configured!", Client_Mask( Client ), Req->argv[0] );
|
||||
return IRC_WriteStrClient( Client, ERR_PASSWDMISMATCH_MSG, Client_ID( Client ));
|
||||
}
|
||||
return Bad_OperPass(Client, Req->argv[0], "not configured");
|
||||
|
||||
/* Stimmt das Passwort? */
|
||||
if( strcmp( Conf_Oper[i].pwd, Req->argv[1] ) != 0 )
|
||||
{
|
||||
Log( LOG_WARNING, "Got invalid OPER from \"%s\": Bad password for \"%s\"!", Client_Mask( Client ), Conf_Oper[i].name );
|
||||
return IRC_WriteStrClient( Client, ERR_PASSWDMISMATCH_MSG, Client_ID( Client ));
|
||||
}
|
||||
return Bad_OperPass(Client, Conf_Oper[i].name, "Bad password");
|
||||
|
||||
/* Authorized Mask? */
|
||||
if( Conf_Oper[i].mask && (! Match( Conf_Oper[i].mask, Client_Mask( Client ) )))
|
||||
return Bad_OperPass(Client, Conf_Oper[i].mask, "hostmask check failed" );
|
||||
|
||||
if( ! Client_HasMode( Client, 'o' ))
|
||||
{
|
||||
@@ -75,32 +84,57 @@ IRC_OPER( CLIENT *Client, REQUEST *Req )
|
||||
|
||||
if( ! Client_OperByMe( Client )) Log( LOG_NOTICE|LOG_snotice, "Got valid OPER from \"%s\", user is an IRC operator now.", Client_Mask( Client ));
|
||||
|
||||
Client_SetOperByMe( Client, TRUE );
|
||||
Client_SetOperByMe( Client, true);
|
||||
return IRC_WriteStrClient( Client, RPL_YOUREOPER_MSG, Client_ID( Client ));
|
||||
} /* IRC_OPER */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
IRC_DIE( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL bool
|
||||
IRC_DIE(CLIENT * Client, REQUEST * Req)
|
||||
{
|
||||
/* Shut down server */
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
CONN_ID c;
|
||||
CLIENT *cl;
|
||||
|
||||
assert(Client != NULL);
|
||||
assert(Req != NULL);
|
||||
|
||||
/* Not a local IRC operator? */
|
||||
if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
|
||||
|
||||
/* Bad number of parameters? */
|
||||
if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
if ((!Client_HasMode(Client, 'o')) || (!Client_OperByMe(Client)))
|
||||
return IRC_WriteStrClient(Client, ERR_NOPRIVILEGES_MSG,
|
||||
Client_ID(Client));
|
||||
|
||||
/* Bad number of parameters? */
|
||||
#ifdef STRICT_RFC
|
||||
if (Req->argc != 0)
|
||||
#else
|
||||
if (Req->argc > 1)
|
||||
#endif
|
||||
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||
Client_ID(Client), Req->command);
|
||||
|
||||
/* Is a message given? */
|
||||
if (Req->argc > 0) {
|
||||
c = Conn_First();
|
||||
while (c != NONE) {
|
||||
cl = Conn_GetClient(c);
|
||||
if (Client_Type(cl) == CLIENT_USER)
|
||||
IRC_WriteStrClient(cl, "NOTICE %s :%s",
|
||||
Client_ID(cl), Req->argv[0]);
|
||||
c = Conn_Next(c);
|
||||
}
|
||||
}
|
||||
|
||||
Log(LOG_NOTICE | LOG_snotice, "Got DIE command from \"%s\" ...",
|
||||
Client_Mask(Client));
|
||||
NGIRCd_SignalQuit = true;
|
||||
|
||||
Log( LOG_NOTICE|LOG_snotice, "Got DIE command from \"%s\" ...", Client_Mask( Client ));
|
||||
NGIRCd_SignalQuit = TRUE;
|
||||
return CONNECTED;
|
||||
} /* IRC_DIE */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_REHASH( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
/* Reload configuration file */
|
||||
@@ -115,13 +149,13 @@ IRC_REHASH( CLIENT *Client, REQUEST *Req )
|
||||
if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
Log( LOG_NOTICE|LOG_snotice, "Got REHASH command from \"%s\" ...", Client_Mask( Client ));
|
||||
NGIRCd_SignalRehash = TRUE;
|
||||
NGIRCd_SignalRehash = true;
|
||||
|
||||
return CONNECTED;
|
||||
} /* IRC_REHASH */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_RESTART( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
/* Restart IRC server (fork a new process) */
|
||||
@@ -136,45 +170,70 @@ IRC_RESTART( CLIENT *Client, REQUEST *Req )
|
||||
if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
Log( LOG_NOTICE|LOG_snotice, "Got RESTART command from \"%s\" ...", Client_Mask( Client ));
|
||||
NGIRCd_SignalRestart = TRUE;
|
||||
NGIRCd_SignalRestart = true;
|
||||
return CONNECTED;
|
||||
} /* IRC_RESTART */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
IRC_CONNECT(CLIENT *Client, REQUEST *Req )
|
||||
/**
|
||||
* Connect configured or new server.
|
||||
*/
|
||||
GLOBAL bool
|
||||
IRC_CONNECT(CLIENT * Client, REQUEST * Req)
|
||||
{
|
||||
/* Connect configured or new server */
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
assert(Client != NULL);
|
||||
assert(Req != NULL);
|
||||
|
||||
/* Not a local IRC operator? */
|
||||
if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
|
||||
if ((!Client_HasMode(Client, 'o')) || (!Client_OperByMe(Client)))
|
||||
return IRC_WriteStrClient(Client, ERR_NOPRIVILEGES_MSG,
|
||||
Client_ID(Client));
|
||||
|
||||
/* Bad number of parameters? */
|
||||
if(( Req->argc != 2 ) && ( Req->argc != 5 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
if ((Req->argc != 1) && (Req->argc != 2) && (Req->argc != 5))
|
||||
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||
Client_ID(Client), Req->command);
|
||||
|
||||
/* Invalid port number? */
|
||||
if( atoi( Req->argv[1] ) < 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
if ((Req->argc > 1) && atoi(Req->argv[1]) < 1)
|
||||
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||
Client_ID(Client), Req->command);
|
||||
|
||||
Log( LOG_NOTICE|LOG_snotice, "Got CONNECT command from \"%s\" for \"%s\".", Client_Mask( Client ), Req->argv[0]);
|
||||
Log(LOG_NOTICE | LOG_snotice,
|
||||
"Got CONNECT command from \"%s\" for \"%s\".", Client_Mask(Client),
|
||||
Req->argv[0]);
|
||||
|
||||
if( Req->argc == 2 )
|
||||
{
|
||||
switch (Req->argc) {
|
||||
case 1:
|
||||
if (!Conf_EnablePassiveServer(Req->argv[0]))
|
||||
return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
|
||||
Client_ID(Client),
|
||||
Req->argv[0]);
|
||||
break;
|
||||
case 2:
|
||||
/* Connect configured server */
|
||||
if( ! Conf_EnableServer( Req->argv[0], atoi( Req->argv[1] ))) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] );
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!Conf_EnableServer
|
||||
(Req->argv[0], (UINT16) atoi(Req->argv[1])))
|
||||
return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
|
||||
Client_ID(Client),
|
||||
Req->argv[0]);
|
||||
break;
|
||||
default:
|
||||
/* Add server */
|
||||
if( ! Conf_AddServer( Req->argv[0], atoi( Req->argv[1] ), Req->argv[2], Req->argv[3], Req->argv[4] )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] );
|
||||
if (!Conf_AddServer
|
||||
(Req->argv[0], (UINT16) atoi(Req->argv[1]), Req->argv[2],
|
||||
Req->argv[3], Req->argv[4]))
|
||||
return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
|
||||
Client_ID(Client),
|
||||
Req->argv[0]);
|
||||
}
|
||||
|
||||
return CONNECTED;
|
||||
} /* IRC_CONNECT */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_DISCONNECT(CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
/* Disconnect and disable configured server */
|
||||
@@ -199,9 +258,59 @@ IRC_DISCONNECT(CLIENT *Client, REQUEST *Req )
|
||||
if( ! Conf_DisableServer( Req->argv[0] )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] );
|
||||
|
||||
/* Are we still connected or were we killed, too? */
|
||||
if( Client_GetFromConn( my_conn )) return CONNECTED;
|
||||
if( Conn_GetClient( my_conn )) return CONNECTED;
|
||||
else return DISCONNECTED;
|
||||
} /* IRC_CONNECT */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
IRC_WALLOPS( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *to, *from;
|
||||
int client_type;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
if (Req->argc != 1)
|
||||
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command);
|
||||
|
||||
client_type = Client_Type(Client);
|
||||
switch (client_type) {
|
||||
case CLIENT_USER:
|
||||
if (!Client_OperByMe(Client))
|
||||
return IRC_WriteStrClient(Client, ERR_NOPRIVILEGES_MSG, Client_ID(Client));
|
||||
from = Client;
|
||||
break;
|
||||
case CLIENT_SERVER:
|
||||
from = Client_Search(Req->prefix);
|
||||
break;
|
||||
default:
|
||||
return CONNECTED;
|
||||
}
|
||||
|
||||
if (!from)
|
||||
return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, Client_ID(Client), Req->prefix);
|
||||
|
||||
for (to=Client_First(); to != NULL; to=Client_Next(to)) {
|
||||
if (Client_Conn(to) < 0) /* no local connection or WALLOPS origin */
|
||||
continue;
|
||||
|
||||
client_type = Client_Type(to);
|
||||
switch (client_type) {
|
||||
case CLIENT_USER:
|
||||
if (Client_HasMode(to, 'w'))
|
||||
IRC_WriteStrClientPrefix(to, from, "WALLOPS :%s", Req->argv[0]);
|
||||
break;
|
||||
case CLIENT_SERVER:
|
||||
if (to != Client)
|
||||
IRC_WriteStrClientPrefix(to, from, "WALLOPS :%s", Req->argv[0]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return CONNECTED;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* -eof- */
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: irc-oper.h,v 1.10 2002/12/31 16:11:06 alex Exp $
|
||||
* $Id: irc-oper.h,v 1.12 2007/08/02 10:14:26 fw Exp $
|
||||
*
|
||||
* IRC operator commands (header)
|
||||
*/
|
||||
@@ -18,12 +18,13 @@
|
||||
#define __irc_oper_h__
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_OPER PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_DIE PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_REHASH PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_RESTART PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_CONNECT PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_DISCONNECT PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_OPER PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_DIE PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_REHASH PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_RESTART PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_CONNECT PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_DISCONNECT PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_WALLOPS PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
* Copyright (c)2001-2007 Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: irc-server.c,v 1.36 2004/04/25 15:43:18 alex Exp $";
|
||||
static char UNUSED id[] = "$Id: irc-server.c,v 1.46 2007/11/21 12:16:36 alex Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
@@ -23,6 +23,7 @@ static char UNUSED id[] = "$Id: irc-server.c,v 1.36 2004/04/25 15:43:18 alex Exp
|
||||
#include <string.h>
|
||||
#include <strings.h>
|
||||
|
||||
#include "defines.h"
|
||||
#include "resolve.h"
|
||||
#include "conn.h"
|
||||
#include "conn-zip.h"
|
||||
@@ -34,33 +35,40 @@ static char UNUSED id[] = "$Id: irc-server.c,v 1.36 2004/04/25 15:43:18 alex Exp
|
||||
#include "log.h"
|
||||
#include "messages.h"
|
||||
#include "parse.h"
|
||||
#include "numeric.h"
|
||||
#include "ngircd.h"
|
||||
#include "irc-info.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "irc-server.h"
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
/**
|
||||
* Handler for the IRC command "SERVER".
|
||||
* See RFC 2813 section 4.1.2.
|
||||
*/
|
||||
GLOBAL bool
|
||||
IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CHAR str[LINE_LEN], *ptr, *modes, *topic;
|
||||
CLIENT *from, *c, *cl;
|
||||
CL2CHAN *cl2chan;
|
||||
INT max_hops, i;
|
||||
CHANNEL *chan;
|
||||
BOOLEAN ok;
|
||||
char str[LINE_LEN], *ptr;
|
||||
CLIENT *from, *c;
|
||||
bool ok;
|
||||
int i;
|
||||
CONN_ID con;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Fehler liefern, wenn kein lokaler Client */
|
||||
if( Client_Conn( Client ) <= NONE ) return IRC_WriteStrClient( Client, ERR_UNKNOWNCOMMAND_MSG, Client_ID( Client ), Req->command );
|
||||
/* Return an error if this is not a local client */
|
||||
if (Client_Conn(Client) <= NONE)
|
||||
return IRC_WriteStrClient(Client, ERR_UNKNOWNCOMMAND_MSG,
|
||||
Client_ID(Client), Req->command);
|
||||
|
||||
if( Client_Type( Client ) == CLIENT_GOTPASSSERVER )
|
||||
{
|
||||
/* Verbindung soll als Server-Server-Verbindung registriert werden */
|
||||
Log( LOG_DEBUG, "Connection %d: got SERVER command (new server link) ...", Client_Conn( Client ));
|
||||
if (Client_Type(Client) == CLIENT_GOTPASS) {
|
||||
/* We got a PASS command from the peer, and now a SERVER
|
||||
* command: the peer tries to register itself as a server. */
|
||||
LogDebug("Connection %d: got SERVER command (new server link) ...",
|
||||
Client_Conn(Client));
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if(( Req->argc != 2 ) && ( Req->argc != 3 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
@@ -71,14 +79,14 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
/* Server ist nicht konfiguriert! */
|
||||
Log( LOG_ERR, "Connection %d: Server \"%s\" not configured here!", Client_Conn( Client ), Req->argv[0] );
|
||||
Conn_Close( Client_Conn( Client ), NULL, "Server not configured here", TRUE );
|
||||
Conn_Close( Client_Conn( Client ), NULL, "Server not configured here", true);
|
||||
return DISCONNECTED;
|
||||
}
|
||||
if( strcmp( Client_Password( Client ), Conf_Server[i].pwd_in ) != 0 )
|
||||
{
|
||||
/* Falsches Passwort */
|
||||
Log( LOG_ERR, "Connection %d: Got bad password from server \"%s\"!", Client_Conn( Client ), Req->argv[0] );
|
||||
Conn_Close( Client_Conn( Client ), NULL, "Bad password", TRUE );
|
||||
Conn_Close( Client_Conn( Client ), NULL, "Bad password", true);
|
||||
return DISCONNECTED;
|
||||
}
|
||||
|
||||
@@ -96,12 +104,12 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
||||
if( Client_Token( Client ) != TOKEN_OUTBOUND )
|
||||
{
|
||||
/* Eingehende Verbindung: Unseren SERVER- und PASS-Befehl senden */
|
||||
ok = TRUE;
|
||||
if( ! IRC_WriteStrClient( Client, "PASS %s %s", Conf_Server[i].pwd_out, NGIRCd_ProtoID )) ok = FALSE;
|
||||
ok = true;
|
||||
if( ! IRC_WriteStrClient( Client, "PASS %s %s", Conf_Server[i].pwd_out, NGIRCd_ProtoID )) ok = false;
|
||||
else ok = IRC_WriteStrClient( Client, "SERVER %s 1 :%s", Conf_ServerName, Conf_ServerInfo );
|
||||
if( ! ok )
|
||||
{
|
||||
Conn_Close( con, "Unexpected server behavior!", NULL, FALSE );
|
||||
Conn_Close( con, "Unexpected server behavior!", NULL, false );
|
||||
return DISCONNECTED;
|
||||
}
|
||||
Client_SetIntroducer( Client, Client );
|
||||
@@ -114,10 +122,10 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
||||
Client_SetToken( Client, atoi( Req->argv[1] ));
|
||||
}
|
||||
|
||||
Log( LOG_NOTICE|LOG_snotice, "Server \"%s\" registered (connection %d, 1 hop - direct link).", Client_ID( Client ), con );
|
||||
|
||||
Client_SetType( Client, CLIENT_SERVER );
|
||||
Conf_SetServer( i, con );
|
||||
/* Mark this connection as belonging to an configured server */
|
||||
Conf_SetServer(i, con);
|
||||
|
||||
Client_SetType(Client, CLIENT_UNKNOWNSERVER);
|
||||
|
||||
#ifdef ZLIB
|
||||
/* Kompression initialisieren, wenn erforderlich */
|
||||
@@ -126,140 +134,29 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
||||
if( ! Zip_InitConn( con ))
|
||||
{
|
||||
/* Fehler! */
|
||||
Conn_Close( con, "Can't inizialize compression (zlib)!", NULL, FALSE );
|
||||
Conn_Close( con, "Can't inizialize compression (zlib)!", NULL, false );
|
||||
return DISCONNECTED;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* maximalen Hop Count ermitteln */
|
||||
max_hops = 0;
|
||||
c = Client_First( );
|
||||
while( c )
|
||||
{
|
||||
if( Client_Hops( c ) > max_hops ) max_hops = Client_Hops( c );
|
||||
c = Client_Next( c );
|
||||
}
|
||||
|
||||
/* Alle bisherigen Server dem neuen Server bekannt machen,
|
||||
* die bisherigen Server ueber den neuen informierenn */
|
||||
for( i = 0; i < ( max_hops + 1 ); i++ )
|
||||
{
|
||||
c = Client_First( );
|
||||
while( c )
|
||||
{
|
||||
if(( Client_Type( c ) == CLIENT_SERVER ) && ( c != Client ) && ( c != Client_ThisServer( )) && ( Client_Hops( c ) == i ))
|
||||
{
|
||||
if( Client_Conn( c ) > NONE )
|
||||
{
|
||||
/* Dem gefundenen Server gleich den neuen
|
||||
* Server bekannt machen */
|
||||
if( ! IRC_WriteStrClient( c, "SERVER %s %d %d :%s", Client_ID( Client ), Client_Hops( Client ) + 1, Client_MyToken( Client ), Client_Info( Client ))) return DISCONNECTED;
|
||||
}
|
||||
|
||||
/* Den neuen Server ueber den alten informieren */
|
||||
if( ! IRC_WriteStrClientPrefix( Client, Client_Hops( c ) == 1 ? Client_ThisServer( ) : Client_Introducer( c ), "SERVER %s %d %d :%s", Client_ID( c ), Client_Hops( c ) + 1, Client_MyToken( c ), Client_Info( c ))) return DISCONNECTED;
|
||||
}
|
||||
c = Client_Next( c );
|
||||
}
|
||||
}
|
||||
|
||||
/* alle User dem neuen Server bekannt machen */
|
||||
c = Client_First( );
|
||||
while( c )
|
||||
{
|
||||
if( Client_Type( c ) == CLIENT_USER )
|
||||
{
|
||||
/* User an neuen Server melden */
|
||||
if( ! IRC_WriteStrClient( Client, "NICK %s %d %s %s %d +%s :%s", Client_ID( c ), Client_Hops( c ) + 1, Client_User( c ), Client_Hostname( c ), Client_MyToken( Client_Introducer( c )), Client_Modes( c ), Client_Info( c ))) return DISCONNECTED;
|
||||
}
|
||||
c = Client_Next( c );
|
||||
}
|
||||
|
||||
/* Channels dem neuen Server bekannt machen */
|
||||
chan = Channel_First( );
|
||||
while( chan )
|
||||
{
|
||||
#ifdef IRCPLUS
|
||||
/* Send CHANINFO if the peer supports it */
|
||||
if( strchr( Client_Flags( Client ), 'C' ))
|
||||
{
|
||||
#ifdef DEBUG
|
||||
Log( LOG_DEBUG, "Sending CHANINFO commands ..." );
|
||||
if (strchr(Client_Flags(Client), 'H')) {
|
||||
LogDebug("Peer supports IRC+ extended server handshake ...");
|
||||
if (!IRC_Send_ISUPPORT(Client))
|
||||
return DISCONNECTED;
|
||||
return IRC_WriteStrClient(Client, RPL_ENDOFMOTD_MSG,
|
||||
Client_ID(Client));
|
||||
} else {
|
||||
#endif
|
||||
modes = Channel_Modes( chan );
|
||||
topic = Channel_Topic( chan );
|
||||
|
||||
if( *modes || *topic )
|
||||
{
|
||||
/* send CHANINFO */
|
||||
if(( ! strchr( Channel_Modes( chan ), 'k' )) && ( ! strchr( Channel_Modes( chan ), 'l' )) && ( ! *topic ))
|
||||
{
|
||||
/* "CHANINFO <chan> +<modes>" */
|
||||
if( ! IRC_WriteStrClient( Client, "CHANINFO %s +%s", Channel_Name( chan ), modes )) return DISCONNECTED;
|
||||
}
|
||||
else if(( ! strchr( Channel_Modes( chan ), 'k' )) && ( ! strchr( Channel_Modes( chan ), 'l' )))
|
||||
{
|
||||
/* "CHANINFO <chan> +<modes> :<topic>" */
|
||||
if( ! IRC_WriteStrClient( Client, "CHANINFO %s +%s :%s", Channel_Name( chan ), modes, topic )) return DISCONNECTED;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* "CHANINFO <chan> +<modes> <key> <limit> :<topic>" */
|
||||
if( ! IRC_WriteStrClient( Client, "CHANINFO %s +%s %s %ld :%s", Channel_Name( chan ), modes, strchr( Channel_Modes( chan ), 'k' ) ? Channel_Key( chan ) : "*", strchr( Channel_Modes( chan ), 'l' ) ? Channel_MaxUsers( chan ) : 0L, topic )) return DISCONNECTED;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* alle Member suchen */
|
||||
cl2chan = Channel_FirstMember( chan );
|
||||
snprintf( str, sizeof( str ), "NJOIN %s :", Channel_Name( chan ));
|
||||
while( cl2chan )
|
||||
{
|
||||
cl = Channel_GetClient( cl2chan );
|
||||
assert( cl != NULL );
|
||||
|
||||
/* Nick, ggf. mit Modes, anhaengen */
|
||||
if( str[strlen( str ) - 1] != ':' ) strlcat( str, ",", sizeof( str ));
|
||||
if( strchr( Channel_UserModes( chan, cl ), 'v' )) strlcat( str, "+", sizeof( str ));
|
||||
if( strchr( Channel_UserModes( chan, cl ), 'o' )) strlcat( str, "@", sizeof( str ));
|
||||
strlcat( str, Client_ID( cl ), sizeof( str ));
|
||||
|
||||
if( strlen( str ) > ( LINE_LEN - CLIENT_NICK_LEN - 8 ))
|
||||
{
|
||||
/* Zeile senden */
|
||||
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
|
||||
snprintf( str, sizeof( str ), "NJOIN %s :", Channel_Name( chan ));
|
||||
}
|
||||
|
||||
cl2chan = Channel_NextMember( chan, cl2chan );
|
||||
}
|
||||
|
||||
/* noch Daten da? */
|
||||
if( str[strlen( str ) - 1] != ':')
|
||||
{
|
||||
/* Ja; Also senden ... */
|
||||
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
|
||||
}
|
||||
|
||||
if (Conf_MaxNickLength != CLIENT_NICK_LEN_DEFAULT)
|
||||
Log(LOG_CRIT,
|
||||
"Attention: this server uses a non-standard nick length, but the peer doesn't support the IRC+ extended server handshake!");
|
||||
#ifdef IRCPLUS
|
||||
if( strchr( Client_Flags( Client ), 'L' ))
|
||||
{
|
||||
#ifdef DEBUG
|
||||
Log( LOG_DEBUG, "Synchronizing INVITE- and BAN-lists ..." );
|
||||
#endif
|
||||
/* Synchronize INVITE- and BAN-lists */
|
||||
if( ! Lists_SendInvites( Client )) return DISCONNECTED;
|
||||
if( ! Lists_SendBans( Client )) return DISCONNECTED;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* naechsten Channel suchen */
|
||||
chan = Channel_Next( chan );
|
||||
}
|
||||
|
||||
return CONNECTED;
|
||||
return IRC_Num_ENDOFMOTD(Client, Req);
|
||||
}
|
||||
else if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
@@ -280,17 +177,17 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
/* Hm, Server, der diesen einfuehrt, ist nicht bekannt!? */
|
||||
Log( LOG_ALERT, "Unknown ID in prefix of SERVER: \"%s\"! (on connection %d)", Req->prefix, Client_Conn( Client ));
|
||||
Conn_Close( Client_Conn( Client ), NULL, "Unknown ID in prefix of SERVER", TRUE );
|
||||
Conn_Close( Client_Conn( Client ), NULL, "Unknown ID in prefix of SERVER", true);
|
||||
return DISCONNECTED;
|
||||
}
|
||||
|
||||
/* Neue Client-Struktur anlegen */
|
||||
c = Client_NewRemoteServer( Client, Req->argv[0], from, atoi( Req->argv[1] ), atoi( Req->argv[2] ), ptr, TRUE );
|
||||
c = Client_NewRemoteServer( Client, Req->argv[0], from, atoi( Req->argv[1] ), atoi( Req->argv[2] ), ptr, true);
|
||||
if( ! c )
|
||||
{
|
||||
/* Neue Client-Struktur konnte nicht angelegt werden */
|
||||
Log( LOG_ALERT, "Can't create client structure for server! (on connection %d)", Client_Conn( Client ));
|
||||
Conn_Close( Client_Conn( Client ), NULL, "Can't allocate client structure for remote server", TRUE );
|
||||
Conn_Close( Client_Conn( Client ), NULL, "Can't allocate client structure for remote server", true);
|
||||
return DISCONNECTED;
|
||||
}
|
||||
|
||||
@@ -303,16 +200,17 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
||||
IRC_WriteStrServersPrefix( Client, from, "SERVER %s %d %d :%s", Client_ID( c ), Client_Hops( c ) + 1, Client_MyToken( c ), Client_Info( c ));
|
||||
|
||||
return CONNECTED;
|
||||
}
|
||||
else return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
} else
|
||||
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||
Client_ID(Client), Req->command);
|
||||
} /* IRC_SERVER */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_NJOIN( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CHAR nick_in[COMMAND_LEN], nick_out[COMMAND_LEN], *channame, *ptr, modes[8];
|
||||
BOOLEAN is_op, is_voiced;
|
||||
char nick_in[COMMAND_LEN], nick_out[COMMAND_LEN], *channame, *ptr, modes[8];
|
||||
bool is_op, is_voiced;
|
||||
CHANNEL *chan;
|
||||
CLIENT *c;
|
||||
|
||||
@@ -329,13 +227,13 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req )
|
||||
ptr = strtok( nick_in, "," );
|
||||
while( ptr )
|
||||
{
|
||||
is_op = is_voiced = FALSE;
|
||||
is_op = is_voiced = false;
|
||||
|
||||
/* Prefixe abschneiden */
|
||||
while(( *ptr == '@' ) || ( *ptr == '+' ))
|
||||
{
|
||||
if( *ptr == '@' ) is_op = TRUE;
|
||||
if( *ptr == '+' ) is_voiced = TRUE;
|
||||
if( *ptr == '@' ) is_op = true;
|
||||
if( *ptr == '+' ) is_voiced = true;
|
||||
ptr++;
|
||||
}
|
||||
|
||||
@@ -350,14 +248,14 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req )
|
||||
if( is_voiced ) Channel_UserModeAdd( chan, c, 'v' );
|
||||
|
||||
/* im Channel bekannt machen */
|
||||
IRC_WriteStrChannelPrefix( Client, chan, c, FALSE, "JOIN :%s", channame );
|
||||
IRC_WriteStrChannelPrefix( Client, chan, c, false, "JOIN :%s", channame );
|
||||
|
||||
/* Channel-User-Modes setzen */
|
||||
strlcpy( modes, Channel_UserModes( chan, c ), sizeof( modes ));
|
||||
if( modes[0] )
|
||||
{
|
||||
/* Modes im Channel bekannt machen */
|
||||
IRC_WriteStrChannelPrefix( Client, chan, Client, FALSE, "MODE %s +%s %s", channame, modes, Client_ID( c ));
|
||||
IRC_WriteStrChannelPrefix( Client, chan, Client, false, "MODE %s +%s %s", channame, modes, Client_ID( c ));
|
||||
}
|
||||
|
||||
if( nick_out[0] != '\0' ) strlcat( nick_out, ",", sizeof( nick_out ));
|
||||
@@ -378,11 +276,11 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_NJOIN */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_SQUIT( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target;
|
||||
CHAR msg[LINE_LEN + 64];
|
||||
char msg[LINE_LEN + 64];
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
@@ -410,14 +308,14 @@ IRC_SQUIT( CLIENT *Client, REQUEST *Req )
|
||||
if( Client_Conn( target ) > NONE )
|
||||
{
|
||||
/* dieser Server hat die Connection */
|
||||
if( Req->argv[1][0] ) Conn_Close( Client_Conn( target ), msg, Req->argv[1], TRUE );
|
||||
else Conn_Close( Client_Conn( target ), msg, NULL, TRUE );
|
||||
if( Req->argv[1][0] ) Conn_Close( Client_Conn( target ), msg, Req->argv[1], true);
|
||||
else Conn_Close( Client_Conn( target ), msg, NULL, true);
|
||||
return DISCONNECTED;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Verbindung hielt anderer Server */
|
||||
Client_Destroy( target, msg, Req->argv[1], FALSE );
|
||||
Client_Destroy( target, msg, Req->argv[1], false );
|
||||
return CONNECTED;
|
||||
}
|
||||
} /* IRC_SQUIT */
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: irc-server.h,v 1.4 2002/12/12 12:23:43 alex Exp $
|
||||
* $Id: irc-server.h,v 1.6 2007/11/21 12:16:36 alex Exp $
|
||||
*
|
||||
* IRC commands for server links (header)
|
||||
*/
|
||||
@@ -18,9 +18,11 @@
|
||||
#define __irc_server_h__
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_SERVER PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_NJOIN PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_SQUIT PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_SERVER PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_NJOIN PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_SQUIT PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
GLOBAL bool IRC_ENDOFMOTD_Server PARAMS((CLIENT *Client));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
* Copyright (c)2001-2005 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -14,18 +14,22 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: irc-write.c,v 1.15 2003/11/05 23:24:48 alex Exp $";
|
||||
static char UNUSED id[] = "$Id: irc-write.c,v 1.21 2006/08/12 11:56:24 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <stdarg.h>
|
||||
#ifdef PROTOTYPES
|
||||
# include <stdarg.h>
|
||||
#else
|
||||
# include <varargs.h>
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "defines.h"
|
||||
#include "conn-func.h"
|
||||
#include "client.h"
|
||||
#include "channel.h"
|
||||
#include "defines.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "irc-write.h"
|
||||
@@ -35,22 +39,22 @@ static char UNUSED id[] = "$Id: irc-write.c,v 1.15 2003/11/05 23:24:48 alex Exp
|
||||
#define SEND_TO_SERVER 2
|
||||
|
||||
|
||||
LOCAL CHAR *Get_Prefix PARAMS(( CLIENT *Target, CLIENT *Client ));
|
||||
static char *Get_Prefix PARAMS(( CLIENT *Target, CLIENT *Client ));
|
||||
|
||||
|
||||
#ifdef PROTOTYPES
|
||||
GLOBAL BOOLEAN
|
||||
IRC_WriteStrClient( CLIENT *Client, CHAR *Format, ... )
|
||||
GLOBAL bool
|
||||
IRC_WriteStrClient( CLIENT *Client, char *Format, ... )
|
||||
#else
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_WriteStrClient( Client, Format, va_alist )
|
||||
CLIENT *Client;
|
||||
CHAR *Format;
|
||||
char *Format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
CHAR buffer[1000];
|
||||
BOOLEAN ok = CONNECTED;
|
||||
char buffer[1000];
|
||||
bool ok = CONNECTED;
|
||||
va_list ap;
|
||||
|
||||
assert( Client != NULL );
|
||||
@@ -72,20 +76,20 @@ va_dcl
|
||||
|
||||
|
||||
#ifdef PROTOTYPES
|
||||
GLOBAL BOOLEAN
|
||||
IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, CHAR *Format, ... )
|
||||
GLOBAL bool
|
||||
IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, char *Format, ... )
|
||||
#else
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_WriteStrClientPrefix( Client, Prefix, Format, va_alist )
|
||||
CLIENT *Client;
|
||||
CLIENT *Prefix;
|
||||
CHAR *Format;
|
||||
char *Format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
/* Text an Clients, lokal bzw. remote, senden. */
|
||||
|
||||
CHAR buffer[1000];
|
||||
char buffer[1000];
|
||||
va_list ap;
|
||||
|
||||
assert( Client != NULL );
|
||||
@@ -105,19 +109,19 @@ va_dcl
|
||||
|
||||
|
||||
#ifdef PROTOTYPES
|
||||
GLOBAL BOOLEAN
|
||||
IRC_WriteStrChannel( CLIENT *Client, CHANNEL *Chan, BOOLEAN Remote, CHAR *Format, ... )
|
||||
GLOBAL bool
|
||||
IRC_WriteStrChannel( CLIENT *Client, CHANNEL *Chan, bool Remote, char *Format, ... )
|
||||
#else
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_WriteStrChannel( Client, Chan, Remote, Format, va_alist )
|
||||
CLIENT *Client;
|
||||
CHANNEL *Chan;
|
||||
BOOLEAN Remote;
|
||||
CHAR *Format;
|
||||
bool Remote;
|
||||
char *Format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
CHAR buffer[1000];
|
||||
char buffer[1000];
|
||||
va_list ap;
|
||||
|
||||
assert( Client != NULL );
|
||||
@@ -136,21 +140,21 @@ va_dcl
|
||||
|
||||
|
||||
#ifdef PROTOTYPES
|
||||
GLOBAL BOOLEAN
|
||||
IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )
|
||||
GLOBAL bool
|
||||
IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, bool Remote, char *Format, ... )
|
||||
#else
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_WriteStrChannelPrefix( Client, Chan, Prefix, Remote, Format, va_alist )
|
||||
CLIENT *Client;
|
||||
CHANNEL *Chan;
|
||||
CLIENT *Prefix;
|
||||
BOOLEAN Remote;
|
||||
CHAR *Format;
|
||||
bool Remote;
|
||||
char *Format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
BOOLEAN ok = CONNECTED;
|
||||
CHAR buffer[1000];
|
||||
bool ok = CONNECTED;
|
||||
char buffer[1000];
|
||||
CL2CHAN *cl2chan;
|
||||
CONN_ID conn;
|
||||
CLIENT *c;
|
||||
@@ -212,17 +216,17 @@ va_dcl
|
||||
|
||||
|
||||
#ifdef PROTOTYPES
|
||||
GLOBAL VOID
|
||||
IRC_WriteStrServers( CLIENT *ExceptOf, CHAR *Format, ... )
|
||||
GLOBAL void
|
||||
IRC_WriteStrServers( CLIENT *ExceptOf, char *Format, ... )
|
||||
#else
|
||||
GLOBAL VOID
|
||||
GLOBAL void
|
||||
IRC_WriteStrServers( ExceptOf, Format, va_alist )
|
||||
CLIENT *ExceptOf;
|
||||
CHAR *Format;
|
||||
char *Format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
CHAR buffer[1000];
|
||||
char buffer[1000];
|
||||
va_list ap;
|
||||
|
||||
assert( Format != NULL );
|
||||
@@ -241,18 +245,18 @@ va_dcl
|
||||
|
||||
|
||||
#ifdef PROTOTYPES
|
||||
GLOBAL VOID
|
||||
IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *Format, ... )
|
||||
GLOBAL void
|
||||
IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, char *Format, ... )
|
||||
#else
|
||||
GLOBAL VOID
|
||||
GLOBAL void
|
||||
IRC_WriteStrServersPrefix( ExceptOf, Prefix, Format, va_alist )
|
||||
CLIENT *ExceptOf;
|
||||
CLIENT *Prefix;
|
||||
CHAR *Format;
|
||||
char *Format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
CHAR buffer[1000];
|
||||
char buffer[1000];
|
||||
va_list ap;
|
||||
|
||||
assert( Format != NULL );
|
||||
@@ -271,19 +275,19 @@ va_dcl
|
||||
|
||||
|
||||
#ifdef PROTOTYPES
|
||||
GLOBAL VOID
|
||||
IRC_WriteStrServersPrefixFlag( CLIENT *ExceptOf, CLIENT *Prefix, CHAR Flag, CHAR *Format, ... )
|
||||
GLOBAL void
|
||||
IRC_WriteStrServersPrefixFlag( CLIENT *ExceptOf, CLIENT *Prefix, char Flag, char *Format, ... )
|
||||
#else
|
||||
GLOBAL VOID
|
||||
GLOBAL void
|
||||
IRC_WriteStrServersPrefixFlag( ExceptOf, Prefix, Flag, Format, va_alist )
|
||||
CLIENT *ExceptOf;
|
||||
CLIENT *Prefix;
|
||||
CHAR Flag;
|
||||
CHAR *Format;
|
||||
char Flag;
|
||||
char *Format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
CHAR buffer[1000];
|
||||
char buffer[1000];
|
||||
CLIENT *c;
|
||||
va_list ap;
|
||||
|
||||
@@ -312,21 +316,21 @@ va_dcl
|
||||
|
||||
|
||||
#ifdef PROTOTYPES
|
||||
GLOBAL BOOLEAN
|
||||
IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )
|
||||
GLOBAL bool
|
||||
IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, bool Remote, char *Format, ... )
|
||||
#else
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_WriteStrRelatedPrefix( Client, Prefix, Remote, Format, va_alist )
|
||||
CLIENT *Client;
|
||||
CLIENT *Prefix;
|
||||
BOOLEAN Remote;
|
||||
CHAR *Format;
|
||||
bool Remote;
|
||||
char *Format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
BOOLEAN ok = CONNECTED;
|
||||
bool ok = CONNECTED;
|
||||
CL2CHAN *chan_cl2chan, *cl2chan;
|
||||
CHAR buffer[1000];
|
||||
char buffer[1000];
|
||||
CHANNEL *chan;
|
||||
CONN_ID conn;
|
||||
va_list ap;
|
||||
@@ -374,7 +378,7 @@ va_dcl
|
||||
}
|
||||
cl2chan = Channel_NextMember( chan, cl2chan );
|
||||
}
|
||||
|
||||
|
||||
/* naechsten Channel */
|
||||
chan_cl2chan = Channel_NextChannelOf( Client, chan_cl2chan );
|
||||
}
|
||||
@@ -395,22 +399,23 @@ va_dcl
|
||||
} /* IRC_WriteStrRelatedPrefix */
|
||||
|
||||
|
||||
GLOBAL VOID
|
||||
IRC_SetPenalty( CLIENT *Client, INT Seconds )
|
||||
GLOBAL void
|
||||
IRC_SetPenalty( CLIENT *Client, time_t Seconds )
|
||||
{
|
||||
CONN_ID c;
|
||||
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Seconds > 0 );
|
||||
|
||||
|
||||
if( Client_Type( Client ) == CLIENT_SERVER ) return;
|
||||
|
||||
|
||||
c = Client_Conn( Client );
|
||||
if( c > NONE ) Conn_SetPenalty( c, Seconds );
|
||||
if (c > NONE)
|
||||
Conn_SetPenalty(c, Seconds);
|
||||
} /* IRC_SetPenalty */
|
||||
|
||||
|
||||
LOCAL CHAR *
|
||||
static char *
|
||||
Get_Prefix( CLIENT *Target, CLIENT *Client )
|
||||
{
|
||||
assert( Target != NULL );
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: irc-write.h,v 1.6 2003/11/05 23:24:48 alex Exp $
|
||||
* $Id: irc-write.h,v 1.8 2006/05/10 21:24:01 alex Exp $
|
||||
*
|
||||
* Sending IRC commands over the network (header)
|
||||
*/
|
||||
@@ -18,19 +18,19 @@
|
||||
#define __irc_write_h__
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrClient PARAMS(( CLIENT *Client, CHAR *Format, ... ));
|
||||
GLOBAL BOOLEAN IRC_WriteStrClientPrefix PARAMS(( CLIENT *Client, CLIENT *Prefix, CHAR *Format, ... ));
|
||||
GLOBAL bool IRC_WriteStrClient PARAMS(( CLIENT *Client, char *Format, ... ));
|
||||
GLOBAL bool IRC_WriteStrClientPrefix PARAMS(( CLIENT *Client, CLIENT *Prefix, char *Format, ... ));
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrChannel PARAMS(( CLIENT *Client, CHANNEL *Chan, BOOLEAN Remote, CHAR *Format, ... ));
|
||||
GLOBAL BOOLEAN IRC_WriteStrChannelPrefix PARAMS(( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... ));
|
||||
GLOBAL bool IRC_WriteStrChannel PARAMS(( CLIENT *Client, CHANNEL *Chan, bool Remote, char *Format, ... ));
|
||||
GLOBAL bool IRC_WriteStrChannelPrefix PARAMS(( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, bool Remote, char *Format, ... ));
|
||||
|
||||
GLOBAL VOID IRC_WriteStrServers PARAMS(( CLIENT *ExceptOf, CHAR *Format, ... ));
|
||||
GLOBAL VOID IRC_WriteStrServersPrefix PARAMS(( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *Format, ... ));
|
||||
GLOBAL VOID IRC_WriteStrServersPrefixFlag PARAMS(( CLIENT *ExceptOf, CLIENT *Prefix, CHAR Flag, CHAR *Format, ... ));
|
||||
GLOBAL void IRC_WriteStrServers PARAMS(( CLIENT *ExceptOf, char *Format, ... ));
|
||||
GLOBAL void IRC_WriteStrServersPrefix PARAMS(( CLIENT *ExceptOf, CLIENT *Prefix, char *Format, ... ));
|
||||
GLOBAL void IRC_WriteStrServersPrefixFlag PARAMS(( CLIENT *ExceptOf, CLIENT *Prefix, char Flag, char *Format, ... ));
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrRelatedPrefix PARAMS(( CLIENT *Client, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... ));
|
||||
GLOBAL bool IRC_WriteStrRelatedPrefix PARAMS(( CLIENT *Client, CLIENT *Prefix, bool Remote, char *Format, ... ));
|
||||
|
||||
GLOBAL VOID IRC_SetPenalty PARAMS(( CLIENT *Client, INT Seconds ));
|
||||
GLOBAL void IRC_SetPenalty PARAMS(( CLIENT *Client, time_t Seconds ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
151
src/ngircd/irc.c
151
src/ngircd/irc.c
@@ -14,7 +14,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: irc.c,v 1.124 2004/02/28 02:18:16 alex Exp $";
|
||||
static char UNUSED id[] = "$Id: irc.c,v 1.131 2006/07/23 14:55:40 alex Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
@@ -22,10 +22,9 @@ static char UNUSED id[] = "$Id: irc.c,v 1.124 2004/02/28 02:18:16 alex Exp $";
|
||||
#include <string.h>
|
||||
|
||||
#include "ngircd.h"
|
||||
#include "conn.h"
|
||||
#include "resolve.h"
|
||||
#include "conf.h"
|
||||
#include "conn-func.h"
|
||||
#include "conf.h"
|
||||
#include "client.h"
|
||||
#include "channel.h"
|
||||
#include "defines.h"
|
||||
@@ -38,10 +37,10 @@ static char UNUSED id[] = "$Id: irc.c,v 1.124 2004/02/28 02:18:16 alex Exp $";
|
||||
#include "irc.h"
|
||||
|
||||
|
||||
LOCAL CHAR *Option_String PARAMS(( CONN_ID Idx ));
|
||||
static char *Option_String PARAMS(( CONN_ID Idx ));
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_ERROR( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
@@ -54,88 +53,120 @@ IRC_ERROR( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_ERROR */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
/**
|
||||
* Kill client on request.
|
||||
* This function implements the IRC command "KILL" wich is used to selectively
|
||||
* disconnect clients. It can be used by IRC operators and servers, for example
|
||||
* to "solve" nick collisions after netsplits.
|
||||
* Please note that this function is also called internally, without a real
|
||||
* KILL command beeing received over the network! Client is Client_ThisServer()
|
||||
* in this case. */
|
||||
GLOBAL bool
|
||||
IRC_KILL( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *prefix, *c;
|
||||
CHAR reason[COMMAND_LEN];
|
||||
char reason[COMMAND_LEN], *msg;
|
||||
CONN_ID my_conn, conn;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Is the user an IRC operator? */
|
||||
if(( Client_Type( Client ) != CLIENT_SERVER ) && ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
|
||||
if(( Client_Type( Client ) != CLIENT_SERVER ) &&
|
||||
( ! Client_OperByMe( Client )))
|
||||
{
|
||||
/* The originator of the KILL is neither an IRC operator of
|
||||
* this server nor a server. */
|
||||
return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG,
|
||||
Client_ID( Client ));
|
||||
}
|
||||
|
||||
/* Bad number of parameters? */
|
||||
if(( Req->argc != 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
if( Req->argc != 2 )
|
||||
{
|
||||
/* This command requires exactly 2 parameters! */
|
||||
return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG,
|
||||
Client_ID( Client ), Req->command );
|
||||
}
|
||||
|
||||
if( Req->prefix ) prefix = Client_Search( Req->prefix );
|
||||
else prefix = Client;
|
||||
if( ! prefix )
|
||||
{
|
||||
Log( LOG_WARNING, "Got KILL with invalid prefix: \"%s\"!", Req->prefix );
|
||||
Log( LOG_WARNING, "Got KILL with invalid prefix: \"%s\"!",
|
||||
Req->prefix );
|
||||
prefix = Client_ThisServer( );
|
||||
}
|
||||
|
||||
if( Client != Client_ThisServer( )) Log( LOG_NOTICE|LOG_snotice, "Got KILL command from \"%s\" for \"%s\": %s", Client_Mask( prefix ), Req->argv[0], Req->argv[1] );
|
||||
if( Client != Client_ThisServer( ))
|
||||
{
|
||||
/* This is a "real" KILL received from the network. */
|
||||
Log( LOG_NOTICE|LOG_snotice, "Got KILL command from \"%s\" for \"%s\": %s",
|
||||
Client_Mask( prefix ), Req->argv[0], Req->argv[1] );
|
||||
}
|
||||
|
||||
/* Build reason string */
|
||||
if( Client_Type( Client ) == CLIENT_USER ) snprintf( reason, sizeof( reason ), "KILLed by %s: %s", Client_ID( Client ), Req->argv[1] );
|
||||
else strlcpy( reason, Req->argv[1], sizeof( reason ));
|
||||
if( Client_Type( Client ) == CLIENT_USER )
|
||||
{
|
||||
/* Prefix the "reason" if the originator is a regular user,
|
||||
* so users can't spoof KILLs of servers. */
|
||||
snprintf( reason, sizeof( reason ), "KILLed by %s: %s",
|
||||
Client_ID( Client ), Req->argv[1] );
|
||||
}
|
||||
else
|
||||
strlcpy( reason, Req->argv[1], sizeof( reason ));
|
||||
|
||||
/* Inform other servers */
|
||||
IRC_WriteStrServersPrefix( Client, prefix, "KILL %s :%s", Req->argv[0], reason );
|
||||
IRC_WriteStrServersPrefix( Client, prefix, "KILL %s :%s",
|
||||
Req->argv[0], reason );
|
||||
|
||||
/* Save ID of this connection */
|
||||
my_conn = Client_Conn( Client );
|
||||
|
||||
|
||||
/* Do we host such a client? */
|
||||
c = Client_Search( Req->argv[0] );
|
||||
if( c )
|
||||
{
|
||||
/* Yes, there is such a client -- but is it a valid user? */
|
||||
if( Client_Type( c ) == CLIENT_SERVER )
|
||||
if(( Client_Type( c ) != CLIENT_USER ) &&
|
||||
( Client_Type( c ) != CLIENT_GOTNICK ))
|
||||
{
|
||||
if( Client != Client_ThisServer( )) IRC_WriteStrClient( Client, ERR_CANTKILLSERVER_MSG, Client_ID( Client ));
|
||||
else
|
||||
/* Target of this KILL is not a regular user, this is
|
||||
* invalid! So we ignore this case if we received a
|
||||
* regular KILL from the network and try to kill the
|
||||
* client/connection anyway (but log an error!) if the
|
||||
* origin is the local server. */
|
||||
|
||||
if( Client != Client_ThisServer( ))
|
||||
{
|
||||
/* Oops, I should kill another server!? */
|
||||
Log( LOG_ERR, "Can't KILL server \"%s\"!", Req->argv[0] );
|
||||
conn = Client_Conn( Client_NextHop( c ));
|
||||
assert( conn > NONE );
|
||||
Conn_Close( conn, NULL, "Nick collision for server!?", TRUE );
|
||||
/* Invalid KILL received from remote */
|
||||
if( Client_Type( c ) == CLIENT_SERVER )
|
||||
msg = ERR_CANTKILLSERVER_MSG;
|
||||
else
|
||||
msg = ERR_NOPRIVILEGES_MSG;
|
||||
return IRC_WriteStrClient( Client, msg,
|
||||
Client_ID( Client ));
|
||||
}
|
||||
|
||||
Log( LOG_ERR, "Got KILL for invalid client type: %d, \"%s\"!",
|
||||
Client_Type( c ), Req->argv[0] );
|
||||
}
|
||||
else if( Client_Type( c ) != CLIENT_USER )
|
||||
{
|
||||
if( Client != Client_ThisServer( )) IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
|
||||
else
|
||||
{
|
||||
/* Oops, what sould I close?? */
|
||||
Log( LOG_ERR, "Can't KILL \"%s\": invalid client type!", Req->argv[0] );
|
||||
conn = Client_Conn( Client_NextHop( c ));
|
||||
assert( conn > NONE );
|
||||
Conn_Close( conn, NULL, "Collision for invalid client type!?", TRUE );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Kill user NOW! */
|
||||
conn = Client_Conn( c );
|
||||
Client_Destroy( c, NULL, reason, FALSE );
|
||||
if( conn != NONE ) Conn_Close( conn, NULL, reason, TRUE );
|
||||
}
|
||||
|
||||
/* Kill client NOW! */
|
||||
conn = Client_Conn( c );
|
||||
Client_Destroy( c, NULL, reason, false );
|
||||
if( conn > NONE )
|
||||
Conn_Close( conn, NULL, reason, true );
|
||||
}
|
||||
else Log( LOG_NOTICE, "Client with nick \"%s\" is unknown here.", Req->argv[0] );
|
||||
else
|
||||
Log( LOG_NOTICE, "Client with nick \"%s\" is unknown here.", Req->argv[0] );
|
||||
|
||||
/* Are we still connected or were we killed, too? */
|
||||
if(( my_conn > NONE ) && ( Client_GetFromConn( my_conn ))) return CONNECTED;
|
||||
else return DISCONNECTED;
|
||||
if(( my_conn > NONE ) && ( Conn_GetClient( my_conn )))
|
||||
return CONNECTED;
|
||||
else
|
||||
return DISCONNECTED;
|
||||
} /* IRC_KILL */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_NOTICE( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *to, *from;
|
||||
@@ -162,7 +193,7 @@ IRC_NOTICE( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_NOTICE */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_PRIVMSG( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *cl, *from;
|
||||
@@ -205,12 +236,12 @@ IRC_PRIVMSG( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_PRIVMSG */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_TRACE( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *from, *target, *c;
|
||||
CONN_ID idx, idx2;
|
||||
CHAR user[CLIENT_USER_LEN];
|
||||
char user[CLIENT_USER_LEN];
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
@@ -270,7 +301,7 @@ IRC_TRACE( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_TRACE */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
GLOBAL bool
|
||||
IRC_HELP( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
COMMAND *cmd;
|
||||
@@ -293,17 +324,19 @@ IRC_HELP( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_HELP */
|
||||
|
||||
|
||||
LOCAL CHAR *
|
||||
static char *
|
||||
Option_String( CONN_ID Idx )
|
||||
{
|
||||
STATIC CHAR option_txt[8];
|
||||
INT options;
|
||||
static char option_txt[8];
|
||||
UINT16 options;
|
||||
|
||||
options = Conn_Options( Idx );
|
||||
options = Conn_Options(Idx);
|
||||
|
||||
strcpy( option_txt, "F" ); /* No idea what this means but the original ircd sends it ... */
|
||||
strcpy(option_txt, "F"); /* No idea what this means, but the
|
||||
* original ircd sends it ... */
|
||||
#ifdef ZLIB
|
||||
if( options & CONN_ZIP ) strcat( option_txt, "z" );
|
||||
if(options & CONN_ZIP) /* zlib compression supported. */
|
||||
strcat(option_txt, "z");
|
||||
#endif
|
||||
|
||||
return option_txt;
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: irc.h,v 1.38 2003/01/15 13:49:20 alex Exp $
|
||||
* $Id: irc.h,v 1.39 2005/03/19 18:43:49 fw Exp $
|
||||
*
|
||||
* IRC commands (header)
|
||||
*/
|
||||
@@ -18,12 +18,12 @@
|
||||
#define __irc_h__
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_ERROR PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_KILL PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_NOTICE PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_PRIVMSG PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_TRACE PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL BOOLEAN IRC_HELP PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_ERROR PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_KILL PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_NOTICE PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_PRIVMSG PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_TRACE PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_HELP PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
* Copyright (c)2001-2005 Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: lists.c,v 1.15 2004/04/25 15:40:19 alex Exp $";
|
||||
static char UNUSED id[] = "$Id: lists.c,v 1.21 2007/01/29 21:13:26 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
@@ -35,337 +35,143 @@ static char UNUSED id[] = "$Id: lists.c,v 1.15 2004/04/25 15:40:19 alex Exp $";
|
||||
#include "exp.h"
|
||||
#include "lists.h"
|
||||
|
||||
#define MASK_LEN (2*CLIENT_HOST_LEN)
|
||||
|
||||
#define MASK_LEN 2*CLIENT_HOST_LEN
|
||||
struct list_elem {
|
||||
struct list_elem *next;
|
||||
char mask[MASK_LEN];
|
||||
bool onlyonce;
|
||||
};
|
||||
|
||||
|
||||
typedef struct _C2C
|
||||
GLOBAL const char *
|
||||
Lists_GetMask(const struct list_elem *e)
|
||||
{
|
||||
struct _C2C *next;
|
||||
CHAR mask[MASK_LEN];
|
||||
CHANNEL *channel;
|
||||
BOOLEAN onlyonce;
|
||||
} C2C;
|
||||
return e->mask;
|
||||
}
|
||||
|
||||
|
||||
LOCAL C2C *My_Invites, *My_Bans;
|
||||
|
||||
|
||||
LOCAL C2C *New_C2C PARAMS(( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce ));
|
||||
|
||||
LOCAL BOOLEAN Check_List PARAMS(( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan ));
|
||||
LOCAL BOOLEAN Already_Registered PARAMS(( C2C *Cl2Chan, CHAR *Mask, CHANNEL *Chan ));
|
||||
|
||||
|
||||
|
||||
GLOBAL VOID
|
||||
Lists_Init( VOID )
|
||||
GLOBAL struct list_elem*
|
||||
Lists_GetFirst(const struct list_head *h)
|
||||
{
|
||||
/* Modul initialisieren */
|
||||
|
||||
My_Invites = My_Bans = NULL;
|
||||
} /* Lists_Init */
|
||||
return h->first;
|
||||
}
|
||||
|
||||
|
||||
GLOBAL VOID
|
||||
Lists_Exit( VOID )
|
||||
GLOBAL struct list_elem*
|
||||
Lists_GetNext(const struct list_elem *e)
|
||||
{
|
||||
/* Modul abmelden */
|
||||
return e->next;
|
||||
}
|
||||
|
||||
C2C *c2c, *next;
|
||||
|
||||
/* Invite-Lists freigeben */
|
||||
c2c = My_Invites;
|
||||
while( c2c )
|
||||
{
|
||||
next = c2c->next;
|
||||
free( c2c );
|
||||
c2c = next;
|
||||
bool
|
||||
Lists_Add(struct list_head *header, const char *Mask, bool OnlyOnce )
|
||||
{
|
||||
struct list_elem *e, *newelem;
|
||||
|
||||
assert( header != NULL );
|
||||
assert( Mask != NULL );
|
||||
|
||||
if (Lists_CheckDupeMask(header, Mask )) return true;
|
||||
|
||||
e = Lists_GetFirst(header);
|
||||
|
||||
newelem = malloc(sizeof(struct list_elem));
|
||||
if( ! newelem ) {
|
||||
Log( LOG_EMERG, "Can't allocate memory for new Ban/Invite entry!" );
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Ban-Lists freigeben */
|
||||
c2c = My_Bans;
|
||||
while( c2c )
|
||||
{
|
||||
next = c2c->next;
|
||||
free( c2c );
|
||||
c2c = next;
|
||||
}
|
||||
} /* Lists_Exit */
|
||||
strlcpy( newelem->mask, Mask, sizeof( newelem->mask ));
|
||||
newelem->onlyonce = OnlyOnce;
|
||||
newelem->next = e;
|
||||
header->first = newelem;
|
||||
|
||||
LogDebug("Added \"%s\" to invite list", Mask);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
Lists_CheckInvited( CLIENT *Client, CHANNEL *Chan )
|
||||
static void
|
||||
Lists_Unlink(struct list_head *header, struct list_elem *p, struct list_elem *victim)
|
||||
{
|
||||
return Check_List( &My_Invites, Client, Chan );
|
||||
} /* Lists_CheckInvited */
|
||||
assert(victim != NULL);
|
||||
assert(header != NULL);
|
||||
|
||||
if (p) p->next = victim->next;
|
||||
else header->first = victim->next;
|
||||
|
||||
free(victim);
|
||||
}
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
Lists_IsInviteEntry( CHAR *Mask, CHANNEL *Chan )
|
||||
GLOBAL void
|
||||
Lists_Del(struct list_head *header, const char *Mask)
|
||||
{
|
||||
struct list_elem *e, *last, *victim;
|
||||
|
||||
assert( header != NULL );
|
||||
assert( Mask != NULL );
|
||||
assert( Chan != NULL );
|
||||
|
||||
return Already_Registered( My_Invites, Mask, Chan );
|
||||
} /* Lists_IsInviteEntry */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
Lists_AddInvited( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce )
|
||||
{
|
||||
C2C *c2c;
|
||||
|
||||
assert( Mask != NULL );
|
||||
assert( Chan != NULL );
|
||||
|
||||
if( Already_Registered( My_Invites, Mask, Chan )) return TRUE;
|
||||
|
||||
c2c = New_C2C( Mask, Chan, OnlyOnce );
|
||||
if( ! c2c )
|
||||
{
|
||||
Log( LOG_ERR, "Can't add new invite list entry!" );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* verketten */
|
||||
c2c->next = My_Invites;
|
||||
My_Invites = c2c;
|
||||
|
||||
Log( LOG_DEBUG, "Added \"%s\" to invite list for \"%s\".", Mask, Channel_Name( Chan ));
|
||||
return TRUE;
|
||||
} /* Lists_AddInvited */
|
||||
|
||||
|
||||
GLOBAL VOID
|
||||
Lists_DelInvited( CHAR *Mask, CHANNEL *Chan )
|
||||
{
|
||||
C2C *c2c, *last, *next;
|
||||
|
||||
assert( Mask != NULL );
|
||||
assert( Chan != NULL );
|
||||
|
||||
last = NULL;
|
||||
c2c = My_Invites;
|
||||
while( c2c )
|
||||
{
|
||||
next = c2c->next;
|
||||
if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 ))
|
||||
{
|
||||
/* dieser Eintrag muss geloescht werden */
|
||||
Log( LOG_DEBUG, "Deleted \"%s\" from invite list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
|
||||
if( last ) last->next = next;
|
||||
else My_Invites = next;
|
||||
free( c2c );
|
||||
e = Lists_GetFirst(header);
|
||||
while( e ) {
|
||||
if(strcasecmp( e->mask, Mask ) == 0 ) {
|
||||
LogDebug("Deleted \"%s\" from list", e->mask);
|
||||
victim = e;
|
||||
e = victim->next;
|
||||
Lists_Unlink(header, last, victim);
|
||||
continue;
|
||||
}
|
||||
else last = c2c;
|
||||
c2c = next;
|
||||
last = e;
|
||||
e = e->next;
|
||||
}
|
||||
} /* Lists_DelInvited */
|
||||
}
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
Lists_ShowInvites( CLIENT *Client, CHANNEL *Channel )
|
||||
GLOBAL void
|
||||
Lists_Free(struct list_head *head)
|
||||
{
|
||||
C2C *c2c;
|
||||
struct list_elem *e, *victim;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Channel != NULL );
|
||||
assert(head != NULL);
|
||||
|
||||
c2c = My_Invites;
|
||||
while( c2c )
|
||||
{
|
||||
if( c2c->channel == Channel )
|
||||
{
|
||||
/* Eintrag fuer Channel gefunden; ausgeben: */
|
||||
if( ! IRC_WriteStrClient( Client, RPL_INVITELIST_MSG, Client_ID( Client ), Channel_Name( Channel ), c2c->mask )) return DISCONNECTED;
|
||||
}
|
||||
c2c = c2c->next;
|
||||
e = head->first;
|
||||
head->first = NULL;
|
||||
while (e) {
|
||||
LogDebug("Deleted \"%s\" from invite list" , e->mask);
|
||||
victim = e;
|
||||
e = e->next;
|
||||
free( victim );
|
||||
}
|
||||
return IRC_WriteStrClient( Client, RPL_ENDOFINVITELIST_MSG, Client_ID( Client ), Channel_Name( Channel ));
|
||||
} /* Lists_ShowInvites */
|
||||
}
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
Lists_SendInvites( CLIENT *Client )
|
||||
GLOBAL bool
|
||||
Lists_CheckDupeMask(const struct list_head *h, const char *Mask )
|
||||
{
|
||||
C2C *c2c;
|
||||
|
||||
assert( Client != NULL );
|
||||
|
||||
c2c = My_Invites;
|
||||
while( c2c )
|
||||
{
|
||||
if( ! IRC_WriteStrClient( Client, "MODE %s +I %s", Channel_Name( c2c->channel ), c2c->mask )) return DISCONNECTED;
|
||||
c2c = c2c->next;
|
||||
struct list_elem *e;
|
||||
e = h->first;
|
||||
while (e) {
|
||||
if (strcasecmp( e->mask, Mask ) == 0 )
|
||||
return true;
|
||||
e = e->next;
|
||||
}
|
||||
return CONNECTED;
|
||||
} /* Lists_SendInvites */
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
Lists_SendBans( CLIENT *Client )
|
||||
GLOBAL char *
|
||||
Lists_MakeMask( char *Pattern )
|
||||
{
|
||||
C2C *c2c;
|
||||
|
||||
assert( Client != NULL );
|
||||
|
||||
c2c = My_Bans;
|
||||
while( c2c )
|
||||
{
|
||||
if( ! IRC_WriteStrClient( Client, "MODE %s +b %s", Channel_Name( c2c->channel ), c2c->mask )) return DISCONNECTED;
|
||||
c2c = c2c->next;
|
||||
}
|
||||
return CONNECTED;
|
||||
} /* Lists_SendBans */
|
||||
/* This function generats a valid IRC mask of "any" string. This
|
||||
* mask is only valid until the next call to Lists_MakeMask(),
|
||||
* because a single global buffer is used. You have to copy the
|
||||
* generated mask to some sane location yourself! */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
Lists_CheckBanned( CLIENT *Client, CHANNEL *Chan )
|
||||
{
|
||||
return Check_List( &My_Bans, Client, Chan );
|
||||
} /* Lists_CheckBanned */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
Lists_IsBanEntry( CHAR *Mask, CHANNEL *Chan )
|
||||
{
|
||||
assert( Mask != NULL );
|
||||
assert( Chan != NULL );
|
||||
|
||||
return Already_Registered( My_Bans, Mask, Chan );
|
||||
} /* Lists_IsBanEntry */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
Lists_AddBanned( CHAR *Mask, CHANNEL *Chan )
|
||||
{
|
||||
C2C *c2c;
|
||||
|
||||
assert( Mask != NULL );
|
||||
assert( Chan != NULL );
|
||||
|
||||
if( Already_Registered( My_Bans, Mask, Chan )) return TRUE;
|
||||
|
||||
c2c = New_C2C( Mask, Chan, FALSE );
|
||||
if( ! c2c )
|
||||
{
|
||||
Log( LOG_ERR, "Can't add new ban list entry!" );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* verketten */
|
||||
c2c->next = My_Bans;
|
||||
My_Bans = c2c;
|
||||
|
||||
Log( LOG_DEBUG, "Added \"%s\" to ban list for \"%s\".", Mask, Channel_Name( Chan ));
|
||||
return TRUE;
|
||||
} /* Lists_AddBanned */
|
||||
|
||||
|
||||
GLOBAL VOID
|
||||
Lists_DelBanned( CHAR *Mask, CHANNEL *Chan )
|
||||
{
|
||||
C2C *c2c, *last, *next;
|
||||
|
||||
assert( Mask != NULL );
|
||||
assert( Chan != NULL );
|
||||
|
||||
last = NULL;
|
||||
c2c = My_Bans;
|
||||
while( c2c )
|
||||
{
|
||||
next = c2c->next;
|
||||
if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 ))
|
||||
{
|
||||
/* dieser Eintrag muss geloescht werden */
|
||||
Log( LOG_DEBUG, "Deleted \"%s\" from ban list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
|
||||
if( last ) last->next = next;
|
||||
else My_Bans = next;
|
||||
free( c2c );
|
||||
}
|
||||
else last = c2c;
|
||||
c2c = next;
|
||||
}
|
||||
} /* Lists_DelBanned */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
Lists_ShowBans( CLIENT *Client, CHANNEL *Channel )
|
||||
{
|
||||
C2C *c2c;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Channel != NULL );
|
||||
|
||||
c2c = My_Bans;
|
||||
while( c2c )
|
||||
{
|
||||
if( c2c->channel == Channel )
|
||||
{
|
||||
/* Eintrag fuer Channel gefunden; ausgeben: */
|
||||
if( ! IRC_WriteStrClient( Client, RPL_BANLIST_MSG, Client_ID( Client ), Channel_Name( Channel ), c2c->mask )) return DISCONNECTED;
|
||||
}
|
||||
c2c = c2c->next;
|
||||
}
|
||||
return IRC_WriteStrClient( Client, RPL_ENDOFBANLIST_MSG, Client_ID( Client ), Channel_Name( Channel ));
|
||||
} /* Lists_ShowBans */
|
||||
|
||||
|
||||
GLOBAL VOID
|
||||
Lists_DeleteChannel( CHANNEL *Chan )
|
||||
{
|
||||
/* Channel wurde geloescht, Invite- und Ban-Lists aufraeumen */
|
||||
|
||||
C2C *c2c, *last, *next;
|
||||
|
||||
/* Invite-List */
|
||||
last = NULL;
|
||||
c2c = My_Invites;
|
||||
while( c2c )
|
||||
{
|
||||
next = c2c->next;
|
||||
if( c2c->channel == Chan )
|
||||
{
|
||||
/* dieser Eintrag muss geloescht werden */
|
||||
Log( LOG_DEBUG, "Deleted \"%s\" from invite list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
|
||||
if( last ) last->next = next;
|
||||
else My_Invites = next;
|
||||
free( c2c );
|
||||
}
|
||||
else last = c2c;
|
||||
c2c = next;
|
||||
}
|
||||
|
||||
/* Ban-List */
|
||||
last = NULL;
|
||||
c2c = My_Bans;
|
||||
while( c2c )
|
||||
{
|
||||
next = c2c->next;
|
||||
if( c2c->channel == Chan )
|
||||
{
|
||||
/* dieser Eintrag muss geloescht werden */
|
||||
Log( LOG_DEBUG, "Deleted \"%s\" from ban list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
|
||||
if( last ) last->next = next;
|
||||
else My_Bans = next;
|
||||
free( c2c );
|
||||
}
|
||||
else last = c2c;
|
||||
c2c = next;
|
||||
}
|
||||
} /* Lists_DeleteChannel */
|
||||
|
||||
|
||||
GLOBAL CHAR *
|
||||
Lists_MakeMask( CHAR *Pattern )
|
||||
{
|
||||
/* Hier wird aus einem "beliebigen" Pattern eine gueltige IRC-Mask erzeugt.
|
||||
* Diese ist aber nur bis zum naechsten Aufruf von Lists_MakeMask() gueltig,
|
||||
* da ein einziger globaler Puffer verwendet wird. ->Umkopieren!*/
|
||||
|
||||
STATIC CHAR TheMask[MASK_LEN];
|
||||
CHAR *excl, *at;
|
||||
static char TheMask[MASK_LEN];
|
||||
char *excl, *at;
|
||||
|
||||
assert( Pattern != NULL );
|
||||
|
||||
@@ -376,7 +182,7 @@ Lists_MakeMask( CHAR *Pattern )
|
||||
|
||||
if(( ! at ) && ( ! excl ))
|
||||
{
|
||||
/* weder ! noch @ vorhanden: als Nick annehmen */
|
||||
/* Neither "!" nor "@" found: use string as nick name */
|
||||
strlcpy( TheMask, Pattern, sizeof( TheMask ) - 5 );
|
||||
strlcat( TheMask, "!*@*", sizeof( TheMask ));
|
||||
return TheMask;
|
||||
@@ -384,7 +190,7 @@ Lists_MakeMask( CHAR *Pattern )
|
||||
|
||||
if(( ! at ) && ( excl ))
|
||||
{
|
||||
/* Domain fehlt */
|
||||
/* Domain part is missing */
|
||||
strlcpy( TheMask, Pattern, sizeof( TheMask ) - 3 );
|
||||
strlcat( TheMask, "@*", sizeof( TheMask ));
|
||||
return TheMask;
|
||||
@@ -392,96 +198,44 @@ Lists_MakeMask( CHAR *Pattern )
|
||||
|
||||
if(( at ) && ( ! excl ))
|
||||
{
|
||||
/* User fehlt */
|
||||
/* User name is missing */
|
||||
*at = '\0'; at++;
|
||||
strlcpy( TheMask, Pattern, sizeof( TheMask ) - strlen( at ) - 4 );
|
||||
strlcpy( TheMask, Pattern, sizeof( TheMask ) - 5 );
|
||||
strlcat( TheMask, "!*@", sizeof( TheMask ));
|
||||
strlcat( TheMask, at, sizeof( TheMask ));
|
||||
return TheMask;
|
||||
}
|
||||
|
||||
/* alle Teile vorhanden */
|
||||
/* All parts (nick, user and domain name) are given */
|
||||
strlcpy( TheMask, Pattern, sizeof( TheMask ));
|
||||
return TheMask;
|
||||
} /* Lists_MakeMask */
|
||||
|
||||
|
||||
LOCAL C2C *
|
||||
New_C2C( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce )
|
||||
|
||||
bool
|
||||
Lists_Check( struct list_head *header, CLIENT *Client)
|
||||
{
|
||||
C2C *c2c;
|
||||
|
||||
assert( Mask != NULL );
|
||||
assert( Chan != NULL );
|
||||
struct list_elem *e, *last;
|
||||
|
||||
/* Speicher fuer Eintrag anfordern */
|
||||
c2c = (C2C *)malloc( sizeof( C2C ));
|
||||
if( ! c2c )
|
||||
{
|
||||
Log( LOG_EMERG, "Can't allocate memory! [New_C2C]" );
|
||||
return NULL;
|
||||
}
|
||||
assert( header != NULL );
|
||||
|
||||
strlcpy( c2c->mask, Mask, sizeof( c2c->mask ));
|
||||
c2c->channel = Chan;
|
||||
c2c->onlyonce = OnlyOnce;
|
||||
|
||||
return c2c;
|
||||
} /* New_C2C */
|
||||
|
||||
|
||||
LOCAL BOOLEAN
|
||||
Check_List( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan )
|
||||
{
|
||||
C2C *c2c, *last;
|
||||
|
||||
assert( Cl2Chan != NULL );
|
||||
assert( Client != NULL );
|
||||
assert( Chan != NULL );
|
||||
|
||||
c2c = *Cl2Chan;
|
||||
e = header->first;
|
||||
last = NULL;
|
||||
|
||||
while( c2c )
|
||||
{
|
||||
if( c2c->channel == Chan )
|
||||
{
|
||||
/* Ok, richtiger Channel. Passt die Maske? */
|
||||
if( Match( c2c->mask, Client_Mask( Client )))
|
||||
{
|
||||
/* Treffer! */
|
||||
if( c2c->onlyonce )
|
||||
{
|
||||
/* Eintrag loeschen */
|
||||
Log( LOG_DEBUG, "Deleted \"%s\" from %s list for \"%s\".", c2c->mask, *Cl2Chan == My_Invites ? "invite" : "ban", Channel_Name( Chan ));
|
||||
if( last ) last->next = c2c->next;
|
||||
else *Cl2Chan = c2c->next;
|
||||
free( c2c );
|
||||
}
|
||||
return TRUE;
|
||||
while( e ) {
|
||||
if( Match( e->mask, Client_Mask( Client ))) {
|
||||
if( e->onlyonce ) { /* delete entry */
|
||||
LogDebug("Deleted \"%s\" from list", e->mask);
|
||||
Lists_Unlink(header, last, e);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
last = c2c;
|
||||
c2c = c2c->next;
|
||||
last = e;
|
||||
e = e->next;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
} /* Check_List */
|
||||
|
||||
|
||||
LOCAL BOOLEAN
|
||||
Already_Registered( C2C *List, CHAR *Mask, CHANNEL *Chan )
|
||||
{
|
||||
C2C *c2c;
|
||||
|
||||
c2c = List;
|
||||
while( c2c )
|
||||
{
|
||||
if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 )) return TRUE;
|
||||
c2c = c2c->next;
|
||||
}
|
||||
return FALSE;
|
||||
} /* Already_Registered */
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* -eof- */
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: lists.h,v 1.11 2004/04/25 15:40:19 alex Exp $
|
||||
* $Id: lists.h,v 1.13 2006/12/07 17:57:20 fw Exp $
|
||||
*
|
||||
* Management of IRC lists: ban, invite, ... (header)
|
||||
*/
|
||||
@@ -16,31 +16,31 @@
|
||||
|
||||
#ifndef __lists_h__
|
||||
#define __lists_h__
|
||||
#include "portab.h"
|
||||
#include "client.h"
|
||||
|
||||
struct list_elem;
|
||||
|
||||
struct list_head {
|
||||
struct list_elem *first;
|
||||
};
|
||||
|
||||
|
||||
GLOBAL VOID Lists_Init PARAMS(( VOID ));
|
||||
GLOBAL VOID Lists_Exit PARAMS(( VOID ));
|
||||
GLOBAL struct list_elem *Lists_GetFirst PARAMS((const struct list_head *));
|
||||
GLOBAL struct list_elem *Lists_GetNext PARAMS((const struct list_elem *));
|
||||
|
||||
GLOBAL BOOLEAN Lists_CheckInvited PARAMS(( CLIENT *Client, CHANNEL *Chan ));
|
||||
GLOBAL BOOLEAN Lists_AddInvited PARAMS(( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce ));
|
||||
GLOBAL VOID Lists_DelInvited PARAMS(( CHAR *Mask, CHANNEL *Chan ));
|
||||
GLOBAL BOOLEAN Lists_ShowInvites PARAMS(( CLIENT *Client, CHANNEL *Channel ));
|
||||
GLOBAL BOOLEAN Lists_SendInvites PARAMS(( CLIENT *Client ));
|
||||
GLOBAL BOOLEAN Lists_IsInviteEntry PARAMS(( CHAR *Mask, CHANNEL *Chan ));
|
||||
GLOBAL bool Lists_Check PARAMS((struct list_head *head, CLIENT *client ));
|
||||
GLOBAL bool Lists_CheckDupeMask PARAMS((const struct list_head *head, const char *mask ));
|
||||
|
||||
GLOBAL BOOLEAN Lists_CheckBanned PARAMS(( CLIENT *Client, CHANNEL *Chan ));
|
||||
GLOBAL BOOLEAN Lists_AddBanned PARAMS(( CHAR *Mask, CHANNEL *Chan ));
|
||||
GLOBAL VOID Lists_DelBanned PARAMS(( CHAR *Mask, CHANNEL *Chan ));
|
||||
GLOBAL BOOLEAN Lists_ShowBans PARAMS(( CLIENT *Client, CHANNEL *Channel ));
|
||||
GLOBAL BOOLEAN Lists_SendBans PARAMS(( CLIENT *Client ));
|
||||
GLOBAL BOOLEAN Lists_IsBanEntry PARAMS(( CHAR *Mask, CHANNEL *Chan ));
|
||||
GLOBAL bool Lists_Add PARAMS((struct list_head *header, const char *Mask, bool OnlyOnce ));
|
||||
GLOBAL void Lists_Del PARAMS((struct list_head *head, const char *Mask ));
|
||||
|
||||
GLOBAL VOID Lists_DeleteChannel PARAMS(( CHANNEL *Chan ));
|
||||
GLOBAL bool Lists_AlreadyRegistered PARAMS(( const struct list_head *head, const char *Mask));
|
||||
|
||||
GLOBAL CHAR *Lists_MakeMask PARAMS(( CHAR *Pattern ));
|
||||
GLOBAL void Lists_Free PARAMS(( struct list_head *head ));
|
||||
|
||||
GLOBAL char *Lists_MakeMask PARAMS(( char *Pattern ));
|
||||
GLOBAL const char *Lists_GetMask PARAMS(( const struct list_elem *e ));
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
||||
|
||||
206
src/ngircd/log.c
206
src/ngircd/log.c
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
* Copyright (c)2001-2005 Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -14,12 +14,16 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: log.c,v 1.45 2004/05/07 11:19:21 alex Exp $";
|
||||
static char UNUSED id[] = "$Id: log.c,v 1.62 2006/08/05 09:16:21 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <stdarg.h>
|
||||
#ifdef PROTOTYPES
|
||||
# include <stdarg.h>
|
||||
#else
|
||||
# include <varargs.h>
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
@@ -40,64 +44,79 @@ static char UNUSED id[] = "$Id: log.c,v 1.45 2004/05/07 11:19:21 alex Exp $";
|
||||
#include "log.h"
|
||||
|
||||
|
||||
LOCAL CHAR Error_File[FNAME_LEN];
|
||||
LOCAL CHAR Init_Txt[127];
|
||||
static char Init_Txt[127];
|
||||
static bool Is_Daemon;
|
||||
|
||||
#ifdef DEBUG
|
||||
static char Error_File[FNAME_LEN];
|
||||
#endif
|
||||
|
||||
|
||||
LOCAL VOID Wall_ServerNotice PARAMS(( CHAR *Msg ));
|
||||
static void Wall_ServerNotice PARAMS(( char *Msg ));
|
||||
|
||||
|
||||
GLOBAL VOID
|
||||
Log_Init( VOID )
|
||||
GLOBAL void
|
||||
Log_Init( bool Daemon_Mode )
|
||||
{
|
||||
Is_Daemon = Daemon_Mode;
|
||||
|
||||
#ifdef SYSLOG
|
||||
#ifndef LOG_CONS /* Kludge: mips-dec-ultrix4.5 has no LOG_CONS/LOG_LOCAL5 */
|
||||
#define LOG_CONS 0
|
||||
#endif
|
||||
#ifndef LOG_LOCAL5
|
||||
#define LOG_LOCAL5 0
|
||||
#endif
|
||||
/* Syslog initialisieren */
|
||||
openlog( PACKAGE_NAME, LOG_CONS|LOG_PID, LOG_LOCAL5 );
|
||||
#endif
|
||||
|
||||
/* Hello World! */
|
||||
Log( LOG_NOTICE, "%s started.", NGIRCd_Version( ));
|
||||
Log( LOG_NOTICE, "%s started.", NGIRCd_Version );
|
||||
|
||||
/* Informationen uebern den "Operation Mode" */
|
||||
strcpy( Init_Txt, "" );
|
||||
Init_Txt[0] = '\0';
|
||||
#ifdef DEBUG
|
||||
if( NGIRCd_Debug )
|
||||
{
|
||||
if( Init_Txt[0] ) strcat( Init_Txt, ", " );
|
||||
strcat( Init_Txt, "debug-mode" );
|
||||
strlcpy( Init_Txt, "debug-mode", sizeof Init_Txt );
|
||||
}
|
||||
#endif
|
||||
if( NGIRCd_NoDaemon )
|
||||
if( ! Is_Daemon )
|
||||
{
|
||||
if( Init_Txt[0] ) strcat( Init_Txt, ", " );
|
||||
strcat( Init_Txt, "no-daemon-mode" );
|
||||
if( Init_Txt[0] ) strlcat( Init_Txt, ", ", sizeof Init_Txt );
|
||||
strlcat( Init_Txt, "no-daemon-mode", sizeof Init_Txt );
|
||||
}
|
||||
if( NGIRCd_Passive )
|
||||
{
|
||||
if( Init_Txt[0] ) strcat( Init_Txt, ", " );
|
||||
strcat( Init_Txt, "passive-mode" );
|
||||
if( Init_Txt[0] ) strlcat( Init_Txt, ", ", sizeof Init_Txt );
|
||||
strlcat( Init_Txt, "passive-mode", sizeof Init_Txt );
|
||||
}
|
||||
#ifdef SNIFFER
|
||||
if( NGIRCd_Sniffer )
|
||||
{
|
||||
if( Init_Txt[0] ) strcat( Init_Txt, ", " );
|
||||
strcat( Init_Txt, "network sniffer" );
|
||||
if( Init_Txt[0] ) strlcat( Init_Txt, ", ", sizeof Init_Txt );
|
||||
strlcat( Init_Txt, "network sniffer", sizeof Init_Txt );
|
||||
}
|
||||
#endif
|
||||
if( Init_Txt[0] ) Log( LOG_INFO, "Activating: %s.", Init_Txt );
|
||||
|
||||
#ifdef DEBUG
|
||||
Error_File[0] = '\0';
|
||||
#endif
|
||||
} /* Log_Init */
|
||||
|
||||
|
||||
GLOBAL VOID
|
||||
Log_InitErrorfile( VOID )
|
||||
#ifdef DEBUG
|
||||
|
||||
GLOBAL void
|
||||
Log_InitErrorfile( void )
|
||||
{
|
||||
/* "Error-Log" initialisieren: stderr in Datei umlenken. Dort
|
||||
* landen z.B. alle Ausgaben von assert()-Aufrufen. */
|
||||
|
||||
/* Dateiname zusammen bauen */
|
||||
sprintf( Error_File, "%s/%s-%ld.err", ERROR_DIR, PACKAGE_NAME, (LONG)getpid( ));
|
||||
snprintf( Error_File, sizeof Error_File, "%s/%s-%ld.err", ERROR_DIR, PACKAGE_NAME, (long)getpid( ));
|
||||
|
||||
/* stderr umlenken */
|
||||
fflush( stderr );
|
||||
@@ -109,26 +128,32 @@ Log_InitErrorfile( VOID )
|
||||
|
||||
/* Einige Infos in das Error-File schreiben */
|
||||
fputs( ctime( &NGIRCd_Start ), stderr );
|
||||
fprintf( stderr, "%s started.\n", NGIRCd_Version( ));
|
||||
fprintf( stderr, "%s started.\n", NGIRCd_Version );
|
||||
fprintf( stderr, "Activating: %s\n\n", Init_Txt[0] ? Init_Txt : "-" );
|
||||
fflush( stderr );
|
||||
|
||||
#ifdef DEBUG
|
||||
Log( LOG_DEBUG, "Redirected stderr to \"%s\".", Error_File );
|
||||
#endif
|
||||
} /* Log_InitErrfile */
|
||||
|
||||
#endif
|
||||
|
||||
GLOBAL VOID
|
||||
Log_Exit( VOID )
|
||||
|
||||
GLOBAL void
|
||||
Log_Exit( void )
|
||||
{
|
||||
/* Good Bye! */
|
||||
if( NGIRCd_SignalRestart ) Log( LOG_NOTICE, "%s done (restarting).", PACKAGE_NAME );
|
||||
else Log( LOG_NOTICE, "%s done.", PACKAGE_NAME );
|
||||
|
||||
#ifdef DEBUG
|
||||
if( Error_File[0] )
|
||||
{
|
||||
/* Error-File (stderr) loeschen */
|
||||
if( unlink( Error_File ) != 0 ) Log( LOG_ERR, "Can't delete \"%s\": %s", Error_File, strerror( errno ));
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef SYSLOG
|
||||
/* syslog abmelden */
|
||||
@@ -137,21 +162,65 @@ Log_Exit( VOID )
|
||||
} /* Log_Exit */
|
||||
|
||||
|
||||
/**
|
||||
* Log function for debug messages.
|
||||
* This function is only functional when the program is compiled with debug
|
||||
* code enabled; otherwise it is an empty function which the compiler will
|
||||
* hopefully mangle down to "nothing" (see log.h). Therefore you should use
|
||||
* LogDebug(...) in favor to Log(LOG_DEBUG, ...).
|
||||
* @param Format Format string like printf().
|
||||
* @param ... Further arguments.
|
||||
*/
|
||||
#ifdef DEBUG
|
||||
# ifdef PROTOTYPES
|
||||
GLOBAL void
|
||||
LogDebug( const char *Format, ... )
|
||||
# else
|
||||
GLOBAL void
|
||||
LogDebug( Format, va_alist )
|
||||
const char *Format;
|
||||
va_dcl
|
||||
# endif /* PROTOTYPES */
|
||||
{
|
||||
char msg[MAX_LOG_MSG_LEN];
|
||||
va_list ap;
|
||||
|
||||
if (!NGIRCd_Debug) return;
|
||||
#ifdef PROTOTYPES
|
||||
GLOBAL VOID
|
||||
Log( INT Level, CONST CHAR *Format, ... )
|
||||
va_start( ap, Format );
|
||||
#else
|
||||
GLOBAL VOID
|
||||
va_start( ap );
|
||||
#endif
|
||||
vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap );
|
||||
va_end( ap );
|
||||
Log(LOG_DEBUG, "%s", msg);
|
||||
}
|
||||
#endif /* DEBUG */
|
||||
|
||||
|
||||
/**
|
||||
* Logging function of ngIRCd.
|
||||
* This function logs messages to the console and/or syslog, whichever is
|
||||
* suitable for the mode ngIRCd is running in (daemon vs. non-daemon).
|
||||
* Please note: you sould use LogDebug(...) for debug messages!
|
||||
* @param Level syslog level (LOG_xxx)
|
||||
* @param Format Format string like printf().
|
||||
* @param ... Further arguments.
|
||||
*/
|
||||
#ifdef PROTOTYPES
|
||||
GLOBAL void
|
||||
Log( int Level, const char *Format, ... )
|
||||
#else
|
||||
GLOBAL void
|
||||
Log( Level, Format, va_alist )
|
||||
INT Level;
|
||||
CONST CHAR *Format;
|
||||
int Level;
|
||||
const char *Format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
/* Eintrag in Logfile(s) schreiben */
|
||||
|
||||
CHAR msg[MAX_LOG_MSG_LEN];
|
||||
BOOLEAN snotice;
|
||||
char msg[MAX_LOG_MSG_LEN];
|
||||
bool snotice;
|
||||
va_list ap;
|
||||
|
||||
assert( Format != NULL );
|
||||
@@ -159,10 +228,10 @@ va_dcl
|
||||
if( Level & LOG_snotice )
|
||||
{
|
||||
/* Notice an User mit "s" Mode */
|
||||
snotice = TRUE;
|
||||
snotice = true;
|
||||
Level &= ~LOG_snotice;
|
||||
}
|
||||
else snotice = FALSE;
|
||||
else snotice = false;
|
||||
|
||||
#ifdef DEBUG
|
||||
if(( Level == LOG_DEBUG ) && ( ! NGIRCd_Debug )) return;
|
||||
@@ -179,10 +248,10 @@ va_dcl
|
||||
vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
if( NGIRCd_NoDaemon )
|
||||
if( ! Is_Daemon )
|
||||
{
|
||||
/* auf Konsole ausgeben */
|
||||
fprintf( stdout, "[%d] %s\n", Level, msg );
|
||||
fprintf( stdout, "[%d:%d] %s\n", (int)getpid( ), Level, msg );
|
||||
fflush( stdout );
|
||||
}
|
||||
#ifdef SYSLOG
|
||||
@@ -195,7 +264,7 @@ va_dcl
|
||||
|
||||
if( Level <= LOG_CRIT )
|
||||
{
|
||||
/* Kritische Meldungen in Error-File (stderr) */
|
||||
/* log critical messages to stderr */
|
||||
fprintf( stderr, "%s\n", msg );
|
||||
fflush( stderr );
|
||||
}
|
||||
@@ -208,18 +277,24 @@ va_dcl
|
||||
} /* Log */
|
||||
|
||||
|
||||
GLOBAL VOID
|
||||
Log_Init_Resolver( VOID )
|
||||
GLOBAL void
|
||||
Log_Init_Resolver( void )
|
||||
{
|
||||
#ifdef SYSLOG
|
||||
openlog( PACKAGE_NAME, LOG_CONS|LOG_PID, LOG_LOCAL5 );
|
||||
#endif
|
||||
#ifdef DEBUG
|
||||
Log_Resolver( LOG_DEBUG, "Resolver sub-process starting, PID %d.", getpid( ));
|
||||
#endif
|
||||
} /* Log_Init_Resolver */
|
||||
|
||||
|
||||
GLOBAL VOID
|
||||
Log_Exit_Resolver( VOID )
|
||||
GLOBAL void
|
||||
Log_Exit_Resolver( void )
|
||||
{
|
||||
#ifdef DEBUG
|
||||
Log_Resolver( LOG_DEBUG, "Resolver sub-process %d done.", getpid( ));
|
||||
#endif
|
||||
#ifdef SYSLOG
|
||||
closelog( );
|
||||
#endif
|
||||
@@ -227,29 +302,23 @@ Log_Exit_Resolver( VOID )
|
||||
|
||||
|
||||
#ifdef PROTOTYPES
|
||||
GLOBAL VOID
|
||||
Log_Resolver( CONST INT Level, CONST CHAR *Format, ... )
|
||||
GLOBAL void
|
||||
Log_Resolver( const int Level, const char *Format, ... )
|
||||
#else
|
||||
GLOBAL VOID
|
||||
GLOBAL void
|
||||
Log_Resolver( Level, Format, va_alist )
|
||||
CONST INT Level;
|
||||
CONST CHAR *Format;
|
||||
const int Level;
|
||||
const char *Format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
/* Eintrag des Resolver in Logfile(s) schreiben */
|
||||
|
||||
#ifndef SYSLOG
|
||||
return;
|
||||
#else
|
||||
|
||||
CHAR msg[MAX_LOG_MSG_LEN];
|
||||
char msg[MAX_LOG_MSG_LEN];
|
||||
va_list ap;
|
||||
|
||||
assert( Format != NULL );
|
||||
|
||||
if( NGIRCd_NoDaemon ) return;
|
||||
|
||||
#ifdef DEBUG
|
||||
if(( Level == LOG_DEBUG ) && ( ! NGIRCd_Debug )) return;
|
||||
#else
|
||||
@@ -265,26 +334,35 @@ va_dcl
|
||||
vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
/* ... und ausgeben */
|
||||
syslog( Level, msg );
|
||||
|
||||
if( ! Is_Daemon )
|
||||
{
|
||||
/* Output to console */
|
||||
fprintf( stdout, "[%d:%d] %s\n", (int)getpid( ), Level, msg );
|
||||
fflush( stdout );
|
||||
}
|
||||
#ifdef SYSLOG
|
||||
else syslog( Level, "%s", msg );
|
||||
#endif
|
||||
} /* Log_Resolver */
|
||||
|
||||
|
||||
LOCAL VOID
|
||||
Wall_ServerNotice( CHAR *Msg )
|
||||
/**
|
||||
* Send log messages to users flagged with the "s" mode.
|
||||
* @param Msg The message to send.
|
||||
*/
|
||||
static void
|
||||
Wall_ServerNotice( char *Msg )
|
||||
{
|
||||
/* Server-Notice an entsprechende User verschicken */
|
||||
|
||||
CLIENT *c;
|
||||
|
||||
assert( Msg != NULL );
|
||||
|
||||
c = Client_First( );
|
||||
while( c )
|
||||
{
|
||||
if(( Client_Conn( c ) > NONE ) && ( Client_HasMode( c, 's' ))) IRC_WriteStrClient( c, "NOTICE %s :%s%s", Client_ThisServer( ), NOTICE_TXTPREFIX, Msg );
|
||||
while(c) {
|
||||
if (Client_Conn(c) > NONE && Client_HasMode(c, 's'))
|
||||
IRC_WriteStrClient(c, "NOTICE %s :%s%s", Client_ID(c),
|
||||
NOTICE_TXTPREFIX, Msg);
|
||||
|
||||
c = Client_Next( c );
|
||||
}
|
||||
} /* Wall_ServerNotice */
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: log.h,v 1.14 2003/12/26 15:55:07 alex Exp $
|
||||
* $Id: log.h,v 1.20 2006/08/05 09:16:21 fw Exp $
|
||||
*
|
||||
* Logging functions (header)
|
||||
*/
|
||||
@@ -35,16 +35,26 @@
|
||||
#define LOG_snotice 1024
|
||||
|
||||
|
||||
GLOBAL VOID Log_Init PARAMS((VOID ));
|
||||
GLOBAL VOID Log_Exit PARAMS((VOID ));
|
||||
GLOBAL void Log_Init PARAMS(( bool Daemon_Mode ));
|
||||
GLOBAL void Log_Exit PARAMS(( void ));
|
||||
|
||||
GLOBAL VOID Log_InitErrorfile PARAMS((VOID ));
|
||||
GLOBAL VOID Log PARAMS((INT Level, CONST CHAR *Format, ... ));
|
||||
GLOBAL void Log PARAMS(( int Level, const char *Format, ... ));
|
||||
|
||||
GLOBAL VOID Log_Init_Resolver PARAMS((VOID ));
|
||||
GLOBAL VOID Log_Exit_Resolver PARAMS((VOID ));
|
||||
#ifdef DEBUG
|
||||
GLOBAL void LogDebug PARAMS(( const char *Format, ... ));
|
||||
#else
|
||||
static inline void LogDebug PARAMS(( UNUSED const char *Format, ... )){/* Do nothing. The compiler should optimize this out, please ;-) */}
|
||||
#endif
|
||||
|
||||
GLOBAL VOID Log_Resolver PARAMS((CONST INT Level, CONST CHAR *Format, ... ));
|
||||
|
||||
GLOBAL void Log_Init_Resolver PARAMS(( void ));
|
||||
GLOBAL void Log_Exit_Resolver PARAMS(( void ));
|
||||
|
||||
GLOBAL void Log_Resolver PARAMS(( const int Level, const char *Format, ... ));
|
||||
|
||||
#ifdef DEBUG
|
||||
GLOBAL void Log_InitErrorfile PARAMS(( void ));
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: match.c,v 1.2 2002/12/12 12:24:18 alex Exp $";
|
||||
static char UNUSED id[] = "$Id: match.c,v 1.5 2006/10/06 21:23:47 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
@@ -32,8 +32,8 @@ static char UNUSED id[] = "$Id: match.c,v 1.2 2002/12/12 12:24:18 alex Exp $";
|
||||
*/
|
||||
|
||||
|
||||
LOCAL INT Matche PARAMS(( REGISTER CHAR *p, REGISTER CHAR *t ));
|
||||
LOCAL INT Matche_After_Star PARAMS(( REGISTER CHAR *p, REGISTER CHAR *t ));
|
||||
static int Matche PARAMS(( const char *p, const char *t ));
|
||||
static int Matche_After_Star PARAMS(( const char *p, const char *t ));
|
||||
|
||||
|
||||
#define MATCH_PATTERN 6 /* bad pattern */
|
||||
@@ -44,22 +44,22 @@ LOCAL INT Matche_After_Star PARAMS(( REGISTER CHAR *p, REGISTER CHAR *t ));
|
||||
#define MATCH_VALID 1 /* valid match */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN
|
||||
Match( CHAR *Pattern, CHAR *String )
|
||||
GLOBAL bool
|
||||
Match( const char *Pattern, const char *String )
|
||||
{
|
||||
/* Pattern mit String vergleichen */
|
||||
if( Matche( Pattern, String ) == MATCH_VALID ) return TRUE;
|
||||
else return FALSE;
|
||||
if( Matche( Pattern, String ) == MATCH_VALID ) return true;
|
||||
else return false;
|
||||
} /* Match */
|
||||
|
||||
|
||||
LOCAL INT
|
||||
Matche( REGISTER CHAR *p, REGISTER CHAR *t )
|
||||
static int
|
||||
Matche( const char *p, const char *t )
|
||||
{
|
||||
REGISTER CHAR range_start, range_end;
|
||||
BOOLEAN invert;
|
||||
BOOLEAN member_match;
|
||||
BOOLEAN loop;
|
||||
register char range_start, range_end;
|
||||
bool invert;
|
||||
bool member_match;
|
||||
bool loop;
|
||||
|
||||
for( ; *p; p++, t++ )
|
||||
{
|
||||
@@ -83,25 +83,25 @@ Matche( REGISTER CHAR *p, REGISTER CHAR *t )
|
||||
p++;
|
||||
|
||||
/* check if this is a member match or exclusion match */
|
||||
invert = FALSE;
|
||||
invert = false;
|
||||
if( *p == '!' || *p == '^' )
|
||||
{
|
||||
invert = TRUE;
|
||||
invert = true;
|
||||
p++;
|
||||
}
|
||||
|
||||
/* if closing bracket here or at range start then we have a malformed pattern */
|
||||
if ( *p == ']' ) return MATCH_PATTERN;
|
||||
|
||||
member_match = FALSE;
|
||||
loop = TRUE;
|
||||
member_match = false;
|
||||
loop = true;
|
||||
|
||||
while( loop )
|
||||
{
|
||||
/* if end of construct then loop is done */
|
||||
if( *p == ']' )
|
||||
{
|
||||
loop = FALSE;
|
||||
loop = false;
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -140,16 +140,16 @@ Matche( REGISTER CHAR *p, REGISTER CHAR *t )
|
||||
{
|
||||
if( *t >= range_start && *t <= range_end )
|
||||
{
|
||||
member_match = TRUE;
|
||||
loop = FALSE;
|
||||
member_match = true;
|
||||
loop = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if( *t >= range_end && *t <= range_start )
|
||||
{
|
||||
member_match = TRUE;
|
||||
loop = FALSE;
|
||||
member_match = true;
|
||||
loop = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -200,10 +200,10 @@ Matche( REGISTER CHAR *p, REGISTER CHAR *t )
|
||||
} /* Matche */
|
||||
|
||||
|
||||
LOCAL INT
|
||||
Matche_After_Star( REGISTER CHAR *p, REGISTER CHAR *t )
|
||||
static int
|
||||
Matche_After_Star( const char *p, const char *t )
|
||||
{
|
||||
REGISTER INT nextp, match = 0;
|
||||
register int nextp, match = 0;
|
||||
|
||||
/* pass over existing ? and * in pattern */
|
||||
while( *p == '?' || *p == '*' )
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: match.h,v 1.2 2002/12/12 12:23:43 alex Exp $
|
||||
* $Id: match.h,v 1.4 2006/10/06 21:23:47 fw Exp $
|
||||
*
|
||||
* Wildcard pattern matching (header)
|
||||
*/
|
||||
@@ -18,7 +18,7 @@
|
||||
#define __match_h__
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Match PARAMS(( CHAR *Pattern, CHAR *String ));
|
||||
GLOBAL bool Match PARAMS(( const char *Pattern, const char *String ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: messages.h,v 1.66 2004/02/28 02:18:16 alex Exp $
|
||||
* $Id: messages.h,v 1.74 2007/12/11 11:29:44 fw Exp $
|
||||
*
|
||||
* IRC numerics (Header)
|
||||
*/
|
||||
@@ -22,7 +22,8 @@
|
||||
#define RPL_YOURHOST_MSG "002 %s :Your host is %s, running version ngircd-%s (%s/%s/%s)"
|
||||
#define RPL_CREATED_MSG "003 %s :This server has been started %s"
|
||||
#define RPL_MYINFO_MSG "004 %s %s ngircd-%s %s %s"
|
||||
#define RPL_ISUPPORT_MSG "005 %s NICKLEN=%d TOPICLEN=%d AWAYLEN=%d MAXCHANNELS=%d :are supported on this server"
|
||||
#define RPL_ISUPPORT1_MSG "005 %s RFC2812 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_TRACELINK_MSG "200 %s Link %s-%s %s %s V%s %ld %d %d"
|
||||
#define RPL_TRACEOPERATOR_MSG "204 %s Oper 2 :%s"
|
||||
@@ -31,18 +32,19 @@
|
||||
#define RPL_STATSCOMMANDS_MSG "212 %s %s %ld %ld %ld"
|
||||
#define RPL_ENDOFSTATS_MSG "219 %s %c :End of STATS report"
|
||||
#define RPL_UMODEIS_MSG "221 %s +%s"
|
||||
#define RPL_STATSUPTIME "242 %s :Server Up %u days %u:%02u:%02u"
|
||||
#define RPL_LUSERCLIENT_MSG "251 %s :There are %ld users and %ld services on %ld servers"
|
||||
#define RPL_LUSEROP_MSG "252 %s %ld :operator(s) online"
|
||||
#define RPL_LUSERUNKNOWN_MSG "253 %s %ld :unknown connection(s)"
|
||||
#define RPL_LUSERCHANNELS_MSG "254 %s %ld :channels formed"
|
||||
#define RPL_LUSERME_MSG "255 %s :I have %ld users, %ld services and %ld servers"
|
||||
#define RPL_LUSEROP_MSG "252 %s %lu :operator(s) online"
|
||||
#define RPL_LUSERUNKNOWN_MSG "253 %s %lu :unknown connection(s)"
|
||||
#define RPL_LUSERCHANNELS_MSG "254 %s %lu :channels formed"
|
||||
#define RPL_LUSERME_MSG "255 %s :I have %lu users, %lu services and %lu servers"
|
||||
#define RPL_ADMINME_MSG "256 %s %s :Administrative info"
|
||||
#define RPL_ADMINLOC1_MSG "257 %s :%s"
|
||||
#define RPL_ADMINLOC2_MSG "258 %s :%s"
|
||||
#define RPL_ADMINEMAIL_MSG "259 %s :%s"
|
||||
#define RPL_TRACEEND_MSG "262 %s %s %s-%s.%s :End of TRACE"
|
||||
#define RPL_LOCALUSERS_MSG "265 %s :Current local users: %ld, Max: %ld"
|
||||
#define RPL_NETUSERS_MSG "266 %s :Current global users: %ld, Max: %ld"
|
||||
#define RPL_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_AWAY_MSG "301 %s %s :%s"
|
||||
#define RPL_USERHOST_MSG "302 %s :"
|
||||
@@ -54,7 +56,7 @@
|
||||
#define RPL_WHOISOPERATOR_MSG "313 %s %s :is an IRC operator"
|
||||
#define RPL_WHOWASUSER_MSG "314 %s %s %s %s * :%s"
|
||||
#define RPL_ENDOFWHO_MSG "315 %s %s :End of WHO list"
|
||||
#define RPL_WHOISIDLE_MSG "317 %s %s %ld :seconds idle"
|
||||
#define RPL_WHOISIDLE_MSG "317 %s %s %lu %lu :seconds idle, signon time"
|
||||
#define RPL_ENDOFWHOIS_MSG "318 %s %s :End of WHOIS list"
|
||||
#define RPL_WHOISCHANNELS_MSG "319 %s %s :"
|
||||
#define RPL_LIST_MSG "322 %s %s %ld :%s"
|
||||
@@ -62,6 +64,7 @@
|
||||
#define RPL_CHANNELMODEIS_MSG "324 %s %s +%s"
|
||||
#define RPL_NOTOPIC_MSG "331 %s %s :No topic is set"
|
||||
#define RPL_TOPIC_MSG "332 %s %s :%s"
|
||||
#define RPL_TOPICSETBY_MSG "333 %s %s %s %u"
|
||||
#define RPL_INVITING_MSG "341 %s %s %s"
|
||||
#define RPL_INVITELIST_MSG "346 %s %s %s"
|
||||
#define RPL_ENDOFINVITELIST_MSG "347 %s %s :End of channel invite list"
|
||||
|
||||
@@ -1,20 +1,24 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001-2004 by Alexander Barton (alex@barton.de)
|
||||
* Copyright (c)2001-2007 Alexander Barton (alex@barton.de).
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* Main program -- main()
|
||||
*/
|
||||
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: ngircd.c,v 1.84 2004/05/07 11:19:21 alex Exp $";
|
||||
static char UNUSED id[] = "$Id: ngircd.c,v 1.117 2007/11/21 12:16:36 alex Exp $";
|
||||
|
||||
/**
|
||||
* @file
|
||||
* The main program, including the C function main() which is called
|
||||
* by the loader of the operating system.
|
||||
*/
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
@@ -28,22 +32,23 @@ static char UNUSED id[] = "$Id: ngircd.c,v 1.84 2004/05/07 11:19:21 alex Exp $";
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/wait.h>
|
||||
#include <fcntl.h>
|
||||
#include <pwd.h>
|
||||
#include <grp.h>
|
||||
|
||||
#include "defines.h"
|
||||
#include "resolve.h"
|
||||
#include "conn.h"
|
||||
#include "client.h"
|
||||
#include "channel.h"
|
||||
#include "conf.h"
|
||||
#include "cvs-version.h"
|
||||
#include "defines.h"
|
||||
#include "lists.h"
|
||||
#include "log.h"
|
||||
#include "parse.h"
|
||||
#include "irc.h"
|
||||
|
||||
#ifdef RENDEZVOUS
|
||||
#ifdef ZEROCONF
|
||||
#include "rendezvous.h"
|
||||
#endif
|
||||
|
||||
@@ -51,39 +56,56 @@ static char UNUSED id[] = "$Id: ngircd.c,v 1.84 2004/05/07 11:19:21 alex Exp $";
|
||||
#include "ngircd.h"
|
||||
|
||||
|
||||
LOCAL VOID Initialize_Signal_Handler PARAMS(( VOID ));
|
||||
LOCAL VOID Signal_Handler PARAMS(( INT Signal ));
|
||||
static void Initialize_Signal_Handler PARAMS(( void ));
|
||||
static void Signal_Handler PARAMS(( int Signal ));
|
||||
|
||||
LOCAL VOID Show_Version PARAMS(( VOID ));
|
||||
LOCAL VOID Show_Help PARAMS(( VOID ));
|
||||
static void Show_Version PARAMS(( void ));
|
||||
static void Show_Help PARAMS(( void ));
|
||||
|
||||
static void Pidfile_Create PARAMS(( pid_t pid ));
|
||||
static void Pidfile_Delete PARAMS(( void ));
|
||||
|
||||
static void Fill_Version PARAMS(( void ));
|
||||
|
||||
static void Setup_FDStreams PARAMS(( void ));
|
||||
|
||||
static bool NGIRCd_Init PARAMS(( bool ));
|
||||
|
||||
/**
|
||||
* The main() function of ngIRCd.
|
||||
* Here all starts: this function is called by the operating system loader,
|
||||
* it is the first portion of code executed of ngIRCd.
|
||||
* @param argc The number of arguments passed to ngIRCd on the command line.
|
||||
* @param argv An array containing all the arguments passed to ngIRCd.
|
||||
* @return Global exit code of ngIRCd, zero on success.
|
||||
*/
|
||||
GLOBAL int
|
||||
main( int argc, const char *argv[] )
|
||||
{
|
||||
struct passwd *pwd;
|
||||
struct group *grp;
|
||||
BOOLEAN ok, configtest = FALSE;
|
||||
LONG pid, n;
|
||||
INT i;
|
||||
bool ok, configtest = false;
|
||||
bool NGIRCd_NoDaemon = false;
|
||||
int i;
|
||||
size_t n;
|
||||
|
||||
umask( 0077 );
|
||||
|
||||
NGIRCd_SignalQuit = NGIRCd_SignalRestart = NGIRCd_SignalRehash = FALSE;
|
||||
NGIRCd_NoDaemon = NGIRCd_Passive = FALSE;
|
||||
NGIRCd_SignalQuit = NGIRCd_SignalRestart = NGIRCd_SignalRehash = false;
|
||||
NGIRCd_Passive = false;
|
||||
#ifdef DEBUG
|
||||
NGIRCd_Debug = FALSE;
|
||||
NGIRCd_Debug = false;
|
||||
#endif
|
||||
#ifdef SNIFFER
|
||||
NGIRCd_Sniffer = FALSE;
|
||||
NGIRCd_Sniffer = false;
|
||||
#endif
|
||||
strlcpy( NGIRCd_ConfFile, SYSCONFDIR, sizeof( NGIRCd_ConfFile ));
|
||||
strlcat( NGIRCd_ConfFile, CONFIG_FILE, sizeof( NGIRCd_ConfFile ));
|
||||
|
||||
Fill_Version( );
|
||||
|
||||
/* Kommandozeile parsen */
|
||||
for( i = 1; i < argc; i++ )
|
||||
{
|
||||
ok = FALSE;
|
||||
ok = false;
|
||||
if(( argv[i][0] == '-' ) && ( argv[i][1] == '-' ))
|
||||
{
|
||||
/* Lange Option */
|
||||
@@ -96,19 +118,19 @@ main( int argc, const char *argv[] )
|
||||
strlcpy( NGIRCd_ConfFile, argv[i + 1], sizeof( NGIRCd_ConfFile ));
|
||||
|
||||
/* next parameter */
|
||||
i++; ok = TRUE;
|
||||
i++; ok = true;
|
||||
}
|
||||
}
|
||||
if( strcmp( argv[i], "--configtest" ) == 0 )
|
||||
{
|
||||
configtest = TRUE;
|
||||
ok = TRUE;
|
||||
configtest = true;
|
||||
ok = true;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
if( strcmp( argv[i], "--debug" ) == 0 )
|
||||
{
|
||||
NGIRCd_Debug = TRUE;
|
||||
ok = TRUE;
|
||||
NGIRCd_Debug = true;
|
||||
ok = true;
|
||||
}
|
||||
#endif
|
||||
if( strcmp( argv[i], "--help" ) == 0 )
|
||||
@@ -119,19 +141,19 @@ main( int argc, const char *argv[] )
|
||||
}
|
||||
if( strcmp( argv[i], "--nodaemon" ) == 0 )
|
||||
{
|
||||
NGIRCd_NoDaemon = TRUE;
|
||||
ok = TRUE;
|
||||
NGIRCd_NoDaemon = true;
|
||||
ok = true;
|
||||
}
|
||||
if( strcmp( argv[i], "--passive" ) == 0 )
|
||||
{
|
||||
NGIRCd_Passive = TRUE;
|
||||
ok = TRUE;
|
||||
NGIRCd_Passive = true;
|
||||
ok = true;
|
||||
}
|
||||
#ifdef SNIFFER
|
||||
if( strcmp( argv[i], "--sniffer" ) == 0 )
|
||||
{
|
||||
NGIRCd_Sniffer = TRUE;
|
||||
ok = TRUE;
|
||||
NGIRCd_Sniffer = true;
|
||||
ok = true;
|
||||
}
|
||||
#endif
|
||||
if( strcmp( argv[i], "--version" ) == 0 )
|
||||
@@ -143,15 +165,14 @@ main( int argc, const char *argv[] )
|
||||
else if(( argv[i][0] == '-' ) && ( argv[i][1] != '-' ))
|
||||
{
|
||||
/* Kurze Option */
|
||||
|
||||
for( n = 1; n < (LONG)strlen( argv[i] ); n++ )
|
||||
for( n = 1; n < strlen( argv[i] ); n++ )
|
||||
{
|
||||
ok = FALSE;
|
||||
ok = false;
|
||||
#ifdef DEBUG
|
||||
if( argv[i][n] == 'd' )
|
||||
{
|
||||
NGIRCd_Debug = TRUE;
|
||||
ok = TRUE;
|
||||
NGIRCd_Debug = true;
|
||||
ok = true;
|
||||
}
|
||||
#endif
|
||||
if( argv[i][n] == 'f' )
|
||||
@@ -162,31 +183,32 @@ main( int argc, const char *argv[] )
|
||||
strlcpy( NGIRCd_ConfFile, argv[i + 1], sizeof( NGIRCd_ConfFile ));
|
||||
|
||||
/* go to the following parameter */
|
||||
i++; n = (LONG)strlen( argv[i] );
|
||||
ok = TRUE;
|
||||
i++;
|
||||
n = strlen( argv[i] );
|
||||
ok = true;
|
||||
}
|
||||
}
|
||||
if( argv[i][n] == 'n' )
|
||||
{
|
||||
NGIRCd_NoDaemon = TRUE;
|
||||
ok = TRUE;
|
||||
NGIRCd_NoDaemon = true;
|
||||
ok = true;
|
||||
}
|
||||
if( argv[i][n] == 'p' )
|
||||
{
|
||||
NGIRCd_Passive = TRUE;
|
||||
ok = TRUE;
|
||||
NGIRCd_Passive = true;
|
||||
ok = true;
|
||||
}
|
||||
#ifdef SNIFFER
|
||||
if( argv[i][n] == 's' )
|
||||
{
|
||||
NGIRCd_Sniffer = TRUE;
|
||||
ok = TRUE;
|
||||
NGIRCd_Sniffer = true;
|
||||
ok = true;
|
||||
}
|
||||
#endif
|
||||
if( argv[i][n] == 't' )
|
||||
{
|
||||
configtest = TRUE;
|
||||
ok = TRUE;
|
||||
configtest = true;
|
||||
ok = true;
|
||||
}
|
||||
|
||||
if( ! ok )
|
||||
@@ -207,14 +229,14 @@ main( int argc, const char *argv[] )
|
||||
}
|
||||
|
||||
/* Debug-Level (fuer IRC-Befehl "VERSION") ermitteln */
|
||||
strcpy( NGIRCd_DebugLevel, "" );
|
||||
NGIRCd_DebugLevel[0] = '\0';
|
||||
#ifdef DEBUG
|
||||
if( NGIRCd_Debug ) strcpy( NGIRCd_DebugLevel, "1" );
|
||||
#endif
|
||||
#ifdef SNIFFER
|
||||
if( NGIRCd_Sniffer )
|
||||
{
|
||||
NGIRCd_Debug = TRUE;
|
||||
NGIRCd_Debug = true;
|
||||
strcpy( NGIRCd_DebugLevel, "2" );
|
||||
}
|
||||
#endif
|
||||
@@ -230,81 +252,37 @@ main( int argc, const char *argv[] )
|
||||
{
|
||||
/* Initialize global variables */
|
||||
NGIRCd_Start = time( NULL );
|
||||
(VOID)strftime( NGIRCd_StartStr, 64, "%a %b %d %Y at %H:%M:%S (%Z)", localtime( &NGIRCd_Start ));
|
||||
(void)strftime( NGIRCd_StartStr, 64, "%a %b %d %Y at %H:%M:%S (%Z)", localtime( &NGIRCd_Start ));
|
||||
|
||||
NGIRCd_SignalRehash = FALSE;
|
||||
NGIRCd_SignalRestart = FALSE;
|
||||
NGIRCd_SignalQuit = FALSE;
|
||||
NGIRCd_SignalRehash = false;
|
||||
NGIRCd_SignalRestart = false;
|
||||
NGIRCd_SignalQuit = false;
|
||||
|
||||
/* Initialize modules, part I */
|
||||
Log_Init( );
|
||||
Log_Init( ! NGIRCd_NoDaemon );
|
||||
Conf_Init( );
|
||||
|
||||
if( Conf_Chroot[0] )
|
||||
{
|
||||
/* Chroot */
|
||||
if( chdir( Conf_Chroot ) != 0 ) Log( LOG_ERR, "Can't chdir() in ChrootDir (%s): %s", Conf_Chroot, strerror( errno ));
|
||||
|
||||
if( chroot( Conf_Chroot ) != 0 ) Log( LOG_ERR, "Can't change root directory to \"%s\": %s", Conf_Chroot, strerror( errno ));
|
||||
else Log( LOG_INFO, "Changed root and working directory to \"%s\".", Conf_Chroot );
|
||||
}
|
||||
|
||||
if( Conf_GID != 0 )
|
||||
{
|
||||
/* Set new group ID */
|
||||
if( setgid( Conf_GID ) != 0 ) Log( LOG_ERR, "Can't change group ID to %u: %s", Conf_GID, strerror( errno ));
|
||||
}
|
||||
if( Conf_UID != 0 )
|
||||
{
|
||||
/* Set new user ID */
|
||||
if( setuid( Conf_UID ) != 0 ) Log( LOG_ERR, "Can't change user ID to %u: %s", Conf_UID, strerror( errno ));
|
||||
}
|
||||
|
||||
/* In der Regel wird ein Sub-Prozess ge-fork()'t, der
|
||||
* nicht mehr mit dem Terminal verbunden ist. Mit der
|
||||
* Option "--nodaemon" kann dies (z.B. zum Debuggen)
|
||||
* verhindert werden. */
|
||||
if( ! NGIRCd_NoDaemon )
|
||||
{
|
||||
/* Daemon im Hintergrund erzeugen */
|
||||
pid = (LONG)fork( );
|
||||
if( pid > 0 )
|
||||
{
|
||||
/* "alter" Prozess */
|
||||
exit( 0 );
|
||||
}
|
||||
if( pid < 0 )
|
||||
{
|
||||
/* Fehler */
|
||||
printf( "%s: Can't fork: %s!\nFatal error, exiting now ...\n", PACKAGE_NAME, strerror( errno ));
|
||||
exit( 1 );
|
||||
}
|
||||
|
||||
/* Child-Prozess initialisieren */
|
||||
(VOID)setsid( );
|
||||
chdir( "/" );
|
||||
/* Initialize the "main program": chroot environment, user and
|
||||
* group ID, ... */
|
||||
if (!NGIRCd_Init(NGIRCd_NoDaemon)) {
|
||||
Log(LOG_ALERT, "Fatal: Initialization failed");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* Initialize modules, part II: these functions are eventually
|
||||
* called with already dropped privileges ... */
|
||||
Resolve_Init( );
|
||||
Lists_Init( );
|
||||
Channel_Init( );
|
||||
Client_Init( );
|
||||
#ifdef RENDEZVOUS
|
||||
#ifdef ZEROCONF
|
||||
Rendezvous_Init( );
|
||||
#endif
|
||||
Conn_Init( );
|
||||
|
||||
/* Show user, group, and PID of the running daemon */
|
||||
pwd = getpwuid( getuid( )); grp = getgrgid( getgid( ));
|
||||
Log( LOG_INFO, "Running as user %s(%ld), group %s(%ld), with PID %ld.", pwd ? pwd->pw_name : "unknown", (LONG)getuid( ), grp ? grp->gr_name : "unknown", (LONG)getgid( ), (LONG)getpid( ));
|
||||
|
||||
/* Redirect stderr handle to "error file" for debugging.
|
||||
* But don't try to write in the chroot jail, since it's more
|
||||
* secure to have a chroot dir not writable by the daemon.
|
||||
*/
|
||||
if( ! Conf_Chroot[0] ) Log_InitErrorfile( );
|
||||
#ifdef DEBUG
|
||||
/* Redirect stderr handle to "error file" for debugging
|
||||
* when not running in "no daemon" mode: */
|
||||
if( ! NGIRCd_NoDaemon ) Log_InitErrorfile( );
|
||||
#endif
|
||||
|
||||
/* Signal-Handler initialisieren */
|
||||
Initialize_Signal_Handler( );
|
||||
@@ -313,17 +291,17 @@ main( int argc, const char *argv[] )
|
||||
* beim PASS-Befehl verwendete Syntax sowie die erweiterten Flags
|
||||
* sind in doc/Protocol.txt beschrieben. */
|
||||
#ifdef IRCPLUS
|
||||
sprintf( NGIRCd_ProtoID, "%s%s %s|%s:%s", PROTOVER, PROTOIRCPLUS, PACKAGE_NAME, PACKAGE_VERSION, IRCPLUSFLAGS );
|
||||
snprintf( NGIRCd_ProtoID, sizeof NGIRCd_ProtoID, "%s%s %s|%s:%s", PROTOVER, PROTOIRCPLUS, PACKAGE_NAME, PACKAGE_VERSION, IRCPLUSFLAGS );
|
||||
#ifdef ZLIB
|
||||
strcat( NGIRCd_ProtoID, "Z" );
|
||||
#endif
|
||||
if( Conf_OperCanMode ) strcat( NGIRCd_ProtoID, "o" );
|
||||
#else
|
||||
sprintf( NGIRCd_ProtoID, "%s%s %s|%s", PROTOVER, PROTOIRC, PACKAGE_NAME, PACKAGE_VERSION );
|
||||
snprintf( NGIRCd_ProtoID, sizeof NGIRCd_ProtoID, "%s%s %s|%s", PROTOVER, PROTOIRC, PACKAGE_NAME, PACKAGE_VERSION );
|
||||
#endif
|
||||
strcat( NGIRCd_ProtoID, " P" );
|
||||
strlcat( NGIRCd_ProtoID, " P", sizeof NGIRCd_ProtoID );
|
||||
#ifdef ZLIB
|
||||
strcat( NGIRCd_ProtoID, "Z" );
|
||||
strlcat( NGIRCd_ProtoID, "Z", sizeof NGIRCd_ProtoID );
|
||||
#endif
|
||||
Log( LOG_DEBUG, "Protocol and server ID is \"%s\".", NGIRCd_ProtoID );
|
||||
|
||||
@@ -335,6 +313,7 @@ main( int argc, const char *argv[] )
|
||||
{
|
||||
Log( LOG_ALERT, "Server isn't listening on a single port!" );
|
||||
Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME );
|
||||
Pidfile_Delete( );
|
||||
exit( 1 );
|
||||
}
|
||||
|
||||
@@ -343,110 +322,130 @@ main( int argc, const char *argv[] )
|
||||
|
||||
/* Alles abmelden */
|
||||
Conn_Exit( );
|
||||
#ifdef RENDEZVOUS
|
||||
#ifdef ZEROCONF
|
||||
Rendezvous_Exit( );
|
||||
#endif
|
||||
Client_Exit( );
|
||||
Channel_Exit( );
|
||||
Lists_Exit( );
|
||||
Log_Exit( );
|
||||
}
|
||||
Pidfile_Delete( );
|
||||
|
||||
return 0;
|
||||
} /* main */
|
||||
|
||||
|
||||
GLOBAL CHAR *
|
||||
NGIRCd_Version( VOID )
|
||||
/**
|
||||
* Generate ngIRCd "version string".
|
||||
* This string is generated once and then stored in NGIRCd_Version for
|
||||
* further usage, for example by the IRC command VERSION and the --version
|
||||
* command line switch.
|
||||
*/
|
||||
static void
|
||||
Fill_Version( void )
|
||||
{
|
||||
STATIC CHAR version[126];
|
||||
|
||||
#ifdef CVSDATE
|
||||
sprintf( version, "%s %s(%s)-%s", PACKAGE_NAME, PACKAGE_VERSION, CVSDATE, NGIRCd_VersionAddition( ));
|
||||
#else
|
||||
sprintf( version, "%s %s-%s", PACKAGE_NAME, PACKAGE_VERSION, NGIRCd_VersionAddition( ));
|
||||
#endif
|
||||
return version;
|
||||
} /* NGIRCd_Version */
|
||||
|
||||
|
||||
GLOBAL CHAR *
|
||||
NGIRCd_VersionAddition( VOID )
|
||||
{
|
||||
STATIC CHAR txt[200];
|
||||
|
||||
strcpy( txt, "" );
|
||||
NGIRCd_VersionAddition[0] = '\0';
|
||||
|
||||
#ifdef SYSLOG
|
||||
if( txt[0] ) strcat( txt, "+" );
|
||||
strcat( txt, "SYSLOG" );
|
||||
strlcpy( NGIRCd_VersionAddition, "SYSLOG", sizeof NGIRCd_VersionAddition );
|
||||
#endif
|
||||
#ifdef ZLIB
|
||||
if( txt[0] ) strcat( txt, "+" );
|
||||
strcat( txt, "ZLIB" );
|
||||
if( NGIRCd_VersionAddition[0] )
|
||||
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
||||
|
||||
strlcat( NGIRCd_VersionAddition, "ZLIB", sizeof NGIRCd_VersionAddition );
|
||||
#endif
|
||||
#ifdef TCPWRAP
|
||||
if( txt[0] ) strcat( txt, "+" );
|
||||
strcat( txt, "TCPWRAP" );
|
||||
if( NGIRCd_VersionAddition[0] )
|
||||
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
||||
|
||||
strlcat( NGIRCd_VersionAddition, "TCPWRAP", sizeof NGIRCd_VersionAddition );
|
||||
#endif
|
||||
#ifdef RENDEZVOUS
|
||||
if( txt[0] ) strcat( txt, "+" );
|
||||
strcat( txt, "RENDEZVOUS" );
|
||||
#ifdef ZEROCONF
|
||||
if( NGIRCd_VersionAddition[0] )
|
||||
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
||||
|
||||
strlcat( NGIRCd_VersionAddition, "ZEROCONF", sizeof NGIRCd_VersionAddition );
|
||||
#endif
|
||||
#ifdef IDENTAUTH
|
||||
if( txt[0] ) strcat( txt, "+" );
|
||||
strcat( txt, "IDENT" );
|
||||
if( NGIRCd_VersionAddition[0] )
|
||||
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
||||
|
||||
strlcat( NGIRCd_VersionAddition, "IDENT", sizeof NGIRCd_VersionAddition );
|
||||
#endif
|
||||
#ifdef DEBUG
|
||||
if( txt[0] ) strcat( txt, "+" );
|
||||
strcat( txt, "DEBUG" );
|
||||
if( NGIRCd_VersionAddition[0] )
|
||||
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
||||
|
||||
strlcat( NGIRCd_VersionAddition, "DEBUG", sizeof NGIRCd_VersionAddition );
|
||||
#endif
|
||||
#ifdef SNIFFER
|
||||
if( txt[0] ) strcat( txt, "+" );
|
||||
strcat( txt, "SNIFFER" );
|
||||
if( NGIRCd_VersionAddition[0] )
|
||||
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
||||
|
||||
strlcat( NGIRCd_VersionAddition, "SNIFFER", sizeof NGIRCd_VersionAddition );
|
||||
#endif
|
||||
#ifdef STRICT_RFC
|
||||
if( txt[0] ) strcat( txt, "+" );
|
||||
strcat( txt, "RFC" );
|
||||
if( NGIRCd_VersionAddition[0] )
|
||||
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
||||
|
||||
strlcat( NGIRCd_VersionAddition, "RFC", sizeof NGIRCd_VersionAddition );
|
||||
#endif
|
||||
#ifdef IRCPLUS
|
||||
if( txt[0] ) strcat( txt, "+" );
|
||||
strcat( txt, "IRCPLUS" );
|
||||
if( NGIRCd_VersionAddition[0] )
|
||||
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
||||
|
||||
strlcat( NGIRCd_VersionAddition, "IRCPLUS", sizeof NGIRCd_VersionAddition );
|
||||
#endif
|
||||
|
||||
if( txt[0] ) strlcat( txt, "-", sizeof( txt ));
|
||||
strlcat( txt, TARGET_CPU, sizeof( txt ));
|
||||
strlcat( txt, "/", sizeof( txt ));
|
||||
strlcat( txt, TARGET_VENDOR, sizeof( txt ));
|
||||
strlcat( txt, "/", sizeof( txt ));
|
||||
strlcat( txt, TARGET_OS, sizeof( txt ));
|
||||
|
||||
return txt;
|
||||
} /* NGIRCd_VersionAddition */
|
||||
if( NGIRCd_VersionAddition[0] )
|
||||
strlcat( NGIRCd_VersionAddition, "-", sizeof( NGIRCd_VersionAddition ));
|
||||
|
||||
strlcat( NGIRCd_VersionAddition, TARGET_CPU, sizeof( NGIRCd_VersionAddition ));
|
||||
strlcat( NGIRCd_VersionAddition, "/", sizeof( NGIRCd_VersionAddition ));
|
||||
strlcat( NGIRCd_VersionAddition, TARGET_VENDOR, sizeof( NGIRCd_VersionAddition ));
|
||||
strlcat( NGIRCd_VersionAddition, "/", sizeof( NGIRCd_VersionAddition ));
|
||||
strlcat( NGIRCd_VersionAddition, TARGET_OS, sizeof( NGIRCd_VersionAddition ));
|
||||
|
||||
#ifdef CVSDATE
|
||||
snprintf( NGIRCd_Version, sizeof NGIRCd_Version,"%s %s(%s)-%s", PACKAGE_NAME, PACKAGE_VERSION, CVSDATE, NGIRCd_VersionAddition);
|
||||
#else
|
||||
snprintf( NGIRCd_Version, sizeof NGIRCd_Version, "%s %s-%s", PACKAGE_NAME, PACKAGE_VERSION, NGIRCd_VersionAddition);
|
||||
#endif
|
||||
} /* Fill_Version */
|
||||
|
||||
|
||||
GLOBAL VOID
|
||||
NGIRCd_Rehash( VOID )
|
||||
/**
|
||||
* Reload the server configuration file.
|
||||
*/
|
||||
GLOBAL void
|
||||
NGIRCd_Rehash( void )
|
||||
{
|
||||
CHAR old_name[CLIENT_ID_LEN];
|
||||
char old_name[CLIENT_ID_LEN];
|
||||
unsigned old_nicklen;
|
||||
|
||||
Log( LOG_NOTICE|LOG_snotice, "Re-reading configuration NOW!" );
|
||||
NGIRCd_SignalRehash = FALSE;
|
||||
NGIRCd_SignalRehash = false;
|
||||
|
||||
/* Close down all listening sockets */
|
||||
Conn_ExitListeners( );
|
||||
|
||||
/* Remember old server name */
|
||||
strcpy( old_name, Conf_ServerName );
|
||||
/* Remember old server name and nick name length */
|
||||
strlcpy( old_name, Conf_ServerName, sizeof old_name );
|
||||
old_nicklen = Conf_MaxNickLength;
|
||||
|
||||
/* Re-read configuration ... */
|
||||
Conf_Rehash( );
|
||||
|
||||
/* Recover old server name: it can't be changed during run-time */
|
||||
if( strcmp( old_name, Conf_ServerName ) != 0 )
|
||||
{
|
||||
strcpy( Conf_ServerName, old_name );
|
||||
Log( LOG_ERR, "Can't change \"ServerName\" on runtime! Ignored new name." );
|
||||
/* Recover old server name and nick name length: these values can't
|
||||
* be changed during run-time */
|
||||
if (strcmp(old_name, Conf_ServerName) != 0 ) {
|
||||
strlcpy(Conf_ServerName, old_name, sizeof Conf_ServerName);
|
||||
Log(LOG_ERR, "Can't change \"ServerName\" on runtime! Ignored new name.");
|
||||
}
|
||||
if (old_nicklen != Conf_MaxNickLength) {
|
||||
Conf_MaxNickLength = old_nicklen;
|
||||
Log(LOG_ERR, "Can't change \"MaxNickLength\" on runtime! Ignored new value.");
|
||||
}
|
||||
|
||||
/* Create new pre-defined channels */
|
||||
@@ -462,8 +461,11 @@ NGIRCd_Rehash( VOID )
|
||||
} /* NGIRCd_Rehash */
|
||||
|
||||
|
||||
LOCAL VOID
|
||||
Initialize_Signal_Handler( VOID )
|
||||
/**
|
||||
* Initialize the signal handler.
|
||||
*/
|
||||
static void
|
||||
Initialize_Signal_Handler( void )
|
||||
{
|
||||
/* Signal-Handler initialisieren: einige Signale
|
||||
* werden ignoriert, andere speziell behandelt. */
|
||||
@@ -484,49 +486,51 @@ Initialize_Signal_Handler( VOID )
|
||||
#endif
|
||||
|
||||
/* Signal-Handler einhaengen */
|
||||
sigaction( SIGINT, &saction, NULL );
|
||||
sigaction( SIGQUIT, &saction, NULL );
|
||||
sigaction( SIGTERM, &saction, NULL);
|
||||
sigaction( SIGHUP, &saction, NULL);
|
||||
sigaction( SIGCHLD, &saction, NULL);
|
||||
sigaction(SIGINT, &saction, NULL);
|
||||
sigaction(SIGQUIT, &saction, NULL);
|
||||
sigaction(SIGTERM, &saction, NULL);
|
||||
sigaction(SIGHUP, &saction, NULL);
|
||||
sigaction(SIGCHLD, &saction, NULL);
|
||||
|
||||
/* einige Signale ignorieren */
|
||||
saction.sa_handler = SIG_IGN;
|
||||
sigaction( SIGPIPE, &saction, NULL );
|
||||
sigaction(SIGPIPE, &saction, NULL);
|
||||
#else
|
||||
/* kein sigaction() vorhanden */
|
||||
|
||||
/* Signal-Handler einhaengen */
|
||||
signal( SIGINT, Signal_Handler );
|
||||
signal( SIGQUIT, Signal_Handler );
|
||||
signal( SIGTERM, Signal_Handler );
|
||||
signal( SIGHUP, Signal_Handler );
|
||||
signal( SIGCHLD, Signal_Handler );
|
||||
signal(SIGINT, Signal_Handler);
|
||||
signal(SIGQUIT, Signal_Handler);
|
||||
signal(SIGTERM, Signal_Handler);
|
||||
signal(SIGHUP, Signal_Handler);
|
||||
signal(SIGCHLD, Signal_Handler);
|
||||
|
||||
/* einige Signale ignorieren */
|
||||
signal( SIGPIPE, SIG_IGN );
|
||||
signal(SIGPIPE, SIG_IGN);
|
||||
#endif
|
||||
} /* Initialize_Signal_Handler */
|
||||
|
||||
|
||||
LOCAL VOID
|
||||
Signal_Handler( INT Signal )
|
||||
/**
|
||||
* Signal handler of ngIRCd.
|
||||
* This function is called whenever ngIRCd catches a signal sent by the
|
||||
* user and/or the system to it. For example SIGTERM and SIGHUP.
|
||||
* @param Signal Number of the signal to handle.
|
||||
*/
|
||||
static void
|
||||
Signal_Handler( int Signal )
|
||||
{
|
||||
/* Signal-Handler. Dieser wird aufgerufen, wenn eines der Signale eintrifft,
|
||||
* fuer das wir uns registriert haben (vgl. Initialize_Signal_Handler). Die
|
||||
* Nummer des eingetroffenen Signals wird der Funktion uebergeben. */
|
||||
|
||||
switch( Signal )
|
||||
{
|
||||
case SIGTERM:
|
||||
case SIGINT:
|
||||
case SIGQUIT:
|
||||
/* wir soll(t)en uns wohl beenden ... */
|
||||
NGIRCd_SignalQuit = TRUE;
|
||||
NGIRCd_SignalQuit = true;
|
||||
break;
|
||||
case SIGHUP:
|
||||
/* Konfiguration neu einlesen: */
|
||||
NGIRCd_SignalRehash = TRUE;
|
||||
NGIRCd_SignalRehash = true;
|
||||
break;
|
||||
case SIGCHLD:
|
||||
/* Child-Prozess wurde beendet. Zombies vermeiden: */
|
||||
@@ -541,26 +545,34 @@ Signal_Handler( INT Signal )
|
||||
} /* Signal_Handler */
|
||||
|
||||
|
||||
LOCAL VOID
|
||||
Show_Version( VOID )
|
||||
/**
|
||||
* Display copyright and version information of ngIRCd on the console.
|
||||
*/
|
||||
static void
|
||||
Show_Version( void )
|
||||
{
|
||||
puts( NGIRCd_Version( ));
|
||||
puts( "Copyright (c)2001-2004 by Alexander Barton (<alex@barton.de>)." );
|
||||
puts( "Homepage: <http://arthur.ath.cx/~alex/ngircd/>\n" );
|
||||
puts( NGIRCd_Version );
|
||||
puts( "Copyright (c)2001-2007 Alexander Barton (<alex@barton.de>) and Contributors." );
|
||||
puts( "Homepage: <http://ngircd.barton.de/>\n" );
|
||||
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." );
|
||||
} /* Show_Version */
|
||||
|
||||
|
||||
LOCAL VOID
|
||||
Show_Help( VOID )
|
||||
/**
|
||||
* Display a short help text on the console.
|
||||
* This help depends on the configuration of the executable and only shows
|
||||
* options that are actually enabled.
|
||||
*/
|
||||
static void
|
||||
Show_Help( void )
|
||||
{
|
||||
#ifdef DEBUG
|
||||
puts( " -d, --debug log extra debug messages" );
|
||||
#endif
|
||||
puts( " -f, --config <f> use file <f> as configuration file" );
|
||||
puts( " -n, --nodaemon don't fork and don't detach from controlling terminal" );
|
||||
puts( " -p, --passive disable automatic connections to other servers" );
|
||||
puts( " -n, --nodaemon don't fork and don't detach from controlling terminal" );
|
||||
puts( " -p, --passive disable automatic connections to other servers" );
|
||||
#ifdef SNIFFER
|
||||
puts( " -s, --sniffer enable network sniffer and display all IRC traffic" );
|
||||
#endif
|
||||
@@ -570,4 +582,235 @@ Show_Help( VOID )
|
||||
} /* Show_Help */
|
||||
|
||||
|
||||
/**
|
||||
* Delete the file containing the process ID (PID).
|
||||
*/
|
||||
static void
|
||||
Pidfile_Delete( void )
|
||||
{
|
||||
/* Pidfile configured? */
|
||||
if( ! Conf_PidFile[0] ) return;
|
||||
|
||||
#ifdef DEBUG
|
||||
Log( LOG_DEBUG, "Removing PID file (%s) ...", Conf_PidFile );
|
||||
#endif
|
||||
|
||||
if( unlink( Conf_PidFile ))
|
||||
Log( LOG_ERR, "Error unlinking PID file (%s): %s", Conf_PidFile, strerror( errno ));
|
||||
} /* Pidfile_Delete */
|
||||
|
||||
|
||||
/**
|
||||
* Create the file containing the process ID of ngIRCd ("PID file").
|
||||
* @param pid The process ID to be stored in this file.
|
||||
*/
|
||||
static void
|
||||
Pidfile_Create(pid_t pid)
|
||||
{
|
||||
int pidfd;
|
||||
char pidbuf[64];
|
||||
int len;
|
||||
|
||||
/* Pidfile configured? */
|
||||
if( ! Conf_PidFile[0] ) return;
|
||||
|
||||
#ifdef DEBUG
|
||||
Log( LOG_DEBUG, "Creating PID file (%s) ...", Conf_PidFile );
|
||||
#endif
|
||||
|
||||
pidfd = open( Conf_PidFile, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
|
||||
if ( pidfd < 0 ) {
|
||||
Log( LOG_ERR, "Error writing PID file (%s): %s", Conf_PidFile, strerror( errno ));
|
||||
return;
|
||||
}
|
||||
|
||||
len = snprintf(pidbuf, sizeof pidbuf, "%ld\n", (long)pid);
|
||||
if (len < 0 || len >= (int)sizeof pidbuf) {
|
||||
Log( LOG_ERR, "Error converting pid");
|
||||
return;
|
||||
}
|
||||
|
||||
if (write(pidfd, pidbuf, (size_t)len) != (ssize_t)len)
|
||||
Log( LOG_ERR, "Can't write PID file (%s): %s", Conf_PidFile, strerror( errno ));
|
||||
|
||||
if( close(pidfd) != 0 )
|
||||
Log( LOG_ERR, "Error closing PID file (%s): %s", Conf_PidFile, strerror( errno ));
|
||||
} /* Pidfile_Create */
|
||||
|
||||
|
||||
/**
|
||||
* Redirect stdin, stdout and stderr to apropriate file handles.
|
||||
*/
|
||||
static void
|
||||
Setup_FDStreams( void )
|
||||
{
|
||||
int fd;
|
||||
|
||||
/* Test if we can open /dev/null for reading and writing. If not
|
||||
* we are most probably chrooted already and the server has been
|
||||
* restarted. So we simply don't try to redirect stdXXX ... */
|
||||
fd = open( "/dev/null", O_RDWR );
|
||||
if ( fd < 0 ) {
|
||||
Log(LOG_WARNING, "Could not open /dev/null: %s", strerror(errno));
|
||||
return;
|
||||
}
|
||||
|
||||
fflush(stdout);
|
||||
fflush(stderr);
|
||||
|
||||
/* Create new stdin(0), stdout(1) and stderr(2) descriptors */
|
||||
dup2( fd, 0 ); dup2( fd, 1 ); dup2( fd, 2 );
|
||||
|
||||
/* Close newly opened file descriptor if not stdin/out/err */
|
||||
if( fd > 2 ) close( fd );
|
||||
} /* Setup_FDStreams */
|
||||
|
||||
|
||||
static bool
|
||||
NGIRCd_getNobodyID(uid_t *uid, gid_t *gid )
|
||||
{
|
||||
struct passwd *pwd;
|
||||
|
||||
pwd = getpwnam("nobody");
|
||||
if (!pwd) return false;
|
||||
|
||||
if ( !pwd->pw_uid || !pwd->pw_gid)
|
||||
return false;
|
||||
|
||||
*uid = pwd->pw_uid;
|
||||
*gid = pwd->pw_gid;
|
||||
endpwent();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
static bool
|
||||
NGIRCd_Init( bool NGIRCd_NoDaemon )
|
||||
{
|
||||
static bool initialized;
|
||||
bool chrooted = false;
|
||||
struct passwd *pwd;
|
||||
struct group *grp;
|
||||
int real_errno;
|
||||
pid_t pid;
|
||||
|
||||
if (initialized)
|
||||
return true;
|
||||
|
||||
if( Conf_Chroot[0] ) {
|
||||
if( chdir( Conf_Chroot ) != 0 ) {
|
||||
Log( LOG_ERR, "Can't chdir() in ChrootDir (%s): %s", Conf_Chroot, strerror( errno ));
|
||||
return false;
|
||||
}
|
||||
|
||||
if( chroot( Conf_Chroot ) != 0 ) {
|
||||
if (errno != EPERM) {
|
||||
Log( LOG_ERR, "Can't change root directory to \"%s\": %s",
|
||||
Conf_Chroot, strerror( errno ));
|
||||
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
chrooted = true;
|
||||
Log( LOG_INFO, "Changed root and working directory to \"%s\".", Conf_Chroot );
|
||||
}
|
||||
}
|
||||
|
||||
if (Conf_UID == 0) {
|
||||
Log(LOG_INFO, "ServerUID must not be 0, using \"nobody\" instead.", Conf_UID);
|
||||
|
||||
if (! NGIRCd_getNobodyID(&Conf_UID, &Conf_GID)) {
|
||||
Log(LOG_WARNING, "Could not get user/group ID of user \"nobody\": %s",
|
||||
errno ? strerror(errno) : "not found" );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (getgid() != Conf_GID) {
|
||||
/* Change group ID */
|
||||
if (setgid(Conf_GID) != 0) {
|
||||
real_errno = errno;
|
||||
Log( LOG_ERR, "Can't change group ID to %u: %s", Conf_GID, strerror( errno ));
|
||||
if (real_errno != EPERM)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (getuid() != Conf_UID) {
|
||||
/* Change user ID */
|
||||
if (setuid(Conf_UID) != 0) {
|
||||
real_errno = errno;
|
||||
Log(LOG_ERR, "Can't change user ID to %u: %s", Conf_UID, strerror(errno));
|
||||
if (real_errno != EPERM)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
initialized = true;
|
||||
|
||||
/* Normally a child process is forked which isn't any longer
|
||||
* connected to ther controlling terminal. Use "--nodaemon"
|
||||
* to disable this "daemon mode" (useful for debugging). */
|
||||
if ( ! NGIRCd_NoDaemon ) {
|
||||
pid = fork( );
|
||||
if( pid > 0 ) {
|
||||
/* "Old" process: exit. */
|
||||
exit( 0 );
|
||||
}
|
||||
if( pid < 0 ) {
|
||||
/* Error!? */
|
||||
fprintf( stderr, "%s: Can't fork: %s!\nFatal error, exiting now ...\n",
|
||||
PACKAGE_NAME, strerror( errno ));
|
||||
exit( 1 );
|
||||
}
|
||||
|
||||
/* New child process */
|
||||
(void)setsid( );
|
||||
chdir( "/" );
|
||||
|
||||
/* Detach stdin, stdout and stderr */
|
||||
Setup_FDStreams( );
|
||||
}
|
||||
pid = getpid();
|
||||
|
||||
Pidfile_Create( pid );
|
||||
|
||||
/* Check UID/GID we are running as, can be different from values
|
||||
* configured (e. g. if we were already started with a UID>0. */
|
||||
Conf_UID = getuid();
|
||||
Conf_GID = getgid();
|
||||
|
||||
pwd = getpwuid( Conf_UID );
|
||||
grp = getgrgid( Conf_GID );
|
||||
|
||||
Log( LOG_INFO, "Running as user %s(%ld), group %s(%ld), with PID %ld.",
|
||||
pwd ? pwd->pw_name : "unknown", Conf_UID,
|
||||
grp ? grp->gr_name : "unknown", Conf_GID, pid);
|
||||
|
||||
if ( chrooted ) {
|
||||
Log( LOG_INFO, "Running chrooted, chrootdir \"%s\".", Conf_Chroot );
|
||||
return true;
|
||||
} else {
|
||||
Log( LOG_INFO, "Not running chrooted." );
|
||||
}
|
||||
|
||||
/* Change working directory to home directory of the user
|
||||
* we are running as (only when running in daemon mode and not in chroot) */
|
||||
|
||||
if ( pwd ) {
|
||||
if (!NGIRCd_NoDaemon ) {
|
||||
if( chdir( pwd->pw_dir ) == 0 )
|
||||
Log( LOG_DEBUG, "Changed working directory to \"%s\" ...", pwd->pw_dir );
|
||||
else
|
||||
Log( LOG_INFO, "Notice: Can't change working directory to \"%s\": %s",
|
||||
pwd->pw_dir, strerror( errno ));
|
||||
}
|
||||
} else {
|
||||
Log( LOG_ERR, "Can't get user informaton for UID %d!?", Conf_UID );
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* -eof- */
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: ngircd.h,v 1.19 2002/12/26 16:48:14 alex Exp $
|
||||
* $Id: ngircd.h,v 1.22 2005/06/24 19:20:56 fw Exp $
|
||||
*
|
||||
* Prototypes of the "main module".
|
||||
*/
|
||||
@@ -23,35 +23,32 @@
|
||||
|
||||
|
||||
GLOBAL time_t NGIRCd_Start; /* Startzeitpunkt des Daemon */
|
||||
GLOBAL CHAR NGIRCd_StartStr[64];
|
||||
GLOBAL char NGIRCd_StartStr[64];
|
||||
GLOBAL char NGIRCd_Version[126];
|
||||
GLOBAL char NGIRCd_VersionAddition[126];
|
||||
|
||||
#ifdef DEBUG
|
||||
GLOBAL BOOLEAN NGIRCd_Debug; /* Debug-Modus aktivieren */
|
||||
GLOBAL bool NGIRCd_Debug; /* Debug-Modus aktivieren */
|
||||
#endif
|
||||
|
||||
#ifdef SNIFFER
|
||||
GLOBAL BOOLEAN NGIRCd_Sniffer; /* Sniffer aktivieren */
|
||||
GLOBAL bool NGIRCd_Sniffer; /* Sniffer aktivieren */
|
||||
#endif
|
||||
|
||||
GLOBAL BOOLEAN NGIRCd_NoDaemon; /* nicht im Hintergrund laufen */
|
||||
GLOBAL bool NGIRCd_Passive; /* nicht zu anderen Servern connecten */
|
||||
|
||||
GLOBAL BOOLEAN NGIRCd_Passive; /* nicht zu anderen Servern connecten */
|
||||
GLOBAL bool NGIRCd_SignalQuit; /* true: quit server*/
|
||||
GLOBAL bool NGIRCd_SignalRestart; /* true: restart server */
|
||||
GLOBAL bool NGIRCd_SignalRehash; /* true: reload configuration */
|
||||
|
||||
GLOBAL BOOLEAN NGIRCd_SignalQuit; /* TRUE: quit server*/
|
||||
GLOBAL BOOLEAN NGIRCd_SignalRestart; /* TRUE: restart server */
|
||||
GLOBAL BOOLEAN NGIRCd_SignalRehash; /* TRUE: reload configuration */
|
||||
GLOBAL char NGIRCd_DebugLevel[2]; /* Debug-Level fuer IRC_VERSION() */
|
||||
|
||||
GLOBAL CHAR NGIRCd_DebugLevel[2]; /* Debug-Level fuer IRC_VERSION() */
|
||||
GLOBAL char NGIRCd_ConfFile[FNAME_LEN]; /* Konfigurationsdatei */
|
||||
|
||||
GLOBAL CHAR NGIRCd_ConfFile[FNAME_LEN]; /* Konfigurationsdatei */
|
||||
|
||||
GLOBAL CHAR NGIRCd_ProtoID[COMMAND_LEN];/* Protokoll- und Server-Identifikation */
|
||||
GLOBAL char NGIRCd_ProtoID[COMMAND_LEN];/* Protokoll- und Server-Identifikation */
|
||||
|
||||
|
||||
GLOBAL CHAR *NGIRCd_Version PARAMS((VOID ));
|
||||
GLOBAL CHAR *NGIRCd_VersionAddition PARAMS((VOID ));
|
||||
|
||||
GLOBAL VOID NGIRCd_Rehash PARAMS(( VOID ));
|
||||
GLOBAL void NGIRCd_Rehash PARAMS(( void ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
334
src/ngircd/numeric.c
Normal file
334
src/ngircd/numeric.c
Normal file
@@ -0,0 +1,334 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001-2007 Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* Handlers for IRC numerics sent to the server
|
||||
*/
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: numeric.c,v 1.1 2007/11/21 12:20:32 alex Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "defines.h"
|
||||
#include "resolve.h"
|
||||
#include "conn.h"
|
||||
#include "conf.h"
|
||||
#include "conn.h"
|
||||
#include "client.h"
|
||||
#include "channel.h"
|
||||
#include "irc-write.h"
|
||||
#include "lists.h"
|
||||
#include "log.h"
|
||||
#include "messages.h"
|
||||
#include "parse.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "numeric.h"
|
||||
|
||||
|
||||
/**
|
||||
* Announce new server in the network
|
||||
* @param Client New server
|
||||
* @param Server Existing server in the network
|
||||
*/
|
||||
static bool
|
||||
Announce_Server(CLIENT * Client, CLIENT * Server)
|
||||
{
|
||||
CLIENT *c;
|
||||
|
||||
if (Client_Conn(Server) > NONE) {
|
||||
/* Announce the new server to the one already registered
|
||||
* which is directly connected to the local server */
|
||||
if (!IRC_WriteStrClient
|
||||
(Server, "SERVER %s %d %d :%s", Client_ID(Client),
|
||||
Client_Hops(Client) + 1, Client_MyToken(Client),
|
||||
Client_Info(Client)))
|
||||
return DISCONNECTED;
|
||||
}
|
||||
|
||||
if (Client_Hops(Server) == 1)
|
||||
c = Client_ThisServer();
|
||||
else
|
||||
c = Client_Introducer(Server);
|
||||
|
||||
/* Inform new server about the one already registered in the network */
|
||||
return IRC_WriteStrClientPrefix(Client, c, "SERVER %s %d %d :%s",
|
||||
Client_ID(Server), Client_Hops(Server) + 1,
|
||||
Client_MyToken(Server), Client_Info(Server));
|
||||
} /* Announce_Server */
|
||||
|
||||
|
||||
/**
|
||||
* Announce existing user to a new server
|
||||
* @param Client New server
|
||||
* @param User Existing user in the network
|
||||
*/
|
||||
static bool
|
||||
Announce_User(CLIENT * Client, CLIENT * User)
|
||||
{
|
||||
return IRC_WriteStrClient(Client, "NICK %s %d %s %s %d +%s :%s",
|
||||
Client_ID(User), Client_Hops(User) + 1, Client_User(User),
|
||||
Client_Hostname(User), Client_MyToken(Client_Introducer(User)),
|
||||
Client_Modes(User), Client_Info(User));
|
||||
} /* Announce_User */
|
||||
|
||||
|
||||
#ifdef IRCPLUS
|
||||
|
||||
/**
|
||||
* Synchronize invite and ban lists between servers
|
||||
* @param Client New server
|
||||
*/
|
||||
static bool
|
||||
Synchronize_Lists(CLIENT * Client)
|
||||
{
|
||||
CHANNEL *c;
|
||||
struct list_head *head;
|
||||
struct list_elem *elem;
|
||||
|
||||
assert(Client != NULL);
|
||||
|
||||
c = Channel_First();
|
||||
while (c) {
|
||||
/* ban list */
|
||||
head = Channel_GetListBans(c);
|
||||
elem = Lists_GetFirst(head);
|
||||
while (elem) {
|
||||
if (!IRC_WriteStrClient(Client, "MODE %s +b %s",
|
||||
Channel_Name(c),
|
||||
Lists_GetMask(elem))) {
|
||||
return DISCONNECTED;
|
||||
}
|
||||
elem = Lists_GetNext(elem);
|
||||
}
|
||||
|
||||
/* invite list */
|
||||
head = Channel_GetListInvites(c);
|
||||
elem = Lists_GetFirst(head);
|
||||
while (elem) {
|
||||
if (!IRC_WriteStrClient(Client, "MODE %s +I %s",
|
||||
Channel_Name(c),
|
||||
Lists_GetMask(elem))) {
|
||||
return DISCONNECTED;
|
||||
}
|
||||
elem = Lists_GetNext(elem);
|
||||
}
|
||||
|
||||
c = Channel_Next(c);
|
||||
}
|
||||
return CONNECTED;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Send CHANINFO commands to a new server (inform it about existing channels).
|
||||
* @param Client New server
|
||||
* @param Chan Channel
|
||||
*/
|
||||
static bool
|
||||
Send_CHANINFO(CLIENT * Client, CHANNEL * Chan)
|
||||
{
|
||||
char *modes, *topic;
|
||||
bool has_k, has_l;
|
||||
|
||||
#ifdef DEBUG
|
||||
Log(LOG_DEBUG, "Sending CHANINFO commands ...");
|
||||
#endif
|
||||
|
||||
modes = Channel_Modes(Chan);
|
||||
topic = Channel_Topic(Chan);
|
||||
|
||||
if (!*modes && !*topic)
|
||||
return CONNECTED;
|
||||
|
||||
has_k = strchr(modes, 'k') != NULL;
|
||||
has_l = strchr(modes, 'l') != NULL;
|
||||
|
||||
/* send CHANINFO */
|
||||
if (!has_k && !has_l) {
|
||||
if (!*topic) {
|
||||
/* "CHANINFO <chan> +<modes>" */
|
||||
return IRC_WriteStrClient(Client, "CHANINFO %s +%s",
|
||||
Channel_Name(Chan), modes);
|
||||
}
|
||||
/* "CHANINFO <chan> +<modes> :<topic>" */
|
||||
return IRC_WriteStrClient(Client, "CHANINFO %s +%s :%s",
|
||||
Channel_Name(Chan), modes, topic);
|
||||
}
|
||||
/* "CHANINFO <chan> +<modes> <key> <limit> :<topic>" */
|
||||
return IRC_WriteStrClient(Client, "CHANINFO %s +%s %s %lu :%s",
|
||||
Channel_Name(Chan), modes,
|
||||
has_k ? Channel_Key(Chan) : "*",
|
||||
has_l ? Channel_MaxUsers(Chan) : 0, topic);
|
||||
} /* Send_CHANINFO */
|
||||
|
||||
#endif /* IRCPLUS */
|
||||
|
||||
|
||||
/**
|
||||
* Handle ENDOFMOTD (376) numeric and login remote server.
|
||||
* The peer is either an IRC server (no IRC+ protocol), or we got the
|
||||
* ENDOFMOTD numeric from an IRC+ server. We have to register the new server.
|
||||
*/
|
||||
GLOBAL bool
|
||||
IRC_Num_ENDOFMOTD(CLIENT * Client, UNUSED REQUEST * Req)
|
||||
{
|
||||
char str[LINE_LEN];
|
||||
int max_hops, i;
|
||||
CLIENT *c, *cl;
|
||||
CHANNEL *chan;
|
||||
CL2CHAN *cl2chan;
|
||||
|
||||
Client_SetType(Client, CLIENT_SERVER);
|
||||
|
||||
Log(LOG_NOTICE | LOG_snotice,
|
||||
"Server \"%s\" registered (connection %d, 1 hop - direct link).",
|
||||
Client_ID(Client), Client_Conn(Client));
|
||||
|
||||
/* Get highest hop count */
|
||||
max_hops = 0;
|
||||
c = Client_First();
|
||||
while (c) {
|
||||
if (Client_Hops(c) > max_hops)
|
||||
max_hops = Client_Hops(c);
|
||||
c = Client_Next(c);
|
||||
}
|
||||
|
||||
/* Inform the new server about all other servers, and announce the
|
||||
* new server to all the already registered ones. Important: we have
|
||||
* to do this "in order" and can't introduce servers of which the
|
||||
* "toplevel server" isn't known already. */
|
||||
for (i = 0; i < (max_hops + 1); i++) {
|
||||
for (c = Client_First(); c != NULL; c = Client_Next(c)) {
|
||||
if (Client_Type(c) != CLIENT_SERVER)
|
||||
continue; /* not a server */
|
||||
if (Client_Hops(c) != i)
|
||||
continue; /* not actual "nesting level" */
|
||||
if (c == Client || c == Client_ThisServer())
|
||||
continue; /* that's us or the peer! */
|
||||
|
||||
if (!Announce_Server(Client, c))
|
||||
return DISCONNECTED;
|
||||
}
|
||||
}
|
||||
|
||||
/* Announce all the users to the new server */
|
||||
c = Client_First();
|
||||
while (c) {
|
||||
if (Client_Type(c) == CLIENT_USER) {
|
||||
if (!Announce_User(Client, c))
|
||||
return DISCONNECTED;
|
||||
}
|
||||
c = Client_Next(c);
|
||||
}
|
||||
|
||||
/* Announce all channels to the new server */
|
||||
chan = Channel_First();
|
||||
while (chan) {
|
||||
#ifdef IRCPLUS
|
||||
/* Send CHANINFO if the peer supports it */
|
||||
if (strchr(Client_Flags(Client), 'C')) {
|
||||
if (!Send_CHANINFO(Client, chan))
|
||||
return DISCONNECTED;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Get all the members of this channel */
|
||||
cl2chan = Channel_FirstMember(chan);
|
||||
snprintf(str, sizeof(str), "NJOIN %s :", Channel_Name(chan));
|
||||
while (cl2chan) {
|
||||
cl = Channel_GetClient(cl2chan);
|
||||
assert(cl != NULL);
|
||||
|
||||
/* Nick name, with modes (if applicable) */
|
||||
if (str[strlen(str) - 1] != ':')
|
||||
strlcat(str, ",", sizeof(str));
|
||||
if (strchr(Channel_UserModes(chan, cl), 'v'))
|
||||
strlcat(str, "+", sizeof(str));
|
||||
if (strchr(Channel_UserModes(chan, cl), 'o'))
|
||||
strlcat(str, "@", sizeof(str));
|
||||
strlcat(str, Client_ID(cl), sizeof(str));
|
||||
|
||||
/* Send the data if the buffer is "full" */
|
||||
if (strlen(str) > (LINE_LEN - CLIENT_NICK_LEN - 8)) {
|
||||
if (!IRC_WriteStrClient(Client, "%s", str))
|
||||
return DISCONNECTED;
|
||||
snprintf(str, sizeof(str), "NJOIN %s :",
|
||||
Channel_Name(chan));
|
||||
}
|
||||
|
||||
cl2chan = Channel_NextMember(chan, cl2chan);
|
||||
}
|
||||
|
||||
/* Data left in the buffer? */
|
||||
if (str[strlen(str) - 1] != ':') {
|
||||
/* Yes, send it ... */
|
||||
if (!IRC_WriteStrClient(Client, "%s", str))
|
||||
return DISCONNECTED;
|
||||
}
|
||||
|
||||
/* Get next channel ... */
|
||||
chan = Channel_Next(chan);
|
||||
}
|
||||
|
||||
#ifdef IRCPLUS
|
||||
if (strchr(Client_Flags(Client), 'L')) {
|
||||
LogDebug("Synchronizing INVITE- and BAN-lists ...");
|
||||
if (!Synchronize_Lists(Client))
|
||||
return DISCONNECTED;
|
||||
}
|
||||
#endif
|
||||
|
||||
return CONNECTED;
|
||||
} /* IRC_Num_ENDOFMOTD */
|
||||
|
||||
|
||||
/**
|
||||
* Handle ISUPPORT (005) numeric.
|
||||
*/
|
||||
GLOBAL bool
|
||||
IRC_Num_ISUPPORT(CLIENT * Client, REQUEST * Req)
|
||||
{
|
||||
int i;
|
||||
char *key, *value;
|
||||
|
||||
for (i = 1; i < Req->argc - 1; i++) {
|
||||
key = Req->argv[i];
|
||||
value = strchr(key, '=');
|
||||
if (value)
|
||||
*value++ = '\0';
|
||||
else
|
||||
value = "";
|
||||
|
||||
if (strcmp("NICKLEN", key) == 0) {
|
||||
if ((unsigned int)atol(value) == Conf_MaxNickLength - 1)
|
||||
continue;
|
||||
|
||||
/* Nick name length settings are different! */
|
||||
Log(LOG_ERR,
|
||||
"Peer uses incompatible nick name length (%d/%d)! Disconnecting ...",
|
||||
Conf_MaxNickLength - 1, atoi(value));
|
||||
Conn_Close(Client_Conn(Client),
|
||||
"Incompatible nick name length",
|
||||
NULL, false);
|
||||
return DISCONNECTED;
|
||||
}
|
||||
}
|
||||
|
||||
return CONNECTED;
|
||||
} /* IRC_Num_ISUPPORT */
|
||||
|
||||
|
||||
/* -eof- */
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user