mirror of
				https://github.com/osmarks/ngircd.git
				synced 2025-10-27 03:57:38 +00:00 
			
		
		
		
	Compare commits
	
		
			979 Commits
		
	
	
		
			branch-0-4
			...
			rel-0-9-2
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 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 | 
							
								
								
									
										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 $ | ||||
|   | ||||
							
								
								
									
										479
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										479
									
								
								ChangeLog
									
									
									
									
									
								
							| @@ -1,21 +1,477 @@ | ||||
|  | ||||
|                      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.3.x, ??.??.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 Unerstuetzung von Masks). | ||||
|   - 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 (/usr/local/var/ngircd.err). | ||||
|   - 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. | ||||
| @@ -23,7 +479,6 @@ ngIRCd 0.3.x, ??.??.2002 | ||||
|   - die Beispiel-Konfigurationsdatei (doc/sample-ngircd.conf) wird als | ||||
|     ngircd.conf installiert, wenn noch keine "echte" Konfigurationsdatei | ||||
|     vorhanden ist. | ||||
|   - bei "ngircd --help" werden nun die eincompilierten Pfade angezeigt. | ||||
|   - 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 | ||||
| @@ -31,19 +486,20 @@ ngIRCd 0.3.x, ??.??.2002 | ||||
|     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. | ||||
|     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 die dann verwendeten Werte angezeigt. | ||||
|     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 | ||||
|  | ||||
| @@ -127,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 | ||||
| @@ -174,4 +629,4 @@ ngIRCd 0.0.1, 31.12.2001 | ||||
|  | ||||
|  | ||||
| --  | ||||
| $Id: ChangeLog,v 1.54 2002/03/29 23:41:23 alex Exp $ | ||||
| $Id: ChangeLog,v 1.276.2.12 2005/10/15 12:44:08 alex Exp $ | ||||
|   | ||||
							
								
								
									
										204
									
								
								INSTALL
									
									
									
									
									
								
							
							
						
						
									
										204
									
								
								INSTALL
									
									
									
									
									
								
							| @@ -1,90 +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.5 2002/03/03 13:07:01 alex Exp $ | ||||
| $Id: INSTALL,v 1.21 2005/02/10 08:20:09 alex Exp $ | ||||
|   | ||||
| @@ -1,935 +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, | ||||
| 				F538241E024F89BC01A85B04, | ||||
| 			); | ||||
| 		}; | ||||
| 		08FB7794FE84155DC02AAC07 = { | ||||
| 			children = ( | ||||
| 				1AB674ADFE9D54B511CA2CBB, | ||||
| 				F51F791401DFD0DE01D13771, | ||||
| 				F56D8B9E01E0BFA00155ADA7, | ||||
| 				F52162B301C7B904012300F4, | ||||
| 				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 = "-DLOCALSTATEDIR=\\\\\\\"/usr/local/var\\\\\\\" -DSYSCONFDIR=\\\\\\\"/usr/local/etc\\\\\\\""; | ||||
| 				OTHER_LDFLAGS = ""; | ||||
| 				OTHER_REZFLAGS = ""; | ||||
| 				PRODUCT_NAME = ngircd; | ||||
| 				REZ_EXECUTABLE = YES; | ||||
| 				SECTORDER_FLAGS = ""; | ||||
| 				WARNING_CFLAGS = "-Wall"; | ||||
| 			}; | ||||
| 			dependencies = ( | ||||
| 			); | ||||
| 			isa = PBXToolTarget; | ||||
| 			name = ngircd; | ||||
| 			productInstallPath = "$(HOME)/bin"; | ||||
| 			productName = ngircd; | ||||
| 			productReference = 034768E8FF38A79811DB9C8B; | ||||
| 			shouldUseHeadermap = 1; | ||||
| 		}; | ||||
| 		08FB77A0FE84155DC02AAC07 = { | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 				F52162CE01C7B904012300F4, | ||||
| 				F52162CF01C7B904012300F4, | ||||
| 				F52162D001C7B904012300F4, | ||||
| 				F52162D901C7BAAE012300F4, | ||||
| 				F52162DC01C7BCDD012300F4, | ||||
| 				F52162E401C7C79E012300F4, | ||||
| 				F51D17FE01C8F5B701E11C2E, | ||||
| 				F51D180401C8FDD001E11C2E, | ||||
| 				F51D180501C8FDD001E11C2E, | ||||
| 				F576ABFC01D5E77301A85B03, | ||||
| 				F576ABFF01D61D7401A85B03, | ||||
| 				F51F791301DFC95301D13771, | ||||
| 				F51DBB15022D95E801A85B04, | ||||
| 				F51DBB19022D995501A85B04, | ||||
| 				F51DBB1D022D9D8F01A85B04, | ||||
| 				F57C88870232853501A85B04, | ||||
| 				F57C888B0232884501A85B04, | ||||
| 				F57C888F02328D7201A85B04, | ||||
| 				F5F18138023EC63701A85B04, | ||||
| 				F5F18139023EC63701A85B04, | ||||
| 				F5F1813A023EC63701A85B04, | ||||
| 				F55047BC0240F6E501A85B04, | ||||
| 			); | ||||
| 			isa = PBXHeadersBuildPhase; | ||||
| 			name = Headers; | ||||
| 		}; | ||||
| 		08FB77A1FE84155DC02AAC07 = { | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 				F52162D101C7B904012300F4, | ||||
| 				F52162D201C7B904012300F4, | ||||
| 				F52162D301C7B904012300F4, | ||||
| 				F52162DD01C7BCDD012300F4, | ||||
| 				F52162E501C7C79E012300F4, | ||||
| 				F51D17FF01C8F5B701E11C2E, | ||||
| 				F51D180701C8FDD001E11C2E, | ||||
| 				F576ABFD01D5E77301A85B03, | ||||
| 				F5263AEE01E263D201CE8F8F, | ||||
| 				F51DBB16022D95E801A85B04, | ||||
| 				F51DBB1A022D995501A85B04, | ||||
| 				F51DBB1E022D9D8F01A85B04, | ||||
| 				F57C88880232853501A85B04, | ||||
| 				F57C888C0232884501A85B04, | ||||
| 				F57C889002328D7201A85B04, | ||||
| 				F55047BD0240F6E501A85B04, | ||||
| 			); | ||||
| 			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, | ||||
| 				F538241D024F89BC01A85B04, | ||||
| 			); | ||||
| 			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, | ||||
| 				F5F18132023EC61E01A85B04, | ||||
| 			); | ||||
| 			isa = PBXGroup; | ||||
| 			name = src; | ||||
| 			path = ../src; | ||||
| 			refType = 2; | ||||
| 		}; | ||||
| 		F52162B801C7B904012300F4 = { | ||||
| 			isa = PBXFileReference; | ||||
| 			path = Makefile.am; | ||||
| 			refType = 4; | ||||
| 		}; | ||||
| 		F52162B901C7B904012300F4 = { | ||||
| 			children = ( | ||||
| 				F52162BD01C7B904012300F4, | ||||
| 				F52162BE01C7B904012300F4, | ||||
| 				F52162BF01C7B904012300F4, | ||||
| 				F51D180001C8FDD001E11C2E, | ||||
| 				F51D180101C8FDD001E11C2E, | ||||
| 				F51D17FC01C8F5B701E11C2E, | ||||
| 				F51D17FD01C8F5B701E11C2E, | ||||
| 				F52162E201C7C77B012300F4, | ||||
| 				F52162E301C7C77B012300F4, | ||||
| 				F52162DA01C7BCDC012300F4, | ||||
| 				F52162DB01C7BCDC012300F4, | ||||
| 				F55047BA0240F6E501A85B04, | ||||
| 				F55047BB0240F6E501A85B04, | ||||
| 				F51D180201C8FDD001E11C2E, | ||||
| 				F51D180301C8FDD001E11C2E, | ||||
| 				F57C888D02328D7201A85B04, | ||||
| 				F57C888E02328D7201A85B04, | ||||
| 				F51DBB1B022D9D8F01A85B04, | ||||
| 				F51DBB1C022D9D8F01A85B04, | ||||
| 				F51DBB17022D995501A85B04, | ||||
| 				F51DBB18022D995501A85B04, | ||||
| 				F57C88850232853501A85B04, | ||||
| 				F57C88860232853501A85B04, | ||||
| 				F57C88890232884501A85B04, | ||||
| 				F57C888A0232884501A85B04, | ||||
| 				F51DBB13022D95E801A85B04, | ||||
| 				F51DBB14022D95E801A85B04, | ||||
| 				F52162BB01C7B904012300F4, | ||||
| 				F52162BC01C7B904012300F4, | ||||
| 				F576ABFA01D5E77301A85B03, | ||||
| 				F576ABFB01D5E77301A85B03, | ||||
| 				F52162C001C7B904012300F4, | ||||
| 				F52162C101C7B904012300F4, | ||||
| 				F51F791201DFC95301D13771, | ||||
| 				F576ABFE01D61D7401A85B03, | ||||
| 			); | ||||
| 			isa = PBXGroup; | ||||
| 			path = ngircd; | ||||
| 			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; | ||||
| 		}; | ||||
| 		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; | ||||
| 		}; | ||||
| 		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; | ||||
| 		}; | ||||
| 		F538241D024F89BC01A85B04 = { | ||||
| 			isa = PBXExecutableFileReference; | ||||
| 			path = portabtest; | ||||
| 			refType = 3; | ||||
| 		}; | ||||
| 		F538241E024F89BC01A85B04 = { | ||||
| 			buildPhases = ( | ||||
| 				F538241F024F89BC01A85B04, | ||||
| 				F5382423024F89BC01A85B04, | ||||
| 				F5382425024F89BC01A85B04, | ||||
| 				F5382426024F89BC01A85B04, | ||||
| 			); | ||||
| 			buildSettings = { | ||||
| 				OTHER_CFLAGS = ""; | ||||
| 				OTHER_LDFLAGS = ""; | ||||
| 				OTHER_REZFLAGS = ""; | ||||
| 				PRODUCT_NAME = portabtest; | ||||
| 				REZ_EXECUTABLE = YES; | ||||
| 				SECTORDER_FLAGS = ""; | ||||
| 				WARNING_CFLAGS = "-Wall"; | ||||
| 			}; | ||||
| 			dependencies = ( | ||||
| 			); | ||||
| 			isa = PBXToolTarget; | ||||
| 			name = portabtest; | ||||
| 			productInstallPath = /usr/local/bin; | ||||
| 			productName = portabtest; | ||||
| 			productReference = F538241D024F89BC01A85B04; | ||||
| 			shouldUseHeadermap = 0; | ||||
| 		}; | ||||
| 		F538241F024F89BC01A85B04 = { | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 				F5382420024F89BC01A85B04, | ||||
| 				F5382421024F89BC01A85B04, | ||||
| 				F5382422024F89BC01A85B04, | ||||
| 			); | ||||
| 			isa = PBXHeadersBuildPhase; | ||||
| 			name = Headers; | ||||
| 		}; | ||||
| 		F5382420024F89BC01A85B04 = { | ||||
| 			fileRef = F5F18134023EC63701A85B04; | ||||
| 			isa = PBXBuildFile; | ||||
| 			settings = { | ||||
| 			}; | ||||
| 		}; | ||||
| 		F5382421024F89BC01A85B04 = { | ||||
| 			fileRef = F5F18135023EC63701A85B04; | ||||
| 			isa = PBXBuildFile; | ||||
| 			settings = { | ||||
| 			}; | ||||
| 		}; | ||||
| 		F5382422024F89BC01A85B04 = { | ||||
| 			fileRef = F5F18136023EC63701A85B04; | ||||
| 			isa = PBXBuildFile; | ||||
| 			settings = { | ||||
| 			}; | ||||
| 		}; | ||||
| 		F5382423024F89BC01A85B04 = { | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 				F5382424024F89BC01A85B04, | ||||
| 			); | ||||
| 			isa = PBXSourcesBuildPhase; | ||||
| 			name = Sources; | ||||
| 		}; | ||||
| 		F5382424024F89BC01A85B04 = { | ||||
| 			fileRef = F5F18137023EC63701A85B04; | ||||
| 			isa = PBXBuildFile; | ||||
| 			settings = { | ||||
| 			}; | ||||
| 		}; | ||||
| 		F5382425024F89BC01A85B04 = { | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			isa = PBXFrameworksBuildPhase; | ||||
| 			name = "Frameworks & Libraries"; | ||||
| 		}; | ||||
| 		F5382426024F89BC01A85B04 = { | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			isa = PBXRezBuildPhase; | ||||
| 			name = "ResourceManager Resources"; | ||||
| 		}; | ||||
| 		F55047BA0240F6E501A85B04 = { | ||||
| 			isa = PBXFileReference; | ||||
| 			path = hash.c; | ||||
| 			refType = 4; | ||||
| 		}; | ||||
| 		F55047BB0240F6E501A85B04 = { | ||||
| 			isa = PBXFileReference; | ||||
| 			path = hash.h; | ||||
| 			refType = 4; | ||||
| 		}; | ||||
| 		F55047BC0240F6E501A85B04 = { | ||||
| 			fileRef = F55047BB0240F6E501A85B04; | ||||
| 			isa = PBXBuildFile; | ||||
| 			settings = { | ||||
| 			}; | ||||
| 		}; | ||||
| 		F55047BD0240F6E501A85B04 = { | ||||
| 			fileRef = F55047BA0240F6E501A85B04; | ||||
| 			isa = PBXBuildFile; | ||||
| 			settings = { | ||||
| 			}; | ||||
| 		}; | ||||
| 		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 = { | ||||
| 			}; | ||||
| 		}; | ||||
| 		F57C88850232853501A85B04 = { | ||||
| 			isa = PBXFileReference; | ||||
| 			path = "irc-oper.c"; | ||||
| 			refType = 4; | ||||
| 		}; | ||||
| 		F57C88860232853501A85B04 = { | ||||
| 			isa = PBXFileReference; | ||||
| 			path = "irc-oper.h"; | ||||
| 			refType = 4; | ||||
| 		}; | ||||
| 		F57C88870232853501A85B04 = { | ||||
| 			fileRef = F57C88860232853501A85B04; | ||||
| 			isa = PBXBuildFile; | ||||
| 			settings = { | ||||
| 			}; | ||||
| 		}; | ||||
| 		F57C88880232853501A85B04 = { | ||||
| 			fileRef = F57C88850232853501A85B04; | ||||
| 			isa = PBXBuildFile; | ||||
| 			settings = { | ||||
| 			}; | ||||
| 		}; | ||||
| 		F57C88890232884501A85B04 = { | ||||
| 			isa = PBXFileReference; | ||||
| 			path = "irc-server.c"; | ||||
| 			refType = 4; | ||||
| 		}; | ||||
| 		F57C888A0232884501A85B04 = { | ||||
| 			isa = PBXFileReference; | ||||
| 			path = "irc-server.h"; | ||||
| 			refType = 4; | ||||
| 		}; | ||||
| 		F57C888B0232884501A85B04 = { | ||||
| 			fileRef = F57C888A0232884501A85B04; | ||||
| 			isa = PBXBuildFile; | ||||
| 			settings = { | ||||
| 			}; | ||||
| 		}; | ||||
| 		F57C888C0232884501A85B04 = { | ||||
| 			fileRef = F57C88890232884501A85B04; | ||||
| 			isa = PBXBuildFile; | ||||
| 			settings = { | ||||
| 			}; | ||||
| 		}; | ||||
| 		F57C888D02328D7201A85B04 = { | ||||
| 			isa = PBXFileReference; | ||||
| 			path = "irc-channel.c"; | ||||
| 			refType = 4; | ||||
| 		}; | ||||
| 		F57C888E02328D7201A85B04 = { | ||||
| 			isa = PBXFileReference; | ||||
| 			path = "irc-channel.h"; | ||||
| 			refType = 4; | ||||
| 		}; | ||||
| 		F57C888F02328D7201A85B04 = { | ||||
| 			fileRef = F57C888E02328D7201A85B04; | ||||
| 			isa = PBXBuildFile; | ||||
| 			settings = { | ||||
| 			}; | ||||
| 		}; | ||||
| 		F57C889002328D7201A85B04 = { | ||||
| 			fileRef = F57C888D02328D7201A85B04; | ||||
| 			isa = PBXBuildFile; | ||||
| 			settings = { | ||||
| 			}; | ||||
| 		}; | ||||
| 		F5F18132023EC61E01A85B04 = { | ||||
| 			children = ( | ||||
| 				F5F18133023EC63701A85B04, | ||||
| 				F5F18134023EC63701A85B04, | ||||
| 				F5F18135023EC63701A85B04, | ||||
| 				F5F18136023EC63701A85B04, | ||||
| 				F5F18137023EC63701A85B04, | ||||
| 			); | ||||
| 			isa = PBXGroup; | ||||
| 			name = portab; | ||||
| 			path = /Users/alex/Develop/ngircd/src; | ||||
| 			refType = 0; | ||||
| 		}; | ||||
| 		F5F18133023EC63701A85B04 = { | ||||
| 			isa = PBXFileReference; | ||||
| 			name = Makefile.am; | ||||
| 			path = portab/Makefile.am; | ||||
| 			refType = 4; | ||||
| 		}; | ||||
| 		F5F18134023EC63701A85B04 = { | ||||
| 			isa = PBXFileReference; | ||||
| 			name = exp.h; | ||||
| 			path = portab/exp.h; | ||||
| 			refType = 4; | ||||
| 		}; | ||||
| 		F5F18135023EC63701A85B04 = { | ||||
| 			isa = PBXFileReference; | ||||
| 			name = imp.h; | ||||
| 			path = portab/imp.h; | ||||
| 			refType = 4; | ||||
| 		}; | ||||
| 		F5F18136023EC63701A85B04 = { | ||||
| 			isa = PBXFileReference; | ||||
| 			name = portab.h; | ||||
| 			path = portab/portab.h; | ||||
| 			refType = 4; | ||||
| 		}; | ||||
| 		F5F18137023EC63701A85B04 = { | ||||
| 			isa = PBXFileReference; | ||||
| 			name = portabtest.c; | ||||
| 			path = portab/portabtest.c; | ||||
| 			refType = 4; | ||||
| 		}; | ||||
| 		F5F18138023EC63701A85B04 = { | ||||
| 			fileRef = F5F18134023EC63701A85B04; | ||||
| 			isa = PBXBuildFile; | ||||
| 			settings = { | ||||
| 			}; | ||||
| 		}; | ||||
| 		F5F18139023EC63701A85B04 = { | ||||
| 			fileRef = F5F18135023EC63701A85B04; | ||||
| 			isa = PBXBuildFile; | ||||
| 			settings = { | ||||
| 			}; | ||||
| 		}; | ||||
| 		F5F1813A023EC63701A85B04 = { | ||||
| 			fileRef = F5F18136023EC63701A85B04; | ||||
| 			isa = PBXBuildFile; | ||||
| 			settings = { | ||||
| 			}; | ||||
| 		}; | ||||
| 	}; | ||||
| 	rootObject = 08FB7793FE84155DC02AAC07; | ||||
| } | ||||
							
								
								
									
										38
									
								
								Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								Makefile.am
									
									
									
									
									
								
							| @@ -1,28 +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.8 2002/03/25 19:39:48 alex Exp $ | ||||
| # $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 | ||||
|  | ||||
| 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- | ||||
|   | ||||
							
								
								
									
										139
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										139
									
								
								NEWS
									
									
									
									
									
								
							| @@ -1,19 +1,142 @@ | ||||
|  | ||||
|                      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.3.x, ??.??.2002 | ||||
| ngIRCd 0.9.0 (2005-07-24) | ||||
|  | ||||
|   - WHO implementiert (bisher ohne komplette Unerstuetzung von Masks). | ||||
|   - stderr wird nun in eine Datei umgelenkt (/usr/local/var/ngircd.err). | ||||
|   - 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. | ||||
| @@ -85,4 +208,4 @@ ngIRCd 0.0.1, 31.12.2001 | ||||
|  | ||||
|  | ||||
| --  | ||||
| $Id: NEWS,v 1.25 2002/03/29 23:41:23 alex Exp $ | ||||
| $Id: NEWS,v 1.74.2.1 2005/07/24 21:39:45 alex Exp $ | ||||
|   | ||||
							
								
								
									
										117
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										117
									
								
								README
									
									
									
									
									
								
							| @@ -1,68 +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 -- | ||||
|  | ||||
|  | ||||
| I. Einfuehrung | ||||
| ~~~~~~~~~~~~~~ | ||||
| I. Introduction | ||||
| ~~~~~~~~~~~~~~~ | ||||
|  | ||||
| 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. | ||||
|  | ||||
| Zur Zeit befindet sich der ngIRCd noch in Entwicklung, teilweise fehlen noch | ||||
| Features oder sind noch nicht "final" implementiert.  | ||||
|  | ||||
| Channels sind inzwischen implementiert (seit Version 0.1.0), privates Chatten | ||||
| mit /msg und /query funktioniert ebenso. Server-Links werden dabei unter- | ||||
| stuetzt. Einige User- und Channel-Modes sind implementiert, hier kennt der | ||||
| Server jedoch noch nicht alles. | ||||
|  | ||||
| Bisher (mehr oder wenig vollstaendig) implementierte IRC-Befehle: | ||||
|  | ||||
| AWAY, DIE, ERROR, ISON, JOIN, KILL, LINKS, LUSERS, MODE, MOTD, NAMES, NICK, | ||||
| NOTICE, NJOIN, OPER, PART, PASS, PING, PONG, PRIVMSG, QUIT, RESTART, SERVER, | ||||
| SQUIT, TOPIC, USER, USERHOST, VERSION, WHO, 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/>. | ||||
| 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. | ||||
|  | ||||
|  | ||||
| II. Vorteile | ||||
| ~~~~~~~~~~~~ | ||||
| III. Features (or: why use ngIRCd?) | ||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||
|  | ||||
| - keine Probleme mit Servern, deren IP-Adressen nicht statisch sind, | ||||
| - uebersichtliche ("schlanke") Konfigurationsdatei, | ||||
| - frei verfuegbarer, moderner und "aufgeraeumter" C-Quellcode. | ||||
| - ngIRCd wird aktiv weiter entwickelt. | ||||
| - 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. | ||||
|  | ||||
|  | ||||
| III. Unterstuetzte Plattformen | ||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||
| IV. Documentation | ||||
| ~~~~~~~~~~~~~~~~~ | ||||
|  | ||||
| - A/UX | ||||
| - FreeBSD | ||||
| - Linux | ||||
| - Mac OS X | ||||
| - NetBSD | ||||
| - Windows mit Cygwin | ||||
| 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.8 2002/03/21 23:25:15 alex Exp $ | ||||
| $Id: README,v 1.20.2.1 2005/07/09 14:41:39 alex Exp $ | ||||
|   | ||||
							
								
								
									
										189
									
								
								autogen.sh
									
									
									
									
									
								
							
							
						
						
									
										189
									
								
								autogen.sh
									
									
									
									
									
								
							| @@ -1,16 +1,187 @@ | ||||
| #!/bin/sh | ||||
| # | ||||
| # $Id: autogen.sh,v 1.3 2002/03/12 14:37:51 alex Exp $ | ||||
| # 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: 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- | ||||
|   | ||||
							
								
								
									
										821
									
								
								config.guess
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										821
									
								
								config.guess
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										326
									
								
								config.sub
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										326
									
								
								config.sub
									
									
									
									
										vendored
									
									
								
							| @@ -1,9 +1,9 @@ | ||||
