mirror of
https://github.com/osmarks/ngircd.git
synced 2025-11-01 22:42:59 +00:00
Compare commits
1105 Commits
rel-0-3-0
...
branch-0-9
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ab1e81841b | ||
|
|
957cdda1c0 | ||
|
|
c35b810b90 | ||
|
|
3179bd3090 | ||
|
|
f95d813064 | ||
|
|
a854a38616 | ||
|
|
51b22759b6 | ||
|
|
521782ad05 | ||
|
|
84e23f09fc | ||
|
|
4429afe3c2 | ||
|
|
216eb30c73 | ||
|
|
ff91c6db38 | ||
|
|
a8d50a1ee4 | ||
|
|
7962ba5fe0 | ||
|
|
04766b8f3d | ||
|
|
2019324741 | ||
|
|
99e718eff9 | ||
|
|
61776e9a57 | ||
|
|
eccf4ea5f2 | ||
|
|
914fbac0f1 | ||
|
|
b6ce4ce002 | ||
|
|
1246ec04b8 | ||
|
|
6335461bc1 | ||
|
|
8e5d37efc8 | ||
|
|
ac8559171b | ||
|
|
d052fdff78 | ||
|
|
fe9525d105 | ||
|
|
5b29518ae5 | ||
|
|
b715a5f061 | ||
|
|
0b31b46353 | ||
|
|
8a7ae2dfc1 | ||
|
|
01ee1bdf2c | ||
|
|
13ee3e62be | ||
|
|
fc038ae444 | ||
|
|
8d1fe3b89a | ||
|
|
d74029851f | ||
|
|
8ff1a4b666 | ||
|
|
5f68d5f1e1 | ||
|
|
db2a41e5bc | ||
|
|
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 | ||
|
|
7281b8dd4d | ||
|
|
39fc76c4e4 | ||
|
|
a6d51c3a9e | ||
|
|
18b2227a0a | ||
|
|
47701feb08 | ||
|
|
59b903f3bb | ||
|
|
d433eb3896 | ||
|
|
c1e9841118 | ||
|
|
dd59820051 | ||
|
|
967476799f | ||
|
|
6b1e322865 | ||
|
|
1d8da4b525 | ||
|
|
292c7bd4c0 | ||
|
|
558fe6b453 | ||
|
|
bed119c9e5 | ||
|
|
64d330b726 | ||
|
|
cc25c52048 | ||
|
|
233210b906 | ||
|
|
f68e92eb9a | ||
|
|
b225081c2b | ||
|
|
30bbc5e1e1 | ||
|
|
0c07eb71a7 | ||
|
|
0b1202cd9e | ||
|
|
8212662d9d | ||
|
|
f697923c48 | ||
|
|
af77ce70b6 | ||
|
|
507a9e9cb3 | ||
|
|
779446298c | ||
|
|
cb76d96efb | ||
|
|
de1489b39b | ||
|
|
5155e1c67a | ||
|
|
1e9a958324 | ||
|
|
56227abc5e | ||
|
|
f9e651b333 | ||
|
|
bdaf53e799 | ||
|
|
33f4e6763b | ||
|
|
eaa550d690 | ||
|
|
f275c66e95 | ||
|
|
17fffea873 | ||
|
|
1e3363d2a4 | ||
|
|
6667bb6b77 | ||
|
|
b90bedbcb2 | ||
|
|
c2a154a33e | ||
|
|
6bbc086760 | ||
|
|
bb98fd8c85 | ||
|
|
e9b0ec9148 | ||
|
|
c53903eb3f | ||
|
|
57c7e23622 | ||
|
|
cdb694aeb3 | ||
|
|
6cafa16a56 | ||
|
|
5589ebd9c3 | ||
|
|
f645e5b62e | ||
|
|
ad07c94c8d | ||
|
|
5a9c04619f | ||
|
|
ed94d5d5cd | ||
|
|
ea076a28f2 | ||
|
|
c9ccb66944 | ||
|
|
cb6279f102 | ||
|
|
b79b315dd4 | ||
|
|
c40592d2ce | ||
|
|
05170bc94c | ||
|
|
07ad774f0a | ||
|
|
a8da1afe05 | ||
|
|
ff2c1efae8 | ||
|
|
05e2c0f048 | ||
|
|
d329a961bd | ||
|
|
606cdb69bf | ||
|
|
a5695e7ef8 | ||
|
|
2978b5edff | ||
|
|
be79fabcbf | ||
|
|
ec2f16fa16 | ||
|
|
7b6e26628a | ||
|
|
2981fe9eb7 | ||
|
|
20d002e155 | ||
|
|
cfe6356531 | ||
|
|
e33ab90379 | ||
|
|
d8f3c2b42b | ||
|
|
3debe00581 | ||
|
|
eb6113fc33 | ||
|
|
166c610957 | ||
|
|
b9f16c9635 | ||
|
|
1ed708ef39 | ||
|
|
5e4124d38d | ||
|
|
0d00ce6e38 | ||
|
|
057df41a9b | ||
|
|
5eb89619d6 | ||
|
|
6e03626eed | ||
|
|
d9efbe80e1 | ||
|
|
da9456dbca | ||
|
|
ac9390f08c | ||
|
|
3f602e5a25 | ||
|
|
6647da58fc | ||
|
|
225a338139 | ||
|
|
bfdf17ff32 | ||
|
|
260b8e5f36 | ||
|
|
9a009b24da | ||
|
|
83765a5a34 | ||
|
|
bdc08ae28e | ||
|
|
34ede2a91a | ||
|
|
0424747e95 | ||
|
|
8d5e170091 | ||
|
|
68ee133f87 | ||
|
|
27cd1e0d05 | ||
|
|
3dc4c92553 | ||
|
|
188e95f680 | ||
|
|
c5f4e9d095 | ||
|
|
e541da2a8f | ||
|
|
e55399c667 | ||
|
|
e7102559b9 | ||
|
|
32f8eb46ee | ||
|
|
0e01a37a69 | ||
|
|
927e626f03 | ||
|
|
277a048f4f | ||
|
|
dd0b37690b | ||
|
|
83194a23a3 | ||
|
|
a1ff081b8a | ||
|
|
e1c70a3c93 | ||
|
|
c43d47d69c | ||
|
|
bbf978dbcf | ||
|
|
090756523e | ||
|
|
8497d28fba | ||
|
|
cef95681ff | ||
|
|
52a24c4bbd | ||
|
|
e2968dd98d | ||
|
|
79b9592f27 | ||
|
|
0551f688f6 | ||
|
|
c74ac55832 | ||
|
|
b4dc216db3 | ||
|
|
cbf87971a4 | ||
|
|
4d656d12e9 | ||
|
|
da78dc4785 | ||
|
|
bd52d4e49c | ||
|
|
e0345e5e0a | ||
|
|
c1dd86d702 | ||
|
|
b25faf3c2a | ||
|
|
384d6b894a | ||
|
|
a061668b1a | ||
|
|
489d8c5cd0 | ||
|
|
daa996f177 | ||
|
|
7deacbaa11 | ||
|
|
c3dfd63bf3 | ||
|
|
f5b91cd03d | ||
|
|
8e43b16d22 | ||
|
|
4ef6dae1cd | ||
|
|
0b91df05e0 | ||
|
|
feafb6cb2e | ||
|
|
0391d35a67 | ||
|
|
a93b4d9789 | ||
|
|
eefa1b1c64 | ||
|
|
016e547daa | ||
|
|
b588eaed02 | ||
|
|
36e0345ce6 | ||
|
|
62796722f1 | ||
|
|
935ffd0dc0 | ||
|
|
fa54e6e2a4 | ||
|
|
179e760cf1 | ||
|
|
47faa8595a | ||
|
|
9ab97b29ae | ||
|
|
24df40eca7 | ||
|
|
02a22611be | ||
|
|
59a0fb8cd9 | ||
|
|
d383703b78 | ||
|
|
8291e10b96 | ||
|
|
312e4aeb86 | ||
|
|
ac4f25e3a7 | ||
|
|
7646739431 | ||
|
|
5f19a9418e | ||
|
|
3858e28e07 | ||
|
|
f53455977d | ||
|
|
9ca1f6a988 | ||
|
|
1a1ff404a8 | ||
|
|
c755b82dd9 | ||
|
|
8fc69bb6fb | ||
|
|
10edb7c741 | ||
|
|
ff019dd76f | ||
|
|
a004f34447 | ||
|
|
10bb43c66e | ||
|
|
b6999f10c0 | ||
|
|
516064dc06 | ||
|
|
a84b9d99a1 | ||
|
|
5170ecf045 | ||
|
|
23a28fa336 | ||
|
|
15b5e1a6eb | ||
|
|
ade2fdc9aa | ||
|
|
e744936d19 | ||
|
|
4a5b3f34a5 | ||
|
|
7640aa5190 | ||
|
|
35771fa776 | ||
|
|
439c945d56 | ||
|
|
93146b5718 | ||
|
|
fd4a6b5dd5 | ||
|
|
b896f8acda | ||
|
|
29bd35bc4f | ||
|
|
f179070113 | ||
|
|
f813833ba1 | ||
|
|
f349b18949 | ||
|
|
aa15257936 | ||
|
|
6e0c5698e4 | ||
|
|
cf4ad8d6f7 | ||
|
|
2a3f8cc57d | ||
|
|
560c79615c | ||
|
|
d1b2a1c4f9 | ||
|
|
9d8f425a9a | ||
|
|
fbec1f1070 | ||
|
|
d978d8ddbb | ||
|
|
e07542a1ff | ||
|
|
155f26eee2 | ||
|
|
9eee0c883b | ||
|
|
939767d502 | ||
|
|
dccb297678 | ||
|
|
2152e37722 | ||
|
|
28cd2c1191 | ||
|
|
947c512435 | ||
|
|
42c4e6c7b1 | ||
|
|
f9cb4a42a0 | ||
|
|
0f3e84f415 | ||
|
|
6a0bd57ec4 | ||
|
|
fc1118cb5a | ||
|
|
070976e443 | ||
|
|
0bcaed3564 | ||
|
|
df00b38a0b | ||
|
|
aca6310dac | ||
|
|
ff98833136 | ||
|
|
1443bc381c | ||
|
|
9d82635b15 | ||
|
|
fa80012e71 | ||
|
|
43d9a62473 | ||
|
|
51e1a2e04a | ||
|
|
b8a3178a1b | ||
|
|
bb94d18115 | ||
|
|
3b79965e38 | ||
|
|
e82e3c3fdc | ||
|
|
f39d628512 | ||
|
|
5b33308528 | ||
|
|
444fdcf905 | ||
|
|
1bf0426aaf | ||
|
|
8139505829 | ||
|
|
c9540015c8 | ||
|
|
2070cfe107 | ||
|
|
91f4aeec20 | ||
|
|
8c1df9ef8d | ||
|
|
c428ac7563 | ||
|
|
e12179aa92 | ||
|
|
cd9650c07e | ||
|
|
5e3e3ad445 | ||
|
|
e6a352dcfe | ||
|
|
e17976a172 | ||
|
|
ae6a7e7c0b | ||
|
|
717a26e37d | ||
|
|
8dadb17f83 | ||
|
|
281f7583f5 | ||
|
|
a7956f334e | ||
|
|
3e026ded6f | ||
|
|
4e485443d3 | ||
|
|
01b58a0582 | ||
|
|
f83ea4b124 | ||
|
|
b8d7dcec77 | ||
|
|
b77dae3499 | ||
|
|
0b04bfa7c0 | ||
|
|
4953c15bdf | ||
|
|
437f2c335f | ||
|
|
e68cdf304f | ||
|
|
a2544e496c | ||
|
|
e5b824388d | ||
|
|
214842853c | ||
|
|
cf6b9e3ec1 | ||
|
|
50d354bc21 | ||
|
|
3c9da65652 | ||
|
|
8340e4267c | ||
|
|
c9ee3ae4f0 | ||
|
|
e21b9d842c | ||
|
|
15e4f67402 | ||
|
|
01bec0daa2 | ||
|
|
d19813cc4b | ||
|
|
cf7660c975 | ||
|
|
9c5c0c7c84 | ||
|
|
4d2f279d2d | ||
|
|
371fc25967 | ||
|
|
b316c380ad | ||
|
|
695631b298 | ||
|
|
6626395c88 | ||
|
|
0ced4181b0 | ||
|
|
4f6f84e7e1 | ||
|
|
b8456d1ba6 | ||
|
|
fbdf85b553 | ||
|
|
e13cb291dd | ||
|
|
8193bf2070 | ||
|
|
5efd0987f3 | ||
|
|
60cf07c875 | ||
|
|
3c738ed46d | ||
|
|
9353a4a9cb | ||
|
|
18dfd96635 | ||
|
|
77751e0fbf | ||
|
|
d9a13b317e | ||
|
|
d449496aa4 | ||
|
|
2f90341225 | ||
|
|
ab44e1c6cc | ||
|
|
a3f59f1a5b | ||
|
|
212d36a33c | ||
|
|
d0304b19a2 | ||
|
|
c69b208bd4 | ||
|
|
397c5e2e02 | ||
|
|
77c4c015e3 | ||
|
|
43a4bc5b8b | ||
|
|
1df4081e50 | ||
|
|
b9d6a03e25 | ||
|
|
8841d87365 | ||
|
|
d9e3f834d7 | ||
|
|
210282d00f | ||
|
|
17f7c6d3ed | ||
|
|
a02bf31d50 | ||
|
|
98677b4348 | ||
|
|
03d5fd6cb7 | ||
|
|
3a811ef563 | ||
|
|
3e4f58e416 | ||
|
|
b7be46ed8a | ||
|
|
902ad91212 | ||
|
|
ca584143c6 | ||
|
|
892144dc71 | ||
|
|
8d024d05d2 | ||
|
|
69ad0e386e | ||
|
|
2e88dd72d1 | ||
|
|
7924fafb25 | ||
|
|
7f61f413f4 | ||
|
|
865c43080a | ||
|
|
c0d74a3860 | ||
|
|
3c7909ccec | ||
|
|
48ec815e99 | ||
|
|
80c6dc86ed | ||
|
|
25ca2b3cc5 | ||
|
|
f7fe170a5e | ||
|
|
e65ab4a3f7 | ||
|
|
2694017426 | ||
|
|
00e75ccd7d | ||
|
|
e907816380 | ||
|
|
b55915c1fe | ||
|
|
5b8b3b8384 | ||
|
|
9f74b95015 | ||
|
|
8b7b23cf8f | ||
|
|
b7eb5f66dc | ||
|
|
427be23b6e | ||
|
|
ba767481d9 | ||
|
|
490f28ffd1 | ||
|
|
c7f075236b | ||
|
|
44a2b3cf69 | ||
|
|
f0d633b5ac | ||
|
|
0f3f03b51d | ||
|
|
fa7b3f0e4c | ||
|
|
6725d7893c | ||
|
|
11c4e786fa | ||
|
|
b99af4fa47 | ||
|
|
6591f17f0a | ||
|
|
9f122037ae | ||
|
|
cde9dfdb77 | ||
|
|
f0349f5266 | ||
|
|
4807c4e636 | ||
|
|
c1cafbddfe | ||
|
|
bad7ac62a7 | ||
|
|
39219230b2 | ||
|
|
1e5fa014ba | ||
|
|
0efec7c094 | ||
|
|
c3a892e165 | ||
|
|
2e02da291a | ||
|
|
a39f479163 | ||
|
|
e50d568f25 | ||
|
|
0c471b84f7 | ||
|
|
1e59617d2c | ||
|
|
e93f545c74 | ||
|
|
a1437f1ad0 | ||
|
|
1d8cb34bc8 | ||
|
|
7a6f99a607 | ||
|
|
93a39e8782 | ||
|
|
a1dff15252 | ||
|
|
ee2c0f7701 | ||
|
|
d3a6537fce | ||
|
|
b0b797b396 | ||
|
|
2de5b5cf4a | ||
|
|
2625ce7875 | ||
|
|
65f3adca21 | ||
|
|
ecde730ec4 | ||
|
|
e553829a59 | ||
|
|
7cc12a3d63 | ||
|
|
ad98f2c20d | ||
|
|
dc8ca3dfaf | ||
|
|
ae128734ac | ||
|
|
f86bbd718d | ||
|
|
283aed75cf | ||
|
|
15d78412bc | ||
|
|
1fd9216ca4 | ||
|
|
a7eb18db4e | ||
|
|
5ecb00ed23 | ||
|
|
5e89b0c82d | ||
|
|
22b7b07932 | ||
|
|
57bc0d7895 | ||
|
|
5334778dbd | ||
|
|
1dd953b0c0 | ||
|
|
fa3dbfd8d6 | ||
|
|
4eb57b590b | ||
|
|
12bf203167 | ||
|
|
cf2d479437 | ||
|
|
413fed9858 | ||
|
|
60f14cca38 | ||
|
|
4f54760c4b | ||
|
|
c0e7a0124d | ||
|
|
b8cf379fd6 | ||
|
|
085a03d107 | ||
|
|
ab788a2ed1 | ||
|
|
4c6e07c309 | ||
|
|
e311cc0140 | ||
|
|
a5c9229084 | ||
|
|
a0c032b2ff | ||
|
|
03ec91f943 | ||
|
|
7233b72145 | ||
|
|
1656841f25 | ||
|
|
799511d472 | ||
|
|
ffb90f4cb5 | ||
|
|
e46b124ca4 | ||
|
|
c6b9f3a13d | ||
|
|
6d5b606c46 | ||
|
|
dd09b17eae | ||
|
|
caa7049e2b | ||
|
|
b2615bcc76 | ||
|
|
1c0ded41af | ||
|
|
7bbdfb3d84 | ||
|
|
0086d2771d | ||
|
|
98bc7d4fb7 | ||
|
|
be9df69116 | ||
|
|
f80a5ae1de | ||
|
|
b1a148905a | ||
|
|
8457fca570 | ||
|
|
999897f587 | ||
|
|
ab2d1ca41e | ||
|
|
ee489ee6d7 | ||
|
|
6250dcb1dc | ||
|
|
797f9170d7 | ||
|
|
071686ac6e | ||
|
|
70c9c05153 | ||
|
|
bf84670aaa | ||
|
|
d35c0137b7 | ||
|
|
ae39724a63 | ||
|
|
8da254ea74 | ||
|
|
47c8bcc8c9 | ||
|
|
9523e28179 | ||
|
|
a4d5ca633a | ||
|
|
3102c550ff | ||
|
|
51dd80c48b | ||
|
|
14e870e2ec | ||
|
|
a6265aa0df | ||
|
|
4c870f4be9 | ||
|
|
a29e37a4c1 | ||
|
|
aabe013dd0 | ||
|
|
07984e0b81 | ||
|
|
7ec3603996 | ||
|
|
b991de0f15 | ||
|
|
601f0ede61 | ||
|
|
0d32a3b4fe | ||
|
|
650f9a2d9e | ||
|
|
05839597bf | ||
|
|
8eac8bcbfc | ||
|
|
8dd5ea0729 | ||
|
|
d98e7def76 | ||
|
|
5b25c8ccd0 | ||
|
|
135abb5d74 | ||
|
|
12cad28ee8 | ||
|
|
b840be9875 | ||
|
|
863daa29cb | ||
|
|
3cf845fbfb | ||
|
|
c49bee8d0b | ||
|
|
0dfb771671 | ||
|
|
452d98f329 | ||
|
|
a981f517f3 | ||
|
|
736bacde90 | ||
|
|
df0eb17172 | ||
|
|
f274ec0652 | ||
|
|
b7593369fb | ||
|
|
ef407ea50c | ||
|
|
345b9a3217 | ||
|
|
af719e60c5 | ||
|
|
84022a12fd | ||
|
|
c7b55aa6f4 | ||
|
|
5e70a131e9 | ||
|
|
1e83e6662f | ||
|
|
b6c049cb3c | ||
|
|
39d7b014cf | ||
|
|
bd645f5095 | ||
|
|
856f24eb7e | ||
|
|
f060db5ec5 | ||
|
|
180eb810cf | ||
|
|
25f32ce8b8 | ||
|
|
5eaf15574a | ||
|
|
467e76aa32 | ||
|
|
63bda7de11 | ||
|
|
ec474a4bd2 | ||
|
|
74ff9828de | ||
|
|
25530fff71 | ||
|
|
df2bd0e6fb | ||
|
|
1ed0c6926e | ||
|
|
7a2b49a629 | ||
|
|
a33105dcd1 | ||
|
|
a5b5952598 | ||
|
|
c6e936d6c2 | ||
|
|
ab2abee1fe | ||
|
|
67d79b92e6 | ||
|
|
9ba956ca8b | ||
|
|
c50ecda715 | ||
|
|
9d928b240b | ||
|
|
870fa2797c | ||
|
|
8d1efc81f6 | ||
|
|
2b6dbb07e8 | ||
|
|
7caf3f8429 | ||
|
|
1a6f88f218 | ||
|
|
06cb16580e | ||
|
|
2b690fff78 | ||
|
|
7058a8c006 | ||
|
|
b71db1a9a5 | ||
|
|
420c96d17b | ||
|
|
6817978ddb | ||
|
|
efedfe12ff | ||
|
|
90ab7c7c48 | ||
|
|
fa9e38b36f | ||
|
|
33bda862da | ||
|
|
ef2b5eea53 | ||
|
|
45279951aa | ||
|
|
47b4581907 | ||
|
|
b5d6597c0a | ||
|
|
4a87df8e79 | ||
|
|
7715e4de61 | ||
|
|
982a08b80d | ||
|
|
157718a7a3 | ||
|
|
72b95c4a66 | ||
|
|
4fe894cbe7 | ||
|
|
0c9f22ac66 | ||
|
|
bde8d2dd6b | ||
|
|
6e27c52336 | ||
|
|
efeba4a7f1 | ||
|
|
a9d44b95bd | ||
|
|
34bdaaa33f | ||
|
|
508fa48aa6 | ||
|
|
66b461a5ab | ||
|
|
e3d70f2c43 | ||
|
|
5502fb271d | ||
|
|
e6f96a7a86 | ||
|
|
005391ca5b | ||
|
|
3a3d6d7b9a | ||
|
|
4ded22b00b | ||
|
|
b615d12897 | ||
|
|
21244add31 | ||
|
|
e7b09536bf | ||
|
|
a0b06ecbd4 | ||
|
|
3f873b0c39 | ||
|
|
05bf66dff0 | ||
|
|
069ca5df40 | ||
|
|
eb817807bc | ||
|
|
fc6f64742c | ||
|
|
d040fa2a7d | ||
|
|
4d46eac733 | ||
|
|
85691130b1 | ||
|
|
c4d78a3469 | ||
|
|
dd4535b7f1 | ||
|
|
1734e53410 | ||
|
|
843fe45dee | ||
|
|
51dabeafaa | ||
|
|
05fc4a4cb7 | ||
|
|
f3c0c7c0b3 | ||
|
|
c2aefbb3e1 | ||
|
|
296ddebed1 | ||
|
|
922b7dbd46 | ||
|
|
ffcf5ab999 | ||
|
|
592565aef5 | ||
|
|
53f76a1dad | ||
|
|
ce4b719459 | ||
|
|
19ac723e48 | ||
|
|
a1ded68a49 | ||
|
|
8a927a1b6a | ||
|
|
eab10c91b7 | ||
|
|
6c19b0e438 | ||
|
|
6f15c062a3 | ||
|
|
afe3b1918d | ||
|
|
eaeda12c54 | ||
|
|
60df88777e | ||
|
|
3dc1621200 | ||
|
|
14cbca87c8 | ||
|
|
ce1087165d | ||
|
|
aafd21c7d9 | ||
|
|
9611833e33 | ||
|
|
62d576880b | ||
|
|
378e511e04 | ||
|
|
1f9ba7b326 | ||
|
|
3010f03414 | ||
|
|
938abb0236 | ||
|
|
1256f34736 | ||
|
|
d1ac40391e | ||
|
|
33a3550df4 | ||
|
|
1c668252c9 | ||
|
|
55ee4c9553 | ||
|
|
ad1cbe34b4 | ||
|
|
aa58390673 | ||
|
|
5aa9c8f44c | ||
|
|
e62ad97937 | ||
|
|
6d81286b08 | ||
|
|
40ebd4704a | ||
|
|
241d033f37 | ||
|
|
5e6c713d9c | ||
|
|
c76e6769db | ||
|
|
497b61f4ab | ||
|
|
28c7f37204 | ||
|
|
c0910498e8 | ||
|
|
bfa5fd3add | ||
|
|
f43e284b22 | ||
|
|
c67bb2ac9f | ||
|
|
d58431a097 | ||
|
|
ff07226814 | ||
|
|
65b31ffbb2 | ||
|
|
adcd9289c2 | ||
|
|
71ae473187 | ||
|
|
7e1b3b9157 | ||
|
|
f673fb960a | ||
|
|
7d30c8cebc | ||
|
|
d645ce86e9 | ||
|
|
7b6cfc17c4 | ||
|
|
5063de59b1 | ||
|
|
e0ed3aa141 | ||
|
|
3b6c3d6d64 | ||
|
|
e07fab17b1 | ||
|
|
3da161131a | ||
|
|
b1f4200608 | ||
|
|
2d4f7847d8 | ||
|
|
81a26d988a | ||
|
|
1d524784ff | ||
|
|
a6b61df983 | ||
|
|
72670833cb | ||
|
|
1902c6bf94 | ||
|
|
7a90d92aef | ||
|
|
a5fb74f3f2 | ||
|
|
adbb2e09df | ||
|
|
39b9f65d0d | ||
|
|
cf9629b9c7 | ||
|
|
8907c8dd3d | ||
|
|
c1a278b0eb | ||
|
|
21ab8f4640 | ||
|
|
e1ef0bd4fd | ||
|
|
151babd168 | ||
|
|
9fd8254ada | ||
|
|
5329241831 | ||
|
|
e876e210da | ||
|
|
e6d1bcdf82 | ||
|
|
c3d9c40a74 | ||
|
|
4014a8ff0d | ||
|
|
63c36773e4 | ||
|
|
e2b827d8b1 | ||
|
|
31a8dd2f2f | ||
|
|
27a70171f1 | ||
|
|
1fd7215def | ||
|
|
acd91c0164 | ||
|
|
9cb74e8135 | ||
|
|
b788a3daa5 | ||
|
|
04162c3944 | ||
|
|
5cac54044b | ||
|
|
ae958aa1a5 | ||
|
|
b966b2108d | ||
|
|
9ec32d15ab | ||
|
|
adc1eedda3 | ||
|
|
6d28127154 | ||
|
|
646acbc0b2 | ||
|
|
74b1205783 | ||
|
|
f7567db01f | ||
|
|
ef328ab392 | ||
|
|
22365b2c55 | ||
|
|
35507ce97e | ||
|
|
d5b4c6dfd3 | ||
|
|
234f9472c2 | ||
|
|
a2119a660a | ||
|
|
dadebb2196 | ||
|
|
bec858c77f | ||
|
|
cc1e8514f8 | ||
|
|
b5d74751b1 | ||
|
|
9cdf8772b3 | ||
|
|
bd041df0cc | ||
|
|
124e28b14e | ||
|
|
a6f2f1afce | ||
|
|
f7327524fc | ||
|
|
e74ee37db5 | ||
|
|
4bf5692888 | ||
|
|
c2f60abe55 | ||
|
|
be7683c79b | ||
|
|
269a760f3d | ||
|
|
6430410158 | ||
|
|
ba258e65a0 | ||
|
|
1934257636 | ||
|
|
fba52c45e8 | ||
|
|
2728c74b6c | ||
|
|
46ec0f24f6 | ||
|
|
9dc44d9bab | ||
|
|
ea9b72ef79 | ||
|
|
9212f8a709 | ||
|
|
3862949a46 | ||
|
|
c23535bc96 | ||
|
|
e7c1b19161 | ||
|
|
cc0a694c36 | ||
|
|
af9b97b55f | ||
|
|
f43b4e8cd8 | ||
|
|
8430c55733 | ||
|
|
ff043fa00f | ||
|
|
040f5422f2 | ||
|
|
c3aac8ddb4 | ||
|
|
0b1635e371 | ||
|
|
74f971284e | ||
|
|
4f65cf8fb3 | ||
|
|
b2d472fc50 | ||
|
|
0fb57ecffc | ||
|
|
237c761f67 | ||
|
|
c5461c4596 | ||
|
|
31a3bfed54 | ||
|
|
4432a8164a | ||
|
|
e9a9bdda13 | ||
|
|
75f1c5ec33 | ||
|
|
509a34f0fa | ||
|
|
679565603a | ||
|
|
cf029a81ac | ||
|
|
2aeb0025cf | ||
|
|
c11e5501aa | ||
|
|
f0831174c3 | ||
|
|
0c15d4977f | ||
|
|
991da8ea2f | ||
|
|
772de2596d | ||
|
|
be54db83c9 | ||
|
|
cfe1893d2c | ||
|
|
1536ae30ee | ||
|
|
81297e6c23 | ||
|
|
f73e403ae5 | ||
|
|
f2b35c3aab | ||
|
|
f22f1cf4f4 | ||
|
|
3c0c3c3c5f | ||
|
|
9d2407dbc5 | ||
|
|
28a58717be | ||
|
|
f0ebf6c120 | ||
|
|
7f79591522 | ||
|
|
3be7b9ef59 | ||
|
|
bd5de06c67 | ||
|
|
49a57354f2 | ||
|
|
5b4e9152ad | ||
|
|
b8c153df54 | ||
|
|
2310ac2c39 | ||
|
|
89edc330f1 | ||
|
|
1f975b6e05 | ||
|
|
97d5e1b49b | ||
|
|
75c0bd250e | ||
|
|
7d4e9a019f | ||
|
|
ddbf2626d7 | ||
|
|
8e803116f1 | ||
|
|
4b17e86c96 | ||
|
|
265dc87da9 | ||
|
|
bc87234fed | ||
|
|
1c6dec3ffe | ||
|
|
bee32fb05a | ||
|
|
c98200aaa3 | ||
|
|
ac5c8bea9c | ||
|
|
b2cf9efc3a | ||
|
|
a189b3a5c4 | ||
|
|
60e76ed474 | ||
|
|
5b27e491d4 | ||
|
|
284a0afb1d | ||
|
|
e8cd4d9b70 | ||
|
|
ccf89512f6 | ||
|
|
2ebc35e18b | ||
|
|
69b05aca38 | ||
|
|
c9a08ad178 | ||
|
|
8e6ffa6a6f | ||
|
|
b58ab32b9f | ||
|
|
85aad86906 | ||
|
|
d79b2f0a35 | ||
|
|
c5eaea7161 | ||
|
|
e506ae44e0 | ||
|
|
bebf0383d0 | ||
|
|
1c99b8377f | ||
|
|
c9e8d4bbad | ||
|
|
d68fb7a320 | ||
|
|
7efefd30f1 | ||
|
|
fe06f6e990 | ||
|
|
3d74a9c323 | ||
|
|
1c2d0ae5de | ||
|
|
07c3e62e11 | ||
|
|
773d886df6 | ||
|
|
d47f88427d | ||
|
|
95d55c56c6 | ||
|
|
4cdc98154c | ||
|
|
d4a9ceae75 | ||
|
|
6fbb2b7a67 | ||
|
|
1c00ddffec | ||
|
|
f4b23bfc96 | ||
|
|
72accd4ee5 | ||
|
|
d7ecb84847 | ||
|
|
da8da1ce7d | ||
|
|
20a2ffef88 | ||
|
|
6b58ab8427 | ||
|
|
e9b98fefc6 | ||
|
|
95be386e9d | ||
|
|
a89dc54690 | ||
|
|
e8668cf593 | ||
|
|
bdf53a6d29 | ||
|
|
d09dfb3e36 | ||
|
|
f86083a057 | ||
|
|
bcc5138518 | ||
|
|
e39925af9b | ||
|
|
d58fe2f185 | ||
|
|
b79ba679a1 | ||
|
|
8d79f26721 | ||
|
|
95a4b1b158 | ||
|
|
c0ef984273 | ||
|
|
a323186926 | ||
|
|
117c1df65a | ||
|
|
d4fca86ae8 | ||
|
|
bc4ed22635 | ||
|
|
c74083645a | ||
|
|
0ac6151be9 | ||
|
|
b5c16c228b | ||
|
|
cec0e2a4d7 | ||
|
|
0e38d10bcd | ||
|
|
7bb2c6b012 | ||
|
|
281d8e454d | ||
|
|
8e5a56cea7 | ||
|
|
0df6a76103 | ||
|
|
fdf23efef4 | ||
|
|
d7d2ab3d7f | ||
|
|
b9a2c4a8ec | ||
|
|
69f683070a | ||
|
|
31015c8306 | ||
|
|
b422b11865 | ||
|
|
8a45b177ce | ||
|
|
28c5a21fa0 | ||
|
|
239727b411 | ||
|
|
34d5434478 | ||
|
|
03c3f3c990 | ||
|
|
9146fa2534 | ||
|
|
882c91280e | ||
|
|
e298b83b92 | ||
|
|
c46f623d6f | ||
|
|
27d131a177 | ||
|
|
7049b60af4 | ||
|
|
7633e2f8c3 | ||
|
|
ca33cbda05 | ||
|
|
d18ca0b85d | ||
|
|
fbfb343176 | ||
|
|
f7a0ff1f65 | ||
|
|
50ec7a56a4 | ||
|
|
92793d3114 | ||
|
|
9fc7e66f66 | ||
|
|
590f2a3f0c | ||
|
|
221058009c | ||
|
|
5fa05dcea8 | ||
|
|
dce77559fa | ||
|
|
df09e7afd3 | ||
|
|
2464556a7d | ||
|
|
a8aab6bfdd | ||
|
|
23add79c3e | ||
|
|
e6faca1337 | ||
|
|
d67d94ea04 | ||
|
|
0777bca325 | ||
|
|
0903e7763c | ||
|
|
89f9522e22 | ||
|
|
965855756b | ||
|
|
5bd4734a88 | ||
|
|
37c7087c6f | ||
|
|
317941d840 | ||
|
|
652a003ef5 | ||
|
|
81889df4b7 | ||
|
|
0e092b3f06 | ||
|
|
2006b6195e | ||
|
|
fe2bc90e45 | ||
|
|
10aa35cc91 | ||
|
|
c68c092ce3 | ||
|
|
0a13ff41ea | ||
|
|
ae6ab2c3e0 | ||
|
|
b3a64f5e08 | ||
|
|
802a17b11d | ||
|
|
2b6309719f | ||
|
|
5562f411c4 | ||
|
|
a1a3e67de6 | ||
|
|
7de4683506 | ||
|
|
360bddd600 | ||
|
|
9d5551ba6d | ||
|
|
14aba7c1b2 | ||
|
|
10363b398e | ||
|
|
2ee05c9a68 | ||
|
|
8dd92fbcd8 | ||
|
|
e7214c151f | ||
|
|
829f741ccd |
32
AUTHORS
32
AUTHORS
@@ -1,13 +1,35 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001,2002 by Alexander Barton,
|
||||
(c)2001-2005 Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd ist freie Software und steht unter
|
||||
der GNU General Public License.
|
||||
ngIRCd is free software and published under the
|
||||
terms of the GNU General Public License.
|
||||
|
||||
-- AUTHORS / Autoren --
|
||||
-- AUTHORS and CONTRIBUTORS --
|
||||
|
||||
|
||||
Alexander Barton, alex@arthur.ath.cx
|
||||
Main Authors
|
||||
~~~~~~~~~~~~
|
||||
Alexander Barton, <alex@barton.de> (alex)
|
||||
|
||||
|
||||
Contributors
|
||||
~~~~~~~~~~~~
|
||||
Goetz Hoffart, <goetz@hoffart.de> (goetz)
|
||||
Ilja Osthoff, <i.osthoff@gmx.net> (ilja)
|
||||
Benjamin Pineau, <ben@zouh.org>
|
||||
Sean Reifschneider, <jafo-rpms@tummy.com>
|
||||
Florian Westphal, <westphal@foo.fh-furtwangen.de> (fw)
|
||||
|
||||
|
||||
Code snippets
|
||||
~~~~~~~~~~~~~
|
||||
J. Kercheval: pattern matching functions
|
||||
Patrick Powell, <papowell@astart.com>: snprintf()-function
|
||||
Andrew Tridgell & Martin Pool: strl{cpy|cat}()-functions
|
||||
|
||||
|
||||
--
|
||||
$Id: AUTHORS,v 1.11 2005/03/19 14:24:52 alex Exp $
|
||||
|
||||
2
COPYING
2
COPYING
@@ -2,7 +2,7 @@
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
|
||||
504
ChangeLog
504
ChangeLog
@@ -1,16 +1,507 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001,2002 by Alexander Barton,
|
||||
(c)2001-2005 Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd ist freie Software und steht unter
|
||||
der GNU General Public License.
|
||||
ngIRCd is free software and published under the
|
||||
terms of the GNU General Public License.
|
||||
|
||||
-- ChangeLog / Aenderungen --
|
||||
-- ChangeLog --
|
||||
|
||||
|
||||
ngIRCd 0.2.x, xx.xx.2002
|
||||
ngIRCd 0.9.2 (2005-10-15)
|
||||
|
||||
- Fixed a bug that could cause the damon to crash when outgoing server
|
||||
connections can't be established.
|
||||
- Fixed a bug that caused the daemon to leak file descriptors when no
|
||||
resolver subprocesses could be created.
|
||||
- Fixed server NOTICEs to users with "s" mode ("server messages").
|
||||
- Fixed a format string bug in "connection statistics" messages to clients.
|
||||
|
||||
ngIRCd 0.9.1 (2005-08-03)
|
||||
|
||||
- The KILL command killed much more than desired (including server links!)
|
||||
when the target user is connected to a remote server. Bug introduced in
|
||||
ngIRCd 0.9.0 ... Reported by <qssl@fastmail.fm>, Thanks!
|
||||
- Changed some constants to be "signed" (instead of unsigned) to solve
|
||||
problems with old (pre-ANSI) compilers.
|
||||
|
||||
ngIRCd 0.9.0 (2005-07-24)
|
||||
|
||||
ngIRCd 0.9.0-pre1 (2005-07-09)
|
||||
- Fixed maximum length of user names, now allow up to 9 characters.
|
||||
- Cut off oversized IRC messages that should be sent to the network instead
|
||||
of shuttding down the (wrong) connection.
|
||||
- Don't generate error messages for unknown commands received before the
|
||||
client is registered with the server (like the original ircd).
|
||||
- Never run with root privileges but always switch the user ID.
|
||||
- Make "netsplit" messages RFC compliant.
|
||||
- Fix handling of QUIT Messages: send only one message, even if the client
|
||||
is member of multiple channels.
|
||||
- Don't exit server if closing of a socket fails; instead ignore it and
|
||||
pray that this will be "the right thing" ...
|
||||
- Implemented the IRC function "WHOWAS".
|
||||
- Don't enable assert() calls when not ./configure'd with --enable-debug.
|
||||
- Fixed ./configure test for TCP Wrappers: now it runs on Mac OS X as well.
|
||||
- Enhanced configure script: now you can pass an (optional) search path
|
||||
to all --with-XXX parameters, e. g. "--with-ident=/opt/ident".
|
||||
- Removed typedefs for the native C datatypes.
|
||||
Use stdbool.h / inttypes.h if available.
|
||||
- New configuration option "OperServerMode" to enable a workaround needed
|
||||
when running an network with ircd2 servers and "OperCanUseMode" enabled
|
||||
to prevent the ircd2 daemon to drop mode changes of IRC operators.
|
||||
Patch by Florian Westphal, <westphal@foo.fh-furtwangen.de>.
|
||||
- Implemented support for "secret channels" (channel mode "s").
|
||||
- New configuration option "Mask" for [Operator] sections to limit OPER
|
||||
commands to users with a specific IRC mask. Patch from Florian Westphal.
|
||||
- Write "error file" (/tmp/ngircd-XXX.err) only if compiled with debug
|
||||
code ("--enable-debug") and running as daemon process.
|
||||
- Don't create version information string each time a client connects
|
||||
but instead on server startup. By Florian Westphal.
|
||||
- New configuration variable "PidFile", section "[Global]": if defined,
|
||||
the server writes its process ID (PID) to this file. Default: off.
|
||||
Idea of Florian Westphal, <westphal@foo.fh-furtwangen.de>.
|
||||
- Code cleanups from Florian Westphal, <westphal@foo.fh-furtwangen.de>.
|
||||
- Raised the maximum length of passwords to 20 characters.
|
||||
- Fixed a memory leak when resizing the connection pool and realloc()
|
||||
failed. Now we don't fall back to malloc(), which should be sane anyway.
|
||||
Patch from Florian Westphal, <westphal@foo.fh-furtwangen.de>.
|
||||
- Added support for the Howl (http://www.porchdogsoft.com/products/howl/)
|
||||
Rendezvous API, in addition to the API of Apple (Mac OS X). The available
|
||||
API will be autodetected when you call "./configure --with-rendezvous".
|
||||
- Made ngIRCd compile on HP/UX 10.20 with native HP pre-ANSI C compiler and
|
||||
most probably other older C compilers on other systems.
|
||||
- When the daemon should switch to another user ID (ServerID is defined in
|
||||
the configuration file) and is not running in a chroot environment, it
|
||||
changes its working directory to the home directory of this user. This
|
||||
should enable the system to write proper core files when not running with
|
||||
root privileges ...
|
||||
|
||||
ngIRCd 0.8.3 (2005-02-03)
|
||||
|
||||
- Fixed a bug that could case a root exploit when the daemon is compiled
|
||||
to do IDENT lookups and is logging to syslog. Bug discovered by CoKi,
|
||||
<coki@nosystem.com.ar>, thanks a lot!
|
||||
(http://www.nosystem.com.ar/advisories/advisory-11.txt)
|
||||
|
||||
ngIRCd 0.8.2 (2005-01-26)
|
||||
|
||||
- Added doc/SSL.txt to distribution.
|
||||
- Fixed a buffer overflow that could cause the daemon to crash. Bug found
|
||||
by Florian Westphal, <westphal@foo.fh-furtwangen.de>.
|
||||
- Fixed a possible buffer underrun when reading the MOTD file. Thanks
|
||||
to Florian Westphal, <westphal@foo.fh-furtwangen.de>.
|
||||
- Fixed detection of IRC lines which are too long to send. Detected by
|
||||
Florian Westphal, <westphal@foo.fh-furtwangen.de>.
|
||||
- Fixed return values of our own implementation of strlcpy(). The code has
|
||||
been taken from rsync and they fixed it, but we didn't until today :-/
|
||||
It has only been used when the system didn't implement strlcpy by itself,
|
||||
not on "modern" systems. Florian Westphal, <westphal@foo.fh-furtwangen.de>.
|
||||
|
||||
ngIRCd 0.8.1 (2004-12-25)
|
||||
|
||||
- Autoconf: Updated config.guess and config.sub
|
||||
- Added some more debug code ...
|
||||
- Fixed wrong variable names in output of "ngircd --configtest".
|
||||
- Debian: Fixed the name of the "default file" in the init script for
|
||||
ngircd-full packages. And do the test if the binary is executable after
|
||||
reading this file.
|
||||
- Enhanced the "test suite": please have a look at src/testsuite/README!
|
||||
|
||||
ngIRCd 0.8.0 (2004-06-26)
|
||||
|
||||
- Fixed wrong buffer size calculation for results of the resolver.
|
||||
|
||||
ngircd 0.8.0-pre2 (2004-05-16)
|
||||
- Enhanced logging to console when running in "no-detached mode": added
|
||||
PID and log messages of resolver sub-processes.
|
||||
- Fixed host name lookups when using IDENT user lookups.
|
||||
- "make clean" and "make maintainer-clean" remove more files now.
|
||||
|
||||
ngIRCd 0.8.0-pre1 (2004-05-07)
|
||||
- Two new configuration options: "ChrootDir" and "MotdPhrase", thanks to
|
||||
Benjamin Pineau <ben@zouh.org>. Now you can force the daemon to change
|
||||
its root and working directory to something "safe". MotdPhrase is used
|
||||
to define an "MOTD string" instead of a whole file, useful if the
|
||||
"real" MOTD file would be outside the "jail".
|
||||
- INVITE- and BAN-lists become synchronized between IRC+ servers when
|
||||
establishing new connections, if the peer supports this as well.
|
||||
- Reorganized autogen.sh and configure scripts.
|
||||
- Fixed a wrong assert() which could cause the daemon to exit spuriously
|
||||
when closing down connections.
|
||||
- Better logging of decompression errors returned by zlib.
|
||||
- Servers other than the destination server didn't clean up the invite
|
||||
list of an "invite-only" channel properly when an INVITE'd user joined.
|
||||
- Changed the reply of the MODE command to match the syntax of the
|
||||
original ircd exactly: the unnecessary but missing ":" before the last
|
||||
parameter has been added.
|
||||
- Fixed TRACE: don't output "Serv" lines for ourself; display more info.
|
||||
- Results of the resolver (hostnames and IDENT names) are discarded after
|
||||
the client is successfully registered with the server.
|
||||
- Better logging while establishing and shutting down connections.
|
||||
- The type of service (TOS) of all sockets is set to "interactive" now.
|
||||
- Added short command line option "-t" as alternative to "--configtest".
|
||||
- Added optional support for "IDENT" lookups on incoming connections. You
|
||||
have to enable this function with the ./configure switch "--with-ident".
|
||||
The default is not to do IDENT lookups.
|
||||
|
||||
ngIRCd 0.7.7 (2004-02-05)
|
||||
|
||||
- The info text ("real name") of users is set to "-" if none has been
|
||||
specified using the USER command (e. g. "USER user * * :"). Reason:
|
||||
the original ircd doesn't like empty ones and would KILL such users.
|
||||
- Fixed (optional) TCP Wrapper test which was broken and could result in
|
||||
false results. Thanks to Fuminori Tanizaki <tany@mcnet.ad.jp>!
|
||||
- Removed "USE_" prefixes of configuration #defines.
|
||||
|
||||
ngIRCd 0.7.6 (2003-12-05)
|
||||
|
||||
- Fixed abort() ("server crash") when INVITE'ing users to nonexistent
|
||||
channels. Bug found by <hiddenx@wp.pl>.
|
||||
- Extended version numbering of CVS versions (added date).
|
||||
- Enhanced/fixed doc/Protocol.txt;
|
||||
|
||||
ngIRCd 0.7.5 (2003-11-07)
|
||||
|
||||
- Fixed ban behavior: users which are banned from a channel can't no
|
||||
longer send PRIVMSG's to this channel (fixes Bug #47).
|
||||
- Fixed and enhanced the "penalty handling" of the server: commands that
|
||||
require more resources block the client for a short time.
|
||||
- Changed the internal time resolution to one second.
|
||||
- New configuration variable "MaxConnectionsIP" to limit the number of
|
||||
simultaneous connections from a single IP that the server will accept.
|
||||
This configuration options lowers the risk of denial of service attacks
|
||||
(DoS), the default is 5 connections per client IP.
|
||||
- Fixed build problems under Mac OS X 10.3.
|
||||
- Use "-pipe" when compiling with gcc, speeds things up a little :-)
|
||||
- Added new configuration variable "Listen" to bind all listening
|
||||
sockets of the server to a single IP address.
|
||||
- Suppress misleading error message of diff during make run.
|
||||
- Enhanced test-suite and made it work on GNU/Hurd.
|
||||
- Fixed minor typo in debug output :-)
|
||||
|
||||
ngIRCd 0.7.1 (2003-07-18)
|
||||
|
||||
- Included files to build Debian packages (located in "debian/").
|
||||
- Updated config.guess and config.sub to newer upstream versions.
|
||||
- NJOIN propagates user channel modes correctly again ... Upsa.
|
||||
- Made Makefile more compatible with "make -j<n>".
|
||||
- Added support for GNU/Hurd.
|
||||
- Fixed a compiler warning related to an unnecessary assert().
|
||||
- Enhanced VERSION command when using debug versions.
|
||||
|
||||
ngIRCd 0.7.0 (2003-05-01)
|
||||
|
||||
- "ServerName" is checked better now: a dot (".") is required.
|
||||
- The KILL command verifies and logs more parameters.
|
||||
|
||||
ngIRCd 0.7.0-pre2 (2003-04-27)
|
||||
- CVS build system fixes (made autogen.sh more portable).
|
||||
- Fixed compilation and test-suite on Solaris (tested with 2.6).
|
||||
- New documentation file "doc/Platforms.txt" describing the status of
|
||||
ngIRCd on the various tested platforms.
|
||||
- Test for broken GCC on Mac OS X and disable "-pedantic" in this case.
|
||||
- Disable "-ansi" on Cygwin: system headers are incompatible.
|
||||
- The server tried to connect to other servers only once when DNS or
|
||||
socket failures occurred.
|
||||
- Fixed --configtest: There is no variable "ServerPwd", it's "Password".
|
||||
|
||||
ngIRCd 0.7.0-pre1 (2003-04-22)
|
||||
- New signal handler (more secure, actions are executed outside).
|
||||
- GCC: the compiler is now called with more warning options enabled.
|
||||
- Replaced a lot of str[n]cpy(), str[n]cat() and sprintf() calls with the
|
||||
more secure functions strlcpy(), strlcat() and snprintf(). On systems
|
||||
that don't support strlcpy() and strlcat(), these functions are included
|
||||
in the libngportab now (with prototypes in portab.h).
|
||||
- If the server can't close a socket, it panics now. This is an error that
|
||||
can't occur during normal operation so there is something broken.
|
||||
- The order of log messages during disconnects is more "natural" now ;-)
|
||||
- Cleaned up handling of server configuration structures: modifying and
|
||||
removing servers during runtime works more reliable now.
|
||||
- Compression code from "conn.[ch]" is now found in new "conn-zip.[ch]"
|
||||
- Moved some connection functions from "conn.[ch]" to "conn-func.[ch]".
|
||||
- New command CONNECT to enable and add server links. The syntax is not
|
||||
RFC-compatible: use "CONNECT <name> <port>" to enable and connect an
|
||||
configured server and "CONNECT <name> <port> <host> <mypwd> <peerpwd>"
|
||||
to add a new server (ngIRCd tries to connect new servers only once!).
|
||||
- Added DISCONNECT command ("DISCONNECT <name>") to disable servers.
|
||||
- Restructured the documentation: Now the main language is English. The
|
||||
german documentation has been removed (until there is a maintainer).
|
||||
- Enhanced killing of users caused by a nickname collision.
|
||||
- Better error detection for status code ("numerics") forwarding.
|
||||
- Moved tool functions to own library: "libngtool".
|
||||
- New command TRACE (you can trace only servers at the moment).
|
||||
- New command HELP that lists all understood commands.
|
||||
- There should no longer remain "unknown connections" (see e.g. LUSERS)
|
||||
if an outgoing server link can't be established.
|
||||
- Added AC_PREREQ(2.50) to configure.in for better autoconf compatibility.
|
||||
- Conn_Close() now handles recursive calls for the same link correctly.
|
||||
- ngIRCd can register itself with Rendezvous: to enable support pass the
|
||||
new switch "--with-rendezvous" to configure.
|
||||
- Added support for TCP Wrappers library: pass "--with-tcp-wrappers" to
|
||||
configure to enable it.
|
||||
- Changed some configure options to use "--with"/"--without" as prefix
|
||||
instead of "--enable"/"--disable": "--without-syslog", "--without-zlib",
|
||||
"--with-tcp-wrappers", and "--with-rendezvous".
|
||||
- Better error reporting to clients on connect.
|
||||
- Enhanced manual pages ngircd(8) and ngircd.conf(5).
|
||||
- Documentation is now installed in $(datadir)/doc/ngircd.
|
||||
- Enhanced hanling of NJOIN in case of nick collisions.
|
||||
|
||||
ngIRCd 0.6.1, 2003-01-21
|
||||
|
||||
- Fixed KILL: you can't crash the server by killing yourself any more,
|
||||
ngIRCd no longer sends a QUIT to other servers after the KILL, and you
|
||||
can kill only valid users now.
|
||||
- The server no longer forwards commands to ordinary users, instead it
|
||||
answers with the correct error message ("no such server") now.
|
||||
- WHOIS commands weren't always forwarded as requested.
|
||||
- The server sets a correct default AWAY message now when propagating
|
||||
between servers (bug introduced in 0.6.0).
|
||||
- Fixed up and enhanced CHANINFO command: channel keys and user limits
|
||||
are synchronized between servers now, too.
|
||||
- MODE returns the key and user limit for channel members correctly now.
|
||||
- Non-members of a channel could crash the server when trying to change
|
||||
its modes or modes of its members.
|
||||
- The server didn't validate weather a target user is a valid channel
|
||||
member when changing his channel user modes which could crash ngIRCd.
|
||||
|
||||
|
||||
Older changes (sorry, only available in german language):
|
||||
|
||||
ngIRCd 0.6.0, 2002-12-24
|
||||
|
||||
ngIRCd 0.6.0-pre2, 2002-12-23
|
||||
- neuer Numeric 005 ("Features") beim Connect.
|
||||
- LUSERS erweitert: nun wird die maximale Anzahl der lokalen und globalen
|
||||
Clients, die dem Server bzw. im Netzwerk seit dem letzten (Re-)Start
|
||||
dem Server gleichzeitig bekannt waren, angezeigt.
|
||||
|
||||
ngIRCd 0.6.0-pre1, 2002-12-18
|
||||
- beim Schliessen einer Verbindung zeigt der Server nun vor dem ERROR
|
||||
noch eine Statistik ueber die empfangene und gesendete Datenmenge an.
|
||||
- der Server wartet bei einer eingehenden Verbindung nun laenger auf den
|
||||
Resolver (4 Sekunden), wenn das Ergebnis eintrifft setzt er aber den
|
||||
Login sofort fort (bisher wurde immer mind. 1 Sekunde gewartet).
|
||||
- Connection-Strukturen werden nun "pool-weise" verwaltet; der Pool wird
|
||||
bei Bedarf bis zu einem konfigurierten Limit vergroessert.
|
||||
- Mit der neuen Konfigurationsvariable "MaxConnections" (Sektion "Global")
|
||||
kann die maximale Anzahl gleichzeitiger Verbindungen begrenzt werden.
|
||||
Der Default ist -1, "unlimitiert".
|
||||
- der Server erkennt nun, ob bereits eine eingehende Verbindung von einem
|
||||
Peer-Server besteht und versucht dann nicht mehr, selber eine eigene
|
||||
ausgehende Verbindung zu diesem auufzubauen. Dadurch kann nun auf beiden
|
||||
Servern in der Konfiguration ein Port fuer den Connect konfiguriert
|
||||
werden (beide Server versuchen sich dann gegenseitig zu connectieren).
|
||||
- Test-Suite und Dokumentation an A/UX angepasst.
|
||||
- unter HP-UX definiert das configure-Script nun _XOPEN_SOURCE_EXTENDED.
|
||||
- Server identifizieren sich nun mit asyncronen Passwoertern, d.h. das
|
||||
Passwort, welches A an B schickt, kann ein anderes sein als das, welches
|
||||
B als Antwort an A sendet. In der Konfig.-Datei, Abschnitt "Server",
|
||||
wurde "Password" dazu durch "MyPassword" und "PeerPassword" ersetzt.
|
||||
- Der Server kann nun zur Laufzeit die Konfiguration neu einlesen: dies
|
||||
macht er nach dem Befehl REHASH oder wenn ein HUP-Signal empfangen wird.
|
||||
- Channel-Mode "P" ("persistent") kann nur noch von IRC-Operatoren gesetzt
|
||||
werden. Grund: User koennen den Server sonst leicht "Channel-Flooden".
|
||||
- MOTD kann nun an andere Server geforwarded werden.
|
||||
- IRC-Befehl "TIME" implementiert.
|
||||
- Server-Server-Links koennen nun komprimiert werden, dazu wird die zlib
|
||||
(www.zlib.org) benoetigt. Unterstuetzt die Gegenseite die Komprimierung
|
||||
nicht, wird automatisch unkomprimiert kommuniziert. Das Verfahren ist
|
||||
kompatibel mit dem Original-ircd 2.10.3, d.h. beide Server koennen
|
||||
miteinander ueber komprimiert Links kommunizieren.
|
||||
- Handling der Schreibpuffer umgestellt: Server sollte schneller arbeiten.
|
||||
- Prefix-Fehler werden besser protokolliert (mit verursachendem Befehl).
|
||||
- SQUIT wird nicht mehr doppelt an andere Server weitergeleitet.
|
||||
- Der Server versucht nun vor dem Schliessen einer Verbindung Daten, die
|
||||
noch im Schreibpuffer stehen, zu senden.
|
||||
- Source in weiteres Modul "irc-info" aufgespalten.
|
||||
- Konfigurationsvariablen werden besser validiert: Laengen, Zahlen, ...
|
||||
- neuen Befehl STATS begonnen: bisher unterstuetzt wird "l" und "m".
|
||||
- bei ISON und USERHOST fehlte im Ergebnis-String der korrekte Absender.
|
||||
- IRC Operatoren koennen nun mit KILL User toeten. Achtung: ein Grund muss
|
||||
zwingend als zweiter Parameter angegeben werden!
|
||||
- neue Konfigurations-Variable "MaxJoins": Hiermit kann die maximale Zahl
|
||||
der Channels, in denen ein User Mitglied sein kann, begrent werden.
|
||||
- neuer, deutlich flexiblerer Parser fuer den MODE Befehl.
|
||||
- neue Channel-Modes l (User-Limit) und k (Channel-Key) implementiert.
|
||||
|
||||
ngIRCd 0.5.4, 24.11.2002
|
||||
|
||||
- Fehler-Handling von connect() gefixed: der Server kann sich nun auch
|
||||
unter A/UX wieder zu anderen verbinden.
|
||||
- in den Konfigurationsvariablen ServerUID und ServerGID kann nun nicht
|
||||
nur die numerische ID, sondern auch der Name des Users bzw. der Gruppe
|
||||
verwendet werden. Beim Start des Daemons wird nun beides angezeigt.
|
||||
- Besseres Logging von Prefix-Fehlern.
|
||||
- angenommene Sockets werden nun korrekt auf "non-blocking" konfiguriert,
|
||||
beim Senden und Empfangen werden Blockierungen besser abgefangen.
|
||||
- RPL_UMODEIS hat Code 221, nicht 211 ... *argl*
|
||||
- select() in Try_Write() hat falschen (keinen!) Timeout verwendet;
|
||||
die "Zeit-Aufloesung" des Servers sind zudem nun 2 Sekunden (TIME_RES).
|
||||
Insgesamt sollte die Reaktionszeit des Server nun besser sein.
|
||||
|
||||
ngIRCd 0.5.3, 08.11.2002
|
||||
|
||||
- NOTICE liefert nun wirklich nie mehr einen Fehler, auch dann nicht,
|
||||
wenn der sendende Client noch gar nicht registriert ist.
|
||||
- ein "schneller Server-Reconnect" wird nur noch dann versucht, wenn die
|
||||
Verbindung zuvor ordentlich (="lange genug") in Ordnung war; somit also
|
||||
nicht meht, wenn der Peer-Server gleich beim Connect ein ERROR liefert.
|
||||
Das vermeidet "Connect-Orgien".
|
||||
- einige Datentypen aufgeraumt: z.B. sind viele INT32s nun LONGs. Das ist
|
||||
auf Platformen mit 8-Byte-Integern kompatibler.
|
||||
- RPL_YOURHOST_MSG ist nun ircII- und RFC-kompatibel ;-)
|
||||
- Segfault unter hoher Netzaktivitaet behoben: in Conn_Close() wird die
|
||||
Connection-Struktur nun frueher als "ungueltig" markiert.
|
||||
|
||||
ngIRCd 0.5.2, 04.10.2002
|
||||
|
||||
- Buffer Overflow in Read_Resolver_Result() behoben.
|
||||
- Format-String-Bugs, die zum Abbruch des Servers fuehrten, behoben.
|
||||
- Maximale Laenge eines IRC-Prefix wurde falsch berechnet.
|
||||
|
||||
ngIRCd 0.5.1, 03.10.2002
|
||||
|
||||
- in RPL_YOURHOST_MSG wurde ein fehlerhafter Versionsstring geliefert.
|
||||
- Test-Suite: start-server.sh, stop-server.sh und stress-server.sh koennen
|
||||
nun "manuell" von der Kommandozeile gestartet werden, stress-server.sh
|
||||
startet per Default nur noch 5 Sessions, eine andere Zahl kann auf der
|
||||
Kommandozeile uebergeben werden (Syntax: "stress-server.sh <count>").
|
||||
- In bestimmten Faellen hat der Server versucht auf einen bereits wieder
|
||||
geschlossenen Socket Daten zu schreiben; das fuehrte zu einem Abbruch des
|
||||
Servers durch ein assert(). Nun wird geprueft, ob der Socket noch ok ist.
|
||||
- im "contrib"-Verzeichnis befindet sich nun eine RPM-Spec-Datei, aus den
|
||||
.tar.gz's koennen nun mit "rpm -ta <archiv>" RPM's erzeugt werden. Danke
|
||||
an Sean Reifschneider <jafo@tummy.com>!
|
||||
- Syntax von RPL_MYINFO_MSG korrigiert: liefert nun vier Parameter.
|
||||
|
||||
ngIRCd 0.5.0, 20.09.2002
|
||||
|
||||
- Dokumentation aktualisiert.
|
||||
- Fehler bei Validierung von "AdminInfo2" behoben.
|
||||
- Test der Flags fuer "ps" in der Testsuite verbessert, ist nun zu mehr
|
||||
Plattformen kompatibler.
|
||||
|
||||
ngIRCd 0.5.0-pre2, 17.09.2002
|
||||
- Fix in IRC_WriteStrServersPrefix() war "badly broken" -- behoben.
|
||||
|
||||
ngIRCd 0.5.0-pre1, 16.09.2002
|
||||
- Manual-Pages ngircd.8 und ngircd.conf.5 begonnen.
|
||||
- Wird der Netzwerk-Sniffer aktiviert (--sniffer), so schaltet der
|
||||
ngIRCd nun automatisch in den Debug-Modus.
|
||||
- auf Systemen, die inet_aton() nicht kennen (wie z.B. A/UX), kann der
|
||||
ngIRCd nun dennoch auch aktiv Server-Links aufbauen.
|
||||
- h_errno wird auf Systemen, die das nicht kennen (wie z.B. HP-UX 10.20)
|
||||
nicht mehr verwendet. Somit compiliert der ngIRCd nun auch dort :-)
|
||||
- um auf dem Ziel-System nicht vorhandene Funktionen nachzubilden wird nun
|
||||
die "libngportab" erzeugt; genutzt wird dies bisher fuer vsnprintf().
|
||||
Nun compiliert der ngIRCd auch unter Solaris 2.5.1.
|
||||
- "persistente Channels" (Mode 'P') implementiert: diese koennen in der
|
||||
Konfigurationsdatei definiert werden (Sektion "Channel", vgl. Beispiel-
|
||||
Konfiguration "sample-ngircd.conf") und bleiben auch dann bestehen,
|
||||
wenn kein User mehr im Channel ist. Zu Channel-Operatoren werden bisher
|
||||
nur IRC-Operatoren, die den Channel betreten. Die persistenten Channels
|
||||
werden durch das Flag "P" gelennzeichnet, welches normal durch Channel-
|
||||
Op's gesetzt und geloescht werden kann.
|
||||
- bei "--configtest" werden keine leere Abschnitte mehr ausgegeben.
|
||||
- Source in weitere Module aufgespalten: lists, irc-op und resolve.
|
||||
- #include's aufgeraeumt: Header includieren keine anderen mehr.
|
||||
- KICK implementiert (bisher kann nur ein User aus einem Channel geckicked
|
||||
werden, Listen, wir im RFC vorgesehen, werden bisher nicht unterstuetzt).
|
||||
- INVITE, den Channel-Mode "i" sowie Invite-Lists ueber den MODE-Befehl
|
||||
(setzen, erfragen und loeschen) implementiert.
|
||||
- Source an ansi2knr fuer pre-ANSI-Compiler angepasst; ansi2knr in Source-
|
||||
Tree aufgenommen und in Build-System integriert; der ngIRCd compiliert
|
||||
nun z.B. unter A/UX mit dem nativen Compiler von Apple.
|
||||
- TOPIC lieferte bei unbekanntem Channel einen falschen Fehlercode.
|
||||
- LIST versteht nun Wildcards und kann an andere Server geforwarded werden.
|
||||
- wurde ein KILL fuer nicht-lokale Clients empfangen, so wurden die
|
||||
Verwaltungs-Strukturen nicht korrekt freigegeben.
|
||||
- empfangene NJOIN's wurden "zerhackt" an andere Server weitergegeben.
|
||||
- neue Konfigurationsoption "OperCanUseMode" (Sektion "Global"):
|
||||
ist sie aktiv, koennen IRC-Operatoren immer Channel-Modes setzen.
|
||||
- Dokumentation des neuen IRC+-Protokolls begonnen: doc/Protocol.txt
|
||||
- Protokoll- und Server-ID bei PASS-Befehlen auf neues Format umgestellt;
|
||||
bei empfangenen PASS-Befehlen werden diese zudem nun auch ausgewertet.
|
||||
Die unterstuetzten Flags sind in doc/Protocol.txt beschrieben.
|
||||
- mit dem neuen Befehl CHANINFO syncronisieren Server, die das IRC+-
|
||||
Protokoll unterstuetzen, Channel-Modes und Topics.
|
||||
- neue Option "--disable-ircplus" fuer das configure-Script, um das
|
||||
IRC+-Protokoll abzuschalten (per Default ist es aktiviert).
|
||||
- Ban-Lists (setzen, erfragen und loeschen) implementiert.
|
||||
- wird der Server mit "-n"/"--nodaemon" gestartet, so werden keine Mel-
|
||||
dungen mehr ueber Syslog ausgegeben, sondern nur noch auf der Konsole.
|
||||
- "Test-Suite" begonnen (in "make check" integriert): Dabei wird ein
|
||||
speziell konfigurierter Server auf Port 6789 gestartet, mit dem dann
|
||||
einige Tests durchgefuehrt werden (u.a. "Stress-Test" mit 50 Clients).
|
||||
- zu lange Operator-Namen in der Konfiguration wurden falsch gekuerzt.
|
||||
- kleine Anpassung an AIX 3.2.5: nun laeuft der ngIRCd auch dort :-)
|
||||
- ADMIN-Befehl implementiert. Die Daten hierzu werden in der Konfig-Datei
|
||||
im [Global]-Abschnitt mit den Variablen "AdminInfo1", "AdminInfo2" und
|
||||
"AdminEMail" konfiguriert.
|
||||
|
||||
ngIRCd 0.4.3, 11.06.2002
|
||||
|
||||
- Bei PRIVMSG und NOTICE hat der ngIRCd nicht ueberpruft, ob das Ziel
|
||||
ueberhaupt ein User ist. War es keiner, so fuehrte dies zu einem
|
||||
Abbruch des Servers [es wurde assert() aufgerufen].
|
||||
|
||||
ngIRCd 0.4.2, 29.04.2002
|
||||
|
||||
- LUSERS verzaehlt sich bei eigenen Server-Links nicht mehr.
|
||||
- QUIT wird nun auch von noch nicht registrierten Clients akzeptiert.
|
||||
- IRC-Funktion LIST implementiert; bisher werden allerdings noch keine
|
||||
Wildcards (bis auf "*") unterstuetzt.
|
||||
|
||||
ngIRCd 0.4.1, 08.04.2002
|
||||
|
||||
- Bei Server-Links wird nicht mehr an Hand der Anzahl der Parameter
|
||||
eines empfangenen SERVER-Befehls, sondern "intern" erkannt, ob es
|
||||
sich um eine ein- oder ausgehende Verbindung handelt und somit das
|
||||
eigene PASS-SERVER-Paar gesendet werden muss oder nicht. Da sich
|
||||
verschiedene Versionen des Original-ircd's anders verhalten, schlug
|
||||
die Anmeldung je nach Gehenseite evtl. fehl.
|
||||
- Bei einem NICK-Befehl eines lokalen Client konnte der Server ab-
|
||||
stuerzen, da ein Format-String einer Log-Meldung fehlerhaft war.
|
||||
|
||||
ngIRCd 0.4.0, 01.04.2002
|
||||
|
||||
- IRC-Befehle nochmal auf weitere Source-Dateien aufgespalten.
|
||||
- WHO implementiert (bisher ohne komplette Unterstuetzung von Masks).
|
||||
- Der AWAY-Mode wurde nicht ueber mehrere Server-Links weitergegeben.
|
||||
- stderr wird nun in eine Datei umgelenkt (/tmp/ngircd-<PID>.err).
|
||||
Laeuft der Server nicht im Debug-Modus, so wird diese bei Programm-
|
||||
ende geloescht. Sollte der Server abstuerzen, finden sich hier evtl.
|
||||
zusaetzliche Informationen.
|
||||
- In Nicknames wird das Zeichen "-" nun als zulaessig erkannt.
|
||||
- die Beispiel-Konfigurationsdatei (doc/sample-ngircd.conf) wird als
|
||||
ngircd.conf installiert, wenn noch keine "echte" Konfigurationsdatei
|
||||
vorhanden ist.
|
||||
- bei WHO, WHOIS und NAMES wird nun nur noch der Status "Operator" oder
|
||||
"voiced" geliefert -- nicht mehr beides.
|
||||
- Server-Gruppen implementiert: es wird immer nur zu einem Server in
|
||||
einer Gruppe eine Verbindung aufgebaut, klappt es beim ersten Server
|
||||
nicht, so wird der naechste probiert (Variable "Group" in der Kon-
|
||||
figurationsdatei, Sektion [Server]).
|
||||
- IRC_PING() ist, wenn nicht im "strict RFC"-Mode, toleranter und ak-
|
||||
zeptiert beliebig viele Parameter (z.B. BitchX sendet soetwas).
|
||||
- die "Portab-Header" werden nicht mehr benoetigt, die System-Erkennung
|
||||
wird nun ausschliesslich vom configure-Script durchgefuehrt. System-
|
||||
abhaengige Definitionen finden sich nun unter src/portrab/.
|
||||
- Clients und Channels werden nicht mehr ueber ihren Namen, sondern
|
||||
einen Hash-Wert gesucht: sollte deutlich schneller sein.
|
||||
- neuer Kommandozeilen-Parameter "--configtest": die Konfiguration wird
|
||||
gelesen und dann die verwendeten Werte angezeigt.
|
||||
- Client-Mode "s" (Server Notices) implementiert.
|
||||
- mit dem neuen Kommandozeilen-Parameter "--config"/"-f" kann eine
|
||||
alternative Konfigurationsdatei angegeben werden.
|
||||
- nach dem Start kann der ngIRCd, wenn er mit root-Rechten laeuft,
|
||||
zu einer anderen User-ID und Group-ID wechseln.
|
||||
- URL der Homepage wird u.a. bei "--version" mit angezeigt.
|
||||
|
||||
ngIRCd 0.3.0, 02.03.2002
|
||||
|
||||
- bekommt der Server ein HUP-Signal, so startet er neu -- genau so, wie
|
||||
er auf den IRC-Befehl RESTART reagiert.
|
||||
@@ -92,7 +583,6 @@ ngIRCd 0.1.0, 29.01.2002
|
||||
- Clients werden nun korrekt sowohl nur ueber den Nickname als auch die
|
||||
komplette "Host Mask" erkannt.
|
||||
|
||||
|
||||
ngIRCd 0.0.3, 16.01.2002
|
||||
|
||||
- Server-Links vollstaendig implementiert: der ngIRCd kann nun auch
|
||||
@@ -139,4 +629,4 @@ ngIRCd 0.0.1, 31.12.2001
|
||||
|
||||
|
||||
--
|
||||
$Id: ChangeLog,v 1.39 2002/03/02 01:36:35 alex Exp $
|
||||
$Id: ChangeLog,v 1.276.2.12 2005/10/15 12:44:08 alex Exp $
|
||||
|
||||
205
INSTALL
205
INSTALL
@@ -1,87 +1,186 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001,2002 by Alexander Barton,
|
||||
(c)2001-2004 by Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd ist freie Software und steht unter
|
||||
der GNU General Public License.
|
||||
ngIRCd is free software and published under the
|
||||
terms of the GNU General Public License.
|
||||
|
||||
-- INSTALL / Installation --
|
||||
-- INSTALL --
|
||||
|
||||
|
||||
|
||||
I. Upgrade Information
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Differences to version 0.8.x
|
||||
|
||||
- The maximum length of passwords has been raised to 20 characters (instead
|
||||
of 8 characters). If your passwords are longer than 8 characters then they
|
||||
are cut at an other position now.
|
||||
|
||||
Differences to version 0.6.x
|
||||
|
||||
- Some options of the configure script have been renamed:
|
||||
--disable-syslog -> --without-syslog
|
||||
--disable-zlib -> --without-zlib
|
||||
Please call "./configure --help" to review the full list of options!
|
||||
|
||||
Differences to version 0.5.x
|
||||
|
||||
- Starting with version 0.6.0, other servers are identified using asynchronous
|
||||
passwords: therefore the variable "Password" in [Server]-sections has been
|
||||
replaced by "MyPassword" and "PeerPassword".
|
||||
|
||||
- New configuration variables, section [Global]: MaxConnections, MaxJoins
|
||||
(see example configuration file "doc/sample-ngircd.conf"!).
|
||||
|
||||
|
||||
ngIRCd ist fuer UNIXoide-Systeme konzipiert. Dieser Text beschreibt den
|
||||
"Standardfall": ein UNIX bzw. UNIX-aehnliches System, das von GNU automake
|
||||
und GNU autoconf ("configure") unterstuetzt wird.
|
||||
II. Standard Installation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
ngIRCd is developed for UNIX-based systems, which means that the installation
|
||||
on modern UNIX-like systems that are supported by GNU autoconf and GNU
|
||||
automake ("configure") should be no problem.
|
||||
|
||||
The normal installation procedure after getting (and expanding) the source
|
||||
files (using a distribution archive or CVS) is as following:
|
||||
|
||||
1) ./autogen.sh [only necessary when using CVS]
|
||||
2) ./configure
|
||||
3) make
|
||||
4) make install
|
||||
|
||||
(Please see details below!)
|
||||
|
||||
Now the newly compiled executable "ngircd" is installed in its standard
|
||||
location, /usr/local/sbin/.
|
||||
|
||||
The next step is to configure and afterwards starting the daemon. Please
|
||||
have a look at the ngircd(8) and ngircd.conf(5) manual pages for details
|
||||
and all possible options.
|
||||
|
||||
If no previous version of the configuration file exists (the standard name
|
||||
is /usr/local/etc/ngircd.conf), a sample configuration file containing all
|
||||
possible options will be installed there. You'll find its template in the
|
||||
doc/ directory: sample-ngircd.conf.
|
||||
|
||||
|
||||
I. Voraussetzungen
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
1): "autogen.sh"
|
||||
|
||||
ngIRCd benoetigt "Alex' Portability Headers" (portab.h). Diese koennen von
|
||||
der Homepage heruntergeladen werden:
|
||||
The first step, autogen.sh, is only necessary if the configure-script isn't
|
||||
already generated. This never happens in official ("stable") releases in
|
||||
tar.gz-archives, but when using CVS.
|
||||
|
||||
<http://arthur.ath.cx/~alex/ngircd/#download>
|
||||
This step is therefore only interesting for developers.
|
||||
|
||||
Vor dem configure-Lauf des ngIRCd muessen dies Header auf dem System in-
|
||||
stalliert sein, anonsten bricht configure ab.
|
||||
autogen.sh produces the Makefile.in's, which are necessary for the configure
|
||||
script itself, and some more files for make. To run autogen.sh you'll need
|
||||
GNU autoconf and GNU automake (use recent versions! autoconf 2.53 and
|
||||
automake 1.6.1 are known to work).
|
||||
|
||||
Again: "end users" do not need this step!
|
||||
|
||||
|
||||
II. Quick Start
|
||||
~~~~~~~~~~~~~~~
|
||||
2): "./configure"
|
||||
|
||||
In der Regel sind folgende Schritte ausreichend:
|
||||
The configure-script is used to detect local system dependencies.
|
||||
|
||||
1) ./autogen.sh [nur erforderlich, wenn ueber CVS bezogen]
|
||||
2) ./configure
|
||||
3) make
|
||||
In the perfect case, configure should recognise all needed libraries, header
|
||||
files and so on. If this shouldn't work, "./configure --help" shows all
|
||||
possible options.
|
||||
|
||||
In addition, you can pass some command line options to "configure" to enable
|
||||
and/or disable some features of ngIRCd. All these options are shown using
|
||||
"./configure --help", too.
|
||||
|
||||
Compiling a static binary will avoid you the hassle of feeding a chroot dir
|
||||
(if you want use the chroot feature). Just do something like:
|
||||
CFLAGS=-static ./configure [--your-options ...]
|
||||
Then you can use a void directory as ChrootDir (like OpenSSH's /var/empty).
|
||||
|
||||
|
||||
zu 1) autogen.sh:
|
||||
3): "make"
|
||||
|
||||
Der erste Schritt, autogen.sh, ist nur notwendig, wenn das configure-Script
|
||||
noch nicht vorhanden ist. Dies ist nie bei offiziellen ("stabilen") Versionen
|
||||
in tar.gz-Archiven der Fall, jedoch nie, wenn der Source-Code ueber CVS
|
||||
bezogen wurde.
|
||||
|
||||
Dieser Absatz ist also eigentlich ausschliesslich fuer Entwickler interessant.
|
||||
|
||||
autogen.sh erzeugt die fuer das configure-Script notwendigen Makefile.in's
|
||||
sowie das configure-Script selber und weitere fuer den make-Lauf erforderliche
|
||||
Dateien. Dazu wird sowohl GNU automake als auch GNU autoconf (in aktuellen
|
||||
Versionen!) benoetigt.
|
||||
|
||||
(nochmal: "Endanwender" mussen diesen Schritt i.d.R. nicht ausfuehren!)
|
||||
The make command uses the Makefiles produced by configure and compiles the
|
||||
ngIRCd daemon.
|
||||
|
||||
|
||||
zu 2) ./configure:
|
||||
4): "make install"
|
||||
|
||||
Mit dem configure-Script wird ngIRCd, wie GNU Software meistens, an das
|
||||
lokale System angepasst und die erforderlichen Makefile's erzeugt.
|
||||
Use "make install" to install the server and a sample configuration file on
|
||||
the local system. Normally, root privileges are necessary to complete this
|
||||
step. If there is already an older configuration file present, it won't be
|
||||
overwritten.
|
||||
|
||||
Im Optimalfall sollte configure alle benoetigten Libraries, Header etc. selber
|
||||
erkennen und entsprechend reagieren. Sollte dies einmal nicht der Fall sein,
|
||||
so zeigt "./configure --help" moegliche Optionen.
|
||||
This files will be installed by default:
|
||||
|
||||
- /usr/local/sbin/ngircd: executable server
|
||||
- /usr/local/etc/ngircd.conf: sample configuration (if not already present)
|
||||
- /usr/local/share/doc/ngircd/: documentation
|
||||
|
||||
|
||||
zu 3) make:
|
||||
II. Useful make-targets
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Der make-Befehl bearbeitet die vom configure-Script erzeugten Makefile's und
|
||||
uebersetzt die comBase-Library und die Testprogramme.
|
||||
The Makefile produced by the configure-script contains always these useful
|
||||
targets:
|
||||
|
||||
- clean: delete every product from the compiler/linker
|
||||
next step: -> make
|
||||
|
||||
- distclean: the above plus erase all generated Makefiles
|
||||
next step: -> ./configure
|
||||
|
||||
- maintainer-clean: erase all automatic generated files
|
||||
next step: -> ./autogen.sh
|
||||
|
||||
|
||||
III. Nuetzliche make-Targets
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
III. Sample configuration file ngircd.conf
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Die vom configure-Script erzeugten Makefile's enthalten immer die folgenden
|
||||
nuetzlichen Targets:
|
||||
In the sample configuration file, there are comments beginning with "#" OR
|
||||
";" -- this is only for the better understanding of the file.
|
||||
|
||||
- clean: alle Erzeugnisse des Compilers/Linkers loeschen.
|
||||
Naechster Schritt: -> make
|
||||
The file is separated in four blocks: [Global], [Operator], [Server], and
|
||||
[Channel].
|
||||
|
||||
- distclean: zusaetzliche alle Makefile's loeschen.
|
||||
Naechster Schritt: -> ./configure
|
||||
In the [Global] section, there is the main configuration like the server
|
||||
name and the ports, on which the server should be listening. IRC operators
|
||||
of this server are defined in [Operator] blocks. [Server] is the section
|
||||
where server links are configured. And [Channel] blocks are used to
|
||||
configure pre-defined ("persistent") IRC channels.
|
||||
|
||||
- maintainer-clean: alle automat. erzeugten Dateien loeschen.
|
||||
Naechster Schritt: -> ./autogen.sh
|
||||
The meaning of the variables in the configuration file is explained in the
|
||||
"doc/sample-ngircd.conf", which is used as sample configuration file in
|
||||
/usr/local/etc after running "make install" (if you don't already have one)
|
||||
and in the "ngircd.conf" manual page.
|
||||
|
||||
|
||||
IV. Command line options
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
These parameters could be passed to the ngIRCd:
|
||||
|
||||
-f, --config <file>
|
||||
The daemon uses the file <file> as configuration file rather than
|
||||
the standard configuration /usr/local/etc/ngircd.conf.
|
||||
|
||||
-n, --nodaemon
|
||||
ngIRCd should be running as a foreground process.
|
||||
|
||||
-p, --passive
|
||||
Server-links won't be automatically established.
|
||||
|
||||
-t, --configtest
|
||||
Reads, validates and dumps the configuration file as interpreted
|
||||
by the server. Then exits.
|
||||
|
||||
Use "--help" to see a short help text describing all available parameters
|
||||
the server understands, with "--version" the ngIRCd shows its version
|
||||
number. In both cases the server exits after the output.
|
||||
|
||||
|
||||
--
|
||||
$Id: INSTALL,v 1.21 2005/02/10 08:20:09 alex Exp $
|
||||
|
||||
@@ -1,705 +0,0 @@
|
||||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 34;
|
||||
objects = {
|
||||
014CEA520018CE5811CA2923 = {
|
||||
buildRules = (
|
||||
);
|
||||
buildSettings = {
|
||||
COPY_PHASE_STRIP = NO;
|
||||
OPTIMIZATION_CFLAGS = "-O0";
|
||||
};
|
||||
isa = PBXBuildStyle;
|
||||
name = Development;
|
||||
};
|
||||
014CEA530018CE5811CA2923 = {
|
||||
buildRules = (
|
||||
);
|
||||
buildSettings = {
|
||||
COPY_PHASE_STRIP = YES;
|
||||
};
|
||||
isa = PBXBuildStyle;
|
||||
name = Deployment;
|
||||
};
|
||||
//010
|
||||
//011
|
||||
//012
|
||||
//013
|
||||
//014
|
||||
//030
|
||||
//031
|
||||
//032
|
||||
//033
|
||||
//034
|
||||
034768E8FF38A79811DB9C8B = {
|
||||
isa = PBXExecutableFileReference;
|
||||
path = ngircd;
|
||||
refType = 3;
|
||||
};
|
||||
//030
|
||||
//031
|
||||
//032
|
||||
//033
|
||||
//034
|
||||
//080
|
||||
//081
|
||||
//082
|
||||
//083
|
||||
//084
|
||||
08FB7793FE84155DC02AAC07 = {
|
||||
buildStyles = (
|
||||
014CEA520018CE5811CA2923,
|
||||
014CEA530018CE5811CA2923,
|
||||
);
|
||||
isa = PBXProject;
|
||||
mainGroup = 08FB7794FE84155DC02AAC07;
|
||||
projectDirPath = "";
|
||||
targets = (
|
||||
08FB779FFE84155DC02AAC07,
|
||||
);
|
||||
};
|
||||
08FB7794FE84155DC02AAC07 = {
|
||||
children = (
|
||||
1AB674ADFE9D54B511CA2CBB,
|
||||
F51F791401DFD0DE01D13771,
|
||||
F56D8B9E01E0BFA00155ADA7,
|
||||
F52162B301C7B904012300F4,
|
||||
F52162C201C7B904012300F4,
|
||||
F52162C301C7B904012300F4,
|
||||
F52162C401C7B904012300F4,
|
||||
F52162C501C7B904012300F4,
|
||||
F52162C601C7B904012300F4,
|
||||
F52162C701C7B904012300F4,
|
||||
F52162C801C7B904012300F4,
|
||||
F52162C901C7B904012300F4,
|
||||
F52162CA01C7B904012300F4,
|
||||
F52162CB01C7B904012300F4,
|
||||
);
|
||||
isa = PBXGroup;
|
||||
name = ngircd;
|
||||
refType = 4;
|
||||
};
|
||||
08FB779FFE84155DC02AAC07 = {
|
||||
buildPhases = (
|
||||
08FB77A0FE84155DC02AAC07,
|
||||
08FB77A1FE84155DC02AAC07,
|
||||
08FB77A3FE84155DC02AAC07,
|
||||
08FB77A5FE84155DC02AAC07,
|
||||
);
|
||||
buildSettings = {
|
||||
FRAMEWORK_SEARCH_PATHS = "";
|
||||
HEADER_SEARCH_PATHS = "";
|
||||
INSTALL_PATH = "$(HOME)/bin";
|
||||
LIBRARY_SEARCH_PATHS = "";
|
||||
OTHER_CFLAGS = "";
|
||||
OTHER_LDFLAGS = "";
|
||||
OTHER_REZFLAGS = "";
|
||||
PRODUCT_NAME = ngircd;
|
||||
REZ_EXECUTABLE = YES;
|
||||
SECTORDER_FLAGS = "";
|
||||
WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas";
|
||||
};
|
||||
dependencies = (
|
||||
);
|
||||
isa = PBXToolTarget;
|
||||
name = ngircd;
|
||||
productInstallPath = "$(HOME)/bin";
|
||||
productName = ngircd;
|
||||
productReference = 034768E8FF38A79811DB9C8B;
|
||||
shouldUseHeadermap = 1;
|
||||
};
|
||||
08FB77A0FE84155DC02AAC07 = {
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
F52162CC01C7B904012300F4,
|
||||
F52162CD01C7B904012300F4,
|
||||
F52162CE01C7B904012300F4,
|
||||
F52162CF01C7B904012300F4,
|
||||
F52162D001C7B904012300F4,
|
||||
F52162D901C7BAAE012300F4,
|
||||
F52162DC01C7BCDD012300F4,
|
||||
F52162E401C7C79E012300F4,
|
||||
F51D17FE01C8F5B701E11C2E,
|
||||
F51D180401C8FDD001E11C2E,
|
||||
F51D180501C8FDD001E11C2E,
|
||||
F576ABFC01D5E77301A85B03,
|
||||
F576ABFF01D61D7401A85B03,
|
||||
F51F791301DFC95301D13771,
|
||||
F51DBB15022D95E801A85B04,
|
||||
F51DBB19022D995501A85B04,
|
||||
F51DBB1D022D9D8F01A85B04,
|
||||
);
|
||||
isa = PBXHeadersBuildPhase;
|
||||
name = Headers;
|
||||
};
|
||||
08FB77A1FE84155DC02AAC07 = {
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
F52162D101C7B904012300F4,
|
||||
F52162D201C7B904012300F4,
|
||||
F52162D301C7B904012300F4,
|
||||
F52162DD01C7BCDD012300F4,
|
||||
F52162E501C7C79E012300F4,
|
||||
F51D17FF01C8F5B701E11C2E,
|
||||
F51D180701C8FDD001E11C2E,
|
||||
F576ABFD01D5E77301A85B03,
|
||||
F5263AEE01E263D201CE8F8F,
|
||||
F51DBB16022D95E801A85B04,
|
||||
F51DBB1A022D995501A85B04,
|
||||
F51DBB1E022D9D8F01A85B04,
|
||||
);
|
||||
isa = PBXSourcesBuildPhase;
|
||||
name = Sources;
|
||||
};
|
||||
08FB77A3FE84155DC02AAC07 = {
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
name = "Frameworks & Libraries";
|
||||
};
|
||||
08FB77A5FE84155DC02AAC07 = {
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
isa = PBXRezBuildPhase;
|
||||
name = "ResourceManager Resources";
|
||||
};
|
||||
//080
|
||||
//081
|
||||
//082
|
||||
//083
|
||||
//084
|
||||
//1A0
|
||||
//1A1
|
||||
//1A2
|
||||
//1A3
|
||||
//1A4
|
||||
1AB674ADFE9D54B511CA2CBB = {
|
||||
children = (
|
||||
034768E8FF38A79811DB9C8B,
|
||||
);
|
||||
isa = PBXGroup;
|
||||
name = Products;
|
||||
refType = 4;
|
||||
};
|
||||
//1A0
|
||||
//1A1
|
||||
//1A2
|
||||
//1A3
|
||||
//1A4
|
||||
//F50
|
||||
//F51
|
||||
//F52
|
||||
//F53
|
||||
//F54
|
||||
F51D17FC01C8F5B701E11C2E = {
|
||||
isa = PBXFileReference;
|
||||
name = client.c;
|
||||
path = ../src/ngircd/client.c;
|
||||
refType = 2;
|
||||
};
|
||||
F51D17FD01C8F5B701E11C2E = {
|
||||
isa = PBXFileReference;
|
||||
name = client.h;
|
||||
path = ../src/ngircd/client.h;
|
||||
refType = 2;
|
||||
};
|
||||
F51D17FE01C8F5B701E11C2E = {
|
||||
fileRef = F51D17FD01C8F5B701E11C2E;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F51D17FF01C8F5B701E11C2E = {
|
||||
fileRef = F51D17FC01C8F5B701E11C2E;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F51D180001C8FDD001E11C2E = {
|
||||
isa = PBXFileReference;
|
||||
name = channel.c;
|
||||
path = ../src/ngircd/channel.c;
|
||||
refType = 2;
|
||||
};
|
||||
F51D180101C8FDD001E11C2E = {
|
||||
isa = PBXFileReference;
|
||||
name = channel.h;
|
||||
path = ../src/ngircd/channel.h;
|
||||
refType = 2;
|
||||
};
|
||||
F51D180201C8FDD001E11C2E = {
|
||||
isa = PBXFileReference;
|
||||
name = irc.c;
|
||||
path = ../src/ngircd/irc.c;
|
||||
refType = 2;
|
||||
};
|
||||
F51D180301C8FDD001E11C2E = {
|
||||
isa = PBXFileReference;
|
||||
name = irc.h;
|
||||
path = ../src/ngircd/irc.h;
|
||||
refType = 2;
|
||||
};
|
||||
F51D180401C8FDD001E11C2E = {
|
||||
fileRef = F51D180101C8FDD001E11C2E;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F51D180501C8FDD001E11C2E = {
|
||||
fileRef = F51D180301C8FDD001E11C2E;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F51D180701C8FDD001E11C2E = {
|
||||
fileRef = F51D180201C8FDD001E11C2E;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F51DBB13022D95E801A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-write.c";
|
||||
refType = 4;
|
||||
};
|
||||
F51DBB14022D95E801A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-write.h";
|
||||
refType = 4;
|
||||
};
|
||||
F51DBB15022D95E801A85B04 = {
|
||||
fileRef = F51DBB14022D95E801A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F51DBB16022D95E801A85B04 = {
|
||||
fileRef = F51DBB13022D95E801A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F51DBB17022D995501A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-mode.c";
|
||||
refType = 4;
|
||||
};
|
||||
F51DBB18022D995501A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-mode.h";
|
||||
refType = 4;
|
||||
};
|
||||
F51DBB19022D995501A85B04 = {
|
||||
fileRef = F51DBB18022D995501A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F51DBB1A022D995501A85B04 = {
|
||||
fileRef = F51DBB17022D995501A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F51DBB1B022D9D8F01A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-login.c";
|
||||
refType = 4;
|
||||
};
|
||||
F51DBB1C022D9D8F01A85B04 = {
|
||||
isa = PBXFileReference;
|
||||
path = "irc-login.h";
|
||||
refType = 4;
|
||||
};
|
||||
F51DBB1D022D9D8F01A85B04 = {
|
||||
fileRef = F51DBB1C022D9D8F01A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F51DBB1E022D9D8F01A85B04 = {
|
||||
fileRef = F51DBB1B022D9D8F01A85B04;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F51F791201DFC95301D13771 = {
|
||||
isa = PBXFileReference;
|
||||
name = defines.h;
|
||||
path = ../src/ngircd/defines.h;
|
||||
refType = 2;
|
||||
};
|
||||
F51F791301DFC95301D13771 = {
|
||||
fileRef = F51F791201DFC95301D13771;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F51F791401DFD0DE01D13771 = {
|
||||
children = (
|
||||
F5263AEF01E2A9B801CE8F8F,
|
||||
F51F791501DFD0DE01D13771,
|
||||
F51F791601DFD0DE01D13771,
|
||||
F51F791701DFD0DE01D13771,
|
||||
);
|
||||
isa = PBXGroup;
|
||||
name = doc;
|
||||
path = /Users/alex/Develop/ngircd/doc;
|
||||
refType = 0;
|
||||
};
|
||||
F51F791501DFD0DE01D13771 = {
|
||||
isa = PBXFileReference;
|
||||
path = CVS.txt;
|
||||
refType = 4;
|
||||
};
|
||||
F51F791601DFD0DE01D13771 = {
|
||||
isa = PBXFileReference;
|
||||
path = RFC.txt;
|
||||
refType = 4;
|
||||
};
|
||||
F51F791701DFD0DE01D13771 = {
|
||||
isa = PBXFileReference;
|
||||
path = "sample-ngircd.conf";
|
||||
refType = 4;
|
||||
};
|
||||
F52162B301C7B904012300F4 = {
|
||||
children = (
|
||||
F52162B801C7B904012300F4,
|
||||
F52162D801C7BAAE012300F4,
|
||||
F52162B901C7B904012300F4,
|
||||
);
|
||||
isa = PBXGroup;
|
||||
name = src;
|
||||
path = ../src;
|
||||
refType = 2;
|
||||
};
|
||||
F52162B801C7B904012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
path = Makefile.am;
|
||||
refType = 4;
|
||||
};
|
||||
F52162B901C7B904012300F4 = {
|
||||
children = (
|
||||
F52162BD01C7B904012300F4,
|
||||
F52162BA01C7B904012300F4,
|
||||
F52162BE01C7B904012300F4,
|
||||
F52162BF01C7B904012300F4,
|
||||
F51D180001C8FDD001E11C2E,
|
||||
F51D180101C8FDD001E11C2E,
|
||||
F51D17FC01C8F5B701E11C2E,
|
||||
F51D17FD01C8F5B701E11C2E,
|
||||
F52162E201C7C77B012300F4,
|
||||
F52162E301C7C77B012300F4,
|
||||
F52162DA01C7BCDC012300F4,
|
||||
F52162DB01C7BCDC012300F4,
|
||||
F51D180201C8FDD001E11C2E,
|
||||
F51D180301C8FDD001E11C2E,
|
||||
F51DBB1B022D9D8F01A85B04,
|
||||
F51DBB1C022D9D8F01A85B04,
|
||||
F51DBB17022D995501A85B04,
|
||||
F51DBB18022D995501A85B04,
|
||||
F51DBB13022D95E801A85B04,
|
||||
F51DBB14022D95E801A85B04,
|
||||
F52162BB01C7B904012300F4,
|
||||
F52162BC01C7B904012300F4,
|
||||
F576ABFA01D5E77301A85B03,
|
||||
F576ABFB01D5E77301A85B03,
|
||||
F52162C001C7B904012300F4,
|
||||
F52162C101C7B904012300F4,
|
||||
F51F791201DFC95301D13771,
|
||||
F576ABFE01D61D7401A85B03,
|
||||
);
|
||||
isa = PBXGroup;
|
||||
path = ngircd;
|
||||
refType = 4;
|
||||
};
|
||||
F52162BA01C7B904012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
path = global.h;
|
||||
refType = 4;
|
||||
};
|
||||
F52162BB01C7B904012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
path = log.c;
|
||||
refType = 4;
|
||||
};
|
||||
F52162BC01C7B904012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
path = log.h;
|
||||
refType = 4;
|
||||
};
|
||||
F52162BD01C7B904012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
path = Makefile.am;
|
||||
refType = 4;
|
||||
};
|
||||
F52162BE01C7B904012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
path = ngircd.c;
|
||||
refType = 4;
|
||||
};
|
||||
F52162BF01C7B904012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
path = ngircd.h;
|
||||
refType = 4;
|
||||
};
|
||||
F52162C001C7B904012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
path = tool.c;
|
||||
refType = 4;
|
||||
};
|
||||
F52162C101C7B904012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
path = tool.h;
|
||||
refType = 4;
|
||||
};
|
||||
F52162C201C7B904012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
name = acconfig.h;
|
||||
path = ../acconfig.h;
|
||||
refType = 2;
|
||||
};
|
||||
F52162C301C7B904012300F4 = {
|
||||
isa = PBXExecutableFileReference;
|
||||
name = autogen.sh;
|
||||
path = ../autogen.sh;
|
||||
refType = 2;
|
||||
};
|
||||
F52162C401C7B904012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
name = configure.in;
|
||||
path = ../configure.in;
|
||||
refType = 2;
|
||||
};
|
||||
F52162C501C7B904012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
name = Makefile.am;
|
||||
path = ../Makefile.am;
|
||||
refType = 2;
|
||||
};
|
||||
F52162C601C7B904012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
name = INSTALL;
|
||||
path = ../INSTALL;
|
||||
refType = 2;
|
||||
};
|
||||
F52162C701C7B904012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
name = AUTHORS;
|
||||
path = ../AUTHORS;
|
||||
refType = 2;
|
||||
};
|
||||
F52162C801C7B904012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
name = ChangeLog;
|
||||
path = ../ChangeLog;
|
||||
refType = 2;
|
||||
};
|
||||
F52162C901C7B904012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
name = COPYING;
|
||||
path = ../COPYING;
|
||||
refType = 2;
|
||||
};
|
||||
F52162CA01C7B904012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
name = NEWS;
|
||||
path = ../NEWS;
|
||||
refType = 2;
|
||||
};
|
||||
F52162CB01C7B904012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
name = README;
|
||||
path = ../README;
|
||||
refType = 2;
|
||||
};
|
||||
F52162CC01C7B904012300F4 = {
|
||||
fileRef = F52162C201C7B904012300F4;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F52162CD01C7B904012300F4 = {
|
||||
fileRef = F52162BA01C7B904012300F4;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F52162CE01C7B904012300F4 = {
|
||||
fileRef = F52162BC01C7B904012300F4;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F52162CF01C7B904012300F4 = {
|
||||
fileRef = F52162BF01C7B904012300F4;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F52162D001C7B904012300F4 = {
|
||||
fileRef = F52162C101C7B904012300F4;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F52162D101C7B904012300F4 = {
|
||||
fileRef = F52162BB01C7B904012300F4;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F52162D201C7B904012300F4 = {
|
||||
fileRef = F52162BE01C7B904012300F4;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F52162D301C7B904012300F4 = {
|
||||
fileRef = F52162C001C7B904012300F4;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F52162D801C7BAAE012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
name = config.h;
|
||||
path = ../src/config.h;
|
||||
refType = 2;
|
||||
};
|
||||
F52162D901C7BAAE012300F4 = {
|
||||
fileRef = F52162D801C7BAAE012300F4;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F52162DA01C7BCDC012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
name = conn.c;
|
||||
path = ../src/ngircd/conn.c;
|
||||
refType = 2;
|
||||
};
|
||||
F52162DB01C7BCDC012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
name = conn.h;
|
||||
path = ../src/ngircd/conn.h;
|
||||
refType = 2;
|
||||
};
|
||||
F52162DC01C7BCDD012300F4 = {
|
||||
fileRef = F52162DB01C7BCDC012300F4;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F52162DD01C7BCDD012300F4 = {
|
||||
fileRef = F52162DA01C7BCDC012300F4;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F52162E201C7C77B012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
name = conf.c;
|
||||
path = ../src/ngircd/conf.c;
|
||||
refType = 2;
|
||||
};
|
||||
F52162E301C7C77B012300F4 = {
|
||||
isa = PBXFileReference;
|
||||
name = conf.h;
|
||||
path = ../src/ngircd/conf.h;
|
||||
refType = 2;
|
||||
};
|
||||
F52162E401C7C79E012300F4 = {
|
||||
fileRef = F52162E301C7C77B012300F4;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F52162E501C7C79E012300F4 = {
|
||||
fileRef = F52162E201C7C77B012300F4;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F5263AEE01E263D201CE8F8F = {
|
||||
fileRef = F51D180001C8FDD001E11C2E;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F5263AEF01E2A9B801CE8F8F = {
|
||||
isa = PBXFileReference;
|
||||
name = Makefile.am;
|
||||
path = ../doc/Makefile.am;
|
||||
refType = 2;
|
||||
};
|
||||
F56D8B9E01E0BFA00155ADA7 = {
|
||||
children = (
|
||||
F56D8B9F01E0BFA00155ADA7,
|
||||
F56D8BA001E0BFA00155ADA7,
|
||||
);
|
||||
isa = PBXGroup;
|
||||
name = MacOSX;
|
||||
path = "";
|
||||
refType = 2;
|
||||
};
|
||||
F56D8B9F01E0BFA00155ADA7 = {
|
||||
isa = PBXFileReference;
|
||||
path = Makefile.am;
|
||||
refType = 4;
|
||||
};
|
||||
F56D8BA001E0BFA00155ADA7 = {
|
||||
children = (
|
||||
F56D8BA101E0BFA00155ADA7,
|
||||
);
|
||||
isa = PBXGroup;
|
||||
path = ngircd.pbproj;
|
||||
refType = 4;
|
||||
};
|
||||
F56D8BA101E0BFA00155ADA7 = {
|
||||
isa = PBXFileReference;
|
||||
path = Makefile.am;
|
||||
refType = 4;
|
||||
};
|
||||
F576ABFA01D5E77301A85B03 = {
|
||||
isa = PBXFileReference;
|
||||
path = parse.c;
|
||||
refType = 4;
|
||||
};
|
||||
F576ABFB01D5E77301A85B03 = {
|
||||
isa = PBXFileReference;
|
||||
path = parse.h;
|
||||
refType = 4;
|
||||
};
|
||||
F576ABFC01D5E77301A85B03 = {
|
||||
fileRef = F576ABFB01D5E77301A85B03;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F576ABFD01D5E77301A85B03 = {
|
||||
fileRef = F576ABFA01D5E77301A85B03;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
F576ABFE01D61D7401A85B03 = {
|
||||
isa = PBXFileReference;
|
||||
name = messages.h;
|
||||
path = ../src/ngircd/messages.h;
|
||||
refType = 2;
|
||||
};
|
||||
F576ABFF01D61D7401A85B03 = {
|
||||
fileRef = F576ABFE01D61D7401A85B03;
|
||||
isa = PBXBuildFile;
|
||||
settings = {
|
||||
};
|
||||
};
|
||||
};
|
||||
rootObject = 08FB7793FE84155DC02AAC07;
|
||||
}
|
||||
58
Makefile.am
58
Makefile.am
@@ -1,42 +1,46 @@
|
||||
#
|
||||
# ngIRCd -- The Next Generation IRC Daemon
|
||||
# Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
# Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
|
||||
#
|
||||
# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
# der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
# herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
# der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
# Please read the file COPYING, README and AUTHORS for more information.
|
||||
#
|
||||
# $Id: Makefile.am,v 1.5 2002/01/02 02:52:09 alex Exp $
|
||||
#
|
||||
# $Log: Makefile.am,v $
|
||||
# Revision 1.5 2002/01/02 02:52:09 alex
|
||||
# - Copyright-Texte angepasst ;-)
|
||||
#
|
||||
# Revision 1.4 2001/12/31 02:20:20 alex
|
||||
# - Unterverzeichnis "doc" aufgenommen.
|
||||
#
|
||||
# Revision 1.3 2001/12/30 19:24:28 alex
|
||||
# - acconfig.h in die "noinst_HEADERS" aufgenommen.
|
||||
#
|
||||
# Revision 1.2 2001/12/12 17:21:58 alex
|
||||
# - Projektdatei fuer den Mac OS X Project Builder erstellt.
|
||||
#
|
||||
# Revision 1.1.1.1 2001/12/11 21:53:04 alex
|
||||
# Imported sources to CVS.
|
||||
# $Id: Makefile.am,v 1.16 2005/04/09 12:27:40 alex Exp $
|
||||
#
|
||||
|
||||
AUTOMAKE_OPTIONS = gnu
|
||||
|
||||
SUBDIRS = doc MacOSX src
|
||||
SUBDIRS = doc src man contrib
|
||||
|
||||
noinst_HEADERS = acconfig.h
|
||||
clean-local:
|
||||
rm -f build-stamp*
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -rf autom4te.cache
|
||||
rm -f Makefile.in Makefile aclocal.m4 configure
|
||||
rm -f mkinstalldirs missing depcomp install-sh
|
||||
rm -f config.log
|
||||
rm -f config.log debian
|
||||
|
||||
lint:
|
||||
make -C src/ngircd lint
|
||||
|
||||
srcdoc:
|
||||
make -C src srcdoc
|
||||
|
||||
xcode:
|
||||
@xcodebuild -project contrib/MacOSX/ngIRCd.xcode -list >/dev/null 2>&1 \
|
||||
|| ( echo; echo "Error: \"xcodebuild\" not found!"; echo; exit 1 )
|
||||
xcodebuild -project contrib/MacOSX/ngIRCd.xcode -alltargets \
|
||||
-buildstyle Development
|
||||
|
||||
rpm: distcheck
|
||||
rpm -ta ngircd-*.tar.gz
|
||||
|
||||
deb:
|
||||
[ -f debian/rules ] || ln -s contrib/Debian debian
|
||||
dpkg-buildpackage -rfakeroot
|
||||
|
||||
# -eof-
|
||||
|
||||
155
NEWS
155
NEWS
@@ -1,16 +1,159 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001,2002 by Alexander Barton,
|
||||
(c)2001-2005 Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd ist freie Software und steht unter
|
||||
der GNU General Public License.
|
||||
ngIRCd is free software and published under the
|
||||
terms of the GNU General Public License.
|
||||
|
||||
-- NEWS / Neuigkeiten --
|
||||
-- NEWS --
|
||||
|
||||
|
||||
ngIRCd 0.2.x, xx.xx.2002
|
||||
ngIRCd 0.9.0 (2005-07-24)
|
||||
|
||||
- Never run with root privileges but always switch the user ID.
|
||||
- Make "netsplit" messages RFC compliant.
|
||||
- Implemented the IRC function "WHOWAS".
|
||||
- New configuration option "OperServerMode" to enable a workaround needed
|
||||
when running an network with ircd2 servers and "OperCanUseMode" enabled
|
||||
to prevent the ircd2 daemon to drop mode changes of IRC operators.
|
||||
Patch by Florian Westphal, <westphal@foo.fh-furtwangen.de>.
|
||||
- Implemented support for "secret channels" (channel mode "s").
|
||||
- New configuration option "Mask" for [Operator] sections to limit OPER
|
||||
commands to users with a specific IRC mask. Patch from Florian Westphal.
|
||||
- New configuration variable "PidFile", section "[Global]": if defined,
|
||||
the server writes its process ID (PID) to this file. Default: off.
|
||||
Idea of Florian Westphal, <westphal@foo.fh-furtwangen.de>.
|
||||
- Added support for the Howl (http://www.porchdogsoft.com/products/howl/)
|
||||
Rendezvous API, in addition to the API of Apple (Mac OS X). The available
|
||||
API will be autodetected when you call "./configure --with-rendezvous".
|
||||
|
||||
ngIRCd 0.8.0 (2004-06-26)
|
||||
|
||||
- Two new configuration options: "ChrootDir" and "MotdPhrase", thanks to
|
||||
Benjamin Pineau <ben@zouh.org>. Now you can force the daemon to change
|
||||
its root and working directory to something "safe". MotdPhrase is used
|
||||
to define an "MOTD string" instead of a whole file, useful if the
|
||||
"real" MOTD file would be outside the "jail".
|
||||
- INVITE- and BAN-lists become synchronized between IRC+ servers when
|
||||
establishing new connections, if the peer supports this as well.
|
||||
- The type of service (TOS) of all sockets is set to "interactive" now.
|
||||
- Added short command line option "-t" as alternative to "--configtest".
|
||||
- Added optional support for "IDENT" lookups on incoming connections. You
|
||||
have to enable this function with the ./configure switch "--with-ident".
|
||||
The default is not to do IDENT lookups.
|
||||
|
||||
ngIRCd 0.7.5 (2003-07-11)
|
||||
|
||||
- New configuration variable "MaxConnectionsIP" to limit the number of
|
||||
simultaneous connections from a single IP that the server will accept.
|
||||
This configuration options lowers the risk of denial of service attacks
|
||||
(DoS), the default is 5 connections per client IP.
|
||||
- Added new configuration variable "Listen" to bind all listening
|
||||
sockets of the server to a single IP address.
|
||||
|
||||
ngIRCd 0.7.1 (2003-07-18)
|
||||
|
||||
- Added support for GNU/Hurd.
|
||||
|
||||
ngIRCd 0.7.0 (2003-05-01)
|
||||
|
||||
- New command CONNECT to enable and add server links. The syntax is not
|
||||
RFC-compatible: use "CONNECT <name> <port>" to enable and connect an
|
||||
configured server and "CONNECT <name> <port> <host> <mypwd> <peerpwd>"
|
||||
to add a new server (ngIRCd tries to connect new servers only once!).
|
||||
- Added DISCONNECT command ("DISCONNECT <name>") to disable servers.
|
||||
- New command TRACE (you can trace only servers at the moment).
|
||||
- New command HELP that lists all understood commands.
|
||||
- ngIRCd can register itself with Rendezvous: to enable support pass the
|
||||
new switch "--with-rendezvous" to configure.
|
||||
- Added support for TCP Wrappers library: pass "--with-tcp-wrappers" to
|
||||
configure to enable it.
|
||||
- Changed some configure options to use "--with"/"--without" as prefix
|
||||
instead of "--enable"/"--disable": "--without-syslog", "--without-zlib",
|
||||
"--with-tcp-wrappers", and "--with-rendezvous".
|
||||
- Enhanced manual pages ngircd(8) and ngircd.conf(5).
|
||||
- Documentation is now installed in $(datadir)/doc/ngircd.
|
||||
|
||||
|
||||
Older news (sorry, only available in german language):
|
||||
|
||||
ngIRCd 0.6.0, 2002-12-24
|
||||
|
||||
- beim Schliessen einer Verbindung zeigt der Server nun vor dem ERROR
|
||||
noch eine Statistik ueber die empfangene und gesendete Datenmenge an.
|
||||
- Connection-Strukturen werden nun "pool-weise" verwaltet; der Pool wird
|
||||
bei Bedarf bis zu einem konfigurierten Limit vergroessert.
|
||||
- Mit der neuen Konfigurationsvariable "MaxConnections" (Sekion "Global")
|
||||
kann die maximale Anzahl gleichzeitiger Verbindungen begrenzt werden.
|
||||
Der Default ist -1, "unlimitiert".
|
||||
- der Server erkennt nun, ob bereits eine eingehende Verbindung von einem
|
||||
Peer-Server besteht und versucht dann nicht mehr, selber eine eigene
|
||||
ausgehende Verbindung zu diesem auufzubauen. Dadurch kann nun auf beiden
|
||||
Servern in der Konfiguration ein Port fuer den Connect konfiguriert
|
||||
werden (beide Server versuchen sich dann gegenseitig zu connectieren).
|
||||
- Server identifizieren sich nun mit asyncronen Passwoertern, d.h. das
|
||||
Passwort, welches A an B schickt, kann ein anderes sein als das, welches
|
||||
B als Antwort an A sendet. In der Konfig.-Datei, Abschnitt "Server",
|
||||
wurde "Password" dazu durch "MyPassword" und "PeerPassword" ersetzt.
|
||||
- Der Server kann nun zur Laufzeit die Konfiguration neu einlesen: dies
|
||||
macht er nach dem Befehl REHASH oder wenn ein HUP-Signal empfangen wird.
|
||||
- Server-Server-Links koennen nun komprimiert werden, dazu wird die zlib
|
||||
(www.zlib.org) benoetigt. Unterstuetzt die Gegenseite die Komprimierung
|
||||
nicht, wird automatisch unkomprimiert kommuniziert. Das Verfahren ist
|
||||
kompatibel mit dem Original-ircd 2.10.3, d.h. beide Server koennen
|
||||
miteinander ueber komprimiert Links kommunizieren.
|
||||
- neue Konfigurations-Variable "MaxJoins": Hiermit kann die maximale Zahl
|
||||
der Channels, in denen ein User Mitglied sein kann, begrent werden.
|
||||
- neue Channel-Modes l (User-Limit) und k (Channel-Key) implementiert.
|
||||
|
||||
ngIRCd 0.5.0, 20.09.2002
|
||||
|
||||
- AIX (3.2.5), HP-UX (10.20), IRIX (6.5), NetBSD (1.5.3/m68k) und Solaris
|
||||
(2.5.1, 2.6) gehoeren nun auch zu den unterstuetzten Platformen.
|
||||
- Unter A/UX (und evtl. weiteren Systemen) kompiliert der ngIRCd nun mit
|
||||
dem "nativen" (ggf. pre-ANSI) Compiler.
|
||||
- "persistente Channels" (Mode 'P') implementiert: diese koennen in der
|
||||
Konfigurationsdatei definiert werden (Sektion "Channel", vgl. Beispiel-
|
||||
Konfiguration "sample-ngircd.conf") und bleiben auch dann bestehen,
|
||||
wenn kein User mehr im Channel ist.
|
||||
- neue IRC-Befehle: KICK, INVITE, ADMIN, CHANINFO; LIST wurde erweitert.
|
||||
Mit dem neuen Befehl CHANINFO syncronisieren Server, die das IRC+-
|
||||
Protokoll unterstuetzen, Channel-Modes und Topics. Fuer den ADMIN-Befehl
|
||||
gibt es neue Konfigurationsoptionen (Sektion "Global"): "AdminInfo1",
|
||||
"AdminInfo2" und "AdminEMail".
|
||||
- Invite- und Ban-Lists implementiert.
|
||||
- neue Konfigurationsoption "OperCanUseMode" (Sektion "Global"):
|
||||
ist sie aktiv, koennen IRC-Operatoren immer Channel-Modes setzen.
|
||||
- "Test-Suite" begonnen: mit "make check" wird sie durchlaufen.
|
||||
|
||||
ngIRCd 0.4.2, 29.04.2002
|
||||
|
||||
- IRC-Funktion LIST implementiert; bisher werden allerdings noch keine
|
||||
Regular Expressions (bis auf "*") unterstuetzt.
|
||||
|
||||
ngIRCd 0.4.0, 01.04.2002
|
||||
|
||||
- WHO implementiert (bisher ohne komplette Unterstuetzung von Masks).
|
||||
- stderr wird nun in eine Datei umgelenkt (/ngircd-<PID>.err).
|
||||
Laeuft der Server nicht im Debug-Modus, so wird diese bei Programm-
|
||||
ende geloescht. Sollte der Server abstuerzen, finden sich hier evtl.
|
||||
zusaetzliche Informationen.
|
||||
- Server-Gruppen implementiert: es wird immer nur zu einem Server in
|
||||
einer Gruppe eine Verbindung aufgebaut, klappt es beim ersten Server
|
||||
nicht, so wird der naechste probiert.
|
||||
- Clients und Channels werden nicht mehr ueber ihren Namen, sondern
|
||||
einen Hash-Wert gesucht: sollte deutlich schneller sein.
|
||||
- neuer Kommandozeilen-Parameter "--configtest": die Konfiguration wird
|
||||
gelesen und die dann verwendeten Werte angezeigt.
|
||||
- Client-Mode "s" (Server Notices) implementiert.
|
||||
- mit dem neuen Kommandozeilen-Parameter "--config"/"-f" kann eine
|
||||
alternative Konfigurationsdatei angegeben werden.
|
||||
- nach dem Start kann der ngIRCd, wenn er mit root-Rechten laeuft,
|
||||
zu einer anderen User-ID und Group-ID wechseln.
|
||||
|
||||
ngIRCd 0.3.0, 02.03.2002
|
||||
|
||||
- bekommt der Server ein HUP-Signal, so startet er neu -- genau so, wie
|
||||
er auf den IRC-Befehl RESTART reagiert.
|
||||
@@ -65,4 +208,4 @@ ngIRCd 0.0.1, 31.12.2001
|
||||
|
||||
|
||||
--
|
||||
$Id: NEWS,v 1.16 2002/03/02 01:36:35 alex Exp $
|
||||
$Id: NEWS,v 1.74.2.1 2005/07/24 21:39:45 alex Exp $
|
||||
|
||||
106
README
106
README
@@ -1,45 +1,87 @@
|
||||
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001,2002 by Alexander Barton,
|
||||
(c)2001-2005 Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd ist freie Software und steht unter
|
||||
der GNU General Public License.
|
||||
ngIRCd is free software and published under the
|
||||
terms of the GNU General Public License.
|
||||
|
||||
-- README / Liesmich --
|
||||
-- README --
|
||||
|
||||
|
||||
ngIRCd ist ein Server fuer den Internet Relay Chat (IRC). Er ist von Grund
|
||||
auf neu geschrieben, also nicht wie die meisten anderen IRCd's vom Urvater,
|
||||
dem Daemon des IRCNet abgeleitet.
|
||||
I. Introduction
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
Zur Zeit befindet sich ngIRCd noch in Entwicklung, vieles ist noch nicht
|
||||
implementiert bzw. nur "halbherzig": Channels gibt es noch nicht, genau so
|
||||
wenig wie Server-Links. Das private Chatten (PRIVMSG) mit den Client-Befehlen
|
||||
/msg und /query sollte hingegen funktionieren, ein wenig praktische Funk-
|
||||
tionalitaet ist also tatsaechlich schon vorhanden ;-)
|
||||
|
||||
Bisher (mehr oder wenig vollstaendig) implementierte IRC-Befehle:
|
||||
|
||||
DIE, ERROR, ISON, JOIN, LINKS, LUSERS, MODE, MOTD, NAMES, NICK, NOTICE, NJOIN,
|
||||
OPER, PART, PASS, PING, PONG, PRIVMSG, QUIT, RESTART, SERVER, SQUIT, USER,
|
||||
USERHOST, WHOIS.
|
||||
|
||||
Ueber Rueckmeldungen, Bug-Reports und Patches freue ich mich! Also los, haut
|
||||
in die Tasten! :-))
|
||||
|
||||
Via E-Mail erreichst du mich als <alex@arthur.ath.cx> bzw. <alex@barton.de>.
|
||||
Die Homepage des ngIRCd findest du unter <http://arthur.ath.cx/~alex/ngircd/>.
|
||||
|
||||
[ ... more to come ... ]
|
||||
ngIRCd is an Open Source server for the Internet Relay Chat (IRC), which
|
||||
is developed and published under the terms of the GNU General Public
|
||||
Licence (URL: http://www.gnu.org/licenses/gpl.html). ngIRCd means "next
|
||||
generation IRC daemon", it's written from scratch and not deduced from the
|
||||
"grandfather of IRC daemons", the daemon of the IRCNet.
|
||||
|
||||
|
||||
Hinweise zur Installation findest du in der Datei INSTALL.
|
||||
Alle Autoren von ngIRCd sind in AUTHORS aufgefuehrt.
|
||||
In der Datei COPYING steht die GNU General Public License.
|
||||
Das README liest du gerade ,-)
|
||||
II. Status
|
||||
~~~~~~~~~~~
|
||||
|
||||
It is not the goal of ngIRCd to implement all the nasty behaviours of the
|
||||
original ircd, but to implement most of the useful commands and semantics
|
||||
specified by the RFCs.
|
||||
|
||||
In the meantime ngIRCd should be quite feature complete and stable to be
|
||||
used in real IRC networks.
|
||||
|
||||
Implemented IRC-commands are:
|
||||
|
||||
ADMIN, AWAY, CHANINFO, CONNECT, DIE, DISCONNECT, ERROR, HELP, INVITE, ISON,
|
||||
JOIN, KICK, KILL, LINKS, LIST, LUSERS, MODE, MOTD, NAMES, NICK, NJOIN, NOTICE,
|
||||
OPER, PART, PASS, PING, PONG, PRIVMSG, QUIT, REHASH, RESTART, SERVER, SQUIT,
|
||||
STATS, TIME, TOPIC, TRACE, USER, USERHOST, VERSION, WHO, WHOIS, WHOWAS.
|
||||
|
||||
|
||||
III. Features (or: why use ngIRCd?)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- no problems with servers which have dynamic IP addresses
|
||||
- simple, easy understandable configuration file,
|
||||
- freely published open-source C source code,
|
||||
- ngIRCd will be developed on in the future.
|
||||
- wide field of supported platforms, including AIX, A/UX, FreeBSD, HP-UX,
|
||||
IRIX, Linux, Mac OS X, NetBSD, OpenBSD, Solaris, and Windows with Cygwin.
|
||||
|
||||
|
||||
IV. Documentation
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
More documentation can be found in the "doc/" directory and the homepage of
|
||||
the ngIRCd: <http://ngircd.barton.de/>.
|
||||
|
||||
|
||||
V. Download
|
||||
~~~~~~~~~~~
|
||||
|
||||
The homepage of the ngIRCd is: <http://ngircd.barton.de/>; you will find
|
||||
the newest information about the ngIRCd and the most recent ("stable")
|
||||
releases there.
|
||||
|
||||
If you are interested in the latest development versions (which are not
|
||||
always stable), then please read the section "CVS" on the homepage and
|
||||
the file "doc/CVS.txt" which describes the use of CVS, the "Concurrent
|
||||
Versioning System".
|
||||
|
||||
|
||||
VI. Bugs
|
||||
~~~~~~~~
|
||||
|
||||
If you find bugs in the ngIRCd (which might be there :-), please report
|
||||
them at the following URL:
|
||||
|
||||
<http://ngircd.barton.de/#bugs>
|
||||
|
||||
There you can read about known bugs and limitations, too.
|
||||
|
||||
If you have critics, patches or something else, please feel free to post a
|
||||
mail to <alex@barton.de>.
|
||||
|
||||
|
||||
--
|
||||
$Id: README,v 1.5 2002/02/15 15:15:48 anonymous Exp $
|
||||
$Id: README,v 1.20.2.1 2005/07/09 14:41:39 alex Exp $
|
||||
|
||||
49
acconfig.h
49
acconfig.h
@@ -1,49 +0,0 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: acconfig.h,v 1.7 2002/01/02 02:52:09 alex Exp $
|
||||
*
|
||||
* $Log: acconfig.h,v $
|
||||
* Revision 1.7 2002/01/02 02:52:09 alex
|
||||
* - Copyright-Texte angepasst ;-)
|
||||
*
|
||||
* Revision 1.6 2001/12/31 02:21:00 alex
|
||||
* - "doc"-Unterverzeichnis aufgenommen.
|
||||
*
|
||||
* Revision 1.5 2001/12/29 03:04:35 alex
|
||||
* - neue configure-Option "--enable-strict-rfc", #define STRICT_RFC.
|
||||
*
|
||||
* Revision 1.4 2001/12/27 01:44:49 alex
|
||||
* - die Verwendung von syslog kann nun abgeschaltet werden.
|
||||
*
|
||||
* Revision 1.3 2001/12/25 22:01:47 alex
|
||||
* - neue configure-Option "--enable-sniffer".
|
||||
*
|
||||
* Revision 1.2 2001/12/21 23:54:15 alex
|
||||
* - zusaetzliche Debug-Ausgaben koennen eingeschaltet werden.
|
||||
*
|
||||
* Revision 1.1 2001/12/12 01:58:52 alex
|
||||
* - Test auf socklen_t verbessert.
|
||||
*/
|
||||
|
||||
|
||||
#undef HAVE_socklen_t
|
||||
|
||||
#undef DEBUG
|
||||
|
||||
#undef SNIFFER
|
||||
|
||||
#undef USE_SYSLOG
|
||||
|
||||
#undef STRICT_RFC
|
||||
|
||||
|
||||
/* -eof- */
|
||||
192
autogen.sh
192
autogen.sh
@@ -1,23 +1,187 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# $Id: autogen.sh,v 1.2 2001/12/12 01:58:17 alex Exp $
|
||||
# ngIRCd -- The Next Generation IRC Daemon
|
||||
# Copyright (c)2001-2004 Alexander Barton <alex@barton.de>
|
||||
#
|
||||
# $Log: autogen.sh,v $
|
||||
# Revision 1.2 2001/12/12 01:58:17 alex
|
||||
# - fuer fehlende Dateien werden nun "nur noch" symbolische Links erzeugt.
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
# Please read the file COPYING, README and AUTHORS for more information.
|
||||
#
|
||||
# Revision 1.1.1.1 2001/12/11 21:53:04 alex
|
||||
# Imported sources to CVS.
|
||||
# $Id: autogen.sh,v 1.14 2005/02/21 15:23:23 alex Exp $
|
||||
#
|
||||
|
||||
if [ -f configure ]; then
|
||||
echo "autogen.sh: configure-Skript existiert bereits ..."
|
||||
#
|
||||
# Usage: [VAR=<value>] ./autogen.sh [<configure-args>]
|
||||
#
|
||||
# This script generates the ./configure script using GNU automake and
|
||||
# GNU autoconf. It tries to be smart in finding the correct/usable/available
|
||||
# installed versions of these tools on your system.
|
||||
#
|
||||
# The following strategy is used for each of aclocal, autoheader, automake,
|
||||
# and autoconf: first, "tool" (the regular name of the tool, e. g. "autoconf"
|
||||
# or "automake") is checked. If this fails, "tool<major><minor>" (for example
|
||||
# "automake16") and "tool-<major>.<minor>" (e. g. "autoconf-2.54") are tried
|
||||
# with <major> being 2 for tool of GNU autoconf and 1 for tools of automake;
|
||||
# <minor> is tried from 99 to 0. The first occurrence will be used.
|
||||
#
|
||||
# When you pass <configure-args> to autogen.sh it will call the generated
|
||||
# ./configure script on success and pass these parameters to it.
|
||||
#
|
||||
# You can tweak the behaviour using these environment variables:
|
||||
#
|
||||
# - ACLOCAL=<cmd>, AUTOHEADER=<cmd>, AUTOMAKE=<cmd>, AUTOCONF=<cmd>
|
||||
# Name and optionally path to the particular tool.
|
||||
# - PREFIX=<path>
|
||||
# Search the GNU autoconf and GNU automake tools in <path> first. If the
|
||||
# generated ./configure script will be called, pass "--prefix=<path>" to it.
|
||||
# - EXIST=<tool>
|
||||
# Use <tool> to test for aclocal, autoheader etc. pp. ...
|
||||
# When not specified, either "type" or "which" is used.
|
||||
# - VERBOSE=1
|
||||
# Output the detected names of the GNU automake and GNU autoconf tools.
|
||||
# - GO=1
|
||||
# Call ./configure even if no arguments have been passed to autogen.sh.
|
||||
#
|
||||
# Examples:
|
||||
#
|
||||
# - ./autogen.sh
|
||||
# Generates the ./configure script.
|
||||
# - GO=1 ./autogen.sh
|
||||
# Generates the ./configure script and runs it as "./configure".
|
||||
# - VERBOSE=1 ./autogen.sh --with-ident
|
||||
# Show tool names, generates the ./configure script, and runs it with
|
||||
# these arguments: "./configure --with-ident".
|
||||
# - ACLOCAL=aclocal-1.6 GO=1 PREFIX=$HOME ./autogen.sh
|
||||
# Uses "aclocal-1.6" as aclocal tool, generates the ./configure script,
|
||||
# and runs it with these arguments: "./configure --prefix=$HOME".
|
||||
#
|
||||
|
||||
Search()
|
||||
{
|
||||
[ $# -eq 2 ] || exit 1
|
||||
|
||||
searchlist="$1"
|
||||
major="$2"
|
||||
minor=99
|
||||
|
||||
[ -n "$PREFIX" ] && searchlist="${PREFIX}/$1 ${PREFIX}/bin/$1 $searchlist"
|
||||
|
||||
for name in $searchlist; do
|
||||
$EXIST "${name}" >/dev/null 2>&1
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "${name}"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
|
||||
while [ $minor -ge 0 ]; do
|
||||
for name in $searchlist; do
|
||||
$EXIST "${name}${major}${minor}" >/dev/null 2>&1
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "${name}${major}${minor}"
|
||||
return 0
|
||||
fi
|
||||
$EXIST "${name}-${major}.${minor}" >/dev/null 2>&1
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "${name}-${major}.${minor}"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
minor=`expr $minor - 1`
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
Notfound()
|
||||
{
|
||||
echo "Error: $* not found!"
|
||||
echo "Please install recent versions of GNU autoconf and GNU automake."
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Reset locale settings to suppress warning messages of Perl
|
||||
unset LC_ALL
|
||||
unset LANG
|
||||
|
||||
# Which command should be used to detect the automake/autoconf tools?
|
||||
[ -z "$EXIST" ] && existlist="type which" || existlist="$EXIST"
|
||||
EXIST=""
|
||||
for t in $existlist; do
|
||||
$t /bin/ls >/dev/null 2>&1
|
||||
if [ $? -eq 0 ]; then
|
||||
rm -f /tmp/test.$$
|
||||
$t /tmp/test.$$ >/dev/null 2>&1
|
||||
[ $? -ne 0 ] && EXIST="$t"
|
||||
fi
|
||||
[ -n "$EXIST" ] && break
|
||||
done
|
||||
if [ -z "$EXIST" ]; then
|
||||
echo "Didn't detect a working command to test for the autoconf/automake tools!"
|
||||
echo "Searchlist: $existlist"
|
||||
exit 1
|
||||
fi
|
||||
[ "$VERBOSE" = "1" ] && echo "Using \"$EXIST\" to test for tools."
|
||||
|
||||
# We want to use GNU automake 1.7, if available (WANT_AUTOMAKE is used by
|
||||
# the wrapper scripts of Gentoo Linux, AUTOMAKE_VERSION is used by OpenBSD);
|
||||
# same applies for GNU autoconf, we want to use version 2.59.
|
||||
AUTOMAKE_VERSION=1.7
|
||||
AUTOCONF_VERSION=2.59
|
||||
export AUTOMAKE_VERSION AUTOCONF_VERSION
|
||||
WANT_AUTOMAKE=1.7
|
||||
export WANT_AUTOMAKE
|
||||
|
||||
# Try to detect the needed tools when no environment variable already
|
||||
# spezifies one:
|
||||
echo "Searching tools ..."
|
||||
[ -z "$ACLOCAL" ] && ACLOCAL=`Search aclocal 1`
|
||||
[ "$VERBOSE" = "1" ] && echo "ACLOCAL=$ACLOCAL"
|
||||
[ -z "$AUTOHEADER" ] && AUTOHEADER=`Search autoheader 2`
|
||||
[ "$VERBOSE" = "1" ] && echo "AUTOHEADER=$AUTOHEADER"
|
||||
[ -z "$AUTOMAKE" ] && AUTOMAKE=`Search automake 1`
|
||||
[ "$VERBOSE" = "1" ] && echo "AUTOMAKE=$AUTOMAKE"
|
||||
[ -z "$AUTOCONF" ] && AUTOCONF=`Search autoconf 2`
|
||||
[ "$VERBOSE" = "1" ] && echo "AUTOCONF=$AUTOCONF"
|
||||
|
||||
# Call ./configure when parameters have been passed to this script and
|
||||
# GO isn't already defined.
|
||||
[ -z "$GO" -a $# -gt 0 ] && GO=1
|
||||
|
||||
# Verify that all tools have been found
|
||||
[ -z "$AUTOCONF" ] && Notfound autoconf
|
||||
[ -z "$AUTOHEADER" ] && Notfound autoheader
|
||||
[ -z "$AUTOMAKE" ] && Notfound automake
|
||||
[ -z "$AUTOCONF" ] && Notfound autoconf
|
||||
|
||||
export AUTOCONF AUTOHEADER AUTOMAKE AUTOCONF
|
||||
|
||||
# Generate files
|
||||
echo "Generating files ..."
|
||||
$ACLOCAL && \
|
||||
$AUTOHEADER && \
|
||||
$AUTOMAKE --add-missing && \
|
||||
$AUTOCONF
|
||||
|
||||
if [ $? -eq 0 -a -x ./configure ]; then
|
||||
# Success: if we got some parameters we call ./configure and pass
|
||||
# all of them to it.
|
||||
if [ "$GO" = "1" ]; then
|
||||
[ -n "$PREFIX" ] && p=" --prefix=$PREFIX" || p=""
|
||||
[ -n "$*" ] && a=" $*" || a=""
|
||||
c="./configure${p}${a}"
|
||||
echo "Calling \"$c\" ..."
|
||||
$c
|
||||
exit $?
|
||||
else
|
||||
echo "Okay, autogen.sh done; now run the \"configure\" script."
|
||||
exit 0
|
||||
fi
|
||||
else
|
||||
# Failure!?
|
||||
echo "Error! Check your installation of GNU automake and autoconf!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
aclocal && \
|
||||
autoheader && \
|
||||
automake --add-missing && \
|
||||
autoconf && \
|
||||
echo "Okay, autogen.sh war erfolgreich."
|
||||
|
||||
# -eof-
|
||||
|
||||
1465
config.guess
vendored
Normal file
1465
config.guess
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1569
config.sub
vendored
Normal file
1569
config.sub
vendored
Normal file
File diff suppressed because it is too large
Load Diff
521
configure.in
521
configure.in
@@ -1,129 +1,47 @@
|
||||
#
|
||||
# ngIRCd -- The Next Generation IRC Daemon
|
||||
# Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
# Copyright (c)2001-2005 Alexander Barton <alex@barton.de>
|
||||
#
|
||||
# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
# der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
# herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
# der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
# Please read the file COPYING, README and AUTHORS for more information.
|
||||
#
|
||||
# $Id: configure.in,v 1.32 2002/03/02 03:36:14 alex Exp $
|
||||
#
|
||||
# $Log: configure.in,v $
|
||||
# Revision 1.32 2002/03/02 03:36:14 alex
|
||||
# - Version 0.3.0
|
||||
#
|
||||
# Revision 1.31 2002/02/25 11:45:28 alex
|
||||
# - es wird auf sigaction() geprueft (u.a. fuer A/UX, welches das nicht kennt).
|
||||
#
|
||||
# Revision 1.30 2002/02/25 11:41:43 alex
|
||||
# - es werden ein paar Funktionen mehr getestet: u.a. vsnprintf() und setsockopt().
|
||||
# - libUTIL wird eingebunden, so vorhanden (unter A/UX notwendig!)
|
||||
#
|
||||
# Revision 1.29 2002/02/19 02:11:26 alex
|
||||
# - auf die "libbe" wird nur noch getestet, wenn syslog ueberhaupt verwendet wird.
|
||||
#
|
||||
# Revision 1.28 2002/02/17 22:17:33 alex
|
||||
# - Versionsnummer im CVS auf 0.2.2-pre angehoben ...
|
||||
#
|
||||
# Revision 1.27 2002/02/17 21:50:38 alex
|
||||
# - Version 0.2.1.
|
||||
#
|
||||
# Revision 1.26 2002/02/17 18:47:26 alex
|
||||
# - Tests auf netdb.h, stdlib.h, sys/wait.h, gethostbyaddr, gethostbyname,
|
||||
# strftime und die "libbe" unter BeOS (fuer syslog) ergaenzt.
|
||||
#
|
||||
# Revision 1.25 2002/02/15 14:57:21 alex
|
||||
# - Version auf 0.2.1-pre im CVS angehoben ...
|
||||
#
|
||||
# Revision 1.24 2002/02/15 14:35:55 alex
|
||||
# - Version 0.2.0
|
||||
#
|
||||
# Revision 1.23 2002/01/29 01:07:15 alex
|
||||
# - Version auf 0.1.1-pre im CVS angehoben.
|
||||
#
|
||||
# Revision 1.22 2002/01/29 00:24:17 alex
|
||||
# - Version 0.1.0
|
||||
#
|
||||
# Revision 1.21 2002/01/16 23:06:16 alex
|
||||
# - Version auf 0.0.4-pre im CVS angehoben.
|
||||
#
|
||||
# Revision 1.20 2002/01/16 22:55:45 alex
|
||||
# - Version 0.0.3
|
||||
#
|
||||
# Revision 1.19 2002/01/06 16:21:09 alex
|
||||
# - CVS-Version auf "0.0.3-pre" angehoben.
|
||||
#
|
||||
# Revision 1.18 2002/01/06 16:09:37 alex
|
||||
# - Version 0.0.2
|
||||
#
|
||||
# Revision 1.17 2002/01/05 15:53:20 alex
|
||||
# - Test auf Header "arpa/inet.h" und Funktion inet_aton() hinzugefuegt (BeOS).
|
||||
#
|
||||
# Revision 1.16 2002/01/02 13:41:36 alex
|
||||
# - CFLAGS wird nur noch gesetzt, wenn der GCC verwendet wird.
|
||||
#
|
||||
# Revision 1.15 2002/01/02 02:52:09 alex
|
||||
# - Copyright-Texte angepasst ;-)
|
||||
#
|
||||
# Revision 1.14 2001/12/31 16:11:13 alex
|
||||
# - CVS-Version auf "0.0.2-pre" angehoben.
|
||||
#
|
||||
# Revision 1.13 2001/12/31 16:02:30 alex
|
||||
# - Version 0.0.1
|
||||
#
|
||||
# Revision 1.12 2001/12/31 02:21:00 alex
|
||||
# - "doc"-Unterverzeichnis aufgenommen.
|
||||
#
|
||||
# Revision 1.11 2001/12/29 03:04:06 alex
|
||||
# - neue configure-Option "--enable-strict-rfc".
|
||||
#
|
||||
# Revision 1.10 2001/12/27 16:25:36 alex
|
||||
# - neue configure-Option "--with-portab=DIR".
|
||||
#
|
||||
# Revision 1.9 2001/12/27 02:08:38 alex
|
||||
# - da fehlte an zwei Stellen ein AC_MSG_ERROR ... ups!
|
||||
#
|
||||
# Revision 1.8 2001/12/27 01:44:49 alex
|
||||
# - die Verwendung von syslog kann nun abgeschaltet werden.
|
||||
#
|
||||
# Revision 1.7 2001/12/27 00:37:07 alex
|
||||
# - Erkennung der "portab header" geaendert, CFLAGS werden nun anders gesetzt.
|
||||
#
|
||||
# Revision 1.6 2001/12/25 22:01:47 alex
|
||||
# - neue configure-Option "--enable-sniffer".
|
||||
#
|
||||
# Revision 1.5 2001/12/21 23:54:26 alex
|
||||
# - zusaetzliche Debug-Ausgaben koennen eingeschaltet werden.
|
||||
#
|
||||
# Revision 1.4 2001/12/12 17:21:58 alex
|
||||
# - Projektdatei fuer den Mac OS X Project Builder erstellt.
|
||||
#
|
||||
# Revision 1.3 2001/12/12 01:58:53 alex
|
||||
# - Test auf socklen_t verbessert.
|
||||
#
|
||||
# Revision 1.2 2001/12/11 22:04:21 alex
|
||||
# - Test auf stdint.h (HAVE_STDINT_H) hinzugefuegt.
|
||||
#
|
||||
# Revision 1.1.1.1 2001/12/11 21:53:04 alex
|
||||
# Imported sources to CVS.
|
||||
# $Id: configure.in,v 1.111.2.6 2005/10/15 12:44:08 alex Exp $
|
||||
#
|
||||
|
||||
# -- Initialisierung --
|
||||
# -- Initialisation --
|
||||
|
||||
AC_INIT
|
||||
AC_PREREQ(2.50)
|
||||
AC_INIT(ngircd, 0.9.2)
|
||||
AC_CONFIG_SRCDIR(src/ngircd/ngircd.c)
|
||||
AM_INIT_AUTOMAKE(ngircd,0.3.0)
|
||||
AC_CANONICAL_TARGET
|
||||
AM_INIT_AUTOMAKE(1.6)
|
||||
AM_CONFIG_HEADER(src/config.h)
|
||||
|
||||
# -- Templates for config.h --
|
||||
|
||||
AH_TEMPLATE([DEBUG], [Define if debug-mode should be enabled])
|
||||
AH_TEMPLATE([HAVE_socklen_t], [Define if socklen_t exists])
|
||||
AH_TEMPLATE([SNIFFER], [Define if IRC sniffer should be enabled])
|
||||
AH_TEMPLATE([STRICT_RFC], [Define if ngIRCd should behave strict RFC compliant])
|
||||
AH_TEMPLATE([SYSLOG], [Define if syslog should be used for logging])
|
||||
AH_TEMPLATE([ZLIB], [Define if zlib compression should be enabled])
|
||||
AH_TEMPLATE([TCPWRAP], [Define if TCP wrappers should be used])
|
||||
AH_TEMPLATE([IRCPLUS], [Define if IRC+ protocol should be used])
|
||||
AH_TEMPLATE([RENDEZVOUS], [Define if Rendezvous support should be included])
|
||||
AH_TEMPLATE([IDENTAUTH], [Define if the server should do IDENT requests])
|
||||
|
||||
AH_TEMPLATE([TARGET_OS], [Target operating system name])
|
||||
AH_TEMPLATE([TARGET_VENDOR], [Target system vendor])
|
||||
AH_TEMPLATE([TARGET_CPU], [Target CPU name])
|
||||
|
||||
# -- C Compiler --
|
||||
|
||||
AC_PROG_CC
|
||||
AC_LANG_C
|
||||
|
||||
# -- Hilfsprogramme --
|
||||
# -- Helper programs --
|
||||
|
||||
AC_PROG_AWK
|
||||
AC_PROG_INSTALL
|
||||
@@ -131,50 +49,50 @@ AC_PROG_LN_S
|
||||
AC_PROG_MAKE_SET
|
||||
AC_PROG_RANLIB
|
||||
|
||||
# -- Header --
|
||||
# -- Compiler Features --
|
||||
|
||||
AM_C_PROTOTYPES
|
||||
AC_C_CONST
|
||||
|
||||
# -- Hard coded system and compiler dependencies/features/options ... --
|
||||
|
||||
if test "$GCC" = "yes"; then
|
||||
# We are using the GNU C compiler. Good!
|
||||
CFLAGS="$CFLAGS -pipe -W -Wall -Wpointer-arith -Wstrict-prototypes"
|
||||
fi
|
||||
|
||||
case "$target_os" in
|
||||
hpux*)
|
||||
# This is HP/UX, we need to define _XOPEN_SOURCE_EXTENDED
|
||||
# (tested with HP/UX 11.11)
|
||||
CFLAGS="$CFLAGS -D_XOPEN_SOURCE_EXTENDED"
|
||||
;;
|
||||
esac
|
||||
|
||||
# Add additional CFLAGS, eventually specified on the command line:
|
||||
test -n "$CFLAGS_ADD" && CFLAGS="$CFLAGS $CFLAGS_ADD"
|
||||
|
||||
CFLAGS="$CFLAGS -DSYSCONFDIR='\"\$(sysconfdir)\"'"
|
||||
|
||||
# -- Headers --
|
||||
|
||||
AC_HEADER_STDC
|
||||
|
||||
AC_HEADER_TIME
|
||||
|
||||
AC_ARG_WITH(portab,
|
||||
[ --with-portab=DIR search the "portab headers" in DIR],
|
||||
[ if test "x$withval" != "xno"; then
|
||||
CFLAGS="$CFLAGS -I${withval}"
|
||||
if test -f ${withval}/portab.h; then
|
||||
AC_MSG_RESULT([searching "portab headers" in ${withval}...])
|
||||
else
|
||||
AC_MSG_ERROR([${withval}/portab.h not found!])
|
||||
fi
|
||||
else
|
||||
AC_MSG_ERROR([Can't disable Alex \"portability headers\"!])
|
||||
fi
|
||||
],
|
||||
[ AC_CHECK_HEADER(portab.h,[
|
||||
AC_CHECK_HEADER(imp.h,,AC_MSG_ERROR([Alex \"portability headers\" (portab.h an friends) not found!]))
|
||||
AC_CHECK_HEADER(exp.h,,AC_MSG_ERROR([Alex \"portability headers\" (portab.h an friends) not found!]))
|
||||
],[
|
||||
AC_CHECK_HEADER(/usr/local/include/portab.h,,AC_MSG_ERROR([Alex \"portability headers\" (portab.h an friends) not found!]))
|
||||
AC_CHECK_HEADER(/usr/local/include/imp.h,,AC_MSG_ERROR([Alex \"portability headers\" (portab.h an friends) not found!]))
|
||||
AC_CHECK_HEADER(/usr/local/include/exp.h,,AC_MSG_ERROR([Alex \"portability headers\" (portab.h an friends) not found!]))
|
||||
CFLAGS="$CFLAGS -I/usr/local/include"
|
||||
])
|
||||
]
|
||||
)
|
||||
|
||||
AC_CHECK_HEADERS(arpa/inet.h)
|
||||
AC_HEADER_SYS_WAIT
|
||||
|
||||
AC_CHECK_HEADERS([ \
|
||||
errno.h fcntl.h netdb.h netinet/in.h stdlib.h string.h \
|
||||
sys/socket.h sys/time.h sys/wait.h unistd.h \
|
||||
ctype.h errno.h fcntl.h netdb.h netinet/in.h stdlib.h string.h \
|
||||
strings.h sys/socket.h sys/time.h unistd.h \
|
||||
],,AC_MSG_ERROR([required C header missing!]))
|
||||
|
||||
# -- Datentypen --
|
||||
AC_CHECK_HEADERS([arpa/inet.h ctype.h malloc.h stdbool.h stddef.h varargs.h])
|
||||
|
||||
# -- Datatypes --
|
||||
|
||||
AC_MSG_CHECKING(whether socklen_t exists)
|
||||
AC_TRY_COMPILE([
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
],[
|
||||
socklen_t a, b;
|
||||
a = 2; b = 4; a += b;
|
||||
@@ -184,61 +102,194 @@ AC_TRY_COMPILE([
|
||||
AC_MSG_RESULT(no)
|
||||
])
|
||||
|
||||
AC_TYPE_SIGNAL
|
||||
AC_TYPE_SIZE_T
|
||||
|
||||
# -- Libraries --
|
||||
|
||||
AC_CHECK_LIB(UTIL,memmove)
|
||||
AC_CHECK_LIB(socket,bind)
|
||||
AC_CHECK_LIB(nsl,gethostent)
|
||||
|
||||
# -- Funktionen --
|
||||
# -- Functions --
|
||||
|
||||
AC_FUNC_MALLOC
|
||||
AC_FUNC_FORK
|
||||
AC_FUNC_STRFTIME
|
||||
|
||||
AC_CHECK_FUNCS([ \
|
||||
bind gethostbyaddr gethostbyname gethostname inet_ntoa memmove \
|
||||
memset select setsockopt socket strcasecmp strchr strerror strftime \
|
||||
strstr vsnprintf waitpid \
|
||||
],,AC_MSG_ERROR([required function missing!]))
|
||||
bind gethostbyaddr gethostbyname gethostname inet_ntoa malloc memmove \
|
||||
memset realloc setsid setsockopt socket strcasecmp strchr strerror \
|
||||
strstr waitpid],,AC_MSG_ERROR([required function missing!]))
|
||||
|
||||
AC_CHECK_FUNCS(inet_aton)
|
||||
AC_CHECK_FUNCS(inet_aton isdigit sigaction snprintf vsnprintf strdup strlcpy strlcat)
|
||||
|
||||
AC_CHECK_FUNCS(sigaction)
|
||||
AC_CHECK_FUNCS(select,[AC_CHECK_HEADERS(sys/select.h)],
|
||||
AC_MSG_ERROR([required function select() is missing!])
|
||||
)
|
||||
|
||||
# -- Konfigurationsoptionen --
|
||||
# -- Configuration options --
|
||||
|
||||
AC_ARG_ENABLE(syslog,
|
||||
[ --disable-syslog disable syslog (autodetected by default)],
|
||||
[ if test "$enableval" = "yes"; then
|
||||
AC_CHECK_HEADER(syslog.h,
|
||||
[ AC_DEFINE(USE_SYSLOG, 1)
|
||||
AC_CHECK_LIB(be,syslog)
|
||||
],
|
||||
AC_MSG_ERROR([Can't enable syslog: syslog.h not found!])
|
||||
x_syslog_on=no
|
||||
AC_ARG_WITH(syslog,
|
||||
[ --without-syslog disable syslog (autodetected by default)],
|
||||
[ if test "$withval" != "no"; then
|
||||
if test "$withval" != "yes"; then
|
||||
CFLAGS="-I$withval/include $CFLAGS"
|
||||
CPPFLAGS="-I$withval/include $CPPFLAGS"
|
||||
LDFLAGS="-L$withval/lib $LDFLAGS"
|
||||
fi
|
||||
AC_CHECK_LIB(be, syslog)
|
||||
AC_CHECK_FUNCS(syslog, x_syslog_on=yes,
|
||||
AC_MSG_ERROR([Can't enable syslog!])
|
||||
)
|
||||
else
|
||||
AC_MSG_RESULT([disabling syslog])
|
||||
fi
|
||||
],
|
||||
[ AC_CHECK_HEADER(syslog.h,
|
||||
[ AC_DEFINE(USE_SYSLOG, 1)
|
||||
AC_CHECK_LIB(be,syslog)
|
||||
]
|
||||
)
|
||||
[
|
||||
AC_CHECK_LIB(be, syslog)
|
||||
AC_CHECK_FUNCS(syslog, x_syslog_on=yes)
|
||||
]
|
||||
)
|
||||
if test "$x_syslog_on" = "yes"; then
|
||||
AC_DEFINE(SYSLOG, 1)
|
||||
AC_CHECK_HEADERS(syslog.h,,AC_MSG_ERROR([required C header missing!]))
|
||||
fi
|
||||
|
||||
x_zlib_on=no
|
||||
AC_ARG_WITH(zlib,
|
||||
[ --without-zlib disable zlib compression (autodetected by default)],
|
||||
[ if test "$withval" != "no"; then
|
||||
if test "$withval" != "yes"; then
|
||||
CFLAGS="-I$withval/include $CFLAGS"
|
||||
CPPFLAGS="-I$withval/include $CPPFLAGS"
|
||||
LDFLAGS="-L$withval/lib $LDFLAGS"
|
||||
fi
|
||||
AC_CHECK_LIB(z, deflate)
|
||||
AC_CHECK_FUNCS(deflate, x_zlib_on=yes,
|
||||
AC_MSG_ERROR([Can't enable zlib!])
|
||||
)
|
||||
fi
|
||||
],
|
||||
[ AC_CHECK_LIB(z, deflate)
|
||||
AC_CHECK_FUNCS(deflate, x_zlib_on=yes)
|
||||
]
|
||||
)
|
||||
if test "$x_zlib_on" = "yes"; then
|
||||
AC_DEFINE(ZLIB, 1)
|
||||
AC_CHECK_HEADERS(zlib.h,,AC_MSG_ERROR([required C header missing!]))
|
||||
fi
|
||||
|
||||
x_tcpwrap_on=no
|
||||
AC_ARG_WITH(tcp-wrappers,
|
||||
[ --with-tcp-wrappers enable TCP wrappers support],
|
||||
[ if test "$withval" != "no"; then
|
||||
if test "$withval" != "yes"; then
|
||||
CFLAGS="-I$withval/include $CFLAGS"
|
||||
CPPFLAGS="-I$withval/include $CPPFLAGS"
|
||||
LDFLAGS="-L$withval/lib $LDFLAGS"
|
||||
fi
|
||||
AC_MSG_CHECKING(for hosts_access)
|
||||
LIBS="-lwrap $LIBS"
|
||||
AC_TRY_LINK([
|
||||
#include <tcpd.h>
|
||||
int allow_severity = 0;
|
||||
int deny_severity = 0;
|
||||
],[
|
||||
tcpd_warn("link test");
|
||||
],[
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(TCPWRAP, 1)
|
||||
x_tcpwrap_on=yes
|
||||
],[
|
||||
AC_MSG_RESULT(no)
|
||||
AC_MSG_ERROR([Can't enable TCP wrappers!])
|
||||
])
|
||||
fi
|
||||
]
|
||||
)
|
||||
|
||||
AC_ARG_ENABLE(strict-rfc,
|
||||
[ --enable-strict-rfc strict RFC conformance, may break clients],
|
||||
if test "$enableval" = "yes"; then
|
||||
AC_DEFINE(STRICT_RFC, 1)
|
||||
AC_MSG_RESULT([enabling strict RFC conformance])
|
||||
fi
|
||||
x_rendezvous_on=no
|
||||
AC_ARG_WITH(rendezvous,
|
||||
[ --with-rendezvous enable support for "Rendezvous"],
|
||||
[ if test "$withval" != "no"; then
|
||||
if test "$withval" != "yes"; then
|
||||
CFLAGS="-I$withval/include $CFLAGS"
|
||||
CPPFLAGS="-I$withval/include $CPPFLAGS"
|
||||
LDFLAGS="-L$withval/lib $LDFLAGS"
|
||||
fi
|
||||
AC_CHECK_FUNCS(DNSServiceRegistrationCreate, x_rendezvous_on=osx,
|
||||
[
|
||||
AC_CHECK_LIB(pthread, pthread_mutexattr_init)
|
||||
AC_CHECK_LIB(howl, sw_discovery_init)
|
||||
AC_CHECK_FUNCS(sw_discovery_init, \
|
||||
x_rendezvous_on=howl, \
|
||||
AC_MSG_ERROR([Can't enable Rendezvous!]))
|
||||
])
|
||||
fi
|
||||
]
|
||||
)
|
||||
if test "$x_rendezvous_on" = "osx"; then
|
||||
AC_CHECK_HEADERS([DNSServiceDiscovery/DNSServiceDiscovery.h \
|
||||
mach/port.h],,AC_MSG_ERROR([required C header missing!]))
|
||||
AC_DEFINE(RENDEZVOUS, 1)
|
||||
fi
|
||||
if test "$x_rendezvous_on" = "howl"; then
|
||||
for dir in /usr/local/include /usr/local/include/howl* \
|
||||
/usr/include /usr/include/howl*; do
|
||||
test -d "$dir" || continue
|
||||
AC_MSG_CHECKING([for Howl headers in $dir])
|
||||
if test -f "$dir/rendezvous/rendezvous.h"; then
|
||||
if test "$dir" != "/usr/local/include" -a \
|
||||
"$dir" != "/usr/include"; then
|
||||
CFLAGS="-I$dir $CFLAGS"
|
||||
CPPFLAGS="-I$dir $CPPFLAGS"
|
||||
fi
|
||||
AC_MSG_RESULT(yes)
|
||||
break
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
fi
|
||||
done
|
||||
AC_CHECK_HEADERS([rendezvous/rendezvous.h],, \
|
||||
AC_MSG_ERROR([required C header missing!]))
|
||||
AC_DEFINE(RENDEZVOUS, 1)
|
||||
fi
|
||||
|
||||
x_identauth_on=no
|
||||
AC_ARG_WITH(ident,
|
||||
[ --with-ident enable "IDENT" ("AUTH") protocol support],
|
||||
[ if test "$withval" != "no"; then
|
||||
if test "$withval" != "yes"; then
|
||||
CFLAGS="-I$withval/include $CFLAGS"
|
||||
CPPFLAGS="-I$withval/include $CPPFLAGS"
|
||||
LDFLAGS="-L$withval/lib $LDFLAGS"
|
||||
fi
|
||||
AC_CHECK_LIB(ident, ident_id)
|
||||
AC_CHECK_FUNCS(ident_id, x_identauth_on=yes,
|
||||
AC_MSG_ERROR([Can't enable IDENT support!])
|
||||
)
|
||||
fi
|
||||
]
|
||||
)
|
||||
if test "$x_identauth_on" = "yes"; then
|
||||
AC_DEFINE(IDENTAUTH, 1)
|
||||
AC_CHECK_HEADERS(ident.h,,AC_MSG_ERROR([required C header missing!]))
|
||||
fi
|
||||
|
||||
x_ircplus_on=yes
|
||||
AC_ARG_ENABLE(ircplus,
|
||||
[ --disable-ircplus disable IRC+ protocol],
|
||||
if test "$enableval" = "no"; then x_ircplus_on=no; fi
|
||||
)
|
||||
if test "$x_ircplus_on" = "yes"; then
|
||||
AC_DEFINE(IRCPLUS, 1)
|
||||
fi
|
||||
|
||||
x_sniffer_on=no; x_debug_on=no
|
||||
AC_ARG_ENABLE(sniffer,
|
||||
[ --enable-sniffer enable network traffic monitor (enables debug mode!)],
|
||||
[ --enable-sniffer enable IRC traffic sniffer (enables debug mode)],
|
||||
if test "$enableval" = "yes"; then
|
||||
AC_DEFINE(SNIFFER, 1)
|
||||
AC_MSG_RESULT([enabling network traffic monitor])
|
||||
x_debug_on=yes
|
||||
x_sniffer_on=yes; x_debug_on=yes
|
||||
fi
|
||||
)
|
||||
|
||||
@@ -248,24 +299,120 @@ AC_ARG_ENABLE(debug,
|
||||
)
|
||||
if test "$x_debug_on" = "yes"; then
|
||||
AC_DEFINE(DEBUG, 1)
|
||||
AC_MSG_RESULT([enabling additional debug output])
|
||||
test "$GCC" = "yes" && CFLAGS="-pedantic $CFLAGS"
|
||||
fi
|
||||
|
||||
# -- Variablen II --
|
||||
x_strict_rfc_on=no
|
||||
AC_ARG_ENABLE(strict-rfc,
|
||||
[ --enable-strict-rfc strict RFC conformance -- may break clients!],
|
||||
if test "$enableval" = "yes"; then
|
||||
AC_DEFINE(STRICT_RFC, 1)
|
||||
x_strict_rfc_on=yes
|
||||
fi
|
||||
)
|
||||
|
||||
if test "$GCC" = "yes"; then
|
||||
CFLAGS="-Wall $CFLAGS"
|
||||
fi
|
||||
# -- Definitions --
|
||||
|
||||
# -- Ausgabe --
|
||||
AC_DEFINE_UNQUOTED(TARGET_CPU, "$target_cpu" )
|
||||
AC_DEFINE_UNQUOTED(TARGET_VENDOR, "$target_vendor" )
|
||||
AC_DEFINE_UNQUOTED(TARGET_OS, "$target_os" )
|
||||
|
||||
# Add additional CFLAGS, eventually specified on the command line, but after
|
||||
# running this configure script. Useful for "-Werror" for example.
|
||||
test -n "$CFLAGS_END" && CFLAGS="$CFLAGS $CFLAGS_END"
|
||||
|
||||
# -- Generate files --
|
||||
|
||||
AC_OUTPUT([ \
|
||||
Makefile \
|
||||
doc/Makefile \
|
||||
MacOSX/Makefile \
|
||||
MacOSX/ngircd.pbproj/Makefile \
|
||||
src/Makefile \
|
||||
src/portab/Makefile \
|
||||
src/tool/Makefile \
|
||||
src/ngircd/Makefile \
|
||||
src/testsuite/Makefile \
|
||||
man/Makefile \
|
||||
contrib/Makefile \
|
||||
contrib/Debian/Makefile \
|
||||
contrib/MacOSX/Makefile \
|
||||
])
|
||||
|
||||
type dpkg >/dev/null 2>&1
|
||||
if test $? -eq 0; then
|
||||
# Generate debian/ link if the dpkg command exists
|
||||
# (read: if we are running on a debian compatible system)
|
||||
echo "creating Debian-specific links ..."
|
||||
test -f debian/rules || ln -s contrib/Debian debian
|
||||
fi
|
||||
|
||||
# -- Result --
|
||||
|
||||
echo
|
||||
echo "ngIRCd $PACKAGE_VERSION has been configured with the following options:"
|
||||
echo
|
||||
|
||||
# Someone please show me a better way :) [borrowed by OpenSSH]
|
||||
B=`eval echo ${bindir}` ; B=`eval echo ${B}`
|
||||
S=`eval echo ${sbindir}` ; S=`eval echo ${S}`
|
||||
C=`eval echo ${sysconfdir}` ; C=`eval echo ${C}`
|
||||
M=`eval echo ${mandir}` ; M=`eval echo ${M}`
|
||||
D=`eval echo ${datadir}/doc/${PACKAGE}` ; D=`eval echo ${D}`
|
||||
|
||||
echo " Target: ${target}"
|
||||
test "$target" != "$host" && echo " Host: ${host}"
|
||||
echo " Compiler: ${CC}"
|
||||
test -n "$CFLAGS" && echo " Compiler flags: ${CFLAGS}"
|
||||
test -n "$CPPFLAGS" && echo " Preprocessor flags: ${CPPFLAGS}"
|
||||
test -n "$LDFLAGS" && echo " Linker flags: ${LDFLAGS}"
|
||||
test -n "$LIBS" && echo " Libraries: ${LIBS}"
|
||||
echo
|
||||
echo " 'ngircd' binary: $S"
|
||||
echo " Configuration file: $C"
|
||||
echo " Manual pages: $M"
|
||||
echo " Documentation: $D"
|
||||
echo
|
||||
|
||||
echo $ECHO_N " Syslog support: $ECHO_C"
|
||||
test "$x_syslog_on" = "yes" \
|
||||
&& echo $ECHO_N "yes $ECHO_C" \
|
||||
|| echo $ECHO_N "no $ECHO_C"
|
||||
echo $ECHO_N " Enable debug code: $ECHO_C"
|
||||
test "$x_debug_on" = "yes" \
|
||||
&& echo "yes" \
|
||||
|| echo "no"
|
||||
|
||||
echo $ECHO_N " zlib compression: $ECHO_C"
|
||||
test "$x_zlib_on" = "yes" \
|
||||
&& echo $ECHO_N "yes $ECHO_C" \
|
||||
|| echo $ECHO_N "no $ECHO_C"
|
||||
echo $ECHO_N " IRC sniffer: $ECHO_C"
|
||||
test "$x_sniffer_on" = "yes" \
|
||||
&& echo "yes" \
|
||||
|| echo "no"
|
||||
|
||||
echo $ECHO_N " Use TCP Wrappers: $ECHO_C"
|
||||
test "$x_tcpwrap_on" = "yes" \
|
||||
&& echo $ECHO_N "yes $ECHO_C" \
|
||||
|| echo $ECHO_N "no $ECHO_C"
|
||||
echo $ECHO_N " Strict RFC mode: $ECHO_C"
|
||||
test "$x_strict_rfc_on" = "yes" \
|
||||
&& echo "yes" \
|
||||
|| echo "no"
|
||||
|
||||
echo $ECHO_N " Rendezvous support: $ECHO_C"
|
||||
test "$x_rendezvous_on" = "osx" -o "$x_rendezvous_on" = "howl" \
|
||||
&& echo $ECHO_N "yes $ECHO_C" \
|
||||
|| echo $ECHO_N "no $ECHO_C"
|
||||
echo $ECHO_N " IRC+ protocol: $ECHO_C"
|
||||
test "$x_ircplus_on" = "yes" \
|
||||
&& echo "yes" \
|
||||
|| echo "no"
|
||||
|
||||
echo $ECHO_N " IDENT support: $ECHO_C"
|
||||
test "$x_identauth_on" = "yes" \
|
||||
&& echo $ECHO_N "yes $ECHO_C" \
|
||||
|| echo $ECHO_N "no $ECHO_C"
|
||||
|
||||
echo; echo
|
||||
|
||||
# -eof-
|
||||
|
||||
28
contrib/Debian/Makefile.am
Normal file
28
contrib/Debian/Makefile.am
Normal file
@@ -0,0 +1,28 @@
|
||||
#
|
||||
# ngIRCd -- The Next Generation IRC Daemon
|
||||
# Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
# Please read the file COPYING, README and AUTHORS for more information.
|
||||
#
|
||||
# $Id: Makefile.am,v 1.4 2004/05/11 00:32:31 alex Exp $
|
||||
#
|
||||
|
||||
EXTRA_DIST = rules changelog compat control copyright \
|
||||
ngircd.init ngircd.postinst
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -f Makefile Makefile.in
|
||||
|
||||
clean-local:
|
||||
rm -f ngircd.postinst.debhelper ngircd.postrm.debhelper \
|
||||
ngircd.prerm.debhelper ngircd.substvars
|
||||
rm -f ngircd-full.postinst.debhelper ngircd-full.postrm.debhelper \
|
||||
ngircd-full.prerm.debhelper ngircd-full.substvars
|
||||
rm -rf ngircd ngircd-full
|
||||
rm -f files
|
||||
|
||||
# -eof-
|
||||
187
contrib/Debian/changelog
Normal file
187
contrib/Debian/changelog
Normal file
@@ -0,0 +1,187 @@
|
||||
ngircd (0.9.2-0ab1) stable; urgency=low
|
||||
|
||||
* New "upstream release" fixing a few bugs in 0.9.1.
|
||||
|
||||
-- Alexander Barton <alex@barton.de> Sat, 15 Oct 2005 14:10:34 +0200
|
||||
|
||||
ngircd (0.9.1-0ab1) unstable; urgency=medium
|
||||
|
||||
* New "upstream release" addressing two problems in ngIRCd 0.9.0.
|
||||
|
||||
-- Alexander Barton <alex@barton.de> Wed, 3 Aug 2005 15:10:41 +0200
|
||||
|
||||
ngircd (0.9.0-0ab2) unstable; urgency=medium
|
||||
|
||||
* Init script: fixed a problem with symbolic links in runlevel directories
|
||||
that could prevent the init script from working correctly.
|
||||
|
||||
-- Alexander Barton <alex@barton.de> Tue, 26 Jul 2005 21:31:18 +0200
|
||||
|
||||
ngircd (0.9.0-0ab1) unstable; urgency=low
|
||||
|
||||
* New "upstream release".
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Sat, 24 Jul 2005 23:30:00 +0200
|
||||
|
||||
ngircd (0.8.3-0ab1) unstable; urgency=high
|
||||
|
||||
* New "upstream release", including security fixes.
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Thu, 3 Feb 2005 10:41:55 +0100
|
||||
|
||||
ngircd (0.8.2-0ab1) unstable; urgency=high
|
||||
|
||||
* New "upstream release", including security fixes.
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Wed, 26 Jan 2005 23:14:12 +0100
|
||||
|
||||
ngircd (0.8.1-0ab1) unstable; urgency=low
|
||||
|
||||
* New "upstream release".
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Sat, 25 Dec 2004 01:18:32 +0100
|
||||
|
||||
ngircd (0.8.0-0ab2) unstable; urgency=low
|
||||
|
||||
* Added missing commas to debian control file, fixes bug #56.
|
||||
Thanks to Kevin Otte.
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Thu, 15 Jul 2004 10:53:39 +0200
|
||||
|
||||
ngircd (0.8.0-0ab1) unstable; urgency=low
|
||||
|
||||
* New upstream version.
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Sat, 26 Jun 2004 11:25:59 +0200
|
||||
|
||||
ngircd (0.7.7+HEAD-0ab6) unstable; urgency=low
|
||||
|
||||
* Incorporated actual CVS HEAD version which includes all features of
|
||||
version 0.8.0-pre1 and patches for the resolver and logger.
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Tue, 11 May 2004 02:18:50 +0200
|
||||
|
||||
ngircd (0.7.7+HEAD-0ab5) unstable; urgency=low
|
||||
|
||||
* Updates from CVS HEAD branch, most notably: "INVITE- and BAN-lists
|
||||
become synchronized between IRC+ servers when establishing new
|
||||
connections, if the peer supports this as well."
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Mon, 26 Apr 2004 01:53:15 +0200
|
||||
|
||||
ngircd (0.7.7+HEAD-0ab4) unstable; urgency=low
|
||||
|
||||
* This version includes fixes for INVITE command and the handling of the
|
||||
invite and ban lists from CVS-HEAD.
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Fri, 9 Apr 2004 23:55:13 +0200
|
||||
|
||||
ngircd (0.7.7+HEAD-0ab3) unstable; urgency=low
|
||||
|
||||
* Included MODE fix from CVS-HEAD branch.
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Mon, 5 Apr 2004 13:09:24 +0200
|
||||
|
||||
ngircd (0.7.7+HEAD-0ab2) unstable; urgency=low
|
||||
|
||||
* Incorporated more fixes and enhancements of CVS-HEAD version,
|
||||
e. g. better connection logging and fixed TRACE command.
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Sat, 28 Feb 2004 03:20:32 +0100
|
||||
|
||||
ngircd (0.7.7+HEAD-0ab1) unstable; urgency=low
|
||||
|
||||
* New upstream version. This debian package includes all features of
|
||||
ngIRCd 0.7.7 and changes of the CVS-HEAD development tree.
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Thu, 5 Feb 2004 15:23:22 +0100
|
||||
|
||||
ngircd (0.7.6+HEAD-0ab2) unstable; urgency=low
|
||||
|
||||
* Included new fixes and additions from the CVS-HEAD upstream branch,
|
||||
e. g. the setting of type of service (TOS) on sockets.
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Mon, 26 Jan 2004 04:05:41 +0100
|
||||
|
||||
ngircd (0.7.6+HEAD-0ab1) unstable; urgency=low
|
||||
|
||||
* Included all changes from the CVS-HEAD upstream version.
|
||||
* Restructured debian packaging system: now there are two packages, a
|
||||
"standard" version that includes all the default options and a "full"
|
||||
version that additionally includes support for TCP wrappers and IDENT
|
||||
lookups.
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Thu, 1 Jan 2004 23:12:11 +0100
|
||||
|
||||
ngircd (0.7.6-0ab1) unstable; urgency=medium
|
||||
|
||||
* New upstream version.
|
||||
* Changed version numvering scheme of debian package.
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Fri, 5 Dec 2003 14:26:41 +0100
|
||||
|
||||
ngircd (0.7.5-0.2ab) unstable; urgency=low
|
||||
|
||||
* Updated RPM and Debian package description and configuration.
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Sat, 29 Nov 2003 21:24:32 +0100
|
||||
|
||||
ngircd (0.7.5-0.1ab) unstable; urgency=low
|
||||
|
||||
* New upstream version.
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Fri, 7 Nov 2003 21:59:58 +0100
|
||||
|
||||
ngircd (0.7.1-0.1ab) unstable; urgency=low
|
||||
|
||||
* New upstream version :-)
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Fri, 18 Jul 2003 22:53:02 +0200
|
||||
|
||||
ngircd (0.7.0-0.7ab) unstable; urgency=low
|
||||
|
||||
* Fixed up post installation script (added interpreter, fixed chmod call).
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Sun, 13 Jul 2003 00:52:38 +0200
|
||||
|
||||
ngircd (0.7.0-0.6ab) unstable; urgency=low
|
||||
|
||||
* Added /etc/default/ngircd.
|
||||
* Included own post installation script.
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Sat, 12 Jul 2003 20:31:09 +0200
|
||||
|
||||
ngircd (0.7.0-0.5ab) unstable; urgency=low
|
||||
|
||||
* Enhanced init script.
|
||||
* Included NJOIN fix from actual CVS "HEAD" branch.
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Wed, 9 Jul 2003 22:40:49 +0200
|
||||
|
||||
ngircd (0.7.0-0.4ab) unstable; urgency=low
|
||||
|
||||
* Reverted use of dh_installexamples.
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Thu, 22 May 2003 00:15:03 +0200
|
||||
|
||||
ngircd (0.7.0-0.3ab) unstable; urgency=low
|
||||
|
||||
* Removed "debian/docs" and "debian/conffiles"; debhelper takes care of
|
||||
this for us automagically.
|
||||
* Excluded "etc/ngircd.conf" from dh_fixperms.
|
||||
|
||||
-- Alexander Barton <alex@Arthur.Ath.CX> Wed, 21 May 2003 23:25:05 +0200
|
||||
|
||||
ngircd (0.7.0-0.2ab) unstable; urgency=low
|
||||
|
||||
* Fixed wrong variable substitution in init script.
|
||||
* Added some CVS "Id-Tags" (but not checked in, yet).
|
||||
* Removed own "Provides:" from control file.
|
||||
|
||||
-- Alexander Barton <alex@barton.de> Wed, 21 May 2003 12:32:34 +0200
|
||||
|
||||
ngircd (0.7.0-0.1ab) unstable; urgency=low
|
||||
|
||||
* Initial Release.
|
||||
|
||||
-- Alexander Barton <alex@barton.de> Wed, 21 May 2003 02:36:52 +0200
|
||||
1
contrib/Debian/compat
Normal file
1
contrib/Debian/compat
Normal file
@@ -0,0 +1 @@
|
||||
4
|
||||
47
contrib/Debian/control
Normal file
47
contrib/Debian/control
Normal file
@@ -0,0 +1,47 @@
|
||||
Source: ngircd
|
||||
Section: net
|
||||
Priority: optional
|
||||
Maintainer: Alexander Barton <alex@barton.de>
|
||||
Build-Depends: debhelper (>> 4.0.0), libz-dev, libwrap-dev, libident-dev
|
||||
Standards-Version: 3.5.8
|
||||
|
||||
Package: ngircd
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}
|
||||
Description: A lightweight daemon for the Internet Relay Chat (IRC)
|
||||
ngIRCd is a free open source daemon for the Internet Relay Chat (IRC)
|
||||
network. It is written from scratch and is not based upon the original
|
||||
IRCd like many others.
|
||||
.
|
||||
This package contains the "standard distribution", including support for
|
||||
syslog logging and compressed server-links using zlib.
|
||||
.
|
||||
Advantages of ngIRCd:
|
||||
- no problems with servers using changing/non-static IP addresses.
|
||||
- small and lean configuration file.
|
||||
- free, modern and open source C code.
|
||||
- still under active development.
|
||||
.
|
||||
ngIRCd is compatible to the "original" ircd 2.10.3p3, so you can run
|
||||
mixed networks.
|
||||
|
||||
Package: ngircd-full
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}
|
||||
Conflicts: ngircd
|
||||
Description: A lightweight daemon for the Internet Relay Chat (IRC)
|
||||
ngIRCd is a free open source daemon for the Internet Relay Chat (IRC)
|
||||
network. It is written from scratch and is not based upon the original
|
||||
IRCd like many others.
|
||||
.
|
||||
This package includes support for TCP wrappers and IDENT requests in
|
||||
addition to the features of the "standard package".
|
||||
.
|
||||
Advantages of ngIRCd:
|
||||
- no problems with servers using changing/non-static IP addresses.
|
||||
- small and lean configuration file.
|
||||
- free, modern and open source C code.
|
||||
- still under active development.
|
||||
.
|
||||
ngIRCd is compatible to the "original" ircd 2.10.3p3, so you can run
|
||||
mixed networks.
|
||||
13
contrib/Debian/copyright
Normal file
13
contrib/Debian/copyright
Normal file
@@ -0,0 +1,13 @@
|
||||
This package was debianized by Alexander Barton <alex@barton.de> on
|
||||
Tue, 20 May 2003 15:47:40 +0200.
|
||||
|
||||
It was downloaded from ftp://Arthur.Ath.CX/pub/Users/alex/ngircd/
|
||||
|
||||
Upstream Author: Alexander Barton <alex@barton.de>
|
||||
|
||||
This software is copyright (c) 1999-2003 by Alexander Barton.
|
||||
|
||||
You are free to distribute this software under the terms of the
|
||||
GNU General Public License.
|
||||
On Debian systems, the complete text of the GNU General Public
|
||||
License can be found in /usr/share/common-licenses/GPL file.
|
||||
12
contrib/Debian/ngircd.default
Normal file
12
contrib/Debian/ngircd.default
Normal file
@@ -0,0 +1,12 @@
|
||||
#
|
||||
# Defaults for ngIRCd start and stop script
|
||||
#
|
||||
# $Id: ngircd.default,v 1.1 2003/12/31 17:20:11 alex Exp $
|
||||
#
|
||||
|
||||
# Parameters to pass to the ngircd daemon on startup, see ngircd(8) for
|
||||
# possible options (default: empty).
|
||||
|
||||
PARAMS=""
|
||||
|
||||
# -eof-
|
||||
75
contrib/Debian/ngircd.init
Executable file
75
contrib/Debian/ngircd.init
Executable file
@@ -0,0 +1,75 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# ngIRCd start and stop script for Debian-based systems
|
||||
#
|
||||
# $Id: ngircd.init,v 1.5.2.1 2005/07/26 19:30:54 alex Exp $
|
||||
#
|
||||
|
||||
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
|
||||
DAEMON=/usr/sbin/ngircd
|
||||
NAME=ngIRCd
|
||||
DESC="IRC daemon"
|
||||
PARAMS=""
|
||||
|
||||
test -h "$0" && me=`readlink $0` || me="$0"
|
||||
BASENAME=`basename $me`
|
||||
|
||||
test -f /etc/default/$BASENAME && . /etc/default/$BASENAME
|
||||
|
||||
test -x $DAEMON || exit 0
|
||||
|
||||
Check_Config()
|
||||
{
|
||||
$DAEMON --configtest >/dev/null 2>&1
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Configuration of $NAME is not valide, won't (re)start!"
|
||||
echo "Please run \"$DAEMON --configtest\" manually and fix it up ..."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
Try_Start()
|
||||
{
|
||||
[ ! -d /var/run/ircd ] || chown irc:irc /var/run/ircd
|
||||
start-stop-daemon --start --quiet --exec $DAEMON -- $PARAMS
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "$NAME failed!"
|
||||
exit 1
|
||||
fi
|
||||
echo "$NAME."
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
start)
|
||||
Check_Config
|
||||
echo -n "Starting $DESC: "
|
||||
Try_Start
|
||||
;;
|
||||
stop)
|
||||
echo -n "Stopping $DESC: "
|
||||
start-stop-daemon --stop --quiet --pidfile /var/run/ircd/ngircd.pid --exec $DAEMON \
|
||||
&& echo "$NAME." \
|
||||
|| echo "(none running)"
|
||||
;;
|
||||
reload|force-reload)
|
||||
Check_Config
|
||||
echo "Reloading $DESC configuration files."
|
||||
start-stop-daemon --stop --signal 1 --quiet --exec $DAEMON
|
||||
;;
|
||||
restart)
|
||||
Check_Config
|
||||
echo -n "Restarting $DESC: "
|
||||
start-stop-daemon --stop --quiet --oknodo --exec $DAEMON
|
||||
sleep 1
|
||||
Try_Start
|
||||
;;
|
||||
*)
|
||||
N=/etc/init.d/$NAME
|
||||
echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
exit 0
|
||||
|
||||
# -eof-
|
||||
14
contrib/Debian/ngircd.postinst
Executable file
14
contrib/Debian/ngircd.postinst
Executable file
@@ -0,0 +1,14 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Debian post-installation script
|
||||
# $Id: ngircd.postinst,v 1.1 2003/12/31 17:20:11 alex Exp $
|
||||
#
|
||||
|
||||
if [ -f /etc/ngircd/ngircd.conf ]; then
|
||||
# make sure that configuration file is not world readable
|
||||
chmod o= /etc/ngircd/ngircd.conf
|
||||
fi
|
||||
|
||||
#DEBHELPER#
|
||||
|
||||
# -eof-
|
||||
172
contrib/Debian/rules
Executable file
172
contrib/Debian/rules
Executable file
@@ -0,0 +1,172 @@
|
||||
#!/usr/bin/make -f
|
||||
#
|
||||
# ngIRCd -- The Next Generation IRC Daemon
|
||||
# Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
# Please read the file COPYING, README and AUTHORS for more information.
|
||||
#
|
||||
# debian/rules for ngIRCd
|
||||
#
|
||||
# $Id: rules,v 1.3 2005/02/07 23:09:31 alex Exp $
|
||||
#
|
||||
# Based on the sample debian/rules that uses debhelper,
|
||||
# GNU copyright 1997 to 1999 by Joey Hess.
|
||||
#
|
||||
|
||||
# Uncomment this to turn on verbose mode.
|
||||
#export DH_VERBOSE=1
|
||||
|
||||
# These are used for cross-compiling and for saving the configure script
|
||||
# from having to guess our platform (since we know it already)
|
||||
DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
|
||||
DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
|
||||
|
||||
CFLAGS = -Wall -g
|
||||
|
||||
ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
|
||||
CFLAGS += -O0
|
||||
else
|
||||
CFLAGS += -O2
|
||||
endif
|
||||
ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
|
||||
INSTALL_PROGRAM += -s
|
||||
endif
|
||||
|
||||
configure-ngircd: configure
|
||||
dh_testdir
|
||||
|
||||
# configure "standard" variant:
|
||||
./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) \
|
||||
--prefix=/usr \
|
||||
--sysconfdir=/etc/ngircd \
|
||||
--mandir=\$${prefix}/share/man \
|
||||
--with-syslog --with-zlib
|
||||
|
||||
configure-ngircd-full: configure
|
||||
dh_testdir
|
||||
|
||||
# configure "full" variant:
|
||||
./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) \
|
||||
--prefix=/usr \
|
||||
--sysconfdir=/etc/ngircd \
|
||||
--mandir=\$${prefix}/share/man \
|
||||
--with-syslog --with-zlib --with-tcp-wrappers --with-ident
|
||||
|
||||
build:
|
||||
dh_clean -k
|
||||
|
||||
build-ngircd: build-stamp-ngircd
|
||||
build-stamp-ngircd: configure-ngircd
|
||||
dh_testdir
|
||||
rm -f build-stamp-*
|
||||
|
||||
# Add here commands to compile the "standard" package:
|
||||
$(MAKE)
|
||||
|
||||
touch build-stamp-ngircd
|
||||
|
||||
build-ngircd-full: build-stamp-ngircd-full
|
||||
build-stamp-ngircd-full: configure-ngircd-full
|
||||
dh_testdir
|
||||
rm -f build-stamp-*
|
||||
|
||||
# Add here commands to compile the "full" package:
|
||||
$(MAKE)
|
||||
|
||||
touch build-stamp-ngircd-full
|
||||
|
||||
clean:
|
||||
dh_testdir
|
||||
dh_testroot
|
||||
rm -f build-stamp*
|
||||
rm -f $(CURDIR)/debian/ngircd-full.default
|
||||
rm -f $(CURDIR)/debian/ngircd-full.init
|
||||
rm -f $(CURDIR)/debian/ngircd-full.postinst
|
||||
|
||||
# Add here commands to clean up after the build process:
|
||||
-$(MAKE) clean
|
||||
|
||||
ifneq "$(wildcard /usr/share/misc/config.sub)" ""
|
||||
cp -f /usr/share/misc/config.sub config.sub
|
||||
endif
|
||||
ifneq "$(wildcard /usr/share/misc/config.guess)" ""
|
||||
cp -f /usr/share/misc/config.guess config.guess
|
||||
endif
|
||||
dh_clean
|
||||
|
||||
install: install-ngircd install-ngircd-full
|
||||
|
||||
install-ngircd: build-ngircd
|
||||
dh_testdir
|
||||
dh_testroot
|
||||
dh_installdirs
|
||||
|
||||
# Add here commands to install the "standard" package into debian/ngircd:
|
||||
$(MAKE) install DESTDIR=$(CURDIR)/debian/ngircd
|
||||
rm $(CURDIR)/debian/ngircd/usr/share/doc/ngircd/INSTALL*
|
||||
rm $(CURDIR)/debian/ngircd/usr/share/doc/ngircd/COPYING*
|
||||
mkdir -p $(CURDIR)/debian/ngircd/var/run/ircd
|
||||
cat $(CURDIR)/debian/ngircd/usr/share/doc/ngircd/sample-ngircd.conf | \
|
||||
sed -e "s/;ServerUID = 65534/ServerUID = irc/g" | \
|
||||
sed -e "s/;ServerGID = 65534/ServerGID = irc/g" | \
|
||||
sed -e "s/;MotdFile = \/usr\/local\/etc\/ngircd.motd/MotdFile = \/etc\/ngircd\/ngircd.motd/g" | \
|
||||
sed -e "s/;PidFile = \/var\/run\/ngircd\/ngircd.pid/PidFile = \/var\/run\/ircd\/ngircd.pid/g" \
|
||||
>$(CURDIR)/debian/ngircd/etc/ngircd/ngircd.conf
|
||||
touch $(CURDIR)/debian/ngircd/etc/ngircd/ngircd.motd
|
||||
|
||||
install-ngircd-full: build-ngircd-full
|
||||
dh_testdir
|
||||
dh_testroot
|
||||
dh_installdirs
|
||||
|
||||
# Add here commands to install the "full" package into debian/ngircd-full:
|
||||
$(MAKE) install DESTDIR=$(CURDIR)/debian/ngircd-full
|
||||
rm $(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd/INSTALL*
|
||||
rm $(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd/COPYING*
|
||||
mv $(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd \
|
||||
$(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd-full
|
||||
mkdir -p $(CURDIR)/debian/ngircd-full/var/run/ircd
|
||||
cat $(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd-full/sample-ngircd.conf | \
|
||||
sed -e "s/;ServerUID = 65534/ServerUID = irc/g" | \
|
||||
sed -e "s/;ServerGID = 65534/ServerGID = irc/g" | \
|
||||
sed -e "s/;MotdFile = \/usr\/local\/etc\/ngircd.motd/MotdFile = \/etc\/ngircd\/ngircd.motd/g" | \
|
||||
sed -e "s/;PidFile = \/var\/run\/ngircd\/ngircd.pid/PidFile = \/var\/run\/ircd\/ngircd.pid/g" \
|
||||
>$(CURDIR)/debian/ngircd-full/etc/ngircd/ngircd.conf
|
||||
touch $(CURDIR)/debian/ngircd-full/etc/ngircd/ngircd.motd
|
||||
|
||||
# Build architecture-independent files here.
|
||||
binary-indep:
|
||||
# We have nothing to do by default.
|
||||
|
||||
# Build architecture-dependent files here.
|
||||
binary-arch: build install
|
||||
ln -s $(CURDIR)/debian/ngircd.default \
|
||||
$(CURDIR)/debian/ngircd-full.default
|
||||
ln -s $(CURDIR)/debian/ngircd.init \
|
||||
$(CURDIR)/debian/ngircd-full.init
|
||||
ln -s $(CURDIR)/debian/ngircd.postinst \
|
||||
$(CURDIR)/debian/ngircd-full.postinst
|
||||
|
||||
dh_testdir
|
||||
dh_testroot
|
||||
dh_installchangelogs -a -A ChangeLog
|
||||
dh_installdocs -a
|
||||
dh_installinit -a
|
||||
dh_strip -a
|
||||
dh_compress -a
|
||||
dh_fixperms -a
|
||||
dh_installdeb -a
|
||||
dh_shlibdeps -a
|
||||
dh_gencontrol -a
|
||||
dh_md5sums -a
|
||||
dh_builddeb -a
|
||||
|
||||
binary: binary-indep binary-arch
|
||||
|
||||
.PHONY: build clean binary-indep binary-arch binary install
|
||||
|
||||
# -eof-
|
||||
20
contrib/MacOSX/Makefile.am
Normal file
20
contrib/MacOSX/Makefile.am
Normal file
@@ -0,0 +1,20 @@
|
||||
#
|
||||
# ngIRCd -- The Next Generation IRC Daemon
|
||||
# Copyright (c)2001-2004 Alexander Barton <alex@barton.de>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
# Please read the file COPYING, README and AUTHORS for more information.
|
||||
#
|
||||
# $Id: Makefile.am,v 1.2 2004/05/11 00:34:26 alex Exp $
|
||||
#
|
||||
|
||||
clean-local:
|
||||
rm -rf build
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -f Makefile Makefile.in
|
||||
|
||||
# -eof-
|
||||
1883
contrib/MacOSX/ngIRCd.xcode/project.pbxproj
Normal file
1883
contrib/MacOSX/ngIRCd.xcode/project.pbxproj
Normal file
File diff suppressed because it is too large
Load Diff
22
contrib/Makefile.am
Normal file
22
contrib/Makefile.am
Normal file
@@ -0,0 +1,22 @@
|
||||
#
|
||||
# ngIRCd -- The Next Generation IRC Daemon
|
||||
# Copyright (c)2001-2004 Alexander Barton <alex@barton.de>
|
||||
#
|
||||
# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
# der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
# herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
# der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
#
|
||||
# $Id: Makefile.am,v 1.4 2004/04/28 12:18:02 alex Exp $
|
||||
#
|
||||
|
||||
SUBDIRS = Debian MacOSX
|
||||
|
||||
EXTRA_DIST = README ngircd.spec systrace.policy
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -f Makefile Makefile.in
|
||||
|
||||
# -eof-
|
||||
27
contrib/README
Normal file
27
contrib/README
Normal file
@@ -0,0 +1,27 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001-2004 by Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd is free software and published under the
|
||||
terms of the GNU General Public License.
|
||||
|
||||
-- Contributions --
|
||||
|
||||
|
||||
MacOSX/
|
||||
- Project file for XCode "project builder" of Mac OS X.
|
||||
|
||||
Debian/
|
||||
- Various files for building Debian packages.
|
||||
|
||||
ngircd.spec
|
||||
- RPM "spec" file.
|
||||
|
||||
systrace.policy
|
||||
- Systrace policy file for OpenBSD (and probably NetBSD).
|
||||
|
||||
|
||||
--
|
||||
$Id: README,v 1.1 2004/04/28 12:18:50 alex Exp $
|
||||
55
contrib/ngircd.spec
Normal file
55
contrib/ngircd.spec
Normal file
@@ -0,0 +1,55 @@
|
||||
%define name ngircd
|
||||
%define version 0.9.2
|
||||
%define release 1
|
||||
%define prefix %{_prefix}
|
||||
|
||||
Summary: A lightweight daemon for the Internet Relay Chat (IRC)
|
||||
Name: %{name}
|
||||
Version: %{version}
|
||||
Release: %{release}
|
||||
Copyright: GPL
|
||||
Group: Networking/Daemons
|
||||
URL: http://arthur.ath.cx/~alex/ngircd/
|
||||
Source: %{name}-%{version}.tar.gz
|
||||
Packager: Sean Reifschneider <jafo-rpms@tummy.com>
|
||||
BuildRoot: /var/tmp/%{name}-root
|
||||
|
||||
%description
|
||||
ngIRCd is a free open source daemon for the Internet Relay Chat (IRC),
|
||||
developed under the GNU General Public License (GPL). It's written from
|
||||
scratch and is not based upon the original IRCd like many others.
|
||||
|
||||
Advantages:
|
||||
- no problems with servers using changing/non-static IP addresses.
|
||||
- small and lean configuration file.
|
||||
- free, modern and open source C code.
|
||||
- still under active development.
|
||||
|
||||
ngIRCd is compatible to the "original" ircd 2.10.3p3, so you can run
|
||||
mixed networks.
|
||||
|
||||
%prep
|
||||
%setup
|
||||
%build
|
||||
%configure
|
||||
make
|
||||
|
||||
%install
|
||||
[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf "$RPM_BUILD_ROOT"
|
||||
%makeinstall
|
||||
(
|
||||
cd "$RPM_BUILD_ROOT"
|
||||
( cd usr/sbin; mv *-ngircd ngircd )
|
||||
( cd usr/share/man/man5; mv *-ngircd.conf.5 ngircd.conf.5 )
|
||||
( cd usr/share/man/man8; mv *-ngircd.8 ngircd.8 )
|
||||
)
|
||||
|
||||
%clean
|
||||
[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf "$RPM_BUILD_ROOT"
|
||||
|
||||
%files
|
||||
%defattr(755,root,root)
|
||||
%doc AUTHORS COPYING ChangeLog INSTALL NEWS README
|
||||
%config(noreplace) /etc
|
||||
%{_prefix}/sbin
|
||||
%{_prefix}/share/man/
|
||||
77
contrib/systrace.policy
Normal file
77
contrib/systrace.policy
Normal file
@@ -0,0 +1,77 @@
|
||||
#
|
||||
# Sample systrace policy for ngIRCd on OpenBSD
|
||||
# Author: Benjamin Pineau <ben@zouh.org>
|
||||
#
|
||||
# $Id: systrace.policy,v 1.1 2004/04/28 12:16:59 alex Exp $
|
||||
#
|
||||
# Tune me, put me in /etc/systrace/usr_local_bin_ngircd and start ngIRCd
|
||||
# (with root privileges) as:
|
||||
#
|
||||
# systrace -a /usr/local/bin/ngircd
|
||||
#
|
||||
# I didn't tried this on NetBSD, but it should work as is.
|
||||
#
|
||||
# On systems with pf, it can be supplemented by strict firewall rules:
|
||||
# for a ngircd running as '$ircuser', binding on '$ircport' and accepting
|
||||
# 30 connections:
|
||||
#
|
||||
# block out log quick proto tcp from any port $ircport to any \
|
||||
# user != $ircuser
|
||||
# pass in inet proto tcp from any to any port $ircport user $ircuser \
|
||||
# keep state (max 30) flags S/SA
|
||||
#
|
||||
|
||||
Policy: /usr/local/bin/ngircd, Emulation: native
|
||||
native-__sysctl: permit
|
||||
native-fsread: filename eq "/etc/malloc.conf" then permit
|
||||
native-fsread: filename sub "/usr/share/zoneinfo/" then permit
|
||||
native-fsread: filename eq "/usr/local/etc/ngircd.conf" then permit
|
||||
native-fsread: filename eq "/usr/local/etc/ngircd.motd" then permit
|
||||
native-fsread: filename eq "/etc/ngircd.conf" then permit
|
||||
native-fsread: filename eq "/etc/ngircd.motd" then permit
|
||||
native-fsread: filename eq "/etc/spwd.db" then deny[eperm]
|
||||
native-fsread: filename eq "/etc/group" then permit
|
||||
native-fsread: filename eq "/etc/resolv.conf" then permit
|
||||
native-fsread: filename eq "/etc/localtime" then permit
|
||||
native-fsread: filename eq "/etc/hosts" then permit
|
||||
native-fsread: filename sub "<non-existent filename>" then deny[enoent]
|
||||
native-socket: sockdom eq "AF_UNIX" and socktype eq "SOCK_DGRAM" then permit
|
||||
native-socket: sockdom eq "AF_INET" and socktype eq "SOCK_STREAM" then permit
|
||||
native-bind: sockaddr match "inet-*:6667" then permit, if user != root
|
||||
native-connect: sockaddr eq "/dev/log" then permit, if user != root
|
||||
native-connect: sockaddr match "inet-*:53" then permit, if user != root
|
||||
native-setsockopt: permit, if user != root
|
||||
native-listen: permit, if user != root
|
||||
native-accept: permit, if user != root
|
||||
native-sendto: true then permit, if user != root
|
||||
native-recvfrom: permit, if user != root
|
||||
native-read: permit
|
||||
native-pread: permit
|
||||
native-write: permit, if user != root
|
||||
native-mmap: permit
|
||||
native-munmap: permit
|
||||
native-mprotect: permit
|
||||
native-break: permit
|
||||
native-umask: permit
|
||||
native-fork: permit
|
||||
native-setsid: permit
|
||||
native-chdir: permit
|
||||
native-chroot: permit
|
||||
native-setgid: gid neq "0" then permit
|
||||
native-setuid: uid neq "0" and uname neq "root" then permit
|
||||
native-getuid: permit
|
||||
native-getgid: permit
|
||||
native-gettimeofday: permit
|
||||
native-getpid: permit
|
||||
native-select: permit
|
||||
native-fcntl: permit
|
||||
native-fstat: permit
|
||||
native-issetugid: permit
|
||||
native-sigaction: permit
|
||||
native-pipe: permit
|
||||
native-sigreturn: permit
|
||||
native-close: permit
|
||||
native-exit: permit
|
||||
native-fswrite: deny[eperm]
|
||||
|
||||
# -eof-
|
||||
@@ -1,27 +0,0 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001,2002 by Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd ist freie Software und steht unter
|
||||
der GNU General Public License.
|
||||
|
||||
-- CC-Speed.txt --
|
||||
|
||||
|
||||
ngIRCd-0.2.1-pre (2002-02-25):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
[nach make-Zeiten sortiert]
|
||||
|
||||
Intel PIII, 1 GHz, 256 MB Ram, FreeBSD 4.4: configure: 00:10, make: 00:05
|
||||
Intel PIII, 1 GHz, 256 MB Ram, Linux 2.4.10: configure: 00:06, make: 00:06
|
||||
Intel PIII, 1 GHz, 256 MB Ram, BeOS R5: configure: 00:19, make: 00:07
|
||||
Intel PIII, 1 GHz, 256 MB Ram, Win2k+CygWin: configure: 00:27, make: 00:08
|
||||
AMD K6/2, 400 Mhz, 256 MB Ram, Linux 2.4.12: configure: 00:14, make: 00:12
|
||||
PowerMac G4, 400 Mhz, 768 MB Ram, Mac OS X 10.1.2: configure: 00:32, make: 00:19
|
||||
Macintosh SE/30, 68030 16 MHz, 32 MB, A/UX 3.0.1: configure: 07:33, make: 12:02
|
||||
|
||||
|
||||
--
|
||||
$Id: CC-Speed.txt,v 1.1 2002/02/25 14:02:32 alex Exp $
|
||||
64
doc/CVS.txt
64
doc/CVS.txt
@@ -1,64 +1,56 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001,2002 by Alexander Barton,
|
||||
(c)2001-2003 by Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd ist freie Software und steht unter
|
||||
der GNU General Public License.
|
||||
ngIRCd is free software and published under the
|
||||
terms of the GNU General Public License.
|
||||
|
||||
-- CVS.txt --
|
||||
|
||||
|
||||
Die Sourcen des ngIRCd werden mit dem "Concurrent Versions System" (CVS)
|
||||
verwaltet. Somit koennen ohne Probleme mehrere Leute gleichzeitig die Sourcen
|
||||
bearbeitet.
|
||||
The source code of ngIRCd is maintained using the "Concurrent Versions
|
||||
System" (CVS). Thereby several developers can work with the source tree at
|
||||
the same time.
|
||||
|
||||
|
||||
I. Anonymer "Nur-Lesen"-Zugang
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Anonymer Zugriff auf die CVS-Repository von ngIRCd ist im "nur-lesen"-Modus
|
||||
moeglich. Dazu sind folgende Schritte noetig:
|
||||
I. Anonymous read-only Access
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
To access the source tree anonymously in read-only mode, follow these steps:
|
||||
|
||||
Beim CVS-Server anmelden
|
||||
Login to the CVS server:
|
||||
|
||||
$ cvs -d:pserver:anonymous@arthur.ath.cx:/usr/local/CVS/ngircd login
|
||||
|
||||
Als Benutzername wird "anonymous" mit einem leeren Passwort verwendet.
|
||||
Nun ein "Check-Out" der Quellcodes durchfuehren:
|
||||
Use "anonymous" as user name and no password (just hit Return). Now you can
|
||||
check out the sources:
|
||||
|
||||
$ cvs -d:pserver:anonymous@arthur.ath.cx:/usr/local/CVS/ngircd checkout ngircd
|
||||
|
||||
Dadurch wird im aktuellen Verzeichnis der neue Ordner "ngircd" mit allen
|
||||
Quell-Dateien des ngIRCd erzeugt.
|
||||
Thereby a new folder "ngircd" will be created containing all the individual
|
||||
source files.
|
||||
|
||||
Dieses ist der "Arbeitsordner", alle CVS-Befehle werden in Zukunft aus
|
||||
diesem Ordner bzw. einem Unterordner davon ausgefuehrt.
|
||||
This is the "working folder", all CVS commands will be executed from within
|
||||
this folder in the future.
|
||||
|
||||
Wichtig: wenn ngIRCd "frisch" aus dem CVS compiliert werden soll, so
|
||||
existiert das configure-Script noch nicht. Dieses muss zunaechst mit dem
|
||||
Script "autogen.sh" erzeugt werden. Letzteres setzt ein installiertes GNU
|
||||
automake und GNU autoconf voraus!
|
||||
Please note: When checking out a fresh copy of ngIRCd from CVS, the
|
||||
configure script doesn't exist; you have to run the autogen.sh shell script
|
||||
(which is included in the source tree) to generate it. This requires you to
|
||||
have GNU automake and GNU autoconf installed on your system.
|
||||
|
||||
CVS-Tree aktualisieren:
|
||||
Updating the CVS tree:
|
||||
|
||||
$ cvs update
|
||||
$ cvs update -d -P [<filename>]
|
||||
|
||||
Dieser Befehl aktualisiert alle Dateien im aktuellen Verzeichnis sowie allen
|
||||
Unterverzeichnissen.
|
||||
|
||||
$ cvs update <filename>
|
||||
|
||||
So kann eine einzelne Datei aktualisiert werden (auch dann, wenn sie lokal
|
||||
z.B. geloescht wurde -- praktisch, um eigene "Experimente" rueckgaengig zu
|
||||
machen ;-))
|
||||
You can update a single file or the complete source tree.
|
||||
|
||||
|
||||
III. Schreibzugriff
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
Wer Schreibzugriff auf die CVS-Repository wuenscht, der moege sich bitte
|
||||
mit Alex Barton, <alex@barton.de> in Verbindung setzen.
|
||||
III. Write Access
|
||||
~~~~~~~~~~~~~~~~~
|
||||
If you want to contribute a couple of patches and write access to the CVS
|
||||
repository would be handy, please contact Alex Barton, <alex@barton.de>.
|
||||
|
||||
|
||||
--
|
||||
$Id: CVS.txt,v 1.5 2002/02/15 15:15:22 alex Exp $
|
||||
$Id: CVS.txt,v 1.7 2003/03/26 22:34:33 alex Exp $
|
||||
|
||||
98
doc/FAQ.txt
98
doc/FAQ.txt
@@ -1,61 +1,79 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001,2002 by Alexander Barton,
|
||||
(c)2001-2003 by Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd ist freie Software und steht unter
|
||||
der GNU General Public License.
|
||||
ngIRCd is free software and published under the
|
||||
terms of the GNU General Public License.
|
||||
|
||||
-- FAQ: Frequently Asked Questions --
|
||||
|
||||
|
||||
I. Allgemein
|
||||
~~~~~~~~~~~~
|
||||
Q: Kann der ngIRCd im Netz zusammen mit "normalen" Servern betrieben werden?
|
||||
A: Ja. ngIRCd ist zum Original kompatibel, getestet wird dies zur Zeit mit
|
||||
der Version 2.10.3p3 des ircd.
|
||||
I. General
|
||||
~~~~~~~~~~
|
||||
Q: Is it possible to link the ngIRCd with non-ngIRCd servers?
|
||||
A: Yes. ngIRCd is compatible to the original ircd used by IRCNet. Actually
|
||||
this is being tested with version 2.10.3p3.
|
||||
|
||||
Q: Gibt es eine Homepage mit Informationen und Downloads?
|
||||
A: Ja. Die URL ist <http://arthur.ath.cx/~alex/ngircd/>.
|
||||
Q: Is there a homepage with further information and downloads?
|
||||
A: Yes. Please visit <http://ngircd.barton.de/>.
|
||||
|
||||
Q: Why should I use ngIRCd instead of the original one?
|
||||
A: ngIRCd offers several benefits: no problems with dynamic IPs, easy to
|
||||
configure, open source (GPL), under active development.
|
||||
|
||||
|
||||
II. Compilieren
|
||||
II. Compilation
|
||||
~~~~~~~~~~~~~~~
|
||||
Q: Ich habe die Sourcen von ngIRCd ueber CVS installiert. Nun kann ich
|
||||
./configure nicht ausfuehren, da es nicht existiert!?
|
||||
A: Bei Builds direkt aus dem CVS-Tree muss das configure-Script zunaechst
|
||||
durch GNU autoconf sowie die Makefile.in's durch GNU automake generiert
|
||||
werden. Um dies zu vereinfachen existiert das Script "./autogen.sh".
|
||||
GNU automake und GNU autoconf werden -- im Gegensatz zu Builds aus den
|
||||
Sourcen eines .tar.gz-Archivs -- hierbei benoetigt!
|
||||
Q: I did a "CVS checkout" but can't execute ./configure because the script
|
||||
is missing in the generated directory!?
|
||||
A: When using development versions via CVS, the configure script as well as
|
||||
the Makefile.in templates must be generated using GNU automake and GNU
|
||||
autoconf. To simplify this task run the ./autogen.sh script which will
|
||||
execute the required tools for you; then continue with executing the
|
||||
./configure script as usual.
|
||||
|
||||
Q: ./autogen.sh bricht mit der Meldung "autoheader: command not found" ab.
|
||||
A: GNU autoconf ist nicht installiert, wird jedoch bei Builds direkt aus
|
||||
dem CVS-Tree benoetigt.
|
||||
Q: The ./autogen.sh script complains "aclocal: command not found".
|
||||
A: GNU automake is missing on your system but required for building CVS
|
||||
versions of ngIRCd. Install GNU automake 1.6 or later and try again.
|
||||
|
||||
Q: ./autogen.sh bricht mit der Meldung "autoconf: Undefined macros:
|
||||
AC_FUNC_MALLOC" bzw. "AC_CONFIG_SRCDIR" ab.
|
||||
A: Auf dem System ist eine zu alte Version von GNU autoconf installiert.
|
||||
Ein Update auf z.B. Version 2.52 loest dieses Problem (eine installiete
|
||||
alte Version sollte ggf. zunaechst entfernt werden, bei RPM-Paketen z.B.
|
||||
mit dem Befehl "rpm -e autoconf").
|
||||
Q: The ./autogen.sh script stops with "autoheader: command not found".
|
||||
A: GNU autoconf is missing on your system but required for building CVS
|
||||
versions of ngIRCd. Install GNU autoconf 2.52 or later and try again.
|
||||
|
||||
Q: The ./autogen.sh script fails and the message "automake: configure.in:
|
||||
AM_INIT_AUTOMAKE must be used" is displayed.
|
||||
A: Most probably you are using version 1.5 of GNU automake which seems to be
|
||||
incompatible to the build system of ngIRCd. Solution: upgrade to at least
|
||||
version 1.6 of GNU automake.
|
||||
(If you are using Debian 3.0 "Woody" you can try to downgrade to version
|
||||
1.4 of GNU automake shipped with this distribution; it should work, too.)
|
||||
|
||||
|
||||
III. Bugs!?
|
||||
~~~~~~~~~~~
|
||||
Q: Gibt es eine Liste der bekannten Bugs bzw. Feature-Wuensche?
|
||||
A: Ja. Es existiert ein Bug-Tracking-System fuer den ngIRCd (Bugzilla):
|
||||
URL: <http://arthur.ath.cx/bugzilla/ngircd/>. Dort koennen Bugs ge-
|
||||
meldet und Feature-Wunsche kundgetan werden. Bekannte Bugs koennen in
|
||||
der Datenbank gesucht und aufgelistet werden.
|
||||
Einen Account zum Suchen und Melden von Bugs bzw. Feature-Wuenschen
|
||||
kannst du dir dort selber anlegen.
|
||||
III. Runtime
|
||||
~~~~~~~~~~~~
|
||||
|
||||
Q: Was mache ich, wenn ich einen Bug gefunden habe?
|
||||
A: Am besten traegst du ihn in das Bug-Tracking-System des ngIRCd ein:
|
||||
URL: <http://arthur.ath.cx/bugzilla/ngircd/>
|
||||
Q: I cannot connect to remote peers when I use the chroot option, the
|
||||
following is logged: "Can't resolve example.com: unknown error!".
|
||||
A: On Linux/glibc with chroot enabled you need to put some libraries inside
|
||||
the chroot as well, notably libnss_dns; maybe others. Unfortunately, even
|
||||
linking ngircd statically does not help this. The only known workaround
|
||||
is to either disable chroot support or to link against dietlibc instead
|
||||
of glibc. (tnx to Sebastian Siewior)
|
||||
|
||||
|
||||
IV. Bugs!?
|
||||
~~~~~~~~~~
|
||||
Q: Is there a list of known bugs and desired feature enhancements?
|
||||
A: Yes. Have a look at the bug tracking system (Bugzilla) for ngIRCd located
|
||||
at <http://ngircd.barton.de/bugzilla/index.cgi>. There you can file bug
|
||||
reports and feature requests as well as search the bug database.
|
||||
|
||||
Q: What should I do if I found a bug?
|
||||
A: Please file a bug report at <http://ngircd.barton.de/bugzilla/index.cgi>!
|
||||
The author of the particular component will be notified automagically :-)
|
||||
|
||||
|
||||
--
|
||||
$Id: FAQ.txt,v 1.2 2002/02/19 20:05:02 alex Exp $
|
||||
$Id: FAQ.txt,v 1.7.4.1 2005/07/09 14:41:39 alex Exp $
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#
|
||||
# ngIRCd -- The Next Generation IRC Daemon
|
||||
# Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
# Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
|
||||
#
|
||||
# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
# der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
@@ -9,26 +9,34 @@
|
||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
#
|
||||
# $Id: Makefile.am,v 1.4 2002/02/25 14:10:38 alex Exp $
|
||||
#
|
||||
# $Log: Makefile.am,v $
|
||||
# Revision 1.4 2002/02/25 14:10:38 alex
|
||||
# - die neuen Texte werden nun auch in Archive ("make dist") aufgenommen ;-)
|
||||
#
|
||||
# Revision 1.3 2002/01/02 02:40:31 alex
|
||||
# - Copyright-Text ergaenzt.
|
||||
#
|
||||
# Revision 1.2 2001/12/31 02:45:24 alex
|
||||
# - nun werden alle generierten Dateien bei "maintainer-clean" geloescht.
|
||||
#
|
||||
# Revision 1.1 2001/12/31 02:22:29 alex
|
||||
# - Makefile.am fuer das "doc"-Verzeichnis begonnen.
|
||||
# $Id: Makefile.am,v 1.18 2005/04/27 07:52:29 alex Exp $
|
||||
#
|
||||
|
||||
EXTRA_DIST = CC-Speed.txt CVS.txt FAQ.txt README-AUX.txt README-BeOS.txt \
|
||||
RFC.txt sample-ngircd.conf
|
||||
EXTRA_DIST = CVS.txt FAQ.txt Protocol.txt Platforms.txt \
|
||||
README-AUX.txt README-BeOS.txt RFC.txt sample-ngircd.conf
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -f Makefile Makefile.in
|
||||
|
||||
distclean-local:
|
||||
rm -rf src
|
||||
|
||||
docdir = $(datadir)/doc/$(PACKAGE)
|
||||
|
||||
documents = $(EXTRA_DIST) ../AUTHORS ../COPYING ../ChangeLog ../INSTALL \
|
||||
../NEWS ../README
|
||||
|
||||
install-data-hook:
|
||||
$(mkinstalldirs) $(DESTDIR)$(sysconfdir)
|
||||
if [ ! -f $(DESTDIR)$(sysconfdir)/ngircd.conf ]; then \
|
||||
$(INSTALL) -m 600 -c $(srcdir)/sample-ngircd.conf $(DESTDIR)$(sysconfdir)/ngircd.conf; \
|
||||
fi
|
||||
$(mkinstalldirs) $(DESTDIR)$(docdir)
|
||||
for f in $(documents); do \
|
||||
$(INSTALL) -m 644 -c $(srcdir)/$$f $(DESTDIR)$(docdir)/; \
|
||||
done
|
||||
|
||||
uninstall-hook:
|
||||
rm -rf $(DESTDIR)$(docdir)
|
||||
|
||||
# -eof-
|
||||
|
||||
65
doc/Platforms.txt
Normal file
65
doc/Platforms.txt
Normal file
@@ -0,0 +1,65 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001-2005 Alexander Barton
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd is free software and published under the
|
||||
terms of the GNU General Public License.
|
||||
|
||||
-- Platforms.txt --
|
||||
|
||||
|
||||
This file lists the status of all platforms on which the ngIRCd has been
|
||||
tested. Included is the date and version of the last "official" test and
|
||||
the name of the tester/maintainer.
|
||||
|
||||
If you successfully compiled and tested ngIRCd on a platform that isn't
|
||||
listed here, please contact Alexander Barton, <alex@barton.de>, so that this
|
||||
list can be updated. Thanks for your help!
|
||||
|
||||
|
||||
the executable works ("runs") as expected --+
|
||||
tests run successfully ("make check") --+ |
|
||||
ngIRCd compiles ("make") --+ | |
|
||||
./configure works --+ | | |
|
||||
| | | |
|
||||
Platform Compiler ngIRCd Date Tester C M T R See
|
||||
--------------------------- ------------ ---------- -------- ------ - - - - ---
|
||||
hppa/unknown/openbsd3.5 gcc 2.95.3 CVSHEAD 04-05-25 alex Y Y Y Y
|
||||
hppa1.1/unknown/linux-gnu gcc 3.3.3 0.8.0 04-05-30 alex Y Y Y Y
|
||||
hppa2.0/unknown/linux-gnu gcc 3.3.5 0.9.x-CVS 05-06-27 alex Y Y Y Y
|
||||
i386/pc/solaris2.9 gcc 3.2.2 CVSHEAD 04-02-24 alex Y Y Y Y
|
||||
i386/unknown/freebsd5.2.1 gcc 3.3.3 0.8.0 04-05-30 alex Y Y Y Y
|
||||
i386/unknown/gnu0.3 gcc 3.3.3 0.8.0 04-05-30 alex Y Y n Y
|
||||
i386/unknown/netbsdelf1.6.1 gcc 2.95.3 CVSHEAD 04-02-24 alex Y Y Y Y
|
||||
i686/pc/cygwin gcc 3.3.1 0.9.x-CVS 05-07-08 alex Y Y n Y
|
||||
i686/pc/linux-gnu gcc 2.95.4 0.8.0 04-05-30 alex Y Y Y Y (1)
|
||||
i686/pc/linux-gnu gcc 3.3.5 0.9.x-CVS 05-07-09 alex Y Y Y Y (1)
|
||||
m68k/apple/aux3.1.1 Orig. A/UX 0.7.x-CVS 03-04-22 alex Y Y Y Y (2)
|
||||
m68k/hp/hp-ux9.10 Orig. HPUX 0.7.x-CVS 03-04-30 goetz Y Y Y Y
|
||||
m88k/dg/dgux5.4R3.10 gcc 2.5.8 CVSHEAD 04-03-15 alex Y Y ? ?
|
||||
powerpc/apple/darwin6.5 gcc 3.1 0.7.x-CVS 03-04-23 alex Y Y Y Y
|
||||
powerpc/apple/darwin7.4.0 gcc 3.3 0.8.0 04-05-30 alex Y Y Y Y
|
||||
powerpc/apple/darwin8.1.0 gcc 4.0 0.9.x-CVS 05-06-27 alex Y Y Y Y
|
||||
powerpc/unknown/linux-gnu gcc 3.3.3 0.8.0 04-05-30 alex Y Y Y Y
|
||||
sparc/sun/solaris2.6 gcc 2.95.3 0.7.x-CVS 03-04-22 alex Y Y Y Y
|
||||
sparc/sun/solaris2.7 gcc 3.3 0.8.0 04-05-30 alex Y Y Y Y
|
||||
sparc/unkn./netbsdelf1.6.1 gcc 2.95.3 0.8.0 04-05-30 alex Y Y Y Y
|
||||
|
||||
|
||||
Notes
|
||||
~~~~~
|
||||
(1) i686/pc/linux-gnu:
|
||||
ngIRCd has been tested with various Linux distributions, such as SuSE,
|
||||
RedHat, Debian, and Gentoo using Kernels 2.2.x, 2.4.x and 2.6.x with
|
||||
various versions of the GNU C compiler (2.95.3, 3.0, 3.2, and 3.3). The
|
||||
eldest glibc used was glibc-2.0.7. ngIRCd compiled and run on all these
|
||||
systems without problems.
|
||||
|
||||
(2) This compiler is an pre-ANSI C compiler, therefore the source code is
|
||||
automatically converted using the included ansi2knr tool while building.
|
||||
|
||||
|
||||
--
|
||||
$Id: Platforms.txt,v 1.13.2.2 2005/07/09 11:16:38 alex Exp $
|
||||
118
doc/Protocol.txt
Normal file
118
doc/Protocol.txt
Normal file
@@ -0,0 +1,118 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001-2003 by Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd is free software and published under the
|
||||
terms of the GNU General Public License.
|
||||
|
||||
-- Protocol.txt --
|
||||
|
||||
|
||||
I. Compatibility
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
The ngIRCd implements the Internet Relay Chat (IRC) protocol version 2.10
|
||||
as defined in RFC ("request for comment") 1459 and 2810-2813. These (and
|
||||
probably further relevant RFCs) are listed in doc/RFC.txt.
|
||||
|
||||
Unfortunately, even the "original" ircd doesn't follow these specifications
|
||||
in all details. But because the ngIRCd should be a fully compatible
|
||||
replacement for this server ("ircd") it tries to emulate these differences.
|
||||
|
||||
If you don't like this behavior please ./configure the ngIRCd using the
|
||||
"--enable-strict-rfc" command line option. But keep in mind: not all IRC
|
||||
clients are compatible with a server configured that way, some can't even
|
||||
connect at all! Therefore this option usually isn't desired for "normal
|
||||
server operation".
|
||||
|
||||
|
||||
II. The IRC+ Protocol
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Starting with version 0.5.0, the ngIRCd extends the original IRC protocol
|
||||
as defined in RFC 2810-2813. This enhanced protocol is named "IRC+". It is
|
||||
backwards compatible to the "plain" IRC protocol and will only be used by
|
||||
the ngIRCd if it detects that the peer supports it as well.
|
||||
|
||||
The "PASS" command is used to detect the protocol and peer versions see
|
||||
RFC 2813 (section 4.1.1) and below.
|
||||
|
||||
|
||||
II.1 Register new server link
|
||||
|
||||
Command: PASS
|
||||
Parameters: <password> <version> <flags> [<options>]
|
||||
Used by: servers only (with these parameters)
|
||||
|
||||
<password> is the password for this new server link as defined in the server
|
||||
configuration which is sent to the peer or received from it.
|
||||
|
||||
<version> consists of two parts and is at least 4, at most 14 characters
|
||||
long: the first four bytes contain the IRC protocol version number, whereas
|
||||
the first two bytes represent the major version, the last two bytes the
|
||||
minor version (the string "0210" indicates version 2.10, e.g.).
|
||||
|
||||
The following optional(!) 10 bytes contain an implementation-dependent
|
||||
version number. Servers supporting the IRC+ protocol as defined in this
|
||||
document provide the string "-IRC+" here.
|
||||
|
||||
Example for <version>: "0210-IRC+".
|
||||
|
||||
<flags> consists of two parts separated with the character "|" and is at
|
||||
most 100 bytes long. The first part contains the name of the implementation
|
||||
(ngIRCd sets this to "ngircd", the original ircd to "IRC", e.g.). The second
|
||||
part is implementation-dependent and should only be parsed if the peer
|
||||
supports the IRC+ protocol as well. In this case the following syntax is
|
||||
used: "<serverversion>[:<serverflags>]".
|
||||
|
||||
<serverversion> is an ASCII representation of the clear-text server version
|
||||
number, <serverflags> indicates the supported IRC+ protocol extensions (and
|
||||
may be empty!).
|
||||
|
||||
The following <serverflags> are defined at the moment:
|
||||
|
||||
- C: The server supports the CHANINFO command.
|
||||
|
||||
- L: INVITE- and BAN-lists should be synchronized between servers: if the
|
||||
peer understands this flag, it will send "MODE +I" and "MODE +b"
|
||||
commands after the server link has been established.
|
||||
|
||||
- o: IRC operators are allowed to change channel- and channel-user-modes
|
||||
even if they aren't channel-operator of the affected channel.
|
||||
|
||||
- Z: Compressed server links are supported by the server.
|
||||
|
||||
Example for a complete <flags> string: "ngircd|0.7.5:CZ".
|
||||
|
||||
The optional parameter <options> is used to propagate server options as
|
||||
defined in RFC 2813, section 4.1.1.
|
||||
|
||||
|
||||
II.2 Exchange channel-modes, topics, and persistent channels
|
||||
|
||||
Command: CHANINFO
|
||||
Parameters: <channel> +<modes> <key> <maxusers> [<topic>]
|
||||
Used by: servers only
|
||||
|
||||
CHANINFO is used by servers to inform each other about a channel: its
|
||||
modes, channel key, user limits and its topic. <topic> is optional.
|
||||
|
||||
If the channel already exists on the server receiving the CHANINFO command,
|
||||
it only adopts the <modes> (or the <topic>) if there are no modes (or topic)
|
||||
already set. It there are already values set the server ignores the
|
||||
corresponding parameter.
|
||||
|
||||
If the channel doesn't exists at all it will be created.
|
||||
|
||||
The parameter <key> must be ignored if a channel has no key (the parameter
|
||||
<modes> doesn't list the "k" channel mode). In this case <key> should
|
||||
contain "*" because the parameter <key> is required by the CHANINFO syntax
|
||||
and therefore can't be omitted. The parameter <limit> must be ignored when
|
||||
a channel has no user limit (the parameter <modes> doesn't list the "l"
|
||||
channel mode). In this case <limit> should be "0".
|
||||
|
||||
|
||||
--
|
||||
$Id: Protocol.txt,v 1.12 2004/04/25 15:44:10 alex Exp $
|
||||
@@ -1,47 +1,67 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001,2002 by Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
(c)2001-2005 Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd ist freie Software und steht unter
|
||||
der GNU General Public License.
|
||||
|
||||
-- README-AUX.txt --
|
||||
ngIRCd is free software and published under the
|
||||
terms of the GNU General Public License.
|
||||
|
||||
|
||||
Seit Version 0.2.2-pre gehoert Apple A/UX zu den offiziell unterstuetzten
|
||||
Platformen. Er ist im vollen Funktionsumfang nutzbar.
|
||||
|
||||
Folgende Software wird jedoch benoetigt:
|
||||
|
||||
- GNU C Compiler (gcc)
|
||||
Bezugsquellen:
|
||||
http://www.rezepte-im-web.de/appleux/gcc281.tar.gz
|
||||
ftp://arthur.ath.cx/pub/AUX/Software/Development/gcc281.tar.gz
|
||||
|
||||
- GNU make
|
||||
Bezugsquellen:
|
||||
http://www.rezepte-im-web.de/appleux/make-3.79.tar.gz
|
||||
ftp://arthur.ath.cx/pub/AUX/Software/Development/make-3.79.tar.gz
|
||||
|
||||
- GNU sed
|
||||
Bezugsquellen:
|
||||
http://www.rezepte-im-web.de/appleux/sed-3.02.tar.gz
|
||||
ftp://arthur.ath.cx/pub/AUX/Software/Tools/sed-3.02.tar.gz
|
||||
|
||||
- libUTIL.a
|
||||
Bezugsquellen:
|
||||
http://ftp.mayn.de/pub/apple/apple_unix/Sys_stuff/libUTIL-2.1.tar.gz
|
||||
ftp://arthur.ath.cx/pub/AUX/Software/Libraries/libUTIL-2.1.tar.gz
|
||||
|
||||
Nachdem diese Pakete entsprechend installiert sind, reicht ein ganz normales
|
||||
"./configure" und "make" aus, um den ngIRCd unter A/UX zu compilieren.
|
||||
-- README-AUX.txt --
|
||||
|
||||
|
||||
Hier die Zeiten von Alex System (Macintosh SE/30, 32 MB, A/UX 3.0.1):
|
||||
configure: 7:33, make: 12:02
|
||||
Since version 0.2.2-pre Apple's A/UX belongs to the officially supported
|
||||
platforms. It is not restricted in any way.
|
||||
|
||||
Since version 0.5.0 ngIRCd's source compiles with the native A/UX c
|
||||
compiler. GNU C isn't a must-have anymore.
|
||||
|
||||
The following software packages are needed:
|
||||
|
||||
- GNU sed
|
||||
Source:
|
||||
http://www.rezepte-im-web.de/appleux/sed-3.02.tar.gz
|
||||
ftp://arthur.barton.de/pub/UNIX/AUX/Tools/sed-3.02.tar.gz
|
||||
|
||||
A/UX comes with /bin/sed which isn't supporting all functions needed
|
||||
by GNU automake/autoconf.
|
||||
|
||||
Warning: When installing GNU sed please make sure that A/UX doesn't
|
||||
use the old one anymore which means set the $PATH or replace /bin/sed
|
||||
at all.
|
||||
|
||||
- libUTIL.a
|
||||
Source:
|
||||
ftp://ftp.mayn.de/pub/really_old_stuff/apple/apple_unix/Sys_stuff/libUTIL-2.1.tar.gz>
|
||||
ftp://arthur.barton.de/pub/UNIX/AUX/Libraries/libUTIL-2.1.tar.gz
|
||||
|
||||
This library contains functions that are common on other UNIX
|
||||
systems but not on A/UX e.g. memmove(), strerror() und strdup().
|
||||
|
||||
|
||||
After installation of these packages just do a "./configure" and "make" to
|
||||
compile ngIRCd on A/UX.
|
||||
|
||||
|
||||
A few hints in case of errors:
|
||||
|
||||
- Either there's an 'install' on your system which is completely broken
|
||||
(so 'configure' uses its own shell script) or use a fully functionable one.
|
||||
There's at least one binary "out there" causing problems. The one
|
||||
of the GNU fileutils works fine:
|
||||
ftp://arthur.barton.de/pub/UNIX/AUX/Software/Tools/fileutils-4.0.tar.gz
|
||||
|
||||
- The precompiled binary of the old 'bash' shouldn't be installed within
|
||||
/bin (better do this in /usr/local/bin) because 'configure' would
|
||||
choose it as its shell which wouldn't work.
|
||||
|
||||
- Because of limitations of /bin/sh on A/UX it can't be used to create
|
||||
the 'config.status' script. Better rename /bin/sh to /bin/sh.AUX and
|
||||
replace it by a symbolic link to /bin/ksh (ln -s /bin/ksh /bin/sh as
|
||||
root).
|
||||
These procedure should'nt cause you into problems and is recommended
|
||||
even if you don't use ngIRCd.
|
||||
|
||||
--
|
||||
$Id: README-AUX.txt,v 1.1 2002/02/25 14:02:32 alex Exp $
|
||||
$Id: README-AUX.txt,v 1.9 2005/06/24 20:59:13 alex Exp $
|
||||
|
||||
@@ -1,15 +1,21 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001,2002 by Alexander Barton,
|
||||
(c)2001-2003 by Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd ist freie Software und steht unter
|
||||
der GNU General Public License.
|
||||
ngIRCd is free software and published under the
|
||||
terms of the GNU General Public License.
|
||||
|
||||
-- README-BeOS.txt --
|
||||
|
||||
|
||||
+-------------------------------------------------------------+
|
||||
| This text is only available in german at the moment, sorry! |
|
||||
| Contributors for this text or the BeOS port are welcome :-) |
|
||||
+-------------------------------------------------------------+
|
||||
|
||||
|
||||
BeOS gehoert im Moment (noch?) nicht zu den offiziell unterstuetzten Plat-
|
||||
formen: der ngIRCd enthaelt zwar bereits einige Anpassungen an BeOS und
|
||||
compiliert auch, jedoch bricht er bei jedem Connect-Versuch eines Clients
|
||||
@@ -22,7 +28,7 @@ von Pipes verschiedener Prozesse umgehen kann: sobald der Resolver asyncron
|
||||
gestartet wird, also Pipe-Handles im select() vorhanden sind, fuehrt das zu
|
||||
obiger Meldung.
|
||||
|
||||
Theoretische "L<EFBFBD>sung"/Workaround:
|
||||
Theoretische "Loesung"/Workaround:
|
||||
Den Resolver unter BeOS nicht verwenden, sondern mit IP-Adressen arbeiten.
|
||||
Nachteil: der ngIRCd koennte sich nicht zu Servern verbinden, die dynamische
|
||||
Adressen benutzen -- dazu muesste er den Namen aufloesen. Ansonsten sollte
|
||||
@@ -32,5 +38,16 @@ Also: wenn es jemand implementieren will ... ;-))
|
||||
|
||||
Vielleicht mache ich es auch irgendwann mal selber. Mal sehen.
|
||||
|
||||
2002-05-19:
|
||||
Ich habe gerade damit ein wenig gespielt und den Source hier so geaendert,
|
||||
dass unter BeOS keine Resolver-Subprozesse mehr erzeugt werden, sondern mit
|
||||
den "rohen" IP-Adressen gearbeitet wird. Das funktioniert so weit auch,
|
||||
allerdings verschluckt sich BeOS nun bei anderen Funktionen, so zum Beispiel
|
||||
bei close(), wenn ein Socket eines Clients geschlossen werden soll!?
|
||||
Sehr komisch.
|
||||
Wer Interesse daran hat, das weiter zu verfolgen, der moege sich bitte mit
|
||||
mir in Verbindung setzen (alex@barton.de), ich maile gerne meine Patches zu.
|
||||
Fuer eine Aenderung im CVS ist es aber meiner Meinung nach noch zu frueh ...
|
||||
|
||||
--
|
||||
$Id: README-BeOS.txt,v 1.1 2002/02/25 14:02:32 alex Exp $
|
||||
$Id: README-BeOS.txt,v 1.7 2003/05/15 21:47:57 alex Exp $
|
||||
|
||||
11
doc/RFC.txt
11
doc/RFC.txt
@@ -1,16 +1,17 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001,2002 by Alexander Barton,
|
||||
(c)2001-2003 by Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
|
||||
ngIRCd ist freie Software und steht unter
|
||||
der GNU General Public License.
|
||||
ngIRCd is free software and published under the
|
||||
terms of the GNU General Public License.
|
||||
|
||||
-- RFC.txt --
|
||||
|
||||
|
||||
Das IRC-Protokoll ist in diesen RFC's (Request For Comments) dokumentiert:
|
||||
The Internet Relay Chat (IRC) protocol is documented in these Request for
|
||||
Comments (RFC), which you can get e.g. via <http://www.faqs.org/>:
|
||||
|
||||
1459 Oikarinen, J. & D. Reed, "Internet Relay Chat Protocol",
|
||||
May 1993, [IRC].
|
||||
@@ -29,4 +30,4 @@ Das IRC-Protokoll ist in diesen RFC's (Request For Comments) dokumentiert:
|
||||
|
||||
|
||||
--
|
||||
$Id: RFC.txt,v 1.4 2002/01/23 18:20:04 alex Exp $
|
||||
$Id: RFC.txt,v 1.6 2003/03/07 20:42:20 alex Exp $
|
||||
|
||||
58
doc/SSL.txt
Normal file
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 $
|
||||
@@ -1,27 +1,181 @@
|
||||
# $Id: sample-ngircd.conf,v 1.3 2002/02/17 17:34:50 alex Exp $
|
||||
# $Id: sample-ngircd.conf,v 1.33 2005/03/15 16:58:01 alex Exp $
|
||||
|
||||
#
|
||||
# This is a sample configuration file for the ngIRCd, which must be adepted
|
||||
# to the local preferences and needs.
|
||||
#
|
||||
# Comments are started with "#" or ";".
|
||||
#
|
||||
# Use "ngircd --configtest" (see manual page ngircd(8)) to validate that the
|
||||
# server interpreted the configuration file as expected!
|
||||
#
|
||||
|
||||
[Global]
|
||||
# The [Global] section of this file is used to define the main
|
||||
# configuration of the server, like the server name and the ports
|
||||
# on which the server should be listening.
|
||||
|
||||
# Server name in the IRC network, must contain at least one dot
|
||||
# (".") and be unique in the IRC network. Required!
|
||||
Name = irc.the.net
|
||||
|
||||
# Info text of the server. This will be shown by WHOIS and
|
||||
# LINKS requests for example.
|
||||
Info = Server Info Text
|
||||
Ports = 6667, 6668, 6669
|
||||
MotdFile = /usr/local/etc/ngircd.motd
|
||||
PingTimeout = 120
|
||||
PongTimeout = 10
|
||||
ConnectRetry = 60
|
||||
|
||||
# Global password for all users needed to connect to the server
|
||||
;Password = abc
|
||||
|
||||
# Information about the server and the administrator, used by the
|
||||
# ADMIN command. Not required by server but by RFC!
|
||||
;AdminInfo1 = Description
|
||||
;AdminInfo2 = Location
|
||||
;AdminEMail = admin@irc.server
|
||||
|
||||
# Ports on which the server should listen. There may be more than
|
||||
# one port, separated with ",". (Default: 6667)
|
||||
;Ports = 6667, 6668, 6669
|
||||
|
||||
# IP address on which the server should listen. (Default: empty,
|
||||
# so the server listens on all IP addresses of the system)
|
||||
;Listen = 1.2.3.4
|
||||
|
||||
# Text file with the "message of the day" (MOTD). This message will
|
||||
# be shown to all users connecting to the server:
|
||||
;MotdFile = /usr/local/etc/ngircd.motd
|
||||
|
||||
# A simple Phrase (<256 chars) if you don't want to use a motd file.
|
||||
# If it is set no MotdFile will be read at all.
|
||||
;MotdPhrase = "Hello world!"
|
||||
|
||||
# User ID under which the server should run; you can use the name
|
||||
# of the user or the numerical ID. ATTENTION: For this to work the
|
||||
# server must have been started with root privileges! In addition,
|
||||
# the configuration and MOTD files must be readable by this user,
|
||||
# otherwise RESTART and REHASH won't work!
|
||||
;ServerUID = 65534
|
||||
|
||||
# Group ID under which the ngircd should run; you can use the name
|
||||
# of the group or the numerical ID. ATTENTION: For this to work the
|
||||
# server must have been started with root privileges!
|
||||
;ServerGID = 65534
|
||||
|
||||
# A directory to chroot in when everything is initialized. It
|
||||
# doesn't need to be populated if ngIRCd is compiled as a static
|
||||
# binary. By default ngIRCd won't use the chroot() feature.
|
||||
# ATTENTION: For this to work the server must have been started
|
||||
# with root privileges!
|
||||
;ChrootDir = /var/empty
|
||||
|
||||
# This tells ngircd to write its current process id to a file.
|
||||
# Note that the pidfile is written AFTER chroot and switching uid,
|
||||
# i. e. the Directory the pidfile resides in must be writeable by
|
||||
# the ngircd user and exist in the chroot directory.
|
||||
;PidFile = /var/run/ngircd/ngircd.pid
|
||||
|
||||
# After <PingTimeout> seconds of inactivity the server will send a
|
||||
# PING to the peer to test whether it is alive or not.
|
||||
;PingTimeout = 120
|
||||
|
||||
# If a client fails to answer a PING with a PONG within <PongTimeout>
|
||||
# seconds, it will be disconnected by the server.
|
||||
;PongTimeout = 20
|
||||
|
||||
# The server tries every <ConnectRetry> seconds to establish a link
|
||||
# to not yet (or no longer) connected servers.
|
||||
;ConnectRetry = 60
|
||||
|
||||
# Should IRC Operators be allowed to use the MODE command even if
|
||||
# they are not(!) channel-operators?
|
||||
;OperCanUseMode = no
|
||||
|
||||
# Mask IRC Operator mode requests as if they were coming from the
|
||||
# server? (This is a compatibility hack for ircd-irc2 servers)
|
||||
;OperServerMode = no
|
||||
|
||||
# Maximum number of simultaneous connection the server is allowed
|
||||
# to accept (<=0: unlimited):
|
||||
;MaxConnections = -1
|
||||
|
||||
# Maximum number of simultaneous connections from a single IP address
|
||||
# the server will accept (<=0: unlimited):
|
||||
;MaxConnectionsIP = 5
|
||||
|
||||
# Maximum number of channels a user can be member of (<=0: no limit):
|
||||
;MaxJoins = 10
|
||||
|
||||
[Operator]
|
||||
; Name = TheOper
|
||||
; Password = ThePwd
|
||||
# [Operator] sections are used to define IRC Operators. There may be
|
||||
# more than one [Operator] block, one for each local operator.
|
||||
|
||||
# ID of the operator (may be different of the nick name)
|
||||
;Name = TheOper
|
||||
|
||||
# Password of the IRC operator
|
||||
;Password = ThePwd
|
||||
|
||||
# Optional Mask from which /OPER will be accepted
|
||||
;Mask = *!ident@somewhere.example.com
|
||||
|
||||
[Operator]
|
||||
# More [Operator] sections, if you like ...
|
||||
|
||||
[Server]
|
||||
; Host = connect-to-host.the.net
|
||||
; Name = irc2.the.net
|
||||
; Port = 6666
|
||||
; Password = ThePwd1
|
||||
# Other servers are configured in [Server] sections. If you
|
||||
# configure a port for the connection, then this ngircd tries to
|
||||
# connect to to the other server on the given port; if not it waits
|
||||
# for the other server to connect.
|
||||
# There may be more than one server block.
|
||||
#
|
||||
# Server Groups:
|
||||
# The ngIRCd allows "server groups": You can assign an "ID" to every
|
||||
# server with which you want this ngIRCd to link. If a server of a
|
||||
# group won't answer, the ngIRCd tries to connect to the next server
|
||||
# in the given group. But the ngircd never tries to connect to two
|
||||
# servers with the same group ID.
|
||||
|
||||
# IRC name of the server
|
||||
;Name = irc2.the.net
|
||||
|
||||
# Internet host name of the peer
|
||||
;Host = connect-to-host.the.net
|
||||
|
||||
# Port of the server to which the ngIRCd should connect. If you
|
||||
# assign no port the ngIRCd waits for incoming connections.
|
||||
;Port = 6666
|
||||
|
||||
# Own password for the connection. This password has to be configured
|
||||
# as "PeerPassword" on the other server.
|
||||
;MyPassword = MySecret
|
||||
|
||||
# Foreign password for this connection. This password has to be
|
||||
# configured as "MyPassword" on the other server.
|
||||
;PeerPassword = PeerSecret
|
||||
|
||||
# Group of this server (optional)
|
||||
;Group = 123
|
||||
|
||||
[Server]
|
||||
; Host = wait-for-host.the.net
|
||||
; Name = irc3.the.net
|
||||
; Password = ThePwd2
|
||||
# More [Server] sections, if you like ...
|
||||
|
||||
[Channel]
|
||||
# Pre-defined channels can be configured in [Channel] sections.
|
||||
# Such channels are created by the server when starting up and even
|
||||
# persist when there are no more members left.
|
||||
# Persistent channels are marked with the mode 'P', which can be set
|
||||
# and unset by IRC operators like other modes on the fly.
|
||||
# There may be more than one [Channel] block.
|
||||
|
||||
# Name of the channel
|
||||
;Name = #TheName
|
||||
|
||||
# Topic for this channel
|
||||
;Topic = a great topic
|
||||
|
||||
# Initial channel modes
|
||||
;Modes = tn
|
||||
|
||||
[Channel]
|
||||
# More [Channel] sections, if you like ...
|
||||
|
||||
# -eof-
|
||||
|
||||
@@ -9,18 +9,12 @@
|
||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
#
|
||||
# $Id: Makefile.am,v 1.2 2002/01/02 02:40:15 alex Exp $
|
||||
#
|
||||
# $Log: Makefile.am,v $
|
||||
# Revision 1.2 2002/01/02 02:40:15 alex
|
||||
# - Copyright-Texte ergaenzt und aktualisiert,
|
||||
# - fehlende Dateien in Projekt aufgenommen.
|
||||
#
|
||||
# Revision 1.1 2001/12/31 16:02:12 alex
|
||||
# - Projektdateien von Mac OS X werden nun auch in die Distribution aufgenommen.
|
||||
# $Id: Makefile.am,v 1.5 2002/04/04 13:02:41 alex Exp $
|
||||
#
|
||||
|
||||
EXTRA_DIST = project.pbxproj
|
||||
man_MANS = ngircd.conf.5 ngircd.8
|
||||
|
||||
EXTRA_DIST = $(man_MANS)
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -f Makefile Makefile.in
|
||||
80
man/ngircd.8
Normal file
80
man/ngircd.8
Normal file
@@ -0,0 +1,80 @@
|
||||
.\"
|
||||
.\" $Id: ngircd.8,v 1.10 2005/06/04 13:39:20 alex Exp $
|
||||
.\"
|
||||
.TH ngircd 8 "Juni 2005" ngircd "ngIRCd Manual"
|
||||
.SH NAME
|
||||
ngIRCd \- the next generation IRC daemon
|
||||
.SH SYNOPSIS
|
||||
.B ngircd [
|
||||
.I Options
|
||||
.B ]
|
||||
.SH DESCRIPTION
|
||||
.BR ngIRCd
|
||||
is a free open source daemon for the Internet Relay Chat (IRC),
|
||||
developed under the GNU General Public License (GPL).
|
||||
.PP
|
||||
It's written from scratch and is not based upon the original IRCd like
|
||||
many others. It is easy to configure, supports server links (even with
|
||||
original ircd's) and runs on hosts with changing IP addresses (such as
|
||||
dial-in networks).
|
||||
.PP
|
||||
Currently supported platforms include AIX, A/UX, FreeBSD, HP-UX, IRIX,
|
||||
Linux, Mac OS X, NetBSD, OpenBSD, Solaris, and Windows with Cygwin.
|
||||
.PP
|
||||
As ngIRCd relies on UNIX standards and uses GNU automake and GNU autoconf
|
||||
there are good chances that it also supports other UNIX-based operating
|
||||
systems as well.
|
||||
.SH OPTIONS
|
||||
The default behaviour of
|
||||
.BR ngircd
|
||||
is to read its standard configuration file (see below), to detach from the
|
||||
controlling terminal and to wait for clients.
|
||||
.PP
|
||||
You can use these options to modify this default:
|
||||
.TP
|
||||
\fB\-f\fR \fIfile\fR, \fB\-\-config\fR \fIfile\fR
|
||||
Use
|
||||
.I file
|
||||
as configuration file.
|
||||
.TP
|
||||
\fB\-n\fR, \fB\-\-nodaemon\fR
|
||||
Don't fork a child and don't detach from controlling terminal.
|
||||
All log messages go to the console and you can use CTRL-C to
|
||||
terminate the server.
|
||||
.TP
|
||||
\fB\-p\fR, \fB\-\-passive\fR
|
||||
Disable automatic connections to other servers. You can use the IRC command
|
||||
CONNECT later on as IRC Operator to link this ngIRCd to other servers.
|
||||
.TP
|
||||
\fB\-t\fR, \fB\-\-configtest\fR
|
||||
Read, validate and display the configuration; then exit.
|
||||
.TP
|
||||
\fB\-\-version\fR
|
||||
Output version information and exit.
|
||||
.TP
|
||||
\fB\-\-help\fR
|
||||
Display a brief help text and exit.
|
||||
.SH FILES
|
||||
.I /usr/local/etc/ngircd.conf
|
||||
.RS
|
||||
The system wide default configuration file.
|
||||
.RE
|
||||
.I /usr/local/etc/ngircd.motd
|
||||
.RS
|
||||
Default "message of the day" (MOTD).
|
||||
.RE
|
||||
.SH AUTHOR
|
||||
Alexander Barton,
|
||||
.UR mailto:alex@barton.de
|
||||
alex@barton.de
|
||||
.UE
|
||||
.br
|
||||
Homepage:
|
||||
.UR http://arthur.ath.cx/~alex/ngircd/
|
||||
http://arthur.ath.cx/~alex/ngircd/
|
||||
.UE
|
||||
.SH "SEE ALSO"
|
||||
.BR ngircd.conf (5),
|
||||
.BR ircd (8)
|
||||
.\"
|
||||
.\" -eof-
|
||||
250
man/ngircd.conf.5
Normal file
250
man/ngircd.conf.5
Normal file
@@ -0,0 +1,250 @@
|
||||
.\"
|
||||
.\" $Id: ngircd.conf.5,v 1.18 2005/06/04 13:39:20 alex Exp $
|
||||
.\"
|
||||
.TH ngircd.conf 5 "Juni 2005" ngircd "ngIRCd Manual"
|
||||
.SH NAME
|
||||
ngircd.conf \- configuration file of ngIRCd
|
||||
.SH SYNOPSIS
|
||||
.B /usr/local/etc/ngircd.conf
|
||||
.SH DESCRIPTION
|
||||
.BR ngircd.conf
|
||||
is the configuration file for
|
||||
.BR ngircd (8)
|
||||
which you should adept to your local preferences and needs.
|
||||
.SH "FILE FORMAT"
|
||||
The file consists of sections and parameters. A section begins with the name
|
||||
of the section in square brackets and continues until the next section
|
||||
begins.
|
||||
.PP
|
||||
Sections contain parameters of the form
|
||||
.PP
|
||||
.RS
|
||||
.I name
|
||||
=
|
||||
.I value
|
||||
.RE
|
||||
.PP
|
||||
Any line beginning with a semicolon (';') or a hash ('#') character is
|
||||
treated as a comment and ignored.
|
||||
.PP
|
||||
The file format is line-based - that means, each newline-terminated line
|
||||
represents either a comment, a section name or a parameter.
|
||||
.PP
|
||||
Section and parameter names are not case sensitive.
|
||||
.SH "SECTION OVERVIEW"
|
||||
The file can contain blocks of four types: [Global], [Operator], [Server],
|
||||
and [Channel].
|
||||
.PP
|
||||
In the
|
||||
.I [Global]
|
||||
section, there is the main configuration like the server name and the
|
||||
ports on which the server should be listening. IRC operators of this
|
||||
server are defined in
|
||||
.I [Operator]
|
||||
blocks.
|
||||
.I [Server]
|
||||
is the section where server links are configured. And
|
||||
.I [Channel]
|
||||
blocks are used to configure pre-defined ("persistent") IRC channels.
|
||||
.PP
|
||||
There can be more than one [Operator], [Server] and [Channel] sections
|
||||
per configuration file, but only one [Global] section.
|
||||
.SH [GLOBAL]
|
||||
The
|
||||
.I [Global]
|
||||
section is used to define the server main configuration, like the server
|
||||
name and the ports on which the server should be listening.
|
||||
.TP
|
||||
\fBName\fR
|
||||
Server name in the IRC network
|
||||
.TP
|
||||
\fBInfo\fR
|
||||
Info text of the server. This will be shown by WHOIS and LINKS requests for
|
||||
example.
|
||||
.TP
|
||||
\fBAdminInfo1\fR, \fBAdminInfo2\fR, \fBAdminEMail\fR
|
||||
Information about the server and the administrator, used by the ADMIN
|
||||
command.
|
||||
.TP
|
||||
\fBPorts\fR
|
||||
Ports on which the server should listen. There may be more than one port,
|
||||
separated with ','. Default: 6667.
|
||||
.TP
|
||||
\fBListen\fR
|
||||
The IP address on which the server should listen. Default is empty, so
|
||||
the server listens on all configured IP addresses and interfaces.
|
||||
.TP
|
||||
\fBMotdFile\fR
|
||||
Text file with the "message of the day" (MOTD). This message will be shown
|
||||
to all users connecting to the server.
|
||||
.TP
|
||||
\fBMotdPhrase\fR
|
||||
A simple Phrase (<256 chars) if you don't want to use a MOTD file.
|
||||
If it is set no MotdFile will be read at all.
|
||||
.TP
|
||||
\fBServerUID\fR
|
||||
User ID under which the server should run; you can use the name of the user
|
||||
or the numerical ID.
|
||||
.PP
|
||||
.RS
|
||||
.B Attention:
|
||||
.br
|
||||
For this to work the server must have been
|
||||
started with root privileges! In addition, the configuration and MOTD files
|
||||
must be readable by this user, otherwise RESTART and REHASH won't work!
|
||||
.RE
|
||||
.TP
|
||||
\fBServerGID\fR
|
||||
Group ID under which the ngIRCd should run; you can use the name of the
|
||||
group or the numerical ID.
|
||||
.PP
|
||||
.RS
|
||||
.B Attention:
|
||||
.br
|
||||
For this to work the server must have
|
||||
been started with root privileges!
|
||||
.RE
|
||||
.TP
|
||||
\fBChrootDir\fR
|
||||
A directory to chroot in when everything is initialized. It doesn't need
|
||||
to be populated if ngIRCd is compiled as a static binary. By default ngIRCd
|
||||
won't use the chroot() feature.
|
||||
.PP
|
||||
.RS
|
||||
.B Attention:
|
||||
.br
|
||||
For this to work the server must have
|
||||
been started with root privileges!
|
||||
.RE
|
||||
.TP
|
||||
\fBPidFile\fR
|
||||
This tells ngIRCd to write its current process ID to a file. Note that the
|
||||
pidfile is written AFTER chroot and switching the user ID, i. e. the
|
||||
directory the pidfile resides in must be writeable by the ngIRCd user and
|
||||
exist in the chroot directory (if configured, see above).
|
||||
.RE
|
||||
.TP
|
||||
\fBPingTimeout\fR
|
||||
After <PingTimeout> seconds of inactivity the server will send a PING to
|
||||
the peer to test whether it is alive or not. Default: 120.
|
||||
.TP
|
||||
\fBPongTimeout\fR
|
||||
If a client fails to answer a PING with a PONG within <PongTimeout>
|
||||
seconds, it will be disconnected by the server. Default: 20.
|
||||
.TP
|
||||
\fBConnectRetry\fR
|
||||
The server tries every <ConnectRetry> seconds to establish a link to not yet
|
||||
(or no longer) connected servers. Default: 60.
|
||||
.TP
|
||||
\fBOperCanUseMode\fR
|
||||
Should IRC Operators be allowed to use the MODE command even if they are
|
||||
not(!) channel-operators? Default: no.
|
||||
.TP
|
||||
\fBOperServerMode\fR
|
||||
If OperCanUseMode is enabled, this may lead the compatibility problems with
|
||||
Servers that run the ircd-irc2 Software. This Option "masks" mode requests
|
||||
by non-chanops as if they were coming from the server. Default: no.
|
||||
.TP
|
||||
\fBMaxConnections\fR
|
||||
Maximum number of simultaneous connection the server is allowed to accept
|
||||
(<=0: unlimited). Default: -1.
|
||||
.TP
|
||||
\fBMaxConnectionsIP\fR
|
||||
Maximum number of simultaneous connections from a single IP address that
|
||||
the server will accept (<=0: unlimited). This configuration options lowers
|
||||
the risk of denial of service attacks (DoS). Default: 5.
|
||||
.TP
|
||||
\fBMaxJoins\fR
|
||||
Maximum number of channels a user can be member of (<=0: no limit).
|
||||
Default: 10.
|
||||
.SH [OPERATOR]
|
||||
.I [Operator]
|
||||
sections are used to define IRC Operators. There may be more than one
|
||||
.I [Operator]
|
||||
block, one for each local operator.
|
||||
.TP
|
||||
\fBName\fR
|
||||
ID of the operator (may be different of the nick name).
|
||||
.TP
|
||||
\fBPassword\fR
|
||||
Password of the IRC operator.
|
||||
.TP
|
||||
\fBMask\fR
|
||||
Mask that is to be checked before an /OPER for this account is accepted.
|
||||
Example: nick!ident@*.example.com
|
||||
.SH [SERVER]
|
||||
Other servers are configured in
|
||||
.I [Server]
|
||||
sections. If you configure a port for the connection, then this ngIRCd
|
||||
tries to connect to to the other server on the given port; if not, it waits
|
||||
for the other server to connect.
|
||||
.PP
|
||||
The ngIRCd allows "server groups": You can assign an "ID" to every server
|
||||
with which you want this ngIRCd to link. If a server of a group won't
|
||||
answer, the ngIRCd tries to connect to the next server in the given group.
|
||||
But ngIRCd never tries to connect to two servers with the same group ID.
|
||||
.PP
|
||||
There may be more than one
|
||||
.I [Server]
|
||||
block.
|
||||
.TP
|
||||
\fBName\fR
|
||||
IRC name of the server
|
||||
.TP
|
||||
\fBHost\fR
|
||||
Internet host name of the peer
|
||||
.TP
|
||||
\fBPort\fR
|
||||
Port of the server to which the ngIRCd should connect. If you assign no port
|
||||
the ngIRCd waits for incoming connections.
|
||||
.TP
|
||||
\fBMyPassword\fR
|
||||
Own password for this connection. This password has to be configured as
|
||||
"PeerPassword" on the other server.
|
||||
.TP
|
||||
\fBPeerPassword\fR
|
||||
Foreign password for this connection. This password has to be configured as
|
||||
"MyPassword" on the other server.
|
||||
.TP
|
||||
\fBGroup\fR
|
||||
Group of this server (optional).
|
||||
.SH [CHANNEL]
|
||||
Pre-defined channels can be configured in
|
||||
.I [Channel]
|
||||
sections. Such channels are created by the server when starting up and even
|
||||
persist when there are no more members left.
|
||||
.PP
|
||||
Persistent channels are marked with the mode 'P', which can be set and unset
|
||||
by IRC operators like other modes on the fly.
|
||||
.PP
|
||||
There may be more than one
|
||||
.I [Channel]
|
||||
block.
|
||||
.TP
|
||||
\fBName\fR
|
||||
Name of the channel
|
||||
.TP
|
||||
\fBTopic\fR
|
||||
Topic for this channel
|
||||
.TP
|
||||
\fBModes\fR
|
||||
Initial channel modes.
|
||||
.SH HINTS
|
||||
It's wise to use "ngircd --configtest" to validate the configuration file
|
||||
after changing it. See
|
||||
.BR ngircd (8)
|
||||
for details.
|
||||
.SH AUTHOR
|
||||
Alexander Barton,
|
||||
.UR mailto:alex@barton.de
|
||||
alex@barton.de
|
||||
.UE
|
||||
.br
|
||||
Homepage:
|
||||
.UR http://arthur.ath.cx/~alex/ngircd/
|
||||
http://arthur.ath.cx/~alex/ngircd/
|
||||
.UE
|
||||
.SH "SEE ALSO"
|
||||
.BR ngircd (8)
|
||||
.\"
|
||||
.\" -eof-
|
||||
137
src/Doxyfile
Normal file
137
src/Doxyfile
Normal file
@@ -0,0 +1,137 @@
|
||||
#
|
||||
# ngIRCd -- The Next Generation IRC Daemon
|
||||
# Copyright (c)2001-2005 Alexander Barton (alex@barton.de)
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
# Please read the file COPYING, README and AUTHORS for more information.
|
||||
#
|
||||
# $Id: Doxyfile,v 1.1 2005/04/09 12:21:51 alex Exp $
|
||||
#
|
||||
|
||||
# This file describes the settings to be used by the documentation system
|
||||
# doxygen (www.doxygen.org) for ngIRCd.
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Project related configuration options
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
|
||||
# by quotes) that should identify the project.
|
||||
|
||||
PROJECT_NAME = ngIRCd
|
||||
|
||||
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
|
||||
# base path where the generated documentation will be put.
|
||||
# If a relative path is entered, it will be relative to the location
|
||||
# where doxygen was started. If left blank the current directory will be used.
|
||||
|
||||
OUTPUT_DIRECTORY = ../doc/src
|
||||
|
||||
# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
|
||||
# will interpret the first line (until the first dot) of a JavaDoc-style
|
||||
# comment as the brief description. If set to NO, the JavaDoc
|
||||
# comments will behave just like the Qt-style comments (thus requiring an
|
||||
# explicit @brief command for a brief description.
|
||||
|
||||
JAVADOC_AUTOBRIEF = YES
|
||||
|
||||
# If the DETAILS_AT_TOP tag is set to YES then Doxygen
|
||||
# will output the detailed description near the top, like JavaDoc.
|
||||
# If set to NO, the detailed description appears after the member
|
||||
# documentation.
|
||||
|
||||
DETAILS_AT_TOP = NO
|
||||
|
||||
# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
|
||||
# sources only. Doxygen will then generate output that is more tailored for C.
|
||||
# For instance, some of the names that are used will be different. The list
|
||||
# of all members will be omitted, etc.
|
||||
|
||||
OPTIMIZE_OUTPUT_FOR_C = YES
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Build related configuration options
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
|
||||
# documentation are documented, even if no documentation was available.
|
||||
# Private class members and static file members will be hidden unless
|
||||
# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
|
||||
|
||||
EXTRACT_ALL = YES
|
||||
|
||||
# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
|
||||
# will be included in the documentation.
|
||||
|
||||
EXTRACT_PRIVATE = YES
|
||||
|
||||
# If the EXTRACT_STATIC tag is set to YES all static members of a file
|
||||
# will be included in the documentation.
|
||||
|
||||
EXTRACT_STATIC = YES
|
||||
|
||||
# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
|
||||
# defined locally in source files will be included in the documentation.
|
||||
# If set to NO only classes defined in header files are included.
|
||||
|
||||
EXTRACT_LOCAL_CLASSES = YES
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the input files
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# The INPUT tag can be used to specify the files and/or directories that
|
||||
# contain documented source files. You may enter file names like "myfile.cpp"
|
||||
# or directories like "/usr/src/myproject". Separate the files or directories
|
||||
# with spaces.
|
||||
|
||||
INPUT = ngircd portab tool
|
||||
|
||||
# The RECURSIVE tag can be used to turn specify whether or not subdirectories
|
||||
# should be searched for input files as well. Possible values are YES and NO.
|
||||
# If left blank NO is used.
|
||||
|
||||
RECURSIVE = YES
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to source browsing
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# If the SOURCE_BROWSER tag is set to YES then a list of source files will
|
||||
# be generated. Documented entities will be cross-referenced with these sources.
|
||||
# Note: To get rid of all source code in the generated output, make sure also
|
||||
# VERBATIM_HEADERS is set to NO.
|
||||
|
||||
SOURCE_BROWSER = YES
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Output formats
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
GENERATE_HTML = YES
|
||||
GENERATE_HTMLHELP = NO
|
||||
GENERATE_LATEX = NO
|
||||
GENERATE_RTF = NO
|
||||
GENERATE_MAN = NO
|
||||
GENERATE_XML = NO
|
||||
GENERATE_AUTOGEN_DEF = NO
|
||||
GENERATE_PERLMOD = NO
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the preprocessor
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# The PREDEFINED tag can be used to specify one or more macro names that
|
||||
# are defined before the preprocessor is started (similar to the -D option of
|
||||
# gcc). The argument of the tag is a list of macros of the form: name
|
||||
# or name=definition (no spaces). If the definition and the = are
|
||||
# omitted =1 is assumed. To prevent a macro definition from being
|
||||
# undefined via #undef or recursively expanded use the := operator
|
||||
# instead of the = operator.
|
||||
|
||||
PREDEFINED = CONN_MODULE __client_c__
|
||||
|
||||
# -eof-
|
||||
@@ -2,26 +2,23 @@
|
||||
# ngIRCd -- The Next Generation IRC Daemon
|
||||
# Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
#
|
||||
# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
# der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
# herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
# der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
# Please read the file COPYING, README and AUTHORS for more information.
|
||||
#
|
||||
# $Id: Makefile.am,v 1.2 2002/01/02 02:41:11 alex Exp $
|
||||
#
|
||||
# $Log: Makefile.am,v $
|
||||
# Revision 1.2 2002/01/02 02:41:11 alex
|
||||
# - fehlenden Copyright-Text ergaenzt.
|
||||
#
|
||||
# Revision 1.1.1.1 2001/12/11 21:53:04 alex
|
||||
# Imported sources to CVS.
|
||||
# $Id: Makefile.am,v 1.6 2005/04/09 12:22:41 alex Exp $
|
||||
#
|
||||
|
||||
SUBDIRS = ngircd
|
||||
SUBDIRS = portab tool ngircd testsuite
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -f Makefile Makefile.in config.h config.h.in stamp-h.in
|
||||
|
||||
srcdoc:
|
||||
@doxygen --version >/dev/null 2>&1 \
|
||||
|| ( echo; echo "Error: \"doxygen\" not found!"; echo; exit 1 )
|
||||
doxygen
|
||||
|
||||
# -eof-
|
||||
|
||||
@@ -1,77 +1,49 @@
|
||||
#
|
||||
# ngIRCd -- The Next Generation IRC Daemon
|
||||
# Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
# Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
|
||||
#
|
||||
# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
# der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
# herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
# der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
# Please read the file COPYING, README and AUTHORS for more information.
|
||||
#
|
||||
# $Id: Makefile.am,v 1.13 2002/02/27 23:22:09 alex Exp $
|
||||
#
|
||||
# $Log: Makefile.am,v $
|
||||
# Revision 1.13 2002/02/27 23:22:09 alex
|
||||
# - einige Header umgestellt, neue Source-Dateien irc-xxx.c
|
||||
#
|
||||
# Revision 1.12 2002/02/21 18:47:49 alex
|
||||
# - die Rechte der check-Scripts wurde nicht gesetzt.
|
||||
#
|
||||
# Revision 1.11 2002/02/21 17:25:16 alex
|
||||
# - "check"-Target f<>r "make check" und "make distcheck" begonnen ...
|
||||
#
|
||||
# Revision 1.10 2002/01/02 02:43:50 alex
|
||||
# - Copyright-Text ergaenzt bzw. aktualisiert.
|
||||
#
|
||||
# Revision 1.9 2001/12/31 02:18:51 alex
|
||||
# - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
# - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
# - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
#
|
||||
# Revision 1.8 2001/12/30 19:25:03 alex
|
||||
# - in "noinst_HEADERS" waren einige Dateien als .c anstelle .h aufgefuehrt.
|
||||
#
|
||||
# Revision 1.7 2001/12/27 00:37:07 alex
|
||||
# - Erkennung der "portab header" geaendert, CFLAGS werden nun anders gesetzt.
|
||||
#
|
||||
# Revision 1.6 2001/12/23 21:53:54 alex
|
||||
# - Header messages.h eingefuegt.
|
||||
#
|
||||
# Revision 1.5 2001/12/21 22:25:30 alex
|
||||
# - neues Modul "parse" eingebunden.
|
||||
#
|
||||
# Revision 1.4 2001/12/14 08:14:03 alex
|
||||
# - neue Module (irc, client, channel) aufgenommen.
|
||||
#
|
||||
# Revision 1.3 2001/12/13 02:03:33 alex
|
||||
# - beim Compilieren werden nun Informationen fuer den Debugger erzeugt.
|
||||
#
|
||||
# Revision 1.2 2001/12/12 17:20:02 alex
|
||||
# - neue Sourcefiles und Header ergaenzt.
|
||||
#
|
||||
# Revision 1.1.1.1 2001/12/11 21:53:04 alex
|
||||
# - Imported sources to CVS.
|
||||
# $Id: Makefile.am,v 1.46 2005/05/23 00:11:15 alex Exp $
|
||||
#
|
||||
|
||||
AUTOMAKE_OPTIONS = ../portab/ansi2knr
|
||||
|
||||
INCLUDES = -I$(srcdir)/../portab -I$(srcdir)/../tool
|
||||
|
||||
LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN \
|
||||
-varuse -retvalother -emptyret -unrecog
|
||||
|
||||
sbin_PROGRAMS = ngircd
|
||||
|
||||
ngircd_SOURCES = ngircd.c channel.c client.c conf.c conn.c irc.c \
|
||||
irc-login.c irc-mode.c irc-write.c log.c parse.c tool.c
|
||||
ngircd_SOURCES = ngircd.c channel.c client.c conf.c conn.c conn-zip.c conn-func.c \
|
||||
hash.c irc.c irc-channel.c irc-info.c irc-login.c irc-mode.c irc-op.c \
|
||||
irc-oper.c irc-server.c irc-write.c lists.c log.c match.c parse.c \
|
||||
rendezvous.c resolve.c
|
||||
|
||||
noinst_HEADERS = ngircd.h channel.h client.h conf.h conn.h irc.h \
|
||||
irc-login.h irc-mode.h irc-write.h log.h parse.h tool.h \
|
||||
global.h messages.h defines.h
|
||||
ngircd_LDFLAGS = -L../portab -L../tool
|
||||
|
||||
ngircd_LDADD = -lngportab -lngtool
|
||||
|
||||
noinst_HEADERS = ngircd.h channel.h client.h conf.h conn.h conn-zip.h conn-func.h \
|
||||
hash.h irc.h irc-channel.h irc-info.h irc-login.h irc-mode.h irc-op.h \
|
||||
irc-oper.h irc-server.h irc-write.h lists.h log.h match.h parse.h \
|
||||
rendezvous.h resolve.h \
|
||||
messages.h defines.h
|
||||
|
||||
clean-local:
|
||||
rm -f check-version check-help
|
||||
rm -f check-version check-help lint.out cvs-version.*
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -f Makefile Makefile.in
|
||||
|
||||
check-version: Makefile
|
||||
echo "#!/bin/sh" > check-version
|
||||
echo "./ngircd --version | grep version > /dev/null 2>&1" >> check-version
|
||||
echo "./ngircd --version | grep ngircd > /dev/null 2>&1" >> check-version
|
||||
chmod 755 check-version
|
||||
|
||||
check-help: Makefile
|
||||
@@ -79,6 +51,49 @@ check-help: Makefile
|
||||
echo "./ngircd --help | grep help > /dev/null 2>&1" >> check-help
|
||||
chmod 755 check-help
|
||||
|
||||
lint:
|
||||
@splint --version >/dev/null 2>&1 \
|
||||
|| ( echo; echo "Error: \"splint\" not found!"; echo; exit 1 )
|
||||
@echo; warnings=0; files=0; \
|
||||
for f in *.c; do \
|
||||
echo "checking $$f ..."; \
|
||||
splint $$f $(LINTARGS) -I$(srcdir) -I$(srcdir)/.. \
|
||||
$(INCLUDES) $(AM_CFLAGS) >lint.out 2>&1; \
|
||||
grep "no warnings" lint.out > /dev/null 2>&1; \
|
||||
if [ $$? -ne 0 ]; then \
|
||||
waswarning=1; \
|
||||
echo; grep -v "^Command Line: " lint.out; echo; \
|
||||
w=$$( grep "code warning" lint.out | awk "{ print \$$4 }" ); \
|
||||
[ "$$w" -gt 0 ] && warnings=`expr $$warnings + $$w`; \
|
||||
files=`expr $$files + 1`; \
|
||||
else \
|
||||
waswarning=0; \
|
||||
fi; \
|
||||
rm -f lint.out; \
|
||||
done; \
|
||||
[ $$waswarning -eq 0 ] && echo; \
|
||||
[ $$warnings -gt 0 ] \
|
||||
&& echo "Result: $$warnings warning(s) in $$files file(s)!" \
|
||||
|| echo "Result: no warnings found."; \
|
||||
echo; [ $$warnings -gt 0 ] && exit 1
|
||||
|
||||
ngircd.c: cvs-version.h
|
||||
|
||||
irc-login.c: cvs-version.h
|
||||
|
||||
irc-info.c: cvs-version.h
|
||||
|
||||
cvs-version.h: cvs-date
|
||||
|
||||
cvs-date:
|
||||
grep VERSION ../config.h | grep "CVS" \
|
||||
&& echo "#define CVSDATE \"$$( grep "\$$Id" $(srcdir)/*.c \
|
||||
| $(AWK) "{ print \$$9 }" | sort | tail -1 \
|
||||
| sed -e "s/\//-/g" )\"" > cvs-version.new \
|
||||
|| echo "" > cvs-version.new
|
||||
diff cvs-version.h cvs-version.new 2>/dev/null \
|
||||
|| cp cvs-version.new cvs-version.h
|
||||
|
||||
TESTS = check-version check-help
|
||||
|
||||
# -eof-
|
||||
|
||||
@@ -1,119 +1,120 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
* Copyright (c)2001-2005 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: channel.c,v 1.17 2002/03/02 01:35:50 alex Exp $
|
||||
*
|
||||
* channel.c: Management der Channels
|
||||
*
|
||||
* $Log: channel.c,v $
|
||||
* Revision 1.17 2002/03/02 01:35:50 alex
|
||||
* - Channel- und Nicknames werden nun ordentlich validiert.
|
||||
*
|
||||
* Revision 1.16 2002/02/27 23:23:53 alex
|
||||
* - Includes fuer einige Header bereinigt.
|
||||
*
|
||||
* Revision 1.15 2002/02/27 20:32:10 alex
|
||||
* - neue Funktionen Channel_Topic() und Channel_SetTopic().
|
||||
*
|
||||
* Revision 1.14 2002/02/27 15:21:21 alex
|
||||
* - neue Funktion Channel_IsMemberOf() implementiert.
|
||||
*
|
||||
* Revision 1.13 2002/02/11 01:00:12 alex
|
||||
* - neue Funktionen Channel_ModeAdd(), Channel_ModeDel(), Channel_UserModes(),
|
||||
* Channel_UserModeAdd(), Channel_UserModeDel().
|
||||
* - Modes in CL2CHAN-Struktur werden nun korrekt initialisiert.
|
||||
*
|
||||
* Revision 1.12 2002/02/06 16:48:48 alex
|
||||
* - neue Funktion Channel_Modes() und Channel_IsValidName().
|
||||
* - Channel-Namen werden (besser) validiert.
|
||||
*
|
||||
* Revision 1.11 2002/01/29 00:11:10 alex
|
||||
* - neue Funktionen Channel_FirstChannelOf() und Channel_NextChannelOf().
|
||||
*
|
||||
* Revision 1.10 2002/01/28 01:16:15 alex
|
||||
* - neue Funktionen Channel_Name(), Channel_First() und Channel_Next().
|
||||
*
|
||||
* Revision 1.9 2002/01/27 22:47:11 alex
|
||||
* - PART wird nicht mehr an den Server verschickt, von dem es empfangen wurde.
|
||||
*
|
||||
* Revision 1.8 2002/01/27 21:56:54 alex
|
||||
* - weitere Anpassungen an Chennals, v.a. ueber Server-Links.
|
||||
*
|
||||
* Revision 1.7 2002/01/27 17:14:33 alex
|
||||
* - diverse Aenderungen fuer Channels ueber mehrere Server.
|
||||
*
|
||||
* Revision 1.6 2002/01/26 18:41:55 alex
|
||||
* - CHANNEL- und CL2CHAN-Strukturen in Header verlegt,
|
||||
* - einige neue Funktionen (Channel_GetChannel(), Channel_FirstMember(), ...)
|
||||
*
|
||||
* Revision 1.5 2002/01/21 00:12:29 alex
|
||||
* - begonnen, Channels zu implementieren :-)
|
||||
*
|
||||
* Revision 1.4 2002/01/16 22:09:07 alex
|
||||
* - neue Funktion Channel_Count().
|
||||
*
|
||||
* Revision 1.3 2002/01/02 02:42:58 alex
|
||||
* - Copyright-Texte aktualisiert.
|
||||
*
|
||||
* Revision 1.2 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.1 2001/12/14 08:13:43 alex
|
||||
* - neues Modul begonnen :-)
|
||||
* Channel management
|
||||
*/
|
||||
|
||||
|
||||
#define __channel_c__
|
||||
|
||||
|
||||
#include <portab.h>
|
||||
#include "global.h"
|
||||
#include "portab.h"
|
||||
|
||||
#include <imp.h>
|
||||
static char UNUSED id[] = "$Id: channel.c,v 1.50 2005/06/18 08:57:37 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <strings.h>
|
||||
|
||||
#include "defines.h"
|
||||
#include "conn-func.h"
|
||||
#include "client.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "channel.h"
|
||||
|
||||
#include "imp.h"
|
||||
#include "irc-write.h"
|
||||
#include "resolve.h"
|
||||
#include "conf.h"
|
||||
#include "hash.h"
|
||||
#include "lists.h"
|
||||
#include "log.h"
|
||||
#include "messages.h"
|
||||
|
||||
#include <exp.h>
|
||||
#include "channel.h"
|
||||
#include "exp.h"
|
||||
|
||||
|
||||
#define REMOVE_PART 0
|
||||
#define REMOVE_QUIT 1
|
||||
#define REMOVE_KICK 2
|
||||
|
||||
|
||||
LOCAL CHANNEL *My_Channels;
|
||||
LOCAL CL2CHAN *My_Cl2Chan;
|
||||
|
||||
|
||||
LOCAL CHANNEL *New_Chan( CHAR *Name );
|
||||
LOCAL CL2CHAN *Get_Cl2Chan( CHANNEL *Chan, CLIENT *Client );
|
||||
LOCAL CL2CHAN *Add_Client( CHANNEL *Chan, CLIENT *Client );
|
||||
LOCAL BOOLEAN Remove_Client( CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Reason, BOOLEAN ServerPART );
|
||||
LOCAL CL2CHAN *Get_First_Cl2Chan( CLIENT *Client, CHANNEL *Chan );
|
||||
LOCAL CL2CHAN *Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Chan );
|
||||
LOCAL BOOLEAN Delete_Channel( CHANNEL *Chan );
|
||||
LOCAL CL2CHAN *Get_Cl2Chan PARAMS(( CHANNEL *Chan, CLIENT *Client ));
|
||||
LOCAL CL2CHAN *Add_Client PARAMS(( CHANNEL *Chan, CLIENT *Client ));
|
||||
LOCAL bool Remove_Client PARAMS(( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Reason, bool InformServer ));
|
||||
LOCAL CL2CHAN *Get_First_Cl2Chan PARAMS(( CLIENT *Client, CHANNEL *Chan ));
|
||||
LOCAL CL2CHAN *Get_Next_Cl2Chan PARAMS(( CL2CHAN *Start, CLIENT *Client, CHANNEL *Chan ));
|
||||
LOCAL bool Delete_Channel PARAMS(( CHANNEL *Chan ));
|
||||
|
||||
|
||||
GLOBAL VOID Channel_Init( VOID )
|
||||
GLOBAL void
|
||||
Channel_Init( void )
|
||||
{
|
||||
My_Channels = NULL;
|
||||
My_Cl2Chan = NULL;
|
||||
} /* Channel_Init */
|
||||
|
||||
|
||||
GLOBAL VOID Channel_Exit( VOID )
|
||||
GLOBAL void
|
||||
Channel_InitPredefined( void )
|
||||
{
|
||||
/* Vordefinierte persistente Channels erzeugen */
|
||||
|
||||
CHANNEL *chan;
|
||||
char *c;
|
||||
int i;
|
||||
|
||||
for( i = 0; i < Conf_Channel_Count; i++ )
|
||||
{
|
||||
/* Ist ein Name konfiguriert? */
|
||||
if( ! Conf_Channel[i].name[0] ) continue;
|
||||
|
||||
/* Gueltiger Channel-Name? */
|
||||
if( ! Channel_IsValidName( Conf_Channel[i].name ))
|
||||
{
|
||||
Log( LOG_ERR, "Can't create pre-defined channel: invalid name: \"%s\"!", Conf_Channel[i].name );
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Gibt es den Channel bereits? */
|
||||
chan = Channel_Search( Conf_Channel[i].name );
|
||||
if( chan )
|
||||
{
|
||||
Log( LOG_INFO, "Can't create pre-defined channel \"%s\": name already in use.", Conf_Channel[i].name );
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Channel anlegen */
|
||||
chan = Channel_Create( Conf_Channel[i].name );
|
||||
if( chan )
|
||||
{
|
||||
Channel_ModeAdd( chan, 'P' );
|
||||
Channel_SetTopic( chan, Conf_Channel[i].topic );
|
||||
c = Conf_Channel[i].modes;
|
||||
while( *c ) Channel_ModeAdd( chan, *c++ );
|
||||
Log( LOG_INFO, "Created pre-defined channel \"%s\".", Conf_Channel[i].name );
|
||||
}
|
||||
else Log( LOG_ERR, "Can't create pre-defined channel \"%s\"!", Conf_Channel[i].name );
|
||||
}
|
||||
} /* Channel_InitPredefined */
|
||||
|
||||
|
||||
GLOBAL void
|
||||
Channel_Exit( void )
|
||||
{
|
||||
CHANNEL *c, *c_next;
|
||||
CL2CHAN *cl2chan, *cl2chan_next;
|
||||
@@ -138,7 +139,8 @@ GLOBAL VOID Channel_Exit( VOID )
|
||||
} /* Channel_Exit */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Channel_Join( CLIENT *Client, CHAR *Name )
|
||||
GLOBAL bool
|
||||
Channel_Join( CLIENT *Client, char *Name )
|
||||
{
|
||||
CHANNEL *chan;
|
||||
|
||||
@@ -149,7 +151,7 @@ GLOBAL BOOLEAN Channel_Join( CLIENT *Client, CHAR *Name )
|
||||
if( ! Channel_IsValidName( Name ))
|
||||
{
|
||||
IRC_WriteStrClient( Client, ERR_NOSUCHCHANNEL_MSG, Client_ID( Client ), Name );
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Channel suchen */
|
||||
@@ -157,68 +159,113 @@ GLOBAL BOOLEAN Channel_Join( CLIENT *Client, CHAR *Name )
|
||||
if( chan )
|
||||
{
|
||||
/* Ist der Client bereits Mitglied? */
|
||||
if( Get_Cl2Chan( chan, Client )) return FALSE;
|
||||
if( Get_Cl2Chan( chan, Client )) return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Gibt es noch nicht? Dann neu anlegen: */
|
||||
chan = New_Chan( Name );
|
||||
if( ! chan ) return FALSE;
|
||||
|
||||
/* Verketten */
|
||||
chan->next = My_Channels;
|
||||
My_Channels = chan;
|
||||
chan = Channel_Create( Name );
|
||||
if( ! chan ) return false;
|
||||
}
|
||||
|
||||
/* User dem Channel hinzufuegen */
|
||||
if( ! Add_Client( chan, Client )) return FALSE;
|
||||
else return TRUE;
|
||||
if( ! Add_Client( chan, Client )) return false;
|
||||
else return true;
|
||||
} /* Channel_Join */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Channel_Part( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason )
|
||||
GLOBAL bool
|
||||
Channel_Part( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason )
|
||||
{
|
||||
CHANNEL *chan;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Name != NULL );
|
||||
assert( Reason != NULL );
|
||||
|
||||
/* Channel suchen */
|
||||
chan = Channel_Search( Name );
|
||||
if(( ! chan ) || ( ! Get_Cl2Chan( chan, Client )))
|
||||
{
|
||||
IRC_WriteStrClient( Client, ERR_NOSUCHCHANNEL_MSG, Client_ID( Client ), Name );
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* User aus Channel entfernen */
|
||||
if( ! Remove_Client( chan, Client, Origin, Reason, TRUE )) return FALSE;
|
||||
else return TRUE;
|
||||
if( ! Remove_Client( REMOVE_PART, chan, Client, Origin, Reason, true)) return false;
|
||||
else return true;
|
||||
} /* Channel_Part */
|
||||
|
||||
|
||||
GLOBAL VOID Channel_RemoveClient( CLIENT *Client, CHAR *Reason )
|
||||
GLOBAL void
|
||||
Channel_Kick( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason )
|
||||
{
|
||||
CHANNEL *chan;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Origin != NULL );
|
||||
assert( Name != NULL );
|
||||
assert( Reason != NULL );
|
||||
|
||||
/* Channel suchen */
|
||||
chan = Channel_Search( Name );
|
||||
if( ! chan )
|
||||
{
|
||||
IRC_WriteStrClient( Origin, ERR_NOSUCHCHANNEL_MSG, Client_ID( Origin ), Name );
|
||||
return;
|
||||
}
|
||||
|
||||
/* Ist der User Mitglied in dem Channel? */
|
||||
if( ! Channel_IsMemberOf( chan, Origin ))
|
||||
{
|
||||
IRC_WriteStrClient( Origin, ERR_NOTONCHANNEL_MSG, Client_ID( Origin ), Name );
|
||||
return;
|
||||
}
|
||||
|
||||
/* Ist der User Channel-Operator? */
|
||||
if( ! strchr( Channel_UserModes( chan, Origin ), 'o' ))
|
||||
{
|
||||
IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Name);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Ist der Ziel-User Mitglied im Channel? */
|
||||
if( ! Channel_IsMemberOf( chan, Client ))
|
||||
{
|
||||
IRC_WriteStrClient( Origin, ERR_USERNOTINCHANNEL_MSG, Client_ID( Origin ), Client_ID( Client ), Name );
|
||||
return;
|
||||
}
|
||||
|
||||
Remove_Client( REMOVE_KICK, chan, Client, Origin, Reason, true);
|
||||
} /* Channel_Kick */
|
||||
|
||||
|
||||
GLOBAL void
|
||||
Channel_Quit( CLIENT *Client, char *Reason )
|
||||
{
|
||||
CHANNEL *c, *next_c;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Reason != NULL );
|
||||
|
||||
IRC_WriteStrRelatedPrefix( Client, Client, false, "QUIT :%s", Reason );
|
||||
|
||||
c = My_Channels;
|
||||
while( c )
|
||||
{
|
||||
next_c = c->next;
|
||||
Remove_Client( c, Client, Client_ThisServer( ), Reason, FALSE );
|
||||
Remove_Client( REMOVE_QUIT, c, Client, Client, Reason, false );
|
||||
c = next_c;
|
||||
}
|
||||
} /* Channel_RemoveClient */
|
||||
} /* Channel_Quit */
|
||||
|
||||
|
||||
GLOBAL INT Channel_Count( VOID )
|
||||
GLOBAL long
|
||||
Channel_Count( void )
|
||||
{
|
||||
CHANNEL *c;
|
||||
INT count;
|
||||
long count = 0;
|
||||
|
||||
count = 0;
|
||||
c = My_Channels;
|
||||
while( c )
|
||||
{
|
||||
@@ -229,58 +276,146 @@ GLOBAL INT Channel_Count( VOID )
|
||||
} /* Channel_Count */
|
||||
|
||||
|
||||
GLOBAL CHAR *Channel_Name( CHANNEL *Chan )
|
||||
GLOBAL long
|
||||
Channel_MemberCount( CHANNEL *Chan )
|
||||
{
|
||||
CL2CHAN *cl2chan;
|
||||
long count = 0;
|
||||
|
||||
assert( Chan != NULL );
|
||||
|
||||
cl2chan = My_Cl2Chan;
|
||||
while( cl2chan )
|
||||
{
|
||||
if( cl2chan->channel == Chan ) count++;
|
||||
cl2chan = cl2chan->next;
|
||||
}
|
||||
return count;
|
||||
} /* Channel_MemberCount */
|
||||
|
||||
|
||||
GLOBAL int
|
||||
Channel_CountForUser( CLIENT *Client )
|
||||
{
|
||||
/* Count number of channels a user is member of. */
|
||||
|
||||
CL2CHAN *cl2chan;
|
||||
int count = 0;
|
||||
|
||||
assert( Client != NULL );
|
||||
|
||||
cl2chan = My_Cl2Chan;
|
||||
while( cl2chan )
|
||||
{
|
||||
if( cl2chan->client == Client ) count++;
|
||||
cl2chan = cl2chan->next;
|
||||
}
|
||||
|
||||
return count;
|
||||
} /* Channel_CountForUser */
|
||||
|
||||
|
||||
GLOBAL int
|
||||
Channel_PCount( void )
|
||||
{
|
||||
/* Count the number of persistent (mode 'P') channels */
|
||||
|
||||
CHANNEL *chan;
|
||||
int count = 0;
|
||||
|
||||
chan = My_Channels;
|
||||
while( chan )
|
||||
{
|
||||
if( strchr( chan->modes, 'P' )) count++;
|
||||
chan = chan->next;
|
||||
}
|
||||
|
||||
return count;
|
||||
} /* Channel_PCount */
|
||||
|
||||
|
||||
GLOBAL char *
|
||||
Channel_Name( CHANNEL *Chan )
|
||||
{
|
||||
assert( Chan != NULL );
|
||||
return Chan->name;
|
||||
} /* Channel_Name */
|
||||
|
||||
|
||||
GLOBAL CHAR *Channel_Modes( CHANNEL *Chan )
|
||||
GLOBAL char *
|
||||
Channel_Modes( CHANNEL *Chan )
|
||||
{
|
||||
assert( Chan != NULL );
|
||||
return Chan->modes;
|
||||
} /* Channel_Modes */
|
||||
|
||||
|
||||
GLOBAL CHANNEL *Channel_First( VOID )
|
||||
GLOBAL char *
|
||||
Channel_Key( CHANNEL *Chan )
|
||||
{
|
||||
assert( Chan != NULL );
|
||||
return Chan->key;
|
||||
} /* Channel_Key */
|
||||
|
||||
|
||||
GLOBAL long
|
||||
Channel_MaxUsers( CHANNEL *Chan )
|
||||
{
|
||||
assert( Chan != NULL );
|
||||
return Chan->maxusers;
|
||||
} /* Channel_MaxUsers */
|
||||
|
||||
|
||||
GLOBAL CHANNEL *
|
||||
Channel_First( void )
|
||||
{
|
||||
return My_Channels;
|
||||
} /* Channel_First */
|
||||
|
||||
|
||||
GLOBAL CHANNEL *Channel_Next( CHANNEL *Chan )
|
||||
GLOBAL CHANNEL *
|
||||
Channel_Next( CHANNEL *Chan )
|
||||
{
|
||||
assert( Chan != NULL );
|
||||
return Chan->next;
|
||||
} /* Channel_Next */
|
||||
|
||||
|
||||
GLOBAL CHANNEL *Channel_Search( CHAR *Name )
|
||||
GLOBAL CHANNEL *
|
||||
Channel_Search( char *Name )
|
||||
{
|
||||
/* Channel-Struktur suchen */
|
||||
|
||||
CHANNEL *c;
|
||||
UINT32 search_hash;
|
||||
|
||||
assert( Name != NULL );
|
||||
|
||||
search_hash = Hash( Name );
|
||||
c = My_Channels;
|
||||
while( c )
|
||||
{
|
||||
if( strcasecmp( Name, c->name ) == 0 ) return c;
|
||||
if( search_hash == c->hash )
|
||||
{
|
||||
/* lt. Hash-Wert: Treffer! */
|
||||
if( strcasecmp( Name, c->name ) == 0 ) return c;
|
||||
}
|
||||
c = c->next;
|
||||
}
|
||||
return NULL;
|
||||
} /* Channel_Search */
|
||||
|
||||
|
||||
GLOBAL CL2CHAN *Channel_FirstMember( CHANNEL *Chan )
|
||||
GLOBAL CL2CHAN *
|
||||
Channel_FirstMember( CHANNEL *Chan )
|
||||
{
|
||||
assert( Chan != NULL );
|
||||
return Get_First_Cl2Chan( NULL, Chan );
|
||||
} /* Channel_FirstMember */
|
||||
|
||||
|
||||
GLOBAL CL2CHAN *Channel_NextMember( CHANNEL *Chan, CL2CHAN *Cl2Chan )
|
||||
GLOBAL CL2CHAN *
|
||||
Channel_NextMember( CHANNEL *Chan, CL2CHAN *Cl2Chan )
|
||||
{
|
||||
assert( Chan != NULL );
|
||||
assert( Cl2Chan != NULL );
|
||||
@@ -288,14 +423,16 @@ GLOBAL CL2CHAN *Channel_NextMember( CHANNEL *Chan, CL2CHAN *Cl2Chan )
|
||||
} /* Channel_NextMember */
|
||||
|
||||
|
||||
GLOBAL CL2CHAN *Channel_FirstChannelOf( CLIENT *Client )
|
||||
GLOBAL CL2CHAN *
|
||||
Channel_FirstChannelOf( CLIENT *Client )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
return Get_First_Cl2Chan( Client, NULL );
|
||||
} /* Channel_FirstChannelOf */
|
||||
|
||||
|
||||
GLOBAL CL2CHAN *Channel_NextChannelOf( CLIENT *Client, CL2CHAN *Cl2Chan )
|
||||
GLOBAL CL2CHAN *
|
||||
Channel_NextChannelOf( CLIENT *Client, CL2CHAN *Cl2Chan )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
assert( Cl2Chan != NULL );
|
||||
@@ -303,95 +440,104 @@ GLOBAL CL2CHAN *Channel_NextChannelOf( CLIENT *Client, CL2CHAN *Cl2Chan )
|
||||
} /* Channel_NextChannelOf */
|
||||
|
||||
|
||||
GLOBAL CLIENT *Channel_GetClient( CL2CHAN *Cl2Chan )
|
||||
GLOBAL CLIENT *
|
||||
Channel_GetClient( CL2CHAN *Cl2Chan )
|
||||
{
|
||||
assert( Cl2Chan != NULL );
|
||||
return Cl2Chan->client;
|
||||
} /* Channel_GetClient */
|
||||
|
||||
|
||||
GLOBAL CHANNEL *Channel_GetChannel( CL2CHAN *Cl2Chan )
|
||||
GLOBAL CHANNEL *
|
||||
Channel_GetChannel( CL2CHAN *Cl2Chan )
|
||||
{
|
||||
assert( Cl2Chan != NULL );
|
||||
return Cl2Chan->channel;
|
||||
} /* Channel_GetChannel */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Channel_IsValidName( CHAR *Name )
|
||||
GLOBAL bool
|
||||
Channel_IsValidName( char *Name )
|
||||
{
|
||||
/* Pr<EFBFBD>fen, ob Name als Channelname gueltig */
|
||||
/* Pruefen, ob Name als Channelname gueltig */
|
||||
|
||||
CHAR *ptr, badchars[] = " ,:\x07";
|
||||
char *ptr, badchars[10];
|
||||
|
||||
assert( Name != NULL );
|
||||
|
||||
if(( Name[0] != '#' ) || ( strlen( Name ) >= CHANNEL_NAME_LEN )) return FALSE;
|
||||
if(( Name[0] != '#' ) || ( strlen( Name ) >= CHANNEL_NAME_LEN )) return false;
|
||||
|
||||
ptr = Name;
|
||||
strcpy( badchars, " ,:\007" );
|
||||
while( *ptr )
|
||||
{
|
||||
if( strchr( badchars, *ptr )) return FALSE;
|
||||
if( strchr( badchars, *ptr )) return false;
|
||||
ptr++;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
} /* Channel_IsValidName */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Channel_ModeAdd( CHANNEL *Chan, CHAR Mode )
|
||||
GLOBAL bool
|
||||
Channel_ModeAdd( CHANNEL *Chan, char Mode )
|
||||
{
|
||||
/* Mode soll gesetzt werden. TRUE wird geliefert, wenn der
|
||||
* Mode neu gesetzt wurde, FALSE, wenn der Channel den Mode
|
||||
* bereits hatte. */
|
||||
/* set Mode.
|
||||
* If the channel already had this mode, return false.
|
||||
* If the channel mode was newly set return true.
|
||||
*/
|
||||
|
||||
CHAR x[2];
|
||||
char x[2];
|
||||
|
||||
assert( Chan != NULL );
|
||||
|
||||
x[0] = Mode; x[1] = '\0';
|
||||
if( ! strchr( Chan->modes, x[0] ))
|
||||
{
|
||||
/* Client hat den Mode noch nicht -> setzen */
|
||||
strcat( Chan->modes, x );
|
||||
return TRUE;
|
||||
/* Channel does not have this mode yet, set it */
|
||||
strlcat( Chan->modes, x, sizeof( Chan->modes ));
|
||||
return true;
|
||||
}
|
||||
else return FALSE;
|
||||
else return false;
|
||||
} /* Channel_ModeAdd */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Channel_ModeDel( CHANNEL *Chan, CHAR Mode )
|
||||
GLOBAL bool
|
||||
Channel_ModeDel( CHANNEL *Chan, char Mode )
|
||||
{
|
||||
/* Mode soll geloescht werden. TRUE wird geliefert, wenn der
|
||||
* Mode entfernt wurde, FALSE, wenn der Channel den Mode
|
||||
* ueberhaupt nicht hatte. */
|
||||
|
||||
CHAR x[2], *p;
|
||||
/* Delete mode.
|
||||
* if the mode was removed return true.
|
||||
* if the channel did not have the mode, return false.
|
||||
*/
|
||||
char x[2], *p;
|
||||
|
||||
assert( Chan != NULL );
|
||||
|
||||
x[0] = Mode; x[1] = '\0';
|
||||
|
||||
p = strchr( Chan->modes, x[0] );
|
||||
if( ! p ) return FALSE;
|
||||
if( ! p ) return false;
|
||||
|
||||
/* Client hat den Mode -> loeschen */
|
||||
/* Channel has mode -> delete */
|
||||
while( *p )
|
||||
{
|
||||
*p = *(p + 1);
|
||||
p++;
|
||||
}
|
||||
return TRUE;
|
||||
return true;
|
||||
} /* Channel_ModeDel */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, CHAR Mode )
|
||||
GLOBAL bool
|
||||
Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, char Mode )
|
||||
{
|
||||
/* Channel-User-Mode soll gesetzt werden. TRUE wird geliefert,
|
||||
* wenn der Mode neu gesetzt wurde, FALSE, wenn der User den
|
||||
* Channel-Mode bereits hatte. */
|
||||
/* Set Channel-User-Mode.
|
||||
* if mode was newly set, return true.
|
||||
* if the User already had this channel-mode, return false.
|
||||
*/
|
||||
|
||||
CL2CHAN *cl2chan;
|
||||
CHAR x[2];
|
||||
char x[2];
|
||||
|
||||
assert( Chan != NULL );
|
||||
assert( Client != NULL );
|
||||
@@ -402,22 +548,24 @@ GLOBAL BOOLEAN Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, CHAR Mode )
|
||||
x[0] = Mode; x[1] = '\0';
|
||||
if( ! strchr( cl2chan->modes, x[0] ))
|
||||
{
|
||||
/* Client hat den Mode noch nicht -> setzen */
|
||||
strcat( cl2chan->modes, x );
|
||||
return TRUE;
|
||||
/* mode not set, -> set it */
|
||||
strlcat( cl2chan->modes, x, sizeof( cl2chan->modes ));
|
||||
return true;
|
||||
}
|
||||
else return FALSE;
|
||||
else return false;
|
||||
} /* Channel_UserModeAdd */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, CHAR Mode )
|
||||
GLOBAL bool
|
||||
Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, char Mode )
|
||||
{
|
||||
/* Channel-User-Mode soll geloescht werden. TRUE wird geliefert,
|
||||
* wenn der Mode entfernt wurde, FALSE, wenn der User den Channel-Mode
|
||||
* ueberhaupt nicht hatte. */
|
||||
/* Delete Channel-User-Mode.
|
||||
* If Mode was removed, return true.
|
||||
* If User did not have the Channel-Mode, return false.
|
||||
*/
|
||||
|
||||
CL2CHAN *cl2chan;
|
||||
CHAR x[2], *p;
|
||||
char x[2], *p;
|
||||
|
||||
assert( Chan != NULL );
|
||||
assert( Client != NULL );
|
||||
@@ -428,21 +576,22 @@ GLOBAL BOOLEAN Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, CHAR Mode )
|
||||
x[0] = Mode; x[1] = '\0';
|
||||
|
||||
p = strchr( cl2chan->modes, x[0] );
|
||||
if( ! p ) return FALSE;
|
||||
if( ! p ) return false;
|
||||
|
||||
/* Client hat den Mode -> loeschen */
|
||||
/* Client has Mode -> delete */
|
||||
while( *p )
|
||||
{
|
||||
*p = *(p + 1);
|
||||
p++;
|
||||
}
|
||||
return TRUE;
|
||||
return true;
|
||||
} /* Channel_UserModeDel */
|
||||
|
||||
|
||||
GLOBAL CHAR *Channel_UserModes( CHANNEL *Chan, CLIENT *Client )
|
||||
GLOBAL char *
|
||||
Channel_UserModes( CHANNEL *Chan, CLIENT *Client )
|
||||
{
|
||||
/* Channel-Modes eines Users liefern */
|
||||
/* return Users' Channel-Modes */
|
||||
|
||||
CL2CHAN *cl2chan;
|
||||
|
||||
@@ -456,62 +605,130 @@ GLOBAL CHAR *Channel_UserModes( CHANNEL *Chan, CLIENT *Client )
|
||||
} /* Channel_UserModes */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Channel_IsMemberOf( CHANNEL *Chan, CLIENT *Client )
|
||||
GLOBAL bool
|
||||
Channel_IsMemberOf( CHANNEL *Chan, CLIENT *Client )
|
||||
{
|
||||
/* Pruefen, ob Client Mitglied in Channel ist */
|
||||
/* Test if Client is on Channel Chan */
|
||||
|
||||
assert( Chan != NULL );
|
||||
assert( Client != NULL );
|
||||
|
||||
if( Get_Cl2Chan( Chan, Client )) return TRUE;
|
||||
else return FALSE;
|
||||
if( Get_Cl2Chan( Chan, Client )) return true;
|
||||
else return false;
|
||||
} /* Channel_IsMemberOf */
|
||||
|
||||
|
||||
GLOBAL CHAR *Channel_Topic( CHANNEL *Chan )
|
||||
GLOBAL char *
|
||||
Channel_Topic( CHANNEL *Chan )
|
||||
{
|
||||
assert( Chan != NULL );
|
||||
return Chan->topic;
|
||||
} /* Channel_Topic */
|
||||
|
||||
|
||||
GLOBAL VOID Channel_SetTopic( CHANNEL *Chan, CHAR *Topic )
|
||||
GLOBAL void
|
||||
Channel_SetTopic( CHANNEL *Chan, char *Topic )
|
||||
{
|
||||
assert( Chan != NULL );
|
||||
assert( Topic != NULL );
|
||||
|
||||
strncpy( Chan->topic, Topic, CHANNEL_TOPIC_LEN );
|
||||
Chan->topic[CHANNEL_TOPIC_LEN - 1] = '\0';
|
||||
strlcpy( Chan->topic, Topic, sizeof( Chan->topic ));
|
||||
} /* Channel_SetTopic */
|
||||
|
||||
|
||||
LOCAL CHANNEL *New_Chan( CHAR *Name )
|
||||
GLOBAL void
|
||||
Channel_SetModes( CHANNEL *Chan, char *Modes )
|
||||
{
|
||||
/* Neue Channel-Struktur anlegen */
|
||||
assert( Chan != NULL );
|
||||
assert( Modes != NULL );
|
||||
|
||||
strlcpy( Chan->modes, Modes, sizeof( Chan->modes ));
|
||||
} /* Channel_SetModes */
|
||||
|
||||
|
||||
GLOBAL void
|
||||
Channel_SetKey( CHANNEL *Chan, char *Key )
|
||||
{
|
||||
assert( Chan != NULL );
|
||||
assert( Key != NULL );
|
||||
|
||||
strlcpy( Chan->key, Key, sizeof( Chan->key ));
|
||||
Log( LOG_DEBUG, "Channel %s: Key is now \"%s\".", Chan->name, Chan->key );
|
||||
} /* Channel_SetKey */
|
||||
|
||||
|
||||
GLOBAL void
|
||||
Channel_SetMaxUsers( CHANNEL *Chan, long Count )
|
||||
{
|
||||
assert( Chan != NULL );
|
||||
|
||||
Chan->maxusers = Count;
|
||||
Log( LOG_DEBUG, "Channel %s: Member limit is now %ld.", Chan->name, Chan->maxusers );
|
||||
} /* Channel_SetMaxUsers */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, char *Text )
|
||||
{
|
||||
bool is_member, has_voice, is_op, ok;
|
||||
|
||||
/* Okay, target is a channel */
|
||||
is_member = has_voice = is_op = false;
|
||||
if( Channel_IsMemberOf( Chan, From ))
|
||||
{
|
||||
is_member = true;
|
||||
if( strchr( Channel_UserModes( Chan, From ), 'v' )) has_voice = true;
|
||||
if( strchr( Channel_UserModes( Chan, From ), 'o' )) is_op = true;
|
||||
}
|
||||
|
||||
/* Is the client allowed to write to channel? */
|
||||
ok = true;
|
||||
if( strchr( Channel_Modes( Chan ), 'n' ) && ( ! is_member )) ok = false;
|
||||
if( strchr( Channel_Modes( Chan ), 'm' ) && ( ! is_op ) && ( ! has_voice )) ok = false;
|
||||
|
||||
/* Is the client banned? */
|
||||
if( Lists_CheckBanned( From, Chan ))
|
||||
{
|
||||
/* Client is banned, bus is he channel operator or has voice? */
|
||||
if(( ! has_voice ) && ( ! is_op )) ok = false;
|
||||
}
|
||||
|
||||
if( ! ok ) return IRC_WriteStrClient( From, ERR_CANNOTSENDTOCHAN_MSG, Client_ID( From ), Channel_Name( Chan ));
|
||||
|
||||
/* Send text */
|
||||
if( Client_Conn( From ) > NONE ) Conn_UpdateIdle( Client_Conn( From ));
|
||||
return IRC_WriteStrChannelPrefix( Client, Chan, From, true, "PRIVMSG %s :%s", Channel_Name( Chan ), Text );
|
||||
} /* Channel_Write */
|
||||
|
||||
|
||||
GLOBAL CHANNEL *
|
||||
Channel_Create( char *Name )
|
||||
{
|
||||
/* Create new CHANNEL structure and add it to linked list */
|
||||
CHANNEL *c;
|
||||
|
||||
assert( Name != NULL );
|
||||
|
||||
c = malloc( sizeof( CHANNEL ));
|
||||
c = (CHANNEL *)malloc( sizeof( CHANNEL ));
|
||||
if( ! c )
|
||||
{
|
||||
Log( LOG_EMERG, "Can't allocate memory!" );
|
||||
Log( LOG_EMERG, "Can't allocate memory! [New_Chan]" );
|
||||
return NULL;
|
||||
}
|
||||
c->next = NULL;
|
||||
strncpy( c->name, Name, CHANNEL_NAME_LEN );
|
||||
c->name[CHANNEL_NAME_LEN - 1] = '\0';
|
||||
strcpy( c->modes, "" );
|
||||
strcpy( c->topic, "" );
|
||||
|
||||
memset( c, 0, sizeof( CHANNEL ));
|
||||
strlcpy( c->name, Name, sizeof( c->name ));
|
||||
c->hash = Hash( c->name );
|
||||
c->next = My_Channels;
|
||||
My_Channels = c;
|
||||
|
||||
Log( LOG_DEBUG, "Created new channel structure for \"%s\".", Name );
|
||||
|
||||
return c;
|
||||
} /* New_Chan */
|
||||
} /* Channel_Create */
|
||||
|
||||
|
||||
LOCAL CL2CHAN *Get_Cl2Chan( CHANNEL *Chan, CLIENT *Client )
|
||||
LOCAL CL2CHAN *
|
||||
Get_Cl2Chan( CHANNEL *Chan, CLIENT *Client )
|
||||
{
|
||||
CL2CHAN *cl2chan;
|
||||
|
||||
@@ -528,7 +745,8 @@ LOCAL CL2CHAN *Get_Cl2Chan( CHANNEL *Chan, CLIENT *Client )
|
||||
} /* Get_Cl2Chan */
|
||||
|
||||
|
||||
LOCAL CL2CHAN *Add_Client( CHANNEL *Chan, CLIENT *Client )
|
||||
LOCAL CL2CHAN *
|
||||
Add_Client( CHANNEL *Chan, CLIENT *Client )
|
||||
{
|
||||
CL2CHAN *cl2chan;
|
||||
|
||||
@@ -536,10 +754,10 @@ LOCAL CL2CHAN *Add_Client( CHANNEL *Chan, CLIENT *Client )
|
||||
assert( Client != NULL );
|
||||
|
||||
/* neue CL2CHAN-Struktur anlegen */
|
||||
cl2chan = malloc( sizeof( CL2CHAN ));
|
||||
cl2chan = (CL2CHAN *)malloc( sizeof( CL2CHAN ));
|
||||
if( ! cl2chan )
|
||||
{
|
||||
Log( LOG_EMERG, "Can't allocate memory!" );
|
||||
Log( LOG_EMERG, "Can't allocate memory! [Add_Client]" );
|
||||
return NULL;
|
||||
}
|
||||
cl2chan->channel = Chan;
|
||||
@@ -556,7 +774,8 @@ LOCAL CL2CHAN *Add_Client( CHANNEL *Chan, CLIENT *Client )
|
||||
} /* Add_Client */
|
||||
|
||||
|
||||
LOCAL BOOLEAN Remove_Client( CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Reason, BOOLEAN ServerPART )
|
||||
LOCAL bool
|
||||
Remove_Client( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Reason, bool InformServer )
|
||||
{
|
||||
CL2CHAN *cl2chan, *last_cl2chan;
|
||||
CHANNEL *c;
|
||||
@@ -574,7 +793,7 @@ LOCAL BOOLEAN Remove_Client( CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR
|
||||
last_cl2chan = cl2chan;
|
||||
cl2chan = cl2chan->next;
|
||||
}
|
||||
if( ! cl2chan ) return FALSE;
|
||||
if( ! cl2chan ) return false;
|
||||
|
||||
c = cl2chan->channel;
|
||||
assert( c != NULL );
|
||||
@@ -584,26 +803,49 @@ LOCAL BOOLEAN Remove_Client( CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR
|
||||
else My_Cl2Chan = cl2chan->next;
|
||||
free( cl2chan );
|
||||
|
||||
if( ServerPART ) IRC_WriteStrServersPrefix( Origin, Client, "PART %s :%s", c->name, Reason );
|
||||
IRC_WriteStrChannelPrefix( Origin, c, Client, FALSE, "PART %s :%s", c->name, Reason );
|
||||
if(( Client_Conn( Origin ) > NONE ) && ( Client_Type( Origin ) == CLIENT_USER )) IRC_WriteStrClientPrefix( Origin, Client, "PART %s :%s", c->name, Reason );
|
||||
switch( Type )
|
||||
{
|
||||
case REMOVE_QUIT:
|
||||
/* QUIT: andere Server wurden bereits informiert, vgl. Client_Destroy();
|
||||
* hier also "nur" noch alle User in betroffenen Channeln infomieren */
|
||||
assert( InformServer == false );
|
||||
Log( LOG_DEBUG, "User \"%s\" left channel \"%s\" (%s).", Client_Mask( Client ), c->name, Reason );
|
||||
break;
|
||||
case REMOVE_KICK:
|
||||
/* User wurde geKICKed: ggf. andere Server sowie alle betroffenen User
|
||||
* im entsprechenden Channel informieren */
|
||||
if( InformServer ) IRC_WriteStrServersPrefix( Client_NextHop( Origin ), Origin, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason );
|
||||
IRC_WriteStrChannelPrefix( Client, c, Origin, false, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason );
|
||||
if(( Client_Conn( Client ) > NONE ) && ( Client_Type( Client ) == CLIENT_USER )) IRC_WriteStrClientPrefix( Client, Origin, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason );
|
||||
Log( LOG_DEBUG, "User \"%s\" has been kicked of \"%s\" by \"%s\": %s.", Client_Mask( Client ), c->name, Client_ID( Origin ), Reason );
|
||||
break;
|
||||
default:
|
||||
/* PART */
|
||||
if( InformServer ) IRC_WriteStrServersPrefix( Origin, Client, "PART %s :%s", c->name, Reason );
|
||||
IRC_WriteStrChannelPrefix( Origin, c, Client, false, "PART %s :%s", c->name, Reason );
|
||||
if(( Client_Conn( Origin ) > NONE ) && ( Client_Type( Origin ) == CLIENT_USER )) IRC_WriteStrClientPrefix( Origin, Client, "PART %s :%s", c->name, Reason );
|
||||
Log( LOG_DEBUG, "User \"%s\" left channel \"%s\" (%s).", Client_Mask( Client ), c->name, Reason );
|
||||
}
|
||||
|
||||
Log( LOG_DEBUG, "User \"%s\" left channel \"%s\" (%s).", Client_Mask( Client ), c->name, Reason );
|
||||
|
||||
/* Wenn Channel nun leer: loeschen */
|
||||
if( ! Get_First_Cl2Chan( NULL, Chan )) Delete_Channel( Chan );
|
||||
/* Wenn Channel nun leer und nicht pre-defined: loeschen */
|
||||
if( ! strchr( Channel_Modes( Chan ), 'P' ))
|
||||
{
|
||||
if( ! Get_First_Cl2Chan( NULL, Chan )) Delete_Channel( Chan );
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
} /* Remove_Client */
|
||||
|
||||
|
||||
LOCAL CL2CHAN *Get_First_Cl2Chan( CLIENT *Client, CHANNEL *Chan )
|
||||
LOCAL CL2CHAN *
|
||||
Get_First_Cl2Chan( CLIENT *Client, CHANNEL *Chan )
|
||||
{
|
||||
return Get_Next_Cl2Chan( My_Cl2Chan, Client, Chan );
|
||||
} /* Get_First_Cl2Chan */
|
||||
|
||||
|
||||
LOCAL CL2CHAN *Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Channel )
|
||||
LOCAL CL2CHAN *
|
||||
Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Channel )
|
||||
{
|
||||
CL2CHAN *cl2chan;
|
||||
|
||||
@@ -620,7 +862,8 @@ LOCAL CL2CHAN *Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Channe
|
||||
} /* Get_Next_Cl2Chan */
|
||||
|
||||
|
||||
LOCAL BOOLEAN Delete_Channel( CHANNEL *Chan )
|
||||
LOCAL bool
|
||||
Delete_Channel( CHANNEL *Chan )
|
||||
{
|
||||
/* Channel-Struktur loeschen */
|
||||
|
||||
@@ -634,16 +877,19 @@ LOCAL BOOLEAN Delete_Channel( CHANNEL *Chan )
|
||||
last_chan = chan;
|
||||
chan = chan->next;
|
||||
}
|
||||
if( ! chan ) return FALSE;
|
||||
if( ! chan ) return false;
|
||||
|
||||
Log( LOG_DEBUG, "Freed channel structure for \"%s\".", Chan->name );
|
||||
|
||||
/* Invite- und Ban-Lists aufraeumen */
|
||||
Lists_DeleteChannel( chan );
|
||||
|
||||
/* Neu verketten und freigeben */
|
||||
if( last_chan ) last_chan->next = chan->next;
|
||||
else My_Channels = chan->next;
|
||||
free( chan );
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
} /* Delete_Channel */
|
||||
|
||||
|
||||
|
||||
@@ -2,78 +2,35 @@
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: channel.h,v 1.13 2002/02/27 20:32:10 alex Exp $
|
||||
* $Id: channel.h,v 1.27 2005/03/19 18:43:48 fw Exp $
|
||||
*
|
||||
* channel.h: Management der Channels (Header)
|
||||
*
|
||||
* $Log: channel.h,v $
|
||||
* Revision 1.13 2002/02/27 20:32:10 alex
|
||||
* - neue Funktionen Channel_Topic() und Channel_SetTopic().
|
||||
*
|
||||
* Revision 1.12 2002/02/27 15:21:21 alex
|
||||
* - neue Funktion Channel_IsMemberOf() implementiert.
|
||||
*
|
||||
* Revision 1.11 2002/02/11 01:00:22 alex
|
||||
* - neue Funktionen Channel_ModeAdd(), Channel_ModeDel(), Channel_UserModes(),
|
||||
* Channel_UserModeAdd(), Channel_UserModeDel().
|
||||
*
|
||||
* Revision 1.10 2002/02/06 16:49:10 alex
|
||||
* - neue Funktionen Channel_Modes() und Channel_IsValidName().
|
||||
*
|
||||
* Revision 1.9 2002/01/29 00:11:19 alex
|
||||
* - neue Funktionen Channel_FirstChannelOf() und Channel_NextChannelOf().
|
||||
*
|
||||
* Revision 1.8 2002/01/28 01:16:15 alex
|
||||
* - neue Funktionen Channel_Name(), Channel_First() und Channel_Next().
|
||||
*
|
||||
* Revision 1.7 2002/01/26 18:41:55 alex
|
||||
* - CHANNEL- und CL2CHAN-Strukturen in Header verlegt,
|
||||
* - einige neue Funktionen (Channel_GetChannel(), Channel_FirstMember(), ...)
|
||||
*
|
||||
* Revision 1.6 2002/01/21 00:11:59 alex
|
||||
* - Definition der CHANNEL-Struktur aus Header entfernt,
|
||||
* - neue Funktionen Channel_Join(), Channel_Part() und Channel_RemoveClient().
|
||||
*
|
||||
* Revision 1.5 2002/01/16 22:09:07 alex
|
||||
* - neue Funktion Channel_Count().
|
||||
*
|
||||
* Revision 1.4 2002/01/02 02:42:58 alex
|
||||
* - Copyright-Texte aktualisiert.
|
||||
*
|
||||
* Revision 1.3 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.2 2001/12/23 21:54:30 alex
|
||||
* - Konstanten um Prefix "CHANNEL_" erweitert.
|
||||
*
|
||||
* Revision 1.1 2001/12/14 08:13:43 alex
|
||||
* - neues Modul begonnen :-)
|
||||
* Channel management (header)
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __channel_h__
|
||||
#define __channel_h__
|
||||
|
||||
#include "client.h"
|
||||
|
||||
#if defined(__channel_c__) | defined(S_SPLINT_S)
|
||||
|
||||
#ifdef __channel_c__
|
||||
#include "defines.h"
|
||||
|
||||
typedef struct _CHANNEL
|
||||
{
|
||||
struct _CHANNEL *next;
|
||||
CHAR name[CHANNEL_NAME_LEN]; /* Name des Channel */
|
||||
CHAR modes[CHANNEL_MODE_LEN]; /* Channel-Modes */
|
||||
CHAR topic[CHANNEL_TOPIC_LEN]; /* Topic des Channels */
|
||||
char name[CHANNEL_NAME_LEN]; /* Name of the channel */
|
||||
UINT32 hash; /* Hash of the (lowecase!) name */
|
||||
char modes[CHANNEL_MODE_LEN]; /* Channel modes */
|
||||
char topic[CHANNEL_TOPIC_LEN]; /* Topic of the channel */
|
||||
char key[CLIENT_PASS_LEN]; /* Channel key ("password", mode "k" ) */
|
||||
long maxusers; /* Maximum number of members (mode "l") */
|
||||
} CHANNEL;
|
||||
|
||||
typedef struct _CLIENT2CHAN
|
||||
@@ -81,7 +38,7 @@ typedef struct _CLIENT2CHAN
|
||||
struct _CLIENT2CHAN *next;
|
||||
CLIENT *client;
|
||||
CHANNEL *channel;
|
||||
CHAR modes[CHANNEL_MODE_LEN]; /* User-Modes in dem Channel */
|
||||
char modes[CHANNEL_MODE_LEN]; /* User-Modes in dem Channel */
|
||||
} CL2CHAN;
|
||||
|
||||
#else
|
||||
@@ -92,45 +49,60 @@ typedef POINTER CL2CHAN;
|
||||
#endif
|
||||
|
||||
|
||||
GLOBAL VOID Channel_Init( VOID );
|
||||
GLOBAL VOID Channel_Exit( VOID );
|
||||
GLOBAL void Channel_Init PARAMS(( void ));
|
||||
GLOBAL void Channel_InitPredefined PARAMS(( void ));
|
||||
GLOBAL void Channel_Exit PARAMS(( void ));
|
||||
|
||||
GLOBAL BOOLEAN Channel_Join( CLIENT *Client, CHAR *Name );
|
||||
GLOBAL BOOLEAN Channel_Part( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason );
|
||||
GLOBAL bool Channel_Join PARAMS(( CLIENT *Client, char *Name ));
|
||||
GLOBAL bool Channel_Part PARAMS(( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason ));
|
||||
|
||||
GLOBAL VOID Channel_RemoveClient( CLIENT *Client, CHAR *Reason );
|
||||
GLOBAL void Channel_Quit PARAMS(( CLIENT *Client, char *Reason ));
|
||||
|
||||
GLOBAL INT Channel_Count( VOID );
|
||||
GLOBAL void Channel_Kick PARAMS(( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason ));
|
||||
|
||||
GLOBAL CHAR *Channel_Name( CHANNEL *Chan );
|
||||
GLOBAL CHAR *Channel_Modes( CHANNEL *Chan );
|
||||
GLOBAL CHAR *Channel_Topic( CHANNEL *Chan );
|
||||
GLOBAL long Channel_Count PARAMS(( void ));
|
||||
GLOBAL long Channel_MemberCount PARAMS(( CHANNEL *Chan ));
|
||||
GLOBAL int Channel_CountForUser PARAMS(( CLIENT *Client ));
|
||||
GLOBAL int Channel_PCount PARAMS(( void ));
|
||||
|
||||
GLOBAL VOID Channel_SetTopic( CHANNEL *Chan, CHAR *Topic );
|
||||
GLOBAL char *Channel_Name PARAMS(( CHANNEL *Chan ));
|
||||
GLOBAL char *Channel_Modes PARAMS(( CHANNEL *Chan ));
|
||||
GLOBAL char *Channel_Topic PARAMS(( CHANNEL *Chan ));
|
||||
GLOBAL char *Channel_Key PARAMS(( CHANNEL *Chan ));
|
||||
GLOBAL long Channel_MaxUsers PARAMS(( CHANNEL *Chan ));
|
||||
|
||||
GLOBAL CHANNEL *Channel_Search( CHAR *Name );
|
||||
GLOBAL void Channel_SetTopic PARAMS(( CHANNEL *Chan, char *Topic ));
|
||||
GLOBAL void Channel_SetModes PARAMS(( CHANNEL *Chan, char *Modes ));
|
||||
GLOBAL void Channel_SetKey PARAMS(( CHANNEL *Chan, char *Key ));
|
||||
GLOBAL void Channel_SetMaxUsers PARAMS(( CHANNEL *Chan, long Count ));
|
||||
|
||||
GLOBAL CHANNEL *Channel_First( VOID );
|
||||
GLOBAL CHANNEL *Channel_Next( CHANNEL *Chan );
|
||||
GLOBAL CHANNEL *Channel_Search PARAMS(( char *Name ));
|
||||
|
||||
GLOBAL CL2CHAN *Channel_FirstMember( CHANNEL *Chan );
|
||||
GLOBAL CL2CHAN *Channel_NextMember( CHANNEL *Chan, CL2CHAN *Cl2Chan );
|
||||
GLOBAL CL2CHAN *Channel_FirstChannelOf( CLIENT *Client );
|
||||
GLOBAL CL2CHAN *Channel_NextChannelOf( CLIENT *Client, CL2CHAN *Cl2Chan );
|
||||
GLOBAL CHANNEL *Channel_First PARAMS(( void ));
|
||||
GLOBAL CHANNEL *Channel_Next PARAMS(( CHANNEL *Chan ));
|
||||
|
||||
GLOBAL CLIENT *Channel_GetClient( CL2CHAN *Cl2Chan );
|
||||
GLOBAL CHANNEL *Channel_GetChannel( CL2CHAN *Cl2Chan );
|
||||
GLOBAL CL2CHAN *Channel_FirstMember PARAMS(( CHANNEL *Chan ));
|
||||
GLOBAL CL2CHAN *Channel_NextMember PARAMS(( CHANNEL *Chan, CL2CHAN *Cl2Chan ));
|
||||
GLOBAL CL2CHAN *Channel_FirstChannelOf PARAMS(( CLIENT *Client ));
|
||||
GLOBAL CL2CHAN *Channel_NextChannelOf PARAMS(( CLIENT *Client, CL2CHAN *Cl2Chan ));
|
||||
|
||||
GLOBAL BOOLEAN Channel_IsValidName( CHAR *Name );
|
||||
GLOBAL CLIENT *Channel_GetClient PARAMS(( CL2CHAN *Cl2Chan ));
|
||||
GLOBAL CHANNEL *Channel_GetChannel PARAMS(( CL2CHAN *Cl2Chan ));
|
||||
|
||||
GLOBAL BOOLEAN Channel_ModeAdd( CHANNEL *Chan, CHAR Mode );
|
||||
GLOBAL BOOLEAN Channel_ModeDel( CHANNEL *Chan, CHAR Mode );
|
||||
GLOBAL bool Channel_IsValidName PARAMS(( char *Name ));
|
||||
|
||||
GLOBAL BOOLEAN Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, CHAR Mode );
|
||||
GLOBAL BOOLEAN Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, CHAR Mode );
|
||||
GLOBAL CHAR *Channel_UserModes( CHANNEL *Chan, CLIENT *Client );
|
||||
GLOBAL bool Channel_ModeAdd PARAMS(( CHANNEL *Chan, char Mode ));
|
||||
GLOBAL bool Channel_ModeDel PARAMS(( CHANNEL *Chan, char Mode ));
|
||||
|
||||
GLOBAL BOOLEAN Channel_IsMemberOf( CHANNEL *Chan, CLIENT *Client );
|
||||
GLOBAL bool Channel_UserModeAdd PARAMS(( CHANNEL *Chan, CLIENT *Client, char Mode ));
|
||||
GLOBAL bool Channel_UserModeDel PARAMS(( CHANNEL *Chan, CLIENT *Client, char Mode ));
|
||||
GLOBAL char *Channel_UserModes PARAMS(( CHANNEL *Chan, CLIENT *Client ));
|
||||
|
||||
GLOBAL bool Channel_IsMemberOf PARAMS(( CHANNEL *Chan, CLIENT *Client ));
|
||||
|
||||
GLOBAL bool Channel_Write PARAMS(( CHANNEL *Chan, CLIENT *From, CLIENT *Client, char *Text ));
|
||||
|
||||
GLOBAL CHANNEL *Channel_Create PARAMS(( char *Name ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -2,208 +2,157 @@
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: client.h,v 1.23 2002/02/27 18:22:09 alex Exp $
|
||||
* $Id: client.h,v 1.39 2005/06/12 16:18:49 alex Exp $
|
||||
*
|
||||
* client.h: Konfiguration des ngircd (Header)
|
||||
*
|
||||
* $Log: client.h,v $
|
||||
* Revision 1.23 2002/02/27 18:22:09 alex
|
||||
* - neue Funktion Client_SetAway() und Client_Away() implementiert.
|
||||
*
|
||||
* Revision 1.22 2002/02/06 16:49:56 alex
|
||||
* - neue Funktion Client_IsValidNick().
|
||||
*
|
||||
* Revision 1.21 2002/01/29 00:14:49 alex
|
||||
* - neue Funktion Client_TopServer(), Client_NewXXX() angepasst.
|
||||
*
|
||||
* Revision 1.20 2002/01/21 00:06:49 alex
|
||||
* - Channel-Pointer aus Client-Struktur entfernt. Wird nun dynamisch verwaltet :-)
|
||||
*
|
||||
* Revision 1.19 2002/01/16 22:10:35 alex
|
||||
* - neue Funktionen Client_xxxCount().
|
||||
*
|
||||
* Revision 1.18 2002/01/07 23:42:12 alex
|
||||
* - Es werden fuer alle Server eigene Token generiert,
|
||||
* - QUIT von einem Server fuer einen User wird an andere Server geforwarded,
|
||||
* - ebenso NICK-Befehle, die "fremde" User einfuehren.
|
||||
*
|
||||
* Revision 1.17 2002/01/06 15:18:14 alex
|
||||
* - Loglevel und Meldungen nochmals geaendert. Level passen nun besser.
|
||||
*
|
||||
* Revision 1.16 2002/01/05 23:26:05 alex
|
||||
* - Vorbereitungen fuer Ident-Abfragen in Client-Strukturen.
|
||||
*
|
||||
* Revision 1.15 2002/01/05 20:08:17 alex
|
||||
* - neue Funktion Client_NextHop().
|
||||
*
|
||||
* Revision 1.14 2002/01/04 01:21:22 alex
|
||||
* - Client-Strukturen koennen von anderen Modulen nun nur noch ueber die
|
||||
* enstprechenden (zum Teil neuen) Funktionen angesprochen werden.
|
||||
*
|
||||
* Revision 1.13 2002/01/03 02:28:06 alex
|
||||
* - neue Funktion Client_CheckID(), diverse Aenderungen fuer Server-Links.
|
||||
*
|
||||
* Revision 1.12 2002/01/02 02:42:58 alex
|
||||
* - Copyright-Texte aktualisiert.
|
||||
*
|
||||
* Revision 1.11 2001/12/31 15:33:13 alex
|
||||
* - neuer Befehl NAMES, kleinere Bugfixes.
|
||||
* - Bug bei PING behoben: war zu restriktiv implementiert :-)
|
||||
*
|
||||
* Revision 1.10 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.9 2001/12/29 20:18:18 alex
|
||||
* - neue Funktion Client_SetHostname().
|
||||
*
|
||||
* Revision 1.8 2001/12/29 03:10:47 alex
|
||||
* - Client-Modes implementiert; Loglevel mal wieder angepasst.
|
||||
*
|
||||
* Revision 1.7 2001/12/27 19:13:47 alex
|
||||
* - neue Funktion Client_Search(), besseres Logging.
|
||||
*
|
||||
* Revision 1.6 2001/12/27 16:54:51 alex
|
||||
* - neue Funktion Client_GetID(), liefert die "Client ID".
|
||||
*
|
||||
* Revision 1.5 2001/12/26 14:45:37 alex
|
||||
* - "Code Cleanups".
|
||||
*
|
||||
* Revision 1.4 2001/12/26 03:19:16 alex
|
||||
* - neue Funktion Client_Nick().
|
||||
*
|
||||
* Revision 1.3 2001/12/25 19:21:26 alex
|
||||
* - Client-Typ ("Status") besser unterteilt, My_Clients ist zudem nun global.
|
||||
*
|
||||
* Revision 1.2 2001/12/23 22:03:47 alex
|
||||
* - einige neue Funktionen,
|
||||
* - Konstanten um "CLIENT_"-Prefix erweitert.
|
||||
*
|
||||
* Revision 1.1 2001/12/14 08:13:43 alex
|
||||
* - neues Modul begonnen :-)
|
||||
* Client management (header)
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __client_h__
|
||||
#define __client_h__
|
||||
|
||||
#include "conn.h"
|
||||
|
||||
#define CLIENT_UNKNOWN 1 /* connection of unknown type */
|
||||
#define CLIENT_GOTPASS 2 /* client did send PASS */
|
||||
#define CLIENT_GOTNICK 4 /* client did send NICK */
|
||||
#define CLIENT_GOTUSER 8 /* client did send USER */
|
||||
#define CLIENT_USER 16 /* client is an IRC user */
|
||||
#define CLIENT_UNKNOWNSERVER 32 /* unregistered server connection */
|
||||
#define CLIENT_GOTPASSSERVER 64 /* client did send PASS in "server style" */
|
||||
#define CLIENT_SERVER 128 /* client is a server */
|
||||
#define CLIENT_SERVICE 256 /* client is a service */
|
||||
|
||||
#define CLIENT_TYPE int
|
||||
|
||||
|
||||
typedef enum
|
||||
{
|
||||
CLIENT_UNKNOWN, /* Verbindung mit (noch) unbekanntem Typ */
|
||||
CLIENT_GOTPASS, /* Client hat PASS gesendet */
|
||||
CLIENT_GOTNICK, /* Client hat NICK gesendet */
|
||||
CLIENT_GOTUSER, /* Client hat USER gesendet */
|
||||
CLIENT_USER, /* Client ist ein Benutzer (USER wurde gesendet) */
|
||||
CLIENT_UNKNOWNSERVER, /* unregistrierte Server-Verbindung */
|
||||
CLIENT_GOTPASSSERVER, /* Client hat PASS nach "Server-Art" gesendet */
|
||||
CLIENT_SERVER, /* Client ist ein Server */
|
||||
CLIENT_SERVICE /* Client ist ein Service */
|
||||
} CLIENT_TYPE;
|
||||
#if defined(__client_c__) | defined(S_SPLINT_S)
|
||||
|
||||
|
||||
#ifdef __client_c__
|
||||
typedef struct _CLIENT
|
||||
{
|
||||
CHAR id[CLIENT_ID_LEN]; /* Nick (User) bzw. ID (Server) */
|
||||
POINTER *next; /* Zeiger auf naechste Client-Struktur */
|
||||
CLIENT_TYPE type; /* Typ des Client, vgl. CLIENT_TYPE */
|
||||
CONN_ID conn_id; /* ID der Connection (wenn lokal) bzw. NONE (remote) */
|
||||
struct _CLIENT *introducer; /* ID des Servers, der die Verbindung hat */
|
||||
struct _CLIENT *topserver; /* Toplevel-Servers (nur gueltig, wenn Client ein Server ist) */
|
||||
CHAR pwd[CLIENT_PASS_LEN]; /* Passwort, welches der Client angegeben hat */
|
||||
CHAR host[CLIENT_HOST_LEN]; /* Hostname des Client */
|
||||
CHAR user[CLIENT_USER_LEN]; /* Benutzername ("Login") */
|
||||
CHAR info[CLIENT_INFO_LEN]; /* Langer Benutzername (User) bzw. Infotext (Server) */
|
||||
CHAR modes[CLIENT_MODE_LEN]; /* Client Modes */
|
||||
INT hops, token, mytoken; /* "Hops" und "Token" (-> SERVER-Befehl) */
|
||||
BOOLEAN oper_by_me; /* IRC-Operator-Status durch diesen Server? */
|
||||
CHAR away[CLIENT_AWAY_LEN]; /* AWAY-Text, wenn Mode 'a' gesetzt */
|
||||
time_t starttime; /* Start time of link */
|
||||
char id[CLIENT_ID_LEN]; /* nick (user) / ID (server) */
|
||||
UINT32 hash; /* hash of lower-case ID */
|
||||
POINTER *next; /* pointer to next client structure */
|
||||
CLIENT_TYPE type; /* type of client, see CLIENT_xxx */
|
||||
CONN_ID conn_id; /* ID of the connection (if local) or NONE (remote) */
|
||||
struct _CLIENT *introducer; /* ID of the servers which the client is connected to */
|
||||
struct _CLIENT *topserver; /* toplevel servers (only valid if client is a server) */
|
||||
char pwd[CLIENT_PASS_LEN]; /* password received of the client */
|
||||
char host[CLIENT_HOST_LEN]; /* hostname of the client */
|
||||
char user[CLIENT_USER_LEN]; /* user name ("login") */
|
||||
char info[CLIENT_INFO_LEN]; /* long user name (user) / info text (server) */
|
||||
char modes[CLIENT_MODE_LEN]; /* client modes */
|
||||
int hops, token, mytoken; /* "hops" and "Token" (see SERVER command) */
|
||||
bool oper_by_me; /* client is local IRC operator on this server? */
|
||||
char away[CLIENT_AWAY_LEN]; /* AWAY text (valid if mode 'a' is set) */
|
||||
char flags[CLIENT_FLAGS_LEN]; /* flags of the client */
|
||||
} CLIENT;
|
||||
|
||||
#else
|
||||
|
||||
typedef POINTER CLIENT;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
GLOBAL VOID Client_Init( VOID );
|
||||
GLOBAL VOID Client_Exit( VOID );
|
||||
typedef struct _WHOWAS
|
||||
{
|
||||
time_t time; /* time stamp of entry or 0 if unused */
|
||||
char id[CLIENT_NICK_LEN]; /* client nick name */
|
||||
char host[CLIENT_HOST_LEN]; /* hostname of the client */
|
||||
char user[CLIENT_USER_LEN]; /* user name ("login") */
|
||||
char info[CLIENT_INFO_LEN]; /* long user name */
|
||||
char server[CLIENT_HOST_LEN]; /* server name */
|
||||
} WHOWAS;
|
||||
|
||||
GLOBAL CLIENT *Client_NewLocal( CONN_ID Idx, CHAR *Hostname, INT Type, BOOLEAN Idented );
|
||||
GLOBAL CLIENT *Client_NewRemoteServer( CLIENT *Introducer, CHAR *Hostname, CLIENT *TopServer, INT Hops, INT Token, CHAR *Info, BOOLEAN Idented );
|
||||
GLOBAL CLIENT *Client_NewRemoteUser( CLIENT *Introducer, CHAR *Nick, INT Hops, CHAR *User, CHAR *Hostname, INT Token, CHAR *Modes, CHAR *Info, BOOLEAN Idented );
|
||||
GLOBAL CLIENT *Client_New( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, INT Type, CHAR *ID, CHAR *User, CHAR *Hostname, CHAR *Info, INT Hops, INT Token, CHAR *Modes, BOOLEAN Idented );
|
||||
|
||||
GLOBAL VOID Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg );
|
||||
GLOBAL void Client_Init PARAMS(( void ));
|
||||
GLOBAL void Client_Exit PARAMS(( void ));
|
||||
|
||||
GLOBAL CLIENT *Client_ThisServer( VOID );
|
||||
GLOBAL CLIENT *Client_NewLocal PARAMS(( CONN_ID Idx, char *Hostname, int Type, bool Idented ));
|
||||
GLOBAL CLIENT *Client_NewRemoteServer PARAMS(( CLIENT *Introducer, char *Hostname, CLIENT *TopServer, int Hops, int Token, char *Info, bool Idented ));
|
||||
GLOBAL CLIENT *Client_NewRemoteUser PARAMS(( CLIENT *Introducer, char *Nick, int Hops, char *User, char *Hostname, int Token, char *Modes, char *Info, bool Idented ));
|
||||
GLOBAL CLIENT *Client_New PARAMS(( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, int Type, char *ID, char *User, char *Hostname, char *Info, int Hops, int Token, char *Modes, bool Idented ));
|
||||
|
||||
GLOBAL CLIENT *Client_GetFromConn( CONN_ID Idx );
|
||||
GLOBAL CLIENT *Client_GetFromID( CHAR *Nick );
|
||||
GLOBAL CLIENT *Client_GetFromToken( CLIENT *Client, INT Token );
|
||||
GLOBAL void Client_Destroy PARAMS(( CLIENT *Client, char *LogMsg, char *FwdMsg, bool SendQuit ));
|
||||
#ifdef CONN_MODULE
|
||||
GLOBAL void Client_DestroyNow PARAMS(( CLIENT *Client ));
|
||||
#endif
|
||||
|
||||
GLOBAL CLIENT *Client_Search( CHAR *ID );
|
||||
GLOBAL CLIENT *Client_First( VOID );
|
||||
GLOBAL CLIENT *Client_Next( CLIENT *c );
|
||||
GLOBAL CLIENT *Client_ThisServer PARAMS(( void ));
|
||||
|
||||
GLOBAL INT Client_Type( CLIENT *Client );
|
||||
GLOBAL CONN_ID Client_Conn( CLIENT *Client );
|
||||
GLOBAL CHAR *Client_ID( CLIENT *Client );
|
||||
GLOBAL CHAR *Client_Mask( CLIENT *Client );
|
||||
GLOBAL CHAR *Client_Info( CLIENT *Client );
|
||||
GLOBAL CHAR *Client_User( CLIENT *Client );
|
||||
GLOBAL CHAR *Client_Hostname( CLIENT *Client );
|
||||
GLOBAL CHAR *Client_Password( CLIENT *Client );
|
||||
GLOBAL CHAR *Client_Modes( CLIENT *Client );
|
||||
GLOBAL CLIENT *Client_Introducer( CLIENT *Client );
|
||||
GLOBAL BOOLEAN Client_OperByMe( CLIENT *Client );
|
||||
GLOBAL INT Client_Hops( CLIENT *Client );
|
||||
GLOBAL INT Client_Token( CLIENT *Client );
|
||||
GLOBAL INT Client_MyToken( CLIENT *Client );
|
||||
GLOBAL CLIENT *Client_TopServer( CLIENT *Client );
|
||||
GLOBAL CLIENT *Client_NextHop( CLIENT *Client );
|
||||
GLOBAL CHAR *Client_Away( CLIENT *Client );
|
||||
GLOBAL CLIENT *Client_GetFromConn PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL CLIENT *Client_GetFromToken PARAMS(( CLIENT *Client, int Token ));
|
||||
|
||||
GLOBAL BOOLEAN Client_HasMode( CLIENT *Client, CHAR Mode );
|
||||
GLOBAL CLIENT *Client_Search PARAMS(( char *ID ));
|
||||
GLOBAL CLIENT *Client_First PARAMS(( void ));
|
||||
GLOBAL CLIENT *Client_Next PARAMS(( CLIENT *c ));
|
||||
|
||||
GLOBAL VOID Client_SetHostname( CLIENT *Client, CHAR *Hostname );
|
||||
GLOBAL VOID Client_SetID( CLIENT *Client, CHAR *Nick );
|
||||
GLOBAL VOID Client_SetUser( CLIENT *Client, CHAR *User, BOOLEAN Idented );
|
||||
GLOBAL VOID Client_SetInfo( CLIENT *Client, CHAR *Info );
|
||||
GLOBAL VOID Client_SetPassword( CLIENT *Client, CHAR *Pwd );
|
||||
GLOBAL VOID Client_SetType( CLIENT *Client, INT Type );
|
||||
GLOBAL VOID Client_SetHops( CLIENT *Client, INT Hops );
|
||||
GLOBAL VOID Client_SetToken( CLIENT *Client, INT Token );
|
||||
GLOBAL VOID Client_SetOperByMe( CLIENT *Client, BOOLEAN OperByMe );
|
||||
GLOBAL VOID Client_SetModes( CLIENT *Client, CHAR *Modes );
|
||||
GLOBAL VOID Client_SetIntroducer( CLIENT *Client, CLIENT *Introducer );
|
||||
GLOBAL VOID Client_SetAway( CLIENT *Client, CHAR *Txt );
|
||||
GLOBAL int Client_Type PARAMS(( CLIENT *Client ));
|
||||
GLOBAL CONN_ID Client_Conn PARAMS(( CLIENT *Client ));
|
||||
GLOBAL char *Client_ID PARAMS(( CLIENT *Client ));
|
||||
GLOBAL char *Client_Mask PARAMS(( CLIENT *Client ));
|
||||
GLOBAL char *Client_Info PARAMS(( CLIENT *Client ));
|
||||
GLOBAL char *Client_User PARAMS(( CLIENT *Client ));
|
||||
GLOBAL char *Client_Hostname PARAMS(( CLIENT *Client ));
|
||||
GLOBAL char *Client_Password PARAMS(( CLIENT *Client ));
|
||||
GLOBAL char *Client_Modes PARAMS(( CLIENT *Client ));
|
||||
GLOBAL char *Client_Flags PARAMS(( CLIENT *Client ));
|
||||
GLOBAL CLIENT *Client_Introducer PARAMS(( CLIENT *Client ));
|
||||
GLOBAL bool Client_OperByMe PARAMS(( CLIENT *Client ));
|
||||
GLOBAL int Client_Hops PARAMS(( CLIENT *Client ));
|
||||
GLOBAL int Client_Token PARAMS(( CLIENT *Client ));
|
||||
GLOBAL int Client_MyToken PARAMS(( CLIENT *Client ));
|
||||
GLOBAL CLIENT *Client_TopServer PARAMS(( CLIENT *Client ));
|
||||
GLOBAL CLIENT *Client_NextHop PARAMS(( CLIENT *Client ));
|
||||
GLOBAL char *Client_Away PARAMS(( CLIENT *Client ));
|
||||
GLOBAL time_t Client_StartTime PARAMS(( CLIENT *Client ));
|
||||
|
||||
GLOBAL BOOLEAN Client_ModeAdd( CLIENT *Client, CHAR Mode );
|
||||
GLOBAL BOOLEAN Client_ModeDel( CLIENT *Client, CHAR Mode );
|
||||
GLOBAL bool Client_HasMode PARAMS(( CLIENT *Client, char Mode ));
|
||||
|
||||
GLOBAL BOOLEAN Client_CheckNick( CLIENT *Client, CHAR *Nick );
|
||||
GLOBAL BOOLEAN Client_CheckID( CLIENT *Client, CHAR *ID );
|
||||
GLOBAL void Client_SetHostname PARAMS(( CLIENT *Client, char *Hostname ));
|
||||
GLOBAL void Client_SetID PARAMS(( CLIENT *Client, char *Nick ));
|
||||
GLOBAL void Client_SetUser PARAMS(( CLIENT *Client, char *User, bool Idented ));
|
||||
GLOBAL void Client_SetInfo PARAMS(( CLIENT *Client, char *Info ));
|
||||
GLOBAL void Client_SetPassword PARAMS(( CLIENT *Client, char *Pwd ));
|
||||
GLOBAL void Client_SetType PARAMS(( CLIENT *Client, int Type ));
|
||||
GLOBAL void Client_SetHops PARAMS(( CLIENT *Client, int Hops ));
|
||||
GLOBAL void Client_SetToken PARAMS(( CLIENT *Client, int Token ));
|
||||
GLOBAL void Client_SetOperByMe PARAMS(( CLIENT *Client, bool OperByMe ));
|
||||
GLOBAL void Client_SetModes PARAMS(( CLIENT *Client, char *Modes ));
|
||||
GLOBAL void Client_SetFlags PARAMS(( CLIENT *Client, char *Flags ));
|
||||
GLOBAL void Client_SetIntroducer PARAMS(( CLIENT *Client, CLIENT *Introducer ));
|
||||
GLOBAL void Client_SetAway PARAMS(( CLIENT *Client, char *Txt ));
|
||||
|
||||
GLOBAL INT Client_UserCount( VOID );
|
||||
GLOBAL INT Client_ServiceCount( VOID );
|
||||
GLOBAL INT Client_ServerCount( VOID );
|
||||
GLOBAL INT Client_OperCount( VOID );
|
||||
GLOBAL INT Client_UnknownCount( VOID );
|
||||
GLOBAL INT Client_MyUserCount( VOID );
|
||||
GLOBAL INT Client_MyServiceCount( VOID );
|
||||
GLOBAL INT Client_MyServerCount( VOID );
|
||||
GLOBAL bool Client_ModeAdd PARAMS(( CLIENT *Client, char Mode ));
|
||||
GLOBAL bool Client_ModeDel PARAMS(( CLIENT *Client, char Mode ));
|
||||
|
||||
GLOBAL BOOLEAN Client_IsValidNick( CHAR *Nick );
|
||||
GLOBAL bool Client_CheckNick PARAMS(( CLIENT *Client, char *Nick ));
|
||||
GLOBAL bool Client_CheckID PARAMS(( CLIENT *Client, char *ID ));
|
||||
|
||||
GLOBAL long Client_UserCount PARAMS(( void ));
|
||||
GLOBAL long Client_ServiceCount PARAMS(( void ));
|
||||
GLOBAL long Client_ServerCount PARAMS(( void ));
|
||||
GLOBAL long Client_OperCount PARAMS(( void ));
|
||||
GLOBAL long Client_UnknownCount PARAMS(( void ));
|
||||
GLOBAL long Client_MyUserCount PARAMS(( void ));
|
||||
GLOBAL long Client_MyServiceCount PARAMS(( void ));
|
||||
GLOBAL long Client_MyServerCount PARAMS(( void ));
|
||||
GLOBAL long Client_MaxUserCount PARAMS(( void ));
|
||||
GLOBAL long Client_MyMaxUserCount PARAMS(( void ));
|
||||
|
||||
GLOBAL bool Client_IsValidNick PARAMS(( char *Nick ));
|
||||
|
||||
GLOBAL WHOWAS *Client_GetWhowas PARAMS(( void ));
|
||||
GLOBAL int Client_GetLastWhowasIndex PARAMS(( void ));
|
||||
|
||||
GLOBAL void Client_RegisterWhowas PARAMS(( CLIENT *Client ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
1043
src/ngircd/conf.c
1043
src/ngircd/conf.c
File diff suppressed because it is too large
Load Diff
@@ -2,47 +2,15 @@
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: conf.h,v 1.10 2002/02/27 23:23:53 alex Exp $
|
||||
* $Id: conf.h,v 1.34 2005/03/20 13:54:06 fw Exp $
|
||||
*
|
||||
* conf.h: Konfiguration des ngircd (Header)
|
||||
*
|
||||
* $Log: conf.h,v $
|
||||
* Revision 1.10 2002/02/27 23:23:53 alex
|
||||
* - Includes fuer einige Header bereinigt.
|
||||
*
|
||||
* Revision 1.9 2002/01/03 02:27:20 alex
|
||||
* - das Server-Passwort kann nun konfiguriert werden.
|
||||
*
|
||||
* Revision 1.8 2002/01/02 02:49:16 alex
|
||||
* - Konfigurationsdatei "Samba like" umgestellt.
|
||||
* - es koennen nun mehrere Server und Oprtatoren konfiguriert werden.
|
||||
*
|
||||
* Revision 1.6 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.5 2001/12/30 19:26:11 alex
|
||||
* - Unterstuetzung fuer die Konfigurationsdatei eingebaut.
|
||||
*
|
||||
* Revision 1.4 2001/12/26 22:48:53 alex
|
||||
* - MOTD-Datei ist nun konfigurierbar und wird gelesen.
|
||||
*
|
||||
* Revision 1.3 2001/12/26 14:45:37 alex
|
||||
* - "Code Cleanups".
|
||||
*
|
||||
* Revision 1.2 2001/12/26 03:19:57 alex
|
||||
* - erste Konfigurations-Variablen definiert: PING/PONG-Timeout.
|
||||
*
|
||||
* Revision 1.1 2001/12/12 17:18:20 alex
|
||||
* - Modul fuer Server-Konfiguration begonnen.
|
||||
* Configuration management (header)
|
||||
*/
|
||||
|
||||
|
||||
@@ -51,64 +19,127 @@
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#include "conn.h"
|
||||
|
||||
#include "defines.h"
|
||||
#include "portab.h"
|
||||
|
||||
typedef struct _Conf_Oper
|
||||
{
|
||||
CHAR name[CLIENT_PASS_LEN];
|
||||
CHAR pwd[CLIENT_PASS_LEN];
|
||||
char name[CLIENT_PASS_LEN]; /* Name (ID) of IRC operator */
|
||||
char pwd[CLIENT_PASS_LEN]; /* Password */
|
||||
char *mask;
|
||||
} CONF_OPER;
|
||||
|
||||
typedef struct _Conf_Server
|
||||
{
|
||||
CHAR host[HOST_LEN];
|
||||
CHAR ip[16];
|
||||
CHAR name[CLIENT_ID_LEN];
|
||||
CHAR pwd[CLIENT_PASS_LEN];
|
||||
INT port;
|
||||
time_t lasttry;
|
||||
RES_STAT *res_stat;
|
||||
char host[HOST_LEN]; /* Hostname */
|
||||
char ip[16]; /* IP address (Resolver) */
|
||||
char name[CLIENT_ID_LEN]; /* IRC-Client-ID */
|
||||
char pwd_in[CLIENT_PASS_LEN]; /* Password which must be received */
|
||||
char pwd_out[CLIENT_PASS_LEN]; /* Password to send to peer */
|
||||
UINT16 port; /* Server port */
|
||||
int group; /* Group of server */
|
||||
time_t lasttry; /* Last connect attempt */
|
||||
RES_STAT *res_stat; /* Status of the resolver */
|
||||
int flags; /* Flags */
|
||||
CONN_ID conn_id; /* ID of server connection or NONE */
|
||||
} CONF_SERVER;
|
||||
|
||||
typedef struct _Conf_Channel
|
||||
{
|
||||
char name[CHANNEL_NAME_LEN]; /* Name of the channel */
|
||||
char modes[CHANNEL_MODE_LEN]; /* Initial channel modes */
|
||||
char topic[CHANNEL_TOPIC_LEN]; /* Initial topic */
|
||||
} CONF_CHANNEL;
|
||||
|
||||
/* Konfigurationsdatei */
|
||||
GLOBAL CHAR Conf_File[FNAME_LEN];
|
||||
|
||||
/* Name ("Nick") des Servers */
|
||||
GLOBAL CHAR Conf_ServerName[CLIENT_ID_LEN];
|
||||
#define CONF_SFLAG_ONCE 1 /* Delete this entry after next disconnect */
|
||||
#define CONF_SFLAG_DISABLED 2 /* This server configuration entry is disabled */
|
||||
|
||||
/* Servers-Info-Text */
|
||||
GLOBAL CHAR Conf_ServerInfo[CLIENT_INFO_LEN];
|
||||
|
||||
/* Server-Passwort */
|
||||
GLOBAL CHAR Conf_ServerPwd[CLIENT_PASS_LEN];
|
||||
/* Name ("Nick") of the servers */
|
||||
GLOBAL char Conf_ServerName[CLIENT_ID_LEN];
|
||||
|
||||
/* Datei mit MOTD-Text */
|
||||
GLOBAL CHAR Conf_MotdFile[FNAME_LEN];
|
||||
/* Server info text */
|
||||
GLOBAL char Conf_ServerInfo[CLIENT_INFO_LEN];
|
||||
|
||||
/* Ports, auf denen der Server Verbindungen entgegen nimmt */
|
||||
GLOBAL INT Conf_ListenPorts[MAX_LISTEN_PORTS];
|
||||
GLOBAL INT Conf_ListenPorts_Count;
|
||||
/* Global server passwort */
|
||||
GLOBAL char Conf_ServerPwd[CLIENT_PASS_LEN];
|
||||
|
||||
/* Timeouts fuer PING und PONG */
|
||||
GLOBAL INT Conf_PingTimeout;
|
||||
GLOBAL INT Conf_PongTimeout;
|
||||
/* Administrative information */
|
||||
GLOBAL char Conf_ServerAdmin1[CLIENT_INFO_LEN];
|
||||
GLOBAL char Conf_ServerAdmin2[CLIENT_INFO_LEN];
|
||||
GLOBAL char Conf_ServerAdminMail[CLIENT_INFO_LEN];
|
||||
|
||||
/* Sekunden zwischen Verbindungsversuchen zu anderen Servern */
|
||||
GLOBAL INT Conf_ConnectRetry;
|
||||
/* File with MOTD text */
|
||||
GLOBAL char Conf_MotdFile[FNAME_LEN];
|
||||
|
||||
/* Operatoren */
|
||||
/* Phrase with MOTD text */
|
||||
GLOBAL char Conf_MotdPhrase[LINE_LEN];
|
||||
|
||||
/* Ports the server should listen on */
|
||||
GLOBAL UINT16 Conf_ListenPorts[MAX_LISTEN_PORTS];
|
||||
GLOBAL int Conf_ListenPorts_Count;
|
||||
|
||||
/* Address to which the socket should be bound or empty (=all) */
|
||||
GLOBAL char Conf_ListenAddress[16];
|
||||
|
||||
/* User and group ID the server should run with */
|
||||
GLOBAL unsigned int Conf_UID;
|
||||
GLOBAL unsigned int Conf_GID;
|
||||
|
||||
/* A directory to chroot() in */
|
||||
GLOBAL char Conf_Chroot[FNAME_LEN];
|
||||
|
||||
/* File with PID of daemon */
|
||||
GLOBAL char Conf_PidFile[FNAME_LEN];
|
||||
|
||||
/* Timeouts for PING and PONG */
|
||||
GLOBAL int Conf_PingTimeout;
|
||||
GLOBAL int Conf_PongTimeout;
|
||||
|
||||
/* Seconds between connect attempts to other servers */
|
||||
GLOBAL int Conf_ConnectRetry;
|
||||
|
||||
/* Operators */
|
||||
GLOBAL CONF_OPER Conf_Oper[MAX_OPERATORS];
|
||||
GLOBAL INT Conf_Oper_Count;
|
||||
GLOBAL int Conf_Oper_Count;
|
||||
|
||||
/* Server */
|
||||
/* Servers */
|
||||
GLOBAL CONF_SERVER Conf_Server[MAX_SERVERS];
|
||||
GLOBAL INT Conf_Server_Count;
|
||||
|
||||
/* Pre-defined channels */
|
||||
GLOBAL CONF_CHANNEL Conf_Channel[MAX_DEFCHANNELS];
|
||||
GLOBAL int Conf_Channel_Count;
|
||||
|
||||
/* Are IRC operators allowed to always use MODE? */
|
||||
GLOBAL bool Conf_OperCanMode;
|
||||
|
||||
/* If an IRC op gives chanop privileges without being a chanop,
|
||||
* ircd2 will ignore the command. This enables a workaround:
|
||||
* It masks the command as coming from the server */
|
||||
GLOBAL bool Conf_OperServerMode;
|
||||
|
||||
/* Maximum number of connections to this server */
|
||||
GLOBAL long Conf_MaxConnections;
|
||||
|
||||
/* Maximum number of channels a user can join */
|
||||
GLOBAL int Conf_MaxJoins;
|
||||
|
||||
/* Maximum number of connections per IP address */
|
||||
GLOBAL int Conf_MaxConnectionsIP;
|
||||
|
||||
|
||||
GLOBAL VOID Conf_Init( VOID );
|
||||
GLOBAL VOID Conf_Exit( VOID );
|
||||
GLOBAL void Conf_Init PARAMS((void ));
|
||||
GLOBAL void Conf_Rehash PARAMS((void ));
|
||||
GLOBAL int Conf_Test PARAMS((void ));
|
||||
|
||||
GLOBAL void Conf_UnsetServer PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL void Conf_SetServer PARAMS(( int ConfServer, CONN_ID Idx ));
|
||||
GLOBAL int Conf_GetServer PARAMS(( CONN_ID Idx ));
|
||||
|
||||
GLOBAL bool Conf_EnableServer PARAMS(( char *Name, UINT16 Port ));
|
||||
GLOBAL bool Conf_DisableServer PARAMS(( char *Name ));
|
||||
GLOBAL bool Conf_AddServer PARAMS(( char *Name, UINT16 Port, char *Host, char *MyPwd, char *PeerPwd ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
264
src/ngircd/conn-func.c
Normal file
264
src/ngircd/conn-func.c
Normal file
@@ -0,0 +1,264 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* Connection management: Global functions
|
||||
*/
|
||||
|
||||
|
||||
#define CONN_MODULE
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: conn-func.c,v 1.6 2005/06/12 16:32:17 alex Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <log.h>
|
||||
|
||||
#include "conn.h"
|
||||
#include "client.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "conn-func.h"
|
||||
|
||||
|
||||
GLOBAL void
|
||||
Conn_UpdateIdle( CONN_ID Idx )
|
||||
{
|
||||
/* Idle-Timer zuruecksetzen */
|
||||
|
||||
assert( Idx > NONE );
|
||||
My_Connections[Idx].lastprivmsg = time( NULL );
|
||||
}
|
||||
|
||||
|
||||
GLOBAL time_t
|
||||
Conn_GetIdle( CONN_ID Idx )
|
||||
{
|
||||
/* Idle-Time einer Verbindung liefern (in Sekunden) */
|
||||
|
||||
assert( Idx > NONE );
|
||||
return time( NULL ) - My_Connections[Idx].lastprivmsg;
|
||||
} /* Conn_GetIdle */
|
||||
|
||||
|
||||
GLOBAL time_t
|
||||
Conn_LastPing( CONN_ID Idx )
|
||||
{
|
||||
/* Zeitpunkt des letzten PING liefern */
|
||||
|
||||
assert( Idx > NONE );
|
||||
return My_Connections[Idx].lastping;
|
||||
} /* Conn_LastPing */
|
||||
|
||||
|
||||
GLOBAL void
|
||||
Conn_SetPenalty( CONN_ID Idx, time_t Seconds )
|
||||
{
|
||||
/* Penalty-Delay fuer eine Verbindung (in Sekunden) setzen;
|
||||
* waehrend dieser Zeit wird der entsprechende Socket vom Server
|
||||
* bei Lese-Operationen komplett ignoriert. Der Delay kann mit
|
||||
* dieser Funktion nur erhoeht, nicht aber verringert werden. */
|
||||
|
||||
time_t t;
|
||||
|
||||
assert( Idx > NONE );
|
||||
assert( Seconds >= 0 );
|
||||
|
||||
t = time( NULL ) + Seconds;
|
||||
if( t > My_Connections[Idx].delaytime ) My_Connections[Idx].delaytime = t;
|
||||
} /* Conn_SetPenalty */
|
||||
|
||||
|
||||
GLOBAL void
|
||||
Conn_ResetPenalty( CONN_ID Idx )
|
||||
{
|
||||
assert( Idx > NONE );
|
||||
My_Connections[Idx].delaytime = 0;
|
||||
} /* Conn_ResetPenalty */
|
||||
|
||||
|
||||
GLOBAL void
|
||||
Conn_ClearFlags( void )
|
||||
{
|
||||
/* Alle Connection auf "nicht-markiert" setzen */
|
||||
|
||||
CONN_ID i;
|
||||
|
||||
for( i = 0; i < Pool_Size; i++ ) My_Connections[i].flag = 0;
|
||||
} /* Conn_ClearFlags */
|
||||
|
||||
|
||||
GLOBAL int
|
||||
Conn_Flag( CONN_ID Idx )
|
||||
{
|
||||
/* Ist eine Connection markiert (true) oder nicht? */
|
||||
|
||||
assert( Idx > NONE );
|
||||
return My_Connections[Idx].flag;
|
||||
} /* Conn_Flag */
|
||||
|
||||
|
||||
GLOBAL void
|
||||
Conn_SetFlag( CONN_ID Idx, int Flag )
|
||||
{
|
||||
/* Connection markieren */
|
||||
|
||||
assert( Idx > NONE );
|
||||
My_Connections[Idx].flag = Flag;
|
||||
} /* Conn_SetFlag */
|
||||
|
||||
|
||||
GLOBAL CONN_ID
|
||||
Conn_First( void )
|
||||
{
|
||||
/* Connection-Struktur der ersten Verbindung liefern;
|
||||
* Ist keine Verbindung vorhanden, wird NONE geliefert. */
|
||||
|
||||
CONN_ID i;
|
||||
|
||||
for( i = 0; i < Pool_Size; i++ )
|
||||
{
|
||||
if( My_Connections[i].sock != NONE ) return i;
|
||||
}
|
||||
return NONE;
|
||||
} /* Conn_First */
|
||||
|
||||
|
||||
GLOBAL CONN_ID
|
||||
Conn_Next( CONN_ID Idx )
|
||||
{
|
||||
/* Naechste Verbindungs-Struktur liefern; existiert keine
|
||||
* weitere, so wird NONE geliefert. */
|
||||
|
||||
CONN_ID i = NONE;
|
||||
|
||||
assert( Idx > NONE );
|
||||
|
||||
for( i = Idx + 1; i < Pool_Size; i++ )
|
||||
{
|
||||
if( My_Connections[i].sock != NONE ) return i;
|
||||
}
|
||||
return NONE;
|
||||
} /* Conn_Next */
|
||||
|
||||
|
||||
GLOBAL int
|
||||
Conn_Options( CONN_ID Idx )
|
||||
{
|
||||
assert( Idx > NONE );
|
||||
return My_Connections[Idx].options;
|
||||
} /* Conn_Options */
|
||||
|
||||
|
||||
/**
|
||||
* Get the start time of the connection.
|
||||
* The result is the start time in seconds since 1970-01-01, as reported
|
||||
* by the C function time(NULL).
|
||||
*/
|
||||
GLOBAL time_t
|
||||
Conn_StartTime( CONN_ID Idx )
|
||||
{
|
||||
CLIENT *c;
|
||||
|
||||
assert(Idx > NONE);
|
||||
|
||||
/* Search client structure for this link ... */
|
||||
c = Client_GetFromConn(Idx);
|
||||
if(c != NULL)
|
||||
return Client_StartTime(c);
|
||||
|
||||
return 0;
|
||||
} /* Conn_StartTime */
|
||||
|
||||
|
||||
GLOBAL int
|
||||
Conn_SendQ( CONN_ID Idx )
|
||||
{
|
||||
/* Laenge der Daten im Schreibbuffer liefern */
|
||||
|
||||
assert( Idx > NONE );
|
||||
#ifdef ZLIB
|
||||
if( My_Connections[Idx].options & CONN_ZIP ) return My_Connections[Idx].zip.wdatalen;
|
||||
else
|
||||
#endif
|
||||
return My_Connections[Idx].wdatalen;
|
||||
} /* Conn_SendQ */
|
||||
|
||||
|
||||
GLOBAL long
|
||||
Conn_SendMsg( CONN_ID Idx )
|
||||
{
|
||||
/* Anzahl gesendeter Nachrichten liefern */
|
||||
|
||||
assert( Idx > NONE );
|
||||
return My_Connections[Idx].msg_out;
|
||||
} /* Conn_SendMsg */
|
||||
|
||||
|
||||
GLOBAL long
|
||||
Conn_SendBytes( CONN_ID Idx )
|
||||
{
|
||||
/* Anzahl gesendeter Bytes (unkomprimiert) liefern */
|
||||
|
||||
assert( Idx > NONE );
|
||||
return My_Connections[Idx].bytes_out;
|
||||
} /* Conn_SendBytes */
|
||||
|
||||
|
||||
GLOBAL int
|
||||
Conn_RecvQ( CONN_ID Idx )
|
||||
{
|
||||
/* Laenge der Daten im Lesebuffer liefern */
|
||||
|
||||
assert( Idx > NONE );
|
||||
#ifdef ZLIB
|
||||
if( My_Connections[Idx].options & CONN_ZIP ) return My_Connections[Idx].zip.rdatalen;
|
||||
else
|
||||
#endif
|
||||
return My_Connections[Idx].rdatalen;
|
||||
} /* Conn_RecvQ */
|
||||
|
||||
|
||||
GLOBAL long
|
||||
Conn_RecvMsg( CONN_ID Idx )
|
||||
{
|
||||
/* Anzahl empfangener Nachrichten liefern */
|
||||
|
||||
assert( Idx > NONE );
|
||||
return My_Connections[Idx].msg_in;
|
||||
} /* Conn_RecvMsg */
|
||||
|
||||
|
||||
GLOBAL long
|
||||
Conn_RecvBytes( CONN_ID Idx )
|
||||
{
|
||||
/* Anzahl empfangener Bytes (unkomprimiert) liefern */
|
||||
|
||||
assert( Idx > NONE );
|
||||
return My_Connections[Idx].bytes_in;
|
||||
} /* Conn_RecvBytes */
|
||||
|
||||
|
||||
GLOBAL void
|
||||
Conn_ResetWCounter( void )
|
||||
{
|
||||
WCounter = 0;
|
||||
} /* Conn_ResetWCounter */
|
||||
|
||||
|
||||
GLOBAL long
|
||||
Conn_WCounter( void )
|
||||
{
|
||||
return WCounter;
|
||||
} /* Conn_WCounter */
|
||||
|
||||
|
||||
/* -eof- */
|
||||
62
src/ngircd/conn-func.h
Normal file
62
src/ngircd/conn-func.h
Normal file
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: conn-func.h,v 1.4 2005/04/25 18:37:16 fw Exp $
|
||||
*
|
||||
* Connection management: Global functions (header)
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __conn_func_h__
|
||||
#define __conn_func_h__
|
||||
|
||||
|
||||
/* Include the header conn.h if this header is _not_ included by any module
|
||||
* containing connection handling functions. So other modules must only
|
||||
* include this conn-func.h header. */
|
||||
#ifndef CONN_MODULE
|
||||
# include "conn.h"
|
||||
#endif
|
||||
|
||||
|
||||
GLOBAL void Conn_UpdateIdle PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL time_t Conn_GetIdle PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL time_t Conn_LastPing PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL time_t Conn_StartTime PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL int Conn_SendQ PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL int Conn_RecvQ PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL long Conn_SendMsg PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL long Conn_RecvMsg PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL long Conn_SendBytes PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL long Conn_RecvBytes PARAMS(( CONN_ID Idx ));
|
||||
|
||||
GLOBAL void Conn_SetPenalty PARAMS(( CONN_ID Idx, time_t Seconds ));
|
||||
GLOBAL void Conn_ResetPenalty PARAMS(( CONN_ID Idx ));
|
||||
|
||||
GLOBAL void Conn_ClearFlags PARAMS(( void ));
|
||||
GLOBAL int Conn_Flag PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL void Conn_SetFlag PARAMS(( CONN_ID Idx, int Flag ));
|
||||
|
||||
GLOBAL CONN_ID Conn_First PARAMS(( void ));
|
||||
GLOBAL CONN_ID Conn_Next PARAMS(( CONN_ID Idx ));
|
||||
|
||||
GLOBAL int Conn_Options PARAMS(( CONN_ID Idx ));
|
||||
|
||||
GLOBAL void Conn_ResetWCounter PARAMS(( void ));
|
||||
GLOBAL long Conn_WCounter PARAMS(( void ));
|
||||
|
||||
#define Conn_OPTION_ADD( x, opt ) ( (x)->options |= opt )
|
||||
#define Conn_OPTION_DEL( x, opt ) ( (x)->options &= ~opt )
|
||||
#define Conn_OPTION_ISSET( x, opt ) ( (x)->options & opt )
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
||||
210
src/ngircd/conn-zip.c
Normal file
210
src/ngircd/conn-zip.c
Normal file
@@ -0,0 +1,210 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* Connection compression using ZLIB
|
||||
*/
|
||||
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
#define CONN_MODULE
|
||||
|
||||
|
||||
#ifdef ZLIB
|
||||
|
||||
static char UNUSED id[] = "$Id: conn-zip.c,v 1.7 2005/04/25 18:37:16 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <zlib.h>
|
||||
|
||||
#include "conn.h"
|
||||
#include "conn-func.h"
|
||||
#include "log.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "conn-zip.h"
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
Zip_InitConn( CONN_ID Idx )
|
||||
{
|
||||
/* Kompression fuer Link initialisieren */
|
||||
|
||||
assert( Idx > NONE );
|
||||
|
||||
My_Connections[Idx].zip.in.avail_in = 0;
|
||||
My_Connections[Idx].zip.in.total_in = 0;
|
||||
My_Connections[Idx].zip.in.total_out = 0;
|
||||
My_Connections[Idx].zip.in.zalloc = NULL;
|
||||
My_Connections[Idx].zip.in.zfree = NULL;
|
||||
My_Connections[Idx].zip.in.data_type = Z_ASCII;
|
||||
|
||||
if( inflateInit( &My_Connections[Idx].zip.in ) != Z_OK )
|
||||
{
|
||||
/* Fehler! */
|
||||
Log( LOG_ALERT, "Can't initialize compression on connection %d (zlib inflate)!", Idx );
|
||||
return false;
|
||||
}
|
||||
|
||||
My_Connections[Idx].zip.out.total_in = 0;
|
||||
My_Connections[Idx].zip.out.total_in = 0;
|
||||
My_Connections[Idx].zip.out.zalloc = NULL;
|
||||
My_Connections[Idx].zip.out.zfree = NULL;
|
||||
My_Connections[Idx].zip.out.data_type = Z_ASCII;
|
||||
|
||||
if( deflateInit( &My_Connections[Idx].zip.out, Z_DEFAULT_COMPRESSION ) != Z_OK )
|
||||
{
|
||||
/* Fehler! */
|
||||
Log( LOG_ALERT, "Can't initialize compression on connection %d (zlib deflate)!", Idx );
|
||||
return false;
|
||||
}
|
||||
|
||||
My_Connections[Idx].zip.bytes_in = My_Connections[Idx].bytes_in;
|
||||
My_Connections[Idx].zip.bytes_out = My_Connections[Idx].bytes_out;
|
||||
|
||||
Log( LOG_INFO, "Enabled link compression (zlib) on connection %d.", Idx );
|
||||
Conn_OPTION_ADD( &My_Connections[Idx], CONN_ZIP );
|
||||
|
||||
return true;
|
||||
} /* Zip_InitConn */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
Zip_Buffer( CONN_ID Idx, char *Data, int Len )
|
||||
{
|
||||
/* Daten zum Komprimieren im "Kompressions-Puffer" sammeln.
|
||||
* Es wird true bei Erfolg, sonst false geliefert. */
|
||||
|
||||
assert( Idx > NONE );
|
||||
assert( Data != NULL );
|
||||
assert( Len > 0 );
|
||||
|
||||
/* Ist noch Platz im Kompressions-Puffer? */
|
||||
if( ZWRITEBUFFER_LEN - My_Connections[Idx].zip.wdatalen < Len + 50 )
|
||||
{
|
||||
/* Nein! Puffer zunaechst leeren ...*/
|
||||
if( ! Zip_Flush( Idx )) return false;
|
||||
}
|
||||
|
||||
/* Daten kopieren */
|
||||
memmove( My_Connections[Idx].zip.wbuf + My_Connections[Idx].zip.wdatalen, Data, Len );
|
||||
My_Connections[Idx].zip.wdatalen += Len;
|
||||
|
||||
return true;
|
||||
} /* Zip_Buffer */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
Zip_Flush( CONN_ID Idx )
|
||||
{
|
||||
/* Daten komprimieren und in Schreibpuffer kopieren.
|
||||
* Es wird true bei Erfolg, sonst false geliefert. */
|
||||
|
||||
int result, out_len;
|
||||
z_stream *out;
|
||||
|
||||
out = &My_Connections[Idx].zip.out;
|
||||
|
||||
out->next_in = (void *)My_Connections[Idx].zip.wbuf;
|
||||
out->avail_in = My_Connections[Idx].zip.wdatalen;
|
||||
out->next_out = (void *)(My_Connections[Idx].wbuf + My_Connections[Idx].wdatalen);
|
||||
out->avail_out = WRITEBUFFER_LEN - My_Connections[Idx].wdatalen;
|
||||
|
||||
result = deflate( out, Z_SYNC_FLUSH );
|
||||
if(( result != Z_OK ) || ( out->avail_in > 0 ))
|
||||
{
|
||||
Log( LOG_ALERT, "Compression error: code %d!?", result );
|
||||
Conn_Close( Idx, "Compression error!", NULL, false );
|
||||
return false;
|
||||
}
|
||||
|
||||
out_len = WRITEBUFFER_LEN - My_Connections[Idx].wdatalen - out->avail_out;
|
||||
My_Connections[Idx].wdatalen += out_len;
|
||||
My_Connections[Idx].bytes_out += out_len;
|
||||
My_Connections[Idx].zip.bytes_out += My_Connections[Idx].zip.wdatalen;
|
||||
My_Connections[Idx].zip.wdatalen = 0;
|
||||
|
||||
return true;
|
||||
} /* Zip_Flush */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
Unzip_Buffer( CONN_ID Idx )
|
||||
{
|
||||
/* Daten entpacken und in Lesepuffer kopieren. Bei Fehlern
|
||||
* wird false geliefert, ansonsten true. Der Fall, dass keine
|
||||
* Daten mehr zu entpacken sind, ist _kein_ Fehler! */
|
||||
|
||||
int result, in_len, out_len;
|
||||
z_stream *in;
|
||||
|
||||
assert( Idx > NONE );
|
||||
|
||||
if( My_Connections[Idx].zip.rdatalen <= 0 ) return true;
|
||||
|
||||
in = &My_Connections[Idx].zip.in;
|
||||
|
||||
in->next_in = (void *)My_Connections[Idx].zip.rbuf;
|
||||
in->avail_in = My_Connections[Idx].zip.rdatalen;
|
||||
in->next_out = (void *)(My_Connections[Idx].rbuf + My_Connections[Idx].rdatalen);
|
||||
in->avail_out = READBUFFER_LEN - My_Connections[Idx].rdatalen - 1;
|
||||
|
||||
result = inflate( in, Z_SYNC_FLUSH );
|
||||
if( result != Z_OK )
|
||||
{
|
||||
Log( LOG_ALERT, "Decompression error: %s (code=%d, ni=%d, ai=%d, no=%d, ao=%d)!?", in->msg, result, in->next_in, in->avail_in, in->next_out, in->avail_out );
|
||||
Conn_Close( Idx, "Decompression error!", NULL, false );
|
||||
return false;
|
||||
}
|
||||
|
||||
in_len = My_Connections[Idx].zip.rdatalen - in->avail_in;
|
||||
out_len = READBUFFER_LEN - My_Connections[Idx].rdatalen - 1 - in->avail_out;
|
||||
My_Connections[Idx].rdatalen += out_len;
|
||||
|
||||
if( in->avail_in > 0 )
|
||||
{
|
||||
/* es konnten nicht alle Daten entpackt werden, vermutlich war
|
||||
* im Ziel-Puffer kein Platz mehr. Umkopieren ... */
|
||||
My_Connections[Idx].zip.rdatalen -= in_len;
|
||||
memmove( My_Connections[Idx].zip.rbuf, My_Connections[Idx].zip.rbuf + in_len, My_Connections[Idx].zip.rdatalen );
|
||||
}
|
||||
else My_Connections[Idx].zip.rdatalen = 0;
|
||||
My_Connections[Idx].zip.bytes_in += out_len;
|
||||
|
||||
return true;
|
||||
} /* Unzip_Buffer */
|
||||
|
||||
|
||||
GLOBAL long
|
||||
Zip_SendBytes( CONN_ID Idx )
|
||||
{
|
||||
/* Anzahl gesendeter Bytes (komprimiert!) liefern */
|
||||
|
||||
assert( Idx > NONE );
|
||||
return My_Connections[Idx].zip.bytes_out;
|
||||
} /* Zip_SendBytes */
|
||||
|
||||
|
||||
GLOBAL long
|
||||
Zip_RecvBytes( CONN_ID Idx )
|
||||
{
|
||||
/* Anzahl gesendeter Bytes (komprimiert!) liefern */
|
||||
|
||||
assert( Idx > NONE );
|
||||
return My_Connections[Idx].zip.bytes_in;
|
||||
} /* Zip_RecvBytes */
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
||||
38
src/ngircd/conn-zip.h
Normal file
38
src/ngircd/conn-zip.h
Normal file
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: conn-zip.h,v 1.3 2005/03/19 18:43:48 fw Exp $
|
||||
*
|
||||
* Connection compression using ZLIB (header)
|
||||
*/
|
||||
|
||||
|
||||
#ifdef ZLIB
|
||||
|
||||
#ifndef __conn_zip_h__
|
||||
#define __conn_zip_h__
|
||||
|
||||
|
||||
GLOBAL bool Zip_InitConn PARAMS(( CONN_ID Idx ));
|
||||
|
||||
GLOBAL bool Zip_Buffer PARAMS(( CONN_ID Idx, char *Data, int Len ));
|
||||
GLOBAL bool Zip_Flush PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL bool Unzip_Buffer PARAMS(( CONN_ID Idx ));
|
||||
|
||||
GLOBAL long Zip_SendBytes PARAMS(( CONN_ID Idx ));
|
||||
GLOBAL long Zip_RecvBytes PARAMS(( CONN_ID Idx ));
|
||||
|
||||
|
||||
#endif /* __conn_zip_h__ */
|
||||
|
||||
#endif /* ZLIB */
|
||||
|
||||
|
||||
/* -eof- */
|
||||
2023
src/ngircd/conn.c
2023
src/ngircd/conn.c
File diff suppressed because it is too large
Load Diff
@@ -2,55 +2,15 @@
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: conn.h,v 1.12 2002/02/23 00:03:54 alex Exp $
|
||||
* $Id: conn.h,v 1.35.2.1 2005/07/30 23:24:50 alex Exp $
|
||||
*
|
||||
* conn.h: Verwaltung aller Netz-Verbindungen ("connections") (Header)
|
||||
*
|
||||
* $Log: conn.h,v $
|
||||
* Revision 1.12 2002/02/23 00:03:54 alex
|
||||
* - Ergebnistyp von Conn_GetIdle() und Conn_LastPing() auf "time_t" geaendert.
|
||||
*
|
||||
* Revision 1.11 2002/02/11 01:00:50 alex
|
||||
* - neue Funktion Conn_LastPing().
|
||||
*
|
||||
* Revision 1.10 2002/01/06 15:18:15 alex
|
||||
* - Loglevel und Meldungen nochmals geaendert. Level passen nun besser.
|
||||
*
|
||||
* Revision 1.9 2002/01/02 02:44:36 alex
|
||||
* - neue Defines fuer max. Anzahl Server und Operatoren.
|
||||
*
|
||||
* Revision 1.8 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.7 2001/12/26 14:45:37 alex
|
||||
* - "Code Cleanups".
|
||||
*
|
||||
* Revision 1.6 2001/12/25 22:03:47 alex
|
||||
* - Conn_Close() eingefuehrt: war die lokale Funktion Close_Connection().
|
||||
*
|
||||
* Revision 1.5 2001/12/23 21:57:48 alex
|
||||
* - Conn_WriteStr() unterstuetzt nun variable Parameter.
|
||||
*
|
||||
* Revision 1.4 2001/12/15 00:08:27 alex
|
||||
* - neue globale Funktionen: Conn_Write() und Conn_WriteStr().
|
||||
*
|
||||
* Revision 1.3 2001/12/14 08:15:45 alex
|
||||
* - CONN_ID wird definiert.
|
||||
*
|
||||
* Revision 1.2 2001/12/13 01:33:32 alex
|
||||
* - Conn_Handler() unterstuetzt nun einen Timeout (in Sekunden).
|
||||
*
|
||||
* Revision 1.1 2001/12/12 17:18:38 alex
|
||||
* - Modul zur Verwaltung aller Netzwerk-Verbindungen begonnen.
|
||||
* Connection management (header)
|
||||
*/
|
||||
|
||||
|
||||
@@ -58,33 +18,87 @@
|
||||
#define __conn_h__
|
||||
|
||||
|
||||
#include <time.h>
|
||||
#include <time.h> /* for time_t, see below */
|
||||
|
||||
|
||||
typedef INT CONN_ID;
|
||||
#define CONN_ISCLOSING 1 /* Conn_Close() already called */
|
||||
#define CONN_ISCONNECTING 2 /* connect() in progress */
|
||||
|
||||
typedef struct _Res_Stat
|
||||
#ifdef ZLIB
|
||||
#define CONN_ZIP 4 /* zlib compressed link */
|
||||
#endif
|
||||
|
||||
|
||||
typedef int CONN_ID;
|
||||
|
||||
|
||||
#ifdef CONN_MODULE
|
||||
|
||||
#include "defines.h"
|
||||
#include "resolve.h"
|
||||
|
||||
#ifdef ZLIB
|
||||
#include <zlib.h>
|
||||
typedef struct _ZipData
|
||||
{
|
||||
INT pid; /* PID des Child-Prozess */
|
||||
INT pipe[2]; /* Pipe fuer IPC */
|
||||
} RES_STAT;
|
||||
z_stream in; /* "Handle" for input stream */
|
||||
z_stream out; /* "Handle" for output stream */
|
||||
char rbuf[READBUFFER_LEN]; /* Read buffer */
|
||||
int rdatalen; /* Length of data in read buffer (compressed) */
|
||||
char wbuf[WRITEBUFFER_LEN]; /* Write buffer */
|
||||
int wdatalen; /* Length of data in write buffer (uncompressed) */
|
||||
long bytes_in, bytes_out; /* Counter for statistics (uncompressed!) */
|
||||
} ZIPDATA;
|
||||
#endif /* ZLIB */
|
||||
|
||||
typedef struct _Connection
|
||||
{
|
||||
int sock; /* Socket handle */
|
||||
struct sockaddr_in addr; /* Client address */
|
||||
RES_STAT *res_stat; /* Status of resolver process, if any */
|
||||
char host[HOST_LEN]; /* Hostname */
|
||||
char rbuf[READBUFFER_LEN]; /* Read buffer */
|
||||
int rdatalen; /* Length of data in read buffer */
|
||||
char wbuf[WRITEBUFFER_LEN]; /* Write buffer */
|
||||
int wdatalen; /* Length of data in write buffer */
|
||||
time_t lastdata; /* Last activity */
|
||||
time_t lastping; /* Last PING */
|
||||
time_t lastprivmsg; /* Last PRIVMSG */
|
||||
time_t delaytime; /* Ignore link ("penalty") */
|
||||
long bytes_in, bytes_out; /* Received and sent bytes */
|
||||
long msg_in, msg_out; /* Received and sent IRC messages */
|
||||
int flag; /* Flag (see "irc-write" module) */
|
||||
UINT16 options; /* Link options / connection state */
|
||||
#ifdef ZLIB
|
||||
ZIPDATA zip; /* Compression information */
|
||||
#endif /* ZLIB */
|
||||
} CONNECTION;
|
||||
|
||||
GLOBAL CONNECTION *My_Connections;
|
||||
GLOBAL CONN_ID Pool_Size;
|
||||
GLOBAL long WCounter;
|
||||
|
||||
#endif /* CONN_MODULE */
|
||||
|
||||
|
||||
GLOBAL VOID Conn_Init( VOID );
|
||||
GLOBAL VOID Conn_Exit( VOID );
|
||||
GLOBAL void Conn_Init PARAMS((void ));
|
||||
GLOBAL void Conn_Exit PARAMS(( void ));
|
||||
|
||||
GLOBAL BOOLEAN Conn_NewListener( CONST INT Port );
|
||||
GLOBAL int Conn_InitListeners PARAMS(( void ));
|
||||
GLOBAL void Conn_ExitListeners PARAMS(( void ));
|
||||
|
||||
GLOBAL VOID Conn_Handler( INT Timeout );
|
||||
GLOBAL bool Conn_NewListener PARAMS(( const UINT16 Port ));
|
||||
|
||||
GLOBAL BOOLEAN Conn_Write( CONN_ID Idx, CHAR *Data, INT Len );
|
||||
GLOBAL BOOLEAN Conn_WriteStr( CONN_ID Idx, CHAR *Format, ... );
|
||||
GLOBAL void Conn_Handler PARAMS(( void ));
|
||||
|
||||
GLOBAL VOID Conn_Close( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformClient );
|
||||
GLOBAL bool Conn_Write PARAMS(( CONN_ID Idx, char *Data, int Len ));
|
||||
GLOBAL bool Conn_WriteStr PARAMS(( CONN_ID Idx, char *Format, ... ));
|
||||
|
||||
GLOBAL VOID Conn_UpdateIdle( CONN_ID Idx );
|
||||
GLOBAL time_t Conn_GetIdle( CONN_ID Idx );
|
||||
GLOBAL time_t Conn_LastPing( CONN_ID Idx );
|
||||
GLOBAL void Conn_Close PARAMS(( CONN_ID Idx, char *LogMsg, char *FwdMsg, bool InformClient ));
|
||||
|
||||
GLOBAL void Conn_SyncServerStruct PARAMS(( void ));
|
||||
|
||||
GLOBAL int Conn_MaxFD;
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,61 +1,16 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
* Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: defines.h,v 1.13 2002/03/02 00:43:31 alex Exp $
|
||||
* $Id: defines.h,v 1.52.2.2 2005/07/05 22:58:25 alex Exp $
|
||||
*
|
||||
* defines.h: (globale) Konstanten
|
||||
*
|
||||
* $Log: defines.h,v $
|
||||
* Revision 1.13 2002/03/02 00:43:31 alex
|
||||
* - bei abgebrochene ausgehende Server-Verbindungen wird der naechste Ver-
|
||||
* bindungsversuch in RECONNECT_DELAY Sekunden (3) unternommen und nicht
|
||||
* mehr "ConnectRetry" Sekunden gewartet.
|
||||
*
|
||||
* Revision 1.12 2002/02/27 23:24:58 alex
|
||||
* - CONNECTED und DISCONNECTED fuer die irc-xxx-Module wird nun hier definiert.
|
||||
*
|
||||
* Revision 1.11 2002/02/27 20:32:34 alex
|
||||
* - neue Konstante: CHANNEL_TOPIC_LEN
|
||||
*
|
||||
* Revision 1.10 2002/02/27 18:22:45 alex
|
||||
* - Mode "a" (away) in USERMODES aufgenommen.
|
||||
*
|
||||
* Revision 1.9 2002/02/13 23:04:27 alex
|
||||
* - CHANMODES um Operator (o) und Voiced User (v) ergaenzt.
|
||||
*
|
||||
* Revision 1.8 2002/02/13 17:45:57 alex
|
||||
* - unterstuetzte User- und Channel-Modes stehen nun in Konstanten.
|
||||
*
|
||||
* Revision 1.7 2002/01/22 17:15:39 alex
|
||||
* - die Fehlermeldung "interrupted system call" sollte nicht mehr auftreten.
|
||||
*
|
||||
* Revision 1.6 2002/01/21 00:03:16 alex
|
||||
* - neue Konstante CHANNEL_MODE_LEN.
|
||||
*
|
||||
* Revision 1.5 2002/01/18 15:51:44 alex
|
||||
* - Server-Verbinungen werden beim Start erst nach kurzer Pause aufgebaut.
|
||||
*
|
||||
* Revision 1.4 2002/01/07 15:29:53 alex
|
||||
* - PASSSERVERADD definiert, wird beim PASS-Befehl an Server verwendet.
|
||||
*
|
||||
* Revision 1.3 2002/01/03 02:24:00 alex
|
||||
* - Protokollversion und Suffix definiert.
|
||||
*
|
||||
* Revision 1.2 2002/01/02 02:44:36 alex
|
||||
* - neue Defines fuer max. Anzahl Server und Operatoren.
|
||||
*
|
||||
* Revision 1.1 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
* Global defines of ngIRCd.
|
||||
*/
|
||||
|
||||
#ifndef __defines_h__
|
||||
@@ -64,52 +19,91 @@
|
||||
|
||||
#define NONE -1
|
||||
|
||||
#define FNAME_LEN 256 /* max. Laenge eines Dateinamen */
|
||||
#define FNAME_LEN 256 /* max. length of file name */
|
||||
|
||||
#define LINE_LEN 256 /* max. Laenge einer Konfigurationszeile */
|
||||
#define LINE_LEN 256 /* max. length of a line in the configuration file */
|
||||
|
||||
#define HOST_LEN 256 /* max. Laenge eines Hostnamen */
|
||||
#define HOST_LEN 256 /* max. lenght of fully qualified host names */
|
||||
|
||||
#define MAX_LISTEN_PORTS 16 /* max. Anzahl von Listen-Ports */
|
||||
#define MAX_LISTEN_PORTS 16 /* max. count of listening ports */
|
||||
|
||||
#define MAX_OPERATORS 8 /* max. Anzahl konfigurierbarer Operatoren */
|
||||
#define MAX_OPERATORS 16 /* max. count of configurable operators */
|
||||
|
||||
#define MAX_SERVERS 8 /* max. Anzahl konfigurierbarer Server ("Peers") */
|
||||
#define MAX_SERVERS 16 /* max. count of configurable servers ("peers") */
|
||||
|
||||
#define MAX_CONNECTIONS 100 /* max. Anzahl von Verbindungen an diesem Server */
|
||||
#define MAX_DEFCHANNELS 16 /* max. count of preconfigurable channels */
|
||||
|
||||
#define CLIENT_ID_LEN 64 /* max. ID-Laenge; vgl. RFC 2812, 1.1 und 1.2.1 */
|
||||
#define CLIENT_NICK_LEN 10 /* max. Nick-Laenge; vgl. RFC 2812, 1.2.1 */
|
||||
#define CLIENT_PASS_LEN 9 /* max. Laenge des Passwortes */
|
||||
#define CLIENT_USER_LEN 9 /* max. Laenge des Benutzernamen ("Login") */
|
||||
#define CLIENT_NAME_LEN 32 /* max. Laenge des "langen Benutzernamen" */
|
||||
#define CLIENT_HOST_LEN 64 /* max. Laenge des Hostname */
|
||||
#define CLIENT_MODE_LEN 8 /* max. Laenge der Client-Modes */
|
||||
#define CLIENT_INFO_LEN 64 /* max. Infotext-Laenge (Server) */
|
||||
#define CLIENT_AWAY_LEN 128 /* max. Laenger der AWAY-Nachricht */
|
||||
#define MAX_SERVICES 8 /* max. number of configurable services */
|
||||
|
||||
#define CHANNEL_NAME_LEN 51 /* max. Laenge eines Channel-Namens, vgl. RFC 2812, 1.3 */
|
||||
#define CHANNEL_MODE_LEN 8 /* max. Laenge der Channel-Modes */
|
||||
#define CHANNEL_TOPIC_LEN 128 /* max. Laenge eines Channel-Topics */
|
||||
#define MAX_WHOWAS 64 /* max. number of WHOWAS items */
|
||||
#define DEFAULT_WHOWAS 5 /* default count for WHOWAS command */
|
||||
|
||||
#define COMMAND_LEN 513 /* max. Laenge eines Befehls, vgl. RFC 2812, 3.2 */
|
||||
#define CONNECTION_POOL 100 /* size of default connection pool */
|
||||
|
||||
#define READBUFFER_LEN 2 * COMMAND_LEN /* Laenge des Lesepuffers je Verbindung (Bytes) */
|
||||
#define WRITEBUFFER_LEN 4096 /* Laenge des Schreibpuffers je Verbindung (Bytes) */
|
||||
#define CLIENT_ID_LEN 64 /* max. length of an IRC ID; see RFC 2812, 1.1 and 1.2.1 */
|
||||
#define CLIENT_NICK_LEN 10 /* max. nick length; see. RFC 2812, 1.2.1 */
|
||||
#define CLIENT_PASS_LEN 21 /* max. password length */
|
||||
#define CLIENT_USER_LEN 10 /* Max. length of user name ("login")
|
||||
see RFC 2812, section 1.2.1 */
|
||||
#define CLIENT_NAME_LEN 32 /* max. length of "real names" */
|
||||
#define CLIENT_HOST_LEN 64 /* max. host name length */
|
||||
#define CLIENT_MODE_LEN 8 /* max. lenth of all client modes */
|
||||
#define CLIENT_INFO_LEN 64 /* max. length of server info texts */
|
||||
#define CLIENT_AWAY_LEN 128 /* max. length of away messages */
|
||||
#define CLIENT_FLAGS_LEN 100 /* max. length of client flags */
|
||||
|
||||
#define PROTOVER "0210" /* implementierte Protokoll-Version (RFC 2813, 4.1.1) */
|
||||
#define PROTOSUFFIX "-ngIRCd" /* Protokoll-Suffix (RFC 2813, 4.1.1) */
|
||||
#define CHANNEL_NAME_LEN 51 /* max. length of a channel name, see. RFC 2812, 1.3 */
|
||||
#define CHANNEL_MODE_LEN 9 /* max. length of channel modes */
|
||||
#define CHANNEL_TOPIC_LEN 128 /* max. length of a channel topic */
|
||||
|
||||
#define PASSSERVERADD PROTOVER""PROTOSUFFIX" IRC|"PACKAGE"-"VERSION" P"
|
||||
#define COMMAND_LEN 513 /* max. IRC command length, see. RFC 2812, 3.2 */
|
||||
|
||||
#define STARTUP_DELAY 1 /* Erst n Sek. nach Start zu anderen Servern verbinden */
|
||||
#define RECONNECT_DELAY 3 /* Server-Links erst nach 3 Sekunden versuchen, wieder aufzubauen */
|
||||
#define READBUFFER_LEN 2048 /* size of the read buffer of a connection (bytes) */
|
||||
#define WRITEBUFFER_LEN 4096 /* size of the write buffer of a connection (bytes) */
|
||||
|
||||
#define USERMODES "aio" /* unterstuetzte User-Modes */
|
||||
#define CHANMODES "amnopqstv" /* unterstuetzte Channel-Modes */
|
||||
#ifdef ZLIB
|
||||
#define ZREADBUFFER_LEN 1024 /* compressed read buffer of a connection (bytes) */
|
||||
#define ZWRITEBUFFER_LEN 4096 /* compressed write buffer of a connection (bytes) */
|
||||
#endif
|
||||
|
||||
#define CONNECTED TRUE /* fuer die irc-xxx-Module */
|
||||
#define DISCONNECTED FALSE
|
||||
#define PROTOVER "0210" /* implemented IRC protocol version (see RFC 2813, 4.1.1) */
|
||||
#define PROTOIRC "-IRC" /* protocol suffix (see RFC 2813, 4.1.1) */
|
||||
#define PROTOIRCPLUS "-IRC+" /* protokol suffix for IRC+ protocol (see doc/Protocol.txt) */
|
||||
|
||||
#ifdef IRCPLUS
|
||||
# define IRCPLUSFLAGS "CL" /* standard IRC+ flags */
|
||||
#endif
|
||||
|
||||
#define STARTUP_DELAY 1 /* delay outgoing connections n seconds after startup */
|
||||
#define RECONNECT_DELAY 3 /* time to delay re-connect attempts (seconds) */
|
||||
|
||||
#define USERMODES "aios" /* supported user modes */
|
||||
#define CHANMODES "biklImnoPstv" /* supported channel modes */
|
||||
|
||||
#define CONNECTED true /* internal status codes */
|
||||
#define DISCONNECTED false
|
||||
|
||||
#define DEFAULT_AWAY_MSG "Away" /* away message for users connected to linked servers */
|
||||
|
||||
#define CONFIG_FILE "/ngircd.conf"
|
||||
#define MOTD_FILE "/ngircd.motd"
|
||||
#define MOTD_PHRASE ""
|
||||
#define CHROOT_DIR ""
|
||||
#define PID_FILE ""
|
||||
|
||||
#define ERROR_DIR "/tmp"
|
||||
|
||||
#define MAX_LOG_MSG_LEN 256 /* max. length of a log message */
|
||||
|
||||
#define TOKEN_OUTBOUND -2 /* tag for outbound server links */
|
||||
|
||||
#define NOTICE_TXTPREFIX "" /* prefix for NOTICEs from the server to users */
|
||||
|
||||
#define CUT_TXTSUFFIX "[CUT]" /* Suffix for oversized messages that
|
||||
have been shortened and cut off. */
|
||||
#ifdef RENDEZVOUS
|
||||
#define RENDEZVOUS_TYPE "_ircu._tcp." /* service type to register with Rendezvous */
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: global.h,v 1.7 2002/02/25 11:42:15 alex Exp $
|
||||
*
|
||||
* global.h: Globaler Header, wir in jedes(!) Modul eingebunden.
|
||||
*
|
||||
* $Log: global.h,v $
|
||||
* Revision 1.7 2002/02/25 11:42:15 alex
|
||||
* - unter A/UX wird _POSIX_SOURCE definiert: fuer Systemheader notwendig.
|
||||
*
|
||||
* Revision 1.6 2002/01/05 15:55:11 alex
|
||||
* - Wrapper fuer inet_aton(): liefert immer Fehler.
|
||||
*
|
||||
* Revision 1.5 2002/01/02 02:42:58 alex
|
||||
* - Copyright-Texte aktualisiert.
|
||||
*
|
||||
* Revision 1.4 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.3 2001/12/14 08:14:34 alex
|
||||
* - NONE als -1 definiert. Macht den Source lesbarer ;-)
|
||||
*
|
||||
* Revision 1.2 2001/12/12 01:58:53 alex
|
||||
* - Test auf socklen_t verbessert.
|
||||
*
|
||||
* Revision 1.1.1.1 2001/12/11 21:53:04 alex
|
||||
* Imported sources to CVS.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __global_h__
|
||||
#define __global_h__
|
||||
|
||||
|
||||
#include "config.h"
|
||||
#include "defines.h"
|
||||
|
||||
#if OS_UNIX_AUX
|
||||
#define _POSIX_SOURCE /* muss unter A/UX definiert sein */
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_socklen_t
|
||||
#define socklen_t int /* u.a. fuer Mac OS X */
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_INET_ATON
|
||||
#define inet_aton( opt, bind ) 0 /* Dummy fuer inet_aton() */
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
||||
125
src/ngircd/hash.c
Normal file
125
src/ngircd/hash.c
Normal file
@@ -0,0 +1,125 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* Hash calculation
|
||||
*/
|
||||
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: hash.c,v 1.11 2005/03/19 18:43:48 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "defines.h"
|
||||
#include "tool.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "hash.h"
|
||||
|
||||
|
||||
LOCAL UINT32 jenkins_hash PARAMS(( register UINT8 *k, register UINT32 length, register UINT32 initval ));
|
||||
|
||||
|
||||
GLOBAL UINT32
|
||||
Hash( char *String )
|
||||
{
|
||||
/* Hash-Wert ueber String berechnen */
|
||||
|
||||
char buffer[LINE_LEN];
|
||||
|
||||
strlcpy( buffer, String, sizeof( buffer ));
|
||||
return jenkins_hash( (UINT8 *)ngt_LowerStr( buffer ), strlen( buffer ), 42 );
|
||||
} /* Hash */
|
||||
|
||||
|
||||
/*
|
||||
* Die hier verwendete Hash-Funktion stammt aus lookup2.c von Bob Jenkins
|
||||
* (URL: <http://burtleburtle.net/bob/c/lookup2.c>). Aus dem Header:
|
||||
* --------------------------------------------------------------------
|
||||
* lookup2.c, by Bob Jenkins, December 1996, Public Domain.
|
||||
* hash(), hash2(), hash3, and mix() are externally useful functions.
|
||||
* Routines to test the hash are included if SELF_TEST is defined.
|
||||
* You can use this free for any purpose. It has no warranty.
|
||||
* --------------------------------------------------------------------
|
||||
* nicht alle seiner Funktionen werden hier genutzt.
|
||||
*/
|
||||
|
||||
|
||||
#define hashsize(n) ((UINT32)1<<(n))
|
||||
#define hashmask(n) (hashsize(n)-1)
|
||||
|
||||
#define mix(a,b,c) \
|
||||
{ \
|
||||
a -= b; a -= c; a ^= (c>>13); \
|
||||
b -= c; b -= a; b ^= (a<<8); \
|
||||
c -= a; c -= b; c ^= (b>>13); \
|
||||
a -= b; a -= c; a ^= (c>>12); \
|
||||
b -= c; b -= a; b ^= (a<<16); \
|
||||
c -= a; c -= b; c ^= (b>>5); \
|
||||
a -= b; a -= c; a ^= (c>>3); \
|
||||
b -= c; b -= a; b ^= (a<<10); \
|
||||
c -= a; c -= b; c ^= (b>>15); \
|
||||
} /* mix */
|
||||
|
||||
|
||||
LOCAL UINT32
|
||||
jenkins_hash( register UINT8 *k, register UINT32 length, register UINT32 initval )
|
||||
{
|
||||
/* k: the key
|
||||
* length: length of the key
|
||||
* initval: the previous hash, or an arbitrary value
|
||||
*/
|
||||
|
||||
register UINT32 a,b,c,len;
|
||||
|
||||
/* Set up the internal state */
|
||||
len = length;
|
||||
a = b = 0x9e3779b9; /* the golden ratio; an arbitrary value */
|
||||
c = initval; /* the previous hash value */
|
||||
|
||||
/* handle most of the key */
|
||||
while (len >= 12)
|
||||
{
|
||||
a += (k[0] +((UINT32)k[1]<<8) +((UINT32)k[2]<<16) +((UINT32)k[3]<<24));
|
||||
b += (k[4] +((UINT32)k[5]<<8) +((UINT32)k[6]<<16) +((UINT32)k[7]<<24));
|
||||
c += (k[8] +((UINT32)k[9]<<8) +((UINT32)k[10]<<16)+((UINT32)k[11]<<24));
|
||||
mix(a,b,c);
|
||||
k += 12; len -= 12;
|
||||
}
|
||||
|
||||
/* handle the last 11 bytes */
|
||||
c += length;
|
||||
switch( (int)len ) /* all the case statements fall through */
|
||||
{
|
||||
case 11: c+=((UINT32)k[10]<<24);
|
||||
case 10: c+=((UINT32)k[9]<<16);
|
||||
case 9 : c+=((UINT32)k[8]<<8);
|
||||
/* the first byte of c is reserved for the length */
|
||||
case 8 : b+=((UINT32)k[7]<<24);
|
||||
case 7 : b+=((UINT32)k[6]<<16);
|
||||
case 6 : b+=((UINT32)k[5]<<8);
|
||||
case 5 : b+=k[4];
|
||||
case 4 : a+=((UINT32)k[3]<<24);
|
||||
case 3 : a+=((UINT32)k[2]<<16);
|
||||
case 2 : a+=((UINT32)k[1]<<8);
|
||||
case 1 : a+=k[0];
|
||||
/* case 0: nothing left to add */
|
||||
}
|
||||
mix(a,b,c);
|
||||
|
||||
/* report the result */
|
||||
return c;
|
||||
} /* jenkins_hash */
|
||||
|
||||
|
||||
/* -eof- */
|
||||
27
src/ngircd/hash.h
Normal file
27
src/ngircd/hash.h
Normal file
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: hash.h,v 1.5 2005/03/19 18:43:48 fw Exp $
|
||||
*
|
||||
* Hash calculation (header)
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __hash_h__
|
||||
#define __hash_h__
|
||||
|
||||
|
||||
GLOBAL UINT32 Hash PARAMS((char *String ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
||||
490
src/ngircd/irc-channel.c
Normal file
490
src/ngircd/irc-channel.c
Normal file
@@ -0,0 +1,490 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* IRC channel commands
|
||||
*/
|
||||
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: irc-channel.c,v 1.30.2.2 2006/03/16 20:14:46 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "defines.h"
|
||||
#include "conn.h"
|
||||
#include "client.h"
|
||||
#include "channel.h"
|
||||
#include "lists.h"
|
||||
#include "log.h"
|
||||
#include "match.h"
|
||||
#include "messages.h"
|
||||
#include "parse.h"
|
||||
#include "irc-info.h"
|
||||
#include "irc-write.h"
|
||||
#include "resolve.h"
|
||||
#include "conf.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "irc-channel.h"
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
char *channame, *key, *flags, *topic, modes[8];
|
||||
bool is_new_chan, is_invited, is_banned;
|
||||
CLIENT *target;
|
||||
CHANNEL *chan;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Bad number of arguments? */
|
||||
if(( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
/* Who is the sender? */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER ) target = Client_Search( Req->prefix );
|
||||
else target = Client;
|
||||
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
|
||||
|
||||
/* Are channel keys given? */
|
||||
if( Req->argc > 1 ) key = Req->argv[1];
|
||||
else key = NULL;
|
||||
|
||||
/* Channel-Namen durchgehen */
|
||||
chan = NULL;
|
||||
channame = strtok( Req->argv[0], "," );
|
||||
while( channame )
|
||||
{
|
||||
chan = NULL; flags = NULL;
|
||||
|
||||
/* wird der Channel neu angelegt? */
|
||||
if( Channel_Search( channame )) is_new_chan = false;
|
||||
else is_new_chan = true;
|
||||
|
||||
/* Hat ein Server Channel-User-Modes uebergeben? */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
/* Channel-Flags extrahieren */
|
||||
flags = strchr( channame, 0x7 );
|
||||
if( flags )
|
||||
{
|
||||
*flags = '\0';
|
||||
flags++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Local client? */
|
||||
if( Client_Type( Client ) == CLIENT_USER )
|
||||
{
|
||||
/* Test if the user has reached his maximum channel count */
|
||||
if(( Conf_MaxJoins > 0 ) && ( Channel_CountForUser( Client ) >= Conf_MaxJoins ))
|
||||
return IRC_WriteStrClient( Client, ERR_TOOMANYCHANNELS_MSG,
|
||||
Client_ID( Client ), channame );
|
||||
|
||||
/* Existiert der Channel bereits, oder wird er im Moment neu erzeugt? */
|
||||
if( is_new_chan )
|
||||
{
|
||||
/* Erster User im Channel: Operator-Flag setzen */
|
||||
flags = "o";
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Existierenden Channel suchen */
|
||||
chan = Channel_Search( channame );
|
||||
assert( chan != NULL );
|
||||
|
||||
is_banned = Lists_CheckBanned( target, chan );
|
||||
is_invited = Lists_CheckInvited( target, chan );
|
||||
|
||||
/* Testen, ob Client gebanned ist */
|
||||
if(( is_banned == true) && ( is_invited == false ))
|
||||
{
|
||||
/* Client ist gebanned (und nicht invited): */
|
||||
IRC_WriteStrClient( Client, ERR_BANNEDFROMCHAN_MSG, Client_ID( Client ), channame );
|
||||
|
||||
/* Try next name, if any */
|
||||
channame = strtok( NULL, "," );
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Ist der Channel "invite-only"? */
|
||||
if(( strchr( Channel_Modes( chan ), 'i' )) && ( is_invited == false ))
|
||||
{
|
||||
/* Channel ist "invite-only" und Client wurde nicht invited: */
|
||||
IRC_WriteStrClient( Client, ERR_INVITEONLYCHAN_MSG, Client_ID( Client ), channame );
|
||||
|
||||
/* Try next name, if any */
|
||||
channame = strtok( NULL, "," );
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Is the channel protected by a key? */
|
||||
if(( strchr( Channel_Modes( chan ), 'k' )) && ( strcmp( Channel_Key( chan ), key ? key : "" ) != 0 ))
|
||||
{
|
||||
/* Bad channel key! */
|
||||
IRC_WriteStrClient( Client, ERR_BADCHANNELKEY_MSG, Client_ID( Client ), channame );
|
||||
|
||||
/* Try next name, if any */
|
||||
channame = strtok( NULL, "," );
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Are there already too many members? */
|
||||
if(( strchr( Channel_Modes( chan ), 'l' )) && ( Channel_MaxUsers( chan ) <= Channel_MemberCount( chan )))
|
||||
{
|
||||
/* Bad channel key! */
|
||||
IRC_WriteStrClient( Client, ERR_CHANNELISFULL_MSG, Client_ID( Client ), channame );
|
||||
|
||||
/* Try next name, if any */
|
||||
channame = strtok( NULL, "," );
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Remote server: we don't need to know whether the
|
||||
* client is invited or not, but we have to make sure
|
||||
* that the "one shot" entries (generated by INVITE
|
||||
* commands) in this list become deleted when a user
|
||||
* joins a channel this way. */
|
||||
chan = Channel_Search( channame );
|
||||
if( chan != NULL ) (void)Lists_CheckInvited( target, chan );
|
||||
}
|
||||
|
||||
/* Channel joinen (und ggf. anlegen) */
|
||||
if( ! Channel_Join( target, channame ))
|
||||
{
|
||||
/* naechsten Namen ermitteln */
|
||||
channame = strtok( NULL, "," );
|
||||
continue;
|
||||
}
|
||||
if( ! chan ) chan = Channel_Search( channame );
|
||||
assert( chan != NULL );
|
||||
|
||||
/* Modes setzen (wenn vorhanden) */
|
||||
while( flags && *flags )
|
||||
{
|
||||
Channel_UserModeAdd( chan, target, *flags );
|
||||
flags++;
|
||||
}
|
||||
|
||||
/* Wenn persistenter Channel und IRC-Operator: zum Channel-OP machen */
|
||||
if(( strchr( Channel_Modes( chan ), 'P' )) && ( strchr( Client_Modes( target ), 'o' ))) Channel_UserModeAdd( chan, target, 'o' );
|
||||
|
||||
/* Muessen Modes an andere Server gemeldet werden? */
|
||||
strlcpy( &modes[1], Channel_UserModes( chan, target ), sizeof( modes ) - 1 );
|
||||
if( modes[1] ) modes[0] = 0x7;
|
||||
else modes[0] = '\0';
|
||||
|
||||
/* An andere Server weiterleiten */
|
||||
IRC_WriteStrServersPrefix( Client, target, "JOIN :%s%s", channame, modes );
|
||||
|
||||
/* im Channel bekannt machen */
|
||||
IRC_WriteStrChannelPrefix( Client, chan, target, false, "JOIN :%s", channame );
|
||||
if( modes[1] )
|
||||
{
|
||||
/* Modes im Channel bekannt machen */
|
||||
IRC_WriteStrChannelPrefix( Client, chan, target, false, "MODE %s +%s %s", channame, &modes[1], Client_ID( target ));
|
||||
}
|
||||
|
||||
if( Client_Type( Client ) == CLIENT_USER )
|
||||
{
|
||||
/* an Client bestaetigen */
|
||||
IRC_WriteStrClientPrefix( Client, target, "JOIN :%s", channame );
|
||||
|
||||
/* Topic an Client schicken */
|
||||
topic = Channel_Topic( chan );
|
||||
if( *topic ) IRC_WriteStrClient( Client, RPL_TOPIC_MSG, Client_ID( Client ), channame, topic );
|
||||
|
||||
/* Mitglieder an Client Melden */
|
||||
IRC_Send_NAMES( Client, chan );
|
||||
IRC_WriteStrClient( Client, RPL_ENDOFNAMES_MSG, Client_ID( Client ), Channel_Name( chan ));
|
||||
}
|
||||
|
||||
/* naechsten Namen ermitteln */
|
||||
channame = strtok( NULL, "," );
|
||||
}
|
||||
return CONNECTED;
|
||||
} /* IRC_JOIN */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
IRC_PART( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target;
|
||||
char *chan;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if(( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
/* Wer ist der Absender? */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER ) target = Client_Search( Req->prefix );
|
||||
else target = Client;
|
||||
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
|
||||
|
||||
/* Channel-Namen durchgehen */
|
||||
chan = strtok( Req->argv[0], "," );
|
||||
while( chan )
|
||||
{
|
||||
if( ! Channel_Part( target, Client, chan, Req->argc > 1 ? Req->argv[1] : Client_ID( target )))
|
||||
{
|
||||
/* naechsten Namen ermitteln */
|
||||
chan = strtok( NULL, "," );
|
||||
continue;
|
||||
}
|
||||
|
||||
/* naechsten Namen ermitteln */
|
||||
chan = strtok( NULL, "," );
|
||||
}
|
||||
return CONNECTED;
|
||||
} /* IRC_PART */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
IRC_TOPIC( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CHANNEL *chan;
|
||||
CLIENT *from;
|
||||
char *topic;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if(( Req->argc < 1 ) || ( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
|
||||
else from = Client;
|
||||
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
|
||||
|
||||
/* Welcher Channel? */
|
||||
chan = Channel_Search( Req->argv[0] );
|
||||
if( ! chan ) return IRC_WriteStrClient( from, ERR_NOSUCHCHANNEL_MSG, Client_ID( from ), Req->argv[0] );
|
||||
|
||||
/* Ist der User Mitglied in dem Channel? */
|
||||
if( ! Channel_IsMemberOf( chan, from )) return IRC_WriteStrClient( from, ERR_NOTONCHANNEL_MSG, Client_ID( from ), Req->argv[0] );
|
||||
|
||||
if( Req->argc == 1 )
|
||||
{
|
||||
/* Topic erfragen */
|
||||
topic = Channel_Topic( chan );
|
||||
if( *topic ) return IRC_WriteStrClient( from, RPL_TOPIC_MSG, Client_ID( from ), Channel_Name( chan ), topic );
|
||||
else return IRC_WriteStrClient( from, RPL_NOTOPIC_MSG, Client_ID( from ), Channel_Name( chan ));
|
||||
}
|
||||
|
||||
if( strchr( Channel_Modes( chan ), 't' ))
|
||||
{
|
||||
/* Topic Lock. Ist der User ein Channel Operator? */
|
||||
if( ! strchr( Channel_UserModes( chan, from ), 'o' )) return IRC_WriteStrClient( from, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( from ), Channel_Name( chan ));
|
||||
}
|
||||
|
||||
/* Topic setzen */
|
||||
Channel_SetTopic( chan, Req->argv[1] );
|
||||
Log( LOG_DEBUG, "User \"%s\" set topic on \"%s\": %s", Client_Mask( from ), Channel_Name( chan ), Req->argv[1][0] ? Req->argv[1] : "<none>" );
|
||||
|
||||
/* im Channel bekannt machen und an Server weiterleiten */
|
||||
IRC_WriteStrServersPrefix( Client, from, "TOPIC %s :%s", Req->argv[0], Req->argv[1] );
|
||||
IRC_WriteStrChannelPrefix( Client, chan, from, false, "TOPIC %s :%s", Req->argv[0], Req->argv[1] );
|
||||
|
||||
if( Client_Type( Client ) == CLIENT_USER ) return IRC_WriteStrClientPrefix( Client, Client, "TOPIC %s :%s", Req->argv[0], Req->argv[1] );
|
||||
else return CONNECTED;
|
||||
} /* IRC_TOPIC */
|
||||
|
||||
|
||||
/**
|
||||
* Handler for the IRC "LIST" command.
|
||||
* This implementation handles the local case as well as the forwarding of the
|
||||
* LIST command to other servers in the IRC network.
|
||||
*/
|
||||
GLOBAL bool
|
||||
IRC_LIST( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
char *pattern;
|
||||
CHANNEL *chan;
|
||||
CLIENT *from, *target;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Bad number of prameters? */
|
||||
if( Req->argc > 2 )
|
||||
return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG,
|
||||
Client_ID( Client ), Req->command );
|
||||
|
||||
if( Req->argc > 0 )
|
||||
pattern = strtok( Req->argv[0], "," );
|
||||
else
|
||||
pattern = "*";
|
||||
|
||||
/* Get sender from prefix, if any */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
from = Client_Search( Req->prefix );
|
||||
else
|
||||
from = Client;
|
||||
|
||||
if( ! from )
|
||||
return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG,
|
||||
Client_ID( Client ), Req->prefix );
|
||||
|
||||
if( Req->argc == 2 )
|
||||
{
|
||||
/* Forward to other server? */
|
||||
target = Client_Search( Req->argv[1] );
|
||||
if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER ))
|
||||
return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG,
|
||||
Client_ID( Client ), Req->argv[1] );
|
||||
|
||||
if( target != Client_ThisServer( ))
|
||||
{
|
||||
/* Target is indeed an other server, forward it! */
|
||||
return IRC_WriteStrClientPrefix( target, from,
|
||||
"LIST %s :%s", Client_ID( from ),
|
||||
Req->argv[1] );
|
||||
}
|
||||
}
|
||||
|
||||
while( pattern )
|
||||
{
|
||||
/* Loop through all the channels */
|
||||
chan = Channel_First( );
|
||||
while( chan )
|
||||
{
|
||||
/* Check search pattern */
|
||||
if( Match( pattern, Channel_Name( chan )))
|
||||
{
|
||||
/* Gotcha! */
|
||||
if( ! strchr( Channel_Modes( chan ), 's' ) ||
|
||||
Channel_IsMemberOf( chan, from ))
|
||||
{
|
||||
if( ! IRC_WriteStrClient( from,
|
||||
RPL_LIST_MSG, Client_ID( from ),
|
||||
Channel_Name( chan ),
|
||||
Channel_MemberCount( chan ),
|
||||
Channel_Topic( chan )))
|
||||
return DISCONNECTED;
|
||||
}
|
||||
}
|
||||
chan = Channel_Next( chan );
|
||||
}
|
||||
|
||||
/* Get next name ... */
|
||||
if( Req->argc > 0 )
|
||||
pattern = strtok( NULL, "," );
|
||||
else
|
||||
pattern = NULL;
|
||||
}
|
||||
|
||||
return IRC_WriteStrClient( from, RPL_LISTEND_MSG, Client_ID( from ));
|
||||
} /* IRC_LIST */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
IRC_CHANINFO( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
char modes_add[COMMAND_LEN], l[16], *ptr;
|
||||
CLIENT *from;
|
||||
CHANNEL *chan;
|
||||
int arg_topic;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Bad number of parameters? */
|
||||
if(( Req->argc < 2 ) || ( Req->argc == 4 ) || ( Req->argc > 5 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
/* Compatibility kludge */
|
||||
if( Req->argc == 5 ) arg_topic = 4;
|
||||
else if( Req->argc == 3 ) arg_topic = 2;
|
||||
else arg_topic = -1;
|
||||
|
||||
/* Search origin */
|
||||
from = Client_Search( Req->prefix );
|
||||
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
|
||||
|
||||
/* Search or create channel */
|
||||
chan = Channel_Search( Req->argv[0] );
|
||||
if( ! chan ) chan = Channel_Create( Req->argv[0] );
|
||||
if( ! chan ) return CONNECTED;
|
||||
|
||||
if( Req->argv[1][0] == '+' )
|
||||
{
|
||||
ptr = Channel_Modes( chan );
|
||||
if( ! *ptr )
|
||||
{
|
||||
/* OK, this channel doesn't have modes jet, set the received ones: */
|
||||
Channel_SetModes( chan, &Req->argv[1][1] );
|
||||
|
||||
if( Req->argc == 5 )
|
||||
{
|
||||
if( strchr( Channel_Modes( chan ), 'k' )) Channel_SetKey( chan, Req->argv[2] );
|
||||
if( strchr( Channel_Modes( chan ), 'l' )) Channel_SetMaxUsers( chan, atol( Req->argv[3] ));
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Delete modes which we never want to inherit */
|
||||
Channel_ModeDel( chan, 'l' );
|
||||
Channel_ModeDel( chan, 'k' );
|
||||
}
|
||||
|
||||
strcpy( modes_add, "" );
|
||||
ptr = Channel_Modes( chan );
|
||||
while( *ptr )
|
||||
{
|
||||
if( *ptr == 'l' )
|
||||
{
|
||||
snprintf( l, sizeof( l ), " %ld", Channel_MaxUsers( chan ));
|
||||
strlcat( modes_add, l, sizeof( modes_add ));
|
||||
}
|
||||
if( *ptr == 'k' )
|
||||
{
|
||||
strlcat( modes_add, " ", sizeof( modes_add ));
|
||||
strlcat( modes_add, Channel_Key( chan ), sizeof( modes_add ));
|
||||
}
|
||||
ptr++;
|
||||
}
|
||||
|
||||
/* Inform members of this channel */
|
||||
IRC_WriteStrChannelPrefix( Client, chan, from, false, "MODE %s +%s%s", Req->argv[0], Channel_Modes( chan ), modes_add );
|
||||
}
|
||||
}
|
||||
else Log( LOG_WARNING, "CHANINFO: invalid MODE format ignored!" );
|
||||
|
||||
if( arg_topic > 0 )
|
||||
{
|
||||
/* We got a topic */
|
||||
ptr = Channel_Topic( chan );
|
||||
if(( ! *ptr ) && ( Req->argv[arg_topic][0] ))
|
||||
{
|
||||
/* OK, there is no topic jet */
|
||||
Channel_SetTopic( chan, Req->argv[arg_topic] );
|
||||
IRC_WriteStrChannelPrefix( Client, chan, from, false, "TOPIC %s :%s", Req->argv[0], Channel_Topic( chan ));
|
||||
}
|
||||
}
|
||||
|
||||
/* Forward CHANINFO to other serevrs */
|
||||
if( Req->argc == 5 ) IRC_WriteStrServersPrefixFlag( Client, from, 'C', "CHANINFO %s %s %s %s :%s", Req->argv[0], Req->argv[1], Req->argv[2], Req->argv[3], Req->argv[4] );
|
||||
else if( Req->argc == 3 ) IRC_WriteStrServersPrefixFlag( Client, from, 'C', "CHANINFO %s %s :%s", Req->argv[0], Req->argv[1], Req->argv[2] );
|
||||
else IRC_WriteStrServersPrefixFlag( Client, from, 'C', "CHANINFO %s %s", Req->argv[0], Req->argv[1] );
|
||||
|
||||
return CONNECTED;
|
||||
} /* IRC_CHANINFO */
|
||||
|
||||
|
||||
/* -eof- */
|
||||
33
src/ngircd/irc-channel.h
Normal file
33
src/ngircd/irc-channel.h
Normal file
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: irc-channel.h,v 1.7 2005/03/19 18:43:48 fw Exp $
|
||||
*
|
||||
* IRC channel commands (header)
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __irc_channel_h__
|
||||
#define __irc_channel_h__
|
||||
|
||||
|
||||
GLOBAL bool IRC_JOIN PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_PART PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_TOPIC PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
GLOBAL bool IRC_LIST PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
GLOBAL bool IRC_CHANINFO PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
||||
1021
src/ngircd/irc-info.c
Normal file
1021
src/ngircd/irc-info.c
Normal file
File diff suppressed because it is too large
Load Diff
44
src/ngircd/irc-info.h
Normal file
44
src/ngircd/irc-info.h
Normal file
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: irc-info.h,v 1.3 2005/03/19 18:43:48 fw Exp $
|
||||
*
|
||||
* IRC info commands (header)
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __irc_info_h__
|
||||
#define __irc_info_h__
|
||||
|
||||
|
||||
GLOBAL bool IRC_ADMIN PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_ISON PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_LINKS PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_LUSERS PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_MOTD PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_NAMES PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_STATS PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_TIME PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_USERHOST PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_VERSION PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_WHO PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_WHOIS PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_WHOWAS PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
GLOBAL bool IRC_Send_LUSERS PARAMS(( CLIENT *Client ));
|
||||
GLOBAL bool IRC_Send_NAMES PARAMS(( CLIENT *Client, CHANNEL *Chan ));
|
||||
GLOBAL bool IRC_Show_MOTD PARAMS(( CLIENT *Client ));
|
||||
GLOBAL bool IRC_Send_WHO PARAMS(( CLIENT *Client, CHANNEL *Chan, bool OnlyOps ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
||||
@@ -2,53 +2,51 @@
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: irc-login.c,v 1.2 2002/03/02 00:49:11 alex Exp $
|
||||
*
|
||||
* irc-login.c: Anmeldung und Abmeldung im IRC
|
||||
*
|
||||
* $Log: irc-login.c,v $
|
||||
* Revision 1.2 2002/03/02 00:49:11 alex
|
||||
* - Bei der USER-Registrierung wird NICK nicht mehr sofort geforwarded,
|
||||
* sondern erst dann, wenn auch ein gueltiges USER empfangen wurde.
|
||||
*
|
||||
* Revision 1.1 2002/02/27 23:26:21 alex
|
||||
* - Modul aus irc.c bzw. irc.h ausgegliedert.
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* Login and logout
|
||||
*/
|
||||
|
||||
|
||||
#include <portab.h>
|
||||
#include "global.h"
|
||||
#include "portab.h"
|
||||
|
||||
#include <imp.h>
|
||||
static char UNUSED id[] = "$Id: irc-login.c,v 1.44.2.1 2005/12/15 11:01:59 alex Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <strings.h>
|
||||
|
||||
#include "ngircd.h"
|
||||
#include "resolve.h"
|
||||
#include "conn-func.h"
|
||||
#include "conf.h"
|
||||
#include "irc.h"
|
||||
#include "irc-write.h"
|
||||
#include "client.h"
|
||||
#include "channel.h"
|
||||
#include "log.h"
|
||||
#include "messages.h"
|
||||
#include "parse.h"
|
||||
#include "irc.h"
|
||||
#include "irc-info.h"
|
||||
#include "irc-write.h"
|
||||
#include "cvs-version.h"
|
||||
|
||||
#include <exp.h>
|
||||
#include "exp.h"
|
||||
#include "irc-login.h"
|
||||
|
||||
|
||||
LOCAL BOOLEAN Hello_User( CLIENT *Client );
|
||||
LOCAL VOID Kill_Nick( CHAR *Nick, CHAR *Reason );
|
||||
LOCAL bool Hello_User PARAMS(( CLIENT *Client ));
|
||||
LOCAL void Kill_Nick PARAMS(( char *Nick, char *Reason ));
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_PASS( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL bool
|
||||
IRC_PASS( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
@@ -69,13 +67,71 @@ GLOBAL BOOLEAN IRC_PASS( CLIENT *Client, REQUEST *Req )
|
||||
}
|
||||
else if((( Client_Type( Client ) == CLIENT_UNKNOWN ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER )) && (( Req->argc == 3 ) || ( Req->argc == 4 )))
|
||||
{
|
||||
char c2, c4, *type, *impl, *serverver, *flags, *ptr, *ircflags;
|
||||
int protohigh, protolow;
|
||||
|
||||
/* noch nicht registrierte Server-Verbindung */
|
||||
Log( LOG_DEBUG, "Connection %d: got PASS command (new server link) ...", Client_Conn( Client ));
|
||||
|
||||
/* Passwort speichern */
|
||||
Client_SetPassword( Client, Req->argv[0] );
|
||||
|
||||
/* Protokollversion ermitteln */
|
||||
if( strlen( Req->argv[1] ) >= 4 )
|
||||
{
|
||||
c2 = Req->argv[1][2];
|
||||
c4 = Req->argv[1][4];
|
||||
|
||||
Req->argv[1][4] = '\0';
|
||||
protolow = atoi( &Req->argv[1][2] );
|
||||
Req->argv[1][2] = '\0';
|
||||
protohigh = atoi( Req->argv[1] );
|
||||
|
||||
Req->argv[1][2] = c2;
|
||||
Req->argv[1][4] = c4;
|
||||
}
|
||||
else protohigh = protolow = 0;
|
||||
|
||||
/* Protokoll-Typ */
|
||||
if( strlen( Req->argv[1] ) > 4 ) type = &Req->argv[1][4];
|
||||
else type = NULL;
|
||||
|
||||
/* IRC-Flags (nach RFC 2813) */
|
||||
if( Req->argc >= 4 ) ircflags = Req->argv[3];
|
||||
else ircflags = "";
|
||||
|
||||
/* Implementation, Version und ngIRCd-Flags */
|
||||
impl = Req->argv[2];
|
||||
ptr = strchr( impl, '|' );
|
||||
if( ptr ) *ptr = '\0';
|
||||
|
||||
if( type && ( strcmp( type, PROTOIRCPLUS ) == 0 ))
|
||||
{
|
||||
/* auf der anderen Seite laeuft ein Server, der
|
||||
* ebenfalls das IRC+-Protokoll versteht */
|
||||
serverver = ptr + 1;
|
||||
flags = strchr( serverver, ':' );
|
||||
if( flags )
|
||||
{
|
||||
*flags = '\0';
|
||||
flags++;
|
||||
}
|
||||
else flags = "";
|
||||
Log( LOG_INFO, "Peer announces itself as %s-%s using protocol %d.%d/IRC+ (flags: \"%s\").", impl, serverver, protohigh, protolow, flags );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* auf der anderen Seite laeuft ein Server, der
|
||||
* nur das Originalprotokoll unterstuetzt */
|
||||
serverver = "";
|
||||
if( strchr( ircflags, 'Z' )) flags = "Z";
|
||||
else flags = "";
|
||||
Log( LOG_INFO, "Peer announces itself as \"%s\" using protocol %d.%d (flags: \"%s\").", impl, protohigh, protolow, flags );
|
||||
}
|
||||
|
||||
Client_SetType( Client, CLIENT_GOTPASSSERVER );
|
||||
Client_SetFlags( Client, flags );
|
||||
|
||||
return CONNECTED;
|
||||
}
|
||||
else if(( Client_Type( Client ) == CLIENT_UNKNOWN ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER ))
|
||||
@@ -87,356 +143,152 @@ GLOBAL BOOLEAN IRC_PASS( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_PASS */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CHAR str[LINE_LEN], *ptr;
|
||||
CLIENT *from, *c, *cl;
|
||||
CL2CHAN *cl2chan;
|
||||
INT max_hops, i;
|
||||
CHANNEL *chan;
|
||||
BOOLEAN ok;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Fehler liefern, wenn kein lokaler Client */
|
||||
if( Client_Conn( Client ) <= NONE ) return IRC_WriteStrClient( Client, ERR_UNKNOWNCOMMAND_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
if( Client_Type( Client ) == CLIENT_GOTPASSSERVER )
|
||||
{
|
||||
/* Verbindung soll als Server-Server-Verbindung registriert werden */
|
||||
Log( LOG_DEBUG, "Connection %d: got SERVER command (new server link) ...", Client_Conn( Client ));
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if(( Req->argc != 2 ) && ( Req->argc != 3 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
/* Ist dieser Server bei uns konfiguriert? */
|
||||
for( i = 0; i < Conf_Server_Count; i++ ) if( strcasecmp( Req->argv[0], Conf_Server[i].name ) == 0 ) break;
|
||||
if( i >= Conf_Server_Count )
|
||||
{
|
||||
/* Server ist nicht konfiguriert! */
|
||||
Log( LOG_ERR, "Connection %d: Server \"%s\" not configured here!", Client_Conn( Client ), Req->argv[0] );
|
||||
Conn_Close( Client_Conn( Client ), NULL, "Server not configured here", TRUE );
|
||||
return DISCONNECTED;
|
||||
}
|
||||
if( strcmp( Client_Password( Client ), Conf_Server[i].pwd ) != 0 )
|
||||
{
|
||||
/* Falsches Passwort */
|
||||
Log( LOG_ERR, "Connection %d: Bad password for server \"%s\"!", Client_Conn( Client ), Req->argv[0] );
|
||||
Conn_Close( Client_Conn( Client ), NULL, "Bad password", TRUE );
|
||||
return DISCONNECTED;
|
||||
}
|
||||
|
||||
/* Ist ein Server mit dieser ID bereits registriert? */
|
||||
if( ! Client_CheckID( Client, Req->argv[0] )) return DISCONNECTED;
|
||||
|
||||
/* Server-Strukturen fuellen ;-) */
|
||||
Client_SetID( Client, Req->argv[0] );
|
||||
Client_SetHops( Client, 1 );
|
||||
Client_SetInfo( Client, Req->argv[Req->argc - 1] );
|
||||
|
||||
/* Meldet sich der Server bei uns an? */
|
||||
if( Req->argc == 2 )
|
||||
{
|
||||
/* Unseren SERVER- und PASS-Befehl senden */
|
||||
ok = TRUE;
|
||||
if( ! IRC_WriteStrClient( Client, "PASS %s "PASSSERVERADD, Conf_Server[i].pwd )) ok = FALSE;
|
||||
else ok = IRC_WriteStrClient( Client, "SERVER %s 1 :%s", Conf_ServerName, Conf_ServerInfo );
|
||||
if( ! ok )
|
||||
{
|
||||
Conn_Close( Client_Conn( Client ), "Unexpected server behavior!", NULL, FALSE );
|
||||
return DISCONNECTED;
|
||||
}
|
||||
Client_SetIntroducer( Client, Client );
|
||||
Client_SetToken( Client, 1 );
|
||||
}
|
||||
else Client_SetToken( Client, atoi( Req->argv[1] ));
|
||||
|
||||
Log( LOG_NOTICE, "Server \"%s\" registered (connection %d, 1 hop - direct link).", Client_ID( Client ), Client_Conn( Client ));
|
||||
|
||||
Client_SetType( Client, CLIENT_SERVER );
|
||||
|
||||
/* maximalen Hop Count ermitteln */
|
||||
max_hops = 0;
|
||||
c = Client_First( );
|
||||
while( c )
|
||||
{
|
||||
if( Client_Hops( c ) > max_hops ) max_hops = Client_Hops( c );
|
||||
c = Client_Next( c );
|
||||
}
|
||||
|
||||
/* Alle bisherigen Server dem neuen Server bekannt machen,
|
||||
* die bisherigen Server ueber den neuen informierenn */
|
||||
for( i = 0; i < ( max_hops + 1 ); i++ )
|
||||
{
|
||||
c = Client_First( );
|
||||
while( c )
|
||||
{
|
||||
if(( Client_Type( c ) == CLIENT_SERVER ) && ( c != Client ) && ( c != Client_ThisServer( )) && ( Client_Hops( c ) == i ))
|
||||
{
|
||||
if( Client_Conn( c ) > NONE )
|
||||
{
|
||||
/* Dem gefundenen Server gleich den neuen
|
||||
* Server bekannt machen */
|
||||
if( ! IRC_WriteStrClient( c, "SERVER %s %d %d :%s", Client_ID( Client ), Client_Hops( Client ) + 1, Client_MyToken( Client ), Client_Info( Client ))) return DISCONNECTED;
|
||||
}
|
||||
|
||||
/* Den neuen Server ueber den alten informieren */
|
||||
if( ! IRC_WriteStrClientPrefix( Client, Client_Hops( c ) == 1 ? Client_ThisServer( ) : Client_Introducer( c ), "SERVER %s %d %d :%s", Client_ID( c ), Client_Hops( c ) + 1, Client_MyToken( c ), Client_Info( c ))) return DISCONNECTED;
|
||||
}
|
||||
c = Client_Next( c );
|
||||
}
|
||||
}
|
||||
|
||||
/* alle User dem neuen Server bekannt machen */
|
||||
c = Client_First( );
|
||||
while( c )
|
||||
{
|
||||
if( Client_Type( c ) == CLIENT_USER )
|
||||
{
|
||||
/* User an neuen Server melden */
|
||||
if( ! IRC_WriteStrClient( Client, "NICK %s %d %s %s %d +%s :%s", Client_ID( c ), Client_Hops( c ) + 1, Client_User( c ), Client_Hostname( c ), Client_MyToken( Client_Introducer( c )), Client_Modes( c ), Client_Info( c ))) return DISCONNECTED;
|
||||
}
|
||||
c = Client_Next( c );
|
||||
}
|
||||
|
||||
/* Channels dem neuen Server bekannt machen */
|
||||
chan = Channel_First( );
|
||||
while( chan )
|
||||
{
|
||||
sprintf( str, "NJOIN %s :", Channel_Name( chan ));
|
||||
|
||||
/* alle Member suchen */
|
||||
cl2chan = Channel_FirstMember( chan );
|
||||
while( cl2chan )
|
||||
{
|
||||
cl = Channel_GetClient( cl2chan );
|
||||
assert( cl != NULL );
|
||||
|
||||
/* Nick, ggf. mit Modes, anhaengen */
|
||||
if( str[strlen( str ) - 1] != ':' ) strcat( str, "," );
|
||||
if( strchr( Channel_UserModes( chan, cl ), 'v' )) strcat( str, "+" );
|
||||
if( strchr( Channel_UserModes( chan, cl ), 'o' )) strcat( str, "@" );
|
||||
strcat( str, Client_ID( cl ));
|
||||
|
||||
if( strlen( str ) > ( LINE_LEN - CLIENT_NICK_LEN - 4 ))
|
||||
{
|
||||
/* Zeile senden */
|
||||
if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED;
|
||||
sprintf( str, "NJOIN %s :", Channel_Name( chan ));
|
||||
}
|
||||
|
||||
cl2chan = Channel_NextMember( chan, cl2chan );
|
||||
}
|
||||
|
||||
/* noch Daten da? */
|
||||
if( str[strlen( str ) - 1] != ':')
|
||||
{
|
||||
/* Ja; Also senden ... */
|
||||
if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED;
|
||||
}
|
||||
|
||||
/* naechsten Channel suchen */
|
||||
chan = Channel_Next( chan );
|
||||
}
|
||||
|
||||
return CONNECTED;
|
||||
}
|
||||
else if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
/* Neuer Server wird im Netz angekuendigt */
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc != 4 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
/* Ist ein Server mit dieser ID bereits registriert? */
|
||||
if( ! Client_CheckID( Client, Req->argv[0] )) return DISCONNECTED;
|
||||
|
||||
/* Ueberfluessige Hostnamen aus Info-Text entfernen */
|
||||
ptr = strchr( Req->argv[3] + 2, '[' );
|
||||
if( ! ptr ) ptr = Req->argv[3];
|
||||
|
||||
from = Client_GetFromID( Req->prefix );
|
||||
if( ! from )
|
||||
{
|
||||
/* Hm, Server, der diesen einfuehrt, ist nicht bekannt!? */
|
||||
Log( LOG_ALERT, "Unknown ID in prefix of SERVER: \"%s\"! (on connection %d)", Req->prefix, Client_Conn( Client ));
|
||||
Conn_Close( Client_Conn( Client ), NULL, "Unknown ID in prefix of SERVER", TRUE );
|
||||
return DISCONNECTED;
|
||||
}
|
||||
|
||||
/* Neue Client-Struktur anlegen */
|
||||
c = Client_NewRemoteServer( Client, Req->argv[0], from, atoi( Req->argv[1] ), atoi( Req->argv[2] ), ptr, TRUE );
|
||||
if( ! c )
|
||||
{
|
||||
/* Neue Client-Struktur konnte nicht angelegt werden */
|
||||
Log( LOG_ALERT, "Can't create client structure for server! (on connection %d)", Client_Conn( Client ));
|
||||
Conn_Close( Client_Conn( Client ), NULL, "Can't allocate client structure for remote server", TRUE );
|
||||
return DISCONNECTED;
|
||||
}
|
||||
|
||||
/* Log-Meldung zusammenbauen und ausgeben */
|
||||
if(( Client_Hops( c ) > 1 ) && ( Req->prefix[0] )) sprintf( str, "connected to %s, ", Client_ID( from ));
|
||||
else strcpy( str, "" );
|
||||
Log( LOG_NOTICE, "Server \"%s\" registered (via %s, %s%d hop%s).", Client_ID( c ), Client_ID( Client ), str, Client_Hops( c ), Client_Hops( c ) > 1 ? "s": "" );
|
||||
|
||||
/* Andere Server informieren */
|
||||
IRC_WriteStrServersPrefix( Client, from, "SERVER %s %d %d :%s", Client_ID( c ), Client_Hops( c ) + 1, Client_MyToken( c ), Client_Info( c ));
|
||||
|
||||
return CONNECTED;
|
||||
}
|
||||
else return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
} /* IRC_SERVER */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_NJOIN( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CHAR *channame, *ptr, modes[8];
|
||||
BOOLEAN is_op, is_voiced;
|
||||
CHANNEL *chan;
|
||||
CLIENT *c;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
if( Client_Type( Client ) != CLIENT_SERVER ) return IRC_WriteStrClient( Client, ERR_NOTREGISTEREDSERVER_MSG, Client_ID( Client ));
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
channame = Req->argv[0];
|
||||
ptr = strtok( Req->argv[1], "," );
|
||||
while( ptr )
|
||||
{
|
||||
is_op = is_voiced = FALSE;
|
||||
|
||||
/* Prefixe abschneiden */
|
||||
while(( *ptr == '@' ) || ( *ptr == '+' ))
|
||||
{
|
||||
if( *ptr == '@' ) is_op = TRUE;
|
||||
if( *ptr == '+' ) is_voiced = TRUE;
|
||||
ptr++;
|
||||
}
|
||||
|
||||
c = Client_GetFromID( ptr );
|
||||
if( c )
|
||||
{
|
||||
Channel_Join( c, channame );
|
||||
chan = Channel_Search( channame );
|
||||
assert( chan != NULL );
|
||||
|
||||
if( is_op ) Channel_UserModeAdd( chan, c, 'o' );
|
||||
if( is_voiced ) Channel_UserModeAdd( chan, c, 'v' );
|
||||
|
||||
/* im Channel bekannt machen */
|
||||
IRC_WriteStrChannelPrefix( Client, chan, c, FALSE, "JOIN :%s", channame );
|
||||
|
||||
/* Channel-User-Modes setzen */
|
||||
strcpy( modes, Channel_UserModes( chan, c ));
|
||||
if( modes[0] )
|
||||
{
|
||||
/* Modes im Channel bekannt machen */
|
||||
IRC_WriteStrChannelPrefix( Client, chan, Client, FALSE, "MODE %s +%s %s", channame, modes, Client_ID( c ));
|
||||
}
|
||||
}
|
||||
else Log( LOG_ERR, "Got NJOIN for unknown nick \"%s\" for channel \"%s\"!", ptr, channame );
|
||||
|
||||
/* naechsten Nick suchen */
|
||||
ptr = strtok( NULL, "," );
|
||||
}
|
||||
|
||||
/* an andere Server weiterleiten */
|
||||
IRC_WriteStrServersPrefix( Client, Client_ThisServer( ), "NJOIN %s :%s", Req->argv[0], Req->argv[1] );
|
||||
|
||||
return CONNECTED;
|
||||
} /* IRC_NJOIN */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_NICK( CLIENT *Client, REQUEST *Req )
|
||||
/**
|
||||
* IRC "NICK" command.
|
||||
* This function implements the IRC command "NICK" which is used to register
|
||||
* with the server, to change already registered nicknames and to introduce
|
||||
* new users which are connected to other servers.
|
||||
*/
|
||||
GLOBAL bool
|
||||
IRC_NICK( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *intr_c, *target, *c;
|
||||
CHAR *modes;
|
||||
char *modes;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Zumindest BitchX sendet NICK-USER in der falschen Reihenfolge. */
|
||||
#ifndef STRICT_RFC
|
||||
if( Client_Type( Client ) == CLIENT_UNKNOWN || Client_Type( Client ) == CLIENT_GOTPASS || Client_Type( Client ) == CLIENT_GOTNICK || Client_Type( Client ) == CLIENT_GOTUSER || Client_Type( Client ) == CLIENT_USER || ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
|
||||
/* Some IRC clients, for example BitchX, send the NICK and USER
|
||||
* commands in the wrong order ... */
|
||||
if( Client_Type( Client ) == CLIENT_UNKNOWN
|
||||
|| Client_Type( Client ) == CLIENT_GOTPASS
|
||||
|| Client_Type( Client ) == CLIENT_GOTNICK
|
||||
|| Client_Type( Client ) == CLIENT_GOTUSER
|
||||
|| Client_Type( Client ) == CLIENT_USER
|
||||
|| ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
|
||||
#else
|
||||
if( Client_Type( Client ) == CLIENT_UNKNOWN || Client_Type( Client ) == CLIENT_GOTPASS || Client_Type( Client ) == CLIENT_GOTNICK || Client_Type( Client ) == CLIENT_USER || ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
|
||||
if( Client_Type( Client ) == CLIENT_UNKNOWN
|
||||
|| Client_Type( Client ) == CLIENT_GOTPASS
|
||||
|| Client_Type( Client ) == CLIENT_GOTNICK
|
||||
|| Client_Type( Client ) == CLIENT_USER
|
||||
|| ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
|
||||
#endif
|
||||
{
|
||||
/* User-Registrierung bzw. Nick-Aenderung */
|
||||
/* User registration or change of nickname */
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc != 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
/* Wrong number of arguments? */
|
||||
if( Req->argc != 1 )
|
||||
return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG,
|
||||
Client_ID( Client ),
|
||||
Req->command );
|
||||
|
||||
/* "Ziel-Client" ermitteln */
|
||||
/* Search "target" client */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
target = Client_GetFromID( Req->prefix );
|
||||
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
|
||||
target = Client_Search( Req->prefix );
|
||||
if( ! target )
|
||||
return IRC_WriteStrClient( Client,
|
||||
ERR_NOSUCHNICK_MSG,
|
||||
Client_ID( Client ),
|
||||
Req->argv[0] );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Ist der Client "restricted"? */
|
||||
if( Client_HasMode( Client, 'r' )) return IRC_WriteStrClient( Client, ERR_RESTRICTED_MSG, Client_ID( Client ));
|
||||
/* Is this a restricted client? */
|
||||
if( Client_HasMode( Client, 'r' ))
|
||||
return IRC_WriteStrClient( Client,
|
||||
ERR_RESTRICTED_MSG,
|
||||
Client_ID( Client ));
|
||||
|
||||
target = Client;
|
||||
}
|
||||
|
||||
#ifndef STRICT_RFC
|
||||
/* Wenn der Client zu seinem eigenen Nick wechseln will, so machen
|
||||
* wir nichts. So macht es das Original und mind. Snak hat probleme,
|
||||
* wenn wir es nicht so machen. Ob es so okay ist? Hm ... */
|
||||
if( strcmp( Client_ID( target ), Req->argv[0] ) == 0 ) return CONNECTED;
|
||||
/* If the clients tries to change to its own nickname we won't
|
||||
* do anything. This is how the original ircd behaves and some
|
||||
* clients (for example Snak) expect it to be like this.
|
||||
* But I doubt that this is "really the right thing" ... */
|
||||
if( strcmp( Client_ID( target ), Req->argv[0] ) == 0 )
|
||||
return CONNECTED;
|
||||
#endif
|
||||
|
||||
/* pruefen, ob Nick bereits vergeben. Speziallfall: der Client
|
||||
* will nur die Gross- und Kleinschreibung aendern. Das darf
|
||||
* er natuerlich machen :-) */
|
||||
|
||||
/* Check that the new nickname is available. Special case:
|
||||
* the client only changes from/to upper to lower case. */
|
||||
if( strcasecmp( Client_ID( target ), Req->argv[0] ) != 0 )
|
||||
{
|
||||
if( ! Client_CheckNick( target, Req->argv[0] )) return CONNECTED;
|
||||
if( ! Client_CheckNick( target, Req->argv[0] ))
|
||||
return CONNECTED;
|
||||
}
|
||||
|
||||
if(( Client_Type( target ) != CLIENT_USER ) && ( Client_Type( target ) != CLIENT_SERVER ))
|
||||
if(( Client_Type( target ) != CLIENT_USER )
|
||||
&& ( Client_Type( target ) != CLIENT_SERVER ))
|
||||
{
|
||||
/* Neuer Client */
|
||||
Log( LOG_DEBUG, "Connection %d: got valid NICK command ...", Client_Conn( Client ));
|
||||
/* New client */
|
||||
Log( LOG_DEBUG, "Connection %d: got valid NICK command ...",
|
||||
Client_Conn( Client ));
|
||||
|
||||
/* Client-Nick registrieren */
|
||||
/* Register new nickname of this client */
|
||||
Client_SetID( target, Req->argv[0] );
|
||||
|
||||
/* schon ein USER da? Dann registrieren! */
|
||||
if( Client_Type( Client ) == CLIENT_GOTUSER ) return Hello_User( Client );
|
||||
else Client_SetType( Client, CLIENT_GOTNICK );
|
||||
/* If we received a valid USER command already then
|
||||
* register the new client! */
|
||||
if( Client_Type( Client ) == CLIENT_GOTUSER )
|
||||
return Hello_User( Client );
|
||||
else
|
||||
Client_SetType( Client, CLIENT_GOTNICK );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Nick-Aenderung */
|
||||
Log( LOG_INFO, "User \"%s\" changed nick: \"%s\" -> \"%s\".", Client_Mask( target ), Client_ID( target ), Req->argv[0] );
|
||||
/* Nickname change */
|
||||
if( Client_Conn( target ) > NONE )
|
||||
{
|
||||
/* Local client */
|
||||
Log( LOG_INFO,
|
||||
"User \"%s\" changed nick (connection %d): \"%s\" -> \"%s\".",
|
||||
Client_Mask( target ), Client_Conn( target ),
|
||||
Client_ID( target ), Req->argv[0] );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Remote client */
|
||||
Log( LOG_DEBUG,
|
||||
"User \"%s\" changed nick: \"%s\" -> \"%s\".",
|
||||
Client_Mask( target ), Client_ID( target ),
|
||||
Req->argv[0] );
|
||||
}
|
||||
|
||||
/* alle betroffenen User und Server ueber Nick-Aenderung informieren */
|
||||
if( Client_Type( Client ) == CLIENT_USER ) IRC_WriteStrClientPrefix( Client, Client, "NICK :%s", Req->argv[0] );
|
||||
IRC_WriteStrServersPrefix( Client, target, "NICK :%s", Req->argv[0] );
|
||||
IRC_WriteStrRelatedPrefix( target, target, FALSE, "NICK :%s", Req->argv[0] );
|
||||
/* Inform all users and servers (which have to know)
|
||||
* of this nickname change */
|
||||
if( Client_Type( Client ) == CLIENT_USER )
|
||||
IRC_WriteStrClientPrefix( Client, Client,
|
||||
"NICK :%s",
|
||||
Req->argv[0] );
|
||||
IRC_WriteStrServersPrefix( Client, target,
|
||||
"NICK :%s", Req->argv[0] );
|
||||
IRC_WriteStrRelatedPrefix( target, target, false,
|
||||
"NICK :%s", Req->argv[0] );
|
||||
|
||||
/* neuen Client-Nick speichern */
|
||||
/* Register old nickname for WHOWAS queries */
|
||||
Client_RegisterWhowas( target );
|
||||
|
||||
/* Save new nickname */
|
||||
Client_SetID( target, Req->argv[0] );
|
||||
|
||||
IRC_SetPenalty( target, 2 );
|
||||
}
|
||||
|
||||
return CONNECTED;
|
||||
}
|
||||
else if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
/* Server fuehrt neuen Client ein */
|
||||
/* Server introduces new client */
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc != 7 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
/* Nick ueberpruefen */
|
||||
c = Client_GetFromID( Req->argv[0] );
|
||||
c = Client_Search( Req->argv[0] );
|
||||
if( c )
|
||||
{
|
||||
/* Der neue Nick ist auf diesem Server bereits registriert:
|
||||
@@ -457,7 +309,7 @@ GLOBAL BOOLEAN IRC_NICK( CLIENT *Client, REQUEST *Req )
|
||||
}
|
||||
|
||||
/* Neue Client-Struktur anlegen */
|
||||
c = Client_NewRemoteUser( intr_c, Req->argv[0], atoi( Req->argv[1] ), Req->argv[2], Req->argv[3], atoi( Req->argv[4] ), Req->argv[5] + 1, Req->argv[6], TRUE );
|
||||
c = Client_NewRemoteUser( intr_c, Req->argv[0], atoi( Req->argv[1] ), Req->argv[2], Req->argv[3], atoi( Req->argv[4] ), Req->argv[5] + 1, Req->argv[6], true);
|
||||
if( ! c )
|
||||
{
|
||||
/* Eine neue Client-Struktur konnte nicht angelegt werden.
|
||||
@@ -481,8 +333,13 @@ GLOBAL BOOLEAN IRC_NICK( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_NICK */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_USER( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL bool
|
||||
IRC_USER( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
#ifdef IDENTAUTH
|
||||
char *ptr;
|
||||
#endif
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
@@ -492,11 +349,21 @@ GLOBAL BOOLEAN IRC_USER( CLIENT *Client, REQUEST *Req )
|
||||
if( Client_Type( Client ) == CLIENT_GOTNICK || Client_Type( Client ) == CLIENT_GOTPASS )
|
||||
#endif
|
||||
{
|
||||
/* Falsche Anzahl Parameter? */
|
||||
/* Wrong number of parameters? */
|
||||
if( Req->argc != 4 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
Client_SetUser( Client, Req->argv[0], FALSE );
|
||||
Client_SetInfo( Client, Req->argv[3] );
|
||||
/* User name */
|
||||
#ifdef IDENTAUTH
|
||||
ptr = Client_User( Client );
|
||||
if( ! ptr || ! *ptr || *ptr == '~' ) Client_SetUser( Client, Req->argv[0], false );
|
||||
#else
|
||||
Client_SetUser( Client, Req->argv[0], false );
|
||||
#endif
|
||||
|
||||
/* "Real name" or user info text: Don't set it to the empty string, the original ircd
|
||||
* can't deal with such "real names" (e. g. "USER user * * :") ... */
|
||||
if( *Req->argv[3] ) Client_SetInfo( Client, Req->argv[3] );
|
||||
else Client_SetInfo( Client, "-" );
|
||||
|
||||
Log( LOG_DEBUG, "Connection %d: got valid USER command ...", Client_Conn( Client ));
|
||||
if( Client_Type( Client ) == CLIENT_GOTNICK ) return Hello_User( Client );
|
||||
@@ -511,119 +378,77 @@ GLOBAL BOOLEAN IRC_USER( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_USER */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_QUIT( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL bool
|
||||
IRC_QUIT( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target;
|
||||
char quitmsg[LINE_LEN];
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
if(( Client_Type( Client ) == CLIENT_USER ) || ( Client_Type( Client ) == CLIENT_SERVICE ))
|
||||
{
|
||||
/* User / Service */
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
/* Wrong number of arguments? */
|
||||
if( Req->argc > 1 )
|
||||
return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
if( Req->argc == 0 ) Conn_Close( Client_Conn( Client ), "Got QUIT command.", NULL, TRUE );
|
||||
else Conn_Close( Client_Conn( Client ), "Got QUIT command.", Req->argv[0], TRUE );
|
||||
|
||||
return DISCONNECTED;
|
||||
}
|
||||
else if ( Client_Type( Client ) == CLIENT_SERVER )
|
||||
if (Req->argc == 1)
|
||||
strlcpy(quitmsg, Req->argv[0], sizeof quitmsg);
|
||||
|
||||
if ( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
/* Server */
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
target = Client_Search( Req->prefix );
|
||||
if( ! target )
|
||||
{
|
||||
Log( LOG_ERR, "Got QUIT from %s for unknown client!?", Client_ID( Client ));
|
||||
/* Den Client kennen wir nicht (mehr), also nichts zu tun. */
|
||||
Log( LOG_WARNING, "Got QUIT from %s for unknown client!?", Client_ID( Client ));
|
||||
return CONNECTED;
|
||||
}
|
||||
|
||||
if( Req->argc == 0 ) Client_Destroy( target, "Got QUIT command.", NULL );
|
||||
else Client_Destroy( target, "Got QUIT command.", Req->argv[0] );
|
||||
Client_Destroy( target, "Got QUIT command.", Req->argc == 1 ? quitmsg : NULL, true);
|
||||
|
||||
return CONNECTED;
|
||||
}
|
||||
else return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
|
||||
} /* IRC_QUIT */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_SQUIT( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target;
|
||||
CHAR msg[LINE_LEN + 64];
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* SQUIT ist nur fuer Server erlaubt */
|
||||
if( Client_Type( Client ) != CLIENT_SERVER ) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
Log( LOG_DEBUG, "Got SQUIT from %s for \"%s\": \"%s\" ...", Client_ID( Client ), Req->argv[0], Req->argv[1] );
|
||||
|
||||
/* SQUIT an alle Server weiterleiten */
|
||||
IRC_WriteStrServers( Client, "SQUIT %s :%s", Req->argv[0], Req->argv[1] );
|
||||
|
||||
target = Client_GetFromID( Req->argv[0] );
|
||||
if( ! target )
|
||||
{
|
||||
Log( LOG_ERR, "Got SQUIT from %s for unknown server \"%s\"!?", Client_ID( Client ), Req->argv[0] );
|
||||
return CONNECTED;
|
||||
}
|
||||
|
||||
if( Req->argv[1][0] )
|
||||
{
|
||||
if( strlen( Req->argv[1] ) > LINE_LEN ) Req->argv[1][LINE_LEN] = '\0';
|
||||
sprintf( msg, "%s (SQUIT from %s).", Req->argv[1], Client_ID( Client ));
|
||||
}
|
||||
else sprintf( msg, "Got SQUIT from %s.", Client_ID( Client ));
|
||||
|
||||
if( Client_Conn( target ) > NONE )
|
||||
{
|
||||
/* dieser Server hat die Connection */
|
||||
if( Req->argv[1][0] ) Conn_Close( Client_Conn( target ), msg, Req->argv[1], TRUE );
|
||||
else Conn_Close( Client_Conn( target ), msg, NULL, TRUE );
|
||||
return DISCONNECTED;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Verbindung hielt anderer Server */
|
||||
Client_Destroy( target, msg, Req->argv[1] );
|
||||
return CONNECTED;
|
||||
if (Req->argc == 1 && quitmsg[0] != '\"') {
|
||||
/* " " to avoid confusion */
|
||||
strlcpy(quitmsg, "\"", sizeof quitmsg);
|
||||
strlcat(quitmsg, Req->argv[0], sizeof quitmsg-1);
|
||||
strlcat(quitmsg, "\"", sizeof quitmsg );
|
||||
}
|
||||
|
||||
/* User, Service, oder noch nicht registriert */
|
||||
Conn_Close( Client_Conn( Client ), "Got QUIT command.", Req->argc == 1 ? quitmsg : NULL, true);
|
||||
|
||||
return DISCONNECTED;
|
||||
}
|
||||
} /* IRC_SQUIT */
|
||||
} /* IRC_QUIT */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_PING( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL bool
|
||||
IRC_PING( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target, *from;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc < 1 ) return IRC_WriteStrClient( Client, ERR_NOORIGIN_MSG, Client_ID( Client ));
|
||||
#ifdef STRICT_RFC
|
||||
if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
#endif
|
||||
|
||||
if( Req->argc == 2 )
|
||||
if( Req->argc > 1 )
|
||||
{
|
||||
/* es wurde ein Ziel-Client angegeben */
|
||||
target = Client_GetFromID( Req->argv[1] );
|
||||
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] );
|
||||
target = Client_Search( Req->argv[1] );
|
||||
if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] );
|
||||
if( target != Client_ThisServer( ))
|
||||
{
|
||||
/* ok, forwarden */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_GetFromID( Req->prefix );
|
||||
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
|
||||
else from = Client;
|
||||
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix );
|
||||
return IRC_WriteStrClientPrefix( target, from, "PING %s :%s", Client_ID( from ), Req->argv[1] );
|
||||
@@ -631,19 +456,26 @@ GLOBAL BOOLEAN IRC_PING( CLIENT *Client, REQUEST *Req )
|
||||
}
|
||||
|
||||
Log( LOG_DEBUG, "Connection %d: got PING, sending PONG ...", Client_Conn( Client ));
|
||||
return IRC_WriteStrClient( Client, "PONG %s :%s", Client_ID( Client_ThisServer( )), Client_ID( Client ));
|
||||
#ifdef STRICT_RFC
|
||||
return IRC_WriteStrClient(Client, "PONG %s :%s",
|
||||
Client_ID(Client_ThisServer()), Client_ID(Client));
|
||||
#else
|
||||
/* Some clients depend on the argument being returned in the PONG
|
||||
* reply (not mentioned in any RFC, though) */
|
||||
return IRC_WriteStrClient(Client, "PONG %s :%s",
|
||||
Client_ID(Client_ThisServer( )), Req->argv[0]);
|
||||
#endif
|
||||
} /* IRC_PING */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_PONG( CLIENT *Client, REQUEST *Req )
|
||||
GLOBAL bool
|
||||
IRC_PONG( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target, *from;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc < 1 ) return IRC_WriteStrClient( Client, ERR_NOORIGIN_MSG, Client_ID( Client ));
|
||||
if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
@@ -651,12 +483,12 @@ GLOBAL BOOLEAN IRC_PONG( CLIENT *Client, REQUEST *Req )
|
||||
/* forwarden? */
|
||||
if( Req->argc == 2 )
|
||||
{
|
||||
target = Client_GetFromID( Req->argv[1] );
|
||||
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] );
|
||||
target = Client_Search( Req->argv[1] );
|
||||
if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] );
|
||||
if( target != Client_ThisServer( ))
|
||||
{
|
||||
/* ok, forwarden */
|
||||
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_GetFromID( Req->prefix );
|
||||
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
|
||||
else from = Client;
|
||||
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix );
|
||||
return IRC_WriteStrClientPrefix( target, from, "PONG %s :%s", Client_ID( from ), Req->argv[1] );
|
||||
@@ -664,7 +496,7 @@ GLOBAL BOOLEAN IRC_PONG( CLIENT *Client, REQUEST *Req )
|
||||
}
|
||||
|
||||
/* Der Connection-Timestamp wurde schon beim Lesen aus dem Socket
|
||||
* aktualisiert, daher muss das hier nicht mehr gemacht werden. */
|
||||
* aktualisiert, daher muss das hier nicht mehr gemacht werden. */
|
||||
|
||||
if( Client_Conn( Client ) > NONE ) Log( LOG_DEBUG, "Connection %d: received PONG. Lag: %ld seconds.", Client_Conn( Client ), time( NULL ) - Conn_LastPing( Client_Conn( Client )));
|
||||
else Log( LOG_DEBUG, "Connection %d: received PONG.", Client_Conn( Client ));
|
||||
@@ -673,53 +505,80 @@ GLOBAL BOOLEAN IRC_PONG( CLIENT *Client, REQUEST *Req )
|
||||
} /* IRC_PONG */
|
||||
|
||||
|
||||
LOCAL BOOLEAN Hello_User( CLIENT *Client )
|
||||
LOCAL bool
|
||||
Hello_User( CLIENT *Client )
|
||||
{
|
||||
#ifdef CVSDATE
|
||||
char ver[12], vertxt[30];
|
||||
#endif
|
||||
|
||||
assert( Client != NULL );
|
||||
|
||||
/* Passwort ueberpruefen */
|
||||
/* Check password ... */
|
||||
if( strcmp( Client_Password( Client ), Conf_ServerPwd ) != 0 )
|
||||
{
|
||||
/* Falsches Passwort */
|
||||
/* Bad password! */
|
||||
Log( LOG_ERR, "User \"%s\" rejected (connection %d): Bad password!", Client_Mask( Client ), Client_Conn( Client ));
|
||||
Conn_Close( Client_Conn( Client ), NULL, "Bad password", TRUE );
|
||||
Conn_Close( Client_Conn( Client ), NULL, "Bad password", true);
|
||||
return DISCONNECTED;
|
||||
}
|
||||
|
||||
Log( LOG_NOTICE, "User \"%s\" registered (connection %d).", Client_Mask( Client ), Client_Conn( Client ));
|
||||
|
||||
/* Andere Server informieren */
|
||||
/* Inform other servers */
|
||||
IRC_WriteStrServers( NULL, "NICK %s 1 %s %s 1 +%s :%s", Client_ID( Client ), Client_User( Client ), Client_Hostname( Client ), Client_Modes( Client ), Client_Info( Client ));
|
||||
|
||||
if( ! IRC_WriteStrClient( Client, RPL_WELCOME_MSG, Client_ID( Client ), Client_Mask( Client ))) return FALSE;
|
||||
if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )))) return FALSE;
|
||||
if( ! IRC_WriteStrClient( Client, RPL_CREATED_MSG, Client_ID( Client ), NGIRCd_StartStr )) return FALSE;
|
||||
if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )))) return FALSE;
|
||||
/* Welcome :-) */
|
||||
if( ! IRC_WriteStrClient( Client, RPL_WELCOME_MSG, Client_ID( Client ), Client_Mask( Client ))) return false;
|
||||
|
||||
/* Version and system type */
|
||||
#ifdef CVSDATE
|
||||
strlcpy( ver, CVSDATE, sizeof( ver ));
|
||||
strncpy( ver + 4, ver + 5, 2 );
|
||||
strncpy( ver + 6, ver + 8, 3 );
|
||||
snprintf( vertxt, sizeof( vertxt ), "%s(%s)", PACKAGE_VERSION, ver );
|
||||
if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), vertxt, TARGET_CPU, TARGET_VENDOR, TARGET_OS )) return false;
|
||||
#else
|
||||
if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), PACKAGE_VERSION, TARGET_CPU, TARGET_VENDOR, TARGET_OS )) return false;
|
||||
#endif
|
||||
|
||||
if( ! IRC_WriteStrClient( Client, RPL_CREATED_MSG, Client_ID( Client ), NGIRCd_StartStr )) return false;
|
||||
#ifdef CVSDATE
|
||||
if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), vertxt, USERMODES, CHANMODES )) return false;
|
||||
#else
|
||||
if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), PACKAGE_VERSION, USERMODES, CHANMODES )) return false;
|
||||
#endif
|
||||
|
||||
/* Features */
|
||||
if( ! IRC_WriteStrClient( Client, RPL_ISUPPORT_MSG, Client_ID( Client ), CLIENT_NICK_LEN - 1, CHANNEL_TOPIC_LEN - 1, CLIENT_AWAY_LEN - 1, Conf_MaxJoins )) return DISCONNECTED;
|
||||
|
||||
Client_SetType( Client, CLIENT_USER );
|
||||
|
||||
if( ! IRC_Send_LUSERS( Client )) return DISCONNECTED;
|
||||
if( ! IRC_Show_MOTD( Client )) return DISCONNECTED;
|
||||
|
||||
/* Suspend the client for a second ... */
|
||||
IRC_SetPenalty( Client, 1 );
|
||||
|
||||
return CONNECTED;
|
||||
} /* Hello_User */
|
||||
|
||||
|
||||
LOCAL VOID Kill_Nick( CHAR *Nick, CHAR *Reason )
|
||||
LOCAL void
|
||||
Kill_Nick( char *Nick, char *Reason )
|
||||
{
|
||||
CLIENT *c;
|
||||
REQUEST r;
|
||||
|
||||
assert( Nick != NULL );
|
||||
assert( Reason != NULL );
|
||||
|
||||
r.prefix = (char *)Client_ThisServer( );
|
||||
r.argv[0] = Nick;
|
||||
r.argv[1] = Reason;
|
||||
r.argc = 2;
|
||||
|
||||
Log( LOG_ERR, "User(s) with nick \"%s\" will be disconnected: %s", Nick, Reason );
|
||||
|
||||
/* andere Server benachrichtigen */
|
||||
IRC_WriteStrServers( NULL, "KILL %s :%s", Nick, Reason );
|
||||
|
||||
/* Ggf. einen eigenen Client toeten */
|
||||
c = Client_GetFromID( Nick );
|
||||
if( c && ( Client_Conn( c ) != NONE )) Conn_Close( Client_Conn( c ), NULL, Reason, TRUE );
|
||||
IRC_KILL( Client_ThisServer( ), &r );
|
||||
} /* Kill_Nick */
|
||||
|
||||
|
||||
|
||||
@@ -2,40 +2,28 @@
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: irc-login.h,v 1.1 2002/02/27 23:26:21 alex Exp $
|
||||
*
|
||||
* irc-login.h: Anmeldung und Abmeldung im IRC (Header)
|
||||
*
|
||||
* $Log: irc-login.h,v $
|
||||
* Revision 1.1 2002/02/27 23:26:21 alex
|
||||
* - Modul aus irc.c bzw. irc.h ausgegliedert.
|
||||
* $Id: irc-login.h,v 1.6 2005/03/19 18:43:48 fw Exp $
|
||||
*
|
||||
* Login and logout (header)
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __irc_login_h__
|
||||
#define __irc_login_h__
|
||||
|
||||
#include "parse.h"
|
||||
#include "client.h"
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_PASS( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_NICK( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_USER( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_SERVER( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_NJOIN( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_PING( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_PONG( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_QUIT( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_SQUIT( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL bool IRC_PASS PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_NICK PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_USER PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_PING PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_PONG PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_QUIT PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -2,36 +2,27 @@
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: irc-mode.h,v 1.1 2002/02/27 23:26:21 alex Exp $
|
||||
*
|
||||
* irc-mode.h: IRC-Befehle zur Mode-Aenderung (MODE, AWAY, ...) (Header)
|
||||
*
|
||||
* $Log: irc-mode.h,v $
|
||||
* Revision 1.1 2002/02/27 23:26:21 alex
|
||||
* - Modul aus irc.c bzw. irc.h ausgegliedert.
|
||||
* $Id: irc-mode.h,v 1.6 2005/03/19 18:43:48 fw Exp $
|
||||
*
|
||||
* IRC commands for mode changes (header)
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __irc_mode_h__
|
||||
#define __irc_mode_h__
|
||||
|
||||
#include "parse.h"
|
||||
#include "client.h"
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_MODE( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_AWAY( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL bool IRC_MODE PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_AWAY PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
||||
/* -eof- */
|
||||
|
||||
126
src/ngircd/irc-op.c
Normal file
126
src/ngircd/irc-op.c
Normal file
@@ -0,0 +1,126 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001-2005 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* Channel operator commands
|
||||
*/
|
||||
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: irc-op.c,v 1.15 2005/04/27 07:39:18 alex Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "defines.h"
|
||||
#include "conn.h"
|
||||
#include "client.h"
|
||||
#include "channel.h"
|
||||
#include "irc-write.h"
|
||||
#include "lists.h"
|
||||
#include "log.h"
|
||||
#include "messages.h"
|
||||
#include "parse.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "irc-op.h"
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
IRC_KICK( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target, *from;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if(( Req->argc < 2) || ( Req->argc > 3 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
|
||||
else from = Client;
|
||||
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
|
||||
|
||||
/* Ziel-User suchen */
|
||||
target = Client_Search( Req->argv[1] );
|
||||
if( ! target ) return IRC_WriteStrClient( from, ERR_NOSUCHNICK_MSG, Client_ID( from ), Req->argv[1] );
|
||||
|
||||
Channel_Kick( target, from, Req->argv[0], Req->argc == 3 ? Req->argv[2] : Client_ID( from ));
|
||||
return CONNECTED;
|
||||
} /* IRC_KICK */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
IRC_INVITE( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CHANNEL *chan;
|
||||
CLIENT *target, *from;
|
||||
bool remember = false;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Wrong number of parameters? */
|
||||
if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
|
||||
else from = Client;
|
||||
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
|
||||
|
||||
/* Search user */
|
||||
target = Client_Search( Req->argv[0] );
|
||||
if(( ! target ) || ( Client_Type( target ) != CLIENT_USER )) return IRC_WriteStrClient( from, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
|
||||
|
||||
chan = Channel_Search( Req->argv[1] );
|
||||
|
||||
if( chan )
|
||||
{
|
||||
/* Channel exists. Is the user a valid member of the channel? */
|
||||
if( ! Channel_IsMemberOf( chan, from )) return IRC_WriteStrClient( from, ERR_NOTONCHANNEL_MSG, Client_ID( Client ), Req->argv[1] );
|
||||
|
||||
/* Is the channel "invite-only"? */
|
||||
if( strchr( Channel_Modes( chan ), 'i' ))
|
||||
{
|
||||
/* Yes. The user must be channel operator! */
|
||||
if( ! strchr( Channel_UserModes( chan, from ), 'o' )) return IRC_WriteStrClient( from, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( from ), Channel_Name( chan ));
|
||||
remember = true;
|
||||
}
|
||||
|
||||
/* Is the target user already member of the channel? */
|
||||
if( Channel_IsMemberOf( chan, target )) return IRC_WriteStrClient( from, ERR_USERONCHANNEL_MSG, Client_ID( from ), Req->argv[0], Req->argv[1] );
|
||||
|
||||
/* If the target user is banned on that channel: remember invite */
|
||||
if( Lists_CheckBanned( target, chan )) remember = true;
|
||||
|
||||
if( remember )
|
||||
{
|
||||
/* We must memember this invite */
|
||||
if( ! Lists_AddInvited( Client_Mask( target ), chan, true)) return CONNECTED;
|
||||
}
|
||||
}
|
||||
|
||||
Log( LOG_DEBUG, "User \"%s\" invites \"%s\" to \"%s\" ...", Client_Mask( from ), Req->argv[0], Req->argv[1] );
|
||||
|
||||
/* Inform target client */
|
||||
IRC_WriteStrClientPrefix( target, from, "INVITE %s %s", Req->argv[0], Req->argv[1] );
|
||||
|
||||
if( Client_Conn( target ) > NONE )
|
||||
{
|
||||
/* The target user is local, so we have to send the status code */
|
||||
if( ! IRC_WriteStrClientPrefix( from, target, RPL_INVITING_MSG, Client_ID( from ), Req->argv[0], Req->argv[1] )) return DISCONNECTED;
|
||||
}
|
||||
|
||||
return CONNECTED;
|
||||
} /* IRC_INVITE */
|
||||
|
||||
|
||||
/* -eof- */
|
||||
28
src/ngircd/irc-op.h
Normal file
28
src/ngircd/irc-op.h
Normal file
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: irc-op.h,v 1.4 2005/03/19 18:43:48 fw Exp $
|
||||
*
|
||||
* Channel operator commands (header)
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __irc_op_h__
|
||||
#define __irc_op_h__
|
||||
|
||||
|
||||
GLOBAL bool IRC_KICK PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_INVITE PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
||||
216
src/ngircd/irc-oper.c
Normal file
216
src/ngircd/irc-oper.c
Normal file
@@ -0,0 +1,216 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* IRC operator commands
|
||||
*/
|
||||
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: irc-oper.c,v 1.22 2005/06/12 18:02:09 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "ngircd.h"
|
||||
#include "resolve.h"
|
||||
#include "conn.h"
|
||||
#include "conf.h"
|
||||
#include "client.h"
|
||||
#include "channel.h"
|
||||
#include "irc-write.h"
|
||||
#include "log.h"
|
||||
#include "match.h"
|
||||
#include "messages.h"
|
||||
#include "parse.h"
|
||||
|
||||
#include <exp.h>
|
||||
#include "irc-oper.h"
|
||||
|
||||
|
||||
LOCAL bool
|
||||
Bad_OperPass(CLIENT *Client, char *errtoken, char *errmsg)
|
||||
{
|
||||
Log( LOG_WARNING, "Got invalid OPER from \"%s\": \"%s\" -- %s", Client_Mask( Client ),
|
||||
errtoken, errmsg);
|
||||
IRC_SetPenalty(Client, 3);
|
||||
return IRC_WriteStrClient( Client, ERR_PASSWDMISMATCH_MSG, Client_ID( Client ));
|
||||
}
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
IRC_OPER( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
int i;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
/* Operator suchen */
|
||||
for( i = 0; i < Conf_Oper_Count; i++)
|
||||
{
|
||||
if( Conf_Oper[i].name[0] && Conf_Oper[i].pwd[0] && ( strcmp( Conf_Oper[i].name, Req->argv[0] ) == 0 )) break;
|
||||
}
|
||||
if( i >= Conf_Oper_Count )
|
||||
return Bad_OperPass(Client, Req->argv[0], "not configured");
|
||||
|
||||
/* Stimmt das Passwort? */
|
||||
if( strcmp( Conf_Oper[i].pwd, Req->argv[1] ) != 0 )
|
||||
return Bad_OperPass(Client, Conf_Oper[i].name, "Bad password");
|
||||
|
||||
/* Authorized Mask? */
|
||||
if( Conf_Oper[i].mask && (! Match( Conf_Oper[i].mask, Client_Mask( Client ) )))
|
||||
return Bad_OperPass(Client, Conf_Oper[i].mask, "hostmask check failed" );
|
||||
|
||||
if( ! Client_HasMode( Client, 'o' ))
|
||||
{
|
||||
/* noch kein o-Mode gesetzt */
|
||||
Client_ModeAdd( Client, 'o' );
|
||||
if( ! IRC_WriteStrClient( Client, "MODE %s :+o", Client_ID( Client ))) return DISCONNECTED;
|
||||
IRC_WriteStrServersPrefix( NULL, Client, "MODE %s :+o", Client_ID( Client ));
|
||||
}
|
||||
|
||||
if( ! Client_OperByMe( Client )) Log( LOG_NOTICE|LOG_snotice, "Got valid OPER from \"%s\", user is an IRC operator now.", Client_Mask( Client ));
|
||||
|
||||
Client_SetOperByMe( Client, true);
|
||||
return IRC_WriteStrClient( Client, RPL_YOUREOPER_MSG, Client_ID( Client ));
|
||||
} /* IRC_OPER */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
IRC_DIE( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
/* Shut down server */
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Not a local IRC operator? */
|
||||
if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
|
||||
|
||||
/* Bad number of parameters? */
|
||||
if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
Log( LOG_NOTICE|LOG_snotice, "Got DIE command from \"%s\" ...", Client_Mask( Client ));
|
||||
NGIRCd_SignalQuit = true;
|
||||
return CONNECTED;
|
||||
} /* IRC_DIE */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
IRC_REHASH( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
/* Reload configuration file */
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Not a local IRC operator? */
|
||||
if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
|
||||
|
||||
/* Bad number of parameters? */
|
||||
if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
Log( LOG_NOTICE|LOG_snotice, "Got REHASH command from \"%s\" ...", Client_Mask( Client ));
|
||||
NGIRCd_SignalRehash = true;
|
||||
|
||||
return CONNECTED;
|
||||
} /* IRC_REHASH */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
IRC_RESTART( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
/* Restart IRC server (fork a new process) */
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Not a local IRC operator? */
|
||||
if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
|
||||
|
||||
/* Bad number of parameters? */
|
||||
if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
Log( LOG_NOTICE|LOG_snotice, "Got RESTART command from \"%s\" ...", Client_Mask( Client ));
|
||||
NGIRCd_SignalRestart = true;
|
||||
return CONNECTED;
|
||||
} /* IRC_RESTART */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
IRC_CONNECT(CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
/* Connect configured or new server */
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Not a local IRC operator? */
|
||||
if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
|
||||
|
||||
/* Bad number of parameters? */
|
||||
if(( Req->argc != 2 ) && ( Req->argc != 5 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
/* Invalid port number? */
|
||||
if( atoi( Req->argv[1] ) < 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
Log( LOG_NOTICE|LOG_snotice, "Got CONNECT command from \"%s\" for \"%s\".", Client_Mask( Client ), Req->argv[0]);
|
||||
|
||||
if( Req->argc == 2 )
|
||||
{
|
||||
/* Connect configured server */
|
||||
if( ! Conf_EnableServer( Req->argv[0], atoi( Req->argv[1] ))) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Add server */
|
||||
if( ! Conf_AddServer( Req->argv[0], atoi( Req->argv[1] ), Req->argv[2], Req->argv[3], Req->argv[4] )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] );
|
||||
}
|
||||
return CONNECTED;
|
||||
} /* IRC_CONNECT */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
IRC_DISCONNECT(CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
/* Disconnect and disable configured server */
|
||||
|
||||
CONN_ID my_conn;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Not a local IRC operator? */
|
||||
if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
|
||||
|
||||
/* Bad number of parameters? */
|
||||
if( Req->argc != 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
Log( LOG_NOTICE|LOG_snotice, "Got DISCONNECT command from \"%s\" for0 \"%s\".", Client_Mask( Client ), Req->argv[0]);
|
||||
|
||||
/* Save ID of this connection */
|
||||
my_conn = Client_Conn( Client );
|
||||
|
||||
/* Connect configured server */
|
||||
if( ! Conf_DisableServer( Req->argv[0] )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] );
|
||||
|
||||
/* Are we still connected or were we killed, too? */
|
||||
if( Client_GetFromConn( my_conn )) return CONNECTED;
|
||||
else return DISCONNECTED;
|
||||
} /* IRC_CONNECT */
|
||||
|
||||
|
||||
/* -eof- */
|
||||
32
src/ngircd/irc-oper.h
Normal file
32
src/ngircd/irc-oper.h
Normal file
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: irc-oper.h,v 1.11 2005/03/19 18:43:48 fw Exp $
|
||||
*
|
||||
* IRC operator commands (header)
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __irc_oper_h__
|
||||
#define __irc_oper_h__
|
||||
|
||||
|
||||
GLOBAL bool IRC_OPER PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_DIE PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_REHASH PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_RESTART PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_CONNECT PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_DISCONNECT PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
||||
427
src/ngircd/irc-server.c
Normal file
427
src/ngircd/irc-server.c
Normal file
@@ -0,0 +1,427 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* IRC commands for server links
|
||||
*/
|
||||
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: irc-server.c,v 1.38 2005/03/19 18:43:49 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <strings.h>
|
||||
|
||||
#include "defines.h"
|
||||
#include "resolve.h"
|
||||
#include "conn.h"
|
||||
#include "conn-zip.h"
|
||||
#include "conf.h"
|
||||
#include "client.h"
|
||||
#include "channel.h"
|
||||
#include "irc-write.h"
|
||||
#include "lists.h"
|
||||
#include "log.h"
|
||||
#include "messages.h"
|
||||
#include "parse.h"
|
||||
#include "ngircd.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "irc-server.h"
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
char str[LINE_LEN], *ptr, *modes, *topic;
|
||||
CLIENT *from, *c, *cl;
|
||||
CL2CHAN *cl2chan;
|
||||
int max_hops, i;
|
||||
CHANNEL *chan;
|
||||
bool ok;
|
||||
CONN_ID con;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Fehler liefern, wenn kein lokaler Client */
|
||||
if( Client_Conn( Client ) <= NONE ) return IRC_WriteStrClient( Client, ERR_UNKNOWNCOMMAND_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
if( Client_Type( Client ) == CLIENT_GOTPASSSERVER )
|
||||
{
|
||||
/* Verbindung soll als Server-Server-Verbindung registriert werden */
|
||||
Log( LOG_DEBUG, "Connection %d: got SERVER command (new server link) ...", Client_Conn( Client ));
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if(( Req->argc != 2 ) && ( Req->argc != 3 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
/* Ist dieser Server bei uns konfiguriert? */
|
||||
for( i = 0; i < MAX_SERVERS; i++ ) if( strcasecmp( Req->argv[0], Conf_Server[i].name ) == 0 ) break;
|
||||
if( i >= MAX_SERVERS )
|
||||
{
|
||||
/* Server ist nicht konfiguriert! */
|
||||
Log( LOG_ERR, "Connection %d: Server \"%s\" not configured here!", Client_Conn( Client ), Req->argv[0] );
|
||||
Conn_Close( Client_Conn( Client ), NULL, "Server not configured here", true);
|
||||
return DISCONNECTED;
|
||||
}
|
||||
if( strcmp( Client_Password( Client ), Conf_Server[i].pwd_in ) != 0 )
|
||||
{
|
||||
/* Falsches Passwort */
|
||||
Log( LOG_ERR, "Connection %d: Got bad password from server \"%s\"!", Client_Conn( Client ), Req->argv[0] );
|
||||
Conn_Close( Client_Conn( Client ), NULL, "Bad password", true);
|
||||
return DISCONNECTED;
|
||||
}
|
||||
|
||||
/* Ist ein Server mit dieser ID bereits registriert? */
|
||||
if( ! Client_CheckID( Client, Req->argv[0] )) return DISCONNECTED;
|
||||
|
||||
/* Server-Strukturen fuellen ;-) */
|
||||
Client_SetID( Client, Req->argv[0] );
|
||||
Client_SetHops( Client, 1 );
|
||||
Client_SetInfo( Client, Req->argv[Req->argc - 1] );
|
||||
|
||||
/* Meldet sich der Server bei uns an (d.h., bauen nicht wir
|
||||
* selber die Verbindung zu einem anderen Server auf)? */
|
||||
con = Client_Conn( Client );
|
||||
if( Client_Token( Client ) != TOKEN_OUTBOUND )
|
||||
{
|
||||
/* Eingehende Verbindung: Unseren SERVER- und PASS-Befehl senden */
|
||||
ok = true;
|
||||
if( ! IRC_WriteStrClient( Client, "PASS %s %s", Conf_Server[i].pwd_out, NGIRCd_ProtoID )) ok = false;
|
||||
else ok = IRC_WriteStrClient( Client, "SERVER %s 1 :%s", Conf_ServerName, Conf_ServerInfo );
|
||||
if( ! ok )
|
||||
{
|
||||
Conn_Close( con, "Unexpected server behavior!", NULL, false );
|
||||
return DISCONNECTED;
|
||||
}
|
||||
Client_SetIntroducer( Client, Client );
|
||||
Client_SetToken( Client, 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Ausgehende verbindung, SERVER und PASS wurden von uns bereits
|
||||
* an die Gegenseite uerbermittelt */
|
||||
Client_SetToken( Client, atoi( Req->argv[1] ));
|
||||
}
|
||||
|
||||
Log( LOG_NOTICE|LOG_snotice, "Server \"%s\" registered (connection %d, 1 hop - direct link).", Client_ID( Client ), con );
|
||||
|
||||
Client_SetType( Client, CLIENT_SERVER );
|
||||
Conf_SetServer( i, con );
|
||||
|
||||
#ifdef ZLIB
|
||||
/* Kompression initialisieren, wenn erforderlich */
|
||||
if( strchr( Client_Flags( Client ), 'Z' ))
|
||||
{
|
||||
if( ! Zip_InitConn( con ))
|
||||
{
|
||||
/* Fehler! */
|
||||
Conn_Close( con, "Can't inizialize compression (zlib)!", NULL, false );
|
||||
return DISCONNECTED;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* maximalen Hop Count ermitteln */
|
||||
max_hops = 0;
|
||||
c = Client_First( );
|
||||
while( c )
|
||||
{
|
||||
if( Client_Hops( c ) > max_hops ) max_hops = Client_Hops( c );
|
||||
c = Client_Next( c );
|
||||
}
|
||||
|
||||
/* Alle bisherigen Server dem neuen Server bekannt machen,
|
||||
* die bisherigen Server ueber den neuen informierenn */
|
||||
for( i = 0; i < ( max_hops + 1 ); i++ )
|
||||
{
|
||||
c = Client_First( );
|
||||
while( c )
|
||||
{
|
||||
if(( Client_Type( c ) == CLIENT_SERVER ) && ( c != Client ) && ( c != Client_ThisServer( )) && ( Client_Hops( c ) == i ))
|
||||
{
|
||||
if( Client_Conn( c ) > NONE )
|
||||
{
|
||||
/* Dem gefundenen Server gleich den neuen
|
||||
* Server bekannt machen */
|
||||
if( ! IRC_WriteStrClient( c, "SERVER %s %d %d :%s", Client_ID( Client ), Client_Hops( Client ) + 1, Client_MyToken( Client ), Client_Info( Client ))) return DISCONNECTED;
|
||||
}
|
||||
|
||||
/* Den neuen Server ueber den alten informieren */
|
||||
if( ! IRC_WriteStrClientPrefix( Client, Client_Hops( c ) == 1 ? Client_ThisServer( ) : Client_Introducer( c ), "SERVER %s %d %d :%s", Client_ID( c ), Client_Hops( c ) + 1, Client_MyToken( c ), Client_Info( c ))) return DISCONNECTED;
|
||||
}
|
||||
c = Client_Next( c );
|
||||
}
|
||||
}
|
||||
|
||||
/* alle User dem neuen Server bekannt machen */
|
||||
c = Client_First( );
|
||||
while( c )
|
||||
{
|
||||
if( Client_Type( c ) == CLIENT_USER )
|
||||
{
|
||||
/* User an neuen Server melden */
|
||||
if( ! IRC_WriteStrClient( Client, "NICK %s %d %s %s %d +%s :%s", Client_ID( c ), Client_Hops( c ) + 1, Client_User( c ), Client_Hostname( c ), Client_MyToken( Client_Introducer( c )), Client_Modes( c ), Client_Info( c ))) return DISCONNECTED;
|
||||
}
|
||||
c = Client_Next( c );
|
||||
}
|
||||
|
||||
/* Channels dem neuen Server bekannt machen */
|
||||
chan = Channel_First( );
|
||||
while( chan )
|
||||
{
|
||||
#ifdef IRCPLUS
|
||||
/* Send CHANINFO if the peer supports it */
|
||||
if( strchr( Client_Flags( Client ), 'C' ))
|
||||
{
|
||||
#ifdef DEBUG
|
||||
Log( LOG_DEBUG, "Sending CHANINFO commands ..." );
|
||||
#endif
|
||||
modes = Channel_Modes( chan );
|
||||
topic = Channel_Topic( chan );
|
||||
|
||||
if( *modes || *topic )
|
||||
{
|
||||
/* send CHANINFO */
|
||||
if(( ! strchr( Channel_Modes( chan ), 'k' )) && ( ! strchr( Channel_Modes( chan ), 'l' )) && ( ! *topic ))
|
||||
{
|
||||
/* "CHANINFO <chan> +<modes>" */
|
||||
if( ! IRC_WriteStrClient( Client, "CHANINFO %s +%s", Channel_Name( chan ), modes )) return DISCONNECTED;
|
||||
}
|
||||
else if(( ! strchr( Channel_Modes( chan ), 'k' )) && ( ! strchr( Channel_Modes( chan ), 'l' )))
|
||||
{
|
||||
/* "CHANINFO <chan> +<modes> :<topic>" */
|
||||
if( ! IRC_WriteStrClient( Client, "CHANINFO %s +%s :%s", Channel_Name( chan ), modes, topic )) return DISCONNECTED;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* "CHANINFO <chan> +<modes> <key> <limit> :<topic>" */
|
||||
if( ! IRC_WriteStrClient( Client, "CHANINFO %s +%s %s %ld :%s", Channel_Name( chan ), modes, strchr( Channel_Modes( chan ), 'k' ) ? Channel_Key( chan ) : "*", strchr( Channel_Modes( chan ), 'l' ) ? Channel_MaxUsers( chan ) : 0L, topic )) return DISCONNECTED;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* alle Member suchen */
|
||||
cl2chan = Channel_FirstMember( chan );
|
||||
snprintf( str, sizeof( str ), "NJOIN %s :", Channel_Name( chan ));
|
||||
while( cl2chan )
|
||||
{
|
||||
cl = Channel_GetClient( cl2chan );
|
||||
assert( cl != NULL );
|
||||
|
||||
/* Nick, ggf. mit Modes, anhaengen */
|
||||
if( str[strlen( str ) - 1] != ':' ) strlcat( str, ",", sizeof( str ));
|
||||
if( strchr( Channel_UserModes( chan, cl ), 'v' )) strlcat( str, "+", sizeof( str ));
|
||||
if( strchr( Channel_UserModes( chan, cl ), 'o' )) strlcat( str, "@", sizeof( str ));
|
||||
strlcat( str, Client_ID( cl ), sizeof( str ));
|
||||
|
||||
if( strlen( str ) > ( LINE_LEN - CLIENT_NICK_LEN - 8 ))
|
||||
{
|
||||
/* Zeile senden */
|
||||
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
|
||||
snprintf( str, sizeof( str ), "NJOIN %s :", Channel_Name( chan ));
|
||||
}
|
||||
|
||||
cl2chan = Channel_NextMember( chan, cl2chan );
|
||||
}
|
||||
|
||||
/* noch Daten da? */
|
||||
if( str[strlen( str ) - 1] != ':')
|
||||
{
|
||||
/* Ja; Also senden ... */
|
||||
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
|
||||
}
|
||||
|
||||
#ifdef IRCPLUS
|
||||
if( strchr( Client_Flags( Client ), 'L' ))
|
||||
{
|
||||
#ifdef DEBUG
|
||||
Log( LOG_DEBUG, "Synchronizing INVITE- and BAN-lists ..." );
|
||||
#endif
|
||||
/* Synchronize INVITE- and BAN-lists */
|
||||
if( ! Lists_SendInvites( Client )) return DISCONNECTED;
|
||||
if( ! Lists_SendBans( Client )) return DISCONNECTED;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* naechsten Channel suchen */
|
||||
chan = Channel_Next( chan );
|
||||
}
|
||||
|
||||
return CONNECTED;
|
||||
}
|
||||
else if( Client_Type( Client ) == CLIENT_SERVER )
|
||||
{
|
||||
/* Neuer Server wird im Netz angekuendigt */
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc != 4 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
/* Ist ein Server mit dieser ID bereits registriert? */
|
||||
if( ! Client_CheckID( Client, Req->argv[0] )) return DISCONNECTED;
|
||||
|
||||
/* Ueberfluessige Hostnamen aus Info-Text entfernen */
|
||||
ptr = strchr( Req->argv[3] + 2, '[' );
|
||||
if( ! ptr ) ptr = Req->argv[3];
|
||||
|
||||
from = Client_Search( Req->prefix );
|
||||
if( ! from )
|
||||
{
|
||||
/* Hm, Server, der diesen einfuehrt, ist nicht bekannt!? */
|
||||
Log( LOG_ALERT, "Unknown ID in prefix of SERVER: \"%s\"! (on connection %d)", Req->prefix, Client_Conn( Client ));
|
||||
Conn_Close( Client_Conn( Client ), NULL, "Unknown ID in prefix of SERVER", true);
|
||||
return DISCONNECTED;
|
||||
}
|
||||
|
||||
/* Neue Client-Struktur anlegen */
|
||||
c = Client_NewRemoteServer( Client, Req->argv[0], from, atoi( Req->argv[1] ), atoi( Req->argv[2] ), ptr, true);
|
||||
if( ! c )
|
||||
{
|
||||
/* Neue Client-Struktur konnte nicht angelegt werden */
|
||||
Log( LOG_ALERT, "Can't create client structure for server! (on connection %d)", Client_Conn( Client ));
|
||||
Conn_Close( Client_Conn( Client ), NULL, "Can't allocate client structure for remote server", true);
|
||||
return DISCONNECTED;
|
||||
}
|
||||
|
||||
/* Log-Meldung zusammenbauen und ausgeben */
|
||||
if(( Client_Hops( c ) > 1 ) && ( Req->prefix[0] )) snprintf( str, sizeof( str ), "connected to %s, ", Client_ID( from ));
|
||||
else strcpy( str, "" );
|
||||
Log( LOG_NOTICE|LOG_snotice, "Server \"%s\" registered (via %s, %s%d hop%s).", Client_ID( c ), Client_ID( Client ), str, Client_Hops( c ), Client_Hops( c ) > 1 ? "s": "" );
|
||||
|
||||
/* Andere Server informieren */
|
||||
IRC_WriteStrServersPrefix( Client, from, "SERVER %s %d %d :%s", Client_ID( c ), Client_Hops( c ) + 1, Client_MyToken( c ), Client_Info( c ));
|
||||
|
||||
return CONNECTED;
|
||||
}
|
||||
else return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
} /* IRC_SERVER */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
IRC_NJOIN( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
char nick_in[COMMAND_LEN], nick_out[COMMAND_LEN], *channame, *ptr, modes[8];
|
||||
bool is_op, is_voiced;
|
||||
CHANNEL *chan;
|
||||
CLIENT *c;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
strlcpy( nick_in, Req->argv[1], sizeof( nick_in ));
|
||||
strcpy( nick_out, "" );
|
||||
|
||||
channame = Req->argv[0];
|
||||
ptr = strtok( nick_in, "," );
|
||||
while( ptr )
|
||||
{
|
||||
is_op = is_voiced = false;
|
||||
|
||||
/* Prefixe abschneiden */
|
||||
while(( *ptr == '@' ) || ( *ptr == '+' ))
|
||||
{
|
||||
if( *ptr == '@' ) is_op = true;
|
||||
if( *ptr == '+' ) is_voiced = true;
|
||||
ptr++;
|
||||
}
|
||||
|
||||
c = Client_Search( ptr );
|
||||
if( c )
|
||||
{
|
||||
Channel_Join( c, channame );
|
||||
chan = Channel_Search( channame );
|
||||
assert( chan != NULL );
|
||||
|
||||
if( is_op ) Channel_UserModeAdd( chan, c, 'o' );
|
||||
if( is_voiced ) Channel_UserModeAdd( chan, c, 'v' );
|
||||
|
||||
/* im Channel bekannt machen */
|
||||
IRC_WriteStrChannelPrefix( Client, chan, c, false, "JOIN :%s", channame );
|
||||
|
||||
/* Channel-User-Modes setzen */
|
||||
strlcpy( modes, Channel_UserModes( chan, c ), sizeof( modes ));
|
||||
if( modes[0] )
|
||||
{
|
||||
/* Modes im Channel bekannt machen */
|
||||
IRC_WriteStrChannelPrefix( Client, chan, Client, false, "MODE %s +%s %s", channame, modes, Client_ID( c ));
|
||||
}
|
||||
|
||||
if( nick_out[0] != '\0' ) strlcat( nick_out, ",", sizeof( nick_out ));
|
||||
if( is_op ) strlcat( nick_out, "@", sizeof( nick_out ));
|
||||
if( is_voiced ) strlcat( nick_out, "+", sizeof( nick_out ));
|
||||
strlcat( nick_out, ptr, sizeof( nick_out ));
|
||||
}
|
||||
else Log( LOG_ERR, "Got NJOIN for unknown nick \"%s\" for channel \"%s\"!", ptr, channame );
|
||||
|
||||
/* naechsten Nick suchen */
|
||||
ptr = strtok( NULL, "," );
|
||||
}
|
||||
|
||||
/* an andere Server weiterleiten */
|
||||
if( nick_out[0] != '\0' ) IRC_WriteStrServersPrefix( Client, Client_ThisServer( ), "NJOIN %s :%s", Req->argv[0], nick_out );
|
||||
|
||||
return CONNECTED;
|
||||
} /* IRC_NJOIN */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
IRC_SQUIT( CLIENT *Client, REQUEST *Req )
|
||||
{
|
||||
CLIENT *target;
|
||||
char msg[LINE_LEN + 64];
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Req != NULL );
|
||||
|
||||
/* Falsche Anzahl Parameter? */
|
||||
if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||
|
||||
Log( LOG_DEBUG, "Got SQUIT from %s for \"%s\": \"%s\" ...", Client_ID( Client ), Req->argv[0], Req->argv[1] );
|
||||
|
||||
target = Client_Search( Req->argv[0] );
|
||||
if( ! target )
|
||||
{
|
||||
/* Den Server kennen wir nicht (mehr), also nichts zu tun. */
|
||||
Log( LOG_WARNING, "Got SQUIT from %s for unknown server \"%s\"!?", Client_ID( Client ), Req->argv[0] );
|
||||
return CONNECTED;
|
||||
}
|
||||
|
||||
if( Req->argv[1][0] )
|
||||
{
|
||||
if( strlen( Req->argv[1] ) > LINE_LEN ) Req->argv[1][LINE_LEN] = '\0';
|
||||
snprintf( msg, sizeof( msg ), "%s (SQUIT from %s).", Req->argv[1], Client_ID( Client ));
|
||||
}
|
||||
else snprintf( msg, sizeof( msg ), "Got SQUIT from %s.", Client_ID( Client ));
|
||||
|
||||
if( Client_Conn( target ) > NONE )
|
||||
{
|
||||
/* dieser Server hat die Connection */
|
||||
if( Req->argv[1][0] ) Conn_Close( Client_Conn( target ), msg, Req->argv[1], true);
|
||||
else Conn_Close( Client_Conn( target ), msg, NULL, true);
|
||||
return DISCONNECTED;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Verbindung hielt anderer Server */
|
||||
Client_Destroy( target, msg, Req->argv[1], false );
|
||||
return CONNECTED;
|
||||
}
|
||||
} /* IRC_SQUIT */
|
||||
|
||||
|
||||
/* -eof- */
|
||||
29
src/ngircd/irc-server.h
Normal file
29
src/ngircd/irc-server.h
Normal file
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: irc-server.h,v 1.5 2005/03/19 18:43:49 fw Exp $
|
||||
*
|
||||
* IRC commands for server links (header)
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __irc_server_h__
|
||||
#define __irc_server_h__
|
||||
|
||||
|
||||
GLOBAL bool IRC_SERVER PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_NJOIN PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_SQUIT PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
||||
@@ -1,72 +1,106 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
* Copyright (c)2001-2005 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: irc-write.c,v 1.1 2002/02/27 23:26:21 alex Exp $
|
||||
*
|
||||
* irc-write.c: IRC-Texte und Befehle ueber Netzwerk versenden
|
||||
*
|
||||
* $Log: irc-write.c,v $
|
||||
* Revision 1.1 2002/02/27 23:26:21 alex
|
||||
* - Modul aus irc.c bzw. irc.h ausgegliedert.
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* Sending IRC commands over the network
|
||||
*/
|
||||
|
||||
|
||||
#include <portab.h>
|
||||
#include "global.h"
|
||||
#include "portab.h"
|
||||
|
||||
#include <imp.h>
|
||||
static char UNUSED id[] = "$Id: irc-write.c,v 1.18 2005/04/27 07:39:18 alex Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <stdarg.h>
|
||||
#ifdef PROTOTYPES
|
||||
# include <stdarg.h>
|
||||
#else
|
||||
# include <varargs.h>
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <exp.h>
|
||||
#include "defines.h"
|
||||
#include "conn-func.h"
|
||||
#include "client.h"
|
||||
#include "channel.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "irc-write.h"
|
||||
|
||||
|
||||
CHAR *Get_Prefix( CLIENT *Target, CLIENT *Client );
|
||||
#define SEND_TO_USER 1
|
||||
#define SEND_TO_SERVER 2
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrClient( CLIENT *Client, CHAR *Format, ... )
|
||||
LOCAL char *Get_Prefix PARAMS(( CLIENT *Target, CLIENT *Client ));
|
||||
|
||||
|
||||
#ifdef PROTOTYPES
|
||||
GLOBAL bool
|
||||
IRC_WriteStrClient( CLIENT *Client, char *Format, ... )
|
||||
#else
|
||||
GLOBAL bool
|
||||
IRC_WriteStrClient( Client, Format, va_alist )
|
||||
CLIENT *Client;
|
||||
char *Format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
CHAR buffer[1000];
|
||||
BOOLEAN ok = CONNECTED;
|
||||
char buffer[1000];
|
||||
bool ok = CONNECTED;
|
||||
va_list ap;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Format != NULL );
|
||||
|
||||
#ifdef PROTOTYPES
|
||||
va_start( ap, Format );
|
||||
#else
|
||||
va_start( ap );
|
||||
#endif
|
||||
vsnprintf( buffer, 1000, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
/* an den Client selber */
|
||||
ok = IRC_WriteStrClientPrefix( Client, Client_ThisServer( ), buffer );
|
||||
ok = IRC_WriteStrClientPrefix( Client, Client_ThisServer( ), "%s", buffer );
|
||||
|
||||
return ok;
|
||||
} /* IRC_WriteStrClient */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, CHAR *Format, ... )
|
||||
#ifdef PROTOTYPES
|
||||
GLOBAL bool
|
||||
IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, char *Format, ... )
|
||||
#else
|
||||
GLOBAL bool
|
||||
IRC_WriteStrClientPrefix( Client, Prefix, Format, va_alist )
|
||||
CLIENT *Client;
|
||||
CLIENT *Prefix;
|
||||
char *Format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
/* Text an Clients, lokal bzw. remote, senden. */
|
||||
|
||||
CHAR buffer[1000];
|
||||
char buffer[1000];
|
||||
va_list ap;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Format != NULL );
|
||||
assert( Prefix != NULL );
|
||||
|
||||
#ifdef PROTOTYPES
|
||||
va_start( ap, Format );
|
||||
#else
|
||||
va_start( ap );
|
||||
#endif
|
||||
vsnprintf( buffer, 1000, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
@@ -74,29 +108,56 @@ GLOBAL BOOLEAN IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, CHAR *F
|
||||
} /* IRC_WriteStrClientPrefix */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrChannel( CLIENT *Client, CHANNEL *Chan, BOOLEAN Remote, CHAR *Format, ... )
|
||||
#ifdef PROTOTYPES
|
||||
GLOBAL bool
|
||||
IRC_WriteStrChannel( CLIENT *Client, CHANNEL *Chan, bool Remote, char *Format, ... )
|
||||
#else
|
||||
GLOBAL bool
|
||||
IRC_WriteStrChannel( Client, Chan, Remote, Format, va_alist )
|
||||
CLIENT *Client;
|
||||
CHANNEL *Chan;
|
||||
bool Remote;
|
||||
char *Format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
CHAR buffer[1000];
|
||||
char buffer[1000];
|
||||
va_list ap;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Format != NULL );
|
||||
|
||||
#ifdef PROTOTYPES
|
||||
va_start( ap, Format );
|
||||
#else
|
||||
va_start( ap );
|
||||
#endif
|
||||
vsnprintf( buffer, 1000, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
return IRC_WriteStrChannelPrefix( Client, Chan, Client_ThisServer( ), Remote, buffer );
|
||||
return IRC_WriteStrChannelPrefix( Client, Chan, Client_ThisServer( ), Remote, "%s", buffer );
|
||||
} /* IRC_WriteStrChannel */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )
|
||||
#ifdef PROTOTYPES
|
||||
GLOBAL bool
|
||||
IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, bool Remote, char *Format, ... )
|
||||
#else
|
||||
GLOBAL bool
|
||||
IRC_WriteStrChannelPrefix( Client, Chan, Prefix, Remote, Format, va_alist )
|
||||
CLIENT *Client;
|
||||
CHANNEL *Chan;
|
||||
CLIENT *Prefix;
|
||||
bool Remote;
|
||||
char *Format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
BOOLEAN sock[MAX_CONNECTIONS], is_server[MAX_CONNECTIONS], ok = CONNECTED;
|
||||
CHAR buffer[1000];
|
||||
bool ok = CONNECTED;
|
||||
char buffer[1000];
|
||||
CL2CHAN *cl2chan;
|
||||
CONN_ID conn;
|
||||
CLIENT *c;
|
||||
INT s, i;
|
||||
va_list ap;
|
||||
|
||||
assert( Client != NULL );
|
||||
@@ -104,11 +165,15 @@ GLOBAL BOOLEAN IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT
|
||||
assert( Prefix != NULL );
|
||||
assert( Format != NULL );
|
||||
|
||||
#ifdef PROTOTYPES
|
||||
va_start( ap, Format );
|
||||
#else
|
||||
va_start( ap );
|
||||
#endif
|
||||
vsnprintf( buffer, 1000, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
for( i = 0; i < MAX_CONNECTIONS; i++ ) sock[i] = FALSE;
|
||||
Conn_ClearFlags( );
|
||||
|
||||
/* An alle Clients, die in den selben Channels sind.
|
||||
* Dabei aber nur einmal je Remote-Server */
|
||||
@@ -126,56 +191,114 @@ GLOBAL BOOLEAN IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT
|
||||
if( c && ( c != Client ))
|
||||
{
|
||||
/* Ok, anderer Client */
|
||||
s = Client_Conn( c );
|
||||
assert( s >= 0 );
|
||||
assert( s < MAX_CONNECTIONS );
|
||||
sock[s] = TRUE;
|
||||
if( Client_Type( c ) == CLIENT_SERVER ) is_server[s] = TRUE;
|
||||
else is_server[s] = FALSE;
|
||||
conn = Client_Conn( c );
|
||||
if( Client_Type( c ) == CLIENT_SERVER ) Conn_SetFlag( conn, SEND_TO_SERVER );
|
||||
else Conn_SetFlag( conn, SEND_TO_USER );
|
||||
}
|
||||
cl2chan = Channel_NextMember( Chan, cl2chan );
|
||||
}
|
||||
|
||||
/* Senden ... */
|
||||
for( i = 0; i < MAX_CONNECTIONS; i++ )
|
||||
/* Senden: alle Verbindungen durchgehen ... */
|
||||
conn = Conn_First( );
|
||||
while( conn != NONE )
|
||||
{
|
||||
if( sock[i] )
|
||||
{
|
||||
if( is_server[i] ) ok = Conn_WriteStr( i, ":%s %s", Client_ID( Prefix ), buffer );
|
||||
else ok = Conn_WriteStr( i, ":%s %s", Client_Mask( Prefix ), buffer );
|
||||
if( ! ok ) break;
|
||||
}
|
||||
/* muessen Daten ueber diese Verbindung verschickt werden? */
|
||||
if( Conn_Flag( conn ) == SEND_TO_SERVER) ok = Conn_WriteStr( conn, ":%s %s", Client_ID( Prefix ), buffer );
|
||||
else if( Conn_Flag( conn ) == SEND_TO_USER ) ok = Conn_WriteStr( conn, ":%s %s", Client_Mask( Prefix ), buffer );
|
||||
if( ! ok ) break;
|
||||
|
||||
/* naechste Verbindung testen */
|
||||
conn = Conn_Next( conn );
|
||||
}
|
||||
|
||||
return ok;
|
||||
} /* IRC_WriteStrChannelPrefix */
|
||||
|
||||
|
||||
GLOBAL VOID IRC_WriteStrServers( CLIENT *ExceptOf, CHAR *Format, ... )
|
||||
#ifdef PROTOTYPES
|
||||
GLOBAL void
|
||||
IRC_WriteStrServers( CLIENT *ExceptOf, char *Format, ... )
|
||||
#else
|
||||
GLOBAL void
|
||||
IRC_WriteStrServers( ExceptOf, Format, va_alist )
|
||||
CLIENT *ExceptOf;
|
||||
char *Format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
CHAR buffer[1000];
|
||||
char buffer[1000];
|
||||
va_list ap;
|
||||
|
||||
assert( Format != NULL );
|
||||
|
||||
#ifdef PROTOTYPES
|
||||
va_start( ap, Format );
|
||||
#else
|
||||
va_start( ap );
|
||||
#endif
|
||||
vsnprintf( buffer, 1000, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
/* an den Client selber */
|
||||
return IRC_WriteStrServersPrefix( ExceptOf, Client_ThisServer( ), buffer );
|
||||
IRC_WriteStrServersPrefix( ExceptOf, Client_ThisServer( ), "%s", buffer );
|
||||
} /* IRC_WriteStrServers */
|
||||
|
||||
|
||||
GLOBAL VOID IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *Format, ... )
|
||||
#ifdef PROTOTYPES
|
||||
GLOBAL void
|
||||
IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, char *Format, ... )
|
||||
#else
|
||||
GLOBAL void
|
||||
IRC_WriteStrServersPrefix( ExceptOf, Prefix, Format, va_alist )
|
||||
CLIENT *ExceptOf;
|
||||
CLIENT *Prefix;
|
||||
char *Format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
CHAR buffer[1000];
|
||||
char buffer[1000];
|
||||
va_list ap;
|
||||
|
||||
assert( Format != NULL );
|
||||
assert( Prefix != NULL );
|
||||
|
||||
#ifdef PROTOTYPES
|
||||
va_start( ap, Format );
|
||||
#else
|
||||
va_start( ap );
|
||||
#endif
|
||||
vsnprintf( buffer, 1000, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
IRC_WriteStrServersPrefixFlag( ExceptOf, Prefix, '\0', "%s", buffer );
|
||||
} /* IRC_WriteStrServersPrefix */
|
||||
|
||||
|
||||
#ifdef PROTOTYPES
|
||||
GLOBAL void
|
||||
IRC_WriteStrServersPrefixFlag( CLIENT *ExceptOf, CLIENT *Prefix, char Flag, char *Format, ... )
|
||||
#else
|
||||
GLOBAL void
|
||||
IRC_WriteStrServersPrefixFlag( ExceptOf, Prefix, Flag, Format, va_alist )
|
||||
CLIENT *ExceptOf;
|
||||
CLIENT *Prefix;
|
||||
char Flag;
|
||||
char *Format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
char buffer[1000];
|
||||
CLIENT *c;
|
||||
va_list ap;
|
||||
|
||||
assert( Format != NULL );
|
||||
assert( Prefix != NULL );
|
||||
|
||||
#ifdef PROTOTYPES
|
||||
va_start( ap, Format );
|
||||
#else
|
||||
va_start( ap );
|
||||
#endif
|
||||
vsnprintf( buffer, 1000, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
@@ -184,34 +307,49 @@ GLOBAL VOID IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *F
|
||||
{
|
||||
if(( Client_Type( c ) == CLIENT_SERVER ) && ( Client_Conn( c ) > NONE ) && ( c != Client_ThisServer( )) && ( c != ExceptOf ))
|
||||
{
|
||||
/* Ziel-Server gefunden */
|
||||
IRC_WriteStrClientPrefix( c, Prefix, buffer );
|
||||
/* Ziel-Server gefunden. Nun noch pruefen, ob Flags stimmen */
|
||||
if(( Flag == '\0' ) || ( strchr( Client_Flags( c ), Flag ) != NULL )) IRC_WriteStrClientPrefix( c, Prefix, "%s", buffer );
|
||||
}
|
||||
c = Client_Next( c );
|
||||
}
|
||||
} /* IRC_WriteStrServersPrefix */
|
||||
} /* IRC_WriteStrServersPrefixFlag */
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )
|
||||
#ifdef PROTOTYPES
|
||||
GLOBAL bool
|
||||
IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, bool Remote, char *Format, ... )
|
||||
#else
|
||||
GLOBAL bool
|
||||
IRC_WriteStrRelatedPrefix( Client, Prefix, Remote, Format, va_alist )
|
||||
CLIENT *Client;
|
||||
CLIENT *Prefix;
|
||||
bool Remote;
|
||||
char *Format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
BOOLEAN sock[MAX_CONNECTIONS], is_server[MAX_CONNECTIONS], ok = CONNECTED;
|
||||
bool ok = CONNECTED;
|
||||
CL2CHAN *chan_cl2chan, *cl2chan;
|
||||
CHAR buffer[1000];
|
||||
char buffer[1000];
|
||||
CHANNEL *chan;
|
||||
CONN_ID conn;
|
||||
va_list ap;
|
||||
CLIENT *c;
|
||||
INT i, s;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Prefix != NULL );
|
||||
assert( Format != NULL );
|
||||
|
||||
#ifdef PROTOTYPES
|
||||
va_start( ap, Format );
|
||||
#else
|
||||
va_start( ap );
|
||||
#endif
|
||||
vsnprintf( buffer, 1000, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
/* initialisieren */
|
||||
for( i = 0; i < MAX_CONNECTIONS; i++ ) sock[i] = FALSE;
|
||||
Conn_ClearFlags( );
|
||||
|
||||
/* An alle Clients, die in einem Channel mit dem "Ausloeser" sind,
|
||||
* den Text schicken. An Remote-Server aber jeweils nur einmal. */
|
||||
@@ -234,12 +372,9 @@ GLOBAL BOOLEAN IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, BOOLEA
|
||||
if( c && ( c != Client ))
|
||||
{
|
||||
/* Ok, anderer Client */
|
||||
s = Client_Conn( c );
|
||||
assert( s >= 0 );
|
||||
assert( s < MAX_CONNECTIONS );
|
||||
sock[s] = TRUE;
|
||||
if( Client_Type( c ) == CLIENT_SERVER ) is_server[s] = TRUE;
|
||||
else is_server[s] = FALSE;
|
||||
conn = Client_Conn( c );
|
||||
if( Client_Type( c ) == CLIENT_SERVER ) Conn_SetFlag( conn, SEND_TO_SERVER );
|
||||
else Conn_SetFlag( conn, SEND_TO_USER );
|
||||
}
|
||||
cl2chan = Channel_NextMember( chan, cl2chan );
|
||||
}
|
||||
@@ -248,21 +383,39 @@ GLOBAL BOOLEAN IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, BOOLEA
|
||||
chan_cl2chan = Channel_NextChannelOf( Client, chan_cl2chan );
|
||||
}
|
||||
|
||||
/* Senden ... */
|
||||
for( i = 0; i < MAX_CONNECTIONS; i++ )
|
||||
/* Senden: alle Verbindungen durchgehen ... */
|
||||
conn = Conn_First( );
|
||||
while( conn != NONE )
|
||||
{
|
||||
if( sock[i] )
|
||||
{
|
||||
if( is_server[i] ) ok = Conn_WriteStr( i, ":%s %s", Client_ID( Prefix ), buffer );
|
||||
else ok = Conn_WriteStr( i, ":%s %s", Client_Mask( Prefix ), buffer );
|
||||
if( ! ok ) break;
|
||||
}
|
||||
/* muessen ueber diese Verbindung Daten gesendet werden? */
|
||||
if( Conn_Flag( conn ) == SEND_TO_SERVER ) ok = Conn_WriteStr( conn, ":%s %s", Client_ID( Prefix ), buffer );
|
||||
else if( Conn_Flag( conn ) == SEND_TO_USER ) ok = Conn_WriteStr( conn, ":%s %s", Client_Mask( Prefix ), buffer );
|
||||
if( ! ok ) break;
|
||||
|
||||
/* naechste Verbindung testen */
|
||||
conn = Conn_Next( conn );
|
||||
}
|
||||
return ok;
|
||||
} /* IRC_WriteStrRelatedPrefix */
|
||||
|
||||
|
||||
CHAR *Get_Prefix( CLIENT *Target, CLIENT *Client )
|
||||
GLOBAL void
|
||||
IRC_SetPenalty( CLIENT *Client, int Seconds )
|
||||
{
|
||||
CONN_ID c;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Seconds > 0 );
|
||||
|
||||
if( Client_Type( Client ) == CLIENT_SERVER ) return;
|
||||
|
||||
c = Client_Conn( Client );
|
||||
if( c > NONE ) Conn_SetPenalty( c, Seconds );
|
||||
} /* IRC_SetPenalty */
|
||||
|
||||
|
||||
LOCAL char *
|
||||
Get_Prefix( CLIENT *Target, CLIENT *Client )
|
||||
{
|
||||
assert( Target != NULL );
|
||||
assert( Client != NULL );
|
||||
|
||||
@@ -2,40 +2,35 @@
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: irc-write.h,v 1.1 2002/02/27 23:26:21 alex Exp $
|
||||
*
|
||||
* irc-write.h: IRC-Texte und Befehle ueber Netzwerk versenden (Header)
|
||||
*
|
||||
* $Log: irc-write.h,v $
|
||||
* Revision 1.1 2002/02/27 23:26:21 alex
|
||||
* - Modul aus irc.c bzw. irc.h ausgegliedert.
|
||||
* $Id: irc-write.h,v 1.7 2005/03/19 18:43:49 fw Exp $
|
||||
*
|
||||
* Sending IRC commands over the network (header)
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __irc_write_h__
|
||||
#define __irc_write_h__
|
||||
|
||||
#include "channel.h"
|
||||
|
||||
GLOBAL bool IRC_WriteStrClient PARAMS(( CLIENT *Client, char *Format, ... ));
|
||||
GLOBAL bool IRC_WriteStrClientPrefix PARAMS(( CLIENT *Client, CLIENT *Prefix, char *Format, ... ));
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrClient( CLIENT *Client, CHAR *Format, ... );
|
||||
GLOBAL BOOLEAN IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, CHAR *Format, ... );
|
||||
GLOBAL bool IRC_WriteStrChannel PARAMS(( CLIENT *Client, CHANNEL *Chan, bool Remote, char *Format, ... ));
|
||||
GLOBAL bool IRC_WriteStrChannelPrefix PARAMS(( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, bool Remote, char *Format, ... ));
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrChannel( CLIENT *Client, CHANNEL *Chan, BOOLEAN Remote, CHAR *Format, ... );
|
||||
GLOBAL BOOLEAN IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... );
|
||||
GLOBAL void IRC_WriteStrServers PARAMS(( CLIENT *ExceptOf, char *Format, ... ));
|
||||
GLOBAL void IRC_WriteStrServersPrefix PARAMS(( CLIENT *ExceptOf, CLIENT *Prefix, char *Format, ... ));
|
||||
GLOBAL void IRC_WriteStrServersPrefixFlag PARAMS(( CLIENT *ExceptOf, CLIENT *Prefix, char Flag, char *Format, ... ));
|
||||
|
||||
GLOBAL VOID IRC_WriteStrServers( CLIENT *ExceptOf, CHAR *Format, ... );
|
||||
GLOBAL VOID IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *Format, ... );
|
||||
GLOBAL bool IRC_WriteStrRelatedPrefix PARAMS(( CLIENT *Client, CLIENT *Prefix, bool Remote, char *Format, ... ));
|
||||
|
||||
GLOBAL BOOLEAN IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... );
|
||||
GLOBAL void IRC_SetPenalty PARAMS(( CLIENT *Client, int Seconds ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
1152
src/ngircd/irc.c
1152
src/ngircd/irc.c
File diff suppressed because it is too large
Load Diff
@@ -2,70 +2,28 @@
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: irc.h,v 1.27 2002/02/27 23:26:36 alex Exp $
|
||||
* $Id: irc.h,v 1.39 2005/03/19 18:43:49 fw Exp $
|
||||
*
|
||||
* irc.h: IRC-Befehle (Header)
|
||||
*
|
||||
* $Log: irc.h,v $
|
||||
* Revision 1.27 2002/02/27 23:26:36 alex
|
||||
* - einige Funktionen in irc-xxx-Module ausgegliedert.
|
||||
*
|
||||
* Revision 1.26 2002/02/27 20:33:13 alex
|
||||
* - Channel-Topics implementiert.
|
||||
*
|
||||
* Revision 1.25 2002/02/27 18:23:46 alex
|
||||
* - IRC-Befehl "AWAY" implementert.
|
||||
*
|
||||
* Revision 1.24 2002/02/23 21:39:48 alex
|
||||
* - IRC-Befehl KILL sowie Kills bei Nick Collsisions implementiert.
|
||||
*
|
||||
* Revision 1.23 2002/02/17 23:38:58 alex
|
||||
* - neuer IRC-Befehl VERSION implementiert: IRC_VERSION().
|
||||
* IRC commands (header)
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __irc_h__
|
||||
#define __irc_h__
|
||||
|
||||
#include "parse.h"
|
||||
#include "client.h"
|
||||
#include "channel.h"
|
||||
|
||||
|
||||
GLOBAL BOOLEAN IRC_MOTD( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_LUSERS( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_LINKS( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_VERSION( CLIENT *Client, REQUEST *Req );
|
||||
|
||||
GLOBAL BOOLEAN IRC_PRIVMSG( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_NOTICE( CLIENT *Client, REQUEST *Req );
|
||||
|
||||
GLOBAL BOOLEAN IRC_NAMES( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_ISON( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_WHOIS( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_USERHOST( CLIENT *Client, REQUEST *Req );
|
||||
|
||||
GLOBAL BOOLEAN IRC_OPER( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_DIE( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_RESTART( CLIENT *Client, REQUEST *Req );
|
||||
|
||||
GLOBAL BOOLEAN IRC_ERROR( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_KILL( CLIENT *Client, REQUEST *Req );
|
||||
|
||||
GLOBAL BOOLEAN IRC_JOIN( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_PART( CLIENT *Client, REQUEST *Req );
|
||||
GLOBAL BOOLEAN IRC_TOPIC( CLIENT *Client, REQUEST *Req );
|
||||
|
||||
GLOBAL BOOLEAN IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan );
|
||||
GLOBAL BOOLEAN IRC_Send_LUSERS( CLIENT *Client );
|
||||
GLOBAL BOOLEAN IRC_Show_MOTD( CLIENT *Client );
|
||||
GLOBAL bool IRC_ERROR PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_KILL PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_NOTICE PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_PRIVMSG PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_TRACE PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
GLOBAL bool IRC_HELP PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
488
src/ngircd/lists.c
Normal file
488
src/ngircd/lists.c
Normal file
@@ -0,0 +1,488 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001-2005 Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* Management of IRC lists: ban, invite, ...
|
||||
*/
|
||||
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: lists.c,v 1.17 2005/03/19 18:43:49 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
|
||||
#include "defines.h"
|
||||
#include "conn.h"
|
||||
#include "client.h"
|
||||
#include "channel.h"
|
||||
#include "log.h"
|
||||
#include "match.h"
|
||||
#include "messages.h"
|
||||
#include "irc-write.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <strings.h>
|
||||
|
||||
#include "exp.h"
|
||||
#include "lists.h"
|
||||
|
||||
|
||||
#define MASK_LEN 2*CLIENT_HOST_LEN
|
||||
|
||||
|
||||
typedef struct _C2C
|
||||
{
|
||||
struct _C2C *next;
|
||||
char mask[MASK_LEN];
|
||||
CHANNEL *channel;
|
||||
bool onlyonce;
|
||||
} C2C;
|
||||
|
||||
|
||||
LOCAL C2C *My_Invites, *My_Bans;
|
||||
|
||||
|
||||
LOCAL C2C *New_C2C PARAMS(( char *Mask, CHANNEL *Chan, bool OnlyOnce ));
|
||||
|
||||
LOCAL bool Check_List PARAMS(( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan ));
|
||||
LOCAL bool Already_Registered PARAMS(( C2C *Cl2Chan, char *Mask, CHANNEL *Chan ));
|
||||
|
||||
|
||||
|
||||
GLOBAL void
|
||||
Lists_Init( void )
|
||||
{
|
||||
/* Modul initialisieren */
|
||||
|
||||
My_Invites = My_Bans = NULL;
|
||||
} /* Lists_Init */
|
||||
|
||||
|
||||
GLOBAL void
|
||||
Lists_Exit( void )
|
||||
{
|
||||
/* Modul abmelden */
|
||||
|
||||
C2C *c2c, *next;
|
||||
|
||||
/* Invite-Lists freigeben */
|
||||
c2c = My_Invites;
|
||||
while( c2c )
|
||||
{
|
||||
next = c2c->next;
|
||||
free( c2c );
|
||||
c2c = next;
|
||||
}
|
||||
|
||||
/* Ban-Lists freigeben */
|
||||
c2c = My_Bans;
|
||||
while( c2c )
|
||||
{
|
||||
next = c2c->next;
|
||||
free( c2c );
|
||||
c2c = next;
|
||||
}
|
||||
} /* Lists_Exit */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
Lists_CheckInvited( CLIENT *Client, CHANNEL *Chan )
|
||||
{
|
||||
return Check_List( &My_Invites, Client, Chan );
|
||||
} /* Lists_CheckInvited */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
Lists_IsInviteEntry( char *Mask, CHANNEL *Chan )
|
||||
{
|
||||
assert( Mask != NULL );
|
||||
assert( Chan != NULL );
|
||||
|
||||
return Already_Registered( My_Invites, Mask, Chan );
|
||||
} /* Lists_IsInviteEntry */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
Lists_AddInvited( char *Mask, CHANNEL *Chan, bool OnlyOnce )
|
||||
{
|
||||
C2C *c2c;
|
||||
|
||||
assert( Mask != NULL );
|
||||
assert( Chan != NULL );
|
||||
|
||||
if( Already_Registered( My_Invites, Mask, Chan )) return true;
|
||||
|
||||
c2c = New_C2C( Mask, Chan, OnlyOnce );
|
||||
if( ! c2c )
|
||||
{
|
||||
Log( LOG_ERR, "Can't add new invite list entry!" );
|
||||
return false;
|
||||
}
|
||||
|
||||
/* verketten */
|
||||
c2c->next = My_Invites;
|
||||
My_Invites = c2c;
|
||||
|
||||
Log( LOG_DEBUG, "Added \"%s\" to invite list for \"%s\".", Mask, Channel_Name( Chan ));
|
||||
return true;
|
||||
} /* Lists_AddInvited */
|
||||
|
||||
|
||||
GLOBAL void
|
||||
Lists_DelInvited( char *Mask, CHANNEL *Chan )
|
||||
{
|
||||
C2C *c2c, *last, *next;
|
||||
|
||||
assert( Mask != NULL );
|
||||
assert( Chan != NULL );
|
||||
|
||||
last = NULL;
|
||||
c2c = My_Invites;
|
||||
while( c2c )
|
||||
{
|
||||
next = c2c->next;
|
||||
if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 ))
|
||||
{
|
||||
/* dieser Eintrag muss geloescht werden */
|
||||
Log( LOG_DEBUG, "Deleted \"%s\" from invite list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
|
||||
if( last ) last->next = next;
|
||||
else My_Invites = next;
|
||||
free( c2c );
|
||||
}
|
||||
else last = c2c;
|
||||
c2c = next;
|
||||
}
|
||||
} /* Lists_DelInvited */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
Lists_ShowInvites( CLIENT *Client, CHANNEL *Channel )
|
||||
{
|
||||
C2C *c2c;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Channel != NULL );
|
||||
|
||||
c2c = My_Invites;
|
||||
while( c2c )
|
||||
{
|
||||
if( c2c->channel == Channel )
|
||||
{
|
||||
/* Eintrag fuer Channel gefunden; ausgeben: */
|
||||
if( ! IRC_WriteStrClient( Client, RPL_INVITELIST_MSG, Client_ID( Client ), Channel_Name( Channel ), c2c->mask )) return DISCONNECTED;
|
||||
}
|
||||
c2c = c2c->next;
|
||||
}
|
||||
return IRC_WriteStrClient( Client, RPL_ENDOFINVITELIST_MSG, Client_ID( Client ), Channel_Name( Channel ));
|
||||
} /* Lists_ShowInvites */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
Lists_SendInvites( CLIENT *Client )
|
||||
{
|
||||
C2C *c2c;
|
||||
|
||||
assert( Client != NULL );
|
||||
|
||||
c2c = My_Invites;
|
||||
while( c2c )
|
||||
{
|
||||
if( ! IRC_WriteStrClient( Client, "MODE %s +I %s", Channel_Name( c2c->channel ), c2c->mask )) return DISCONNECTED;
|
||||
c2c = c2c->next;
|
||||
}
|
||||
return CONNECTED;
|
||||
} /* Lists_SendInvites */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
Lists_SendBans( CLIENT *Client )
|
||||
{
|
||||
C2C *c2c;
|
||||
|
||||
assert( Client != NULL );
|
||||
|
||||
c2c = My_Bans;
|
||||
while( c2c )
|
||||
{
|
||||
if( ! IRC_WriteStrClient( Client, "MODE %s +b %s", Channel_Name( c2c->channel ), c2c->mask )) return DISCONNECTED;
|
||||
c2c = c2c->next;
|
||||
}
|
||||
return CONNECTED;
|
||||
} /* Lists_SendBans */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
Lists_CheckBanned( CLIENT *Client, CHANNEL *Chan )
|
||||
{
|
||||
return Check_List( &My_Bans, Client, Chan );
|
||||
} /* Lists_CheckBanned */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
Lists_IsBanEntry( char *Mask, CHANNEL *Chan )
|
||||
{
|
||||
assert( Mask != NULL );
|
||||
assert( Chan != NULL );
|
||||
|
||||
return Already_Registered( My_Bans, Mask, Chan );
|
||||
} /* Lists_IsBanEntry */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
Lists_AddBanned( char *Mask, CHANNEL *Chan )
|
||||
{
|
||||
C2C *c2c;
|
||||
|
||||
assert( Mask != NULL );
|
||||
assert( Chan != NULL );
|
||||
|
||||
if( Already_Registered( My_Bans, Mask, Chan )) return true;
|
||||
|
||||
c2c = New_C2C( Mask, Chan, false );
|
||||
if( ! c2c )
|
||||
{
|
||||
Log( LOG_ERR, "Can't add new ban list entry!" );
|
||||
return false;
|
||||
}
|
||||
|
||||
/* verketten */
|
||||
c2c->next = My_Bans;
|
||||
My_Bans = c2c;
|
||||
|
||||
Log( LOG_DEBUG, "Added \"%s\" to ban list for \"%s\".", Mask, Channel_Name( Chan ));
|
||||
return true;
|
||||
} /* Lists_AddBanned */
|
||||
|
||||
|
||||
GLOBAL void
|
||||
Lists_DelBanned( char *Mask, CHANNEL *Chan )
|
||||
{
|
||||
C2C *c2c, *last, *next;
|
||||
|
||||
assert( Mask != NULL );
|
||||
assert( Chan != NULL );
|
||||
|
||||
last = NULL;
|
||||
c2c = My_Bans;
|
||||
while( c2c )
|
||||
{
|
||||
next = c2c->next;
|
||||
if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 ))
|
||||
{
|
||||
/* dieser Eintrag muss geloescht werden */
|
||||
Log( LOG_DEBUG, "Deleted \"%s\" from ban list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
|
||||
if( last ) last->next = next;
|
||||
else My_Bans = next;
|
||||
free( c2c );
|
||||
}
|
||||
else last = c2c;
|
||||
c2c = next;
|
||||
}
|
||||
} /* Lists_DelBanned */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
Lists_ShowBans( CLIENT *Client, CHANNEL *Channel )
|
||||
{
|
||||
C2C *c2c;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Channel != NULL );
|
||||
|
||||
c2c = My_Bans;
|
||||
while( c2c )
|
||||
{
|
||||
if( c2c->channel == Channel )
|
||||
{
|
||||
/* Eintrag fuer Channel gefunden; ausgeben: */
|
||||
if( ! IRC_WriteStrClient( Client, RPL_BANLIST_MSG, Client_ID( Client ), Channel_Name( Channel ), c2c->mask )) return DISCONNECTED;
|
||||
}
|
||||
c2c = c2c->next;
|
||||
}
|
||||
return IRC_WriteStrClient( Client, RPL_ENDOFBANLIST_MSG, Client_ID( Client ), Channel_Name( Channel ));
|
||||
} /* Lists_ShowBans */
|
||||
|
||||
|
||||
GLOBAL void
|
||||
Lists_DeleteChannel( CHANNEL *Chan )
|
||||
{
|
||||
/* Channel wurde geloescht, Invite- und Ban-Lists aufraeumen */
|
||||
|
||||
C2C *c2c, *last, *next;
|
||||
|
||||
/* Invite-List */
|
||||
last = NULL;
|
||||
c2c = My_Invites;
|
||||
while( c2c )
|
||||
{
|
||||
next = c2c->next;
|
||||
if( c2c->channel == Chan )
|
||||
{
|
||||
/* dieser Eintrag muss geloescht werden */
|
||||
Log( LOG_DEBUG, "Deleted \"%s\" from invite list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
|
||||
if( last ) last->next = next;
|
||||
else My_Invites = next;
|
||||
free( c2c );
|
||||
}
|
||||
else last = c2c;
|
||||
c2c = next;
|
||||
}
|
||||
|
||||
/* Ban-List */
|
||||
last = NULL;
|
||||
c2c = My_Bans;
|
||||
while( c2c )
|
||||
{
|
||||
next = c2c->next;
|
||||
if( c2c->channel == Chan )
|
||||
{
|
||||
/* dieser Eintrag muss geloescht werden */
|
||||
Log( LOG_DEBUG, "Deleted \"%s\" from ban list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
|
||||
if( last ) last->next = next;
|
||||
else My_Bans = next;
|
||||
free( c2c );
|
||||
}
|
||||
else last = c2c;
|
||||
c2c = next;
|
||||
}
|
||||
} /* Lists_DeleteChannel */
|
||||
|
||||
|
||||
GLOBAL char *
|
||||
Lists_MakeMask( char *Pattern )
|
||||
{
|
||||
/* This function generats a valid IRC mask of "any" string. This
|
||||
* mask is only valid until the next call to Lists_MakeMask(),
|
||||
* because a single global buffer is used. You have to copy the
|
||||
* generated mask to some sane location yourself! */
|
||||
|
||||
static char TheMask[MASK_LEN];
|
||||
char *excl, *at;
|
||||
|
||||
assert( Pattern != NULL );
|
||||
|
||||
excl = strchr( Pattern, '!' );
|
||||
at = strchr( Pattern, '@' );
|
||||
|
||||
if(( at ) && ( at < excl )) excl = NULL;
|
||||
|
||||
if(( ! at ) && ( ! excl ))
|
||||
{
|
||||
/* Neither "!" nor "@" found: use string as nick name */
|
||||
strlcpy( TheMask, Pattern, sizeof( TheMask ) - 5 );
|
||||
strlcat( TheMask, "!*@*", sizeof( TheMask ));
|
||||
return TheMask;
|
||||
}
|
||||
|
||||
if(( ! at ) && ( excl ))
|
||||
{
|
||||
/* Domain part is missing */
|
||||
strlcpy( TheMask, Pattern, sizeof( TheMask ) - 3 );
|
||||
strlcat( TheMask, "@*", sizeof( TheMask ));
|
||||
return TheMask;
|
||||
}
|
||||
|
||||
if(( at ) && ( ! excl ))
|
||||
{
|
||||
/* User name is missing */
|
||||
*at = '\0'; at++;
|
||||
strlcpy( TheMask, Pattern, sizeof( TheMask ) - 5 );
|
||||
strlcat( TheMask, "!*@", sizeof( TheMask ));
|
||||
strlcat( TheMask, at, sizeof( TheMask ));
|
||||
return TheMask;
|
||||
}
|
||||
|
||||
/* All parts (nick, user and domain name) are given */
|
||||
strlcpy( TheMask, Pattern, sizeof( TheMask ));
|
||||
return TheMask;
|
||||
} /* Lists_MakeMask */
|
||||
|
||||
|
||||
LOCAL C2C *
|
||||
New_C2C( char *Mask, CHANNEL *Chan, bool OnlyOnce )
|
||||
{
|
||||
C2C *c2c;
|
||||
|
||||
assert( Mask != NULL );
|
||||
assert( Chan != NULL );
|
||||
|
||||
/* Speicher fuer Eintrag anfordern */
|
||||
c2c = (C2C *)malloc( sizeof( C2C ));
|
||||
if( ! c2c )
|
||||
{
|
||||
Log( LOG_EMERG, "Can't allocate memory! [New_C2C]" );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
strlcpy( c2c->mask, Mask, sizeof( c2c->mask ));
|
||||
c2c->channel = Chan;
|
||||
c2c->onlyonce = OnlyOnce;
|
||||
|
||||
return c2c;
|
||||
} /* New_C2C */
|
||||
|
||||
|
||||
LOCAL bool
|
||||
Check_List( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan )
|
||||
{
|
||||
C2C *c2c, *last;
|
||||
|
||||
assert( Cl2Chan != NULL );
|
||||
assert( Client != NULL );
|
||||
assert( Chan != NULL );
|
||||
|
||||
c2c = *Cl2Chan;
|
||||
last = NULL;
|
||||
|
||||
while( c2c )
|
||||
{
|
||||
if( c2c->channel == Chan )
|
||||
{
|
||||
/* Ok, richtiger Channel. Passt die Maske? */
|
||||
if( Match( c2c->mask, Client_Mask( Client )))
|
||||
{
|
||||
/* Treffer! */
|
||||
if( c2c->onlyonce )
|
||||
{
|
||||
/* Eintrag loeschen */
|
||||
Log( LOG_DEBUG, "Deleted \"%s\" from %s list for \"%s\".", c2c->mask, *Cl2Chan == My_Invites ? "invite" : "ban", Channel_Name( Chan ));
|
||||
if( last ) last->next = c2c->next;
|
||||
else *Cl2Chan = c2c->next;
|
||||
free( c2c );
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
last = c2c;
|
||||
c2c = c2c->next;
|
||||
}
|
||||
|
||||
return false;
|
||||
} /* Check_List */
|
||||
|
||||
|
||||
LOCAL bool
|
||||
Already_Registered( C2C *List, char *Mask, CHANNEL *Chan )
|
||||
{
|
||||
C2C *c2c;
|
||||
|
||||
c2c = List;
|
||||
while( c2c )
|
||||
{
|
||||
if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 )) return true;
|
||||
c2c = c2c->next;
|
||||
}
|
||||
return false;
|
||||
} /* Already_Registered */
|
||||
|
||||
|
||||
/* -eof- */
|
||||
46
src/ngircd/lists.h
Normal file
46
src/ngircd/lists.h
Normal file
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: lists.h,v 1.12 2005/03/19 18:43:49 fw Exp $
|
||||
*
|
||||
* Management of IRC lists: ban, invite, ... (header)
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __lists_h__
|
||||
#define __lists_h__
|
||||
|
||||
|
||||
GLOBAL void Lists_Init PARAMS(( void ));
|
||||
GLOBAL void Lists_Exit PARAMS(( void ));
|
||||
|
||||
GLOBAL bool Lists_CheckInvited PARAMS(( CLIENT *Client, CHANNEL *Chan ));
|
||||
GLOBAL bool Lists_AddInvited PARAMS(( char *Mask, CHANNEL *Chan, bool OnlyOnce ));
|
||||
GLOBAL void Lists_DelInvited PARAMS(( char *Mask, CHANNEL *Chan ));
|
||||
GLOBAL bool Lists_ShowInvites PARAMS(( CLIENT *Client, CHANNEL *Channel ));
|
||||
GLOBAL bool Lists_SendInvites PARAMS(( CLIENT *Client ));
|
||||
GLOBAL bool Lists_IsInviteEntry PARAMS(( char *Mask, CHANNEL *Chan ));
|
||||
|
||||
GLOBAL bool Lists_CheckBanned PARAMS(( CLIENT *Client, CHANNEL *Chan ));
|
||||
GLOBAL bool Lists_AddBanned PARAMS(( char *Mask, CHANNEL *Chan ));
|
||||
GLOBAL void Lists_DelBanned PARAMS(( char *Mask, CHANNEL *Chan ));
|
||||
GLOBAL bool Lists_ShowBans PARAMS(( CLIENT *Client, CHANNEL *Channel ));
|
||||
GLOBAL bool Lists_SendBans PARAMS(( CLIENT *Client ));
|
||||
GLOBAL bool Lists_IsBanEntry PARAMS(( char *Mask, CHANNEL *Chan ));
|
||||
|
||||
GLOBAL void Lists_DeleteChannel PARAMS(( CHANNEL *Chan ));
|
||||
|
||||
GLOBAL char *Lists_MakeMask PARAMS(( char *Pattern ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
||||
375
src/ngircd/log.c
375
src/ngircd/log.c
@@ -1,163 +1,222 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
* Copyright (c)2001-2005 Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: log.c,v 1.18 2002/02/19 20:07:13 alex Exp $
|
||||
*
|
||||
* log.c: Logging-Funktionen
|
||||
*
|
||||
* $Log: log.c,v $
|
||||
* Revision 1.18 2002/02/19 20:07:13 alex
|
||||
* - direkt nach dem Start werden die aktiven "Modes" ins Log geschrieben.
|
||||
*
|
||||
* Revision 1.17 2002/01/11 14:45:37 alex
|
||||
* - Anpassungen an neue Kommandozeilen-Optionen "--debug" und "--nodaemon".
|
||||
*
|
||||
* Revision 1.16 2002/01/05 15:54:40 alex
|
||||
* - syslog() etc. wurde verwendet, auch wenn USE_SYSLOG nicht definiert war.
|
||||
*
|
||||
* Revision 1.15 2002/01/02 02:42:58 alex
|
||||
* - Copyright-Texte aktualisiert.
|
||||
*
|
||||
* Revision 1.14 2002/01/01 18:01:43 alex
|
||||
* - Architektur und Betriebssystem in Start-Meldung aufgenommen.
|
||||
*
|
||||
* Revision 1.13 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.12 2001/12/29 20:16:31 alex
|
||||
* - Log-Funktionen fuer Resolver-Sub-Prozess implementiert.
|
||||
*
|
||||
* Revision 1.11 2001/12/29 03:08:49 alex
|
||||
* - neue configure-Option "--enable-strict-rfc".
|
||||
*
|
||||
* Revision 1.10 2001/12/27 01:44:49 alex
|
||||
* - die Verwendung von syslog kann nun abgeschaltet werden.
|
||||
*
|
||||
* Revision 1.9 2001/12/26 03:22:16 alex
|
||||
* - string.h wird nun includiert.
|
||||
*
|
||||
* Revision 1.8 2001/12/25 23:13:00 alex
|
||||
* - Versionsstring bei Programmstart verbessert.
|
||||
*
|
||||
* Revision 1.7 2001/12/25 22:04:26 alex
|
||||
* - Aenderungen an den Debug- und Logging-Funktionen.
|
||||
*
|
||||
* Revision 1.6 2001/12/25 19:20:39 alex
|
||||
* - es wird nun die Facility LOG_LOCAL5 zum Loggen verwendet.
|
||||
*
|
||||
* Revision 1.5 2001/12/15 00:07:56 alex
|
||||
* - Log-Level der Start- und Stop-Meldungen angehoben.
|
||||
*
|
||||
* Revision 1.4 2001/12/13 02:04:16 alex
|
||||
* - boesen "Speicherschiesser" in Log() gefixt.
|
||||
*
|
||||
* Revision 1.3 2001/12/12 23:31:24 alex
|
||||
* - Zum Loggen wird nun auch syslog verwendet.
|
||||
*
|
||||
* Revision 1.2 2001/12/12 17:19:12 alex
|
||||
* - in Log-Meldungen wird nun auch der Level der Meldung ausgegeben.
|
||||
*
|
||||
* Revision 1.1.1.1 2001/12/11 21:53:04 alex
|
||||
* - Imported sources to CVS.
|
||||
* Logging functions
|
||||
*/
|
||||
|
||||
|
||||
#define MAX_LOG_MSG_LEN 256
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: log.c,v 1.57.2.2 2006/02/08 21:23:21 fw Exp $";
|
||||
|
||||
#include <portab.h>
|
||||
#include "global.h"
|
||||
|
||||
#include <imp.h>
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <stdarg.h>
|
||||
#include <errno.h>
|
||||
#ifdef PROTOTYPES
|
||||
# include <stdarg.h>
|
||||
#else
|
||||
# include <varargs.h>
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#ifdef USE_SYSLOG
|
||||
#ifdef SYSLOG
|
||||
#include <syslog.h>
|
||||
#endif
|
||||
|
||||
#include "global.h"
|
||||
#include "ngircd.h"
|
||||
#include "defines.h"
|
||||
#include "conn.h"
|
||||
#include "client.h"
|
||||
#include "channel.h"
|
||||
#include "irc-write.h"
|
||||
|
||||
#include <exp.h>
|
||||
#include "exp.h"
|
||||
#include "log.h"
|
||||
|
||||
|
||||
GLOBAL VOID Log_Init( VOID )
|
||||
{
|
||||
CHAR txt[127];
|
||||
static char Init_Txt[127];
|
||||
static bool Is_Daemon;
|
||||
|
||||
#ifdef USE_SYSLOG
|
||||
#ifdef DEBUG
|
||||
static char Error_File[FNAME_LEN];
|
||||
#endif
|
||||
|
||||
|
||||
static void Wall_ServerNotice PARAMS(( char *Msg ));
|
||||
|
||||
|
||||
GLOBAL void
|
||||
Log_Init( bool Daemon_Mode )
|
||||
{
|
||||
Is_Daemon = Daemon_Mode;
|
||||
|
||||
#ifdef SYSLOG
|
||||
#ifndef LOG_CONS /* Kludge: mips-dec-ultrix4.5 has no LOG_CONS/LOG_LOCAL5 */
|
||||
#define LOG_CONS 0
|
||||
#endif
|
||||
#ifndef LOG_LOCAL5
|
||||
#define LOG_LOCAL5 0
|
||||
#endif
|
||||
/* Syslog initialisieren */
|
||||
openlog( PACKAGE, LOG_CONS|LOG_PID, LOG_LOCAL5 );
|
||||
openlog( PACKAGE_NAME, LOG_CONS|LOG_PID, LOG_LOCAL5 );
|
||||
#endif
|
||||
|
||||
/* Hello World! */
|
||||
Log( LOG_NOTICE, "%s started.", NGIRCd_Version( ));
|
||||
|
||||
Log( LOG_NOTICE, "%s started.", NGIRCd_Version );
|
||||
|
||||
/* Informationen uebern den "Operation Mode" */
|
||||
strcpy( txt, "" );
|
||||
Init_Txt[0] = '\0';
|
||||
#ifdef DEBUG
|
||||
if( NGIRCd_Debug )
|
||||
{
|
||||
if( txt[0] ) strcat( txt, ", " );
|
||||
strcat( txt, "debug-mode" );
|
||||
strlcpy( Init_Txt, "debug-mode", sizeof Init_Txt );
|
||||
}
|
||||
#endif
|
||||
if( NGIRCd_NoDaemon )
|
||||
if( ! Is_Daemon )
|
||||
{
|
||||
if( txt[0] ) strcat( txt, ", " );
|
||||
strcat( txt, "no-daemon-mode" );
|
||||
if( Init_Txt[0] ) strlcat( Init_Txt, ", ", sizeof Init_Txt );
|
||||
strlcat( Init_Txt, "no-daemon-mode", sizeof Init_Txt );
|
||||
}
|
||||
if( NGIRCd_Passive )
|
||||
{
|
||||
if( txt[0] ) strcat( txt, ", " );
|
||||
strcat( txt, "passive-mode" );
|
||||
if( Init_Txt[0] ) strlcat( Init_Txt, ", ", sizeof Init_Txt );
|
||||
strlcat( Init_Txt, "passive-mode", sizeof Init_Txt );
|
||||
}
|
||||
#ifdef SNIFFER
|
||||
if( NGIRCd_Sniffer )
|
||||
{
|
||||
if( txt[0] ) strcat( txt, ", " );
|
||||
strcat( txt, "network sniffer" );
|
||||
if( Init_Txt[0] ) strlcat( Init_Txt, ", ", sizeof Init_Txt );
|
||||
strlcat( Init_Txt, "network sniffer", sizeof Init_Txt );
|
||||
}
|
||||
#endif
|
||||
if( txt[0] ) Log( LOG_INFO, "Activating: %s.", txt );
|
||||
if( Init_Txt[0] ) Log( LOG_INFO, "Activating: %s.", Init_Txt );
|
||||
|
||||
#ifdef DEBUG
|
||||
Error_File[0] = '\0';
|
||||
#endif
|
||||
} /* Log_Init */
|
||||
|
||||
|
||||
GLOBAL VOID Log_Exit( VOID )
|
||||
#ifdef DEBUG
|
||||
|
||||
GLOBAL void
|
||||
Log_InitErrorfile( void )
|
||||
{
|
||||
/* "Error-Log" initialisieren: stderr in Datei umlenken. Dort
|
||||
* landen z.B. alle Ausgaben von assert()-Aufrufen. */
|
||||
|
||||
/* Dateiname zusammen bauen */
|
||||
snprintf( Error_File, sizeof Error_File, "%s/%s-%ld.err", ERROR_DIR, PACKAGE_NAME, (long)getpid( ));
|
||||
|
||||
/* stderr umlenken */
|
||||
fflush( stderr );
|
||||
if( ! freopen( Error_File, "w", stderr ))
|
||||
{
|
||||
Log( LOG_ERR, "Can't reopen stderr (\"%s\"): %s", Error_File, strerror( errno ));
|
||||
return;
|
||||
}
|
||||
|
||||
/* Einige Infos in das Error-File schreiben */
|
||||
fputs( ctime( &NGIRCd_Start ), stderr );
|
||||
fprintf( stderr, "%s started.\n", NGIRCd_Version );
|
||||
fprintf( stderr, "Activating: %s\n\n", Init_Txt[0] ? Init_Txt : "-" );
|
||||
fflush( stderr );
|
||||
|
||||
#ifdef DEBUG
|
||||
Log( LOG_DEBUG, "Redirected stderr to \"%s\".", Error_File );
|
||||
#endif
|
||||
} /* Log_InitErrfile */
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
GLOBAL void
|
||||
Log_Exit( void )
|
||||
{
|
||||
/* Good Bye! */
|
||||
Log( LOG_NOTICE, PACKAGE" done.");
|
||||
|
||||
#ifdef USE_SYSLOG
|
||||
if( NGIRCd_SignalRestart ) Log( LOG_NOTICE, "%s done (restarting).", PACKAGE_NAME );
|
||||
else Log( LOG_NOTICE, "%s done.", PACKAGE_NAME );
|
||||
|
||||
#ifdef DEBUG
|
||||
if( Error_File[0] )
|
||||
{
|
||||
/* Error-File (stderr) loeschen */
|
||||
if( unlink( Error_File ) != 0 ) Log( LOG_ERR, "Can't delete \"%s\": %s", Error_File, strerror( errno ));
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef SYSLOG
|
||||
/* syslog abmelden */
|
||||
closelog( );
|
||||
#endif
|
||||
} /* Log_Exit */
|
||||
|
||||
|
||||
GLOBAL VOID Log( CONST INT Level, CONST CHAR *Format, ... )
|
||||
# ifdef PROTOTYPES
|
||||
GLOBAL void
|
||||
LogDebug( const char *Format, ... )
|
||||
# else
|
||||
GLOBAL void
|
||||
LogDebug( Format, va_alist )
|
||||
const char *Format;
|
||||
va_dcl
|
||||
# endif
|
||||
#ifdef DEBUG
|
||||
{
|
||||
char msg[MAX_LOG_MSG_LEN];
|
||||
va_list ap;
|
||||
|
||||
if (!NGIRCd_Debug) return;
|
||||
#ifdef PROTOTYPES
|
||||
va_start( ap, Format );
|
||||
#else
|
||||
va_start( ap );
|
||||
#endif
|
||||
vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap );
|
||||
va_end( ap );
|
||||
Log(LOG_DEBUG, "%s", msg);
|
||||
}
|
||||
#else
|
||||
{ /* do nothing */ }
|
||||
#endif /* DEBUG */
|
||||
|
||||
|
||||
#ifdef PROTOTYPES
|
||||
GLOBAL void
|
||||
Log( int Level, const char *Format, ... )
|
||||
#else
|
||||
GLOBAL void
|
||||
Log( Level, Format, va_alist )
|
||||
int Level;
|
||||
const char *Format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
/* Eintrag in Logfile(s) schreiben */
|
||||
|
||||
CHAR msg[MAX_LOG_MSG_LEN];
|
||||
char msg[MAX_LOG_MSG_LEN];
|
||||
bool snotice;
|
||||
va_list ap;
|
||||
|
||||
assert( Format != NULL );
|
||||
|
||||
if( Level & LOG_snotice )
|
||||
{
|
||||
/* Notice an User mit "s" Mode */
|
||||
snotice = true;
|
||||
Level &= ~LOG_snotice;
|
||||
}
|
||||
else snotice = false;
|
||||
|
||||
#ifdef DEBUG
|
||||
if(( Level == LOG_DEBUG ) && ( ! NGIRCd_Debug )) return;
|
||||
#else
|
||||
@@ -165,45 +224,81 @@ GLOBAL VOID Log( CONST INT Level, CONST CHAR *Format, ... )
|
||||
#endif
|
||||
|
||||
/* String mit variablen Argumenten zusammenbauen ... */
|
||||
#ifdef PROTOTYPES
|
||||
va_start( ap, Format );
|
||||
vsnprintf( msg, MAX_LOG_MSG_LEN - 1, Format, ap );
|
||||
msg[MAX_LOG_MSG_LEN - 1] = '\0';
|
||||
#else
|
||||
va_start( ap );
|
||||
#endif
|
||||
vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
/* ... und ausgeben */
|
||||
if( NGIRCd_NoDaemon ) printf( "[%d] %s\n", Level, msg );
|
||||
#ifdef USE_SYSLOG
|
||||
syslog( Level, msg );
|
||||
if( ! Is_Daemon )
|
||||
{
|
||||
/* auf Konsole ausgeben */
|
||||
fprintf( stdout, "[%d:%d] %s\n", (int)getpid( ), Level, msg );
|
||||
fflush( stdout );
|
||||
}
|
||||
#ifdef SYSLOG
|
||||
else
|
||||
{
|
||||
/* Syslog */
|
||||
syslog( Level, "%s", msg );
|
||||
}
|
||||
#endif
|
||||
|
||||
va_end( ap );
|
||||
if( Level <= LOG_CRIT )
|
||||
{
|
||||
/* log critical messages to stderr */
|
||||
fprintf( stderr, "%s\n", msg );
|
||||
fflush( stderr );
|
||||
}
|
||||
|
||||
if( snotice )
|
||||
{
|
||||
/* NOTICE an lokale User mit "s"-Mode */
|
||||
Wall_ServerNotice( msg );
|
||||
}
|
||||
} /* Log */
|
||||
|
||||
|
||||
GLOBAL VOID Log_Init_Resolver( VOID )
|
||||
GLOBAL void
|
||||
Log_Init_Resolver( void )
|
||||
{
|
||||
#ifdef USE_SYSLOG
|
||||
openlog( PACKAGE, LOG_CONS|LOG_PID, LOG_LOCAL5 );
|
||||
#ifdef SYSLOG
|
||||
openlog( PACKAGE_NAME, LOG_CONS|LOG_PID, LOG_LOCAL5 );
|
||||
#endif
|
||||
#ifdef DEBUG
|
||||
Log_Resolver( LOG_DEBUG, "Resolver sub-process starting, PID %d.", getpid( ));
|
||||
#endif
|
||||
} /* Log_Init_Resolver */
|
||||
|
||||
|
||||
GLOBAL VOID Log_Exit_Resolver( VOID )
|
||||
GLOBAL void
|
||||
Log_Exit_Resolver( void )
|
||||
{
|
||||
#ifdef USE_SYSLOG
|
||||
#ifdef DEBUG
|
||||
Log_Resolver( LOG_DEBUG, "Resolver sub-process %d done.", getpid( ));
|
||||
#endif
|
||||
#ifdef SYSLOG
|
||||
closelog( );
|
||||
#endif
|
||||
} /* Log_Exit_Resolver */
|
||||
|
||||
|
||||
GLOBAL VOID Log_Resolver( CONST INT Level, CONST CHAR *Format, ... )
|
||||
#ifdef PROTOTYPES
|
||||
GLOBAL void
|
||||
Log_Resolver( const int Level, const char *Format, ... )
|
||||
#else
|
||||
GLOBAL void
|
||||
Log_Resolver( Level, Format, va_alist )
|
||||
const int Level;
|
||||
const char *Format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
/* Eintrag des Resolver in Logfile(s) schreiben */
|
||||
|
||||
#ifndef USE_SYSLOG
|
||||
return;
|
||||
#else
|
||||
|
||||
CHAR msg[MAX_LOG_MSG_LEN];
|
||||
char msg[MAX_LOG_MSG_LEN];
|
||||
va_list ap;
|
||||
|
||||
assert( Format != NULL );
|
||||
@@ -215,16 +310,46 @@ GLOBAL VOID Log_Resolver( CONST INT Level, CONST CHAR *Format, ... )
|
||||
#endif
|
||||
|
||||
/* String mit variablen Argumenten zusammenbauen ... */
|
||||
#ifdef PROTOTYPES
|
||||
va_start( ap, Format );
|
||||
vsnprintf( msg, MAX_LOG_MSG_LEN - 1, Format, ap );
|
||||
msg[MAX_LOG_MSG_LEN - 1] = '\0';
|
||||
|
||||
/* ... und ausgeben */
|
||||
syslog( Level, msg );
|
||||
|
||||
#else
|
||||
va_start( ap );
|
||||
#endif
|
||||
vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap );
|
||||
va_end( ap );
|
||||
|
||||
if( ! Is_Daemon )
|
||||
{
|
||||
/* Output to console */
|
||||
fprintf( stdout, "[%d:%d] %s\n", (int)getpid( ), Level, msg );
|
||||
fflush( stdout );
|
||||
}
|
||||
#ifdef SYSLOG
|
||||
else syslog( Level, "%s", msg );
|
||||
#endif
|
||||
} /* Log_Resolver */
|
||||
|
||||
|
||||
/**
|
||||
* Send log messages to users flagged with the "s" mode.
|
||||
* @param Msg The message to send.
|
||||
*/
|
||||
static void
|
||||
Wall_ServerNotice( char *Msg )
|
||||
{
|
||||
CLIENT *c;
|
||||
|
||||
assert( Msg != NULL );
|
||||
|
||||
c = Client_First( );
|
||||
while(c) {
|
||||
if (Client_Conn(c) > NONE && Client_HasMode(c, 's'))
|
||||
IRC_WriteStrClient(c, "NOTICE %s :%s%s", Client_ID(c),
|
||||
NOTICE_TXTPREFIX, Msg);
|
||||
|
||||
c = Client_Next( c );
|
||||
}
|
||||
} /* Wall_ServerNotice */
|
||||
|
||||
|
||||
/* -eof- */
|
||||
|
||||
@@ -2,40 +2,15 @@
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: log.h,v 1.7 2002/01/02 02:42:58 alex Exp $
|
||||
* $Id: log.h,v 1.18.2.1 2006/02/08 21:23:21 fw Exp $
|
||||
*
|
||||
* log.h: Logging-Funktionen (Header)
|
||||
*
|
||||
* $Log: log.h,v $
|
||||
* Revision 1.7 2002/01/02 02:42:58 alex
|
||||
* - Copyright-Texte aktualisiert.
|
||||
*
|
||||
* Revision 1.6 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.5 2001/12/29 20:16:31 alex
|
||||
* - Log-Funktionen fuer Resolver-Sub-Prozess implementiert.
|
||||
*
|
||||
* Revision 1.4 2001/12/27 01:44:49 alex
|
||||
* - die Verwendung von syslog kann nun abgeschaltet werden.
|
||||
*
|
||||
* Revision 1.3 2001/12/12 23:31:24 alex
|
||||
* - Zum Loggen wird nun auch syslog verwendet.
|
||||
*
|
||||
* Revision 1.2 2001/12/12 17:19:29 alex
|
||||
* - LOG_ERR heisst nun LOG_ERROR.
|
||||
*
|
||||
* Revision 1.1.1.1 2001/12/11 21:53:04 alex
|
||||
* - Imported sources to CVS.
|
||||
* Logging functions (header)
|
||||
*/
|
||||
|
||||
|
||||
@@ -43,7 +18,7 @@
|
||||
#define __log_h__
|
||||
|
||||
|
||||
#ifdef USE_SYSLOG
|
||||
#ifdef SYSLOG
|
||||
# include <syslog.h>
|
||||
#else
|
||||
# define LOG_EMERG 0
|
||||
@@ -57,15 +32,23 @@
|
||||
#endif
|
||||
|
||||
|
||||
GLOBAL VOID Log_Init( VOID );
|
||||
GLOBAL VOID Log_Exit( VOID );
|
||||
#define LOG_snotice 1024
|
||||
|
||||
GLOBAL VOID Log( CONST INT Level, CONST CHAR *Format, ... );
|
||||
|
||||
GLOBAL VOID Log_Init_Resolver( VOID );
|
||||
GLOBAL VOID Log_Exit_Resolver( VOID );
|
||||
GLOBAL void Log_Init PARAMS(( bool Daemon_Mode ));
|
||||
GLOBAL void Log_Exit PARAMS(( void ));
|
||||
|
||||
GLOBAL VOID Log_Resolver( CONST INT Level, CONST CHAR *Format, ... );
|
||||
GLOBAL void Log PARAMS(( int Level, const char *Format, ... ));
|
||||
GLOBAL void LogDebug PARAMS(( const char *Format, ... ));
|
||||
|
||||
GLOBAL void Log_Init_Resolver PARAMS(( void ));
|
||||
GLOBAL void Log_Exit_Resolver PARAMS(( void ));
|
||||
|
||||
GLOBAL void Log_Resolver PARAMS(( const int Level, const char *Format, ... ));
|
||||
|
||||
#ifdef DEBUG
|
||||
GLOBAL void Log_InitErrorfile PARAMS(( void ));
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
253
src/ngircd/match.c
Normal file
253
src/ngircd/match.c
Normal file
@@ -0,0 +1,253 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* Wildcard pattern matching
|
||||
*/
|
||||
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: match.c,v 1.3 2005/03/19 18:43:49 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "exp.h"
|
||||
#include "match.h"
|
||||
|
||||
|
||||
/*
|
||||
* Die Pattern-Matching-Funkionen [Matche(), Matche_After_Star()] basieren
|
||||
* auf Versionen von J. Kercheval. Die Version 1.1 wurde am 12.03.1991 als
|
||||
* "public domain" freigegeben:
|
||||
* <http://www.snippets.org/snippets/portable/MATCH+C.php3>
|
||||
*/
|
||||
|
||||
|
||||
LOCAL int Matche PARAMS(( char *p, char *t ));
|
||||
LOCAL int Matche_After_Star PARAMS(( char *p, char *t ));
|
||||
|
||||
|
||||
#define MATCH_PATTERN 6 /* bad pattern */
|
||||
#define MATCH_LITERAL 5 /* match failure on literal match */
|
||||
#define MATCH_RANGE 4 /* match failure on [..] construct */
|
||||
#define MATCH_ABORT 3 /* premature end of text string */
|
||||
#define MATCH_END 2 /* premature end of pattern string */
|
||||
#define MATCH_VALID 1 /* valid match */
|
||||
|
||||
|
||||
GLOBAL bool
|
||||
Match( char *Pattern, char *String )
|
||||
{
|
||||
/* Pattern mit String vergleichen */
|
||||
if( Matche( Pattern, String ) == MATCH_VALID ) return true;
|
||||
else return false;
|
||||
} /* Match */
|
||||
|
||||
|
||||
LOCAL int
|
||||
Matche( char *p, char *t )
|
||||
{
|
||||
register char range_start, range_end;
|
||||
bool invert;
|
||||
bool member_match;
|
||||
bool loop;
|
||||
|
||||
for( ; *p; p++, t++ )
|
||||
{
|
||||
/* if this is the end of the text then this is the end of the match */
|
||||
if( ! *t )
|
||||
{
|
||||
return ( *p == '*' && *++p == '\0' ) ? MATCH_VALID : MATCH_ABORT;
|
||||
}
|
||||
|
||||
/* determine and react to pattern type */
|
||||
switch( *p )
|
||||
{
|
||||
case '?': /* single any character match */
|
||||
break;
|
||||
|
||||
case '*': /* multiple any character match */
|
||||
return Matche_After_Star( p, t );
|
||||
|
||||
case '[': /* [..] construct, single member/exclusion character match */
|
||||
/* move to beginning of range */
|
||||
p++;
|
||||
|
||||
/* check if this is a member match or exclusion match */
|
||||
invert = false;
|
||||
if( *p == '!' || *p == '^' )
|
||||
{
|
||||
invert = true;
|
||||
p++;
|
||||
}
|
||||
|
||||
/* if closing bracket here or at range start then we have a malformed pattern */
|
||||
if ( *p == ']' ) return MATCH_PATTERN;
|
||||
|
||||
member_match = false;
|
||||
loop = true;
|
||||
|
||||
while( loop )
|
||||
{
|
||||
/* if end of construct then loop is done */
|
||||
if( *p == ']' )
|
||||
{
|
||||
loop = false;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* matching a '!', '^', '-', '\' or a ']' */
|
||||
if( *p == '\\' ) range_start = range_end = *++p;
|
||||
else range_start = range_end = *p;
|
||||
|
||||
/* if end of pattern then bad pattern (Missing ']') */
|
||||
if( ! *p ) return MATCH_PATTERN;
|
||||
|
||||
/* check for range bar */
|
||||
if( *++p == '-' )
|
||||
{
|
||||
/* get the range end */
|
||||
range_end = *++p;
|
||||
|
||||
/* if end of pattern or construct then bad pattern */
|
||||
if( range_end == '\0' || range_end == ']' ) return MATCH_PATTERN;
|
||||
|
||||
/* special character range end */
|
||||
if( range_end == '\\' )
|
||||
{
|
||||
range_end = *++p;
|
||||
|
||||
/* if end of text then we have a bad pattern */
|
||||
if ( ! range_end ) return MATCH_PATTERN;
|
||||
}
|
||||
|
||||
/* move just beyond this range */
|
||||
p++;
|
||||
}
|
||||
|
||||
/* if the text character is in range then match found. make sure the range
|
||||
* letters have the proper relationship to one another before comparison */
|
||||
if( range_start < range_end )
|
||||
{
|
||||
if( *t >= range_start && *t <= range_end )
|
||||
{
|
||||
member_match = true;
|
||||
loop = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if( *t >= range_end && *t <= range_start )
|
||||
{
|
||||
member_match = true;
|
||||
loop = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* if there was a match in an exclusion set then no match */
|
||||
/* if there was no match in a member set then no match */
|
||||
if(( invert && member_match ) || ! ( invert || member_match )) return MATCH_RANGE;
|
||||
|
||||
/* if this is not an exclusion then skip the rest of the [...]
|
||||
* construct that already matched. */
|
||||
if( member_match )
|
||||
{
|
||||
while( *p != ']' )
|
||||
{
|
||||
/* bad pattern (Missing ']') */
|
||||
if( ! *p ) return MATCH_PATTERN;
|
||||
|
||||
/* skip exact match */
|
||||
if( *p == '\\' )
|
||||
{
|
||||
p++;
|
||||
|
||||
/* if end of text then we have a bad pattern */
|
||||
if( ! *p ) return MATCH_PATTERN;
|
||||
}
|
||||
|
||||
/* move to next pattern char */
|
||||
p++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case '\\': /* next character is quoted and must match exactly */
|
||||
/* move pattern pointer to quoted char and fall through */
|
||||
p++;
|
||||
|
||||
/* if end of text then we have a bad pattern */
|
||||
if( ! *p ) return MATCH_PATTERN;
|
||||
|
||||
/* must match this character exactly */
|
||||
default:
|
||||
if( *p != *t ) return MATCH_LITERAL;
|
||||
}
|
||||
}
|
||||
/* if end of text not reached then the pattern fails */
|
||||
|
||||
if( *t ) return MATCH_END;
|
||||
else return MATCH_VALID;
|
||||
} /* Matche */
|
||||
|
||||
|
||||
LOCAL int
|
||||
Matche_After_Star( char *p, char *t )
|
||||
{
|
||||
register int nextp, match = 0;
|
||||
|
||||
/* pass over existing ? and * in pattern */
|
||||
while( *p == '?' || *p == '*' )
|
||||
{
|
||||
/* take one char for each ? and + */
|
||||
if (*p == '?')
|
||||
{
|
||||
/* if end of text then no match */
|
||||
if( ! *t++ ) return MATCH_ABORT;
|
||||
}
|
||||
|
||||
/* move to next char in pattern */
|
||||
p++;
|
||||
}
|
||||
|
||||
/* if end of pattern we have matched regardless of text left */
|
||||
if( ! *p ) return MATCH_VALID;
|
||||
|
||||
/* get the next character to match which must be a literal or '[' */
|
||||
nextp = *p;
|
||||
if( nextp == '\\' )
|
||||
{
|
||||
nextp = p[1];
|
||||
|
||||
/* if end of text then we have a bad pattern */
|
||||
if( ! nextp ) return MATCH_PATTERN;
|
||||
}
|
||||
|
||||
/* Continue until we run out of text or definite result seen */
|
||||
do
|
||||
{
|
||||
/* a precondition for matching is that the next character
|
||||
* in the pattern match the next character in the text or that
|
||||
* the next pattern char is the beginning of a range. Increment
|
||||
* text pointer as we go here */
|
||||
if( nextp == *t || nextp == '[' ) match = Matche( p, t );
|
||||
|
||||
/* if the end of text is reached then no match */
|
||||
if( ! *t++ ) match = MATCH_ABORT;
|
||||
} while( match != MATCH_VALID && match != MATCH_ABORT && match != MATCH_PATTERN );
|
||||
|
||||
/* return result */
|
||||
return match;
|
||||
} /* Matche_After_Star */
|
||||
|
||||
|
||||
/* -eof- */
|
||||
27
src/ngircd/match.h
Normal file
27
src/ngircd/match.h
Normal file
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: match.h,v 1.3 2005/03/19 18:43:49 fw Exp $
|
||||
*
|
||||
* Wildcard pattern matching (header)
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __match_h__
|
||||
#define __match_h__
|
||||
|
||||
|
||||
GLOBAL bool Match PARAMS(( char *Pattern, char *String ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
||||
@@ -1,123 +1,16 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
* Copyright (c)2001-2004 Alexander Barton <alex@barton.de>
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: messages.h,v 1.33 2002/02/27 20:33:01 alex Exp $
|
||||
* $Id: messages.h,v 1.66 2004/02/28 02:18:16 alex Exp $
|
||||
*
|
||||
* irc.h: IRC-Befehle (Header)
|
||||
*
|
||||
* $Log: messages.h,v $
|
||||
* Revision 1.33 2002/02/27 20:33:01 alex
|
||||
* - neue Text-Konstante: ERR_NOTONCHANNEL_MSG
|
||||
*
|
||||
* Revision 1.32 2002/02/27 18:23:24 alex
|
||||
* - neue Text-Konstanten RPL_UNAWAY_MSG und RPL_NOWAWAY_MSG.
|
||||
*
|
||||
* Revision 1.31 2002/02/27 17:05:13 alex
|
||||
* - neue Text-Konstante ERR_CANNOTSENDTOCHAN_MSG eingefuehrt.
|
||||
*
|
||||
* Revision 1.30 2002/02/17 23:39:24 alex
|
||||
* - Konstanten sortiert, neue Konstante RPL_VERSION und RPL_VERSION_MSG.
|
||||
*
|
||||
* Revision 1.29 2002/02/17 17:42:53 alex
|
||||
* - neue Text-Konstante ERR_UMODEUNKNOWNFLAG2_MSG.
|
||||
*
|
||||
* Revision 1.28 2002/02/13 23:04:50 alex
|
||||
* - RPL_MYINFO_MSG korrigiert.
|
||||
*
|
||||
* Revision 1.27 2002/02/13 17:45:57 alex
|
||||
* - unterstuetzte User- und Channel-Modes stehen nun in Konstanten.
|
||||
*
|
||||
* Revision 1.26 2002/02/11 23:33:12 alex
|
||||
* - neue Message ERR_CHANOPRIVSNEEDED_MSG definiert.
|
||||
*
|
||||
* Revision 1.25 2002/02/11 15:48:39 alex
|
||||
* - neue Nachricht RPL_CHANNELMODEIS definiert.
|
||||
*
|
||||
* Revision 1.24 2002/02/06 16:51:39 alex
|
||||
* - neue Text-Konstante RPL_UMODEISCHAN_MSG.
|
||||
*
|
||||
* Revision 1.23 2002/01/29 00:14:05 alex
|
||||
* - RPL_WHOISCHANNELS_MSG korrigiert.
|
||||
*
|
||||
* Revision 1.22 2002/01/28 13:06:19 alex
|
||||
* - RPL_NAMREPLY_MSG an tatsaechliche Implementierung angepasst ;-)
|
||||
*
|
||||
* Revision 1.21 2002/01/27 17:13:37 alex
|
||||
* - neue Defines fuer RPL_TOPIC und RPL_NOTOPIC.
|
||||
*
|
||||
* Revision 1.20 2002/01/21 00:02:34 alex
|
||||
* - ERR_NOSUCHCHANNEL hinzugefuegt.
|
||||
*
|
||||
* Revision 1.19 2002/01/16 22:09:52 alex
|
||||
* - RPL_LUSERME_MSG erweitert, kleinere Aenderungen.
|
||||
*
|
||||
* Revision 1.18 2002/01/11 23:50:55 alex
|
||||
* - LINKS implementiert, LUSERS begonnen.
|
||||
*
|
||||
* Revision 1.17 2002/01/05 23:23:44 alex
|
||||
* - neue Nachricht ERR_NOSUCHSERVER_MSG definiert.
|
||||
*
|
||||
* Revision 1.16 2002/01/03 02:24:21 alex
|
||||
* - neue Message ERR_NOTREGISTEREDSERVER_MSG.
|
||||
*
|
||||
* Revision 1.15 2002/01/02 02:42:58 alex
|
||||
* - Copyright-Texte aktualisiert.
|
||||
*
|
||||
* Revision 1.14 2001/12/31 16:00:57 alex
|
||||
* - "o" zu den unterstuetzten Modes hinzugefuegt.
|
||||
*
|
||||
* Revision 1.13 2001/12/31 15:33:13 alex
|
||||
* - neuer Befehl NAMES, kleinere Bugfixes.
|
||||
* - Bug bei PING behoben: war zu restriktiv implementiert :-)
|
||||
*
|
||||
* Revision 1.12 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.11 2001/12/30 19:25:39 alex
|
||||
* - RPL_MYINFO_MSG um unterstuetzte User-Modes ergaengz.
|
||||
*
|
||||
* Revision 1.10 2001/12/30 11:42:00 alex
|
||||
* - der Server meldet nun eine ordentliche "Start-Zeit".
|
||||
*
|
||||
* Revision 1.9 2001/12/29 03:06:56 alex
|
||||
* - Texte ergaenzt, einige Bugs behoben (Leerzeichen falsch gesetzt, z.B.)
|
||||
*
|
||||
* Revision 1.8 2001/12/27 19:17:26 alex
|
||||
* - neue Befehle PRIVMSG, NOTICE, PING.
|
||||
*
|
||||
* Revision 1.7 2001/12/27 16:56:06 alex
|
||||
* - RPL_WELCOME an Client_GetID() angepasst.
|
||||
*
|
||||
* Revision 1.6 2001/12/26 22:48:53 alex
|
||||
* - MOTD-Datei ist nun konfigurierbar und wird gelesen.
|
||||
*
|
||||
* Revision 1.5 2001/12/26 03:51:13 alex
|
||||
* - in ERR_NOTREGISTERED_MSG fehlte ein "%s" - jetzt steht auch hier der Nick.
|
||||
*
|
||||
* Revision 1.4 2001/12/26 03:22:40 alex
|
||||
* - Format der Meldungen ueberarbeitet: fast immer ist nun der Nick enthalten.
|
||||
*
|
||||
* Revision 1.3 2001/12/25 19:20:11 alex
|
||||
* - neue Message: ERR_NICKNAMEINUSE[_MSG].
|
||||
*
|
||||
* Revision 1.2 2001/12/24 01:30:46 alex
|
||||
* - einige Messages korrigiert, andere ergaenzt (u.a. fuer MOTD).
|
||||
*
|
||||
* Revision 1.1 2001/12/23 21:53:32 alex
|
||||
* - Ich habe diesen Header begonnen.
|
||||
*
|
||||
* Revision 1.1 2001/12/14 08:13:43 alex
|
||||
* - neues Modul begonnen :-)
|
||||
* IRC numerics (Header)
|
||||
*/
|
||||
|
||||
|
||||
@@ -125,175 +18,108 @@
|
||||
#define __messages_h__
|
||||
|
||||
|
||||
#define RPL_WELCOME "001"
|
||||
#define RPL_WELCOME_MSG RPL_WELCOME" %s :Welcome to the Internet Relay Network %s"
|
||||
#define RPL_WELCOME_MSG "001 %s :Welcome to the Internet Relay Network %s"
|
||||
#define RPL_YOURHOST_MSG "002 %s :Your host is %s, running version ngircd-%s (%s/%s/%s)"
|
||||
#define RPL_CREATED_MSG "003 %s :This server has been started %s"
|
||||
#define RPL_MYINFO_MSG "004 %s %s ngircd-%s %s %s"
|
||||
#define RPL_ISUPPORT_MSG "005 %s NICKLEN=%d TOPICLEN=%d AWAYLEN=%d MAXCHANNELS=%d :are supported on this server"
|
||||
|
||||
#define RPL_YOURHOST "002"
|
||||
#define RPL_YOURHOST_MSG RPL_YOURHOST" %s :Your host is %s, running ngircd "VERSION"-"P_OSNAME"/"P_ARCHNAME
|
||||
#define RPL_TRACELINK_MSG "200 %s Link %s-%s %s %s V%s %ld %d %d"
|
||||
#define RPL_TRACEOPERATOR_MSG "204 %s Oper 2 :%s"
|
||||
#define RPL_TRACESERVER_MSG "206 %s Serv 1 0S 0C %s[%s@%s] *!*@%s :V%s"
|
||||
#define RPL_STATSLINKINFO_MSG "211 %s %s %d %ld %ld %ld %ld :%ld"
|
||||
#define RPL_STATSCOMMANDS_MSG "212 %s %s %ld %ld %ld"
|
||||
#define RPL_ENDOFSTATS_MSG "219 %s %c :End of STATS report"
|
||||
#define RPL_UMODEIS_MSG "221 %s +%s"
|
||||
#define RPL_LUSERCLIENT_MSG "251 %s :There are %ld users and %ld services on %ld servers"
|
||||
#define RPL_LUSEROP_MSG "252 %s %ld :operator(s) online"
|
||||
#define RPL_LUSERUNKNOWN_MSG "253 %s %ld :unknown connection(s)"
|
||||
#define RPL_LUSERCHANNELS_MSG "254 %s %ld :channels formed"
|
||||
#define RPL_LUSERME_MSG "255 %s :I have %ld users, %ld services and %ld servers"
|
||||
#define RPL_ADMINME_MSG "256 %s %s :Administrative info"
|
||||
#define RPL_ADMINLOC1_MSG "257 %s :%s"
|
||||
#define RPL_ADMINLOC2_MSG "258 %s :%s"
|
||||
#define RPL_ADMINEMAIL_MSG "259 %s :%s"
|
||||
#define RPL_TRACEEND_MSG "262 %s %s %s-%s.%s :End of TRACE"
|
||||
#define RPL_LOCALUSERS_MSG "265 %s :Current local users: %ld, Max: %ld"
|
||||
#define RPL_NETUSERS_MSG "266 %s :Current global users: %ld, Max: %ld"
|
||||
|
||||
#define RPL_CREATED "003"
|
||||
#define RPL_CREATED_MSG RPL_CREATED" %s :This server was started %s"
|
||||
#define RPL_AWAY_MSG "301 %s %s :%s"
|
||||
#define RPL_USERHOST_MSG "302 %s :"
|
||||
#define RPL_ISON_MSG "303 %s :"
|
||||
#define RPL_UNAWAY_MSG "305 %s :You are no longer marked as being away"
|
||||
#define RPL_NOWAWAY_MSG "306 %s :You have been marked as being away"
|
||||
#define RPL_WHOISUSER_MSG "311 %s %s %s %s * :%s"
|
||||
#define RPL_WHOISSERVER_MSG "312 %s %s %s :%s"
|
||||
#define RPL_WHOISOPERATOR_MSG "313 %s %s :is an IRC operator"
|
||||
#define RPL_WHOWASUSER_MSG "314 %s %s %s %s * :%s"
|
||||
#define RPL_ENDOFWHO_MSG "315 %s %s :End of WHO list"
|
||||
#define RPL_WHOISIDLE_MSG "317 %s %s %ld :seconds idle"
|
||||
#define RPL_ENDOFWHOIS_MSG "318 %s %s :End of WHOIS list"
|
||||
#define RPL_WHOISCHANNELS_MSG "319 %s %s :"
|
||||
#define RPL_LIST_MSG "322 %s %s %ld :%s"
|
||||
#define RPL_LISTEND_MSG "323 %s :End of LIST"
|
||||
#define RPL_CHANNELMODEIS_MSG "324 %s %s +%s"
|
||||
#define RPL_NOTOPIC_MSG "331 %s %s :No topic is set"
|
||||
#define RPL_TOPIC_MSG "332 %s %s :%s"
|
||||
#define RPL_INVITING_MSG "341 %s %s %s"
|
||||
#define RPL_INVITELIST_MSG "346 %s %s %s"
|
||||
#define RPL_ENDOFINVITELIST_MSG "347 %s %s :End of channel invite list"
|
||||
#define RPL_VERSION_MSG "351 %s %s-%s.%s %s :%s"
|
||||
#define RPL_WHOREPLY_MSG "352 %s %s %s %s %s %s %s :%d %s"
|
||||
#define RPL_NAMREPLY_MSG "353 %s %s %s :"
|
||||
#define RPL_LINKS_MSG "364 %s %s %s :%d %s"
|
||||
#define RPL_ENDOFLINKS_MSG "365 %s %s :End of LINKS list"
|
||||
#define RPL_ENDOFNAMES_MSG "366 %s %s :End of NAMES list"
|
||||
#define RPL_BANLIST_MSG "367 %s %s %s"
|
||||
#define RPL_ENDOFBANLIST_MSG "368 %s %s :End of channel ban list"
|
||||
#define RPL_ENDOFWHOWAS_MSG "369 %s %s :End of WHOWAS list"
|
||||
#define RPL_MOTD_MSG "372 %s :- %s"
|
||||
#define RPL_MOTDSTART_MSG "375 %s :- %s message of the day"
|
||||
#define RPL_ENDOFMOTD_MSG "376 %s :End of MOTD command"
|
||||
#define RPL_YOUREOPER_MSG "381 %s :You are now an IRC Operator"
|
||||
#define RPL_YOURESERVICE_MSG "383 %s :You are service %s"
|
||||
#define RPL_TIME_MSG "391 %s %s :%s"
|
||||
|
||||
#define RPL_MYINFO "004"
|
||||
#define RPL_MYINFO_MSG RPL_MYINFO" %s :%s ngircd-"VERSION" "USERMODES" "CHANMODES
|
||||
#define ERR_NOSUCHNICK_MSG "401 %s %s :No such nick or channel name"
|
||||
#define ERR_NOSUCHSERVER_MSG "402 %s %s :No such server"
|
||||
#define ERR_NOSUCHCHANNEL_MSG "403 %s %s :No such channel"
|
||||
#define ERR_CANNOTSENDTOCHAN_MSG "404 %s %s :Cannot send to channel"
|
||||
#define ERR_TOOMANYCHANNELS_MSG "405 %s %s :You have joined too many channels"
|
||||
#define ERR_WASNOSUCHNICK_MSG "406 %s %s :There was no such nickname"
|
||||
#define ERR_NOORIGIN_MSG "409 %s :No origin specified"
|
||||
#define ERR_NORECIPIENT_MSG "411 %s :No receipient given (%s)"
|
||||
#define ERR_NOTEXTTOSEND_MSG "412 %s :No text to send"
|
||||
#define ERR_UNKNOWNCOMMAND_MSG "421 %s %s :Unknown command"
|
||||
#define ERR_NOMOTD_MSG "422 %s :MOTD file is missing"
|
||||
#define ERR_ERRONEUSNICKNAME_MSG "432 %s %s :Erroneous nickname"
|
||||
#define ERR_NICKNAMEINUSE_MSG "433 %s %s :Nickname already in use"
|
||||
#define ERR_USERNOTINCHANNEL_MSG "441 %s %s %s :They aren't on that channel"
|
||||
#define ERR_NOTONCHANNEL_MSG "442 %s %s :You are not on that channel"
|
||||
#define ERR_USERONCHANNEL_MSG "443 %s %s %s :is already on channel"
|
||||
#define ERR_NOTREGISTERED_MSG "451 %s :Connection not registered"
|
||||
#define ERR_NOTREGISTEREDSERVER_MSG "451 %s :Connection not registered as server link"
|
||||
#define ERR_NEEDMOREPARAMS_MSG "461 %s %s :Syntax error"
|
||||
#define ERR_ALREADYREGISTRED_MSG "462 %s :Connection already registered"
|
||||
#define ERR_PASSWDMISMATCH_MSG "464 %s :Invalid password"
|
||||
#define ERR_CHANNELISFULL_MSG "471 %s %s :Cannot join channel (+l)"
|
||||
#define ERR_UNKNOWNMODE_MSG "472 %s: %c :is unknown mode char for %s"
|
||||
#define ERR_INVITEONLYCHAN_MSG "473 %s %s :Cannot join channel (+i)"
|
||||
#define ERR_BANNEDFROMCHAN_MSG "474 %s %s :Cannot join channel (+b)"
|
||||
#define ERR_BADCHANNELKEY_MSG "475 %s %s :Cannot join channel (+k)"
|
||||
#define ERR_NOPRIVILEGES_MSG "481 %s :Permission denied"
|
||||
#define ERR_CHANOPRIVSNEEDED_MSG "482 %s %s :You are not channel operator"
|
||||
#define ERR_CANTKILLSERVER_MSG "483 %s :You can't kill a server!"
|
||||
#define ERR_RESTRICTED_MSG "484 %s :Your connection is restricted"
|
||||
#define ERR_NOOPERHOST_MSG "491 %s :Not configured for your host"
|
||||
|
||||
#define RPL_UMODEIS "211"
|
||||
#define RPL_UMODEIS_MSG RPL_UMODEIS" %s +%s"
|
||||
#define ERR_UMODEUNKNOWNFLAG_MSG "501 %s :Unknown mode"
|
||||
#define ERR_UMODEUNKNOWNFLAG2_MSG "501 %s :Unknown mode \"%c%c\""
|
||||
#define ERR_USERSDONTMATCH_MSG "502 %s :Can't set/get mode for other users"
|
||||
|
||||
#define RPL_LUSERCLIENT "251"
|
||||
#define RPL_LUSERCLIENT_MSG RPL_LUSERCLIENT" %s :There are %d users and %d services on %d servers"
|
||||
|
||||
#define RPL_LUSEROP "252"
|
||||
#define RPL_LUSEROP_MSG RPL_LUSEROP" %s %d :operator(s) online"
|
||||
|
||||
#define RPL_LUSERUNKNOWN "253"
|
||||
#define RPL_LUSERUNKNOWN_MSG RPL_LUSERUNKNOWN" %s %d :unknown connection(s)"
|
||||
|
||||
#define RPL_LUSERCHANNELS "254"
|
||||
#define RPL_LUSERCHANNELS_MSG RPL_LUSERCHANNELS" %s %d :channels formed"
|
||||
|
||||
#define RPL_LUSERME "255"
|
||||
#define RPL_LUSERME_MSG RPL_LUSERME" %s :I have %d users, %d services and %d servers"
|
||||
|
||||
|
||||
#define RPL_UNAWAY "305"
|
||||
#define RPL_UNAWAY_MSG RPL_UNAWAY" %s :You are no longer marked as being away"
|
||||
|
||||
#define RPL_NOWAWAY "306"
|
||||
#define RPL_NOWAWAY_MSG RPL_NOWAWAY" %s :You have been marked as being away"
|
||||
|
||||
#define RPL_MOTD "372"
|
||||
#define RPL_MOTD_MSG RPL_MOTD" %s :- %s"
|
||||
|
||||
#define RPL_MOTDSTART "375"
|
||||
#define RPL_MOTDSTART_MSG RPL_MOTDSTART" %s :- %s message of the day"
|
||||
|
||||
#define RPL_ENDOFMOTD "376"
|
||||
#define RPL_ENDOFMOTD_MSG RPL_ENDOFMOTD" %s :End of MOTD command"
|
||||
|
||||
#define RPL_AWAY "301"
|
||||
#define RPL_AWAY_MSG RPL_AWAY" %s %s :%s"
|
||||
|
||||
#define RPL_USERHOST "302"
|
||||
#define RPL_USERHOST_MSG RPL_USERHOST" %s :"
|
||||
|
||||
#define RPL_ISON "303"
|
||||
#define RPL_ISON_MSG RPL_ISON" %s :"
|
||||
|
||||
#define RPL_WHOISUSER "311"
|
||||
#define RPL_WHOISUSER_MSG RPL_WHOISUSER" %s %s %s %s * :%s"
|
||||
|
||||
#define RPL_WHOISSERVER "312"
|
||||
#define RPL_WHOISSERVER_MSG RPL_WHOISSERVER" %s %s %s :%s"
|
||||
|
||||
#define RPL_WHOISOPERATOR "313"
|
||||
#define RPL_WHOISOPERATOR_MSG RPL_WHOISOPERATOR" %s %s :is an IRC operator"
|
||||
|
||||
#define RPL_WHOISIDLE "317"
|
||||
#define RPL_WHOISIDLE_MSG RPL_WHOISIDLE" %s %s %ld :seconds idle"
|
||||
|
||||
#define RPL_ENDOFWHOIS "318"
|
||||
#define RPL_ENDOFWHOIS_MSG RPL_ENDOFWHOIS" %s %s :End of WHOIS list"
|
||||
|
||||
#define RPL_WHOISCHANNELS "319"
|
||||
#define RPL_WHOISCHANNELS_MSG RPL_WHOISCHANNELS" %s %s :"
|
||||
|
||||
#define RPL_CHANNELMODEIS "324"
|
||||
#define RPL_CHANNELMODEIS_MSG RPL_CHANNELMODEIS" %s %s +%s"
|
||||
|
||||
#define RPL_NOTOPIC "331"
|
||||
#define RPL_NOTOPIC_MSG RPL_NOTOPIC" %s %s :No topic is set"
|
||||
|
||||
#define RPL_TOPIC "332"
|
||||
#define RPL_TOPIC_MSG RPL_TOPIC" %s %s :%s"
|
||||
|
||||
#define RPL_VERSION "351"
|
||||
#define RPL_VERSION_MSG RPL_VERSION" %s "PACKAGE"-"VERSION".%s %s :%s"
|
||||
|
||||
#define RPL_NAMREPLY "353"
|
||||
#define RPL_NAMREPLY_MSG RPL_NAMREPLY" %s %s %s :"
|
||||
|
||||
#define RPL_LINKS "364"
|
||||
#define RPL_LINKS_MSG RPL_LINKS" %s %s %s :%d %s"
|
||||
|
||||
#define RPL_ENDOFLINKS "365"
|
||||
#define RPL_ENDOFLINKS_MSG RPL_ENDOFLINKS" %s %s :End of LINKS list"
|
||||
|
||||
#define RPL_ENDOFNAMES "366"
|
||||
#define RPL_ENDOFNAMES_MSG RPL_ENDOFNAMES" %s %s :End of NAMES list"
|
||||
|
||||
#define RPL_YOUREOPER "381"
|
||||
#define RPL_YOUREOPER_MSG RPL_YOUREOPER" %s :You are now an IRC Operator"
|
||||
|
||||
|
||||
#define ERR_NOSUCHNICK "401"
|
||||
#define ERR_NOSUCHNICK_MSG ERR_NOSUCHNICK" %s %s :No such nick or channel name"
|
||||
|
||||
#define ERR_NOSUCHSERVER "402"
|
||||
#define ERR_NOSUCHSERVER_MSG ERR_NOSUCHSERVER" %s %s :No such server"
|
||||
|
||||
#define ERR_NOSUCHCHANNEL "403"
|
||||
#define ERR_NOSUCHCHANNEL_MSG ERR_NOSUCHCHANNEL" %s %s :No such channel"
|
||||
|
||||
#define ERR_CANNOTSENDTOCHAN "404"
|
||||
#define ERR_CANNOTSENDTOCHAN_MSG ERR_CANNOTSENDTOCHAN" %s %s :Cannot send to channel"
|
||||
|
||||
#define ERR_NOORIGIN "409"
|
||||
#define ERR_NOORIGIN_MSG ERR_NOORIGIN" %s :No origin specified"
|
||||
|
||||
#define ERR_NORECIPIENT "411"
|
||||
#define ERR_NORECIPIENT_MSG ERR_NORECIPIENT" %s :No receipient given (%s)"
|
||||
|
||||
#define ERR_NOTEXTTOSEND "412"
|
||||
#define ERR_NOTEXTTOSEND_MSG ERR_NOTEXTTOSEND" %s :No text to send"
|
||||
|
||||
#define ERR_UNKNOWNCOMMAND "421"
|
||||
#define ERR_UNKNOWNCOMMAND_MSG ERR_UNKNOWNCOMMAND" %s %s :Unknown command"
|
||||
|
||||
#define ERR_NOMOTD "422"
|
||||
#define ERR_NOMOTD_MSG ERR_NOMOTD" %s :MOTD file is missing"
|
||||
|
||||
#define ERR_ERRONEUSNICKNAME "432"
|
||||
#define ERR_ERRONEUSNICKNAME_MSG ERR_ERRONEUSNICKNAME" %s %s :Erroneous nickname"
|
||||
|
||||
#define ERR_NICKNAMEINUSE "433"
|
||||
#define ERR_NICKNAMEINUSE_MSG ERR_NICKNAMEINUSE" %s %s :Nickname already in use"
|
||||
|
||||
#define ERR_NOTONCHANNEL "442"
|
||||
#define ERR_NOTONCHANNEL_MSG ERR_NOTONCHANNEL" %s %s :You are not on that channel"
|
||||
|
||||
#define ERR_NOTREGISTERED "451"
|
||||
#define ERR_NOTREGISTERED_MSG ERR_NOTREGISTERED" %s :Connection not registered"
|
||||
#define ERR_NOTREGISTEREDSERVER_MSG ERR_NOTREGISTERED" %s :Connection not registered as server link"
|
||||
|
||||
#define ERR_NEEDMOREPARAMS "461"
|
||||
#define ERR_NEEDMOREPARAMS_MSG ERR_NEEDMOREPARAMS" %s %s :Syntax error"
|
||||
|
||||
#define ERR_ALREADYREGISTRED "462"
|
||||
#define ERR_ALREADYREGISTRED_MSG ERR_ALREADYREGISTRED" %s :Connection already registered"
|
||||
|
||||
#define ERR_PASSWDMISMATCH "464"
|
||||
#define ERR_PASSWDMISMATCH_MSG ERR_PASSWDMISMATCH" %s: Invalid password"
|
||||
|
||||
#define ERR_NOPRIVILEGES "481"
|
||||
#define ERR_NOPRIVILEGES_MSG ERR_NOPRIVILEGES" %s :Permission denied"
|
||||
|
||||
#define ERR_CHANOPRIVSNEEDED "482"
|
||||
#define ERR_CHANOPRIVSNEEDED_MSG ERR_CHANOPRIVSNEEDED" %s %s :You are not channel operator"
|
||||
|
||||
#define ERR_RESTRICTED "484"
|
||||
#define ERR_RESTRICTED_MSG ERR_RESTRICTED" %s :Your connection is restricted"
|
||||
|
||||
#define ERR_NOOPERHOST "491"
|
||||
#define ERR_NOOPERHOST_MSG ERR_NOOPERHOST" %s :Not configured for your host"
|
||||
|
||||
|
||||
#define ERR_UMODEUNKNOWNFLAG "501"
|
||||
#define ERR_UMODEUNKNOWNFLAG_MSG ERR_UMODEUNKNOWNFLAG" %s :Unknown mode"
|
||||
#define ERR_UMODEUNKNOWNFLAG2_MSG ERR_UMODEUNKNOWNFLAG" %s :Unknown mode \"%c%c\""
|
||||
|
||||
#define ERR_USERSDONTMATCH "502"
|
||||
#define ERR_USERSDONTMATCH_MSG ERR_USERSDONTMATCH" %s :Can't set/get mode for other users"
|
||||
#ifdef ZLIB
|
||||
#define RPL_STATSLINKINFOZIP_MSG "211 %s %s %d %ld %ld/%ld %ld %ld/%ld :%ld"
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -2,49 +2,15 @@
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: ngircd.h,v 1.10 2002/02/19 20:07:48 alex Exp $
|
||||
* $Id: ngircd.h,v 1.22 2005/06/24 19:20:56 fw Exp $
|
||||
*
|
||||
* ngircd.h: Prototypen aus dem "Haupt-Modul"
|
||||
*
|
||||
* $Log: ngircd.h,v $
|
||||
* Revision 1.10 2002/02/19 20:07:48 alex
|
||||
* - Neue Variablen NGIRCd_DebugVersion und NGIRCd_Passive.
|
||||
*
|
||||
* Revision 1.9 2002/02/17 23:40:32 alex
|
||||
* - Neue Funktion NGIRCd_VersionAddition().
|
||||
*
|
||||
* Revision 1.8 2002/01/18 11:12:11 alex
|
||||
* - der Sniffer wird nun nur noch aktiviert, wenn auf Kommandozeile angegeben.
|
||||
*
|
||||
* Revision 1.7 2002/01/11 14:45:18 alex
|
||||
* - Kommandozeilen-Parser implementiert: Debug- und No-Daemon-Modus, Hilfe.
|
||||
*
|
||||
* Revision 1.6 2002/01/02 02:44:37 alex
|
||||
* - neue Defines fuer max. Anzahl Server und Operatoren.
|
||||
*
|
||||
* Revision 1.5 2001/12/31 03:06:03 alex
|
||||
* - das #include fuer time.h hat noch gefehlt.
|
||||
*
|
||||
* Revision 1.4 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.3 2001/12/30 11:42:00 alex
|
||||
* - der Server meldet nun eine ordentliche "Start-Zeit".
|
||||
*
|
||||
* Revision 1.2 2001/12/12 23:30:01 alex
|
||||
* - NGIRCd_Quit ist nun das globale Flag zum Beenden des ngircd.
|
||||
*
|
||||
* Revision 1.1.1.1 2001/12/11 21:53:04 alex
|
||||
* - Imported sources to CVS.
|
||||
* Prototypes of the "main module".
|
||||
*/
|
||||
|
||||
|
||||
@@ -53,29 +19,36 @@
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#include "defines.h"
|
||||
|
||||
|
||||
GLOBAL time_t NGIRCd_Start; /* Startzeitpunkt des Daemon */
|
||||
GLOBAL CHAR NGIRCd_StartStr[64];
|
||||
GLOBAL char NGIRCd_StartStr[64];
|
||||
GLOBAL char NGIRCd_Version[126];
|
||||
GLOBAL char NGIRCd_VersionAddition[126];
|
||||
|
||||
#ifdef DEBUG
|
||||
GLOBAL BOOLEAN NGIRCd_Debug; /* Debug-Modus aktivieren */
|
||||
GLOBAL bool NGIRCd_Debug; /* Debug-Modus aktivieren */
|
||||
#endif
|
||||
|
||||
#ifdef SNIFFER
|
||||
GLOBAL BOOLEAN NGIRCd_Sniffer; /* Sniffer aktivieren */
|
||||
GLOBAL bool NGIRCd_Sniffer; /* Sniffer aktivieren */
|
||||
#endif
|
||||
|
||||
GLOBAL BOOLEAN NGIRCd_NoDaemon; /* nicht im Hintergrund laufen */
|
||||
GLOBAL bool NGIRCd_Passive; /* nicht zu anderen Servern connecten */
|
||||
|
||||
GLOBAL BOOLEAN NGIRCd_Passive; /* nicht zu anderen Servern connecten */
|
||||
GLOBAL bool NGIRCd_SignalQuit; /* true: quit server*/
|
||||
GLOBAL bool NGIRCd_SignalRestart; /* true: restart server */
|
||||
GLOBAL bool NGIRCd_SignalRehash; /* true: reload configuration */
|
||||
|
||||
GLOBAL BOOLEAN NGIRCd_Quit; /* TRUE: ngIRCd beenden */
|
||||
GLOBAL BOOLEAN NGIRCd_Restart; /* TRUE: neu starten */
|
||||
GLOBAL char NGIRCd_DebugLevel[2]; /* Debug-Level fuer IRC_VERSION() */
|
||||
|
||||
GLOBAL CHAR NGIRCd_DebugLevel[2]; /* Debug-Level fuer IRC_VERSION() */
|
||||
GLOBAL char NGIRCd_ConfFile[FNAME_LEN]; /* Konfigurationsdatei */
|
||||
|
||||
GLOBAL CHAR *NGIRCd_Version( VOID );
|
||||
GLOBAL CHAR *NGIRCd_VersionAddition( VOID );
|
||||
GLOBAL char NGIRCd_ProtoID[COMMAND_LEN];/* Protokoll- und Server-Identifikation */
|
||||
|
||||
|
||||
GLOBAL void NGIRCd_Rehash PARAMS(( void ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -2,156 +2,153 @@
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: parse.c,v 1.28 2002/02/27 23:25:31 alex Exp $
|
||||
*
|
||||
* parse.c: Parsen der Client-Anfragen
|
||||
*
|
||||
* $Log: parse.c,v $
|
||||
* Revision 1.28 2002/02/27 23:25:31 alex
|
||||
* - Anpassungen an Aufteilung von irc.d, Init- und Exit-Funktionen entfernt.
|
||||
*
|
||||
* Revision 1.27 2002/02/27 20:33:13 alex
|
||||
* - Channel-Topics implementiert.
|
||||
*
|
||||
* Revision 1.26 2002/02/27 18:23:46 alex
|
||||
* - IRC-Befehl "AWAY" implementert.
|
||||
*
|
||||
* Revision 1.25 2002/02/26 20:52:15 alex
|
||||
* - Fehler bei Fehlermeldung wg. unbekanntem Prefix behoben.
|
||||
*
|
||||
* Revision 1.24 2002/02/23 21:39:48 alex
|
||||
* - IRC-Befehl KILL sowie Kills bei Nick Collsisions implementiert.
|
||||
*
|
||||
* Revision 1.23 2002/02/17 23:38:58 alex
|
||||
* - neuer IRC-Befehl VERSION implementiert: IRC_VERSION().
|
||||
*
|
||||
* Revision 1.22 2002/01/21 00:01:37 alex
|
||||
* - neue Befehle JOIN und PART.
|
||||
*
|
||||
* Revision 1.21 2002/01/18 11:12:11 alex
|
||||
* - der Sniffer wird nun nur noch aktiviert, wenn auf Kommandozeile angegeben.
|
||||
*
|
||||
* Revision 1.20 2002/01/11 23:50:55 alex
|
||||
* - LINKS implementiert, LUSERS begonnen.
|
||||
*
|
||||
* Revision 1.19 2002/01/09 01:08:42 alex
|
||||
* - Parses handhabt Leerzeichen zw. Parametern nun etwas "lockerer".
|
||||
*
|
||||
* Revision 1.18 2002/01/07 15:29:11 alex
|
||||
* - Status-Codes an den Server selber werden ignoriert, besseres Logging.
|
||||
*
|
||||
* Revision 1.17 2002/01/06 17:41:44 alex
|
||||
* - die Fehlermeldung "unbekannter Befehl" hatte ein falsches Format.
|
||||
*
|
||||
* Revision 1.16 2002/01/05 23:23:20 alex
|
||||
* - generisches Forwarding von Zahlen-Statuscodes implementiert.
|
||||
*
|
||||
* Revision 1.15 2002/01/05 01:42:08 alex
|
||||
* - an Server werden keine ERRORS mehr wegen unbekannter Befehle geschickt.
|
||||
*
|
||||
* Revision 1.14 2002/01/04 17:56:45 alex
|
||||
* - neuer Befehl SQUIT.
|
||||
*
|
||||
* Revision 1.13 2002/01/04 01:20:02 alex
|
||||
* - Client-Strukruren werden nur noch ueber Funktionen angesprochen.
|
||||
*
|
||||
* Revision 1.12 2002/01/03 02:24:49 alex
|
||||
* - neue Befehle NJOIN und SERVER begonnen.
|
||||
*
|
||||
* Revision 1.11 2002/01/02 02:43:22 alex
|
||||
* - Copyright-Texte aktualisiert.
|
||||
* - neuer Befehl ERROR.
|
||||
*
|
||||
* Revision 1.10 2001/12/31 15:33:13 alex
|
||||
* - neuer Befehl NAMES, kleinere Bugfixes.
|
||||
* - Bug bei PING behoben: war zu restriktiv implementiert :-)
|
||||
*
|
||||
* Revision 1.9 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.8 2001/12/29 03:08:19 alex
|
||||
* - Fuehrende und folgende Leerzeichen etc. in Requests werden geloescht.
|
||||
* - Logmeldungen (mal wieder) ein wenig angepasst.
|
||||
*
|
||||
* Revision 1.7 2001/12/27 19:13:21 alex
|
||||
* - neue Befehle NOTICE und PRIVMSG.
|
||||
* - Debug-Logging ein wenig reduziert.
|
||||
*
|
||||
* Revision 1.6 2001/12/26 14:45:37 alex
|
||||
* - "Code Cleanups".
|
||||
*
|
||||
* Revision 1.5 2001/12/26 03:23:03 alex
|
||||
* - PING/PONG-Befehle implementiert.
|
||||
*
|
||||
* Revision 1.4 2001/12/25 22:04:26 alex
|
||||
* - Aenderungen an den Debug- und Logging-Funktionen.
|
||||
*
|
||||
* Revision 1.3 2001/12/25 19:18:36 alex
|
||||
* - Gross- und Kleinschreibung der IRC-Befehle wird ignoriert.
|
||||
* - bessere Debug-Ausgaben.
|
||||
*
|
||||
* Revision 1.2 2001/12/23 21:56:47 alex
|
||||
* - bessere Debug-Ausgaben,
|
||||
* - Bug im Parameter-Parser behoben (bei "langem" Parameter)
|
||||
* - erste IRC-Befehle werden erkannt :-)
|
||||
*
|
||||
* Revision 1.1 2001/12/21 23:53:16 alex
|
||||
* - Modul zum Parsen von Client-Requests begonnen.
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*/
|
||||
|
||||
|
||||
#include <portab.h>
|
||||
#include "global.h"
|
||||
#include "portab.h"
|
||||
|
||||
#include <imp.h>
|
||||
static char UNUSED id[] = "$Id: parse.c,v 1.63.2.1 2005/07/24 21:06:51 alex Exp $";
|
||||
|
||||
/**
|
||||
* @file
|
||||
* IRC command parser and validator.
|
||||
*/
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <strings.h>
|
||||
|
||||
#include "ngircd.h"
|
||||
#include "defines.h"
|
||||
#include "conn-func.h"
|
||||
#include "client.h"
|
||||
#include "conn.h"
|
||||
#include "irc.h"
|
||||
#include "irc-login.h"
|
||||
#include "irc-mode.h"
|
||||
#include "irc-write.h"
|
||||
#include "channel.h"
|
||||
#include "log.h"
|
||||
#include "messages.h"
|
||||
#include "tool.h"
|
||||
|
||||
#include <exp.h>
|
||||
#include "exp.h"
|
||||
#include "parse.h"
|
||||
|
||||
#include "imp.h"
|
||||
#include "irc.h"
|
||||
#include "irc-channel.h"
|
||||
#include "irc-info.h"
|
||||
#include "irc-login.h"
|
||||
#include "irc-mode.h"
|
||||
#include "irc-op.h"
|
||||
#include "irc-oper.h"
|
||||
#include "irc-server.h"
|
||||
#include "irc-write.h"
|
||||
|
||||
LOCAL VOID Init_Request( REQUEST *Req );
|
||||
|
||||
LOCAL BOOLEAN Parse_Error( CONN_ID Idx, CHAR *Error );
|
||||
|
||||
LOCAL BOOLEAN Validate_Prefix( REQUEST *Req );
|
||||
LOCAL BOOLEAN Validate_Command( REQUEST *Req );
|
||||
LOCAL BOOLEAN Validate_Args( REQUEST *Req );
|
||||
|
||||
LOCAL BOOLEAN Handle_Request( CONN_ID Idx, REQUEST *Req );
|
||||
#include "exp.h"
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request )
|
||||
COMMAND My_Commands[] =
|
||||
{
|
||||
/* Client-Request parsen. Bei einem schwerwiegenden Fehler wird
|
||||
* die Verbindung geschlossen und FALSE geliefert.
|
||||
* Der Aufbau gueltiger Requests ist in RFC 2812, 2.3 definiert. */
|
||||
{ "ADMIN", IRC_ADMIN, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||
{ "AWAY", IRC_AWAY, CLIENT_USER, 0, 0, 0 },
|
||||
{ "CONNECT", IRC_CONNECT, CLIENT_USER, 0, 0, 0 },
|
||||
{ "DIE", IRC_DIE, CLIENT_USER, 0, 0, 0 },
|
||||
{ "DISCONNECT", IRC_DISCONNECT, CLIENT_USER, 0, 0, 0 },
|
||||
{ "ERROR", IRC_ERROR, 0xFFFF, 0, 0, 0 },
|
||||
{ "HELP", IRC_HELP, CLIENT_USER, 0, 0, 0 },
|
||||
{ "INVITE", IRC_INVITE, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||
{ "ISON", IRC_ISON, CLIENT_USER, 0, 0, 0 },
|
||||
{ "JOIN", IRC_JOIN, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||
{ "KICK", IRC_KICK, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||
{ "KILL", IRC_KILL, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||
{ "LINKS", IRC_LINKS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||
{ "LIST", IRC_LIST, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||
{ "LUSERS", IRC_LUSERS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||
{ "MODE", IRC_MODE, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||
{ "MOTD", IRC_MOTD, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||
{ "NAMES", IRC_NAMES, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||
{ "NICK", IRC_NICK, 0xFFFF, 0, 0, 0 },
|
||||
{ "NJOIN", IRC_NJOIN, CLIENT_SERVER, 0, 0, 0 },
|
||||
{ "NOTICE", IRC_NOTICE, 0xFFFF, 0, 0, 0 },
|
||||
{ "OPER", IRC_OPER, CLIENT_USER, 0, 0, 0 },
|
||||
{ "PART", IRC_PART, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||
{ "PASS", IRC_PASS, 0xFFFF, 0, 0, 0 },
|
||||
{ "PING", IRC_PING, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||
{ "PONG", IRC_PONG, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||
{ "PRIVMSG", IRC_PRIVMSG, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||
{ "QUIT", IRC_QUIT, 0xFFFF, 0, 0, 0 },
|
||||
{ "REHASH", IRC_REHASH, CLIENT_USER, 0, 0, 0 },
|
||||
{ "RESTART", IRC_RESTART, CLIENT_USER, 0, 0, 0 },
|
||||
{ "SERVER", IRC_SERVER, 0xFFFF, 0, 0, 0 },
|
||||
{ "SQUIT", IRC_SQUIT, CLIENT_SERVER, 0, 0, 0 },
|
||||
{ "STATS", IRC_STATS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||
{ "TIME", IRC_TIME, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||
{ "TOPIC", IRC_TOPIC, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||
{ "TRACE", IRC_TRACE, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||
{ "USER", IRC_USER, 0xFFFF, 0, 0, 0 },
|
||||
{ "USERHOST", IRC_USERHOST, CLIENT_USER, 0, 0, 0 },
|
||||
{ "VERSION", IRC_VERSION, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||
{ "WHO", IRC_WHO, CLIENT_USER, 0, 0, 0 },
|
||||
{ "WHOIS", IRC_WHOIS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||
{ "WHOWAS", IRC_WHOWAS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||
#ifdef IRCPLUS
|
||||
{ "CHANINFO", IRC_CHANINFO, CLIENT_SERVER, 0, 0, 0 },
|
||||
#endif
|
||||
{ NULL, NULL, 0x0, 0, 0, 0 } /* Ende-Marke */
|
||||
};
|
||||
|
||||
|
||||
LOCAL void Init_Request PARAMS(( REQUEST *Req ));
|
||||
|
||||
LOCAL bool Validate_Prefix PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed ));
|
||||
LOCAL bool Validate_Command PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed ));
|
||||
LOCAL bool Validate_Args PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed ));
|
||||
|
||||
LOCAL bool Handle_Request PARAMS(( CONN_ID Idx, REQUEST *Req ));
|
||||
|
||||
|
||||
/**
|
||||
* Return the pointer to the global "IRC command structure".
|
||||
* This structure, an array of type "COMMAND" describes all the IRC commands
|
||||
* implemented by ngIRCd and how to handle them.
|
||||
* @return Pointer to the global command structure.
|
||||
*/
|
||||
GLOBAL COMMAND *
|
||||
Parse_GetCommandStruct( void )
|
||||
{
|
||||
return My_Commands;
|
||||
} /* Parse_GetCommandStruct */
|
||||
|
||||
|
||||
/**
|
||||
* Parse a command ("request") received from a client.
|
||||
*
|
||||
* This function is called after the connection layer received a valid CR+LF
|
||||
* terminated line of text: we asume that this is a valid IRC command and
|
||||
* try to do something useful with it :-)
|
||||
*
|
||||
* All errors are reported to the client from which the command has been
|
||||
* received, and if the error is fatal this connection is closed down.
|
||||
*
|
||||
* This function is able to parse the syntax as described in RFC 2812,
|
||||
* section 2.3.
|
||||
*
|
||||
* @param Idx Index of the connection from which the command has been received.
|
||||
* @param Request NULL terminated line of text (the "command").
|
||||
* @return true on success (valid command or "regular" error), false if a
|
||||
* fatal error occured and the connection has been shut down.
|
||||
*/
|
||||
GLOBAL bool
|
||||
Parse_Request( CONN_ID Idx, char *Request )
|
||||
{
|
||||
REQUEST req;
|
||||
CHAR *start, *ptr;
|
||||
char *start, *ptr;
|
||||
bool closed;
|
||||
|
||||
assert( Idx >= 0 );
|
||||
assert( Request != NULL );
|
||||
@@ -159,7 +156,7 @@ GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request )
|
||||
#ifdef SNIFFER
|
||||
if( NGIRCd_Sniffer ) Log( LOG_DEBUG, " <- connection %d: '%s'.", Idx, Request );
|
||||
#endif
|
||||
|
||||
|
||||
Init_Request( &req );
|
||||
|
||||
/* Fuehrendes und folgendes "Geraffel" verwerfen */
|
||||
@@ -171,7 +168,11 @@ GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request )
|
||||
/* Prefix vorhanden */
|
||||
req.prefix = Request + 1;
|
||||
ptr = strchr( Request, ' ' );
|
||||
if( ! ptr ) return Parse_Error( Idx, "Prefix without command!?" );
|
||||
if( ! ptr )
|
||||
{
|
||||
Log( LOG_DEBUG, "Connection %d: Parse error: prefix without command!?", Idx );
|
||||
return Conn_WriteStr( Idx, "ERROR :Prefix without command!?" );
|
||||
}
|
||||
*ptr = '\0';
|
||||
#ifndef STRICT_RFC
|
||||
/* multiple Leerzeichen als Trenner zwischen
|
||||
@@ -182,8 +183,6 @@ GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request )
|
||||
}
|
||||
else start = Request;
|
||||
|
||||
if( ! Validate_Prefix( &req )) return Parse_Error( Idx, "Invalid prefix");
|
||||
|
||||
/* Befehl */
|
||||
ptr = strchr( start, ' ' );
|
||||
if( ptr )
|
||||
@@ -191,14 +190,12 @@ GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request )
|
||||
*ptr = '\0';
|
||||
#ifndef STRICT_RFC
|
||||
/* multiple Leerzeichen als Trenner vor
|
||||
*Parametertrennern ignorieren */
|
||||
* Parametern ignorieren */
|
||||
while( *(ptr + 1) == ' ' ) ptr++;
|
||||
#endif
|
||||
}
|
||||
req.command = start;
|
||||
|
||||
if( ! Validate_Command( &req )) return Parse_Error( Idx, "Invalid command" );
|
||||
|
||||
/* Argumente, Parameter */
|
||||
if( ptr )
|
||||
{
|
||||
@@ -226,29 +223,37 @@ GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request )
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
req.argc++;
|
||||
|
||||
if( start[0] == ':' ) break;
|
||||
if( req.argc > 14 ) break;
|
||||
|
||||
|
||||
if( ptr ) start = ptr + 1;
|
||||
else start = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if( ! Validate_Args( &req )) return Parse_Error( Idx, "Invalid argument(s)" );
|
||||
|
||||
/* Daten validieren */
|
||||
if( ! Validate_Prefix( Idx, &req, &closed )) return ! closed;
|
||||
if( ! Validate_Command( Idx, &req, &closed )) return ! closed;
|
||||
if( ! Validate_Args( Idx, &req, &closed )) return ! closed;
|
||||
|
||||
return Handle_Request( Idx, &req );
|
||||
} /* Parse_Request */
|
||||
|
||||
|
||||
LOCAL VOID Init_Request( REQUEST *Req )
|
||||
/**
|
||||
* Initialize request structure.
|
||||
* @param Req Request structure to be initialized.
|
||||
*/
|
||||
LOCAL void
|
||||
Init_Request( REQUEST *Req )
|
||||
{
|
||||
/* Neue Request-Struktur initialisieren */
|
||||
|
||||
INT i;
|
||||
|
||||
int i;
|
||||
|
||||
assert( Req != NULL );
|
||||
|
||||
Req->prefix = NULL;
|
||||
@@ -258,49 +263,92 @@ LOCAL VOID Init_Request( REQUEST *Req )
|
||||
} /* Init_Request */
|
||||
|
||||
|
||||
LOCAL BOOLEAN Parse_Error( CONN_ID Idx, CHAR *Error )
|
||||
LOCAL bool
|
||||
Validate_Prefix( CONN_ID Idx, REQUEST *Req, bool *Closed )
|
||||
{
|
||||
/* Fehler beim Parsen. Fehlermeldung an den Client schicken.
|
||||
* TRUE: Connection wurde durch diese Funktion nicht geschlossen,
|
||||
* FALSE: Connection wurde terminiert. */
|
||||
|
||||
CLIENT *client, *c;
|
||||
|
||||
assert( Idx >= 0 );
|
||||
assert( Error != NULL );
|
||||
|
||||
Log( LOG_DEBUG, "Connection %d: Parse error: %s", Idx, Error );
|
||||
return Conn_WriteStr( Idx, "ERROR :Parse error: %s", Error );
|
||||
} /* Parse_Error */
|
||||
|
||||
|
||||
LOCAL BOOLEAN Validate_Prefix( REQUEST *Req )
|
||||
{
|
||||
assert( Req != NULL );
|
||||
return TRUE;
|
||||
|
||||
*Closed = false;
|
||||
|
||||
/* ist ueberhaupt ein Prefix vorhanden? */
|
||||
if( ! Req->prefix ) return true;
|
||||
|
||||
/* Client-Struktur der Connection ermitteln */
|
||||
client = Client_GetFromConn( Idx );
|
||||
assert( client != NULL );
|
||||
|
||||
/* nur validieren, wenn bereits registrierte Verbindung */
|
||||
if(( Client_Type( client ) != CLIENT_USER ) && ( Client_Type( client ) != CLIENT_SERVER ) && ( Client_Type( client ) != CLIENT_SERVICE ))
|
||||
{
|
||||
/* noch nicht registrierte Verbindung.
|
||||
* Das Prefix wird ignoriert. */
|
||||
Req->prefix = NULL;
|
||||
return true;
|
||||
}
|
||||
|
||||
/* pruefen, ob der im Prefix angegebene Client bekannt ist */
|
||||
c = Client_Search( Req->prefix );
|
||||
if( ! c )
|
||||
{
|
||||
/* im Prefix angegebener Client ist nicht bekannt */
|
||||
Log( LOG_ERR, "Invalid prefix \"%s\", client not known (connection %d, command %s)!?", Req->prefix, Idx, Req->command );
|
||||
if( ! Conn_WriteStr( Idx, "ERROR :Invalid prefix \"%s\", client not known!?", Req->prefix )) *Closed = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* pruefen, ob der Client mit dem angegebenen Prefix in Richtung
|
||||
* des Senders liegt, d.h. sicherstellen, dass das Prefix nicht
|
||||
* gefaelscht ist */
|
||||
if( Client_NextHop( c ) != client )
|
||||
{
|
||||
/* das angegebene Prefix ist aus dieser Richtung, also
|
||||
* aus der gegebenen Connection, ungueltig! */
|
||||
Log( LOG_ERR, "Spoofed prefix \"%s\" from \"%s\" (connection %d, command %s)!", Req->prefix, Client_Mask( Client_GetFromConn( Idx )), Idx, Req->command );
|
||||
Conn_Close( Idx, NULL, "Spoofed prefix", true);
|
||||
*Closed = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
} /* Validate_Prefix */
|
||||
|
||||
|
||||
LOCAL BOOLEAN Validate_Command( REQUEST *Req )
|
||||
LOCAL bool
|
||||
Validate_Command( UNUSED CONN_ID Idx, UNUSED REQUEST *Req, bool *Closed )
|
||||
{
|
||||
assert( Idx >= 0 );
|
||||
assert( Req != NULL );
|
||||
return TRUE;
|
||||
*Closed = false;
|
||||
|
||||
return true;
|
||||
} /* Validate_Comman */
|
||||
|
||||
|
||||
LOCAL BOOLEAN Validate_Args( REQUEST *Req )
|
||||
LOCAL bool
|
||||
Validate_Args( UNUSED CONN_ID Idx, UNUSED REQUEST *Req, bool *Closed )
|
||||
{
|
||||
assert( Idx >= 0 );
|
||||
assert( Req != NULL );
|
||||
return TRUE;
|
||||
*Closed = false;
|
||||
|
||||
return true;
|
||||
} /* Validate_Args */
|
||||
|
||||
|
||||
LOCAL BOOLEAN Handle_Request( CONN_ID Idx, REQUEST *Req )
|
||||
LOCAL bool
|
||||
Handle_Request( CONN_ID Idx, REQUEST *Req )
|
||||
{
|
||||
/* Client-Request verarbeiten. Bei einem schwerwiegenden Fehler
|
||||
* wird die Verbindung geschlossen und FALSE geliefert. */
|
||||
* wird die Verbindung geschlossen und false geliefert. */
|
||||
|
||||
CLIENT *client, *target, *prefix;
|
||||
CHAR str[LINE_LEN];
|
||||
INT i;
|
||||
char str[LINE_LEN];
|
||||
bool result;
|
||||
COMMAND *cmd;
|
||||
int i;
|
||||
|
||||
assert( Idx >= 0 );
|
||||
assert( Req != NULL );
|
||||
@@ -309,85 +357,99 @@ LOCAL BOOLEAN Handle_Request( CONN_ID Idx, REQUEST *Req )
|
||||
client = Client_GetFromConn( Idx );
|
||||
assert( client != NULL );
|
||||
|
||||
/* Statuscode, der geforwarded werden muss? */
|
||||
if(( strlen( Req->command ) == 3 ) && ( atoi( Req->command ) > 100 ))
|
||||
/* Statuscode? */
|
||||
if(( Client_Type( client ) == CLIENT_SERVER ) && ( strlen( Req->command ) == 3 ) && ( atoi( Req->command ) > 100 ))
|
||||
{
|
||||
/* Befehl ist ein Statuscode */
|
||||
/* Command is a status code from an other server */
|
||||
|
||||
/* Zielserver ermitteln */
|
||||
if(( Client_Type( client ) == CLIENT_SERVER ) && ( Req->argc > 0 )) target = Client_GetFromID( Req->argv[0] );
|
||||
/* Determine target */
|
||||
if( Req->argc > 0 ) target = Client_Search( Req->argv[0] );
|
||||
else target = NULL;
|
||||
if( ! target )
|
||||
{
|
||||
if( Req->argc > 0 ) Log( LOG_WARNING, "Unknown target for status code: \"%s\"", Req->argv[0] );
|
||||
else Log( LOG_WARNING, "Unknown target for status code!" );
|
||||
return TRUE;
|
||||
/* Status code without target!? */
|
||||
if( Req->argc > 0 ) Log( LOG_WARNING, "Unknown target for status code %s: \"%s\"", Req->command, Req->argv[0] );
|
||||
else Log( LOG_WARNING, "Unknown target for status code %s!", Req->command );
|
||||
return true;
|
||||
}
|
||||
if( target == Client_ThisServer( ))
|
||||
{
|
||||
/* This server is the target, ignore it */
|
||||
Log( LOG_DEBUG, "Ignored status code %s from \"%s\".", Req->command, Client_ID( client ));
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Quell-Client ermitteln */
|
||||
/* Determine source */
|
||||
if( ! Req->prefix[0] )
|
||||
{
|
||||
Log( LOG_WARNING, "Got status code without prefix!?" );
|
||||
return TRUE;
|
||||
/* Oops, no prefix!? */
|
||||
Log( LOG_WARNING, "Got status code %s from \"%s\" without prefix!?", Req->command, Client_ID( client ));
|
||||
return true;
|
||||
}
|
||||
else prefix = Client_GetFromID( Req->prefix );
|
||||
else prefix = Client_Search( Req->prefix );
|
||||
if( ! prefix )
|
||||
{
|
||||
Log( LOG_WARNING, "Got status code from unknown source: \"%s\"", Req->prefix );
|
||||
return TRUE;
|
||||
/* Oops, unknown prefix!? */
|
||||
Log( LOG_WARNING, "Got status code %s from unknown source: \"%s\"", Req->command, Req->prefix );
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Statuscode weiterleiten */
|
||||
strcpy( str, Req->command );
|
||||
/* Forward status code */
|
||||
strlcpy( str, Req->command, sizeof( str ));
|
||||
for( i = 0; i < Req->argc; i++ )
|
||||
{
|
||||
if( i < Req->argc - 1 ) strcat( str, " " );
|
||||
else strcat( str, " :" );
|
||||
strcat( str, Req->argv[i] );
|
||||
if( i < Req->argc - 1 ) strlcat( str, " ", sizeof( str ));
|
||||
else strlcat( str, " :", sizeof( str ));
|
||||
strlcat( str, Req->argv[i], sizeof( str ));
|
||||
}
|
||||
return IRC_WriteStrClientPrefix( target, prefix, str );
|
||||
return IRC_WriteStrClientPrefix( target, prefix, "%s", str );
|
||||
}
|
||||
|
||||
if( strcasecmp( Req->command, "PASS" ) == 0 ) return IRC_PASS( client, Req );
|
||||
else if( strcasecmp( Req->command, "NICK" ) == 0 ) return IRC_NICK( client, Req );
|
||||
else if( strcasecmp( Req->command, "USER" ) == 0 ) return IRC_USER( client, Req );
|
||||
else if( strcasecmp( Req->command, "SERVER" ) == 0 ) return IRC_SERVER( client, Req );
|
||||
else if( strcasecmp( Req->command, "NJOIN" ) == 0 ) return IRC_NJOIN( client, Req );
|
||||
else if( strcasecmp( Req->command, "QUIT" ) == 0 ) return IRC_QUIT( client, Req );
|
||||
else if( strcasecmp( Req->command, "SQUIT" ) == 0 ) return IRC_SQUIT( client, Req );
|
||||
else if( strcasecmp( Req->command, "PING" ) == 0 ) return IRC_PING( client, Req );
|
||||
else if( strcasecmp( Req->command, "PONG" ) == 0 ) return IRC_PONG( client, Req );
|
||||
else if( strcasecmp( Req->command, "MOTD" ) == 0 ) return IRC_MOTD( client, Req );
|
||||
else if( strcasecmp( Req->command, "PRIVMSG" ) == 0 ) return IRC_PRIVMSG( client, Req );
|
||||
else if( strcasecmp( Req->command, "NOTICE" ) == 0 ) return IRC_NOTICE( client, Req );
|
||||
else if( strcasecmp( Req->command, "MODE" ) == 0 ) return IRC_MODE( client, Req );
|
||||
else if( strcasecmp( Req->command, "NAMES" ) == 0 ) return IRC_NAMES( client, Req );
|
||||
else if( strcasecmp( Req->command, "ISON" ) == 0 ) return IRC_ISON( client, Req );
|
||||
else if( strcasecmp( Req->command, "WHOIS" ) == 0 ) return IRC_WHOIS( client, Req );
|
||||
else if( strcasecmp( Req->command, "USERHOST" ) == 0 ) return IRC_USERHOST( client, Req );
|
||||
else if( strcasecmp( Req->command, "OPER" ) == 0 ) return IRC_OPER( client, Req );
|
||||
else if( strcasecmp( Req->command, "DIE" ) == 0 ) return IRC_DIE( client, Req );
|
||||
else if( strcasecmp( Req->command, "RESTART" ) == 0 ) return IRC_RESTART( client, Req );
|
||||
else if( strcasecmp( Req->command, "ERROR" ) == 0 ) return IRC_ERROR( client, Req );
|
||||
else if( strcasecmp( Req->command, "LUSERS" ) == 0 ) return IRC_LUSERS( client, Req );
|
||||
else if( strcasecmp( Req->command, "LINKS" ) == 0 ) return IRC_LINKS( client, Req );
|
||||
else if( strcasecmp( Req->command, "JOIN" ) == 0 ) return IRC_JOIN( client, Req );
|
||||
else if( strcasecmp( Req->command, "PART" ) == 0 ) return IRC_PART( client, Req );
|
||||
else if( strcasecmp( Req->command, "VERSION" ) == 0 ) return IRC_VERSION( client, Req );
|
||||
else if( strcasecmp( Req->command, "KILL" ) == 0 ) return IRC_KILL( client, Req );
|
||||
else if( strcasecmp( Req->command, "AWAY" ) == 0 ) return IRC_AWAY( client, Req );
|
||||
else if( strcasecmp( Req->command, "TOPIC" ) == 0 ) return IRC_TOPIC( client, Req );
|
||||
|
||||
/* Unbekannter Befehl */
|
||||
if( Client_Type( client ) != CLIENT_SERVER ) IRC_WriteStrClient( client, ERR_UNKNOWNCOMMAND_MSG, Client_ID( client ), Req->command );
|
||||
Log( LOG_DEBUG, "Connection %d: Unknown command \"%s\", %d %s,%s prefix.", Client_Conn( client ), Req->command, Req->argc, Req->argc == 1 ? "parameter" : "parameters", Req->prefix ? "" : " no" );
|
||||
cmd = My_Commands;
|
||||
while( cmd->name )
|
||||
{
|
||||
/* Befehl suchen */
|
||||
if( strcasecmp( Req->command, cmd->name ) != 0 )
|
||||
{
|
||||
cmd++; continue;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
if( Client_Type( client ) & cmd->type )
|
||||
{
|
||||
/* Command is allowed for this client: call it and count produced bytes */
|
||||
Conn_ResetWCounter( );
|
||||
result = (cmd->function)( client, Req );
|
||||
cmd->bytes += Conn_WCounter( );
|
||||
|
||||
/* Adjust counters */
|
||||
if( Client_Type( client ) != CLIENT_SERVER ) cmd->lcount++;
|
||||
else cmd->rcount++;
|
||||
|
||||
return result;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Befehl ist fuer diesen Client-Typ nicht erlaubt! */
|
||||
return IRC_WriteStrClient( client, ERR_NOTREGISTERED_MSG, Client_ID( client ));
|
||||
}
|
||||
}
|
||||
|
||||
if( Client_Type( client ) != CLIENT_USER &&
|
||||
Client_Type( client ) != CLIENT_SERVER &&
|
||||
Client_Type( client ) != CLIENT_SERVICE )
|
||||
return true;
|
||||
|
||||
/* Unknown command and registered connection: generate error: */
|
||||
Log( LOG_DEBUG, "Connection %d: Unknown command \"%s\", %d %s,%s prefix.",
|
||||
Client_Conn( client ), Req->command, Req->argc,
|
||||
Req->argc == 1 ? "parameter" : "parameters",
|
||||
Req->prefix ? "" : " no" );
|
||||
|
||||
if( Client_Type( client ) != CLIENT_SERVER )
|
||||
return IRC_WriteStrClient( client, ERR_UNKNOWNCOMMAND_MSG,
|
||||
Client_ID( client ), Req->command );
|
||||
|
||||
return true;
|
||||
} /* Handle_Request */
|
||||
|
||||
|
||||
|
||||
@@ -2,53 +2,45 @@
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: parse.h,v 1.5 2002/02/27 23:24:29 alex Exp $
|
||||
* $Id: parse.h,v 1.11 2005/03/19 18:43:49 fw Exp $
|
||||
*
|
||||
* parse.h: Parsen der Client-Anfragen (Header)
|
||||
*
|
||||
* $Log: parse.h,v $
|
||||
* Revision 1.5 2002/02/27 23:24:29 alex
|
||||
* - ueberfluessige Init- und Exit-Funktionen entfernt.
|
||||
*
|
||||
* Revision 1.4 2002/01/02 02:43:50 alex
|
||||
* - Copyright-Text ergaenzt bzw. aktualisiert.
|
||||
*
|
||||
* Revision 1.3 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.2 2001/12/26 14:45:37 alex
|
||||
* - "Code Cleanups".
|
||||
*
|
||||
* Revision 1.1 2001/12/21 23:53:16 alex
|
||||
* - Modul zum Parsen von Client-Requests begonnen.
|
||||
* IRC command parser and validator (header)
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __parse_h__
|
||||
#define __parse_h__
|
||||
|
||||
#include "conn.h"
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
typedef struct _REQUEST /* vgl. RFC 2812, 2.3 */
|
||||
{
|
||||
CHAR *prefix; /* Prefix */
|
||||
CHAR *command; /* IRC-Befehl */
|
||||
CHAR *argv[15]; /* Parameter (max. 15: 0..14) */
|
||||
INT argc; /* Anzahl vorhandener Parameter */
|
||||
char *prefix; /* Prefix */
|
||||
char *command; /* IRC-Befehl */
|
||||
char *argv[15]; /* Parameter (max. 15: 0..14) */
|
||||
int argc; /* Anzahl vorhandener Parameter */
|
||||
} REQUEST;
|
||||
|
||||
|
||||
GLOBAL BOOLEAN Parse_Request( CONN_ID Idx, CHAR *Request );
|
||||
typedef struct _COMMAND
|
||||
{
|
||||
char *name; /* command name */
|
||||
bool (*function) PARAMS(( CLIENT *Client, REQUEST *Request ));
|
||||
CLIENT_TYPE type; /* valid client types (bit mask) */
|
||||
long lcount, rcount; /* number of local and remote calls */
|
||||
long bytes; /* number of bytes created */
|
||||
} COMMAND;
|
||||
|
||||
|
||||
GLOBAL bool Parse_Request PARAMS((CONN_ID Idx, char *Request ));
|
||||
|
||||
GLOBAL COMMAND *Parse_GetCommandStruct PARAMS(( void ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
366
src/ngircd/rendezvous.c
Normal file
366
src/ngircd/rendezvous.c
Normal file
@@ -0,0 +1,366 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001-2004 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* Rendezvous service registration.
|
||||
*
|
||||
* Supported APIs are:
|
||||
* - Apple Mac OS X
|
||||
* - Howl
|
||||
*/
|
||||
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
#ifdef RENDEZVOUS
|
||||
|
||||
|
||||
static char UNUSED id[] = "$Id: rendezvous.c,v 1.5 2005/03/19 18:43:49 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef HAVE_MACH_PORT_H
|
||||
#include "mach/port.h"
|
||||
#include "mach/message.h"
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_DNSSERVICEDISCOVERY_DNSSERVICEDISCOVERY_H
|
||||
#include <DNSServiceDiscovery/DNSServiceDiscovery.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_RENDEZVOUS_RENDEZVOUS_H
|
||||
#include <rendezvous/rendezvous.h>
|
||||
#endif
|
||||
|
||||
#include "defines.h"
|
||||
#include "log.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "rendezvous.h"
|
||||
|
||||
|
||||
#if defined(HAVE_DNSSERVICEREGISTRATIONCREATE)
|
||||
# define APPLE
|
||||
#elif defined(HAVE_SW_DISCOVERY_INIT)
|
||||
# define HOWL
|
||||
#else
|
||||
# error "Can't detect Rendezvous API!?"
|
||||
#endif
|
||||
|
||||
|
||||
#define MAX_RENDEZVOUS 1000
|
||||
|
||||
typedef struct _service
|
||||
{
|
||||
char Desc[CLIENT_ID_LEN];
|
||||
#ifdef APPLE
|
||||
dns_service_discovery_ref Discovery_Ref;
|
||||
mach_port_t Mach_Port;
|
||||
#endif
|
||||
#ifdef HOWL
|
||||
sw_discovery_oid Id;
|
||||
#endif
|
||||
} SERVICE;
|
||||
|
||||
LOCAL SERVICE My_Rendezvous[MAX_RENDEZVOUS];
|
||||
|
||||
|
||||
LOCAL void Unregister( int Idx );
|
||||
|
||||
|
||||
/* -- Apple API -- */
|
||||
|
||||
#ifdef APPLE
|
||||
|
||||
#define MAX_MACH_MSG_SIZE 512
|
||||
|
||||
LOCAL void Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrCode, void *Context );
|
||||
|
||||
#endif /* Apple */
|
||||
|
||||
|
||||
/* -- Howl API -- */
|
||||
|
||||
#ifdef HOWL
|
||||
|
||||
LOCAL sw_discovery My_Discovery_Session = NULL;
|
||||
LOCAL sw_salt My_Salt;
|
||||
|
||||
LOCAL sw_result HOWL_API Registration_Reply_Handler( sw_discovery Session, sw_discovery_publish_status Status, sw_discovery_oid Id, sw_opaque Extra );
|
||||
|
||||
#endif /* Howl */
|
||||
|
||||
|
||||
GLOBAL void Rendezvous_Init( void )
|
||||
{
|
||||
/* Initialize structures */
|
||||
|
||||
int i;
|
||||
|
||||
#ifdef HOWL
|
||||
if( sw_discovery_init( &My_Discovery_Session ) != SW_OKAY )
|
||||
{
|
||||
Log( LOG_EMERG, "Can't initialize Rendezvous (Howl): sw_discovery_init() failed!" );
|
||||
Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME );
|
||||
exit( 1 );
|
||||
}
|
||||
|
||||
if( sw_discovery_salt( My_Discovery_Session, &My_Salt ) != SW_OKAY )
|
||||
{
|
||||
Log( LOG_EMERG, "Can't initialize Rendezvous (Howl): sw_discovery_salt() failed!" );
|
||||
Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME );
|
||||
exit( 1 );
|
||||
}
|
||||
#endif
|
||||
|
||||
for( i = 0; i < MAX_RENDEZVOUS; i++ ) My_Rendezvous[i].Desc[0] = '\0';
|
||||
} /* Rendezvous_Init */
|
||||
|
||||
|
||||
GLOBAL void Rendezvous_Exit( void )
|
||||
{
|
||||
/* Clean up & exit module */
|
||||
|
||||
int i;
|
||||
|
||||
for( i = 0; i < MAX_RENDEZVOUS; i++ )
|
||||
{
|
||||
if( My_Rendezvous[i].Desc[0] ) Unregister( i );
|
||||
}
|
||||
|
||||
#ifdef HOWL
|
||||
sw_discovery_fina( My_Discovery_Session );
|
||||
#endif
|
||||
} /* Rendezvous_Exit */
|
||||
|
||||
|
||||
GLOBAL bool Rendezvous_Register( char *Name, char *Type, unsigned int Port )
|
||||
{
|
||||
/* Register new service */
|
||||
|
||||
int i;
|
||||
|
||||
/* Search free port structure */
|
||||
for( i = 0; i < MAX_RENDEZVOUS; i++ ) if( ! My_Rendezvous[i].Desc[0] ) break;
|
||||
if( i >= MAX_RENDEZVOUS )
|
||||
{
|
||||
Log( LOG_ERR, "Can't register \"%s\" with Rendezvous: limit (%d) reached!", Name, MAX_RENDEZVOUS );
|
||||
return false;
|
||||
}
|
||||
strlcpy( My_Rendezvous[i].Desc, Name, sizeof( My_Rendezvous[i].Desc ));
|
||||
|
||||
#ifdef APPLE
|
||||
/* Register new service */
|
||||
My_Rendezvous[i].Discovery_Ref = DNSServiceRegistrationCreate( Name, Type, "", htonl( Port ), "", Registration_Reply_Handler, &My_Rendezvous[i] );
|
||||
if( ! My_Rendezvous[i].Discovery_Ref )
|
||||
{
|
||||
Log( LOG_ERR, "Can't register \"%s\" with Rendezvous: can't register service!", My_Rendezvous[i].Desc );
|
||||
My_Rendezvous[i].Desc[0] = '\0';
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Get and save the corresponding Mach Port */
|
||||
My_Rendezvous[i].Mach_Port = DNSServiceDiscoveryMachPort( My_Rendezvous[i].Discovery_Ref );
|
||||
if( ! My_Rendezvous[i].Mach_Port )
|
||||
{
|
||||
Log( LOG_ERR, "Can't register \"%s\" with Rendezvous: got no Mach Port!", My_Rendezvous[i].Desc );
|
||||
/* Here we actually leek a descriptor :-( */
|
||||
My_Rendezvous[i].Discovery_Ref = 0;
|
||||
My_Rendezvous[i].Desc[0] = '\0';
|
||||
return false;
|
||||
}
|
||||
#endif /* Apple */
|
||||
|
||||
#ifdef HOWL
|
||||
if( sw_discovery_publish( My_Discovery_Session, 0, Name, Type, NULL, NULL, Port, NULL, 0, Registration_Reply_Handler, &My_Rendezvous[i], &My_Rendezvous[i].Id ) != SW_OKAY )
|
||||
{
|
||||
Log( LOG_ERR, "Can't register \"%s\" with Rendezvous: can't register service!", My_Rendezvous[i].Desc );
|
||||
My_Rendezvous[i].Desc[0] = '\0';
|
||||
return false;
|
||||
}
|
||||
#endif /* Howl */
|
||||
|
||||
Log( LOG_DEBUG, "Rendezvous: Registering \"%s\" ...", My_Rendezvous[i].Desc );
|
||||
return true;
|
||||
} /* Rendezvous_Register */
|
||||
|
||||
|
||||
GLOBAL bool Rendezvous_Unregister( char *Name )
|
||||
{
|
||||
/* Unregister service from rendezvous */
|
||||
|
||||
int i;
|
||||
bool ok;
|
||||
|
||||
ok = false;
|
||||
for( i = 0; i < MAX_RENDEZVOUS; i++ )
|
||||
{
|
||||
if( strcmp( Name, My_Rendezvous[i].Desc ) == 0 )
|
||||
{
|
||||
Unregister( i );
|
||||
ok = true;
|
||||
}
|
||||
}
|
||||
|
||||
return ok;
|
||||
} /* Rendezvous_Unregister */
|
||||
|
||||
|
||||
GLOBAL void Rendezvous_UnregisterListeners( void )
|
||||
{
|
||||
/* Unregister all our listening sockets from Rendezvous */
|
||||
|
||||
int i;
|
||||
|
||||
for( i = 0; i < MAX_RENDEZVOUS; i++ )
|
||||
{
|
||||
if( My_Rendezvous[i].Desc[0] ) Unregister( i );
|
||||
}
|
||||
} /* Rendezvous_UnregisterListeners */
|
||||
|
||||
|
||||
GLOBAL void Rendezvous_Handler( void )
|
||||
{
|
||||
/* Handle all Rendezvous stuff; this function must be called
|
||||
* periodically from the run loop of the main program */
|
||||
|
||||
#ifdef APPLE
|
||||
int i;
|
||||
char buffer[MAX_MACH_MSG_SIZE];
|
||||
mach_msg_return_t result;
|
||||
mach_msg_header_t *msg;
|
||||
|
||||
for( i = 0; i < MAX_RENDEZVOUS; i++ )
|
||||
{
|
||||
if( ! My_Rendezvous[i].Discovery_Ref ) continue;
|
||||
|
||||
/* Read message from Mach Port */
|
||||
msg = (mach_msg_header_t *)buffer;
|
||||
result = mach_msg( msg, MACH_RCV_MSG|MACH_RCV_TIMEOUT, 0, MAX_MACH_MSG_SIZE, My_Rendezvous[i].Mach_Port, 1, 0 );
|
||||
|
||||
/* Handle message */
|
||||
if( result == MACH_MSG_SUCCESS ) DNSServiceDiscovery_handleReply( msg );
|
||||
#ifdef DEBUG
|
||||
else if( result != MACH_RCV_TIMED_OUT ) Log( LOG_DEBUG, "mach_msg(): %ld", (long)result );
|
||||
#endif /* Debug */
|
||||
}
|
||||
#endif /* Apple */
|
||||
|
||||
#ifdef HOWL
|
||||
sw_ulong msecs = 10;
|
||||
sw_salt_step( My_Salt, &msecs );
|
||||
#endif
|
||||
} /* Rendezvous_Handler */
|
||||
|
||||
|
||||
LOCAL void Unregister( int Idx )
|
||||
{
|
||||
/* Unregister service */
|
||||
|
||||
#ifdef APPLE
|
||||
DNSServiceDiscoveryDeallocate( My_Rendezvous[Idx].Discovery_Ref );
|
||||
#endif /* Apple */
|
||||
|
||||
#ifdef HOWL
|
||||
if( sw_discovery_cancel( My_Discovery_Session, My_Rendezvous[Idx].Id ) != SW_OKAY )
|
||||
{
|
||||
Log( LOG_ERR, "Rendezvous: Failed to unregister \"%s\"!", My_Rendezvous[Idx].Desc );
|
||||
return;
|
||||
}
|
||||
#endif /* Howl */
|
||||
|
||||
Log( LOG_INFO, "Unregistered \"%s\" from Rendezvous.", My_Rendezvous[Idx].Desc );
|
||||
My_Rendezvous[Idx].Desc[0] = '\0';
|
||||
} /* Unregister */
|
||||
|
||||
|
||||
/* -- Apple API -- */
|
||||
|
||||
#ifdef APPLE
|
||||
|
||||
|
||||
LOCAL void Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrCode, void *Context )
|
||||
{
|
||||
SERVICE *s = (SERVICE *)Context;
|
||||
char txt[50];
|
||||
|
||||
if( ErrCode == kDNSServiceDiscoveryNoError )
|
||||
{
|
||||
/* Success! */
|
||||
Log( LOG_INFO, "Successfully registered \"%s\" with Rendezvous.", s->Desc );
|
||||
return;
|
||||
}
|
||||
|
||||
switch( ErrCode )
|
||||
{
|
||||
case kDNSServiceDiscoveryAlreadyRegistered:
|
||||
strcpy( txt, "name already registered!" );
|
||||
break;
|
||||
case kDNSServiceDiscoveryNameConflict:
|
||||
strcpy( txt, "name conflict!" );
|
||||
break;
|
||||
default:
|
||||
sprintf( txt, "error code %ld!", (long)ErrCode );
|
||||
}
|
||||
|
||||
Log( LOG_INFO, "Can't register \"%s\" with Rendezvous: %s", s->Desc, txt );
|
||||
s->Desc[0] = '\0';
|
||||
} /* Registration_Reply_Handler */
|
||||
|
||||
|
||||
#endif /* Apple */
|
||||
|
||||
|
||||
/* -- Howl API -- */
|
||||
|
||||
#ifdef HOWL
|
||||
|
||||
|
||||
LOCAL sw_result HOWL_API Registration_Reply_Handler( sw_discovery Session, sw_discovery_publish_status Status, UNUSED sw_discovery_oid Id, sw_opaque Extra )
|
||||
{
|
||||
SERVICE *s = (SERVICE *)Extra;
|
||||
char txt[50];
|
||||
|
||||
assert( Session == My_Discovery_Session );
|
||||
assert( Extra != NULL );
|
||||
|
||||
if( Status == SW_DISCOVERY_PUBLISH_STARTED || Status == SW_DISCOVERY_PUBLISH_STOPPED )
|
||||
{
|
||||
/* Success! */
|
||||
Log( LOG_INFO, "Successfully registered \"%s\" with Rendezvous.", s->Desc );
|
||||
return SW_OKAY;
|
||||
}
|
||||
|
||||
switch( Status )
|
||||
{
|
||||
case SW_DISCOVERY_PUBLISH_NAME_COLLISION:
|
||||
strcpy( txt, "name conflict!" );
|
||||
break;
|
||||
default:
|
||||
sprintf( txt, "error code %ld!", (long)Status );
|
||||
}
|
||||
|
||||
Log( LOG_INFO, "Can't register \"%s\" with Rendezvous: %s", s->Desc, txt );
|
||||
s->Desc[0] = '\0';
|
||||
|
||||
return SW_OKAY;
|
||||
} /* Registration_Reply_Handler */
|
||||
|
||||
|
||||
#endif /* Howl */
|
||||
|
||||
|
||||
#endif /* RENDEZVOUS */
|
||||
|
||||
|
||||
/* -eof- */
|
||||
39
src/ngircd/rendezvous.h
Normal file
39
src/ngircd/rendezvous.h
Normal file
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: rendezvous.h,v 1.2 2005/03/19 18:43:49 fw Exp $
|
||||
*
|
||||
* "Rendezvous" functions (Header)
|
||||
*/
|
||||
|
||||
|
||||
#ifdef RENDEZVOUS
|
||||
|
||||
#ifndef __rdezvous_h__
|
||||
#define __rdezvous_h__
|
||||
|
||||
|
||||
GLOBAL void Rendezvous_Init( void );
|
||||
GLOBAL void Rendezvous_Exit( void );
|
||||
|
||||
GLOBAL bool Rendezvous_Register( char *Name, char *Type, unsigned int Port );
|
||||
|
||||
GLOBAL bool Rendezvous_Unregister( char *Name );
|
||||
GLOBAL void Rendezvous_UnregisterListeners( void );
|
||||
|
||||
GLOBAL void Rendezvous_Handler( void );
|
||||
|
||||
|
||||
#endif /* __rdezvous_h__ */
|
||||
|
||||
#endif /* RENDEZVOUS */
|
||||
|
||||
|
||||
/* -eof- */
|
||||
325
src/ngircd/resolve.c
Normal file
325
src/ngircd/resolve.c
Normal file
@@ -0,0 +1,325 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* Asynchronous resolver
|
||||
*/
|
||||
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: resolve.c,v 1.12.2.1 2005/09/02 22:07:38 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
|
||||
#ifdef IDENTAUTH
|
||||
#ifdef HAVE_IDENT_H
|
||||
#include <ident.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "conn.h"
|
||||
#include "defines.h"
|
||||
#include "log.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "resolve.h"
|
||||
|
||||
|
||||
#ifdef IDENTAUTH
|
||||
LOCAL void Do_ResolveAddr PARAMS(( struct sockaddr_in *Addr, int Sock, int w_fd ));
|
||||
#else
|
||||
LOCAL void Do_ResolveAddr PARAMS(( struct sockaddr_in *Addr, int w_fd ));
|
||||
#endif
|
||||
|
||||
LOCAL void Do_ResolveName PARAMS(( char *Host, int w_fd ));
|
||||
|
||||
#ifdef h_errno
|
||||
LOCAL char *Get_Error PARAMS(( int H_Error ));
|
||||
#endif
|
||||
|
||||
LOCAL RES_STAT *New_Res_Stat PARAMS(( void ));
|
||||
|
||||
|
||||
GLOBAL void
|
||||
Resolve_Init( void )
|
||||
{
|
||||
/* Initialize module */
|
||||
|
||||
FD_ZERO( &Resolver_FDs );
|
||||
} /* Resolve_Init */
|
||||
|
||||
|
||||
#ifdef IDENTAUTH
|
||||
GLOBAL RES_STAT *
|
||||
Resolve_Addr( struct sockaddr_in *Addr, int Sock )
|
||||
#else
|
||||
GLOBAL RES_STAT *
|
||||
Resolve_Addr( struct sockaddr_in *Addr )
|
||||
#endif
|
||||
{
|
||||
/* Resolve IP (asynchronous!). On errors, e.g. if the child process
|
||||
* can't be forked, this functions returns NULL. */
|
||||
|
||||
RES_STAT *s;
|
||||
int pid;
|
||||
|
||||
s = New_Res_Stat( );
|
||||
if( ! s ) return NULL;
|
||||
|
||||
/* For sub-process */
|
||||
pid = fork( );
|
||||
if( pid > 0 )
|
||||
{
|
||||
/* Main process */
|
||||
Log( LOG_DEBUG, "Resolver for %s created (PID %d).", inet_ntoa( Addr->sin_addr ), pid );
|
||||
FD_SET( s->pipe[0], &Resolver_FDs );
|
||||
if( s->pipe[0] > Conn_MaxFD ) Conn_MaxFD = s->pipe[0];
|
||||
s->pid = pid;
|
||||
return s;
|
||||
}
|
||||
else if( pid == 0 )
|
||||
{
|
||||
/* Sub process */
|
||||
Log_Init_Resolver( );
|
||||
#ifdef IDENTAUTH
|
||||
Do_ResolveAddr( Addr, Sock, s->pipe[1] );
|
||||
#else
|
||||
Do_ResolveAddr( Addr, s->pipe[1] );
|
||||
#endif
|
||||
Log_Exit_Resolver( );
|
||||
exit( 0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Error! */
|
||||
close(s->pipe[0]);
|
||||
close(s->pipe[1]);
|
||||
free( s );
|
||||
Log( LOG_CRIT, "Resolver: Can't fork: %s!", strerror( errno ));
|
||||
return NULL;
|
||||
}
|
||||
} /* Resolve_Addr */
|
||||
|
||||
|
||||
GLOBAL RES_STAT *
|
||||
Resolve_Name( char *Host )
|
||||
{
|
||||
/* Resolve hostname (asynchronous!). On errors, e.g. if the child
|
||||
* process can't be forked, this functions returns NULL. */
|
||||
|
||||
RES_STAT *s;
|
||||
int pid;
|
||||
|
||||
s = New_Res_Stat( );
|
||||
if( ! s ) return NULL;
|
||||
|
||||
/* Fork sub-process */
|
||||
pid = fork( );
|
||||
if( pid > 0 )
|
||||
{
|
||||
/* Main process */
|
||||
Log( LOG_DEBUG, "Resolver for \"%s\" created (PID %d).", Host, pid );
|
||||
FD_SET( s->pipe[0], &Resolver_FDs );
|
||||
if( s->pipe[0] > Conn_MaxFD ) Conn_MaxFD = s->pipe[0];
|
||||
s->pid = pid;
|
||||
return s;
|
||||
}
|
||||
else if( pid == 0 )
|
||||
{
|
||||
/* Sub process */
|
||||
Log_Init_Resolver( );
|
||||
Do_ResolveName( Host, s->pipe[1] );
|
||||
Log_Exit_Resolver( );
|
||||
exit( 0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Error! */
|
||||
close(s->pipe[0]);
|
||||
close(s->pipe[1]);
|
||||
free( s );
|
||||
Log( LOG_CRIT, "Resolver: Can't fork: %s!", strerror( errno ));
|
||||
return NULL;
|
||||
}
|
||||
} /* Resolve_Name */
|
||||
|
||||
|
||||
#ifdef IDENTAUTH
|
||||
LOCAL void
|
||||
Do_ResolveAddr( struct sockaddr_in *Addr, int Sock, int w_fd )
|
||||
#else
|
||||
LOCAL void
|
||||
Do_ResolveAddr( struct sockaddr_in *Addr, int w_fd )
|
||||
#endif
|
||||
{
|
||||
/* Resolver sub-process: resolve IP address and write result into
|
||||
* pipe to parent. */
|
||||
|
||||
char hostname[HOST_LEN];
|
||||
struct hostent *h;
|
||||
size_t len;
|
||||
#ifdef IDENTAUTH
|
||||
char *res;
|
||||
#endif
|
||||
|
||||
/* Resolve IP address */
|
||||
Log_Resolver( LOG_DEBUG, "Now resolving %s ...", inet_ntoa( Addr->sin_addr ));
|
||||
h = gethostbyaddr( (char *)&Addr->sin_addr, sizeof( Addr->sin_addr ), AF_INET );
|
||||
if( h ) strlcpy( hostname, h->h_name, sizeof( hostname ));
|
||||
else
|
||||
{
|
||||
#ifdef h_errno
|
||||
Log_Resolver( LOG_WARNING, "Can't resolve address \"%s\": %s!", inet_ntoa( Addr->sin_addr ), Get_Error( h_errno ));
|
||||
#else
|
||||
Log_Resolver( LOG_WARNING, "Can't resolve address \"%s\"!", inet_ntoa( Addr->sin_addr ));
|
||||
#endif
|
||||
strlcpy( hostname, inet_ntoa( Addr->sin_addr ), sizeof( hostname ));
|
||||
}
|
||||
Log_Resolver( LOG_DEBUG, "Ok, translated %s to \"%s\".", inet_ntoa( Addr->sin_addr ), hostname );
|
||||
|
||||
/* Write resolver result into pipe to parent */
|
||||
len = strlen( hostname );
|
||||
hostname[len] = '\n'; len++;
|
||||
if( (size_t)write( w_fd, hostname, len ) != (size_t)len )
|
||||
{
|
||||
Log_Resolver( LOG_CRIT, "Resolver: Can't write to parent: %s!", strerror( errno ));
|
||||
close( w_fd );
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef IDENTAUTH
|
||||
/* Do "IDENT" (aka "AUTH") lookup and write result to parent */
|
||||
Log_Resolver( LOG_DEBUG, "Doing IDENT lookup on socket %d ...", Sock );
|
||||
res = ident_id( Sock, 10 );
|
||||
Log_Resolver( LOG_DEBUG, "Ok, IDENT lookup on socket %d done: \"%s\"", Sock, res ? res : "" );
|
||||
|
||||
/* Write IDENT result into pipe to parent */
|
||||
if (res) {
|
||||
len = strlen(res);
|
||||
res[len] = '\n';
|
||||
len++;
|
||||
} else len = 1;
|
||||
|
||||
if( (size_t)write( w_fd, res ? res : "\n", len ) != (size_t)len )
|
||||
{
|
||||
Log_Resolver( LOG_CRIT, "Resolver: Can't write to parent (IDENT): %s!", strerror( errno ));
|
||||
close( w_fd );
|
||||
}
|
||||
free( res );
|
||||
#endif
|
||||
} /* Do_ResolveAddr */
|
||||
|
||||
|
||||
LOCAL void
|
||||
Do_ResolveName( char *Host, int w_fd )
|
||||
{
|
||||
/* Resolver sub-process: resolve name and write result into pipe
|
||||
* to parent. */
|
||||
|
||||
char ip[16];
|
||||
struct hostent *h;
|
||||
struct in_addr *addr;
|
||||
int len;
|
||||
|
||||
Log_Resolver( LOG_DEBUG, "Now resolving \"%s\" ...", Host );
|
||||
|
||||
/* Resolve hostname */
|
||||
h = gethostbyname( Host );
|
||||
if( h )
|
||||
{
|
||||
addr = (struct in_addr *)h->h_addr;
|
||||
strlcpy( ip, inet_ntoa( *addr ), sizeof( ip ));
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef h_errno
|
||||
Log_Resolver( LOG_WARNING, "Can't resolve \"%s\": %s!", Host, Get_Error( h_errno ));
|
||||
#else
|
||||
Log_Resolver( LOG_WARNING, "Can't resolve \"%s\"!", Host );
|
||||
#endif
|
||||
ip[0] = '\0';
|
||||
}
|
||||
if( ip[0] ) Log_Resolver( LOG_DEBUG, "Ok, translated \"%s\" to %s.", Host, ip );
|
||||
|
||||
/* Write result into pipe to parent */
|
||||
len = strlen( ip );
|
||||
ip[len] = '\n'; len++;
|
||||
if( (size_t)write( w_fd, ip, len ) != (size_t)len )
|
||||
{
|
||||
Log_Resolver( LOG_CRIT, "Resolver: Can't write to parent: %s!", strerror( errno ));
|
||||
close( w_fd );
|
||||
}
|
||||
} /* Do_ResolveName */
|
||||
|
||||
|
||||
#ifdef h_errno
|
||||
|
||||
LOCAL char *
|
||||
Get_Error( int H_Error )
|
||||
{
|
||||
/* Get error message for H_Error */
|
||||
|
||||
switch( H_Error )
|
||||
{
|
||||
case HOST_NOT_FOUND:
|
||||
return "host not found";
|
||||
case NO_DATA:
|
||||
return "name valid but no IP address defined";
|
||||
case NO_RECOVERY:
|
||||
return "name server error";
|
||||
case TRY_AGAIN:
|
||||
return "name server temporary not available";
|
||||
default:
|
||||
return "unknown error";
|
||||
}
|
||||
} /* Get_Error */
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
LOCAL RES_STAT *
|
||||
New_Res_Stat( void )
|
||||
{
|
||||
RES_STAT *s;
|
||||
|
||||
/* Allocate memory */
|
||||
s = (RES_STAT *)malloc( sizeof( RES_STAT ));
|
||||
if( ! s )
|
||||
{
|
||||
Log( LOG_EMERG, "Resolver: Can't allocate memory! [Resolve_Addr]" );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Initialize pipe for result */
|
||||
if( pipe( s->pipe ) != 0 )
|
||||
{
|
||||
free( s );
|
||||
Log( LOG_ALERT, "Resolver: Can't create output pipe: %s!", strerror( errno ));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
s->stage = 0;
|
||||
s->bufpos = 0;
|
||||
s->pid = -1;
|
||||
|
||||
return s;
|
||||
} /* New_Res_Stat */
|
||||
|
||||
|
||||
/* -eof- */
|
||||
55
src/ngircd/resolve.h
Normal file
55
src/ngircd/resolve.h
Normal file
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: resolve.h,v 1.8 2005/03/19 18:43:49 fw Exp $
|
||||
*
|
||||
* Asynchronous resolver (header)
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __resolve_h__
|
||||
#define __resolve_h__
|
||||
|
||||
|
||||
#ifdef HAVE_SYS_SELECT_H
|
||||
# include <sys/select.h>
|
||||
#endif
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
|
||||
typedef struct _Res_Stat
|
||||
{
|
||||
int pid; /* PID des Child-Prozess */
|
||||
int pipe[2]; /* Pipe fuer IPC */
|
||||
int stage; /* Hostname/IP(0) or IDENT(1)? */
|
||||
int bufpos; /* Position in buffer */
|
||||
char buffer[HOST_LEN]; /* Buffer */
|
||||
} RES_STAT;
|
||||
|
||||
|
||||
GLOBAL fd_set Resolver_FDs;
|
||||
|
||||
|
||||
GLOBAL void Resolve_Init PARAMS(( void ));
|
||||
|
||||
#ifdef IDENTAUTH
|
||||
GLOBAL RES_STAT *Resolve_Addr PARAMS(( struct sockaddr_in *Addr, int Sock ));
|
||||
#else
|
||||
GLOBAL RES_STAT *Resolve_Addr PARAMS(( struct sockaddr_in *Addr ));
|
||||
#endif
|
||||
|
||||
GLOBAL RES_STAT *Resolve_Name PARAMS(( char *Host ));
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
||||
@@ -1,76 +0,0 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: tool.c,v 1.6 2002/01/02 02:42:58 alex Exp $
|
||||
*
|
||||
* tool.c: Hilfsfunktionen, ggf. Platformabhaengig
|
||||
*
|
||||
* $Log: tool.c,v $
|
||||
* Revision 1.6 2002/01/02 02:42:58 alex
|
||||
* - Copyright-Texte aktualisiert.
|
||||
*
|
||||
* Revision 1.5 2001/12/31 02:44:36 alex
|
||||
* - ngt_TrimStr() hatte noch einen boesen Bug: evtl. wurde ueber den Start
|
||||
* des Strings nach vorne(!) hinaus gelesen. Hopsa!
|
||||
*
|
||||
* Revision 1.4 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.3 2001/12/29 03:05:34 alex
|
||||
* - Funktionsnamen etwas konsequenter umbenannt :-)
|
||||
*
|
||||
* Revision 1.2 2001/12/12 17:20:33 alex
|
||||
* - Tool-Funktionen haben nun das Praefix "ngt_".
|
||||
*
|
||||
* Revision 1.1.1.1 2001/12/11 21:53:04 alex
|
||||
* - Imported sources to CVS.
|
||||
*/
|
||||
|
||||
|
||||
#include <portab.h>
|
||||
#include "global.h"
|
||||
|
||||
#include <imp.h>
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <exp.h>
|
||||
#include "tool.h"
|
||||
|
||||
|
||||
GLOBAL VOID ngt_TrimStr( CHAR *String )
|
||||
{
|
||||
/* Mit ngt_TrimStr() werden fuehrende und folgende Leerzeichen,
|
||||
* Tabulatoren und Zeilenumbrueche (ASCII 10 und ASCII 13) aus
|
||||
* dem String entfernt. */
|
||||
|
||||
CHAR *start, *ptr;
|
||||
|
||||
assert( String != NULL );
|
||||
|
||||
start = String;
|
||||
|
||||
/* Zeichen am Anfang pruefen ... */
|
||||
while(( *start == ' ' ) || ( *start == 9 )) start++;
|
||||
|
||||
/* Zeichen am Ende pruefen ... */
|
||||
ptr = strchr( start, '\0' ) - 1;
|
||||
while((( *ptr == ' ' ) || ( *ptr == 9 ) || ( *ptr == 10 ) || ( *ptr == 13 )) && ptr >= start ) ptr--;
|
||||
*(++ptr) = '\0';
|
||||
|
||||
memmove( String, start, strlen( start ) + 1 );
|
||||
} /* ngt_TrimStr */
|
||||
|
||||
|
||||
/* -eof- */
|
||||
@@ -1,46 +0,0 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: tool.h,v 1.5 2002/01/02 02:42:58 alex Exp $
|
||||
*
|
||||
* log.h: Hilfsfunktionen (Header)
|
||||
*
|
||||
* $Log: tool.h,v $
|
||||
* Revision 1.5 2002/01/02 02:42:58 alex
|
||||
* - Copyright-Texte aktualisiert.
|
||||
*
|
||||
* Revision 1.4 2001/12/31 02:18:51 alex
|
||||
* - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
|
||||
* - neuen Header "defines.h" mit (fast) allen Konstanten.
|
||||
* - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
|
||||
*
|
||||
* Revision 1.3 2001/12/26 14:45:37 alex
|
||||
* - "Code Cleanups".
|
||||
*
|
||||
* Revision 1.2 2001/12/12 17:20:33 alex
|
||||
* - Tool-Funktionen haben nun das Praefix "ngt_".
|
||||
*
|
||||
* Revision 1.1.1.1 2001/12/11 21:53:04 alex
|
||||
* - Imported sources to CVS.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __tool_h__
|
||||
#define __tool_h__
|
||||
|
||||
|
||||
GLOBAL VOID ngt_TrimStr( CHAR *String );
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* -eof- */
|
||||
@@ -9,24 +9,28 @@
|
||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
#
|
||||
# $Id: Makefile.am,v 1.3 2002/01/02 02:40:15 alex Exp $
|
||||
#
|
||||
# $Log: Makefile.am,v $
|
||||
# Revision 1.3 2002/01/02 02:40:15 alex
|
||||
# - Copyright-Texte ergaenzt und aktualisiert,
|
||||
# - fehlende Dateien in Projekt aufgenommen.
|
||||
#
|
||||
# Revision 1.2 2001/12/31 16:02:12 alex
|
||||
# - Projektdateien von Mac OS X werden nun auch in die Distribution aufgenommen.
|
||||
#
|
||||
# Revision 1.1 2001/12/12 17:21:58 alex
|
||||
# - Projektdatei fuer den Mac OS X Project Builder erstellt.
|
||||
# $Id: Makefile.am,v 1.8 2005/04/16 09:23:01 fw Exp $
|
||||
#
|
||||
|
||||
SUBDIRS = ngircd.pbproj
|
||||
AUTOMAKE_OPTIONS = ansi2knr
|
||||
|
||||
noinst_LIBRARIES = libngportab.a
|
||||
|
||||
libngportab_a_SOURCES = strlcpy.c strdup.c vsnprintf.c
|
||||
|
||||
check_PROGRAMS = portabtest
|
||||
|
||||
portabtest_SOURCES = portabtest.c
|
||||
|
||||
portabtest_LDFLAGS = -L.
|
||||
|
||||
portabtest_LDADD = -lngportab
|
||||
|
||||
noinst_HEADERS = imp.h exp.h portab.h
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -f Makefile Makefile.in
|
||||
rm -rf build
|
||||
|
||||
TESTS = portabtest
|
||||
|
||||
# -eof-
|
||||
36
src/portab/ansi2knr.1
Normal file
36
src/portab/ansi2knr.1
Normal file
@@ -0,0 +1,36 @@
|
||||
.TH ANSI2KNR 1 "19 Jan 1996"
|
||||
.SH NAME
|
||||
ansi2knr \- convert ANSI C to Kernighan & Ritchie C
|
||||
.SH SYNOPSIS
|
||||
.I ansi2knr
|
||||
[--varargs] input_file [output_file]
|
||||
.SH DESCRIPTION
|
||||
If no output_file is supplied, output goes to stdout.
|
||||
.br
|
||||
There are no error messages.
|
||||
.sp
|
||||
.I ansi2knr
|
||||
recognizes function definitions by seeing a non-keyword identifier at the left
|
||||
margin, followed by a left parenthesis, with a right parenthesis as the last
|
||||
character on the line, and with a left brace as the first token on the
|
||||
following line (ignoring possible intervening comments). It will recognize a
|
||||
multi-line header provided that no intervening line ends with a left or right
|
||||
brace or a semicolon. These algorithms ignore whitespace and comments, except
|
||||
that the function name must be the first thing on the line.
|
||||
.sp
|
||||
The following constructs will confuse it:
|
||||
.br
|
||||
- Any other construct that starts at the left margin and follows the
|
||||
above syntax (such as a macro or function call).
|
||||
.br
|
||||
- Some macros that tinker with the syntax of the function header.
|
||||
.sp
|
||||
The --varargs switch is obsolete, and is recognized only for
|
||||
backwards compatibility. The present version of
|
||||
.I ansi2knr
|
||||
will always attempt to convert a ... argument to va_alist and va_dcl.
|
||||
.SH AUTHOR
|
||||
L. Peter Deutsch <ghost@aladdin.com> wrote the original ansi2knr and
|
||||
continues to maintain the current version; most of the code in the current
|
||||
version is his work. ansi2knr also includes contributions by Francois
|
||||
Pinard <pinard@iro.umontreal.ca> and Jim Avera <jima@netcom.com>.
|
||||
738
src/portab/ansi2knr.c
Normal file
738
src/portab/ansi2knr.c
Normal file
@@ -0,0 +1,738 @@
|
||||
/* Copyright (C) 1989, 2000 Aladdin Enterprises. All rights reserved. */
|
||||
|
||||
/* Convert ANSI C function definitions to K&R ("traditional C") syntax */
|
||||
|
||||
/*
|
||||
ansi2knr is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY. No author or distributor accepts responsibility to anyone for the
|
||||
consequences of using it or for whether it serves any particular purpose or
|
||||
works at all, unless he says so in writing. Refer to the GNU General Public
|
||||
License (the "GPL") for full details.
|
||||
|
||||
Everyone is granted permission to copy, modify and redistribute ansi2knr,
|
||||
but only under the conditions described in the GPL. A copy of this license
|
||||
is supposed to have been given to you along with ansi2knr so you can know
|
||||
your rights and responsibilities. It should be in a file named COPYLEFT,
|
||||
or, if there is no file named COPYLEFT, a file named COPYING. Among other
|
||||
things, the copyright notice and this notice must be preserved on all
|
||||
copies.
|
||||
|
||||
We explicitly state here what we believe is already implied by the GPL: if
|
||||
the ansi2knr program is distributed as a separate set of sources and a
|
||||
separate executable file which are aggregated on a storage medium together
|
||||
with another program, this in itself does not bring the other program under
|
||||
the GPL, nor does the mere fact that such a program or the procedures for
|
||||
constructing it invoke the ansi2knr executable bring any other part of the
|
||||
program under the GPL.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Usage:
|
||||
ansi2knr [--filename FILENAME] [INPUT_FILE [OUTPUT_FILE]]
|
||||
* --filename provides the file name for the #line directive in the output,
|
||||
* overriding input_file (if present).
|
||||
* If no input_file is supplied, input is read from stdin.
|
||||
* If no output_file is supplied, output goes to stdout.
|
||||
* There are no error messages.
|
||||
*
|
||||
* ansi2knr recognizes function definitions by seeing a non-keyword
|
||||
* identifier at the left margin, followed by a left parenthesis, with a
|
||||
* right parenthesis as the last character on the line, and with a left
|
||||
* brace as the first token on the following line (ignoring possible
|
||||
* intervening comments and/or preprocessor directives), except that a line
|
||||
* consisting of only
|
||||
* identifier1(identifier2)
|
||||
* will not be considered a function definition unless identifier2 is
|
||||
* the word "void", and a line consisting of
|
||||
* identifier1(identifier2, <<arbitrary>>)
|
||||
* will not be considered a function definition.
|
||||
* ansi2knr will recognize a multi-line header provided that no intervening
|
||||
* line ends with a left or right brace or a semicolon. These algorithms
|
||||
* ignore whitespace, comments, and preprocessor directives, except that
|
||||
* the function name must be the first thing on the line. The following
|
||||
* constructs will confuse it:
|
||||
* - Any other construct that starts at the left margin and
|
||||
* follows the above syntax (such as a macro or function call).
|
||||
* - Some macros that tinker with the syntax of function headers.
|
||||
*/
|
||||
|
||||
/*
|
||||
* The original and principal author of ansi2knr is L. Peter Deutsch
|
||||
* <ghost@aladdin.com>. Other authors are noted in the change history
|
||||
* that follows (in reverse chronological order):
|
||||
|
||||
lpd 2000-04-12 backs out Eggert's changes because of bugs:
|
||||
- concatlits didn't declare the type of its bufend argument;
|
||||
- concatlits didn't't recognize when it was inside a comment;
|
||||
- scanstring could scan backward past the beginning of the string; when
|
||||
- the check for \ + newline in scanstring was unnecessary.
|
||||
|
||||
2000-03-05 Paul Eggert <eggert@twinsun.com>
|
||||
|
||||
Add support for concatenated string literals.
|
||||
* ansi2knr.c (concatlits): New decl.
|
||||
(main): Invoke concatlits to concatenate string literals.
|
||||
(scanstring): Handle backslash-newline correctly. Work with
|
||||
character constants. Fix bug when scanning backwards through
|
||||
backslash-quote. Check for unterminated strings.
|
||||
(convert1): Parse character constants, too.
|
||||
(appendline, concatlits): New functions.
|
||||
* ansi2knr.1: Document this.
|
||||
|
||||
lpd 1999-08-17 added code to allow preprocessor directives
|
||||
wherever comments are allowed
|
||||
lpd 1999-04-12 added minor fixes from Pavel Roskin
|
||||
<pavel_roskin@geocities.com> for clean compilation with
|
||||
gcc -W -Wall
|
||||
lpd 1999-03-22 added hack to recognize lines consisting of
|
||||
identifier1(identifier2, xxx) as *not* being procedures
|
||||
lpd 1999-02-03 made indentation of preprocessor commands consistent
|
||||
lpd 1999-01-28 fixed two bugs: a '/' in an argument list caused an
|
||||
endless loop; quoted strings within an argument list
|
||||
confused the parser
|
||||
lpd 1999-01-24 added a check for write errors on the output,
|
||||
suggested by Jim Meyering <meyering@ascend.com>
|
||||
lpd 1998-11-09 added further hack to recognize identifier(void)
|
||||
as being a procedure
|
||||
lpd 1998-10-23 added hack to recognize lines consisting of
|
||||
identifier1(identifier2) as *not* being procedures
|
||||
lpd 1997-12-08 made input_file optional; only closes input and/or
|
||||
output file if not stdin or stdout respectively; prints
|
||||
usage message on stderr rather than stdout; adds
|
||||
--filename switch (changes suggested by
|
||||
<ceder@lysator.liu.se>)
|
||||
lpd 1996-01-21 added code to cope with not HAVE_CONFIG_H and with
|
||||
compilers that don't understand void, as suggested by
|
||||
Tom Lane
|
||||
lpd 1996-01-15 changed to require that the first non-comment token
|
||||
on the line following a function header be a left brace,
|
||||
to reduce sensitivity to macros, as suggested by Tom Lane
|
||||
<tgl@sss.pgh.pa.us>
|
||||
lpd 1995-06-22 removed #ifndefs whose sole purpose was to define
|
||||
undefined preprocessor symbols as 0; changed all #ifdefs
|
||||
for configuration symbols to #ifs
|
||||
lpd 1995-04-05 changed copyright notice to make it clear that
|
||||
including ansi2knr in a program does not bring the entire
|
||||
program under the GPL
|
||||
lpd 1994-12-18 added conditionals for systems where ctype macros
|
||||
don't handle 8-bit characters properly, suggested by
|
||||
Francois Pinard <pinard@iro.umontreal.ca>;
|
||||
removed --varargs switch (this is now the default)
|
||||
lpd 1994-10-10 removed CONFIG_BROKETS conditional
|
||||
lpd 1994-07-16 added some conditionals to help GNU `configure',
|
||||
suggested by Francois Pinard <pinard@iro.umontreal.ca>;
|
||||
properly erase prototype args in function parameters,
|
||||
contributed by Jim Avera <jima@netcom.com>;
|
||||
correct error in writeblanks (it shouldn't erase EOLs)
|
||||
lpd 1989-xx-xx original version
|
||||
*/
|
||||
|
||||
/* Most of the conditionals here are to make ansi2knr work with */
|
||||
/* or without the GNU configure machinery. */
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
|
||||
/*
|
||||
For properly autoconfiguring ansi2knr, use AC_CONFIG_HEADER(config.h).
|
||||
This will define HAVE_CONFIG_H and so, activate the following lines.
|
||||
*/
|
||||
|
||||
# if STDC_HEADERS || HAVE_STRING_H
|
||||
# include <string.h>
|
||||
# else
|
||||
# include <strings.h>
|
||||
# endif
|
||||
|
||||
#else /* not HAVE_CONFIG_H */
|
||||
|
||||
/* Otherwise do it the hard way */
|
||||
|
||||
# ifdef BSD
|
||||
# include <strings.h>
|
||||
# else
|
||||
# ifdef VMS
|
||||
extern int strlen(), strncmp();
|
||||
# else
|
||||
# include <string.h>
|
||||
# endif
|
||||
# endif
|
||||
|
||||
#endif /* not HAVE_CONFIG_H */
|
||||
|
||||
#if STDC_HEADERS
|
||||
# include <stdlib.h>
|
||||
#else
|
||||
/*
|
||||
malloc and free should be declared in stdlib.h,
|
||||
but if you've got a K&R compiler, they probably aren't.
|
||||
*/
|
||||
# ifdef MSDOS
|
||||
# include <malloc.h>
|
||||
# else
|
||||
# ifdef VMS
|
||||
extern char *malloc();
|
||||
extern void free();
|
||||
# else
|
||||
extern char *malloc();
|
||||
extern int free();
|
||||
# endif
|
||||
# endif
|
||||
|
||||
#endif
|
||||
|
||||
/* Define NULL (for *very* old compilers). */
|
||||
#ifndef NULL
|
||||
# define NULL (0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The ctype macros don't always handle 8-bit characters correctly.
|
||||
* Compensate for this here.
|
||||
*/
|
||||
#ifdef isascii
|
||||
# undef HAVE_ISASCII /* just in case */
|
||||
# define HAVE_ISASCII 1
|
||||
#else
|
||||
#endif
|
||||
#if STDC_HEADERS || !HAVE_ISASCII
|
||||
# define is_ascii(c) 1
|
||||
#else
|
||||
# define is_ascii(c) isascii(c)
|
||||
#endif
|
||||
|
||||
#define is_space(c) (is_ascii(c) && isspace(c))
|
||||
#define is_alpha(c) (is_ascii(c) && isalpha(c))
|
||||
#define is_alnum(c) (is_ascii(c) && isalnum(c))
|
||||
|
||||
/* Scanning macros */
|
||||
#define isidchar(ch) (is_alnum(ch) || (ch) == '_')
|
||||
#define isidfirstchar(ch) (is_alpha(ch) || (ch) == '_')
|
||||
|
||||
/* Forward references */
|
||||
char *ppdirforward();
|
||||
char *ppdirbackward();
|
||||
char *skipspace();
|
||||
char *scanstring();
|
||||
int writeblanks();
|
||||
int test1();
|
||||
int convert1();
|
||||
|
||||
/* The main program */
|
||||
int
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
{ FILE *in = stdin;
|
||||
FILE *out = stdout;
|
||||
char *filename = 0;
|
||||
char *program_name = argv[0];
|
||||
char *output_name = 0;
|
||||
#define bufsize 5000 /* arbitrary size */
|
||||
char *buf;
|
||||
char *line;
|
||||
char *more;
|
||||
char *usage =
|
||||
"Usage: ansi2knr [--filename FILENAME] [INPUT_FILE [OUTPUT_FILE]]\n";
|
||||
/*
|
||||
* In previous versions, ansi2knr recognized a --varargs switch.
|
||||
* If this switch was supplied, ansi2knr would attempt to convert
|
||||
* a ... argument to va_alist and va_dcl; if this switch was not
|
||||
* supplied, ansi2knr would simply drop any such arguments.
|
||||
* Now, ansi2knr always does this conversion, and we only
|
||||
* check for this switch for backward compatibility.
|
||||
*/
|
||||
int convert_varargs = 1;
|
||||
int output_error;
|
||||
|
||||
while ( argc > 1 && argv[1][0] == '-' ) {
|
||||
if ( !strcmp(argv[1], "--varargs") ) {
|
||||
convert_varargs = 1;
|
||||
argc--;
|
||||
argv++;
|
||||
continue;
|
||||
}
|
||||
if ( !strcmp(argv[1], "--filename") && argc > 2 ) {
|
||||
filename = argv[2];
|
||||
argc -= 2;
|
||||
argv += 2;
|
||||
continue;
|
||||
}
|
||||
fprintf(stderr, "%s: Unrecognized switch: %s\n", program_name,
|
||||
argv[1]);
|
||||
fprintf(stderr, usage);
|
||||
exit(1);
|
||||
}
|
||||
switch ( argc )
|
||||
{
|
||||
default:
|
||||
fprintf(stderr, usage);
|
||||
exit(0);
|
||||
case 3:
|
||||
output_name = argv[2];
|
||||
out = fopen(output_name, "w");
|
||||
if ( out == NULL ) {
|
||||
fprintf(stderr, "%s: Cannot open output file %s\n",
|
||||
program_name, output_name);
|
||||
exit(1);
|
||||
}
|
||||
/* falls through */
|
||||
case 2:
|
||||
in = fopen(argv[1], "r");
|
||||
if ( in == NULL ) {
|
||||
fprintf(stderr, "%s: Cannot open input file %s\n",
|
||||
program_name, argv[1]);
|
||||
exit(1);
|
||||
}
|
||||
if ( filename == 0 )
|
||||
filename = argv[1];
|
||||
/* falls through */
|
||||
case 1:
|
||||
break;
|
||||
}
|
||||
if ( filename )
|
||||
fprintf(out, "#line 1 \"%s\"\n", filename);
|
||||
buf = malloc(bufsize);
|
||||
if ( buf == NULL )
|
||||
{
|
||||
fprintf(stderr, "Unable to allocate read buffer!\n");
|
||||
exit(1);
|
||||
}
|
||||
line = buf;
|
||||
while ( fgets(line, (unsigned)(buf + bufsize - line), in) != NULL )
|
||||
{
|
||||
test: line += strlen(line);
|
||||
switch ( test1(buf) )
|
||||
{
|
||||
case 2: /* a function header */
|
||||
convert1(buf, out, 1, convert_varargs);
|
||||
break;
|
||||
case 1: /* a function */
|
||||
/* Check for a { at the start of the next line. */
|
||||
more = ++line;
|
||||
f: if ( line >= buf + (bufsize - 1) ) /* overflow check */
|
||||
goto wl;
|
||||
if ( fgets(line, (unsigned)(buf + bufsize - line), in) == NULL )
|
||||
goto wl;
|
||||
switch ( *skipspace(ppdirforward(more), 1) )
|
||||
{
|
||||
case '{':
|
||||
/* Definitely a function header. */
|
||||
convert1(buf, out, 0, convert_varargs);
|
||||
fputs(more, out);
|
||||
break;
|
||||
case 0:
|
||||
/* The next line was blank or a comment: */
|
||||
/* keep scanning for a non-comment. */
|
||||
line += strlen(line);
|
||||
goto f;
|
||||
default:
|
||||
/* buf isn't a function header, but */
|
||||
/* more might be. */
|
||||
fputs(buf, out);
|
||||
strcpy(buf, more);
|
||||
line = buf;
|
||||
goto test;
|
||||
}
|
||||
break;
|
||||
case -1: /* maybe the start of a function */
|
||||
if ( line != buf + (bufsize - 1) ) /* overflow check */
|
||||
continue;
|
||||
/* falls through */
|
||||
default: /* not a function */
|
||||
wl: fputs(buf, out);
|
||||
break;
|
||||
}
|
||||
line = buf;
|
||||
}
|
||||
if ( line != buf )
|
||||
fputs(buf, out);
|
||||
free(buf);
|
||||
if ( output_name ) {
|
||||
output_error = ferror(out);
|
||||
output_error |= fclose(out);
|
||||
} else { /* out == stdout */
|
||||
fflush(out);
|
||||
output_error = ferror(out);
|
||||
}
|
||||
if ( output_error ) {
|
||||
fprintf(stderr, "%s: error writing to %s\n", program_name,
|
||||
(output_name ? output_name : "stdout"));
|
||||
exit(1);
|
||||
}
|
||||
if ( in != stdin )
|
||||
fclose(in);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Skip forward or backward over one or more preprocessor directives.
|
||||
*/
|
||||
char *
|
||||
ppdirforward(p)
|
||||
char *p;
|
||||
{
|
||||
for (; *p == '#'; ++p) {
|
||||
for (; *p != '\r' && *p != '\n'; ++p)
|
||||
if (*p == 0)
|
||||
return p;
|
||||
if (*p == '\r' && p[1] == '\n')
|
||||
++p;
|
||||
}
|
||||
return p;
|
||||
}
|
||||
char *
|
||||
ppdirbackward(p, limit)
|
||||
char *p;
|
||||
char *limit;
|
||||
{
|
||||
char *np = p;
|
||||
|
||||
for (;; p = --np) {
|
||||
if (*np == '\n' && np[-1] == '\r')
|
||||
--np;
|
||||
for (; np > limit && np[-1] != '\r' && np[-1] != '\n'; --np)
|
||||
if (np[-1] == 0)
|
||||
return np;
|
||||
if (*np != '#')
|
||||
return p;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Skip over whitespace, comments, and preprocessor directives,
|
||||
* in either direction.
|
||||
*/
|
||||
char *
|
||||
skipspace(p, dir)
|
||||
char *p;
|
||||
int dir; /* 1 for forward, -1 for backward */
|
||||
{
|
||||
for ( ; ; ) {
|
||||
while ( is_space(*p) )
|
||||
p += dir;
|
||||
if ( !(*p == '/' && p[dir] == '*') )
|
||||
break;
|
||||
p += dir; p += dir;
|
||||
while ( !(*p == '*' && p[dir] == '/') ) {
|
||||
if ( *p == 0 )
|
||||
return p; /* multi-line comment?? */
|
||||
p += dir;
|
||||
}
|
||||
p += dir; p += dir;
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
/* Scan over a quoted string, in either direction. */
|
||||
char *
|
||||
scanstring(p, dir)
|
||||
char *p;
|
||||
int dir;
|
||||
{
|
||||
for (p += dir; ; p += dir)
|
||||
if (*p == '"' && p[-dir] != '\\')
|
||||
return p + dir;
|
||||
}
|
||||
|
||||
/*
|
||||
* Write blanks over part of a string.
|
||||
* Don't overwrite end-of-line characters.
|
||||
*/
|
||||
int
|
||||
writeblanks(start, end)
|
||||
char *start;
|
||||
char *end;
|
||||
{ char *p;
|
||||
for ( p = start; p < end; p++ )
|
||||
if ( *p != '\r' && *p != '\n' )
|
||||
*p = ' ';
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Test whether the string in buf is a function definition.
|
||||
* The string may contain and/or end with a newline.
|
||||
* Return as follows:
|
||||
* 0 - definitely not a function definition;
|
||||
* 1 - definitely a function definition;
|
||||
* 2 - definitely a function prototype (NOT USED);
|
||||
* -1 - may be the beginning of a function definition,
|
||||
* append another line and look again.
|
||||
* The reason we don't attempt to convert function prototypes is that
|
||||
* Ghostscript's declaration-generating macros look too much like
|
||||
* prototypes, and confuse the algorithms.
|
||||
*/
|
||||
int
|
||||
test1(buf)
|
||||
char *buf;
|
||||
{ char *p = buf;
|
||||
char *bend;
|
||||
char *endfn;
|
||||
int contin;
|
||||
|
||||
if ( !isidfirstchar(*p) )
|
||||
return 0; /* no name at left margin */
|
||||
bend = skipspace(ppdirbackward(buf + strlen(buf) - 1, buf), -1);
|
||||
switch ( *bend )
|
||||
{
|
||||
case ';': contin = 0 /*2*/; break;
|
||||
case ')': contin = 1; break;
|
||||
case '{': return 0; /* not a function */
|
||||
case '}': return 0; /* not a function */
|
||||
default: contin = -1;
|
||||
}
|
||||
while ( isidchar(*p) )
|
||||
p++;
|
||||
endfn = p;
|
||||
p = skipspace(p, 1);
|
||||
if ( *p++ != '(' )
|
||||
return 0; /* not a function */
|
||||
p = skipspace(p, 1);
|
||||
if ( *p == ')' )
|
||||
return 0; /* no parameters */
|
||||
/* Check that the apparent function name isn't a keyword. */
|
||||
/* We only need to check for keywords that could be followed */
|
||||
/* by a left parenthesis (which, unfortunately, is most of them). */
|
||||
{ static char *words[] =
|
||||
{ "asm", "auto", "case", "char", "const", "double",
|
||||
"extern", "float", "for", "if", "int", "long",
|
||||
"register", "return", "short", "signed", "sizeof",
|
||||
"static", "switch", "typedef", "unsigned",
|
||||
"void", "volatile", "while", 0
|
||||
};
|
||||
char **key = words;
|
||||
char *kp;
|
||||
unsigned len = endfn - buf;
|
||||
|
||||
while ( (kp = *key) != 0 )
|
||||
{ if ( strlen(kp) == len && !strncmp(kp, buf, len) )
|
||||
return 0; /* name is a keyword */
|
||||
key++;
|
||||
}
|
||||
}
|
||||
{
|
||||
char *id = p;
|
||||
int len;
|
||||
/*
|
||||
* Check for identifier1(identifier2) and not
|
||||
* identifier1(void), or identifier1(identifier2, xxxx).
|
||||
*/
|
||||
|
||||
while ( isidchar(*p) )
|
||||
p++;
|
||||
len = p - id;
|
||||
p = skipspace(p, 1);
|
||||
if (*p == ',' ||
|
||||
(*p == ')' && (len != 4 || strncmp(id, "void", 4)))
|
||||
)
|
||||
return 0; /* not a function */
|
||||
}
|
||||
/*
|
||||
* If the last significant character was a ), we need to count
|
||||
* parentheses, because it might be part of a formal parameter
|
||||
* that is a procedure.
|
||||
*/
|
||||
if (contin > 0) {
|
||||
int level = 0;
|
||||
|
||||
for (p = skipspace(buf, 1); *p; p = skipspace(p + 1, 1))
|
||||
level += (*p == '(' ? 1 : *p == ')' ? -1 : 0);
|
||||
if (level > 0)
|
||||
contin = -1;
|
||||
}
|
||||
return contin;
|
||||
}
|
||||
|
||||
/* Convert a recognized function definition or header to K&R syntax. */
|
||||
int
|
||||
convert1(buf, out, header, convert_varargs)
|
||||
char *buf;
|
||||
FILE *out;
|
||||
int header; /* Boolean */
|
||||
int convert_varargs; /* Boolean */
|
||||
{ char *endfn;
|
||||
char *p;
|
||||
/*
|
||||
* The breaks table contains pointers to the beginning and end
|
||||
* of each argument.
|
||||
*/
|
||||
char **breaks;
|
||||
unsigned num_breaks = 2; /* for testing */
|
||||
char **btop;
|
||||
char **bp;
|
||||
char **ap;
|
||||
char *vararg = 0;
|
||||
|
||||
/* Pre-ANSI implementations don't agree on whether strchr */
|
||||
/* is called strchr or index, so we open-code it here. */
|
||||
for ( endfn = buf; *(endfn++) != '('; )
|
||||
;
|
||||
top: p = endfn;
|
||||
breaks = (char **)malloc(sizeof(char *) * num_breaks * 2);
|
||||
if ( breaks == NULL )
|
||||
{ /* Couldn't allocate break table, give up */
|
||||
fprintf(stderr, "Unable to allocate break table!\n");
|
||||
fputs(buf, out);
|
||||
return -1;
|
||||
}
|
||||
btop = breaks + num_breaks * 2 - 2;
|
||||
bp = breaks;
|
||||
/* Parse the argument list */
|
||||
do
|
||||
{ int level = 0;
|
||||
char *lp = NULL;
|
||||
char *rp = NULL;
|
||||
char *end = NULL;
|
||||
|
||||
if ( bp >= btop )
|
||||
{ /* Filled up break table. */
|
||||
/* Allocate a bigger one and start over. */
|
||||
free((char *)breaks);
|
||||
num_breaks <<= 1;
|
||||
goto top;
|
||||
}
|
||||
*bp++ = p;
|
||||
/* Find the end of the argument */
|
||||
for ( ; end == NULL; p++ )
|
||||
{ switch(*p)
|
||||
{
|
||||
case ',':
|
||||
if ( !level ) end = p;
|
||||
break;
|
||||
case '(':
|
||||
if ( !level ) lp = p;
|
||||
level++;
|
||||
break;
|
||||
case ')':
|
||||
if ( --level < 0 ) end = p;
|
||||
else rp = p;
|
||||
break;
|
||||
case '/':
|
||||
if (p[1] == '*')
|
||||
p = skipspace(p, 1) - 1;
|
||||
break;
|
||||
case '"':
|
||||
p = scanstring(p, 1) - 1;
|
||||
break;
|
||||
default:
|
||||
;
|
||||
}
|
||||
}
|
||||
/* Erase any embedded prototype parameters. */
|
||||
if ( lp && rp )
|
||||
writeblanks(lp + 1, rp);
|
||||
p--; /* back up over terminator */
|
||||
/* Find the name being declared. */
|
||||
/* This is complicated because of procedure and */
|
||||
/* array modifiers. */
|
||||
for ( ; ; )
|
||||
{ p = skipspace(p - 1, -1);
|
||||
switch ( *p )
|
||||
{
|
||||
case ']': /* skip array dimension(s) */
|
||||
case ')': /* skip procedure args OR name */
|
||||
{ int level = 1;
|
||||
while ( level )
|
||||
switch ( *--p )
|
||||
{
|
||||
case ']': case ')':
|
||||
level++;
|
||||
break;
|
||||
case '[': case '(':
|
||||
level--;
|
||||
break;
|
||||
case '/':
|
||||
if (p > buf && p[-1] == '*')
|
||||
p = skipspace(p, -1) + 1;
|
||||
break;
|
||||
case '"':
|
||||
p = scanstring(p, -1) + 1;
|
||||
break;
|
||||
default: ;
|
||||
}
|
||||
}
|
||||
if ( *p == '(' && *skipspace(p + 1, 1) == '*' )
|
||||
{ /* We found the name being declared */
|
||||
while ( !isidfirstchar(*p) )
|
||||
p = skipspace(p, 1) + 1;
|
||||
goto found;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
goto found;
|
||||
}
|
||||
}
|
||||
found: if ( *p == '.' && p[-1] == '.' && p[-2] == '.' )
|
||||
{ if ( convert_varargs )
|
||||
{ *bp++ = "va_alist";
|
||||
vararg = p-2;
|
||||
}
|
||||
else
|
||||
{ p++;
|
||||
if ( bp == breaks + 1 ) /* sole argument */
|
||||
writeblanks(breaks[0], p);
|
||||
else
|
||||
writeblanks(bp[-1] - 1, p);
|
||||
bp--;
|
||||
}
|
||||
}
|
||||
else
|
||||
{ while ( isidchar(*p) ) p--;
|
||||
*bp++ = p+1;
|
||||
}
|
||||
p = end;
|
||||
}
|
||||
while ( *p++ == ',' );
|
||||
*bp = p;
|
||||
/* Make a special check for 'void' arglist */
|
||||
if ( bp == breaks+2 )
|
||||
{ p = skipspace(breaks[0], 1);
|
||||
if ( !strncmp(p, "void", 4) )
|
||||
{ p = skipspace(p+4, 1);
|
||||
if ( p == breaks[2] - 1 )
|
||||
{ bp = breaks; /* yup, pretend arglist is empty */
|
||||
writeblanks(breaks[0], p + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Put out the function name and left parenthesis. */
|
||||
p = buf;
|
||||
while ( p != endfn ) putc(*p, out), p++;
|
||||
/* Put out the declaration. */
|
||||
if ( header )
|
||||
{ fputs(");", out);
|
||||
for ( p = breaks[0]; *p; p++ )
|
||||
if ( *p == '\r' || *p == '\n' )
|
||||
putc(*p, out);
|
||||
}
|
||||
else
|
||||
{ for ( ap = breaks+1; ap < bp; ap += 2 )
|
||||
{ p = *ap;
|
||||
while ( isidchar(*p) )
|
||||
putc(*p, out), p++;
|
||||
if ( ap < bp - 1 )
|
||||
fputs(", ", out);
|
||||
}
|
||||
fputs(") ", out);
|
||||
/* Put out the argument declarations */
|
||||
for ( ap = breaks+2; ap <= bp; ap += 2 )
|
||||
(*ap)[-1] = ';';
|
||||
if ( vararg != 0 )
|
||||
{ *vararg = 0;
|
||||
fputs(breaks[0], out); /* any prior args */
|
||||
fputs("va_dcl", out); /* the final arg */
|
||||
fputs(bp[0], out);
|
||||
}
|
||||
else
|
||||
fputs(breaks[0], out);
|
||||
}
|
||||
free((char *)breaks);
|
||||
return 0;
|
||||
}
|
||||
22
src/portab/exp.h
Normal file
22
src/portab/exp.h
Normal file
@@ -0,0 +1,22 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
||||
*
|
||||
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
||||
* der GNU General Public License (GPL), wie von der Free Software Foundation
|
||||
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
||||
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||
*
|
||||
* $Id: exp.h,v 1.1 2002/03/12 14:36:44 alex Exp $
|
||||
*
|
||||
* exp.h: "Export Header"
|
||||
*/
|
||||
|
||||
|
||||
#undef GLOBAL
|
||||
#define GLOBAL
|
||||
|
||||
|
||||
/* -eof- */
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user