mirror of
				https://github.com/osmarks/ngircd.git
				synced 2025-11-03 23:43:00 +00:00 
			
		
		
		
	Compare commits
	
		
			1109 Commits
		
	
	
		
			rel-0-5-0
			...
			branch-0-1
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					b00a08ef40 | ||
| 
						 | 
					aede22901c | ||
| 
						 | 
					62b668a7b1 | ||
| 
						 | 
					ecddfb7010 | ||
| 
						 | 
					fb46757c48 | ||
| 
						 | 
					b6b019dddc | ||
| 
						 | 
					ce3215acaf | ||
| 
						 | 
					edb59b8317 | ||
| 
						 | 
					42207d160b | ||
| 
						 | 
					a3dc42534b | ||
| 
						 | 
					bb81927ce4 | ||
| 
						 | 
					b2c0a89f45 | ||
| 
						 | 
					f44007f42f | ||
| 
						 | 
					1a56c77751 | ||
| 
						 | 
					78257374f0 | ||
| 
						 | 
					fc93044909 | ||
| 
						 | 
					2e0c62df91 | ||
| 
						 | 
					c5ba599140 | ||
| 
						 | 
					afc67ff323 | ||
| 
						 | 
					6cfc56064e | ||
| 
						 | 
					4a81367dac | ||
| 
						 | 
					8c425945a2 | ||
| 
						 | 
					bb6ee46892 | ||
| 
						 | 
					6052d04c60 | ||
| 
						 | 
					9194319399 | ||
| 
						 | 
					32bf6d4de0 | ||
| 
						 | 
					33b1204349 | ||
| 
						 | 
					09968ee843 | ||
| 
						 | 
					523a6fad09 | ||
| 
						 | 
					54b17fc201 | ||
| 
						 | 
					25f48a2a34 | ||
| 
						 | 
					22fa782be7 | ||
| 
						 | 
					b187fac244 | ||
| 
						 | 
					6e9389b86c | ||
| 
						 | 
					2f6d7a649c | ||
| 
						 | 
					a8e0eb62e9 | ||
| 
						 | 
					7df90846e1 | ||
| 
						 | 
					4ea2932967 | ||
| 
						 | 
					92a9092208 | ||
| 
						 | 
					a0efcdccfa | ||
| 
						 | 
					012aeca32b | ||
| 
						 | 
					c4a505d3a8 | ||
| 
						 | 
					8df445316a | ||
| 
						 | 
					11af32466f | ||
| 
						 | 
					5538115537 | ||
| 
						 | 
					b8643477ba | ||
| 
						 | 
					796dcf6a62 | ||
| 
						 | 
					6b0c094809 | ||
| 
						 | 
					b36fc3b095 | ||
| 
						 | 
					2dd51a98e4 | ||
| 
						 | 
					761ae2b1a4 | ||
| 
						 | 
					87cae1465b | ||
| 
						 | 
					b7135ea76a | ||
| 
						 | 
					248f8e0b70 | ||
| 
						 | 
					7b33424c13 | ||
| 
						 | 
					7c82cc236b | ||
| 
						 | 
					307f8abd74 | ||
| 
						 | 
					bc63064d5c | ||
| 
						 | 
					be844d74d3 | ||
| 
						 | 
					637d739285 | ||
| 
						 | 
					66e68de16a | ||
| 
						 | 
					7f44a2ad1c | ||
| 
						 | 
					abb1abeb77 | ||
| 
						 | 
					ab1f48a346 | ||
| 
						 | 
					feb31e4200 | ||
| 
						 | 
					c31ad221a6 | ||
| 
						 | 
					44cdf1b1ca | ||
| 
						 | 
					e710e8ae37 | ||
| 
						 | 
					89ba1bdcba | ||
| 
						 | 
					0250acc50b | ||
| 
						 | 
					ec80cc99c6 | ||
| 
						 | 
					5147b675cb | ||
| 
						 | 
					ddecfcd831 | ||
| 
						 | 
					2f71fbb2a1 | ||
| 
						 | 
					1784180bf3 | ||
| 
						 | 
					634ef8c131 | ||
| 
						 | 
					4d152b771e | ||
| 
						 | 
					c634303765 | ||
| 
						 | 
					cb0d594e61 | ||
| 
						 | 
					000a227a74 | ||
| 
						 | 
					6bd35bf090 | ||
| 
						 | 
					3022d7cff3 | ||
| 
						 | 
					f86ce17f1c | ||
| 
						 | 
					42db159d26 | ||
| 
						 | 
					59b19ea6a3 | ||
| 
						 | 
					4add9c29ed | ||
| 
						 | 
					d1364ab488 | ||
| 
						 | 
					56256535c5 | ||
| 
						 | 
					35b6f3997c | ||
| 
						 | 
					463c5cb7c5 | ||
| 
						 | 
					7548aa089c | ||
| 
						 | 
					478a8c01f9 | ||
| 
						 | 
					61e6b5c0aa | ||
| 
						 | 
					91a6fffaa0 | ||
| 
						 | 
					2ce5b734bd | ||
| 
						 | 
					f99f9a8f02 | ||
| 
						 | 
					4715ccf9ca | ||
| 
						 | 
					8974e90552 | ||
| 
						 | 
					2fe13f0a45 | ||
| 
						 | 
					20ce56cc5b | ||
| 
						 | 
					47a0379e2b | ||
| 
						 | 
					37563537a9 | ||
| 
						 | 
					82d32ffb28 | ||
| 
						 | 
					024588dbe7 | ||
| 
						 | 
					47ca178a21 | ||
| 
						 | 
					12db0bdc4f | ||
| 
						 | 
					53b98fd7e9 | ||
| 
						 | 
					c7d4d85666 | ||
| 
						 | 
					4659dae6eb | ||
| 
						 | 
					68f896eee0 | ||
| 
						 | 
					06bfb3adfb | ||
| 
						 | 
					2f305331a1 | ||
| 
						 | 
					ad7361dfe0 | ||
| 
						 | 
					e47c9d750f | ||
| 
						 | 
					001c00b273 | ||
| 
						 | 
					b861f536b2 | ||
| 
						 | 
					877bcc55f2 | ||
| 
						 | 
					8f162f4e17 | ||
| 
						 | 
					089ca21b3d | ||
| 
						 | 
					137a139112 | ||
| 
						 | 
					b160f574de | ||
| 
						 | 
					d223b587e4 | ||
| 
						 | 
					77939c382d | ||
| 
						 | 
					f586052f2b | ||
| 
						 | 
					d4ed056147 | ||
| 
						 | 
					9021ea2070 | ||
| 
						 | 
					640367e886 | ||
| 
						 | 
					4b9e52eb4d | ||
| 
						 | 
					69081851ac | ||
| 
						 | 
					efcca62a35 | ||
| 
						 | 
					cd65e0a56e | ||
| 
						 | 
					2275add327 | ||
| 
						 | 
					fd1091541b | ||
| 
						 | 
					5675be4cd9 | ||
| 
						 | 
					f1486e6a53 | ||
| 
						 | 
					22a9ed6694 | ||
| 
						 | 
					ddf56cbe5f | ||
| 
						 | 
					255edf7eab | ||
| 
						 | 
					5930a29197 | ||
| 
						 | 
					07d8da60de | ||
| 
						 | 
					44afe042d1 | ||
| 
						 | 
					a073bc89c4 | ||
| 
						 | 
					63e89ceb21 | ||
| 
						 | 
					09416f36bf | ||
| 
						 | 
					508b55126f | ||
| 
						 | 
					9f65979979 | ||
| 
						 | 
					2e34ddae53 | ||
| 
						 | 
					09deb857ce | ||
| 
						 | 
					8c14d397ba | ||
| 
						 | 
					99eab1e216 | ||
| 
						 | 
					c93d089736 | ||
| 
						 | 
					429f85b77a | ||
| 
						 | 
					ea2a4b3370 | ||
| 
						 | 
					f9b9850662 | ||
| 
						 | 
					1b852fce72 | ||
| 
						 | 
					82aaffe55d | ||
| 
						 | 
					40199e0b56 | ||
| 
						 | 
					95b7dbcc18 | ||
| 
						 | 
					43f8d149bb | ||
| 
						 | 
					949a4ef793 | ||
| 
						 | 
					f74781647a | ||
| 
						 | 
					5c78230283 | ||
| 
						 | 
					ee568cc444 | ||
| 
						 | 
					2d9a3ec484 | ||
| 
						 | 
					262d945284 | ||
| 
						 | 
					f6ce2d557a | ||
| 
						 | 
					4243cae985 | ||
| 
						 | 
					40226d26b2 | ||
| 
						 | 
					d2f7d3087d | ||
| 
						 | 
					3f1e03edd9 | ||
| 
						 | 
					23e7f7f0dd | ||
| 
						 | 
					f36746a4d0 | ||
| 
						 | 
					8cb0e3af68 | ||
| 
						 | 
					eb3ddace46 | ||
| 
						 | 
					5040d56489 | ||
| 
						 | 
					fb0fbe908d | ||
| 
						 | 
					fa7bb2790a | ||
| 
						 | 
					5877bca4bc | ||
| 
						 | 
					37602d1523 | ||
| 
						 | 
					a09034563a | ||
| 
						 | 
					5b35b101f2 | ||
| 
						 | 
					058d3085a9 | ||
| 
						 | 
					74883f57da | ||
| 
						 | 
					018e351630 | ||
| 
						 | 
					6e105bf87e | ||
| 
						 | 
					61966a6088 | ||
| 
						 | 
					27c96632f1 | ||
| 
						 | 
					4108e16be6 | ||
| 
						 | 
					4e02bdc322 | ||
| 
						 | 
					ca5e09865e | ||
| 
						 | 
					fb0c7ad252 | ||
| 
						 | 
					d8950c5dd0 | ||
| 
						 | 
					257312b102 | ||
| 
						 | 
					27d947fb7d | ||
| 
						 | 
					bed98979dc | ||
| 
						 | 
					bddb4914b4 | ||
| 
						 | 
					4c6c6ecf0e | ||
| 
						 | 
					a2f5a05ff8 | ||
| 
						 | 
					639eb40035 | ||
| 
						 | 
					0d6f9d4e3e | ||
| 
						 | 
					147de9dfa9 | ||
| 
						 | 
					f6e729443e | ||
| 
						 | 
					e426c131c7 | ||
| 
						 | 
					b9661ae65d | ||
| 
						 | 
					035f7fb2fe | ||
| 
						 | 
					1b2c228de5 | ||
| 
						 | 
					4d7d1d23be | ||
| 
						 | 
					e2aacff7d4 | ||
| 
						 | 
					0eccdbc137 | ||
| 
						 | 
					939ee6a39b | ||
| 
						 | 
					8423b89996 | ||
| 
						 | 
					7d87318b04 | ||
| 
						 | 
					83caef4598 | ||
| 
						 | 
					7378860aea | ||
| 
						 | 
					6eb3f3055d | ||
| 
						 | 
					c888c81adf | ||
| 
						 | 
					fac4682212 | ||
| 
						 | 
					47026e14ce | ||
| 
						 | 
					63626449f8 | ||
| 
						 | 
					184eb1c54b | ||
| 
						 | 
					5ce6bf28d1 | ||
| 
						 | 
					f1f94f07e1 | ||
| 
						 | 
					c8fd051e06 | ||
| 
						 | 
					3e8978d836 | ||
| 
						 | 
					9a2d4eef44 | ||
| 
						 | 
					0d5fc770d3 | ||
| 
						 | 
					5590f8624b | ||
| 
						 | 
					fdc7ae22e9 | ||
| 
						 | 
					179d61c588 | ||
| 
						 | 
					47e581e453 | ||
| 
						 | 
					65573d7a07 | ||
| 
						 | 
					155056f386 | ||
| 
						 | 
					3833f8aae3 | ||
| 
						 | 
					161340d486 | ||
| 
						 | 
					e9e1fa459b | ||
| 
						 | 
					581f5479a2 | ||
| 
						 | 
					00ab67dcdb | ||
| 
						 | 
					dd3a3bc603 | ||
| 
						 | 
					0a3f562f36 | ||
| 
						 | 
					9dfd42a7e6 | ||
| 
						 | 
					a65eb347ec | ||
| 
						 | 
					2af87e9152 | ||
| 
						 | 
					d0045afb09 | ||
| 
						 | 
					1f5bdaec84 | ||
| 
						 | 
					185004cb30 | ||
| 
						 | 
					4a2eea2939 | ||
| 
						 | 
					6d3686e73d | ||
| 
						 | 
					5d0ba011c7 | ||
| 
						 | 
					87f4b1c6f6 | ||
| 
						 | 
					8067bab106 | ||
| 
						 | 
					097c7bd741 | ||
| 
						 | 
					c7bd9da446 | ||
| 
						 | 
					3d0ab6bd2e | ||
| 
						 | 
					bebfbedf3f | ||
| 
						 | 
					cba9270845 | ||
| 
						 | 
					2a9ffe7037 | ||
| 
						 | 
					4000e01b28 | ||
| 
						 | 
					68d3d36dd6 | ||
| 
						 | 
					eedfc35bbc | ||
| 
						 | 
					d39d3ec4b9 | ||
| 
						 | 
					79dfd60a0c | ||
| 
						 | 
					29ad5e0d94 | ||
| 
						 | 
					7e8ac0afcf | ||
| 
						 | 
					93df629b69 | ||
| 
						 | 
					66060dbce9 | ||
| 
						 | 
					0701afedee | ||
| 
						 | 
					a17745d6d7 | ||
| 
						 | 
					1249acfdba | ||
| 
						 | 
					c8fb6a2258 | ||
| 
						 | 
					7215737038 | ||
| 
						 | 
					6eb2e37234 | ||
| 
						 | 
					fb9707de98 | ||
| 
						 | 
					db9afbbf0e | ||
| 
						 | 
					e1b9409e63 | ||
| 
						 | 
					4b2f966b7e | ||
| 
						 | 
					a293088027 | ||
| 
						 | 
					bd043449f2 | ||
| 
						 | 
					0570e13cac | ||
| 
						 | 
					6b21249151 | ||
| 
						 | 
					4f8d646e2a | ||
| 
						 | 
					ac55a80d9f | ||
| 
						 | 
					bc09a3e487 | ||
| 
						 | 
					ff218617db | ||
| 
						 | 
					b65358b17c | ||
| 
						 | 
					e9f3e69f36 | ||
| 
						 | 
					5b2364b236 | ||
| 
						 | 
					4db29b0076 | ||
| 
						 | 
					0aae3ec5d7 | ||
| 
						 | 
					468a1c7767 | ||
| 
						 | 
					ab3ac4e466 | ||
| 
						 | 
					4d18ac83a2 | ||
| 
						 | 
					660b529c10 | ||
| 
						 | 
					565129f992 | ||
| 
						 | 
					b2a3bc3257 | ||
| 
						 | 
					bcf8a5bee6 | ||
| 
						 | 
					fc4cd39202 | ||
| 
						 | 
					b5b7c7f174 | ||
| 
						 | 
					6444442931 | ||
| 
						 | 
					e899c75d7e | ||
| 
						 | 
					cae9a3aee5 | ||
| 
						 | 
					e708790566 | ||
| 
						 | 
					0dd0015d16 | ||
| 
						 | 
					dd3d2e2c39 | ||
| 
						 | 
					9275dc4dc4 | ||
| 
						 | 
					af9123fd82 | ||
| 
						 | 
					ca32c1b311 | ||
| 
						 | 
					342f20f889 | ||
| 
						 | 
					a5b5a6a99a | ||
| 
						 | 
					c65343e719 | ||
| 
						 | 
					a7197f579c | ||
| 
						 | 
					30c11b2313 | ||
| 
						 | 
					b7033e1478 | ||
| 
						 | 
					db992975eb | ||
| 
						 | 
					c12dc45f17 | ||
| 
						 | 
					a2e4eb5aaf | ||
| 
						 | 
					58b8fb5d12 | ||
| 
						 | 
					8efeae1714 | ||
| 
						 | 
					21ad5dcfff | ||
| 
						 | 
					4074fd9149 | ||
| 
						 | 
					2f105b1c0a | ||
| 
						 | 
					a2cdc08c39 | ||
| 
						 | 
					e728bd2e1a | ||
| 
						 | 
					12e288c062 | ||
| 
						 | 
					733e15bb64 | ||
| 
						 | 
					99544e8d5d | ||
| 
						 | 
					f36337fab3 | ||
| 
						 | 
					1a46b37bd5 | ||
| 
						 | 
					5f87474a74 | ||
| 
						 | 
					6434d0b23e | ||
| 
						 | 
					d5c5d2a37f | ||
| 
						 | 
					ac96fe5877 | ||
| 
						 | 
					a6d1d26a43 | ||
| 
						 | 
					c2f5399b51 | ||
| 
						 | 
					ae6e6616a6 | ||
| 
						 | 
					a5915f75c9 | ||
| 
						 | 
					f2ba8abec5 | ||
| 
						 | 
					701c259394 | ||
| 
						 | 
					a32b404863 | ||
| 
						 | 
					b15d906dff | ||
| 
						 | 
					1c14e2e0a2 | ||
| 
						 | 
					77f54693ef | ||
| 
						 | 
					b61407713d | ||
| 
						 | 
					b120c2a271 | ||
| 
						 | 
					51ccb5928a | ||
| 
						 | 
					890c3d9d72 | ||
| 
						 | 
					84706af7fe | ||
| 
						 | 
					46a191caf6 | ||
| 
						 | 
					20ff63a8a1 | ||
| 
						 | 
					21a067e0b1 | ||
| 
						 | 
					8c7521af25 | ||
| 
						 | 
					e96b4aad2e | ||
| 
						 | 
					2e794a6943 | ||
| 
						 | 
					1e9e16fa3b | ||
| 
						 | 
					6ecccd2644 | ||
| 
						 | 
					9db49e8f2c | ||
| 
						 | 
					74cb2e2768 | ||
| 
						 | 
					e5097bf2e6 | ||
| 
						 | 
					3237d28bfb | ||
| 
						 | 
					317841529b | ||
| 
						 | 
					68dc35b548 | ||
| 
						 | 
					d6e6350523 | ||
| 
						 | 
					7036111a6c | ||
| 
						 | 
					987559e46d | ||
| 
						 | 
					fca29bfa23 | ||
| 
						 | 
					63db3daafe | ||
| 
						 | 
					2e858755c5 | ||
| 
						 | 
					b682a5e485 | ||
| 
						 | 
					efbfe4ae83 | ||
| 
						 | 
					c92e57fec3 | ||
| 
						 | 
					ca130e6db6 | ||
| 
						 | 
					248d75e566 | ||
| 
						 | 
					4715b17106 | ||
| 
						 | 
					70facb7f6e | ||
| 
						 | 
					76604f847a | ||
| 
						 | 
					c7693f625e | ||
| 
						 | 
					e50d049074 | ||
| 
						 | 
					dd003e23b7 | ||
| 
						 | 
					178b564c51 | ||
| 
						 | 
					b976ec032f | ||
| 
						 | 
					8916b201fa | ||
| 
						 | 
					ead79d3e39 | ||
| 
						 | 
					0e2f5a4f3d | ||
| 
						 | 
					78692f1e87 | ||
| 
						 | 
					02b0a51517 | ||
| 
						 | 
					a874c26c25 | ||
| 
						 | 
					1eca0aea4f | ||
| 
						 | 
					7b5a1bbe3c | ||
| 
						 | 
					b88e97f193 | ||
| 
						 | 
					6b4ecf8c83 | ||
| 
						 | 
					6093af49d5 | ||
| 
						 | 
					0d180a913f | ||
| 
						 | 
					60ae9c827e | ||
| 
						 | 
					c857e9c887 | ||
| 
						 | 
					579fce1831 | ||
| 
						 | 
					2bf77fb0c3 | ||
| 
						 | 
					774c6cda4d | ||
| 
						 | 
					afef7dee82 | ||
| 
						 | 
					7eca418465 | ||
| 
						 | 
					ebbf92898e | ||
| 
						 | 
					733ef4c815 | ||
| 
						 | 
					e5a19fa3a0 | ||
| 
						 | 
					ccb747cb3b | ||
| 
						 | 
					9a6b6f527b | ||
| 
						 | 
					43d644ed92 | ||
| 
						 | 
					eeccc193dd | ||
| 
						 | 
					0e3ce63ec1 | ||
| 
						 | 
					0c33f46fc2 | ||
| 
						 | 
					117a9e21e7 | ||
| 
						 | 
					162338b8c8 | ||
| 
						 | 
					de395db8e3 | ||
| 
						 | 
					dbea187373 | ||
| 
						 | 
					d81dab99fa | ||
| 
						 | 
					9dc5e50226 | ||
| 
						 | 
					c06c815c28 | ||
| 
						 | 
					04169f34cf | ||
| 
						 | 
					aec535c8b6 | ||
| 
						 | 
					2d4dd33627 | ||
| 
						 | 
					b0699efdab | ||
| 
						 | 
					1ca8bb5255 | ||
| 
						 | 
					bc2dac3c74 | ||
| 
						 | 
					94dd7fa7d6 | ||
| 
						 | 
					fcf65beea4 | ||
| 
						 | 
					1cf8ccd8fe | ||
| 
						 | 
					74424cb1a5 | ||
| 
						 | 
					5c20474fdb | ||
| 
						 | 
					8b0ac2306e | ||
| 
						 | 
					5195555c5a | ||
| 
						 | 
					a4660f40db | ||
| 
						 | 
					9fa9c1fdda | ||
| 
						 | 
					cac9f279fa | ||
| 
						 | 
					517321807e | ||
| 
						 | 
					ae98008c1c | ||
| 
						 | 
					45404a1644 | ||
| 
						 | 
					50338126e0 | ||
| 
						 | 
					8ac701d6c8 | ||
| 
						 | 
					158bf554c3 | ||
| 
						 | 
					9c3c7e5a09 | ||
| 
						 | 
					cd0dc8627d | ||
| 
						 | 
					44fdde7610 | ||
| 
						 | 
					95f8b963a6 | ||
| 
						 | 
					1aeaf64c66 | ||
| 
						 | 
					06caecb0c4 | ||
| 
						 | 
					b1c14598e1 | ||
| 
						 | 
					7f0d101184 | ||
| 
						 | 
					9f247ebd5a | ||
| 
						 | 
					dd9b4bc956 | ||
| 
						 | 
					6f97dd4938 | ||
| 
						 | 
					a02f25a810 | ||
| 
						 | 
					aa25cd7da2 | ||
| 
						 | 
					70fcdf1b5c | ||
| 
						 | 
					dfe662ad45 | ||
| 
						 | 
					7daa7fb278 | ||
| 
						 | 
					e7c2c86aee | ||
| 
						 | 
					c4bc2114c9 | ||
| 
						 | 
					129a22a29b | ||
| 
						 | 
					8304210c06 | ||
| 
						 | 
					aee48a3b38 | ||
| 
						 | 
					77faf14b29 | ||
| 
						 | 
					8b17579e60 | ||
| 
						 | 
					b4363162ce | ||
| 
						 | 
					873edc6311 | ||
| 
						 | 
					6ed37415fc | ||
| 
						 | 
					55fadbfb1d | ||
| 
						 | 
					ca8ab38cac | ||
| 
						 | 
					dec7eba531 | ||
| 
						 | 
					b0ae15e01d | ||
| 
						 | 
					43ba1bc805 | ||
| 
						 | 
					811ac48bd2 | ||
| 
						 | 
					e936a79f6b | ||
| 
						 | 
					0545288ebd | ||
| 
						 | 
					e635ed43bf | ||
| 
						 | 
					4d0b03b423 | ||
| 
						 | 
					f6df13d5f8 | ||
| 
						 | 
					f56a1bdf20 | ||
| 
						 | 
					9dfcc6504e | ||
| 
						 | 
					a822153309 | ||
| 
						 | 
					49f5a4d454 | ||
| 
						 | 
					326607eea1 | ||
| 
						 | 
					bfba1f37ed | ||
| 
						 | 
					374f90f392 | ||
| 
						 | 
					8adff59223 | ||
| 
						 | 
					27d93d7d8c | ||
| 
						 | 
					8a2ed0a75f | ||
| 
						 | 
					5fdd5be12b | ||
| 
						 | 
					795802f2b0 | ||
| 
						 | 
					1869766331 | ||
| 
						 | 
					1d08d51e2e | ||
| 
						 | 
					5e929effca | ||
| 
						 | 
					e618041168 | ||
| 
						 | 
					e7f8782831 | ||
| 
						 | 
					4ef172d603 | ||
| 
						 | 
					490c9d04d7 | ||
| 
						 | 
					8579b2a1e5 | ||
| 
						 | 
					3da942e237 | ||
| 
						 | 
					bcb6cf3ffa | ||
| 
						 | 
					972b07ff29 | ||
| 
						 | 
					ba19fb8ff4 | ||
| 
						 | 
					8d8b133bdf | ||
| 
						 | 
					ec30cd4e5f | ||
| 
						 | 
					f2fbf206b6 | ||
| 
						 | 
					1fdd5478c6 | ||
| 
						 | 
					9537542647 | ||
| 
						 | 
					0993ff81bb | ||
| 
						 | 
					894cd2cd68 | ||
| 
						 | 
					c16d1b03aa | ||
| 
						 | 
					451315643f | ||
| 
						 | 
					d77182e7a6 | ||
| 
						 | 
					8edeed8418 | ||
| 
						 | 
					112102b10c | ||
| 
						 | 
					ae63ed04c5 | ||
| 
						 | 
					85acb82469 | ||
| 
						 | 
					51d09fb4f7 | ||
| 
						 | 
					8308c170db | ||
| 
						 | 
					07fe19889b | ||
| 
						 | 
					0c293ae988 | ||
| 
						 | 
					18c92d9de7 | ||
| 
						 | 
					2440ed080c | ||
| 
						 | 
					669da58715 | ||
| 
						 | 
					39f1ddd9d0 | ||
| 
						 | 
					34e912d9f2 | ||
| 
						 | 
					44172a8c7f | ||
| 
						 | 
					a6d7fb8739 | ||
| 
						 | 
					d16ce5a735 | ||
| 
						 | 
					a40a026d15 | ||
| 
						 | 
					6c5f4beb53 | ||
| 
						 | 
					26b0ddf200 | ||
| 
						 | 
					b6690df2be | ||
| 
						 | 
					6dacec7ded | ||
| 
						 | 
					429b5f3ec9 | ||
| 
						 | 
					81bacda627 | ||
| 
						 | 
					6960cb4c38 | ||
| 
						 | 
					7b61b34c56 | ||
| 
						 | 
					386d3b9e67 | ||
| 
						 | 
					5049c5c694 | ||
| 
						 | 
					292879aca4 | ||
| 
						 | 
					dcb9e2a004 | ||
| 
						 | 
					0d10c60b31 | ||
| 
						 | 
					08e0b277bc | ||
| 
						 | 
					58736b3902 | ||
| 
						 | 
					f7354cdf28 | ||
| 
						 | 
					196f27c4ad | ||
| 
						 | 
					c1f32e8214 | ||
| 
						 | 
					eee2762852 | ||
| 
						 | 
					c79fa28a66 | ||
| 
						 | 
					1e692e5890 | ||
| 
						 | 
					ceafdf109b | ||
| 
						 | 
					450251f082 | ||
| 
						 | 
					ceef058065 | ||
| 
						 | 
					b04a526a19 | ||
| 
						 | 
					2f195a07b2 | ||
| 
						 | 
					f38eeedfd7 | ||
| 
						 | 
					8ca1e4d548 | ||
| 
						 | 
					e07cc4bb63 | ||
| 
						 | 
					c5bdd86f96 | ||
| 
						 | 
					aa26e2ef36 | ||
| 
						 | 
					9445962237 | ||
| 
						 | 
					6b898b63f0 | ||
| 
						 | 
					f7a4d03ba2 | ||
| 
						 | 
					ade1e2eb7b | ||
| 
						 | 
					a9a605de3e | ||
| 
						 | 
					7ec11de523 | ||
| 
						 | 
					18eb92a72b | ||
| 
						 | 
					9ddb934784 | ||
| 
						 | 
					4f8ac179bf | ||
| 
						 | 
					02b8e51562 | ||
| 
						 | 
					d27196e334 | ||
| 
						 | 
					3edaa35d49 | ||
| 
						 | 
					88258070c4 | ||
| 
						 | 
					beb4edd3cf | ||
| 
						 | 
					364ff7087d | ||
| 
						 | 
					0b3ee07a2a | ||
| 
						 | 
					a49a580a77 | ||
| 
						 | 
					7080e9f83c | ||
| 
						 | 
					59a48bfa1f | ||
| 
						 | 
					42e8063a32 | ||
| 
						 | 
					c23bbe6b65 | ||
| 
						 | 
					d8f47ed195 | ||
| 
						 | 
					d7c975e8d8 | ||
| 
						 | 
					bf21dd1578 | ||
| 
						 | 
					9013f56451 | ||
| 
						 | 
					3012c232eb | ||
| 
						 | 
					26390c60fb | ||
| 
						 | 
					cdb039672c | ||
| 
						 | 
					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 | 
							
								
								
									
										17
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
Makefile
 | 
			
		||||
Makefile.in
 | 
			
		||||
aclocal.m4
 | 
			
		||||
ansi2knr.1
 | 
			
		||||
ansi2knr.c
 | 
			
		||||
ansi2knr.h
 | 
			
		||||
autom4te.cache
 | 
			
		||||
config.log
 | 
			
		||||
config.status
 | 
			
		||||
configure
 | 
			
		||||
configure.lineno
 | 
			
		||||
depcomp
 | 
			
		||||
install-sh
 | 
			
		||||
missing
 | 
			
		||||
.deps
 | 
			
		||||
*.a
 | 
			
		||||
*.o
 | 
			
		||||
							
								
								
									
										38
									
								
								AUTHORS
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								AUTHORS
									
									
									
									
									
								
							@@ -1,13 +1,41 @@
 | 
			
		||||
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
 | 
			
		||||
                      (c)2001,2002 by Alexander Barton,
 | 
			
		||||
                        (c)2001-2007 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
 | 
			
		||||
Note: If you have critics, patches or something else, please feel free to
 | 
			
		||||
post a mail to the ngIRCd mailing list: <ngircd-ml@arthur.ath.cx> (please see
 | 
			
		||||
<http://ngircd.barton.de/#ml> for details). Don't mail the contributors
 | 
			
		||||
directly, if possible!
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Main Authors
 | 
			
		||||
~~~~~~~~~~~~
 | 
			
		||||
Alexander Barton, <alex@barton.de> (alex)
 | 
			
		||||
Florian Westphal, <westphal@foo.fh-furtwangen.de> (fw)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Contributors
 | 
			
		||||
~~~~~~~~~~~~
 | 
			
		||||
Goetz Hoffart, <goetz@hoffart.de> (goetz)
 | 
			
		||||
Ilja Osthoff, <i.osthoff@gmx.net> (ilja)
 | 
			
		||||
Benjamin Pineau, <ben@zouh.org>
 | 
			
		||||
Sean Reifschneider, <jafo-rpms@tummy.com>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
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.13 2007/10/04 15:18:48 alex Exp $
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										551
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										551
									
								
								ChangeLog
									
									
									
									
									
								
							@@ -1,17 +1,553 @@
 | 
			
		||||
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
 | 
			
		||||
                      (c)2001,2002 by Alexander Barton,
 | 
			
		||||
                        (c)2001-2008 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 CVS-HEAD
 | 
			
		||||
ngIRCd 0.12.1 (2008-07-09)
 | 
			
		||||
 | 
			
		||||
  - Allow mixed line terminations (CR+LF/CR/LF) in non-RFC-compliant mode
 | 
			
		||||
  - Don't allow stray \r or \n in command parameters
 | 
			
		||||
  - --configtest: return non-zero exit code if there are errors
 | 
			
		||||
  - Update ngIRCd manual pages
 | 
			
		||||
  - Add option aliases -V (for --version) and -h (for --help).
 | 
			
		||||
  - Fix 'no-ipv6' compile error.
 | 
			
		||||
  - Make Listen parameter a comma-seperated list of addresses. This also
 | 
			
		||||
    obsoletes ListenIPv4 and ListenIPv6 options. If Listen is unset, it
 | 
			
		||||
    is treated as Listen="::,0.0.0.0".
 | 
			
		||||
    Note: ListenIPv4 and ListenIPv6 options are still recognized,
 | 
			
		||||
    but ngircd will print a warning if they are used in the config file.
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.12.0 (2008-05-13)
 | 
			
		||||
 | 
			
		||||
  - Fix Bug: 85: "WHO #SecretChannel" that user is not a member of now returns
 | 
			
		||||
    proper RPL_ENDOFWHO_MSG instead of nothing. (Ali Shemiran)
 | 
			
		||||
  - Fix complie on FreeBSD 5.4 and AIX.
 | 
			
		||||
  - If bind() fails, also print ip address and not just the port number.
 | 
			
		||||
 | 
			
		||||
  ngIRCd 0.12.0-pre2 (2008-04-29)
 | 
			
		||||
  - IPv6: Add config options to disabe ipv4/ipv6 support.
 | 
			
		||||
  - Don't include doc/CVS.txt in distribution archive, use doc/GIT.txt now!
 | 
			
		||||
  - Documentation: get rid of some more references to CVS, switch to GIT.
 | 
			
		||||
  - Get rid of cvs-version.* and CVSDATE definition.
 | 
			
		||||
  - Report ERR_NOTONCHANNEL when trying to part a channel one is not member of.
 | 
			
		||||
  - Testsuite: remove erroneous ConfUID setting in config file.
 | 
			
		||||
 | 
			
		||||
  ngIRCd 0.12.0-pre1 (2008-04-20)
 | 
			
		||||
  - Include Mac OS X Xcode project in distribution archives.
 | 
			
		||||
  - Do not exit on SIGHUP or /REHASH if the config file cannot opened.
 | 
			
		||||
  - Add IPv6 support.
 | 
			
		||||
  - Install a LaunchDaemon script to start/stop ngIRCd on Mac OS X.
 | 
			
		||||
  - Implemented IRC commands INFO, SUMMON (dummy), and USERS (dummy) and
 | 
			
		||||
    enhanced test suite to check these commands. (Dana Dahlstrom)
 | 
			
		||||
  - RPL_WHOREPLY messages generated by IRC_WHO didn't include flags (*,@,+).
 | 
			
		||||
    (Dana Dahlstrom)
 | 
			
		||||
  - IRC_WHO now supports search patterns and will test this against user
 | 
			
		||||
    nickname/servername/hostname, etc. as required by RFC 2812, Section 3.6.1.
 | 
			
		||||
    (reported by Dana Dahlstrom)
 | 
			
		||||
  - Add test cases for "WHO" command. (Dana Dahlstrom)
 | 
			
		||||
  - Implement RFC 2812 handling of "0" argument to 'JOIN': must be treated
 | 
			
		||||
    as if the user had sent PART commands for all channels the user is a
 | 
			
		||||
    member of. (Dana Dahlstrom)
 | 
			
		||||
  - Allow NOTICEs to be sent to a channel. (Fabian Schlager)
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.11.1 (2008-02-26)
 | 
			
		||||
 | 
			
		||||
  - Fix sending of JOIN commands between servers when remote server appended
 | 
			
		||||
    mode flags. (Rolf Eike Beer) [from HEAD]
 | 
			
		||||
  - Send "G" instead of "H" flag in WHO replies. (reported by Dana Dahlstrom)
 | 
			
		||||
  - Under some circumstances ngIRCd issued channel MODE message with a
 | 
			
		||||
    trailing space. (Dana Dahlstrom) [from HEAD]
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.11.0 (2008-01-15)
 | 
			
		||||
 | 
			
		||||
  ngIRCd 0.11.0-pre2 (2008-01-07)
 | 
			
		||||
  - SECURITY: IRC_PART could reference invalid memory, causing
 | 
			
		||||
    ngircd to crash [from HEAD].
 | 
			
		||||
  
 | 
			
		||||
  ngIRCd 0.11.0-pre1 (2008-01-02)
 | 
			
		||||
  - Use dotted-decimal IP address if hostname is >= 64.
 | 
			
		||||
  - Add support for /STAT u (server uptime) command.
 | 
			
		||||
  - New [Server] configuration Option "Bind" allows to specify
 | 
			
		||||
    the source ip adress to use when connecting to remote server.
 | 
			
		||||
  - New configuration option "MaxNickLength" to specify the allowed maximum
 | 
			
		||||
    length of user nick names. Note: must be unique in an IRC network!
 | 
			
		||||
  - Enhanced the IRC+ protocol to support an enhanced "server handshake" and
 | 
			
		||||
    enable server to recognice numeric 005 (ISUPPORT) and 376 (ENDOFMOTD).
 | 
			
		||||
    See doc/Protocol.txt for details.
 | 
			
		||||
  - Re-added doc/SSL.txt to distribution -- got lost somewhere!?
 | 
			
		||||
  - Fixes the wrong logging output when nested servers are introduced
 | 
			
		||||
    to the network as well as the wrong output of the LINKS command.
 | 
			
		||||
  - Update Mac OS X Xcode project file for Xcode 3.
 | 
			
		||||
  - Adjust test suite to be usable on HP/UX 11.11 :-)
 | 
			
		||||
  - Fix code to compile using K&R C compiler and ansi2kr again.
 | 
			
		||||
  - New config option NoDNS: Disables DNS lookups when clients connect.
 | 
			
		||||
  - Fixed propagation of channel mode 'P' on server links.
 | 
			
		||||
  - Numeric 317: implemented "signon time" (displayed in WHOIS result).
 | 
			
		||||
  - Fixed code that prevented GCC 2.95 to compile ngIRCd.
 | 
			
		||||
  - Adjust path names in manual pages according to "./configure" settings.
 | 
			
		||||
  - Added new server configuration option "Passive" for "Server" blocks to
 | 
			
		||||
    disable automatic outgoing connections (similar to -p option to ngircd,
 | 
			
		||||
    but only for the specified server). (Tassilo Schweyer)
 | 
			
		||||
  - Don't connect to a server if a connection to another server within the
 | 
			
		||||
    same group is already in progress.
 | 
			
		||||
  - Added support for the WALLOPS command. Usage is restricted to IRC
 | 
			
		||||
    operators.
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.10.4 (2008-01-07)
 | 
			
		||||
 | 
			
		||||
  - SECURITY: IRC_PART could reference invalid memory, causing
 | 
			
		||||
    ngircd to crash [from HEAD].
 | 
			
		||||
  
 | 
			
		||||
ngIRCd 0.10.3 (2007-08-01)
 | 
			
		||||
 | 
			
		||||
  - SECURITY: Fixed a severe bug in handling JOIN commands, which could
 | 
			
		||||
    cause the server to crash. Thanks to Sebastian Vesper, <net@veoson.net>.
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.10.2 (2007-06-08)
 | 
			
		||||
 | 
			
		||||
  ngIRCd 0.10.2-pre2 (2007-05-19)
 | 
			
		||||
  - Server links are allowed to use larger write buffers now (up to 50 KB).
 | 
			
		||||
 | 
			
		||||
  ngIRCd 0.10.2-pre1 (2007-05-05)
 | 
			
		||||
  - Fix compressed server links (broken since 0.10.0).
 | 
			
		||||
  - Predefined Channel configuration now allows specification of channel key
 | 
			
		||||
    (mode k) and maximum user count (mode l).
 | 
			
		||||
  - When using epoll() IO interface, compile in the select() interface as
 | 
			
		||||
    well and fall back to it when epoll() isn't available on runtime.
 | 
			
		||||
  - New configure option "--without-select" to disable select() IO API
 | 
			
		||||
    (even when using epoll(), see above).
 | 
			
		||||
  - Added support for IO APIs "poll()" and "/dev/poll".
 | 
			
		||||
  - Reorganized internal handling of invite and ban lists.
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.10.1 (2006-12-17)
 | 
			
		||||
 | 
			
		||||
  - Fixed validation of server names containing digits.
 | 
			
		||||
  - Update the "info text" of the local server after re-reading configuration.
 | 
			
		||||
  - Changed Numerics 265 and 266 to follow ircd 2.11.x "standards".
 | 
			
		||||
  - Allow PASS syntax defined in RFC 1459 for server links, too.
 | 
			
		||||
  - Enhanced ISUPPORT message (005 numeric).
 | 
			
		||||
  - New configuration option "PredefChannelsOnly": if set, clients can only
 | 
			
		||||
    join predefined channels.
 | 
			
		||||
  - Code cleanups: use "LogDebug(...)" instead of "Log(LOG_DEBUG, ...)", use
 | 
			
		||||
    "strcspn()", unsigned vs. signed, use "const", fix whitespaces, ...
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.10.0 (2006-10-01)
 | 
			
		||||
 | 
			
		||||
  - Fixed file handle leak when daemon is not able to send MOTD to a client.
 | 
			
		||||
 | 
			
		||||
  ngIRCd 0.10.0-pre2 (2006-09-09)
 | 
			
		||||
  - Fixed build problems with GCC option -fstack-protector.
 | 
			
		||||
  - Minor documentation updates.
 | 
			
		||||
 | 
			
		||||
  ngIRCd 0.10.0-pre1 (2006-08-02)
 | 
			
		||||
  - Validate "ServerName" (see RFC 2812, section 2.3.1).
 | 
			
		||||
  - Enhanced DIE to accept a single parameter ("comment text") which is sent
 | 
			
		||||
    to all locally connected clients before the server goes down.
 | 
			
		||||
  - The ngIRCd handles time shifts backwards more gracefully now (the
 | 
			
		||||
    timeout handling doesn't disconnect clients by mistake any more).
 | 
			
		||||
  - Internal: Restructured connection handling (the connection ID is equal
 | 
			
		||||
    to the file descriptor of the connection).
 | 
			
		||||
  - Internal: Simplified resolver code.
 | 
			
		||||
  - JOIN now supports more than one channel key at a time.
 | 
			
		||||
  - Implemented numeric "333": Time and user name who set a channel topic.
 | 
			
		||||
  - Enhanced the handler for PING and PONG commands: fix forwarding and enable
 | 
			
		||||
    back-passing of a client supplied additional argument of PING.
 | 
			
		||||
  - Changed handling of timeouts for unregistered connections: don't reset
 | 
			
		||||
    the counter if data is received and disconnect clients earlier.
 | 
			
		||||
  - Removed unnecessary #define of "LOCAL", now use plain C "static" instead.
 | 
			
		||||
  - Channel topics are no longer limited to 127 characters: now the only limit
 | 
			
		||||
    is the maximum length of an IRC command, i. e. 512 bytes (in practice, this
 | 
			
		||||
    limits the topic to about 490 characters due to protocol overhead).
 | 
			
		||||
  - Reverse DNS lookup code now checks the result by doing an additional
 | 
			
		||||
    lookup to prevent spoofing.
 | 
			
		||||
  - Added new IO layer which (optionally) supports epoll() and kqueue() in
 | 
			
		||||
    addition to the select() interface.
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.9.2 (2005-10-15)
 | 
			
		||||
 | 
			
		||||
  - Fixed a bug that could cause the daemon to crash when outgoing server
 | 
			
		||||
    connections can't be established.
 | 
			
		||||
  - Fixed a bug that caused the daemon to leak file descriptors when no
 | 
			
		||||
    resolver subprocesses could be created.
 | 
			
		||||
  - Fixed server NOTICEs to users with "s" mode ("server messages").
 | 
			
		||||
  - Fixed a format string bug in "connection statistics" messages to clients.
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.9.1 (2005-08-03)
 | 
			
		||||
 | 
			
		||||
  - The KILL command killed much more than desired (including server links!)
 | 
			
		||||
    when the target user is connected to a remote server. Bug introduced in
 | 
			
		||||
    ngIRCd 0.9.0 ...  Reported by <qssl@fastmail.fm>, Thanks!
 | 
			
		||||
  - Changed some constants to be "signed" (instead of unsigned) to solve
 | 
			
		||||
    problems with old (pre-ANSI) compilers.
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.9.0 (2005-07-24)
 | 
			
		||||
 | 
			
		||||
  ngIRCd 0.9.0-pre1 (2005-07-09)
 | 
			
		||||
  - Fixed maximum length of user names, now allow up to 9 characters.
 | 
			
		||||
  - Cut off oversized IRC messages that should be sent to the network instead
 | 
			
		||||
    of shutting down the (wrong) connection.
 | 
			
		||||
  - Don't generate error messages for unknown commands received before the
 | 
			
		||||
    client is registered with the server (like the original ircd).
 | 
			
		||||
  - Never run with root privileges but always switch the user ID.
 | 
			
		||||
  - Make "netsplit" messages RFC compliant.
 | 
			
		||||
  - Fix handling of QUIT Messages: send only one message, even if the client
 | 
			
		||||
    is member of multiple channels.
 | 
			
		||||
  - Don't exit server if closing of a socket fails; instead ignore it and
 | 
			
		||||
    pray that this will be "the right thing" ...
 | 
			
		||||
  - Implemented the IRC function "WHOWAS".
 | 
			
		||||
  - Don't enable assert() calls when not ./configure'd with --enable-debug.
 | 
			
		||||
  - Fixed ./configure test for TCP Wrappers: now it runs on Mac OS X as well.
 | 
			
		||||
  - Enhanced configure script: now you can pass an (optional) search path
 | 
			
		||||
    to all --with-XXX parameters, e. g. "--with-ident=/opt/ident".
 | 
			
		||||
  - Removed typedefs for the native C datatypes.
 | 
			
		||||
    Use stdbool.h / inttypes.h if available.
 | 
			
		||||
  - New configuration option "OperServerMode" to enable a workaround needed
 | 
			
		||||
    when running an network with ircd2 servers and "OperCanUseMode" enabled
 | 
			
		||||
    to prevent the ircd2 daemon to drop mode changes of IRC operators.
 | 
			
		||||
    Patch by Florian Westphal, <westphal@foo.fh-furtwangen.de>.
 | 
			
		||||
  - Implemented support for "secret channels" (channel mode "s").
 | 
			
		||||
  - New configuration option "Mask" for [Operator] sections to limit OPER
 | 
			
		||||
    commands to users with a specific IRC mask. Patch from Florian Westphal.
 | 
			
		||||
  - Write "error file" (/tmp/ngircd-XXX.err) only if compiled with debug
 | 
			
		||||
    code ("--enable-debug") and running as daemon process.
 | 
			
		||||
  - Don't create version information string each time a client connects
 | 
			
		||||
    but instead on server startup. By Florian Westphal.
 | 
			
		||||
  - New configuration variable "PidFile", section "[Global]": if defined,
 | 
			
		||||
    the server writes its process ID (PID) to this file. Default: off.
 | 
			
		||||
    Idea of Florian Westphal, <westphal@foo.fh-furtwangen.de>.
 | 
			
		||||
  - Code cleanups from Florian Westphal, <westphal@foo.fh-furtwangen.de>.
 | 
			
		||||
  - Raised the maximum length of passwords to 20 characters.
 | 
			
		||||
  - Fixed a memory leak when resizing the connection pool and realloc()
 | 
			
		||||
    failed. Now we don't fall back to malloc(), which should be sane anyway.
 | 
			
		||||
    Patch from Florian Westphal, <westphal@foo.fh-furtwangen.de>.
 | 
			
		||||
  - Added support for the Howl (http://www.porchdogsoft.com/products/howl/)
 | 
			
		||||
    Rendezvous API, in addition to the API of Apple (Mac OS X). The available
 | 
			
		||||
    API will be autodetected when you call "./configure --with-rendezvous".
 | 
			
		||||
  - Made ngIRCd compile on HP/UX 10.20 with native HP pre-ANSI C compiler and
 | 
			
		||||
    most probably other older C compilers on other systems.
 | 
			
		||||
  - When the daemon should switch to another user ID (ServerID is defined in
 | 
			
		||||
    the configuration file) and is not running in a chroot environment, it
 | 
			
		||||
    changes its working directory to the home directory of this user. This
 | 
			
		||||
    should enable the system to write proper core files when not running with
 | 
			
		||||
    root privileges ...
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.8.3 (2005-02-03)
 | 
			
		||||
 | 
			
		||||
  - Fixed a bug that could case a root exploit when the daemon is compiled
 | 
			
		||||
    to do IDENT lookups and is logging to syslog. Bug discovered by CoKi,
 | 
			
		||||
    <coki@nosystem.com.ar>, thanks a lot!
 | 
			
		||||
    (http://www.nosystem.com.ar/advisories/advisory-11.txt)
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.8.2 (2005-01-26)
 | 
			
		||||
 | 
			
		||||
  - Added doc/SSL.txt to distribution.
 | 
			
		||||
  - Fixed a buffer overflow that could cause the daemon to crash. Bug found
 | 
			
		||||
    by Florian Westphal, <westphal@foo.fh-furtwangen.de>.
 | 
			
		||||
  - Fixed a possible buffer underrun when reading the MOTD file. Thanks
 | 
			
		||||
    to Florian Westphal, <westphal@foo.fh-furtwangen.de>.
 | 
			
		||||
  - Fixed detection of IRC lines which are too long to send. Detected by
 | 
			
		||||
    Florian Westphal, <westphal@foo.fh-furtwangen.de>.
 | 
			
		||||
  - Fixed return values of our own implementation of strlcpy(). The code has
 | 
			
		||||
    been taken from rsync and they fixed it, but we didn't until today :-/
 | 
			
		||||
    It has only been used when the system didn't implement strlcpy by itself,
 | 
			
		||||
    not on "modern" systems. Florian Westphal, <westphal@foo.fh-furtwangen.de>.
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.8.1 (2004-12-25)
 | 
			
		||||
 | 
			
		||||
  - Autoconf: Updated config.guess and config.sub
 | 
			
		||||
  - Added some more debug code ...
 | 
			
		||||
  - Fixed wrong variable names in output of "ngircd --configtest".
 | 
			
		||||
  - Debian: Fixed the name of the "default file" in the init script for
 | 
			
		||||
    ngircd-full packages. And do the test if the binary is executable after
 | 
			
		||||
    reading this file.
 | 
			
		||||
  - Enhanced the "test suite": please have a look at src/testsuite/README!
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.8.0 (2004-06-26)
 | 
			
		||||
 | 
			
		||||
  - Fixed wrong buffer size calculation for results of the resolver.
 | 
			
		||||
 | 
			
		||||
  ngircd 0.8.0-pre2 (2004-05-16)
 | 
			
		||||
  - Enhanced logging to console when running in "no-detached mode": added
 | 
			
		||||
    PID and log messages of resolver sub-processes.
 | 
			
		||||
  - Fixed host name lookups when using IDENT user lookups.
 | 
			
		||||
  - "make clean" and "make maintainer-clean" remove more files now.
 | 
			
		||||
 | 
			
		||||
  ngIRCd 0.8.0-pre1 (2004-05-07)
 | 
			
		||||
  - Two new configuration options: "ChrootDir" and "MotdPhrase", thanks to
 | 
			
		||||
    Benjamin Pineau <ben@zouh.org>. Now you can force the daemon to change
 | 
			
		||||
    its root and working directory to something "safe". MotdPhrase is used
 | 
			
		||||
    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.
 | 
			
		||||
@@ -207,7 +743,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
 | 
			
		||||
@@ -251,7 +786,3 @@ ngIRCd 0.0.2, 06.01.2002
 | 
			
		||||
ngIRCd 0.0.1, 31.12.2001
 | 
			
		||||
 | 
			
		||||
  - erste oeffentliche Version von ngIRCd als "public preview" :-)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- 
 | 
			
		||||
$Id: ChangeLog,v 1.87 2002/09/16 10:00:28 alex Exp $
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										322
									
								
								INSTALL
									
									
									
									
									
								
							
							
						
						
									
										322
									
								
								INSTALL
									
									
									
									
									
								
							@@ -1,148 +1,246 @@
 | 
			
		||||
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
 | 
			
		||||
                      (c)2001,2002 by Alexander Barton,
 | 
			
		||||
                        (c)2001-2007 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 --
 | 
			
		||||
 | 
			
		||||
                         -- INSTALL / Installation --
 | 
			
		||||
                         
 | 
			
		||||
                      Ilja Osthoff, <ilja@glide.ath.cx>
 | 
			
		||||
 | 
			
		||||
I. Upgrade Information
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Differences to version 0.9.x
 | 
			
		||||
 | 
			
		||||
- The option of the configure script to enable support for Zeroconf/Bonjour/
 | 
			
		||||
  Rendezvous/WhateverItIsNamedToday has been renamed:
 | 
			
		||||
    --with-rendezvous  ->  --with-zeroconf
 | 
			
		||||
 | 
			
		||||
Differences to version 0.8.x
 | 
			
		||||
 | 
			
		||||
- The maximum length of passwords has been raised to 20 characters (instead
 | 
			
		||||
  of 8 characters). If your passwords are longer than 8 characters then they
 | 
			
		||||
  are cut at an other position now.
 | 
			
		||||
 | 
			
		||||
Differences to version 0.6.x
 | 
			
		||||
 | 
			
		||||
- Some options of the configure script have been renamed:
 | 
			
		||||
    --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"!).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 +-----------------------------------------------------------------------+
 | 
			
		||||
 | Please note: English translations of some of the german documentation |
 | 
			
		||||
 | files can be found in the directory "doc/en" -- please have a look!   |
 | 
			
		||||
 +-----------------------------------------------------------------------+
 | 
			
		||||
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 GIT) is as following:
 | 
			
		||||
 | 
			
		||||
  1) ./autogen.sh	[only necessary when using GIT]
 | 
			
		||||
  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. Standard-Installation
 | 
			
		||||
1): "autogen.sh"
 | 
			
		||||
 | 
			
		||||
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 GIT.
 | 
			
		||||
 | 
			
		||||
This step is therefore only interesting for developers.
 | 
			
		||||
 | 
			
		||||
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!
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
2): "./configure"
 | 
			
		||||
 | 
			
		||||
The configure-script is used to detect local system dependencies.
 | 
			
		||||
 | 
			
		||||
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).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
3): "make"
 | 
			
		||||
 | 
			
		||||
The make command uses the Makefiles produced by configure and compiles the
 | 
			
		||||
ngIRCd daemon.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
4): "make install"
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
III. Additional features
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
ngIRCd ist fuer UNIXoide-Systeme konzipiert worden, das bedeutet, dass die
 | 
			
		||||
Installation auf einem modernen UNIX-aehnlichen System kein Problem dar-
 | 
			
		||||
stellen sollte. Das System muss nur von GNU automake und GNU autoconf
 | 
			
		||||
("configure") unterstuetzt werden.
 | 
			
		||||
The following optional features can be compiled into the daemon by passing
 | 
			
		||||
options to the "configure" script. Most options can handle a <path> argument
 | 
			
		||||
which will be used to search for the required libraries and header files in
 | 
			
		||||
the given paths ("<path>/lib/...", "<path>/include/...") in addition to the
 | 
			
		||||
standard locations.
 | 
			
		||||
 | 
			
		||||
Die Standard-Installation sieht so aus:
 | 
			
		||||
* Syslog Logging (autodetected by default): 
 | 
			
		||||
  --with-syslog[=<path>] / --without-syslog
 | 
			
		||||
 | 
			
		||||
   1) tar xzf ngircd-<Version>.tar.gz
 | 
			
		||||
   2) cd ngircd-<Version>
 | 
			
		||||
   3) ./autogen.sh	[nur erforderlich, wenn ueber CVS bezogen]
 | 
			
		||||
   4) ./configure
 | 
			
		||||
   5) make
 | 
			
		||||
   6) make install
 | 
			
		||||
  Enable (disable) support for logging to "syslog", which should be
 | 
			
		||||
  available on most modern UNIX-like operating systems by default.
 | 
			
		||||
 | 
			
		||||
* ZLib Compression (autodetected by default):
 | 
			
		||||
  --with-zlib[=<path>] / --without-zlib
 | 
			
		||||
 | 
			
		||||
  Enable (disable) support for compressed server-server links.
 | 
			
		||||
  The Z compression library ("libz") is required for this option.
 | 
			
		||||
  
 | 
			
		||||
* IO Backend (autodetected by default):
 | 
			
		||||
  --with-select[=<path>] / --without-select
 | 
			
		||||
  --with-poll[=<path>] / --without-poll
 | 
			
		||||
  --with-devpoll[=<path>] / --without-devpoll
 | 
			
		||||
  --with-epoll[=<path>] / --without-epoll
 | 
			
		||||
  --with-kqueue[=<path>] / --without-kqueue  
 | 
			
		||||
 | 
			
		||||
  ngIRCd can use different IO "backends": the "old school" select() and poll()
 | 
			
		||||
  API which should be supported by most UNIX-like operating systems, or the
 | 
			
		||||
  more efficient and flexible epoll() (Linux >=2.6), kqueue() (BSD) and
 | 
			
		||||
  /dev/poll APIs.
 | 
			
		||||
  By default the IO backend is autodetected, but you can use "--without-xxx"
 | 
			
		||||
  to disable a more enhanced API.
 | 
			
		||||
  When using the epoll() API, support for select() is compiled in as well by
 | 
			
		||||
  default to enable the binary to run on older Linux kernels (<2.6), too.
 | 
			
		||||
 | 
			
		||||
* IDENT-Support:
 | 
			
		||||
  --with-ident[=<path>]
 | 
			
		||||
 | 
			
		||||
  Include support for IDENT ("AUTH") lookups. The "ident" library is
 | 
			
		||||
  required for this option.
 | 
			
		||||
 | 
			
		||||
* ZeroConf Support:
 | 
			
		||||
  --with-zeroconf[=<path>] 
 | 
			
		||||
 | 
			
		||||
  Compile ngIRCd with support for ZeroConf multicast DNS service registration.
 | 
			
		||||
  Either the Apple ZeroConf implementation (e. g. Mac OS X) or the Howl
 | 
			
		||||
  library is required. Which one is available is autodetected.
 | 
			
		||||
 | 
			
		||||
* TCP-Wrappers:
 | 
			
		||||
  --with-tcp-wrappers[=<path>] 
 | 
			
		||||
 | 
			
		||||
  Include support for Wietse Venemas "TCP Wrappers" to limit client access
 | 
			
		||||
  to the daemon, for example by using "/etc/hosts.{allow|deny}".
 | 
			
		||||
  The "libwrap" is required for this option.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
zu 3): "autogen.sh"
 | 
			
		||||
IV. Useful make-targets
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
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 immer, wenn der Source-Code ueber CVS
 | 
			
		||||
bezogen wurde.
 | 
			
		||||
The Makefile produced by the configure-script contains always these useful
 | 
			
		||||
targets:
 | 
			
		||||
 | 
			
		||||
Dieser Absatz ist also eigentlich ausschliesslich fuer Entwickler interessant.
 | 
			
		||||
 - clean: delete every product from the compiler/linker
 | 
			
		||||
   next step: -> make
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 - distclean: the above plus erase all generated Makefiles
 | 
			
		||||
   next step: -> ./configure
 | 
			
		||||
 | 
			
		||||
(nochmal: "Endanwender" mussen diesen Schritt i.d.R. nicht ausfuehren!)
 | 
			
		||||
 - maintainer-clean: erase all automatic generated files
 | 
			
		||||
   next step: -> ./autogen.sh
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
zu 4): "./configure"
 | 
			
		||||
V. Sample configuration file ngircd.conf
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Mit dem configure-Script wird ngIRCd, wie GNU Software meistens, an das
 | 
			
		||||
lokale System angepasst und die erforderlichen Makefile's erzeugt.
 | 
			
		||||
In the sample configuration file, there are comments beginning with "#" OR
 | 
			
		||||
";" -- this is only for the better understanding of the file.
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
The file is separated in four blocks: [Global], [Operator], [Server], and
 | 
			
		||||
[Channel].
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
zu 5): "make"
 | 
			
		||||
VI. Command line options
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Der make-Befehl bearbeitet die vom configure-Script erzeugten Makefile's und
 | 
			
		||||
uebersetzt den ngIRCd.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
zu 6): "make install"
 | 
			
		||||
 | 
			
		||||
Mit "make install" wird der Server und ggf. eine Beispiels-Konfiguration
 | 
			
		||||
im System installiert; hierzu sind in der Regel root-Rechte erforderlich.
 | 
			
		||||
Eine bereits vorhandene Konfigurationsdatei wird nie ueberschrieben.
 | 
			
		||||
 | 
			
		||||
Folgende Dateien werden installiert:
 | 
			
		||||
 | 
			
		||||
- /usr/local/sbin/ngircd: ausfuehrbarer Server
 | 
			
		||||
- /usr/local/etc/ngircd.conf: Beispiel-Konfiguration, wenn nicht vorhanden
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
II. Nuetzliche make-Targets
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Die vom configure-Script erzeugten Makefile's enthalten immer die folgenden
 | 
			
		||||
nuetzlichen Targets:
 | 
			
		||||
 | 
			
		||||
 - clean: alle Erzeugnisse des Compilers/Linkers loeschen.
 | 
			
		||||
   Naechster Schritt: -> make
 | 
			
		||||
 | 
			
		||||
 - distclean: zusaetzliche alle Makefile's loeschen.
 | 
			
		||||
   Naechster Schritt: -> ./configure
 | 
			
		||||
 | 
			
		||||
 - maintainer-clean: alle automat. erzeugten Dateien loeschen.
 | 
			
		||||
   Naechster Schritt: -> ./autogen.sh
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
III. Konfigurationsdatei ngircd.conf
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
In der Konfigurationsdatei werden Kommentare durch "#" oder durch ";"
 | 
			
		||||
eingeleitet. Dieses dient nur der besseren Lesbarkeit.
 | 
			
		||||
 | 
			
		||||
Die Datei ist in drei Abschnitte unterteilt: [Global], [Operator] und
 | 
			
		||||
[Server]. Im [Global]-Teil werden die grundlegenden Einstellungen vor-
 | 
			
		||||
genommen, z.B. der Server-Name und die Ports, auf denen er Verbindungen
 | 
			
		||||
annehmen soll. In [Operator]-Abschnitten werden Server-Operatoren fest-
 | 
			
		||||
gelegt und unter [Server] werden die Einstellungen fuer die Verbindung
 | 
			
		||||
mit anderen Servern konfiguriert.
 | 
			
		||||
 | 
			
		||||
Die Bedeutung der einzelnen Variablen ist in der Beispiel-Konfiguration
 | 
			
		||||
"doc/sample-ngircd.conf" erklaert, die bei "make install" auch als
 | 
			
		||||
"ngircd.conf" in /usr/local/etc installiert wird, wenn dort noch keine
 | 
			
		||||
Konfigurationsdatei vorhanden ist.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
IV. Kommandozeilen-Optionen
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Folgende Parameter koennen dem ngIRCd u.a. uebergeben werden:
 | 
			
		||||
These parameters could be passed to the ngIRCd:
 | 
			
		||||
 | 
			
		||||
-f, --config <file>
 | 
			
		||||
	Der Daemon wird angewiesen, statt der Standard-Konfigurationsdatei
 | 
			
		||||
	/usr/local/etc/ngircd.conf die Datei <file> einzulesen.
 | 
			
		||||
	The daemon uses the file <file> as configuration file rather than
 | 
			
		||||
	the standard configuration /usr/local/etc/ngircd.conf.
 | 
			
		||||
 | 
			
		||||
-n, --nodaemon
 | 
			
		||||
	ngIRCd soll im Fordergrund laufen; alle Meldungen werden zusaetzlich
 | 
			
		||||
	zum Syslog auch auf der Konsole ausgegeben.
 | 
			
		||||
	ngIRCd should be running as a foreground process.
 | 
			
		||||
 | 
			
		||||
-p, --passive
 | 
			
		||||
	Verbindungen zu anderen Servern (wie in der Konfigurationsdatei in
 | 
			
		||||
	[Server]-Abschnitten definiert) werden nicht automatisch hergestellt.
 | 
			
		||||
	Server-links won't be automatically established.
 | 
			
		||||
 | 
			
		||||
--configtest
 | 
			
		||||
	Die Konfigurationsdatei wird eingelesen, ueberprueft und so aus-
 | 
			
		||||
	gegeben, wie sie vom ngIRCd interpretiert wurde. Danach beendet
 | 
			
		||||
	sich der Server wieder.
 | 
			
		||||
-t, --configtest
 | 
			
		||||
	Reads, validates and dumps the configuration file as interpreted
 | 
			
		||||
	by the server. Then exits.
 | 
			
		||||
 | 
			
		||||
Mit dem Parameter "--help" werden alle unterstuetzten Parameter angezeigt,
 | 
			
		||||
mit "--version" die Versionsnummer. Bei beiden Parametern beendet sich der
 | 
			
		||||
Server nach der Ausgabe wieder.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- 
 | 
			
		||||
$Id: INSTALL,v 1.8 2002/09/16 11:03:05 alex Exp $
 | 
			
		||||
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.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +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: Makefile.am,v 1.3 2002/03/12 14:37:51 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST = project.pbxproj
 | 
			
		||||
 | 
			
		||||
maintainer-clean-local:
 | 
			
		||||
	rm -f Makefile Makefile.in
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										42
									
								
								Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								Makefile.am
									
									
									
									
									
								
							@@ -1,28 +1,48 @@
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
# Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
 | 
			
		||||
# Copyright (c)2001-2008 Alexander Barton (alex@barton.de)
 | 
			
		||||
#
 | 
			
		||||
# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
 | 
			
		||||
# der GNU General Public License (GPL), wie von der Free Software Foundation
 | 
			
		||||
# herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
 | 
			
		||||
# der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
 | 
			
		||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
 | 
			
		||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile.am,v 1.9 2002/03/31 20:23:06 alex Exp $
 | 
			
		||||
# 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.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
AUTOMAKE_OPTIONS = gnu
 | 
			
		||||
 | 
			
		||||
SUBDIRS = doc MacOSX src man
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
testsuite:
 | 
			
		||||
	make -C src/testsuite check
 | 
			
		||||
 | 
			
		||||
lint:
 | 
			
		||||
	make -C src/ngircd lint
 | 
			
		||||
 | 
			
		||||
srcdoc:
 | 
			
		||||
	make -C doc srcdoc
 | 
			
		||||
 | 
			
		||||
xcode:
 | 
			
		||||
	@xcodebuild -project contrib/MacOSX/ngIRCd.xcodeproj -list \
 | 
			
		||||
	 >/dev/null 2>&1 \
 | 
			
		||||
	 || ( echo; echo "Error: \"xcodebuild\" not found!"; echo; exit 1 )
 | 
			
		||||
	xcodebuild -project contrib/MacOSX/ngIRCd.xcodeproj -alltargets \
 | 
			
		||||
	 -buildstyle Development
 | 
			
		||||
 | 
			
		||||
rpm: distcheck
 | 
			
		||||
	rpm -ta ngircd-*.tar.gz
 | 
			
		||||
 | 
			
		||||
deb:
 | 
			
		||||
	[ -f debian/rules ] || ln -s contrib/Debian debian
 | 
			
		||||
	dpkg-buildpackage -rfakeroot
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										206
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										206
									
								
								NEWS
									
									
									
									
									
								
							@@ -1,40 +1,202 @@
 | 
			
		||||
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
 | 
			
		||||
                      (c)2001,2002 by Alexander Barton,
 | 
			
		||||
                        (c)2001-2008 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 CVS-HEAD
 | 
			
		||||
ngIRCd 0.12.1 (2008-07-09)
 | 
			
		||||
 | 
			
		||||
  - Add option aliases -V (for --version) and -h (for --help).
 | 
			
		||||
  - Make Listen parameter a comma-seperated list of addresses. This also
 | 
			
		||||
    obsoletes ListenIPv4 and ListenIPv6 options. If Listen is unset, it
 | 
			
		||||
    is treated as Listen="::,0.0.0.0".
 | 
			
		||||
    Note: ListenIPv4 and ListenIPv6 options are still recognized,
 | 
			
		||||
    but ngircd will print a warning if they are used in the config file.
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.12.0 (2008-05-13)
 | 
			
		||||
 | 
			
		||||
  ngIRCd 0.12.0-pre2 (2008-04-29)
 | 
			
		||||
  - IPv6: Add config options to disabe ipv4/ipv6 support.
 | 
			
		||||
 | 
			
		||||
  ngIRCd 0.12.0-pre1 (2008-04-20)
 | 
			
		||||
  - Add IPv6 support.
 | 
			
		||||
  - Install a LaunchDaemon script to start/stop ngIRCd on Mac OS X.
 | 
			
		||||
  - Implemented IRC commands INFO, SUMMON (dummy), and USERS (dummy) and
 | 
			
		||||
    enhanced test suite to check these commands. (Dana Dahlstrom)
 | 
			
		||||
  - IRC_WHO now supports search patterns and will test this against user
 | 
			
		||||
    nickname/servername/hostname, etc. as required by RFC 2812, Section 3.6.1.
 | 
			
		||||
    (reported by Dana Dahlstrom)
 | 
			
		||||
  - Implement RFC 2812 handling of "0" argument to 'JOIN': must be treated
 | 
			
		||||
    as if the user had sent PART commands for all channels the user is a
 | 
			
		||||
    member of. (Dana Dahlstrom)
 | 
			
		||||
  - Allow NOTICEs to be sent to a channel. (Fabian Schlager)
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.11.0 (2008-01-15)
 | 
			
		||||
 | 
			
		||||
  - Add support for /STAT u (server uptime) command.
 | 
			
		||||
  - New [Server] configuration Option "Bind" allows to specify
 | 
			
		||||
    the source ip adress to use when connecting to remote server.
 | 
			
		||||
  - New configuration option "MaxNickLength" to specify the allowed maximum
 | 
			
		||||
    length of user nick names. Note: must be unique in an IRC network!
 | 
			
		||||
  - Numeric 317: implemented "signon time" (displayed in WHOIS result).
 | 
			
		||||
  - Added new server configuration option "Passive" for "Server" blocks to
 | 
			
		||||
    disable automatic outgoing connections (similar to -p option to ngircd,
 | 
			
		||||
    but only for the specified server). (Tassilo Schweyer)
 | 
			
		||||
  - Added support for the WALLOPS command. Usage is restricted to IRC
 | 
			
		||||
    operators.
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.10.2 (2007-06-08)
 | 
			
		||||
 | 
			
		||||
  - Predefined channel configuration now allows specification of channel key
 | 
			
		||||
    (mode k) and maximum user count (mode l): variables "Key" and "MaxUsers".
 | 
			
		||||
  - When using the epoll() IO interface, compile in the select() interface as
 | 
			
		||||
    well and fall back to it when epoll() isn't available on runtime.
 | 
			
		||||
  - Added support for IO APIs "poll()" and "/dev/poll".
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.10.1 (2006-12-17)
 | 
			
		||||
 | 
			
		||||
  - Allow PASS syntax defined in RFC 1459 for server links, too.
 | 
			
		||||
  - New configuration option "PredefChannelsOnly": if set, clients can only
 | 
			
		||||
    join predefined channels.
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.10.0 (2006-10-01)
 | 
			
		||||
 | 
			
		||||
  ngIRCd 0.10.0-pre1 (2006-08-02)
 | 
			
		||||
  - Enhanced DIE to accept a single parameter ("comment text") which is sent
 | 
			
		||||
    to all locally connected clients before the server goes down.
 | 
			
		||||
  - JOIN now supports more than one channel key at a time.
 | 
			
		||||
  - Implemented numeric "333": Time and user name who set a channel topic.
 | 
			
		||||
  - Channel topics are no longer limited to 127 characters: now the only limit
 | 
			
		||||
    is the maximum length of an IRC command, i. e. 512 bytes (in practice, this
 | 
			
		||||
    limits the topic to about 490 characters due to protocol overhead).
 | 
			
		||||
  - Reverse DNS lookup code now checks the result by doing an additional
 | 
			
		||||
    lookup to prevent spoofing.
 | 
			
		||||
  - Added new IO layer which (optionally) supports epoll() and kqueue() in
 | 
			
		||||
    addition to the select() interface.
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.9.0 (2005-07-24)
 | 
			
		||||
 | 
			
		||||
  - Never run with root privileges but always switch the user ID.
 | 
			
		||||
  - Make "netsplit" messages RFC compliant.
 | 
			
		||||
  - Implemented the IRC function "WHOWAS".
 | 
			
		||||
  - New configuration option "OperServerMode" to enable a workaround needed
 | 
			
		||||
    when running an network with ircd2 servers and "OperCanUseMode" enabled
 | 
			
		||||
    to prevent the ircd2 daemon to drop mode changes of IRC operators.
 | 
			
		||||
    Patch by Florian Westphal, <westphal@foo.fh-furtwangen.de>.
 | 
			
		||||
  - Implemented support for "secret channels" (channel mode "s").
 | 
			
		||||
  - New configuration option "Mask" for [Operator] sections to limit OPER
 | 
			
		||||
    commands to users with a specific IRC mask. Patch from Florian Westphal.
 | 
			
		||||
  - New configuration variable "PidFile", section "[Global]": if defined,
 | 
			
		||||
    the server writes its process ID (PID) to this file. Default: off.
 | 
			
		||||
    Idea of Florian Westphal, <westphal@foo.fh-furtwangen.de>.
 | 
			
		||||
  - Added support for the Howl (http://www.porchdogsoft.com/products/howl/)
 | 
			
		||||
    Rendezvous API, in addition to the API of Apple (Mac OS X). The available
 | 
			
		||||
    API will be autodetected when you call "./configure --with-rendezvous".
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.8.0 (2004-06-26)
 | 
			
		||||
 | 
			
		||||
  - Two new configuration options: "ChrootDir" and "MotdPhrase", thanks to
 | 
			
		||||
    Benjamin Pineau <ben@zouh.org>. Now you can force the daemon to change
 | 
			
		||||
    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
 | 
			
		||||
 | 
			
		||||
  - Manual-Pages ngircd.8 und ngircd.conf.5 begonnen.
 | 
			
		||||
  - 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. 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.
 | 
			
		||||
  - 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.
 | 
			
		||||
  - Unter A/UX (und evtl. weiteren Systemen) kompiliert der ngIRCd nun mit
 | 
			
		||||
    dem "nativen" (ggf. pre-ANSI) Compiler.
 | 
			
		||||
  - LIST versteht nun Wildcards und kann an andere Server geforwarded werden.
 | 
			
		||||
    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.
 | 
			
		||||
  - mit dem neuen Befehl CHANINFO syncronisieren Server, die das IRC+-
 | 
			
		||||
    Protokoll unterstuetzen, Channel-Modes und Topics.
 | 
			
		||||
  - Ban-Lists (setzen, erfragen und loeschen) implementiert.
 | 
			
		||||
  - ADMIN-Befehl implementiert.
 | 
			
		||||
  - "Test-Suite" begonnen: mit "make check" wird sie durchlaufen.
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.4.2, 29.04.2002
 | 
			
		||||
 | 
			
		||||
@@ -116,4 +278,4 @@ ngIRCd 0.0.1, 31.12.2001
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- 
 | 
			
		||||
$Id: NEWS,v 1.38 2002/09/16 11:03:05 alex Exp $
 | 
			
		||||
$Id: NEWS,v 1.88 2008/02/26 22:05:42 fw Exp $
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										122
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										122
									
								
								README
									
									
									
									
									
								
							@@ -1,105 +1,87 @@
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
 | 
			
		||||
                      (c)2001,2002 by Alexander Barton,
 | 
			
		||||
                        (c)2001-2007 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 --
 | 
			
		||||
                           
 | 
			
		||||
                      Ilja Osthoff, <ilja@glide.ath.cx>
 | 
			
		||||
                                -- README --
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 +-----------------------------------------------------------------------+
 | 
			
		||||
 | Please note: English translations of some of the german documentation |
 | 
			
		||||
 | files can be found in the directory "doc/en" -- please have a look!   |
 | 
			
		||||
 +-----------------------------------------------------------------------+
 | 
			
		||||
I. Introduction
 | 
			
		||||
~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
I. Einfuehrung
 | 
			
		||||
~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
ngIRCd ist ein Open-Source-Server fuer den Internet Relay Chat (IRC), der
 | 
			
		||||
unter der GNU General Public License (http://www.gnu.org/licenses/gpl.html)
 | 
			
		||||
entwickelt wird. ngIRCd steht fuer "next generation IRC daemon", er ist von
 | 
			
		||||
Grund auf neu geschrieben, also nicht wie die meisten anderen IRCd's vom
 | 
			
		||||
Urvater, dem Daemon des IRCNet abgeleitet.
 | 
			
		||||
Please see the INSTALL document for installation and upgrade information!
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
II. Status
 | 
			
		||||
~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Zur Zeit befindet sich der ngIRCd noch in Entwicklung, manche Features sind
 | 
			
		||||
noch nicht implementiert, andere nur teilweise.
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
Bisher (mehr oder wenig vollstaendig) implementierte IRC-Befehle:
 | 
			
		||||
In the meantime ngIRCd should be quite feature complete and stable to be
 | 
			
		||||
used in real IRC networks.
 | 
			
		||||
 | 
			
		||||
ADMIN, AWAY, CHANINFO, CONNECT, DIE, ERROR, INVITE, ISON, JOIN, KICK, KILL,
 | 
			
		||||
LINKS, LIST, LUSERS, MODE, MOTD, NAMES, NICK, NJOIN, NOTICE, OPER, PART,
 | 
			
		||||
PASS, PING, PONG, PRIVMSG, QUIT, RESTART, SERVER, SQUIT, TOPIC, USERHOST,
 | 
			
		||||
USER, VERSION, WHO, WHOIS.
 | 
			
		||||
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, WALLOPS, WHO, WHOIS,
 | 
			
		||||
WHOWAS.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
III. Features (oder: warum gerade ngIRCd?)
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
III. Features (or: why use ngIRCd?)
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
- keine Probleme mit Servern, deren IP-Adresse dynamisch ist,
 | 
			
		||||
- einfache, uebersichtliche Konfigurationsdatei,
 | 
			
		||||
- frei verfuegbarer C-Quellcode.
 | 
			
		||||
- ngIRCd wird aktiv weiterentwickelt.
 | 
			
		||||
- unterstuetzte Plattformen (getestete Version): AIX (3.2.5), A/UX (3.0.1),
 | 
			
		||||
  FreeBSD/i386 (4.5), HP-UX (10.20), IRIX (6.5), Linux (2.x), Mac OS X (10.x),
 | 
			
		||||
  NetBSD (1.5.2/i386, 1.5.3/m68k), Solaris (2.5.1, 2.6), Windows mit Cygwin.
 | 
			
		||||
- no problems with servers which have dynamic IP addresses
 | 
			
		||||
- simple, easy understandable configuration file,
 | 
			
		||||
- freely published open-source C source code,
 | 
			
		||||
- ngIRCd will be developed on in the future.
 | 
			
		||||
- wide field of supported platforms, including AIX, A/UX, FreeBSD, HP-UX,
 | 
			
		||||
  IRIX, Linux, Mac OS X, NetBSD, OpenBSD, Solaris, and Windows with Cygwin.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
IV. Dokumentation
 | 
			
		||||
IV. Documentation
 | 
			
		||||
~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Im Paket enthalten ist u.a.:
 | 
			
		||||
 | 
			
		||||
- README: das Dokument, das Du gerade liest :-)
 | 
			
		||||
- INSTALL: Hinweise zur Installation des ngIRCd
 | 
			
		||||
- NEWS: sagt der Name schon :-)
 | 
			
		||||
- ChangeLog: die komplette History des ngIRCd
 | 
			
		||||
- doc/FAQ.txt: haeufige Fragen und Antworten zum ngIRCd
 | 
			
		||||
- doc/CVS.txt: Hinweise zum CVS-System
 | 
			
		||||
- doc/RFC.txt: Infos ueber die RFC's
 | 
			
		||||
- doc/sample-ngircd.conf: Beispiel-Konfigurationsdatei
 | 
			
		||||
- doc/README-AUX.txt: Installationshinweise fuer A/UX
 | 
			
		||||
- doc/README-BeOS.txt: dito fuer BeOS
 | 
			
		||||
 | 
			
		||||
- doc/en/: englischsprachige Dokumentation
 | 
			
		||||
More documentation can be found in the "doc/" directory and the homepage of
 | 
			
		||||
the ngIRCd: <http://ngircd.barton.de/>.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
V. Bezugsquellen
 | 
			
		||||
~~~~~~~~~~~~~~~~
 | 
			
		||||
V. Download
 | 
			
		||||
~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Die Homepage des ngIRCd ist: <http://arthur.ath.cx/~alex/ngircd>; dort
 | 
			
		||||
findest du immer die neusten Informationen ueber den ngIRCd und die aktuellen
 | 
			
		||||
freigegebenen ("stabilen") Releases.
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
Falls du dich fuer die aktuellen Entwicklungs-Versionen (die jedoch nicht
 | 
			
		||||
immer "stabil" sind) interessierst, dann lese bitte den Punkt "CVS" auf der
 | 
			
		||||
Homepage und die Datei "doc/CVS.txt", die die Verwendung des "Concurrent
 | 
			
		||||
Versioning System" (CVS) beschreibt.
 | 
			
		||||
If you are interested in the latest development versions (which are not
 | 
			
		||||
always stable), then please read the section about "GIT" on the homepage and
 | 
			
		||||
the file "doc/GIT.txt" which describes the use of GIT, the version control
 | 
			
		||||
system used by ngIRCd (homepage: http://git.or.cz/).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
VI. Bugs
 | 
			
		||||
~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Wenn du im ngIRCd Bugs finden solltest (so was soll ja auch vorkommen :-),
 | 
			
		||||
dann lege bitte einen Bug-Report ueber diese URL an:
 | 
			
		||||
If you find bugs in the ngIRCd (which might be there :-), please report
 | 
			
		||||
them at the following URL:
 | 
			
		||||
 | 
			
		||||
<http://arthur.ath.cx/~alex/ngircd/#bugs>
 | 
			
		||||
<http://ngircd.barton.de/#bugs>
 | 
			
		||||
 | 
			
		||||
Dort kannst du dich auch ueber bekannte Fehler informieren.
 | 
			
		||||
There you can read about known bugs and limitations, too.
 | 
			
		||||
 | 
			
		||||
Falls du noch Anregungen, Kritik, Patches etc. pp. zum ngIRCd hast, dann
 | 
			
		||||
bitte einfach eine Mail an <alex@barton.de> oder <alex@arthur.ath.cx>
 | 
			
		||||
schreiben.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- 
 | 
			
		||||
$Id: README,v 1.13 2002/09/16 11:03:05 alex Exp $
 | 
			
		||||
If you have critics, patches or something else, please feel free to post a
 | 
			
		||||
mail to the ngIRCd mailing list: <ngircd-ml@arthur.ath.cx> (please see
 | 
			
		||||
<http://ngircd.barton.de/#ml> for details).
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										194
									
								
								autogen.sh
									
									
									
									
									
								
							
							
						
						
									
										194
									
								
								autogen.sh
									
									
									
									
									
								
							@@ -1,16 +1,192 @@
 | 
			
		||||
#!/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.15 2007/10/07 13:02:15 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.9, if available (WANT_AUTOMAKE is used by
 | 
			
		||||
# the wrapper scripts of Gentoo Linux, AUTOMAKE_VERSION is used by OpenBSD);
 | 
			
		||||
# same applies for GNU autoconf, we want to use version 2.59. -- But only
 | 
			
		||||
# set these preferences if not already set!
 | 
			
		||||
if [ -z "$AUTOMAKE_VERSION" -a -z "$WANT_AUTOMAKE" ]; then
 | 
			
		||||
	AUTOMAKE_VERSION=1.9
 | 
			
		||||
	WANT_AUTOMAKE=1.9
 | 
			
		||||
fi
 | 
			
		||||
if [ -z "$AUTOCONF_VERSION" -a -z "$WANT_AUTOCONF" ]; then
 | 
			
		||||
	AUTOCONF_VERSION=2.59
 | 
			
		||||
	WANT_AUTOCONF=2.59
 | 
			
		||||
fi
 | 
			
		||||
export AUTOMAKE_VERSION WANT_AUTOMAKE AUTOCONF_VERSION WANT_AUTOCONF
 | 
			
		||||
 | 
			
		||||
# Try to detect the needed tools when no environment variable already
 | 
			
		||||
# specifies 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-
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										881
									
								
								config.guess
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										881
									
								
								config.guess
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										375
									
								
								config.sub
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										375
									
								
								config.sub
									
									
									
									
										vendored
									
									
								
							@@ -1,9 +1,10 @@
 | 
			
		||||
#! /bin/sh
 | 
			
		||||
# Configuration validation subroutine script.
 | 
			
		||||
#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
 | 
			
		||||
#   2000, 2001, 2002 Free Software Foundation, Inc.
 | 
			
		||||
#   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
 | 
			
		||||
#   Inc.
 | 
			
		||||
 | 
			
		||||
timestamp='2002-03-04'
 | 
			
		||||
timestamp='2007-01-18'
 | 
			
		||||
 | 
			
		||||
# This file is (in principle) common to ALL GNU software.
 | 
			
		||||
# The presence of a machine in this file suggests that SOME GNU software
 | 
			
		||||
@@ -21,14 +22,15 @@ timestamp='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 +72,7 @@ Report bugs and patches to <config-patches@gnu.org>."
 | 
			
		||||
version="\
 | 
			
		||||
GNU config.sub ($timestamp)
 | 
			
		||||
 | 
			
		||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
 | 
			
		||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
 | 
			
		||||
Free Software Foundation, Inc.
 | 
			
		||||
 | 
			
		||||
This is free software; see the source for copying conditions.  There is NO
 | 
			
		||||
@@ -83,11 +85,11 @@ Try \`$me --help' for more information."
 | 
			
		||||
while test $# -gt 0 ; do
 | 
			
		||||
  case $1 in
 | 
			
		||||
    --time-stamp | --time* | -t )
 | 
			
		||||
       echo "$timestamp" ; exit 0 ;;
 | 
			
		||||
       echo "$timestamp" ; exit ;;
 | 
			
		||||
    --version | -v )
 | 
			
		||||
       echo "$version" ; exit 0 ;;
 | 
			
		||||
       echo "$version" ; exit ;;
 | 
			
		||||
    --help | --h* | -h )
 | 
			
		||||
       echo "$usage"; exit 0 ;;
 | 
			
		||||
       echo "$usage"; exit ;;
 | 
			
		||||
    -- )     # Stop option processing
 | 
			
		||||
       shift; break ;;
 | 
			
		||||
    - )	# Use stdin as input.
 | 
			
		||||
@@ -99,7 +101,7 @@ while test $# -gt 0 ; do
 | 
			
		||||
    *local*)
 | 
			
		||||
       # First pass through any local machine types.
 | 
			
		||||
       echo $1
 | 
			
		||||
       exit 0;;
 | 
			
		||||
       exit ;;
 | 
			
		||||
 | 
			
		||||
    * )
 | 
			
		||||
       break ;;
 | 
			
		||||
@@ -118,7 +120,9 @@ esac
 | 
			
		||||
# Here we must recognize all the valid KERNEL-OS combinations.
 | 
			
		||||
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 | 
			
		||||
case $maybe_os in
 | 
			
		||||
  nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-* | rtmk-nova*)
 | 
			
		||||
  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
 | 
			
		||||
  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
 | 
			
		||||
  storm-chaos* | os2-emx* | rtmk-nova*)
 | 
			
		||||
    os=-$maybe_os
 | 
			
		||||
    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
 | 
			
		||||
    ;;
 | 
			
		||||
@@ -144,7 +148,7 @@ case $os in
 | 
			
		||||
	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
 | 
			
		||||
	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
 | 
			
		||||
	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
 | 
			
		||||
	-apple | -axis)
 | 
			
		||||
	-apple | -axis | -knuth | -cray)
 | 
			
		||||
		os=
 | 
			
		||||
		basic_machine=$1
 | 
			
		||||
		;;
 | 
			
		||||
@@ -169,6 +173,10 @@ case $os in
 | 
			
		||||
	-hiux*)
 | 
			
		||||
		os=-hiuxwe2
 | 
			
		||||
		;;
 | 
			
		||||
	-sco6)
 | 
			
		||||
		os=-sco5v6
 | 
			
		||||
		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
 | 
			
		||||
		;;
 | 
			
		||||
	-sco5)
 | 
			
		||||
		os=-sco3.2v5
 | 
			
		||||
		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
 | 
			
		||||
@@ -185,6 +193,10 @@ case $os in
 | 
			
		||||
		# Don't forget version if it is 3.2v4 or newer.
 | 
			
		||||
		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
 | 
			
		||||
		;;
 | 
			
		||||
	-sco5v6*)
 | 
			
		||||
		# Don't forget version if it is 3.2v4 or newer.
 | 
			
		||||
		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
 | 
			
		||||
		;;
 | 
			
		||||
	-sco*)
 | 
			
		||||
		os=-sco3.2v2
 | 
			
		||||
		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
 | 
			
		||||
@@ -228,31 +240,52 @@ case $basic_machine in
 | 
			
		||||
	| a29k \
 | 
			
		||||
	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
 | 
			
		||||
	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
 | 
			
		||||
	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
 | 
			
		||||
	| am33_2.0 \
 | 
			
		||||
	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
 | 
			
		||||
	| bfin \
 | 
			
		||||
	| c4x | clipper \
 | 
			
		||||
	| d10v | d30v | dsp16xx \
 | 
			
		||||
	| fr30 \
 | 
			
		||||
	| d10v | d30v | dlx | dsp16xx \
 | 
			
		||||
	| fido | 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 \
 | 
			
		||||
	| m32c | m32r | m32rle | m68000 | m68k | m88k \
 | 
			
		||||
	| maxq | mb | microblaze | mcore | mep \
 | 
			
		||||
	| 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 \
 | 
			
		||||
	| mt \
 | 
			
		||||
	| msp430 \
 | 
			
		||||
	| nios | nios2 \
 | 
			
		||||
	| 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 \
 | 
			
		||||
	| strongarm \
 | 
			
		||||
	| tahoe | thumb | tic80 | tron \
 | 
			
		||||
	| score \
 | 
			
		||||
	| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
 | 
			
		||||
	| sh64 | sh64le \
 | 
			
		||||
	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
 | 
			
		||||
	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
 | 
			
		||||
	| spu | strongarm \
 | 
			
		||||
	| tahoe | thumb | tic4x | tic80 | tron \
 | 
			
		||||
	| v850 | v850e \
 | 
			
		||||
	| we32k \
 | 
			
		||||
	| x86 | xscale | xstormy16 | xtensa \
 | 
			
		||||
	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
 | 
			
		||||
	| z8k)
 | 
			
		||||
		basic_machine=$basic_machine-unknown
 | 
			
		||||
		;;
 | 
			
		||||
@@ -263,6 +296,9 @@ case $basic_machine in
 | 
			
		||||
		;;
 | 
			
		||||
	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
 | 
			
		||||
		;;
 | 
			
		||||
	ms1)
 | 
			
		||||
		basic_machine=mt-unknown
 | 
			
		||||
		;;
 | 
			
		||||
 | 
			
		||||
	# We use `pc' rather than `unknown'
 | 
			
		||||
	# because (1) that's what they normally are, and
 | 
			
		||||
@@ -281,38 +317,59 @@ 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*-* \
 | 
			
		||||
	| avr-* \
 | 
			
		||||
	| bs2000-* \
 | 
			
		||||
	| c[123]* | c30-* | [cjt]90-* | c54x-* \
 | 
			
		||||
	| clipper-* | cydra-* \
 | 
			
		||||
	| d10v-* | d30v-* \
 | 
			
		||||
	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
 | 
			
		||||
	| avr-* | avr32-* \
 | 
			
		||||
	| 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-* | fido-* | fr30-* | frv-* | fx80-* \
 | 
			
		||||
	| h8300-* | h8500-* \
 | 
			
		||||
	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
 | 
			
		||||
	| i*86-* | i860-* | i960-* | ia64-* \
 | 
			
		||||
	| m32r-* \
 | 
			
		||||
	| ip2k-* | iq2000-* \
 | 
			
		||||
	| m32c-* | 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-* \
 | 
			
		||||
	| mt-* \
 | 
			
		||||
	| msp430-* \
 | 
			
		||||
	| nios-* | nios2-* \
 | 
			
		||||
	| 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-* | sheb-* | shbe-* \
 | 
			
		||||
	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
 | 
			
		||||
	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
 | 
			
		||||
	| sparclite-* \
 | 
			
		||||
	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
 | 
			
		||||
	| tahoe-* | thumb-* \
 | 
			
		||||
	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
 | 
			
		||||
	| tron-* \
 | 
			
		||||
	| v850-* | v850e-* | vax-* \
 | 
			
		||||
	| we32k-* \
 | 
			
		||||
	| x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \
 | 
			
		||||
	| xtensa-* \
 | 
			
		||||
	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
 | 
			
		||||
	| xstormy16-* | xtensa-* \
 | 
			
		||||
	| ymp-* \
 | 
			
		||||
	| z8k-*)
 | 
			
		||||
		;;
 | 
			
		||||
@@ -332,6 +389,9 @@ case $basic_machine in
 | 
			
		||||
		basic_machine=a29k-amd
 | 
			
		||||
		os=-udi
 | 
			
		||||
		;;
 | 
			
		||||
    	abacus)
 | 
			
		||||
		basic_machine=abacus-unknown
 | 
			
		||||
		;;
 | 
			
		||||
	adobe68k)
 | 
			
		||||
		basic_machine=m68010-adobe
 | 
			
		||||
		os=-scout
 | 
			
		||||
@@ -346,6 +406,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 +471,27 @@ case $basic_machine in
 | 
			
		||||
		basic_machine=j90-cray
 | 
			
		||||
		os=-unicos
 | 
			
		||||
		;;
 | 
			
		||||
	craynv)
 | 
			
		||||
		basic_machine=craynv-cray
 | 
			
		||||
		os=-unicosmp
 | 
			
		||||
		;;
 | 
			
		||||
	cr16c)
 | 
			
		||||
		basic_machine=cr16c-unknown
 | 
			
		||||
		os=-elf
 | 
			
		||||
		;;
 | 
			
		||||
	crds | unos)
 | 
			
		||||
		basic_machine=m68k-crds
 | 
			
		||||
		;;
 | 
			
		||||
	crisv32 | crisv32-* | etraxfs*)
 | 
			
		||||
		basic_machine=crisv32-axis
 | 
			
		||||
		;;
 | 
			
		||||
	cris | cris-* | etrax*)
 | 
			
		||||
		basic_machine=cris-axis
 | 
			
		||||
		;;
 | 
			
		||||
	crx)
 | 
			
		||||
		basic_machine=crx-unknown
 | 
			
		||||
		os=-elf
 | 
			
		||||
		;;
 | 
			
		||||
	da30 | da30-*)
 | 
			
		||||
		basic_machine=m68k-da30
 | 
			
		||||
		;;
 | 
			
		||||
@@ -433,6 +514,10 @@ case $basic_machine in
 | 
			
		||||
		basic_machine=m88k-motorola
 | 
			
		||||
		os=-sysv3
 | 
			
		||||
		;;
 | 
			
		||||
	djgpp)
 | 
			
		||||
		basic_machine=i586-pc
 | 
			
		||||
		os=-msdosdjgpp
 | 
			
		||||
		;;
 | 
			
		||||
	dpx20 | dpx20-*)
 | 
			
		||||
		basic_machine=rs6000-bull
 | 
			
		||||
		os=-bosx
 | 
			
		||||
@@ -611,10 +696,6 @@ case $basic_machine in
 | 
			
		||||
	mips3*)
 | 
			
		||||
		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
 | 
			
		||||
		;;
 | 
			
		||||
	mmix*)
 | 
			
		||||
		basic_machine=mmix-knuth
 | 
			
		||||
		os=-mmixware
 | 
			
		||||
		;;
 | 
			
		||||
	monitor)
 | 
			
		||||
		basic_machine=m68k-rom68k
 | 
			
		||||
		os=-coff
 | 
			
		||||
@@ -627,6 +708,9 @@ case $basic_machine in
 | 
			
		||||
		basic_machine=i386-pc
 | 
			
		||||
		os=-msdos
 | 
			
		||||
		;;
 | 
			
		||||
	ms1-*)
 | 
			
		||||
		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
 | 
			
		||||
		;;
 | 
			
		||||
	mvs)
 | 
			
		||||
		basic_machine=i370-ibm
 | 
			
		||||
		os=-mvs
 | 
			
		||||
@@ -702,9 +786,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 +815,61 @@ case $basic_machine in
 | 
			
		||||
	pbb)
 | 
			
		||||
		basic_machine=m68k-tti
 | 
			
		||||
		;;
 | 
			
		||||
        pc532 | pc532-*)
 | 
			
		||||
	pc532 | pc532-*)
 | 
			
		||||
		basic_machine=ns32k-pc532
 | 
			
		||||
		;;
 | 
			
		||||
	pc98)
 | 
			
		||||
		basic_machine=i386-pc
 | 
			
		||||
		;;
 | 
			
		||||
	pc98-*)
 | 
			
		||||
		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
 | 
			
		||||
		;;
 | 
			
		||||
	pentium | p5 | k5 | k6 | nexgen | viac3)
 | 
			
		||||
		basic_machine=i586-pc
 | 
			
		||||
		;;
 | 
			
		||||
	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/^[^-]*-//'`
 | 
			
		||||
		;;
 | 
			
		||||
@@ -781,6 +880,10 @@ case $basic_machine in
 | 
			
		||||
		basic_machine=i586-unknown
 | 
			
		||||
		os=-pw32
 | 
			
		||||
		;;
 | 
			
		||||
	rdos)
 | 
			
		||||
		basic_machine=i386-pc
 | 
			
		||||
		os=-rdos
 | 
			
		||||
		;;
 | 
			
		||||
	rom68k)
 | 
			
		||||
		basic_machine=m68k-rom68k
 | 
			
		||||
		os=-coff
 | 
			
		||||
@@ -801,6 +904,20 @@ case $basic_machine in
 | 
			
		||||
		basic_machine=a29k-amd
 | 
			
		||||
		os=-udi
 | 
			
		||||
		;;
 | 
			
		||||
	sb1)
 | 
			
		||||
		basic_machine=mipsisa64sb1-unknown
 | 
			
		||||
		;;
 | 
			
		||||
	sb1el)
 | 
			
		||||
		basic_machine=mipsisa64sb1el-unknown
 | 
			
		||||
		;;
 | 
			
		||||
	sde)
 | 
			
		||||
		basic_machine=mipsisa32-sde
 | 
			
		||||
		os=-elf
 | 
			
		||||
		;;
 | 
			
		||||
	sei)
 | 
			
		||||
		basic_machine=mips-sei
 | 
			
		||||
		os=-seiux
 | 
			
		||||
		;;
 | 
			
		||||
	sequent)
 | 
			
		||||
		basic_machine=i386-sequent
 | 
			
		||||
		;;
 | 
			
		||||
@@ -808,6 +925,12 @@ case $basic_machine in
 | 
			
		||||
		basic_machine=sh-hitachi
 | 
			
		||||
		os=-hms
 | 
			
		||||
		;;
 | 
			
		||||
	sh5el)
 | 
			
		||||
		basic_machine=sh5le-unknown
 | 
			
		||||
		;;
 | 
			
		||||
	sh64)
 | 
			
		||||
		basic_machine=sh64-unknown
 | 
			
		||||
		;;
 | 
			
		||||
	sparclite-wrs | simso-wrs)
 | 
			
		||||
		basic_machine=sparclite-wrs
 | 
			
		||||
		os=-vxworks
 | 
			
		||||
@@ -866,7 +989,7 @@ case $basic_machine in
 | 
			
		||||
	sun386 | sun386i | roadrunner)
 | 
			
		||||
		basic_machine=i386-sun
 | 
			
		||||
		;;
 | 
			
		||||
        sv1)
 | 
			
		||||
	sv1)
 | 
			
		||||
		basic_machine=sv1-cray
 | 
			
		||||
		os=-unicos
 | 
			
		||||
		;;
 | 
			
		||||
@@ -874,10 +997,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 +1009,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 +1030,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 +1055,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 +1077,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 +1111,9 @@ case $basic_machine in
 | 
			
		||||
	romp)
 | 
			
		||||
		basic_machine=romp-ibm
 | 
			
		||||
		;;
 | 
			
		||||
	mmix)
 | 
			
		||||
		basic_machine=mmix-knuth
 | 
			
		||||
		;;
 | 
			
		||||
	rs6000)
 | 
			
		||||
		basic_machine=rs6000-ibm
 | 
			
		||||
		;;
 | 
			
		||||
@@ -996,16 +1130,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 | sparcv9v)
 | 
			
		||||
		basic_machine=sparc-sun
 | 
			
		||||
		;;
 | 
			
		||||
        cydra)
 | 
			
		||||
	cydra)
 | 
			
		||||
		basic_machine=cydra-cydrome
 | 
			
		||||
		;;
 | 
			
		||||
	orion)
 | 
			
		||||
@@ -1020,10 +1151,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 +1206,23 @@ 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* | -solidbsd* \
 | 
			
		||||
	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
 | 
			
		||||
	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
 | 
			
		||||
	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
 | 
			
		||||
	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
 | 
			
		||||
	      | -chorusos* | -chorusrdb* \
 | 
			
		||||
	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
 | 
			
		||||
	      | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
 | 
			
		||||
	      | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \
 | 
			
		||||
	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
 | 
			
		||||
	      | -uxpv* | -beos* | -mpeix* | -udk* \
 | 
			
		||||
	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
 | 
			
		||||
	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
 | 
			
		||||
	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
 | 
			
		||||
	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
 | 
			
		||||
	      | -morphos* | -superux* | -rtmk* | -rtmk-nova*)
 | 
			
		||||
	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
 | 
			
		||||
	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
 | 
			
		||||
	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops*)
 | 
			
		||||
	# Remember, each alternative MUST END IN *, to match a version number.
 | 
			
		||||
		;;
 | 
			
		||||
	-qnx*)
 | 
			
		||||
@@ -1102,16 +1234,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 +1261,9 @@ case $os in
 | 
			
		||||
	-opened*)
 | 
			
		||||
		os=-openedition
 | 
			
		||||
		;;
 | 
			
		||||
        -os400*)
 | 
			
		||||
		os=-os400
 | 
			
		||||
		;;
 | 
			
		||||
	-wince*)
 | 
			
		||||
		os=-wince
 | 
			
		||||
		;;
 | 
			
		||||
@@ -1145,6 +1285,9 @@ case $os in
 | 
			
		||||
	-atheos*)
 | 
			
		||||
		os=-atheos
 | 
			
		||||
		;;
 | 
			
		||||
	-syllable*)
 | 
			
		||||
		os=-syllable
 | 
			
		||||
		;;
 | 
			
		||||
	-386bsd)
 | 
			
		||||
		os=-bsd
 | 
			
		||||
		;;
 | 
			
		||||
@@ -1155,7 +1298,7 @@ case $os in
 | 
			
		||||
		os=-rtmk-nova
 | 
			
		||||
		;;
 | 
			
		||||
	-ns2 )
 | 
			
		||||
	        os=-nextstep2
 | 
			
		||||
		os=-nextstep2
 | 
			
		||||
		;;
 | 
			
		||||
	-nsk*)
 | 
			
		||||
		os=-nsk
 | 
			
		||||
@@ -1167,6 +1310,9 @@ case $os in
 | 
			
		||||
	-sinix*)
 | 
			
		||||
		os=-sysv4
 | 
			
		||||
		;;
 | 
			
		||||
        -tpf*)
 | 
			
		||||
		os=-tpf
 | 
			
		||||
		;;
 | 
			
		||||
	-triton*)
 | 
			
		||||
		os=-sysv3
 | 
			
		||||
		;;
 | 
			
		||||
@@ -1194,8 +1340,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)
 | 
			
		||||
		;;
 | 
			
		||||
@@ -1219,6 +1374,12 @@ else
 | 
			
		||||
# system, and we'll never get to this point.
 | 
			
		||||
 | 
			
		||||
case $basic_machine in
 | 
			
		||||
        score-*)
 | 
			
		||||
		os=-elf
 | 
			
		||||
		;;
 | 
			
		||||
        spu-*)
 | 
			
		||||
		os=-elf
 | 
			
		||||
		;;
 | 
			
		||||
	*-acorn)
 | 
			
		||||
		os=-riscix1.2
 | 
			
		||||
		;;
 | 
			
		||||
@@ -1228,11 +1389,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-*)
 | 
			
		||||
@@ -1253,6 +1417,9 @@ case $basic_machine in
 | 
			
		||||
	m68*-cisco)
 | 
			
		||||
		os=-aout
 | 
			
		||||
		;;
 | 
			
		||||
        mep-*)
 | 
			
		||||
		os=-elf
 | 
			
		||||
		;;
 | 
			
		||||
	mips*-cisco)
 | 
			
		||||
		os=-elf
 | 
			
		||||
		;;
 | 
			
		||||
@@ -1271,9 +1438,15 @@ case $basic_machine in
 | 
			
		||||
	*-be)
 | 
			
		||||
		os=-beos
 | 
			
		||||
		;;
 | 
			
		||||
	*-haiku)
 | 
			
		||||
		os=-haiku
 | 
			
		||||
		;;
 | 
			
		||||
	*-ibm)
 | 
			
		||||
		os=-aix
 | 
			
		||||
		;;
 | 
			
		||||
    	*-knuth)
 | 
			
		||||
		os=-mmixware
 | 
			
		||||
		;;
 | 
			
		||||
	*-wec)
 | 
			
		||||
		os=-proelf
 | 
			
		||||
		;;
 | 
			
		||||
@@ -1325,19 +1498,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 +1579,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 +1612,7 @@ case $basic_machine in
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
echo $basic_machine$os
 | 
			
		||||
exit 0
 | 
			
		||||
exit
 | 
			
		||||
 | 
			
		||||
# Local variables:
 | 
			
		||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										525
									
								
								configure.in
									
									
									
									
									
								
							
							
						
						
									
										525
									
								
								configure.in
									
									
									
									
									
								
							@@ -1,34 +1,36 @@
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
# Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
 | 
			
		||||
# Copyright (c)2001-2008 Alexander Barton <alex@barton.de>
 | 
			
		||||
#
 | 
			
		||||
# 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: configure.in,v 1.59 2002/09/17 17:12:24 alex Exp $
 | 
			
		||||
# 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.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
# -- Initialisierung --
 | 
			
		||||
# -- Initialisation --
 | 
			
		||||
 | 
			
		||||
AC_INIT
 | 
			
		||||
AC_PREREQ(2.50)
 | 
			
		||||
AC_INIT(ngircd, 0.12.1)
 | 
			
		||||
AC_CONFIG_SRCDIR(src/ngircd/ngircd.c)
 | 
			
		||||
AC_CANONICAL_TARGET
 | 
			
		||||
AC_CONFIG_SRCDIR(src/config.h.in)
 | 
			
		||||
AM_INIT_AUTOMAKE(ngircd,0.5.0-pre2)
 | 
			
		||||
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([WANT_IPV6], [Define if IPV6 protocol should be enabled])
 | 
			
		||||
AH_TEMPLATE([ZEROCONF], [Define if support for Zeroconf should be included])
 | 
			
		||||
AH_TEMPLATE([IDENTAUTH], [Define if the server should do IDENT requests])
 | 
			
		||||
 | 
			
		||||
AH_TEMPLATE([TARGET_OS], [Target operating system name])
 | 
			
		||||
AH_TEMPLATE([TARGET_VENDOR], [Target system vendor])
 | 
			
		||||
@@ -38,7 +40,7 @@ AH_TEMPLATE([TARGET_CPU], [Target CPU name])
 | 
			
		||||
 | 
			
		||||
AC_PROG_CC
 | 
			
		||||
 | 
			
		||||
# -- Hilfsprogramme --
 | 
			
		||||
# -- Helper programs --
 | 
			
		||||
 | 
			
		||||
AC_PROG_AWK
 | 
			
		||||
AC_PROG_INSTALL
 | 
			
		||||
@@ -48,17 +50,52 @@ AC_PROG_RANLIB
 | 
			
		||||
 | 
			
		||||
# -- Compiler Features --
 | 
			
		||||
 | 
			
		||||
AC_LANG_C
 | 
			
		||||
 | 
			
		||||
AM_C_PROTOTYPES
 | 
			
		||||
AC_C_CONST
 | 
			
		||||
AC_C_INLINE
 | 
			
		||||
 | 
			
		||||
# -- Header --
 | 
			
		||||
# -- Hard coded system and compiler dependencies/features/options ... --
 | 
			
		||||
 | 
			
		||||
AC_DEFUN([GCC_STACK_PROTECT_CC],[
 | 
			
		||||
  ssp_cc=yes
 | 
			
		||||
  # we use -fstack-protector-all for the test to enfoce the use of the guard variable 
 | 
			
		||||
  AC_MSG_CHECKING([whether ${CC} accepts -fstack-protector])
 | 
			
		||||
  ssp_old_cflags="$CFLAGS"
 | 
			
		||||
  CFLAGS="$CFLAGS -fstack-protector-all"
 | 
			
		||||
  AC_TRY_LINK(,,, ssp_cc=no)
 | 
			
		||||
  echo $ssp_cc
 | 
			
		||||
  CFLAGS="$ssp_old_cflags"
 | 
			
		||||
  if test "X$ssp_cc" = "Xyes"; then
 | 
			
		||||
      CFLAGS="$CFLAGS -fstack-protector"
 | 
			
		||||
      AC_DEFINE([ENABLE_SSP_CC], 1, [Define if SSP C support is enabled.])
 | 
			
		||||
  fi
 | 
			
		||||
])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if test "$GCC" = "yes"; then
 | 
			
		||||
	# We are using the GNU C compiler. Good!
 | 
			
		||||
	CFLAGS="$CFLAGS -pipe -W -Wall -Wpointer-arith -Wstrict-prototypes"
 | 
			
		||||
 | 
			
		||||
	GCC_STACK_PROTECT_CC
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
case "$target_os" in
 | 
			
		||||
	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_HEADER_SYS_WAIT
 | 
			
		||||
 | 
			
		||||
AC_CHECK_HEADERS([ \
 | 
			
		||||
@@ -66,14 +103,14 @@ AC_CHECK_HEADERS([ \
 | 
			
		||||
	strings.h sys/socket.h sys/time.h unistd.h \
 | 
			
		||||
	],,AC_MSG_ERROR([required C header missing!]))
 | 
			
		||||
 | 
			
		||||
AC_CHECK_HEADERS(arpa/inet.h malloc.h stdint.h sys/select.h varargs.h)
 | 
			
		||||
AC_CHECK_HEADERS([arpa/inet.h ctype.h malloc.h stdbool.h stddef.h varargs.h])
 | 
			
		||||
 | 
			
		||||
# -- Datentypen --
 | 
			
		||||
# -- 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;
 | 
			
		||||
@@ -84,49 +121,301 @@ AC_TRY_COMPILE([
 | 
			
		||||
])
 | 
			
		||||
 | 
			
		||||
AC_TYPE_SIGNAL
 | 
			
		||||
 | 
			
		||||
AC_TYPE_SIZE_T
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# -- Libraries --
 | 
			
		||||
 | 
			
		||||
AC_CHECK_LIB(UTIL,memmove)
 | 
			
		||||
AC_CHECK_LIB(socket,bind)
 | 
			
		||||
AC_CHECK_LIB(nsl,gethostent)
 | 
			
		||||
 | 
			
		||||
# -- Funktionen --
 | 
			
		||||
 | 
			
		||||
AC_FUNC_MALLOC
 | 
			
		||||
# -- Functions --
 | 
			
		||||
 | 
			
		||||
AC_FUNC_FORK
 | 
			
		||||
 | 
			
		||||
AC_FUNC_STRFTIME
 | 
			
		||||
 | 
			
		||||
AC_CHECK_FUNCS([ \
 | 
			
		||||
	bind gethostbyaddr gethostbyname gethostname inet_ntoa memmove \
 | 
			
		||||
	memset select setsockopt socket strcasecmp strchr strerror \
 | 
			
		||||
	strstr waitpid \
 | 
			
		||||
	],,AC_MSG_ERROR([required function missing!]))
 | 
			
		||||
	bind gethostbyaddr gethostbyname gethostname inet_ntoa malloc memmove \
 | 
			
		||||
	memset realloc setsid setsockopt socket strcasecmp strchr strcspn strerror \
 | 
			
		||||
	strstr waitpid],,AC_MSG_ERROR([required function missing!]))
 | 
			
		||||
 | 
			
		||||
AC_CHECK_FUNCS(inet_aton sigaction snprintf vsnprintf)
 | 
			
		||||
AC_CHECK_FUNCS(inet_aton isdigit sigaction snprintf vsnprintf strdup strlcpy strlcat)
 | 
			
		||||
 | 
			
		||||
# -- Konfigurationsoptionen --
 | 
			
		||||
# -- Configuration options --
 | 
			
		||||
 | 
			
		||||
# use syslog?
 | 
			
		||||
 | 
			
		||||
x_syslog_on=no
 | 
			
		||||
AC_ARG_ENABLE(syslog,
 | 
			
		||||
	[  --disable-syslog        disable syslog (autodetected by default)],
 | 
			
		||||
	[	if test "$enableval" = "yes"; then
 | 
			
		||||
			AC_CHECK_HEADER(syslog.h, x_syslog_on=yes,
 | 
			
		||||
				AC_MSG_ERROR([Can't enable syslog: syslog.h not found!])
 | 
			
		||||
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!])
 | 
			
		||||
			)
 | 
			
		||||
		fi
 | 
			
		||||
	],
 | 
			
		||||
	[	AC_CHECK_HEADER(syslog.h, x_syslog_on=yes) ]
 | 
			
		||||
	[
 | 
			
		||||
		AC_CHECK_LIB(be, syslog)
 | 
			
		||||
		AC_CHECK_FUNCS(syslog, x_syslog_on=yes)
 | 
			
		||||
	]
 | 
			
		||||
)
 | 
			
		||||
if test "$x_syslog_on" = "yes"; then
 | 
			
		||||
	AC_DEFINE(USE_SYSLOG, 1)
 | 
			
		||||
	AC_CHECK_LIB(be,syslog)
 | 
			
		||||
	AC_DEFINE(SYSLOG, 1)
 | 
			
		||||
	AC_CHECK_HEADERS(syslog.h,,AC_MSG_ERROR([required C header missing!]))
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# use zlib compression?
 | 
			
		||||
 | 
			
		||||
x_zlib_on=no
 | 
			
		||||
AC_ARG_WITH(zlib,
 | 
			
		||||
	[  --without-zlib          disable zlib compression (autodetected by default)],
 | 
			
		||||
	[	if test "$withval" != "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
 | 
			
		||||
 | 
			
		||||
# detect which IO API to use:
 | 
			
		||||
 | 
			
		||||
x_io_backend=none
 | 
			
		||||
 | 
			
		||||
AC_ARG_WITH(select,
 | 
			
		||||
	[  --without-select        disable select IO support (autodetected by default)],
 | 
			
		||||
	[	if test "$withval" != "no"; then
 | 
			
		||||
			if test "$withval" != "yes"; then
 | 
			
		||||
				CFLAGS="-I$withval/include $CFLAGS"
 | 
			
		||||
				CPPFLAGS="-I$withval/include $CPPFLAGS"
 | 
			
		||||
				LDFLAGS="-L$withval/lib $LDFLAGS"
 | 
			
		||||
			fi
 | 
			
		||||
			AC_CHECK_FUNCS(select, x_io_select=yes,
 | 
			
		||||
				AC_MSG_ERROR([Can't enable select IO support!])
 | 
			
		||||
			)
 | 
			
		||||
		fi
 | 
			
		||||
	],
 | 
			
		||||
	[
 | 
			
		||||
		AC_CHECK_FUNCS(select, x_io_select=yes)
 | 
			
		||||
	]
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
AC_ARG_WITH(poll,
 | 
			
		||||
	[  --without-poll          disable poll support (autodetected by default)],
 | 
			
		||||
	[	if test "$withval" != "no"; then
 | 
			
		||||
			if test "$withval" != "yes"; then
 | 
			
		||||
				CFLAGS="-I$withval/include $CFLAGS"
 | 
			
		||||
				CPPFLAGS="-I$withval/include $CPPFLAGS"
 | 
			
		||||
				LDFLAGS="-L$withval/lib $LDFLAGS"
 | 
			
		||||
			fi
 | 
			
		||||
			AC_CHECK_FUNCS(poll, x_io_backend=poll\(\),
 | 
			
		||||
				AC_MSG_ERROR([Can't enable poll IO support!])
 | 
			
		||||
			)
 | 
			
		||||
		fi
 | 
			
		||||
	],
 | 
			
		||||
	[
 | 
			
		||||
		AC_CHECK_FUNCS(poll, x_io_backend=poll\(\))
 | 
			
		||||
	]
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
AC_ARG_WITH(devpoll,
 | 
			
		||||
	[  --without-devpoll       disable /dev/poll IO support (autodetected by default)],
 | 
			
		||||
	[	if test "$withval" != "no"; then
 | 
			
		||||
			if test "$withval" != "yes"; then
 | 
			
		||||
				CFLAGS="-I$withval/include $CFLAGS"
 | 
			
		||||
				CPPFLAGS="-I$withval/include $CPPFLAGS"
 | 
			
		||||
				LDFLAGS="-L$withval/lib $LDFLAGS"
 | 
			
		||||
			fi
 | 
			
		||||
 | 
			
		||||
				AC_CHECK_HEADERS(sys/devpoll.h,,AC_MSG_ERROR([required C header missing!]))
 | 
			
		||||
		fi
 | 
			
		||||
	],
 | 
			
		||||
	[
 | 
			
		||||
		AC_CHECK_HEADERS(sys/devpoll.h, x_io_backend=/dev/poll)
 | 
			
		||||
	]
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
AC_ARG_WITH(epoll,
 | 
			
		||||
	[  --without-epoll         disable epoll IO support (autodetected by default)],
 | 
			
		||||
	[	if test "$withval" != "no"; then
 | 
			
		||||
			if test "$withval" != "yes"; then
 | 
			
		||||
				CFLAGS="-I$withval/include $CFLAGS"
 | 
			
		||||
				CPPFLAGS="-I$withval/include $CPPFLAGS"
 | 
			
		||||
				LDFLAGS="-L$withval/lib $LDFLAGS"
 | 
			
		||||
			fi
 | 
			
		||||
			AC_CHECK_FUNCS(epoll_create, x_io_epoll=yes,
 | 
			
		||||
				AC_MSG_ERROR([Can't enable epoll IO support!])
 | 
			
		||||
			)
 | 
			
		||||
		fi
 | 
			
		||||
	],
 | 
			
		||||
	[
 | 
			
		||||
		AC_CHECK_FUNCS(epoll_create, x_io_epoll=yes)
 | 
			
		||||
	]
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
AC_ARG_WITH(kqueue,
 | 
			
		||||
	[  --without-kqueue        disable kqueue IO support (autodetected by default)],
 | 
			
		||||
	[	if test "$withval" != "no"; then
 | 
			
		||||
			if test "$withval" != "yes"; then
 | 
			
		||||
				CFLAGS="-I$withval/include $CFLAGS"
 | 
			
		||||
				CPPFLAGS="-I$withval/include $CPPFLAGS"
 | 
			
		||||
				LDFLAGS="-L$withval/lib $LDFLAGS"
 | 
			
		||||
			fi
 | 
			
		||||
			AC_CHECK_FUNCS(kqueue, x_io_backend=kqueue\(\),
 | 
			
		||||
				AC_MSG_ERROR([Can't enable kqueue IO support!])
 | 
			
		||||
			)
 | 
			
		||||
		fi
 | 
			
		||||
	],
 | 
			
		||||
	[
 | 
			
		||||
		AC_CHECK_FUNCS(kqueue, x_io_backend=kqueue\(\))
 | 
			
		||||
	]
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
if test "$x_io_epoll" = "yes" -a "$x_io_select" = "yes"; then
 | 
			
		||||
	# when epoll() and select() are available, we'll use both!
 | 
			
		||||
	x_io_backend="epoll(), select()"
 | 
			
		||||
else
 | 
			
		||||
	if test "$x_io_epoll" = "yes"; then
 | 
			
		||||
		# we prefere epoll() if it is available
 | 
			
		||||
		x_io_backend="epoll()"
 | 
			
		||||
	else
 | 
			
		||||
		if test "$x_io_select" = "yes" -a "$x_io_backend" = "none"; then
 | 
			
		||||
			# we'll use select, when available and no "better"
 | 
			
		||||
			# interface has been detected ...
 | 
			
		||||
			x_io_backend="select()"
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if test "$x_io_backend" = "none"; then
 | 
			
		||||
	AC_MSG_ERROR([No useabe IO API activated/found!?])
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# use TCP wrappers?
 | 
			
		||||
 | 
			
		||||
x_tcpwrap_on=no
 | 
			
		||||
AC_ARG_WITH(tcp-wrappers,
 | 
			
		||||
	[  --with-tcp-wrappers     enable TCP wrappers support],
 | 
			
		||||
	[	if test "$withval" != "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
 | 
			
		||||
	]
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
# include support for "zeroconf"?
 | 
			
		||||
 | 
			
		||||
x_zeroconf_on=no
 | 
			
		||||
AC_ARG_WITH(zeroconf,
 | 
			
		||||
	[  --with-zeroconf         enable support for "Zeroconf"],
 | 
			
		||||
	[	if test "$withval" != "no"; then
 | 
			
		||||
			if test "$withval" != "yes"; then
 | 
			
		||||
				CFLAGS="-I$withval/include $CFLAGS"
 | 
			
		||||
				CPPFLAGS="-I$withval/include $CPPFLAGS"
 | 
			
		||||
				LDFLAGS="-L$withval/lib $LDFLAGS"
 | 
			
		||||
			fi
 | 
			
		||||
			AC_CHECK_FUNCS(DNSServiceRegistrationCreate, x_zeroconf_on=osx,
 | 
			
		||||
			[
 | 
			
		||||
				AC_CHECK_LIB(pthread, pthread_mutexattr_init)
 | 
			
		||||
				AC_CHECK_LIB(howl, sw_discovery_init)
 | 
			
		||||
				AC_CHECK_FUNCS(sw_discovery_init, \
 | 
			
		||||
				 x_zeroconf_on=howl, \
 | 
			
		||||
				 AC_MSG_ERROR([Can't enable Zeroconf!]))
 | 
			
		||||
			])
 | 
			
		||||
		fi
 | 
			
		||||
	]
 | 
			
		||||
)
 | 
			
		||||
if test "$x_zeroconf_on" = "osx"; then
 | 
			
		||||
	AC_CHECK_HEADERS([DNSServiceDiscovery/DNSServiceDiscovery.h \
 | 
			
		||||
	 mach/port.h],,AC_MSG_ERROR([required C header missing!]))
 | 
			
		||||
	AC_DEFINE(ZEROCONF, 1)
 | 
			
		||||
fi
 | 
			
		||||
if test "$x_zeroconf_on" = "howl"; then
 | 
			
		||||
	for dir in /usr/local/include /usr/local/include/howl* \
 | 
			
		||||
	 /usr/include /usr/include/howl* \
 | 
			
		||||
	 /usr/local/include/avahi* /usr/include/avahi*; do
 | 
			
		||||
	 	test -d "$dir" || continue
 | 
			
		||||
		AC_MSG_CHECKING([for Howl headers in $dir])
 | 
			
		||||
		if test -f "$dir/rendezvous/rendezvous.h"; then
 | 
			
		||||
			if test "$dir" != "/usr/local/include" -a \
 | 
			
		||||
			 "$dir" != "/usr/include"; then
 | 
			
		||||
				CFLAGS="-I$dir $CFLAGS"
 | 
			
		||||
				CPPFLAGS="-I$dir $CPPFLAGS"
 | 
			
		||||
			fi
 | 
			
		||||
			AC_MSG_RESULT(yes)
 | 
			
		||||
			break
 | 
			
		||||
		else
 | 
			
		||||
			AC_MSG_RESULT(no)
 | 
			
		||||
		fi
 | 
			
		||||
	done
 | 
			
		||||
	AC_CHECK_HEADERS([rendezvous/rendezvous.h],, \
 | 
			
		||||
	 AC_MSG_ERROR([required C header missing!]))
 | 
			
		||||
	AC_DEFINE(ZEROCONF, 1)
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# do IDENT requests using libident?
 | 
			
		||||
 | 
			
		||||
x_identauth_on=no
 | 
			
		||||
AC_ARG_WITH(ident,
 | 
			
		||||
	[  --with-ident            enable "IDENT" ("AUTH") protocol support],
 | 
			
		||||
	[	if test "$withval" != "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
 | 
			
		||||
 | 
			
		||||
# compile in IRC+ protocol support?
 | 
			
		||||
 | 
			
		||||
x_ircplus_on=yes
 | 
			
		||||
AC_ARG_ENABLE(ircplus,
 | 
			
		||||
	[  --disable-ircplus       disable IRC+ protocol],
 | 
			
		||||
@@ -136,6 +425,22 @@ if test "$x_ircplus_on" = "yes"; then
 | 
			
		||||
	AC_DEFINE(IRCPLUS, 1)
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# enable support for IPv6?
 | 
			
		||||
x_ipv6_on=no
 | 
			
		||||
AC_ARG_ENABLE(ipv6,
 | 
			
		||||
	[  --enable-ipv6           enable IPv6 protocol support],
 | 
			
		||||
	if test "$enableval" = "yes"; then x_ipv6_on=yes; fi
 | 
			
		||||
)
 | 
			
		||||
if test "$x_ipv6_on" = "yes"; then
 | 
			
		||||
	AC_CHECK_FUNCS([ \
 | 
			
		||||
		getaddrinfo getnameinfo \
 | 
			
		||||
		],,AC_MSG_ERROR([required function missing for IPv6 support!]))
 | 
			
		||||
	AC_DEFINE(WANT_IPV6, 1)
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# compile in IRC "sniffer"?
 | 
			
		||||
 | 
			
		||||
x_sniffer_on=no; x_debug_on=no
 | 
			
		||||
AC_ARG_ENABLE(sniffer,
 | 
			
		||||
	[  --enable-sniffer        enable IRC traffic sniffer (enables debug mode)],
 | 
			
		||||
	if test "$enableval" = "yes"; then
 | 
			
		||||
@@ -144,14 +449,20 @@ AC_ARG_ENABLE(sniffer,
 | 
			
		||||
	fi
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
# enable additional debugging code?
 | 
			
		||||
 | 
			
		||||
AC_ARG_ENABLE(debug,
 | 
			
		||||
	[  --enable-debug          show additional debug output],
 | 
			
		||||
	if test "$enableval" = "yes"; then x_debug_on=yes; fi
 | 
			
		||||
)
 | 
			
		||||
if test "$x_debug_on" = "yes"; then
 | 
			
		||||
	AC_DEFINE(DEBUG, 1)
 | 
			
		||||
	test "$GCC" = "yes" && CFLAGS="-pedantic $CFLAGS"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# enable "strict RFC rules"?
 | 
			
		||||
 | 
			
		||||
x_strict_rfc_on=no
 | 
			
		||||
AC_ARG_ENABLE(strict-rfc,
 | 
			
		||||
	[  --enable-strict-rfc     strict RFC conformance -- may break clients!],
 | 
			
		||||
	if test "$enableval" = "yes"; then
 | 
			
		||||
@@ -160,44 +471,47 @@ AC_ARG_ENABLE(strict-rfc,
 | 
			
		||||
	fi
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# -- Definitionen --
 | 
			
		||||
# -- Definitions --
 | 
			
		||||
 | 
			
		||||
AC_DEFINE_UNQUOTED(TARGET_CPU, "$target_cpu" )
 | 
			
		||||
AC_DEFINE_UNQUOTED(TARGET_VENDOR, "$target_vendor" )
 | 
			
		||||
AC_DEFINE_UNQUOTED(TARGET_OS, "$target_os" )
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
# 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"
 | 
			
		||||
 | 
			
		||||
# -- Variablen --
 | 
			
		||||
 | 
			
		||||
if test "$GCC" = "yes"; then
 | 
			
		||||
	CFLAGS="-Wall $CFLAGS"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
CFLAGS="$CFLAGS -DSYSCONFDIR='\"\$(sysconfdir)\"'"
 | 
			
		||||
 | 
			
		||||
# -- Ausgabe der Dateien --
 | 
			
		||||
# -- Generate files --
 | 
			
		||||
 | 
			
		||||
AC_OUTPUT([ \
 | 
			
		||||
	Makefile \
 | 
			
		||||
	doc/Makefile \
 | 
			
		||||
	doc/en/Makefile \
 | 
			
		||||
	MacOSX/Makefile \
 | 
			
		||||
	MacOSX/ngircd.pbproj/Makefile \
 | 
			
		||||
	doc/src/Makefile \
 | 
			
		||||
	src/Makefile \
 | 
			
		||||
	src/portab/Makefile \
 | 
			
		||||
	src/ipaddr/Makefile \
 | 
			
		||||
	src/tool/Makefile \
 | 
			
		||||
	src/ngircd/Makefile \
 | 
			
		||||
	src/testsuite/Makefile \
 | 
			
		||||
	man/Makefile \
 | 
			
		||||
	contrib/Makefile \
 | 
			
		||||
	contrib/Debian/Makefile \
 | 
			
		||||
	contrib/MacOSX/Makefile \
 | 
			
		||||
	contrib/MacOSX/ngIRCd.xcodeproj/Makefile \
 | 
			
		||||
])
 | 
			
		||||
 | 
			
		||||
# -- Ergebnis --
 | 
			
		||||
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]
 | 
			
		||||
@@ -205,26 +519,75 @@ 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 "                host: ${host}"
 | 
			
		||||
echo "            compiler: ${CC}"
 | 
			
		||||
echo "      compiler flags: ${CFLAGS}"
 | 
			
		||||
echo "  preprocessor flags: ${CPPFLAGS}"
 | 
			
		||||
echo "        linker flags: ${LDFLAGS}"
 | 
			
		||||
echo "           libraries: ${LIBS}"
 | 
			
		||||
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 "     'ngircd' binary: $S"
 | 
			
		||||
echo "  configuration file: $C"
 | 
			
		||||
echo "        manual pages: $M"
 | 
			
		||||
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 "      active options: $ECHO_C"
 | 
			
		||||
test "$x_syslog_on" = "yes"	&& echo $ECHO_N "Syslog $ECHO_C"
 | 
			
		||||
test "$x_debug_on" = "yes"	&& echo $ECHO_N "Debug $ECHO_C"
 | 
			
		||||
test "$x_sniffer_on" = "yes"	&& echo $ECHO_N "Sniffer $ECHO_C"
 | 
			
		||||
test "$x_strict_rfc_on" = "yes"	&& echo $ECHO_N "Strict-RFC $ECHO_C"
 | 
			
		||||
test "$x_ircplus_on" = "yes"	&& echo $ECHO_N "IRC+ $ECHO_C"
 | 
			
		||||
echo; echo
 | 
			
		||||
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 "   Zeroconf support: $ECHO_C"
 | 
			
		||||
case "$x_zeroconf_on" in
 | 
			
		||||
	osx)
 | 
			
		||||
		echo $ECHO_N "Apple $ECHO_C"
 | 
			
		||||
		;;
 | 
			
		||||
	howl)
 | 
			
		||||
		echo $ECHO_N "Howl  $ECHO_C"
 | 
			
		||||
		;;
 | 
			
		||||
	*)
 | 
			
		||||
		echo $ECHO_N "no    $ECHO_C"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
echo $ECHO_N "      IRC+ protocol: $ECHO_C"
 | 
			
		||||
test "$x_ircplus_on" = "yes" \
 | 
			
		||||
	&& echo "yes" \
 | 
			
		||||
	|| 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_N "        I/O backend: $ECHO_C"
 | 
			
		||||
	echo "\"$x_io_backend\""
 | 
			
		||||
 | 
			
		||||
echo $ECHO_N "      IPv6 protocol: $ECHO_C"
 | 
			
		||||
echo "$x_ipv6_on"
 | 
			
		||||
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-
 | 
			
		||||
							
								
								
									
										254
									
								
								contrib/Debian/changelog
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										254
									
								
								contrib/Debian/changelog
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,254 @@
 | 
			
		||||
ngircd (0.12.1-0ab1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * New "upstream" release ngIRCd 0.12.1.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Wed,  9 Jul 2008 11:27:00 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.12.0-0ab1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * New "upstream" release ngIRCd 0.12.0.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Tue, 13 May 2008 12:30:31 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.12.0-0ab0-pre2) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Second prerelease of upcoming new "upstrem" release 0.12.0-pre1.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Tue, 29 Apr 2008 23:06:14 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.12.0-0ab0-pre1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Prereloease of upcoming new "upstrem" release 0.12.0-pre1.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Sun, 20 Apr 2008 15:43:34 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.11.0-0ab0-pre2) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Second prerelease of upcoming new "upstream release".
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Mon,  7 Jan 2008 15:32:42 +0100
 | 
			
		||||
 | 
			
		||||
ngircd (0.11.0-0ab0-pre1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Prerelease of upcoming new "upstream release".
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Wed,  2 Jan 2008 21:33:15 +0100
 | 
			
		||||
 | 
			
		||||
ngircd (0.10.4-0ab1) unstable; urgency=high
 | 
			
		||||
 | 
			
		||||
  * New "upstream" release: 0.10.4 - fixing a security bug.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Mon,  7 Jan 2008 22:04:44 +0100
 | 
			
		||||
 | 
			
		||||
ngircd (0.10.0-0ab1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * New "upstream" release: 0.10.0
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Sun,  1 Oct 2006 18:14:21 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.10.0-0ab0-pre2-1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Bumped standards version to 3.7.2.1.
 | 
			
		||||
  * Added "Provides: ircd" to Debian control file.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Sun,  1 Oct 2006 16:25:33 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.10.0-0ab0-pre2) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Second "upstream" prerelease of upcoming 0.10.0 release.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Sat,  9 Sep 2006 20:57:52 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.10.0-0ab0-pre1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Prerelease of upcoming new "upstream release".
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Wed,  2 Aug 2006 12:01:07 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.9.2-0ab1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * New "upstream release" fixing a few bugs in 0.9.1.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Sat, 15 Oct 2005 14:10:34 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.9.1-0ab1) unstable; urgency=medium
 | 
			
		||||
 | 
			
		||||
  * New "upstream release" addressing two problems in ngIRCd 0.9.0.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Wed,  3 Aug 2005 15:10:41 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.9.0-0ab2) unstable; urgency=medium
 | 
			
		||||
 | 
			
		||||
  * Init script: fixed a problem with symbolic links in runlevel directories
 | 
			
		||||
    that could prevent the init script from working correctly.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Tue, 26 Jul 2005 21:31:18 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.9.0-0ab1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * New "upstream release".
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Sat,  24 Jul 2005 23:30:00 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.8.3-0ab1) unstable; urgency=high
 | 
			
		||||
 | 
			
		||||
  * New "upstream release", including security fixes.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Thu,  3 Feb 2005 10:41:55 +0100
 | 
			
		||||
 | 
			
		||||
ngircd (0.8.2-0ab1) unstable; urgency=high
 | 
			
		||||
 | 
			
		||||
  * New "upstream release", including security fixes.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Wed, 26 Jan 2005 23:14:12 +0100
 | 
			
		||||
 | 
			
		||||
ngircd (0.8.1-0ab1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * New "upstream release".
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Sat, 25 Dec 2004 01:18:32 +0100
 | 
			
		||||
 | 
			
		||||
ngircd (0.8.0-0ab2) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Added missing commas to debian control file, fixes bug #56.
 | 
			
		||||
    Thanks to Kevin Otte.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Thu, 15 Jul 2004 10:53:39 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.8.0-0ab1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * New upstream version.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Sat, 26 Jun 2004 11:25:59 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.7.7+HEAD-0ab6) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Incorporated actual CVS HEAD version which includes all features of
 | 
			
		||||
    version 0.8.0-pre1 and patches for the resolver and logger.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Tue, 11 May 2004 02:18:50 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.7.7+HEAD-0ab5) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Updates from CVS HEAD branch, most notably: "INVITE- and BAN-lists
 | 
			
		||||
    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
 | 
			
		||||
							
								
								
									
										49
									
								
								contrib/Debian/control
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								contrib/Debian/control
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,49 @@
 | 
			
		||||
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.7.2.1
 | 
			
		||||
 | 
			
		||||
Package: ngircd
 | 
			
		||||
Architecture: any
 | 
			
		||||
Depends: ${shlibs:Depends}, ${misc:Depends}
 | 
			
		||||
Provides: ircd
 | 
			
		||||
Description: A lightweight daemon for the Internet Relay Chat (IRC)
 | 
			
		||||
 ngIRCd is a free open source daemon for the Internet Relay Chat (IRC)
 | 
			
		||||
 network. It is written from scratch and is not based upon the original
 | 
			
		||||
 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}
 | 
			
		||||
Provides: ircd
 | 
			
		||||
Conflicts: ngircd
 | 
			
		||||
Description: A lightweight daemon for the Internet Relay Chat (IRC)
 | 
			
		||||
 ngIRCd is a free open source daemon for the Internet Relay Chat (IRC)
 | 
			
		||||
 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-
 | 
			
		||||
							
								
								
									
										86
									
								
								contrib/Debian/ngircd.init
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										86
									
								
								contrib/Debian/ngircd.init
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,86 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd start and stop script for Debian-based systems
 | 
			
		||||
#
 | 
			
		||||
# $Id: ngircd.init,v 1.7 2006/12/26 14:43:46 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
### BEGIN INIT INFO
 | 
			
		||||
# Provides:		ircd
 | 
			
		||||
# Required-Start:	$local_fs
 | 
			
		||||
# Required-Stop:	$local_fs
 | 
			
		||||
# Should-Start:		$syslog $network
 | 
			
		||||
# Should-Stop:		$syslog $network
 | 
			
		||||
# Default-Start:	2 3 4 5
 | 
			
		||||
# Default-Stop:		0 1 6
 | 
			
		||||
# Short-Description:	Next Generation IRC Server
 | 
			
		||||
### END INIT INFO
 | 
			
		||||
 | 
			
		||||
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
 | 
			
		||||
DAEMON=/usr/sbin/ngircd
 | 
			
		||||
NAME=ngIRCd
 | 
			
		||||
DESC="IRC daemon"
 | 
			
		||||
PARAMS=""
 | 
			
		||||
 | 
			
		||||
test -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-
 | 
			
		||||
							
								
								
									
										21
									
								
								contrib/Debian/ngircd.postinst
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										21
									
								
								contrib/Debian/ngircd.postinst
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,21 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#
 | 
			
		||||
# Debian post-installation script
 | 
			
		||||
# $Id: ngircd.postinst,v 1.2 2006/12/26 14:44:40 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
set -e
 | 
			
		||||
 | 
			
		||||
case "$1" in
 | 
			
		||||
	configure)
 | 
			
		||||
		if [ -f /etc/ngircd/ngircd.conf ]; then
 | 
			
		||||
			# make sure that the configuration file is not
 | 
			
		||||
			# world-readable, it contains passwords!
 | 
			
		||||
			chmod o= /etc/ngircd/ngircd.conf
 | 
			
		||||
		fi
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
#DEBHELPER#
 | 
			
		||||
 | 
			
		||||
# -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-
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/MacOSX/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/MacOSX/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
build
 | 
			
		||||
							
								
								
									
										51
									
								
								contrib/MacOSX/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								contrib/MacOSX/Makefile.am
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
# Copyright (c)2001-2008 Alexander Barton <alex@barton.de>
 | 
			
		||||
#
 | 
			
		||||
# This program is free software; you can redistribute it and/or modify
 | 
			
		||||
# it under the terms of the GNU General Public License as published by
 | 
			
		||||
# the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
# (at your option) any later version.
 | 
			
		||||
# Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile.am,v 1.3 2008/02/17 15:31:15 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
SUBDIRS = ngIRCd.xcodeproj
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST = de.barton.ngircd.plist.tmpl config.h cvs-version.h
 | 
			
		||||
 | 
			
		||||
SUFFIXES = .tmpl .
 | 
			
		||||
 | 
			
		||||
.tmpl:
 | 
			
		||||
	sed \
 | 
			
		||||
	    -e s@:SBINDIR:@${sbindir}@ \
 | 
			
		||||
	    <$< >$@
 | 
			
		||||
 | 
			
		||||
install-data-local:
 | 
			
		||||
	[ `uname -s` != "Darwin" ] || make install-sys-darwin
 | 
			
		||||
 | 
			
		||||
install-sys-darwin:
 | 
			
		||||
	@if [ `id -u` -eq 0 ]; then \
 | 
			
		||||
	  make install-sys-darwin-root; \
 | 
			
		||||
	else \
 | 
			
		||||
	  echo; \
 | 
			
		||||
	  echo " ** NOTE: Not installing with root privileges, so the LaunchDaemon script"; \
 | 
			
		||||
	  echo " ** \"/Library/LaunchDaemons/de.barton.ngircd.plist\" can't be installed/updated!"; \
 | 
			
		||||
	  echo; \
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
install-sys-darwin-root: de.barton.ngircd.plist
 | 
			
		||||
	install -c -m 644 -b -o root -g wheel de.barton.ngircd.plist /Library/LaunchDaemons/de.barton.ngircd.plist
 | 
			
		||||
	@echo
 | 
			
		||||
	@echo " ** \"/Library/LaunchDaemons/de.barton.ngircd.plist\" has been installed,"
 | 
			
		||||
	@echo " ** but is disabled. Use launchctl(8) to enable/run ngIRCd on Darwin/Mac OS X."
 | 
			
		||||
	@echo
 | 
			
		||||
 | 
			
		||||
clean-local:
 | 
			
		||||
	rm -rf build
 | 
			
		||||
 | 
			
		||||
maintainer-clean-local:
 | 
			
		||||
	rm -f Makefile Makefile.in
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
							
								
								
									
										92
									
								
								contrib/MacOSX/config.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								contrib/MacOSX/config.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,92 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2007 Alexander Barton (alex@barton.de).
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: config.h,v 1.1 2007/11/19 22:11:36 alex Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * Static configuration file for Mac OS X Xcode project
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define PACKAGE_NAME "ngircd"
 | 
			
		||||
#define VERSION "??"
 | 
			
		||||
#define SYSCONFDIR "/etc/ngircd"
 | 
			
		||||
 | 
			
		||||
/* -- Build options -- */
 | 
			
		||||
 | 
			
		||||
/* Define if debug-mode should be enabled */
 | 
			
		||||
#define DEBUG 1
 | 
			
		||||
 | 
			
		||||
/* Define if the server should do IDENT requests */
 | 
			
		||||
/*#define IDENTAUTH 1*/
 | 
			
		||||
 | 
			
		||||
/* Define if IRC+ protocol should be used */
 | 
			
		||||
#define IRCPLUS 1
 | 
			
		||||
 | 
			
		||||
/* Define if IRC sniffer should be enabled */
 | 
			
		||||
/*#define SNIFFER 1*/
 | 
			
		||||
 | 
			
		||||
/* Define if syslog should be used for logging */
 | 
			
		||||
#define SYSLOG 1
 | 
			
		||||
 | 
			
		||||
/* Define if TCP wrappers should be used */
 | 
			
		||||
/*#define TCPWRAP 1*/
 | 
			
		||||
 | 
			
		||||
/* Define if support for Zeroconf should be included */
 | 
			
		||||
/*#define ZEROCONF 1*/
 | 
			
		||||
 | 
			
		||||
/* Define if zlib compression should be enabled */
 | 
			
		||||
#define ZLIB 1
 | 
			
		||||
 | 
			
		||||
/* -- Supported features -- */
 | 
			
		||||
 | 
			
		||||
/* Define if SSP C support is enabled. */
 | 
			
		||||
#define ENABLE_SSP_CC 1
 | 
			
		||||
 | 
			
		||||
/* Define to 1 if the C compiler supports function prototypes. */
 | 
			
		||||
#define PROTOTYPES 1
 | 
			
		||||
/* Define like PROTOTYPES; this can be used by system headers. */
 | 
			
		||||
#define __PROTOTYPES 1
 | 
			
		||||
 | 
			
		||||
/* Define to 1 if you have the <sys/types.h> header file. */
 | 
			
		||||
#define HAVE_SYS_TYPES_H 1
 | 
			
		||||
/* Define to 1 if you have the <inttypes.h> header file. */
 | 
			
		||||
#define HAVE_INTTYPES_H 1
 | 
			
		||||
/* Define to 1 if you have the <stddef.h> header file. */
 | 
			
		||||
#define HAVE_STDDEF_H 1
 | 
			
		||||
/* Define to 1 if you have the <stdbool.h> header file. */
 | 
			
		||||
#define HAVE_STDBOOL_H 1
 | 
			
		||||
/* Define to 1 if you have the <arpa/inet.h> header file. */
 | 
			
		||||
#define HAVE_ARPA_INET_H 1
 | 
			
		||||
 | 
			
		||||
/* Define to 1 if you have the `kqueue' function. */
 | 
			
		||||
#define HAVE_KQUEUE 1
 | 
			
		||||
/* Define to 1 if you have the `inet_ntoa' function. */
 | 
			
		||||
#define HAVE_INET_NTOA 1
 | 
			
		||||
/* Define to 1 if you have the `snprintf' function. */
 | 
			
		||||
#define HAVE_SNPRINTF 1
 | 
			
		||||
/* Define to 1 if you have the `strlcat' function. */
 | 
			
		||||
#define HAVE_STRLCAT 1
 | 
			
		||||
/* Define to 1 if you have the `strlcpy' function. */
 | 
			
		||||
#define HAVE_STRLCPY 1
 | 
			
		||||
/* Define to 1 if you have the `strdup' function. */
 | 
			
		||||
#define HAVE_STRDUP 1
 | 
			
		||||
/* Define to 1 if you have the `vsnprintf' function. */
 | 
			
		||||
#define HAVE_VSNPRINTF 1
 | 
			
		||||
 | 
			
		||||
/* Define if socklen_t exists */
 | 
			
		||||
#define HAVE_socklen_t 1
 | 
			
		||||
 | 
			
		||||
#ifdef ZEROCONF
 | 
			
		||||
/* Define to 1 if you have the <DNSServiceDiscovery/DNSServiceDiscovery.h> header file. */
 | 
			
		||||
#define HAVE_DNSSERVICEDISCOVERY_DNSSERVICEDISCOVERY_H 1
 | 
			
		||||
/* Define to 1 if you have the `DNSServiceRegistrationCreate' function. */
 | 
			
		||||
#define HAVE_DNSSERVICEREGISTRATIONCREATE 1
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* -eof- */
 | 
			
		||||
							
								
								
									
										0
									
								
								contrib/MacOSX/cvs-version.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								contrib/MacOSX/cvs-version.h
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										19
									
								
								contrib/MacOSX/de.barton.ngircd.plist.tmpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								contrib/MacOSX/de.barton.ngircd.plist.tmpl
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 | 
			
		||||
<plist version="1.0">
 | 
			
		||||
<dict>
 | 
			
		||||
	<key>Disabled</key>
 | 
			
		||||
	<true/>
 | 
			
		||||
	<key>KeepAlive</key>
 | 
			
		||||
	<true/>
 | 
			
		||||
	<key>Label</key>
 | 
			
		||||
	<string>de.barton.ngIRCd</string>
 | 
			
		||||
	<key>ProgramArguments</key>
 | 
			
		||||
	<array>
 | 
			
		||||
		<string>:SBINDIR:/ngircd</string>
 | 
			
		||||
		<string>--nodaemon</string>
 | 
			
		||||
	</array>
 | 
			
		||||
	<key>RunAtLoad</key>
 | 
			
		||||
	<true/>
 | 
			
		||||
</dict>
 | 
			
		||||
</plist>
 | 
			
		||||
							
								
								
									
										2
									
								
								contrib/MacOSX/ngIRCd.xcodeproj/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								contrib/MacOSX/ngIRCd.xcodeproj/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
			
		||||
*.mode1v3
 | 
			
		||||
*.pbxuser
 | 
			
		||||
							
								
								
									
										17
									
								
								contrib/MacOSX/ngIRCd.xcodeproj/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								contrib/MacOSX/ngIRCd.xcodeproj/Makefile.am
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
# Copyright (c)2001-2008 Alexander Barton <alex@barton.de>
 | 
			
		||||
#
 | 
			
		||||
# This program is free software; you can redistribute it and/or modify
 | 
			
		||||
# it under the terms of the GNU General Public License as published by
 | 
			
		||||
# the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
# (at your option) any later version.
 | 
			
		||||
# Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST = project.pbxproj
 | 
			
		||||
 | 
			
		||||
maintainer-clean-local:
 | 
			
		||||
	rm -f Makefile Makefile.in
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
							
								
								
									
										697
									
								
								contrib/MacOSX/ngIRCd.xcodeproj/project.pbxproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										697
									
								
								contrib/MacOSX/ngIRCd.xcodeproj/project.pbxproj
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,697 @@
 | 
			
		||||
// !$*UTF8*$!
 | 
			
		||||
{
 | 
			
		||||
	archiveVersion = 1;
 | 
			
		||||
	classes = {
 | 
			
		||||
	};
 | 
			
		||||
	objectVersion = 44;
 | 
			
		||||
	objects = {
 | 
			
		||||
 | 
			
		||||
/* Begin PBXBuildFile section */
 | 
			
		||||
		FA322D350CEF74B1001761B3 /* array.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CD90CEF74B1001761B3 /* array.c */; };
 | 
			
		||||
		FA322D360CEF74B1001761B3 /* channel.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CDB0CEF74B1001761B3 /* channel.c */; };
 | 
			
		||||
		FA322D370CEF74B1001761B3 /* client.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CDD0CEF74B1001761B3 /* client.c */; };
 | 
			
		||||
		FA322D380CEF74B1001761B3 /* conf.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CDF0CEF74B1001761B3 /* conf.c */; };
 | 
			
		||||
		FA322D390CEF74B1001761B3 /* conn-func.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CE10CEF74B1001761B3 /* conn-func.c */; };
 | 
			
		||||
		FA322D3A0CEF74B1001761B3 /* conn-zip.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CE30CEF74B1001761B3 /* conn-zip.c */; };
 | 
			
		||||
		FA322D3B0CEF74B1001761B3 /* conn.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CE50CEF74B1001761B3 /* conn.c */; };
 | 
			
		||||
		FA322D3C0CEF74B1001761B3 /* hash.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CE80CEF74B1001761B3 /* hash.c */; };
 | 
			
		||||
		FA322D3D0CEF74B1001761B3 /* io.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CEA0CEF74B1001761B3 /* io.c */; };
 | 
			
		||||
		FA322D3E0CEF74B1001761B3 /* irc-channel.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CEC0CEF74B1001761B3 /* irc-channel.c */; };
 | 
			
		||||
		FA322D3F0CEF74B1001761B3 /* irc-info.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CEE0CEF74B1001761B3 /* irc-info.c */; };
 | 
			
		||||
		FA322D400CEF74B1001761B3 /* irc-login.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CF00CEF74B1001761B3 /* irc-login.c */; };
 | 
			
		||||
		FA322D410CEF74B1001761B3 /* irc-mode.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CF20CEF74B1001761B3 /* irc-mode.c */; };
 | 
			
		||||
		FA322D420CEF74B1001761B3 /* irc-op.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CF40CEF74B1001761B3 /* irc-op.c */; };
 | 
			
		||||
		FA322D430CEF74B1001761B3 /* irc-oper.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CF60CEF74B1001761B3 /* irc-oper.c */; };
 | 
			
		||||
		FA322D440CEF74B1001761B3 /* irc-server.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CF80CEF74B1001761B3 /* irc-server.c */; };
 | 
			
		||||
		FA322D450CEF74B1001761B3 /* irc-write.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CFA0CEF74B1001761B3 /* irc-write.c */; };
 | 
			
		||||
		FA322D460CEF74B1001761B3 /* irc.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CFC0CEF74B1001761B3 /* irc.c */; };
 | 
			
		||||
		FA322D470CEF74B1001761B3 /* lists.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CFE0CEF74B1001761B3 /* lists.c */; };
 | 
			
		||||
		FA322D480CEF74B1001761B3 /* log.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D000CEF74B1001761B3 /* log.c */; };
 | 
			
		||||
		FA322D490CEF74B1001761B3 /* match.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D030CEF74B1001761B3 /* match.c */; };
 | 
			
		||||
		FA322D4A0CEF74B1001761B3 /* ngircd.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D060CEF74B1001761B3 /* ngircd.c */; };
 | 
			
		||||
		FA322D4B0CEF74B1001761B3 /* parse.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D080CEF74B1001761B3 /* parse.c */; };
 | 
			
		||||
		FA322D4C0CEF74B1001761B3 /* rendezvous.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D0A0CEF74B1001761B3 /* rendezvous.c */; };
 | 
			
		||||
		FA322D4D0CEF74B1001761B3 /* resolve.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D0C0CEF74B1001761B3 /* resolve.c */; };
 | 
			
		||||
		FA322DBE0CEF7766001761B3 /* tool.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D330CEF74B1001761B3 /* tool.c */; };
 | 
			
		||||
		FA322DC10CEF77CB001761B3 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FA322DC00CEF77CB001761B3 /* libz.dylib */; };
 | 
			
		||||
		FA407F2E0DB159F400271AF1 /* ng_ipaddr.c in Sources */ = {isa = PBXBuildFile; fileRef = FA407F2C0DB159F400271AF1 /* ng_ipaddr.c */; };
 | 
			
		||||
		FAE5CC2E0CF2308A007D69B6 /* numeric.c in Sources */ = {isa = PBXBuildFile; fileRef = FAE5CC2D0CF2308A007D69B6 /* numeric.c */; };
 | 
			
		||||
/* End PBXBuildFile section */
 | 
			
		||||
 | 
			
		||||
/* Begin PBXCopyFilesBuildPhase section */
 | 
			
		||||
		8DD76FAF0486AB0100D96B5E /* CopyFiles */ = {
 | 
			
		||||
			isa = PBXCopyFilesBuildPhase;
 | 
			
		||||
			buildActionMask = 8;
 | 
			
		||||
			dstPath = /usr/share/man/man1/;
 | 
			
		||||
			dstSubfolderSpec = 0;
 | 
			
		||||
			files = (
 | 
			
		||||
			);
 | 
			
		||||
			runOnlyForDeploymentPostprocessing = 1;
 | 
			
		||||
		};
 | 
			
		||||
/* End PBXCopyFilesBuildPhase section */
 | 
			
		||||
 | 
			
		||||
/* Begin PBXFileReference section */
 | 
			
		||||
		FA1A6BBC0D6857BB00AA8F71 /* misc-test.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "misc-test.e"; sourceTree = "<group>"; };
 | 
			
		||||
		FA1A6BBD0D6857D900AA8F71 /* who-test.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "who-test.e"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322BBA0CEF72E4001761B3 /* ngIRCd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ngIRCd; sourceTree = BUILT_PRODUCTS_DIR; };
 | 
			
		||||
		FA322CD60CEF74B1001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CD90CEF74B1001761B3 /* array.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = array.c; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CDA0CEF74B1001761B3 /* array.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = array.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CDB0CEF74B1001761B3 /* channel.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = channel.c; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CDC0CEF74B1001761B3 /* channel.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = channel.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CDD0CEF74B1001761B3 /* client.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = client.c; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CDE0CEF74B1001761B3 /* client.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = client.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CDF0CEF74B1001761B3 /* conf.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = conf.c; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CE00CEF74B1001761B3 /* conf.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = conf.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CE10CEF74B1001761B3 /* conn-func.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "conn-func.c"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CE20CEF74B1001761B3 /* conn-func.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "conn-func.h"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CE30CEF74B1001761B3 /* conn-zip.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "conn-zip.c"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CE40CEF74B1001761B3 /* conn-zip.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "conn-zip.h"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CE50CEF74B1001761B3 /* conn.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = conn.c; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CE60CEF74B1001761B3 /* conn.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = conn.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CE70CEF74B1001761B3 /* defines.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = defines.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CE80CEF74B1001761B3 /* hash.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = hash.c; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CE90CEF74B1001761B3 /* hash.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = hash.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CEA0CEF74B1001761B3 /* io.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = io.c; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CEB0CEF74B1001761B3 /* io.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = io.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CEC0CEF74B1001761B3 /* irc-channel.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-channel.c"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CED0CEF74B1001761B3 /* irc-channel.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-channel.h"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CEE0CEF74B1001761B3 /* irc-info.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-info.c"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CEF0CEF74B1001761B3 /* irc-info.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-info.h"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CF00CEF74B1001761B3 /* irc-login.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-login.c"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CF10CEF74B1001761B3 /* irc-login.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-login.h"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CF20CEF74B1001761B3 /* irc-mode.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-mode.c"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CF30CEF74B1001761B3 /* irc-mode.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-mode.h"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CF40CEF74B1001761B3 /* irc-op.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-op.c"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CF50CEF74B1001761B3 /* irc-op.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-op.h"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CF60CEF74B1001761B3 /* irc-oper.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-oper.c"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CF70CEF74B1001761B3 /* irc-oper.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-oper.h"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CF80CEF74B1001761B3 /* irc-server.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-server.c"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CF90CEF74B1001761B3 /* irc-server.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-server.h"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CFA0CEF74B1001761B3 /* irc-write.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-write.c"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CFB0CEF74B1001761B3 /* irc-write.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-write.h"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CFC0CEF74B1001761B3 /* irc.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = irc.c; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CFD0CEF74B1001761B3 /* irc.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = irc.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CFE0CEF74B1001761B3 /* lists.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = lists.c; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CFF0CEF74B1001761B3 /* lists.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = lists.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D000CEF74B1001761B3 /* log.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = log.c; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D010CEF74B1001761B3 /* log.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = log.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D020CEF74B1001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D030CEF74B1001761B3 /* match.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = match.c; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D040CEF74B1001761B3 /* match.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = match.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D050CEF74B1001761B3 /* messages.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = messages.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D060CEF74B1001761B3 /* ngircd.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = ngircd.c; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D070CEF74B1001761B3 /* ngircd.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = ngircd.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D080CEF74B1001761B3 /* parse.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = parse.c; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D090CEF74B1001761B3 /* parse.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = parse.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D0A0CEF74B1001761B3 /* rendezvous.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = rendezvous.c; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D0B0CEF74B1001761B3 /* rendezvous.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = rendezvous.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D0C0CEF74B1001761B3 /* resolve.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = resolve.c; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D0D0CEF74B1001761B3 /* resolve.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = resolve.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D100CEF74B1001761B3 /* ansi2knr.1 */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.man; path = ansi2knr.1; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D110CEF74B1001761B3 /* ansi2knr.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = ansi2knr.c; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D120CEF74B1001761B3 /* exp.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = exp.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D130CEF74B1001761B3 /* imp.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = imp.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D140CEF74B1001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D150CEF74B1001761B3 /* portab.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = portab.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D160CEF74B1001761B3 /* portabtest.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = portabtest.c; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D170CEF74B1001761B3 /* splint.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = splint.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D180CEF74B1001761B3 /* strdup.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = strdup.c; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D190CEF74B1001761B3 /* strlcpy.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = strlcpy.c; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D1A0CEF74B1001761B3 /* vsnprintf.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = vsnprintf.c; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D1D0CEF74B1001761B3 /* channel-test.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "channel-test.e"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D1E0CEF74B1001761B3 /* check-idle.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "check-idle.e"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D1F0CEF74B1001761B3 /* connect-test.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "connect-test.e"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D200CEF74B1001761B3 /* functions.inc */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.pascal; path = functions.inc; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D210CEF74B1001761B3 /* getpid.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = getpid.sh; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D220CEF74B1001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D230CEF74B1001761B3 /* mode-test.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "mode-test.e"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D240CEF74B1001761B3 /* ngircd-test.conf */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "ngircd-test.conf"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D250CEF74B1001761B3 /* README */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = README; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D260CEF74B1001761B3 /* start-server.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = "start-server.sh"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D270CEF74B1001761B3 /* stop-server.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = "stop-server.sh"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D280CEF74B1001761B3 /* stress-A.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "stress-A.e"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D290CEF74B1001761B3 /* stress-B.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "stress-B.e"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D2A0CEF74B1001761B3 /* stress-server.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = "stress-server.sh"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D2B0CEF74B1001761B3 /* test-loop.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = "test-loop.sh"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D2C0CEF74B1001761B3 /* tests.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = tests.sh; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D2D0CEF74B1001761B3 /* wait-tests.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = "wait-tests.sh"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D300CEF74B1001761B3 /* ansi2knr.1 */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.man; path = ansi2knr.1; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D310CEF74B1001761B3 /* ansi2knr.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = ansi2knr.c; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D320CEF74B1001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D330CEF74B1001761B3 /* tool.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = tool.c; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D340CEF74B1001761B3 /* tool.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = tool.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D5A0CEF750F001761B3 /* AUTHORS */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = AUTHORS; path = ../../AUTHORS; sourceTree = SOURCE_ROOT; };
 | 
			
		||||
		FA322D5B0CEF750F001761B3 /* autogen.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; name = autogen.sh; path = ../../autogen.sh; sourceTree = SOURCE_ROOT; };
 | 
			
		||||
		FA322D5C0CEF750F001761B3 /* ChangeLog */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = ChangeLog; path = ../../ChangeLog; sourceTree = SOURCE_ROOT; };
 | 
			
		||||
		FA322D5E0CEF750F001761B3 /* config.guess */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; name = config.guess; path = ../../config.guess; sourceTree = SOURCE_ROOT; };
 | 
			
		||||
		FA322D5F0CEF750F001761B3 /* config.sub */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; name = config.sub; path = ../../config.sub; sourceTree = SOURCE_ROOT; };
 | 
			
		||||
		FA322D600CEF750F001761B3 /* configure.in */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = configure.in; path = ../../configure.in; sourceTree = SOURCE_ROOT; };
 | 
			
		||||
		FA322D610CEF750F001761B3 /* COPYING */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = COPYING; path = ../../COPYING; sourceTree = SOURCE_ROOT; };
 | 
			
		||||
		FA322D620CEF750F001761B3 /* INSTALL */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = INSTALL; path = ../../INSTALL; sourceTree = SOURCE_ROOT; };
 | 
			
		||||
		FA322D630CEF750F001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = Makefile.am; path = ../../Makefile.am; sourceTree = SOURCE_ROOT; };
 | 
			
		||||
		FA322D640CEF750F001761B3 /* NEWS */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = NEWS; path = ../../NEWS; sourceTree = SOURCE_ROOT; };
 | 
			
		||||
		FA322D650CEF750F001761B3 /* README */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = README; path = ../../README; sourceTree = SOURCE_ROOT; };
 | 
			
		||||
		FA322D6A0CEF7523001761B3 /* changelog */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = changelog; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D6B0CEF7523001761B3 /* compat */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = compat; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D6C0CEF7523001761B3 /* control */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = control; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D6D0CEF7523001761B3 /* copyright */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = copyright; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D6E0CEF7523001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D6F0CEF7523001761B3 /* ngircd.default */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = ngircd.default; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D700CEF7523001761B3 /* ngircd.init */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = ngircd.init; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D710CEF7523001761B3 /* ngircd.postinst */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = ngircd.postinst; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D720CEF7523001761B3 /* rules */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = rules; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D8D0CEF7523001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D8E0CEF7523001761B3 /* ngIRCd.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = ngIRCd.xcodeproj; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D910CEF7523001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D920CEF7523001761B3 /* ngindent */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = ngindent; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D930CEF7523001761B3 /* ngircd.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = ngircd.sh; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D940CEF7523001761B3 /* ngircd.spec */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = ngircd.spec; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D950CEF7523001761B3 /* README */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = README; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D960CEF7523001761B3 /* systrace.policy */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = systrace.policy; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D9A0CEF752C001761B3 /* FAQ.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = FAQ.txt; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D9B0CEF752C001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D9C0CEF752C001761B3 /* Platforms.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Platforms.txt; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D9D0CEF752C001761B3 /* Protocol.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Protocol.txt; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D9E0CEF752C001761B3 /* README-AUX.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "README-AUX.txt"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D9F0CEF752C001761B3 /* README-BeOS.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "README-BeOS.txt"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322DA00CEF752C001761B3 /* RFC.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = RFC.txt; sourceTree = "<group>"; };
 | 
			
		||||
		FA322DA10CEF752C001761B3 /* sample-ngircd.conf */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "sample-ngircd.conf"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322DA40CEF752C001761B3 /* Doxyfile */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Doxyfile; sourceTree = "<group>"; };
 | 
			
		||||
		FA322DA50CEF752C001761B3 /* footer.inc.html */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.html; path = footer.inc.html; sourceTree = "<group>"; };
 | 
			
		||||
		FA322DA60CEF752C001761B3 /* header.inc.html */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.html; path = header.inc.html; sourceTree = "<group>"; };
 | 
			
		||||
		FA322DA70CEF752C001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
 | 
			
		||||
		FA322DA80CEF752C001761B3 /* ngircd-doc.css */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.css; path = "ngircd-doc.css"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322DA90CEF752C001761B3 /* SSL.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = SSL.txt; sourceTree = "<group>"; };
 | 
			
		||||
		FA322DAA0CEF752C001761B3 /* Zeroconf.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Zeroconf.txt; sourceTree = "<group>"; };
 | 
			
		||||
		FA322DAD0CEF7538001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
 | 
			
		||||
		FA322DAE0CEF7538001761B3 /* ngircd.8.tmpl */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = ngircd.8.tmpl; sourceTree = "<group>"; };
 | 
			
		||||
		FA322DAF0CEF7538001761B3 /* ngircd.conf.5.tmpl */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = ngircd.conf.5.tmpl; sourceTree = "<group>"; };
 | 
			
		||||
		FA322DB10CEF7565001761B3 /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA322DBB0CEF773C001761B3 /* cvs-version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "cvs-version.h"; sourceTree = "<group>"; };
 | 
			
		||||
		FA322DC00CEF77CB001761B3 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = /usr/lib/libz.dylib; sourceTree = "<absolute>"; };
 | 
			
		||||
		FA407F2B0DB159F400271AF1 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = Makefile.am; path = ipaddr/Makefile.am; sourceTree = "<group>"; };
 | 
			
		||||
		FA407F2C0DB159F400271AF1 /* ng_ipaddr.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = ng_ipaddr.c; path = ipaddr/ng_ipaddr.c; sourceTree = "<group>"; };
 | 
			
		||||
		FA407F2D0DB159F400271AF1 /* ng_ipaddr.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = ng_ipaddr.h; path = ipaddr/ng_ipaddr.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA407F380DB15AC700271AF1 /* GIT.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = GIT.txt; sourceTree = "<group>"; };
 | 
			
		||||
		FAE5CC2C0CF2308A007D69B6 /* numeric.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = numeric.h; sourceTree = "<group>"; };
 | 
			
		||||
		FAE5CC2D0CF2308A007D69B6 /* numeric.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = numeric.c; sourceTree = "<group>"; };
 | 
			
		||||
/* End PBXFileReference section */
 | 
			
		||||
 | 
			
		||||
/* Begin PBXFrameworksBuildPhase section */
 | 
			
		||||
		8DD76FAD0486AB0100D96B5E /* Frameworks */ = {
 | 
			
		||||
			isa = PBXFrameworksBuildPhase;
 | 
			
		||||
			buildActionMask = 2147483647;
 | 
			
		||||
			files = (
 | 
			
		||||
				FA322DC10CEF77CB001761B3 /* libz.dylib in Frameworks */,
 | 
			
		||||
			);
 | 
			
		||||
			runOnlyForDeploymentPostprocessing = 0;
 | 
			
		||||
		};
 | 
			
		||||
/* End PBXFrameworksBuildPhase section */
 | 
			
		||||
 | 
			
		||||
/* Begin PBXGroup section */
 | 
			
		||||
		08FB7794FE84155DC02AAC07 /* ngIRCd */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
				FA322D970CEF752C001761B3 /* doc */,
 | 
			
		||||
				FA322D660CEF7523001761B3 /* contrib */,
 | 
			
		||||
				FA322DAB0CEF7538001761B3 /* man */,
 | 
			
		||||
				FA322CD40CEF74B0001761B3 /* src */,
 | 
			
		||||
				FA322D5A0CEF750F001761B3 /* AUTHORS */,
 | 
			
		||||
				FA322D610CEF750F001761B3 /* COPYING */,
 | 
			
		||||
				FA322D620CEF750F001761B3 /* INSTALL */,
 | 
			
		||||
				FA322D640CEF750F001761B3 /* NEWS */,
 | 
			
		||||
				FA322D650CEF750F001761B3 /* README */,
 | 
			
		||||
				FA322D5B0CEF750F001761B3 /* autogen.sh */,
 | 
			
		||||
				FA322D5C0CEF750F001761B3 /* ChangeLog */,
 | 
			
		||||
				FA322D5E0CEF750F001761B3 /* config.guess */,
 | 
			
		||||
				FA322D5F0CEF750F001761B3 /* config.sub */,
 | 
			
		||||
				FA322D600CEF750F001761B3 /* configure.in */,
 | 
			
		||||
				FA322D630CEF750F001761B3 /* Makefile.am */,
 | 
			
		||||
				1AB674ADFE9D54B511CA2CBB /* Products */,
 | 
			
		||||
				FA322DC00CEF77CB001761B3 /* libz.dylib */,
 | 
			
		||||
			);
 | 
			
		||||
			name = ngIRCd;
 | 
			
		||||
			sourceTree = "<group>";
 | 
			
		||||
		};
 | 
			
		||||
		1AB674ADFE9D54B511CA2CBB /* Products */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
				FA322BBA0CEF72E4001761B3 /* ngIRCd */,
 | 
			
		||||
			);
 | 
			
		||||
			name = Products;
 | 
			
		||||
			sourceTree = "<group>";
 | 
			
		||||
		};
 | 
			
		||||
		FA322CD40CEF74B0001761B3 /* src */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
				FA322CD70CEF74B1001761B3 /* ngircd */,
 | 
			
		||||
				FA407F270DB1598D00271AF1 /* ipaddr */,
 | 
			
		||||
				FA322D0E0CEF74B1001761B3 /* portab */,
 | 
			
		||||
				FA322D1B0CEF74B1001761B3 /* testsuite */,
 | 
			
		||||
				FA322D2E0CEF74B1001761B3 /* tool */,
 | 
			
		||||
				FA322CD60CEF74B1001761B3 /* Makefile.am */,
 | 
			
		||||
			);
 | 
			
		||||
			name = src;
 | 
			
		||||
			path = ../../src;
 | 
			
		||||
			sourceTree = SOURCE_ROOT;
 | 
			
		||||
		};
 | 
			
		||||
		FA322CD70CEF74B1001761B3 /* ngircd */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
				FA322CD90CEF74B1001761B3 /* array.c */,
 | 
			
		||||
				FA322CDA0CEF74B1001761B3 /* array.h */,
 | 
			
		||||
				FA322CDB0CEF74B1001761B3 /* channel.c */,
 | 
			
		||||
				FA322CDC0CEF74B1001761B3 /* channel.h */,
 | 
			
		||||
				FA322CDD0CEF74B1001761B3 /* client.c */,
 | 
			
		||||
				FA322CDE0CEF74B1001761B3 /* client.h */,
 | 
			
		||||
				FA322CDF0CEF74B1001761B3 /* conf.c */,
 | 
			
		||||
				FA322CE00CEF74B1001761B3 /* conf.h */,
 | 
			
		||||
				FA322CE10CEF74B1001761B3 /* conn-func.c */,
 | 
			
		||||
				FA322CE20CEF74B1001761B3 /* conn-func.h */,
 | 
			
		||||
				FA322CE30CEF74B1001761B3 /* conn-zip.c */,
 | 
			
		||||
				FA322CE40CEF74B1001761B3 /* conn-zip.h */,
 | 
			
		||||
				FA322CE50CEF74B1001761B3 /* conn.c */,
 | 
			
		||||
				FA322CE60CEF74B1001761B3 /* conn.h */,
 | 
			
		||||
				FA322CE70CEF74B1001761B3 /* defines.h */,
 | 
			
		||||
				FA322CE80CEF74B1001761B3 /* hash.c */,
 | 
			
		||||
				FA322CE90CEF74B1001761B3 /* hash.h */,
 | 
			
		||||
				FA322CEA0CEF74B1001761B3 /* io.c */,
 | 
			
		||||
				FA322CEB0CEF74B1001761B3 /* io.h */,
 | 
			
		||||
				FA322CEC0CEF74B1001761B3 /* irc-channel.c */,
 | 
			
		||||
				FA322CED0CEF74B1001761B3 /* irc-channel.h */,
 | 
			
		||||
				FA322CEE0CEF74B1001761B3 /* irc-info.c */,
 | 
			
		||||
				FA322CEF0CEF74B1001761B3 /* irc-info.h */,
 | 
			
		||||
				FA322CF00CEF74B1001761B3 /* irc-login.c */,
 | 
			
		||||
				FA322CF10CEF74B1001761B3 /* irc-login.h */,
 | 
			
		||||
				FA322CF20CEF74B1001761B3 /* irc-mode.c */,
 | 
			
		||||
				FA322CF30CEF74B1001761B3 /* irc-mode.h */,
 | 
			
		||||
				FA322CF40CEF74B1001761B3 /* irc-op.c */,
 | 
			
		||||
				FA322CF50CEF74B1001761B3 /* irc-op.h */,
 | 
			
		||||
				FA322CF60CEF74B1001761B3 /* irc-oper.c */,
 | 
			
		||||
				FA322CF70CEF74B1001761B3 /* irc-oper.h */,
 | 
			
		||||
				FA322CF80CEF74B1001761B3 /* irc-server.c */,
 | 
			
		||||
				FA322CF90CEF74B1001761B3 /* irc-server.h */,
 | 
			
		||||
				FA322CFA0CEF74B1001761B3 /* irc-write.c */,
 | 
			
		||||
				FA322CFB0CEF74B1001761B3 /* irc-write.h */,
 | 
			
		||||
				FA322CFC0CEF74B1001761B3 /* irc.c */,
 | 
			
		||||
				FA322CFD0CEF74B1001761B3 /* irc.h */,
 | 
			
		||||
				FA322CFE0CEF74B1001761B3 /* lists.c */,
 | 
			
		||||
				FA322CFF0CEF74B1001761B3 /* lists.h */,
 | 
			
		||||
				FA322D000CEF74B1001761B3 /* log.c */,
 | 
			
		||||
				FA322D010CEF74B1001761B3 /* log.h */,
 | 
			
		||||
				FA322D020CEF74B1001761B3 /* Makefile.am */,
 | 
			
		||||
				FA322D030CEF74B1001761B3 /* match.c */,
 | 
			
		||||
				FA322D040CEF74B1001761B3 /* match.h */,
 | 
			
		||||
				FA322D050CEF74B1001761B3 /* messages.h */,
 | 
			
		||||
				FA322D060CEF74B1001761B3 /* ngircd.c */,
 | 
			
		||||
				FA322D070CEF74B1001761B3 /* ngircd.h */,
 | 
			
		||||
				FAE5CC2D0CF2308A007D69B6 /* numeric.c */,
 | 
			
		||||
				FAE5CC2C0CF2308A007D69B6 /* numeric.h */,
 | 
			
		||||
				FA322D080CEF74B1001761B3 /* parse.c */,
 | 
			
		||||
				FA322D090CEF74B1001761B3 /* parse.h */,
 | 
			
		||||
				FA322D0A0CEF74B1001761B3 /* rendezvous.c */,
 | 
			
		||||
				FA322D0B0CEF74B1001761B3 /* rendezvous.h */,
 | 
			
		||||
				FA322D0C0CEF74B1001761B3 /* resolve.c */,
 | 
			
		||||
				FA322D0D0CEF74B1001761B3 /* resolve.h */,
 | 
			
		||||
			);
 | 
			
		||||
			path = ngircd;
 | 
			
		||||
			sourceTree = "<group>";
 | 
			
		||||
		};
 | 
			
		||||
		FA322D0E0CEF74B1001761B3 /* portab */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
				FA322D100CEF74B1001761B3 /* ansi2knr.1 */,
 | 
			
		||||
				FA322D110CEF74B1001761B3 /* ansi2knr.c */,
 | 
			
		||||
				FA322D120CEF74B1001761B3 /* exp.h */,
 | 
			
		||||
				FA322D130CEF74B1001761B3 /* imp.h */,
 | 
			
		||||
				FA322D140CEF74B1001761B3 /* Makefile.am */,
 | 
			
		||||
				FA322D150CEF74B1001761B3 /* portab.h */,
 | 
			
		||||
				FA322D160CEF74B1001761B3 /* portabtest.c */,
 | 
			
		||||
				FA322D170CEF74B1001761B3 /* splint.h */,
 | 
			
		||||
				FA322D180CEF74B1001761B3 /* strdup.c */,
 | 
			
		||||
				FA322D190CEF74B1001761B3 /* strlcpy.c */,
 | 
			
		||||
				FA322D1A0CEF74B1001761B3 /* vsnprintf.c */,
 | 
			
		||||
			);
 | 
			
		||||
			path = portab;
 | 
			
		||||
			sourceTree = "<group>";
 | 
			
		||||
		};
 | 
			
		||||
		FA322D1B0CEF74B1001761B3 /* testsuite */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
				FA322D1D0CEF74B1001761B3 /* channel-test.e */,
 | 
			
		||||
				FA322D1E0CEF74B1001761B3 /* check-idle.e */,
 | 
			
		||||
				FA322D1F0CEF74B1001761B3 /* connect-test.e */,
 | 
			
		||||
				FA322D200CEF74B1001761B3 /* functions.inc */,
 | 
			
		||||
				FA322D210CEF74B1001761B3 /* getpid.sh */,
 | 
			
		||||
				FA322D220CEF74B1001761B3 /* Makefile.am */,
 | 
			
		||||
				FA1A6BBC0D6857BB00AA8F71 /* misc-test.e */,
 | 
			
		||||
				FA322D230CEF74B1001761B3 /* mode-test.e */,
 | 
			
		||||
				FA322D240CEF74B1001761B3 /* ngircd-test.conf */,
 | 
			
		||||
				FA322D250CEF74B1001761B3 /* README */,
 | 
			
		||||
				FA322D260CEF74B1001761B3 /* start-server.sh */,
 | 
			
		||||
				FA322D270CEF74B1001761B3 /* stop-server.sh */,
 | 
			
		||||
				FA322D280CEF74B1001761B3 /* stress-A.e */,
 | 
			
		||||
				FA322D290CEF74B1001761B3 /* stress-B.e */,
 | 
			
		||||
				FA322D2A0CEF74B1001761B3 /* stress-server.sh */,
 | 
			
		||||
				FA322D2B0CEF74B1001761B3 /* test-loop.sh */,
 | 
			
		||||
				FA322D2C0CEF74B1001761B3 /* tests.sh */,
 | 
			
		||||
				FA322D2D0CEF74B1001761B3 /* wait-tests.sh */,
 | 
			
		||||
				FA1A6BBD0D6857D900AA8F71 /* who-test.e */,
 | 
			
		||||
			);
 | 
			
		||||
			path = testsuite;
 | 
			
		||||
			sourceTree = "<group>";
 | 
			
		||||
		};
 | 
			
		||||
		FA322D2E0CEF74B1001761B3 /* tool */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
				FA322D300CEF74B1001761B3 /* ansi2knr.1 */,
 | 
			
		||||
				FA322D310CEF74B1001761B3 /* ansi2knr.c */,
 | 
			
		||||
				FA322D320CEF74B1001761B3 /* Makefile.am */,
 | 
			
		||||
				FA322D330CEF74B1001761B3 /* tool.c */,
 | 
			
		||||
				FA322D340CEF74B1001761B3 /* tool.h */,
 | 
			
		||||
			);
 | 
			
		||||
			path = tool;
 | 
			
		||||
			sourceTree = "<group>";
 | 
			
		||||
		};
 | 
			
		||||
		FA322D660CEF7523001761B3 /* contrib */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
				FA322D680CEF7523001761B3 /* Debian */,
 | 
			
		||||
				FA322D730CEF7523001761B3 /* MacOSX */,
 | 
			
		||||
				FA322D910CEF7523001761B3 /* Makefile.am */,
 | 
			
		||||
				FA322D920CEF7523001761B3 /* ngindent */,
 | 
			
		||||
				FA322D930CEF7523001761B3 /* ngircd.sh */,
 | 
			
		||||
				FA322D940CEF7523001761B3 /* ngircd.spec */,
 | 
			
		||||
				FA322D950CEF7523001761B3 /* README */,
 | 
			
		||||
				FA322D960CEF7523001761B3 /* systrace.policy */,
 | 
			
		||||
			);
 | 
			
		||||
			name = contrib;
 | 
			
		||||
			path = ..;
 | 
			
		||||
			sourceTree = SOURCE_ROOT;
 | 
			
		||||
		};
 | 
			
		||||
		FA322D680CEF7523001761B3 /* Debian */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
				FA322D6A0CEF7523001761B3 /* changelog */,
 | 
			
		||||
				FA322D6B0CEF7523001761B3 /* compat */,
 | 
			
		||||
				FA322D6C0CEF7523001761B3 /* control */,
 | 
			
		||||
				FA322D6D0CEF7523001761B3 /* copyright */,
 | 
			
		||||
				FA322D6E0CEF7523001761B3 /* Makefile.am */,
 | 
			
		||||
				FA322D6F0CEF7523001761B3 /* ngircd.default */,
 | 
			
		||||
				FA322D700CEF7523001761B3 /* ngircd.init */,
 | 
			
		||||
				FA322D710CEF7523001761B3 /* ngircd.postinst */,
 | 
			
		||||
				FA322D720CEF7523001761B3 /* rules */,
 | 
			
		||||
			);
 | 
			
		||||
			path = Debian;
 | 
			
		||||
			sourceTree = "<group>";
 | 
			
		||||
		};
 | 
			
		||||
		FA322D730CEF7523001761B3 /* MacOSX */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
				FA322D750CEF7523001761B3 /* build */,
 | 
			
		||||
				FA322D8D0CEF7523001761B3 /* Makefile.am */,
 | 
			
		||||
				FA322D8E0CEF7523001761B3 /* ngIRCd.xcodeproj */,
 | 
			
		||||
				FA322DB10CEF7565001761B3 /* config.h */,
 | 
			
		||||
				FA322DBB0CEF773C001761B3 /* cvs-version.h */,
 | 
			
		||||
			);
 | 
			
		||||
			path = MacOSX;
 | 
			
		||||
			sourceTree = "<group>";
 | 
			
		||||
		};
 | 
			
		||||
		FA322D750CEF7523001761B3 /* build */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
				FA322D760CEF7523001761B3 /* ngIRCd.build */,
 | 
			
		||||
			);
 | 
			
		||||
			path = build;
 | 
			
		||||
			sourceTree = "<group>";
 | 
			
		||||
		};
 | 
			
		||||
		FA322D760CEF7523001761B3 /* ngIRCd.build */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
				FA322D770CEF7523001761B3 /* Default */,
 | 
			
		||||
				FA322D7F0CEF7523001761B3 /* ngIRCd.pbxindex */,
 | 
			
		||||
			);
 | 
			
		||||
			path = ngIRCd.build;
 | 
			
		||||
			sourceTree = "<group>";
 | 
			
		||||
		};
 | 
			
		||||
		FA322D770CEF7523001761B3 /* Default */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
				FA322D780CEF7523001761B3 /* ngIRCd.build */,
 | 
			
		||||
			);
 | 
			
		||||
			path = Default;
 | 
			
		||||
			sourceTree = "<group>";
 | 
			
		||||
		};
 | 
			
		||||
		FA322D780CEF7523001761B3 /* ngIRCd.build */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
				FA322D7A0CEF7523001761B3 /* Objects-normal */,
 | 
			
		||||
			);
 | 
			
		||||
			path = ngIRCd.build;
 | 
			
		||||
			sourceTree = "<group>";
 | 
			
		||||
		};
 | 
			
		||||
		FA322D7A0CEF7523001761B3 /* Objects-normal */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
				FA322D7B0CEF7523001761B3 /* i386 */,
 | 
			
		||||
				FA322D7D0CEF7523001761B3 /* ppc */,
 | 
			
		||||
			);
 | 
			
		||||
			path = "Objects-normal";
 | 
			
		||||
			sourceTree = "<group>";
 | 
			
		||||
		};
 | 
			
		||||
		FA322D7B0CEF7523001761B3 /* i386 */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
			);
 | 
			
		||||
			path = i386;
 | 
			
		||||
			sourceTree = "<group>";
 | 
			
		||||
		};
 | 
			
		||||
		FA322D7D0CEF7523001761B3 /* ppc */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
			);
 | 
			
		||||
			path = ppc;
 | 
			
		||||
			sourceTree = "<group>";
 | 
			
		||||
		};
 | 
			
		||||
		FA322D7F0CEF7523001761B3 /* ngIRCd.pbxindex */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
				FA322D880CEF7523001761B3 /* strings.pbxstrings */,
 | 
			
		||||
			);
 | 
			
		||||
			path = ngIRCd.pbxindex;
 | 
			
		||||
			sourceTree = "<group>";
 | 
			
		||||
		};
 | 
			
		||||
		FA322D880CEF7523001761B3 /* strings.pbxstrings */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
			);
 | 
			
		||||
			path = strings.pbxstrings;
 | 
			
		||||
			sourceTree = "<group>";
 | 
			
		||||
		};
 | 
			
		||||
		FA322D8F0CEF7523001761B3 /* Products */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
			);
 | 
			
		||||
			name = Products;
 | 
			
		||||
			sourceTree = "<group>";
 | 
			
		||||
		};
 | 
			
		||||
		FA322D970CEF752C001761B3 /* doc */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
				FA407F380DB15AC700271AF1 /* GIT.txt */,
 | 
			
		||||
				FA322D9A0CEF752C001761B3 /* FAQ.txt */,
 | 
			
		||||
				FA322D9B0CEF752C001761B3 /* Makefile.am */,
 | 
			
		||||
				FA322D9C0CEF752C001761B3 /* Platforms.txt */,
 | 
			
		||||
				FA322D9D0CEF752C001761B3 /* Protocol.txt */,
 | 
			
		||||
				FA322D9E0CEF752C001761B3 /* README-AUX.txt */,
 | 
			
		||||
				FA322D9F0CEF752C001761B3 /* README-BeOS.txt */,
 | 
			
		||||
				FA322DA00CEF752C001761B3 /* RFC.txt */,
 | 
			
		||||
				FA322DA10CEF752C001761B3 /* sample-ngircd.conf */,
 | 
			
		||||
				FA322DA20CEF752C001761B3 /* src */,
 | 
			
		||||
				FA322DA90CEF752C001761B3 /* SSL.txt */,
 | 
			
		||||
				FA322DAA0CEF752C001761B3 /* Zeroconf.txt */,
 | 
			
		||||
			);
 | 
			
		||||
			name = doc;
 | 
			
		||||
			path = ../../doc;
 | 
			
		||||
			sourceTree = SOURCE_ROOT;
 | 
			
		||||
		};
 | 
			
		||||
		FA322DA20CEF752C001761B3 /* src */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
				FA322DA40CEF752C001761B3 /* Doxyfile */,
 | 
			
		||||
				FA322DA50CEF752C001761B3 /* footer.inc.html */,
 | 
			
		||||
				FA322DA60CEF752C001761B3 /* header.inc.html */,
 | 
			
		||||
				FA322DA70CEF752C001761B3 /* Makefile.am */,
 | 
			
		||||
				FA322DA80CEF752C001761B3 /* ngircd-doc.css */,
 | 
			
		||||
			);
 | 
			
		||||
			path = src;
 | 
			
		||||
			sourceTree = "<group>";
 | 
			
		||||
		};
 | 
			
		||||
		FA322DAB0CEF7538001761B3 /* man */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
				FA322DAD0CEF7538001761B3 /* Makefile.am */,
 | 
			
		||||
				FA322DAE0CEF7538001761B3 /* ngircd.8.tmpl */,
 | 
			
		||||
				FA322DAF0CEF7538001761B3 /* ngircd.conf.5.tmpl */,
 | 
			
		||||
			);
 | 
			
		||||
			name = man;
 | 
			
		||||
			path = ../../man;
 | 
			
		||||
			sourceTree = SOURCE_ROOT;
 | 
			
		||||
		};
 | 
			
		||||
		FA407F270DB1598D00271AF1 /* ipaddr */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
				FA407F2B0DB159F400271AF1 /* Makefile.am */,
 | 
			
		||||
				FA407F2C0DB159F400271AF1 /* ng_ipaddr.c */,
 | 
			
		||||
				FA407F2D0DB159F400271AF1 /* ng_ipaddr.h */,
 | 
			
		||||
			);
 | 
			
		||||
			name = ipaddr;
 | 
			
		||||
			sourceTree = "<group>";
 | 
			
		||||
		};
 | 
			
		||||
/* End PBXGroup section */
 | 
			
		||||
 | 
			
		||||
/* Begin PBXNativeTarget section */
 | 
			
		||||
		8DD76FA90486AB0100D96B5E /* ngIRCd */ = {
 | 
			
		||||
			isa = PBXNativeTarget;
 | 
			
		||||
			buildConfigurationList = 1DEB928508733DD80010E9CD /* Build configuration list for PBXNativeTarget "ngIRCd" */;
 | 
			
		||||
			buildPhases = (
 | 
			
		||||
				8DD76FAB0486AB0100D96B5E /* Sources */,
 | 
			
		||||
				8DD76FAD0486AB0100D96B5E /* Frameworks */,
 | 
			
		||||
				8DD76FAF0486AB0100D96B5E /* CopyFiles */,
 | 
			
		||||
			);
 | 
			
		||||
			buildRules = (
 | 
			
		||||
			);
 | 
			
		||||
			dependencies = (
 | 
			
		||||
			);
 | 
			
		||||
			name = ngIRCd;
 | 
			
		||||
			productInstallPath = "$(HOME)/bin";
 | 
			
		||||
			productName = ngIRCd;
 | 
			
		||||
			productReference = FA322BBA0CEF72E4001761B3 /* ngIRCd */;
 | 
			
		||||
			productType = "com.apple.product-type.tool";
 | 
			
		||||
		};
 | 
			
		||||
/* End PBXNativeTarget section */
 | 
			
		||||
 | 
			
		||||
/* Begin PBXProject section */
 | 
			
		||||
		08FB7793FE84155DC02AAC07 /* Project object */ = {
 | 
			
		||||
			isa = PBXProject;
 | 
			
		||||
			buildConfigurationList = 1DEB928908733DD80010E9CD /* Build configuration list for PBXProject "ngIRCd" */;
 | 
			
		||||
			compatibilityVersion = "Xcode 3.0";
 | 
			
		||||
			hasScannedForEncodings = 1;
 | 
			
		||||
			mainGroup = 08FB7794FE84155DC02AAC07 /* ngIRCd */;
 | 
			
		||||
			projectDirPath = "";
 | 
			
		||||
			projectReferences = (
 | 
			
		||||
				{
 | 
			
		||||
					ProductGroup = FA322D8F0CEF7523001761B3 /* Products */;
 | 
			
		||||
					ProjectRef = FA322D8E0CEF7523001761B3 /* ngIRCd.xcodeproj */;
 | 
			
		||||
				},
 | 
			
		||||
			);
 | 
			
		||||
			projectRoot = "";
 | 
			
		||||
			targets = (
 | 
			
		||||
				8DD76FA90486AB0100D96B5E /* ngIRCd */,
 | 
			
		||||
			);
 | 
			
		||||
		};
 | 
			
		||||
/* End PBXProject section */
 | 
			
		||||
 | 
			
		||||
/* Begin PBXSourcesBuildPhase section */
 | 
			
		||||
		8DD76FAB0486AB0100D96B5E /* Sources */ = {
 | 
			
		||||
			isa = PBXSourcesBuildPhase;
 | 
			
		||||
			buildActionMask = 2147483647;
 | 
			
		||||
			files = (
 | 
			
		||||
				FA322D350CEF74B1001761B3 /* array.c in Sources */,
 | 
			
		||||
				FA322D360CEF74B1001761B3 /* channel.c in Sources */,
 | 
			
		||||
				FA322D370CEF74B1001761B3 /* client.c in Sources */,
 | 
			
		||||
				FA322D380CEF74B1001761B3 /* conf.c in Sources */,
 | 
			
		||||
				FA322D390CEF74B1001761B3 /* conn-func.c in Sources */,
 | 
			
		||||
				FA322D3A0CEF74B1001761B3 /* conn-zip.c in Sources */,
 | 
			
		||||
				FA322D3B0CEF74B1001761B3 /* conn.c in Sources */,
 | 
			
		||||
				FA322D3C0CEF74B1001761B3 /* hash.c in Sources */,
 | 
			
		||||
				FA322D3D0CEF74B1001761B3 /* io.c in Sources */,
 | 
			
		||||
				FA322D3E0CEF74B1001761B3 /* irc-channel.c in Sources */,
 | 
			
		||||
				FA322D3F0CEF74B1001761B3 /* irc-info.c in Sources */,
 | 
			
		||||
				FA322D400CEF74B1001761B3 /* irc-login.c in Sources */,
 | 
			
		||||
				FA322D410CEF74B1001761B3 /* irc-mode.c in Sources */,
 | 
			
		||||
				FA322D420CEF74B1001761B3 /* irc-op.c in Sources */,
 | 
			
		||||
				FA322D430CEF74B1001761B3 /* irc-oper.c in Sources */,
 | 
			
		||||
				FA322D440CEF74B1001761B3 /* irc-server.c in Sources */,
 | 
			
		||||
				FA322D450CEF74B1001761B3 /* irc-write.c in Sources */,
 | 
			
		||||
				FA322D460CEF74B1001761B3 /* irc.c in Sources */,
 | 
			
		||||
				FA322D470CEF74B1001761B3 /* lists.c in Sources */,
 | 
			
		||||
				FA322D480CEF74B1001761B3 /* log.c in Sources */,
 | 
			
		||||
				FA322D490CEF74B1001761B3 /* match.c in Sources */,
 | 
			
		||||
				FA322D4A0CEF74B1001761B3 /* ngircd.c in Sources */,
 | 
			
		||||
				FA322D4B0CEF74B1001761B3 /* parse.c in Sources */,
 | 
			
		||||
				FA322D4C0CEF74B1001761B3 /* rendezvous.c in Sources */,
 | 
			
		||||
				FA322D4D0CEF74B1001761B3 /* resolve.c in Sources */,
 | 
			
		||||
				FA322DBE0CEF7766001761B3 /* tool.c in Sources */,
 | 
			
		||||
				FAE5CC2E0CF2308A007D69B6 /* numeric.c in Sources */,
 | 
			
		||||
				FA407F2E0DB159F400271AF1 /* ng_ipaddr.c in Sources */,
 | 
			
		||||
			);
 | 
			
		||||
			runOnlyForDeploymentPostprocessing = 0;
 | 
			
		||||
		};
 | 
			
		||||
/* End PBXSourcesBuildPhase section */
 | 
			
		||||
 | 
			
		||||
/* Begin XCBuildConfiguration section */
 | 
			
		||||
		1DEB928708733DD80010E9CD /* Default */ = {
 | 
			
		||||
			isa = XCBuildConfiguration;
 | 
			
		||||
			buildSettings = {
 | 
			
		||||
				GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
 | 
			
		||||
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
 | 
			
		||||
				GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
 | 
			
		||||
				GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
 | 
			
		||||
				GCC_WARN_CHECK_SWITCH_STATEMENTS = YES;
 | 
			
		||||
				GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
 | 
			
		||||
				GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES;
 | 
			
		||||
				GCC_WARN_MISSING_PARENTHESES = YES;
 | 
			
		||||
				GCC_WARN_PEDANTIC = YES;
 | 
			
		||||
				GCC_WARN_SHADOW = YES;
 | 
			
		||||
				GCC_WARN_SIGN_COMPARE = YES;
 | 
			
		||||
				GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
 | 
			
		||||
				GCC_WARN_UNINITIALIZED_AUTOS = YES;
 | 
			
		||||
				GCC_WARN_UNKNOWN_PRAGMAS = YES;
 | 
			
		||||
				GCC_WARN_UNUSED_FUNCTION = YES;
 | 
			
		||||
				GCC_WARN_UNUSED_LABEL = YES;
 | 
			
		||||
				GCC_WARN_UNUSED_PARAMETER = YES;
 | 
			
		||||
				GCC_WARN_UNUSED_VALUE = YES;
 | 
			
		||||
				INSTALL_PATH = /usr/local/bin;
 | 
			
		||||
				PRODUCT_NAME = ngIRCd;
 | 
			
		||||
			};
 | 
			
		||||
			name = Default;
 | 
			
		||||
		};
 | 
			
		||||
		1DEB928B08733DD80010E9CD /* Default */ = {
 | 
			
		||||
			isa = XCBuildConfiguration;
 | 
			
		||||
			buildSettings = {
 | 
			
		||||
				ARCHS = (
 | 
			
		||||
					ppc,
 | 
			
		||||
					i386,
 | 
			
		||||
				);
 | 
			
		||||
				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 | 
			
		||||
				GCC_WARN_UNUSED_VARIABLE = YES;
 | 
			
		||||
				PREBINDING = NO;
 | 
			
		||||
				SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk";
 | 
			
		||||
			};
 | 
			
		||||
			name = Default;
 | 
			
		||||
		};
 | 
			
		||||
/* End XCBuildConfiguration section */
 | 
			
		||||
 | 
			
		||||
/* Begin XCConfigurationList section */
 | 
			
		||||
		1DEB928508733DD80010E9CD /* Build configuration list for PBXNativeTarget "ngIRCd" */ = {
 | 
			
		||||
			isa = XCConfigurationList;
 | 
			
		||||
			buildConfigurations = (
 | 
			
		||||
				1DEB928708733DD80010E9CD /* Default */,
 | 
			
		||||
			);
 | 
			
		||||
			defaultConfigurationIsVisible = 0;
 | 
			
		||||
			defaultConfigurationName = Default;
 | 
			
		||||
		};
 | 
			
		||||
		1DEB928908733DD80010E9CD /* Build configuration list for PBXProject "ngIRCd" */ = {
 | 
			
		||||
			isa = XCConfigurationList;
 | 
			
		||||
			buildConfigurations = (
 | 
			
		||||
				1DEB928B08733DD80010E9CD /* Default */,
 | 
			
		||||
			);
 | 
			
		||||
			defaultConfigurationIsVisible = 0;
 | 
			
		||||
			defaultConfigurationName = Default;
 | 
			
		||||
		};
 | 
			
		||||
/* End XCConfigurationList section */
 | 
			
		||||
	};
 | 
			
		||||
	rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,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,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.4 2004/04/28 12:18:02 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
SUBDIRS = ngircd.pbproj
 | 
			
		||||
SUBDIRS = Debian MacOSX
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST = README ngircd.spec systrace.policy
 | 
			
		||||
 | 
			
		||||
maintainer-clean-local:
 | 
			
		||||
	rm -f Makefile Makefile.in
 | 
			
		||||
	rm -rf build
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
							
								
								
									
										33
									
								
								contrib/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								contrib/README
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
			
		||||
 | 
			
		||||
                     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.
 | 
			
		||||
 | 
			
		||||
                            -- Contributions --
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Debian/
 | 
			
		||||
 - Various files for building Debian GNU/Linux packages (".deb's").
 | 
			
		||||
 | 
			
		||||
MacOSX/
 | 
			
		||||
 - Project files for XCode, the "project builder" of Apple Mac OS X.
 | 
			
		||||
 | 
			
		||||
ngindent
 | 
			
		||||
 - Script to indent the code of ngIRCd in the "standard way".
 | 
			
		||||
 | 
			
		||||
ngircd.sh
 | 
			
		||||
 - Start script for FreeBSD.
 | 
			
		||||
 | 
			
		||||
ngircd.spec
 | 
			
		||||
 - RPM "spec" file.
 | 
			
		||||
 | 
			
		||||
systrace.policy
 | 
			
		||||
 - Systrace policy file for OpenBSD (and probably NetBSD).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
--
 | 
			
		||||
$Id: README,v 1.3 2006/07/23 11:34:32 alex Exp $
 | 
			
		||||
							
								
								
									
										16
									
								
								contrib/ngindent
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										16
									
								
								contrib/ngindent
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
#/bin/sh
 | 
			
		||||
 | 
			
		||||
INDENTARGS="-kr -i8 -ts8 -l80 -c3 -cd41 -ss -ncs -psl"
 | 
			
		||||
 | 
			
		||||
# check if indent(1) is available
 | 
			
		||||
type indent >/dev/null 2>&1 && INDENT="indent"
 | 
			
		||||
type gnuindent >/dev/null 2>&1 && INDENT="gnuindent"
 | 
			
		||||
 | 
			
		||||
if [ -z "$INDENT" ]; then
 | 
			
		||||
	echo "Error: GNU \"indent\" not found!"
 | 
			
		||||
	exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
$INDENT -v $INDENTARGS $*
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
							
								
								
									
										51
									
								
								contrib/ngircd.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								contrib/ngircd.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
 | 
			
		||||
# PROVIDE: ngircd
 | 
			
		||||
# REQUIRE: NETWORKING SERVERS
 | 
			
		||||
# BEFORE: DAEMON
 | 
			
		||||
# KEYWORD: FreeBSD shutdown
 | 
			
		||||
 | 
			
		||||
# Add the following line to /etc/rc.conf to enable `ngircd':
 | 
			
		||||
#
 | 
			
		||||
#ngircd_enable="YES"
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
. "/etc/rc.subr"
 | 
			
		||||
 | 
			
		||||
name="ngircd"
 | 
			
		||||
rcvar=`set_rcvar`
 | 
			
		||||
 | 
			
		||||
command="/usr/local/sbin/ngircd"
 | 
			
		||||
command_args=""
 | 
			
		||||
 | 
			
		||||
load_rc_config "$name"
 | 
			
		||||
: ${ngircd_enable="NO"}
 | 
			
		||||
: ${ngircd_flags=""}
 | 
			
		||||
 | 
			
		||||
required_files="/usr/local/etc/$name.conf"
 | 
			
		||||
pidfile="${ngircd_pidfile:-/var/run/${name}/${name}.pid}"
 | 
			
		||||
 | 
			
		||||
if [ ! x"${ngircd_chrootdir}" = x ];then
 | 
			
		||||
	# Mount a devfs in the chroot directory if needed
 | 
			
		||||
	if [ ! -c ${ngircd_chrootdir}/dev/random \
 | 
			
		||||
	  -o ! -c ${ngircd_chrootdir}/dev/null ]; then
 | 
			
		||||
		umount ${ngircd_chrootdir}/dev 2>/dev/null
 | 
			
		||||
		mount_devfs devfs ${ngircd_chrootdir}/dev
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	devfs -m ${ngircd_chrootdir}/dev rule apply hide
 | 
			
		||||
	devfs -m ${ngircd_chrootdir}/dev rule apply path null unhide
 | 
			
		||||
	devfs -m ${ngircd_chrootdir}/dev rule apply path random unhide
 | 
			
		||||
 | 
			
		||||
	# Copy local timezone information if it is not up to date.
 | 
			
		||||
	if [ -f /etc/localtime ]; then
 | 
			
		||||
		cmp -s /etc/localtime "${named_chrootdir}/etc/localtime" || \
 | 
			
		||||
			cp -p /etc/localtime "${named_chrootdir}/etc/localtime"
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	pidfile="${ngircd_chrootdir}${pidfile}"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
run_rc_command "$1"
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
							
								
								
									
										55
									
								
								contrib/ngircd.spec
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								contrib/ngircd.spec
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
			
		||||
%define name    ngircd
 | 
			
		||||
%define version 0.12.1
 | 
			
		||||
%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-
 | 
			
		||||
							
								
								
									
										64
									
								
								doc/CVS.txt
									
									
									
									
									
								
							
							
						
						
									
										64
									
								
								doc/CVS.txt
									
									
									
									
									
								
							@@ -1,64 +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.
 | 
			
		||||
 | 
			
		||||
                                 -- CVS.txt --
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Die Sourcen des ngIRCd werden mit dem "Concurrent Versions System" (CVS)
 | 
			
		||||
verwaltet. Somit koennen ohne Probleme mehrere Leute gleichzeitig die Sourcen
 | 
			
		||||
bearbeitet.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
I. Anonymer "Nur-Lesen"-Zugang
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
Anonymer Zugriff auf die CVS-Repository von ngIRCd ist im "nur-lesen"-Modus
 | 
			
		||||
moeglich. Dazu sind folgende Schritte noetig:
 | 
			
		||||
 | 
			
		||||
Beim CVS-Server anmelden
 | 
			
		||||
 | 
			
		||||
 $ 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:
 | 
			
		||||
 | 
			
		||||
 $ 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.
 | 
			
		||||
 | 
			
		||||
Dieses ist der "Arbeitsordner", alle CVS-Befehle werden in Zukunft aus
 | 
			
		||||
diesem Ordner bzw. einem Unterordner davon ausgefuehrt.
 | 
			
		||||
 | 
			
		||||
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!
 | 
			
		||||
 | 
			
		||||
CVS-Tree aktualisieren:
 | 
			
		||||
 | 
			
		||||
 $ cvs update
 | 
			
		||||
 | 
			
		||||
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 ;-))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
III. Schreibzugriff
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
Wer Schreibzugriff auf die CVS-Repository wuenscht, der moege sich bitte
 | 
			
		||||
mit Alex Barton, <alex@barton.de> in Verbindung setzen.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- 
 | 
			
		||||
$Id: CVS.txt,v 1.5 2002/02/15 15:15:22 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.12 2008/01/02 22:47:58 alex Exp $
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										45
									
								
								doc/GIT.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								doc/GIT.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
 | 
			
		||||
                                 -- GIT.txt --
 | 
			
		||||
 | 
			
		||||
The source code of ngIRCd is maintained using git, the stupid content
 | 
			
		||||
tracker.
 | 
			
		||||
 | 
			
		||||
I. Getting the source code
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
To access the source tree anonymously, run:
 | 
			
		||||
 | 
			
		||||
 $ git clone git://ngircd.barton.de/ngircd.git
 | 
			
		||||
 | 
			
		||||
Thereby a new folder "ngircd" will be created containing all the individual
 | 
			
		||||
source files.
 | 
			
		||||
 | 
			
		||||
The newly created directory ("ngircd") is the "working directory", all
 | 
			
		||||
git commands will be executed from within this directory in the future.
 | 
			
		||||
 | 
			
		||||
Please note: When checking out a fresh copy of ngIRCd using git, 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.
 | 
			
		||||
 | 
			
		||||
To update the git tree:
 | 
			
		||||
 | 
			
		||||
 $ git pull
 | 
			
		||||
 | 
			
		||||
This retrieves all changes and merges them into the current branch.
 | 
			
		||||
 | 
			
		||||
II. Contributing
 | 
			
		||||
~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Patches should be sent to the ngircd mailing list. List homepage:
 | 
			
		||||
http://arthur.barton.de/mailman/listinfo/ngircd-ml
 | 
			
		||||
 | 
			
		||||
If you do not want to send them to the list, you can also mail them
 | 
			
		||||
to Alex Barton, <alex@barton.de>.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
III. Write Access
 | 
			
		||||
~~~~~~~~~~~~~~~~~
 | 
			
		||||
If you want to contribute a couple of patches and write access to the git
 | 
			
		||||
repository would be handy, please contact Alex Barton, <alex@barton.de>.
 | 
			
		||||
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
# Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
 | 
			
		||||
# Copyright (c)2001-2008 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,21 +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.10 2002/09/16 10:35:06 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
SUBDIRS = en
 | 
			
		||||
SUBDIRS = src
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST = CVS.txt FAQ.txt Protocol.txt README-AUX.txt \
 | 
			
		||||
	README-BeOS.txt RFC.txt sample-ngircd.conf
 | 
			
		||||
EXTRA_DIST = FAQ.txt GIT.txt Protocol.txt Platforms.txt README-AUX.txt \
 | 
			
		||||
	README-BeOS.txt RFC.txt SSL.txt Zeroconf.txt sample-ngircd.conf
 | 
			
		||||
 | 
			
		||||
maintainer-clean-local:
 | 
			
		||||
	rm -f Makefile Makefile.in
 | 
			
		||||
 | 
			
		||||
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)
 | 
			
		||||
 | 
			
		||||
srcdoc:
 | 
			
		||||
	make -C src srcdoc
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										77
									
								
								doc/Platforms.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								doc/Platforms.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,77 @@
 | 
			
		||||
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
 | 
			
		||||
                        (c)2001-2006 Alexander Barton
 | 
			
		||||
                    alex@barton.de, http://www.barton.de/
 | 
			
		||||
 | 
			
		||||
               ngIRCd is free software and published under the
 | 
			
		||||
                   terms of the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
                              -- 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
 | 
			
		||||
--------------------------- ------------ ---------- -------- ------ - - - - ---
 | 
			
		||||
alpha/unknown/netbsd3.0     gcc 3.3.3    CVSHEAD    06-05-07 fw     Y Y Y Y (3)
 | 
			
		||||
hppa/unknown/openbsd3.5     gcc 2.95.3   CVSHEAD    04-05-25 alex   Y Y Y Y
 | 
			
		||||
hppa1.1/unknown/linux-gnu   gcc 3.3.3    0.8.0      04-05-30 alex   Y Y Y Y
 | 
			
		||||
hppa2.0/unknown/linux-gnu   gcc 3.3.5    0.9.x-CVS  05-06-27 alex   Y Y Y Y
 | 
			
		||||
i386/pc/solaris2.9          gcc 3.2.2    CVSHEAD    04-02-24 alex   Y Y Y Y
 | 
			
		||||
i386/pc/solaris2.11         gcc 3.4.3    CVSHEAD    06-08-04 alex   Y Y Y Y
 | 
			
		||||
i386/unknown/freebsd5.2.1   gcc 3.3.3    0.8.0      04-05-30 alex   Y Y Y Y
 | 
			
		||||
i386/unknown/freebsd6.0     gcc 3.4.4    0.10.0-p1  06-08-04 alex   Y Y Y Y (3)
 | 
			
		||||
i386/unknown/freebsd6.1     gcc 3.4.4    CVSHEAD    06-05-07 fw     Y Y Y Y (3)
 | 
			
		||||
i386/unknown/gnu0.3         gcc 3.3.3    0.8.0      04-05-30 alex   Y Y n Y
 | 
			
		||||
i386/unknown/netbsdelf1.6.1 gcc 2.95.3   CVSHEAD    04-02-24 alex   Y Y Y Y
 | 
			
		||||
i386/unknown/netbsdelf3.0.1 gcc 3.3.3    0.10.0-p1  06-08-30 alex   Y Y Y Y (3)
 | 
			
		||||
i386/unknown/openbsd3.9     gcc 3.3.5    0.10.0-p1  06-08-30 alex   Y Y Y Y (3)
 | 
			
		||||
i686/pc/cygwin              gcc 3.3.1    0.8.0      04-05-30 alex   Y Y n Y
 | 
			
		||||
i686/pc/linux-gnu           gcc 2.95.4   0.8.0      04-05-30 alex   Y Y Y Y (1)
 | 
			
		||||
i686/pc/linux-gnu           gcc 3.3.3    0.8.0      04-05-30 alex   Y Y Y Y (1)
 | 
			
		||||
i386/pc/linux-gnu           gcc 4.1.2    0.10.0-p1  06-08-30 alex   Y Y Y Y (1)
 | 
			
		||||
m68k/apple/aux3.1.1         Orig. A/UX   0.7.x-CVS  03-04-22 alex   Y Y Y Y (2)
 | 
			
		||||
m68k/hp/hp-ux9.10           Orig. HPUX   0.7.x-CVS  03-04-30 goetz  Y Y Y Y
 | 
			
		||||
m88k/dg/dgux5.4R3.10        gcc 2.5.8    CVSHEAD    04-03-15 alex   Y Y ? ?
 | 
			
		||||
powerpc/apple/darwin6.5     gcc 3.1      0.7.x-CVS  03-04-23 alex   Y Y Y Y
 | 
			
		||||
powerpc/apple/darwin7.4.0   gcc 3.3      0.8.0      04-05-30 alex   Y Y Y Y
 | 
			
		||||
powerpc/apple/darwin7.9.0   gcc 3.3      CVSHEAD    06-05-07 fw     Y Y Y Y (3)
 | 
			
		||||
powerpc/apple/darwin8.1.0   gcc 4.0      0.9.x-CVS  05-06-27 alex   Y Y Y Y
 | 
			
		||||
powerpc/unknown/linux-gnu   gcc 3.3.3    0.8.0      04-05-30 alex   Y Y Y Y
 | 
			
		||||
powerpc/unknown/openbsd3.6  gcc 2.95.3   0.10.0     06-10-08 alex   Y Y n Y
 | 
			
		||||
sparc/sun/solaris2.6        gcc 2.95.3   0.7.x-CVS  03-04-22 alex   Y Y Y Y
 | 
			
		||||
sparc/sun/solaris2.7        gcc 3.3      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 (starting with 2.95.x and up to
 | 
			
		||||
    version 4.1.x). The eldest glibc used was glibc-2.0.7. ngIRCd compiled
 | 
			
		||||
    and run on all these systems without problems.
 | 
			
		||||
    Actual Linux kernels (2.6.x) and glic's support the epoll() IO interface.
 | 
			
		||||
 | 
			
		||||
(2) This compiler is an pre-ANSI C compiler, therefore the source code is
 | 
			
		||||
    automatically converted using the included ansi2knr tool while building.
 | 
			
		||||
 | 
			
		||||
(3) Using the kqueue() IO interface.
 | 
			
		||||
 | 
			
		||||
-- 
 | 
			
		||||
$Id: Platforms.txt,v 1.18 2006/10/08 14:09:16 alex Exp $
 | 
			
		||||
							
								
								
									
										201
									
								
								doc/Protocol.txt
									
									
									
									
									
								
							
							
						
						
									
										201
									
								
								doc/Protocol.txt
									
									
									
									
									
								
							@@ -1,109 +1,164 @@
 | 
			
		||||
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
 | 
			
		||||
                      (c)2001,2002 by Alexander Barton,
 | 
			
		||||
                        (c)2001-2007 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.
 | 
			
		||||
 | 
			
		||||
                              -- Protocol.txt --
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
I. Kompatibilitaet
 | 
			
		||||
~~~~~~~~~~~~~~~~~~
 | 
			
		||||
I. Compatibility
 | 
			
		||||
~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Der ngIRCd haelt sich an das IRC-Protokoll Version 2.10, wie es in den RFCs
 | 
			
		||||
1459 und 2810-2813 beschrieben ist. Diese (und ggf. weitere fuer den ngIRCd
 | 
			
		||||
relevante) RFCs sind in RFC.txt aufgefuehrt.
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
Leider verhaelt sich aber schon der "Originalserver" nicht immer genau so,
 | 
			
		||||
wie es in den RFCs beschrieben ist. Da der ngIRCd aber ein Ersatz fuer
 | 
			
		||||
eben diesen Server sein soll, werden diese Abweichungen in der Regel vom
 | 
			
		||||
ngIRCd emuliert um die Kompatibilitaet zu wahren.
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
Sollte dieses Verhalten nicht erwuenscht sein, so kann mit der configure-
 | 
			
		||||
Option "--enable-strict-rfc" der ngIRCd so compiliert werden, dass er sich
 | 
			
		||||
strikt an die entsprechenden RFCs haelt.
 | 
			
		||||
 | 
			
		||||
ACHTUNG: an einem so compilierten Server koennen sich andere Server und
 | 
			
		||||
Clients, die sich nicht genau an das Protokoll halten, u.U. nicht mehr
 | 
			
		||||
anmelden oder alle Funktionen nutzen! In der Regel ist diese Option daher
 | 
			
		||||
nicht erwuenscht.
 | 
			
		||||
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. Das IRC+-Protokoll
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
II. The IRC+ Protocol
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Der ngIRCd unterstuetzt als Erweiterung zum IRC-Protokoll wie es in den RFCs
 | 
			
		||||
2810-2813 beschrieben ist, das IRC+-Protokoll. Dieses Protokoll ist dabei
 | 
			
		||||
kompatibel zum IRC-Protokoll und wird nur verwendet, wenn der ngIRCd fest-
 | 
			
		||||
stellt, dass ein connectierter Server ebenfalls dieses erweiterte Protokoll
 | 
			
		||||
unterstuetzt.
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
Die Protokoll- und Server-Erkennung wird mit dem "PASS"-Befehl durchgefuehrt
 | 
			
		||||
(vgl. RFC 2813, Sektion 4.1.1):
 | 
			
		||||
The "PASS" command is used to detect the protocol and peer versions see
 | 
			
		||||
RFC 2813 (section 4.1.1) and below.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
II.1 neuen Server-Link registrieren
 | 
			
		||||
II.1 Register new server link
 | 
			
		||||
 | 
			
		||||
     Befehl: PASS
 | 
			
		||||
  Parameter: <password> <version> <flags> [<options>]
 | 
			
		||||
       Fuer: mit dieser Syntax nur Server
 | 
			
		||||
     Command: PASS
 | 
			
		||||
  Parameters: <password> <version> <flags> [<options>]
 | 
			
		||||
     Used by: servers only (with these parameters)
 | 
			
		||||
 | 
			
		||||
<password> enthaelt das Passwort fur den neu aufzubauenden Server-Link,
 | 
			
		||||
so wie es in der Konfigurationsdatei definiert wurde.
 | 
			
		||||
<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> setzt sich aus zwei Teilen zusammen und ist mindestens 4, maximal
 | 
			
		||||
14 Zeichen lang: die ersten vier Bytes enthalten die Versionsnummer des
 | 
			
		||||
unterstuetzten IRC-Protokolls, wobei die ersten zwei Bytes die Major-, die
 | 
			
		||||
letzten beiden die Minor-Revision angeben. Der String "0210" steht also
 | 
			
		||||
fuer Protokollversion 2.10.
 | 
			
		||||
Die folgenden (optionalen!) 10 Bytes enthalten eine von der jeweiligen
 | 
			
		||||
Implementation abhaengige Versionsnummer. Server, die das IRC+-Protokoll
 | 
			
		||||
unterstuetzen, liefern hier "-IRC+".
 | 
			
		||||
<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.).
 | 
			
		||||
 | 
			
		||||
<flags> setzt sich ebenfalls aus zwei Bestandteilen zusammen und ist
 | 
			
		||||
maximal 100 Bytes lang. Getrennt werden die beiden Teile mit dem Zeichen
 | 
			
		||||
"|". Der erste Teil enthaelt den Namen der Implementation, der ngIRCd
 | 
			
		||||
liefert hier z.B. "ngIRCd", der Originalserver "IRC". Anhand dieser "ID"
 | 
			
		||||
kann zwischen Serverimplementationen unterschieden werden. Der zweite Teil
 | 
			
		||||
(nach dem "|") ist implementationsabhaengig und wird nur ausgewertet,
 | 
			
		||||
wenn die Gegenseite das IRC+-Protokoll unterstuetzt. In diesem Fall wird
 | 
			
		||||
folgende Syntax erwartet: "<serverversion>[:<serverflags>]".
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
<serverversion> ist hier eine ASCII-Klartext-Darstellung der Versionsnummer,
 | 
			
		||||
<serverflags> zeigt die vom Server unterstuetzten Erweiterungen an (und
 | 
			
		||||
kann die leere Menge sein).
 | 
			
		||||
Example for <version>: "0210-IRC+".
 | 
			
		||||
 | 
			
		||||
Mit dem optionalen Parameter <options> werden Server-Optionen uebermittelt,
 | 
			
		||||
wie sie in RFC 2813, Sektion 4.1.1 definiert sind.
 | 
			
		||||
<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>]".
 | 
			
		||||
 | 
			
		||||
Folgende <serverflags> sind zur Zeit definiert:
 | 
			
		||||
<serverversion> is an ASCII representation of the clear-text server version
 | 
			
		||||
number, <serverflags> indicates the supported IRC+ protocol extensions (and
 | 
			
		||||
may be empty!).
 | 
			
		||||
 | 
			
		||||
- o: IRC-Operatoren duerfen auch dann Channel- und Channel-User-Modes
 | 
			
		||||
     aendern, wenn sie kein Channel-Operator im betroffenen Channel sind.
 | 
			
		||||
The following <serverflags> are defined at the moment:
 | 
			
		||||
 | 
			
		||||
- C: der Server unterstuetzt den CHANINFO-Befehl.     
 | 
			
		||||
- 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.
 | 
			
		||||
 | 
			
		||||
- H: The server supports the "enhanced server handshake", see section II.2
 | 
			
		||||
     for a detailed description.
 | 
			
		||||
 | 
			
		||||
- o: IRC operators are allowed to change channel- and channel-user-modes
 | 
			
		||||
     even if they aren't channel-operator of the affected channel.
 | 
			
		||||
 | 
			
		||||
- 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 Channel-Modes, persistente Channel und Topic austauschen
 | 
			
		||||
II.2 Enhanced Server Handshake
 | 
			
		||||
 | 
			
		||||
     Befehl: CHANINFO
 | 
			
		||||
  Parameter: <channel> +<mode> [<topic>]
 | 
			
		||||
       Fuer: Server
 | 
			
		||||
The "enhanced server handshake" is used when both servers support this IRC+
 | 
			
		||||
extension, which is indicated by the 'H' flag in the <serverflags> sent with
 | 
			
		||||
the PASS command, see section II.1.
 | 
			
		||||
 | 
			
		||||
Mit CHANINFO Informiert ein Server den anderen ueber einen Channel: dessen
 | 
			
		||||
Modes und dessen Topic. <topic> ist optional.
 | 
			
		||||
It basically means, that after exchanging the PASS and SERVER commands the
 | 
			
		||||
server is not registered in the network (as usual), but that IRC numerics
 | 
			
		||||
are exchanged until the numeric 376 (ENDOFMOTD) is received. Afterwards the
 | 
			
		||||
peer is registered in the network as with the regular IRC protocol.
 | 
			
		||||
 | 
			
		||||
Existiert auf dem Server, der das CHANINFO empfaengt, der Channel bereits,
 | 
			
		||||
so uebernimmt er die Werte jeweils nur dann, wenn er selber noch keine
 | 
			
		||||
Modes bzw. kein Topic definiert hat. Ansonsten wird der jeweilige Parameter
 | 
			
		||||
ignoriert.
 | 
			
		||||
A server implementing the enhanced server handshake (and indicating this
 | 
			
		||||
using 'H' in the <serverflags>) MUST ignore all unknown numerics to it
 | 
			
		||||
silently.
 | 
			
		||||
 | 
			
		||||
Existiert der Channel noch nicht, so wird er mit den entsprechenden Angaben
 | 
			
		||||
erzeugt.
 | 
			
		||||
In addition, such a server should at least send the numeric 005 (ISUPPORT)
 | 
			
		||||
to its peer, containing the following information. Syntax: <key>=<value>,
 | 
			
		||||
one token per IRC parameter. If the server has to send more than 12 token
 | 
			
		||||
it must send separate ISUPPORT numerics (this is a limitation of the IRC
 | 
			
		||||
protocol which allows at max 15 arguments per command).
 | 
			
		||||
 | 
			
		||||
 - NICKLEN: Maximum nickname length. Default: 9.
 | 
			
		||||
 - CASEMAPPING: Case mapping used for nick- and channel name comparing.
 | 
			
		||||
   Default: "ascii", the chars [a-z] are lowercase of [A-Z].
 | 
			
		||||
 - PREFIX: List of channel modes a person can get and the respective prefix
 | 
			
		||||
   a channel or nickname will get in case the person has it. The order of the
 | 
			
		||||
   modes goes from most powerful to least powerful. Default: "(ov)@+"
 | 
			
		||||
 - CHANTYPES: Supported channel prefixes. Default: "#".
 | 
			
		||||
 - CHANMODES: List of channel modes for 4 types, separated by comma (","):
 | 
			
		||||
   Mode that adds or removes a nick or address to a list, mode that changes
 | 
			
		||||
   a setting (both have always has a parameter), mode that changes a setting
 | 
			
		||||
   and only has a parameter when set, and mode that changes a setting and
 | 
			
		||||
   never has a parameter. For example "bI,k,l,imnPst".
 | 
			
		||||
 - CHANLIMIT: Maximum number of channels allowed to join by channel prefix,
 | 
			
		||||
   for example "#:10".
 | 
			
		||||
 | 
			
		||||
Please see <http://www.irc.org/tech_docs/005.html> for details.
 | 
			
		||||
 | 
			
		||||
The information exchanged using ISUPPORT can be used to detect configuration
 | 
			
		||||
incompatibilities (different maximum nick name length, for example) and
 | 
			
		||||
therefore to disconnect the peer prior to registering it in the network.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
II.3 Exchange channel-modes, topics, and persistent channels
 | 
			
		||||
 | 
			
		||||
     Command: CHANINFO
 | 
			
		||||
  Parameters: <channel> +<modes> <key> <limit> [<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.5 2002/09/04 00:06:19 alex Exp $
 | 
			
		||||
$Id: Protocol.txt,v 1.14 2007/11/21 12:16:35 alex Exp $
 | 
			
		||||
 
 | 
			
		||||
@@ -1,71 +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/gcc-2.8.1-auxbin.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
 | 
			
		||||
 | 
			
		||||
  - install (z.B. aus den GNU fileutils)
 | 
			
		||||
    Ein install, welches entweder so "broken" ist, dass configure das eigene
 | 
			
		||||
    Shell-Script waehlt, oder eines, das funktioniert. Leider ist mindestens
 | 
			
		||||
    ein Binary im Umlauf, das Probleme macht.
 | 
			
		||||
    Bezugsquelle:
 | 
			
		||||
    ftp://arthur.ath.cx/pub/UNIX/AUX/Software/Tools/fileutils-4.0.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 --
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Noch ein paar Hinweise, wenn es doch (noch) nicht klappt:
 | 
			
		||||
Since version 0.2.2-pre Apple's A/UX belongs to the officially supported 
 | 
			
		||||
platforms. It is not restricted in any way.
 | 
			
		||||
 | 
			
		||||
  - auf dem System muss entweder ein install vorhanden sein, welches so
 | 
			
		||||
    "broken" ist, dass configure das eigene Shell-Skript waehlt, oder eben
 | 
			
		||||
    eines, welches funktioniert. Leider ist mindestens ein Binary im Um-
 | 
			
		||||
    lauf, welches Probleme verursacht. Das Binary aus folgenden GNU
 | 
			
		||||
    fileutils funktioniert hier aber z.B.:
 | 
			
		||||
    ftp://arthur.ath.cx/pub/UNIX/AUX/Software/Tools/fileutils-4.0.tar.gz
 | 
			
		||||
Since version 0.5.0 ngIRCd's source compiles with the native A/UX c 
 | 
			
		||||
compiler. GNU C isn't a must-have anymore.
 | 
			
		||||
 | 
			
		||||
  - das sich im Umlauf befindende vorcompilierte Binary der alten Bash sollte
 | 
			
		||||
    unbedingt ausserhalb von /bin (z.B. unter /usr/local/bin) installiert
 | 
			
		||||
    werden. Ansonsten waehlt es das configure-Script als Shell aus, leider
 | 
			
		||||
    funktioniert das aber nicht.
 | 
			
		||||
    Das config.status-Script sollte mit der ksh als Interpreter erstellt
 | 
			
		||||
    worden sein (siehe erste Zeile davon!).
 | 
			
		||||
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().
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Hier die Zeiten von Alex System (Macintosh SE/30, 32 MB, A/UX 3.0.1):
 | 
			
		||||
configure: 7:33, make: 12:02
 | 
			
		||||
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/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.3 2002/04/29 14:19:48 alex Exp $
 | 
			
		||||
$Id: README-AUX.txt,v 1.10 2006/07/23 12:19:57 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
 | 
			
		||||
@@ -44,4 +50,4 @@ 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.3 2002/05/19 13:10:26 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 $
 | 
			
		||||
							
								
								
									
										40
									
								
								doc/Zeroconf.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								doc/Zeroconf.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
			
		||||
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
 | 
			
		||||
                        (c)2001-2006 Alexander Barton
 | 
			
		||||
                    alex@barton.de, http://www.barton.de/
 | 
			
		||||
 | 
			
		||||
               ngIRCd is free software and published under the
 | 
			
		||||
                   terms of the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
			      -- Zeroconf.txt --
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ngIRCd supports one aspect of Zeroconf Networking[1]: Multicast DNS (mDNS[2])
 | 
			
		||||
with DNS Service Discovery (DNS-SD[3]).
 | 
			
		||||
 | 
			
		||||
To use this features you can use one of two APIs:
 | 
			
		||||
 | 
			
		||||
  a) Apple "Bonjour" API as used by Mac OS X,
 | 
			
		||||
  b) the Howl[4] Zeroconf library or the Howl compatibility layer
 | 
			
		||||
     of the newer Avahi[5] library.
 | 
			
		||||
 | 
			
		||||
When calling the configure script using the "--with-zeroconf" switch the
 | 
			
		||||
avalable API will be autodetected and the required additional libraries will
 | 
			
		||||
be linked to the ngircd binary as required.
 | 
			
		||||
 | 
			
		||||
ngIRCd then registers a DNS-SD service for each port it is listening on using
 | 
			
		||||
the service type "_ircu._tcp.".
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Links:
 | 
			
		||||
 | 
			
		||||
 [1] http://www.zeroconf.org/
 | 
			
		||||
 [2] http://www.multicastdns.org/
 | 
			
		||||
 [3] http://www.dns-sd.org/
 | 
			
		||||
 [4] http://www.porchdogsoft.com/products/howl/
 | 
			
		||||
 [5] http://avahi.org/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- 
 | 
			
		||||
$Id: Zeroconf.txt,v 1.2 2006/08/03 14:37:29 alex Exp $
 | 
			
		||||
							
								
								
									
										126
									
								
								doc/en/INSTALL
									
									
									
									
									
								
							
							
						
						
									
										126
									
								
								doc/en/INSTALL
									
									
									
									
									
								
							@@ -1,126 +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.
 | 
			
		||||
 | 
			
		||||
                                -- INSTALL --
 | 
			
		||||
 | 
			
		||||
                         
 | 
			
		||||
 | 
			
		||||
I. Standard-Installation
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
ngIRCd is developed for UNIX-like systems, which means, that the installation
 | 
			
		||||
on a modern UNIX-like system should be no problem. The only thing is, that
 | 
			
		||||
the system should be supported by GNU automake and GNU autoconf ("configure").
 | 
			
		||||
 | 
			
		||||
The normal installation is like that:
 | 
			
		||||
 | 
			
		||||
   1) tar xzf ngircd-<Version>.tar.gz
 | 
			
		||||
   2) cd ngircd-<Version>
 | 
			
		||||
   3) ./autogen.sh	[only necessary when using CVS]
 | 
			
		||||
   4) ./configure
 | 
			
		||||
   5) make
 | 
			
		||||
   6) make install
 | 
			
		||||
 | 
			
		||||
3): "autogen.sh"
 | 
			
		||||
 | 
			
		||||
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-archieves, but when using the CVS system.
 | 
			
		||||
 | 
			
		||||
The next is therefore only interesting for developpers.
 | 
			
		||||
 | 
			
		||||
autogen.sh produces the makefile.in's, which are necessary for the configure
 | 
			
		||||
script it self, and some more files for make. For this step, there must be
 | 
			
		||||
GNU automake and GNU autoconf (in recent versions).
 | 
			
		||||
 | 
			
		||||
(again: "end users" do not need this step!)
 | 
			
		||||
 | 
			
		||||
to 4): "./configure"
 | 
			
		||||
 | 
			
		||||
The configure-script is used to detect local system dependancies.
 | 
			
		||||
 | 
			
		||||
In the perfect case, configure should recognize all needed libraries, header
 | 
			
		||||
and so on. If this shouldn't work, "./configure --help" shows more options.
 | 
			
		||||
 | 
			
		||||
to 5): "make"
 | 
			
		||||
 | 
			
		||||
The make command uses the Makefiles produced by configure and compiles the
 | 
			
		||||
ngIRCd daemon.
 | 
			
		||||
 | 
			
		||||
to 6): "make install"
 | 
			
		||||
 | 
			
		||||
Use "make install" to install the server and a sample configuration file on
 | 
			
		||||
the local system. For this step, root privileges are necessary. If there is
 | 
			
		||||
already an older configuration file present, it won't be overwritten.
 | 
			
		||||
 | 
			
		||||
This are the files that are installed:
 | 
			
		||||
 | 
			
		||||
- /usr/local/sbin/ngircd: exectable server
 | 
			
		||||
- /usr/local/etc/ngircd.conf: sample configuration, if not there
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
II. Useful make-targets
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
The Makefile produced by the configure-script contain always these useful
 | 
			
		||||
targets:
 | 
			
		||||
 | 
			
		||||
 - clean: delete every product from the compiler/linker
 | 
			
		||||
   next step: -> make
 | 
			
		||||
 | 
			
		||||
 - distclean: plus erase all generated Makefiles
 | 
			
		||||
   next step: -> ./configure
 | 
			
		||||
 | 
			
		||||
 - maintainer-clean: erease all automatic generated files
 | 
			
		||||
   next step: -> ./autogen.sh
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
III. Sample configuration file ngircd.conf
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
In the sample configuration file, there are comments beginning with "#" OR
 | 
			
		||||
";" -- this is only for the better understanding of the code.
 | 
			
		||||
 | 
			
		||||
The file is seperated in three blocks: [Global], [Operator], [Server]. In
 | 
			
		||||
the [Gobal] part, there is the main configuration, like the server-name
 | 
			
		||||
and the ports, on which the server should be listening. In the [Operator]
 | 
			
		||||
section, the server-operators are defined and [Server] is the section,
 | 
			
		||||
where the server-links are configured.
 | 
			
		||||
 | 
			
		||||
The meaning of the variables in the configuration file is explained in the 
 | 
			
		||||
"doc/sample-ngircd.conf", which is also the sample configuration file in
 | 
			
		||||
/usr/local/etc after running "make install" (if you don't already have one).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
--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.2 2002/05/20 12:02:58 alex Exp $
 | 
			
		||||
@@ -1,20 +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: Makefile.am,v 1.1 2002/05/09 10:17:05 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST = INSTALL README
 | 
			
		||||
 | 
			
		||||
maintainer-clean-local:
 | 
			
		||||
	rm -f Makefile Makefile.in
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
							
								
								
									
										101
									
								
								doc/en/README
									
									
									
									
									
								
							
							
						
						
									
										101
									
								
								doc/en/README
									
									
									
									
									
								
							@@ -1,101 +0,0 @@
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
 | 
			
		||||
                      (c)2001,2002 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.
 | 
			
		||||
 | 
			
		||||
                                -- README --
 | 
			
		||||
                           
 | 
			
		||||
                      Ilja Osthoff, <ilja@glide.ath.cx>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
I. Introduction
 | 
			
		||||
~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
ngIRCd is an Open-Source server for the Internet Realy Chat (IRC), which
 | 
			
		||||
is developped 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.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
II. Status
 | 
			
		||||
~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
At present, the ngIRCd is under active development, some features are not
 | 
			
		||||
implemented, some only partly.
 | 
			
		||||
 | 
			
		||||
Till today (more or less complete) implemented IRC-commands:
 | 
			
		||||
 | 
			
		||||
ADMIN, AWAY, CHANINFO, CONNECT, DIE, ERROR, INVITE, ISON, JOIN, KICK, KILL,
 | 
			
		||||
LINKS, LIST, LUSERS, MODE, MOTD, NAMES, NICK, NJOIN, NOTICE, OPER, PART,
 | 
			
		||||
PASS, PING, PONG, PRIVMSG, QUIT, RESTART, SERVER, SQUIT, TOPIC, USERHOST,
 | 
			
		||||
USER, VERSION, WHO, WHOIS.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
III. Features (or: why use ngIRCd?)
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
- no problems with servers which have dynamic ip-adresses
 | 
			
		||||
- simple, easy understandable configuration file,
 | 
			
		||||
- freely published C-Sourcecode,
 | 
			
		||||
- ngIRCd will be developed on in the future.
 | 
			
		||||
- supported platforms (tested versions): AIX (3.2.5), A/UX (3.0.1), FreeBSD
 | 
			
		||||
  (4.5), HP-UX (10.20), IRIX (6.5), Linux (2.x), Mac OS X (10.x), NetBSD
 | 
			
		||||
  (1.5.2/i386, 1.5.3/m68k), Solaris (2.5.1, 2.6), and Windows with Cygwin.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
IV. Documentation
 | 
			
		||||
~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
English documentation:
 | 
			
		||||
 | 
			
		||||
- doc/en/README: the file that you are reading :-)
 | 
			
		||||
- doc/en/INSTALL: hints for the installation of the ngIRCd
 | 
			
		||||
 | 
			
		||||
German documentation:
 | 
			
		||||
 | 
			
		||||
- README: readme text in german
 | 
			
		||||
- INSTALL: german installation instructions
 | 
			
		||||
- NEWS: what do you think? :-) 
 | 
			
		||||
- Changelog: the complete history of the ngIRCd
 | 
			
		||||
- doc/FAQ.txt: frequently asked questions and answers
 | 
			
		||||
- doc/CVS.txt: hints for the CVS-system
 | 
			
		||||
- doc/RFC.txt: information about the RFC's
 | 
			
		||||
- doc/sample-ngircd.conf: sample configuration file
 | 
			
		||||
- doc/README-AUX.txt: installation hints for A/UX
 | 
			
		||||
- doc/README-BeOS.txt: the same for BeOS
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
V. Download
 | 
			
		||||
~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
The homepage of the ngIRCd is: <http://arthur.ath.cx/~alex/ngircd>; you
 | 
			
		||||
will find the newest information about the ngIRCd and the most recent
 | 
			
		||||
("stable") releases there.
 | 
			
		||||
 | 
			
		||||
If you are interested in the newest developper-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://arthur.ath.cx/~alex/ngircd/#bugs>
 | 
			
		||||
 | 
			
		||||
There you can read about kown bugs, too.
 | 
			
		||||
 | 
			
		||||
If you have critics, patches or something else, please feel yourself free
 | 
			
		||||
to post a mail to: <alex@barton.de> or <alex@arthur.ath.cx>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- 
 | 
			
		||||
$Id: README,v 1.6 2002/09/16 11:03:05 alex Exp $
 | 
			
		||||
@@ -1,144 +1,221 @@
 | 
			
		||||
# $Id: sample-ngircd.conf,v 1.11 2002/09/16 10:33:09 alex Exp $
 | 
			
		||||
# $Id: sample-ngircd.conf,v 1.44 2008/01/07 23:02:29 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 ";".
 | 
			
		||||
#
 | 
			
		||||
# Autor: Alexander Barton, <alex@barton.de>
 | 
			
		||||
# Erweiterungen von Ilja Osthoff, <ilja@glide.ath.cx>
 | 
			
		||||
# A lot of configuration options in this file start with a ";". You have
 | 
			
		||||
# to remove the ";" in front of each variable to actually set a value!
 | 
			
		||||
# The disabled variables are shown with example values for completeness.
 | 
			
		||||
#
 | 
			
		||||
# Use "ngircd --configtest" (see manual page ngircd(8)) to validate that the
 | 
			
		||||
# server interprets the configuration file as expected!
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
[Global]
 | 
			
		||||
	# The [Global] section of this file is used to define the main
 | 
			
		||||
	# configuration of the server, like the server name and the ports
 | 
			
		||||
	# on which the server should be listening.
 | 
			
		||||
 | 
			
		||||
	#
 | 
			
		||||
	# 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, d.h. hier
 | 
			
		||||
	# muss die Variable nicht angegeben werden.
 | 
			
		||||
	#
 | 
			
		||||
 | 
			
		||||
	# Servername im IRC-Netz
 | 
			
		||||
	# 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. Dieser wird z.B. bei WHOIS- oder LINKS-
 | 
			
		||||
	# Abfragen entsprechend mit ausgegeben.
 | 
			
		||||
	# Info text of the server. This will be shown by WHOIS and
 | 
			
		||||
	# LINKS requests for example.
 | 
			
		||||
	Info = Server Info Text
 | 
			
		||||
	
 | 
			
		||||
	# Informationen ueber den Server und Administrator fuer den
 | 
			
		||||
	# ADMIN-Befehl:
 | 
			
		||||
	;AdminInfo1 = Beschreibung
 | 
			
		||||
	;AdminInfo2 = Standort
 | 
			
		||||
	;AdminEMail = admin@irc.server
 | 
			
		||||
 | 
			
		||||
	# 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). Diese wird aus-
 | 
			
		||||
	# gegeben, wenn sich ein User mit dem Server verbindet.
 | 
			
		||||
	# comma seperated list of IP addresses on which the server should
 | 
			
		||||
	# listen. Default values are:
 | 
			
		||||
	# "0.0.0.0" or (if compiled with IPv6 support) "::,0.0.0.0"
 | 
			
		||||
	# so the server listens on all IP addresses of the system by default.
 | 
			
		||||
	;Listen = 127.0.0.1,192.168.0.1
 | 
			
		||||
 | 
			
		||||
	# 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
 | 
			
		||||
	
 | 
			
		||||
	# Sollen IRC-Operatoren immer den MODE-Befehl in Channel benutzen
 | 
			
		||||
	# koennen, auch wenn sie kein(!) Channel-Operator sind?
 | 
			
		||||
 | 
			
		||||
	# 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
 | 
			
		||||
 | 
			
		||||
	# Allow Pre-Defined Channels only (see Section [Channels])
 | 
			
		||||
	;PredefChannelsOnly = no
 | 
			
		||||
 | 
			
		||||
	# Don't do any DNS lookups when a client connects to the server.
 | 
			
		||||
	;NoDNS = no
 | 
			
		||||
 | 
			
		||||
	# try to connect to other irc servers using ipv4 and ipv6, if possible
 | 
			
		||||
	;ConnectIPv6 = yes
 | 
			
		||||
	;ConnectIPv4 = yes
 | 
			
		||||
 | 
			
		||||
	# Maximum number of simultaneous connection the server is allowed
 | 
			
		||||
	# to accept (0: unlimited):
 | 
			
		||||
	;MaxConnections = 0
 | 
			
		||||
 | 
			
		||||
	# 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
 | 
			
		||||
 | 
			
		||||
	# Maximum length of an user nick name (Default: 9, as in RFC 2812).
 | 
			
		||||
	# Please note that all servers in an IRC network MUST use the same
 | 
			
		||||
	# maximum nick name length!
 | 
			
		||||
	;MaxNickLength = 9
 | 
			
		||||
 | 
			
		||||
[Operator]
 | 
			
		||||
	# [Operator] sections are used to define IRC Operators. There may be
 | 
			
		||||
	# more than one [Operator] block, one for each local operator.
 | 
			
		||||
 | 
			
		||||
	#
 | 
			
		||||
	# 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).
 | 
			
		||||
	# 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, one for each server.
 | 
			
		||||
	#
 | 
			
		||||
	# 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.
 | 
			
		||||
 | 
			
		||||
	#
 | 
			
		||||
	# In [Server]-Bloecken werden Server konfiguriert, zu denen sich
 | 
			
		||||
	# dieser ngIRCd verbinden soll bzw. von denen Verbindungen angekommen
 | 
			
		||||
	# werden duerfen.
 | 
			
		||||
	# Es koennen mehrere Server konfiguriert werden, d.h. [Server]-
 | 
			
		||||
	# Bloecke koennen mehrfach vorkommen.
 | 
			
		||||
	# Wenn man fuer einen Server einen Port angegeben hat, dann versucht
 | 
			
		||||
	# sich der ngIRCd mit der Gegenseite zu verbinden. Hat man keinen
 | 
			
		||||
	# Port konfiguriert, dann wartet der ngIRCd darauf, dass sich die
 | 
			
		||||
	# Gegenseite mit ihm verbindet.
 | 
			
		||||
	#
 | 
			
		||||
	# Server-Gruppen:
 | 
			
		||||
	# Der ngIRCd unterstuetzt "Server-Gruppen": das bedeutet, man kann
 | 
			
		||||
	# jedem Server, mit dem man sich verbinden will, einer Gruppe zu-
 | 
			
		||||
	# ordnen. Wenn der ngIRCd sich dann mit einem Server aus der Gruppe
 | 
			
		||||
	# verbinden will und keine Antwort erhaelt, dann wird der naechste
 | 
			
		||||
	# Server aus der Gruppe versucht.
 | 
			
		||||
	# Achtung: Gruppen werden nur beachtet, wenn man einen Port fur
 | 
			
		||||
	# die Gegenseite angegeben hat!
 | 
			
		||||
	#
 | 
			
		||||
 | 
			
		||||
	# Hostname des Servers
 | 
			
		||||
	# IRC name of the remote server, must match the "Name" variable in
 | 
			
		||||
	# the [Global] section of the other server (when using ngIRCd).
 | 
			
		||||
	;Name = irc2.the.net
 | 
			
		||||
  
 | 
			
		||||
	# Internet host name or IP address of the peer (only required when
 | 
			
		||||
	# this server should establish the connection).
 | 
			
		||||
	;Host = connect-to-host.the.net
 | 
			
		||||
 | 
			
		||||
	# IRC-Name des Servers
 | 
			
		||||
	;Name = irc2.the.net
 | 
			
		||||
	# IP address to use as _source_ address for the connection. if unspecified,
 | 
			
		||||
	# ngircd will let the operating system pick an address.
 | 
			
		||||
	;Bind = 10.0.0.1
 | 
			
		||||
 | 
			
		||||
	# Port, zu dem dieser Server eine Verbindung herstellen soll. Wird
 | 
			
		||||
	# kein Port angegeben, so wird auf eine Verbindung der Gegenseite
 | 
			
		||||
	# gewartet.
 | 
			
		||||
	;Port = 6666
 | 
			
		||||
	# Port of the server to which the ngIRCd should connect. If you
 | 
			
		||||
	# assign no port the ngIRCd waits for incoming connections.
 | 
			
		||||
	;Port = 6667
 | 
			
		||||
 | 
			
		||||
	# 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
 | 
			
		||||
 | 
			
		||||
	# Set the "Passive" option to "yes" if you don't want this ngIRCd to
 | 
			
		||||
	# connect to the configured peer (same as leaving the "Port" variable
 | 
			
		||||
	# empty). The advantage of this option is that you can actually configure
 | 
			
		||||
	# a port an use the IRC command CONNECT more easily to manually connect
 | 
			
		||||
	# this specific server later.
 | 
			
		||||
	;Passive = no
 | 
			
		||||
 | 
			
		||||
[Server]
 | 
			
		||||
	# More [Server] sections, if you like ...
 | 
			
		||||
 | 
			
		||||
[Channel]
 | 
			
		||||
	# Pre-defined channels can be configured in [Channel] sections.
 | 
			
		||||
	# Such channels are created by the server when starting up and even
 | 
			
		||||
	# persist when there are no more members left.
 | 
			
		||||
	# Persistent channels are marked with the mode 'P', which can be set
 | 
			
		||||
	# and unset by IRC operators like other modes on the fly.
 | 
			
		||||
	# There may be more than one [Channel] block, one for each channel.
 | 
			
		||||
 | 
			
		||||
	#
 | 
			
		||||
	# Mit [Channel]-Bloecken werden "persistente Channels" definiert,
 | 
			
		||||
	# die nach dem Start des Servers automatisch erzeugt werden und auch
 | 
			
		||||
	# dann erhalten bleiben, wenn keine User mehr im Channel sind. Es
 | 
			
		||||
	# koennen mehrere solcher Bloecke hier konfiguriert werden.
 | 
			
		||||
	# Gekennzeichnet werden solche Channels mit dem Mode "P", der ganz
 | 
			
		||||
	# normal gesetzt und geloescht werden kann.
 | 
			
		||||
	#
 | 
			
		||||
 | 
			
		||||
	# Name des Channels
 | 
			
		||||
	# Name of the channel
 | 
			
		||||
	;Name = #TheName
 | 
			
		||||
 | 
			
		||||
	# Topic, das gesetzt werden soll
 | 
			
		||||
	;Topic = Ein tolles Topic
 | 
			
		||||
	# Topic for this channel
 | 
			
		||||
	;Topic = a great topic
 | 
			
		||||
 | 
			
		||||
	# Channel-Modes
 | 
			
		||||
	;Modes = tn
 | 
			
		||||
	# Initial channel modes
 | 
			
		||||
	;Modes = tnk
 | 
			
		||||
 | 
			
		||||
	# initial channel password (mode k)
 | 
			
		||||
	;Key = Secret
 | 
			
		||||
 | 
			
		||||
	# maximum users per channel (mode l)
 | 
			
		||||
	;MaxUsers = 23
 | 
			
		||||
 | 
			
		||||
[Channel]
 | 
			
		||||
	# More [Channel] sections, if you like ...
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								doc/src/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								doc/src/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
html
 | 
			
		||||
							
								
								
									
										153
									
								
								doc/src/Doxyfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										153
									
								
								doc/src/Doxyfile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,153 @@
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
# Copyright (c)2001-2005 Alexander Barton (alex@barton.de)
 | 
			
		||||
#
 | 
			
		||||
# This program is free software; you can redistribute it and/or modify
 | 
			
		||||
# it under the terms of the GNU General Public License as published by
 | 
			
		||||
# the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
# (at your option) any later version.
 | 
			
		||||
# Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
#
 | 
			
		||||
# $Id: Doxyfile,v 1.2 2005/07/23 00:48:38 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
# This file describes the settings to be used by the documentation system
 | 
			
		||||
# doxygen (www.doxygen.org) for ngIRCd.
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# Project related configuration options
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
 | 
			
		||||
# by quotes) that should identify the project.
 | 
			
		||||
 | 
			
		||||
PROJECT_NAME           = ngIRCd
 | 
			
		||||
 | 
			
		||||
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
 | 
			
		||||
# base path where the generated documentation will be put. 
 | 
			
		||||
# If a relative path is entered, it will be relative to the location 
 | 
			
		||||
# where doxygen was started. If left blank the current directory will be used.
 | 
			
		||||
 | 
			
		||||
OUTPUT_DIRECTORY       = .
 | 
			
		||||
 | 
			
		||||
# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
 | 
			
		||||
# can be used to strip a user-defined part of the path. Stripping is 
 | 
			
		||||
# only done if one of the specified strings matches the left-hand part of 
 | 
			
		||||
# the path. The tag can be used to show relative paths in the file list. 
 | 
			
		||||
# If left blank the directory from which doxygen is run is used as the 
 | 
			
		||||
# path to strip.
 | 
			
		||||
 | 
			
		||||
STRIP_FROM_PATH        = ../..
 | 
			
		||||
 | 
			
		||||
# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
 | 
			
		||||
# will interpret the first line (until the first dot) of a JavaDoc-style 
 | 
			
		||||
# comment as the brief description. If set to NO, the JavaDoc 
 | 
			
		||||
# comments will behave just like the Qt-style comments (thus requiring an 
 | 
			
		||||
# explicit @brief command for a brief description.
 | 
			
		||||
 | 
			
		||||
JAVADOC_AUTOBRIEF      = YES
 | 
			
		||||
 | 
			
		||||
# If the DETAILS_AT_TOP tag is set to YES then Doxygen 
 | 
			
		||||
# will output the detailed description near the top, like JavaDoc.
 | 
			
		||||
# If set to NO, the detailed description appears after the member 
 | 
			
		||||
# documentation.
 | 
			
		||||
 | 
			
		||||
DETAILS_AT_TOP         = NO
 | 
			
		||||
 | 
			
		||||
# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
 | 
			
		||||
# sources only. Doxygen will then generate output that is more tailored for C. 
 | 
			
		||||
# For instance, some of the names that are used will be different. The list 
 | 
			
		||||
# of all members will be omitted, etc.
 | 
			
		||||
 | 
			
		||||
OPTIMIZE_OUTPUT_FOR_C  = YES
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# Build related configuration options
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
 | 
			
		||||
# documentation are documented, even if no documentation was available. 
 | 
			
		||||
# Private class members and static file members will be hidden unless 
 | 
			
		||||
# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
 | 
			
		||||
 | 
			
		||||
EXTRACT_ALL            = YES
 | 
			
		||||
 | 
			
		||||
# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
 | 
			
		||||
# will be included in the documentation.
 | 
			
		||||
 | 
			
		||||
EXTRACT_PRIVATE        = YES
 | 
			
		||||
 | 
			
		||||
# If the EXTRACT_STATIC tag is set to YES all static members of a file 
 | 
			
		||||
# will be included in the documentation.
 | 
			
		||||
 | 
			
		||||
EXTRACT_STATIC         = YES
 | 
			
		||||
 | 
			
		||||
# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
 | 
			
		||||
# defined locally in source files will be included in the documentation. 
 | 
			
		||||
# If set to NO only classes defined in header files are included.
 | 
			
		||||
 | 
			
		||||
EXTRACT_LOCAL_CLASSES  = YES
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# configuration options related to the input files
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
# The INPUT tag can be used to specify the files and/or directories that
 | 
			
		||||
# contain documented source files. You may enter file names like "myfile.cpp"
 | 
			
		||||
# or directories like "/usr/src/myproject". Separate the files or directories 
 | 
			
		||||
# with spaces.
 | 
			
		||||
 | 
			
		||||
INPUT                  = ../../src
 | 
			
		||||
 | 
			
		||||
# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
 | 
			
		||||
# should be searched for input files as well. Possible values are YES and NO. 
 | 
			
		||||
# If left blank NO is used.
 | 
			
		||||
 | 
			
		||||
RECURSIVE              = YES
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# configuration options related to source browsing
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
 | 
			
		||||
# be generated. Documented entities will be cross-referenced with these sources. 
 | 
			
		||||
# Note: To get rid of all source code in the generated output, make sure also 
 | 
			
		||||
# VERBATIM_HEADERS is set to NO.
 | 
			
		||||
 | 
			
		||||
SOURCE_BROWSER         = YES
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# Output formats
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
GENERATE_HTML          = YES
 | 
			
		||||
 | 
			
		||||
HTML_OUTPUT            = html
 | 
			
		||||
HTML_FILE_EXTENSION    = .html
 | 
			
		||||
HTML_HEADER            = header.inc.html
 | 
			
		||||
HTML_FOOTER            = footer.inc.html
 | 
			
		||||
HTML_STYLESHEET        = ngircd-doc.css
 | 
			
		||||
 | 
			
		||||
GENERATE_HTMLHELP      = NO
 | 
			
		||||
GENERATE_LATEX         = NO
 | 
			
		||||
GENERATE_RTF           = NO
 | 
			
		||||
GENERATE_MAN           = NO
 | 
			
		||||
GENERATE_XML           = NO
 | 
			
		||||
GENERATE_AUTOGEN_DEF   = NO
 | 
			
		||||
GENERATE_PERLMOD       = NO
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# Configuration options related to the preprocessor   
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
# The PREDEFINED tag can be used to specify one or more macro names that 
 | 
			
		||||
# are defined before the preprocessor is started (similar to the -D option of 
 | 
			
		||||
# gcc). The argument of the tag is a list of macros of the form: name 
 | 
			
		||||
# or name=definition (no spaces). If the definition and the = are 
 | 
			
		||||
# omitted =1 is assumed. To prevent a macro definition from being 
 | 
			
		||||
# undefined via #undef or recursively expanded use the := operator 
 | 
			
		||||
# instead of the = operator.
 | 
			
		||||
 | 
			
		||||
PREDEFINED             = CONN_MODULE __client_c__
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
							
								
								
									
										25
									
								
								doc/src/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								doc/src/Makefile.am
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
# Copyright (c)2001-2006 Alexander Barton (alex@barton.de)
 | 
			
		||||
#
 | 
			
		||||
# This program is free software; you can redistribute it and/or modify
 | 
			
		||||
# it under the terms of the GNU General Public License as published by
 | 
			
		||||
# the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
# (at your option) any later version.
 | 
			
		||||
# Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile.am,v 1.3 2006/12/28 14:04:28 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
maintainer-clean-local:
 | 
			
		||||
	rm -f Makefile Makefile.in
 | 
			
		||||
 | 
			
		||||
distclean-local:
 | 
			
		||||
	rm -rf html
 | 
			
		||||
 | 
			
		||||
srcdoc:
 | 
			
		||||
	@doxygen --version >/dev/null 2>&1 \
 | 
			
		||||
	  || ( echo; echo "Error: \"doxygen\" not found!"; echo; exit 1 )
 | 
			
		||||
	doxygen
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
							
								
								
									
										11
									
								
								doc/src/footer.inc.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								doc/src/footer.inc.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
 | 
			
		||||
<hr class="footer">
 | 
			
		||||
<p>
 | 
			
		||||
  ngIRCd
 | 
			
		||||
  <a href="http://ngircd.barton.de/">Homepage</a>,
 | 
			
		||||
  <a href="http://arthur.barton.de/cgi-bin/viewcvs.cgi/ngircd/">CVS-Repository</a>,
 | 
			
		||||
  <a href="http://ngircd.barton.de/bugzilla/index.cgi">Bug-Tracker</a>.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										10
									
								
								doc/src/header.inc.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								doc/src/header.inc.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 | 
			
		||||
<html lang="en">
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
  <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
 | 
			
		||||
  <title>ngIRCd Source Documentation</title>
 | 
			
		||||
  <link href="ngircd-doc.css" rel="stylesheet" type="text/css">
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										77
									
								
								doc/src/ngircd-doc.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								doc/src/ngircd-doc.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,77 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Cascading Style Sheet for the ngIRCd source documentation
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: ngircd-doc.css,v 1.2 2005/07/22 21:23:22 alex Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
BODY {
 | 
			
		||||
	background-color: white;
 | 
			
		||||
	color: black;
 | 
			
		||||
	margin: 30px;
 | 
			
		||||
	font-family: Geneva, sans-serif;
 | 
			
		||||
	font-size: 12px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
A:visited { color: purple; background: transparent; }
 | 
			
		||||
A:link { color: navy; background: transparent; }
 | 
			
		||||
A:active { color: red; background: transparent; }
 | 
			
		||||
A:hover { background: #ffa; }
 | 
			
		||||
 | 
			
		||||
H1, H2, H3 {
 | 
			
		||||
	font-family: Verdana, sans-serif;
 | 
			
		||||
	background-color: white;
 | 
			
		||||
	color: #005555;
 | 
			
		||||
}
 | 
			
		||||
H1 { margin-bottom: 10px; }
 | 
			
		||||
H2 {
 | 
			
		||||
	margin-top: 20px;
 | 
			
		||||
	margin-bottom: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
P, LI, TD, TH, DT {
 | 
			
		||||
	font-family: Geneva, sans-serif;
 | 
			
		||||
	font-size: 12px;
 | 
			
		||||
	line-height: 1.2
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DD { margin-bottom: 1em; }
 | 
			
		||||
 | 
			
		||||
UL { list-style-type: square; }
 | 
			
		||||
 | 
			
		||||
HR { margin: 2em 0px; }
 | 
			
		||||
 | 
			
		||||
BODY>TABLE { padding: 1em 0px; }
 | 
			
		||||
 | 
			
		||||
TD.mdRow {
 | 
			
		||||
	border: 1px dotted silver;
 | 
			
		||||
	background-color: #fff9dd;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TD.md { font-weight: bold; }
 | 
			
		||||
 | 
			
		||||
TD.memItemLeft { padding-top: 4px; }
 | 
			
		||||
TD.memItemRight { padding-top: 4px; }
 | 
			
		||||
TD.mdescRight { font-style: italic; }
 | 
			
		||||
 | 
			
		||||
DIV.qindex {
 | 
			
		||||
	background-color: #eee;
 | 
			
		||||
	border: 1px dotted silver;
 | 
			
		||||
	padding: 3px;
 | 
			
		||||
	margin-bottom: 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DIV.nav {
 | 
			
		||||
	margin: 1em 0px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
HR.footer { margin-top: 50px; }
 | 
			
		||||
 | 
			
		||||
.comment {
 | 
			
		||||
	color: gray;
 | 
			
		||||
	font-style: italic;
 | 
			
		||||
}
 | 
			
		||||
.preprocessor { color: #f90; }
 | 
			
		||||
.keyword, .keywordflow, .keywordtype { color: red; }
 | 
			
		||||
.stringliteral { color: green; }
 | 
			
		||||
 | 
			
		||||
/* -eof- */
 | 
			
		||||
							
								
								
									
										2
									
								
								man/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								man/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
			
		||||
ngircd.8
 | 
			
		||||
ngircd.conf.5
 | 
			
		||||
@@ -9,12 +9,25 @@
 | 
			
		||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
 | 
			
		||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile.am,v 1.5 2002/04/04 13:02:41 alex Exp $
 | 
			
		||||
# $Id: Makefile.am,v 1.6 2006/12/25 16:13:26 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
TEMPLATE_MANS = ngircd.conf.5.tmpl ngircd.8.tmpl
 | 
			
		||||
 | 
			
		||||
SUFFIXES = .tmpl .
 | 
			
		||||
 | 
			
		||||
.tmpl:
 | 
			
		||||
	sed \
 | 
			
		||||
	    -e s@:SBINDIR:@${sbindir}@ \
 | 
			
		||||
	    -e s@:BINDIR:@${bindir}@ \
 | 
			
		||||
	    -e s@:ETCDIR:@${sysconfdir}@ \
 | 
			
		||||
	    <$< >$@
 | 
			
		||||
 | 
			
		||||
man_MANS = ngircd.conf.5 ngircd.8
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST = $(man_MANS)
 | 
			
		||||
CLEANFILES = $(man_MANS)
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST = $(TEMPLATE_MANS)
 | 
			
		||||
 | 
			
		||||
maintainer-clean-local:
 | 
			
		||||
	rm -f Makefile Makefile.in
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										52
									
								
								man/ngircd.8
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								man/ngircd.8
									
									
									
									
									
								
							@@ -1,52 +0,0 @@
 | 
			
		||||
.\"
 | 
			
		||||
.\" $Id: ngircd.8,v 1.4 2002/09/16 11:11:21 alex Exp $
 | 
			
		||||
.\"
 | 
			
		||||
.TH ngircd 8 "September 2002" ngircd "ngIRCd Manual"
 | 
			
		||||
.SH NAME
 | 
			
		||||
ngircd \- the next generation IRC daemon
 | 
			
		||||
.SH SYNOPSIS
 | 
			
		||||
.B ngircd [
 | 
			
		||||
.I Options
 | 
			
		||||
.B ]
 | 
			
		||||
.SH DESCRIPTION
 | 
			
		||||
.B ngircd
 | 
			
		||||
is a portable IRC daemon written from scratch. It is easy to configure,
 | 
			
		||||
supports server links (even with original ircds) and runs on hosts with
 | 
			
		||||
changing IP addresses (such as dial-in networks). Currently supported
 | 
			
		||||
platforms (tested versions) are: AIX (3.2.5), A/UX (3.0.1), FreeBSD
 | 
			
		||||
(4.5), HP-UX (10.20), IRIX (6.5), Linux (2.x), Mac OS X (10.x), NetBSD
 | 
			
		||||
(1.5.2/i386, 1.5.3/m68k), Solaris (2.5.1, 2.6), and Windows with Cygwin.
 | 
			
		||||
.SH OPTIONS
 | 
			
		||||
.IP --configtest
 | 
			
		||||
read, validate and display configuration; then exit.
 | 
			
		||||
.IP "-f file, --config file"
 | 
			
		||||
use
 | 
			
		||||
.I file
 | 
			
		||||
as configuration file.
 | 
			
		||||
.IP "-n, --nodaemon"
 | 
			
		||||
don't fork and don't detatch from controlling terminal.
 | 
			
		||||
.IP "-p, --passive"
 | 
			
		||||
disable automatic connections to other servers.
 | 
			
		||||
.IP --version
 | 
			
		||||
output version information and exit.
 | 
			
		||||
.IP --help
 | 
			
		||||
display brief help text and exit.
 | 
			
		||||
.SH FILES
 | 
			
		||||
.I /usr/local/etc/ngircd.conf
 | 
			
		||||
.RS
 | 
			
		||||
The system wide default configuration file.
 | 
			
		||||
.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-
 | 
			
		||||
							
								
								
									
										81
									
								
								man/ngircd.8.tmpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								man/ngircd.8.tmpl
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,81 @@
 | 
			
		||||
.\"
 | 
			
		||||
.\" $Id: ngircd.8.tmpl,v 1.2 2007/11/15 01:03:29 fw Exp $
 | 
			
		||||
.\"
 | 
			
		||||
.TH ngircd 8 "May 2008" 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. By default, ngIRCd writes diagnostic and informational messages using
 | 
			
		||||
the syslog mechanism.
 | 
			
		||||
.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\-V\fR, \fB\-\-version\fR
 | 
			
		||||
Output version information and exit.
 | 
			
		||||
.TP
 | 
			
		||||
\fB\-h\fR, \fB\-\-help\fR
 | 
			
		||||
Display a brief help text and exit.
 | 
			
		||||
.SH FILES
 | 
			
		||||
.I :ETCDIR:/ngircd.conf
 | 
			
		||||
.RS
 | 
			
		||||
The system wide default configuration file.
 | 
			
		||||
.RE
 | 
			
		||||
.I :ETCDIR:/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://ngircd.barton.de/
 | 
			
		||||
http://ngircd.barton.de/
 | 
			
		||||
.UE
 | 
			
		||||
.SH "SEE ALSO"
 | 
			
		||||
.BR ngircd.conf (5),
 | 
			
		||||
.BR ircd (8)
 | 
			
		||||
.\"
 | 
			
		||||
.\" -eof-
 | 
			
		||||
@@ -1,26 +0,0 @@
 | 
			
		||||
.\"
 | 
			
		||||
.\" $Id: ngircd.conf.5,v 1.6 2002/09/16 11:11:21 alex Exp $
 | 
			
		||||
.\"
 | 
			
		||||
.TH ngircd.conf 5 "September 2002" ngircd "ngIRCd Manual"
 | 
			
		||||
.SH NAME
 | 
			
		||||
ngircd.conf \- configuration file of ngircd
 | 
			
		||||
.SH SYNOPSIS
 | 
			
		||||
.B /usr/local/etc/ngircd.conf
 | 
			
		||||
.SH DESCRIPTION
 | 
			
		||||
(coming soon, please have a look at the sample configuration
 | 
			
		||||
file "doc/sample-ngircd.conf" -- Thank you!)
 | 
			
		||||
.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)
 | 
			
		||||
.BR ircd (8)
 | 
			
		||||
.\"
 | 
			
		||||
.\" -eof-
 | 
			
		||||
							
								
								
									
										298
									
								
								man/ngircd.conf.5.tmpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										298
									
								
								man/ngircd.conf.5.tmpl
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,298 @@
 | 
			
		||||
.\"
 | 
			
		||||
.\" $Id: ngircd.conf.5.tmpl,v 1.7 2007/11/23 16:26:03 fw Exp $
 | 
			
		||||
.\"
 | 
			
		||||
.TH ngircd.conf 5 "May 2008" ngircd "ngIRCd Manual"
 | 
			
		||||
.SH NAME
 | 
			
		||||
ngircd.conf \- configuration file of ngIRCd
 | 
			
		||||
.SH SYNOPSIS
 | 
			
		||||
.B :ETCDIR:/ngircd.conf
 | 
			
		||||
.SH DESCRIPTION
 | 
			
		||||
.BR ngircd.conf
 | 
			
		||||
is the configuration file of the
 | 
			
		||||
.BR ngircd (8)
 | 
			
		||||
Internet Relay Chat (IRC) daemon which you should adept to your local
 | 
			
		||||
preferences and needs.
 | 
			
		||||
.SH "FILE FORMAT"
 | 
			
		||||
The file consists of sections and parameters. A section begins with the name
 | 
			
		||||
of the section in square brackets and continues until the next section
 | 
			
		||||
begins.
 | 
			
		||||
.PP
 | 
			
		||||
Sections contain parameters of the form
 | 
			
		||||
.PP
 | 
			
		||||
.RS
 | 
			
		||||
.I name
 | 
			
		||||
=
 | 
			
		||||
.I value
 | 
			
		||||
.RE
 | 
			
		||||
.PP
 | 
			
		||||
Empty lines and any line beginning with a semicolon (';') or a hash ('#')
 | 
			
		||||
character are treated as a comment and will be ignored. Leading and trailing
 | 
			
		||||
whitespaces are trimmed before any processing takes place.
 | 
			
		||||
.PP
 | 
			
		||||
The file format is line-based - that means, each non-empty 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
 | 
			
		||||
The main configuration of the server is stored in the
 | 
			
		||||
.I [Global]
 | 
			
		||||
section, like the server name, administrative information 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, must contain at least one dot (".").
 | 
			
		||||
.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
 | 
			
		||||
A comma seperated list of IP address on which the server should listen.
 | 
			
		||||
If unset, the defaults value is "0.0.0.0", or, if ngircd was compiled
 | 
			
		||||
with IPv6 support, "::,0.0.0.0", so the server listens on all configured
 | 
			
		||||
IP addresses and interfaces by default.
 | 
			
		||||
.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 which can be handy if the
 | 
			
		||||
daemon should run inside a chroot directory.
 | 
			
		||||
.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
 | 
			
		||||
\fBPredefChannelsOnly\fR
 | 
			
		||||
If enabled, no new channels can be created. Useful if
 | 
			
		||||
you do not want to have channels other than those defined in
 | 
			
		||||
the config file.
 | 
			
		||||
Default: No.
 | 
			
		||||
.TP
 | 
			
		||||
\fBNoDNS\fR
 | 
			
		||||
If enabled, ngircd will not make DNS lookups when clients connect.
 | 
			
		||||
If you configure ngircd to connect to other servers, ngircd may still
 | 
			
		||||
perform a DNS lookup if required.
 | 
			
		||||
Default: No.
 | 
			
		||||
.TP
 | 
			
		||||
\fBConnectIPv4\fR
 | 
			
		||||
Set this to no if you do not want ngircd to connect to other irc servers using ipv4.
 | 
			
		||||
This allows use of ngircd in ipv6-only setups.
 | 
			
		||||
Default: Yes.
 | 
			
		||||
.TP
 | 
			
		||||
\fBConnectIPv6\fR
 | 
			
		||||
Set this to no if you do not want ngircd to connect to other irc servers using ipv6.
 | 
			
		||||
Default: Yes.
 | 
			
		||||
.TP
 | 
			
		||||
\fBMaxConnections\fR
 | 
			
		||||
Maximum number of simultaneous connection the server is allowed to accept
 | 
			
		||||
(0: unlimited). Default: 0.
 | 
			
		||||
.TP
 | 
			
		||||
\fBMaxConnectionsIP\fR
 | 
			
		||||
Maximum number of simultaneous connections from a single IP address that
 | 
			
		||||
the server will accept (0: unlimited). This configuration options lowers
 | 
			
		||||
the 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.
 | 
			
		||||
.TP
 | 
			
		||||
\fBMaxNickLength\fR
 | 
			
		||||
Maximum length of an user nick name (Default: 9, as in RFC 2812). Please
 | 
			
		||||
note that all servers in an IRC network MUST use the same maximum nick name
 | 
			
		||||
length!
 | 
			
		||||
.SH [OPERATOR]
 | 
			
		||||
.I [Operator]
 | 
			
		||||
sections are used to define IRC Operators. There may be more than one
 | 
			
		||||
.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 (active);
 | 
			
		||||
if not, it waits for the other server to connect (passive).
 | 
			
		||||
.PP
 | 
			
		||||
ngIRCd supports "server groups": You can assign an "ID" to every server
 | 
			
		||||
with which you want this ngIRCd to link, and the daemon ensures that at
 | 
			
		||||
any given time only one direct link exists to servers with the same ID.
 | 
			
		||||
So if a server of a group won't answer, ngIRCd tries to connect to the next
 | 
			
		||||
server in the given group (="with the same ID"), but never tries to connect
 | 
			
		||||
to more than one server of this group simultaneously.
 | 
			
		||||
.PP
 | 
			
		||||
There may be more than one
 | 
			
		||||
.I [Server]
 | 
			
		||||
block.
 | 
			
		||||
.TP
 | 
			
		||||
\fBName\fR
 | 
			
		||||
IRC name of the remote server.
 | 
			
		||||
.TP
 | 
			
		||||
\fBHost\fR
 | 
			
		||||
Internet host name (or IP address) of the peer.
 | 
			
		||||
.TP
 | 
			
		||||
\fBBind\fR
 | 
			
		||||
IP address to use as source IP for the outgoing connection. Default ist
 | 
			
		||||
to let the operating system decide.
 | 
			
		||||
.TP
 | 
			
		||||
\fBPort\fR
 | 
			
		||||
Port of the remote server to which ngIRCd should connect (active).
 | 
			
		||||
If no port is assigned to a configured server, the daemon only waits for
 | 
			
		||||
incoming connections (passive).
 | 
			
		||||
.TP
 | 
			
		||||
\fBMyPassword\fR
 | 
			
		||||
Own password for this connection. This password has to be configured as
 | 
			
		||||
"PeerPassword" on the other server. Must not have ':' as first character.
 | 
			
		||||
.TP
 | 
			
		||||
\fBPeerPassword\fR
 | 
			
		||||
Foreign password for this connection. This password has to be configured as
 | 
			
		||||
"MyPassword" on the other server.
 | 
			
		||||
.TP
 | 
			
		||||
\fBGroup\fR
 | 
			
		||||
Group of this server (optional).
 | 
			
		||||
.TP
 | 
			
		||||
\fBPassive\fR
 | 
			
		||||
Disable automatic connection even if port value is specified. Default: false.
 | 
			
		||||
You can use the IRC Operator command CONNECT later on to create the link.
 | 
			
		||||
.SH [CHANNEL]
 | 
			
		||||
Pre-defined channels can be configured in
 | 
			
		||||
.I [Channel]
 | 
			
		||||
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, including channel prefix ("#").
 | 
			
		||||
.TP
 | 
			
		||||
\fBTopic\fR
 | 
			
		||||
Topic for this channel.
 | 
			
		||||
.TP
 | 
			
		||||
\fBModes\fR
 | 
			
		||||
Initial channel modes.
 | 
			
		||||
.TP
 | 
			
		||||
\fBKey\fR
 | 
			
		||||
Sets initial channel key (only relevant if mode k is set).
 | 
			
		||||
.TP
 | 
			
		||||
\fBMaxUsers\fR
 | 
			
		||||
Set maximum user limit for this channel (only relevant if mode l is set).
 | 
			
		||||
.SH HINTS
 | 
			
		||||
It's wise to use "ngircd --configtest" to validate the configuration file
 | 
			
		||||
after changing it. See
 | 
			
		||||
.BR ngircd (8)
 | 
			
		||||
for details.
 | 
			
		||||
.SH AUTHOR
 | 
			
		||||
Alexander Barton,
 | 
			
		||||
.UR mailto:alex@barton.de
 | 
			
		||||
alex@barton.de
 | 
			
		||||
.UE
 | 
			
		||||
.br
 | 
			
		||||
Homepage:
 | 
			
		||||
.UR http://ngircd.barton.de/
 | 
			
		||||
http://ngircd.barton.de/
 | 
			
		||||
.UE
 | 
			
		||||
.SH "SEE ALSO"
 | 
			
		||||
.BR ngircd (8)
 | 
			
		||||
.\"
 | 
			
		||||
.\" -eof-
 | 
			
		||||
							
								
								
									
										3
									
								
								src/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								src/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
config.h
 | 
			
		||||
config.h.in
 | 
			
		||||
stamp-h1
 | 
			
		||||
@@ -2,17 +2,16 @@
 | 
			
		||||
# 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.4 2002/09/09 10:00:15 alex Exp $
 | 
			
		||||
# $Id: Makefile.am,v 1.8 2008/02/26 22:04:15 fw Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
SUBDIRS = portab ngircd testsuite
 | 
			
		||||
SUBDIRS = portab tool ipaddr ngircd testsuite
 | 
			
		||||
 | 
			
		||||
maintainer-clean-local:
 | 
			
		||||
	rm -f Makefile Makefile.in config.h config.h.in stamp-h.in
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								src/ipaddr/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/ipaddr/Makefile.am
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
AUTOMAKE_OPTIONS = ansi2knr
 | 
			
		||||
 | 
			
		||||
INCLUDES = -I$(srcdir)/../portab
 | 
			
		||||
 | 
			
		||||
noinst_LIBRARIES = libngipaddr.a
 | 
			
		||||
 | 
			
		||||
libngipaddr_a_SOURCES = ng_ipaddr.c
 | 
			
		||||
 | 
			
		||||
noinst_HEADERS = ng_ipaddr.h
 | 
			
		||||
 | 
			
		||||
maintainer-clean-local:
 | 
			
		||||
	rm -f Makefile Makefile.in
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
							
								
								
									
										167
									
								
								src/ipaddr/ng_ipaddr.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										167
									
								
								src/ipaddr/ng_ipaddr.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,167 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Functions for AF_ agnostic ipv4/ipv6 handling.
 | 
			
		||||
 *
 | 
			
		||||
 * (c) 2008 Florian Westphal <fw@strlen.de>, public domain.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_GETADDRINFO
 | 
			
		||||
#include <netdb.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "ng_ipaddr.h"
 | 
			
		||||
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
ng_ipaddr_init(ng_ipaddr_t *addr, const char *ip_str, UINT16 port)
 | 
			
		||||
{
 | 
			
		||||
#ifdef HAVE_GETADDRINFO
 | 
			
		||||
	int ret;
 | 
			
		||||
	char portstr[64];
 | 
			
		||||
	struct addrinfo *res0;
 | 
			
		||||
	struct addrinfo hints;
 | 
			
		||||
 | 
			
		||||
	assert(ip_str);
 | 
			
		||||
 | 
			
		||||
	memset(&hints, 0, sizeof(hints));
 | 
			
		||||
	hints.ai_flags = AI_NUMERICHOST;
 | 
			
		||||
 | 
			
		||||
	/* some getaddrinfo implementations require that ai_socktype is set. */
 | 
			
		||||
	hints.ai_socktype = SOCK_STREAM;
 | 
			
		||||
 | 
			
		||||
	/* silly, but ngircd stores UINT16 in server config, not string */
 | 
			
		||||
	snprintf(portstr, sizeof(portstr), "%u", (unsigned int) port);
 | 
			
		||||
 | 
			
		||||
	ret = getaddrinfo(ip_str, portstr, &hints, &res0);
 | 
			
		||||
	assert(ret == 0);
 | 
			
		||||
	if (ret != 0)
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	assert(sizeof(*addr) >= res0->ai_addrlen);
 | 
			
		||||
	if (sizeof(*addr) >= res0->ai_addrlen)
 | 
			
		||||
		memcpy(addr, res0->ai_addr, res0->ai_addrlen);
 | 
			
		||||
	else
 | 
			
		||||
		ret = -1;
 | 
			
		||||
	freeaddrinfo(res0);
 | 
			
		||||
	return ret == 0;
 | 
			
		||||
#else /* HAVE_GETADDRINFO */
 | 
			
		||||
	assert(ip_str);
 | 
			
		||||
	addr->sin4.sin_family = AF_INET;
 | 
			
		||||
# ifdef HAVE_INET_ATON
 | 
			
		||||
	if (inet_aton(ip_str, &addr->sin4.sin_addr) == 0)
 | 
			
		||||
		return false;
 | 
			
		||||
# else
 | 
			
		||||
	addr->sin4.sin_addr.s_addr = inet_addr(ip_str);
 | 
			
		||||
	if (addr->sin4.sin_addr.s_addr == (unsigned) -1)
 | 
			
		||||
		return false;
 | 
			
		||||
# endif
 | 
			
		||||
	ng_ipaddr_setport(addr, port);
 | 
			
		||||
	return true;
 | 
			
		||||
#endif /* HAVE_GETADDRINFO */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL void
 | 
			
		||||
ng_ipaddr_setport(ng_ipaddr_t *a, UINT16 port)
 | 
			
		||||
{
 | 
			
		||||
#ifdef WANT_IPV6
 | 
			
		||||
	int af;
 | 
			
		||||
 | 
			
		||||
	assert(a != NULL);
 | 
			
		||||
 | 
			
		||||
	af = a->sa.sa_family;
 | 
			
		||||
 | 
			
		||||
	assert(af == AF_INET || af == AF_INET6);
 | 
			
		||||
 | 
			
		||||
	switch (af) {
 | 
			
		||||
	case AF_INET:
 | 
			
		||||
		a->sin4.sin_port = htons(port);
 | 
			
		||||
		break;
 | 
			
		||||
	case AF_INET6:
 | 
			
		||||
		a->sin6.sin6_port = htons(port);
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
#else /* WANT_IPV6 */
 | 
			
		||||
	assert(a != NULL);
 | 
			
		||||
	assert(a->sin4.sin_family == AF_INET);
 | 
			
		||||
	a->sin4.sin_port = htons(port);
 | 
			
		||||
#endif /* WANT_IPV6 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
ng_ipaddr_ipequal(const ng_ipaddr_t *a, const ng_ipaddr_t *b)
 | 
			
		||||
{
 | 
			
		||||
	assert(a != NULL);
 | 
			
		||||
	assert(b != NULL);
 | 
			
		||||
#ifdef WANT_IPV6
 | 
			
		||||
	if (a->sa.sa_family != b->sa.sa_family)
 | 
			
		||||
		return false;
 | 
			
		||||
	assert(ng_ipaddr_salen(a) == ng_ipaddr_salen(b));
 | 
			
		||||
	switch (a->sa.sa_family) {
 | 
			
		||||
	case AF_INET6:
 | 
			
		||||
		return IN6_ARE_ADDR_EQUAL(&a->sin6.sin6_addr, &b->sin6.sin6_addr);
 | 
			
		||||
	case AF_INET:
 | 
			
		||||
		return memcmp(&a->sin4.sin_addr, &b->sin4.sin_addr, sizeof(a->sin4.sin_addr)) == 0;
 | 
			
		||||
	}
 | 
			
		||||
	return false;
 | 
			
		||||
#else
 | 
			
		||||
	assert(a->sin4.sin_family == AF_INET);
 | 
			
		||||
	assert(b->sin4.sin_family == AF_INET);
 | 
			
		||||
	return memcmp(&a->sin4.sin_addr, &b->sin4.sin_addr, sizeof(a->sin4.sin_addr)) == 0;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef WANT_IPV6
 | 
			
		||||
GLOBAL const char *
 | 
			
		||||
ng_ipaddr_tostr(const ng_ipaddr_t *addr)
 | 
			
		||||
{
 | 
			
		||||
	static char strbuf[NG_INET_ADDRSTRLEN];
 | 
			
		||||
 | 
			
		||||
	strbuf[0] = 0;
 | 
			
		||||
 | 
			
		||||
	ng_ipaddr_tostr_r(addr, strbuf);
 | 
			
		||||
	return strbuf;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* str must be at least NG_INET_ADDRSTRLEN bytes long */
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
ng_ipaddr_tostr_r(const ng_ipaddr_t *addr, char *str)
 | 
			
		||||
{
 | 
			
		||||
#ifdef HAVE_GETNAMEINFO
 | 
			
		||||
	const struct sockaddr *sa = (const struct sockaddr *) addr;
 | 
			
		||||
	int ret;
 | 
			
		||||
 | 
			
		||||
	*str = 0;
 | 
			
		||||
 | 
			
		||||
	ret = getnameinfo(sa, ng_ipaddr_salen(addr),
 | 
			
		||||
			str, NG_INET_ADDRSTRLEN, NULL, 0, NI_NUMERICHOST);
 | 
			
		||||
	/*
 | 
			
		||||
	 * avoid leading ':'.
 | 
			
		||||
	 * causes mis-interpretation of client host in e.g. /WHOIS
 | 
			
		||||
	 */
 | 
			
		||||
	if (*str == ':') {
 | 
			
		||||
		char tmp[NG_INET_ADDRSTRLEN] = "0";
 | 
			
		||||
		ret = getnameinfo(sa, ng_ipaddr_salen(addr),
 | 
			
		||||
				tmp+1, sizeof(tmp) -1, NULL, 0, NI_NUMERICHOST);
 | 
			
		||||
		if (ret == 0)
 | 
			
		||||
			strlcpy(str, tmp, NG_INET_ADDRSTRLEN);
 | 
			
		||||
	}
 | 
			
		||||
	assert (ret == 0);
 | 
			
		||||
	return ret == 0;
 | 
			
		||||
#else
 | 
			
		||||
	abort(); /* WANT_IPV6 depends on HAVE_GETNAMEINFO */
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* WANT_IPV6 */
 | 
			
		||||
 | 
			
		||||
/* -eof- */
 | 
			
		||||
							
								
								
									
										117
									
								
								src/ipaddr/ng_ipaddr.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								src/ipaddr/ng_ipaddr.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,117 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Functions for AF_ agnostic ipv4/ipv6 handling.
 | 
			
		||||
 *
 | 
			
		||||
 * (c) 2008 Florian Westphal <fw@strlen.de>, public domain.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef NG_IPADDR_HDR
 | 
			
		||||
#define NG_IPADDR_HDR
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
#include <sys/socket.h>
 | 
			
		||||
#include <netinet/in.h>
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_ARPA_INET_H
 | 
			
		||||
# include <arpa/inet.h>
 | 
			
		||||
#else
 | 
			
		||||
# define PF_INET AF_INET
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef WANT_IPV6
 | 
			
		||||
#define NG_INET_ADDRSTRLEN	INET6_ADDRSTRLEN
 | 
			
		||||
#else
 | 
			
		||||
#define NG_INET_ADDRSTRLEN	16
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef WANT_IPV6
 | 
			
		||||
typedef union {
 | 
			
		||||
	struct sockaddr sa;
 | 
			
		||||
	struct sockaddr_in sin4;
 | 
			
		||||
	struct sockaddr_in6 sin6;
 | 
			
		||||
} ng_ipaddr_t;
 | 
			
		||||
#else
 | 
			
		||||
/* assume compiler can't deal with typedef struct {... */
 | 
			
		||||
struct NG_IP_ADDR_DONTUSE {
 | 
			
		||||
	struct sockaddr_in sin4;
 | 
			
		||||
};
 | 
			
		||||
typedef struct NG_IP_ADDR_DONTUSE ng_ipaddr_t;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static inline int
 | 
			
		||||
ng_ipaddr_af(const ng_ipaddr_t *a)
 | 
			
		||||
{
 | 
			
		||||
#ifdef WANT_IPV6
 | 
			
		||||
	return a->sa.sa_family;
 | 
			
		||||
#else
 | 
			
		||||
	assert(a->sin4.sin_family == 0 || a->sin4.sin_family == AF_INET);
 | 
			
		||||
	return a->sin4.sin_family;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static inline socklen_t
 | 
			
		||||
ng_ipaddr_salen(const ng_ipaddr_t *a)
 | 
			
		||||
{
 | 
			
		||||
#ifdef WANT_IPV6
 | 
			
		||||
	assert(a->sa.sa_family == AF_INET || a->sa.sa_family == AF_INET6);
 | 
			
		||||
	if (a->sa.sa_family == AF_INET6)
 | 
			
		||||
		return sizeof(a->sin6);
 | 
			
		||||
#endif
 | 
			
		||||
	assert(a->sin4.sin_family == AF_INET);
 | 
			
		||||
	return sizeof(a->sin4);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static inline UINT16
 | 
			
		||||
ng_ipaddr_getport(const ng_ipaddr_t *a)
 | 
			
		||||
{
 | 
			
		||||
#ifdef WANT_IPV6
 | 
			
		||||
	int af = a->sa.sa_family;
 | 
			
		||||
 | 
			
		||||
	assert(af == AF_INET || af == AF_INET6);
 | 
			
		||||
 | 
			
		||||
	if (af == AF_INET6)
 | 
			
		||||
		return ntohs(a->sin6.sin6_port);
 | 
			
		||||
#endif /* WANT_IPV6 */
 | 
			
		||||
	assert(a->sin4.sin_family == AF_INET);
 | 
			
		||||
	return ntohs(a->sin4.sin_port);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * init a ng_ipaddr_t object.
 | 
			
		||||
 * @param addr: pointer to ng_ipaddr_t to initialize.
 | 
			
		||||
 * @param ip_str: ip address in dotted-decimal (ipv4) or hexadecimal (ipv6) notation
 | 
			
		||||
 * @param port: transport layer port number to use.
 | 
			
		||||
 */
 | 
			
		||||
GLOBAL bool ng_ipaddr_init PARAMS((ng_ipaddr_t *addr, const char *ip_str, UINT16 port));
 | 
			
		||||
 | 
			
		||||
/* set sin4/sin6_port, depending on a->sa_family */
 | 
			
		||||
GLOBAL void ng_ipaddr_setport PARAMS((ng_ipaddr_t *a, UINT16 port));
 | 
			
		||||
 | 
			
		||||
/* return true if a and b have the same IP address. If a and b have different AF, return false. */
 | 
			
		||||
GLOBAL bool ng_ipaddr_ipequal PARAMS((const ng_ipaddr_t *a, const ng_ipaddr_t *b));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef WANT_IPV6
 | 
			
		||||
/* convert struct sockaddr to string, returns pointer to static buffer */
 | 
			
		||||
GLOBAL const char *ng_ipaddr_tostr PARAMS((const ng_ipaddr_t *addr));
 | 
			
		||||
 | 
			
		||||
/* convert struct sockaddr to string. dest must be NG_INET_ADDRSTRLEN bytes long */
 | 
			
		||||
GLOBAL bool ng_ipaddr_tostr_r PARAMS((const ng_ipaddr_t *addr, char *dest));
 | 
			
		||||
#else
 | 
			
		||||
static inline const char *
 | 
			
		||||
ng_ipaddr_tostr(const ng_ipaddr_t *addr) { return inet_ntoa(addr->sin4.sin_addr); }
 | 
			
		||||
 | 
			
		||||
static inline bool
 | 
			
		||||
ng_ipaddr_tostr_r(const ng_ipaddr_t *addr, char *d)
 | 
			
		||||
{
 | 
			
		||||
	strlcpy(d, inet_ntoa(addr->sin4.sin_addr), NG_INET_ADDRSTRLEN);
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* -eof- */
 | 
			
		||||
							
								
								
									
										5
									
								
								src/ngircd/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								src/ngircd/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
check-help
 | 
			
		||||
check-version
 | 
			
		||||
cvs-version.h
 | 
			
		||||
cvs-version.new
 | 
			
		||||
ngircd
 | 
			
		||||
@@ -1,37 +1,39 @@
 | 
			
		||||
#
 | 
			
		||||
# 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.27 2002/09/07 18:06:29 alex Exp $
 | 
			
		||||
# $Id: Makefile.am,v 1.51 2008/02/26 22:04:17 fw Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
AUTOMAKE_OPTIONS = ../portab/ansi2knr
 | 
			
		||||
 | 
			
		||||
INCLUDES = -I$(srcdir)/../portab
 | 
			
		||||
INCLUDES = -I$(srcdir)/../portab -I$(srcdir)/../tool -I$(srcdir)/../ipaddr
 | 
			
		||||
 | 
			
		||||
LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN
 | 
			
		||||
LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN \
 | 
			
		||||
 -varuse -retvalother -emptyret -unrecog
 | 
			
		||||
 | 
			
		||||
sbin_PROGRAMS = ngircd
 | 
			
		||||
 | 
			
		||||
ngircd_SOURCES = ngircd.c channel.c client.c conf.c conn.c hash.c irc.c \
 | 
			
		||||
	irc-channel.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 resolve.c tool.c
 | 
			
		||||
ngircd_SOURCES = ngircd.c array.c channel.c client.c conf.c conn.c conn-func.c \
 | 
			
		||||
	conn-zip.c hash.c io.c irc.c irc-channel.c irc-info.c irc-login.c \
 | 
			
		||||
	irc-mode.c irc-op.c irc-oper.c irc-server.c irc-write.c lists.c log.c \
 | 
			
		||||
	match.c numeric.c parse.c rendezvous.c resolve.c
 | 
			
		||||
 | 
			
		||||
ngircd_LDFLAGS = -L../portab
 | 
			
		||||
ngircd_LDFLAGS = -L../portab -L../tool -L../ipaddr
 | 
			
		||||
 | 
			
		||||
ngircd_LDADD = -lngportab
 | 
			
		||||
ngircd_LDADD = -lngportab -lngtool -lngipaddr
 | 
			
		||||
 | 
			
		||||
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-op.h irc-oper.h irc-server.h \
 | 
			
		||||
	irc-write.h lists.h log.h match.h parse.h resolve.h tool.h \
 | 
			
		||||
	messages.h defines.h
 | 
			
		||||
noinst_HEADERS = ngircd.h array.h channel.h client.h conf.h conn.h conn-func.h \
 | 
			
		||||
	conn-zip.h hash.h io.h irc.h irc-channel.h irc-info.h irc-login.h \
 | 
			
		||||
	irc-mode.h irc-op.h irc-oper.h irc-server.h irc-write.h lists.h log.h \
 | 
			
		||||
	match.h numeric.h parse.h rendezvous.h resolve.h \
 | 
			
		||||
	defines.h messages.h
 | 
			
		||||
 | 
			
		||||
clean-local:
 | 
			
		||||
	rm -f check-version check-help lint.out
 | 
			
		||||
@@ -41,24 +43,39 @@ maintainer-clean-local:
 | 
			
		||||
 | 
			
		||||
check-version: Makefile
 | 
			
		||||
	echo "#!/bin/sh" > check-version
 | 
			
		||||
	echo "./ngircd --version | grep ngircd > /dev/null 2>&1" >> check-version
 | 
			
		||||
	echo "./ngircd --version | grep ngircd >/dev/null 2>&1" >>check-version
 | 
			
		||||
	chmod 755 check-version
 | 
			
		||||
 | 
			
		||||
check-help: Makefile
 | 
			
		||||
	echo "#!/bin/sh" > check-help
 | 
			
		||||
	echo "./ngircd --help | grep help > /dev/null 2>&1" >> check-help
 | 
			
		||||
	echo "./ngircd --help | grep help >/dev/null 2>&1" >>check-help
 | 
			
		||||
	chmod 755 check-help
 | 
			
		||||
 | 
			
		||||
lint:
 | 
			
		||||
	rm -f lint.out
 | 
			
		||||
	@splint --version >/dev/null 2>&1 \
 | 
			
		||||
	 || ( echo; echo "Error: \"splint\" not found!"; echo; exit 1 )
 | 
			
		||||
	@echo; warnings=0; files=0; \
 | 
			
		||||
	for f in *.c; do \
 | 
			
		||||
	 echo "checking $$f ..."; \
 | 
			
		||||
	 splint $$f $(LINTARGS) -I./.. -I./../portab $(AM_CFLAGS) > lint.out 2>&1; \
 | 
			
		||||
	 splint $$f $(LINTARGS) -I$(srcdir) -I$(srcdir)/.. \
 | 
			
		||||
	  $(INCLUDES) $(AM_CFLAGS) >lint.out 2>&1; \
 | 
			
		||||
	 grep "no warnings" lint.out > /dev/null 2>&1; \
 | 
			
		||||
	 if [ $$? -ne 0 ]; then \
 | 
			
		||||
	  echo; cat lint.out; echo; \
 | 
			
		||||
	  waswarning=1; \
 | 
			
		||||
	  echo; grep -v "^Command Line: " lint.out; echo; \
 | 
			
		||||
	  w=$$( grep "code warning" lint.out | $(AWK) "{ print \$$4 }" ); \
 | 
			
		||||
	  [ "$$w" -gt 0 ] && warnings=`expr $$warnings + $$w`; \
 | 
			
		||||
	  files=`expr $$files + 1`; \
 | 
			
		||||
	 else \
 | 
			
		||||
	  waswarning=0; \
 | 
			
		||||
	 fi; \
 | 
			
		||||
	done;
 | 
			
		||||
	 rm -f lint.out; \
 | 
			
		||||
	done; \
 | 
			
		||||
	[ $$waswarning -eq 0 ] && echo; \
 | 
			
		||||
	[ $$warnings -gt 0 ] \
 | 
			
		||||
	 && echo "Result: $$warnings warning(s) in $$files file(s)!" \
 | 
			
		||||
	 || echo "Result: no warnings found."; \
 | 
			
		||||
	echo; [ $$warnings -gt 0 ] && exit 1
 | 
			
		||||
 | 
			
		||||
TESTS = check-version check-help
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										345
									
								
								src/ngircd/array.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										345
									
								
								src/ngircd/array.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,345 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * functions to dynamically allocate arrays.
 | 
			
		||||
 * Copyright (c) 2005 Florian Westphal (westphal@foo.fh-furtwangen.de)
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "array.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: array.c,v 1.15 2007/11/18 15:05:35 alex Exp $";
 | 
			
		||||
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include "log.h"
 | 
			
		||||
 | 
			
		||||
/* Enable more Debug messages in alloc / append / memmove code. */
 | 
			
		||||
/* #define DEBUG_ARRAY */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define array_UNUSABLE(x)	( !(x)->mem || (0 == (x)->allocated) )
 | 
			
		||||
 | 
			
		||||
#define ALIGN_32U(x)            (((x)+(unsigned)31  ) & ~((unsigned)31))
 | 
			
		||||
#define ALIGN_1024U(x)          (((x)+(unsigned)1023) & ~((unsigned)1023))
 | 
			
		||||
#define ALIGN_4096U(x)          (((x)+(unsigned)4095) & ~((unsigned)4095))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static bool
 | 
			
		||||
safemult_sizet(size_t a, size_t b, size_t *res)
 | 
			
		||||
{
 | 
			
		||||
	size_t tmp = a * b;
 | 
			
		||||
 | 
			
		||||
	if (b && (tmp / b != a))
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	*res = tmp;
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
array_init(array *a)
 | 
			
		||||
{
 | 
			
		||||
	assert(a != NULL);
 | 
			
		||||
	a->mem = NULL;
 | 
			
		||||
	a->allocated = 0;
 | 
			
		||||
	a->used = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* if realloc() fails, array_alloc return NULL. otherwise return pointer to elem pos in array */
 | 
			
		||||
void *
 | 
			
		||||
array_alloc(array * a, size_t size, size_t pos)
 | 
			
		||||
{
 | 
			
		||||
	size_t alloc, pos_plus1 = pos + 1;
 | 
			
		||||
	size_t aligned = 0;
 | 
			
		||||
	char *tmp;
 | 
			
		||||
 | 
			
		||||
	assert(size > 0);
 | 
			
		||||
 | 
			
		||||
	if (pos_plus1 == 0 || !safemult_sizet(size, pos_plus1, &alloc))
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	if (a->allocated < alloc) {
 | 
			
		||||
		if (alloc < 128) {
 | 
			
		||||
			aligned = ALIGN_32U(alloc);
 | 
			
		||||
		} else {
 | 
			
		||||
			if (alloc < 4096) {
 | 
			
		||||
				aligned = ALIGN_1024U(alloc);
 | 
			
		||||
			} else {
 | 
			
		||||
				aligned = ALIGN_4096U(alloc);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
#ifdef DEBUG_ARRAY
 | 
			
		||||
		Log(LOG_DEBUG, "array_alloc(): rounded %u to %u bytes.", alloc, aligned);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
		assert(aligned >= alloc);
 | 
			
		||||
 | 
			
		||||
		if (aligned < alloc)	/* rounding overflow */
 | 
			
		||||
			return NULL;
 | 
			
		||||
 | 
			
		||||
		alloc = aligned;
 | 
			
		||||
#ifdef DEBUG_ARRAY
 | 
			
		||||
		Log(LOG_DEBUG, "array_alloc(): changing size from %u to %u bytes.",
 | 
			
		||||
		    a->allocated, aligned);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
		tmp = realloc(a->mem, alloc);
 | 
			
		||||
		if (!tmp)
 | 
			
		||||
			return NULL;
 | 
			
		||||
 | 
			
		||||
		a->mem = tmp;
 | 
			
		||||
		a->allocated = alloc;
 | 
			
		||||
 | 
			
		||||
		assert(a->allocated > a->used);
 | 
			
		||||
 | 
			
		||||
		memset(a->mem + a->used, 0, a->allocated - a->used);
 | 
			
		||||
 | 
			
		||||
		a->used = alloc;
 | 
			
		||||
	}
 | 
			
		||||
	return a->mem + (pos * size);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*return number of initialized ELEMS in a. */
 | 
			
		||||
size_t
 | 
			
		||||
array_length(const array * const a, size_t membersize)
 | 
			
		||||
{
 | 
			
		||||
	assert(a != NULL);
 | 
			
		||||
	assert(membersize > 0);
 | 
			
		||||
 | 
			
		||||
	if (array_UNUSABLE(a))
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	return membersize ? a->used / membersize : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* copy array src to array dest */
 | 
			
		||||
bool
 | 
			
		||||
array_copy(array * dest, const array * const src)
 | 
			
		||||
{
 | 
			
		||||
	if (array_UNUSABLE(src))
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	return array_copyb(dest, src->mem, src->used);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* return false on failure (realloc failure, invalid src/dest array) */
 | 
			
		||||
bool
 | 
			
		||||
array_copyb(array * dest, const char *src, size_t len)
 | 
			
		||||
{
 | 
			
		||||
	assert(dest != NULL);
 | 
			
		||||
	assert(src != NULL );
 | 
			
		||||
 | 
			
		||||
	if (!src || !dest)
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	array_trunc(dest);
 | 
			
		||||
	return array_catb(dest, src, len);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* copy string to dest */
 | 
			
		||||
bool
 | 
			
		||||
array_copys(array * dest, const char *src)
 | 
			
		||||
{
 | 
			
		||||
	return array_copyb(dest, src, strlen(src));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* append len bytes from src to the array dest.
 | 
			
		||||
return false if we could not append all bytes (realloc failure, invalid src/dest array) */
 | 
			
		||||
bool
 | 
			
		||||
array_catb(array * dest, const char *src, size_t len)
 | 
			
		||||
{
 | 
			
		||||
	size_t tmp;
 | 
			
		||||
	size_t used;
 | 
			
		||||
	char *ptr;
 | 
			
		||||
 | 
			
		||||
	assert(dest != NULL);
 | 
			
		||||
	assert(src != NULL);
 | 
			
		||||
 | 
			
		||||
	if (!len)
 | 
			
		||||
		return true;
 | 
			
		||||
 | 
			
		||||
	if (!src || !dest)
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	used = dest->used;
 | 
			
		||||
	tmp = used + len;
 | 
			
		||||
 | 
			
		||||
	if (tmp < used || tmp < len)	/* integer overflow */
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	if (!array_alloc(dest, 1, tmp))
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	ptr = dest->mem;
 | 
			
		||||
 | 
			
		||||
	assert(ptr != NULL);
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG_ARRAY
 | 
			
		||||
	Log(LOG_DEBUG,
 | 
			
		||||
	    "array_catb(): appending %u bytes to array (now %u bytes in array).",
 | 
			
		||||
	    len, tmp);
 | 
			
		||||
#endif
 | 
			
		||||
	memcpy(ptr + used, src, len);
 | 
			
		||||
	dest->used = tmp;
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* append string to dest */
 | 
			
		||||
bool
 | 
			
		||||
array_cats(array * dest, const char *src)
 | 
			
		||||
{
 | 
			
		||||
	return array_catb(dest, src, strlen(src));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* append trailing NUL byte to array */
 | 
			
		||||
bool
 | 
			
		||||
array_cat0(array * a)
 | 
			
		||||
{
 | 
			
		||||
	return array_catb(a, "", 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* append trailing NUL byte to array, but do not count it. */
 | 
			
		||||
bool
 | 
			
		||||
array_cat0_temporary(array * a)
 | 
			
		||||
{
 | 
			
		||||
	char *endpos = array_alloc(a, 1, array_bytes(a));
 | 
			
		||||
	if (!endpos)
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	*endpos = '\0';
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* add contents of array src to array dest. */
 | 
			
		||||
bool
 | 
			
		||||
array_cat(array * dest, const array * const src)
 | 
			
		||||
{
 | 
			
		||||
	if (array_UNUSABLE(src))
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	return array_catb(dest, src->mem, src->used);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* return pointer to the element at pos.
 | 
			
		||||
   return NULL if the array is unallocated, or if pos is larger than
 | 
			
		||||
   the number of elements stored int the array. */
 | 
			
		||||
void *
 | 
			
		||||
array_get(array * a, size_t membersize, size_t pos)
 | 
			
		||||
{
 | 
			
		||||
	size_t totalsize;
 | 
			
		||||
	size_t posplus1 = pos + 1;
 | 
			
		||||
 | 
			
		||||
	assert(membersize > 0);
 | 
			
		||||
	assert(a != NULL);
 | 
			
		||||
 | 
			
		||||
	if (!posplus1 || array_UNUSABLE(a))
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	if (!safemult_sizet(posplus1, membersize, &totalsize))
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	if (a->allocated < totalsize)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	totalsize = pos * membersize;
 | 
			
		||||
	return a->mem + totalsize;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
array_free(array * a)
 | 
			
		||||
{
 | 
			
		||||
	assert(a != NULL);
 | 
			
		||||
#ifdef DEBUG_ARRAY
 | 
			
		||||
	Log(LOG_DEBUG,
 | 
			
		||||
	    "array_free(): %u bytes free'd (%u bytes still used at time of free()).",
 | 
			
		||||
	    a->allocated, a->used);
 | 
			
		||||
#endif
 | 
			
		||||
	free(a->mem);
 | 
			
		||||
	a->mem = NULL;
 | 
			
		||||
	a->allocated = 0;
 | 
			
		||||
	a->used = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void *
 | 
			
		||||
array_start(const array * const a)
 | 
			
		||||
{
 | 
			
		||||
	assert(a != NULL);
 | 
			
		||||
	return a->mem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
array_trunc(array * a)
 | 
			
		||||
{
 | 
			
		||||
	assert(a != NULL);
 | 
			
		||||
	a->used = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
array_truncate(array * a, size_t membersize, size_t len)
 | 
			
		||||
{
 | 
			
		||||
	size_t newlen;
 | 
			
		||||
	assert(a != NULL);
 | 
			
		||||
	if (!safemult_sizet(membersize, len, &newlen))
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	if (newlen <= a->allocated)
 | 
			
		||||
		a->used = newlen;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* move elements starting at pos to beginning of array */
 | 
			
		||||
void
 | 
			
		||||
array_moveleft(array * a, size_t membersize, size_t pos)
 | 
			
		||||
{
 | 
			
		||||
	size_t bytepos;
 | 
			
		||||
 | 
			
		||||
	assert(a != NULL);
 | 
			
		||||
	assert(membersize > 0);
 | 
			
		||||
 | 
			
		||||
	if (!safemult_sizet(membersize, pos, &bytepos)) {
 | 
			
		||||
		a->used = 0;
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!bytepos)
 | 
			
		||||
		return;	/* nothing to do */
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG_ARRAY
 | 
			
		||||
	Log(LOG_DEBUG,
 | 
			
		||||
	    "array_moveleft(): %u bytes used in array, starting at position %u.",
 | 
			
		||||
	    a->used, bytepos);
 | 
			
		||||
#endif
 | 
			
		||||
	if (a->used <= bytepos) {
 | 
			
		||||
		a->used = 0;
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	a->used -= bytepos;
 | 
			
		||||
	memmove(a->mem, a->mem + bytepos, a->used);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* -eof- */
 | 
			
		||||
							
								
								
									
										101
									
								
								src/ngircd/array.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								src/ngircd/array.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,101 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * libarray - dynamically allocate arrays.
 | 
			
		||||
 * Copyright (c) 2005 Florian Westphal (westphal@foo.fh-furtwangen.de)
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: array.h,v 1.4 2005/08/30 13:36:32 fw Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef array_h_included
 | 
			
		||||
#define array_h_included
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
	char * mem;
 | 
			
		||||
	size_t allocated;
 | 
			
		||||
	size_t used;
 | 
			
		||||
} array;
 | 
			
		||||
 | 
			
		||||
/* allocated: mem != NULL, used >= 0 && used <= allocated, allocated > 0
 | 
			
		||||
   unallocated: mem == NULL, allocated == 0, used == 0 */
 | 
			
		||||
 | 
			
		||||
#define array_unallocated(x)	(array_bytes(x)==0)
 | 
			
		||||
#define INIT_ARRAY		{ NULL, 0, 0 }
 | 
			
		||||
 | 
			
		||||
/* set all variables in a to 0 */
 | 
			
		||||
extern void array_init PARAMS((array *a));
 | 
			
		||||
 | 
			
		||||
/* allocates space for at least nmemb+1 elements of size bytes each.
 | 
			
		||||
   return pointer to elem at pos, or NULL if realloc() fails */
 | 
			
		||||
extern void * array_alloc PARAMS((array *a, size_t size, size_t pos));
 | 
			
		||||
 | 
			
		||||
/* returns the number of initialized BYTES in a. */
 | 
			
		||||
#define array_bytes(array)	( (array)->used )
 | 
			
		||||
 | 
			
		||||
/* returns the number of initialized ELEMS in a. */
 | 
			
		||||
extern size_t array_length PARAMS((const array* const a, size_t elemsize));
 | 
			
		||||
 | 
			
		||||
/* _copy functions: copy src to dest.
 | 
			
		||||
   return true if OK, else false (e. g. realloc failure, invalid src/dest
 | 
			
		||||
   array, ...). In that case dest is left unchanged. */
 | 
			
		||||
 | 
			
		||||
/* copy array src to dest */
 | 
			
		||||
extern bool array_copy PARAMS((array* dest, const array* const src));
 | 
			
		||||
 | 
			
		||||
/* copy len bytes from src to array dest. */
 | 
			
		||||
extern bool array_copyb PARAMS((array* dest, const char* src, size_t len));
 | 
			
		||||
 | 
			
		||||
/* copy string to dest */
 | 
			
		||||
extern bool array_copys PARAMS((array* dest, const char* src));
 | 
			
		||||
 | 
			
		||||
/* _cat functions: append src to dest.
 | 
			
		||||
   return true if OK, else false (e. g. realloc failure, invalid src/dest
 | 
			
		||||
   array, ...). In that case dest is left unchanged. */
 | 
			
		||||
 | 
			
		||||
/* append len bytes from src to array dest. */
 | 
			
		||||
extern bool array_catb PARAMS((array* dest, const char* src, size_t len));
 | 
			
		||||
 | 
			
		||||
/* append string to dest */
 | 
			
		||||
extern bool array_cats PARAMS((array* dest, const char* src));
 | 
			
		||||
 | 
			
		||||
/* append NUL byte to dest */
 | 
			
		||||
extern bool array_cat0 PARAMS((array* dest));
 | 
			
		||||
 | 
			
		||||
/* append NUL byte to dest, but do not count null byte */
 | 
			
		||||
extern bool array_cat0_temporary PARAMS((array* dest));
 | 
			
		||||
 | 
			
		||||
/* append contents of array src to array dest. */
 | 
			
		||||
extern bool array_cat PARAMS((array* dest, const array* const src));
 | 
			
		||||
 | 
			
		||||
/* return pointer to element at pos.
 | 
			
		||||
   return NULL if the array is unallocated or if pos is larger than the number
 | 
			
		||||
   of elements stored int the array. */
 | 
			
		||||
extern void* array_get PARAMS((array* a, size_t membersize, size_t pos));
 | 
			
		||||
 | 
			
		||||
/* free the contents of this array. */
 | 
			
		||||
extern void array_free PARAMS((array* a));
 | 
			
		||||
 | 
			
		||||
/* overwrite array with zeroes before free */
 | 
			
		||||
extern void array_free_wipe PARAMS((array* a));
 | 
			
		||||
 | 
			
		||||
/* return pointer to first element in this array */
 | 
			
		||||
extern void* array_start PARAMS((const array* const a));
 | 
			
		||||
 | 
			
		||||
/* reset this array (the memory is not free'd */
 | 
			
		||||
extern void array_trunc PARAMS((array* a));
 | 
			
		||||
 | 
			
		||||
/* set number of used elements in this array to len */
 | 
			
		||||
extern void array_truncate PARAMS((array* a, size_t membersize, size_t len));
 | 
			
		||||
 | 
			
		||||
/* move elements starting at pos to beginning of array */
 | 
			
		||||
extern void array_moveleft PARAMS((array* a, size_t membersize, size_t pos));
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* -eof- */
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -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: channel.h,v 1.21 2002/09/03 23:57:57 alex Exp $
 | 
			
		||||
 * $Id: channel.h,v 1.35 2008/02/05 16:31:35 fw Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * channel.h: Management der Channels (Header)
 | 
			
		||||
 * Channel management (header)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -21,15 +20,25 @@
 | 
			
		||||
 | 
			
		||||
#if defined(__channel_c__) | defined(S_SPLINT_S)
 | 
			
		||||
 | 
			
		||||
#include "lists.h"
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "array.h"
 | 
			
		||||
 | 
			
		||||
typedef struct _CHANNEL
 | 
			
		||||
{
 | 
			
		||||
	struct _CHANNEL *next;
 | 
			
		||||
	CHAR name[CHANNEL_NAME_LEN];	/* Name 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 */
 | 
			
		||||
	array topic;			/* Topic of the channel */
 | 
			
		||||
#ifndef STRICT_RFC
 | 
			
		||||
	time_t topic_time;		/* Time when topic was set */
 | 
			
		||||
	char topic_who[CLIENT_NICK_LEN];/* Nickname of user that set topic */
 | 
			
		||||
#endif
 | 
			
		||||
	char key[CLIENT_PASS_LEN];	/* Channel key ("password", mode "k" ) */
 | 
			
		||||
	unsigned long maxusers;		/* Maximum number of members (mode "l") */
 | 
			
		||||
	struct list_head list_bans;	/* list head of banned users */
 | 
			
		||||
	struct list_head list_invites;	/* list head of invited users */
 | 
			
		||||
} CHANNEL;
 | 
			
		||||
 | 
			
		||||
typedef struct _CLIENT2CHAN
 | 
			
		||||
@@ -37,7 +46,7 @@ typedef struct _CLIENT2CHAN
 | 
			
		||||
	struct _CLIENT2CHAN *next;
 | 
			
		||||
	CLIENT *client;
 | 
			
		||||
	CHANNEL *channel;
 | 
			
		||||
	CHAR modes[CHANNEL_MODE_LEN];	/* User-Modes in dem Channel */
 | 
			
		||||
	char modes[CHANNEL_MODE_LEN];	/* User-Modes in dem Channel */
 | 
			
		||||
} CL2CHAN;
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
@@ -47,58 +56,73 @@ typedef POINTER CL2CHAN;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
GLOBAL struct list_head *Channel_GetListBans PARAMS((CHANNEL *c));
 | 
			
		||||
GLOBAL struct list_head *Channel_GetListInvites PARAMS((CHANNEL *c));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Channel_Init PARAMS((VOID ));
 | 
			
		||||
GLOBAL VOID Channel_InitPredefined PARAMS(( VOID ));
 | 
			
		||||
GLOBAL VOID Channel_Exit PARAMS((VOID ));
 | 
			
		||||
GLOBAL void Channel_Init PARAMS(( void ));
 | 
			
		||||
GLOBAL void Channel_InitPredefined PARAMS((  void ));
 | 
			
		||||
GLOBAL void Channel_Exit PARAMS(( void ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Channel_Join PARAMS((CLIENT *Client, CHAR *Name ));
 | 
			
		||||
GLOBAL BOOLEAN Channel_Part PARAMS((CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason ));
 | 
			
		||||
GLOBAL bool Channel_Join PARAMS(( CLIENT *Client, char *Name ));
 | 
			
		||||
GLOBAL bool Channel_Part PARAMS(( CLIENT *Client, CLIENT *Origin, const char *Name, const char *Reason ));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Channel_Quit PARAMS((CLIENT *Client, CHAR *Reason ));
 | 
			
		||||
GLOBAL void Channel_Quit PARAMS(( CLIENT *Client, char *Reason ));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Channel_Kick PARAMS(( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason ));
 | 
			
		||||
GLOBAL void Channel_Kick PARAMS((  CLIENT *Client, CLIENT *Origin, char *Name, char *Reason ));
 | 
			
		||||
 | 
			
		||||
GLOBAL INT Channel_Count PARAMS((VOID ));
 | 
			
		||||
GLOBAL INT Channel_MemberCount PARAMS((CHANNEL *Chan ));
 | 
			
		||||
GLOBAL unsigned long Channel_Count PARAMS(( void ));
 | 
			
		||||
GLOBAL unsigned long Channel_MemberCount PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
GLOBAL int Channel_CountForUser PARAMS(( CLIENT *Client ));
 | 
			
		||||
 | 
			
		||||
GLOBAL CHAR *Channel_Name PARAMS((CHANNEL *Chan ));
 | 
			
		||||
GLOBAL CHAR *Channel_Modes PARAMS((CHANNEL *Chan ));
 | 
			
		||||
GLOBAL CHAR *Channel_Topic PARAMS((CHANNEL *Chan ));
 | 
			
		||||
GLOBAL const char *Channel_Name PARAMS(( const CHANNEL *Chan ));
 | 
			
		||||
GLOBAL char *Channel_Modes PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
GLOBAL char *Channel_Topic PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
GLOBAL char *Channel_Key PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
GLOBAL unsigned long Channel_MaxUsers PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Channel_SetTopic PARAMS((CHANNEL *Chan, CHAR *Topic ));
 | 
			
		||||
GLOBAL VOID Channel_SetModes PARAMS((CHANNEL *Chan, CHAR *Modes ));
 | 
			
		||||
GLOBAL void Channel_SetTopic PARAMS(( CHANNEL *Chan, CLIENT *Client, char *Topic ));
 | 
			
		||||
GLOBAL void Channel_SetModes PARAMS(( CHANNEL *Chan, char *Modes ));
 | 
			
		||||
GLOBAL void Channel_SetKey PARAMS(( CHANNEL *Chan, char *Key ));
 | 
			
		||||
GLOBAL void Channel_SetMaxUsers PARAMS(( CHANNEL *Chan, unsigned long Count ));
 | 
			
		||||
 | 
			
		||||
GLOBAL CHANNEL *Channel_Search PARAMS((CHAR *Name ));
 | 
			
		||||
GLOBAL CHANNEL *Channel_Search PARAMS(( const char *Name ));
 | 
			
		||||
 | 
			
		||||
GLOBAL CHANNEL *Channel_First PARAMS((VOID ));
 | 
			
		||||
GLOBAL CHANNEL *Channel_Next PARAMS((CHANNEL *Chan ));
 | 
			
		||||
GLOBAL CHANNEL *Channel_First PARAMS(( void ));
 | 
			
		||||
GLOBAL CHANNEL *Channel_Next PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
 | 
			
		||||
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 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 CLIENT *Channel_GetClient PARAMS((CL2CHAN *Cl2Chan ));
 | 
			
		||||
GLOBAL CHANNEL *Channel_GetChannel PARAMS((CL2CHAN *Cl2Chan ));
 | 
			
		||||
GLOBAL CLIENT *Channel_GetClient PARAMS(( CL2CHAN *Cl2Chan ));
 | 
			
		||||
GLOBAL CHANNEL *Channel_GetChannel PARAMS(( CL2CHAN *Cl2Chan ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Channel_IsValidName PARAMS((CHAR *Name ));
 | 
			
		||||
GLOBAL bool Channel_IsValidName PARAMS(( const char *Name ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Channel_ModeAdd PARAMS((CHANNEL *Chan, CHAR Mode ));
 | 
			
		||||
GLOBAL BOOLEAN Channel_ModeDel PARAMS((CHANNEL *Chan, CHAR Mode ));
 | 
			
		||||
GLOBAL bool Channel_ModeAdd PARAMS(( CHANNEL *Chan, char Mode ));
 | 
			
		||||
GLOBAL bool Channel_ModeDel PARAMS(( CHANNEL *Chan, char Mode ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Channel_UserModeAdd PARAMS((CHANNEL *Chan, CLIENT *Client, CHAR Mode ));
 | 
			
		||||
GLOBAL BOOLEAN Channel_UserModeDel PARAMS((CHANNEL *Chan, CLIENT *Client, CHAR Mode ));
 | 
			
		||||
GLOBAL CHAR *Channel_UserModes PARAMS((CHANNEL *Chan, CLIENT *Client ));
 | 
			
		||||
GLOBAL bool Channel_UserModeAdd PARAMS(( CHANNEL *Chan, CLIENT *Client, char Mode ));
 | 
			
		||||
GLOBAL bool Channel_UserModeDel PARAMS(( CHANNEL *Chan, CLIENT *Client, char Mode ));
 | 
			
		||||
GLOBAL char *Channel_UserModes PARAMS(( CHANNEL *Chan, CLIENT *Client ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Channel_IsMemberOf PARAMS((CHANNEL *Chan, CLIENT *Client ));
 | 
			
		||||
GLOBAL bool Channel_IsMemberOf PARAMS(( CHANNEL *Chan, CLIENT *Client ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Channel_Write PARAMS((CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR *Text ));
 | 
			
		||||
 | 
			
		||||
GLOBAL CHANNEL *Channel_Create PARAMS((CHAR *Name ));
 | 
			
		||||
GLOBAL bool Channel_Write PARAMS(( CHANNEL *Chan, CLIENT *From, CLIENT *Client, const char *Text ));
 | 
			
		||||
GLOBAL bool Channel_Notice PARAMS(( CHANNEL *Chan, CLIENT *From, CLIENT *Client, const char *Text));
 | 
			
		||||
 | 
			
		||||
GLOBAL CHANNEL *Channel_Create PARAMS(( char *Name ));
 | 
			
		||||
 | 
			
		||||
#ifndef STRICT_RFC
 | 
			
		||||
GLOBAL unsigned int Channel_TopicTime PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
GLOBAL char *Channel_TopicWho PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
GLOBAL bool Channel_AddInvite PARAMS((CHANNEL *c, const char *Mask, bool OnlyOnce ));
 | 
			
		||||
GLOBAL bool Channel_AddBan PARAMS((CHANNEL *c, const char *Mask ));
 | 
			
		||||
 | 
			
		||||
GLOBAL bool Channel_ShowBans PARAMS((CLIENT *client, CHANNEL *c));
 | 
			
		||||
GLOBAL bool Channel_ShowInvites PARAMS((CLIENT *client, CHANNEL *c));
 | 
			
		||||
#endif
 | 
			
		||||
/* -eof- */
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -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: client.h,v 1.29 2002/09/03 18:54:31 alex Exp $
 | 
			
		||||
 * $Id: client.h,v 1.46 2007/01/23 16:07:19 alex Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * client.h: Konfiguration des ngircd (Header)
 | 
			
		||||
 * Client management (header)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -19,42 +18,40 @@
 | 
			
		||||
#define __client_h__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
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_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_SERVER 32		/* client is a server */
 | 
			
		||||
#define CLIENT_SERVICE 64		/* client is a service */
 | 
			
		||||
#define CLIENT_UNKNOWNSERVER 128	/* unregistered server connection */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#if defined(__client_c__) | defined(S_SPLINT_S)
 | 
			
		||||
#define CLIENT_TYPE int
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
 | 
			
		||||
#if defined(__client_c__) | defined(S_SPLINT_S)
 | 
			
		||||
 | 
			
		||||
typedef struct _CLIENT
 | 
			
		||||
{
 | 
			
		||||
	CHAR id[CLIENT_ID_LEN];		/* Nick (User) 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 */
 | 
			
		||||
	CHAR flags[CLIENT_FLAGS_LEN];	/* Flags des Client (aktuell nur bei Servern) */
 | 
			
		||||
	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
 | 
			
		||||
@@ -64,76 +61,93 @@ typedef POINTER CLIENT;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Client_Init PARAMS((VOID ));
 | 
			
		||||
GLOBAL VOID Client_Exit PARAMS((VOID ));
 | 
			
		||||
typedef struct _WHOWAS
 | 
			
		||||
{
 | 
			
		||||
	time_t time;			/* time stamp of entry or 0 if unused */
 | 
			
		||||
	char id[CLIENT_NICK_LEN];	/* client nick name */
 | 
			
		||||
	char host[CLIENT_HOST_LEN];	/* hostname of the client */
 | 
			
		||||
	char user[CLIENT_USER_LEN];	/* user name ("login") */
 | 
			
		||||
	char info[CLIENT_INFO_LEN];	/* long user name */
 | 
			
		||||
	char server[CLIENT_HOST_LEN];	/* server name */
 | 
			
		||||
} WHOWAS;
 | 
			
		||||
 | 
			
		||||
GLOBAL CLIENT *Client_NewLocal PARAMS((CONN_ID Idx, CHAR *Hostname, INT Type, BOOLEAN Idented ));
 | 
			
		||||
GLOBAL CLIENT *Client_NewRemoteServer PARAMS((CLIENT *Introducer, CHAR *Hostname, CLIENT *TopServer, INT Hops, INT Token, CHAR *Info, BOOLEAN Idented ));
 | 
			
		||||
GLOBAL CLIENT *Client_NewRemoteUser PARAMS((CLIENT *Introducer, CHAR *Nick, INT Hops, CHAR *User, CHAR *Hostname, INT Token, CHAR *Modes, CHAR *Info, BOOLEAN Idented ));
 | 
			
		||||
GLOBAL CLIENT *Client_New PARAMS((CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, INT Type, CHAR *ID, CHAR *User, CHAR *Hostname, CHAR *Info, INT Hops, INT Token, CHAR *Modes, BOOLEAN Idented ));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Client_Destroy PARAMS((CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN SendQuit ));
 | 
			
		||||
GLOBAL void Client_Init PARAMS(( void ));
 | 
			
		||||
GLOBAL void Client_Exit PARAMS(( void ));
 | 
			
		||||
 | 
			
		||||
GLOBAL CLIENT *Client_ThisServer PARAMS((VOID ));
 | 
			
		||||
GLOBAL CLIENT *Client_NewLocal PARAMS(( CONN_ID Idx, char *Hostname, int Type, bool Idented ));
 | 
			
		||||
GLOBAL CLIENT *Client_NewRemoteServer PARAMS(( CLIENT *Introducer, char *Hostname, CLIENT *TopServer, int Hops, int Token, char *Info, bool Idented ));
 | 
			
		||||
GLOBAL CLIENT *Client_NewRemoteUser PARAMS(( CLIENT *Introducer, char *Nick, int Hops, char *User, char *Hostname, int Token, char *Modes, char *Info, bool Idented ));
 | 
			
		||||
 | 
			
		||||
GLOBAL CLIENT *Client_GetFromConn PARAMS((CONN_ID Idx ));
 | 
			
		||||
GLOBAL CLIENT *Client_GetFromToken PARAMS((CLIENT *Client, INT Token ));
 | 
			
		||||
GLOBAL void Client_Destroy PARAMS(( CLIENT *Client, char *LogMsg, char *FwdMsg, bool SendQuit ));
 | 
			
		||||
 | 
			
		||||
GLOBAL CLIENT *Client_Search PARAMS((CHAR *ID ));
 | 
			
		||||
GLOBAL CLIENT *Client_First PARAMS((VOID ));
 | 
			
		||||
GLOBAL CLIENT *Client_Next PARAMS((CLIENT *c ));
 | 
			
		||||
GLOBAL CLIENT *Client_ThisServer PARAMS(( void ));
 | 
			
		||||
 | 
			
		||||
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 BOOLEAN Client_OperByMe PARAMS((CLIENT *Client ));
 | 
			
		||||
GLOBAL INT Client_Hops PARAMS((CLIENT *Client ));
 | 
			
		||||
GLOBAL INT Client_Token PARAMS((CLIENT *Client ));
 | 
			
		||||
GLOBAL INT Client_MyToken PARAMS((CLIENT *Client ));
 | 
			
		||||
GLOBAL CLIENT *Client_TopServer PARAMS((CLIENT *Client ));
 | 
			
		||||
GLOBAL CLIENT *Client_NextHop PARAMS((CLIENT *Client ));
 | 
			
		||||
GLOBAL CHAR *Client_Away PARAMS((CLIENT *Client ));
 | 
			
		||||
GLOBAL CLIENT *Client_GetFromToken PARAMS(( CLIENT *Client, int Token ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Client_HasMode PARAMS((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 PARAMS((CLIENT *Client, CHAR *Hostname ));
 | 
			
		||||
GLOBAL VOID Client_SetID PARAMS((CLIENT *Client, CHAR *Nick ));
 | 
			
		||||
GLOBAL VOID Client_SetUser PARAMS((CLIENT *Client, CHAR *User, BOOLEAN Idented ));
 | 
			
		||||
GLOBAL VOID Client_SetInfo PARAMS((CLIENT *Client, CHAR *Info ));
 | 
			
		||||
GLOBAL VOID Client_SetPassword PARAMS((CLIENT *Client, CHAR *Pwd ));
 | 
			
		||||
GLOBAL VOID Client_SetType PARAMS((CLIENT *Client, INT Type ));
 | 
			
		||||
GLOBAL VOID Client_SetHops PARAMS((CLIENT *Client, INT Hops ));
 | 
			
		||||
GLOBAL VOID Client_SetToken PARAMS((CLIENT *Client, INT Token ));
 | 
			
		||||
GLOBAL VOID Client_SetOperByMe PARAMS((CLIENT *Client, BOOLEAN OperByMe ));
 | 
			
		||||
GLOBAL VOID Client_SetModes PARAMS((CLIENT *Client, CHAR *Modes ));
 | 
			
		||||
GLOBAL VOID Client_SetFlags PARAMS((CLIENT *Client, CHAR *Flags ));
 | 
			
		||||
GLOBAL VOID Client_SetIntroducer PARAMS((CLIENT *Client, CLIENT *Introducer ));
 | 
			
		||||
GLOBAL VOID Client_SetAway PARAMS((CLIENT *Client, CHAR *Txt ));
 | 
			
		||||
GLOBAL 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 PARAMS((CLIENT *Client, CHAR Mode ));
 | 
			
		||||
GLOBAL BOOLEAN Client_ModeDel PARAMS((CLIENT *Client, CHAR Mode ));
 | 
			
		||||
GLOBAL bool Client_HasMode PARAMS(( CLIENT *Client, char Mode ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Client_CheckNick PARAMS((CLIENT *Client, CHAR *Nick ));
 | 
			
		||||
GLOBAL BOOLEAN Client_CheckID PARAMS((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 PARAMS((VOID ));
 | 
			
		||||
GLOBAL INT Client_ServiceCount PARAMS((VOID ));
 | 
			
		||||
GLOBAL INT Client_ServerCount PARAMS((VOID ));
 | 
			
		||||
GLOBAL INT Client_OperCount PARAMS((VOID ));
 | 
			
		||||
GLOBAL INT Client_UnknownCount PARAMS((VOID ));
 | 
			
		||||
GLOBAL INT Client_MyUserCount PARAMS((VOID ));
 | 
			
		||||
GLOBAL INT Client_MyServiceCount PARAMS((VOID ));
 | 
			
		||||
GLOBAL INT Client_MyServerCount PARAMS((VOID ));
 | 
			
		||||
GLOBAL bool Client_ModeAdd PARAMS(( CLIENT *Client, char Mode ));
 | 
			
		||||
GLOBAL bool Client_ModeDel PARAMS(( CLIENT *Client, char Mode ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Client_IsValidNick PARAMS((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 unsigned long Client_OperCount PARAMS(( void ));
 | 
			
		||||
GLOBAL unsigned long Client_UnknownCount PARAMS(( void ));
 | 
			
		||||
GLOBAL long Client_MyUserCount PARAMS(( void ));
 | 
			
		||||
GLOBAL long Client_MyServiceCount PARAMS(( void ));
 | 
			
		||||
GLOBAL unsigned long Client_MyServerCount PARAMS(( void ));
 | 
			
		||||
GLOBAL long Client_MaxUserCount PARAMS((  void ));
 | 
			
		||||
GLOBAL long Client_MyMaxUserCount PARAMS((  void ));
 | 
			
		||||
 | 
			
		||||
GLOBAL bool Client_IsValidNick PARAMS(( const char *Nick ));
 | 
			
		||||
 | 
			
		||||
GLOBAL WHOWAS *Client_GetWhowas PARAMS(( void ));
 | 
			
		||||
GLOBAL int Client_GetLastWhowasIndex PARAMS(( void ));
 | 
			
		||||
 | 
			
		||||
GLOBAL void Client_RegisterWhowas PARAMS(( CLIENT *Client ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1377
									
								
								src/ngircd/conf.c
									
									
									
									
									
								
							
							
						
						
									
										1377
									
								
								src/ngircd/conf.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: conf.h,v 1.19 2002/09/16 09:13:40 alex Exp $
 | 
			
		||||
 * $Id: conf.h,v 1.49 2008/03/18 20:12:47 fw Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * conf.h: Konfiguration des ngircd (Header)
 | 
			
		||||
 * Configuration management (header)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -21,83 +20,148 @@
 | 
			
		||||
#include <time.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
 | 
			
		||||
#include "array.h"
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
#include "tool.h"
 | 
			
		||||
#include "ng_ipaddr.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 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 */
 | 
			
		||||
	ng_ipaddr_t bind_addr;		/* source address to use for outgoing connections */
 | 
			
		||||
	ng_ipaddr_t dst_addr[2];	/* list of addresses to connect to */
 | 
			
		||||
} CONF_SERVER;
 | 
			
		||||
 | 
			
		||||
typedef struct _Conf_Channel
 | 
			
		||||
{
 | 
			
		||||
	CHAR name[CHANNEL_NAME_LEN];	/* Name des Channel */
 | 
			
		||||
	CHAR modes[CHANNEL_MODE_LEN];	/* Channel-Modes */
 | 
			
		||||
	CHAR topic[CHANNEL_TOPIC_LEN];	/* Topic des Channels */
 | 
			
		||||
	char name[CHANNEL_NAME_LEN];	/* Name of the channel */
 | 
			
		||||
	char modes[CHANNEL_MODE_LEN];	/* Initial channel modes */
 | 
			
		||||
	char key[CLIENT_PASS_LEN];      /* Channel key ("password", mode "k" ) */
 | 
			
		||||
	unsigned long maxusers;		/* maximum usercount for this channel, mode "l" */
 | 
			
		||||
	array topic;			/* Initial topic */
 | 
			
		||||
} CONF_CHANNEL;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Name ("Nick") des Servers */
 | 
			
		||||
GLOBAL CHAR Conf_ServerName[CLIENT_ID_LEN];
 | 
			
		||||
#define CONF_SFLAG_ONCE	1		/* Delete this entry after next disconnect */
 | 
			
		||||
#define CONF_SFLAG_DISABLED 2		/* This server configuration entry is disabled */
 | 
			
		||||
 | 
			
		||||
/* Server-Info-Text */
 | 
			
		||||
GLOBAL CHAR Conf_ServerInfo[CLIENT_INFO_LEN];
 | 
			
		||||
 | 
			
		||||
/* Server-Passwort */
 | 
			
		||||
GLOBAL CHAR Conf_ServerPwd[CLIENT_PASS_LEN];
 | 
			
		||||
/* Name ("Nick") of the servers */
 | 
			
		||||
GLOBAL char Conf_ServerName[CLIENT_ID_LEN];
 | 
			
		||||
 | 
			
		||||
/* Admin-Info-Texte */
 | 
			
		||||
GLOBAL CHAR Conf_ServerAdmin1[CLIENT_INFO_LEN];
 | 
			
		||||
GLOBAL CHAR Conf_ServerAdmin2[CLIENT_INFO_LEN];
 | 
			
		||||
GLOBAL CHAR Conf_ServerAdminMail[CLIENT_INFO_LEN];
 | 
			
		||||
/* Server info text */
 | 
			
		||||
GLOBAL char Conf_ServerInfo[CLIENT_INFO_LEN];
 | 
			
		||||
 | 
			
		||||
/* Datei mit MOTD-Text */
 | 
			
		||||
GLOBAL CHAR Conf_MotdFile[FNAME_LEN];
 | 
			
		||||
/* Global server passwort */
 | 
			
		||||
GLOBAL char Conf_ServerPwd[CLIENT_PASS_LEN];
 | 
			
		||||
 | 
			
		||||
/* Ports, auf denen der Server Verbindungen entgegen nimmt */
 | 
			
		||||
GLOBAL UINT Conf_ListenPorts[MAX_LISTEN_PORTS];
 | 
			
		||||
GLOBAL INT Conf_ListenPorts_Count;
 | 
			
		||||
/* Administrative information */
 | 
			
		||||
GLOBAL char Conf_ServerAdmin1[CLIENT_INFO_LEN];
 | 
			
		||||
GLOBAL char Conf_ServerAdmin2[CLIENT_INFO_LEN];
 | 
			
		||||
GLOBAL char Conf_ServerAdminMail[CLIENT_INFO_LEN];
 | 
			
		||||
 | 
			
		||||
/* User- und Group-ID, zu denen der Daemon wechseln soll */
 | 
			
		||||
GLOBAL UINT Conf_UID;
 | 
			
		||||
GLOBAL UINT Conf_GID;
 | 
			
		||||
/* File with MOTD text */
 | 
			
		||||
GLOBAL char Conf_MotdFile[FNAME_LEN];
 | 
			
		||||
 | 
			
		||||
/* Timeouts fuer PING und PONG */
 | 
			
		||||
GLOBAL INT Conf_PingTimeout;
 | 
			
		||||
GLOBAL INT Conf_PongTimeout;
 | 
			
		||||
/* Phrase with MOTD text */
 | 
			
		||||
GLOBAL char Conf_MotdPhrase[LINE_LEN];
 | 
			
		||||
 | 
			
		||||
/* Sekunden zwischen Verbindungsversuchen zu anderen Servern */
 | 
			
		||||
GLOBAL INT Conf_ConnectRetry;
 | 
			
		||||
/* Ports the server should listen on */
 | 
			
		||||
GLOBAL array Conf_ListenPorts;
 | 
			
		||||
 | 
			
		||||
/* Operatoren */
 | 
			
		||||
/* Address to which the socket should be bound or empty (=all) */
 | 
			
		||||
GLOBAL char *Conf_ListenAddress;
 | 
			
		||||
 | 
			
		||||
/* User and group ID the server should run with */
 | 
			
		||||
GLOBAL uid_t Conf_UID;
 | 
			
		||||
GLOBAL gid_t 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 unsigned int Conf_Oper_Count;
 | 
			
		||||
 | 
			
		||||
/* Server */
 | 
			
		||||
/* Servers */
 | 
			
		||||
GLOBAL CONF_SERVER Conf_Server[MAX_SERVERS];
 | 
			
		||||
GLOBAL INT Conf_Server_Count;
 | 
			
		||||
 | 
			
		||||
/* Vorkonfigurierte Channels */
 | 
			
		||||
/* Pre-defined channels */
 | 
			
		||||
GLOBAL CONF_CHANNEL Conf_Channel[MAX_DEFCHANNELS];
 | 
			
		||||
GLOBAL INT Conf_Channel_Count;
 | 
			
		||||
GLOBAL unsigned int Conf_Channel_Count;
 | 
			
		||||
/* Pre-defined channels only */
 | 
			
		||||
GLOBAL bool Conf_PredefChannelsOnly;
 | 
			
		||||
 | 
			
		||||
/* Koennen IRC OPs immer Modes setzen? */
 | 
			
		||||
GLOBAL BOOLEAN Conf_OperCanMode;
 | 
			
		||||
/* Are IRC operators allowed to always use MODE? */
 | 
			
		||||
GLOBAL bool Conf_OperCanMode;
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Conf_Init PARAMS((VOID ));
 | 
			
		||||
GLOBAL INT Conf_Test PARAMS((VOID ));
 | 
			
		||||
/* Disable all DNS functions? */
 | 
			
		||||
GLOBAL bool Conf_NoDNS;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * try to connect to remote systems using the ipv6 protocol,
 | 
			
		||||
 * if they have an ipv6 address? (default yes)
 | 
			
		||||
 */
 | 
			
		||||
GLOBAL bool Conf_ConnectIPv6;
 | 
			
		||||
 | 
			
		||||
/* same as above, but for ipv4 hosts, default: yes  */
 | 
			
		||||
GLOBAL bool Conf_ConnectIPv4;
 | 
			
		||||
 | 
			
		||||
/* If an IRC op gives chanop privileges without being a chanop,
 | 
			
		||||
 * ircd2 will ignore the command. This enables a workaround:
 | 
			
		||||
 * It masks the command as coming from the server */
 | 
			
		||||
GLOBAL bool Conf_OperServerMode;
 | 
			
		||||
 | 
			
		||||
/* Maximum number of connections to this server */
 | 
			
		||||
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;
 | 
			
		||||
 | 
			
		||||
/* Maximum length of a nick name */
 | 
			
		||||
GLOBAL unsigned int Conf_MaxNickLength;
 | 
			
		||||
 | 
			
		||||
GLOBAL void Conf_Init PARAMS((void));
 | 
			
		||||
GLOBAL bool 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_EnablePassiveServer PARAMS((const char *Name));
 | 
			
		||||
GLOBAL bool Conf_DisableServer PARAMS(( char *Name ));
 | 
			
		||||
GLOBAL bool Conf_AddServer PARAMS(( char *Name, UINT16 Port, char *Host, char *MyPwd, char *PeerPwd ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										283
									
								
								src/ngircd/conn-func.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										283
									
								
								src/ngircd/conn-func.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,283 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.12 2008/03/11 14:05:27 alex Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <string.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 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Get signon time of a connection.
 | 
			
		||||
 */
 | 
			
		||||
GLOBAL time_t
 | 
			
		||||
Conn_GetSignon(CONN_ID Idx)
 | 
			
		||||
{
 | 
			
		||||
	assert(Idx > NONE);
 | 
			
		||||
	return My_Connections[Idx].signon;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GLOBAL time_t
 | 
			
		||||
Conn_GetIdle( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
	/* 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;
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
	Log(LOG_DEBUG, "Add penalty time on connection %d: %ld second(s).",
 | 
			
		||||
			Idx, (long)Seconds);
 | 
			
		||||
#endif
 | 
			
		||||
} /* 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 UINT16
 | 
			
		||||
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 = Conn_GetClient(Idx);
 | 
			
		||||
	if(c != NULL)
 | 
			
		||||
		return Client_StartTime(c);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
} /* Conn_StartTime */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL size_t
 | 
			
		||||
Conn_SendQ( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
	/* Laenge der Daten im Schreibbuffer liefern */
 | 
			
		||||
 | 
			
		||||
	assert( Idx > NONE );
 | 
			
		||||
#ifdef ZLIB
 | 
			
		||||
	if( My_Connections[Idx].options & CONN_ZIP )
 | 
			
		||||
		return array_bytes(&My_Connections[Idx].zip.wbuf);
 | 
			
		||||
	else
 | 
			
		||||
#endif
 | 
			
		||||
	return array_bytes(&My_Connections[Idx].wbuf);
 | 
			
		||||
} /* 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 size_t
 | 
			
		||||
Conn_RecvQ( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
	/* Laenge der Daten im Lesebuffer liefern */
 | 
			
		||||
 | 
			
		||||
	assert( Idx > NONE );
 | 
			
		||||
#ifdef ZLIB
 | 
			
		||||
	if( My_Connections[Idx].options & CONN_ZIP )
 | 
			
		||||
		return array_bytes(&My_Connections[Idx].zip.rbuf);
 | 
			
		||||
	else
 | 
			
		||||
#endif
 | 
			
		||||
	return array_bytes(&My_Connections[Idx].rbuf);
 | 
			
		||||
} /* 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- */
 | 
			
		||||
							
								
								
									
										63
									
								
								src/ngircd/conn-func.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								src/ngircd/conn-func.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.7 2007/10/04 15:03:56 alex 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_GetSignon PARAMS((CONN_ID Idx));
 | 
			
		||||
GLOBAL time_t Conn_GetIdle PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL time_t Conn_LastPing PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL time_t Conn_StartTime PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL size_t Conn_SendQ PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL size_t Conn_RecvQ PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL long Conn_SendMsg PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL long Conn_RecvMsg PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL long Conn_SendBytes PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL long Conn_RecvBytes PARAMS(( CONN_ID Idx ));
 | 
			
		||||
 | 
			
		||||
GLOBAL void Conn_SetPenalty PARAMS(( CONN_ID Idx, time_t Seconds ));
 | 
			
		||||
GLOBAL void Conn_ResetPenalty PARAMS(( CONN_ID Idx ));
 | 
			
		||||
 | 
			
		||||
GLOBAL void Conn_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 UINT16 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)) != 0)
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* -eof- */
 | 
			
		||||
							
								
								
									
										275
									
								
								src/ngircd/conn-zip.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										275
									
								
								src/ngircd/conn-zip.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,275 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2007 Alexander Barton (alex@barton.de)
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * Connection compression using ZLIB
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
#define CONN_MODULE
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef ZLIB
 | 
			
		||||
 | 
			
		||||
/* enable more zlib related debug messages: */
 | 
			
		||||
/* #define DEBUG_ZLIB */
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: conn-zip.c,v 1.16 2007/05/17 23:34:24 alex Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <zlib.h>
 | 
			
		||||
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "conn-func.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
 | 
			
		||||
#include "array.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 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Copy data to the compression buffer of a connection. We do collect
 | 
			
		||||
 * some data there until it's full so that we can achieve better
 | 
			
		||||
 * compression ratios.
 | 
			
		||||
 * If the (pre-)compression buffer is full, we try to flush it ("actually
 | 
			
		||||
 * compress some data") and to add the new (uncompressed) data afterwards.
 | 
			
		||||
 * @param Idx Connection handle.
 | 
			
		||||
 * @param Data Pointer to the data.
 | 
			
		||||
 * @param Len Length of the data to add.
 | 
			
		||||
 * @return true on success, false otherwise. */
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Zip_Buffer( CONN_ID Idx, char *Data, size_t Len )
 | 
			
		||||
{
 | 
			
		||||
	size_t buflen;
 | 
			
		||||
 | 
			
		||||
	assert( Idx > NONE );
 | 
			
		||||
	assert( Data != NULL );
 | 
			
		||||
	assert( Len > 0 );
 | 
			
		||||
 | 
			
		||||
	buflen = array_bytes(&My_Connections[Idx].zip.wbuf);
 | 
			
		||||
	if (buflen + Len >= WRITEBUFFER_SLINK_LEN) {
 | 
			
		||||
		/* compression buffer is full, flush */
 | 
			
		||||
		if( ! Zip_Flush( Idx )) return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* check again; if zip buf is still too large do not append data:
 | 
			
		||||
	 * otherwise the zip wbuf would grow too large */
 | 
			
		||||
	buflen = array_bytes(&My_Connections[Idx].zip.wbuf);
 | 
			
		||||
	if (buflen + Len >= WRITEBUFFER_SLINK_LEN)
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	return array_catb(&My_Connections[Idx].zip.wbuf, Data, Len);
 | 
			
		||||
} /* Zip_Buffer */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Compress data in ZIP buffer and move result to the write buffer of
 | 
			
		||||
 * the connection.
 | 
			
		||||
 * @param Idx Connection handle.
 | 
			
		||||
 * @retrun true on success, false otherwise.
 | 
			
		||||
 */
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Zip_Flush( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
	int result;
 | 
			
		||||
	unsigned char zipbuf[WRITEBUFFER_SLINK_LEN];
 | 
			
		||||
	int zipbuf_used = 0;
 | 
			
		||||
	z_stream *out;
 | 
			
		||||
 | 
			
		||||
	out = &My_Connections[Idx].zip.out;
 | 
			
		||||
 | 
			
		||||
	out->avail_in = (uInt)array_bytes(&My_Connections[Idx].zip.wbuf);
 | 
			
		||||
	if (!out->avail_in)
 | 
			
		||||
		return true;	/* nothing to do. */
 | 
			
		||||
 | 
			
		||||
	out->next_in = array_start(&My_Connections[Idx].zip.wbuf);
 | 
			
		||||
	assert(out->next_in != NULL);
 | 
			
		||||
 | 
			
		||||
	out->next_out = zipbuf;
 | 
			
		||||
	out->avail_out = (uInt)sizeof zipbuf;
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG_ZIP
 | 
			
		||||
	Log(LOG_DEBUG, "out->avail_in %d, out->avail_out %d",
 | 
			
		||||
		out->avail_in, out->avail_out);
 | 
			
		||||
#endif
 | 
			
		||||
	result = deflate( out, Z_SYNC_FLUSH );
 | 
			
		||||
	if(( result != Z_OK ) || ( out->avail_in > 0 ))
 | 
			
		||||
	{
 | 
			
		||||
		Log( LOG_ALERT, "Compression error: code %d!?", result );
 | 
			
		||||
		Conn_Close( Idx, "Compression error!", NULL, false );
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (out->avail_out <= 0) {
 | 
			
		||||
		/* Not all data was compressed, because data became
 | 
			
		||||
		 * bigger while compressing it. */
 | 
			
		||||
		Log (LOG_ALERT, "Compression error: buffer overvlow!?");
 | 
			
		||||
		Conn_Close(Idx, "Compression error!", NULL, false);
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	assert(out->avail_out <= WRITEBUFFER_SLINK_LEN);
 | 
			
		||||
 | 
			
		||||
	zipbuf_used = WRITEBUFFER_SLINK_LEN - out->avail_out;
 | 
			
		||||
#ifdef DEBUG_ZIP
 | 
			
		||||
	Log(LOG_DEBUG, "zipbuf_used: %d", zipbuf_used);
 | 
			
		||||
#endif
 | 
			
		||||
	if (!array_catb(&My_Connections[Idx].wbuf,
 | 
			
		||||
			(char *)zipbuf, (size_t) zipbuf_used)) {
 | 
			
		||||
		Log (LOG_ALERT, "Compression error: can't copy data!?");
 | 
			
		||||
		Conn_Close(Idx, "Compression error!", NULL, false);
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	My_Connections[Idx].bytes_out += zipbuf_used;
 | 
			
		||||
	My_Connections[Idx].zip.bytes_out += array_bytes(&My_Connections[Idx].zip.wbuf); 
 | 
			
		||||
	array_trunc(&My_Connections[Idx].zip.wbuf);
 | 
			
		||||
 | 
			
		||||
	return true;
 | 
			
		||||
} /* Zip_Flush */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL 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;
 | 
			
		||||
	unsigned char unzipbuf[READBUFFER_LEN];
 | 
			
		||||
	int unzipbuf_used = 0;
 | 
			
		||||
	unsigned int z_rdatalen;
 | 
			
		||||
	unsigned int in_len;
 | 
			
		||||
	
 | 
			
		||||
	z_stream *in;
 | 
			
		||||
 | 
			
		||||
	assert( Idx > NONE );
 | 
			
		||||
 | 
			
		||||
	z_rdatalen = (unsigned int)array_bytes(&My_Connections[Idx].zip.rbuf);
 | 
			
		||||
	if (z_rdatalen == 0)
 | 
			
		||||
		return true;
 | 
			
		||||
 | 
			
		||||
	in = &My_Connections[Idx].zip.in;
 | 
			
		||||
 | 
			
		||||
	in->next_in = array_start(&My_Connections[Idx].zip.rbuf);
 | 
			
		||||
	assert(in->next_in != NULL);
 | 
			
		||||
 | 
			
		||||
	in->avail_in = z_rdatalen;
 | 
			
		||||
	in->next_out = unzipbuf;
 | 
			
		||||
	in->avail_out = (uInt)sizeof unzipbuf;
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG_ZIP
 | 
			
		||||
	Log(LOG_DEBUG, "in->avail_in %d, in->avail_out %d",
 | 
			
		||||
		in->avail_in, in->avail_out);
 | 
			
		||||
#endif
 | 
			
		||||
	result = inflate( in, Z_SYNC_FLUSH );
 | 
			
		||||
	if( result != Z_OK )
 | 
			
		||||
	{
 | 
			
		||||
		Log( LOG_ALERT, "Decompression error: %s (code=%d, ni=%d, ai=%d, no=%d, ao=%d)!?", in->msg, result, in->next_in, in->avail_in, in->next_out, in->avail_out );
 | 
			
		||||
		Conn_Close( Idx, "Decompression error!", NULL, false );
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	assert(z_rdatalen >= in->avail_in);
 | 
			
		||||
	in_len = z_rdatalen - in->avail_in;
 | 
			
		||||
	unzipbuf_used = READBUFFER_LEN - in->avail_out;
 | 
			
		||||
#ifdef DEBUG_ZIP
 | 
			
		||||
	Log(LOG_DEBUG, "unzipbuf_used: %d - %d = %d", READBUFFER_LEN,
 | 
			
		||||
		in->avail_out, unzipbuf_used);
 | 
			
		||||
#endif
 | 
			
		||||
	assert(unzipbuf_used <= READBUFFER_LEN);
 | 
			
		||||
	if (!array_catb(&My_Connections[Idx].rbuf, (char*) unzipbuf,
 | 
			
		||||
			(size_t)unzipbuf_used))
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	if( in->avail_in > 0 ) {
 | 
			
		||||
		array_moveleft(&My_Connections[Idx].zip.rbuf, 1, in_len );
 | 
			
		||||
	} else {
 | 
			
		||||
		array_trunc( &My_Connections[Idx].zip.rbuf );
 | 
			
		||||
		My_Connections[Idx].zip.bytes_in += unzipbuf_used;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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.4 2006/05/10 21:24:01 alex 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, size_t Len ));
 | 
			
		||||
GLOBAL bool Zip_Flush PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL bool Unzip_Buffer PARAMS(( CONN_ID Idx ));
 | 
			
		||||
 | 
			
		||||
GLOBAL long Zip_SendBytes PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL long Zip_RecvBytes PARAMS(( CONN_ID Idx ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif /* __conn_zip_h__ */
 | 
			
		||||
 | 
			
		||||
#endif /* ZLIB */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* -eof- */
 | 
			
		||||
							
								
								
									
										2310
									
								
								src/ngircd/conn.c
									
									
									
									
									
								
							
							
						
						
									
										2310
									
								
								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.17 2002/08/26 00:03:15 alex Exp $
 | 
			
		||||
 * $Id: conn.h,v 1.46 2008/02/26 22:04:17 fw Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * conn.h: Verwaltung aller Netz-Verbindungen ("connections") (Header)
 | 
			
		||||
 * Connection management (header)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -19,35 +18,86 @@
 | 
			
		||||
#define __conn_h__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include <time.h>
 | 
			
		||||
#include <time.h>			/* for time_t, see below */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef INT CONN_ID;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Conn_Init PARAMS((VOID ));
 | 
			
		||||
GLOBAL VOID Conn_Exit PARAMS(( VOID ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Conn_NewListener PARAMS(( CONST UINT Port ));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Conn_Handler PARAMS(( VOID ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Conn_Write PARAMS(( CONN_ID Idx, CHAR *Data, INT Len ));
 | 
			
		||||
GLOBAL BOOLEAN Conn_WriteStr PARAMS(( CONN_ID Idx, CHAR *Format, ... ));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Conn_Close PARAMS(( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformClient ));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Conn_UpdateIdle PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL time_t Conn_GetIdle PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL time_t Conn_LastPing PARAMS(( CONN_ID Idx ));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Conn_SetPenalty PARAMS(( CONN_ID Idx, time_t Seconds ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL INT Conn_MaxFD;
 | 
			
		||||
 | 
			
		||||
#define CONN_ISCLOSING		1	/* Conn_Close() already called */
 | 
			
		||||
#define CONN_ISCONNECTING	2	/* connect() in progress */
 | 
			
		||||
 | 
			
		||||
#ifdef ZLIB
 | 
			
		||||
#define CONN_ZIP		4	/* zlib compressed link */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef int CONN_ID;
 | 
			
		||||
 | 
			
		||||
#include "client.h"
 | 
			
		||||
 | 
			
		||||
#ifdef CONN_MODULE
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "resolve.h"
 | 
			
		||||
#include "array.h"
 | 
			
		||||
#include "tool.h"
 | 
			
		||||
#include "ng_ipaddr.h"
 | 
			
		||||
 | 
			
		||||
#ifdef ZLIB
 | 
			
		||||
#include <zlib.h>
 | 
			
		||||
typedef struct _ZipData
 | 
			
		||||
{
 | 
			
		||||
	z_stream in;			/* "Handle" for input stream */
 | 
			
		||||
	z_stream out;			/* "Handle" for output stream */
 | 
			
		||||
	array rbuf;			/* Read buffer (compressed) */
 | 
			
		||||
	array wbuf;			/* Write buffer (uncompressed) */
 | 
			
		||||
	long bytes_in, bytes_out;	/* Counter for statistics (uncompressed!) */
 | 
			
		||||
} ZIPDATA;
 | 
			
		||||
#endif /* ZLIB */
 | 
			
		||||
 | 
			
		||||
typedef struct _Connection
 | 
			
		||||
{
 | 
			
		||||
	int sock;			/* Socket handle */
 | 
			
		||||
	ng_ipaddr_t addr;		/* Client address */
 | 
			
		||||
	RES_STAT res_stat;		/* Status of resolver process */
 | 
			
		||||
	char host[HOST_LEN];		/* Hostname */
 | 
			
		||||
	array rbuf;			/* Read buffer */
 | 
			
		||||
	array wbuf;			/* Write buffer */
 | 
			
		||||
	time_t signon;			/* Signon ("connect") time */
 | 
			
		||||
	time_t lastdata;		/* Last activity */
 | 
			
		||||
	time_t lastping;		/* Last PING */
 | 
			
		||||
	time_t lastprivmsg;		/* Last PRIVMSG */
 | 
			
		||||
	time_t delaytime;		/* Ignore link ("penalty") */
 | 
			
		||||
	long bytes_in, bytes_out;	/* Received and sent bytes */
 | 
			
		||||
	long msg_in, msg_out;		/* Received and sent IRC messages */
 | 
			
		||||
	int flag;			/* Flag (see "irc-write" module) */
 | 
			
		||||
	UINT16 options;			/* Link options / connection state */
 | 
			
		||||
	CLIENT *client;			/* pointer to client structure */
 | 
			
		||||
#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 PARAMS((void ));
 | 
			
		||||
GLOBAL void Conn_Exit PARAMS(( void ));
 | 
			
		||||
 | 
			
		||||
GLOBAL unsigned int Conn_InitListeners PARAMS(( void ));
 | 
			
		||||
GLOBAL void Conn_ExitListeners PARAMS(( void ));
 | 
			
		||||
 | 
			
		||||
GLOBAL void Conn_Handler PARAMS(( void ));
 | 
			
		||||
 | 
			
		||||
GLOBAL bool Conn_WriteStr PARAMS(( CONN_ID Idx, char *Format, ... ));
 | 
			
		||||
 | 
			
		||||
GLOBAL void Conn_Close PARAMS(( CONN_ID Idx, char *LogMsg, char *FwdMsg, bool InformClient ));
 | 
			
		||||
 | 
			
		||||
GLOBAL void Conn_SyncServerStruct PARAMS(( void ));
 | 
			
		||||
 | 
			
		||||
GLOBAL CLIENT* Conn_GetClient PARAMS((CONN_ID i));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* -eof- */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,92 +1,127 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 * Copyright (c)2001-2007 Alexander Barton (alex@barton.de)
 | 
			
		||||
 *
 | 
			
		||||
 * 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.33 2002/09/07 17:58:00 alex Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * defines.h: (globale) Konstanten
 | 
			
		||||
 * $Id: defines.h,v 1.62 2007/11/21 12:16:36 alex Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef __defines_h__
 | 
			
		||||
#define __defines_h__
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * Global constants ("#defines") used by the ngIRCd.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define NONE -1
 | 
			
		||||
 | 
			
		||||
#define FNAME_LEN 256			/* max. Laenge eines Dateinamen */
 | 
			
		||||
#define FNAME_LEN 256			/* Max. length of file name */
 | 
			
		||||
 | 
			
		||||
#define LINE_LEN 256			/* max. Laenge einer Konfigurationszeile */
 | 
			
		||||
#define LINE_LEN 256			/* Max. length of a line in the
 | 
			
		||||
					   configuration file */
 | 
			
		||||
 | 
			
		||||
#define HOST_LEN 256			/* max. Laenge eines Hostnamen */
 | 
			
		||||
#define HOST_LEN 256			/* Max. lenght of fully qualified host
 | 
			
		||||
					   names (e. g. "abc.domain.tld") */
 | 
			
		||||
 | 
			
		||||
#define MAX_LISTEN_PORTS 16		/* max. Anzahl von Listen-Ports */
 | 
			
		||||
#define MAX_LISTEN_PORTS 16		/* Max. count of listening ports */
 | 
			
		||||
 | 
			
		||||
#define MAX_OPERATORS 16		/* max. Anzahl konfigurierbarer Operatoren */
 | 
			
		||||
#define MAX_OPERATORS 16		/* Max. count of configurable IRC Ops */
 | 
			
		||||
 | 
			
		||||
#define MAX_SERVERS 16			/* max. Anzahl konfigurierbarer Server ("Peers") */
 | 
			
		||||
#define MAX_SERVERS 16			/* Max. count of configurable servers */
 | 
			
		||||
 | 
			
		||||
#define MAX_DEFCHANNELS 16		/* max. Anzahl vorkonfigurierbarerr Channels */
 | 
			
		||||
#define MAX_DEFCHANNELS 16		/* Max. count of predefined channels */
 | 
			
		||||
 | 
			
		||||
#define MAX_CONNECTIONS 100		/* max. Anzahl von Verbindungen an diesem Server */
 | 
			
		||||
#define MAX_SERVICES 8			/* Max. count of services */
 | 
			
		||||
 | 
			
		||||
#define CLIENT_ID_LEN 64		/* max. ID-Laenge; vgl. RFC 2812, 1.1 und 1.2.1 */
 | 
			
		||||
#define CLIENT_NICK_LEN 10		/* max. Nick-Laenge; vgl. RFC 2812, 1.2.1 */
 | 
			
		||||
#define CLIENT_PASS_LEN 9		/* max. Laenge des Passwortes */
 | 
			
		||||
#define CLIENT_USER_LEN 9		/* max. Laenge des Benutzernamen ("Login") */
 | 
			
		||||
#define CLIENT_NAME_LEN 32		/* max. Laenge des "langen Benutzernamen" */
 | 
			
		||||
#define CLIENT_HOST_LEN 64		/* max. Laenge des Hostname */
 | 
			
		||||
#define CLIENT_MODE_LEN 8		/* max. Laenge der Client-Modes */
 | 
			
		||||
#define CLIENT_INFO_LEN 64		/* max. Infotext-Laenge (Server) */
 | 
			
		||||
#define CLIENT_AWAY_LEN 128		/* max. Laenger der AWAY-Nachricht */
 | 
			
		||||
#define CLIENT_FLAGS_LEN 100		/* max. Laenger der Client-Flags */
 | 
			
		||||
#define MAX_WHOWAS 64			/* Max. number of WHOWAS items */
 | 
			
		||||
#define DEFAULT_WHOWAS 5		/* default count for WHOWAS command */
 | 
			
		||||
 | 
			
		||||
#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 CONNECTION_POOL 100		/* Size of default connection pool */
 | 
			
		||||
 | 
			
		||||
#define COMMAND_LEN 513			/* max. Laenge eines Befehls, vgl. RFC 2812, 3.2 */
 | 
			
		||||
#define CLIENT_ID_LEN 64		/* Max. length of an IRC ID; see RFC
 | 
			
		||||
					   RFC 2812 section 1.1 and 1.2.1 */
 | 
			
		||||
#define CLIENT_NICK_LEN_DEFAULT 10	/* Default nick length, see. RFC 2812
 | 
			
		||||
					 * section 1.2.1 */
 | 
			
		||||
#define CLIENT_NICK_LEN 32		/* Maximum nick name length */
 | 
			
		||||
#define CLIENT_PASS_LEN 21		/* Max. password length */
 | 
			
		||||
#define CLIENT_USER_LEN 10		/* Max. length of user name ("login")
 | 
			
		||||
					   see RFC 2812, section 1.2.1 */
 | 
			
		||||
#define CLIENT_NAME_LEN 32		/* Max. length of "real names" */
 | 
			
		||||
#define CLIENT_HOST_LEN 64		/* Max. host name length */
 | 
			
		||||
#define CLIENT_MODE_LEN 9		/* Max. lenth of all client modes */
 | 
			
		||||
#define CLIENT_INFO_LEN 64		/* Max. length of server info texts */
 | 
			
		||||
#define CLIENT_AWAY_LEN 128		/* Max. length of away messages */
 | 
			
		||||
#define CLIENT_FLAGS_LEN 100		/* Max. length of client flags */
 | 
			
		||||
 | 
			
		||||
#define READBUFFER_LEN 2 * COMMAND_LEN	/* Laenge des Lesepuffers je Verbindung (Bytes) */
 | 
			
		||||
#define WRITEBUFFER_LEN 4096		/* Laenge des Schreibpuffers je Verbindung (Bytes) */
 | 
			
		||||
#define CHANNEL_NAME_LEN 51		/* Max. length of a channel name, see
 | 
			
		||||
					   RFC 2812 section 1.3 */
 | 
			
		||||
#define CHANNEL_MODE_LEN 9		/* Max. length of channel modes */
 | 
			
		||||
 | 
			
		||||
#define PROTOVER "0210"			/* implementierte Protokoll-Version (RFC 2813, 4.1.1) */
 | 
			
		||||
#define PROTOIRC "-IRC"			/* Protokoll-Suffix (RFC 2813, 4.1.1) */
 | 
			
		||||
#define PROTOIRCPLUS "-IRC+"		/* Protokoll-Suffix f<>r IRC+-Protokoll */
 | 
			
		||||
#define COMMAND_LEN 513			/* Max. IRC command length, see. RFC
 | 
			
		||||
					   2812 section 3.2 */
 | 
			
		||||
 | 
			
		||||
#define READBUFFER_LEN 2048		/* Size of the read buffer of a
 | 
			
		||||
					   connection in bytes. */
 | 
			
		||||
#define WRITEBUFFER_LEN 4096		/* Size of the write buffer of a
 | 
			
		||||
					   connection in bytes. */
 | 
			
		||||
#define WRITEBUFFER_SLINK_LEN 51200	/* Size of the write buffer of a
 | 
			
		||||
					   server link connection in bytes. */
 | 
			
		||||
 | 
			
		||||
#define PROTOVER "0210"			/* Implemented IRC protocol version,
 | 
			
		||||
					   see RFC 2813 section 4.1.1. */
 | 
			
		||||
#define PROTOIRC "-IRC"			/* Protocol suffix, see RFC 2813
 | 
			
		||||
					   section 4.1.1 */
 | 
			
		||||
#define PROTOIRCPLUS "-IRC+"		/* Protocol suffix used by the IRC+
 | 
			
		||||
					   protocol, see doc/Protocol.txt */
 | 
			
		||||
 | 
			
		||||
#ifdef IRCPLUS
 | 
			
		||||
# define IRCPLUSFLAGS "C"		/* IRC+-Flags, die immer zutreffen */
 | 
			
		||||
# define IRCPLUSFLAGS "CHL"		/* Standard IRC+ flags */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define STARTUP_DELAY 1			/* Erst n Sek. nach Start zu anderen Servern verbinden */
 | 
			
		||||
#define RECONNECT_DELAY 3		/* Server-Links erst nach 3 Sekunden versuchen, wieder aufzubauen */
 | 
			
		||||
#define STARTUP_DELAY 1			/* Delay outgoing connections n seconds
 | 
			
		||||
					   after startup. */
 | 
			
		||||
#define RECONNECT_DELAY 3		/* Time to delay re-connect attempts
 | 
			
		||||
					   in seconds. */
 | 
			
		||||
 | 
			
		||||
#define USERMODES "aios"		/* unterstuetzte User-Modes */
 | 
			
		||||
#define CHANMODES "biImnoPtv"		/* unterstuetzte Channel-Modes */
 | 
			
		||||
#define USERMODES "aios"		/* Supported user modes. */
 | 
			
		||||
#define CHANMODES "biIklmnoPstv"	/* Supported channel modes. */
 | 
			
		||||
 | 
			
		||||
#define CONNECTED TRUE			/* fuer die irc-xxx-Module */
 | 
			
		||||
#define DISCONNECTED FALSE
 | 
			
		||||
#define CONNECTED true			/* Internal status codes. */
 | 
			
		||||
#define DISCONNECTED false
 | 
			
		||||
 | 
			
		||||
#define DEFAULT_AWAY_MSG "Away"		/* Away-Meldung fuer User von anderen Servern */
 | 
			
		||||
#define DEFAULT_AWAY_MSG "Away"		/* Away message for users connected to
 | 
			
		||||
					   linked servers. */
 | 
			
		||||
 | 
			
		||||
#ifdef PROTOTYPES
 | 
			
		||||
# define CONFIG_FILE SYSCONFDIR"/ngircd.conf"
 | 
			
		||||
# define MOTD_FILE SYSCONFDIR"/ngircd.motd"
 | 
			
		||||
#else
 | 
			
		||||
# define CONFIG_FILE "ngircd.conf"
 | 
			
		||||
# define MOTD_FILE "ngircd.motd"
 | 
			
		||||
#define DEFAULT_TOPIC_ID "-Server-"	/* Default ID for "topic owner". */
 | 
			
		||||
 | 
			
		||||
#define CONFIG_FILE "/ngircd.conf"	/* Configuration file name. */
 | 
			
		||||
#define MOTD_FILE "/ngircd.motd"	/* Name of the MOTD file. */
 | 
			
		||||
#define MOTD_PHRASE ""			/* Default MOTD phrase string. */
 | 
			
		||||
#define CHROOT_DIR ""			/* Default chroot() directory. */
 | 
			
		||||
#define PID_FILE ""			/* Default file for the process ID. */
 | 
			
		||||
 | 
			
		||||
#define ERROR_DIR "/tmp"		/* Error directory used in debug mode */
 | 
			
		||||
 | 
			
		||||
#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. Some servers use '*'. */
 | 
			
		||||
 | 
			
		||||
#define CUT_TXTSUFFIX "[CUT]"		/* Suffix for oversized messages that
 | 
			
		||||
					   have been shortened and cut off. */
 | 
			
		||||
 | 
			
		||||
#ifdef ZEROCONF
 | 
			
		||||
#define MDNS_TYPE "_ircu._tcp."		/* Service type to register with mDNS */
 | 
			
		||||
#endif
 | 
			
		||||
#define ERROR_DIR "/tmp"
 | 
			
		||||
 | 
			
		||||
#define MAX_LOG_MSG_LEN 256		/* max. Laenge einer Log-Meldung */
 | 
			
		||||
 | 
			
		||||
#define TOKEN_OUTBOUND -2		/* Kennzeichnung fuer ausgehende Server-Links im Aufbau */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -2,46 +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.5 2002/05/27 12:54:07 alex Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * hash.c: Hash-Werte berechnen
 | 
			
		||||
 * Hash calculation
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: hash.c,v 1.13 2006/10/06 21:23:47 fw Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "tool.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "hash.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL UINT32 jenkins_hash PARAMS(( register UINT8 *k, register UINT32 length, register UINT32 initval ));
 | 
			
		||||
static UINT32 jenkins_hash PARAMS(( register UINT8 *k, register UINT32 length, register UINT32 initval ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL UINT32
 | 
			
		||||
Hash( CHAR *String )
 | 
			
		||||
Hash( const char *String )
 | 
			
		||||
{
 | 
			
		||||
	/* Hash-Wert ueber String berechnen */
 | 
			
		||||
 | 
			
		||||
	CHAR buffer[LINE_LEN];
 | 
			
		||||
	char buffer[LINE_LEN];
 | 
			
		||||
 | 
			
		||||
	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 */
 | 
			
		||||
 | 
			
		||||
@@ -76,7 +72,7 @@ Hash( CHAR *String )
 | 
			
		||||
} /* mix */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL UINT32
 | 
			
		||||
static UINT32
 | 
			
		||||
jenkins_hash( register UINT8 *k, register UINT32 length, register UINT32 initval )
 | 
			
		||||
{
 | 
			
		||||
	/* k: the key
 | 
			
		||||
@@ -103,7 +99,7 @@ jenkins_hash( register UINT8 *k, register UINT32 length, register UINT32 initval
 | 
			
		||||
 | 
			
		||||
	/* 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,24 +2,22 @@
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 *
 | 
			
		||||
 * Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
 | 
			
		||||
 * der GNU General Public License (GPL), wie von der Free Software Foundation
 | 
			
		||||
 * herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
 | 
			
		||||
 * der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
 | 
			
		||||
 * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
 | 
			
		||||
 * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
 | 
			
		||||
 * 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.3 2002/05/27 12:54:07 alex Exp $
 | 
			
		||||
 * $Id: hash.h,v 1.6 2006/10/06 21:23:47 fw Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * hash.h: Hash-Werte berechnen (Header)
 | 
			
		||||
 * Hash calculation (header)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef __hash_h__
 | 
			
		||||
#define __hash_h__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL UINT32 Hash PARAMS((CHAR *String ));
 | 
			
		||||
GLOBAL UINT32 Hash PARAMS((const char *String ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										894
									
								
								src/ngircd/io.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										894
									
								
								src/ngircd/io.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,894 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * I/O abstraction interface.
 | 
			
		||||
 * Copyright (c) 2005 Florian Westphal (westphal@foo.fh-furtwangen.de)
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: io.c,v 1.31 2008/04/03 20:56:44 fw Exp $";
 | 
			
		||||
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <sys/time.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
 | 
			
		||||
#include "array.h"
 | 
			
		||||
#include "io.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
 | 
			
		||||
/* Enables extra debug messages in event add/delete/callback code. */
 | 
			
		||||
/* #define DEBUG_IO */
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
#ifdef PROTOTYPES
 | 
			
		||||
 void (*callback)(int, short);
 | 
			
		||||
#else
 | 
			
		||||
 void (*callback)();
 | 
			
		||||
#endif
 | 
			
		||||
 short what;
 | 
			
		||||
} io_event;
 | 
			
		||||
 | 
			
		||||
#define INIT_IOEVENT		{ NULL, -1, 0, NULL }
 | 
			
		||||
#define IO_ERROR		4
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_EPOLL_CREATE
 | 
			
		||||
#  define IO_USE_EPOLL		1
 | 
			
		||||
#  ifdef HAVE_SELECT
 | 
			
		||||
#    define IO_USE_SELECT	1
 | 
			
		||||
#  endif
 | 
			
		||||
#else
 | 
			
		||||
#  ifdef HAVE_KQUEUE
 | 
			
		||||
#    define IO_USE_KQUEUE	1
 | 
			
		||||
#  else
 | 
			
		||||
#    ifdef HAVE_SYS_DEVPOLL_H
 | 
			
		||||
#      define IO_USE_DEVPOLL	1
 | 
			
		||||
#    else
 | 
			
		||||
#      ifdef HAVE_POLL
 | 
			
		||||
#        define IO_USE_POLL	1
 | 
			
		||||
#      else
 | 
			
		||||
#        ifdef HAVE_SELECT
 | 
			
		||||
#          define IO_USE_SELECT	1
 | 
			
		||||
#        else
 | 
			
		||||
#          error "no IO API available!?"
 | 
			
		||||
#        endif /* HAVE_SELECT */
 | 
			
		||||
#      endif /* HAVE_POLL */
 | 
			
		||||
#    endif /* HAVE_SYS_DEVPOLL_H */
 | 
			
		||||
#  endif /* HAVE_KQUEUE */
 | 
			
		||||
#endif /* HAVE_EPOLL_CREATE */
 | 
			
		||||
 | 
			
		||||
static bool library_initialized = false;
 | 
			
		||||
 | 
			
		||||
#ifdef IO_USE_EPOLL
 | 
			
		||||
#include <sys/epoll.h>
 | 
			
		||||
 | 
			
		||||
static int io_masterfd = -1;
 | 
			
		||||
static bool io_event_change_epoll(int fd, short what, const int action);
 | 
			
		||||
static int io_dispatch_epoll(struct timeval *tv);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef IO_USE_KQUEUE
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/event.h>
 | 
			
		||||
static array io_evcache;
 | 
			
		||||
static int io_masterfd;
 | 
			
		||||
 | 
			
		||||
static int io_dispatch_kqueue(struct timeval *tv);
 | 
			
		||||
static bool io_event_change_kqueue(int, short, const int action);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef IO_USE_POLL
 | 
			
		||||
#include <poll.h>
 | 
			
		||||
 | 
			
		||||
static array pollfds;
 | 
			
		||||
static int poll_maxfd;
 | 
			
		||||
 | 
			
		||||
static bool io_event_change_poll PARAMS((int fd, short what));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef IO_USE_DEVPOLL
 | 
			
		||||
#include <sys/devpoll.h>
 | 
			
		||||
static int io_masterfd;
 | 
			
		||||
 | 
			
		||||
static bool io_event_change_devpoll(int fd, short what);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef IO_USE_SELECT
 | 
			
		||||
#include "defines.h"	/* for conn.h */
 | 
			
		||||
#include "conn.h"	/* for CONN_IDX (needed by resolve.h) */
 | 
			
		||||
#include "resolve.h"	/* for RES_STAT (needed by conf.h) */
 | 
			
		||||
#include "conf.h"	/* for Conf_MaxConnections */
 | 
			
		||||
 | 
			
		||||
static fd_set readers;
 | 
			
		||||
static fd_set writers;
 | 
			
		||||
/*
 | 
			
		||||
 * this is the first argument for select(), i.e.
 | 
			
		||||
 * the largest fd registered, plus one.
 | 
			
		||||
 */
 | 
			
		||||
static int select_maxfd;
 | 
			
		||||
static int io_dispatch_select(struct timeval *tv);
 | 
			
		||||
 | 
			
		||||
#ifndef IO_USE_EPOLL
 | 
			
		||||
#define io_masterfd -1
 | 
			
		||||
#endif
 | 
			
		||||
#endif /* IO_USE_SELECT */
 | 
			
		||||
 | 
			
		||||
static array io_events;
 | 
			
		||||
 | 
			
		||||
static void io_docallback PARAMS((int fd, short what));
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG_IO
 | 
			
		||||
static void io_debug(const char *s, int fd, int what)
 | 
			
		||||
{
 | 
			
		||||
	Log(LOG_DEBUG, "%s: %d, %d\n", s, fd, what);
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
static inline void io_debug(const char UNUSED *s,int UNUSED a, int UNUSED b) {/*NOTHING*/}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static io_event *
 | 
			
		||||
io_event_get(int fd)
 | 
			
		||||
{
 | 
			
		||||
	io_event *i;
 | 
			
		||||
 | 
			
		||||
	assert(fd >= 0);
 | 
			
		||||
 | 
			
		||||
	i = (io_event *) array_get(&io_events, sizeof(io_event), (size_t) fd);
 | 
			
		||||
 | 
			
		||||
	assert(i != NULL);
 | 
			
		||||
 | 
			
		||||
	return i;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef IO_USE_DEVPOLL
 | 
			
		||||
static int
 | 
			
		||||
io_dispatch_devpoll(struct timeval *tv)
 | 
			
		||||
{
 | 
			
		||||
	struct dvpoll dvp;
 | 
			
		||||
	time_t sec = tv->tv_sec * 1000;
 | 
			
		||||
	int i, total, ret, timeout = tv->tv_usec + sec;
 | 
			
		||||
	short what;
 | 
			
		||||
	struct pollfd p[100];
 | 
			
		||||
 | 
			
		||||
	if (timeout < 0)
 | 
			
		||||
		timeout = 1000;
 | 
			
		||||
 | 
			
		||||
	total = 0;
 | 
			
		||||
	do {
 | 
			
		||||
		dvp.dp_timeout = timeout;
 | 
			
		||||
		dvp.dp_nfds = 100;
 | 
			
		||||
		dvp.dp_fds = p;
 | 
			
		||||
		ret = ioctl(io_masterfd, DP_POLL, &dvp);
 | 
			
		||||
		total += ret;
 | 
			
		||||
		if (ret <= 0)
 | 
			
		||||
			return total;
 | 
			
		||||
		for (i=0; i < ret ; i++) {
 | 
			
		||||
			what = 0;
 | 
			
		||||
			if (p[i].revents & (POLLIN|POLLPRI))
 | 
			
		||||
				what = IO_WANTREAD;
 | 
			
		||||
 | 
			
		||||
			if (p[i].revents & POLLOUT)
 | 
			
		||||
				what |= IO_WANTWRITE;
 | 
			
		||||
 | 
			
		||||
			if (p[i].revents && !what) {
 | 
			
		||||
				/* other flag is set, probably POLLERR */
 | 
			
		||||
				what = IO_ERROR;
 | 
			
		||||
			}
 | 
			
		||||
			io_docallback(p[i].fd, what);
 | 
			
		||||
		}
 | 
			
		||||
	} while (ret == 100);
 | 
			
		||||
 | 
			
		||||
	return total;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static bool
 | 
			
		||||
io_event_change_devpoll(int fd, short what)
 | 
			
		||||
{
 | 
			
		||||
	struct pollfd p;
 | 
			
		||||
 | 
			
		||||
	p.events = 0;
 | 
			
		||||
 | 
			
		||||
	if (what & IO_WANTREAD)
 | 
			
		||||
		p.events = POLLIN | POLLPRI;
 | 
			
		||||
	if (what & IO_WANTWRITE)
 | 
			
		||||
		p.events |= POLLOUT;
 | 
			
		||||
 | 
			
		||||
	p.fd = fd;
 | 
			
		||||
	return write(io_masterfd, &p, sizeof p) == (ssize_t)sizeof p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
io_close_devpoll(int fd)
 | 
			
		||||
{
 | 
			
		||||
	struct pollfd p;
 | 
			
		||||
	p.events = POLLREMOVE;
 | 
			
		||||
	p.fd = fd;
 | 
			
		||||
	write(io_masterfd, &p, sizeof p);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
io_library_init_devpoll(unsigned int eventsize)
 | 
			
		||||
{
 | 
			
		||||
	io_masterfd = open("/dev/poll", O_RDWR);
 | 
			
		||||
	if (io_masterfd >= 0)
 | 
			
		||||
		library_initialized = true;
 | 
			
		||||
	Log(LOG_INFO, "IO subsystem: /dev/poll (initial maxfd %u, masterfd %d).",
 | 
			
		||||
		eventsize, io_masterfd);
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
static inline void io_close_devpoll(int UNUSED x) {/* NOTHING */}
 | 
			
		||||
static inline void io_library_init_devpoll(unsigned int UNUSED ev) {/*NOTHING*/}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef IO_USE_POLL
 | 
			
		||||
static int
 | 
			
		||||
io_dispatch_poll(struct timeval *tv)
 | 
			
		||||
{
 | 
			
		||||
	time_t sec = tv->tv_sec * 1000;
 | 
			
		||||
	int i, ret, timeout = tv->tv_usec + sec;
 | 
			
		||||
	int fds_ready;
 | 
			
		||||
	short what;
 | 
			
		||||
	struct pollfd *p = array_start(&pollfds);
 | 
			
		||||
 | 
			
		||||
	if (timeout < 0)
 | 
			
		||||
		timeout = 1000;
 | 
			
		||||
 | 
			
		||||
	ret = poll(p, poll_maxfd + 1, timeout);
 | 
			
		||||
	if (ret <= 0)
 | 
			
		||||
		return ret;
 | 
			
		||||
 | 
			
		||||
	fds_ready = ret;
 | 
			
		||||
	for (i=0; i <= poll_maxfd; i++) {
 | 
			
		||||
		what = 0;
 | 
			
		||||
		if (p[i].revents & (POLLIN|POLLPRI))
 | 
			
		||||
			what = IO_WANTREAD;
 | 
			
		||||
 | 
			
		||||
		if (p[i].revents & POLLOUT)
 | 
			
		||||
			what |= IO_WANTWRITE;
 | 
			
		||||
 | 
			
		||||
		if (p[i].revents && !what) {
 | 
			
		||||
			/* other flag is set, probably POLLERR */
 | 
			
		||||
			what = IO_ERROR;
 | 
			
		||||
		}
 | 
			
		||||
		if (what) {
 | 
			
		||||
			fds_ready--;
 | 
			
		||||
			io_docallback(i, what);
 | 
			
		||||
		}
 | 
			
		||||
		if (fds_ready <= 0)
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool
 | 
			
		||||
io_event_change_poll(int fd, short what)
 | 
			
		||||
{
 | 
			
		||||
	struct pollfd *p;
 | 
			
		||||
	short events = 0;
 | 
			
		||||
 | 
			
		||||
	if (what & IO_WANTREAD)
 | 
			
		||||
		events = POLLIN | POLLPRI;
 | 
			
		||||
	if (what & IO_WANTWRITE)
 | 
			
		||||
		events |= POLLOUT;
 | 
			
		||||
 | 
			
		||||
	p = array_alloc(&pollfds, sizeof *p, fd);
 | 
			
		||||
	if (p) {
 | 
			
		||||
		p->events = events;
 | 
			
		||||
		p->fd = fd;
 | 
			
		||||
		if (fd > poll_maxfd)
 | 
			
		||||
			poll_maxfd = fd;
 | 
			
		||||
	}
 | 
			
		||||
	return p != NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
io_close_poll(int fd)
 | 
			
		||||
{
 | 
			
		||||
	struct pollfd *p;
 | 
			
		||||
	p = array_get(&pollfds, sizeof *p, fd);
 | 
			
		||||
	if (!p) return;
 | 
			
		||||
 | 
			
		||||
	p->fd = -1;
 | 
			
		||||
	if (fd == poll_maxfd) {
 | 
			
		||||
		while (poll_maxfd > 0) {
 | 
			
		||||
			--poll_maxfd;
 | 
			
		||||
			p = array_get(&pollfds, sizeof *p, poll_maxfd);
 | 
			
		||||
			if (p && p->fd >= 0)
 | 
			
		||||
				break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
io_library_init_poll(unsigned int eventsize)
 | 
			
		||||
{
 | 
			
		||||
	struct pollfd *p;
 | 
			
		||||
	array_init(&pollfds);
 | 
			
		||||
	poll_maxfd = 0;
 | 
			
		||||
	Log(LOG_INFO, "IO subsystem: poll (initial maxfd %u).",
 | 
			
		||||
	    eventsize);
 | 
			
		||||
	p = array_alloc(&pollfds, sizeof(struct pollfd), eventsize);
 | 
			
		||||
	if (p) {
 | 
			
		||||
		unsigned i;
 | 
			
		||||
		p = array_start(&pollfds);
 | 
			
		||||
		for (i = 0; i < eventsize; i++)
 | 
			
		||||
			p[i].fd = -1;
 | 
			
		||||
 | 
			
		||||
		library_initialized = true;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
static inline void io_close_poll(int UNUSED x) {/* NOTHING */}
 | 
			
		||||
static inline void io_library_init_poll(unsigned int UNUSED ev) {/*NOTHING*/}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef IO_USE_SELECT
 | 
			
		||||
static int
 | 
			
		||||
io_dispatch_select(struct timeval *tv)
 | 
			
		||||
{
 | 
			
		||||
	fd_set readers_tmp = readers;
 | 
			
		||||
	fd_set writers_tmp = writers;
 | 
			
		||||
	short what;
 | 
			
		||||
	int ret, i;
 | 
			
		||||
	int fds_ready;
 | 
			
		||||
	ret = select(select_maxfd + 1, &readers_tmp, &writers_tmp, NULL, tv);
 | 
			
		||||
	if (ret <= 0)
 | 
			
		||||
		return ret;
 | 
			
		||||
 | 
			
		||||
	fds_ready = ret;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i <= select_maxfd; i++) {
 | 
			
		||||
		what = 0;
 | 
			
		||||
		if (FD_ISSET(i, &readers_tmp)) {
 | 
			
		||||
			what = IO_WANTREAD;
 | 
			
		||||
			fds_ready--;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (FD_ISSET(i, &writers_tmp)) {
 | 
			
		||||
			what |= IO_WANTWRITE;
 | 
			
		||||
			fds_ready--;
 | 
			
		||||
		}
 | 
			
		||||
		if (what)
 | 
			
		||||
			io_docallback(i, what);
 | 
			
		||||
		if (fds_ready <= 0)
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
io_library_init_select(unsigned int eventsize)
 | 
			
		||||
{
 | 
			
		||||
	if (library_initialized)
 | 
			
		||||
		return;
 | 
			
		||||
	Log(LOG_INFO, "IO subsystem: select (initial maxfd %u).",
 | 
			
		||||
	    eventsize);
 | 
			
		||||
	FD_ZERO(&readers);
 | 
			
		||||
	FD_ZERO(&writers);
 | 
			
		||||
#ifdef FD_SETSIZE
 | 
			
		||||
	if (Conf_MaxConnections >= (int)FD_SETSIZE) {
 | 
			
		||||
		Log(LOG_WARNING,
 | 
			
		||||
		    "MaxConnections (%d) exceeds limit (%u), changed MaxConnections to %u.",
 | 
			
		||||
		    Conf_MaxConnections, FD_SETSIZE, FD_SETSIZE - 1);
 | 
			
		||||
 | 
			
		||||
		Conf_MaxConnections = FD_SETSIZE - 1;
 | 
			
		||||
	}
 | 
			
		||||
#else
 | 
			
		||||
	Log(LOG_WARNING,
 | 
			
		||||
	    "FD_SETSIZE undefined, don't know how many descriptors select() can handle on your platform ...");
 | 
			
		||||
#endif /* FD_SETSIZE */
 | 
			
		||||
	library_initialized = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
io_close_select(int fd)
 | 
			
		||||
{
 | 
			
		||||
	io_event *i;
 | 
			
		||||
 | 
			
		||||
	if (io_masterfd >= 0)	/* Are we using epoll()? */
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	FD_CLR(fd, &writers);
 | 
			
		||||
	FD_CLR(fd, &readers);
 | 
			
		||||
 | 
			
		||||
	i = io_event_get(fd);
 | 
			
		||||
	if (!i) return;
 | 
			
		||||
 | 
			
		||||
	if (fd == select_maxfd) {
 | 
			
		||||
		while (select_maxfd>0) {
 | 
			
		||||
			--select_maxfd; /* find largest fd */
 | 
			
		||||
			i = io_event_get(select_maxfd);
 | 
			
		||||
			if (i && i->callback) break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
static inline void io_library_init_select(int UNUSED x) {/* NOTHING */}
 | 
			
		||||
static inline void io_close_select(int UNUSED x) {/* NOTHING */}
 | 
			
		||||
#endif /* SELECT */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef IO_USE_EPOLL
 | 
			
		||||
static bool
 | 
			
		||||
io_event_change_epoll(int fd, short what, const int action)
 | 
			
		||||
{
 | 
			
		||||
	struct epoll_event ev = { 0, {0} };
 | 
			
		||||
	ev.data.fd = fd;
 | 
			
		||||
 | 
			
		||||
	if (what & IO_WANTREAD)
 | 
			
		||||
		ev.events = EPOLLIN | EPOLLPRI;
 | 
			
		||||
	if (what & IO_WANTWRITE)
 | 
			
		||||
		ev.events |= EPOLLOUT;
 | 
			
		||||
 | 
			
		||||
	return epoll_ctl(io_masterfd, action, fd, &ev) == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
io_dispatch_epoll(struct timeval *tv)
 | 
			
		||||
{
 | 
			
		||||
	time_t sec = tv->tv_sec * 1000;
 | 
			
		||||
	int i, total = 0, ret, timeout = tv->tv_usec + sec;
 | 
			
		||||
	struct epoll_event epoll_ev[100];
 | 
			
		||||
	short type;
 | 
			
		||||
 | 
			
		||||
	if (timeout < 0)
 | 
			
		||||
		timeout = 1000;
 | 
			
		||||
 | 
			
		||||
	do {
 | 
			
		||||
		ret = epoll_wait(io_masterfd, epoll_ev, 100, timeout);
 | 
			
		||||
		total += ret;
 | 
			
		||||
		if (ret <= 0)
 | 
			
		||||
			return total;
 | 
			
		||||
 | 
			
		||||
		for (i = 0; i < ret; i++) {
 | 
			
		||||
			type = 0;
 | 
			
		||||
			if (epoll_ev[i].events & (EPOLLERR | EPOLLHUP))
 | 
			
		||||
				type = IO_ERROR;
 | 
			
		||||
 | 
			
		||||
			if (epoll_ev[i].events & (EPOLLIN | EPOLLPRI))
 | 
			
		||||
				type |= IO_WANTREAD;
 | 
			
		||||
 | 
			
		||||
			if (epoll_ev[i].events & EPOLLOUT)
 | 
			
		||||
				type |= IO_WANTWRITE;
 | 
			
		||||
 | 
			
		||||
			io_docallback(epoll_ev[i].data.fd, type);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		timeout = 0;
 | 
			
		||||
	} while (ret == 100);
 | 
			
		||||
 | 
			
		||||
	return total;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
io_library_init_epoll(unsigned int eventsize)
 | 
			
		||||
{
 | 
			
		||||
	int ecreate_hint = (int)eventsize;
 | 
			
		||||
	if (ecreate_hint <= 0)
 | 
			
		||||
		ecreate_hint = 128;
 | 
			
		||||
	io_masterfd = epoll_create(ecreate_hint);
 | 
			
		||||
	if (io_masterfd >= 0) {
 | 
			
		||||
		library_initialized = true;
 | 
			
		||||
		Log(LOG_INFO,
 | 
			
		||||
		    "IO subsystem: epoll (hint size %d, initial maxfd %u, masterfd %d).",
 | 
			
		||||
		    ecreate_hint, eventsize, io_masterfd);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
#ifdef IO_USE_SELECT
 | 
			
		||||
	Log(LOG_INFO, "Can't initialize epoll() IO interface, falling back to select() ...");
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
static inline void io_library_init_epoll(unsigned int UNUSED ev) {/* NOTHING */}
 | 
			
		||||
#endif /* IO_USE_EPOLL */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef IO_USE_KQUEUE
 | 
			
		||||
static bool
 | 
			
		||||
io_event_kqueue_commit_cache(void)
 | 
			
		||||
{
 | 
			
		||||
	struct kevent *events;
 | 
			
		||||
	bool ret;
 | 
			
		||||
	int len = (int) array_length(&io_evcache, sizeof (struct kevent));
 | 
			
		||||
 | 
			
		||||
	if (!len) /* nothing to do */
 | 
			
		||||
		return true;
 | 
			
		||||
 | 
			
		||||
	assert(len>0);
 | 
			
		||||
 | 
			
		||||
	if (len < 0) {
 | 
			
		||||
		array_free(&io_evcache);
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	events = array_start(&io_evcache);
 | 
			
		||||
 | 
			
		||||
	assert(events != NULL);
 | 
			
		||||
 | 
			
		||||
	ret = kevent(io_masterfd, events, len, NULL, 0, NULL) == 0;
 | 
			
		||||
	if (ret)
 | 
			
		||||
		array_trunc(&io_evcache);
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool
 | 
			
		||||
io_event_change_kqueue(int fd, short what, const int action)
 | 
			
		||||
{
 | 
			
		||||
	struct kevent kev;
 | 
			
		||||
	bool ret = true;
 | 
			
		||||
 | 
			
		||||
	if (what & IO_WANTREAD) {
 | 
			
		||||
		EV_SET(&kev, fd, EVFILT_READ, action, 0, 0, 0);
 | 
			
		||||
		ret = array_catb(&io_evcache, (char*) &kev, sizeof (kev));
 | 
			
		||||
		if (!ret)
 | 
			
		||||
			ret = kevent(io_masterfd, &kev,1, NULL, 0, NULL) == 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (ret && (what & IO_WANTWRITE)) {
 | 
			
		||||
		EV_SET(&kev, fd, EVFILT_WRITE, action, 0, 0, 0);
 | 
			
		||||
		ret = array_catb(&io_evcache, (char*) &kev, sizeof (kev));
 | 
			
		||||
		if (!ret)
 | 
			
		||||
			ret = kevent(io_masterfd, &kev, 1, NULL, 0, NULL) == 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (array_length(&io_evcache, sizeof kev) >= 100)
 | 
			
		||||
		io_event_kqueue_commit_cache();
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
io_dispatch_kqueue(struct timeval *tv)
 | 
			
		||||
{
 | 
			
		||||
	int i, total = 0, ret;
 | 
			
		||||
	struct kevent kev[100];
 | 
			
		||||
	struct kevent *newevents;
 | 
			
		||||
	struct timespec ts;
 | 
			
		||||
	int newevents_len;
 | 
			
		||||
	ts.tv_sec = tv->tv_sec;
 | 
			
		||||
	ts.tv_nsec = tv->tv_usec * 1000;
 | 
			
		||||
 | 
			
		||||
	do {
 | 
			
		||||
		newevents_len = (int) array_length(&io_evcache, sizeof (struct kevent));
 | 
			
		||||
		newevents = (newevents_len > 0) ? array_start(&io_evcache) : NULL;
 | 
			
		||||
		assert(newevents_len >= 0);
 | 
			
		||||
 | 
			
		||||
		ret = kevent(io_masterfd, newevents, newevents_len, kev, 100, &ts);
 | 
			
		||||
		if (newevents && ret != -1)
 | 
			
		||||
			array_trunc(&io_evcache);
 | 
			
		||||
 | 
			
		||||
		total += ret;
 | 
			
		||||
		if (ret <= 0)
 | 
			
		||||
			return total;
 | 
			
		||||
 | 
			
		||||
		for (i = 0; i < ret; i++) {
 | 
			
		||||
			io_debug("dispatch_kqueue: fd, kev.flags", (int)kev[i].ident, kev[i].flags);
 | 
			
		||||
			if (kev[i].flags & (EV_EOF|EV_ERROR)) {
 | 
			
		||||
				if (kev[i].flags & EV_ERROR)
 | 
			
		||||
					Log(LOG_ERR, "kevent fd %d: EV_ERROR (%s)",
 | 
			
		||||
						(int)kev[i].ident, strerror((int)kev[i].data));
 | 
			
		||||
				io_docallback((int)kev[i].ident, IO_ERROR);
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			switch (kev[i].filter) {
 | 
			
		||||
			case EVFILT_READ:
 | 
			
		||||
				io_docallback((int)kev[i].ident, IO_WANTREAD);
 | 
			
		||||
				break;
 | 
			
		||||
			case EVFILT_WRITE:
 | 
			
		||||
				io_docallback((int)kev[i].ident, IO_WANTWRITE);
 | 
			
		||||
				break;
 | 
			
		||||
			default:
 | 
			
		||||
				LogDebug("Unknown kev.filter number %d for fd %d",
 | 
			
		||||
					kev[i].filter, kev[i].ident);
 | 
			
		||||
				/* Fall through */
 | 
			
		||||
			case EV_ERROR:
 | 
			
		||||
				io_docallback((int)kev[i].ident, IO_ERROR);
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		ts.tv_sec = 0;
 | 
			
		||||
		ts.tv_nsec = 0;
 | 
			
		||||
	} while (ret == 100);
 | 
			
		||||
 | 
			
		||||
	return total;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
io_library_init_kqueue(unsigned int eventsize)
 | 
			
		||||
{
 | 
			
		||||
	io_masterfd = kqueue();
 | 
			
		||||
 | 
			
		||||
	Log(LOG_INFO,
 | 
			
		||||
	    "IO subsystem: kqueue (initial maxfd %u, masterfd %d)",
 | 
			
		||||
	    eventsize, io_masterfd);
 | 
			
		||||
	if (io_masterfd >= 0)
 | 
			
		||||
		library_initialized = true;
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
static inline void io_library_init_kqueue(unsigned int UNUSED ev) {/* NOTHING */}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
io_library_init(unsigned int eventsize)
 | 
			
		||||
{
 | 
			
		||||
	if (library_initialized)
 | 
			
		||||
		return true;
 | 
			
		||||
 | 
			
		||||
	if ((eventsize > 0) && !array_alloc(&io_events, sizeof(io_event), (size_t)eventsize))
 | 
			
		||||
		eventsize = 0;
 | 
			
		||||
 | 
			
		||||
	io_library_init_epoll(eventsize);
 | 
			
		||||
	io_library_init_kqueue(eventsize);
 | 
			
		||||
	io_library_init_devpoll(eventsize);
 | 
			
		||||
	io_library_init_poll(eventsize);
 | 
			
		||||
	io_library_init_select(eventsize);
 | 
			
		||||
 | 
			
		||||
	return library_initialized;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
io_library_shutdown(void)
 | 
			
		||||
{
 | 
			
		||||
#ifdef IO_USE_SELECT
 | 
			
		||||
	FD_ZERO(&readers);
 | 
			
		||||
	FD_ZERO(&writers);
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(IO_USE_EPOLL) || defined(IO_USE_KQUEUE) || defined(IO_USE_DEVPOLL)
 | 
			
		||||
	if (io_masterfd >= 0)
 | 
			
		||||
		close(io_masterfd);
 | 
			
		||||
	io_masterfd = -1;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef IO_USE_KQUEUE
 | 
			
		||||
	array_free(&io_evcache);
 | 
			
		||||
#endif
 | 
			
		||||
	library_initialized = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
io_event_setcb(int fd, void (*cbfunc) (int, short))
 | 
			
		||||
{
 | 
			
		||||
	io_event *i = io_event_get(fd);
 | 
			
		||||
	if (!i)
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	i->callback = cbfunc;
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static bool
 | 
			
		||||
backend_create_ev(int fd, short what)
 | 
			
		||||
{
 | 
			
		||||
	bool ret;
 | 
			
		||||
#ifdef IO_USE_DEVPOLL
 | 
			
		||||
	ret = io_event_change_devpoll(fd, what);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef IO_USE_POLL
 | 
			
		||||
	ret = io_event_change_poll(fd, what);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef IO_USE_EPOLL
 | 
			
		||||
	ret = io_event_change_epoll(fd, what, EPOLL_CTL_ADD);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef IO_USE_KQUEUE
 | 
			
		||||
	ret = io_event_change_kqueue(fd, what, EV_ADD|EV_ENABLE);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef IO_USE_SELECT
 | 
			
		||||
	if (io_masterfd < 0)
 | 
			
		||||
		ret = io_event_add(fd, what);
 | 
			
		||||
#endif
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
io_event_create(int fd, short what, void (*cbfunc) (int, short))
 | 
			
		||||
{
 | 
			
		||||
	bool ret;
 | 
			
		||||
	io_event *i;
 | 
			
		||||
 | 
			
		||||
	assert(fd >= 0);
 | 
			
		||||
#if defined(IO_USE_SELECT) && defined(FD_SETSIZE)
 | 
			
		||||
	if (io_masterfd < 0 && fd >= FD_SETSIZE) {
 | 
			
		||||
		Log(LOG_ERR,
 | 
			
		||||
		    "fd %d exceeds FD_SETSIZE (%u) (select can't handle more file descriptors)",
 | 
			
		||||
		    fd, FD_SETSIZE);
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
	i = (io_event *) array_alloc(&io_events, sizeof(io_event), (size_t) fd);
 | 
			
		||||
	if (!i) {
 | 
			
		||||
		Log(LOG_WARNING,
 | 
			
		||||
		    "array_alloc failed: could not allocate space for %d io_event structures",
 | 
			
		||||
		    fd);
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	i->callback = cbfunc;
 | 
			
		||||
	i->what = 0;
 | 
			
		||||
	ret = backend_create_ev(fd, what);
 | 
			
		||||
	if (ret)
 | 
			
		||||
		i->what = what;
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
io_event_add(int fd, short what)
 | 
			
		||||
{
 | 
			
		||||
	io_event *i = io_event_get(fd);
 | 
			
		||||
 | 
			
		||||
	if (!i) return false;
 | 
			
		||||
 | 
			
		||||
	if ((i->what & what) == what) /* event type is already registered */
 | 
			
		||||
		return true;
 | 
			
		||||
 | 
			
		||||
	io_debug("io_event_add: fd, what", fd, what);
 | 
			
		||||
 | 
			
		||||
	i->what |= what;
 | 
			
		||||
#ifdef IO_USE_EPOLL
 | 
			
		||||
	if (io_masterfd >= 0)
 | 
			
		||||
		return io_event_change_epoll(fd, i->what, EPOLL_CTL_MOD);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef IO_USE_KQUEUE
 | 
			
		||||
	return io_event_change_kqueue(fd, what, EV_ADD | EV_ENABLE);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef IO_USE_DEVPOLL
 | 
			
		||||
	return io_event_change_devpoll(fd, i->what);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef IO_USE_POLL
 | 
			
		||||
	return io_event_change_poll(fd, i->what);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef IO_USE_SELECT
 | 
			
		||||
	if (fd > select_maxfd)
 | 
			
		||||
		select_maxfd = fd;
 | 
			
		||||
 | 
			
		||||
	if (what & IO_WANTREAD)
 | 
			
		||||
		FD_SET(fd, &readers);
 | 
			
		||||
	if (what & IO_WANTWRITE)
 | 
			
		||||
		FD_SET(fd, &writers);
 | 
			
		||||
 | 
			
		||||
	return true;
 | 
			
		||||
#endif
 | 
			
		||||
	return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
io_setnonblock(int fd)
 | 
			
		||||
{
 | 
			
		||||
	int flags = fcntl(fd, F_GETFL);
 | 
			
		||||
	if (flags == -1)
 | 
			
		||||
		return false;
 | 
			
		||||
#ifndef O_NONBLOCK
 | 
			
		||||
#define O_NONBLOCK O_NDELAY
 | 
			
		||||
#endif
 | 
			
		||||
	flags |= O_NONBLOCK;
 | 
			
		||||
 | 
			
		||||
	return fcntl(fd, F_SETFL, flags) == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
io_close(int fd)
 | 
			
		||||
{
 | 
			
		||||
	io_event *i;
 | 
			
		||||
 | 
			
		||||
	i = io_event_get(fd);
 | 
			
		||||
#ifdef IO_USE_KQUEUE
 | 
			
		||||
	if (array_length(&io_evcache, sizeof (struct kevent)))	/* pending data in cache? */
 | 
			
		||||
		io_event_kqueue_commit_cache();
 | 
			
		||||
 | 
			
		||||
	/* both kqueue and epoll remove fd from all sets automatically on the last close
 | 
			
		||||
	 * of the descriptor. since we don't know if this is the last close we'll have
 | 
			
		||||
	 * to remove the set explicitly. */
 | 
			
		||||
	if (i) {
 | 
			
		||||
		io_event_change_kqueue(fd, i->what, EV_DELETE);
 | 
			
		||||
		io_event_kqueue_commit_cache();
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
	io_close_devpoll(fd);
 | 
			
		||||
	io_close_poll(fd);
 | 
			
		||||
	io_close_select(fd);
 | 
			
		||||
#ifdef IO_USE_EPOLL
 | 
			
		||||
	io_event_change_epoll(fd, 0, EPOLL_CTL_DEL);
 | 
			
		||||
#endif
 | 
			
		||||
	if (i) {
 | 
			
		||||
		i->callback = NULL;
 | 
			
		||||
		i->what = 0;
 | 
			
		||||
	}
 | 
			
		||||
	return close(fd) == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
io_event_del(int fd, short what)
 | 
			
		||||
{
 | 
			
		||||
	io_event *i = io_event_get(fd);
 | 
			
		||||
 | 
			
		||||
	io_debug("io_event_del: trying to delete eventtype; fd, what", fd, what);
 | 
			
		||||
	if (!i) return false;
 | 
			
		||||
 | 
			
		||||
	if (!(i->what & what)) /* event is already disabled */
 | 
			
		||||
		return true;
 | 
			
		||||
 | 
			
		||||
	i->what &= ~what;
 | 
			
		||||
#ifdef IO_USE_DEVPOLL
 | 
			
		||||
	return io_event_change_devpoll(fd, i->what);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef IO_USE_POLL
 | 
			
		||||
	return io_event_change_poll(fd, i->what);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef IO_USE_EPOLL
 | 
			
		||||
	if (io_masterfd >= 0)
 | 
			
		||||
		return io_event_change_epoll(fd, i->what, EPOLL_CTL_MOD);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef IO_USE_KQUEUE
 | 
			
		||||
	return io_event_change_kqueue(fd, what, EV_DISABLE);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef IO_USE_SELECT
 | 
			
		||||
	if (what & IO_WANTWRITE)
 | 
			
		||||
		FD_CLR(fd, &writers);
 | 
			
		||||
 | 
			
		||||
	if (what & IO_WANTREAD)
 | 
			
		||||
		FD_CLR(fd, &readers);
 | 
			
		||||
	return true;
 | 
			
		||||
#endif
 | 
			
		||||
	return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
io_dispatch(struct timeval *tv)
 | 
			
		||||
{
 | 
			
		||||
#ifdef IO_USE_EPOLL
 | 
			
		||||
	if (io_masterfd >= 0)
 | 
			
		||||
		return io_dispatch_epoll(tv);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef IO_USE_SELECT
 | 
			
		||||
	return io_dispatch_select(tv);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef IO_USE_KQUEUE
 | 
			
		||||
	return io_dispatch_kqueue(tv);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef IO_USE_DEVPOLL
 | 
			
		||||
	return io_dispatch_devpoll(tv);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef IO_USE_POLL
 | 
			
		||||
	return io_dispatch_poll(tv);
 | 
			
		||||
#endif
 | 
			
		||||
	return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* call the callback function inside the struct matching fd */
 | 
			
		||||
static void
 | 
			
		||||
io_docallback(int fd, short what)
 | 
			
		||||
{
 | 
			
		||||
	io_event *i = io_event_get(fd);
 | 
			
		||||
 | 
			
		||||
	io_debug("io_docallback; fd, what", fd, what);
 | 
			
		||||
 | 
			
		||||
	if (i->callback) {	/* callback might be NULL if a previous callback function
 | 
			
		||||
				   called io_close on this fd */
 | 
			
		||||
		i->callback(fd, (what & IO_ERROR) ? i->what : what);
 | 
			
		||||
	}
 | 
			
		||||
	/* if error indicator is set, we return the event(s) that were registered */
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										51
									
								
								src/ngircd/io.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								src/ngircd/io.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * I/O abstraction interface header
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: io.h,v 1.4 2006/12/25 22:53:52 alex Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef io_H_included
 | 
			
		||||
#define io_H_included
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
#include <sys/time.h>
 | 
			
		||||
 | 
			
		||||
#define IO_WANTREAD	1
 | 
			
		||||
#define IO_WANTWRITE	2
 | 
			
		||||
 | 
			
		||||
/* init library.
 | 
			
		||||
   sets up epoll/kqueue descriptors and tries to allocate space for ioevlen
 | 
			
		||||
   file descriptors. ioevlen is just the _initial_ size, not a limit. */
 | 
			
		||||
bool io_library_init PARAMS((unsigned int ioevlen));
 | 
			
		||||
 | 
			
		||||
/* shutdown and free all internal data structures */
 | 
			
		||||
void io_library_shutdown PARAMS((void));
 | 
			
		||||
 | 
			
		||||
/* add fd to internal set, enable readability check, set callback */
 | 
			
		||||
bool io_event_create PARAMS((int fd, short what, void (*cbfunc)(int, short)));
 | 
			
		||||
 | 
			
		||||
/* change callback function associated with fd */
 | 
			
		||||
bool io_event_setcb PARAMS((int fd, void (*cbfunc)(int, short)));
 | 
			
		||||
 | 
			
		||||
/* watch fd for event of type what */
 | 
			
		||||
bool io_event_add PARAMS((int fd, short what));
 | 
			
		||||
 | 
			
		||||
/* do not watch fd for event of type what */
 | 
			
		||||
bool io_event_del PARAMS((int fd, short what));
 | 
			
		||||
 | 
			
		||||
/* remove fd from watchlist, close() fd.  */
 | 
			
		||||
bool io_close PARAMS((int fd));
 | 
			
		||||
 | 
			
		||||
/* set O_NONBLOCK */
 | 
			
		||||
bool io_setnonblock PARAMS((int fd));
 | 
			
		||||
 | 
			
		||||
/* watch fds for activity */
 | 
			
		||||
int io_dispatch PARAMS((struct timeval *tv));
 | 
			
		||||
 | 
			
		||||
#endif /* io_H_included */
 | 
			
		||||
@@ -2,23 +2,24 @@
 | 
			
		||||
 * 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.15 2002/09/16 09:16:17 alex Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * irc-channel.c: IRC-Channel-Befehle
 | 
			
		||||
 * IRC channel commands
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: irc-channel.c,v 1.45 2008/02/24 18:57:38 fw Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
@@ -30,205 +31,308 @@
 | 
			
		||||
#include "match.h"
 | 
			
		||||
#include "messages.h"
 | 
			
		||||
#include "parse.h"
 | 
			
		||||
#include "irc.h"
 | 
			
		||||
#include "irc-info.h"
 | 
			
		||||
#include "irc-write.h"
 | 
			
		||||
#include "resolve.h"
 | 
			
		||||
#include "conf.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "irc-channel.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
/*
 | 
			
		||||
 * RFC 2812, (3.2.1 Join message Command):
 | 
			
		||||
 *  Note that this message
 | 
			
		||||
 *  accepts a special argument ("0"), which is a special request to leave all
 | 
			
		||||
 *  channels the user is currently a member of. The server will process this
 | 
			
		||||
 *  message as if the user had sent a PART command (See Section 3.2.2) for
 | 
			
		||||
 *  each channel he is a member of.
 | 
			
		||||
 */
 | 
			
		||||
static bool
 | 
			
		||||
part_from_all_channels(CLIENT* client, CLIENT *target)
 | 
			
		||||
{
 | 
			
		||||
	CL2CHAN *cl2chan;
 | 
			
		||||
	CHANNEL *chan;
 | 
			
		||||
 | 
			
		||||
	while ((cl2chan = Channel_FirstChannelOf(target))) {
 | 
			
		||||
		chan = Channel_GetChannel(cl2chan);
 | 
			
		||||
		assert( chan != NULL );
 | 
			
		||||
		Channel_Part(target, client, Channel_Name(chan), Client_ID(target));
 | 
			
		||||
	}
 | 
			
		||||
	return CONNECTED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static bool
 | 
			
		||||
join_allowed(CLIENT *Client, CLIENT *target, CHANNEL *chan,
 | 
			
		||||
			const char *channame, const char *key)
 | 
			
		||||
{
 | 
			
		||||
	bool is_invited, is_banned;
 | 
			
		||||
	const char *channel_modes;
 | 
			
		||||
 | 
			
		||||
	is_banned = Lists_Check(Channel_GetListBans(chan), target);
 | 
			
		||||
	is_invited = Lists_Check(Channel_GetListInvites(chan), target);
 | 
			
		||||
 | 
			
		||||
	if (is_banned && !is_invited) {
 | 
			
		||||
		IRC_WriteStrClient(Client, ERR_BANNEDFROMCHAN_MSG, Client_ID(Client), channame);
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	channel_modes = Channel_Modes(chan);
 | 
			
		||||
	if ((strchr(channel_modes, 'i')) && !is_invited) {
 | 
			
		||||
		/* Channel is "invite-only" (and Client wasn't invited) */
 | 
			
		||||
		IRC_WriteStrClient(Client, ERR_INVITEONLYCHAN_MSG, Client_ID(Client), channame);
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Is the channel protected by a key? */
 | 
			
		||||
	if (strchr(channel_modes, 'k') &&
 | 
			
		||||
		strcmp(Channel_Key(chan), key ? key : ""))
 | 
			
		||||
	{
 | 
			
		||||
		IRC_WriteStrClient(Client, ERR_BADCHANNELKEY_MSG, Client_ID(Client), channame);
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
	/* Are there already too many members? */
 | 
			
		||||
	if ((strchr(channel_modes, 'l')) && (Channel_MaxUsers(chan) <= Channel_MemberCount(chan))) {
 | 
			
		||||
		IRC_WriteStrClient(Client, ERR_CHANNELISFULL_MSG, Client_ID(Client), channame);
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
join_set_channelmodes(CHANNEL *chan, CLIENT *target, const char *flags)
 | 
			
		||||
{
 | 
			
		||||
	if (flags) {
 | 
			
		||||
		while (*flags) {
 | 
			
		||||
			Channel_UserModeAdd(chan, target, *flags);
 | 
			
		||||
			flags++;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* If channel persistent and client is ircop: make client chanop */
 | 
			
		||||
	if (strchr(Channel_Modes(chan), 'P') && strchr(Client_Modes(target), 'o'))
 | 
			
		||||
		Channel_UserModeAdd(chan, target, 'o');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
join_forward(CLIENT *Client, CLIENT *target, CHANNEL *chan,
 | 
			
		||||
					const char *channame)
 | 
			
		||||
{
 | 
			
		||||
	char modes[8];
 | 
			
		||||
 | 
			
		||||
	strlcpy(&modes[1], Channel_UserModes(chan, target), sizeof(modes) - 1);
 | 
			
		||||
 | 
			
		||||
	if (modes[1])
 | 
			
		||||
		modes[0] = 0x7;
 | 
			
		||||
	else
 | 
			
		||||
		modes[0] = '\0';
 | 
			
		||||
	/* forward to other servers */
 | 
			
		||||
	IRC_WriteStrServersPrefix(Client, target, "JOIN :%s%s", channame, modes);
 | 
			
		||||
 | 
			
		||||
	/* tell users in this channel about the new client */
 | 
			
		||||
	IRC_WriteStrChannelPrefix(Client, chan, target, false, "JOIN :%s", channame);
 | 
			
		||||
	if (modes[1])
 | 
			
		||||
		IRC_WriteStrChannelPrefix(Client, chan, target, false, "MODE %s +%s %s",
 | 
			
		||||
						channame, &modes[1], Client_ID(target));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static bool
 | 
			
		||||
join_send_topic(CLIENT *Client, CLIENT *target, CHANNEL *chan,
 | 
			
		||||
					const char *channame)
 | 
			
		||||
{
 | 
			
		||||
	const char *topic;
 | 
			
		||||
 | 
			
		||||
	if (Client_Type(Client) != CLIENT_USER)
 | 
			
		||||
		return true;
 | 
			
		||||
	/* acknowledge join */
 | 
			
		||||
	if (!IRC_WriteStrClientPrefix(Client, target, "JOIN :%s", channame))
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	/* Send topic to client, if any */
 | 
			
		||||
	topic = Channel_Topic(chan);
 | 
			
		||||
	assert(topic != NULL);
 | 
			
		||||
	if (*topic) {
 | 
			
		||||
		if (!IRC_WriteStrClient(Client, RPL_TOPIC_MSG,
 | 
			
		||||
			Client_ID(Client), channame, topic))
 | 
			
		||||
				return false;
 | 
			
		||||
#ifndef STRICT_RFC
 | 
			
		||||
		if (!IRC_WriteStrClient(Client, RPL_TOPICSETBY_MSG,
 | 
			
		||||
			Client_ID(Client), channame,
 | 
			
		||||
			Channel_TopicWho(chan),
 | 
			
		||||
			Channel_TopicTime(chan)))
 | 
			
		||||
				return false;
 | 
			
		||||
#endif
 | 
			
		||||
	}
 | 
			
		||||
	/* send list of channel members to client */
 | 
			
		||||
	if (!IRC_Send_NAMES(Client, chan))
 | 
			
		||||
		return false;
 | 
			
		||||
	return IRC_WriteStrClient(Client, RPL_ENDOFNAMES_MSG, Client_ID(Client), Channel_Name(chan));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_JOIN( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CHAR *channame, *flags, *topic, modes[8];
 | 
			
		||||
	BOOLEAN is_new_chan, is_invited, is_banned;
 | 
			
		||||
	char *channame, *channame_ptr, *key, *key_ptr, *flags;
 | 
			
		||||
	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 < 1 || 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 );
 | 
			
		||||
	/* Who is the sender? */
 | 
			
		||||
	if (Client_Type(Client) == CLIENT_SERVER)
 | 
			
		||||
		target = Client_Search(Req->prefix);
 | 
			
		||||
	else
 | 
			
		||||
		target = Client;
 | 
			
		||||
 | 
			
		||||
	/* Wer ist der Absender? */
 | 
			
		||||
	if( Client_Type( Client ) == CLIENT_SERVER ) target = Client_Search( Req->prefix );
 | 
			
		||||
	else target = Client;
 | 
			
		||||
	if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
 | 
			
		||||
	if (!target)
 | 
			
		||||
		return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, Client_ID(Client), Req->prefix);
 | 
			
		||||
 | 
			
		||||
	/* Channel-Namen durchgehen */
 | 
			
		||||
	chan = NULL;
 | 
			
		||||
	channame = strtok( Req->argv[0], "," );
 | 
			
		||||
	while( channame )
 | 
			
		||||
	{
 | 
			
		||||
		chan = flags = NULL;
 | 
			
		||||
	/* Is argument "0"? */
 | 
			
		||||
	if (Req->argc == 1 && !strncmp("0", Req->argv[0], 2))
 | 
			
		||||
		return part_from_all_channels(Client, target);
 | 
			
		||||
 | 
			
		||||
		/* wird der Channel neu angelegt? */
 | 
			
		||||
		if( Channel_Search( channame )) is_new_chan = FALSE;
 | 
			
		||||
		else is_new_chan = TRUE;
 | 
			
		||||
	/* Are channel keys given? */
 | 
			
		||||
	if (Req->argc > 1) {
 | 
			
		||||
		key = Req->argv[1];
 | 
			
		||||
		key_ptr = strchr(key, ',');
 | 
			
		||||
		if (key_ptr) *key_ptr = '\0';
 | 
			
		||||
	} else {
 | 
			
		||||
		key = key_ptr = NULL;
 | 
			
		||||
	}
 | 
			
		||||
	channame = Req->argv[0];
 | 
			
		||||
	channame_ptr = strchr(channame, ',');
 | 
			
		||||
	if (channame_ptr) *channame_ptr = '\0';
 | 
			
		||||
 | 
			
		||||
		/* Hat ein Server Channel-User-Modes uebergeben? */
 | 
			
		||||
		if( Client_Type( Client ) == CLIENT_SERVER )
 | 
			
		||||
		{
 | 
			
		||||
			/* Channel-Flags extrahieren */
 | 
			
		||||
			flags = strchr( channame, 0x7 );
 | 
			
		||||
			if( flags )
 | 
			
		||||
			{
 | 
			
		||||
	while (channame) {
 | 
			
		||||
		flags = NULL;
 | 
			
		||||
 | 
			
		||||
		/* Did the server include channel-user-modes? */
 | 
			
		||||
		if (Client_Type(Client) == CLIENT_SERVER) {
 | 
			
		||||
			flags = strchr(channame, 0x7);
 | 
			
		||||
			if (flags) {
 | 
			
		||||
				*flags = '\0';
 | 
			
		||||
				flags++;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Lokaler Client? */
 | 
			
		||||
		if( Client_Type( Client ) == CLIENT_USER )
 | 
			
		||||
		{
 | 
			
		||||
			/* Existiert der Channel bereits, oder wird er im Moment neu erzeugt? */
 | 
			
		||||
			if( is_new_chan )
 | 
			
		||||
			{
 | 
			
		||||
				/* Erster User im Channel: Operator-Flag setzen */
 | 
			
		||||
		chan = Channel_Search(channame);
 | 
			
		||||
		if (!chan && Conf_PredefChannelsOnly) {
 | 
			
		||||
			 /* channel must be created, but server does not allow this */
 | 
			
		||||
			IRC_WriteStrClient(Client, ERR_BANNEDFROMCHAN_MSG, Client_ID(Client), channame);
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Local client? */
 | 
			
		||||
		if (Client_Type(Client) == CLIENT_USER) {
 | 
			
		||||
			/* Test if the user has reached his maximum channel count */
 | 
			
		||||
			if ((Conf_MaxJoins > 0) && (Channel_CountForUser(Client) >= Conf_MaxJoins))
 | 
			
		||||
				return IRC_WriteStrClient(Client, ERR_TOOMANYCHANNELS_MSG,
 | 
			
		||||
							Client_ID(Client), channame);
 | 
			
		||||
			if (!chan) /* New Channel: first user will be channel operator */
 | 
			
		||||
				flags = "o";
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				/* Existierenden Channel suchen */
 | 
			
		||||
				chan = Channel_Search( channame );
 | 
			
		||||
				assert( chan != NULL );
 | 
			
		||||
				if (!join_allowed(Client, target, chan, channame, key))
 | 
			
		||||
					break;
 | 
			
		||||
		} 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. */
 | 
			
		||||
			if (chan) (void)Lists_Check(Channel_GetListInvites(chan), target);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
				is_banned = Lists_CheckBanned( target, chan );
 | 
			
		||||
				is_invited = Lists_CheckInvited( target, chan );
 | 
			
		||||
		/* Join channel (and create channel if it doesn't exist) */
 | 
			
		||||
		if (!Channel_Join(target, channame))
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
				/* 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 );
 | 
			
		||||
		if (!chan) /* channel is new; it has been created above */
 | 
			
		||||
			chan = Channel_Search(channame);
 | 
			
		||||
		assert(chan != NULL);
 | 
			
		||||
 | 
			
		||||
					/* naechsten Namen ermitteln */
 | 
			
		||||
					channame = strtok( NULL, "," );
 | 
			
		||||
					continue;
 | 
			
		||||
				}
 | 
			
		||||
		join_set_channelmodes(chan, target, flags);
 | 
			
		||||
 | 
			
		||||
				/* Ist der Channel "invite-only"? */
 | 
			
		||||
				if(( strchr( Channel_Modes( chan ), 'i' ) != NULL ) && ( is_invited == FALSE ))
 | 
			
		||||
				{
 | 
			
		||||
					/* Channel ist "invite-only" und Client wurde nicht invited: */
 | 
			
		||||
					IRC_WriteStrClient( Client, ERR_INVITEONLYCHAN_MSG, Client_ID( Client ), channame );
 | 
			
		||||
		join_forward(Client, target, chan, channame);
 | 
			
		||||
 | 
			
		||||
					/* naechsten Namen ermitteln */
 | 
			
		||||
					channame = strtok( NULL, "," );
 | 
			
		||||
					continue;
 | 
			
		||||
				}
 | 
			
		||||
		if (!join_send_topic(Client, target, chan, channame))
 | 
			
		||||
			break; /* write error */
 | 
			
		||||
 | 
			
		||||
		/* next channel? */
 | 
			
		||||
		channame = channame_ptr;
 | 
			
		||||
		if (channame) {
 | 
			
		||||
			channame++;
 | 
			
		||||
			channame_ptr = strchr(channame, ',');
 | 
			
		||||
			if (channame_ptr) *channame_ptr = '\0';
 | 
			
		||||
 | 
			
		||||
			if (key_ptr) {
 | 
			
		||||
				key = ++key_ptr;
 | 
			
		||||
				key_ptr = strchr(key, ',');
 | 
			
		||||
				if (key_ptr) *key_ptr = '\0';
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Channel joinen (und ggf. anlegen) */
 | 
			
		||||
		if( ! Channel_Join( target, channame ))
 | 
			
		||||
		{
 | 
			
		||||
			/* naechsten Namen ermitteln */
 | 
			
		||||
			channame = strtok( NULL, "," );
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
		if( ! chan ) chan = Channel_Search( channame );
 | 
			
		||||
		assert( chan != NULL );
 | 
			
		||||
 | 
			
		||||
		/* Modes setzen (wenn vorhanden) */
 | 
			
		||||
		while( flags && *flags )
 | 
			
		||||
		{
 | 
			
		||||
			Channel_UserModeAdd( chan, target, *flags );
 | 
			
		||||
			flags++;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Wenn persistenter Channel und IRC-Operator: zum Channel-OP machen */
 | 
			
		||||
		if(( strchr( Channel_Modes( chan ), 'P' )) && ( strchr( Client_Modes( target ), 'o' ))) Channel_UserModeAdd( chan, target, 'o' );
 | 
			
		||||
 | 
			
		||||
		/* Muessen Modes an andere Server gemeldet werden? */
 | 
			
		||||
		strcpy( &modes[1], Channel_UserModes( chan, target ));
 | 
			
		||||
		if( modes[1] ) modes[0] = 0x7;
 | 
			
		||||
		else modes[0] = '\0';
 | 
			
		||||
 | 
			
		||||
		/* An andere Server weiterleiten */
 | 
			
		||||
		IRC_WriteStrServersPrefix( Client, target, "JOIN :%s%s", channame, modes );
 | 
			
		||||
 | 
			
		||||
		/* im Channel bekannt machen */
 | 
			
		||||
		IRC_WriteStrChannelPrefix( Client, chan, target, FALSE, "JOIN :%s", channame );
 | 
			
		||||
		if( modes[1] )
 | 
			
		||||
		{
 | 
			
		||||
			/* Modes im Channel bekannt machen */
 | 
			
		||||
			IRC_WriteStrChannelPrefix( Client, chan, target, FALSE, "MODE %s +%s %s", channame, &modes[1], Client_ID( target ));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if( Client_Type( Client ) == CLIENT_USER )
 | 
			
		||||
		{
 | 
			
		||||
			/* an Client bestaetigen */
 | 
			
		||||
			IRC_WriteStrClientPrefix( Client, target, "JOIN :%s", channame );
 | 
			
		||||
 | 
			
		||||
			/* Topic an Client schicken */
 | 
			
		||||
			topic = Channel_Topic( chan );
 | 
			
		||||
			if( *topic ) IRC_WriteStrClient( Client, RPL_TOPIC_MSG, Client_ID( Client ), channame, topic );
 | 
			
		||||
 | 
			
		||||
			/* Mitglieder an Client Melden */
 | 
			
		||||
			IRC_Send_NAMES( Client, chan );
 | 
			
		||||
			IRC_WriteStrClient( Client, RPL_ENDOFNAMES_MSG, Client_ID( Client ), Channel_Name( chan ));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* naechsten Namen ermitteln */
 | 
			
		||||
		channame = strtok( NULL, "," );
 | 
			
		||||
	}
 | 
			
		||||
	return CONNECTED;
 | 
			
		||||
} /* IRC_JOIN */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
IRC_PART( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
/**
 | 
			
		||||
 * Handler for the IRC "PART" command.
 | 
			
		||||
 */
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_PART(CLIENT * Client, REQUEST * Req)
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *target;
 | 
			
		||||
	CHAR *chan;
 | 
			
		||||
	char *chan;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
	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 ));
 | 
			
		||||
	if (Req->argc < 1 || Req->argc > 2)
 | 
			
		||||
		return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
					  Client_ID(Client), Req->command);
 | 
			
		||||
 | 
			
		||||
	/* Falsche Anzahl Parameter? */
 | 
			
		||||
	if(( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
	/* Get 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);
 | 
			
		||||
 | 
			
		||||
	/* Wer ist der Absender? */
 | 
			
		||||
	if( Client_Type( Client ) == CLIENT_SERVER ) target = Client_Search( Req->prefix );
 | 
			
		||||
	else target = Client;
 | 
			
		||||
	if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
 | 
			
		||||
 | 
			
		||||
	/* Channel-Namen durchgehen */
 | 
			
		||||
	chan = strtok( Req->argv[0], "," );
 | 
			
		||||
	while( chan )
 | 
			
		||||
	{
 | 
			
		||||
		if( ! Channel_Part( target, Client, chan, Req->argc > 1 ? Req->argv[1] : Client_ID( target )))
 | 
			
		||||
		{
 | 
			
		||||
			/* naechsten Namen ermitteln */
 | 
			
		||||
			chan = strtok( NULL, "," );
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* naechsten Namen ermitteln */
 | 
			
		||||
		chan = strtok( NULL, "," );
 | 
			
		||||
	/* Loop over all the given channel names */
 | 
			
		||||
	chan = strtok(Req->argv[0], ",");
 | 
			
		||||
	while (chan) {
 | 
			
		||||
		Channel_Part(target, Client, chan,
 | 
			
		||||
			     Req->argc > 1 ? Req->argv[1] : Client_ID(target));
 | 
			
		||||
		chan = strtok(NULL, ",");
 | 
			
		||||
	}
 | 
			
		||||
	return CONNECTED;
 | 
			
		||||
} /* IRC_PART */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_TOPIC( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CHANNEL *chan;
 | 
			
		||||
	CLIENT *from;
 | 
			
		||||
	CHAR *topic;
 | 
			
		||||
	char *topic;
 | 
			
		||||
	bool r;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
 | 
			
		||||
	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 );
 | 
			
		||||
 | 
			
		||||
@@ -245,10 +349,22 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
 | 
			
		||||
	if( Req->argc == 1 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Topic erfragen */
 | 
			
		||||
		topic = Channel_Topic( chan );
 | 
			
		||||
		if( *topic ) return IRC_WriteStrClient( from, RPL_TOPIC_MSG, Client_ID( from ), Channel_Name( chan ), topic );
 | 
			
		||||
		else return IRC_WriteStrClient( from, RPL_NOTOPIC_MSG, Client_ID( from ), Channel_Name( chan ));
 | 
			
		||||
		/* Request actual topic */
 | 
			
		||||
		topic = Channel_Topic(chan);
 | 
			
		||||
		if (*topic) {
 | 
			
		||||
			r = IRC_WriteStrClient(from, RPL_TOPIC_MSG,
 | 
			
		||||
				Client_ID(Client), Channel_Name(chan), topic);
 | 
			
		||||
#ifndef STRICT_RFC
 | 
			
		||||
			r = IRC_WriteStrClient(from, RPL_TOPICSETBY_MSG,
 | 
			
		||||
				Client_ID(Client), Channel_Name(chan),
 | 
			
		||||
				Channel_TopicWho(chan),
 | 
			
		||||
				Channel_TopicTime(chan));
 | 
			
		||||
#endif
 | 
			
		||||
			return r;
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
			 return IRC_WriteStrClient(from, RPL_NOTOPIC_MSG,
 | 
			
		||||
					Client_ID(from), Channel_Name(chan));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if( strchr( Channel_Modes( chan ), 't' ))
 | 
			
		||||
@@ -257,99 +373,132 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
		if( ! strchr( Channel_UserModes( chan, from ), 'o' )) return IRC_WriteStrClient( from, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( from ), Channel_Name( chan ));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Topic setzen */
 | 
			
		||||
	Channel_SetTopic( chan, Req->argv[1] );
 | 
			
		||||
	Log( LOG_DEBUG, "User \"%s\" set topic on \"%s\": %s", Client_Mask( from ), Channel_Name( chan ), Req->argv[1][0] ? Req->argv[1] : "<none>" );
 | 
			
		||||
	/* Set new topic */
 | 
			
		||||
	Channel_SetTopic(chan, from, Req->argv[1]);
 | 
			
		||||
	Log(LOG_DEBUG, "User \"%s\" set topic on \"%s\": %s",
 | 
			
		||||
		Client_Mask(from), Channel_Name(chan),
 | 
			
		||||
		Req->argv[1][0] ? Req->argv[1] : "<none>");
 | 
			
		||||
 | 
			
		||||
	/* im Channel bekannt machen und an Server weiterleiten */
 | 
			
		||||
	IRC_WriteStrServersPrefix( Client, from, "TOPIC %s :%s", Req->argv[0], Req->argv[1] );
 | 
			
		||||
	IRC_WriteStrChannelPrefix( Client, chan, from, FALSE, "TOPIC %s :%s", Req->argv[0], Req->argv[1] );
 | 
			
		||||
	IRC_WriteStrChannelPrefix( Client, chan, from, false, "TOPIC %s :%s", Req->argv[0], Req->argv[1] );
 | 
			
		||||
 | 
			
		||||
	if( Client_Type( Client ) == CLIENT_USER ) return IRC_WriteStrClientPrefix( Client, Client, "TOPIC %s :%s", Req->argv[0], Req->argv[1] );
 | 
			
		||||
	else return CONNECTED;
 | 
			
		||||
} /* IRC_TOPIC */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
/**
 | 
			
		||||
 * Handler for the IRC "LIST" command.
 | 
			
		||||
 * This implementation handles the local case as well as the forwarding of the
 | 
			
		||||
 * LIST command to other servers in the IRC network.
 | 
			
		||||
 */
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_LIST( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CHAR *pattern;
 | 
			
		||||
	char *pattern;
 | 
			
		||||
	CHANNEL *chan;
 | 
			
		||||
	CLIENT *from, *target;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
 | 
			
		||||
	if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
 | 
			
		||||
	/* Bad number of prameters? */
 | 
			
		||||
	if( Req->argc > 2 )
 | 
			
		||||
		return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
			Client_ID( Client ), Req->command );
 | 
			
		||||
 | 
			
		||||
	/* Falsche Anzahl Parameter? */
 | 
			
		||||
	if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
	if( Req->argc > 0 )
 | 
			
		||||
		pattern = strtok( Req->argv[0], "," );
 | 
			
		||||
	else
 | 
			
		||||
		pattern = "*";
 | 
			
		||||
 | 
			
		||||
	if( Req->argc > 0 ) pattern = strtok( Req->argv[0], "," );
 | 
			
		||||
	else pattern = "*";
 | 
			
		||||
	/* Get sender from prefix, if any */
 | 
			
		||||
	if( Client_Type( Client ) == CLIENT_SERVER )
 | 
			
		||||
		from = Client_Search( Req->prefix );
 | 
			
		||||
	else
 | 
			
		||||
		from = Client;
 | 
			
		||||
 | 
			
		||||
	/* From aus Prefix ermitteln */
 | 
			
		||||
	if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
 | 
			
		||||
	else from = Client;
 | 
			
		||||
	if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix );
 | 
			
		||||
	if( ! from )
 | 
			
		||||
		return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG,
 | 
			
		||||
				Client_ID( Client ), Req->prefix );
 | 
			
		||||
 | 
			
		||||
	if( Req->argc == 2 )
 | 
			
		||||
	{
 | 
			
		||||
		/* an anderen Server forwarden */
 | 
			
		||||
		/* Forward to other server? */
 | 
			
		||||
		target = Client_Search( Req->argv[1] );
 | 
			
		||||
		if( ! target ) return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] );
 | 
			
		||||
		if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER ))
 | 
			
		||||
			return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG,
 | 
			
		||||
					Client_ID( Client ), Req->argv[1] );
 | 
			
		||||
 | 
			
		||||
		if( target != Client_ThisServer( ))
 | 
			
		||||
		{
 | 
			
		||||
			/* Ok, anderer Server ist das Ziel: forwarden */
 | 
			
		||||
			return IRC_WriteStrClientPrefix( target, from, "LIST %s :%s", from, Req->argv[1] );
 | 
			
		||||
			/* Target is indeed an other server, forward it! */
 | 
			
		||||
			return IRC_WriteStrClientPrefix( target, from,
 | 
			
		||||
					"LIST %s :%s", Client_ID( from ),
 | 
			
		||||
					Req->argv[1] );
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	while( pattern )
 | 
			
		||||
	{
 | 
			
		||||
		/* alle Channel durchgehen */
 | 
			
		||||
		/* Loop through all the channels */
 | 
			
		||||
		chan = Channel_First( );
 | 
			
		||||
		while( chan )
 | 
			
		||||
		{
 | 
			
		||||
			/* Passt die Suchmaske auf diesen Channel? */
 | 
			
		||||
			/* Check search pattern */
 | 
			
		||||
			if( Match( pattern, Channel_Name( chan )))
 | 
			
		||||
			{
 | 
			
		||||
				/* Treffer! */
 | 
			
		||||
				if( ! IRC_WriteStrClient( from, RPL_LIST_MSG, from, Channel_Name( chan ), Channel_MemberCount( chan ), Channel_Topic( chan ))) return DISCONNECTED;
 | 
			
		||||
				/* Gotcha! */
 | 
			
		||||
				if( ! strchr( Channel_Modes( chan ), 's' ) ||
 | 
			
		||||
				    Channel_IsMemberOf( chan, from ))
 | 
			
		||||
				{
 | 
			
		||||
					if( ! IRC_WriteStrClient( from,
 | 
			
		||||
					    RPL_LIST_MSG, Client_ID( from ),
 | 
			
		||||
					    Channel_Name( chan ),
 | 
			
		||||
					    Channel_MemberCount( chan ),
 | 
			
		||||
					    Channel_Topic( chan )))
 | 
			
		||||
						return DISCONNECTED;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			chan = Channel_Next( chan );
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		/* naechsten Namen ermitteln */
 | 
			
		||||
		if( Req->argc > 0 ) pattern = strtok( NULL, "," );
 | 
			
		||||
		else pattern = NULL;
 | 
			
		||||
		/* Get next name ... */
 | 
			
		||||
		if( Req->argc > 0 )
 | 
			
		||||
			pattern = strtok( NULL, "," );
 | 
			
		||||
		else
 | 
			
		||||
			pattern = NULL;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	return IRC_WriteStrClient( from, RPL_LISTEND_MSG, from );
 | 
			
		||||
	return IRC_WriteStrClient( from, RPL_LISTEND_MSG, Client_ID( from ));
 | 
			
		||||
} /* IRC_LIST */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_CHANINFO( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	char modes_add[COMMAND_LEN], l[16], *ptr;
 | 
			
		||||
	CLIENT *from;
 | 
			
		||||
	CHANNEL *chan;
 | 
			
		||||
	CHAR *ptr;
 | 
			
		||||
	int arg_topic;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
 | 
			
		||||
	if( Client_Type( Client ) != CLIENT_SERVER ) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
 | 
			
		||||
	/* 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 );
 | 
			
		||||
 | 
			
		||||
	/* Falsche Anzahl Parameter? */
 | 
			
		||||
	if(( Req->argc < 1 ) || ( Req->argc > 3 )) 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;
 | 
			
		||||
 | 
			
		||||
	/* From-Server suchen */
 | 
			
		||||
	/* Search origin */
 | 
			
		||||
	from = Client_Search( Req->prefix );
 | 
			
		||||
	if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
 | 
			
		||||
 | 
			
		||||
	/* Channel suchen bzw. erzeugen */
 | 
			
		||||
	/* Search or create channel */
 | 
			
		||||
	chan = Channel_Search( Req->argv[0] );
 | 
			
		||||
	if( ! chan ) chan = Channel_Create( Req->argv[0] );
 | 
			
		||||
	if( ! chan ) return CONNECTED;
 | 
			
		||||
@@ -359,27 +508,62 @@ IRC_CHANINFO( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
		ptr = Channel_Modes( chan );
 | 
			
		||||
		if( ! *ptr )
 | 
			
		||||
		{
 | 
			
		||||
			/* OK, es sind noch keine Modes gesetzt */
 | 
			
		||||
			/* OK, this channel doesn't have modes jet, set the received ones: */
 | 
			
		||||
			Channel_SetModes( chan, &Req->argv[1][1] );
 | 
			
		||||
			IRC_WriteStrChannelPrefix( Client, chan, from, FALSE, "MODE %s +%s", Req->argv[0], &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 ), " %lu", 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, "CHANNELINFO: invalid MODE format ignored!" );
 | 
			
		||||
	else Log( LOG_WARNING, "CHANINFO: invalid MODE format ignored!" );
 | 
			
		||||
 | 
			
		||||
	if( Req->argc == 3 )
 | 
			
		||||
	if( arg_topic > 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Es wurde auch ein Topic mit uebermittelt */
 | 
			
		||||
		/* We got a topic */
 | 
			
		||||
		ptr = Channel_Topic( chan );
 | 
			
		||||
		if( ! *ptr )
 | 
			
		||||
		if(( ! *ptr ) && ( Req->argv[arg_topic][0] ))
 | 
			
		||||
		{
 | 
			
		||||
			/* OK, es ist bisher kein Topic gesetzt */
 | 
			
		||||
			Channel_SetTopic( chan, Req->argv[2] );
 | 
			
		||||
			IRC_WriteStrChannelPrefix( Client, chan, from, FALSE, "TOPIC %s :%s", Req->argv[0], Req->argv[2] );
 | 
			
		||||
			/* OK, there is no topic jet */
 | 
			
		||||
			Channel_SetTopic(chan, Client, Req->argv[arg_topic]);
 | 
			
		||||
			IRC_WriteStrChannelPrefix(Client, chan, from, false,
 | 
			
		||||
			     "TOPIC %s :%s", Req->argv[0], Channel_Topic(chan));
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* an andere Server forwarden */
 | 
			
		||||
	IRC_WriteStrServersPrefixFlag( Client, from, 'C', "CHANINFO %s %s :%s", Req->argv[0], Req->argv[1], Req->argv[2] );
 | 
			
		||||
	/* 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 */
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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: irc-channel.h,v 1.5 2002/09/03 23:56:55 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)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -19,13 +18,13 @@
 | 
			
		||||
#define __irc_channel_h__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN IRC_JOIN PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_PART PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_TOPIC PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_JOIN PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_PART PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_TOPIC PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN IRC_LIST PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_LIST PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN IRC_CHANINFO PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_CHANINFO PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1271
									
								
								src/ngircd/irc-info.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1271
									
								
								src/ngircd/irc-info.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										47
									
								
								src/ngircd/irc-info.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								src/ngircd/irc-info.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,47 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.6 2008/02/17 13:26:42 alex 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_INFO 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_SUMMON 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_USERS 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_ISUPPORT PARAMS(( CLIENT *Client ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* -eof- */
 | 
			
		||||
@@ -1,17 +1,14 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 * Copyright (c)2001-2008 Alexander Barton (alex@barton.de)
 | 
			
		||||
 *
 | 
			
		||||
 * 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.21 2002/09/09 03:34:33 alex Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * irc-login.c: Anmeldung und Abmeldung im IRC
 | 
			
		||||
 * Login and logout
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -22,206 +19,285 @@
 | 
			
		||||
#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 "conn.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 "exp.h"
 | 
			
		||||
#include "irc-login.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL BOOLEAN Hello_User PARAMS(( CLIENT *Client ));
 | 
			
		||||
LOCAL VOID Kill_Nick PARAMS(( CHAR *Nick, CHAR *Reason ));
 | 
			
		||||
static bool Hello_User PARAMS(( CLIENT *Client ));
 | 
			
		||||
static void Kill_Nick PARAMS(( char *Nick, char *Reason ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
/**
 | 
			
		||||
 * Handler for the IRC command "PASS".
 | 
			
		||||
 * See RFC 2813 section 4.1.1, and RFC 2812 section 3.1.1.
 | 
			
		||||
 */
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_PASS( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	char *type, *orig_flags;
 | 
			
		||||
	int protohigh, protolow;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
 | 
			
		||||
	/* Fehler liefern, wenn kein lokaler Client */
 | 
			
		||||
	if( Client_Conn( Client ) <= NONE ) return IRC_WriteStrClient( Client, ERR_UNKNOWNCOMMAND_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
	/* Return an error if this is not a local client */
 | 
			
		||||
	if (Client_Conn(Client) <= NONE)
 | 
			
		||||
		return IRC_WriteStrClient(Client, ERR_UNKNOWNCOMMAND_MSG,
 | 
			
		||||
					  Client_ID(Client), Req->command);
 | 
			
		||||
	
 | 
			
		||||
	if(( Client_Type( Client ) == CLIENT_UNKNOWN ) && ( Req->argc == 1))
 | 
			
		||||
	{
 | 
			
		||||
		/* noch nicht registrierte unbekannte Verbindung */
 | 
			
		||||
		Log( LOG_DEBUG, "Connection %d: got PASS command ...", Client_Conn( Client ));
 | 
			
		||||
 | 
			
		||||
		/* Passwort speichern */
 | 
			
		||||
		Client_SetPassword( Client, Req->argv[0] );
 | 
			
		||||
 | 
			
		||||
		Client_SetType( Client, CLIENT_GOTPASS );
 | 
			
		||||
		return CONNECTED;
 | 
			
		||||
	if (Client_Type(Client) == CLIENT_UNKNOWN && Req->argc == 1) {
 | 
			
		||||
		/* Not yet registered "unknown" connection, PASS with one
 | 
			
		||||
		 * argument: either a regular client, service, or server
 | 
			
		||||
		 * using the old RFC 1459 section 4.1.1 syntax. */
 | 
			
		||||
		LogDebug("Connection %d: got PASS command ...",
 | 
			
		||||
			 Client_Conn(Client));
 | 
			
		||||
	} else if ((Client_Type(Client) == CLIENT_UNKNOWN ||
 | 
			
		||||
		    Client_Type(Client) == CLIENT_UNKNOWNSERVER) &&
 | 
			
		||||
		   (Req->argc == 3 || Req->argc == 4)) {
 | 
			
		||||
		/* Not yet registered "unknown" connection or outgoing server
 | 
			
		||||
		 * link, PASS with three or four argument: server using the
 | 
			
		||||
		 * RFC 2813 section 4.1.1 syntax. */
 | 
			
		||||
		LogDebug("Connection %d: got PASS command (new server link) ...",
 | 
			
		||||
			 Client_Conn(Client));
 | 
			
		||||
	} else if (Client_Type(Client) == CLIENT_UNKNOWN ||
 | 
			
		||||
		   Client_Type(Client) == CLIENT_UNKNOWNSERVER) {
 | 
			
		||||
		/* Unregistered connection, but wrong number of arguments: */
 | 
			
		||||
		return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
					  Client_ID(Client), Req->command);
 | 
			
		||||
	} else {
 | 
			
		||||
		/* Registered connection, PASS command is not allowed! */
 | 
			
		||||
		return IRC_WriteStrClient(Client, ERR_ALREADYREGISTRED_MSG,
 | 
			
		||||
					  Client_ID(Client));
 | 
			
		||||
	}
 | 
			
		||||
	else if((( Client_Type( Client ) == CLIENT_UNKNOWN ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER )) && (( Req->argc == 3 ) || ( Req->argc == 4 )))
 | 
			
		||||
	{
 | 
			
		||||
		CHAR c2, c4, *type, *impl, *serverver, *flags, *ptr;
 | 
			
		||||
		INT protohigh, protolow;
 | 
			
		||||
 | 
			
		||||
		/* noch nicht registrierte Server-Verbindung */
 | 
			
		||||
		Log( LOG_DEBUG, "Connection %d: got PASS command (new server link) ...", Client_Conn( Client ));
 | 
			
		||||
	Client_SetPassword(Client, Req->argv[0]);
 | 
			
		||||
	Client_SetType(Client, CLIENT_GOTPASS);
 | 
			
		||||
 | 
			
		||||
		/* Passwort speichern */
 | 
			
		||||
		Client_SetPassword( Client, Req->argv[0] );
 | 
			
		||||
	/* Protocol version */
 | 
			
		||||
	if (Req->argc >= 2 && strlen(Req->argv[1]) >= 4) {
 | 
			
		||||
		int c2, c4;
 | 
			
		||||
 | 
			
		||||
		/* Protokollversion ermitteln */
 | 
			
		||||
		if( strlen( Req->argv[1] ) >= 4 )
 | 
			
		||||
		{
 | 
			
		||||
			c2 = Req->argv[1][2];
 | 
			
		||||
			c4 = Req->argv[1][4];
 | 
			
		||||
		c2 = Req->argv[1][2];
 | 
			
		||||
		c4 = Req->argv[1][4];
 | 
			
		||||
 | 
			
		||||
			Req->argv[1][4] = '\0';
 | 
			
		||||
			protolow = atoi( &Req->argv[1][2] );
 | 
			
		||||
			Req->argv[1][2] = '\0';
 | 
			
		||||
			protohigh = atoi( Req->argv[1] );
 | 
			
		||||
		Req->argv[1][4] = '\0';
 | 
			
		||||
		protolow = atoi(&Req->argv[1][2]);
 | 
			
		||||
		Req->argv[1][2] = '\0';
 | 
			
		||||
		protohigh = atoi(Req->argv[1]);
 | 
			
		||||
			
 | 
			
		||||
			Req->argv[1][2] = c2;
 | 
			
		||||
			Req->argv[1][4] = c4;
 | 
			
		||||
		}			
 | 
			
		||||
		else protohigh = protolow = 0;
 | 
			
		||||
		Req->argv[1][2] = c2;
 | 
			
		||||
		Req->argv[1][4] = c4;
 | 
			
		||||
	} else
 | 
			
		||||
		protohigh = protolow = 0;
 | 
			
		||||
 | 
			
		||||
		/* Protokoll-Typ */
 | 
			
		||||
		if( strlen( Req->argv[1] ) > 4 ) type = &Req->argv[1][4];
 | 
			
		||||
		else type = NULL;
 | 
			
		||||
	/* Protocol type, see doc/Protocol.txt */
 | 
			
		||||
	if (Req->argc >= 2 && strlen(Req->argv[1]) > 4)
 | 
			
		||||
		type = &Req->argv[1][4];
 | 
			
		||||
	else
 | 
			
		||||
		type = NULL;
 | 
			
		||||
	
 | 
			
		||||
	/* Protocol flags/options */
 | 
			
		||||
	if (Req->argc >= 4)
 | 
			
		||||
		orig_flags = Req->argv[3];
 | 
			
		||||
	else
 | 
			
		||||
		orig_flags = "";
 | 
			
		||||
 | 
			
		||||
	/* Implementation, version and IRC+ flags */
 | 
			
		||||
	if (Req->argc >= 3) {
 | 
			
		||||
		char *impl, *ptr, *serverver, *flags;
 | 
			
		||||
 | 
			
		||||
		/* Implementation, Version und ngIRCd-Flags */
 | 
			
		||||
		impl = Req->argv[2];
 | 
			
		||||
		ptr = strchr( impl, '|' );
 | 
			
		||||
		if( ptr ) *ptr = '\0';
 | 
			
		||||
		ptr = strchr(impl, '|');
 | 
			
		||||
		if (ptr)
 | 
			
		||||
			*ptr = '\0';
 | 
			
		||||
 | 
			
		||||
		if( type && ( strcmp( type, PROTOIRCPLUS ) == 0 ))
 | 
			
		||||
		{
 | 
			
		||||
			/* auf der anderen Seite laeuft ein Server, der
 | 
			
		||||
			 * ebenfalls das IRC+-Protokoll versteht */
 | 
			
		||||
		if (type && strcmp(type, PROTOIRCPLUS) == 0) {
 | 
			
		||||
			/* The peer seems to be a server which supports the
 | 
			
		||||
			 * IRC+ protocol (see doc/Protocol.txt). */
 | 
			
		||||
			serverver = ptr + 1;
 | 
			
		||||
			flags = strchr( serverver, ':' );
 | 
			
		||||
			if( flags )
 | 
			
		||||
			{
 | 
			
		||||
			flags = strchr(serverver, ':');
 | 
			
		||||
			if (flags) {
 | 
			
		||||
				*flags = '\0';
 | 
			
		||||
				flags++;
 | 
			
		||||
			}
 | 
			
		||||
			else flags = "";
 | 
			
		||||
			Log( LOG_INFO, "Connection %d: Peer announces itself as %s-%s using protocol %d.%d/IRC+ (flags: \"%s\").", Client_Conn( Client ), impl, serverver, protohigh, protolow, 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 {
 | 
			
		||||
			/* The peer seems to be a server supporting the
 | 
			
		||||
			 * "original" IRC protocol (RFC 2813). */
 | 
			
		||||
			serverver = "";
 | 
			
		||||
			if (strchr(orig_flags, 'Z'))
 | 
			
		||||
				flags = "Z";
 | 
			
		||||
			else
 | 
			
		||||
				flags = "";
 | 
			
		||||
			Log(LOG_INFO,
 | 
			
		||||
			    "Peer announces itself as \"%s\" using protocol %d.%d (flags: \"%s\").",
 | 
			
		||||
			    impl, protohigh, protolow, flags);
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			serverver = flags = "";
 | 
			
		||||
			Log( LOG_INFO, "Connection %d: Peer announces itself as \"%s\" using protocol %d.%d.", Client_Conn( Client ), impl, protohigh, protolow );
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		Client_SetType( Client, CLIENT_GOTPASSSERVER );
 | 
			
		||||
		Client_SetFlags( Client, flags );
 | 
			
		||||
 | 
			
		||||
		return CONNECTED;
 | 
			
		||||
		Client_SetFlags(Client, flags);
 | 
			
		||||
	}
 | 
			
		||||
	else if(( Client_Type( Client ) == CLIENT_UNKNOWN  ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER ))
 | 
			
		||||
	{
 | 
			
		||||
		/* Falsche Anzahl Parameter? */
 | 
			
		||||
		return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
	}
 | 
			
		||||
	else return IRC_WriteStrClient( Client, ERR_ALREADYREGISTRED_MSG, Client_ID( Client ));
 | 
			
		||||
 | 
			
		||||
	return CONNECTED;
 | 
			
		||||
} /* IRC_PASS */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
/**
 | 
			
		||||
 * IRC "NICK" command.
 | 
			
		||||
 * This function implements the IRC command "NICK" which is used to register
 | 
			
		||||
 * with the server, to change already registered nicknames and to introduce
 | 
			
		||||
 * new users which are connected to other servers.
 | 
			
		||||
 */
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_NICK( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *intr_c, *target, *c;
 | 
			
		||||
	CHAR *modes;
 | 
			
		||||
	char *modes;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
 | 
			
		||||
	/* Zumindest BitchX sendet NICK-USER in der falschen Reihenfolge. */
 | 
			
		||||
#ifndef STRICT_RFC
 | 
			
		||||
	if( Client_Type( Client ) == CLIENT_UNKNOWN || Client_Type( Client ) == CLIENT_GOTPASS || Client_Type( Client ) == CLIENT_GOTNICK || Client_Type( Client ) == CLIENT_GOTUSER || Client_Type( Client ) == CLIENT_USER || ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
 | 
			
		||||
	/* Some IRC clients, for example BitchX, send the NICK and USER
 | 
			
		||||
	 * commands in the wrong order ... */
 | 
			
		||||
	if( Client_Type( Client ) == CLIENT_UNKNOWN
 | 
			
		||||
	    || Client_Type( Client ) == CLIENT_GOTPASS
 | 
			
		||||
	    || Client_Type( Client ) == CLIENT_GOTNICK
 | 
			
		||||
	    || Client_Type( Client ) == CLIENT_GOTUSER
 | 
			
		||||
	    || Client_Type( Client ) == CLIENT_USER
 | 
			
		||||
	    || ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
 | 
			
		||||
#else
 | 
			
		||||
	if( Client_Type( Client ) == CLIENT_UNKNOWN || Client_Type( Client ) == CLIENT_GOTPASS || Client_Type( Client ) == CLIENT_GOTNICK || Client_Type( Client ) == CLIENT_USER || ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
 | 
			
		||||
	if( Client_Type( Client ) == CLIENT_UNKNOWN
 | 
			
		||||
	    || Client_Type( Client ) == CLIENT_GOTPASS
 | 
			
		||||
	    || Client_Type( Client ) == CLIENT_GOTNICK
 | 
			
		||||
	    || Client_Type( Client ) == CLIENT_USER
 | 
			
		||||
	    || ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
 | 
			
		||||
#endif
 | 
			
		||||
	{
 | 
			
		||||
		/* User-Registrierung bzw. Nick-Aenderung */
 | 
			
		||||
		/* User registration or change of nickname */
 | 
			
		||||
 | 
			
		||||
		/* Falsche Anzahl Parameter? */
 | 
			
		||||
		if( Req->argc != 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
		/* Wrong number of arguments? */
 | 
			
		||||
		if( Req->argc != 1 )
 | 
			
		||||
			return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
						   Client_ID( Client ),
 | 
			
		||||
						   Req->command );
 | 
			
		||||
 | 
			
		||||
		/* "Ziel-Client" ermitteln */
 | 
			
		||||
		/* Search "target" client */
 | 
			
		||||
		if( Client_Type( Client ) == CLIENT_SERVER )
 | 
			
		||||
		{
 | 
			
		||||
			target = Client_Search( Req->prefix );
 | 
			
		||||
			if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
 | 
			
		||||
			if( ! target )
 | 
			
		||||
				return IRC_WriteStrClient( Client,
 | 
			
		||||
							   ERR_NOSUCHNICK_MSG,
 | 
			
		||||
							   Client_ID( Client ),
 | 
			
		||||
							   Req->argv[0] );
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			/* Ist der Client "restricted"? */
 | 
			
		||||
			if( Client_HasMode( Client, 'r' )) return IRC_WriteStrClient( Client, ERR_RESTRICTED_MSG, Client_ID( Client ));
 | 
			
		||||
			/* Is this a restricted client? */
 | 
			
		||||
			if( Client_HasMode( Client, 'r' ))
 | 
			
		||||
				return IRC_WriteStrClient( Client,
 | 
			
		||||
							   ERR_RESTRICTED_MSG,
 | 
			
		||||
							   Client_ID( Client ));
 | 
			
		||||
 | 
			
		||||
			target = Client;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
#ifndef STRICT_RFC
 | 
			
		||||
		/* Wenn der Client zu seinem eigenen Nick wechseln will, so machen
 | 
			
		||||
		 * wir nichts. So macht es das Original und mind. Snak hat probleme,
 | 
			
		||||
		 * wenn wir es nicht so machen. Ob es so okay ist? Hm ... */
 | 
			
		||||
		if( strcmp( Client_ID( target ), Req->argv[0] ) == 0 ) return CONNECTED;
 | 
			
		||||
		/* If the clients tries to change to its own nickname we won't
 | 
			
		||||
		 * do anything. This is how the original ircd behaves and some
 | 
			
		||||
		 * clients (for example Snak) expect it to be like this.
 | 
			
		||||
		 * But I doubt that this is "really the right thing" ... */
 | 
			
		||||
		if( strcmp( Client_ID( target ), Req->argv[0] ) == 0 )
 | 
			
		||||
			return CONNECTED;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
		/* pruefen, ob Nick bereits vergeben. Speziallfall: der Client
 | 
			
		||||
		 * will nur die Gross- und Kleinschreibung aendern. Das darf
 | 
			
		||||
		 * er natuerlich machen :-) */
 | 
			
		||||
		/* Check that the new nickname is available. Special case:
 | 
			
		||||
		 * the client only changes from/to upper to lower case. */
 | 
			
		||||
		if( strcasecmp( Client_ID( target ), Req->argv[0] ) != 0 )
 | 
			
		||||
		{
 | 
			
		||||
			if( ! Client_CheckNick( target, Req->argv[0] )) return CONNECTED;
 | 
			
		||||
			if( ! Client_CheckNick( target, Req->argv[0] ))
 | 
			
		||||
				return CONNECTED;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if(( Client_Type( target ) != CLIENT_USER ) && ( Client_Type( target ) != CLIENT_SERVER ))
 | 
			
		||||
		if(( Client_Type( target ) != CLIENT_USER )
 | 
			
		||||
		   && ( Client_Type( target ) != CLIENT_SERVER ))
 | 
			
		||||
		{
 | 
			
		||||
			/* Neuer Client */
 | 
			
		||||
			Log( LOG_DEBUG, "Connection %d: got valid NICK command ...", Client_Conn( Client ));
 | 
			
		||||
			/* New client */
 | 
			
		||||
			Log( LOG_DEBUG, "Connection %d: got valid NICK command ...", 
 | 
			
		||||
			     Client_Conn( Client ));
 | 
			
		||||
 | 
			
		||||
			/* Client-Nick registrieren */
 | 
			
		||||
			/* Register new nickname of this client */
 | 
			
		||||
			Client_SetID( target, Req->argv[0] );
 | 
			
		||||
 | 
			
		||||
			/* schon ein USER da? Dann registrieren! */
 | 
			
		||||
			if( Client_Type( Client ) == CLIENT_GOTUSER ) return Hello_User( Client );
 | 
			
		||||
			else Client_SetType( Client, CLIENT_GOTNICK );
 | 
			
		||||
			/* If we received a valid USER command already then
 | 
			
		||||
			 * register the new client! */
 | 
			
		||||
			if( Client_Type( Client ) == CLIENT_GOTUSER )
 | 
			
		||||
				return Hello_User( Client );
 | 
			
		||||
			else
 | 
			
		||||
				Client_SetType( Client, CLIENT_GOTNICK );
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			/* Nick-Aenderung */
 | 
			
		||||
			/* Nickname change */
 | 
			
		||||
			if( Client_Conn( target ) > NONE )
 | 
			
		||||
			{
 | 
			
		||||
				/* lokaler Client */
 | 
			
		||||
				Log( LOG_INFO, "User \"%s\" changed nick (connection %d): \"%s\" -> \"%s\".", Client_Mask( target ), Client_Conn( target ), Client_ID( target ), Req->argv[0] );
 | 
			
		||||
				/* Local client */
 | 
			
		||||
				Log( LOG_INFO,
 | 
			
		||||
				     "User \"%s\" changed nick (connection %d): \"%s\" -> \"%s\".",
 | 
			
		||||
				     Client_Mask( target ), Client_Conn( target ),
 | 
			
		||||
				     Client_ID( target ), Req->argv[0] );
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				/* Remote-Client */
 | 
			
		||||
				Log( LOG_DEBUG, "User \"%s\" changed nick: \"%s\" -> \"%s\".", Client_Mask( target ), Client_ID( target ), Req->argv[0] );
 | 
			
		||||
				/* Remote client */
 | 
			
		||||
				Log( LOG_DEBUG,
 | 
			
		||||
				     "User \"%s\" changed nick: \"%s\" -> \"%s\".",
 | 
			
		||||
				     Client_Mask( target ), Client_ID( target ),
 | 
			
		||||
				     Req->argv[0] );
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/* alle betroffenen User und Server ueber Nick-Aenderung informieren */
 | 
			
		||||
			if( Client_Type( Client ) == CLIENT_USER ) IRC_WriteStrClientPrefix( Client, Client, "NICK :%s", Req->argv[0] );
 | 
			
		||||
			IRC_WriteStrServersPrefix( Client, target, "NICK :%s", Req->argv[0] );
 | 
			
		||||
			IRC_WriteStrRelatedPrefix( target, target, FALSE, "NICK :%s", Req->argv[0] );
 | 
			
		||||
			
 | 
			
		||||
			/* neuen Client-Nick speichern */
 | 
			
		||||
			/* Inform all users and servers (which have to know)
 | 
			
		||||
			 * of this nickname change */
 | 
			
		||||
			if( Client_Type( Client ) == CLIENT_USER )
 | 
			
		||||
				IRC_WriteStrClientPrefix( Client, Client,
 | 
			
		||||
							  "NICK :%s",
 | 
			
		||||
							  Req->argv[0] );
 | 
			
		||||
			IRC_WriteStrServersPrefix( Client, target,
 | 
			
		||||
						   "NICK :%s", Req->argv[0] );
 | 
			
		||||
			IRC_WriteStrRelatedPrefix( target, target, false,
 | 
			
		||||
						   "NICK :%s", Req->argv[0] );
 | 
			
		||||
 | 
			
		||||
			/* Register old nickname for WHOWAS queries */
 | 
			
		||||
			Client_RegisterWhowas( target );
 | 
			
		||||
 | 
			
		||||
			/* Save new nickname */
 | 
			
		||||
			Client_SetID( target, Req->argv[0] );
 | 
			
		||||
 | 
			
		||||
			IRC_SetPenalty( target, 2 );
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		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 );
 | 
			
		||||
@@ -248,7 +324,7 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Neue Client-Struktur anlegen */
 | 
			
		||||
		c = Client_NewRemoteUser( intr_c, Req->argv[0], atoi( Req->argv[1] ), Req->argv[2], Req->argv[3], atoi( Req->argv[4] ), Req->argv[5] + 1, Req->argv[6], TRUE );
 | 
			
		||||
		c = Client_NewRemoteUser( intr_c, Req->argv[0], atoi( Req->argv[1] ), Req->argv[2], Req->argv[3], atoi( Req->argv[4] ), Req->argv[5] + 1, Req->argv[6], true);
 | 
			
		||||
		if( ! c )
 | 
			
		||||
		{
 | 
			
		||||
			/* Eine neue Client-Struktur konnte nicht angelegt werden.
 | 
			
		||||
@@ -272,9 +348,13 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
} /* IRC_NICK */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_USER( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
#ifdef IDENTAUTH
 | 
			
		||||
	char *ptr;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
 | 
			
		||||
@@ -284,11 +364,21 @@ 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 );
 | 
			
		||||
@@ -303,21 +393,25 @@ IRC_USER( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
} /* IRC_USER */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_QUIT( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *target;
 | 
			
		||||
	char quitmsg[LINE_LEN];
 | 
			
		||||
	
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
		
 | 
			
		||||
	/* Wrong number of arguments? */
 | 
			
		||||
	if( Req->argc > 1 )
 | 
			
		||||
		return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
 | 
			
		||||
	if (Req->argc == 1)
 | 
			
		||||
		strlcpy(quitmsg, Req->argv[0], sizeof quitmsg);
 | 
			
		||||
 | 
			
		||||
	if ( Client_Type( Client ) == CLIENT_SERVER )
 | 
			
		||||
	{
 | 
			
		||||
		/* Server */
 | 
			
		||||
 | 
			
		||||
		/* Falsche Anzahl Parameter? */
 | 
			
		||||
		if( Req->argc > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
 | 
			
		||||
		target = Client_Search( Req->prefix );
 | 
			
		||||
		if( ! target )
 | 
			
		||||
		{
 | 
			
		||||
@@ -326,150 +420,230 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
			return CONNECTED;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if( Req->argc == 0 ) Client_Destroy( target, "Got QUIT command.", NULL, TRUE );
 | 
			
		||||
		else Client_Destroy( target, "Got QUIT command.", Req->argv[0], TRUE );
 | 
			
		||||
		Client_Destroy( target, "Got QUIT command.", Req->argc == 1 ? quitmsg : NULL, true);
 | 
			
		||||
 | 
			
		||||
		return CONNECTED;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		/* User, Service, oder noch nicht registriert */
 | 
			
		||||
		
 | 
			
		||||
		/* Falsche Anzahl Parameter? */
 | 
			
		||||
		if( Req->argc > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
		if (Req->argc == 1 && quitmsg[0] != '\"') {
 | 
			
		||||
			/* " " to avoid confusion */
 | 
			
		||||
			strlcpy(quitmsg, "\"", sizeof quitmsg);
 | 
			
		||||
			strlcat(quitmsg, Req->argv[0], sizeof quitmsg-1);
 | 
			
		||||
			strlcat(quitmsg, "\"", sizeof quitmsg );
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if( Req->argc == 0 ) Conn_Close( Client_Conn( Client ), "Got QUIT command.", NULL, TRUE );
 | 
			
		||||
		else Conn_Close( Client_Conn( Client ), "Got QUIT command.", Req->argv[0], TRUE );
 | 
			
		||||
		/* User, Service, oder noch nicht registriert */
 | 
			
		||||
		Conn_Close( Client_Conn( Client ), "Got QUIT command.", Req->argc == 1 ? quitmsg : NULL, true);
 | 
			
		||||
		
 | 
			
		||||
		return DISCONNECTED;
 | 
			
		||||
	}
 | 
			
		||||
} /* IRC_QUIT */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
IRC_PING( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_PING(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *target, *from;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
	assert(Client != NULL);
 | 
			
		||||
	assert(Req != NULL);
 | 
			
		||||
 | 
			
		||||
	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 ));
 | 
			
		||||
	/* Wrong number of arguments? */
 | 
			
		||||
	if (Req->argc < 1)
 | 
			
		||||
		return IRC_WriteStrClient(Client, ERR_NOORIGIN_MSG,
 | 
			
		||||
					  Client_ID(Client));
 | 
			
		||||
#ifdef STRICT_RFC
 | 
			
		||||
	if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
	/* Don't ignore additional arguments when in "strict" mode */
 | 
			
		||||
	if (Req->argc > 2)
 | 
			
		||||
		 return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
					   Client_ID(Client), Req->command);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	if( Req->argc > 1 )
 | 
			
		||||
	{
 | 
			
		||||
		/* es wurde ein Ziel-Client angegeben */
 | 
			
		||||
		target = Client_Search( Req->argv[1] );
 | 
			
		||||
		if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] );
 | 
			
		||||
		if( target != Client_ThisServer( ))
 | 
			
		||||
		{
 | 
			
		||||
			/* ok, forwarden */
 | 
			
		||||
			if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
 | 
			
		||||
			else from = Client;
 | 
			
		||||
			if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix );
 | 
			
		||||
			return IRC_WriteStrClientPrefix( target, from, "PING %s :%s", Client_ID( from ), Req->argv[1] );
 | 
			
		||||
	if (Req->argc > 1) {
 | 
			
		||||
		/* A target has been specified ... */
 | 
			
		||||
		target = Client_Search(Req->argv[1]);
 | 
			
		||||
 | 
			
		||||
		if (!target || Client_Type(target) != CLIENT_SERVER)
 | 
			
		||||
			return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
 | 
			
		||||
					Client_ID(Client), Req->argv[1]);
 | 
			
		||||
 | 
			
		||||
		if (target != Client_ThisServer()) {
 | 
			
		||||
			/* Ok, we have to forward the PING */
 | 
			
		||||
			if (Client_Type(Client) == CLIENT_SERVER)
 | 
			
		||||
				from = Client_Search(Req->prefix);
 | 
			
		||||
			else
 | 
			
		||||
				from = Client;
 | 
			
		||||
			if (!from)
 | 
			
		||||
				return IRC_WriteStrClient(Client,
 | 
			
		||||
						ERR_NOSUCHSERVER_MSG,
 | 
			
		||||
						Client_ID(Client), Req->prefix);
 | 
			
		||||
 | 
			
		||||
			return IRC_WriteStrClientPrefix(target, from,
 | 
			
		||||
					"PING %s :%s", Req->argv[0],
 | 
			
		||||
					Req->argv[1] );
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	Log( LOG_DEBUG, "Connection %d: got PING, sending PONG ...", Client_Conn( Client ));
 | 
			
		||||
	return IRC_WriteStrClient( Client, "PONG %s :%s", Client_ID( Client_ThisServer( )), Client_ID( Client ));
 | 
			
		||||
	if (Client_Type(Client) == CLIENT_SERVER) {
 | 
			
		||||
		if (Req->prefix)
 | 
			
		||||
			from = Client_Search(Req->prefix);
 | 
			
		||||
		else
 | 
			
		||||
			from = Client;
 | 
			
		||||
	} else
 | 
			
		||||
		from = Client_ThisServer();
 | 
			
		||||
	if (!from)
 | 
			
		||||
		return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
 | 
			
		||||
					Client_ID(Client), Req->prefix);
 | 
			
		||||
 | 
			
		||||
	Log(LOG_DEBUG, "Connection %d: got PING, sending PONG ...",
 | 
			
		||||
	    Client_Conn(Client));
 | 
			
		||||
 | 
			
		||||
#ifdef STRICT_RFC
 | 
			
		||||
	return IRC_WriteStrClient(Client, "PONG %s :%s",
 | 
			
		||||
		Client_ID(from), Client_ID(Client));
 | 
			
		||||
#else
 | 
			
		||||
	/* Some clients depend on the argument being returned in the PONG
 | 
			
		||||
	 * reply (not mentioned in any RFC, though) */
 | 
			
		||||
	return IRC_WriteStrClient(Client, "PONG %s :%s",
 | 
			
		||||
		Client_ID(from), Req->argv[0]);
 | 
			
		||||
#endif
 | 
			
		||||
} /* IRC_PING */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
IRC_PONG( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_PONG(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *target, *from;
 | 
			
		||||
	char *s;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
	assert(Client != NULL);
 | 
			
		||||
	assert(Req != NULL);
 | 
			
		||||
 | 
			
		||||
	if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
 | 
			
		||||
	/* Wrong number of arguments? */
 | 
			
		||||
	if (Req->argc < 1)
 | 
			
		||||
		return IRC_WriteStrClient(Client, ERR_NOORIGIN_MSG,
 | 
			
		||||
					  Client_ID(Client));
 | 
			
		||||
	if (Req->argc > 2)
 | 
			
		||||
		return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
					  Client_ID(Client), Req->command);
 | 
			
		||||
 | 
			
		||||
	/* 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 );
 | 
			
		||||
	/* Forward? */
 | 
			
		||||
	if (Req->argc == 2 && Client_Type(Client) == CLIENT_SERVER) {
 | 
			
		||||
		target = Client_Search(Req->argv[0]);
 | 
			
		||||
		if (!target)
 | 
			
		||||
			return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
 | 
			
		||||
					Client_ID(Client), Req->argv[0]);
 | 
			
		||||
 | 
			
		||||
	/* forwarden? */
 | 
			
		||||
	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_ThisServer( ))
 | 
			
		||||
		{
 | 
			
		||||
			/* ok, forwarden */
 | 
			
		||||
			if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
 | 
			
		||||
			else from = Client;
 | 
			
		||||
			if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix );
 | 
			
		||||
			return IRC_WriteStrClientPrefix( target, from, "PONG %s :%s", Client_ID( from ), Req->argv[1] );
 | 
			
		||||
		from = Client_Search(Req->prefix);
 | 
			
		||||
 | 
			
		||||
		if (target != Client_ThisServer() && target != from) {
 | 
			
		||||
			/* Ok, we have to forward the message. */
 | 
			
		||||
			if (!from)
 | 
			
		||||
				return IRC_WriteStrClient(Client,
 | 
			
		||||
						ERR_NOSUCHSERVER_MSG,
 | 
			
		||||
						Client_ID(Client), Req->prefix);
 | 
			
		||||
 | 
			
		||||
			if (Client_Type(Client_NextHop(target)) != CLIENT_SERVER)
 | 
			
		||||
				s = Client_ID(from);
 | 
			
		||||
			else
 | 
			
		||||
				s = Req->argv[0];
 | 
			
		||||
			return IRC_WriteStrClientPrefix(target, from,
 | 
			
		||||
				 "PONG %s :%s", s, Req->argv[1]);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Der Connection-Timestamp wurde schon beim Lesen aus dem Socket
 | 
			
		||||
	 * aktualisiert, daher muss das hier nicht mehr gemacht werden. */
 | 
			
		||||
	/* The connection timestamp has already been updated when the data has
 | 
			
		||||
	 * been read from so socket, so we don't need to update it here. */
 | 
			
		||||
 | 
			
		||||
	if( Client_Conn( Client ) > NONE ) Log( LOG_DEBUG, "Connection %d: received PONG. Lag: %ld seconds.", Client_Conn( Client ), time( NULL ) - Conn_LastPing( Client_Conn( Client )));
 | 
			
		||||
	else Log( LOG_DEBUG, "Connection %d: received PONG.", Client_Conn( Client ));
 | 
			
		||||
	if (Client_Conn(Client) > NONE)
 | 
			
		||||
		Log(LOG_DEBUG,
 | 
			
		||||
			"Connection %d: received PONG. Lag: %ld seconds.",
 | 
			
		||||
			Client_Conn(Client),
 | 
			
		||||
			time(NULL) - Conn_LastPing(Client_Conn(Client)));
 | 
			
		||||
	else
 | 
			
		||||
		 Log(LOG_DEBUG,
 | 
			
		||||
			"Connection %d: received PONG.", Client_Conn(Client));
 | 
			
		||||
 | 
			
		||||
	return CONNECTED;
 | 
			
		||||
} /* IRC_PONG */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL BOOLEAN
 | 
			
		||||
Hello_User( CLIENT *Client )
 | 
			
		||||
static bool
 | 
			
		||||
Hello_User(CLIENT * Client)
 | 
			
		||||
{
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert(Client != NULL);
 | 
			
		||||
 | 
			
		||||
	/* Passwort ueberpruefen */
 | 
			
		||||
	if( strcmp( Client_Password( Client ), Conf_ServerPwd ) != 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Falsches Passwort */
 | 
			
		||||
		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 );
 | 
			
		||||
	/* Check password ... */
 | 
			
		||||
	if (strcmp(Client_Password(Client), Conf_ServerPwd) != 0) {
 | 
			
		||||
		/* 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);
 | 
			
		||||
		return DISCONNECTED;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	Log( LOG_NOTICE, "User \"%s\" registered (connection %d).", Client_Mask( Client ), Client_Conn( Client ));
 | 
			
		||||
	Log(LOG_NOTICE, "User \"%s\" registered (connection %d).",
 | 
			
		||||
	    Client_Mask(Client), Client_Conn(Client));
 | 
			
		||||
 | 
			
		||||
	/* Andere Server informieren */
 | 
			
		||||
	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 ));
 | 
			
		||||
	/* 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( )), VERSION, TARGET_CPU, TARGET_CPU, TARGET_OS )) 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( )), VERSION, USERMODES, CHANMODES )) return FALSE;
 | 
			
		||||
	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()), PACKAGE_VERSION, TARGET_CPU,
 | 
			
		||||
	     TARGET_VENDOR, TARGET_OS))
 | 
			
		||||
		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()), PACKAGE_VERSION, USERMODES,
 | 
			
		||||
	     CHANMODES))
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	Client_SetType( Client, CLIENT_USER );
 | 
			
		||||
	/* Features supported by this server (005 numeric, ISUPPORT),
 | 
			
		||||
	 * see <http://www.irc.org/tech_docs/005.html> for details. */
 | 
			
		||||
	if (!IRC_Send_ISUPPORT(Client))
 | 
			
		||||
		return DISCONNECTED;
 | 
			
		||||
 | 
			
		||||
	if( ! IRC_Send_LUSERS( Client )) return DISCONNECTED;
 | 
			
		||||
	if( ! IRC_Show_MOTD( Client )) 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 )
 | 
			
		||||
static 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,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: irc-login.h,v 1.4 2002/05/27 13:09:27 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)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -19,12 +18,12 @@
 | 
			
		||||
#define __irc_login_h__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN IRC_PASS PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_NICK PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_USER PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_PING PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_PONG PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_QUIT PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_PASS PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_NICK PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_USER PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_PING PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_PONG PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_QUIT PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
										
											
												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: irc-mode.h,v 1.4 2002/05/27 13:09:27 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)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -19,8 +18,8 @@
 | 
			
		||||
#define __irc_mode_h__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN IRC_MODE PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_AWAY PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_MODE PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_AWAY PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -1,31 +1,30 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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-op.c,v 1.9 2002/09/08 17:06:54 alex Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * irc-op.c: Befehle zur Channel-Verwaltung
 | 
			
		||||
 * Channel operator commands
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: irc-op.c,v 1.17 2006/12/07 17:57:20 fw Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "client.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "irc-write.h"
 | 
			
		||||
#include "lists.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
@@ -36,7 +35,7 @@
 | 
			
		||||
#include "irc-op.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_KICK( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *target, *from;
 | 
			
		||||
@@ -44,9 +43,6 @@ IRC_KICK( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
 | 
			
		||||
	/* Valider Client? */
 | 
			
		||||
	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) || ( Req->argc > 3 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
 | 
			
		||||
@@ -63,27 +59,24 @@ IRC_KICK( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
} /* IRC_KICK */	
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_INVITE( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CHANNEL *chan;
 | 
			
		||||
	CLIENT *target, *from;
 | 
			
		||||
	BOOLEAN remember = FALSE;
 | 
			
		||||
	bool remember = false;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
 | 
			
		||||
	/* Valider Client? */
 | 
			
		||||
	if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
 | 
			
		||||
 | 
			
		||||
	/* Falsche Anzahl Parameter? */
 | 
			
		||||
	/* 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 );
 | 
			
		||||
	
 | 
			
		||||
	/* User suchen */
 | 
			
		||||
	/* 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] );
 | 
			
		||||
 | 
			
		||||
@@ -91,36 +84,38 @@ IRC_INVITE( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
 | 
			
		||||
	if( chan )
 | 
			
		||||
	{
 | 
			
		||||
		/* Der Channel existiert bereits; ist der User Mitglied? */
 | 
			
		||||
		/* 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] );
 | 
			
		||||
 | 
			
		||||
		/* Ist der Channel "invite-only"? */
 | 
			
		||||
		/* Is the channel "invite-only"? */
 | 
			
		||||
		if( strchr( Channel_Modes( chan ), 'i' ))
 | 
			
		||||
		{
 | 
			
		||||
			/* Ja. Der User muss Channel-Operator sein! */
 | 
			
		||||
			/* Yes. The user must be channel operator! */
 | 
			
		||||
			if( ! strchr( Channel_UserModes( chan, from ), 'o' )) return IRC_WriteStrClient( from, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( from ), Channel_Name( chan ));
 | 
			
		||||
			remember = TRUE;
 | 
			
		||||
			remember = true;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Ist der Ziel-User bereits Mitglied? */
 | 
			
		||||
		/* 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_Check(Channel_GetListBans(chan), target )) remember = true;
 | 
			
		||||
 | 
			
		||||
		if (remember) {
 | 
			
		||||
			/* We must remember this invite */
 | 
			
		||||
			if( ! Channel_AddInvite(chan, Client_Mask( target ), true))
 | 
			
		||||
				return CONNECTED;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Wenn der User gebanned ist, so muss das Invite auch gespeichert werden */
 | 
			
		||||
	if( Lists_CheckBanned( target, chan )) remember = TRUE;
 | 
			
		||||
	LogDebug("User \"%s\" invites \"%s\" to \"%s\" ...", Client_Mask(from), Req->argv[0], Req->argv[1]);
 | 
			
		||||
 | 
			
		||||
	Log( LOG_DEBUG, "User \"%s\" invites \"%s\" to \"%s\" ...", Client_Mask( from ), Req->argv[0], Req->argv[1] );
 | 
			
		||||
	if( remember )
 | 
			
		||||
	{
 | 
			
		||||
		if( ! Lists_AddInvited( from, Client_Mask( target ), chan, TRUE )) return CONNECTED;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/* an Ziel-Client forwarden ... */
 | 
			
		||||
	/* Inform target client */
 | 
			
		||||
	IRC_WriteStrClientPrefix( target, from, "INVITE %s %s", Req->argv[0], Req->argv[1] );
 | 
			
		||||
 | 
			
		||||
	if( Client_Conn( target ) > NONE )
 | 
			
		||||
	{
 | 
			
		||||
		/* lokaler Ziel-Client, Status-Code melden */
 | 
			
		||||
		/* 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;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
 
 | 
			
		||||
@@ -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: irc-op.h,v 1.2 2002/09/08 00:52:55 alex Exp $
 | 
			
		||||
 * $Id: irc-op.h,v 1.4 2005/03/19 18:43:48 fw Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * irc-op.h: Befehle zur Channel-Verwaltung (Header)
 | 
			
		||||
 * Channel operator commands (header)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -19,8 +18,8 @@
 | 
			
		||||
#define __irc_op_h__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN IRC_KICK PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_INVITE PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_KICK PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_INVITE PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -2,33 +2,34 @@
 | 
			
		||||
 * 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.8 2002/09/03 23:54:59 alex Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * irc-oper.c: IRC-Operator-Befehle
 | 
			
		||||
 * IRC operator commands
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: irc-oper.c,v 1.29 2007/08/02 10:14:26 fw Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include "ngircd.h"
 | 
			
		||||
#include "resolve.h"
 | 
			
		||||
#include "conn-func.h"
 | 
			
		||||
#include "conf.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "client.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
#include "irc-write.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "match.h"
 | 
			
		||||
#include "messages.h"
 | 
			
		||||
#include "parse.h"
 | 
			
		||||
 | 
			
		||||
@@ -36,16 +37,24 @@
 | 
			
		||||
#include "irc-oper.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
static bool
 | 
			
		||||
Bad_OperPass(CLIENT *Client, char *errtoken, char *errmsg)
 | 
			
		||||
{
 | 
			
		||||
	Log( LOG_WARNING, "Got invalid OPER from \"%s\": \"%s\" -- %s", Client_Mask( Client ),
 | 
			
		||||
										errtoken, errmsg);
 | 
			
		||||
	IRC_SetPenalty(Client, 3);
 | 
			
		||||
	return IRC_WriteStrClient( Client, ERR_PASSWDMISMATCH_MSG, Client_ID( Client ));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_OPER( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	INT i;
 | 
			
		||||
	unsigned int i;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
 | 
			
		||||
	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 );
 | 
			
		||||
 | 
			
		||||
@@ -55,17 +64,15 @@ IRC_OPER( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
		if( Conf_Oper[i].name[0] && Conf_Oper[i].pwd[0] && ( strcmp( Conf_Oper[i].name, Req->argv[0] ) == 0 )) break;
 | 
			
		||||
	}
 | 
			
		||||
	if( i >= Conf_Oper_Count )
 | 
			
		||||
	{
 | 
			
		||||
		Log( LOG_WARNING, "Got invalid OPER from \"%s\": Name \"%s\" not configured!", Client_Mask( Client ), Req->argv[0] );
 | 
			
		||||
		return IRC_WriteStrClient( Client, ERR_PASSWDMISMATCH_MSG, Client_ID( Client ));
 | 
			
		||||
	}
 | 
			
		||||
		return Bad_OperPass(Client, Req->argv[0], "not configured");
 | 
			
		||||
 | 
			
		||||
	/* Stimmt das Passwort? */
 | 
			
		||||
	if( strcmp( Conf_Oper[i].pwd, Req->argv[1] ) != 0 )
 | 
			
		||||
	{
 | 
			
		||||
		Log( LOG_WARNING, "Got invalid OPER from \"%s\": Bad password for \"%s\"!", Client_Mask( Client ), Conf_Oper[i].name );
 | 
			
		||||
		return IRC_WriteStrClient( Client, ERR_PASSWDMISMATCH_MSG, Client_ID( Client ));
 | 
			
		||||
	}
 | 
			
		||||
		return Bad_OperPass(Client, Conf_Oper[i].name, "Bad password");
 | 
			
		||||
 | 
			
		||||
	/* Authorized Mask? */
 | 
			
		||||
	if( Conf_Oper[i].mask && (! Match( Conf_Oper[i].mask, Client_Mask( Client ) )))
 | 
			
		||||
		return Bad_OperPass(Client, Conf_Oper[i].mask, "hostmask check failed" );
 | 
			
		||||
 | 
			
		||||
	if( ! Client_HasMode( Client, 'o' ))
 | 
			
		||||
	{
 | 
			
		||||
@@ -77,68 +84,233 @@ 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)
 | 
			
		||||
{
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
	/* Shut down server */
 | 
			
		||||
 | 
			
		||||
	if( Client_Type( Client ) != CLIENT_USER ) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
 | 
			
		||||
	CONN_ID c;
 | 
			
		||||
	CLIENT *cl;
 | 
			
		||||
 | 
			
		||||
	/* Falsche Anzahl Parameter? */
 | 
			
		||||
	if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
	assert(Client != NULL);
 | 
			
		||||
	assert(Req != NULL);
 | 
			
		||||
 | 
			
		||||
	if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
 | 
			
		||||
	/* 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? */
 | 
			
		||||
#ifdef STRICT_RFC
 | 
			
		||||
	if (Req->argc != 0)
 | 
			
		||||
#else
 | 
			
		||||
	if (Req->argc > 1)
 | 
			
		||||
#endif
 | 
			
		||||
		return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
					  Client_ID(Client), Req->command);
 | 
			
		||||
 | 
			
		||||
	/* Is a message given? */
 | 
			
		||||
	if (Req->argc > 0) {
 | 
			
		||||
		c = Conn_First();
 | 
			
		||||
		while (c != NONE) {
 | 
			
		||||
			cl = Conn_GetClient(c);
 | 
			
		||||
			if (Client_Type(cl) == CLIENT_USER)
 | 
			
		||||
				IRC_WriteStrClient(cl, "NOTICE %s :%s",
 | 
			
		||||
						Client_ID(cl), Req->argv[0]);
 | 
			
		||||
			c = Conn_Next(c);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	Log(LOG_NOTICE | LOG_snotice, "Got DIE command from \"%s\" ...",
 | 
			
		||||
	    Client_Mask(Client));
 | 
			
		||||
	NGIRCd_SignalQuit = true;
 | 
			
		||||
 | 
			
		||||
	Log( LOG_NOTICE|LOG_snotice, "Got DIE command from \"%s\", going down!", Client_Mask( Client ));
 | 
			
		||||
	NGIRCd_Quit = 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 BOOLEAN
 | 
			
		||||
IRC_CONNECT(CLIENT *Client, REQUEST *Req )
 | 
			
		||||
/**
 | 
			
		||||
 * Connect configured or new server.
 | 
			
		||||
 */
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_CONNECT(CLIENT * Client, REQUEST * Req)
 | 
			
		||||
{
 | 
			
		||||
	/* Vorlaeufige Version zu Debug-Zwecken: es wird einfach
 | 
			
		||||
	 * der "passive mode" aufgehoben, mehr passiert nicht ... */
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
	assert(Client != NULL);
 | 
			
		||||
	assert(Req != NULL);
 | 
			
		||||
 | 
			
		||||
	if( Client_Type( Client ) != CLIENT_USER ) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
 | 
			
		||||
	/* Not a local IRC operator? */
 | 
			
		||||
	if ((!Client_HasMode(Client, 'o')) || (!Client_OperByMe(Client)))
 | 
			
		||||
		return IRC_WriteStrClient(Client, ERR_NOPRIVILEGES_MSG,
 | 
			
		||||
					  Client_ID(Client));
 | 
			
		||||
 | 
			
		||||
	/* Falsche Anzahl Parameter? */
 | 
			
		||||
	if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
	if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
 | 
			
		||||
	/* Bad number of parameters? */
 | 
			
		||||
	if ((Req->argc != 1) && (Req->argc != 2) && (Req->argc != 5))
 | 
			
		||||
		return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
					  Client_ID(Client), Req->command);
 | 
			
		||||
 | 
			
		||||
	/* Invalid port number? */
 | 
			
		||||
	if ((Req->argc > 1) && atoi(Req->argv[1]) < 1)
 | 
			
		||||
		return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
					  Client_ID(Client), Req->command);
 | 
			
		||||
 | 
			
		||||
	Log(LOG_NOTICE | LOG_snotice,
 | 
			
		||||
	    "Got CONNECT command from \"%s\" for \"%s\".", Client_Mask(Client),
 | 
			
		||||
	    Req->argv[0]);
 | 
			
		||||
 | 
			
		||||
	switch (Req->argc) {
 | 
			
		||||
	case 1:
 | 
			
		||||
		if (!Conf_EnablePassiveServer(Req->argv[0]))
 | 
			
		||||
			return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
 | 
			
		||||
						  Client_ID(Client),
 | 
			
		||||
						  Req->argv[0]);
 | 
			
		||||
	break;
 | 
			
		||||
	case 2:
 | 
			
		||||
		/* Connect configured server */
 | 
			
		||||
		if (!Conf_EnableServer
 | 
			
		||||
		    (Req->argv[0], (UINT16) atoi(Req->argv[1])))
 | 
			
		||||
			return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
 | 
			
		||||
						  Client_ID(Client),
 | 
			
		||||
						  Req->argv[0]);
 | 
			
		||||
	break;
 | 
			
		||||
	default:
 | 
			
		||||
		/* Add server */
 | 
			
		||||
		if (!Conf_AddServer
 | 
			
		||||
		    (Req->argv[0], (UINT16) atoi(Req->argv[1]), Req->argv[2],
 | 
			
		||||
		     Req->argv[3], Req->argv[4]))
 | 
			
		||||
			return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
 | 
			
		||||
						  Client_ID(Client),
 | 
			
		||||
						  Req->argv[0]);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	Log( LOG_NOTICE|LOG_snotice, "Got CONNECT command from \"%s\".", Client_Mask( Client ));
 | 
			
		||||
	NGIRCd_Passive = FALSE;
 | 
			
		||||
	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( Conn_GetClient( my_conn )) return CONNECTED;
 | 
			
		||||
	else return DISCONNECTED;
 | 
			
		||||
} /* IRC_CONNECT */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_WALLOPS( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *to, *from;
 | 
			
		||||
	int client_type;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
 | 
			
		||||
	if (Req->argc != 1)
 | 
			
		||||
		return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command);
 | 
			
		||||
 | 
			
		||||
	client_type = Client_Type(Client);
 | 
			
		||||
	switch (client_type) {
 | 
			
		||||
	case CLIENT_USER:
 | 
			
		||||
		if (!Client_OperByMe(Client))
 | 
			
		||||
			return IRC_WriteStrClient(Client, ERR_NOPRIVILEGES_MSG, Client_ID(Client));
 | 
			
		||||
		from = Client;
 | 
			
		||||
		break;
 | 
			
		||||
	case CLIENT_SERVER:
 | 
			
		||||
		from = Client_Search(Req->prefix);
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		return CONNECTED;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!from)
 | 
			
		||||
		return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, Client_ID(Client), Req->prefix);
 | 
			
		||||
 | 
			
		||||
	for (to=Client_First(); to != NULL; to=Client_Next(to)) {
 | 
			
		||||
		if (Client_Conn(to) < 0) /* no local connection or WALLOPS origin */
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
		client_type = Client_Type(to);
 | 
			
		||||
		switch (client_type) {
 | 
			
		||||
		case CLIENT_USER:
 | 
			
		||||
			if (Client_HasMode(to, 'w'))
 | 
			
		||||
				IRC_WriteStrClientPrefix(to, from, "WALLOPS :%s", Req->argv[0]);
 | 
			
		||||
			break;
 | 
			
		||||
		case CLIENT_SERVER:
 | 
			
		||||
			if (to != Client)
 | 
			
		||||
				IRC_WriteStrClientPrefix(to, from, "WALLOPS :%s", Req->argv[0]);
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return CONNECTED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* -eof- */
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user