| #! /bin/sh | ||||
| # Configuration validation subroutine script. | ||||
| #   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, | ||||
| #   2000, 2001, 2002 Free Software Foundation, Inc. | ||||
| #   2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. | ||||
|  | ||||
| timestamp='2002-03-04' | ||||
| timestamp='2005-07-08' | ||||
|  | ||||
| # This file is (in principle) common to ALL GNU software. | ||||
| # The presence of a machine in this file suggests that SOME GNU software | ||||
| @@ -21,14 +21,15 @@ timestamp='2002-03-04' | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with this program; if not, write to the Free Software | ||||
| # Foundation, Inc., 59 Temple Place - Suite 330, | ||||
| # Boston, MA 02111-1307, USA. | ||||
|  | ||||
| # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA | ||||
| # 02110-1301, USA. | ||||
| # | ||||
| # As a special exception to the GNU General Public License, if you | ||||
| # distribute this file as part of a program that contains a | ||||
| # configuration script generated by Autoconf, you may include it under | ||||
| # the same distribution terms that you use for the rest of that program. | ||||
|  | ||||
|  | ||||
| # Please send patches to <config-patches@gnu.org>.  Submit a context | ||||
| # diff and a properly formatted ChangeLog entry. | ||||
| # | ||||
| @@ -70,7 +71,7 @@ Report bugs and patches to <config-patches@gnu.org>." | ||||
| version="\ | ||||
| GNU config.sub ($timestamp) | ||||
|  | ||||
| Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 | ||||
| Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 | ||||
| Free Software Foundation, Inc. | ||||
|  | ||||
| This is free software; see the source for copying conditions.  There is NO | ||||
| @@ -83,11 +84,11 @@ Try \`$me --help' for more information." | ||||
| while test $# -gt 0 ; do | ||||
|   case $1 in | ||||
|     --time-stamp | --time* | -t ) | ||||
|        echo "$timestamp" ; exit 0 ;; | ||||
|        echo "$timestamp" ; exit ;; | ||||
|     --version | -v ) | ||||
|        echo "$version" ; exit 0 ;; | ||||
|        echo "$version" ; exit ;; | ||||
|     --help | --h* | -h ) | ||||
|        echo "$usage"; exit 0 ;; | ||||
|        echo "$usage"; exit ;; | ||||
|     -- )     # Stop option processing | ||||
|        shift; break ;; | ||||
|     - )	# Use stdin as input. | ||||
| @@ -99,7 +100,7 @@ while test $# -gt 0 ; do | ||||
|     *local*) | ||||
|        # First pass through any local machine types. | ||||
|        echo $1 | ||||
|        exit 0;; | ||||
|        exit ;; | ||||
|  | ||||
|     * ) | ||||
|        break ;; | ||||
| @@ -118,7 +119,8 @@ esac | ||||
| # Here we must recognize all the valid KERNEL-OS combinations. | ||||
| maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` | ||||
| case $maybe_os in | ||||
|   nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-* | rtmk-nova*) | ||||
|   nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ | ||||
|   kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) | ||||
|     os=-$maybe_os | ||||
|     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` | ||||
|     ;; | ||||
| @@ -144,7 +146,7 @@ case $os in | ||||
| 	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ | ||||
| 	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ | ||||
| 	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ | ||||
| 	-apple | -axis) | ||||
| 	-apple | -axis | -knuth | -cray) | ||||
| 		os= | ||||
| 		basic_machine=$1 | ||||
| 		;; | ||||
| @@ -228,34 +230,55 @@ case $basic_machine in | ||||
| 	| a29k \ | ||||
| 	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | ||||
| 	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | ||||
| 	| am33_2.0 \ | ||||
| 	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | ||||
| 	| bfin \ | ||||
| 	| c4x | clipper \ | ||||
| 	| d10v | d30v | dsp16xx \ | ||||
| 	| fr30 \ | ||||
| 	| d10v | d30v | dlx | dsp16xx \ | ||||
| 	| fr30 | frv \ | ||||
| 	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | ||||
| 	| i370 | i860 | i960 | ia64 \ | ||||
| 	| m32r | m68000 | m68k | m88k | mcore \ | ||||
| 	| mips | mips16 | mips64 | mips64el | mips64orion | mips64orionel \ | ||||
| 	| mips64vr4100 | mips64vr4100el | mips64vr4300 \ | ||||
| 	| mips64vr4300el | mips64vr5000 | mips64vr5000el \ | ||||
| 	| mipsbe | mipseb | mipsel | mipsle | mipstx39 | mipstx39el \ | ||||
| 	| mipsisa32 \ | ||||
| 	| ip2k | iq2000 \ | ||||
| 	| m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \ | ||||
| 	| mips | mipsbe | mipseb | mipsel | mipsle \ | ||||
| 	| mips16 \ | ||||
| 	| mips64 | mips64el \ | ||||
| 	| mips64vr | mips64vrel \ | ||||
| 	| mips64orion | mips64orionel \ | ||||
| 	| mips64vr4100 | mips64vr4100el \ | ||||
| 	| mips64vr4300 | mips64vr4300el \ | ||||
| 	| mips64vr5000 | mips64vr5000el \ | ||||
| 	| mips64vr5900 | mips64vr5900el \ | ||||
| 	| mipsisa32 | mipsisa32el \ | ||||
| 	| mipsisa32r2 | mipsisa32r2el \ | ||||
| 	| mipsisa64 | mipsisa64el \ | ||||
| 	| mipsisa64r2 | mipsisa64r2el \ | ||||
| 	| mipsisa64sb1 | mipsisa64sb1el \ | ||||
| 	| mipsisa64sr71k | mipsisa64sr71kel \ | ||||
| 	| mipstx39 | mipstx39el \ | ||||
| 	| mn10200 | mn10300 \ | ||||
| 	| ms1 \ | ||||
| 	| msp430 \ | ||||
| 	| ns16k | ns32k \ | ||||
| 	| openrisc | or32 \ | ||||
| 	| or32 \ | ||||
| 	| pdp10 | pdp11 | pj | pjl \ | ||||
| 	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | ||||
| 	| pyramid \ | ||||
| 	| sh | sh[34] | sh[34]eb | shbe | shle | sh64 \ | ||||
| 	| sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ | ||||
| 	| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | ||||
| 	| sh64 | sh64le \ | ||||
| 	| sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \ | ||||
| 	| sparcv8 | sparcv9 | sparcv9b \ | ||||
| 	| strongarm \ | ||||
| 	| tahoe | thumb | tic80 | tron \ | ||||
| 	| tahoe | thumb | tic4x | tic80 | tron \ | ||||
| 	| v850 | v850e \ | ||||
| 	| we32k \ | ||||
| 	| x86 | xscale | xstormy16 | xtensa \ | ||||
| 	| x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ | ||||
| 	| z8k) | ||||
| 		basic_machine=$basic_machine-unknown | ||||
| 		;; | ||||
| 	m32c) | ||||
| 		basic_machine=$basic_machine-unknown | ||||
| 		;; | ||||
| 	m6811 | m68hc11 | m6812 | m68hc12) | ||||
| 		# Motorola 68HC11/12. | ||||
| 		basic_machine=$basic_machine-unknown | ||||
| @@ -281,41 +304,63 @@ case $basic_machine in | ||||
| 	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | ||||
| 	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | ||||
| 	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | ||||
| 	| arm-*  | armbe-* | armle-* | armv*-* \ | ||||
| 	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \ | ||||
| 	| avr-* \ | ||||
| 	| bs2000-* \ | ||||
| 	| c[123]* | c30-* | [cjt]90-* | c54x-* \ | ||||
| 	| clipper-* | cydra-* \ | ||||
| 	| d10v-* | d30v-* \ | ||||
| 	| bfin-* | bs2000-* \ | ||||
| 	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | ||||
| 	| clipper-* | craynv-* | cydra-* \ | ||||
| 	| d10v-* | d30v-* | dlx-* \ | ||||
| 	| elxsi-* \ | ||||
| 	| f30[01]-* | f700-* | fr30-* | fx80-* \ | ||||
| 	| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | ||||
| 	| h8300-* | h8500-* \ | ||||
| 	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | ||||
| 	| i*86-* | i860-* | i960-* | ia64-* \ | ||||
| 	| m32r-* \ | ||||
| 	| ip2k-* | iq2000-* \ | ||||
| 	| m32r-* | m32rle-* \ | ||||
| 	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | ||||
| 	| m88110-* | m88k-* | mcore-* \ | ||||
| 	| mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \ | ||||
| 	| mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \ | ||||
| 	| mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipseb-* \ | ||||
| 	| mipsle-* | mipsel-* | mipstx39-* | mipstx39el-* \ | ||||
| 	| m88110-* | m88k-* | maxq-* | mcore-* \ | ||||
| 	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | ||||
| 	| mips16-* \ | ||||
| 	| mips64-* | mips64el-* \ | ||||
| 	| mips64vr-* | mips64vrel-* \ | ||||
| 	| mips64orion-* | mips64orionel-* \ | ||||
| 	| mips64vr4100-* | mips64vr4100el-* \ | ||||
| 	| mips64vr4300-* | mips64vr4300el-* \ | ||||
| 	| mips64vr5000-* | mips64vr5000el-* \ | ||||
| 	| mips64vr5900-* | mips64vr5900el-* \ | ||||
| 	| mipsisa32-* | mipsisa32el-* \ | ||||
| 	| mipsisa32r2-* | mipsisa32r2el-* \ | ||||
| 	| mipsisa64-* | mipsisa64el-* \ | ||||
| 	| mipsisa64r2-* | mipsisa64r2el-* \ | ||||
| 	| mipsisa64sb1-* | mipsisa64sb1el-* \ | ||||
| 	| mipsisa64sr71k-* | mipsisa64sr71kel-* \ | ||||
| 	| mipstx39-* | mipstx39el-* \ | ||||
| 	| mmix-* \ | ||||
| 	| ms1-* \ | ||||
| 	| msp430-* \ | ||||
| 	| none-* | np1-* | ns16k-* | ns32k-* \ | ||||
| 	| orion-* \ | ||||
| 	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | ||||
| 	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | ||||
| 	| pyramid-* \ | ||||
| 	| romp-* | rs6000-* \ | ||||
| 	| sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* | sh64-* \ | ||||
| 	| sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ | ||||
| 	| sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ | ||||
| 	| tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \ | ||||
| 	| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \ | ||||
| 	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | ||||
| 	| sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \ | ||||
| 	| sparclite-* \ | ||||
| 	| sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ | ||||
| 	| tahoe-* | thumb-* \ | ||||
| 	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | ||||
| 	| tron-* \ | ||||
| 	| v850-* | v850e-* | vax-* \ | ||||
| 	| we32k-* \ | ||||
| 	| x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ | ||||
| 	| xtensa-* \ | ||||
| 	| x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \ | ||||
| 	| xstormy16-* | xtensa-* \ | ||||
| 	| ymp-* \ | ||||
| 	| z8k-*) | ||||
| 		;; | ||||
| 	m32c-*) | ||||
| 		;; | ||||
| 	# Recognize the various machine names and aliases which stand | ||||
| 	# for a CPU type and a company and sometimes even an OS. | ||||
| 	386bsd) | ||||
| @@ -332,6 +377,9 @@ case $basic_machine in | ||||
| 		basic_machine=a29k-amd | ||||
| 		os=-udi | ||||
| 		;; | ||||
|     	abacus) | ||||
| 		basic_machine=abacus-unknown | ||||
| 		;; | ||||
| 	adobe68k) | ||||
| 		basic_machine=m68010-adobe | ||||
| 		os=-scout | ||||
| @@ -346,6 +394,12 @@ case $basic_machine in | ||||
| 		basic_machine=a29k-none | ||||
| 		os=-bsd | ||||
| 		;; | ||||
| 	amd64) | ||||
| 		basic_machine=x86_64-pc | ||||
| 		;; | ||||
| 	amd64-*) | ||||
| 		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` | ||||
| 		;; | ||||
| 	amdahl) | ||||
| 		basic_machine=580-amdahl | ||||
| 		os=-sysv | ||||
| @@ -405,12 +459,27 @@ case $basic_machine in | ||||
| 		basic_machine=j90-cray | ||||
| 		os=-unicos | ||||
| 		;; | ||||
| 	craynv) | ||||
| 		basic_machine=craynv-cray | ||||
| 		os=-unicosmp | ||||
| 		;; | ||||
| 	cr16c) | ||||
| 		basic_machine=cr16c-unknown | ||||
| 		os=-elf | ||||
| 		;; | ||||
| 	crds | unos) | ||||
| 		basic_machine=m68k-crds | ||||
| 		;; | ||||
| 	crisv32 | crisv32-* | etraxfs*) | ||||
| 		basic_machine=crisv32-axis | ||||
| 		;; | ||||
| 	cris | cris-* | etrax*) | ||||
| 		basic_machine=cris-axis | ||||
| 		;; | ||||
| 	crx) | ||||
| 		basic_machine=crx-unknown | ||||
| 		os=-elf | ||||
| 		;; | ||||
| 	da30 | da30-*) | ||||
| 		basic_machine=m68k-da30 | ||||
| 		;; | ||||
| @@ -433,6 +502,10 @@ case $basic_machine in | ||||
| 		basic_machine=m88k-motorola | ||||
| 		os=-sysv3 | ||||
| 		;; | ||||
| 	djgpp) | ||||
| 		basic_machine=i586-pc | ||||
| 		os=-msdosdjgpp | ||||
| 		;; | ||||
| 	dpx20 | dpx20-*) | ||||
| 		basic_machine=rs6000-bull | ||||
| 		os=-bosx | ||||
| @@ -611,10 +684,6 @@ case $basic_machine in | ||||
| 	mips3*) | ||||
| 		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown | ||||
| 		;; | ||||
| 	mmix*) | ||||
| 		basic_machine=mmix-knuth | ||||
| 		os=-mmixware | ||||
| 		;; | ||||
| 	monitor) | ||||
| 		basic_machine=m68k-rom68k | ||||
| 		os=-coff | ||||
| @@ -702,9 +771,12 @@ case $basic_machine in | ||||
| 		basic_machine=hppa1.1-oki | ||||
| 		os=-proelf | ||||
| 		;; | ||||
| 	or32 | or32-*) | ||||
| 	openrisc | openrisc-*) | ||||
| 		basic_machine=or32-unknown | ||||
| 		os=-coff | ||||
| 		;; | ||||
| 	os400) | ||||
| 		basic_machine=powerpc-ibm | ||||
| 		os=-os400 | ||||
| 		;; | ||||
| 	OSE68000 | ose68000) | ||||
| 		basic_machine=m68000-ericsson | ||||
| @@ -728,49 +800,55 @@ case $basic_machine in | ||||
| 	pbb) | ||||
| 		basic_machine=m68k-tti | ||||
| 		;; | ||||
|         pc532 | pc532-*) | ||||
| 	pc532 | pc532-*) | ||||
| 		basic_machine=ns32k-pc532 | ||||
| 		;; | ||||
| 	pentium | p5 | k5 | k6 | nexgen | viac3) | ||||
| 		basic_machine=i586-pc | ||||
| 		;; | ||||
| 	pentiumpro | p6 | 6x86 | athlon) | ||||
| 	pentiumpro | p6 | 6x86 | athlon | athlon_*) | ||||
| 		basic_machine=i686-pc | ||||
| 		;; | ||||
| 	pentiumii | pentium2) | ||||
| 	pentiumii | pentium2 | pentiumiii | pentium3) | ||||
| 		basic_machine=i686-pc | ||||
| 		;; | ||||
| 	pentium4) | ||||
| 		basic_machine=i786-pc | ||||
| 		;; | ||||
| 	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) | ||||
| 		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` | ||||
| 		;; | ||||
| 	pentiumpro-* | p6-* | 6x86-* | athlon-*) | ||||
| 		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` | ||||
| 		;; | ||||
| 	pentiumii-* | pentium2-*) | ||||
| 	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) | ||||
| 		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` | ||||
| 		;; | ||||
| 	pentium4-*) | ||||
| 		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` | ||||
| 		;; | ||||
| 	pn) | ||||
| 		basic_machine=pn-gould | ||||
| 		;; | ||||
| 	power)	basic_machine=power-ibm | ||||
| 		;; | ||||
| 	ppc)	basic_machine=powerpc-unknown | ||||
| 	        ;; | ||||
| 		;; | ||||
| 	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` | ||||
| 		;; | ||||
| 	ppcle | powerpclittle | ppc-le | powerpc-little) | ||||
| 		basic_machine=powerpcle-unknown | ||||
| 	        ;; | ||||
| 		;; | ||||
| 	ppcle-* | powerpclittle-*) | ||||
| 		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` | ||||
| 		;; | ||||
| 	ppc64)	basic_machine=powerpc64-unknown | ||||
| 	        ;; | ||||
| 		;; | ||||
| 	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` | ||||
| 		;; | ||||
| 	ppc64le | powerpc64little | ppc64-le | powerpc64-little) | ||||
| 		basic_machine=powerpc64le-unknown | ||||
| 	        ;; | ||||
| 		;; | ||||
| 	ppc64le-* | powerpc64little-*) | ||||
| 		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` | ||||
| 		;; | ||||
| @@ -801,6 +879,16 @@ case $basic_machine in | ||||
| 		basic_machine=a29k-amd | ||||
| 		os=-udi | ||||
| 		;; | ||||
| 	sb1) | ||||
| 		basic_machine=mipsisa64sb1-unknown | ||||
| 		;; | ||||
| 	sb1el) | ||||
| 		basic_machine=mipsisa64sb1el-unknown | ||||
| 		;; | ||||
| 	sei) | ||||
| 		basic_machine=mips-sei | ||||
| 		os=-seiux | ||||
| 		;; | ||||
| 	sequent) | ||||
| 		basic_machine=i386-sequent | ||||
| 		;; | ||||
| @@ -808,6 +896,9 @@ case $basic_machine in | ||||
| 		basic_machine=sh-hitachi | ||||
| 		os=-hms | ||||
| 		;; | ||||
| 	sh64) | ||||
| 		basic_machine=sh64-unknown | ||||
| 		;; | ||||
| 	sparclite-wrs | simso-wrs) | ||||
| 		basic_machine=sparclite-wrs | ||||
| 		os=-vxworks | ||||
| @@ -866,7 +957,7 @@ case $basic_machine in | ||||
| 	sun386 | sun386i | roadrunner) | ||||
| 		basic_machine=i386-sun | ||||
| 		;; | ||||
|         sv1) | ||||
| 	sv1) | ||||
| 		basic_machine=sv1-cray | ||||
| 		os=-unicos | ||||
| 		;; | ||||
| @@ -874,10 +965,6 @@ case $basic_machine in | ||||
| 		basic_machine=i386-sequent | ||||
| 		os=-dynix | ||||
| 		;; | ||||
| 	t3d) | ||||
| 		basic_machine=alpha-cray | ||||
| 		os=-unicos | ||||
| 		;; | ||||
| 	t3e) | ||||
| 		basic_machine=alphaev5-cray | ||||
| 		os=-unicos | ||||
| @@ -890,6 +977,14 @@ case $basic_machine in | ||||
| 		basic_machine=tic54x-unknown | ||||
| 		os=-coff | ||||
| 		;; | ||||
| 	tic55x | c55x*) | ||||
| 		basic_machine=tic55x-unknown | ||||
| 		os=-coff | ||||
| 		;; | ||||
| 	tic6x | c6x*) | ||||
| 		basic_machine=tic6x-unknown | ||||
| 		os=-coff | ||||
| 		;; | ||||
| 	tx39) | ||||
| 		basic_machine=mipstx39-unknown | ||||
| 		;; | ||||
| @@ -903,6 +998,10 @@ case $basic_machine in | ||||
| 	tower | tower-32) | ||||
| 		basic_machine=m68k-ncr | ||||
| 		;; | ||||
| 	tpf) | ||||
| 		basic_machine=s390x-ibm | ||||
| 		os=-tpf | ||||
| 		;; | ||||
| 	udi29k) | ||||
| 		basic_machine=a29k-amd | ||||
| 		os=-udi | ||||
| @@ -924,8 +1023,8 @@ case $basic_machine in | ||||
| 		os=-vms | ||||
| 		;; | ||||
| 	vpp*|vx|vx-*) | ||||
|                basic_machine=f301-fujitsu | ||||
|                ;; | ||||
| 		basic_machine=f301-fujitsu | ||||
| 		;; | ||||
| 	vxworks960) | ||||
| 		basic_machine=i960-wrs | ||||
| 		os=-vxworks | ||||
| @@ -946,11 +1045,11 @@ case $basic_machine in | ||||
| 		basic_machine=hppa1.1-winbond | ||||
| 		os=-proelf | ||||
| 		;; | ||||
| 	windows32) | ||||
| 		basic_machine=i386-pc | ||||
| 		os=-windows32-msvcrt | ||||
| 	xbox) | ||||
| 		basic_machine=i686-pc | ||||
| 		os=-mingw32 | ||||
| 		;; | ||||
|         xps | xps100) | ||||
| 	xps | xps100) | ||||
| 		basic_machine=xps100-honeywell | ||||
| 		;; | ||||
| 	ymp) | ||||
| @@ -980,6 +1079,9 @@ case $basic_machine in | ||||
| 	romp) | ||||
| 		basic_machine=romp-ibm | ||||
| 		;; | ||||
| 	mmix) | ||||
| 		basic_machine=mmix-knuth | ||||
| 		;; | ||||
| 	rs6000) | ||||
| 		basic_machine=rs6000-ibm | ||||
| 		;; | ||||
| @@ -996,16 +1098,13 @@ case $basic_machine in | ||||
| 	we32k) | ||||
| 		basic_machine=we32k-att | ||||
| 		;; | ||||
| 	sh3 | sh4 | sh3eb | sh4eb) | ||||
| 	sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) | ||||
| 		basic_machine=sh-unknown | ||||
| 		;; | ||||
| 	sh64) | ||||
| 		basic_machine=sh64-unknown | ||||
| 		;; | ||||
| 	sparc | sparcv9 | sparcv9b) | ||||
| 	sparc | sparcv8 | sparcv9 | sparcv9b) | ||||
| 		basic_machine=sparc-sun | ||||
| 		;; | ||||
|         cydra) | ||||
| 	cydra) | ||||
| 		basic_machine=cydra-cydrome | ||||
| 		;; | ||||
| 	orion) | ||||
| @@ -1020,10 +1119,6 @@ case $basic_machine in | ||||
| 	pmac | pmac-mpw) | ||||
| 		basic_machine=powerpc-apple | ||||
| 		;; | ||||
| 	c4x*) | ||||
| 		basic_machine=c4x-none | ||||
| 		os=-coff | ||||
| 		;; | ||||
| 	*-unknown) | ||||
| 		# Make sure to match an already-canonicalized machine name. | ||||
| 		;; | ||||
| @@ -1079,18 +1174,21 @@ case $os in | ||||
| 	      | -aos* \ | ||||
| 	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | ||||
| 	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | ||||
| 	      | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ | ||||
| 	      | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | ||||
| 	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ | ||||
| 	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | ||||
| 	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | ||||
| 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | ||||
| 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | ||||
| 	      | -chorusos* | -chorusrdb* \ | ||||
| 	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | ||||
| 	      | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ | ||||
| 	      | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ | ||||
| 	      | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ | ||||
| 	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | ||||
| 	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | ||||
| 	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | ||||
| 	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | ||||
| 	      | -morphos* | -superux* | -rtmk* | -rtmk-nova*) | ||||
| 	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | ||||
| 	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | ||||
| 	      | -skyos* | -haiku*) | ||||
| 	# Remember, each alternative MUST END IN *, to match a version number. | ||||
| 		;; | ||||
| 	-qnx*) | ||||
| @@ -1102,16 +1200,21 @@ case $os in | ||||
| 			;; | ||||
| 		esac | ||||
| 		;; | ||||
| 	-nto-qnx*) | ||||
| 		;; | ||||
| 	-nto*) | ||||
| 		os=-nto-qnx | ||||
| 		os=`echo $os | sed -e 's|nto|nto-qnx|'` | ||||
| 		;; | ||||
| 	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | ||||
| 	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ | ||||
| 	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | ||||
| 	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) | ||||
| 		;; | ||||
| 	-mac*) | ||||
| 		os=`echo $os | sed -e 's|mac|macos|'` | ||||
| 		;; | ||||
| 	-linux-dietlibc) | ||||
| 		os=-linux-dietlibc | ||||
| 		;; | ||||
| 	-linux*) | ||||
| 		os=`echo $os | sed -e 's|linux|linux-gnu|'` | ||||
| 		;; | ||||
| @@ -1124,6 +1227,9 @@ case $os in | ||||
| 	-opened*) | ||||
| 		os=-openedition | ||||
| 		;; | ||||
|         -os400*) | ||||
| 		os=-os400 | ||||
| 		;; | ||||
| 	-wince*) | ||||
| 		os=-wince | ||||
| 		;; | ||||
| @@ -1145,6 +1251,9 @@ case $os in | ||||
| 	-atheos*) | ||||
| 		os=-atheos | ||||
| 		;; | ||||
| 	-syllable*) | ||||
| 		os=-syllable | ||||
| 		;; | ||||
| 	-386bsd) | ||||
| 		os=-bsd | ||||
| 		;; | ||||
| @@ -1155,7 +1264,7 @@ case $os in | ||||
| 		os=-rtmk-nova | ||||
| 		;; | ||||
| 	-ns2 ) | ||||
| 	        os=-nextstep2 | ||||
| 		os=-nextstep2 | ||||
| 		;; | ||||
| 	-nsk*) | ||||
| 		os=-nsk | ||||
| @@ -1167,6 +1276,9 @@ case $os in | ||||
| 	-sinix*) | ||||
| 		os=-sysv4 | ||||
| 		;; | ||||
|         -tpf*) | ||||
| 		os=-tpf | ||||
| 		;; | ||||
| 	-triton*) | ||||
| 		os=-sysv3 | ||||
| 		;; | ||||
| @@ -1194,8 +1306,17 @@ case $os in | ||||
| 	-xenix) | ||||
| 		os=-xenix | ||||
| 		;; | ||||
|         -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) | ||||
| 	        os=-mint | ||||
| 	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) | ||||
| 		os=-mint | ||||
| 		;; | ||||
| 	-aros*) | ||||
| 		os=-aros | ||||
| 		;; | ||||
| 	-kaos*) | ||||
| 		os=-kaos | ||||
| 		;; | ||||
| 	-zvmoe) | ||||
| 		os=-zvmoe | ||||
| 		;; | ||||
| 	-none) | ||||
| 		;; | ||||
| @@ -1228,11 +1349,14 @@ case $basic_machine in | ||||
| 	arm*-semi) | ||||
| 		os=-aout | ||||
| 		;; | ||||
|     c4x-* | tic4x-*) | ||||
|         os=-coff | ||||
|         ;; | ||||
| 	# This must come before the *-dec entry. | ||||
| 	pdp10-*) | ||||
| 		os=-tops20 | ||||
| 		;; | ||||
|         pdp11-*) | ||||
| 	pdp11-*) | ||||
| 		os=-none | ||||
| 		;; | ||||
| 	*-dec | vax-*) | ||||
| @@ -1271,9 +1395,15 @@ case $basic_machine in | ||||
| 	*-be) | ||||
| 		os=-beos | ||||
| 		;; | ||||
| 	*-haiku) | ||||
| 		os=-haiku | ||||
| 		;; | ||||
| 	*-ibm) | ||||
| 		os=-aix | ||||
| 		;; | ||||
|     	*-knuth) | ||||
| 		os=-mmixware | ||||
| 		;; | ||||
| 	*-wec) | ||||
| 		os=-proelf | ||||
| 		;; | ||||
| @@ -1325,19 +1455,19 @@ case $basic_machine in | ||||
| 	*-next) | ||||
| 		os=-nextstep3 | ||||
| 		;; | ||||
|         *-gould) | ||||
| 	*-gould) | ||||
| 		os=-sysv | ||||
| 		;; | ||||
|         *-highlevel) | ||||
| 	*-highlevel) | ||||
| 		os=-bsd | ||||
| 		;; | ||||
| 	*-encore) | ||||
| 		os=-bsd | ||||
| 		;; | ||||
|         *-sgi) | ||||
| 	*-sgi) | ||||
| 		os=-irix | ||||
| 		;; | ||||
|         *-siemens) | ||||
| 	*-siemens) | ||||
| 		os=-sysv4 | ||||
| 		;; | ||||
| 	*-masscomp) | ||||
| @@ -1406,10 +1536,16 @@ case $basic_machine in | ||||
| 			-mvs* | -opened*) | ||||
| 				vendor=ibm | ||||
| 				;; | ||||
| 			-os400*) | ||||
| 				vendor=ibm | ||||
| 				;; | ||||
| 			-ptx*) | ||||
| 				vendor=sequent | ||||
| 				;; | ||||
| 			-vxsim* | -vxworks*) | ||||
| 			-tpf*) | ||||
| 				vendor=ibm | ||||
| 				;; | ||||
| 			-vxsim* | -vxworks* | -windiss*) | ||||
| 				vendor=wrs | ||||
| 				;; | ||||
| 			-aux*) | ||||
| @@ -1433,7 +1569,7 @@ case $basic_machine in | ||||
| esac | ||||
|  | ||||
| echo $basic_machine$os | ||||
| exit 0 | ||||
| exit | ||||
|  | ||||
| # Local variables: | ||||
| # eval: (add-hook 'write-file-hooks 'time-stamp) | ||||
|   | ||||
							
								
								
									
										395
									
								
								configure.in
									
									
									
									
									
								
							
							
						
						
									
										395
									
								
								configure.in
									
									
									
									
									
								
							| @@ -1,32 +1,37 @@ | ||||
| # | ||||
| # 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.39 2002/03/30 18:02:39 alex Exp $ | ||||
| # $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) | ||||
| AC_CANONICAL_TARGET | ||||
| AC_CONFIG_SRCDIR(src/config.h.in) | ||||
| AM_INIT_AUTOMAKE(ngircd,0.3.0-CVS) | ||||
| AM_INIT_AUTOMAKE(1.6) | ||||
| AM_CONFIG_HEADER(src/config.h) | ||||
|  | ||||
| # -- Templates fuer 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([USE_SYSLOG], [Define if syslog should be used for logging]) | ||||
| 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]) | ||||
| @@ -35,9 +40,8 @@ AH_TEMPLATE([TARGET_CPU], [Target CPU name]) | ||||
| # -- C Compiler -- | ||||
|  | ||||
| AC_PROG_CC | ||||
| AC_LANG_C | ||||
|  | ||||
| # -- Hilfsprogramme -- | ||||
| # -- Helper programs -- | ||||
|  | ||||
| AC_PROG_AWK | ||||
| AC_PROG_INSTALL | ||||
| @@ -45,25 +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_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; | ||||
| @@ -73,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 | ||||
| ) | ||||
|  | ||||
| @@ -137,39 +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 | ||||
|  | ||||
| # -- Definitionen -- | ||||
| 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 | ||||
| ) | ||||
|  | ||||
| # -- Definitions -- | ||||
|  | ||||
| AC_DEFINE_UNQUOTED(TARGET_CPU, "$target_cpu" ) | ||||
| AC_DEFINE_UNQUOTED(TARGET_VENDOR, "$target_vendor" ) | ||||
| AC_DEFINE_UNQUOTED(TARGET_OS, "$target_os" ) | ||||
|  | ||||
| # -- Variablen -- | ||||
| # 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" | ||||
|  | ||||
| if test "$GCC" = "yes"; then | ||||
| 	CFLAGS="-Wall $CFLAGS" | ||||
| fi | ||||
|  | ||||
| CFLAGS="$CFLAGS -DSYSCONFDIR='\"\$(sysconfdir)\"'" | ||||
|  | ||||
| if test `uname` = "A/UX"; then | ||||
| 	# unter A/UX sollte _POSIX_SOURCE definiert sein. | ||||
| 	AC_MSG_RESULT([detected A/UX, defining _POSIX_SOURCE]) | ||||
| 	CFLAGS="$CFLAGS -D_POSIX_SOURCE" | ||||
| fi | ||||
|  | ||||
| # -- Ausgabe -- | ||||
| # -- 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) unstable; urgency=low | ||||
|  | ||||
|   * New "upstream release" fixing a few bugs in 0.9.1. | ||||
|  | ||||
|  -- Alexander Barton <alex@barton.de>  Sat, 15 Oct 2005 14:10:34 +0200 | ||||
|  | ||||
| ngircd (0.9.1-0ab1) unstable; urgency=medium | ||||
|  | ||||
|   * New "upstream release" addressing two problems in ngIRCd 0.9.0. | ||||
|  | ||||
|  -- Alexander Barton <alex@barton.de>  Wed,  3 Aug 2005 15:10:41 +0200 | ||||
|  | ||||
| ngircd (0.9.0-0ab2) unstable; urgency=medium | ||||
|  | ||||
|   * Init script: fixed a problem with symbolic links in runlevel directories | ||||
|     that could prevent the init script from working correctly. | ||||
|  | ||||
|  -- Alexander Barton <alex@barton.de>  Tue, 26 Jul 2005 21:31:18 +0200 | ||||
|  | ||||
| ngircd (0.9.0-0ab1) unstable; urgency=low | ||||
|  | ||||
|   * New "upstream release". | ||||
|  | ||||
|  -- Alexander Barton <alex@Arthur.Ath.CX>  Sat,  24 Jul 2005 23:30:00 +0200 | ||||
|  | ||||
| ngircd (0.8.3-0ab1) unstable; urgency=high | ||||
|  | ||||
|   * New "upstream release", including security fixes. | ||||
|  | ||||
|  -- Alexander Barton <alex@Arthur.Ath.CX>  Thu,  3 Feb 2005 10:41:55 +0100 | ||||
|  | ||||
| ngircd (0.8.2-0ab1) unstable; urgency=high | ||||
|  | ||||
|   * New "upstream release", including security fixes. | ||||
|  | ||||
|  -- Alexander Barton <alex@Arthur.Ath.CX>  Wed, 26 Jan 2005 23:14:12 +0100 | ||||
|  | ||||
| ngircd (0.8.1-0ab1) unstable; urgency=low | ||||
|  | ||||
|   * New "upstream release". | ||||
|  | ||||
|  -- Alexander Barton <alex@Arthur.Ath.CX>  Sat, 25 Dec 2004 01:18:32 +0100 | ||||
|  | ||||
| ngircd (0.8.0-0ab2) unstable; urgency=low | ||||
|  | ||||
|   * Added missing commas to debian control file, fixes bug #56. | ||||
|     Thanks to Kevin Otte. | ||||
|  | ||||
|  -- Alexander Barton <alex@Arthur.Ath.CX>  Thu, 15 Jul 2004 10:53:39 +0200 | ||||
|  | ||||
| ngircd (0.8.0-0ab1) unstable; urgency=low | ||||
|  | ||||
|   * New upstream version. | ||||
|  | ||||
|  -- Alexander Barton <alex@Arthur.Ath.CX>  Sat, 26 Jun 2004 11:25:59 +0200 | ||||
|  | ||||
| ngircd (0.7.7+HEAD-0ab6) unstable; urgency=low | ||||
|  | ||||
|   * Incorporated actual CVS HEAD version which includes all features of | ||||
|     version 0.8.0-pre1 and patches for the resolver and logger. | ||||
|  | ||||
|  -- Alexander Barton <alex@Arthur.Ath.CX>  Tue, 11 May 2004 02:18:50 +0200 | ||||
|  | ||||
| ngircd (0.7.7+HEAD-0ab5) unstable; urgency=low | ||||
|  | ||||
|   * Updates from CVS HEAD branch, most notably: "INVITE- and BAN-lists | ||||
|     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
											
										
									
								
							| @@ -1,6 +1,6 @@ | ||||
| #
 | ||||
| # 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
 | ||||
| @@ -9,10 +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.3 2002/03/12 14:37:51 alex Exp $
 | ||||
| # $Id: Makefile.am,v 1.4 2004/04/28 12:18:02 alex Exp $
 | ||||
| #
 | ||||
| 
 | ||||
| EXTRA_DIST = project.pbxproj | ||||
| SUBDIRS = Debian MacOSX | ||||
| 
 | ||||
| EXTRA_DIST = README ngircd.spec systrace.policy | ||||
| 
 | ||||
| maintainer-clean-local: | ||||
| 	rm -f Makefile Makefile.in | ||||
							
								
								
									
										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,19 +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.7 2002/03/30 15:33:14 alex Exp $ | ||||
| # $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 | ||||
| 	 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,108 +1,181 @@ | ||||
| # $Id: sample-ngircd.conf,v 1.8 2002/03/30 13:03:12 alex Exp $ | ||||
| # $Id: sample-ngircd.conf,v 1.33 2005/03/15 16:58:01 alex Exp $ | ||||
|  | ||||
| # | ||||
| # Das ist eine Beispiel-Konfiguration fuer den ngIRCd, die an die | ||||
| # jeweiligen Beduerfnisse angepasst werden kann/muss. | ||||
| # This is a sample configuration file for the ngIRCd, which must be adepted | ||||
| # to the local preferences and needs. | ||||
| # | ||||
| # Kommentare werden mit "#" oder ";" eingeleitet. | ||||
| # 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] | ||||
|  | ||||
| 	# | ||||
| 	# Im [Global]-Abschnitt der Konfigurationsdatei wird der Server | ||||
| 	# "an sich" konfiguriert. Notwendig ist nur die Variable "Name", | ||||
| 	# Info ist in der Regel ebengalls anzupassen. Fuer alle uebrigen | ||||
| 	# Variablen koennen oft die Defaults benutzt werden. | ||||
| 	# | ||||
|  | ||||
| 	# Servername im IRC-Netz | ||||
| 	# 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 des Servers | ||||
| 	 | ||||
| 	# Info text of the server. This will be shown by WHOIS and | ||||
| 	# LINKS requests for example. | ||||
| 	Info = Server Info Text | ||||
|  | ||||
| 	# Ports, auf denen Verbindungen angenommen werden sollen. Es koennen | ||||
| 	# mehrere Ports mit "," getrennt angegeben werden. (Default: 6667) | ||||
| 	# 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 | ||||
|  | ||||
| 	# Textdatei mit der "Message of the Day" (MOTD) | ||||
| 	# 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 | ||||
|  | ||||
| 	# User-ID, unter der der Daemon laufen soll (dazu muss der Server | ||||
| 	# jedoch mit root-Rechten gestartet werden). | ||||
| 	# ACHTUNG: Die Konfigurations- und MOTD-Datei muessen fuer diesen | ||||
| 	# Benutzer lesbar sein, ansonsten schlaegt ein RESTART fehl! | ||||
| 	# 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, zu der der Daemon wechseln soll (hierzu muss der Server | ||||
| 	# jedoch mit root-Rechten gestartet werden) | ||||
| 	# 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 | ||||
|  | ||||
| 	# Nach <PingTimeout> Sekunden verschickt der Server bei Inaktivitaet | ||||
| 	# von einem Client diesem ein PING. | ||||
| 	# 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 | ||||
|  | ||||
| 	# Antwortet ein Client, der ein PING bekam, nicht innerhalb von | ||||
| 	# <PongTimeout> Sekunden mit einem PONG, so wird er disconnectiert. | ||||
| 	# If a client fails to answer a PING with a PONG within <PongTimeout> | ||||
| 	# seconds, it will be disconnected by the server. | ||||
| 	;PongTimeout = 20 | ||||
|  | ||||
| 	# Der Server versucht alle <ConnectRetry> Sekunden, noch nicht bzw. | ||||
| 	# nicht mehr connectierte Server-Links aufzubauen. | ||||
| 	# 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] | ||||
|  | ||||
| 	# | ||||
| 	# Mit einem [Operator]-Block wird der Name und das Passwort eines | ||||
| 	# IRC-Operators konfiguriert. Es darf mehrere [Operator]-Bloecke | ||||
| 	# geben (fuer jeden Operator einen). | ||||
| 	# | ||||
|  | ||||
| 	# ID des IRC-Operators (muss nicht mit dem Nick identisch sein). | ||||
| 	# [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 | ||||
|  | ||||
| 	# Passwort des IRC-Operators | ||||
| 	# Password of the IRC operator | ||||
| 	;Password = ThePwd | ||||
|  | ||||
| 	# Optional Mask from which /OPER will be accepted | ||||
| 	;Mask = *!ident@somewhere.example.com | ||||
|  | ||||
| [Operator] | ||||
| 	# More [Operator] sections, if you like ... | ||||
|  | ||||
| [Server] | ||||
|  | ||||
| 	# Other servers are configured in [Server] sections. If you | ||||
| 	# configure a port for the connection, then this ngircd tries to | ||||
| 	# connect to to the other server on the given port; if not it waits | ||||
| 	# for the other server to connect. | ||||
| 	# There may be more than one server block. | ||||
| 	# | ||||
| 	# In [Server]-Bloecken werden Server konfiguriert, zu denen dieser | ||||
| 	# Server sich verbinden soll bzw. von denen Verbindungen angekommen | ||||
| 	# werden duerfen. | ||||
| 	# Es koennen mehrere Server konfiguriert werden, d.h. [Server]- | ||||
| 	# Bloecke koennen mehrfach vorkommen. | ||||
| 	# Ist fuer einen Server ein Port konfiguriert, so versucht dieser | ||||
| 	# Server die Gegenseite zu connectieren. Ist kein Port vorgegeben, | ||||
| 	# so wartet dieser Server auf eine Verbindung der Gegenseite. | ||||
| 	# | ||||
| 	# Server-Gruppen: | ||||
| 	# Fuer jeden Server kann (optinal!) eine Gruppe konfiguriert werden, | ||||
| 	# zu der er gehoert (wird nur beachtet, wenn ein Port konfiguriert | ||||
| 	# ist!): eine solche Server-Gruppe wird quasi als ein Server ange- | ||||
| 	# sehen, der ngIRCd baut also nur eine Verbindung auf. Schlaegt die | ||||
| 	# Verbindung zu einem Server in einer Gruppe fehl, so wird der | ||||
| 	# naechste Server in der Gruppe probiert. | ||||
| 	# | ||||
|  | ||||
| 	# Hostname des Servers | ||||
| 	# 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 | ||||
|  | ||||
| 	# IRC-Name des Servers | ||||
| 	;Name = irc2.the.net | ||||
|  | ||||
| 	# Port, zu dem dieser Server eine Verbindung herstellen soll. Wird | ||||
| 	# kein Port angegeben, so wird auf eine Verbindung der Gegenseite | ||||
| 	# gewartet. | ||||
| 	# Port of the server to which the ngIRCd should connect. If you | ||||
| 	# assign no port the ngIRCd waits for incoming connections. | ||||
| 	;Port = 6666 | ||||
|  | ||||
| 	# Passwort fuer diese Verbindung | ||||
| 	;Password = ThePwd1 | ||||
| 	# Own password for the connection. This password has to be configured | ||||
| 	# as "PeerPassword" on the other server. | ||||
| 	;MyPassword = MySecret | ||||
|  | ||||
| 	# Gruppe, zu der dieser Server gehoert (optional). | ||||
| 	# 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] | ||||
| 	# 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,13 +9,14 @@ | ||||
| # 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/03/12 14:37:51 alex Exp $
 | ||||
| # $Id: Makefile.am,v 1.5 2002/04/04 13:02:41 alex Exp $
 | ||||
| #
 | ||||
| 
 | ||||
| SUBDIRS = ngircd.pbproj | ||||
| man_MANS = ngircd.conf.5 ngircd.8 | ||||
| 
 | ||||
| EXTRA_DIST = $(man_MANS) | ||||
| 
 | ||||
| maintainer-clean-local: | ||||
| 	rm -f Makefile Makefile.in | ||||
| 	rm -rf build | ||||
| 
 | ||||
| # -eof-
 | ||||
							
								
								
									
										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,19 +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.3 2002/03/12 14:37:51 alex Exp $ | ||||
| # $Id: Makefile.am,v 1.6 2005/04/09 12:22:41 alex Exp $ | ||||
| # | ||||
|  | ||||
| SUBDIRS = portab 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,41 +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.19 2002/03/29 22:52:12 alex Exp $ | ||||
| # $Id: Makefile.am,v 1.46 2005/05/23 00:11:15 alex Exp $ | ||||
| # | ||||
|  | ||||
| AM_CFLAGS = -I$(srcdir)/../portab | ||||
| AUTOMAKE_OPTIONS = ../portab/ansi2knr | ||||
|  | ||||
| LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN | ||||
| 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 hash.c irc.c \ | ||||
| 	irc-channel.c irc-login.c irc-mode.c irc-oper.c irc-server.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 hash.h irc.h \ | ||||
| 	irc-channel.h irc-login.h irc-mode.h irc-oper.h irc-server.h \ | ||||
| 	irc-write.h log.h parse.h tool.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 lint.out | ||||
| 	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 | ||||
| @@ -44,15 +52,47 @@ check-help: Makefile | ||||
| 	chmod 755 check-help | ||||
|  | ||||
| lint: | ||||
| 	rm -f lint.out | ||||
| 	@splint --version >/dev/null 2>&1 \ | ||||
| 	 || ( echo; echo "Error: \"splint\" not found!"; echo; exit 1 ) | ||||
| 	@echo; warnings=0; files=0; \ | ||||
| 	for f in *.c; do \ | ||||
| 	 echo "checking $$f ..."; \ | ||||
| 	 splint $$f $(LINTARGS) -I./.. $(AM_CFLAGS) > lint.out 2>&1; \ | ||||
| 	 splint $$f $(LINTARGS) -I$(srcdir) -I$(srcdir)/.. \ | ||||
| 	  $(INCLUDES) $(AM_CFLAGS) >lint.out 2>&1; \ | ||||
| 	 grep "no warnings" lint.out > /dev/null 2>&1; \ | ||||
| 	 if [ $$? -ne 0 ]; then \ | ||||
| 	  echo; cat lint.out; echo; \ | ||||
| 	  waswarning=1; \ | ||||
| 	  echo; grep -v "^Command Line: " lint.out; echo; \ | ||||
| 	  w=$$( grep "code warning" lint.out | awk "{ print \$$4 }" ); \ | ||||
| 	  [ "$$w" -gt 0 ] && warnings=`expr $$warnings + $$w`; \ | ||||
| 	  files=`expr $$files + 1`; \ | ||||
| 	 else \ | ||||
| 	  waswarning=0; \ | ||||
| 	 fi; \ | ||||
| 	done; | ||||
| 	 rm -f lint.out; \ | ||||
| 	done; \ | ||||
| 	[ $$waswarning -eq 0 ] && echo; \ | ||||
| 	[ $$warnings -gt 0 ] \ | ||||
| 	 && echo "Result: $$warnings warning(s) in $$files file(s)!" \ | ||||
| 	 || echo "Result: no warnings found."; \ | ||||
| 	echo; [ $$warnings -gt 0 ] && exit 1 | ||||
|  | ||||
| ngircd.c: cvs-version.h | ||||
|  | ||||
| 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 | ||||
|  | ||||
|   | ||||
| @@ -1,17 +1,14 @@ | ||||
| /* | ||||
|  * 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.20 2002/03/25 16:54:26 alex Exp $ | ||||
|  * | ||||
|  * channel.c: Management der Channels | ||||
|  * Channel management | ||||
|  */ | ||||
|  | ||||
|  | ||||
| @@ -20,42 +17,104 @@ | ||||
|  | ||||
| #include "portab.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 "hash.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" | ||||
|  | ||||
|  | ||||
| #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; | ||||
| @@ -80,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; | ||||
| 	 | ||||
| @@ -91,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 */ | ||||
| @@ -99,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 ) | ||||
| 	{ | ||||
| @@ -171,34 +276,113 @@ 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 */ | ||||
| 	 | ||||
| @@ -222,14 +406,16 @@ GLOBAL CHANNEL *Channel_Search( CHAR *Name ) | ||||
| } /* 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 ); | ||||
| @@ -237,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 ); | ||||
| @@ -252,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 ); | ||||
| @@ -351,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 ); | ||||
| @@ -377,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; | ||||
|  | ||||
| @@ -405,90 +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 - 1 ); | ||||
| 	Chan->topic[CHANNEL_TOPIC_LEN - 1] = '\0'; | ||||
| 	strlcpy( Chan->topic, Topic, sizeof( Chan->topic )); | ||||
| } /* Channel_SetTopic */ | ||||
|  | ||||
|  | ||||
| GLOBAL BOOLEAN Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR *Text ) | ||||
| GLOBAL void | ||||
| Channel_SetModes( CHANNEL *Chan, char *Modes ) | ||||
| { | ||||
| 	BOOLEAN is_member, has_voice, is_op, ok; | ||||
| 	assert( Chan != NULL ); | ||||
| 	assert( Modes != NULL ); | ||||
|  | ||||
| 	/* Okay, Ziel ist ein Channel */ | ||||
| 	is_member = has_voice = is_op = FALSE; | ||||
| 	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_member = true; | ||||
| 		if( strchr( Channel_UserModes( Chan, From ), 'v' )) has_voice = true; | ||||
| 		if( strchr( Channel_UserModes( Chan, From ), 'o' )) is_op = true; | ||||
| 	} | ||||
|  | ||||
| 	/* pruefen, ob Client in Channel schreiben darf */ | ||||
| 	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 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 )); | ||||
|  | ||||
| 	/* Text senden */ | ||||
| 	/* 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 ); | ||||
| 	return IRC_WriteStrChannelPrefix( Client, Chan, From, true, "PRIVMSG %s :%s", Channel_Name( Chan ), Text ); | ||||
| } /* Channel_Write */ | ||||
|  | ||||
|  | ||||
|  | ||||
| LOCAL CHANNEL *New_Chan( CHAR *Name ) | ||||
| GLOBAL CHANNEL * | ||||
| Channel_Create( char *Name ) | ||||
| { | ||||
| 	/* Neue Channel-Struktur anlegen */ | ||||
|  | ||||
| 	/* 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 - 1 ); | ||||
| 	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; | ||||
|  | ||||
| @@ -505,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; | ||||
|  | ||||
| @@ -513,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; | ||||
| @@ -533,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; | ||||
| @@ -551,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 ); | ||||
| @@ -561,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; | ||||
|  | ||||
| @@ -597,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 */ | ||||
| 	 | ||||
| @@ -611,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,24 +2,21 @@ | ||||
|  * 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.16 2002/03/25 19:11:01 alex Exp $ | ||||
|  * $Id: channel.h,v 1.27 2005/03/19 18:43:48 fw Exp $ | ||||
|  * | ||||
|  * channel.h: Management der Channels (Header) | ||||
|  * Channel management (header) | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef __channel_h__ | ||||
| #define __channel_h__ | ||||
|  | ||||
| #include "client.h" | ||||
|  | ||||
|  | ||||
| #if defined(__channel_c__) | defined(S_SPLINT_S) | ||||
|  | ||||
| @@ -28,10 +25,12 @@ | ||||
| typedef struct _CHANNEL | ||||
| { | ||||
| 	struct _CHANNEL *next; | ||||
| 	CHAR name[CHANNEL_NAME_LEN];	/* Name des Channel */ | ||||
| 	UINT32 hash;			/* Hash ueber (kleingeschrieben) Namen */ | ||||
| 	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 | ||||
| @@ -39,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 | ||||
| @@ -50,47 +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 BOOLEAN Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR *Text ); | ||||
| 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,60 +2,56 @@ | ||||
|  * 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.27 2002/03/25 19:11:01 alex Exp $ | ||||
|  * $Id: client.h,v 1.39 2005/06/12 16:18:49 alex Exp $ | ||||
|  * | ||||
|  * client.h: Konfiguration des ngircd (Header) | ||||
|  * 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 */ | ||||
|  | ||||
| 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; | ||||
| #define CLIENT_TYPE int | ||||
|  | ||||
|  | ||||
| #if defined(__client_c__) | defined(S_SPLINT_S) | ||||
|  | ||||
| #include "defines.h" | ||||
|  | ||||
| typedef struct _CLIENT | ||||
| { | ||||
| 	CHAR id[CLIENT_ID_LEN];		/* Nick (User) bzw. ID (Server) */ | ||||
| 	UINT32 hash;			/* Hash ueber die (kleingeschriebene) ID */ | ||||
| 	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 | ||||
| @@ -65,74 +61,98 @@ 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, BOOLEAN SendQuit ); | ||||
| 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_GetFromToken( CLIENT *Client, INT Token ); | ||||
| GLOBAL void Client_Destroy PARAMS(( CLIENT *Client, char *LogMsg, char *FwdMsg, bool SendQuit )); | ||||
| #ifdef CONN_MODULE | ||||
| GLOBAL void Client_DestroyNow PARAMS(( CLIENT *Client )); | ||||
| #endif | ||||
|  | ||||
| GLOBAL CLIENT *Client_Search( CHAR *ID ); | ||||
| GLOBAL CLIENT *Client_First( VOID ); | ||||
| GLOBAL CLIENT *Client_Next( CLIENT *c ); | ||||
| GLOBAL CLIENT *Client_ThisServer PARAMS(( void )); | ||||
|  | ||||
| GLOBAL INT Client_Type( CLIENT *Client ); | ||||
| GLOBAL CONN_ID Client_Conn( CLIENT *Client ); | ||||
| GLOBAL CHAR *Client_ID( CLIENT *Client ); | ||||
| GLOBAL CHAR *Client_Mask( CLIENT *Client ); | ||||
| GLOBAL CHAR *Client_Info( CLIENT *Client ); | ||||
| GLOBAL CHAR *Client_User( CLIENT *Client ); | ||||
| GLOBAL CHAR *Client_Hostname( CLIENT *Client ); | ||||
| GLOBAL CHAR *Client_Password( CLIENT *Client ); | ||||
| GLOBAL CHAR *Client_Modes( CLIENT *Client ); | ||||
| GLOBAL CLIENT *Client_Introducer( CLIENT *Client ); | ||||
| GLOBAL BOOLEAN Client_OperByMe( CLIENT *Client ); | ||||
| GLOBAL INT Client_Hops( CLIENT *Client ); | ||||
| GLOBAL INT Client_Token( CLIENT *Client ); | ||||
| GLOBAL INT Client_MyToken( CLIENT *Client ); | ||||
| GLOBAL CLIENT *Client_TopServer( CLIENT *Client ); | ||||
| GLOBAL CLIENT *Client_NextHop( CLIENT *Client ); | ||||
| GLOBAL CHAR *Client_Away( CLIENT *Client ); | ||||
| GLOBAL CLIENT *Client_GetFromConn PARAMS(( CONN_ID Idx )); | ||||
| GLOBAL CLIENT *Client_GetFromToken PARAMS(( CLIENT *Client, int Token )); | ||||
|  | ||||
| GLOBAL BOOLEAN Client_HasMode( CLIENT *Client, CHAR Mode ); | ||||
| GLOBAL CLIENT *Client_Search PARAMS(( char *ID )); | ||||
| GLOBAL CLIENT *Client_First PARAMS(( void )); | ||||
| GLOBAL CLIENT *Client_Next PARAMS(( CLIENT *c )); | ||||
|  | ||||
| GLOBAL VOID Client_SetHostname( CLIENT *Client, CHAR *Hostname ); | ||||
| GLOBAL VOID Client_SetID( CLIENT *Client, CHAR *Nick ); | ||||
| GLOBAL VOID Client_SetUser( CLIENT *Client, CHAR *User, BOOLEAN Idented ); | ||||
| GLOBAL VOID Client_SetInfo( CLIENT *Client, CHAR *Info ); | ||||
| GLOBAL VOID Client_SetPassword( CLIENT *Client, CHAR *Pwd ); | ||||
| GLOBAL VOID Client_SetType( CLIENT *Client, INT Type ); | ||||
| GLOBAL VOID Client_SetHops( CLIENT *Client, INT Hops ); | ||||
| GLOBAL VOID Client_SetToken( CLIENT *Client, INT Token ); | ||||
| GLOBAL VOID Client_SetOperByMe( CLIENT *Client, BOOLEAN OperByMe ); | ||||
| GLOBAL VOID Client_SetModes( CLIENT *Client, CHAR *Modes ); | ||||
| GLOBAL VOID Client_SetIntroducer( CLIENT *Client, CLIENT *Introducer ); | ||||
| GLOBAL VOID Client_SetAway( CLIENT *Client, CHAR *Txt ); | ||||
| GLOBAL int Client_Type PARAMS(( CLIENT *Client )); | ||||
| GLOBAL CONN_ID Client_Conn PARAMS(( CLIENT *Client )); | ||||
| GLOBAL char *Client_ID PARAMS(( CLIENT *Client )); | ||||
| GLOBAL char *Client_Mask PARAMS(( CLIENT *Client )); | ||||
| GLOBAL char *Client_Info PARAMS(( CLIENT *Client )); | ||||
| GLOBAL char *Client_User PARAMS(( CLIENT *Client )); | ||||
| GLOBAL char *Client_Hostname PARAMS(( CLIENT *Client )); | ||||
| GLOBAL char *Client_Password PARAMS(( CLIENT *Client )); | ||||
| GLOBAL char *Client_Modes PARAMS(( CLIENT *Client )); | ||||
| GLOBAL char *Client_Flags PARAMS(( CLIENT *Client )); | ||||
| GLOBAL CLIENT *Client_Introducer PARAMS(( CLIENT *Client )); | ||||
| GLOBAL bool Client_OperByMe PARAMS(( CLIENT *Client )); | ||||
| GLOBAL int Client_Hops PARAMS(( CLIENT *Client )); | ||||
| GLOBAL int Client_Token PARAMS(( CLIENT *Client )); | ||||
| GLOBAL int Client_MyToken PARAMS(( CLIENT *Client )); | ||||
| GLOBAL CLIENT *Client_TopServer PARAMS(( CLIENT *Client )); | ||||
| GLOBAL CLIENT *Client_NextHop PARAMS(( CLIENT *Client )); | ||||
| GLOBAL char *Client_Away PARAMS(( CLIENT *Client )); | ||||
| GLOBAL time_t Client_StartTime PARAMS(( CLIENT *Client )); | ||||
|  | ||||
| GLOBAL BOOLEAN Client_ModeAdd( CLIENT *Client, CHAR Mode ); | ||||
| GLOBAL BOOLEAN Client_ModeDel( CLIENT *Client, CHAR Mode ); | ||||
| GLOBAL bool Client_HasMode PARAMS(( CLIENT *Client, char Mode )); | ||||
|  | ||||
| GLOBAL BOOLEAN Client_CheckNick( CLIENT *Client, CHAR *Nick ); | ||||
| GLOBAL BOOLEAN Client_CheckID( CLIENT *Client, CHAR *ID ); | ||||
| GLOBAL void Client_SetHostname PARAMS(( CLIENT *Client, char *Hostname )); | ||||
| GLOBAL void Client_SetID PARAMS(( CLIENT *Client, char *Nick )); | ||||
| GLOBAL void Client_SetUser PARAMS(( CLIENT *Client, char *User, bool Idented )); | ||||
| GLOBAL void Client_SetInfo PARAMS(( CLIENT *Client, char *Info )); | ||||
| GLOBAL void Client_SetPassword PARAMS(( CLIENT *Client, char *Pwd )); | ||||
| GLOBAL void Client_SetType PARAMS(( CLIENT *Client, int Type )); | ||||
| GLOBAL void Client_SetHops PARAMS(( CLIENT *Client, int Hops )); | ||||
| GLOBAL void Client_SetToken PARAMS(( CLIENT *Client, int Token )); | ||||
| GLOBAL void Client_SetOperByMe PARAMS(( CLIENT *Client, bool OperByMe )); | ||||
| GLOBAL void Client_SetModes PARAMS(( CLIENT *Client, char *Modes )); | ||||
| GLOBAL void Client_SetFlags PARAMS(( CLIENT *Client, char *Flags )); | ||||
| GLOBAL void Client_SetIntroducer PARAMS(( CLIENT *Client, CLIENT *Introducer )); | ||||
| GLOBAL void Client_SetAway PARAMS(( CLIENT *Client, char *Txt )); | ||||
|  | ||||
| GLOBAL INT Client_UserCount( VOID ); | ||||
| GLOBAL INT Client_ServiceCount( VOID ); | ||||
| GLOBAL INT Client_ServerCount( VOID ); | ||||
| GLOBAL INT Client_OperCount( VOID ); | ||||
| GLOBAL INT Client_UnknownCount( VOID ); | ||||
| GLOBAL INT Client_MyUserCount( VOID ); | ||||
| GLOBAL INT Client_MyServiceCount( VOID ); | ||||
| GLOBAL INT Client_MyServerCount( VOID ); | ||||
| GLOBAL bool Client_ModeAdd PARAMS(( CLIENT *Client, char Mode )); | ||||
| GLOBAL bool Client_ModeDel PARAMS(( CLIENT *Client, char Mode )); | ||||
|  | ||||
| GLOBAL BOOLEAN Client_IsValidNick( CHAR *Nick ); | ||||
| GLOBAL bool Client_CheckNick PARAMS(( CLIENT *Client, char *Nick )); | ||||
| GLOBAL bool Client_CheckID PARAMS(( CLIENT *Client, char *ID )); | ||||
|  | ||||
| GLOBAL long Client_UserCount PARAMS(( void )); | ||||
| GLOBAL long Client_ServiceCount PARAMS(( void )); | ||||
| GLOBAL long Client_ServerCount PARAMS(( void )); | ||||
| GLOBAL long Client_OperCount PARAMS(( void )); | ||||
| GLOBAL long Client_UnknownCount PARAMS(( void )); | ||||
| GLOBAL long Client_MyUserCount PARAMS(( void )); | ||||
| GLOBAL long Client_MyServiceCount PARAMS(( void )); | ||||
| GLOBAL long Client_MyServerCount PARAMS(( void )); | ||||
| GLOBAL long Client_MaxUserCount PARAMS((  void )); | ||||
| GLOBAL long Client_MyMaxUserCount PARAMS((  void )); | ||||
|  | ||||
| GLOBAL bool Client_IsValidNick PARAMS(( char *Nick )); | ||||
|  | ||||
| GLOBAL WHOWAS *Client_GetWhowas PARAMS(( void )); | ||||
| GLOBAL int Client_GetLastWhowasIndex PARAMS(( void )); | ||||
|  | ||||
| GLOBAL void Client_RegisterWhowas PARAMS(( CLIENT *Client )); | ||||
|  | ||||
|  | ||||
| #endif | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -2,16 +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.15 2002/03/29 22:53:59 alex Exp $ | ||||
|  * $Id: conf.h,v 1.34 2005/03/20 13:54:06 fw Exp $ | ||||
|  * | ||||
|  * conf.h: Konfiguration des ngircd (Header) | ||||
|  * Configuration management (header) | ||||
|  */ | ||||
|  | ||||
|  | ||||
| @@ -20,68 +19,127 @@ | ||||
|  | ||||
| #include <time.h> | ||||
|  | ||||
| #include "conn.h" | ||||
| #include "defines.h" | ||||
|  | ||||
| #include "portab.h" | ||||
|  | ||||
| typedef struct _Conf_Oper | ||||
| { | ||||
| 	CHAR name[CLIENT_PASS_LEN];	/* Name (ID) des IRC-OPs */ | ||||
| 	CHAR pwd[CLIENT_PASS_LEN];	/* Passwort */ | ||||
| 	char name[CLIENT_PASS_LEN];	/* Name (ID) of IRC operator */ | ||||
| 	char pwd[CLIENT_PASS_LEN];	/* Password */ | ||||
| 	char *mask; | ||||
| } CONF_OPER; | ||||
|  | ||||
| typedef struct _Conf_Server | ||||
| { | ||||
| 	CHAR host[HOST_LEN];		/* Hostname */ | ||||
| 	CHAR ip[16];			/* IP-Adresse (von Resolver) */ | ||||
| 	CHAR name[CLIENT_ID_LEN];	/* IRC-Client-ID */ | ||||
| 	CHAR pwd[CLIENT_PASS_LEN];	/* Passwort */ | ||||
| 	INT port;			/* Server-Port */ | ||||
| 	INT group;			/* Gruppe des Servers */ | ||||
| 	time_t lasttry;			/* Letzter Connect-Versuch */ | ||||
| 	RES_STAT *res_stat;		/* Status des Resolver */ | ||||
| 	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; | ||||
|  | ||||
| /* Name ("Nick") des Servers */ | ||||
| GLOBAL CHAR Conf_ServerName[CLIENT_ID_LEN]; | ||||
|  | ||||
| /* Servers-Info-Text */ | ||||
| GLOBAL CHAR Conf_ServerInfo[CLIENT_INFO_LEN]; | ||||
| #define CONF_SFLAG_ONCE	1		/* Delete this entry after next disconnect */ | ||||
| #define CONF_SFLAG_DISABLED 2		/* This server configuration entry is disabled */ | ||||
|  | ||||
| /* Server-Passwort */ | ||||
| GLOBAL CHAR Conf_ServerPwd[CLIENT_PASS_LEN]; | ||||
|  | ||||
| /* Datei mit MOTD-Text */ | ||||
| GLOBAL CHAR Conf_MotdFile[FNAME_LEN]; | ||||
| /* Name ("Nick") of the servers */ | ||||
| GLOBAL char Conf_ServerName[CLIENT_ID_LEN]; | ||||
|  | ||||
| /* Ports, auf denen der Server Verbindungen entgegen nimmt */ | ||||
| GLOBAL UINT Conf_ListenPorts[MAX_LISTEN_PORTS]; | ||||
| GLOBAL INT Conf_ListenPorts_Count; | ||||
| /* Server info text */ | ||||
| GLOBAL char Conf_ServerInfo[CLIENT_INFO_LEN]; | ||||
|  | ||||
| /* User- und Group-ID, zu denen der Daemon wechseln soll */ | ||||
| GLOBAL UINT Conf_UID; | ||||
| GLOBAL UINT Conf_GID; | ||||
| /* 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 INT Conf_Test( 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- */ | ||||
							
								
								
									
										1843
									
								
								src/ngircd/conn.c
									
									
									
									
									
								
							
							
						
						
									
										1843
									
								
								src/ngircd/conn.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -2,16 +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.14 2002/03/29 22:54:35 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) | ||||
|  * Connection management (header) | ||||
|  */ | ||||
|  | ||||
|  | ||||
| @@ -19,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 UINT 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,17 +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.21 2002/03/29 22:55:02 alex Exp $ | ||||
|  * $Id: defines.h,v 1.52.2.2 2005/07/05 22:58:25 alex Exp $ | ||||
|  * | ||||
|  * defines.h: (globale) Konstanten | ||||
|  * Global defines of ngIRCd. | ||||
|  */ | ||||
|  | ||||
| #ifndef __defines_h__ | ||||
| @@ -20,60 +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 "aios"		/* 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) */ | ||||
|  | ||||
| #define DEFAULT_AWAY_MSG "Away"		/* Away-Meldung fuer User von anderen Servern */ | ||||
| #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 CONFIG_FILE SYSCONFDIR"/ngircd.conf" | ||||
| #define MOTD_FILE SYSCONFDIR"/ngircd.motd" | ||||
| #define ERROR_DIR "/tmp" | ||||
|  | ||||
| #define MAX_LOG_MSG_LEN 256		/* max. Laenge einer Log-Meldung */ | ||||
| #define MAX_LOG_MSG_LEN 256		/* max. length of a log message */ | ||||
|  | ||||
| #define TOKEN_OUTBOUND -2		/* 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 | ||||
|   | ||||
| @@ -2,45 +2,42 @@ | ||||
|  * 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: hash.c,v 1.4 2002/03/25 19:11:01 alex Exp $ | ||||
|  * | ||||
|  * hash.c: Hash-Werte berechnen | ||||
|  * 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 "log.h" | ||||
| #include "tool.h" | ||||
|  | ||||
| #include "exp.h" | ||||
| #include "hash.h" | ||||
|  | ||||
|  | ||||
| LOCAL UINT32 jenkins_hash( register UINT8 *k, register UINT32 length, register UINT32 initval); | ||||
| LOCAL UINT32 jenkins_hash PARAMS(( register UINT8 *k, register UINT32 length, register UINT32 initval )); | ||||
|  | ||||
|  | ||||
| GLOBAL UINT32 Hash( CHAR *String ) | ||||
| GLOBAL UINT32 | ||||
| Hash( char *String ) | ||||
| { | ||||
| 	/* Hash-Wert ueber String berechnen */ | ||||
|  | ||||
| 	CHAR buffer[LINE_LEN]; | ||||
| 	char buffer[LINE_LEN]; | ||||
|  | ||||
| 	strncpy( buffer, String, LINE_LEN - 1 ); | ||||
| 	buffer[LINE_LEN - 1] = '\0'; | ||||
| 	 | ||||
| 	strlcpy( buffer, String, sizeof( buffer )); | ||||
| 	return jenkins_hash( (UINT8 *)ngt_LowerStr( buffer ), strlen( buffer ), 42 ); | ||||
| } /* Hash */ | ||||
|  | ||||
| @@ -75,7 +72,8 @@ GLOBAL UINT32 Hash( CHAR *String ) | ||||
| } /* mix */ | ||||
|  | ||||
|  | ||||
| LOCAL UINT32 jenkins_hash( register UINT8 *k, register UINT32 length, register UINT32 initval) | ||||
| LOCAL UINT32 | ||||
| jenkins_hash( register UINT8 *k, register UINT32 length, register UINT32 initval ) | ||||
| { | ||||
| 	/* k: the key | ||||
| 	 * length: length of the key | ||||
| @@ -101,7 +99,7 @@ LOCAL UINT32 jenkins_hash( register UINT8 *k, register UINT32 length, register U | ||||
|  | ||||
| 	/* handle the last 11 bytes */ | ||||
| 	c += length; | ||||
| 	switch(len)		/* all the case statements fall through */ | ||||
| 	switch( (int)len )	/* all the case statements fall through */ | ||||
| 	{ | ||||
| 		case 11: c+=((UINT32)k[10]<<24); | ||||
| 		case 10: c+=((UINT32)k[9]<<16); | ||||
|   | ||||
| @@ -2,16 +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: hash.h,v 1.2 2002/03/14 15:49:36 alex Exp $ | ||||
|  * $Id: hash.h,v 1.5 2005/03/19 18:43:48 fw Exp $ | ||||
|  * | ||||
|  * hash.h: Hash-Werte berechnen (Header) | ||||
|  * Hash calculation (header) | ||||
|  */ | ||||
|  | ||||
|  | ||||
| @@ -19,7 +18,7 @@ | ||||
| #define __hash_h__ | ||||
|  | ||||
|  | ||||
| GLOBAL UINT32 Hash( CHAR *String ); | ||||
| GLOBAL UINT32 Hash PARAMS((char *String )); | ||||
|  | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -2,78 +2,172 @@ | ||||
|  * 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-channel.c,v 1.3 2002/03/25 17:08:54 alex Exp $ | ||||
|  * | ||||
|  * irc-channel.c: IRC-Channel-Befehle | ||||
|  * IRC channel commands | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include "portab.h" | ||||
|  | ||||
| static char UNUSED id[] = "$Id: irc-channel.c,v 1.30 2005/06/12 18:23:59 alex Exp $"; | ||||
|  | ||||
| #include "imp.h" | ||||
| #include <assert.h> | ||||
| #include <stdlib.h> | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "defines.h" | ||||
| #include "irc.h" | ||||
| #include "irc-write.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 BOOLEAN IRC_JOIN( CLIENT *Client, REQUEST *Req ) | ||||
| GLOBAL bool | ||||
| IRC_JOIN( CLIENT *Client, REQUEST *Req ) | ||||
| { | ||||
| 	CHAR *channame, *flags, *topic, modes[8]; | ||||
| 	BOOLEAN is_new_chan; | ||||
| 	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 ); | ||||
|  | ||||
| 	if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client )); | ||||
| 	/* Bad number of arguments? */ | ||||
| 	if(( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); | ||||
|  | ||||
| 	/* Falsche Anzahl Parameter? */ | ||||
| 	if(( Req->argc > 1 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); | ||||
|  | ||||
| 	/* Wer ist der Absender? */ | ||||
| 	/* 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 ) | ||||
| 	{ | ||||
| 		/* wird der Channel neu angelegt? */ | ||||
| 		flags = NULL; | ||||
| 		chan = NULL; flags = NULL; | ||||
|  | ||||
| 		if( Channel_Search( channame )) is_new_chan = FALSE; | ||||
| 		else is_new_chan = TRUE; | ||||
| 		/* 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'; | ||||
| 			if( flags ) | ||||
| 			{ | ||||
| 				*flags = '\0'; | ||||
| 				flags++; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		/* neuer Channel udn lokaler Client? */ | ||||
| 		if( is_new_chan && ( Client_Type( Client ) == CLIENT_USER )) | ||||
| 		/* Local client? */ | ||||
| 		if( Client_Type( Client ) == CLIENT_USER ) | ||||
| 		{ | ||||
| 			/* Dann soll der Client Channel-Operator werden! */ | ||||
| 			flags = "o"; | ||||
| 			/* Test if the user has reached his maximum channel count */ | ||||
| 			if( Client_Type( Client ) == CLIENT_USER ) | ||||
| 			{ | ||||
| 				if(( Conf_MaxJoins > 0 ) && ( Channel_CountForUser( Client ) >= Conf_MaxJoins )) | ||||
| 				{ | ||||
| 					IRC_WriteStrClient( Client, ERR_TOOMANYCHANNELS_MSG, Client_ID( Client ), channame ); | ||||
| 					return CONNECTED; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			/* 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) */ | ||||
| @@ -83,7 +177,7 @@ GLOBAL BOOLEAN IRC_JOIN( CLIENT *Client, REQUEST *Req ) | ||||
| 			channame = strtok( NULL, "," ); | ||||
| 			continue; | ||||
| 		} | ||||
| 		chan = Channel_Search( channame ); | ||||
| 		if( ! chan ) chan = Channel_Search( channame ); | ||||
| 		assert( chan != NULL ); | ||||
|  | ||||
| 		/* Modes setzen (wenn vorhanden) */ | ||||
| @@ -93,8 +187,11 @@ GLOBAL BOOLEAN IRC_JOIN( CLIENT *Client, REQUEST *Req ) | ||||
| 			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? */ | ||||
| 		strcpy( &modes[1], Channel_UserModes( chan, target )); | ||||
| 		strlcpy( &modes[1], Channel_UserModes( chan, target ), sizeof( modes ) - 1 ); | ||||
| 		if( modes[1] ) modes[0] = 0x7; | ||||
| 		else modes[0] = '\0'; | ||||
|  | ||||
| @@ -102,11 +199,11 @@ GLOBAL BOOLEAN IRC_JOIN( CLIENT *Client, REQUEST *Req ) | ||||
| 		IRC_WriteStrServersPrefix( Client, target, "JOIN :%s%s", channame, modes ); | ||||
|  | ||||
| 		/* im Channel bekannt machen */ | ||||
| 		IRC_WriteStrChannelPrefix( Client, chan, target, FALSE, "JOIN :%s", channame ); | ||||
| 		IRC_WriteStrChannelPrefix( Client, chan, target, false, "JOIN :%s", channame ); | ||||
| 		if( modes[1] ) | ||||
| 		{ | ||||
| 			/* Modes im Channel bekannt machen */ | ||||
| 			IRC_WriteStrChannelPrefix( Client, chan, target, FALSE, "MODE %s %s :%s", channame, modes, Client_ID( target )); | ||||
| 			IRC_WriteStrChannelPrefix( Client, chan, target, false, "MODE %s +%s %s", channame, &modes[1], Client_ID( target )); | ||||
| 		} | ||||
|  | ||||
| 		if( Client_Type( Client ) == CLIENT_USER ) | ||||
| @@ -130,16 +227,15 @@ GLOBAL BOOLEAN IRC_JOIN( CLIENT *Client, REQUEST *Req ) | ||||
| } /* IRC_JOIN */ | ||||
|  | ||||
|  | ||||
| GLOBAL BOOLEAN IRC_PART( CLIENT *Client, REQUEST *Req ) | ||||
| GLOBAL bool | ||||
| IRC_PART( CLIENT *Client, REQUEST *Req ) | ||||
| { | ||||
| 	CLIENT *target; | ||||
| 	CHAR *chan; | ||||
| 	char *chan; | ||||
|  | ||||
| 	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 > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); | ||||
|  | ||||
| @@ -166,17 +262,16 @@ GLOBAL BOOLEAN IRC_PART( CLIENT *Client, REQUEST *Req ) | ||||
| } /* IRC_PART */ | ||||
|  | ||||
|  | ||||
| GLOBAL BOOLEAN IRC_TOPIC( CLIENT *Client, REQUEST *Req ) | ||||
| GLOBAL bool | ||||
| IRC_TOPIC( CLIENT *Client, REQUEST *Req ) | ||||
| { | ||||
| 	CHANNEL *chan; | ||||
| 	CLIENT *from; | ||||
| 	CHAR *topic; | ||||
| 	char *topic; | ||||
|  | ||||
| 	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 ) || ( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); | ||||
|  | ||||
| @@ -186,7 +281,7 @@ GLOBAL BOOLEAN IRC_TOPIC( CLIENT *Client, REQUEST *Req ) | ||||
|  | ||||
| 	/* Welcher Channel? */ | ||||
| 	chan = Channel_Search( Req->argv[0] ); | ||||
| 	if( ! chan ) return IRC_WriteStrClient( from, ERR_NOTONCHANNEL_MSG, Client_ID( from ), 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] ); | ||||
| @@ -211,11 +306,190 @@ GLOBAL BOOLEAN IRC_TOPIC( CLIENT *Client, REQUEST *Req ) | ||||
|  | ||||
| 	/* im Channel bekannt machen und an Server weiterleiten */ | ||||
| 	IRC_WriteStrServersPrefix( Client, from, "TOPIC %s :%s", Req->argv[0], Req->argv[1] ); | ||||
| 	IRC_WriteStrChannelPrefix( Client, chan, from, FALSE, "TOPIC %s :%s", Req->argv[0], Req->argv[1] ); | ||||
| 	IRC_WriteStrChannelPrefix( Client, chan, from, false, "TOPIC %s :%s", Req->argv[0], Req->argv[1] ); | ||||
|  | ||||
| 	if( Client_Type( Client ) == CLIENT_USER ) return IRC_WriteStrClientPrefix( Client, Client, "TOPIC %s :%s", Req->argv[0], Req->argv[1] ); | ||||
| 	else return CONNECTED; | ||||
| } /* IRC_TOPIC */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * 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- */ | ||||
|   | ||||
| @@ -2,29 +2,29 @@ | ||||
|  * 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-channel.h,v 1.2 2002/03/12 14:37:52 alex Exp $ | ||||
|  * $Id: irc-channel.h,v 1.7 2005/03/19 18:43:48 fw Exp $ | ||||
|  * | ||||
|  * irc-channel.h: IRC-Channel-Befehle (Header) | ||||
|  * IRC channel commands (header) | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef __irc_channel_h__ | ||||
| #define __irc_channel_h__ | ||||
|  | ||||
| #include "parse.h" | ||||
| #include "client.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 BOOLEAN IRC_JOIN( CLIENT *Client, REQUEST *Req ); | ||||
| GLOBAL BOOLEAN IRC_PART( CLIENT *Client, REQUEST *Req ); | ||||
| GLOBAL BOOLEAN IRC_TOPIC( CLIENT *Client, REQUEST *Req ); | ||||
| GLOBAL bool IRC_LIST PARAMS((CLIENT *Client, REQUEST *Req )); | ||||
|  | ||||
| GLOBAL bool IRC_CHANINFO PARAMS((CLIENT *Client, REQUEST *Req )); | ||||
|  | ||||
|  | ||||
| #endif | ||||
|   | ||||
							
								
								
									
										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,43 +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. | ||||
|  * 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.c,v 1.11 2002/03/26 23:58:34 alex Exp $ | ||||
|  * | ||||
|  * irc-login.c: Anmeldung und Abmeldung im IRC | ||||
|  * Login and logout | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include "portab.h" | ||||
|  | ||||
| static char UNUSED id[] = "$Id: irc-login.c,v 1.44 2005/06/04 12:32:09 fw 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 "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 ); | ||||
| @@ -59,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 )) | ||||
| @@ -77,86 +143,146 @@ GLOBAL BOOLEAN IRC_PASS( CLIENT *Client, REQUEST *Req ) | ||||
| } /* IRC_PASS */ | ||||
|  | ||||
|  | ||||
| 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_Search( Req->prefix ); | ||||
| 			if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] ); | ||||
| 			if( ! target ) | ||||
| 				return IRC_WriteStrClient( Client, | ||||
| 							   ERR_NOSUCHNICK_MSG, | ||||
| 							   Client_ID( Client ), | ||||
| 							   Req->argv[0] ); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			/* Ist der Client "restricted"? */ | ||||
| 			if( Client_HasMode( Client, 'r' )) return IRC_WriteStrClient( Client, ERR_RESTRICTED_MSG, Client_ID( Client )); | ||||
| 			/* Is this a restricted client? */ | ||||
| 			if( Client_HasMode( Client, 'r' )) | ||||
| 				return IRC_WriteStrClient( Client, | ||||
| 							   ERR_RESTRICTED_MSG, | ||||
| 							   Client_ID( Client )); | ||||
|  | ||||
| 			target = Client; | ||||
| 		} | ||||
|  | ||||
| #ifndef STRICT_RFC | ||||
| 		/* Wenn der Client zu seinem eigenen Nick wechseln will, so machen | ||||
| 		 * wir nichts. So macht es das Original und mind. Snak hat probleme, | ||||
| 		 * wenn wir es nicht so machen. Ob es so okay ist? Hm ... */ | ||||
| 		if( strcmp( Client_ID( target ), Req->argv[0] ) == 0 ) return CONNECTED; | ||||
| 		/* If the clients tries to change to its own nickname we won't | ||||
| 		 * do anything. This is how the original ircd behaves and some | ||||
| 		 * clients (for example Snak) expect it to be like this. | ||||
| 		 * But I doubt that this is "really the right thing" ... */ | ||||
| 		if( strcmp( Client_ID( target ), Req->argv[0] ) == 0 ) | ||||
| 			return CONNECTED; | ||||
| #endif | ||||
| 		 | ||||
| 		/* pruefen, ob Nick bereits vergeben. Speziallfall: der Client | ||||
| 		 * will nur die Gross- und Kleinschreibung aendern. Das darf | ||||
| 		 * er natuerlich machen :-) */ | ||||
|  | ||||
| 		/* Check that the new nickname is available. Special case: | ||||
| 		 * the client only changes from/to upper to lower case. */ | ||||
| 		if( strcasecmp( Client_ID( target ), Req->argv[0] ) != 0 ) | ||||
| 		{ | ||||
| 			if( ! Client_CheckNick( target, Req->argv[0] )) return CONNECTED; | ||||
| 			if( ! Client_CheckNick( target, Req->argv[0] )) | ||||
| 				return CONNECTED; | ||||
| 		} | ||||
|  | ||||
| 		if(( Client_Type( target ) != CLIENT_USER ) && ( Client_Type( target ) != CLIENT_SERVER )) | ||||
| 		if(( Client_Type( target ) != CLIENT_USER ) | ||||
| 		   && ( Client_Type( target ) != CLIENT_SERVER )) | ||||
| 		{ | ||||
| 			/* Neuer Client */ | ||||
| 			Log( LOG_DEBUG, "Connection %d: got valid NICK command ...", Client_Conn( Client )); | ||||
| 			/* New client */ | ||||
| 			Log( LOG_DEBUG, "Connection %d: got valid NICK command ...",  | ||||
| 			     Client_Conn( Client )); | ||||
|  | ||||
| 			/* Client-Nick registrieren */ | ||||
| 			/* Register new nickname of this client */ | ||||
| 			Client_SetID( target, Req->argv[0] ); | ||||
|  | ||||
| 			/* schon ein USER da? Dann registrieren! */ | ||||
| 			if( Client_Type( Client ) == CLIENT_GOTUSER ) return Hello_User( Client ); | ||||
| 			else Client_SetType( Client, CLIENT_GOTNICK ); | ||||
| 			/* If we received a valid USER command already then | ||||
| 			 * register the new client! */ | ||||
| 			if( Client_Type( Client ) == CLIENT_GOTUSER ) | ||||
| 				return Hello_User( Client ); | ||||
| 			else | ||||
| 				Client_SetType( Client, CLIENT_GOTNICK ); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			/* Nick-Aenderung */ | ||||
| 			if( Client_Conn( target ) > NONE ) Log( LOG_INFO, "User \"%s\" changed nick (connection %d): \"%s\" -> \"%s\".", Client_Mask( target ), Client_ID( target ), Req->argv[0], Client_Conn( target )); | ||||
| 			else Log( LOG_DEBUG, "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 ); | ||||
| @@ -183,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. | ||||
| @@ -207,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 ); | ||||
|  | ||||
| @@ -218,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 ); | ||||
| @@ -237,32 +378,25 @@ 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 ) | ||||
| 		{ | ||||
| @@ -271,24 +405,35 @@ GLOBAL BOOLEAN IRC_QUIT( CLIENT *Client, REQUEST *Req ) | ||||
| 			return CONNECTED; | ||||
| 		} | ||||
|  | ||||
| 		if( Req->argc == 0 ) Client_Destroy( target, "Got QUIT command.", NULL, TRUE ); | ||||
| 		else Client_Destroy( target, "Got QUIT command.", Req->argv[0], TRUE ); | ||||
| 		Client_Destroy( target, "Got QUIT command.", Req->argc == 1 ? quitmsg : NULL, true); | ||||
|  | ||||
| 		return CONNECTED; | ||||
| 	} | ||||
| 	else return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client )); | ||||
| 	else | ||||
| 	{ | ||||
| 		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_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 | ||||
| @@ -299,7 +444,7 @@ GLOBAL BOOLEAN IRC_PING( CLIENT *Client, REQUEST *Req ) | ||||
| 	{ | ||||
| 		/* es wurde ein Ziel-Client angegeben */ | ||||
| 		target = Client_Search( Req->argv[1] ); | ||||
| 		if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), 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 */ | ||||
| @@ -315,15 +460,14 @@ GLOBAL BOOLEAN IRC_PING( CLIENT *Client, REQUEST *Req ) | ||||
| } /* 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 ); | ||||
| @@ -332,7 +476,7 @@ GLOBAL BOOLEAN IRC_PONG( CLIENT *Client, REQUEST *Req ) | ||||
| 	if( Req->argc == 2 ) | ||||
| 	{ | ||||
| 		target = Client_Search( Req->argv[1] ); | ||||
| 		if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), 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 */ | ||||
| @@ -353,53 +497,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_Search( Nick ); | ||||
| 	if( c && ( Client_Conn( c ) != NONE )) Conn_Close( Client_Conn( c ), NULL, Reason, TRUE ); | ||||
| 	IRC_KILL( Client_ThisServer( ), &r ); | ||||
| } /* Kill_Nick */ | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -2,32 +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.3 2002/03/12 14:37:52 alex Exp $ | ||||
|  * $Id: irc-login.h,v 1.6 2005/03/19 18:43:48 fw Exp $ | ||||
|  * | ||||
|  * irc-login.h: Anmeldung und Abmeldung im IRC (Header) | ||||
|  * 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_PING( CLIENT *Client, REQUEST *Req ); | ||||
| GLOBAL BOOLEAN IRC_PONG( CLIENT *Client, REQUEST *Req ); | ||||
| GLOBAL BOOLEAN IRC_QUIT( 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,31 +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.2 2002/03/12 14:37:52 alex Exp $ | ||||
|  * $Id: irc-mode.h,v 1.6 2005/03/19 18:43:48 fw Exp $ | ||||
|  * | ||||
|  * irc-mode.h: IRC-Befehle zur Mode-Aenderung (MODE, AWAY, ...) (Header) | ||||
|  * 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- */ | ||||
| @@ -2,43 +2,59 @@ | ||||
|  * 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-oper.c,v 1.3 2002/03/27 20:52:58 alex Exp $ | ||||
|  * | ||||
|  * irc-oper.c: IRC-Operator-Befehle | ||||
|  * 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" | ||||
|  | ||||
|  | ||||
| GLOBAL BOOLEAN IRC_OPER( CLIENT *Client, REQUEST *Req ) | ||||
| LOCAL bool | ||||
| Bad_OperPass(CLIENT *Client, char *errtoken, char *errmsg) | ||||
| { | ||||
| 	INT i; | ||||
| 	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 ); | ||||
|  | ||||
| 	if( Client_Type( Client ) != CLIENT_USER ) 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 ); | ||||
|  | ||||
| @@ -48,17 +64,15 @@ GLOBAL BOOLEAN IRC_OPER( CLIENT *Client, REQUEST *Req ) | ||||
| 		if( Conf_Oper[i].name[0] && Conf_Oper[i].pwd[0] && ( strcmp( Conf_Oper[i].name, Req->argv[0] ) == 0 )) break; | ||||
| 	} | ||||
| 	if( i >= Conf_Oper_Count ) | ||||
| 	{ | ||||
| 		Log( LOG_WARNING, "Got invalid OPER from \"%s\": Name \"%s\" not configured!", Client_Mask( Client ), Req->argv[0] ); | ||||
| 		return IRC_WriteStrClient( Client, ERR_PASSWDMISMATCH_MSG, Client_ID( Client )); | ||||
| 	} | ||||
| 		return Bad_OperPass(Client, Req->argv[0], "not configured"); | ||||
|  | ||||
| 	/* Stimmt das Passwort? */ | ||||
| 	if( strcmp( Conf_Oper[i].pwd, Req->argv[1] ) != 0 ) | ||||
| 	{ | ||||
| 		Log( LOG_WARNING, "Got invalid OPER from \"%s\": Bad password for \"%s\"!", Client_Mask( Client ), Conf_Oper[i].name ); | ||||
| 		return IRC_WriteStrClient( Client, ERR_PASSWDMISMATCH_MSG, Client_ID( Client )); | ||||
| 	} | ||||
| 		return Bad_OperPass(Client, Conf_Oper[i].name, "Bad password"); | ||||
|  | ||||
| 	/* Authorized Mask? */ | ||||
| 	if( Conf_Oper[i].mask && (! Match( Conf_Oper[i].mask, Client_Mask( Client ) ))) | ||||
| 		return Bad_OperPass(Client, Conf_Oper[i].mask, "hostmask check failed" ); | ||||
|  | ||||
| 	if( ! Client_HasMode( Client, 'o' )) | ||||
| 	{ | ||||
| @@ -70,45 +84,133 @@ GLOBAL BOOLEAN IRC_OPER( CLIENT *Client, REQUEST *Req ) | ||||
|  | ||||
| 	if( ! Client_OperByMe( Client )) Log( LOG_NOTICE|LOG_snotice, "Got valid OPER from \"%s\", user is an IRC operator now.", Client_Mask( Client )); | ||||
|  | ||||
| 	Client_SetOperByMe( Client, TRUE ); | ||||
| 	Client_SetOperByMe( Client, true); | ||||
| 	return IRC_WriteStrClient( Client, RPL_YOUREOPER_MSG, Client_ID( Client )); | ||||
| } /* IRC_OPER */ | ||||
|  | ||||
|  | ||||
| GLOBAL BOOLEAN IRC_DIE( CLIENT *Client, REQUEST *Req ) | ||||
| GLOBAL bool | ||||
| IRC_DIE( CLIENT *Client, REQUEST *Req ) | ||||
| { | ||||
| 	/* Shut down server */ | ||||
|  | ||||
| 	assert( Client != NULL ); | ||||
| 	assert( Req != NULL ); | ||||
|  | ||||
| 	if( Client_Type( Client ) != CLIENT_USER ) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client )); | ||||
|  | ||||
| 	/* Falsche Anzahl Parameter? */ | ||||
| 	/* Not a local IRC operator? */ | ||||
| 	if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client )); | ||||
| 	 | ||||
| 	/* Bad number of parameters? */ | ||||
| 	if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); | ||||
|  | ||||
| 	if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client )); | ||||
|  | ||||
| 	Log( LOG_NOTICE|LOG_snotice, "Got DIE command from \"%s\", going down!", Client_Mask( Client )); | ||||
| 	NGIRCd_Quit = TRUE; | ||||
| 	Log( LOG_NOTICE|LOG_snotice, "Got DIE command from \"%s\" ...", Client_Mask( Client )); | ||||
| 	NGIRCd_SignalQuit = true; | ||||
| 	return CONNECTED; | ||||
| } /* IRC_DIE */ | ||||
|  | ||||
|  | ||||
| GLOBAL BOOLEAN IRC_RESTART( CLIENT *Client, REQUEST *Req ) | ||||
| GLOBAL bool | ||||
| IRC_REHASH( CLIENT *Client, REQUEST *Req ) | ||||
| { | ||||
| 	/* Reload configuration file */ | ||||
|  | ||||
| 	assert( Client != NULL ); | ||||
| 	assert( Req != NULL ); | ||||
|  | ||||
| 	if( Client_Type( Client ) != CLIENT_USER ) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client )); | ||||
|  | ||||
| 	/* Falsche Anzahl Parameter? */ | ||||
| 	if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); | ||||
|  | ||||
| 	/* Not a local IRC operator? */ | ||||
| 	if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client )); | ||||
|  | ||||
| 	Log( LOG_NOTICE|LOG_snotice, "Got RESTART command from \"%s\", going down!", Client_Mask( Client )); | ||||
| 	NGIRCd_Restart = TRUE; | ||||
| 	/* 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- */ | ||||
|   | ||||
| @@ -2,29 +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-oper.h,v 1.2 2002/03/12 14:37:52 alex Exp $ | ||||
|  * $Id: irc-oper.h,v 1.11 2005/03/19 18:43:48 fw Exp $ | ||||
|  * | ||||
|  * irc-oper.h: IRC-Operator-Befehle (Header) | ||||
|  * IRC operator commands (header) | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef __irc_oper_h__ | ||||
| #define __irc_oper_h__ | ||||
|  | ||||
| #include "parse.h" | ||||
| #include "client.h" | ||||
|  | ||||
|  | ||||
| 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 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 | ||||
|   | ||||
| @@ -2,44 +2,55 @@ | ||||
|  * 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-server.c,v 1.8 2002/03/27 20:52:58 alex Exp $ | ||||
|  * | ||||
|  * irc-server.c: IRC-Befehle fuer Server-Links | ||||
|  * 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 BOOLEAN IRC_SERVER( CLIENT *Client, REQUEST *Req ) | ||||
| GLOBAL bool | ||||
| IRC_SERVER( CLIENT *Client, REQUEST *Req ) | ||||
| { | ||||
| 	CHAR str[LINE_LEN], *ptr; | ||||
| 	char str[LINE_LEN], *ptr, *modes, *topic; | ||||
| 	CLIENT *from, *c, *cl; | ||||
| 	CL2CHAN *cl2chan; | ||||
| 	INT max_hops, i; | ||||
| 	int max_hops, i; | ||||
| 	CHANNEL *chan; | ||||
| 	BOOLEAN ok; | ||||
| 	bool ok; | ||||
| 	CONN_ID con; | ||||
| 	 | ||||
| 	assert( Client != NULL ); | ||||
| 	assert( Req != NULL ); | ||||
| @@ -56,19 +67,19 @@ GLOBAL BOOLEAN IRC_SERVER( CLIENT *Client, REQUEST *Req ) | ||||
| 		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 ) | ||||
| 		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 ); | ||||
| 			Conn_Close( Client_Conn( Client ), NULL, "Server not configured here", true); | ||||
| 			return DISCONNECTED; | ||||
| 		} | ||||
| 		if( strcmp( Client_Password( Client ), Conf_Server[i].pwd ) != 0 ) | ||||
| 		if( strcmp( Client_Password( Client ), Conf_Server[i].pwd_in ) != 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 ); | ||||
| 			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; | ||||
| 		} | ||||
| 		 | ||||
| @@ -79,27 +90,48 @@ GLOBAL BOOLEAN IRC_SERVER( CLIENT *Client, REQUEST *Req ) | ||||
| 		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 ) | ||||
|  | ||||
| 		/* 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 ) | ||||
| 		{ | ||||
| 			/* Unseren SERVER- und PASS-Befehl senden */ | ||||
| 			ok = TRUE; | ||||
| 			if( ! IRC_WriteStrClient( Client, "PASS %s "PASSSERVERADD, Conf_Server[i].pwd )) ok = FALSE; | ||||
| 			/* 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( Client_Conn( Client ), "Unexpected server behavior!", NULL, FALSE ); | ||||
| 				Conn_Close( con, "Unexpected server behavior!", NULL, false ); | ||||
| 				return DISCONNECTED; | ||||
| 			} | ||||
| 			Client_SetIntroducer( Client, Client ); | ||||
| 			Client_SetToken( Client, 1 ); | ||||
| 		} | ||||
| 		else  Client_SetToken( Client, atoi( Req->argv[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 ), Client_Conn( Client )); | ||||
| 		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; | ||||
| @@ -149,25 +181,57 @@ GLOBAL BOOLEAN IRC_SERVER( CLIENT *Client, REQUEST *Req ) | ||||
| 		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 ); | ||||
| 			sprintf( str, "NJOIN %s :", Channel_Name( 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] != ':' ) 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( 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, str )) return DISCONNECTED; | ||||
| 					sprintf( str, "NJOIN %s :", Channel_Name( chan )); | ||||
| 					if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED; | ||||
| 					snprintf( str, sizeof( str ), "NJOIN %s :", Channel_Name( chan )); | ||||
| 				} | ||||
| 				 | ||||
| 				cl2chan = Channel_NextMember( chan, cl2chan ); | ||||
| @@ -177,9 +241,21 @@ GLOBAL BOOLEAN IRC_SERVER( CLIENT *Client, REQUEST *Req ) | ||||
| 			if( str[strlen( str ) - 1] != ':') | ||||
| 			{ | ||||
| 				/* Ja; Also senden ... */ | ||||
| 				if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED; | ||||
| 				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 ); | ||||
| 		} | ||||
| @@ -205,22 +281,22 @@ GLOBAL BOOLEAN IRC_SERVER( CLIENT *Client, REQUEST *Req ) | ||||
| 		{ | ||||
| 			/* Hm, Server, der diesen einfuehrt, ist nicht bekannt!? */ | ||||
| 			Log( LOG_ALERT, "Unknown ID in prefix of SERVER: \"%s\"! (on connection %d)", Req->prefix, Client_Conn( Client )); | ||||
| 			Conn_Close( Client_Conn( Client ), NULL, "Unknown ID in prefix of SERVER", TRUE ); | ||||
| 			Conn_Close( Client_Conn( Client ), NULL, "Unknown ID in prefix of SERVER", true); | ||||
| 			return DISCONNECTED; | ||||
| 		} | ||||
|  | ||||
| 		/* Neue Client-Struktur anlegen */ | ||||
| 		c = Client_NewRemoteServer( Client, Req->argv[0], from, atoi( Req->argv[1] ), atoi( Req->argv[2] ), ptr, TRUE ); | ||||
| 		c = Client_NewRemoteServer( Client, Req->argv[0], from, atoi( Req->argv[1] ), atoi( Req->argv[2] ), ptr, true); | ||||
| 		if( ! c ) | ||||
| 		{ | ||||
| 			/* Neue Client-Struktur konnte nicht angelegt werden */ | ||||
| 			Log( LOG_ALERT, "Can't create client structure for server! (on connection %d)", Client_Conn( Client )); | ||||
| 			Conn_Close( Client_Conn( Client ), NULL, "Can't allocate client structure for remote server", TRUE ); | ||||
| 			Conn_Close( Client_Conn( Client ), NULL, "Can't allocate client structure for remote server", true); | ||||
| 			return DISCONNECTED; | ||||
| 		} | ||||
|  | ||||
| 		/* Log-Meldung zusammenbauen und ausgeben */ | ||||
| 		if(( Client_Hops( c ) > 1 ) && ( Req->prefix[0] )) sprintf( str, "connected to %s, ", Client_ID( from )); | ||||
| 		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": "" ); | ||||
|  | ||||
| @@ -233,32 +309,34 @@ GLOBAL BOOLEAN IRC_SERVER( CLIENT *Client, REQUEST *Req ) | ||||
| } /* IRC_SERVER */ | ||||
|  | ||||
|  | ||||
| GLOBAL BOOLEAN IRC_NJOIN( CLIENT *Client, REQUEST *Req ) | ||||
| GLOBAL bool | ||||
| IRC_NJOIN( CLIENT *Client, REQUEST *Req ) | ||||
| { | ||||
| 	CHAR *channame, *ptr, modes[8]; | ||||
| 	BOOLEAN is_op, is_voiced; | ||||
| 	char nick_in[COMMAND_LEN], nick_out[COMMAND_LEN], *channame, *ptr, modes[8]; | ||||
| 	bool is_op, is_voiced; | ||||
| 	CHANNEL *chan; | ||||
| 	CLIENT *c; | ||||
| 	 | ||||
| 	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 ); | ||||
|  | ||||
| 	strlcpy( nick_in, Req->argv[1], sizeof( nick_in )); | ||||
| 	strcpy( nick_out, "" ); | ||||
|  | ||||
| 	channame = Req->argv[0]; | ||||
| 	ptr = strtok( Req->argv[1], "," ); | ||||
| 	ptr = strtok( nick_in, "," ); | ||||
| 	while( ptr ) | ||||
| 	{ | ||||
| 		is_op = is_voiced = FALSE; | ||||
| 		is_op = is_voiced = false; | ||||
| 		 | ||||
| 		/* Prefixe abschneiden */ | ||||
| 		while(( *ptr == '@' ) || ( *ptr == '+' )) | ||||
| 		{ | ||||
| 			if( *ptr == '@' ) is_op = TRUE; | ||||
| 			if( *ptr == '+' ) is_voiced = TRUE; | ||||
| 			if( *ptr == '@' ) is_op = true; | ||||
| 			if( *ptr == '+' ) is_voiced = true; | ||||
| 			ptr++; | ||||
| 		} | ||||
|  | ||||
| @@ -273,15 +351,20 @@ GLOBAL BOOLEAN IRC_NJOIN( CLIENT *Client, REQUEST *Req ) | ||||
| 			if( is_voiced ) Channel_UserModeAdd( chan, c, 'v' ); | ||||
|  | ||||
| 			/* im Channel bekannt machen */ | ||||
| 			IRC_WriteStrChannelPrefix( Client, chan, c, FALSE, "JOIN :%s", channame ); | ||||
| 			IRC_WriteStrChannelPrefix( Client, chan, c, false, "JOIN :%s", channame ); | ||||
|  | ||||
| 			/* Channel-User-Modes setzen */ | ||||
| 			strcpy( modes, Channel_UserModes( chan, c )); | ||||
| 			strlcpy( modes, Channel_UserModes( chan, c ), sizeof( modes )); | ||||
| 			if( modes[0] ) | ||||
| 			{ | ||||
| 				/* Modes im Channel bekannt machen */ | ||||
| 				IRC_WriteStrChannelPrefix( Client, chan, Client, FALSE, "MODE %s +%s %s", channame, modes, Client_ID( c )); | ||||
| 				IRC_WriteStrChannelPrefix( Client, chan, Client, false, "MODE %s +%s %s", channame, modes, Client_ID( c )); | ||||
| 			} | ||||
|  | ||||
| 			if( nick_out[0] != '\0' ) strlcat( nick_out, ",", sizeof( nick_out )); | ||||
| 			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 ); | ||||
| 		 | ||||
| @@ -290,31 +373,26 @@ GLOBAL BOOLEAN IRC_NJOIN( CLIENT *Client, REQUEST *Req ) | ||||
| 	} | ||||
|  | ||||
| 	/* an andere Server weiterleiten */ | ||||
| 	IRC_WriteStrServersPrefix( Client, Client_ThisServer( ), "NJOIN %s :%s", Req->argv[0], Req->argv[1] ); | ||||
| 	if( nick_out[0] != '\0' ) IRC_WriteStrServersPrefix( Client, Client_ThisServer( ), "NJOIN %s :%s", Req->argv[0], nick_out ); | ||||
|  | ||||
| 	return CONNECTED; | ||||
| } /* IRC_NJOIN */ | ||||
|  | ||||
|  | ||||
| GLOBAL BOOLEAN IRC_SQUIT( CLIENT *Client, REQUEST *Req ) | ||||
| GLOBAL bool | ||||
| IRC_SQUIT( CLIENT *Client, REQUEST *Req ) | ||||
| { | ||||
| 	CLIENT *target; | ||||
| 	CHAR msg[LINE_LEN + 64]; | ||||
| 	char msg[LINE_LEN + 64]; | ||||
|  | ||||
| 	assert( Client != NULL ); | ||||
| 	assert( Req != NULL ); | ||||
|  | ||||
| 	/* 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_Search( Req->argv[0] ); | ||||
| 	if( ! target ) | ||||
| 	{ | ||||
| @@ -326,21 +404,21 @@ GLOBAL BOOLEAN IRC_SQUIT( CLIENT *Client, REQUEST *Req ) | ||||
| 	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 )); | ||||
| 		snprintf( msg, sizeof( msg ), "%s (SQUIT from %s).", Req->argv[1], Client_ID( Client )); | ||||
| 	} | ||||
| 	else sprintf( msg, "Got SQUIT from %s.", 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 ); | ||||
| 		if( Req->argv[1][0] ) Conn_Close( Client_Conn( target ), msg, Req->argv[1], true); | ||||
| 		else Conn_Close( Client_Conn( target ), msg, NULL, true); | ||||
| 		return DISCONNECTED; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		/* Verbindung hielt anderer Server */ | ||||
| 		Client_Destroy( target, msg, Req->argv[1], FALSE ); | ||||
| 		Client_Destroy( target, msg, Req->argv[1], false ); | ||||
| 		return CONNECTED; | ||||
| 	} | ||||
| } /* IRC_SQUIT */ | ||||
|   | ||||
| @@ -2,29 +2,25 @@ | ||||
|  * 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-server.h,v 1.2 2002/03/12 14:37:52 alex Exp $ | ||||
|  * $Id: irc-server.h,v 1.5 2005/03/19 18:43:49 fw Exp $ | ||||
|  * | ||||
|  * irc-server.h: IRC-Befehle fuer Server-Links (Header) | ||||
|  * IRC commands for server links (header) | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef __irc_server_h__ | ||||
| #define __irc_server_h__ | ||||
|  | ||||
| #include "parse.h" | ||||
| #include "client.h" | ||||
|  | ||||
|  | ||||
| GLOBAL BOOLEAN IRC_SERVER( CLIENT *Client, REQUEST *Req ); | ||||
| GLOBAL BOOLEAN IRC_NJOIN( CLIENT *Client, REQUEST *Req ); | ||||
| GLOBAL BOOLEAN IRC_SQUIT( CLIENT *Client, REQUEST *Req ); | ||||
| GLOBAL bool IRC_SERVER PARAMS((CLIENT *Client, REQUEST *Req )); | ||||
| GLOBAL bool IRC_NJOIN PARAMS((CLIENT *Client, REQUEST *Req )); | ||||
| GLOBAL bool IRC_SQUIT PARAMS((CLIENT *Client, REQUEST *Req )); | ||||
|  | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -1,68 +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. | ||||
|  * 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.c,v 1.3 2002/03/25 17:13:07 alex Exp $ | ||||
|  * | ||||
|  * irc-write.c: IRC-Texte und Befehle ueber Netzwerk versenden | ||||
|  * Sending IRC commands over the network | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include "portab.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 "defines.h" | ||||
| #include "conn-func.h" | ||||
| #include "client.h" | ||||
| #include "channel.h" | ||||
|  | ||||
| #include "exp.h" | ||||
| #include "irc-write.h" | ||||
|  | ||||
|  | ||||
| LOCAL 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 ); | ||||
|  | ||||
| @@ -70,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 ); | ||||
| @@ -100,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 */ | ||||
| @@ -122,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 ); | ||||
| 	 | ||||
| @@ -180,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. */ | ||||
| @@ -230,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 ); | ||||
| 		} | ||||
| @@ -244,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 */ | ||||
|  | ||||
|  | ||||
| LOCAL 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,35 +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.2 2002/03/12 14:37:52 alex Exp $ | ||||
|  * $Id: irc-write.h,v 1.7 2005/03/19 18:43:49 fw Exp $ | ||||
|  * | ||||
|  * irc-write.h: IRC-Texte und Befehle ueber Netzwerk versenden (Header) | ||||
|  * 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 | ||||
|   | ||||
							
								
								
									
										919
									
								
								src/ngircd/irc.c
									
									
									
									
									
								
							
							
						
						
									
										919
									
								
								src/ngircd/irc.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -2,48 +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.30 2002/03/12 14:37:52 alex Exp $ | ||||
|  * $Id: irc.h,v 1.39 2005/03/19 18:43:49 fw Exp $ | ||||
|  * | ||||
|  * irc.h: IRC-Befehle (Header) | ||||
|  * 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_WHO( CLIENT *Client, REQUEST *Req ); | ||||
|  | ||||
| GLOBAL BOOLEAN IRC_ERROR( CLIENT *Client, REQUEST *Req ); | ||||
| GLOBAL BOOLEAN IRC_KILL( 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 BOOLEAN IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps ); | ||||
| 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- */ | ||||
							
								
								
									
										220
									
								
								src/ngircd/log.c
									
									
									
									
									
								
							
							
						
						
									
										220
									
								
								src/ngircd/log.c
									
									
									
									
									
								
							| @@ -1,98 +1,122 @@ | ||||
| /* | ||||
|  * 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.32 2002/03/31 16:46:15 alex Exp $ | ||||
|  * | ||||
|  * log.c: Logging-Funktionen | ||||
|  * Logging functions | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include "portab.h" | ||||
|  | ||||
| static char UNUSED id[] = "$Id: log.c,v 1.57.2.1 2005/08/29 11:19:48 alex Exp $"; | ||||
|  | ||||
| #include "imp.h" | ||||
| #include <assert.h> | ||||
| #include <errno.h> | ||||
| #include <stdarg.h> | ||||
| #ifdef PROTOTYPES | ||||
| #	include <stdarg.h> | ||||
| #else | ||||
| #	include <varargs.h> | ||||
| #endif | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include <sys/types.h> | ||||
| #include <unistd.h> | ||||
|  | ||||
| #ifdef USE_SYSLOG | ||||
| #ifdef SYSLOG | ||||
| #include <syslog.h> | ||||
| #endif | ||||
|  | ||||
| #include "ngircd.h" | ||||
| #include "client.h" | ||||
| #include "defines.h" | ||||
| #include "conn.h" | ||||
| #include "client.h" | ||||
| #include "channel.h" | ||||
| #include "irc-write.h" | ||||
|  | ||||
| #include "exp.h" | ||||
| #include "log.h" | ||||
|  | ||||
|  | ||||
| LOCAL CHAR Error_File[FNAME_LEN]; | ||||
| LOCAL CHAR Init_Txt[127]; | ||||
| LOCAL char Init_Txt[127]; | ||||
| LOCAL bool Is_Daemon; | ||||
|  | ||||
| #ifdef DEBUG | ||||
| LOCAL char Error_File[FNAME_LEN]; | ||||
| #endif | ||||
|  | ||||
|  | ||||
| LOCAL VOID Wall_ServerNotice( CHAR *Msg ); | ||||
| LOCAL void Wall_ServerNotice PARAMS(( char *Msg )); | ||||
|  | ||||
|  | ||||
| GLOBAL VOID Log_Init( VOID ) | ||||
| GLOBAL void | ||||
| Log_Init( bool Daemon_Mode ) | ||||
| { | ||||
| #ifdef USE_SYSLOG | ||||
| 	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( Init_Txt, "" ); | ||||
| 	Init_Txt[0] = '\0'; | ||||
| #ifdef DEBUG | ||||
| 	if( NGIRCd_Debug ) | ||||
| 	{ | ||||
| 		if( Init_Txt[0] ) strcat( Init_Txt, ", " ); | ||||
| 		strcat( Init_Txt, "debug-mode" ); | ||||
| 		strlcpy( Init_Txt, "debug-mode", sizeof Init_Txt ); | ||||
| 	} | ||||
| #endif | ||||
| 	if( NGIRCd_NoDaemon ) | ||||
| 	if( ! Is_Daemon ) | ||||
| 	{ | ||||
| 		if( Init_Txt[0] ) strcat( Init_Txt, ", " ); | ||||
| 		strcat( Init_Txt, "no-daemon-mode" ); | ||||
| 		if( Init_Txt[0] ) strlcat( Init_Txt, ", ", sizeof Init_Txt ); | ||||
| 		strlcat( Init_Txt, "no-daemon-mode", sizeof Init_Txt ); | ||||
| 	} | ||||
| 	if( NGIRCd_Passive ) | ||||
| 	{ | ||||
| 		if( Init_Txt[0] ) strcat( Init_Txt, ", " ); | ||||
| 		strcat( Init_Txt, "passive-mode" ); | ||||
| 		if( Init_Txt[0] ) strlcat( Init_Txt, ", ", sizeof Init_Txt ); | ||||
| 		strlcat( Init_Txt, "passive-mode", sizeof Init_Txt ); | ||||
| 	} | ||||
| #ifdef SNIFFER | ||||
| 	if( NGIRCd_Sniffer ) | ||||
| 	{ | ||||
| 		if( Init_Txt[0] ) strcat( Init_Txt, ", " ); | ||||
| 		strcat( Init_Txt, "network sniffer" ); | ||||
| 		if( Init_Txt[0] ) strlcat( Init_Txt, ", ", sizeof Init_Txt ); | ||||
| 		strlcat( Init_Txt, "network sniffer", sizeof Init_Txt ); | ||||
| 	} | ||||
| #endif | ||||
| 	if( Init_Txt[0] ) Log( LOG_INFO, "Activating: %s.", Init_Txt ); | ||||
|  | ||||
| #ifdef DEBUG | ||||
| 	Error_File[0] = '\0'; | ||||
| #endif | ||||
| } /* Log_Init */ | ||||
|  | ||||
|  | ||||
| GLOBAL VOID Log_InitErrorfile( VOID ) | ||||
| #ifdef DEBUG | ||||
|  | ||||
| GLOBAL void | ||||
| Log_InitErrorfile( void ) | ||||
| { | ||||
| 	/* "Error-Log" initialisieren: stderr in Datei umlenken. Dort | ||||
| 	 * landen z.B. alle Ausgaben von assert()-Aufrufen. */ | ||||
|  | ||||
| 	/* Dateiname zusammen bauen */ | ||||
| 	sprintf( Error_File, ERROR_DIR"/"PACKAGE"-%ld.err", (INT32)getpid( )); | ||||
| 	snprintf( Error_File, sizeof Error_File, "%s/%s-%ld.err", ERROR_DIR, PACKAGE_NAME, (long)getpid( )); | ||||
|  | ||||
| 	/* stderr umlenken */ | ||||
| 	fflush( stderr ); | ||||
| @@ -104,35 +128,55 @@ GLOBAL VOID Log_InitErrorfile( VOID ) | ||||
|  | ||||
| 	/* Einige Infos in das Error-File schreiben */ | ||||
| 	fputs( ctime( &NGIRCd_Start ), stderr ); | ||||
| 	fprintf( stderr, "%s started.\n", NGIRCd_Version( )); | ||||
| 	fprintf( stderr, "%s started.\n", NGIRCd_Version ); | ||||
| 	fprintf( stderr, "Activating: %s\n\n", Init_Txt[0] ? Init_Txt : "-" ); | ||||
| 	fflush( stderr ); | ||||
|  | ||||
| #ifdef DEBUG | ||||
| 	Log( LOG_DEBUG, "Redirected stderr to \"%s\".", Error_File ); | ||||
| #endif | ||||
| } /* Log_InitErrfile */ | ||||
|  | ||||
| #endif | ||||
|  | ||||
| GLOBAL VOID Log_Exit( VOID ) | ||||
|  | ||||
| GLOBAL void | ||||
| Log_Exit( void ) | ||||
| { | ||||
| 	/* Good Bye! */ | ||||
| 	Log( LOG_NOTICE, PACKAGE" done."); | ||||
| 	if( NGIRCd_SignalRestart ) Log( LOG_NOTICE, "%s done (restarting).", PACKAGE_NAME ); | ||||
| 	else Log( LOG_NOTICE, "%s done.", PACKAGE_NAME ); | ||||
|  | ||||
| 	/* Error-File (stderr) loeschen */ | ||||
| 	if( unlink( Error_File ) != 0 ) Log( LOG_ERR, "Can't delete \"%s\": %s", Error_File, strerror( errno )); | ||||
| #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 USE_SYSLOG | ||||
| #ifdef SYSLOG | ||||
| 	/* syslog abmelden */ | ||||
| 	closelog( ); | ||||
| #endif | ||||
| } /* Log_Exit */ | ||||
|  | ||||
|  | ||||
| GLOBAL VOID Log( INT Level, CONST CHAR *Format, ... ) | ||||
| #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]; | ||||
| 	BOOLEAN snotice; | ||||
| 	char msg[MAX_LOG_MSG_LEN]; | ||||
| 	bool snotice; | ||||
| 	va_list ap; | ||||
|  | ||||
| 	assert( Format != NULL ); | ||||
| @@ -140,10 +184,10 @@ GLOBAL VOID Log( INT Level, CONST CHAR *Format, ... ) | ||||
| 	if( Level & LOG_snotice ) | ||||
| 	{ | ||||
| 		/* Notice an User mit "s" Mode */ | ||||
| 		snotice = TRUE; | ||||
| 		snotice = true; | ||||
| 		Level &= ~LOG_snotice; | ||||
| 	} | ||||
| 	else snotice = FALSE; | ||||
| 	else snotice = false; | ||||
|  | ||||
| #ifdef DEBUG | ||||
| 	if(( Level == LOG_DEBUG ) && ( ! NGIRCd_Debug )) return; | ||||
| @@ -152,28 +196,35 @@ GLOBAL VOID Log( INT Level, CONST CHAR *Format, ... ) | ||||
| #endif | ||||
|  | ||||
| 	/* String mit variablen Argumenten zusammenbauen ... */ | ||||
| #ifdef PROTOTYPES | ||||
| 	va_start( ap, Format ); | ||||
| #else | ||||
| 	va_start( ap ); | ||||
| #endif | ||||
| 	vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap ); | ||||
| 	va_end( ap ); | ||||
|  | ||||
| 	if( NGIRCd_NoDaemon ) | ||||
| 	if( ! Is_Daemon ) | ||||
| 	{ | ||||
| 		/* auf Konsole ausgeben */ | ||||
| 		printf( "[%d] %s\n", Level, msg ); | ||||
| 		fprintf( stdout, "[%d:%d] %s\n", (int)getpid( ), Level, msg ); | ||||
| 		fflush( stdout ); | ||||
| 	} | ||||
| #ifdef SYSLOG | ||||
| 	else | ||||
| 	{ | ||||
| 		/* Syslog */ | ||||
| 		syslog( Level, "%s", msg ); | ||||
| 	} | ||||
| #endif | ||||
|  | ||||
| 	if( Level <= LOG_CRIT ) | ||||
| 	{ | ||||
| 		/* Kritische Meldungen in Error-File (stderr) */ | ||||
| 		/* log critical messages to stderr */ | ||||
| 		fprintf( stderr, "%s\n", msg ); | ||||
| 		fflush( stderr ); | ||||
| 	} | ||||
|  | ||||
| #ifdef USE_SYSLOG | ||||
| 	/* Syslog */ | ||||
| 	syslog( Level, msg ); | ||||
| #endif | ||||
|  | ||||
| 	if( snotice ) | ||||
| 	{ | ||||
| 		/* NOTICE an lokale User mit "s"-Mode */ | ||||
| @@ -182,31 +233,44 @@ GLOBAL VOID Log( INT Level, CONST CHAR *Format, ... ) | ||||
| } /* 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 ); | ||||
| @@ -218,29 +282,43 @@ GLOBAL VOID Log_Resolver( CONST INT Level, CONST CHAR *Format, ... ) | ||||
| #endif | ||||
|  | ||||
| 	/* String mit variablen Argumenten zusammenbauen ... */ | ||||
| #ifdef PROTOTYPES | ||||
| 	va_start( ap, Format ); | ||||
| #else | ||||
| 	va_start( ap ); | ||||
| #endif | ||||
| 	vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap ); | ||||
| 	va_end( ap ); | ||||
|  | ||||
| 	/* ... und ausgeben */ | ||||
| 	syslog( Level, msg ); | ||||
|  | ||||
| 	if( ! Is_Daemon ) | ||||
| 	{ | ||||
| 		/* Output to console */ | ||||
| 		fprintf( stdout, "[%d:%d] %s\n", (int)getpid( ), Level, msg ); | ||||
| 		fflush( stdout ); | ||||
| 	} | ||||
| #ifdef SYSLOG | ||||
| 	else syslog( Level, "%s", msg ); | ||||
| #endif | ||||
| } /* Log_Resolver */ | ||||
|  | ||||
|  | ||||
| LOCAL VOID Wall_ServerNotice( CHAR *Msg ) | ||||
| /** | ||||
|  * Send log messages to users flagged with the "s" mode. | ||||
|  * @param Msg The message to send. | ||||
|  */ | ||||
| LOCAL void | ||||
| Wall_ServerNotice( char *Msg ) | ||||
| { | ||||
| 	/* Server-Notice an entsprechende User verschicken */ | ||||
|  | ||||
| 	CLIENT *c; | ||||
|  | ||||
| 	assert( Msg != NULL ); | ||||
|  | ||||
| 	c = Client_First( ); | ||||
| 	while( c ) | ||||
| 	{ | ||||
| 		if(( Client_Conn( c ) > NONE ) && ( Client_HasMode( c, 's' ))) IRC_WriteStrClient( c, "NOTICE %s :%s", Client_ThisServer( ), Msg ); | ||||
| 	while(c) { | ||||
| 		if (Client_Conn(c) > NONE && Client_HasMode(c, 's')) | ||||
| 			IRC_WriteStrClient(c, "NOTICE %s :%s%s", Client_ID(c), | ||||
| 							NOTICE_TXTPREFIX, Msg); | ||||
|  | ||||
| 		c = Client_Next( c ); | ||||
| 	} | ||||
| } /* Wall_ServerNotice */ | ||||
|   | ||||
| @@ -2,16 +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.11 2002/03/29 23:33:42 alex Exp $ | ||||
|  * $Id: log.h,v 1.18 2005/06/24 19:55:10 alex Exp $ | ||||
|  * | ||||
|  * log.h: Logging-Funktionen (Header) | ||||
|  * Logging functions (header) | ||||
|  */ | ||||
|  | ||||
|  | ||||
| @@ -19,7 +18,7 @@ | ||||
| #define __log_h__ | ||||
|  | ||||
|  | ||||
| #ifdef USE_SYSLOG | ||||
| #ifdef SYSLOG | ||||
| #	include <syslog.h> | ||||
| #else | ||||
| #	define LOG_EMERG 0 | ||||
| @@ -36,16 +35,19 @@ | ||||
| #define LOG_snotice 1024 | ||||
|  | ||||
|  | ||||
| GLOBAL VOID Log_Init( VOID ); | ||||
| GLOBAL VOID Log_Exit( VOID ); | ||||
| GLOBAL void Log_Init PARAMS(( bool Daemon_Mode )); | ||||
| GLOBAL void Log_Exit PARAMS(( void )); | ||||
|  | ||||
| GLOBAL VOID Log_InitErrorfile( VOID ); | ||||
| GLOBAL VOID Log( INT Level, CONST CHAR *Format, ... ); | ||||
| GLOBAL void Log PARAMS(( int Level, const char *Format, ... )); | ||||
|  | ||||
| GLOBAL VOID Log_Init_Resolver( VOID ); | ||||
| GLOBAL VOID Log_Exit_Resolver( VOID ); | ||||
| GLOBAL void Log_Init_Resolver PARAMS(( void )); | ||||
| GLOBAL void Log_Exit_Resolver PARAMS(( void )); | ||||
|  | ||||
| GLOBAL VOID Log_Resolver( CONST INT Level, CONST CHAR *Format, ... ); | ||||
| GLOBAL void Log_Resolver PARAMS(( const int Level, const char *Format, ... )); | ||||
|  | ||||
| #ifdef DEBUG | ||||
| GLOBAL void Log_InitErrorfile PARAMS(( void )); | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #endif | ||||
|   | ||||
							
								
								
									
										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,17 +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.37 2002/03/12 22:08:24 alex Exp $ | ||||
|  * $Id: messages.h,v 1.66 2004/02/28 02:18:16 alex Exp $ | ||||
|  * | ||||
|  * irc.h: IRC-Befehle (Header) | ||||
|  * IRC numerics (Header) | ||||
|  */ | ||||
|  | ||||
|  | ||||
| @@ -19,181 +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"-"TARGET_CPU"/"TARGET_VENDOR"/"TARGET_OS | ||||
| #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_ENDOFWHO			"315" | ||||
| #define RPL_ENDOFWHO_MSG		RPL_ENDOFWHO" %s %s :End of WHO list" | ||||
|  | ||||
| #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_WHOREPLY			"352" | ||||
| #define RPL_WHOREPLY_MSG		RPL_WHOREPLY" %s %s %s %s %s %s %s :%d %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 | ||||
|   | ||||
| @@ -1,77 +1,111 @@ | ||||
| /* | ||||
|  * 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: ngircd.c,v 1.41 2002/03/31 13:20:42 alex Exp $ | ||||
|  * | ||||
|  * ngircd.c: Hier beginnt alles ;-) | ||||
|  * 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" | ||||
|  | ||||
| static char UNUSED id[] = "$Id: ngircd.c,v 1.102.2.2 2005/07/08 23:20:04 alex Exp $"; | ||||
|  | ||||
| /** | ||||
|  * @file | ||||
|  * The main program, including the C function main() which is called | ||||
|  * by the loader of the operating system. | ||||
|  */ | ||||
|  | ||||
| #include "imp.h" | ||||
| #include <assert.h> | ||||
| #include <errno.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <signal.h> | ||||
| #include <string.h> | ||||
| #include <unistd.h> | ||||
| #include <sys/types.h> | ||||
| #include <sys/wait.h> | ||||
| #include <time.h> | ||||
| #include <sys/types.h> | ||||
| #include <sys/stat.h> | ||||
| #include <sys/wait.h> | ||||
| #include <fcntl.h> | ||||
| #include <pwd.h> | ||||
| #include <grp.h> | ||||
|  | ||||
| #include "channel.h" | ||||
| #include "client.h" | ||||
| #include "conf.h" | ||||
| #include "conn.h" | ||||
| #include "defines.h" | ||||
| #include "irc.h" | ||||
| #include "resolve.h" | ||||
| #include "conn.h" | ||||
| #include "client.h" | ||||
| #include "channel.h" | ||||
| #include "conf.h" | ||||
| #include "cvs-version.h" | ||||
| #include "lists.h" | ||||
| #include "log.h" | ||||
| #include "parse.h" | ||||
| #include "irc.h" | ||||
|  | ||||
| #ifdef RENDEZVOUS | ||||
| #include "rendezvous.h" | ||||
| #endif | ||||
|  | ||||
| #include "exp.h" | ||||
| #include "ngircd.h" | ||||
|  | ||||
|  | ||||
| LOCAL VOID Initialize_Signal_Handler( VOID ); | ||||
| LOCAL VOID Signal_Handler( INT Signal ); | ||||
| LOCAL void Initialize_Signal_Handler PARAMS(( void )); | ||||
| LOCAL void Signal_Handler PARAMS(( int Signal )); | ||||
|  | ||||
| LOCAL VOID Initialize_Listen_Ports( VOID ); | ||||
| LOCAL void Show_Version PARAMS(( void )); | ||||
| LOCAL void Show_Help PARAMS(( void )); | ||||
|  | ||||
| LOCAL VOID Show_Version( VOID ); | ||||
| LOCAL VOID Show_Help( VOID ); | ||||
| LOCAL void Pidfile_Create PARAMS(( long )); | ||||
| LOCAL void Pidfile_Delete PARAMS(( void )); | ||||
|  | ||||
| LOCAL void Fill_Version PARAMS(( void )); | ||||
|  | ||||
| GLOBAL int main( int argc, const char *argv[] ) | ||||
| LOCAL void Setup_FDStreams PARAMS(( void )); | ||||
|  | ||||
| LOCAL bool NGIRCd_Init PARAMS(( bool )); | ||||
|  | ||||
| /** | ||||
|  * The main() function of ngIRCd. | ||||
|  * Here all starts: this function is called by the operating system loader, | ||||
|  * it is the first portion of code executed of ngIRCd. | ||||
|  * @param argc The number of arguments passed to ngIRCd on the command line. | ||||
|  * @param argv An array containing all the arguments passed to ngIRCd. | ||||
|  * @return Global exit code of ngIRCd, zero on success. | ||||
|  */ | ||||
| GLOBAL int | ||||
| main( int argc, const char *argv[] ) | ||||
| { | ||||
| 	BOOLEAN ok, configtest = FALSE; | ||||
| 	INT32 pid, n; | ||||
| 	INT i; | ||||
| 	bool ok, configtest = false; | ||||
| 	bool NGIRCd_NoDaemon = false; | ||||
| 	int i; | ||||
| 	size_t n; | ||||
|  | ||||
| 	NGIRCd_Restart = FALSE; | ||||
| 	NGIRCd_Quit = FALSE; | ||||
| 	NGIRCd_NoDaemon = FALSE; | ||||
| 	NGIRCd_Passive = FALSE; | ||||
| 	umask( 0077 ); | ||||
|  | ||||
| 	NGIRCd_SignalQuit = NGIRCd_SignalRestart = NGIRCd_SignalRehash = false; | ||||
| 	NGIRCd_Passive = false; | ||||
| #ifdef DEBUG | ||||
| 	NGIRCd_Debug = FALSE; | ||||
| 	NGIRCd_Debug = false; | ||||
| #endif | ||||
| #ifdef SNIFFER | ||||
| 	NGIRCd_Sniffer = FALSE; | ||||
| 	NGIRCd_Sniffer = false; | ||||
| #endif | ||||
| 	strcpy( NGIRCd_ConfFile, CONFIG_FILE ); | ||||
| 	strlcpy( NGIRCd_ConfFile, SYSCONFDIR, sizeof( NGIRCd_ConfFile )); | ||||
| 	strlcat( NGIRCd_ConfFile, CONFIG_FILE, sizeof( NGIRCd_ConfFile )); | ||||
|  | ||||
| 	Fill_Version( ); | ||||
|  | ||||
| 	/* Kommandozeile parsen */ | ||||
| 	for( i = 1; i < argc; i++ ) | ||||
| 	{ | ||||
| 		ok = FALSE; | ||||
| 		ok = false; | ||||
| 		if(( argv[i][0] == '-' ) && ( argv[i][1] == '-' )) | ||||
| 		{ | ||||
| 			/* Lange Option */ | ||||
| @@ -80,24 +114,23 @@ GLOBAL int main( int argc, const char *argv[] ) | ||||
| 			{ | ||||
| 				if( i + 1 < argc ) | ||||
| 				{ | ||||
| 					/* Ok, danach kommt noch ein Parameter */ | ||||
| 					strncpy( NGIRCd_ConfFile, argv[i + 1], FNAME_LEN - 1 ); | ||||
| 					NGIRCd_ConfFile[FNAME_LEN - 1] = '\0'; | ||||
| 					/* Ok, there's an parameter left */ | ||||
| 					strlcpy( NGIRCd_ConfFile, argv[i + 1], sizeof( NGIRCd_ConfFile )); | ||||
|  | ||||
| 					/* zum uebernaechsten Parameter */ | ||||
| 					i++; ok = TRUE; | ||||
| 					/* next parameter */ | ||||
| 					i++; ok = true; | ||||
| 				} | ||||
| 			} | ||||
| 			if( strcmp( argv[i], "--configtest" ) == 0 ) | ||||
| 			{ | ||||
| 				configtest = TRUE; | ||||
| 				ok = TRUE; | ||||
| 				configtest = true; | ||||
| 				ok = true; | ||||
| 			} | ||||
| #ifdef DEBUG | ||||
| 			if( strcmp( argv[i], "--debug" ) == 0 ) | ||||
| 			{ | ||||
| 				NGIRCd_Debug = TRUE; | ||||
| 				ok = TRUE; | ||||
| 				NGIRCd_Debug = true; | ||||
| 				ok = true; | ||||
| 			} | ||||
| #endif | ||||
| 			if( strcmp( argv[i], "--help" ) == 0 ) | ||||
| @@ -108,19 +141,19 @@ GLOBAL int main( int argc, const char *argv[] ) | ||||
| 			} | ||||
| 			if( strcmp( argv[i], "--nodaemon" ) == 0 ) | ||||
| 			{ | ||||
| 				NGIRCd_NoDaemon = TRUE; | ||||
| 				ok = TRUE; | ||||
| 				NGIRCd_NoDaemon = true; | ||||
| 				ok = true; | ||||
| 			} | ||||
| 			if( strcmp( argv[i], "--passive" ) == 0 ) | ||||
| 			{ | ||||
| 				NGIRCd_Passive = TRUE; | ||||
| 				ok = TRUE; | ||||
| 				NGIRCd_Passive = true; | ||||
| 				ok = true; | ||||
| 			} | ||||
| #ifdef SNIFFER | ||||
| 			if( strcmp( argv[i], "--sniffer" ) == 0 ) | ||||
| 			{ | ||||
| 				NGIRCd_Sniffer = TRUE; | ||||
| 				ok = TRUE; | ||||
| 				NGIRCd_Sniffer = true; | ||||
| 				ok = true; | ||||
| 			} | ||||
| #endif | ||||
| 			if( strcmp( argv[i], "--version" ) == 0 ) | ||||
| @@ -132,52 +165,56 @@ GLOBAL int main( int argc, const char *argv[] ) | ||||
| 		else if(( argv[i][0] == '-' ) && ( argv[i][1] != '-' )) | ||||
| 		{ | ||||
| 			/* Kurze Option */ | ||||
| 			 | ||||
| 			for( n = 1; n < (INT32)strlen( argv[i] ); n++ ) | ||||
| 			for( n = 1; n < strlen( argv[i] ); n++ ) | ||||
| 			{ | ||||
| 				ok = FALSE; | ||||
| 				ok = false; | ||||
| #ifdef DEBUG | ||||
| 				if( argv[i][n] == 'd' ) | ||||
| 				{ | ||||
| 					NGIRCd_Debug = TRUE; | ||||
| 					ok = TRUE; | ||||
| 					NGIRCd_Debug = true; | ||||
| 					ok = true; | ||||
| 				} | ||||
| #endif | ||||
| 				if( argv[i][n] == 'f' ) | ||||
| 				{ | ||||
| 					if(( ! argv[i][n + 1] ) && ( i + 1 < argc )) | ||||
| 					{ | ||||
| 						/* Ok, danach kommt ein Leerzeichen */ | ||||
| 						strncpy( NGIRCd_ConfFile, argv[i + 1], FNAME_LEN - 1 ); | ||||
| 						NGIRCd_ConfFile[FNAME_LEN - 1] = '\0'; | ||||
| 						/* Ok, next character is a blank */ | ||||
| 						strlcpy( NGIRCd_ConfFile, argv[i + 1], sizeof( NGIRCd_ConfFile )); | ||||
|  | ||||
| 						/* zum uebernaechsten Parameter */ | ||||
| 						i++; n = strlen( argv[i] ); | ||||
| 						ok = TRUE; | ||||
| 						/* go to the following parameter */ | ||||
| 						i++; | ||||
| 						n = strlen( argv[i] ); | ||||
| 						ok = true; | ||||
| 					} | ||||
| 				} | ||||
| 				if( argv[i][n] == 'n' ) | ||||
| 				{ | ||||
| 					NGIRCd_NoDaemon = TRUE; | ||||
| 					ok = TRUE; | ||||
| 					NGIRCd_NoDaemon = true; | ||||
| 					ok = true; | ||||
| 				} | ||||
| 				if( argv[i][n] == 'p' ) | ||||
| 				{ | ||||
| 					NGIRCd_Passive = TRUE; | ||||
| 					ok = TRUE; | ||||
| 					NGIRCd_Passive = true; | ||||
| 					ok = true; | ||||
| 				} | ||||
| #ifdef SNIFFER | ||||
| 				if( argv[i][n] == 's' ) | ||||
| 				{ | ||||
| 					NGIRCd_Sniffer = TRUE; | ||||
| 					ok = TRUE; | ||||
| 					NGIRCd_Sniffer = true; | ||||
| 					ok = true; | ||||
| 				} | ||||
| #endif | ||||
| 				if( argv[i][n] == 't' ) | ||||
| 				{ | ||||
| 					configtest = true; | ||||
| 					ok = true; | ||||
| 				} | ||||
|  | ||||
| 				if( ! ok ) | ||||
| 				{ | ||||
| 					printf( PACKAGE": invalid option \"-%c\"!\n", argv[i][n] ); | ||||
| 					puts( "Try \""PACKAGE" --help\" for more information." ); | ||||
| 					printf( "%s: invalid option \"-%c\"!\n", PACKAGE_NAME, argv[i][n] ); | ||||
| 					printf( "Try \"%s --help\" for more information.\n", PACKAGE_NAME ); | ||||
| 					exit( 1 ); | ||||
| 				} | ||||
| 			} | ||||
| @@ -185,19 +222,23 @@ GLOBAL int main( int argc, const char *argv[] ) | ||||
| 		} | ||||
| 		if( ! ok ) | ||||
| 		{ | ||||
| 			printf( PACKAGE": invalid option \"%s\"!\n", argv[i] ); | ||||
| 			puts( "Try \""PACKAGE" --help\" for more information." ); | ||||
| 			printf( "%s: invalid option \"%s\"!\n", PACKAGE_NAME, argv[i] ); | ||||
| 			printf( "Try \"%s --help\" for more information.\n", PACKAGE_NAME ); | ||||
| 			exit( 1 ); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/* Debug-Level (fuer IRC-Befehl "VERSION") ermitteln */ | ||||
| 	strcpy( NGIRCd_DebugLevel, "" ); | ||||
| 	NGIRCd_DebugLevel[0] = '\0'; | ||||
| #ifdef DEBUG | ||||
| 	if( NGIRCd_Debug ) strcpy( NGIRCd_DebugLevel, "1" ); | ||||
| #endif | ||||
| #ifdef SNIFFER | ||||
| 	if( NGIRCd_Sniffer ) strcpy( NGIRCd_DebugLevel, "2" ); | ||||
| 	if( NGIRCd_Sniffer ) | ||||
| 	{ | ||||
| 		NGIRCd_Debug = true; | ||||
| 		strcpy( NGIRCd_DebugLevel, "2" ); | ||||
| 	} | ||||
| #endif | ||||
|  | ||||
| 	/* Soll nur die Konfigurations ueberprueft und ausgegeben werden? */ | ||||
| @@ -207,130 +248,219 @@ GLOBAL int main( int argc, const char *argv[] ) | ||||
| 		exit( Conf_Test( )); | ||||
| 	} | ||||
| 	 | ||||
| 	while( ! NGIRCd_Quit ) | ||||
| 	while( ! NGIRCd_SignalQuit ) | ||||
| 	{ | ||||
| 		/* In der Regel wird ein Sub-Prozess ge-fork()'t, der | ||||
| 		 * nicht mehr mit dem Terminal verbunden ist. Mit der | ||||
| 		 * Option "--nodaemon" kann dies (z.B. zum Debuggen) | ||||
| 		 * verhindert werden. */ | ||||
| 		if( ! NGIRCd_NoDaemon ) | ||||
| 		{ | ||||
| 			/* Daemon im Hintergrund erzeugen */ | ||||
| 			pid = (INT32)fork( ); | ||||
| 			if( pid > 0 ) | ||||
| 			{ | ||||
| 				/* "alter" Prozess */ | ||||
| 				exit( 0 ); | ||||
| 			} | ||||
| 			if( pid < 0 ) | ||||
| 			{ | ||||
| 				/* Fehler */ | ||||
| 				printf( PACKAGE": Can't fork: %s!\nFatal error, exiting now ...", strerror( errno )); | ||||
| 				exit( 1 ); | ||||
| 			} | ||||
|  | ||||
| 			/* Child-Prozess initialisieren */ | ||||
| 			(VOID)setsid( ); | ||||
| 			chdir( "/" ); | ||||
| 		} | ||||
| 	 | ||||
| 		/* Globale Variablen initialisieren */ | ||||
| 		/* Initialize global variables */ | ||||
| 		NGIRCd_Start = time( NULL ); | ||||
| 		(VOID)strftime( NGIRCd_StartStr, 64, "%a %b %d %Y at %H:%M:%S (%Z)", localtime( &NGIRCd_Start )); | ||||
| 		NGIRCd_Restart = FALSE; | ||||
| 		NGIRCd_Quit = FALSE; | ||||
| 		(void)strftime( NGIRCd_StartStr, 64, "%a %b %d %Y at %H:%M:%S (%Z)", localtime( &NGIRCd_Start )); | ||||
|  | ||||
| 		/* Module initialisieren */ | ||||
| 		Log_Init( ); | ||||
| 		NGIRCd_SignalRehash = false; | ||||
| 		NGIRCd_SignalRestart = false; | ||||
| 		NGIRCd_SignalQuit = false; | ||||
|  | ||||
| 		/* Initialize modules, part I */ | ||||
| 		Log_Init( ! NGIRCd_NoDaemon ); | ||||
| 		Conf_Init( ); | ||||
|  | ||||
| 		if (!NGIRCd_Init( NGIRCd_NoDaemon )) { | ||||
| 			Log(LOG_WARNING, "Fatal: Initialization failed"); | ||||
| 			exit(1); | ||||
| 		} | ||||
|  | ||||
| 		/* Initialize modules, part II: these functions are eventually | ||||
| 		 * called with already dropped privileges ... */ | ||||
| 		Resolve_Init( ); | ||||
| 		Lists_Init( ); | ||||
| 		Channel_Init( ); | ||||
| 		Client_Init( ); | ||||
| #ifdef RENDEZVOUS | ||||
| 		Rendezvous_Init( ); | ||||
| #endif | ||||
| 		Conn_Init( ); | ||||
|  | ||||
| 		/* Wenn als root ausgefuehrt und eine andere UID | ||||
| 		 * konfiguriert ist, jetzt zu dieser wechseln */ | ||||
| 		if( getuid( ) == 0 ) | ||||
| 		{ | ||||
| 			if( Conf_GID != 0 ) | ||||
| 			{ | ||||
| 				/* Neue Group-ID setzen */ | ||||
| 				if( setgid( Conf_GID ) != 0 ) Log( LOG_ERR, "Can't change Group-ID to %u: %s", Conf_GID, strerror( errno )); | ||||
| 			} | ||||
| 			if( Conf_UID != 0 ) | ||||
| 			{ | ||||
| 				/* Neue User-ID setzen */ | ||||
| 				if( setuid( Conf_UID ) != 0 ) Log( LOG_ERR, "Can't change User-ID to %u: %s", Conf_UID, strerror( errno )); | ||||
| 			} | ||||
| 		} | ||||
| 		Log( LOG_INFO, "Running as user %ld, group %ld.", (INT32)getuid( ), (INT32)getgid( )); | ||||
|  | ||||
| 		Log_InitErrorfile( ); | ||||
| #ifdef DEBUG | ||||
| 		/* Redirect stderr handle to "error file" for debugging | ||||
| 		 * when not running in "no daemon" mode: */ | ||||
| 		if( ! NGIRCd_NoDaemon ) Log_InitErrorfile( ); | ||||
| #endif | ||||
|  | ||||
| 		/* Signal-Handler initialisieren */ | ||||
| 		Initialize_Signal_Handler( ); | ||||
|  | ||||
| 		/* Listen-Ports initialisieren */ | ||||
| 		Initialize_Listen_Ports( ); | ||||
| 		/* Protokoll- und Server-Identifikation erzeugen. Die vom ngIRCd | ||||
| 		 * beim PASS-Befehl verwendete Syntax sowie die erweiterten Flags | ||||
| 		 * sind in doc/Protocol.txt beschrieben. */ | ||||
| #ifdef IRCPLUS | ||||
| 		snprintf( NGIRCd_ProtoID, sizeof NGIRCd_ProtoID, "%s%s %s|%s:%s", PROTOVER, PROTOIRCPLUS, PACKAGE_NAME, PACKAGE_VERSION, IRCPLUSFLAGS ); | ||||
| #ifdef ZLIB | ||||
| 		strcat( NGIRCd_ProtoID, "Z" ); | ||||
| #endif | ||||
| 		if( Conf_OperCanMode ) strcat( NGIRCd_ProtoID, "o" ); | ||||
| #else | ||||
| 		snprintf( NGIRCd_ProtoID, sizeof NGIRCd_ProtoID, "%s%s %s|%s", PROTOVER, PROTOIRC, PACKAGE_NAME, PACKAGE_VERSION ); | ||||
| #endif | ||||
| 		strlcat( NGIRCd_ProtoID, " P", sizeof NGIRCd_ProtoID ); | ||||
| #ifdef ZLIB | ||||
| 		strlcat( NGIRCd_ProtoID, "Z", sizeof NGIRCd_ProtoID ); | ||||
| #endif | ||||
| 		Log( LOG_DEBUG, "Protocol and server ID is \"%s\".", NGIRCd_ProtoID ); | ||||
|  | ||||
| 		/* Hauptschleife */ | ||||
| 		while( TRUE ) | ||||
| 		/* Vordefinierte Channels anlegen */ | ||||
| 		Channel_InitPredefined( ); | ||||
|  | ||||
| 		/* Listen-Ports initialisieren */ | ||||
| 		if( Conn_InitListeners( ) < 1 ) | ||||
| 		{ | ||||
| 			if( NGIRCd_Quit || NGIRCd_Restart ) break; | ||||
| 			Conn_Handler( 5 ); | ||||
| 			Log( LOG_ALERT, "Server isn't listening on a single port!" ); | ||||
| 			Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME ); | ||||
| 			Pidfile_Delete( ); | ||||
| 			exit( 1 ); | ||||
| 		} | ||||
| 		 | ||||
| 		/* Hauptschleife */ | ||||
| 		Conn_Handler( ); | ||||
|  | ||||
| 		/* Alles abmelden */ | ||||
| 		Conn_Exit( ); | ||||
| #ifdef RENDEZVOUS | ||||
| 		Rendezvous_Exit( ); | ||||
| #endif | ||||
| 		Client_Exit( ); | ||||
| 		Channel_Exit( ); | ||||
| 		Conf_Exit( ); | ||||
| 		Lists_Exit( ); | ||||
| 		Log_Exit( ); | ||||
| 	} | ||||
| 	Pidfile_Delete( ); | ||||
|  | ||||
| 	return 0; | ||||
| } /* main */ | ||||
|  | ||||
|  | ||||
| GLOBAL CHAR *NGIRCd_Version( VOID ) | ||||
| /** | ||||
|  * Generate ngIRCd "version string". | ||||
|  * This string is generated once and then stored in NGIRCd_Version for | ||||
|  * further usage, for example by the IRC command VERSION and the --version | ||||
|  * command line switch. | ||||
|  */ | ||||
| LOCAL void | ||||
| Fill_Version( void ) | ||||
| { | ||||
| 	STATIC CHAR version[126]; | ||||
| 	NGIRCd_VersionAddition[0] = '\0'; | ||||
|  | ||||
| 	sprintf( version, PACKAGE" version "VERSION"-%s", NGIRCd_VersionAddition( )); | ||||
| 	return version; | ||||
| } /* NGIRCd_Version */ | ||||
|  | ||||
|  | ||||
| GLOBAL CHAR *NGIRCd_VersionAddition( VOID ) | ||||
| { | ||||
| 	STATIC CHAR txt[64]; | ||||
|  | ||||
| 	strcpy( txt, "" ); | ||||
|  | ||||
| #ifdef USE_SYSLOG | ||||
| 	if( txt[0] ) strcat( txt, "+" ); | ||||
| 	strcat( txt, "SYSLOG" ); | ||||
| #ifdef SYSLOG | ||||
| 	strlcpy( NGIRCd_VersionAddition, "SYSLOG", sizeof NGIRCd_VersionAddition ); | ||||
| #endif | ||||
| #ifdef STRICT_RFC | ||||
| 	if( txt[0] ) strcat( txt, "+" ); | ||||
| 	strcat( txt, "RFC" ); | ||||
| #ifdef ZLIB | ||||
| 	if( NGIRCd_VersionAddition[0] ) | ||||
| 		strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition ); | ||||
|  | ||||
| 	strlcat( NGIRCd_VersionAddition, "ZLIB", sizeof NGIRCd_VersionAddition ); | ||||
| #endif | ||||
| #ifdef TCPWRAP | ||||
| 	if( NGIRCd_VersionAddition[0] ) | ||||
| 			strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition ); | ||||
|  | ||||
| 	strlcat( NGIRCd_VersionAddition, "TCPWRAP", sizeof NGIRCd_VersionAddition ); | ||||
| #endif | ||||
| #ifdef RENDEZVOUS | ||||
| 	if( NGIRCd_VersionAddition[0] ) | ||||
| 		strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition ); | ||||
|  | ||||
| 	strlcat( NGIRCd_VersionAddition, "RENDEZVOUS", sizeof NGIRCd_VersionAddition ); | ||||
| #endif | ||||
| #ifdef IDENTAUTH | ||||
| 	if( NGIRCd_VersionAddition[0] ) | ||||
| 		strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition ); | ||||
|  | ||||
| 	strlcat( NGIRCd_VersionAddition, "IDENT", sizeof NGIRCd_VersionAddition ); | ||||
| #endif | ||||
| #ifdef DEBUG | ||||
| 	if( txt[0] ) strcat( txt, "+" ); | ||||
| 	strcat( txt, "DEBUG" ); | ||||
| 	if( NGIRCd_VersionAddition[0] ) | ||||
| 		strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition ); | ||||
|  | ||||
| 	strlcat( NGIRCd_VersionAddition, "DEBUG", sizeof NGIRCd_VersionAddition ); | ||||
| #endif | ||||
| #ifdef SNIFFER | ||||
| 	if( txt[0] ) strcat( txt, "+" ); | ||||
| 	strcat( txt, "SNIFFER" ); | ||||
| 	if( NGIRCd_VersionAddition[0] ) | ||||
| 		strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition ); | ||||
|  | ||||
| 	strlcat( NGIRCd_VersionAddition, "SNIFFER", sizeof NGIRCd_VersionAddition ); | ||||
| #endif | ||||
| #ifdef STRICT_RFC | ||||
| 	if( NGIRCd_VersionAddition[0] ) | ||||
| 		strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition ); | ||||
|  | ||||
| 	strlcat( NGIRCd_VersionAddition, "RFC", sizeof NGIRCd_VersionAddition ); | ||||
| #endif | ||||
| #ifdef IRCPLUS | ||||
| 	if( NGIRCd_VersionAddition[0] ) | ||||
| 		strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition ); | ||||
|  | ||||
| 	strlcat( NGIRCd_VersionAddition, "IRCPLUS", sizeof NGIRCd_VersionAddition ); | ||||
| #endif | ||||
|  | ||||
| 	if( txt[0] ) strcat( txt, "-" ); | ||||
| 	strcat( txt, TARGET_CPU"/"TARGET_VENDOR"/"TARGET_OS ); | ||||
| 	if( NGIRCd_VersionAddition[0] ) | ||||
| 		strlcat( NGIRCd_VersionAddition, "-", sizeof( NGIRCd_VersionAddition )); | ||||
|  | ||||
| 	return txt; | ||||
| } /* NGIRCd_VersionAddition */ | ||||
| 	strlcat( NGIRCd_VersionAddition, TARGET_CPU, sizeof( NGIRCd_VersionAddition )); | ||||
| 	strlcat( NGIRCd_VersionAddition, "/", sizeof( NGIRCd_VersionAddition )); | ||||
| 	strlcat( NGIRCd_VersionAddition, TARGET_VENDOR, sizeof( NGIRCd_VersionAddition )); | ||||
| 	strlcat( NGIRCd_VersionAddition, "/", sizeof( NGIRCd_VersionAddition )); | ||||
| 	strlcat( NGIRCd_VersionAddition, TARGET_OS, sizeof( NGIRCd_VersionAddition )); | ||||
|  | ||||
| #ifdef CVSDATE | ||||
| 	snprintf( NGIRCd_Version, sizeof NGIRCd_Version,"%s %s(%s)-%s", PACKAGE_NAME, PACKAGE_VERSION, CVSDATE, NGIRCd_VersionAddition); | ||||
| #else | ||||
| 	snprintf( NGIRCd_Version, sizeof NGIRCd_Version, "%s %s-%s", PACKAGE_NAME, PACKAGE_VERSION, NGIRCd_VersionAddition); | ||||
| #endif | ||||
| } /* Fill_Version */ | ||||
|  | ||||
|  | ||||
| LOCAL VOID Initialize_Signal_Handler( VOID ) | ||||
| /** | ||||
|  * Reload the server configuration file. | ||||
|  */ | ||||
| GLOBAL void | ||||
| NGIRCd_Rehash( void ) | ||||
| { | ||||
| 	char old_name[CLIENT_ID_LEN]; | ||||
|  | ||||
| 	Log( LOG_NOTICE|LOG_snotice, "Re-reading configuration NOW!" ); | ||||
| 	NGIRCd_SignalRehash = false; | ||||
|  | ||||
| 	/* Close down all listening sockets */ | ||||
| 	Conn_ExitListeners( ); | ||||
|  | ||||
| 	/* Remember old server name */ | ||||
| 	strlcpy( old_name, Conf_ServerName, sizeof old_name ); | ||||
|  | ||||
| 	/* Re-read configuration ... */ | ||||
| 	Conf_Rehash( ); | ||||
|  | ||||
| 	/* Recover old server name: it can't be changed during run-time */ | ||||
| 	if( strcmp( old_name, Conf_ServerName ) != 0 ) | ||||
| 	{ | ||||
| 		strcpy( Conf_ServerName, old_name ); | ||||
| 		Log( LOG_ERR, "Can't change \"ServerName\" on runtime! Ignored new name." ); | ||||
| 	} | ||||
|  | ||||
| 	/* Create new pre-defined channels */ | ||||
| 	Channel_InitPredefined( ); | ||||
| 	 | ||||
| 	/* Start listening on sockets */ | ||||
| 	Conn_InitListeners( ); | ||||
|  | ||||
| 	/* Sync configuration with established connections */ | ||||
| 	Conn_SyncServerStruct( ); | ||||
|  | ||||
| 	Log( LOG_NOTICE|LOG_snotice, "Re-reading of configuration done." ); | ||||
| } /* NGIRCd_Rehash */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Initialize the signal handler. | ||||
|  */ | ||||
| LOCAL void | ||||
| Initialize_Signal_Handler( void ) | ||||
| { | ||||
| 	/* Signal-Handler initialisieren: einige Signale | ||||
| 	 * werden ignoriert, andere speziell behandelt. */ | ||||
| @@ -376,86 +506,306 @@ LOCAL VOID Initialize_Signal_Handler( VOID ) | ||||
| } /* Initialize_Signal_Handler */ | ||||
|  | ||||
|  | ||||
| LOCAL VOID Signal_Handler( INT Signal ) | ||||
| /** | ||||
|  * Signal handler of ngIRCd. | ||||
|  * This function is called whenever ngIRCd catches a signal sent by the | ||||
|  * user and/or the system to it. For example SIGTERM and SIGHUP. | ||||
|  * @param Signal Number of the signal to handle. | ||||
|  */ | ||||
| LOCAL void | ||||
| Signal_Handler( int Signal ) | ||||
| { | ||||
| 	/* Signal-Handler. Dieser wird aufgerufen, wenn eines der Signale eintrifft, | ||||
| 	 * fuer das wir uns registriert haben (vgl. Initialize_Signal_Handler). Die | ||||
| 	 * Nummer des eingetroffenen Signals wird der Funktion uebergeben. */ | ||||
|  | ||||
| 	switch( Signal ) | ||||
| 	{ | ||||
| 		case SIGTERM: | ||||
| 		case SIGINT: | ||||
| 		case SIGQUIT: | ||||
| 			/* wir soll(t)en uns wohl beenden ... */ | ||||
| 			if( Signal == SIGTERM ) Log( LOG_WARNING, "Got TERM signal, terminating now ..." ); | ||||
| 			else if( Signal == SIGINT ) Log( LOG_WARNING, "Got INT signal, terminating now ..." ); | ||||
| 			else if( Signal == SIGQUIT ) Log( LOG_WARNING, "Got QUIT signal, terminating now ..." ); | ||||
| 			NGIRCd_Quit = TRUE; | ||||
| 			NGIRCd_SignalQuit = true; | ||||
| 			break; | ||||
| 		case SIGHUP: | ||||
| 			/* neu starten */ | ||||
| 			Log( LOG_WARNING, "Got HUP signal, restarting now ..." ); | ||||
| 			NGIRCd_Restart = TRUE; | ||||
| 			/* Konfiguration neu einlesen: */ | ||||
| 			NGIRCd_SignalRehash = true; | ||||
| 			break; | ||||
| 		case SIGCHLD: | ||||
| 			/* Child-Prozess wurde beendet. Zombies vermeiden: */ | ||||
| 			while( waitpid( -1, NULL, WNOHANG ) > 0); | ||||
| 			break; | ||||
| #ifdef DEBUG | ||||
| 		default: | ||||
| 			/* unbekanntes bzw. unbehandeltes Signal */ | ||||
| 			Log( LOG_NOTICE, "Got signal %d! Ignored.", Signal ); | ||||
| 			Log( LOG_DEBUG, "Got signal %d! Ignored.", Signal ); | ||||
| #endif | ||||
| 	} | ||||
| } /* Signal_Handler */ | ||||
|  | ||||
|  | ||||
| LOCAL VOID Initialize_Listen_Ports( VOID ) | ||||
| /** | ||||
|  * Display copyright and version information of ngIRCd on the console. | ||||
|  */ | ||||
| LOCAL void | ||||
| Show_Version( void ) | ||||
| { | ||||
| 	/* Ports, auf denen der Server Verbindungen entgegennehmen | ||||
| 	 * soll, initialisieren */ | ||||
| 	 | ||||
| 	UINT created, i; | ||||
|  | ||||
| 	created = 0; | ||||
| 	for( i = 0; i < Conf_ListenPorts_Count; i++ ) | ||||
| 	{ | ||||
| 		if( Conn_NewListener( Conf_ListenPorts[i] )) created++; | ||||
| 		else Log( LOG_ERR, "Can't listen on port %u!", Conf_ListenPorts[i] ); | ||||
| 	} | ||||
|  | ||||
| 	if( created < 1 ) | ||||
| 	{ | ||||
| 		Log( LOG_ALERT, "Server isn't listening on a single port!" ); | ||||
| 		Log( LOG_ALERT, PACKAGE" exiting due to fatal errors!" ); | ||||
| 		exit( 1 ); | ||||
| 	} | ||||
| } /* Initialize_Listen_Ports */ | ||||
|  | ||||
|  | ||||
| LOCAL VOID Show_Version( VOID ) | ||||
| { | ||||
| 	puts( NGIRCd_Version( )); | ||||
| 	puts( "Copyright (c)2001,2002 by Alexander Barton (alex@barton.de).\n" ); | ||||
| 	puts( NGIRCd_Version ); | ||||
| 	puts( "Copyright (c)2001-2005 by Alexander Barton (<alex@barton.de>)." ); | ||||
| 	puts( "Homepage: <http://arthur.ath.cx/~alex/ngircd/>\n" ); | ||||
| 	puts( "This is free software; see the source for copying conditions. There is NO" ); | ||||
| 	puts( "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." ); | ||||
| } /* Show_Version */ | ||||
|  | ||||
|  | ||||
| LOCAL VOID Show_Help( VOID ) | ||||
| /** | ||||
|  * Display a short help text on the console. | ||||
|  * This help depends on the configuration of the executable and only shows | ||||
|  * options that are actually enabled. | ||||
|  */ | ||||
| LOCAL void | ||||
| Show_Help( void ) | ||||
| { | ||||
| #ifdef DEBUG | ||||
| 	puts( "  -d, --debug        log extra debug messages" ); | ||||
| #endif | ||||
| 	puts( "  -f, --config <f>   use file <f> as configuration file" ); | ||||
|         puts( "  -n, --nodaemon     don't fork and don't detatch from controlling terminal" ); | ||||
|         puts( "  -p, --passive      disable automatic connections to other servers" ); | ||||
| 	puts( "  -n, --nodaemon     don't fork and don't detach from controlling terminal" ); | ||||
| 	puts( "  -p, --passive      disable automatic connections to other servers" ); | ||||
| #ifdef SNIFFER | ||||
| 	puts( "  -s, --sniffer      enable network sniffer and display all IRC traffic" ); | ||||
| #endif | ||||
| 	puts( "      --configtest   read, validate and display configuration; then exit" ); | ||||
| 	puts( "  -t, --configtest   read, validate and display configuration; then exit" ); | ||||
|  	puts( "      --version      output version information and exit" ); | ||||
| 	puts( "      --help         display this help and exit" ); | ||||
| } /* Show_Help */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Delete the file containing the process ID (PID). | ||||
|  */ | ||||
| LOCAL void | ||||
| Pidfile_Delete( void ) | ||||
| { | ||||
| 	/* Pidfile configured? */ | ||||
| 	if( ! Conf_PidFile[0] ) return; | ||||
|  | ||||
| #ifdef DEBUG | ||||
| 	Log( LOG_DEBUG, "Removing PID file (%s) ...", Conf_PidFile ); | ||||
| #endif | ||||
|  | ||||
| 	if( unlink( Conf_PidFile )) | ||||
| 		Log( LOG_ERR, "Error unlinking PID file (%s): %s", Conf_PidFile, strerror( errno )); | ||||
| } /* Pidfile_Delete */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Create the file containing the process ID of ngIRCd ("PID file"). | ||||
|  * @param pid The process ID to be stored in this file. | ||||
|  */ | ||||
| LOCAL void | ||||
| Pidfile_Create( long pid ) | ||||
| { | ||||
| 	int pidfd; | ||||
| 	char pidbuf[64]; | ||||
| 	int len; | ||||
|  | ||||
| 	/* Pidfile configured? */ | ||||
| 	if( ! Conf_PidFile[0] ) return; | ||||
|  | ||||
| #ifdef DEBUG | ||||
| 	Log( LOG_DEBUG, "Creating PID file (%s) ...", Conf_PidFile ); | ||||
| #endif | ||||
|  | ||||
| 	pidfd = open( Conf_PidFile, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); | ||||
| 	if ( pidfd < 0 ) { | ||||
| 		Log( LOG_ERR, "Error writing PID file (%s): %s", Conf_PidFile, strerror( errno )); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	len = snprintf( pidbuf, sizeof pidbuf, "%ld\n", pid ); | ||||
| 	if (len < 0|| len < (int)sizeof pid) { | ||||
| 		Log( LOG_ERR, "Error converting pid"); | ||||
| 		return; | ||||
| 	} | ||||
| 	 | ||||
| 	if( write( pidfd, pidbuf, len) != len) | ||||
| 		Log( LOG_ERR, "Can't write PID file (%s): %s", Conf_PidFile, strerror( errno )); | ||||
|  | ||||
| 	if( close(pidfd) != 0 ) | ||||
| 		Log( LOG_ERR, "Error closing PID file (%s): %s", Conf_PidFile, strerror( errno )); | ||||
| } /* Pidfile_Create */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Redirect stdin, stdout and stderr to apropriate file handles. | ||||
|  */ | ||||
| LOCAL void | ||||
| Setup_FDStreams( void ) | ||||
| { | ||||
| 	int fd; | ||||
|  | ||||
| 	/* Test if we can open /dev/null for reading and writing. If not | ||||
| 	 * we are most probably chrooted already and the server has been | ||||
| 	 * restarted. So we simply don't try to redirect stdXXX ... */ | ||||
| 	fd = open( "/dev/null", O_RDWR ); | ||||
| 	if ( fd < 0 ) { | ||||
| 		Log(LOG_WARNING, "Could not open /dev/null: %s", strerror(errno));	 | ||||
| 		return; | ||||
| 	}  | ||||
|  | ||||
| 	fflush(stdout); | ||||
| 	fflush(stderr); | ||||
|  | ||||
| 	/* Create new stdin(0), stdout(1) and stderr(2) descriptors */ | ||||
| 	dup2( fd, 0 ); dup2( fd, 1 ); dup2( fd, 2 ); | ||||
|  | ||||
| 	/* Close newly opened file descriptor if not stdin/out/err */ | ||||
| 	if( fd > 2 ) close( fd ); | ||||
| } /* Setup_FDStreams */ | ||||
|  | ||||
|  | ||||
| LOCAL bool | ||||
| NGIRCd_getNobodyID(unsigned int *uid, unsigned int *gid ) | ||||
| { | ||||
| 	struct passwd *pwd; | ||||
|  | ||||
| 	pwd = getpwnam("nobody"); | ||||
| 	if (!pwd) return false; | ||||
|  | ||||
| 	if ( !pwd->pw_uid || !pwd->pw_gid) | ||||
| 		return false; | ||||
|  | ||||
| 	*uid = pwd->pw_uid;	 | ||||
| 	*gid = pwd->pw_gid; | ||||
| 	endpwent(); | ||||
|  | ||||
| 	return true;	 | ||||
| } | ||||
|  | ||||
|  | ||||
| LOCAL bool | ||||
| NGIRCd_Init( bool NGIRCd_NoDaemon )  | ||||
| { | ||||
| 	static bool initialized; | ||||
| 	bool chrooted = false; | ||||
| 	struct passwd *pwd; | ||||
| 	struct group *grp; | ||||
| 	int real_errno; | ||||
| 	long pid; | ||||
|  | ||||
| 	if (initialized) | ||||
| 		return true; | ||||
|  | ||||
| 	if( Conf_Chroot[0] ) { | ||||
| 		if( chdir( Conf_Chroot ) != 0 ) { | ||||
| 			Log( LOG_ERR, "Can't chdir() in ChrootDir (%s): %s", Conf_Chroot, strerror( errno )); | ||||
| 			return false; | ||||
| 		} | ||||
|  | ||||
| 		if( chroot( Conf_Chroot ) != 0 ) { | ||||
| 			if (errno != EPERM) { | ||||
| 				Log( LOG_ERR, "Can't change root directory to \"%s\": %s", | ||||
| 								Conf_Chroot, strerror( errno )); | ||||
|  | ||||
| 				return false; | ||||
| 			} | ||||
| 		} else { | ||||
| 			chrooted = true; | ||||
| 			Log( LOG_INFO, "Changed root and working directory to \"%s\".", Conf_Chroot ); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if (Conf_UID == 0) { | ||||
| 		Log(LOG_INFO, "ServerUID must not be 0, using \"nobody\" instead.", Conf_UID); | ||||
|  | ||||
|   		if (! NGIRCd_getNobodyID(&Conf_UID, &Conf_GID)) { | ||||
| 			Log(LOG_WARNING, "Could not get user/group ID of user \"nobody\": %s", | ||||
| 					errno ? strerror(errno) : "not found" ); | ||||
| 			return false; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if (getgid() != Conf_GID) { | ||||
| 		/* Change group ID */ | ||||
| 		if (setgid(Conf_GID) != 0) { | ||||
| 			real_errno = errno; | ||||
| 			Log( LOG_ERR, "Can't change group ID to %u: %s", Conf_GID, strerror( errno )); | ||||
| 			if (real_errno != EPERM)  | ||||
| 				return false; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if (getuid() != Conf_UID) { | ||||
| 		/* Change user ID */ | ||||
| 		if (setuid(Conf_UID) != 0) { | ||||
| 			real_errno = errno; | ||||
| 			Log(LOG_ERR, "Can't change user ID to %u: %s", Conf_UID, strerror(errno)); | ||||
| 			if (real_errno != EPERM)  | ||||
| 				return false; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	initialized = true; | ||||
|  | ||||
| 	/* Normally a child process is forked which isn't any longer | ||||
| 	 * connected to ther controlling terminal. Use "--nodaemon" | ||||
| 	 * to disable this "daemon mode" (useful for debugging). */ | ||||
| 	if ( ! NGIRCd_NoDaemon ) { | ||||
| 		pid = (long)fork( ); | ||||
| 		if( pid > 0 ) { | ||||
| 			/* "Old" process: exit. */ | ||||
| 			exit( 0 ); | ||||
| 		} | ||||
| 		if( pid < 0 ) { | ||||
| 			/* Error!? */ | ||||
| 			fprintf( stderr, "%s: Can't fork: %s!\nFatal error, exiting now ...\n", | ||||
| 								PACKAGE_NAME, strerror( errno )); | ||||
| 			exit( 1 ); | ||||
| 		} | ||||
|  | ||||
| 		/* New child process */ | ||||
| 		(void)setsid( ); | ||||
| 		chdir( "/" ); | ||||
|  | ||||
| 		/* Detach stdin, stdout and stderr */ | ||||
| 		Setup_FDStreams( ); | ||||
| 	} | ||||
| 	pid = getpid(); | ||||
|  | ||||
| 	Pidfile_Create( pid ); | ||||
|  | ||||
| 	/* Check UID/GID we are running as, can be different from values | ||||
| 	 * configured (e. g. if we were already started with a UID>0. */ | ||||
| 	Conf_UID = getuid(); | ||||
| 	Conf_GID = getgid(); | ||||
|  | ||||
| 	pwd = getpwuid( Conf_UID ); | ||||
| 	grp = getgrgid( Conf_GID ); | ||||
|  | ||||
| 	Log( LOG_INFO, "Running as user %s(%ld), group %s(%ld), with PID %ld.", | ||||
| 				pwd ? pwd->pw_name : "unknown", Conf_UID, | ||||
| 				grp ? grp->gr_name : "unknown", Conf_GID, pid); | ||||
|  | ||||
| 	if ( chrooted ) { | ||||
| 		Log( LOG_INFO, "Running chrooted, chrootdir \"%s\".",  Conf_Chroot ); | ||||
| 		return true; | ||||
| 	} else { | ||||
| 		Log( LOG_INFO, "Not running chrooted." ); | ||||
| 	} | ||||
|  | ||||
| 	/* Change working directory to home directory of the user | ||||
| 	 * we are running as (only when running in daemon mode and not in chroot) */ | ||||
| 	 | ||||
| 	if ( pwd ) { | ||||
| 		if (!NGIRCd_NoDaemon ) { | ||||
| 			if( chdir( pwd->pw_dir ) == 0 )  | ||||
| 				Log( LOG_DEBUG, "Changed working directory to \"%s\" ...", pwd->pw_dir ); | ||||
| 			else  | ||||
| 				Log( LOG_ERR, "Can't change working directory to \"%s\": %s", | ||||
| 								pwd->pw_dir, strerror( errno )); | ||||
| 		} | ||||
| 	} else { | ||||
| 		Log( LOG_ERR, "Can't get user informaton for UID %d!?", Conf_UID ); | ||||
| 	} | ||||
|  | ||||
| return true; | ||||
| } | ||||
|  | ||||
| /* -eof- */ | ||||
|   | ||||
| @@ -2,16 +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.12 2002/03/27 16:40:31 alex Exp $ | ||||
|  * $Id: ngircd.h,v 1.22 2005/06/24 19:20:56 fw Exp $ | ||||
|  * | ||||
|  * ngircd.h: Prototypen aus dem "Haupt-Modul" | ||||
|  * Prototypes of the "main module". | ||||
|  */ | ||||
|  | ||||
|  | ||||
| @@ -24,29 +23,32 @@ | ||||
|  | ||||
|  | ||||
| GLOBAL time_t NGIRCd_Start;		/* Startzeitpunkt des Daemon */ | ||||
| GLOBAL CHAR NGIRCd_StartStr[64]; | ||||
| GLOBAL char NGIRCd_StartStr[64]; | ||||
| GLOBAL char NGIRCd_Version[126]; | ||||
| GLOBAL char NGIRCd_VersionAddition[126]; | ||||
|  | ||||
| #ifdef DEBUG | ||||
| GLOBAL BOOLEAN NGIRCd_Debug;		/* Debug-Modus aktivieren */ | ||||
| GLOBAL bool NGIRCd_Debug;		/* Debug-Modus aktivieren */ | ||||
| #endif | ||||
|  | ||||
| #ifdef SNIFFER | ||||
| GLOBAL BOOLEAN NGIRCd_Sniffer;		/* Sniffer aktivieren */ | ||||
| GLOBAL bool NGIRCd_Sniffer;		/* Sniffer aktivieren */ | ||||
| #endif | ||||
|  | ||||
| GLOBAL BOOLEAN NGIRCd_NoDaemon;		/* nicht im Hintergrund laufen */ | ||||
| GLOBAL bool NGIRCd_Passive;		/* nicht zu anderen Servern connecten */ | ||||
|  | ||||
| GLOBAL BOOLEAN NGIRCd_Passive;		/* nicht zu anderen Servern connecten */ | ||||
| GLOBAL bool NGIRCd_SignalQuit;	/* true: quit server*/ | ||||
| GLOBAL bool NGIRCd_SignalRestart;	/* true: restart server */ | ||||
| GLOBAL bool NGIRCd_SignalRehash;	/* true: reload configuration */ | ||||
|  | ||||
| GLOBAL BOOLEAN NGIRCd_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_ConfFile[FNAME_LEN];	/* Konfigurationsdatei */ | ||||
| GLOBAL char NGIRCd_ProtoID[COMMAND_LEN];/* Protokoll- und Server-Identifikation */ | ||||
|  | ||||
| GLOBAL CHAR *NGIRCd_Version( VOID ); | ||||
| GLOBAL CHAR *NGIRCd_VersionAddition( VOID ); | ||||
|  | ||||
| GLOBAL void NGIRCd_Rehash PARAMS(( void )); | ||||
|  | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -2,38 +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. | ||||
|  * | ||||
|  * $Id: parse.c,v 1.31 2002/03/25 17:13:46 alex Exp $ | ||||
|  * | ||||
|  * parse.c: Parsen der Client-Anfragen | ||||
|  * 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" | ||||
|  | ||||
| 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 "client.h" | ||||
| #include "conn.h" | ||||
| #include "defines.h" | ||||
| #include "irc.h" | ||||
| #include "irc-channel.h" | ||||
| #include "irc-login.h" | ||||
| #include "irc-mode.h" | ||||
| #include "irc-oper.h" | ||||
| #include "irc-server.h" | ||||
| #include "irc-write.h" | ||||
| #include "conn-func.h" | ||||
| #include "client.h" | ||||
| #include "channel.h" | ||||
| #include "log.h" | ||||
| #include "messages.h" | ||||
| #include "tool.h" | ||||
| @@ -41,26 +38,117 @@ | ||||
| #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 ); | ||||
| @@ -68,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 */ | ||||
| @@ -80,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 | ||||
| @@ -91,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 ) | ||||
| @@ -100,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 ) | ||||
| 	{ | ||||
| @@ -135,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; | ||||
| @@ -167,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 ); | ||||
| @@ -218,86 +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_Search( 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_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 ); | ||||
| 	else if( strcasecmp( Req->command, "WHO" ) == 0 ) return IRC_WHO( 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,35 +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.6 2002/03/12 14:37:52 alex Exp $ | ||||
|  * $Id: parse.h,v 1.11 2005/03/19 18:43:49 fw Exp $ | ||||
|  * | ||||
|  * parse.h: Parsen der Client-Anfragen (Header) | ||||
|  * 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,30 +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.7 2002/03/22 00:17:27 alex Exp $ | ||||
|  * | ||||
|  * log.h: Hilfsfunktionen (Header) | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef __tool_h__ | ||||
| #define __tool_h__ | ||||
|  | ||||
|  | ||||
| GLOBAL VOID ngt_TrimStr( CHAR *String ); | ||||
|  | ||||
| GLOBAL CHAR *ngt_LowerStr( CHAR *String ); | ||||
|  | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /* -eof- */ | ||||
| @@ -9,13 +9,23 @@ | ||||
| # 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/03/15 15:41:55 alex Exp $ | ||||
| # $Id: Makefile.am,v 1.8 2005/04/16 09:23:01 fw Exp $ | ||||
| # | ||||
|  | ||||
| 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: | ||||
|   | ||||
							
								
								
									
										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; | ||||
| } | ||||
| @@ -1,17 +1,16 @@ | ||||
| /* | ||||
|  * 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: portab.h,v 1.3 2002/03/25 19:13:19 alex Exp $ | ||||
|  * $Id: portab.h,v 1.21 2005/04/16 09:23:01 fw Exp $ | ||||
|  * | ||||
|  * portab.h: "Portabilitaets-Definitionen" | ||||
|  * Portability functions and declarations (header for libngbportab). | ||||
|  */ | ||||
|  | ||||
|  | ||||
| @@ -21,43 +20,87 @@ | ||||
|  | ||||
| #include "config.h" | ||||
|  | ||||
| #ifndef DEBUG | ||||
| # define NDEBUG | ||||
| #endif | ||||
|  | ||||
| /* Keywords */ | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| # include <sys/types.h> | ||||
| #endif | ||||
|  | ||||
| #define EXTERN extern | ||||
| #define STATIC static | ||||
| #ifdef HAVE_INTTYPES_H | ||||
| # include <inttypes.h> | ||||
| # define NGIRC_GOT_INTTYPES | ||||
| #else | ||||
| # ifdef HAVE_STDINT_H | ||||
| #  include <stdint.h> | ||||
| #  define NGIRC_GOT_INTTYPES | ||||
| # endif | ||||
| #endif | ||||
|  | ||||
| #ifdef HAVE_STDDEF_H | ||||
| # include <stddef.h> | ||||
| #endif | ||||
|  | ||||
| #ifdef HAVE_STDBOOL_H | ||||
| # include <stdbool.h> | ||||
| #endif | ||||
|  | ||||
| /* compiler features */ | ||||
|  | ||||
| #if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)) | ||||
| # define PUNUSED(x) __attribute__ ((unused)) x | ||||
| # define UNUSED     __attribute__ ((unused)) | ||||
| #else | ||||
| # define PUNUSED(x) x | ||||
| # define UNUSED | ||||
| #endif | ||||
|  | ||||
| #ifndef PARAMS | ||||
| # if PROTOTYPES | ||||
| #  define PARAMS(args) args | ||||
| # else | ||||
| #  define PARAMS(args) () | ||||
| # endif | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /* keywords */ | ||||
| #define LOCAL static | ||||
| #define CONST const | ||||
|  | ||||
| /* datatypes */ | ||||
|  | ||||
| /* Datatentypen */ | ||||
| #ifndef PROTOTYPES | ||||
| # ifndef signed | ||||
| #  define signed | ||||
| # endif | ||||
| #endif | ||||
|  | ||||
| typedef void VOID; | ||||
| typedef void POINTER; | ||||
|  | ||||
| typedef signed int INT; | ||||
| typedef unsigned int UINT; | ||||
| typedef signed char INT8; | ||||
| #ifdef NGIRC_GOT_INTTYPES | ||||
| typedef uint8_t UINT8; | ||||
| typedef uint16_t UINT16; | ||||
| typedef uint32_t UINT32; | ||||
| #else | ||||
| typedef unsigned char UINT8; | ||||
| typedef signed short INT16; | ||||
| typedef unsigned short UINT16; | ||||
| typedef signed long INT32; | ||||
| typedef unsigned long UINT32; | ||||
| typedef unsigned int UINT32; | ||||
| #endif | ||||
|  | ||||
| typedef float FLOAT; | ||||
| #ifndef HAVE_STDBOOL_H | ||||
| typedef unsigned char bool; | ||||
| #define true (bool)1 | ||||
| #define false (bool)0 | ||||
| #endif | ||||
|  | ||||
| typedef char CHAR; | ||||
|  | ||||
| typedef UINT8 BOOLEAN; | ||||
|  | ||||
| #undef TRUE | ||||
| #define TRUE (BOOLEAN)1 | ||||
|  | ||||
| #undef FALSE | ||||
| #define FALSE (BOOLEAN)0 | ||||
|  | ||||
| #undef NULL | ||||
| #define NULL (VOID *)0 | ||||
| #ifndef NULL | ||||
| #ifdef PROTOTYPES | ||||
| # define NULL (void *)0 | ||||
| #else | ||||
| # define NULL 0L | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #undef GLOBAL | ||||
| #define GLOBAL | ||||
| @@ -71,22 +114,7 @@ typedef UINT8 BOOLEAN; | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /* configure-Optionen */ | ||||
|  | ||||
| #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 | ||||
|  | ||||
| #if OS_UNIX_AUX | ||||
| #define _POSIX_SOURCE			/* muss unter A/UX definiert sein */ | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /* Konstanten */ | ||||
| /* target constants  */ | ||||
|  | ||||
| #ifndef TARGET_OS | ||||
| #define TARGET_OS "unknown" | ||||
| @@ -101,6 +129,42 @@ typedef UINT8 BOOLEAN; | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /* configure options */ | ||||
|  | ||||
| #ifndef HAVE_socklen_t | ||||
| typedef int socklen_t;			/* for Mac OS X, amongst others */ | ||||
| #endif | ||||
|  | ||||
| #ifndef HAVE_SNPRINTF | ||||
| extern int snprintf PARAMS(( char *str, size_t count, const char *fmt, ... )); | ||||
| #endif | ||||
|  | ||||
| #ifndef HAVE_STRLCAT | ||||
| extern size_t strlcat PARAMS(( char *dst, const char *src, size_t size )); | ||||
| #endif | ||||
|  | ||||
| #ifndef HAVE_STRLCPY | ||||
| extern size_t strlcpy PARAMS(( char *dst, const char *src, size_t size )); | ||||
| #endif | ||||
|  | ||||
| #ifndef HAVE_STRDUP | ||||
| extern char * strdup PARAMS(( const char *s )); | ||||
| #endif | ||||
|  | ||||
| #ifndef HAVE_VSNPRINTF | ||||
| #include <stdarg.h> | ||||
| extern int vsnprintf PARAMS(( char *str, size_t count, const char *fmt, va_list args )); | ||||
| #endif | ||||
|  | ||||
| #ifndef PACKAGE_NAME | ||||
| #define PACKAGE_NAME PACKAGE | ||||
| #endif | ||||
|  | ||||
| #ifndef PACKAGE_VERSION | ||||
| #define PACKAGE_VERSION VERSION | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -2,60 +2,62 @@ | ||||
|  * 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: portabtest.c,v 1.3 2002/03/12 21:47:40 alex Exp $ | ||||
|  * | ||||
|  * portabtest.c: Testprogramm fuer portab.h | ||||
|  * test program for portab.h and friends ;-) | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include "portab.h" | ||||
|  | ||||
| static char UNUSED id[] = "$Id: portabtest.c,v 1.12 2005/03/19 18:43:50 fw Exp $"; | ||||
|  | ||||
| #include "imp.h" | ||||
| #include <stdarg.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "exp.h" | ||||
|  | ||||
|  | ||||
| LOCAL BOOLEAN portab_check_types( VOID ); | ||||
| LOCAL void Panic PARAMS (( char *Reason, int Code )); | ||||
|  | ||||
|  | ||||
| GLOBAL INT main( VOID ) | ||||
| GLOBAL int | ||||
| main( void ) | ||||
| { | ||||
| 	INT ret = 0; | ||||
| 	/* validate datatypes */ | ||||
| 	if( false != 0 ) Panic( "false", 1 ); | ||||
| 	if( true != 1 ) Panic( "true", 1 ); | ||||
| 	if( sizeof( UINT8 ) != 1 ) Panic( "UINT8", 1 ); | ||||
| 	if( sizeof( UINT16 ) != 2 ) Panic( "UINT16", 1 ); | ||||
| 	if( sizeof( UINT32 ) != 4 ) Panic( "UINT32", 1 ); | ||||
|  | ||||
| 	printf( "- datatypes: "); | ||||
| 	if( ! portab_check_types( )) | ||||
| 	{ | ||||
| 		puts( "FAILED!" ); | ||||
| 		ret = 1; | ||||
| 	} | ||||
| 	else puts( "ok." ); | ||||
|  | ||||
| 	puts( "- system type: "TARGET_CPU"/"TARGET_VENDOR"/"TARGET_OS ); | ||||
|  | ||||
| 	return ret; | ||||
| } /* main */ | ||||
|  | ||||
|  | ||||
| LOCAL BOOLEAN portab_check_types( VOID ) | ||||
| { | ||||
| 	if( FALSE != 0 ) return 0; | ||||
| 	if( TRUE != 1 ) return 0; | ||||
| 	if( sizeof( INT8 ) != 1 ) return 0; | ||||
| 	if( sizeof( UINT8 ) != 1 ) return 0; | ||||
| 	if( sizeof( INT16 ) != 2 ) return 0; | ||||
| 	if( sizeof( UINT16 ) != 2 ) return 0; | ||||
| 	if( sizeof( INT32 ) != 4 ) return 0; | ||||
| 	if( sizeof( UINT32 ) != 4 ) return 0; | ||||
| 	return 1; | ||||
| #ifdef PROTOTYPES | ||||
| 	/* check functions */ | ||||
| 	if( ! snprintf ) Panic( "snprintf", 2 ); | ||||
| 	if( ! vsnprintf ) Panic( "vsnprintf", 2 ); | ||||
| 	if( ! strlcpy ) Panic( "strlcpy", 2 ); | ||||
| 	if( ! strlcat ) Panic( "strlcat", 2 ); | ||||
| #endif | ||||
| 	 | ||||
| 	/* ok, no error */ | ||||
| 	return 0; | ||||
| } /* portab_check_types */ | ||||
|  | ||||
|  | ||||
| LOCAL void | ||||
| Panic( char *Reason, int Code ) | ||||
| { | ||||
| 	/* Oops, something failed!? */ | ||||
| 	fprintf( stderr, "Oops, test for %s failed!?", Reason ); | ||||
| 	exit( Code ); | ||||
| } /* Panic */ | ||||
|  | ||||
|  | ||||
| /* -eof- */ | ||||
|   | ||||
							
								
								
									
										35
									
								
								src/portab/strdup.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								src/portab/strdup.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| /* | ||||
|  * ngIRCd -- The Next Generation IRC Daemon | ||||
|  * | ||||
|  * strdup() implementation.  Public domain. | ||||
|  * | ||||
|  * $Id: strdup.c,v 1.1 2005/04/16 09:20:53 fw Exp $ | ||||
|  */ | ||||
|  | ||||
| #include "portab.h" | ||||
|  | ||||
| #include "imp.h" | ||||
| #include <string.h> | ||||
| #include <stdlib.h> | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #include "exp.h" | ||||
|  | ||||
| #ifndef HAVE_STRDUP | ||||
|  | ||||
| GLOBAL char * | ||||
| strdup( const char *s ) | ||||
| { | ||||
|  char *dup; | ||||
|  size_t len = strlen( s ); | ||||
|  size_t alloc = len + 1; | ||||
|  | ||||
|  if (len >= alloc ) return NULL; | ||||
|  dup = malloc( alloc ); | ||||
|  if (dup) strlcpy(dup, s, alloc ); | ||||
|  | ||||
| return dup; | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
							
								
								
									
										77
									
								
								src/portab/strlcpy.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								src/portab/strlcpy.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | ||||
| /* | ||||
|  * 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. | ||||
|  * | ||||
|  * strlcpy() and strlcat() replacement functions. | ||||
|  * See <http://www.openbsd.org/papers/strlcpy-paper.ps> for details. | ||||
|  * | ||||
|  * Code partially borrowed from compat.c of rsync, written by Andrew | ||||
|  * Tridgell (1998) and Martin Pool (2002): | ||||
|  * <http://cvs.samba.org/cgi-bin/cvsweb/rsync/lib/compat.c> | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include "portab.h" | ||||
|  | ||||
| static char UNUSED id[] = "$Id: strlcpy.c,v 1.5 2005/03/19 18:43:50 fw Exp $"; | ||||
|  | ||||
| #include "imp.h" | ||||
| #include <string.h> | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #include "exp.h" | ||||
|  | ||||
|  | ||||
| #ifndef HAVE_STRLCAT | ||||
|  | ||||
| GLOBAL size_t | ||||
| strlcat( char *dst, const char *src, size_t size ) | ||||
| { | ||||
| 	/* Like strncat() but does not 0 fill the buffer and | ||||
| 	 * always null terminates. */ | ||||
|  | ||||
| 	size_t len1 = strlen( dst ); | ||||
| 	size_t len2 = strlen( src ); | ||||
| 	size_t ret = len1 + len2; | ||||
|  | ||||
| 	if( size && ( len1 < size - 1 )) { | ||||
| 		if( len2 >= size - len1 ) | ||||
| 			len2 = size - len1 - 1; | ||||
| 		memcpy( dst + len1, src, len2 ); | ||||
| 		dst[len1 + len2] = 0; | ||||
| 	} | ||||
| 	return ret; | ||||
| } /* strlcat */ | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #ifndef HAVE_STRLCPY | ||||
|  | ||||
| GLOBAL size_t | ||||
| strlcpy( char *dst, const char *src, size_t size ) | ||||
| { | ||||
| 	/* Like strncpy but does not 0 fill the buffer and | ||||
| 	 * always null terminates. */ | ||||
|  | ||||
| 	size_t len = strlen( src ); | ||||
| 	size_t ret = len; | ||||
|  | ||||
| 	if( size > 0 ) { | ||||
| 		if( len >= size ) len = size - 1; | ||||
| 		memcpy( dst, src, len ); | ||||
| 		dst[len] = 0; | ||||
| 	} | ||||
| 	return ret; | ||||
| } /* strlcpy */ | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /* -eof- */ | ||||
							
								
								
									
										927
									
								
								src/portab/vsnprintf.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										927
									
								
								src/portab/vsnprintf.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,927 @@ | ||||
| /* | ||||
|  * 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. | ||||
|  * | ||||
|  * snprintf() and vsnprintf() replacement functions | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include "portab.h" | ||||
|  | ||||
| static char UNUSED id[] = "$Id: vsnprintf.c,v 1.5 2003/04/21 10:53:38 alex Exp $"; | ||||
|  | ||||
| #include "imp.h" | ||||
|  | ||||
| #include "exp.h" | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * snprintf.c: Copyright Patrick Powell 1995 | ||||
|  * This code is based on code written by Patrick Powell (papowell@astart.com) | ||||
|  * It may be used for any purpose as long as this notice remains intact | ||||
|  * on all source code distributions | ||||
|  * | ||||
|  * Original: Patrick Powell Tue Apr 11 09:48:21 PDT 1995 | ||||
|  * A bombproof version of doprnt (dopr) included. | ||||
|  * Sigh. This sort of thing is always nasty do deal with. Note that | ||||
|  * the version here does not include floating point... | ||||
|  * | ||||
|  * snprintf() is used instead of sprintf() as it does limit checks | ||||
|  * for string length. This covers a nasty loophole. | ||||
|  * | ||||
|  * The other functions are there to prevent NULL pointers from | ||||
|  * causing nast effects. | ||||
|  * | ||||
|  * More Recently: | ||||
|  *  Brandon Long <blong@fiction.net> 9/15/96 for mutt 0.43 | ||||
|  *  This was ugly. It is still ugly. I opted out of floating point | ||||
|  *  numbers, but the formatter understands just about everything | ||||
|  *  from the normal C string format, at least as far as I can tell from | ||||
|  *  the Solaris 2.5 printf(3S) man page. | ||||
|  * | ||||
|  * Brandon Long <blong@fiction.net> 10/22/97 for mutt 0.87.1 | ||||
|  *  Ok, added some minimal floating point support, which means this | ||||
|  *  probably requires libm on most operating systems. Don't yet | ||||
|  *  support the exponent (e,E) and sigfig (g,G). Also, fmtint() | ||||
|  *  was pretty badly broken, it just wasn't being exercised in ways | ||||
|  *  which showed it, so that's been fixed. Also, formated the code | ||||
|  *  to mutt conventions, and removed dead code left over from the | ||||
|  *  original. Also, there is now a builtin-test, just compile with: | ||||
|  *    gcc -DTEST_SNPRINTF -o snprintf snprintf.c -lm | ||||
|  *  and run snprintf for results. | ||||
|  *  | ||||
|  * Thomas Roessler <roessler@guug.de> 01/27/98 for mutt 0.89i | ||||
|  *  The PGP code was using unsigned hexadecimal formats.  | ||||
|  *  Unfortunately, unsigned formats simply didn't work. | ||||
|  * | ||||
|  * Michael Elkins <me@cs.hmc.edu> 03/05/98 for mutt 0.90.8 | ||||
|  *  The original code assumed that both snprintf() and vsnprintf() were | ||||
|  *  missing. Some systems only have snprintf() but not vsnprintf(), so | ||||
|  *  the code is now broken down under HAVE_SNPRINTF and HAVE_VSNPRINTF. | ||||
|  * | ||||
|  * Andrew Tridgell <tridge@samba.org>, October 1998 | ||||
|  *  fixed handling of %.0f | ||||
|  *  added test for HAVE_LONG_DOUBLE | ||||
|  * | ||||
|  * tridge@samba.org, idra@samba.org, April 2001 | ||||
|  *  got rid of fcvt code (twas buggy and made testing harder) | ||||
|  *  added C99 semantics | ||||
|  * | ||||
|  * Alexander Barton, <alex@barton.de>, 2002-05-19 | ||||
|  *  removed [v]asprintf() and C99 tests: not needed by ngIRCd. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifdef HAVE_STRING_H | ||||
| #include <string.h> | ||||
| #endif | ||||
| #ifdef HAVE_STRINGS_H | ||||
| #include <strings.h> | ||||
| #endif | ||||
| #ifdef HAVE_CTYPE_H | ||||
| #include <ctype.h> | ||||
| #endif | ||||
| #include <sys/types.h> | ||||
| #include <stdarg.h> | ||||
| #ifdef HAVE_STDLIB_H | ||||
| #include <stdlib.h> | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #if defined(HAVE_SNPRINTF) && defined(HAVE_VSNPRINTF) | ||||
| /* only include stdio.h if we are not re-defining snprintf or vsnprintf */ | ||||
| #include <stdio.h> | ||||
| /* make the compiler happy with an empty file */ | ||||
| void dummy_snprintf PARAMS(( void )); | ||||
| void dummy_snprintf PARAMS(( void )) { } | ||||
| #else | ||||
|  | ||||
| #ifdef HAVE_LONG_DOUBLE | ||||
| #define LDOUBLE long double | ||||
| #else | ||||
| #define LDOUBLE double | ||||
| #endif | ||||
|  | ||||
| #ifdef HAVE_LONG_LONG | ||||
| #define LLONG long long | ||||
| #else | ||||
| #define LLONG long | ||||
| #endif | ||||
|  | ||||
| static size_t dopr(char *buffer, size_t maxlen, const char *format,  | ||||
| 		   va_list args); | ||||
| static void fmtstr(char *buffer, size_t *currlen, size_t maxlen, | ||||
| 		    char *value, int flags, int min, int max); | ||||
| static void fmtint(char *buffer, size_t *currlen, size_t maxlen, | ||||
| 		    long value, int base, int min, int max, int flags); | ||||
| static void fmtfp(char *buffer, size_t *currlen, size_t maxlen, | ||||
| 		   LDOUBLE fvalue, int min, int max, int flags); | ||||
| static void dopr_outch(char *buffer, size_t *currlen, size_t maxlen, char c); | ||||
|  | ||||
| /* | ||||
|  * dopr(): poor man's version of doprintf | ||||
|  */ | ||||
|  | ||||
| /* format read states */ | ||||
| #define DP_S_DEFAULT 0 | ||||
| #define DP_S_FLAGS   1 | ||||
| #define DP_S_MIN     2 | ||||
| #define DP_S_DOT     3 | ||||
| #define DP_S_MAX     4 | ||||
| #define DP_S_MOD     5 | ||||
| #define DP_S_CONV    6 | ||||
| #define DP_S_DONE    7 | ||||
|  | ||||
| /* format flags - Bits */ | ||||
| #define DP_F_MINUS      (1 << 0) | ||||
| #define DP_F_PLUS       (1 << 1) | ||||
| #define DP_F_SPACE      (1 << 2) | ||||
| #define DP_F_NUM	(1 << 3) | ||||
| #define DP_F_ZERO       (1 << 4) | ||||
| #define DP_F_UP	 (1 << 5) | ||||
| #define DP_F_UNSIGNED   (1 << 6) | ||||
|  | ||||
| /* Conversion Flags */ | ||||
| #define DP_C_SHORT   1 | ||||
| #define DP_C_LONG    2 | ||||
| #define DP_C_LDOUBLE 3 | ||||
| #define DP_C_LLONG   4 | ||||
|  | ||||
| #define char_to_int(p) ((p)- '0') | ||||
| #ifndef MAX | ||||
| #define MAX(p,q) (((p) >= (q)) ? (p) : (q)) | ||||
| #endif | ||||
|  | ||||
| static size_t dopr(char *buffer, size_t maxlen, const char *format, va_list args) | ||||
| { | ||||
| 	char ch; | ||||
| 	LLONG value; | ||||
| 	LDOUBLE fvalue; | ||||
| 	char *strvalue; | ||||
| 	int min; | ||||
| 	int max; | ||||
| 	int state; | ||||
| 	int flags; | ||||
| 	int cflags; | ||||
| 	size_t currlen; | ||||
| 	 | ||||
| 	state = DP_S_DEFAULT; | ||||
| 	currlen = flags = cflags = min = 0; | ||||
| 	max = -1; | ||||
| 	ch = *format++; | ||||
| 	 | ||||
| 	while (state != DP_S_DONE) { | ||||
| 		if (ch == '\0')  | ||||
| 			state = DP_S_DONE; | ||||
|  | ||||
| 		switch(state) { | ||||
| 		case DP_S_DEFAULT: | ||||
| 			if (ch == '%')  | ||||
| 				state = DP_S_FLAGS; | ||||
| 			else  | ||||
| 				dopr_outch (buffer, &currlen, maxlen, ch); | ||||
| 			ch = *format++; | ||||
| 			break; | ||||
| 		case DP_S_FLAGS: | ||||
| 			switch (ch) { | ||||
| 			case '-': | ||||
| 				flags |= DP_F_MINUS; | ||||
| 				ch = *format++; | ||||
| 				break; | ||||
| 			case '+': | ||||
| 				flags |= DP_F_PLUS; | ||||
| 				ch = *format++; | ||||
| 				break; | ||||
| 			case ' ': | ||||
| 				flags |= DP_F_SPACE; | ||||
| 				ch = *format++; | ||||
| 				break; | ||||
| 			case '#': | ||||
| 				flags |= DP_F_NUM; | ||||
| 				ch = *format++; | ||||
| 				break; | ||||
| 			case '0': | ||||
| 				flags |= DP_F_ZERO; | ||||
| 				ch = *format++; | ||||
| 				break; | ||||
| 			default: | ||||
| 				state = DP_S_MIN; | ||||
| 				break; | ||||
| 			} | ||||
| 			break; | ||||
| 		case DP_S_MIN: | ||||
| 			if (isdigit((unsigned char)ch)) { | ||||
| 				min = 10*min + char_to_int (ch); | ||||
| 				ch = *format++; | ||||
| 			} else if (ch == '*') { | ||||
| 				min = va_arg (args, int); | ||||
| 				ch = *format++; | ||||
| 				state = DP_S_DOT; | ||||
| 			} else { | ||||
| 				state = DP_S_DOT; | ||||
| 			} | ||||
| 			break; | ||||
| 		case DP_S_DOT: | ||||
| 			if (ch == '.') { | ||||
| 				state = DP_S_MAX; | ||||
| 				ch = *format++; | ||||
| 			} else {  | ||||
| 				state = DP_S_MOD; | ||||
| 			} | ||||
| 			break; | ||||
| 		case DP_S_MAX: | ||||
| 			if (isdigit((unsigned char)ch)) { | ||||
| 				if (max < 0) | ||||
| 					max = 0; | ||||
| 				max = 10*max + char_to_int (ch); | ||||
| 				ch = *format++; | ||||
| 			} else if (ch == '*') { | ||||
| 				max = va_arg (args, int); | ||||
| 				ch = *format++; | ||||
| 				state = DP_S_MOD; | ||||
| 			} else { | ||||
| 				state = DP_S_MOD; | ||||
| 			} | ||||
| 			break; | ||||
| 		case DP_S_MOD: | ||||
| 			switch (ch) { | ||||
| 			case 'h': | ||||
| 				cflags = DP_C_SHORT; | ||||
| 				ch = *format++; | ||||
| 				break; | ||||
| 			case 'l': | ||||
| 				cflags = DP_C_LONG; | ||||
| 				ch = *format++; | ||||
| 				if (ch == 'l') {	/* It's a long long */ | ||||
| 					cflags = DP_C_LLONG; | ||||
| 					ch = *format++; | ||||
| 				} | ||||
| 				break; | ||||
| 			case 'L': | ||||
| 				cflags = DP_C_LDOUBLE; | ||||
| 				ch = *format++; | ||||
| 				break; | ||||
| 			default: | ||||
| 				break; | ||||
| 			} | ||||
| 			state = DP_S_CONV; | ||||
| 			break; | ||||
| 		case DP_S_CONV: | ||||
| 			switch (ch) { | ||||
| 			case 'd': | ||||
| 			case 'i': | ||||
| 				if (cflags == DP_C_SHORT)  | ||||
| 					value = va_arg (args, int); | ||||
| 				else if (cflags == DP_C_LONG) | ||||
| 					value = va_arg (args, long int); | ||||
| 				else if (cflags == DP_C_LLONG) | ||||
| 					value = va_arg (args, LLONG); | ||||
| 				else | ||||
| 					value = va_arg (args, int); | ||||
| 				fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags); | ||||
| 				break; | ||||
| 			case 'o': | ||||
| 				flags |= DP_F_UNSIGNED; | ||||
| 				if (cflags == DP_C_SHORT) | ||||
| 					value = va_arg (args, unsigned int); | ||||
| 				else if (cflags == DP_C_LONG) | ||||
| 					value = (long)va_arg (args, unsigned long int); | ||||
| 				else if (cflags == DP_C_LLONG) | ||||
| 					value = (long)va_arg (args, unsigned LLONG); | ||||
| 				else | ||||
| 					value = (long)va_arg (args, unsigned int); | ||||
| 				fmtint (buffer, &currlen, maxlen, value, 8, min, max, flags); | ||||
| 				break; | ||||
| 			case 'u': | ||||
| 				flags |= DP_F_UNSIGNED; | ||||
| 				if (cflags == DP_C_SHORT) | ||||
| 					value = va_arg (args, unsigned int); | ||||
| 				else if (cflags == DP_C_LONG) | ||||
| 					value = (long)va_arg (args, unsigned long int); | ||||
| 				else if (cflags == DP_C_LLONG) | ||||
| 					value = (LLONG)va_arg (args, unsigned LLONG); | ||||
| 				else | ||||
| 					value = (long)va_arg (args, unsigned int); | ||||
| 				fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags); | ||||
| 				break; | ||||
| 			case 'X': | ||||
| 				flags |= DP_F_UP; | ||||
| 			case 'x': | ||||
| 				flags |= DP_F_UNSIGNED; | ||||
| 				if (cflags == DP_C_SHORT) | ||||
| 					value = va_arg (args, unsigned int); | ||||
| 				else if (cflags == DP_C_LONG) | ||||
| 					value = (long)va_arg (args, unsigned long int); | ||||
| 				else if (cflags == DP_C_LLONG) | ||||
| 					value = (LLONG)va_arg (args, unsigned LLONG); | ||||
| 				else | ||||
| 					value = (long)va_arg (args, unsigned int); | ||||
| 				fmtint (buffer, &currlen, maxlen, value, 16, min, max, flags); | ||||
| 				break; | ||||
| 			case 'f': | ||||
| 				if (cflags == DP_C_LDOUBLE) | ||||
| 					fvalue = va_arg (args, LDOUBLE); | ||||
| 				else | ||||
| 					fvalue = va_arg (args, double); | ||||
| 				/* um, floating point? */ | ||||
| 				fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags); | ||||
| 				break; | ||||
| 			case 'E': | ||||
| 				flags |= DP_F_UP; | ||||
| 			case 'e': | ||||
| 				if (cflags == DP_C_LDOUBLE) | ||||
| 					fvalue = va_arg (args, LDOUBLE); | ||||
| 				else | ||||
| 					fvalue = va_arg (args, double); | ||||
| 				break; | ||||
| 			case 'G': | ||||
| 				flags |= DP_F_UP; | ||||
| 			case 'g': | ||||
| 				if (cflags == DP_C_LDOUBLE) | ||||
| 					fvalue = va_arg (args, LDOUBLE); | ||||
| 				else | ||||
| 					fvalue = va_arg (args, double); | ||||
| 				break; | ||||
| 			case 'c': | ||||
| 				dopr_outch (buffer, &currlen, maxlen, va_arg (args, int)); | ||||
| 				break; | ||||
| 			case 's': | ||||
| 				strvalue = va_arg (args, char *); | ||||
| 				if (max == -1) { | ||||
| 					max = strlen(strvalue); | ||||
| 				} | ||||
| 				if (min > 0 && max >= 0 && min > max) max = min; | ||||
| 				fmtstr (buffer, &currlen, maxlen, strvalue, flags, min, max); | ||||
| 				break; | ||||
| 			case 'p': | ||||
| 				strvalue = va_arg (args, void *); | ||||
| 				fmtint (buffer, &currlen, maxlen, (long) strvalue, 16, min, max, flags); | ||||
| 				break; | ||||
| 			case 'n': | ||||
| 				if (cflags == DP_C_SHORT) { | ||||
| 					short int *num; | ||||
| 					num = va_arg (args, short int *); | ||||
| 					*num = currlen; | ||||
| 				} else if (cflags == DP_C_LONG) { | ||||
| 					long int *num; | ||||
| 					num = va_arg (args, long int *); | ||||
| 					*num = (long int)currlen; | ||||
| 				} else if (cflags == DP_C_LLONG) { | ||||
| 					LLONG *num; | ||||
| 					num = va_arg (args, LLONG *); | ||||
| 					*num = (LLONG)currlen; | ||||
| 				} else { | ||||
| 					int *num; | ||||
| 					num = va_arg (args, int *); | ||||
| 					*num = currlen; | ||||
| 				} | ||||
| 				break; | ||||
| 			case '%': | ||||
| 				dopr_outch (buffer, &currlen, maxlen, ch); | ||||
| 				break; | ||||
| 			case 'w': | ||||
| 				/* not supported yet, treat as next char */ | ||||
| 				ch = *format++; | ||||
| 				break; | ||||
| 			default: | ||||
| 				/* Unknown, skip */ | ||||
| 				break; | ||||
| 			} | ||||
| 			ch = *format++; | ||||
| 			state = DP_S_DEFAULT; | ||||
| 			flags = cflags = min = 0; | ||||
| 			max = -1; | ||||
| 			break; | ||||
| 		case DP_S_DONE: | ||||
| 			break; | ||||
| 		default: | ||||
| 			/* hmm? */ | ||||
| 			break; /* some picky compilers need this */ | ||||
| 		} | ||||
| 	} | ||||
| 	if (maxlen != 0) { | ||||
| 		if (currlen < maxlen - 1)  | ||||
| 			buffer[currlen] = '\0'; | ||||
| 		else if (maxlen > 0)  | ||||
| 			buffer[maxlen - 1] = '\0'; | ||||
| 	} | ||||
| 	 | ||||
| 	return currlen; | ||||
| } | ||||
|  | ||||
| static void fmtstr(char *buffer, size_t *currlen, size_t maxlen, | ||||
| 		    char *value, int flags, int min, int max) | ||||
| { | ||||
| 	int padlen, strln;     /* amount to pad */ | ||||
| 	int cnt = 0; | ||||
|  | ||||
| #ifdef DEBUG_SNPRINTF | ||||
| 	printf("fmtstr min=%d max=%d s=[%s]\n", min, max, value); | ||||
| #endif | ||||
| 	if (value == 0) { | ||||
| 		value = "<NULL>"; | ||||
| 	} | ||||
|  | ||||
| 	for (strln = 0; value[strln]; ++strln); /* strlen */ | ||||
| 	padlen = min - strln; | ||||
| 	if (padlen < 0)  | ||||
| 		padlen = 0; | ||||
| 	if (flags & DP_F_MINUS)  | ||||
| 		padlen = -padlen; /* Left Justify */ | ||||
| 	 | ||||
| 	while ((padlen > 0) && (cnt < max)) { | ||||
| 		dopr_outch (buffer, currlen, maxlen, ' '); | ||||
| 		--padlen; | ||||
| 		++cnt; | ||||
| 	} | ||||
| 	while (*value && (cnt < max)) { | ||||
| 		dopr_outch (buffer, currlen, maxlen, *value++); | ||||
| 		++cnt; | ||||
| 	} | ||||
| 	while ((padlen < 0) && (cnt < max)) { | ||||
| 		dopr_outch (buffer, currlen, maxlen, ' '); | ||||
| 		++padlen; | ||||
| 		++cnt; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /* Have to handle DP_F_NUM (ie 0x and 0 alternates) */ | ||||
|  | ||||
| static void fmtint(char *buffer, size_t *currlen, size_t maxlen, | ||||
| 		    long value, int base, int min, int max, int flags) | ||||
| { | ||||
| 	int signvalue = 0; | ||||
| 	unsigned long uvalue; | ||||
| 	char convert[20]; | ||||
| 	int place = 0; | ||||
| 	int spadlen = 0; /* amount to space pad */ | ||||
| 	int zpadlen = 0; /* amount to zero pad */ | ||||
| 	int caps = 0; | ||||
| 	 | ||||
| 	if (max < 0) | ||||
| 		max = 0; | ||||
| 	 | ||||
| 	uvalue = value; | ||||
| 	 | ||||
| 	if(!(flags & DP_F_UNSIGNED)) { | ||||
| 		if( value < 0 ) { | ||||
| 			signvalue = '-'; | ||||
| 			uvalue = -value; | ||||
| 		} else { | ||||
| 			if (flags & DP_F_PLUS)  /* Do a sign (+/i) */ | ||||
| 				signvalue = '+'; | ||||
| 			else if (flags & DP_F_SPACE) | ||||
| 				signvalue = ' '; | ||||
| 		} | ||||
| 	} | ||||
|    | ||||
| 	if (flags & DP_F_UP) caps = 1; /* Should characters be upper case? */ | ||||
|  | ||||
| 	do { | ||||
| 		convert[place++] = | ||||
| 			(caps? "0123456789ABCDEF":"0123456789abcdef") | ||||
| 			[uvalue % (unsigned)base  ]; | ||||
| 		uvalue = (uvalue / (unsigned)base ); | ||||
| 	} while(uvalue && (place < 20)); | ||||
| 	if (place == 20) place--; | ||||
| 	convert[place] = 0; | ||||
|  | ||||
| 	zpadlen = max - place; | ||||
| 	spadlen = min - MAX (max, place) - (signvalue ? 1 : 0); | ||||
| 	if (zpadlen < 0) zpadlen = 0; | ||||
| 	if (spadlen < 0) spadlen = 0; | ||||
| 	if (flags & DP_F_ZERO) { | ||||
| 		zpadlen = MAX(zpadlen, spadlen); | ||||
| 		spadlen = 0; | ||||
| 	} | ||||
| 	if (flags & DP_F_MINUS)  | ||||
| 		spadlen = -spadlen; /* Left Justifty */ | ||||
|  | ||||
| #ifdef DEBUG_SNPRINTF | ||||
| 	printf("zpad: %d, spad: %d, min: %d, max: %d, place: %d\n", | ||||
| 	       zpadlen, spadlen, min, max, place); | ||||
| #endif | ||||
|  | ||||
| 	/* Spaces */ | ||||
| 	while (spadlen > 0) { | ||||
| 		dopr_outch (buffer, currlen, maxlen, ' '); | ||||
| 		--spadlen; | ||||
| 	} | ||||
|  | ||||
| 	/* Sign */ | ||||
| 	if (signvalue)  | ||||
| 		dopr_outch (buffer, currlen, maxlen, signvalue); | ||||
|  | ||||
| 	/* Zeros */ | ||||
| 	if (zpadlen > 0) { | ||||
| 		while (zpadlen > 0) { | ||||
| 			dopr_outch (buffer, currlen, maxlen, '0'); | ||||
| 			--zpadlen; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/* Digits */ | ||||
| 	while (place > 0)  | ||||
| 		dopr_outch (buffer, currlen, maxlen, convert[--place]); | ||||
|    | ||||
| 	/* Left Justified spaces */ | ||||
| 	while (spadlen < 0) { | ||||
| 		dopr_outch (buffer, currlen, maxlen, ' '); | ||||
| 		++spadlen; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| static LDOUBLE abs_val(LDOUBLE value) | ||||
| { | ||||
| 	LDOUBLE result = value; | ||||
|  | ||||
| 	if (value < 0) | ||||
| 		result = -value; | ||||
| 	 | ||||
| 	return result; | ||||
| } | ||||
|  | ||||
| static LDOUBLE POW10(int exp) | ||||
| { | ||||
| 	LDOUBLE result = 1; | ||||
| 	 | ||||
| 	while (exp) { | ||||
| 		result *= 10; | ||||
| 		exp--; | ||||
| 	} | ||||
|    | ||||
| 	return result; | ||||
| } | ||||
|  | ||||
| static LLONG ROUND(LDOUBLE value) | ||||
| { | ||||
| 	LLONG intpart; | ||||
|  | ||||
| 	intpart = (LLONG)value; | ||||
| 	value = value - intpart; | ||||
| 	if (value >= 0.5) intpart++; | ||||
| 	 | ||||
| 	return intpart; | ||||
| } | ||||
|  | ||||
| /* a replacement for modf that doesn't need the math library. Should | ||||
|    be portable, but slow */ | ||||
| static double my_modf(double x0, double *iptr) | ||||
| { | ||||
| 	int i; | ||||
| 	long l; | ||||
| 	double x = x0; | ||||
| 	double f = 1.0; | ||||
|  | ||||
| 	for (i=0;i<100;i++) { | ||||
| 		l = (long)x; | ||||
| 		if (l <= (x+1) && l >= (x-1)) break; | ||||
| 		x *= 0.1; | ||||
| 		f *= 10.0; | ||||
| 	} | ||||
|  | ||||
| 	if (i == 100) { | ||||
| 		/* yikes! the number is beyond what we can handle. What do we do? */ | ||||
| 		(*iptr) = 0; | ||||
| 		return 0; | ||||
| 	} | ||||
|  | ||||
| 	if (i != 0) { | ||||
| 		double i2; | ||||
| 		double ret; | ||||
|  | ||||
| 		ret = my_modf(x0-l*f, &i2); | ||||
| 		(*iptr) = l*f + i2; | ||||
| 		return ret; | ||||
| 	}  | ||||
|  | ||||
| 	(*iptr) = l; | ||||
| 	return x - (*iptr); | ||||
| } | ||||
|  | ||||
|  | ||||
| static void fmtfp (char *buffer, size_t *currlen, size_t maxlen, | ||||
| 		   LDOUBLE fvalue, int min, int max, int flags) | ||||
| { | ||||
| 	int signvalue = 0; | ||||
| 	double ufvalue; | ||||
| 	char iconvert[311]; | ||||
| 	char fconvert[311]; | ||||
| 	int iplace = 0; | ||||
| 	int fplace = 0; | ||||
| 	int padlen = 0; /* amount to pad */ | ||||
| 	int zpadlen = 0;  | ||||
| 	int caps = 0; | ||||
| 	int index; | ||||
| 	double intpart; | ||||
| 	double fracpart; | ||||
| 	double temp; | ||||
|    | ||||
| 	/*  | ||||
| 	 * AIX manpage says the default is 0, but Solaris says the default | ||||
| 	 * is 6, and sprintf on AIX defaults to 6 | ||||
| 	 */ | ||||
| 	if (max < 0) | ||||
| 		max = 6; | ||||
|  | ||||
| 	ufvalue = abs_val (fvalue); | ||||
|  | ||||
| 	if (fvalue < 0) { | ||||
| 		signvalue = '-'; | ||||
| 	} else { | ||||
| 		if (flags & DP_F_PLUS) { /* Do a sign (+/i) */ | ||||
| 			signvalue = '+'; | ||||
| 		} else { | ||||
| 			if (flags & DP_F_SPACE) | ||||
| 				signvalue = ' '; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| #if 0 | ||||
| 	if (flags & DP_F_UP) caps = 1; /* Should characters be upper case? */ | ||||
| #endif | ||||
|  | ||||
| #if 0 | ||||
| 	if (max == 0) ufvalue += 0.5; /* if max = 0 we must round */ | ||||
| #endif | ||||
|  | ||||
| 	/*  | ||||
| 	 * Sorry, we only support 16 digits past the decimal because of our  | ||||
| 	 * conversion method | ||||
| 	 */ | ||||
| 	if (max > 16) | ||||
| 		max = 16; | ||||
|  | ||||
| 	/* We "cheat" by converting the fractional part to integer by | ||||
| 	 * multiplying by a factor of 10 | ||||
| 	 */ | ||||
|  | ||||
| 	temp = ufvalue; | ||||
| 	my_modf(temp, &intpart); | ||||
|  | ||||
| 	fracpart = ROUND((POW10(max)) * (ufvalue - intpart)); | ||||
| 	 | ||||
| 	if (fracpart >= POW10(max)) { | ||||
| 		intpart++; | ||||
| 		fracpart -= POW10(max); | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	/* Convert integer part */ | ||||
| 	do { | ||||
| 		temp = intpart; | ||||
| 		my_modf(intpart*0.1, &intpart); | ||||
| 		temp = temp*0.1; | ||||
| 		index = (int) ((temp -intpart +0.05)* 10.0); | ||||
| 		/* index = (int) (((double)(temp*0.1) -intpart +0.05) *10.0); */ | ||||
| 		/* printf ("%llf, %f, %x\n", temp, intpart, index); */ | ||||
| 		iconvert[iplace++] = | ||||
| 			(caps? "0123456789ABCDEF":"0123456789abcdef")[index]; | ||||
| 	} while (intpart && (iplace < 311)); | ||||
| 	if (iplace == 311) iplace--; | ||||
| 	iconvert[iplace] = 0; | ||||
|  | ||||
| 	/* Convert fractional part */ | ||||
| 	if (fracpart) | ||||
| 	{ | ||||
| 		do { | ||||
| 			temp = fracpart; | ||||
| 			my_modf(fracpart*0.1, &fracpart); | ||||
| 			temp = temp*0.1; | ||||
| 			index = (int) ((temp -fracpart +0.05)* 10.0); | ||||
| 			/* index = (int) ((((temp/10) -fracpart) +0.05) *10); */ | ||||
| 			/* printf ("%lf, %lf, %ld\n", temp, fracpart, index); */ | ||||
| 			fconvert[fplace++] = | ||||
| 			(caps? "0123456789ABCDEF":"0123456789abcdef")[index]; | ||||
| 		} while(fracpart && (fplace < 311)); | ||||
| 		if (fplace == 311) fplace--; | ||||
| 	} | ||||
| 	fconvert[fplace] = 0; | ||||
|    | ||||
| 	/* -1 for decimal point, another -1 if we are printing a sign */ | ||||
| 	padlen = min - iplace - max - 1 - ((signvalue) ? 1 : 0);  | ||||
| 	zpadlen = max - fplace; | ||||
| 	if (zpadlen < 0) zpadlen = 0; | ||||
| 	if (padlen < 0)  | ||||
| 		padlen = 0; | ||||
| 	if (flags & DP_F_MINUS)  | ||||
| 		padlen = -padlen; /* Left Justifty */ | ||||
| 	 | ||||
| 	if ((flags & DP_F_ZERO) && (padlen > 0)) { | ||||
| 		if (signvalue) { | ||||
| 			dopr_outch (buffer, currlen, maxlen, signvalue); | ||||
| 			--padlen; | ||||
| 			signvalue = 0; | ||||
| 		} | ||||
| 		while (padlen > 0) { | ||||
| 			dopr_outch (buffer, currlen, maxlen, '0'); | ||||
| 			--padlen; | ||||
| 		} | ||||
| 	} | ||||
| 	while (padlen > 0) { | ||||
| 		dopr_outch (buffer, currlen, maxlen, ' '); | ||||
| 		--padlen; | ||||
| 	} | ||||
| 	if (signvalue)  | ||||
| 		dopr_outch (buffer, currlen, maxlen, signvalue); | ||||
| 	 | ||||
| 	while (iplace > 0)  | ||||
| 		dopr_outch (buffer, currlen, maxlen, iconvert[--iplace]); | ||||
|  | ||||
| #ifdef DEBUG_SNPRINTF | ||||
| 	printf("fmtfp: fplace=%d zpadlen=%d\n", fplace, zpadlen); | ||||
| #endif | ||||
|  | ||||
| 	/* | ||||
| 	 * Decimal point.  This should probably use locale to find the correct | ||||
| 	 * char to print out. | ||||
| 	 */ | ||||
| 	if (max > 0) { | ||||
| 		dopr_outch (buffer, currlen, maxlen, '.'); | ||||
| 		 | ||||
| 		while (fplace > 0)  | ||||
| 			dopr_outch (buffer, currlen, maxlen, fconvert[--fplace]); | ||||
| 	} | ||||
| 	 | ||||
| 	while (zpadlen > 0) { | ||||
| 		dopr_outch (buffer, currlen, maxlen, '0'); | ||||
| 		--zpadlen; | ||||
| 	} | ||||
|  | ||||
| 	while (padlen < 0) { | ||||
| 		dopr_outch (buffer, currlen, maxlen, ' '); | ||||
| 		++padlen; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| static void dopr_outch(char *buffer, size_t *currlen, size_t maxlen, char c) | ||||
| { | ||||
| 	if (*currlen < maxlen) { | ||||
| 		buffer[(*currlen)] = c; | ||||
| 	} | ||||
| 	(*currlen)++; | ||||
| } | ||||
|  | ||||
| #if !defined(HAVE_VSNPRINTF) | ||||
| int vsnprintf (char *str, size_t count, const char *fmt, va_list args) | ||||
| { | ||||
| 	return dopr(str, count, fmt, args); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #if !defined(HAVE_SNPRINTF) | ||||
| int snprintf(char *str,size_t count,const char *fmt,...) | ||||
| { | ||||
| 	size_t ret; | ||||
| 	va_list ap; | ||||
|      | ||||
| 	va_start(ap, fmt); | ||||
| 	ret = vsnprintf(str, count, fmt, ap); | ||||
| 	va_end(ap); | ||||
| 	return ret; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #ifdef TEST_SNPRINTF | ||||
| int sprintf(char *str,const char *fmt,...); | ||||
| int main (void) | ||||
| { | ||||
| 	char buf1[1024]; | ||||
| 	char buf2[1024]; | ||||
| 	char *fp_fmt[] = { | ||||
| 		"%1.1f", | ||||
| 		"%-1.5f", | ||||
| 		"%1.5f", | ||||
| 		"%123.9f", | ||||
| 		"%10.5f", | ||||
| 		"% 10.5f", | ||||
| 		"%+22.9f", | ||||
| 		"%+4.9f", | ||||
| 		"%01.3f", | ||||
| 		"%4f", | ||||
| 		"%3.1f", | ||||
| 		"%3.2f", | ||||
| 		"%.0f", | ||||
| 		"%f", | ||||
| 		"-16.16f", | ||||
| 		NULL | ||||
| 	}; | ||||
| 	double fp_nums[] = { 6442452944.1234, -1.5, 134.21, 91340.2, 341.1234, 0203.9, 0.96, 0.996,  | ||||
| 			     0.9996, 1.996, 4.136,  0}; | ||||
| 	char *int_fmt[] = { | ||||
| 		"%-1.5d", | ||||
| 		"%1.5d", | ||||
| 		"%123.9d", | ||||
| 		"%5.5d", | ||||
| 		"%10.5d", | ||||
| 		"% 10.5d", | ||||
| 		"%+22.33d", | ||||
| 		"%01.3d", | ||||
| 		"%4d", | ||||
| 		"%d", | ||||
| 		NULL | ||||
| 	}; | ||||
| 	long int_nums[] = { -1, 134, 91340, 341, 0203, 0}; | ||||
| 	char *str_fmt[] = { | ||||
| 		"10.5s", | ||||
| 		"5.10s", | ||||
| 		"10.1s", | ||||
| 		"0.10s", | ||||
| 		"10.0s", | ||||
| 		"1.10s", | ||||
| 		"%s", | ||||
| 		"%.1s", | ||||
| 		"%.10s", | ||||
| 		"%10s", | ||||
| 		NULL | ||||
| 	}; | ||||
| 	char *str_vals[] = {"hello", "a", "", "a longer string", NULL}; | ||||
| 	int x, y; | ||||
| 	int fail = 0; | ||||
| 	int num = 0; | ||||
|  | ||||
| 	printf ("Testing snprintf format codes against system sprintf...\n"); | ||||
|  | ||||
| 	for (x = 0; fp_fmt[x] ; x++) { | ||||
| 		for (y = 0; fp_nums[y] != 0 ; y++) { | ||||
| 			int l1 = snprintf(NULL, 0, fp_fmt[x], fp_nums[y]); | ||||
| 			int l2 = snprintf(buf1, sizeof(buf1), fp_fmt[x], fp_nums[y]); | ||||
| 			sprintf (buf2, fp_fmt[x], fp_nums[y]); | ||||
| 			if (strcmp (buf1, buf2)) { | ||||
| 				printf("snprintf doesn't match Format: %s\n\tsnprintf = [%s]\n\t sprintf = [%s]\n",  | ||||
| 				       fp_fmt[x], buf1, buf2); | ||||
| 				fail++; | ||||
| 			} | ||||
| 			if (l1 != l2) { | ||||
| 				printf("snprintf l1 != l2 (%d %d) %s\n", l1, l2, fp_fmt[x]); | ||||
| 				fail++; | ||||
| 			} | ||||
| 			num++; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	for (x = 0; int_fmt[x] ; x++) { | ||||
| 		for (y = 0; int_nums[y] != 0 ; y++) { | ||||
| 			int l1 = snprintf(NULL, 0, int_fmt[x], int_nums[y]); | ||||
| 			int l2 = snprintf(buf1, sizeof(buf1), int_fmt[x], int_nums[y]); | ||||
| 			sprintf (buf2, int_fmt[x], int_nums[y]); | ||||
| 			if (strcmp (buf1, buf2)) { | ||||
| 				printf("snprintf doesn't match Format: %s\n\tsnprintf = [%s]\n\t sprintf = [%s]\n",  | ||||
| 				       int_fmt[x], buf1, buf2); | ||||
| 				fail++; | ||||
| 			} | ||||
| 			if (l1 != l2) { | ||||
| 				printf("snprintf l1 != l2 (%d %d) %s\n", l1, l2, int_fmt[x]); | ||||
| 				fail++; | ||||
| 			} | ||||
| 			num++; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	for (x = 0; str_fmt[x] ; x++) { | ||||
| 		for (y = 0; str_vals[y] != 0 ; y++) { | ||||
| 			int l1 = snprintf(NULL, 0, str_fmt[x], str_vals[y]); | ||||
| 			int l2 = snprintf(buf1, sizeof(buf1), str_fmt[x], str_vals[y]); | ||||
| 			sprintf (buf2, str_fmt[x], str_vals[y]); | ||||
| 			if (strcmp (buf1, buf2)) { | ||||
| 				printf("snprintf doesn't match Format: %s\n\tsnprintf = [%s]\n\t sprintf = [%s]\n",  | ||||
| 				       str_fmt[x], buf1, buf2); | ||||
| 				fail++; | ||||
| 			} | ||||
| 			if (l1 != l2) { | ||||
| 				printf("snprintf l1 != l2 (%d %d) %s\n", l1, l2, str_fmt[x]); | ||||
| 				fail++; | ||||
| 			} | ||||
| 			num++; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	printf ("%d tests failed out of %d.\n", fail, num); | ||||
|  | ||||
| 	printf("seeing how many digits we support\n"); | ||||
| 	{ | ||||
| 		double v0 = 0.12345678901234567890123456789012345678901; | ||||
| 		for (x=0; x<100; x++) { | ||||
| 			snprintf(buf1, sizeof(buf1), "%1.1f", v0*pow(10, x)); | ||||
| 			sprintf(buf2,		"%1.1f", v0*pow(10, x)); | ||||
| 			if (strcmp(buf1, buf2)) { | ||||
| 				printf("we seem to support %d digits\n", x-1); | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
| #endif /* SNPRINTF_TEST */ | ||||
|  | ||||
|  | ||||
| /* -eof- */ | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user