mirror of
				https://github.com/osmarks/ngircd.git
				synced 2025-11-03 23:43:00 +00:00 
			
		
		
		
	Compare commits
	
		
			329 Commits
		
	
	
		
			rel-0-9-2
			...
			branch-0-1
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					3b69da0c52 | ||
| 
						 | 
					04933f5b8b | ||
| 
						 | 
					45df522bcb | ||
| 
						 | 
					51260c2e9f | ||
| 
						 | 
					55865d7fc6 | ||
| 
						 | 
					082a92beef | ||
| 
						 | 
					e92c889580 | ||
| 
						 | 
					de4676f066 | ||
| 
						 | 
					64a98338d5 | ||
| 
						 | 
					f4709082fe | ||
| 
						 | 
					997abc6889 | ||
| 
						 | 
					b7047f2e3b | ||
| 
						 | 
					e990d96c61 | ||
| 
						 | 
					d986cd372f | ||
| 
						 | 
					762aec0e08 | ||
| 
						 | 
					f8cb8e3f20 | ||
| 
						 | 
					478a8c01f9 | ||
| 
						 | 
					61e6b5c0aa | ||
| 
						 | 
					91a6fffaa0 | ||
| 
						 | 
					2ce5b734bd | ||
| 
						 | 
					f99f9a8f02 | ||
| 
						 | 
					4715ccf9ca | ||
| 
						 | 
					8974e90552 | ||
| 
						 | 
					2fe13f0a45 | ||
| 
						 | 
					20ce56cc5b | ||
| 
						 | 
					47a0379e2b | ||
| 
						 | 
					37563537a9 | ||
| 
						 | 
					82d32ffb28 | ||
| 
						 | 
					024588dbe7 | ||
| 
						 | 
					47ca178a21 | ||
| 
						 | 
					12db0bdc4f | ||
| 
						 | 
					53b98fd7e9 | ||
| 
						 | 
					c7d4d85666 | ||
| 
						 | 
					4659dae6eb | ||
| 
						 | 
					68f896eee0 | ||
| 
						 | 
					06bfb3adfb | ||
| 
						 | 
					2f305331a1 | ||
| 
						 | 
					ad7361dfe0 | ||
| 
						 | 
					e47c9d750f | ||
| 
						 | 
					001c00b273 | ||
| 
						 | 
					b861f536b2 | ||
| 
						 | 
					877bcc55f2 | ||
| 
						 | 
					8f162f4e17 | ||
| 
						 | 
					089ca21b3d | ||
| 
						 | 
					137a139112 | ||
| 
						 | 
					b160f574de | ||
| 
						 | 
					d223b587e4 | ||
| 
						 | 
					77939c382d | ||
| 
						 | 
					f586052f2b | ||
| 
						 | 
					d4ed056147 | ||
| 
						 | 
					9021ea2070 | ||
| 
						 | 
					640367e886 | ||
| 
						 | 
					4b9e52eb4d | ||
| 
						 | 
					69081851ac | ||
| 
						 | 
					efcca62a35 | ||
| 
						 | 
					cd65e0a56e | ||
| 
						 | 
					2275add327 | ||
| 
						 | 
					fd1091541b | ||
| 
						 | 
					5675be4cd9 | ||
| 
						 | 
					f1486e6a53 | ||
| 
						 | 
					22a9ed6694 | ||
| 
						 | 
					ddf56cbe5f | ||
| 
						 | 
					255edf7eab | ||
| 
						 | 
					5930a29197 | ||
| 
						 | 
					07d8da60de | ||
| 
						 | 
					44afe042d1 | ||
| 
						 | 
					a073bc89c4 | ||
| 
						 | 
					63e89ceb21 | ||
| 
						 | 
					09416f36bf | ||
| 
						 | 
					508b55126f | ||
| 
						 | 
					9f65979979 | ||
| 
						 | 
					2e34ddae53 | ||
| 
						 | 
					09deb857ce | ||
| 
						 | 
					8c14d397ba | ||
| 
						 | 
					99eab1e216 | ||
| 
						 | 
					c93d089736 | ||
| 
						 | 
					429f85b77a | ||
| 
						 | 
					ea2a4b3370 | ||
| 
						 | 
					f9b9850662 | ||
| 
						 | 
					1b852fce72 | ||
| 
						 | 
					82aaffe55d | ||
| 
						 | 
					40199e0b56 | ||
| 
						 | 
					95b7dbcc18 | ||
| 
						 | 
					43f8d149bb | ||
| 
						 | 
					949a4ef793 | ||
| 
						 | 
					f74781647a | ||
| 
						 | 
					5c78230283 | ||
| 
						 | 
					ee568cc444 | ||
| 
						 | 
					2d9a3ec484 | ||
| 
						 | 
					262d945284 | ||
| 
						 | 
					f6ce2d557a | ||
| 
						 | 
					4243cae985 | ||
| 
						 | 
					40226d26b2 | ||
| 
						 | 
					d2f7d3087d | ||
| 
						 | 
					3f1e03edd9 | ||
| 
						 | 
					23e7f7f0dd | ||
| 
						 | 
					f36746a4d0 | ||
| 
						 | 
					8cb0e3af68 | ||
| 
						 | 
					eb3ddace46 | ||
| 
						 | 
					5040d56489 | ||
| 
						 | 
					fb0fbe908d | ||
| 
						 | 
					fa7bb2790a | ||
| 
						 | 
					5877bca4bc | ||
| 
						 | 
					37602d1523 | ||
| 
						 | 
					a09034563a | ||
| 
						 | 
					5b35b101f2 | ||
| 
						 | 
					058d3085a9 | ||
| 
						 | 
					74883f57da | ||
| 
						 | 
					018e351630 | ||
| 
						 | 
					6e105bf87e | ||
| 
						 | 
					61966a6088 | ||
| 
						 | 
					27c96632f1 | ||
| 
						 | 
					4108e16be6 | ||
| 
						 | 
					4e02bdc322 | ||
| 
						 | 
					ca5e09865e | ||
| 
						 | 
					fb0c7ad252 | ||
| 
						 | 
					d8950c5dd0 | ||
| 
						 | 
					257312b102 | ||
| 
						 | 
					27d947fb7d | ||
| 
						 | 
					bed98979dc | ||
| 
						 | 
					bddb4914b4 | ||
| 
						 | 
					4c6c6ecf0e | ||
| 
						 | 
					a2f5a05ff8 | ||
| 
						 | 
					639eb40035 | ||
| 
						 | 
					0d6f9d4e3e | ||
| 
						 | 
					147de9dfa9 | ||
| 
						 | 
					f6e729443e | ||
| 
						 | 
					e426c131c7 | ||
| 
						 | 
					b9661ae65d | ||
| 
						 | 
					035f7fb2fe | ||
| 
						 | 
					1b2c228de5 | ||
| 
						 | 
					4d7d1d23be | ||
| 
						 | 
					e2aacff7d4 | ||
| 
						 | 
					0eccdbc137 | ||
| 
						 | 
					939ee6a39b | ||
| 
						 | 
					8423b89996 | ||
| 
						 | 
					7d87318b04 | ||
| 
						 | 
					83caef4598 | ||
| 
						 | 
					7378860aea | ||
| 
						 | 
					6eb3f3055d | ||
| 
						 | 
					c888c81adf | ||
| 
						 | 
					fac4682212 | ||
| 
						 | 
					47026e14ce | ||
| 
						 | 
					63626449f8 | ||
| 
						 | 
					184eb1c54b | ||
| 
						 | 
					5ce6bf28d1 | ||
| 
						 | 
					f1f94f07e1 | ||
| 
						 | 
					c8fd051e06 | ||
| 
						 | 
					3e8978d836 | ||
| 
						 | 
					9a2d4eef44 | ||
| 
						 | 
					0d5fc770d3 | ||
| 
						 | 
					5590f8624b | ||
| 
						 | 
					fdc7ae22e9 | ||
| 
						 | 
					179d61c588 | ||
| 
						 | 
					47e581e453 | ||
| 
						 | 
					65573d7a07 | ||
| 
						 | 
					155056f386 | ||
| 
						 | 
					3833f8aae3 | ||
| 
						 | 
					161340d486 | ||
| 
						 | 
					e9e1fa459b | ||
| 
						 | 
					581f5479a2 | ||
| 
						 | 
					00ab67dcdb | ||
| 
						 | 
					dd3a3bc603 | ||
| 
						 | 
					0a3f562f36 | ||
| 
						 | 
					9dfd42a7e6 | ||
| 
						 | 
					a65eb347ec | ||
| 
						 | 
					2af87e9152 | ||
| 
						 | 
					d0045afb09 | ||
| 
						 | 
					1f5bdaec84 | ||
| 
						 | 
					185004cb30 | ||
| 
						 | 
					4a2eea2939 | ||
| 
						 | 
					6d3686e73d | ||
| 
						 | 
					5d0ba011c7 | ||
| 
						 | 
					87f4b1c6f6 | ||
| 
						 | 
					8067bab106 | ||
| 
						 | 
					097c7bd741 | ||
| 
						 | 
					c7bd9da446 | ||
| 
						 | 
					3d0ab6bd2e | ||
| 
						 | 
					bebfbedf3f | ||
| 
						 | 
					cba9270845 | ||
| 
						 | 
					2a9ffe7037 | ||
| 
						 | 
					4000e01b28 | ||
| 
						 | 
					68d3d36dd6 | ||
| 
						 | 
					eedfc35bbc | ||
| 
						 | 
					d39d3ec4b9 | ||
| 
						 | 
					79dfd60a0c | ||
| 
						 | 
					29ad5e0d94 | ||
| 
						 | 
					7e8ac0afcf | ||
| 
						 | 
					93df629b69 | ||
| 
						 | 
					66060dbce9 | ||
| 
						 | 
					0701afedee | ||
| 
						 | 
					a17745d6d7 | ||
| 
						 | 
					1249acfdba | ||
| 
						 | 
					c8fb6a2258 | ||
| 
						 | 
					7215737038 | ||
| 
						 | 
					6eb2e37234 | ||
| 
						 | 
					fb9707de98 | ||
| 
						 | 
					db9afbbf0e | ||
| 
						 | 
					e1b9409e63 | ||
| 
						 | 
					4b2f966b7e | ||
| 
						 | 
					a293088027 | ||
| 
						 | 
					bd043449f2 | ||
| 
						 | 
					0570e13cac | ||
| 
						 | 
					6b21249151 | ||
| 
						 | 
					4f8d646e2a | ||
| 
						 | 
					ac55a80d9f | ||
| 
						 | 
					bc09a3e487 | ||
| 
						 | 
					ff218617db | ||
| 
						 | 
					b65358b17c | ||
| 
						 | 
					e9f3e69f36 | ||
| 
						 | 
					5b2364b236 | ||
| 
						 | 
					4db29b0076 | ||
| 
						 | 
					0aae3ec5d7 | ||
| 
						 | 
					468a1c7767 | ||
| 
						 | 
					ab3ac4e466 | ||
| 
						 | 
					4d18ac83a2 | ||
| 
						 | 
					660b529c10 | ||
| 
						 | 
					565129f992 | ||
| 
						 | 
					b2a3bc3257 | ||
| 
						 | 
					bcf8a5bee6 | ||
| 
						 | 
					fc4cd39202 | ||
| 
						 | 
					b5b7c7f174 | ||
| 
						 | 
					6444442931 | ||
| 
						 | 
					e899c75d7e | ||
| 
						 | 
					cae9a3aee5 | ||
| 
						 | 
					e708790566 | ||
| 
						 | 
					0dd0015d16 | ||
| 
						 | 
					dd3d2e2c39 | ||
| 
						 | 
					9275dc4dc4 | ||
| 
						 | 
					af9123fd82 | ||
| 
						 | 
					ca32c1b311 | ||
| 
						 | 
					342f20f889 | ||
| 
						 | 
					a5b5a6a99a | ||
| 
						 | 
					c65343e719 | ||
| 
						 | 
					a7197f579c | ||
| 
						 | 
					30c11b2313 | ||
| 
						 | 
					b7033e1478 | ||
| 
						 | 
					db992975eb | ||
| 
						 | 
					c12dc45f17 | ||
| 
						 | 
					a2e4eb5aaf | ||
| 
						 | 
					58b8fb5d12 | ||
| 
						 | 
					8efeae1714 | ||
| 
						 | 
					21ad5dcfff | ||
| 
						 | 
					4074fd9149 | ||
| 
						 | 
					2f105b1c0a | ||
| 
						 | 
					a2cdc08c39 | ||
| 
						 | 
					e728bd2e1a | ||
| 
						 | 
					12e288c062 | ||
| 
						 | 
					733e15bb64 | ||
| 
						 | 
					99544e8d5d | ||
| 
						 | 
					f36337fab3 | ||
| 
						 | 
					1a46b37bd5 | ||
| 
						 | 
					5f87474a74 | ||
| 
						 | 
					6434d0b23e | ||
| 
						 | 
					d5c5d2a37f | ||
| 
						 | 
					ac96fe5877 | ||
| 
						 | 
					a6d1d26a43 | ||
| 
						 | 
					c2f5399b51 | ||
| 
						 | 
					ae6e6616a6 | ||
| 
						 | 
					a5915f75c9 | ||
| 
						 | 
					f2ba8abec5 | ||
| 
						 | 
					701c259394 | ||
| 
						 | 
					a32b404863 | ||
| 
						 | 
					b15d906dff | ||
| 
						 | 
					1c14e2e0a2 | ||
| 
						 | 
					77f54693ef | ||
| 
						 | 
					b61407713d | ||
| 
						 | 
					b120c2a271 | ||
| 
						 | 
					51ccb5928a | ||
| 
						 | 
					890c3d9d72 | ||
| 
						 | 
					84706af7fe | ||
| 
						 | 
					46a191caf6 | ||
| 
						 | 
					20ff63a8a1 | ||
| 
						 | 
					21a067e0b1 | ||
| 
						 | 
					8c7521af25 | ||
| 
						 | 
					e96b4aad2e | ||
| 
						 | 
					2e794a6943 | ||
| 
						 | 
					1e9e16fa3b | ||
| 
						 | 
					6ecccd2644 | ||
| 
						 | 
					9db49e8f2c | ||
| 
						 | 
					74cb2e2768 | ||
| 
						 | 
					e5097bf2e6 | ||
| 
						 | 
					3237d28bfb | ||
| 
						 | 
					317841529b | ||
| 
						 | 
					68dc35b548 | ||
| 
						 | 
					d6e6350523 | ||
| 
						 | 
					7036111a6c | ||
| 
						 | 
					987559e46d | ||
| 
						 | 
					fca29bfa23 | ||
| 
						 | 
					63db3daafe | ||
| 
						 | 
					2e858755c5 | ||
| 
						 | 
					b682a5e485 | ||
| 
						 | 
					efbfe4ae83 | ||
| 
						 | 
					c92e57fec3 | ||
| 
						 | 
					ca130e6db6 | ||
| 
						 | 
					248d75e566 | ||
| 
						 | 
					4715b17106 | ||
| 
						 | 
					70facb7f6e | ||
| 
						 | 
					76604f847a | ||
| 
						 | 
					c7693f625e | ||
| 
						 | 
					e50d049074 | ||
| 
						 | 
					dd003e23b7 | ||
| 
						 | 
					178b564c51 | ||
| 
						 | 
					b976ec032f | ||
| 
						 | 
					8916b201fa | ||
| 
						 | 
					ead79d3e39 | ||
| 
						 | 
					0e2f5a4f3d | ||
| 
						 | 
					78692f1e87 | ||
| 
						 | 
					02b0a51517 | ||
| 
						 | 
					a874c26c25 | ||
| 
						 | 
					1eca0aea4f | ||
| 
						 | 
					7b5a1bbe3c | ||
| 
						 | 
					b88e97f193 | ||
| 
						 | 
					6b4ecf8c83 | ||
| 
						 | 
					6093af49d5 | ||
| 
						 | 
					0d180a913f | ||
| 
						 | 
					60ae9c827e | ||
| 
						 | 
					c857e9c887 | ||
| 
						 | 
					579fce1831 | ||
| 
						 | 
					2bf77fb0c3 | ||
| 
						 | 
					774c6cda4d | ||
| 
						 | 
					afef7dee82 | ||
| 
						 | 
					7eca418465 | ||
| 
						 | 
					ebbf92898e | ||
| 
						 | 
					733ef4c815 | ||
| 
						 | 
					e5a19fa3a0 | ||
| 
						 | 
					ccb747cb3b | ||
| 
						 | 
					9a6b6f527b | ||
| 
						 | 
					43d644ed92 | 
							
								
								
									
										7
									
								
								.cvsignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								.cvsignore
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					Makefile
 | 
				
			||||||
 | 
					Makefile.in
 | 
				
			||||||
 | 
					aclocal.m4
 | 
				
			||||||
 | 
					autom4te.cache
 | 
				
			||||||
 | 
					config.log
 | 
				
			||||||
 | 
					config.status
 | 
				
			||||||
 | 
					configure
 | 
				
			||||||
							
								
								
									
										12
									
								
								AUTHORS
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								AUTHORS
									
									
									
									
									
								
							@@ -1,7 +1,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                     ngIRCd - Next Generation IRC Server
 | 
					                     ngIRCd - Next Generation IRC Server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        (c)2001-2005 Alexander Barton,
 | 
					                        (c)2001-2007 Alexander Barton,
 | 
				
			||||||
                    alex@barton.de, http://www.barton.de/
 | 
					                    alex@barton.de, http://www.barton.de/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
               ngIRCd is free software and published under the
 | 
					               ngIRCd is free software and published under the
 | 
				
			||||||
@@ -10,9 +10,16 @@
 | 
				
			|||||||
                       -- AUTHORS and CONTRIBUTORS --
 | 
					                       -- AUTHORS and CONTRIBUTORS --
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Note: If you have critics, patches or something else, please feel free to
 | 
				
			||||||
 | 
					post a mail to the ngIRCd mailing list: <ngircd-ml@arthur.ath.cx> (please see
 | 
				
			||||||
 | 
					<http://ngircd.barton.de/#ml> for details). Don't mail the contributors
 | 
				
			||||||
 | 
					directly, if possible!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Main Authors
 | 
					Main Authors
 | 
				
			||||||
~~~~~~~~~~~~
 | 
					~~~~~~~~~~~~
 | 
				
			||||||
Alexander Barton, <alex@barton.de> (alex)
 | 
					Alexander Barton, <alex@barton.de> (alex)
 | 
				
			||||||
 | 
					Florian Westphal, <westphal@foo.fh-furtwangen.de> (fw)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Contributors
 | 
					Contributors
 | 
				
			||||||
@@ -21,7 +28,6 @@ Goetz Hoffart, <goetz@hoffart.de> (goetz)
 | 
				
			|||||||
Ilja Osthoff, <i.osthoff@gmx.net> (ilja)
 | 
					Ilja Osthoff, <i.osthoff@gmx.net> (ilja)
 | 
				
			||||||
Benjamin Pineau, <ben@zouh.org>
 | 
					Benjamin Pineau, <ben@zouh.org>
 | 
				
			||||||
Sean Reifschneider, <jafo-rpms@tummy.com>
 | 
					Sean Reifschneider, <jafo-rpms@tummy.com>
 | 
				
			||||||
Florian Westphal, <westphal@foo.fh-furtwangen.de> (fw)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Code snippets
 | 
					Code snippets
 | 
				
			||||||
@@ -32,4 +38,4 @@ Andrew Tridgell & Martin Pool: strl{cpy|cat}()-functions
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- 
 | 
					-- 
 | 
				
			||||||
$Id: AUTHORS,v 1.11 2005/03/19 14:24:52 alex Exp $
 | 
					$Id: AUTHORS,v 1.13 2007/10/04 15:18:48 alex Exp $
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										121
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										121
									
								
								ChangeLog
									
									
									
									
									
								
							@@ -1,7 +1,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                     ngIRCd - Next Generation IRC Server
 | 
					                     ngIRCd - Next Generation IRC Server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        (c)2001-2005 Alexander Barton,
 | 
					                        (c)2001-2008 Alexander Barton,
 | 
				
			||||||
                    alex@barton.de, http://www.barton.de/
 | 
					                    alex@barton.de, http://www.barton.de/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
               ngIRCd is free software and published under the
 | 
					               ngIRCd is free software and published under the
 | 
				
			||||||
@@ -10,9 +10,122 @@
 | 
				
			|||||||
                               -- ChangeLog --
 | 
					                               -- ChangeLog --
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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)
 | 
					ngIRCd 0.9.2 (2005-10-15)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - Fixed a bug that could cause the damon to crash when outgoing server
 | 
					  - Fixed a bug that could cause the daemon to crash when outgoing server
 | 
				
			||||||
    connections can't be established.
 | 
					    connections can't be established.
 | 
				
			||||||
  - Fixed a bug that caused the daemon to leak file descriptors when no
 | 
					  - Fixed a bug that caused the daemon to leak file descriptors when no
 | 
				
			||||||
    resolver subprocesses could be created.
 | 
					    resolver subprocesses could be created.
 | 
				
			||||||
@@ -32,7 +145,7 @@ ngIRCd 0.9.0 (2005-07-24)
 | 
				
			|||||||
  ngIRCd 0.9.0-pre1 (2005-07-09)
 | 
					  ngIRCd 0.9.0-pre1 (2005-07-09)
 | 
				
			||||||
  - Fixed maximum length of user names, now allow up to 9 characters.
 | 
					  - 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
 | 
					  - Cut off oversized IRC messages that should be sent to the network instead
 | 
				
			||||||
    of shuttding down the (wrong) connection.
 | 
					    of shutting down the (wrong) connection.
 | 
				
			||||||
  - Don't generate error messages for unknown commands received before the
 | 
					  - Don't generate error messages for unknown commands received before the
 | 
				
			||||||
    client is registered with the server (like the original ircd).
 | 
					    client is registered with the server (like the original ircd).
 | 
				
			||||||
  - Never run with root privileges but always switch the user ID.
 | 
					  - Never run with root privileges but always switch the user ID.
 | 
				
			||||||
@@ -629,4 +742,4 @@ ngIRCd 0.0.1, 31.12.2001
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- 
 | 
					-- 
 | 
				
			||||||
$Id: ChangeLog,v 1.276.2.12 2005/10/15 12:44:08 alex Exp $
 | 
					$Id: ChangeLog,v 1.332.2.11 2008/02/26 20:35:05 alex Exp $
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										76
									
								
								INSTALL
									
									
									
									
									
								
							
							
						
						
									
										76
									
								
								INSTALL
									
									
									
									
									
								
							@@ -1,7 +1,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                     ngIRCd - Next Generation IRC Server
 | 
					                     ngIRCd - Next Generation IRC Server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                      (c)2001-2004 by Alexander Barton,
 | 
					                        (c)2001-2007 Alexander Barton,
 | 
				
			||||||
                    alex@barton.de, http://www.barton.de/
 | 
					                    alex@barton.de, http://www.barton.de/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
               ngIRCd is free software and published under the
 | 
					               ngIRCd is free software and published under the
 | 
				
			||||||
@@ -14,6 +14,12 @@
 | 
				
			|||||||
I. Upgrade Information
 | 
					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
 | 
					Differences to version 0.8.x
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- The maximum length of passwords has been raised to 20 characters (instead
 | 
					- The maximum length of passwords has been raised to 20 characters (instead
 | 
				
			||||||
@@ -121,7 +127,65 @@ This files will be installed by default:
 | 
				
			|||||||
- /usr/local/share/doc/ngircd/: documentation
 | 
					- /usr/local/share/doc/ngircd/: documentation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
II. Useful make-targets
 | 
					III. Additional features
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The following optional features can be compiled into the daemon by passing
 | 
				
			||||||
 | 
					options to the "configure" script. Most options can handle a <path> argument
 | 
				
			||||||
 | 
					which will be used to search for the required libraries and header files in
 | 
				
			||||||
 | 
					the given paths ("<path>/lib/...", "<path>/include/...") in addition to the
 | 
				
			||||||
 | 
					standard locations.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Syslog Logging (autodetected by default): 
 | 
				
			||||||
 | 
					  --with-syslog[=<path>] / --without-syslog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Enable (disable) support for logging to "syslog", which should be
 | 
				
			||||||
 | 
					  available on most modern UNIX-like operating systems by default.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* ZLib Compression (autodetected by default):
 | 
				
			||||||
 | 
					  --with-zlib[=<path>] / --without-zlib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Enable (disable) support for compressed server-server links.
 | 
				
			||||||
 | 
					  The Z compression library ("libz") is required for this option.
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					* IO Backend (autodetected by default):
 | 
				
			||||||
 | 
					  --with-select[=<path>] / --without-select
 | 
				
			||||||
 | 
					  --with-poll[=<path>] / --without-poll
 | 
				
			||||||
 | 
					  --with-devpoll[=<path>] / --without-devpoll
 | 
				
			||||||
 | 
					  --with-epoll[=<path>] / --without-epoll
 | 
				
			||||||
 | 
					  --with-kqueue[=<path>] / --without-kqueue  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ngIRCd can use different IO "backends": the "old school" select() and poll()
 | 
				
			||||||
 | 
					  API which should be supported by most UNIX-like operating systems, or the
 | 
				
			||||||
 | 
					  more efficient and flexible epoll() (Linux >=2.6), kqueue() (BSD) and
 | 
				
			||||||
 | 
					  /dev/poll APIs.
 | 
				
			||||||
 | 
					  By default the IO backend is autodetected, but you can use "--without-xxx"
 | 
				
			||||||
 | 
					  to disable a more enhanced API.
 | 
				
			||||||
 | 
					  When using the epoll() API, support for select() is compiled in as well by
 | 
				
			||||||
 | 
					  default to enable the binary to run on older Linux kernels (<2.6), too.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* IDENT-Support:
 | 
				
			||||||
 | 
					  --with-ident[=<path>]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Include support for IDENT ("AUTH") lookups. The "ident" library is
 | 
				
			||||||
 | 
					  required for this option.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* ZeroConf Support:
 | 
				
			||||||
 | 
					  --with-zeroconf[=<path>] 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Compile ngIRCd with support for ZeroConf multicast DNS service registration.
 | 
				
			||||||
 | 
					  Either the Apple ZeroConf implementation (e. g. Mac OS X) or the Howl
 | 
				
			||||||
 | 
					  library is required. Which one is available is autodetected.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* TCP-Wrappers:
 | 
				
			||||||
 | 
					  --with-tcp-wrappers[=<path>] 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Include support for Wietse Venemas "TCP Wrappers" to limit client access
 | 
				
			||||||
 | 
					  to the daemon, for example by using "/etc/hosts.{allow|deny}".
 | 
				
			||||||
 | 
					  The "libwrap" is required for this option.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					IV. Useful make-targets
 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~
 | 
					~~~~~~~~~~~~~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The Makefile produced by the configure-script contains always these useful
 | 
					The Makefile produced by the configure-script contains always these useful
 | 
				
			||||||
@@ -137,8 +201,8 @@ targets:
 | 
				
			|||||||
   next step: -> ./autogen.sh
 | 
					   next step: -> ./autogen.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
III. Sample configuration file ngircd.conf
 | 
					V. Sample configuration file ngircd.conf
 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
In the sample configuration file, there are comments beginning with "#" OR
 | 
					In the sample configuration file, there are comments beginning with "#" OR
 | 
				
			||||||
";" -- this is only for the better understanding of the file.
 | 
					";" -- this is only for the better understanding of the file.
 | 
				
			||||||
@@ -158,7 +222,7 @@ The meaning of the variables in the configuration file is explained in the
 | 
				
			|||||||
and in the "ngircd.conf" manual page.
 | 
					and in the "ngircd.conf" manual page.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
IV. Command line options
 | 
					VI. Command line options
 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
These parameters could be passed to the ngIRCd:
 | 
					These parameters could be passed to the ngIRCd:
 | 
				
			||||||
@@ -183,4 +247,4 @@ number. In both cases the server exits after the output.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- 
 | 
					-- 
 | 
				
			||||||
$Id: INSTALL,v 1.21 2005/02/10 08:20:09 alex Exp $
 | 
					$Id: INSTALL,v 1.26 2007/04/08 11:39:08 alex Exp $
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,7 @@
 | 
				
			|||||||
# (at your option) any later version.
 | 
					# (at your option) any later version.
 | 
				
			||||||
# Please read the file COPYING, README and AUTHORS for more information.
 | 
					# Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# $Id: Makefile.am,v 1.16 2005/04/09 12:27:40 alex Exp $
 | 
					# $Id: Makefile.am,v 1.17 2005/07/22 21:01:52 alex Exp $
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
AUTOMAKE_OPTIONS = gnu
 | 
					AUTOMAKE_OPTIONS = gnu
 | 
				
			||||||
@@ -28,7 +28,7 @@ lint:
 | 
				
			|||||||
	make -C src/ngircd lint
 | 
						make -C src/ngircd lint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
srcdoc:
 | 
					srcdoc:
 | 
				
			||||||
	make -C src srcdoc
 | 
						make -C doc srcdoc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
xcode:
 | 
					xcode:
 | 
				
			||||||
	@xcodebuild -project contrib/MacOSX/ngIRCd.xcode -list >/dev/null 2>&1 \
 | 
						@xcodebuild -project contrib/MacOSX/ngIRCd.xcode -list >/dev/null 2>&1 \
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										47
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										47
									
								
								NEWS
									
									
									
									
									
								
							@@ -1,7 +1,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                     ngIRCd - Next Generation IRC Server
 | 
					                     ngIRCd - Next Generation IRC Server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        (c)2001-2005 Alexander Barton,
 | 
					                        (c)2001-2008 Alexander Barton,
 | 
				
			||||||
                    alex@barton.de, http://www.barton.de/
 | 
					                    alex@barton.de, http://www.barton.de/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
               ngIRCd is free software and published under the
 | 
					               ngIRCd is free software and published under the
 | 
				
			||||||
@@ -10,6 +10,49 @@
 | 
				
			|||||||
                                  -- NEWS --
 | 
					                                  -- NEWS --
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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)
 | 
					ngIRCd 0.9.0 (2005-07-24)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - Never run with root privileges but always switch the user ID.
 | 
					  - Never run with root privileges but always switch the user ID.
 | 
				
			||||||
@@ -208,4 +251,4 @@ ngIRCd 0.0.1, 31.12.2001
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- 
 | 
					-- 
 | 
				
			||||||
$Id: NEWS,v 1.74.2.1 2005/07/24 21:39:45 alex Exp $
 | 
					$Id: NEWS,v 1.83.2.4 2008/02/26 19:22:07 alex Exp $
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										12
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								README
									
									
									
									
									
								
							@@ -1,7 +1,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                     ngIRCd - Next Generation IRC Server
 | 
					                     ngIRCd - Next Generation IRC Server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        (c)2001-2005 Alexander Barton,
 | 
					                        (c)2001-2007 Alexander Barton,
 | 
				
			||||||
                    alex@barton.de, http://www.barton.de/
 | 
					                    alex@barton.de, http://www.barton.de/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
               ngIRCd is free software and published under the
 | 
					               ngIRCd is free software and published under the
 | 
				
			||||||
@@ -19,6 +19,8 @@ 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
 | 
					generation IRC daemon", it's written from scratch and not deduced from the
 | 
				
			||||||
"grandfather of IRC daemons", the daemon of the IRCNet.
 | 
					"grandfather of IRC daemons", the daemon of the IRCNet.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Please see the INSTALL document for installation and upgrade information!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
II. Status
 | 
					II. Status
 | 
				
			||||||
~~~~~~~~~~~
 | 
					~~~~~~~~~~~
 | 
				
			||||||
@@ -35,7 +37,8 @@ Implemented IRC-commands are:
 | 
				
			|||||||
ADMIN, AWAY, CHANINFO, CONNECT, DIE, DISCONNECT, ERROR, HELP, INVITE, ISON,
 | 
					ADMIN, AWAY, CHANINFO, CONNECT, DIE, DISCONNECT, ERROR, HELP, INVITE, ISON,
 | 
				
			||||||
JOIN, KICK, KILL, LINKS, LIST, LUSERS, MODE, MOTD, NAMES, NICK, NJOIN, NOTICE,
 | 
					JOIN, KICK, KILL, LINKS, LIST, LUSERS, MODE, MOTD, NAMES, NICK, NJOIN, NOTICE,
 | 
				
			||||||
OPER, PART, PASS, PING, PONG, PRIVMSG, QUIT, REHASH, RESTART, SERVER, SQUIT,
 | 
					OPER, PART, PASS, PING, PONG, PRIVMSG, QUIT, REHASH, RESTART, SERVER, SQUIT,
 | 
				
			||||||
STATS, TIME, TOPIC, TRACE, USER, USERHOST, VERSION, WHO, WHOIS, WHOWAS.
 | 
					STATS, TIME, TOPIC, TRACE, USER, USERHOST, VERSION, WALLOPS, WHO, WHOIS,
 | 
				
			||||||
 | 
					WHOWAS.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
III. Features (or: why use ngIRCd?)
 | 
					III. Features (or: why use ngIRCd?)
 | 
				
			||||||
@@ -80,8 +83,9 @@ them at the following URL:
 | 
				
			|||||||
There you can read about known bugs and limitations, too.
 | 
					There you can read about known bugs and limitations, too.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
If you have critics, patches or something else, please feel free to post a
 | 
					If you have critics, patches or something else, please feel free to post a
 | 
				
			||||||
mail to <alex@barton.de>.
 | 
					mail to the ngIRCd mailing list: <ngircd-ml@arthur.ath.cx> (please see
 | 
				
			||||||
 | 
					<http://ngircd.barton.de/#ml> for details).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- 
 | 
					-- 
 | 
				
			||||||
$Id: README,v 1.20.2.1 2005/07/09 14:41:39 alex Exp $
 | 
					$Id: README,v 1.25 2007/10/04 15:18:48 alex Exp $
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										23
									
								
								autogen.sh
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								autogen.sh
									
									
									
									
									
								
							@@ -9,7 +9,7 @@
 | 
				
			|||||||
# (at your option) any later version.
 | 
					# (at your option) any later version.
 | 
				
			||||||
# Please read the file COPYING, README and AUTHORS for more information.
 | 
					# Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# $Id: autogen.sh,v 1.14 2005/02/21 15:23:23 alex Exp $
 | 
					# $Id: autogen.sh,v 1.15 2007/10/07 13:02:15 alex Exp $
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
@@ -124,17 +124,22 @@ if [ -z "$EXIST" ]; then
 | 
				
			|||||||
fi
 | 
					fi
 | 
				
			||||||
[ "$VERBOSE" = "1" ] && echo "Using \"$EXIST\" to test for tools."
 | 
					[ "$VERBOSE" = "1" ] && echo "Using \"$EXIST\" to test for tools."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# We want to use GNU automake 1.7, if available (WANT_AUTOMAKE is used by
 | 
					# 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);
 | 
					# the wrapper scripts of Gentoo Linux, AUTOMAKE_VERSION is used by OpenBSD);
 | 
				
			||||||
# same applies for GNU autoconf, we want to use version 2.59.
 | 
					# same applies for GNU autoconf, we want to use version 2.59. -- But only
 | 
				
			||||||
AUTOMAKE_VERSION=1.7
 | 
					# set these preferences if not already set!
 | 
				
			||||||
AUTOCONF_VERSION=2.59
 | 
					if [ -z "$AUTOMAKE_VERSION" -a -z "$WANT_AUTOMAKE" ]; then
 | 
				
			||||||
export AUTOMAKE_VERSION AUTOCONF_VERSION
 | 
						AUTOMAKE_VERSION=1.9
 | 
				
			||||||
WANT_AUTOMAKE=1.7
 | 
						WANT_AUTOMAKE=1.9
 | 
				
			||||||
export WANT_AUTOMAKE
 | 
					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
 | 
					# Try to detect the needed tools when no environment variable already
 | 
				
			||||||
# spezifies one:
 | 
					# specifies one:
 | 
				
			||||||
echo "Searching tools ..."
 | 
					echo "Searching tools ..."
 | 
				
			||||||
[ -z "$ACLOCAL" ] && ACLOCAL=`Search aclocal 1`
 | 
					[ -z "$ACLOCAL" ] && ACLOCAL=`Search aclocal 1`
 | 
				
			||||||
[ "$VERBOSE" = "1" ] && echo "ACLOCAL=$ACLOCAL"
 | 
					[ "$VERBOSE" = "1" ] && echo "ACLOCAL=$ACLOCAL"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										78
									
								
								config.guess
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										78
									
								
								config.guess
									
									
									
									
										vendored
									
									
								
							@@ -1,9 +1,10 @@
 | 
				
			|||||||
#! /bin/sh
 | 
					#! /bin/sh
 | 
				
			||||||
# Attempt to guess a canonical system name.
 | 
					# Attempt to guess a canonical system name.
 | 
				
			||||||
#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
 | 
					#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
 | 
				
			||||||
#   2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 | 
					#   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
 | 
				
			||||||
 | 
					#   Inc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
timestamp='2005-08-03'
 | 
					timestamp='2007-03-06'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# This file is free software; you can redistribute it and/or modify it
 | 
					# This file is free software; you can redistribute it and/or modify it
 | 
				
			||||||
# under the terms of the GNU General Public License as published by
 | 
					# under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -106,7 +107,7 @@ set_cc_for_build='
 | 
				
			|||||||
trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
 | 
					trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
 | 
				
			||||||
trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
 | 
					trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
 | 
				
			||||||
: ${TMPDIR=/tmp} ;
 | 
					: ${TMPDIR=/tmp} ;
 | 
				
			||||||
 { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
 | 
					 { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
 | 
				
			||||||
 { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
 | 
					 { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
 | 
				
			||||||
 { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
 | 
					 { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
 | 
				
			||||||
 { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
 | 
					 { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
 | 
				
			||||||
@@ -160,6 +161,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 | 
				
			|||||||
	    arm*) machine=arm-unknown ;;
 | 
						    arm*) machine=arm-unknown ;;
 | 
				
			||||||
	    sh3el) machine=shl-unknown ;;
 | 
						    sh3el) machine=shl-unknown ;;
 | 
				
			||||||
	    sh3eb) machine=sh-unknown ;;
 | 
						    sh3eb) machine=sh-unknown ;;
 | 
				
			||||||
 | 
						    sh5el) machine=sh5le-unknown ;;
 | 
				
			||||||
	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
 | 
						    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
 | 
				
			||||||
	esac
 | 
						esac
 | 
				
			||||||
	# The Operating System including object format, if it has switched
 | 
						# The Operating System including object format, if it has switched
 | 
				
			||||||
@@ -206,8 +208,11 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 | 
				
			|||||||
    *:ekkoBSD:*:*)
 | 
					    *:ekkoBSD:*:*)
 | 
				
			||||||
	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
 | 
						echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
 | 
				
			||||||
	exit ;;
 | 
						exit ;;
 | 
				
			||||||
 | 
					    *:SolidBSD:*:*)
 | 
				
			||||||
 | 
						echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
 | 
				
			||||||
 | 
						exit ;;
 | 
				
			||||||
    macppc:MirBSD:*:*)
 | 
					    macppc:MirBSD:*:*)
 | 
				
			||||||
	echo powerppc-unknown-mirbsd${UNAME_RELEASE}
 | 
						echo powerpc-unknown-mirbsd${UNAME_RELEASE}
 | 
				
			||||||
	exit ;;
 | 
						exit ;;
 | 
				
			||||||
    *:MirBSD:*:*)
 | 
					    *:MirBSD:*:*)
 | 
				
			||||||
	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
 | 
						echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
 | 
				
			||||||
@@ -764,12 +769,19 @@ EOF
 | 
				
			|||||||
	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
 | 
						echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
 | 
				
			||||||
	exit ;;
 | 
						exit ;;
 | 
				
			||||||
    *:FreeBSD:*:*)
 | 
					    *:FreeBSD:*:*)
 | 
				
			||||||
	echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
 | 
						case ${UNAME_MACHINE} in
 | 
				
			||||||
 | 
						    pc98)
 | 
				
			||||||
 | 
							echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
 | 
				
			||||||
 | 
						    amd64)
 | 
				
			||||||
 | 
							echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
 | 
				
			||||||
 | 
						    *)
 | 
				
			||||||
 | 
							echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
 | 
				
			||||||
 | 
						esac
 | 
				
			||||||
	exit ;;
 | 
						exit ;;
 | 
				
			||||||
    i*:CYGWIN*:*)
 | 
					    i*:CYGWIN*:*)
 | 
				
			||||||
	echo ${UNAME_MACHINE}-pc-cygwin
 | 
						echo ${UNAME_MACHINE}-pc-cygwin
 | 
				
			||||||
	exit ;;
 | 
						exit ;;
 | 
				
			||||||
    i*:MINGW*:*)
 | 
					    *:MINGW*:*)
 | 
				
			||||||
	echo ${UNAME_MACHINE}-pc-mingw32
 | 
						echo ${UNAME_MACHINE}-pc-mingw32
 | 
				
			||||||
	exit ;;
 | 
						exit ;;
 | 
				
			||||||
    i*:windows32*:*)
 | 
					    i*:windows32*:*)
 | 
				
			||||||
@@ -779,9 +791,15 @@ EOF
 | 
				
			|||||||
    i*:PW*:*)
 | 
					    i*:PW*:*)
 | 
				
			||||||
	echo ${UNAME_MACHINE}-pc-pw32
 | 
						echo ${UNAME_MACHINE}-pc-pw32
 | 
				
			||||||
	exit ;;
 | 
						exit ;;
 | 
				
			||||||
    x86:Interix*:[34]*)
 | 
					    *:Interix*:[3456]*)
 | 
				
			||||||
	echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//'
 | 
					    	case ${UNAME_MACHINE} in
 | 
				
			||||||
	exit ;;
 | 
						    x86) 
 | 
				
			||||||
 | 
							echo i586-pc-interix${UNAME_RELEASE}
 | 
				
			||||||
 | 
							exit ;;
 | 
				
			||||||
 | 
						    EM64T | authenticamd)
 | 
				
			||||||
 | 
							echo x86_64-unknown-interix${UNAME_RELEASE}
 | 
				
			||||||
 | 
							exit ;;
 | 
				
			||||||
 | 
						esac ;;
 | 
				
			||||||
    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
 | 
					    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
 | 
				
			||||||
	echo i${UNAME_MACHINE}-pc-mks
 | 
						echo i${UNAME_MACHINE}-pc-mks
 | 
				
			||||||
	exit ;;
 | 
						exit ;;
 | 
				
			||||||
@@ -817,6 +835,9 @@ EOF
 | 
				
			|||||||
    arm*:Linux:*:*)
 | 
					    arm*:Linux:*:*)
 | 
				
			||||||
	echo ${UNAME_MACHINE}-unknown-linux-gnu
 | 
						echo ${UNAME_MACHINE}-unknown-linux-gnu
 | 
				
			||||||
	exit ;;
 | 
						exit ;;
 | 
				
			||||||
 | 
					    avr32*:Linux:*:*)
 | 
				
			||||||
 | 
						echo ${UNAME_MACHINE}-unknown-linux-gnu
 | 
				
			||||||
 | 
						exit ;;
 | 
				
			||||||
    cris:Linux:*:*)
 | 
					    cris:Linux:*:*)
 | 
				
			||||||
	echo cris-axis-linux-gnu
 | 
						echo cris-axis-linux-gnu
 | 
				
			||||||
	exit ;;
 | 
						exit ;;
 | 
				
			||||||
@@ -851,7 +872,11 @@ EOF
 | 
				
			|||||||
	#endif
 | 
						#endif
 | 
				
			||||||
	#endif
 | 
						#endif
 | 
				
			||||||
EOF
 | 
					EOF
 | 
				
			||||||
	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
 | 
						eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
 | 
				
			||||||
 | 
						    /^CPU/{
 | 
				
			||||||
 | 
							s: ::g
 | 
				
			||||||
 | 
							p
 | 
				
			||||||
 | 
						    }'`"
 | 
				
			||||||
	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
 | 
						test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
 | 
				
			||||||
	;;
 | 
						;;
 | 
				
			||||||
    mips64:Linux:*:*)
 | 
					    mips64:Linux:*:*)
 | 
				
			||||||
@@ -870,7 +895,11 @@ EOF
 | 
				
			|||||||
	#endif
 | 
						#endif
 | 
				
			||||||
	#endif
 | 
						#endif
 | 
				
			||||||
EOF
 | 
					EOF
 | 
				
			||||||
	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
 | 
						eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
 | 
				
			||||||
 | 
						    /^CPU/{
 | 
				
			||||||
 | 
							s: ::g
 | 
				
			||||||
 | 
							p
 | 
				
			||||||
 | 
						    }'`"
 | 
				
			||||||
	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
 | 
						test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
 | 
				
			||||||
	;;
 | 
						;;
 | 
				
			||||||
    or32:Linux:*:*)
 | 
					    or32:Linux:*:*)
 | 
				
			||||||
@@ -919,9 +948,15 @@ EOF
 | 
				
			|||||||
    sparc:Linux:*:* | sparc64:Linux:*:*)
 | 
					    sparc:Linux:*:* | sparc64:Linux:*:*)
 | 
				
			||||||
	echo ${UNAME_MACHINE}-unknown-linux-gnu
 | 
						echo ${UNAME_MACHINE}-unknown-linux-gnu
 | 
				
			||||||
	exit ;;
 | 
						exit ;;
 | 
				
			||||||
 | 
					    vax:Linux:*:*)
 | 
				
			||||||
 | 
						echo ${UNAME_MACHINE}-dec-linux-gnu
 | 
				
			||||||
 | 
						exit ;;
 | 
				
			||||||
    x86_64:Linux:*:*)
 | 
					    x86_64:Linux:*:*)
 | 
				
			||||||
	echo x86_64-unknown-linux-gnu
 | 
						echo x86_64-unknown-linux-gnu
 | 
				
			||||||
	exit ;;
 | 
						exit ;;
 | 
				
			||||||
 | 
					    xtensa:Linux:*:*)
 | 
				
			||||||
 | 
					    	echo xtensa-unknown-linux-gnu
 | 
				
			||||||
 | 
						exit ;;
 | 
				
			||||||
    i*86:Linux:*:*)
 | 
					    i*86:Linux:*:*)
 | 
				
			||||||
	# The BFD linker knows what the default object file format is, so
 | 
						# The BFD linker knows what the default object file format is, so
 | 
				
			||||||
	# first see if it will tell us. cd to the root directory to prevent
 | 
						# first see if it will tell us. cd to the root directory to prevent
 | 
				
			||||||
@@ -964,7 +999,7 @@ EOF
 | 
				
			|||||||
	LIBC=gnulibc1
 | 
						LIBC=gnulibc1
 | 
				
			||||||
	# endif
 | 
						# endif
 | 
				
			||||||
	#else
 | 
						#else
 | 
				
			||||||
	#ifdef __INTEL_COMPILER
 | 
						#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
 | 
				
			||||||
	LIBC=gnu
 | 
						LIBC=gnu
 | 
				
			||||||
	#else
 | 
						#else
 | 
				
			||||||
	LIBC=gnuaout
 | 
						LIBC=gnuaout
 | 
				
			||||||
@@ -974,7 +1009,11 @@ EOF
 | 
				
			|||||||
	LIBC=dietlibc
 | 
						LIBC=dietlibc
 | 
				
			||||||
	#endif
 | 
						#endif
 | 
				
			||||||
EOF
 | 
					EOF
 | 
				
			||||||
	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
 | 
						eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
 | 
				
			||||||
 | 
						    /^LIBC/{
 | 
				
			||||||
 | 
							s: ::g
 | 
				
			||||||
 | 
							p
 | 
				
			||||||
 | 
						    }'`"
 | 
				
			||||||
	test x"${LIBC}" != x && {
 | 
						test x"${LIBC}" != x && {
 | 
				
			||||||
		echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
 | 
							echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
 | 
				
			||||||
		exit
 | 
							exit
 | 
				
			||||||
@@ -1176,6 +1215,15 @@ EOF
 | 
				
			|||||||
    SX-6:SUPER-UX:*:*)
 | 
					    SX-6:SUPER-UX:*:*)
 | 
				
			||||||
	echo sx6-nec-superux${UNAME_RELEASE}
 | 
						echo sx6-nec-superux${UNAME_RELEASE}
 | 
				
			||||||
	exit ;;
 | 
						exit ;;
 | 
				
			||||||
 | 
					    SX-7:SUPER-UX:*:*)
 | 
				
			||||||
 | 
						echo sx7-nec-superux${UNAME_RELEASE}
 | 
				
			||||||
 | 
						exit ;;
 | 
				
			||||||
 | 
					    SX-8:SUPER-UX:*:*)
 | 
				
			||||||
 | 
						echo sx8-nec-superux${UNAME_RELEASE}
 | 
				
			||||||
 | 
						exit ;;
 | 
				
			||||||
 | 
					    SX-8R:SUPER-UX:*:*)
 | 
				
			||||||
 | 
						echo sx8r-nec-superux${UNAME_RELEASE}
 | 
				
			||||||
 | 
						exit ;;
 | 
				
			||||||
    Power*:Rhapsody:*:*)
 | 
					    Power*:Rhapsody:*:*)
 | 
				
			||||||
	echo powerpc-apple-rhapsody${UNAME_RELEASE}
 | 
						echo powerpc-apple-rhapsody${UNAME_RELEASE}
 | 
				
			||||||
	exit ;;
 | 
						exit ;;
 | 
				
			||||||
@@ -1185,7 +1233,6 @@ EOF
 | 
				
			|||||||
    *:Darwin:*:*)
 | 
					    *:Darwin:*:*)
 | 
				
			||||||
	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
 | 
						UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
 | 
				
			||||||
	case $UNAME_PROCESSOR in
 | 
						case $UNAME_PROCESSOR in
 | 
				
			||||||
	    *86) UNAME_PROCESSOR=i686 ;;
 | 
					 | 
				
			||||||
	    unknown) UNAME_PROCESSOR=powerpc ;;
 | 
						    unknown) UNAME_PROCESSOR=powerpc ;;
 | 
				
			||||||
	esac
 | 
						esac
 | 
				
			||||||
	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
 | 
						echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
 | 
				
			||||||
@@ -1264,6 +1311,9 @@ EOF
 | 
				
			|||||||
    i*86:skyos:*:*)
 | 
					    i*86:skyos:*:*)
 | 
				
			||||||
	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
 | 
						echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
 | 
				
			||||||
	exit ;;
 | 
						exit ;;
 | 
				
			||||||
 | 
					    i*86:rdos:*:*)
 | 
				
			||||||
 | 
						echo ${UNAME_MACHINE}-pc-rdos
 | 
				
			||||||
 | 
						exit ;;
 | 
				
			||||||
esac
 | 
					esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#echo '(No uname command or uname output not recognized.)' 1>&2
 | 
					#echo '(No uname command or uname output not recognized.)' 1>&2
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										109
									
								
								config.sub
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										109
									
								
								config.sub
									
									
									
									
										vendored
									
									
								
							@@ -1,9 +1,10 @@
 | 
				
			|||||||
#! /bin/sh
 | 
					#! /bin/sh
 | 
				
			||||||
# Configuration validation subroutine script.
 | 
					# Configuration validation subroutine script.
 | 
				
			||||||
#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
 | 
					#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
 | 
				
			||||||
#   2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 | 
					#   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
 | 
				
			||||||
 | 
					#   Inc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
timestamp='2005-07-08'
 | 
					timestamp='2007-01-18'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# This file is (in principle) common to ALL GNU software.
 | 
					# This file is (in principle) common to ALL GNU software.
 | 
				
			||||||
# The presence of a machine in this file suggests that SOME GNU software
 | 
					# The presence of a machine in this file suggests that SOME GNU software
 | 
				
			||||||
@@ -119,8 +120,9 @@ esac
 | 
				
			|||||||
# Here we must recognize all the valid KERNEL-OS combinations.
 | 
					# Here we must recognize all the valid KERNEL-OS combinations.
 | 
				
			||||||
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 | 
					maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 | 
				
			||||||
case $maybe_os in
 | 
					case $maybe_os in
 | 
				
			||||||
  nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \
 | 
					  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
 | 
				
			||||||
  kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
 | 
					  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
 | 
				
			||||||
 | 
					  storm-chaos* | os2-emx* | rtmk-nova*)
 | 
				
			||||||
    os=-$maybe_os
 | 
					    os=-$maybe_os
 | 
				
			||||||
    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
 | 
					    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
 | 
				
			||||||
    ;;
 | 
					    ;;
 | 
				
			||||||
@@ -171,6 +173,10 @@ case $os in
 | 
				
			|||||||
	-hiux*)
 | 
						-hiux*)
 | 
				
			||||||
		os=-hiuxwe2
 | 
							os=-hiuxwe2
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
 | 
						-sco6)
 | 
				
			||||||
 | 
							os=-sco5v6
 | 
				
			||||||
 | 
							basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
 | 
				
			||||||
 | 
							;;
 | 
				
			||||||
	-sco5)
 | 
						-sco5)
 | 
				
			||||||
		os=-sco3.2v5
 | 
							os=-sco3.2v5
 | 
				
			||||||
		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
 | 
							basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
 | 
				
			||||||
@@ -187,6 +193,10 @@ case $os in
 | 
				
			|||||||
		# Don't forget version if it is 3.2v4 or newer.
 | 
							# Don't forget version if it is 3.2v4 or newer.
 | 
				
			||||||
		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
 | 
							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*)
 | 
						-sco*)
 | 
				
			||||||
		os=-sco3.2v2
 | 
							os=-sco3.2v2
 | 
				
			||||||
		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
 | 
							basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
 | 
				
			||||||
@@ -231,15 +241,16 @@ case $basic_machine in
 | 
				
			|||||||
	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
 | 
						| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
 | 
				
			||||||
	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
 | 
						| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
 | 
				
			||||||
	| am33_2.0 \
 | 
						| am33_2.0 \
 | 
				
			||||||
	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
 | 
						| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
 | 
				
			||||||
	| bfin \
 | 
						| bfin \
 | 
				
			||||||
	| c4x | clipper \
 | 
						| c4x | clipper \
 | 
				
			||||||
	| d10v | d30v | dlx | dsp16xx \
 | 
						| d10v | d30v | dlx | dsp16xx \
 | 
				
			||||||
	| fr30 | frv \
 | 
						| fido | fr30 | frv \
 | 
				
			||||||
	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
 | 
						| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
 | 
				
			||||||
	| i370 | i860 | i960 | ia64 \
 | 
						| i370 | i860 | i960 | ia64 \
 | 
				
			||||||
	| ip2k | iq2000 \
 | 
						| ip2k | iq2000 \
 | 
				
			||||||
	| m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \
 | 
						| m32c | m32r | m32rle | m68000 | m68k | m88k \
 | 
				
			||||||
 | 
						| maxq | mb | microblaze | mcore | mep \
 | 
				
			||||||
	| mips | mipsbe | mipseb | mipsel | mipsle \
 | 
						| mips | mipsbe | mipseb | mipsel | mipsle \
 | 
				
			||||||
	| mips16 \
 | 
						| mips16 \
 | 
				
			||||||
	| mips64 | mips64el \
 | 
						| mips64 | mips64el \
 | 
				
			||||||
@@ -257,28 +268,27 @@ case $basic_machine in
 | 
				
			|||||||
	| mipsisa64sr71k | mipsisa64sr71kel \
 | 
						| mipsisa64sr71k | mipsisa64sr71kel \
 | 
				
			||||||
	| mipstx39 | mipstx39el \
 | 
						| mipstx39 | mipstx39el \
 | 
				
			||||||
	| mn10200 | mn10300 \
 | 
						| mn10200 | mn10300 \
 | 
				
			||||||
	| ms1 \
 | 
						| mt \
 | 
				
			||||||
	| msp430 \
 | 
						| msp430 \
 | 
				
			||||||
 | 
						| nios | nios2 \
 | 
				
			||||||
	| ns16k | ns32k \
 | 
						| ns16k | ns32k \
 | 
				
			||||||
	| or32 \
 | 
						| or32 \
 | 
				
			||||||
	| pdp10 | pdp11 | pj | pjl \
 | 
						| pdp10 | pdp11 | pj | pjl \
 | 
				
			||||||
	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
 | 
						| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
 | 
				
			||||||
	| pyramid \
 | 
						| pyramid \
 | 
				
			||||||
	| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
 | 
						| score \
 | 
				
			||||||
 | 
						| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
 | 
				
			||||||
	| sh64 | sh64le \
 | 
						| sh64 | sh64le \
 | 
				
			||||||
	| sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \
 | 
						| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
 | 
				
			||||||
	| sparcv8 | sparcv9 | sparcv9b \
 | 
						| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
 | 
				
			||||||
	| strongarm \
 | 
						| spu | strongarm \
 | 
				
			||||||
	| tahoe | thumb | tic4x | tic80 | tron \
 | 
						| tahoe | thumb | tic4x | tic80 | tron \
 | 
				
			||||||
	| v850 | v850e \
 | 
						| v850 | v850e \
 | 
				
			||||||
	| we32k \
 | 
						| we32k \
 | 
				
			||||||
	| x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
 | 
						| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
 | 
				
			||||||
	| z8k)
 | 
						| z8k)
 | 
				
			||||||
		basic_machine=$basic_machine-unknown
 | 
							basic_machine=$basic_machine-unknown
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
	m32c)
 | 
					 | 
				
			||||||
		basic_machine=$basic_machine-unknown
 | 
					 | 
				
			||||||
		;;
 | 
					 | 
				
			||||||
	m6811 | m68hc11 | m6812 | m68hc12)
 | 
						m6811 | m68hc11 | m6812 | m68hc12)
 | 
				
			||||||
		# Motorola 68HC11/12.
 | 
							# Motorola 68HC11/12.
 | 
				
			||||||
		basic_machine=$basic_machine-unknown
 | 
							basic_machine=$basic_machine-unknown
 | 
				
			||||||
@@ -286,6 +296,9 @@ case $basic_machine in
 | 
				
			|||||||
		;;
 | 
							;;
 | 
				
			||||||
	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
 | 
						m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
 | 
						ms1)
 | 
				
			||||||
 | 
							basic_machine=mt-unknown
 | 
				
			||||||
 | 
							;;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# We use `pc' rather than `unknown'
 | 
						# We use `pc' rather than `unknown'
 | 
				
			||||||
	# because (1) that's what they normally are, and
 | 
						# because (1) that's what they normally are, and
 | 
				
			||||||
@@ -305,18 +318,18 @@ case $basic_machine in
 | 
				
			|||||||
	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
 | 
						| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
 | 
				
			||||||
	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
 | 
						| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
 | 
				
			||||||
	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
 | 
						| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
 | 
				
			||||||
	| avr-* \
 | 
						| avr-* | avr32-* \
 | 
				
			||||||
	| bfin-* | bs2000-* \
 | 
						| bfin-* | bs2000-* \
 | 
				
			||||||
	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
 | 
						| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
 | 
				
			||||||
	| clipper-* | craynv-* | cydra-* \
 | 
						| clipper-* | craynv-* | cydra-* \
 | 
				
			||||||
	| d10v-* | d30v-* | dlx-* \
 | 
						| d10v-* | d30v-* | dlx-* \
 | 
				
			||||||
	| elxsi-* \
 | 
						| elxsi-* \
 | 
				
			||||||
	| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
 | 
						| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
 | 
				
			||||||
	| h8300-* | h8500-* \
 | 
						| h8300-* | h8500-* \
 | 
				
			||||||
	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
 | 
						| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
 | 
				
			||||||
	| i*86-* | i860-* | i960-* | ia64-* \
 | 
						| i*86-* | i860-* | i960-* | ia64-* \
 | 
				
			||||||
	| ip2k-* | iq2000-* \
 | 
						| ip2k-* | iq2000-* \
 | 
				
			||||||
	| m32r-* | m32rle-* \
 | 
						| m32c-* | m32r-* | m32rle-* \
 | 
				
			||||||
	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
 | 
						| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
 | 
				
			||||||
	| m88110-* | m88k-* | maxq-* | mcore-* \
 | 
						| m88110-* | m88k-* | maxq-* | mcore-* \
 | 
				
			||||||
	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
 | 
						| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
 | 
				
			||||||
@@ -336,31 +349,30 @@ case $basic_machine in
 | 
				
			|||||||
	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
 | 
						| mipsisa64sr71k-* | mipsisa64sr71kel-* \
 | 
				
			||||||
	| mipstx39-* | mipstx39el-* \
 | 
						| mipstx39-* | mipstx39el-* \
 | 
				
			||||||
	| mmix-* \
 | 
						| mmix-* \
 | 
				
			||||||
	| ms1-* \
 | 
						| mt-* \
 | 
				
			||||||
	| msp430-* \
 | 
						| msp430-* \
 | 
				
			||||||
 | 
						| nios-* | nios2-* \
 | 
				
			||||||
	| none-* | np1-* | ns16k-* | ns32k-* \
 | 
						| none-* | np1-* | ns16k-* | ns32k-* \
 | 
				
			||||||
	| orion-* \
 | 
						| orion-* \
 | 
				
			||||||
	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
 | 
						| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
 | 
				
			||||||
	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
 | 
						| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
 | 
				
			||||||
	| pyramid-* \
 | 
						| pyramid-* \
 | 
				
			||||||
	| romp-* | rs6000-* \
 | 
						| romp-* | rs6000-* \
 | 
				
			||||||
	| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \
 | 
						| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
 | 
				
			||||||
	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
 | 
						| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
 | 
				
			||||||
	| sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \
 | 
						| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
 | 
				
			||||||
	| sparclite-* \
 | 
						| sparclite-* \
 | 
				
			||||||
	| sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
 | 
						| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
 | 
				
			||||||
	| tahoe-* | thumb-* \
 | 
						| tahoe-* | thumb-* \
 | 
				
			||||||
	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
 | 
						| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
 | 
				
			||||||
	| tron-* \
 | 
						| tron-* \
 | 
				
			||||||
	| v850-* | v850e-* | vax-* \
 | 
						| v850-* | v850e-* | vax-* \
 | 
				
			||||||
	| we32k-* \
 | 
						| we32k-* \
 | 
				
			||||||
	| x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
 | 
						| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
 | 
				
			||||||
	| xstormy16-* | xtensa-* \
 | 
						| xstormy16-* | xtensa-* \
 | 
				
			||||||
	| ymp-* \
 | 
						| ymp-* \
 | 
				
			||||||
	| z8k-*)
 | 
						| z8k-*)
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
	m32c-*)
 | 
					 | 
				
			||||||
		;;
 | 
					 | 
				
			||||||
	# Recognize the various machine names and aliases which stand
 | 
						# Recognize the various machine names and aliases which stand
 | 
				
			||||||
	# for a CPU type and a company and sometimes even an OS.
 | 
						# for a CPU type and a company and sometimes even an OS.
 | 
				
			||||||
	386bsd)
 | 
						386bsd)
 | 
				
			||||||
@@ -696,6 +708,9 @@ case $basic_machine in
 | 
				
			|||||||
		basic_machine=i386-pc
 | 
							basic_machine=i386-pc
 | 
				
			||||||
		os=-msdos
 | 
							os=-msdos
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
 | 
						ms1-*)
 | 
				
			||||||
 | 
							basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
 | 
				
			||||||
 | 
							;;
 | 
				
			||||||
	mvs)
 | 
						mvs)
 | 
				
			||||||
		basic_machine=i370-ibm
 | 
							basic_machine=i370-ibm
 | 
				
			||||||
		os=-mvs
 | 
							os=-mvs
 | 
				
			||||||
@@ -803,6 +818,12 @@ case $basic_machine in
 | 
				
			|||||||
	pc532 | pc532-*)
 | 
						pc532 | pc532-*)
 | 
				
			||||||
		basic_machine=ns32k-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)
 | 
						pentium | p5 | k5 | k6 | nexgen | viac3)
 | 
				
			||||||
		basic_machine=i586-pc
 | 
							basic_machine=i586-pc
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
@@ -859,6 +880,10 @@ case $basic_machine in
 | 
				
			|||||||
		basic_machine=i586-unknown
 | 
							basic_machine=i586-unknown
 | 
				
			||||||
		os=-pw32
 | 
							os=-pw32
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
 | 
						rdos)
 | 
				
			||||||
 | 
							basic_machine=i386-pc
 | 
				
			||||||
 | 
							os=-rdos
 | 
				
			||||||
 | 
							;;
 | 
				
			||||||
	rom68k)
 | 
						rom68k)
 | 
				
			||||||
		basic_machine=m68k-rom68k
 | 
							basic_machine=m68k-rom68k
 | 
				
			||||||
		os=-coff
 | 
							os=-coff
 | 
				
			||||||
@@ -885,6 +910,10 @@ case $basic_machine in
 | 
				
			|||||||
	sb1el)
 | 
						sb1el)
 | 
				
			||||||
		basic_machine=mipsisa64sb1el-unknown
 | 
							basic_machine=mipsisa64sb1el-unknown
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
 | 
						sde)
 | 
				
			||||||
 | 
							basic_machine=mipsisa32-sde
 | 
				
			||||||
 | 
							os=-elf
 | 
				
			||||||
 | 
							;;
 | 
				
			||||||
	sei)
 | 
						sei)
 | 
				
			||||||
		basic_machine=mips-sei
 | 
							basic_machine=mips-sei
 | 
				
			||||||
		os=-seiux
 | 
							os=-seiux
 | 
				
			||||||
@@ -896,6 +925,9 @@ case $basic_machine in
 | 
				
			|||||||
		basic_machine=sh-hitachi
 | 
							basic_machine=sh-hitachi
 | 
				
			||||||
		os=-hms
 | 
							os=-hms
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
 | 
						sh5el)
 | 
				
			||||||
 | 
							basic_machine=sh5le-unknown
 | 
				
			||||||
 | 
							;;
 | 
				
			||||||
	sh64)
 | 
						sh64)
 | 
				
			||||||
		basic_machine=sh64-unknown
 | 
							basic_machine=sh64-unknown
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
@@ -1101,7 +1133,7 @@ case $basic_machine in
 | 
				
			|||||||
	sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
 | 
						sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
 | 
				
			||||||
		basic_machine=sh-unknown
 | 
							basic_machine=sh-unknown
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
	sparc | sparcv8 | sparcv9 | sparcv9b)
 | 
						sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
 | 
				
			||||||
		basic_machine=sparc-sun
 | 
							basic_machine=sparc-sun
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
	cydra)
 | 
						cydra)
 | 
				
			||||||
@@ -1174,21 +1206,23 @@ case $os in
 | 
				
			|||||||
	      | -aos* \
 | 
						      | -aos* \
 | 
				
			||||||
	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
 | 
						      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
 | 
				
			||||||
	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
 | 
						      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
 | 
				
			||||||
	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \
 | 
						      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
 | 
				
			||||||
 | 
						      | -openbsd* | -solidbsd* \
 | 
				
			||||||
	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
 | 
						      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
 | 
				
			||||||
	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
 | 
						      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
 | 
				
			||||||
	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
 | 
						      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
 | 
				
			||||||
	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
 | 
						      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
 | 
				
			||||||
	      | -chorusos* | -chorusrdb* \
 | 
						      | -chorusos* | -chorusrdb* \
 | 
				
			||||||
	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
 | 
						      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
 | 
				
			||||||
	      | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \
 | 
						      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
 | 
				
			||||||
 | 
						      | -uxpv* | -beos* | -mpeix* | -udk* \
 | 
				
			||||||
	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
 | 
						      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
 | 
				
			||||||
	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
 | 
						      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
 | 
				
			||||||
	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
 | 
						      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
 | 
				
			||||||
	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
 | 
						      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
 | 
				
			||||||
	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
 | 
						      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
 | 
				
			||||||
	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
 | 
						      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
 | 
				
			||||||
	      | -skyos* | -haiku*)
 | 
						      | -skyos* | -haiku* | -rdos* | -toppers* | -drops*)
 | 
				
			||||||
	# Remember, each alternative MUST END IN *, to match a version number.
 | 
						# Remember, each alternative MUST END IN *, to match a version number.
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
	-qnx*)
 | 
						-qnx*)
 | 
				
			||||||
@@ -1340,6 +1374,12 @@ else
 | 
				
			|||||||
# system, and we'll never get to this point.
 | 
					# system, and we'll never get to this point.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
case $basic_machine in
 | 
					case $basic_machine in
 | 
				
			||||||
 | 
					        score-*)
 | 
				
			||||||
 | 
							os=-elf
 | 
				
			||||||
 | 
							;;
 | 
				
			||||||
 | 
					        spu-*)
 | 
				
			||||||
 | 
							os=-elf
 | 
				
			||||||
 | 
							;;
 | 
				
			||||||
	*-acorn)
 | 
						*-acorn)
 | 
				
			||||||
		os=-riscix1.2
 | 
							os=-riscix1.2
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
@@ -1349,9 +1389,9 @@ case $basic_machine in
 | 
				
			|||||||
	arm*-semi)
 | 
						arm*-semi)
 | 
				
			||||||
		os=-aout
 | 
							os=-aout
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
    c4x-* | tic4x-*)
 | 
					        c4x-* | tic4x-*)
 | 
				
			||||||
        os=-coff
 | 
					        	os=-coff
 | 
				
			||||||
        ;;
 | 
							;;
 | 
				
			||||||
	# This must come before the *-dec entry.
 | 
						# This must come before the *-dec entry.
 | 
				
			||||||
	pdp10-*)
 | 
						pdp10-*)
 | 
				
			||||||
		os=-tops20
 | 
							os=-tops20
 | 
				
			||||||
@@ -1377,6 +1417,9 @@ case $basic_machine in
 | 
				
			|||||||
	m68*-cisco)
 | 
						m68*-cisco)
 | 
				
			||||||
		os=-aout
 | 
							os=-aout
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
 | 
					        mep-*)
 | 
				
			||||||
 | 
							os=-elf
 | 
				
			||||||
 | 
							;;
 | 
				
			||||||
	mips*-cisco)
 | 
						mips*-cisco)
 | 
				
			||||||
		os=-elf
 | 
							os=-elf
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										225
									
								
								configure.in
									
									
									
									
									
								
							
							
						
						
									
										225
									
								
								configure.in
									
									
									
									
									
								
							@@ -1,6 +1,6 @@
 | 
				
			|||||||
#
 | 
					#
 | 
				
			||||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
					# ngIRCd -- The Next Generation IRC Daemon
 | 
				
			||||||
# Copyright (c)2001-2005 Alexander Barton <alex@barton.de>
 | 
					# Copyright (c)2001-2008 Alexander Barton <alex@barton.de>
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This program is free software; you can redistribute it and/or modify
 | 
					# This program is free software; you can redistribute it and/or modify
 | 
				
			||||||
# it under the terms of the GNU General Public License as published by
 | 
					# it under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -8,13 +8,13 @@
 | 
				
			|||||||
# (at your option) any later version.
 | 
					# (at your option) any later version.
 | 
				
			||||||
# Please read the file COPYING, README and AUTHORS for more information.
 | 
					# Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# $Id: configure.in,v 1.111.2.6 2005/10/15 12:44:08 alex Exp $
 | 
					# $Id: configure.in,v 1.125.2.4 2008/02/26 19:37:34 alex Exp $
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# -- Initialisation --
 | 
					# -- Initialisation --
 | 
				
			||||||
 | 
					
 | 
				
			||||||
AC_PREREQ(2.50)
 | 
					AC_PREREQ(2.50)
 | 
				
			||||||
AC_INIT(ngircd, 0.9.2)
 | 
					AC_INIT(ngircd, 0.11.1)
 | 
				
			||||||
AC_CONFIG_SRCDIR(src/ngircd/ngircd.c)
 | 
					AC_CONFIG_SRCDIR(src/ngircd/ngircd.c)
 | 
				
			||||||
AC_CANONICAL_TARGET
 | 
					AC_CANONICAL_TARGET
 | 
				
			||||||
AM_INIT_AUTOMAKE(1.6)
 | 
					AM_INIT_AUTOMAKE(1.6)
 | 
				
			||||||
@@ -30,7 +30,7 @@ AH_TEMPLATE([SYSLOG], [Define if syslog should be used for logging])
 | 
				
			|||||||
AH_TEMPLATE([ZLIB], [Define if zlib compression should be enabled])
 | 
					AH_TEMPLATE([ZLIB], [Define if zlib compression should be enabled])
 | 
				
			||||||
AH_TEMPLATE([TCPWRAP], [Define if TCP wrappers should be used])
 | 
					AH_TEMPLATE([TCPWRAP], [Define if TCP wrappers should be used])
 | 
				
			||||||
AH_TEMPLATE([IRCPLUS], [Define if IRC+ protocol should be used])
 | 
					AH_TEMPLATE([IRCPLUS], [Define if IRC+ protocol should be used])
 | 
				
			||||||
AH_TEMPLATE([RENDEZVOUS], [Define if Rendezvous support should be included])
 | 
					AH_TEMPLATE([ZEROCONF], [Define if support for Zeroconf should be included])
 | 
				
			||||||
AH_TEMPLATE([IDENTAUTH], [Define if the server should do IDENT requests])
 | 
					AH_TEMPLATE([IDENTAUTH], [Define if the server should do IDENT requests])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
AH_TEMPLATE([TARGET_OS], [Target operating system name])
 | 
					AH_TEMPLATE([TARGET_OS], [Target operating system name])
 | 
				
			||||||
@@ -53,12 +53,31 @@ AC_PROG_RANLIB
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
AM_C_PROTOTYPES
 | 
					AM_C_PROTOTYPES
 | 
				
			||||||
AC_C_CONST
 | 
					AC_C_CONST
 | 
				
			||||||
 | 
					AC_C_INLINE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# -- Hard coded system and compiler dependencies/features/options ... --
 | 
					# -- 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
 | 
					if test "$GCC" = "yes"; then
 | 
				
			||||||
	# We are using the GNU C compiler. Good!
 | 
						# We are using the GNU C compiler. Good!
 | 
				
			||||||
	CFLAGS="$CFLAGS -pipe -W -Wall -Wpointer-arith -Wstrict-prototypes"
 | 
						CFLAGS="$CFLAGS -pipe -W -Wall -Wpointer-arith -Wstrict-prototypes"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						GCC_STACK_PROTECT_CC
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
case "$target_os" in
 | 
					case "$target_os" in
 | 
				
			||||||
@@ -105,6 +124,7 @@ AC_TRY_COMPILE([
 | 
				
			|||||||
AC_TYPE_SIGNAL
 | 
					AC_TYPE_SIGNAL
 | 
				
			||||||
AC_TYPE_SIZE_T
 | 
					AC_TYPE_SIZE_T
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# -- Libraries --
 | 
					# -- Libraries --
 | 
				
			||||||
 | 
					
 | 
				
			||||||
AC_CHECK_LIB(UTIL,memmove)
 | 
					AC_CHECK_LIB(UTIL,memmove)
 | 
				
			||||||
@@ -118,17 +138,15 @@ AC_FUNC_STRFTIME
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
AC_CHECK_FUNCS([ \
 | 
					AC_CHECK_FUNCS([ \
 | 
				
			||||||
	bind gethostbyaddr gethostbyname gethostname inet_ntoa malloc memmove \
 | 
						bind gethostbyaddr gethostbyname gethostname inet_ntoa malloc memmove \
 | 
				
			||||||
	memset realloc setsid setsockopt socket strcasecmp strchr strerror \
 | 
						memset realloc setsid setsockopt socket strcasecmp strchr strcspn strerror \
 | 
				
			||||||
	strstr waitpid],,AC_MSG_ERROR([required function missing!]))
 | 
						strstr waitpid],,AC_MSG_ERROR([required function missing!]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
AC_CHECK_FUNCS(inet_aton isdigit sigaction snprintf vsnprintf strdup strlcpy strlcat)
 | 
					AC_CHECK_FUNCS(inet_aton isdigit sigaction snprintf vsnprintf strdup strlcpy strlcat)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
AC_CHECK_FUNCS(select,[AC_CHECK_HEADERS(sys/select.h)],
 | 
					 | 
				
			||||||
	AC_MSG_ERROR([required function select() is missing!])
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# -- Configuration options --
 | 
					# -- Configuration options --
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# use syslog?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
x_syslog_on=no
 | 
					x_syslog_on=no
 | 
				
			||||||
AC_ARG_WITH(syslog,
 | 
					AC_ARG_WITH(syslog,
 | 
				
			||||||
	[  --without-syslog        disable syslog (autodetected by default)],
 | 
						[  --without-syslog        disable syslog (autodetected by default)],
 | 
				
			||||||
@@ -154,6 +172,8 @@ if test "$x_syslog_on" = "yes"; then
 | 
				
			|||||||
	AC_CHECK_HEADERS(syslog.h,,AC_MSG_ERROR([required C header missing!]))
 | 
						AC_CHECK_HEADERS(syslog.h,,AC_MSG_ERROR([required C header missing!]))
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# use zlib compression?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
x_zlib_on=no
 | 
					x_zlib_on=no
 | 
				
			||||||
AC_ARG_WITH(zlib,
 | 
					AC_ARG_WITH(zlib,
 | 
				
			||||||
	[  --without-zlib          disable zlib compression (autodetected by default)],
 | 
						[  --without-zlib          disable zlib compression (autodetected by default)],
 | 
				
			||||||
@@ -178,6 +198,121 @@ if test "$x_zlib_on" = "yes"; then
 | 
				
			|||||||
	AC_CHECK_HEADERS(zlib.h,,AC_MSG_ERROR([required C header missing!]))
 | 
						AC_CHECK_HEADERS(zlib.h,,AC_MSG_ERROR([required C header missing!]))
 | 
				
			||||||
fi
 | 
					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
 | 
					x_tcpwrap_on=no
 | 
				
			||||||
AC_ARG_WITH(tcp-wrappers,
 | 
					AC_ARG_WITH(tcp-wrappers,
 | 
				
			||||||
	[  --with-tcp-wrappers     enable TCP wrappers support],
 | 
						[  --with-tcp-wrappers     enable TCP wrappers support],
 | 
				
			||||||
@@ -207,34 +342,37 @@ int deny_severity = 0;
 | 
				
			|||||||
	]
 | 
						]
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
x_rendezvous_on=no
 | 
					# include support for "zeroconf"?
 | 
				
			||||||
AC_ARG_WITH(rendezvous,
 | 
					
 | 
				
			||||||
	[  --with-rendezvous       enable support for "Rendezvous"],
 | 
					x_zeroconf_on=no
 | 
				
			||||||
 | 
					AC_ARG_WITH(zeroconf,
 | 
				
			||||||
 | 
						[  --with-zeroconf         enable support for "Zeroconf"],
 | 
				
			||||||
	[	if test "$withval" != "no"; then
 | 
						[	if test "$withval" != "no"; then
 | 
				
			||||||
			if test "$withval" != "yes"; then
 | 
								if test "$withval" != "yes"; then
 | 
				
			||||||
				CFLAGS="-I$withval/include $CFLAGS"
 | 
									CFLAGS="-I$withval/include $CFLAGS"
 | 
				
			||||||
				CPPFLAGS="-I$withval/include $CPPFLAGS"
 | 
									CPPFLAGS="-I$withval/include $CPPFLAGS"
 | 
				
			||||||
				LDFLAGS="-L$withval/lib $LDFLAGS"
 | 
									LDFLAGS="-L$withval/lib $LDFLAGS"
 | 
				
			||||||
			fi
 | 
								fi
 | 
				
			||||||
			AC_CHECK_FUNCS(DNSServiceRegistrationCreate, x_rendezvous_on=osx,
 | 
								AC_CHECK_FUNCS(DNSServiceRegistrationCreate, x_zeroconf_on=osx,
 | 
				
			||||||
			[
 | 
								[
 | 
				
			||||||
				AC_CHECK_LIB(pthread, pthread_mutexattr_init)
 | 
									AC_CHECK_LIB(pthread, pthread_mutexattr_init)
 | 
				
			||||||
				AC_CHECK_LIB(howl, sw_discovery_init)
 | 
									AC_CHECK_LIB(howl, sw_discovery_init)
 | 
				
			||||||
				AC_CHECK_FUNCS(sw_discovery_init, \
 | 
									AC_CHECK_FUNCS(sw_discovery_init, \
 | 
				
			||||||
				 x_rendezvous_on=howl, \
 | 
									 x_zeroconf_on=howl, \
 | 
				
			||||||
				 AC_MSG_ERROR([Can't enable Rendezvous!]))
 | 
									 AC_MSG_ERROR([Can't enable Zeroconf!]))
 | 
				
			||||||
			])
 | 
								])
 | 
				
			||||||
		fi
 | 
							fi
 | 
				
			||||||
	]
 | 
						]
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
if test "$x_rendezvous_on" = "osx"; then
 | 
					if test "$x_zeroconf_on" = "osx"; then
 | 
				
			||||||
	AC_CHECK_HEADERS([DNSServiceDiscovery/DNSServiceDiscovery.h \
 | 
						AC_CHECK_HEADERS([DNSServiceDiscovery/DNSServiceDiscovery.h \
 | 
				
			||||||
	 mach/port.h],,AC_MSG_ERROR([required C header missing!]))
 | 
						 mach/port.h],,AC_MSG_ERROR([required C header missing!]))
 | 
				
			||||||
	AC_DEFINE(RENDEZVOUS, 1)
 | 
						AC_DEFINE(ZEROCONF, 1)
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
if test "$x_rendezvous_on" = "howl"; then
 | 
					if test "$x_zeroconf_on" = "howl"; then
 | 
				
			||||||
	for dir in /usr/local/include /usr/local/include/howl* \
 | 
						for dir in /usr/local/include /usr/local/include/howl* \
 | 
				
			||||||
	 /usr/include /usr/include/howl*; do
 | 
						 /usr/include /usr/include/howl* \
 | 
				
			||||||
 | 
						 /usr/local/include/avahi* /usr/include/avahi*; do
 | 
				
			||||||
	 	test -d "$dir" || continue
 | 
						 	test -d "$dir" || continue
 | 
				
			||||||
		AC_MSG_CHECKING([for Howl headers in $dir])
 | 
							AC_MSG_CHECKING([for Howl headers in $dir])
 | 
				
			||||||
		if test -f "$dir/rendezvous/rendezvous.h"; then
 | 
							if test -f "$dir/rendezvous/rendezvous.h"; then
 | 
				
			||||||
@@ -251,9 +389,11 @@ if test "$x_rendezvous_on" = "howl"; then
 | 
				
			|||||||
	done
 | 
						done
 | 
				
			||||||
	AC_CHECK_HEADERS([rendezvous/rendezvous.h],, \
 | 
						AC_CHECK_HEADERS([rendezvous/rendezvous.h],, \
 | 
				
			||||||
	 AC_MSG_ERROR([required C header missing!]))
 | 
						 AC_MSG_ERROR([required C header missing!]))
 | 
				
			||||||
	AC_DEFINE(RENDEZVOUS, 1)
 | 
						AC_DEFINE(ZEROCONF, 1)
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# do IDENT requests using libident?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
x_identauth_on=no
 | 
					x_identauth_on=no
 | 
				
			||||||
AC_ARG_WITH(ident,
 | 
					AC_ARG_WITH(ident,
 | 
				
			||||||
	[  --with-ident            enable "IDENT" ("AUTH") protocol support],
 | 
						[  --with-ident            enable "IDENT" ("AUTH") protocol support],
 | 
				
			||||||
@@ -275,6 +415,8 @@ if test "$x_identauth_on" = "yes"; then
 | 
				
			|||||||
	AC_CHECK_HEADERS(ident.h,,AC_MSG_ERROR([required C header missing!]))
 | 
						AC_CHECK_HEADERS(ident.h,,AC_MSG_ERROR([required C header missing!]))
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# compile in IRC+ protocol support?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
x_ircplus_on=yes
 | 
					x_ircplus_on=yes
 | 
				
			||||||
AC_ARG_ENABLE(ircplus,
 | 
					AC_ARG_ENABLE(ircplus,
 | 
				
			||||||
	[  --disable-ircplus       disable IRC+ protocol],
 | 
						[  --disable-ircplus       disable IRC+ protocol],
 | 
				
			||||||
@@ -284,6 +426,8 @@ if test "$x_ircplus_on" = "yes"; then
 | 
				
			|||||||
	AC_DEFINE(IRCPLUS, 1)
 | 
						AC_DEFINE(IRCPLUS, 1)
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# compile in IRC "sniffer"?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
x_sniffer_on=no; x_debug_on=no
 | 
					x_sniffer_on=no; x_debug_on=no
 | 
				
			||||||
AC_ARG_ENABLE(sniffer,
 | 
					AC_ARG_ENABLE(sniffer,
 | 
				
			||||||
	[  --enable-sniffer        enable IRC traffic sniffer (enables debug mode)],
 | 
						[  --enable-sniffer        enable IRC traffic sniffer (enables debug mode)],
 | 
				
			||||||
@@ -293,6 +437,8 @@ AC_ARG_ENABLE(sniffer,
 | 
				
			|||||||
	fi
 | 
						fi
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# enable additional debugging code?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
AC_ARG_ENABLE(debug,
 | 
					AC_ARG_ENABLE(debug,
 | 
				
			||||||
	[  --enable-debug          show additional debug output],
 | 
						[  --enable-debug          show additional debug output],
 | 
				
			||||||
	if test "$enableval" = "yes"; then x_debug_on=yes; fi
 | 
						if test "$enableval" = "yes"; then x_debug_on=yes; fi
 | 
				
			||||||
@@ -302,6 +448,8 @@ if test "$x_debug_on" = "yes"; then
 | 
				
			|||||||
	test "$GCC" = "yes" && CFLAGS="-pedantic $CFLAGS"
 | 
						test "$GCC" = "yes" && CFLAGS="-pedantic $CFLAGS"
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# enable "strict RFC rules"?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
x_strict_rfc_on=no
 | 
					x_strict_rfc_on=no
 | 
				
			||||||
AC_ARG_ENABLE(strict-rfc,
 | 
					AC_ARG_ENABLE(strict-rfc,
 | 
				
			||||||
	[  --enable-strict-rfc     strict RFC conformance -- may break clients!],
 | 
						[  --enable-strict-rfc     strict RFC conformance -- may break clients!],
 | 
				
			||||||
@@ -326,6 +474,7 @@ test -n "$CFLAGS_END" && CFLAGS="$CFLAGS $CFLAGS_END"
 | 
				
			|||||||
AC_OUTPUT([ \
 | 
					AC_OUTPUT([ \
 | 
				
			||||||
	Makefile \
 | 
						Makefile \
 | 
				
			||||||
	doc/Makefile \
 | 
						doc/Makefile \
 | 
				
			||||||
 | 
						doc/src/Makefile \
 | 
				
			||||||
	src/Makefile \
 | 
						src/Makefile \
 | 
				
			||||||
	src/portab/Makefile \
 | 
						src/portab/Makefile \
 | 
				
			||||||
	src/tool/Makefile \
 | 
						src/tool/Makefile \
 | 
				
			||||||
@@ -374,8 +523,8 @@ echo
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
echo $ECHO_N "     Syslog support: $ECHO_C"
 | 
					echo $ECHO_N "     Syslog support: $ECHO_C"
 | 
				
			||||||
test "$x_syslog_on" = "yes" \
 | 
					test "$x_syslog_on" = "yes" \
 | 
				
			||||||
	&& echo $ECHO_N "yes $ECHO_C" \
 | 
						&& echo $ECHO_N "yes   $ECHO_C" \
 | 
				
			||||||
	|| echo $ECHO_N "no  $ECHO_C"
 | 
						|| echo $ECHO_N "no    $ECHO_C"
 | 
				
			||||||
echo $ECHO_N "  Enable debug code: $ECHO_C"
 | 
					echo $ECHO_N "  Enable debug code: $ECHO_C"
 | 
				
			||||||
test "$x_debug_on" = "yes" \
 | 
					test "$x_debug_on" = "yes" \
 | 
				
			||||||
	&& echo "yes" \
 | 
						&& echo "yes" \
 | 
				
			||||||
@@ -383,8 +532,8 @@ test "$x_debug_on" = "yes" \
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
echo $ECHO_N "   zlib compression: $ECHO_C"
 | 
					echo $ECHO_N "   zlib compression: $ECHO_C"
 | 
				
			||||||
test "$x_zlib_on" = "yes" \
 | 
					test "$x_zlib_on" = "yes" \
 | 
				
			||||||
	&& echo $ECHO_N "yes $ECHO_C" \
 | 
						&& echo $ECHO_N "yes   $ECHO_C" \
 | 
				
			||||||
	|| echo $ECHO_N "no  $ECHO_C"
 | 
						|| echo $ECHO_N "no    $ECHO_C"
 | 
				
			||||||
echo $ECHO_N "        IRC sniffer: $ECHO_C"
 | 
					echo $ECHO_N "        IRC sniffer: $ECHO_C"
 | 
				
			||||||
test "$x_sniffer_on" = "yes" \
 | 
					test "$x_sniffer_on" = "yes" \
 | 
				
			||||||
	&& echo "yes" \
 | 
						&& echo "yes" \
 | 
				
			||||||
@@ -392,17 +541,25 @@ test "$x_sniffer_on" = "yes" \
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
echo $ECHO_N "   Use TCP Wrappers: $ECHO_C"
 | 
					echo $ECHO_N "   Use TCP Wrappers: $ECHO_C"
 | 
				
			||||||
test "$x_tcpwrap_on" = "yes" \
 | 
					test "$x_tcpwrap_on" = "yes" \
 | 
				
			||||||
	&& echo $ECHO_N "yes $ECHO_C" \
 | 
						&& echo $ECHO_N "yes   $ECHO_C" \
 | 
				
			||||||
	|| echo $ECHO_N "no  $ECHO_C"
 | 
						|| echo $ECHO_N "no    $ECHO_C"
 | 
				
			||||||
echo $ECHO_N "    Strict RFC mode: $ECHO_C"
 | 
					echo $ECHO_N "    Strict RFC mode: $ECHO_C"
 | 
				
			||||||
test "$x_strict_rfc_on" = "yes" \
 | 
					test "$x_strict_rfc_on" = "yes" \
 | 
				
			||||||
	&& echo "yes" \
 | 
						&& echo "yes" \
 | 
				
			||||||
	|| echo "no"
 | 
						|| echo "no"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
echo $ECHO_N " Rendezvous support: $ECHO_C"
 | 
					echo $ECHO_N "   Zeroconf support: $ECHO_C"
 | 
				
			||||||
test "$x_rendezvous_on" = "osx" -o "$x_rendezvous_on" = "howl" \
 | 
					case "$x_zeroconf_on" in
 | 
				
			||||||
	&& echo $ECHO_N "yes $ECHO_C" \
 | 
						osx)
 | 
				
			||||||
	|| echo $ECHO_N "no  $ECHO_C"
 | 
							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"
 | 
					echo $ECHO_N "      IRC+ protocol: $ECHO_C"
 | 
				
			||||||
test "$x_ircplus_on" = "yes" \
 | 
					test "$x_ircplus_on" = "yes" \
 | 
				
			||||||
	&& echo "yes" \
 | 
						&& echo "yes" \
 | 
				
			||||||
@@ -410,9 +567,11 @@ test "$x_ircplus_on" = "yes" \
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
echo $ECHO_N "      IDENT support: $ECHO_C"
 | 
					echo $ECHO_N "      IDENT support: $ECHO_C"
 | 
				
			||||||
test "$x_identauth_on" = "yes" \
 | 
					test "$x_identauth_on" = "yes" \
 | 
				
			||||||
	&& echo $ECHO_N "yes $ECHO_C" \
 | 
						&& echo $ECHO_N "yes   $ECHO_C" \
 | 
				
			||||||
	|| echo $ECHO_N "no  $ECHO_C"
 | 
						|| echo $ECHO_N "no    $ECHO_C"
 | 
				
			||||||
 | 
					echo $ECHO_N "        I/O backend: $ECHO_C"
 | 
				
			||||||
 | 
						echo "\"$x_io_backend\""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
echo; echo
 | 
					echo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# -eof-
 | 
					# -eof-
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								contrib/.cvsignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								contrib/.cvsignore
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					Makefile
 | 
				
			||||||
 | 
					Makefile.in
 | 
				
			||||||
							
								
								
									
										2
									
								
								contrib/Debian/.cvsignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								contrib/Debian/.cvsignore
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					Makefile
 | 
				
			||||||
 | 
					Makefile.in
 | 
				
			||||||
@@ -1,3 +1,58 @@
 | 
				
			|||||||
 | 
					ngircd (0.11.1-0ab1) unstable; urgency=low
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New "upstream" release 0.11.1.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Alexander Barton <alex@barton.de>  Tue, 26 Feb 2008 20:24:55 +0100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ngircd (0.11.0-0ab1) unstable; urgency=low
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New "upstream" release 0.11.0.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Alexander Barton <alex@barton.de>  Tue, 15 Jan 2008 21:43:46 +0100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ngircd (0.11.0-0ab0-pre2) unstable; urgency=low
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * Second prerelease of upcoming new "upstream release".
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Alexander Barton <alex@barton.de>  Mon,  7 Jan 2008 15:32:42 +0100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ngircd (0.11.0-0ab0-pre1) unstable; urgency=low
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * Prerelease of upcoming new "upstream release".
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Alexander Barton <alex@barton.de>  Wed,  2 Jan 2008 21:33:15 +0100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ngircd (0.10.4-0ab1) unstable; urgency=high
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New "upstream" release: 0.10.4 - fixing a security bug.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Alexander Barton <alex@barton.de>  Mon,  7 Jan 2008 22:04:44 +0100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ngircd (0.10.0-0ab1) unstable; urgency=low
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New "upstream" release: 0.10.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Alexander Barton <alex@barton.de>  Sun,  1 Oct 2006 18:14:21 +0200
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ngircd (0.10.0-0ab0-pre2-1) unstable; urgency=low
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * Bumped standards version to 3.7.2.1.
 | 
				
			||||||
 | 
					  * Added "Provides: ircd" to Debian control file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Alexander Barton <alex@barton.de>  Sun,  1 Oct 2006 16:25:33 +0200
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ngircd (0.10.0-0ab0-pre2) unstable; urgency=low
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * Second "upstream" prerelease of upcoming 0.10.0 release.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Alexander Barton <alex@barton.de>  Sat,  9 Sep 2006 20:57:52 +0200
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ngircd (0.10.0-0ab0-pre1) unstable; urgency=low
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * Prerelease of upcoming new "upstream release".
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Alexander Barton <alex@barton.de>  Wed,  2 Aug 2006 12:01:07 +0200
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ngircd (0.9.2-0ab1) unstable; urgency=low
 | 
					ngircd (0.9.2-0ab1) unstable; urgency=low
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  * New "upstream release" fixing a few bugs in 0.9.1.
 | 
					  * New "upstream release" fixing a few bugs in 0.9.1.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,11 +3,12 @@ Section: net
 | 
				
			|||||||
Priority: optional
 | 
					Priority: optional
 | 
				
			||||||
Maintainer: Alexander Barton <alex@barton.de>
 | 
					Maintainer: Alexander Barton <alex@barton.de>
 | 
				
			||||||
Build-Depends: debhelper (>> 4.0.0), libz-dev, libwrap-dev, libident-dev
 | 
					Build-Depends: debhelper (>> 4.0.0), libz-dev, libwrap-dev, libident-dev
 | 
				
			||||||
Standards-Version: 3.5.8
 | 
					Standards-Version: 3.7.2.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Package: ngircd
 | 
					Package: ngircd
 | 
				
			||||||
Architecture: any
 | 
					Architecture: any
 | 
				
			||||||
Depends: ${shlibs:Depends}, ${misc:Depends}
 | 
					Depends: ${shlibs:Depends}, ${misc:Depends}
 | 
				
			||||||
 | 
					Provides: ircd
 | 
				
			||||||
Description: A lightweight daemon for the Internet Relay Chat (IRC)
 | 
					Description: A lightweight daemon for the Internet Relay Chat (IRC)
 | 
				
			||||||
 ngIRCd is a free open source 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
 | 
					 network. It is written from scratch and is not based upon the original
 | 
				
			||||||
@@ -28,6 +29,7 @@ Description: A lightweight daemon for the Internet Relay Chat (IRC)
 | 
				
			|||||||
Package: ngircd-full
 | 
					Package: ngircd-full
 | 
				
			||||||
Architecture: any
 | 
					Architecture: any
 | 
				
			||||||
Depends: ${shlibs:Depends}, ${misc:Depends}
 | 
					Depends: ${shlibs:Depends}, ${misc:Depends}
 | 
				
			||||||
 | 
					Provides: ircd
 | 
				
			||||||
Conflicts: ngircd
 | 
					Conflicts: ngircd
 | 
				
			||||||
Description: A lightweight daemon for the Internet Relay Chat (IRC)
 | 
					Description: A lightweight daemon for the Internet Relay Chat (IRC)
 | 
				
			||||||
 ngIRCd is a free open source daemon for the Internet Relay Chat (IRC)
 | 
					 ngIRCd is a free open source daemon for the Internet Relay Chat (IRC)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,9 +2,20 @@
 | 
				
			|||||||
#
 | 
					#
 | 
				
			||||||
# ngIRCd start and stop script for Debian-based systems
 | 
					# ngIRCd start and stop script for Debian-based systems
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# $Id: ngircd.init,v 1.5.2.1 2005/07/26 19:30:54 alex Exp $
 | 
					# $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
 | 
					PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
 | 
				
			||||||
DAEMON=/usr/sbin/ngircd
 | 
					DAEMON=/usr/sbin/ngircd
 | 
				
			||||||
NAME=ngIRCd
 | 
					NAME=ngIRCd
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,13 +1,20 @@
 | 
				
			|||||||
#!/bin/sh
 | 
					#!/bin/sh
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# Debian post-installation script
 | 
					# Debian post-installation script
 | 
				
			||||||
# $Id: ngircd.postinst,v 1.1 2003/12/31 17:20:11 alex Exp $
 | 
					# $Id: ngircd.postinst,v 1.2 2006/12/26 14:44:40 alex Exp $
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if [ -f /etc/ngircd/ngircd.conf ]; then
 | 
					set -e
 | 
				
			||||||
	# make sure that configuration file is not world readable
 | 
					
 | 
				
			||||||
	chmod o= /etc/ngircd/ngircd.conf
 | 
					case "$1" in
 | 
				
			||||||
fi
 | 
						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#
 | 
					#DEBHELPER#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								contrib/MacOSX/.cvsignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								contrib/MacOSX/.cvsignore
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					Makefile
 | 
				
			||||||
 | 
					Makefile.in
 | 
				
			||||||
							
								
								
									
										92
									
								
								contrib/MacOSX/config.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								contrib/MacOSX/config.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,92 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * ngIRCd -- The Next Generation IRC Daemon
 | 
				
			||||||
 | 
					 * Copyright (c)2001-2007 Alexander Barton (alex@barton.de).
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This program is free software; you can redistribute it and/or modify
 | 
				
			||||||
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					 * the Free Software Foundation; either version 2 of the License, or
 | 
				
			||||||
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 | 
					 * Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * $Id: config.h,v 1.1 2007/11/19 22:11:36 alex Exp $
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Static configuration file for Mac OS X Xcode project
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define PACKAGE_NAME "ngircd"
 | 
				
			||||||
 | 
					#define VERSION "??"
 | 
				
			||||||
 | 
					#define SYSCONFDIR "/etc/ngircd"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* -- Build options -- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Define if debug-mode should be enabled */
 | 
				
			||||||
 | 
					#define DEBUG 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Define if the server should do IDENT requests */
 | 
				
			||||||
 | 
					/*#define IDENTAUTH 1*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Define if IRC+ protocol should be used */
 | 
				
			||||||
 | 
					#define IRCPLUS 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Define if IRC sniffer should be enabled */
 | 
				
			||||||
 | 
					/*#define SNIFFER 1*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Define if syslog should be used for logging */
 | 
				
			||||||
 | 
					#define SYSLOG 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Define if TCP wrappers should be used */
 | 
				
			||||||
 | 
					/*#define TCPWRAP 1*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Define if support for Zeroconf should be included */
 | 
				
			||||||
 | 
					/*#define ZEROCONF 1*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Define if zlib compression should be enabled */
 | 
				
			||||||
 | 
					#define ZLIB 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* -- Supported features -- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Define if SSP C support is enabled. */
 | 
				
			||||||
 | 
					#define ENABLE_SSP_CC 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Define to 1 if the C compiler supports function prototypes. */
 | 
				
			||||||
 | 
					#define PROTOTYPES 1
 | 
				
			||||||
 | 
					/* Define like PROTOTYPES; this can be used by system headers. */
 | 
				
			||||||
 | 
					#define __PROTOTYPES 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Define to 1 if you have the <sys/types.h> header file. */
 | 
				
			||||||
 | 
					#define HAVE_SYS_TYPES_H 1
 | 
				
			||||||
 | 
					/* Define to 1 if you have the <inttypes.h> header file. */
 | 
				
			||||||
 | 
					#define HAVE_INTTYPES_H 1
 | 
				
			||||||
 | 
					/* Define to 1 if you have the <stddef.h> header file. */
 | 
				
			||||||
 | 
					#define HAVE_STDDEF_H 1
 | 
				
			||||||
 | 
					/* Define to 1 if you have the <stdbool.h> header file. */
 | 
				
			||||||
 | 
					#define HAVE_STDBOOL_H 1
 | 
				
			||||||
 | 
					/* Define to 1 if you have the <arpa/inet.h> header file. */
 | 
				
			||||||
 | 
					#define HAVE_ARPA_INET_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Define to 1 if you have the `kqueue' function. */
 | 
				
			||||||
 | 
					#define HAVE_KQUEUE 1
 | 
				
			||||||
 | 
					/* Define to 1 if you have the `inet_ntoa' function. */
 | 
				
			||||||
 | 
					#define HAVE_INET_NTOA 1
 | 
				
			||||||
 | 
					/* Define to 1 if you have the `snprintf' function. */
 | 
				
			||||||
 | 
					#define HAVE_SNPRINTF 1
 | 
				
			||||||
 | 
					/* Define to 1 if you have the `strlcat' function. */
 | 
				
			||||||
 | 
					#define HAVE_STRLCAT 1
 | 
				
			||||||
 | 
					/* Define to 1 if you have the `strlcpy' function. */
 | 
				
			||||||
 | 
					#define HAVE_STRLCPY 1
 | 
				
			||||||
 | 
					/* Define to 1 if you have the `strdup' function. */
 | 
				
			||||||
 | 
					#define HAVE_STRDUP 1
 | 
				
			||||||
 | 
					/* Define to 1 if you have the `vsnprintf' function. */
 | 
				
			||||||
 | 
					#define HAVE_VSNPRINTF 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Define if socklen_t exists */
 | 
				
			||||||
 | 
					#define HAVE_socklen_t 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef ZEROCONF
 | 
				
			||||||
 | 
					/* Define to 1 if you have the <DNSServiceDiscovery/DNSServiceDiscovery.h> header file. */
 | 
				
			||||||
 | 
					#define HAVE_DNSSERVICEDISCOVERY_DNSSERVICEDISCOVERY_H 1
 | 
				
			||||||
 | 
					/* Define to 1 if you have the `DNSServiceRegistrationCreate' function. */
 | 
				
			||||||
 | 
					#define HAVE_DNSSERVICEREGISTRATIONCREATE 1
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* -eof- */
 | 
				
			||||||
							
								
								
									
										0
									
								
								contrib/MacOSX/cvs-version.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								contrib/MacOSX/cvs-version.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										683
									
								
								contrib/MacOSX/ngIRCd.xcodeproj/project.pbxproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										683
									
								
								contrib/MacOSX/ngIRCd.xcodeproj/project.pbxproj
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,683 @@
 | 
				
			|||||||
 | 
					// !$*UTF8*$!
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						archiveVersion = 1;
 | 
				
			||||||
 | 
						classes = {
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						objectVersion = 44;
 | 
				
			||||||
 | 
						objects = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Begin PBXBuildFile section */
 | 
				
			||||||
 | 
							FA322D350CEF74B1001761B3 /* array.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CD90CEF74B1001761B3 /* array.c */; };
 | 
				
			||||||
 | 
							FA322D360CEF74B1001761B3 /* channel.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CDB0CEF74B1001761B3 /* channel.c */; };
 | 
				
			||||||
 | 
							FA322D370CEF74B1001761B3 /* client.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CDD0CEF74B1001761B3 /* client.c */; };
 | 
				
			||||||
 | 
							FA322D380CEF74B1001761B3 /* conf.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CDF0CEF74B1001761B3 /* conf.c */; };
 | 
				
			||||||
 | 
							FA322D390CEF74B1001761B3 /* conn-func.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CE10CEF74B1001761B3 /* conn-func.c */; };
 | 
				
			||||||
 | 
							FA322D3A0CEF74B1001761B3 /* conn-zip.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CE30CEF74B1001761B3 /* conn-zip.c */; };
 | 
				
			||||||
 | 
							FA322D3B0CEF74B1001761B3 /* conn.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CE50CEF74B1001761B3 /* conn.c */; };
 | 
				
			||||||
 | 
							FA322D3C0CEF74B1001761B3 /* hash.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CE80CEF74B1001761B3 /* hash.c */; };
 | 
				
			||||||
 | 
							FA322D3D0CEF74B1001761B3 /* io.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CEA0CEF74B1001761B3 /* io.c */; };
 | 
				
			||||||
 | 
							FA322D3E0CEF74B1001761B3 /* irc-channel.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CEC0CEF74B1001761B3 /* irc-channel.c */; };
 | 
				
			||||||
 | 
							FA322D3F0CEF74B1001761B3 /* irc-info.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CEE0CEF74B1001761B3 /* irc-info.c */; };
 | 
				
			||||||
 | 
							FA322D400CEF74B1001761B3 /* irc-login.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CF00CEF74B1001761B3 /* irc-login.c */; };
 | 
				
			||||||
 | 
							FA322D410CEF74B1001761B3 /* irc-mode.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CF20CEF74B1001761B3 /* irc-mode.c */; };
 | 
				
			||||||
 | 
							FA322D420CEF74B1001761B3 /* irc-op.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CF40CEF74B1001761B3 /* irc-op.c */; };
 | 
				
			||||||
 | 
							FA322D430CEF74B1001761B3 /* irc-oper.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CF60CEF74B1001761B3 /* irc-oper.c */; };
 | 
				
			||||||
 | 
							FA322D440CEF74B1001761B3 /* irc-server.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CF80CEF74B1001761B3 /* irc-server.c */; };
 | 
				
			||||||
 | 
							FA322D450CEF74B1001761B3 /* irc-write.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CFA0CEF74B1001761B3 /* irc-write.c */; };
 | 
				
			||||||
 | 
							FA322D460CEF74B1001761B3 /* irc.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CFC0CEF74B1001761B3 /* irc.c */; };
 | 
				
			||||||
 | 
							FA322D470CEF74B1001761B3 /* lists.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322CFE0CEF74B1001761B3 /* lists.c */; };
 | 
				
			||||||
 | 
							FA322D480CEF74B1001761B3 /* log.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D000CEF74B1001761B3 /* log.c */; };
 | 
				
			||||||
 | 
							FA322D490CEF74B1001761B3 /* match.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D030CEF74B1001761B3 /* match.c */; };
 | 
				
			||||||
 | 
							FA322D4A0CEF74B1001761B3 /* ngircd.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D060CEF74B1001761B3 /* ngircd.c */; };
 | 
				
			||||||
 | 
							FA322D4B0CEF74B1001761B3 /* parse.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D080CEF74B1001761B3 /* parse.c */; };
 | 
				
			||||||
 | 
							FA322D4C0CEF74B1001761B3 /* rendezvous.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D0A0CEF74B1001761B3 /* rendezvous.c */; };
 | 
				
			||||||
 | 
							FA322D4D0CEF74B1001761B3 /* resolve.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D0C0CEF74B1001761B3 /* resolve.c */; };
 | 
				
			||||||
 | 
							FA322DBE0CEF7766001761B3 /* tool.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D330CEF74B1001761B3 /* tool.c */; };
 | 
				
			||||||
 | 
							FA322DC10CEF77CB001761B3 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FA322DC00CEF77CB001761B3 /* libz.dylib */; };
 | 
				
			||||||
 | 
							FAE5CC2E0CF2308A007D69B6 /* numeric.c in Sources */ = {isa = PBXBuildFile; fileRef = FAE5CC2D0CF2308A007D69B6 /* numeric.c */; };
 | 
				
			||||||
 | 
					/* End PBXBuildFile section */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Begin PBXCopyFilesBuildPhase section */
 | 
				
			||||||
 | 
							8DD76FAF0486AB0100D96B5E /* CopyFiles */ = {
 | 
				
			||||||
 | 
								isa = PBXCopyFilesBuildPhase;
 | 
				
			||||||
 | 
								buildActionMask = 8;
 | 
				
			||||||
 | 
								dstPath = /usr/share/man/man1/;
 | 
				
			||||||
 | 
								dstSubfolderSpec = 0;
 | 
				
			||||||
 | 
								files = (
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								runOnlyForDeploymentPostprocessing = 1;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					/* End PBXCopyFilesBuildPhase section */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Begin PBXFileReference section */
 | 
				
			||||||
 | 
							FA322BBA0CEF72E4001761B3 /* ngIRCd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ngIRCd; sourceTree = BUILT_PRODUCTS_DIR; };
 | 
				
			||||||
 | 
							FA322CD50CEF74B1001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CD60CEF74B1001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CD80CEF74B1001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CD90CEF74B1001761B3 /* array.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = array.c; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CDA0CEF74B1001761B3 /* array.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = array.h; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CDB0CEF74B1001761B3 /* channel.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = channel.c; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CDC0CEF74B1001761B3 /* channel.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = channel.h; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CDD0CEF74B1001761B3 /* client.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = client.c; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CDE0CEF74B1001761B3 /* client.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = client.h; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CDF0CEF74B1001761B3 /* conf.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = conf.c; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CE00CEF74B1001761B3 /* conf.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = conf.h; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CE10CEF74B1001761B3 /* conn-func.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "conn-func.c"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CE20CEF74B1001761B3 /* conn-func.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "conn-func.h"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CE30CEF74B1001761B3 /* conn-zip.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "conn-zip.c"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CE40CEF74B1001761B3 /* conn-zip.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "conn-zip.h"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CE50CEF74B1001761B3 /* conn.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = conn.c; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CE60CEF74B1001761B3 /* conn.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = conn.h; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CE70CEF74B1001761B3 /* defines.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = defines.h; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CE80CEF74B1001761B3 /* hash.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = hash.c; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CE90CEF74B1001761B3 /* hash.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = hash.h; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CEA0CEF74B1001761B3 /* io.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = io.c; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CEB0CEF74B1001761B3 /* io.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = io.h; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CEC0CEF74B1001761B3 /* irc-channel.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-channel.c"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CED0CEF74B1001761B3 /* irc-channel.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-channel.h"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CEE0CEF74B1001761B3 /* irc-info.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-info.c"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CEF0CEF74B1001761B3 /* irc-info.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-info.h"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CF00CEF74B1001761B3 /* irc-login.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-login.c"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CF10CEF74B1001761B3 /* irc-login.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-login.h"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CF20CEF74B1001761B3 /* irc-mode.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-mode.c"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CF30CEF74B1001761B3 /* irc-mode.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-mode.h"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CF40CEF74B1001761B3 /* irc-op.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-op.c"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CF50CEF74B1001761B3 /* irc-op.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-op.h"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CF60CEF74B1001761B3 /* irc-oper.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-oper.c"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CF70CEF74B1001761B3 /* irc-oper.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-oper.h"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CF80CEF74B1001761B3 /* irc-server.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-server.c"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CF90CEF74B1001761B3 /* irc-server.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-server.h"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CFA0CEF74B1001761B3 /* irc-write.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = "irc-write.c"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CFB0CEF74B1001761B3 /* irc-write.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = "irc-write.h"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CFC0CEF74B1001761B3 /* irc.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = irc.c; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CFD0CEF74B1001761B3 /* irc.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = irc.h; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CFE0CEF74B1001761B3 /* lists.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = lists.c; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322CFF0CEF74B1001761B3 /* lists.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = lists.h; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D000CEF74B1001761B3 /* log.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = log.c; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D010CEF74B1001761B3 /* log.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = log.h; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D020CEF74B1001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D030CEF74B1001761B3 /* match.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = match.c; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D040CEF74B1001761B3 /* match.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = match.h; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D050CEF74B1001761B3 /* messages.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = messages.h; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D060CEF74B1001761B3 /* ngircd.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = ngircd.c; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D070CEF74B1001761B3 /* ngircd.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = ngircd.h; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D080CEF74B1001761B3 /* parse.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = parse.c; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D090CEF74B1001761B3 /* parse.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = parse.h; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D0A0CEF74B1001761B3 /* rendezvous.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = rendezvous.c; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D0B0CEF74B1001761B3 /* rendezvous.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = rendezvous.h; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D0C0CEF74B1001761B3 /* resolve.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = resolve.c; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D0D0CEF74B1001761B3 /* resolve.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = resolve.h; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D0F0CEF74B1001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D100CEF74B1001761B3 /* ansi2knr.1 */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.man; path = ansi2knr.1; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D110CEF74B1001761B3 /* ansi2knr.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = ansi2knr.c; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D120CEF74B1001761B3 /* exp.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = exp.h; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D130CEF74B1001761B3 /* imp.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = imp.h; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D140CEF74B1001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D150CEF74B1001761B3 /* portab.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = portab.h; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D160CEF74B1001761B3 /* portabtest.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = portabtest.c; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D170CEF74B1001761B3 /* splint.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = splint.h; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D180CEF74B1001761B3 /* strdup.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = strdup.c; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D190CEF74B1001761B3 /* strlcpy.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = strlcpy.c; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D1A0CEF74B1001761B3 /* vsnprintf.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = vsnprintf.c; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D1C0CEF74B1001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D1D0CEF74B1001761B3 /* channel-test.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "channel-test.e"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D1E0CEF74B1001761B3 /* check-idle.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "check-idle.e"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D1F0CEF74B1001761B3 /* connect-test.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "connect-test.e"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D200CEF74B1001761B3 /* functions.inc */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.pascal; path = functions.inc; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D210CEF74B1001761B3 /* getpid.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = getpid.sh; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D220CEF74B1001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D230CEF74B1001761B3 /* mode-test.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "mode-test.e"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D240CEF74B1001761B3 /* ngircd-test.conf */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "ngircd-test.conf"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D250CEF74B1001761B3 /* README */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = README; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D260CEF74B1001761B3 /* start-server.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = "start-server.sh"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D270CEF74B1001761B3 /* stop-server.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = "stop-server.sh"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D280CEF74B1001761B3 /* stress-A.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "stress-A.e"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D290CEF74B1001761B3 /* stress-B.e */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "stress-B.e"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D2A0CEF74B1001761B3 /* stress-server.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = "stress-server.sh"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D2B0CEF74B1001761B3 /* test-loop.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = "test-loop.sh"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D2C0CEF74B1001761B3 /* tests.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = tests.sh; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D2D0CEF74B1001761B3 /* wait-tests.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = "wait-tests.sh"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D2F0CEF74B1001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D300CEF74B1001761B3 /* ansi2knr.1 */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.man; path = ansi2knr.1; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D310CEF74B1001761B3 /* ansi2knr.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = ansi2knr.c; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D320CEF74B1001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D330CEF74B1001761B3 /* tool.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = tool.c; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D340CEF74B1001761B3 /* tool.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = tool.h; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D5A0CEF750F001761B3 /* AUTHORS */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = AUTHORS; path = ../../AUTHORS; sourceTree = SOURCE_ROOT; };
 | 
				
			||||||
 | 
							FA322D5B0CEF750F001761B3 /* autogen.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; name = autogen.sh; path = ../../autogen.sh; sourceTree = SOURCE_ROOT; };
 | 
				
			||||||
 | 
							FA322D5C0CEF750F001761B3 /* ChangeLog */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = ChangeLog; path = ../../ChangeLog; sourceTree = SOURCE_ROOT; };
 | 
				
			||||||
 | 
							FA322D5E0CEF750F001761B3 /* config.guess */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; name = config.guess; path = ../../config.guess; sourceTree = SOURCE_ROOT; };
 | 
				
			||||||
 | 
							FA322D5F0CEF750F001761B3 /* config.sub */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; name = config.sub; path = ../../config.sub; sourceTree = SOURCE_ROOT; };
 | 
				
			||||||
 | 
							FA322D600CEF750F001761B3 /* configure.in */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = configure.in; path = ../../configure.in; sourceTree = SOURCE_ROOT; };
 | 
				
			||||||
 | 
							FA322D610CEF750F001761B3 /* COPYING */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = COPYING; path = ../../COPYING; sourceTree = SOURCE_ROOT; };
 | 
				
			||||||
 | 
							FA322D620CEF750F001761B3 /* INSTALL */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = INSTALL; path = ../../INSTALL; sourceTree = SOURCE_ROOT; };
 | 
				
			||||||
 | 
							FA322D630CEF750F001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = Makefile.am; path = ../../Makefile.am; sourceTree = SOURCE_ROOT; };
 | 
				
			||||||
 | 
							FA322D640CEF750F001761B3 /* NEWS */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = NEWS; path = ../../NEWS; sourceTree = SOURCE_ROOT; };
 | 
				
			||||||
 | 
							FA322D650CEF750F001761B3 /* README */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = README; path = ../../README; sourceTree = SOURCE_ROOT; };
 | 
				
			||||||
 | 
							FA322D670CEF7523001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D690CEF7523001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D6A0CEF7523001761B3 /* changelog */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = changelog; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D6B0CEF7523001761B3 /* compat */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = compat; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D6C0CEF7523001761B3 /* control */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = control; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D6D0CEF7523001761B3 /* copyright */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = copyright; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D6E0CEF7523001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D6F0CEF7523001761B3 /* ngircd.default */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = ngircd.default; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D700CEF7523001761B3 /* ngircd.init */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = ngircd.init; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D710CEF7523001761B3 /* ngircd.postinst */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = ngircd.postinst; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D720CEF7523001761B3 /* rules */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = rules; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D740CEF7523001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D8D0CEF7523001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D8E0CEF7523001761B3 /* ngIRCd.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = ngIRCd.xcodeproj; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D910CEF7523001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D920CEF7523001761B3 /* ngindent */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = ngindent; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D930CEF7523001761B3 /* ngircd.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = ngircd.sh; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D940CEF7523001761B3 /* ngircd.spec */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = ngircd.spec; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D950CEF7523001761B3 /* README */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = README; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D960CEF7523001761B3 /* systrace.policy */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = systrace.policy; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D980CEF752C001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D990CEF752C001761B3 /* CVS.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = CVS.txt; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D9A0CEF752C001761B3 /* FAQ.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = FAQ.txt; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D9B0CEF752C001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D9C0CEF752C001761B3 /* Platforms.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Platforms.txt; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D9D0CEF752C001761B3 /* Protocol.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Protocol.txt; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D9E0CEF752C001761B3 /* README-AUX.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "README-AUX.txt"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322D9F0CEF752C001761B3 /* README-BeOS.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "README-BeOS.txt"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322DA00CEF752C001761B3 /* RFC.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = RFC.txt; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322DA10CEF752C001761B3 /* sample-ngircd.conf */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = "sample-ngircd.conf"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322DA30CEF752C001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322DA40CEF752C001761B3 /* Doxyfile */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Doxyfile; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322DA50CEF752C001761B3 /* footer.inc.html */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.html; path = footer.inc.html; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322DA60CEF752C001761B3 /* header.inc.html */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.html; path = header.inc.html; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322DA70CEF752C001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322DA80CEF752C001761B3 /* ngircd-doc.css */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.css; path = "ngircd-doc.css"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322DA90CEF752C001761B3 /* SSL.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = SSL.txt; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322DAA0CEF752C001761B3 /* Zeroconf.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Zeroconf.txt; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322DAC0CEF7538001761B3 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = .cvsignore; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322DAD0CEF7538001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322DAE0CEF7538001761B3 /* ngircd.8.tmpl */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = ngircd.8.tmpl; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322DAF0CEF7538001761B3 /* ngircd.conf.5.tmpl */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = ngircd.conf.5.tmpl; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322DB10CEF7565001761B3 /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322DBB0CEF773C001761B3 /* cvs-version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "cvs-version.h"; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FA322DC00CEF77CB001761B3 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = /usr/lib/libz.dylib; sourceTree = "<absolute>"; };
 | 
				
			||||||
 | 
							FAE5CC2C0CF2308A007D69B6 /* numeric.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = numeric.h; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							FAE5CC2D0CF2308A007D69B6 /* numeric.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = numeric.c; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
					/* End PBXFileReference section */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Begin PBXFrameworksBuildPhase section */
 | 
				
			||||||
 | 
							8DD76FAD0486AB0100D96B5E /* Frameworks */ = {
 | 
				
			||||||
 | 
								isa = PBXFrameworksBuildPhase;
 | 
				
			||||||
 | 
								buildActionMask = 2147483647;
 | 
				
			||||||
 | 
								files = (
 | 
				
			||||||
 | 
									FA322DC10CEF77CB001761B3 /* libz.dylib in Frameworks */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								runOnlyForDeploymentPostprocessing = 0;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					/* End PBXFrameworksBuildPhase section */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Begin PBXGroup section */
 | 
				
			||||||
 | 
							08FB7794FE84155DC02AAC07 /* ngIRCd */ = {
 | 
				
			||||||
 | 
								isa = PBXGroup;
 | 
				
			||||||
 | 
								children = (
 | 
				
			||||||
 | 
									FA322D970CEF752C001761B3 /* doc */,
 | 
				
			||||||
 | 
									FA322D660CEF7523001761B3 /* contrib */,
 | 
				
			||||||
 | 
									FA322DAB0CEF7538001761B3 /* man */,
 | 
				
			||||||
 | 
									FA322CD40CEF74B0001761B3 /* src */,
 | 
				
			||||||
 | 
									FA322D5A0CEF750F001761B3 /* AUTHORS */,
 | 
				
			||||||
 | 
									FA322D610CEF750F001761B3 /* COPYING */,
 | 
				
			||||||
 | 
									FA322D620CEF750F001761B3 /* INSTALL */,
 | 
				
			||||||
 | 
									FA322D640CEF750F001761B3 /* NEWS */,
 | 
				
			||||||
 | 
									FA322D650CEF750F001761B3 /* README */,
 | 
				
			||||||
 | 
									FA322D5B0CEF750F001761B3 /* autogen.sh */,
 | 
				
			||||||
 | 
									FA322D5C0CEF750F001761B3 /* ChangeLog */,
 | 
				
			||||||
 | 
									FA322D5E0CEF750F001761B3 /* config.guess */,
 | 
				
			||||||
 | 
									FA322D5F0CEF750F001761B3 /* config.sub */,
 | 
				
			||||||
 | 
									FA322D600CEF750F001761B3 /* configure.in */,
 | 
				
			||||||
 | 
									FA322D630CEF750F001761B3 /* Makefile.am */,
 | 
				
			||||||
 | 
									1AB674ADFE9D54B511CA2CBB /* Products */,
 | 
				
			||||||
 | 
									FA322DC00CEF77CB001761B3 /* libz.dylib */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								name = ngIRCd;
 | 
				
			||||||
 | 
								sourceTree = "<group>";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							1AB674ADFE9D54B511CA2CBB /* Products */ = {
 | 
				
			||||||
 | 
								isa = PBXGroup;
 | 
				
			||||||
 | 
								children = (
 | 
				
			||||||
 | 
									FA322BBA0CEF72E4001761B3 /* ngIRCd */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								name = Products;
 | 
				
			||||||
 | 
								sourceTree = "<group>";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							FA322CD40CEF74B0001761B3 /* src */ = {
 | 
				
			||||||
 | 
								isa = PBXGroup;
 | 
				
			||||||
 | 
								children = (
 | 
				
			||||||
 | 
									FA322CD70CEF74B1001761B3 /* ngircd */,
 | 
				
			||||||
 | 
									FA322D0E0CEF74B1001761B3 /* portab */,
 | 
				
			||||||
 | 
									FA322D1B0CEF74B1001761B3 /* testsuite */,
 | 
				
			||||||
 | 
									FA322D2E0CEF74B1001761B3 /* tool */,
 | 
				
			||||||
 | 
									FA322CD50CEF74B1001761B3 /* .cvsignore */,
 | 
				
			||||||
 | 
									FA322CD60CEF74B1001761B3 /* Makefile.am */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								name = src;
 | 
				
			||||||
 | 
								path = ../../src;
 | 
				
			||||||
 | 
								sourceTree = SOURCE_ROOT;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							FA322CD70CEF74B1001761B3 /* ngircd */ = {
 | 
				
			||||||
 | 
								isa = PBXGroup;
 | 
				
			||||||
 | 
								children = (
 | 
				
			||||||
 | 
									FA322CD80CEF74B1001761B3 /* .cvsignore */,
 | 
				
			||||||
 | 
									FA322CD90CEF74B1001761B3 /* array.c */,
 | 
				
			||||||
 | 
									FA322CDA0CEF74B1001761B3 /* array.h */,
 | 
				
			||||||
 | 
									FA322CDB0CEF74B1001761B3 /* channel.c */,
 | 
				
			||||||
 | 
									FA322CDC0CEF74B1001761B3 /* channel.h */,
 | 
				
			||||||
 | 
									FA322CDD0CEF74B1001761B3 /* client.c */,
 | 
				
			||||||
 | 
									FA322CDE0CEF74B1001761B3 /* client.h */,
 | 
				
			||||||
 | 
									FA322CDF0CEF74B1001761B3 /* conf.c */,
 | 
				
			||||||
 | 
									FA322CE00CEF74B1001761B3 /* conf.h */,
 | 
				
			||||||
 | 
									FA322CE10CEF74B1001761B3 /* conn-func.c */,
 | 
				
			||||||
 | 
									FA322CE20CEF74B1001761B3 /* conn-func.h */,
 | 
				
			||||||
 | 
									FA322CE30CEF74B1001761B3 /* conn-zip.c */,
 | 
				
			||||||
 | 
									FA322CE40CEF74B1001761B3 /* conn-zip.h */,
 | 
				
			||||||
 | 
									FA322CE50CEF74B1001761B3 /* conn.c */,
 | 
				
			||||||
 | 
									FA322CE60CEF74B1001761B3 /* conn.h */,
 | 
				
			||||||
 | 
									FA322CE70CEF74B1001761B3 /* defines.h */,
 | 
				
			||||||
 | 
									FA322CE80CEF74B1001761B3 /* hash.c */,
 | 
				
			||||||
 | 
									FA322CE90CEF74B1001761B3 /* hash.h */,
 | 
				
			||||||
 | 
									FA322CEA0CEF74B1001761B3 /* io.c */,
 | 
				
			||||||
 | 
									FA322CEB0CEF74B1001761B3 /* io.h */,
 | 
				
			||||||
 | 
									FA322CEC0CEF74B1001761B3 /* irc-channel.c */,
 | 
				
			||||||
 | 
									FA322CED0CEF74B1001761B3 /* irc-channel.h */,
 | 
				
			||||||
 | 
									FA322CEE0CEF74B1001761B3 /* irc-info.c */,
 | 
				
			||||||
 | 
									FA322CEF0CEF74B1001761B3 /* irc-info.h */,
 | 
				
			||||||
 | 
									FA322CF00CEF74B1001761B3 /* irc-login.c */,
 | 
				
			||||||
 | 
									FA322CF10CEF74B1001761B3 /* irc-login.h */,
 | 
				
			||||||
 | 
									FA322CF20CEF74B1001761B3 /* irc-mode.c */,
 | 
				
			||||||
 | 
									FA322CF30CEF74B1001761B3 /* irc-mode.h */,
 | 
				
			||||||
 | 
									FA322CF40CEF74B1001761B3 /* irc-op.c */,
 | 
				
			||||||
 | 
									FA322CF50CEF74B1001761B3 /* irc-op.h */,
 | 
				
			||||||
 | 
									FA322CF60CEF74B1001761B3 /* irc-oper.c */,
 | 
				
			||||||
 | 
									FA322CF70CEF74B1001761B3 /* irc-oper.h */,
 | 
				
			||||||
 | 
									FA322CF80CEF74B1001761B3 /* irc-server.c */,
 | 
				
			||||||
 | 
									FA322CF90CEF74B1001761B3 /* irc-server.h */,
 | 
				
			||||||
 | 
									FA322CFA0CEF74B1001761B3 /* irc-write.c */,
 | 
				
			||||||
 | 
									FA322CFB0CEF74B1001761B3 /* irc-write.h */,
 | 
				
			||||||
 | 
									FA322CFC0CEF74B1001761B3 /* irc.c */,
 | 
				
			||||||
 | 
									FA322CFD0CEF74B1001761B3 /* irc.h */,
 | 
				
			||||||
 | 
									FA322CFE0CEF74B1001761B3 /* lists.c */,
 | 
				
			||||||
 | 
									FA322CFF0CEF74B1001761B3 /* lists.h */,
 | 
				
			||||||
 | 
									FA322D000CEF74B1001761B3 /* log.c */,
 | 
				
			||||||
 | 
									FA322D010CEF74B1001761B3 /* log.h */,
 | 
				
			||||||
 | 
									FA322D020CEF74B1001761B3 /* Makefile.am */,
 | 
				
			||||||
 | 
									FA322D030CEF74B1001761B3 /* match.c */,
 | 
				
			||||||
 | 
									FA322D040CEF74B1001761B3 /* match.h */,
 | 
				
			||||||
 | 
									FA322D050CEF74B1001761B3 /* messages.h */,
 | 
				
			||||||
 | 
									FA322D060CEF74B1001761B3 /* ngircd.c */,
 | 
				
			||||||
 | 
									FA322D070CEF74B1001761B3 /* ngircd.h */,
 | 
				
			||||||
 | 
									FAE5CC2D0CF2308A007D69B6 /* numeric.c */,
 | 
				
			||||||
 | 
									FAE5CC2C0CF2308A007D69B6 /* numeric.h */,
 | 
				
			||||||
 | 
									FA322D080CEF74B1001761B3 /* parse.c */,
 | 
				
			||||||
 | 
									FA322D090CEF74B1001761B3 /* parse.h */,
 | 
				
			||||||
 | 
									FA322D0A0CEF74B1001761B3 /* rendezvous.c */,
 | 
				
			||||||
 | 
									FA322D0B0CEF74B1001761B3 /* rendezvous.h */,
 | 
				
			||||||
 | 
									FA322D0C0CEF74B1001761B3 /* resolve.c */,
 | 
				
			||||||
 | 
									FA322D0D0CEF74B1001761B3 /* resolve.h */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								path = ngircd;
 | 
				
			||||||
 | 
								sourceTree = "<group>";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							FA322D0E0CEF74B1001761B3 /* portab */ = {
 | 
				
			||||||
 | 
								isa = PBXGroup;
 | 
				
			||||||
 | 
								children = (
 | 
				
			||||||
 | 
									FA322D0F0CEF74B1001761B3 /* .cvsignore */,
 | 
				
			||||||
 | 
									FA322D100CEF74B1001761B3 /* ansi2knr.1 */,
 | 
				
			||||||
 | 
									FA322D110CEF74B1001761B3 /* ansi2knr.c */,
 | 
				
			||||||
 | 
									FA322D120CEF74B1001761B3 /* exp.h */,
 | 
				
			||||||
 | 
									FA322D130CEF74B1001761B3 /* imp.h */,
 | 
				
			||||||
 | 
									FA322D140CEF74B1001761B3 /* Makefile.am */,
 | 
				
			||||||
 | 
									FA322D150CEF74B1001761B3 /* portab.h */,
 | 
				
			||||||
 | 
									FA322D160CEF74B1001761B3 /* portabtest.c */,
 | 
				
			||||||
 | 
									FA322D170CEF74B1001761B3 /* splint.h */,
 | 
				
			||||||
 | 
									FA322D180CEF74B1001761B3 /* strdup.c */,
 | 
				
			||||||
 | 
									FA322D190CEF74B1001761B3 /* strlcpy.c */,
 | 
				
			||||||
 | 
									FA322D1A0CEF74B1001761B3 /* vsnprintf.c */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								path = portab;
 | 
				
			||||||
 | 
								sourceTree = "<group>";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							FA322D1B0CEF74B1001761B3 /* testsuite */ = {
 | 
				
			||||||
 | 
								isa = PBXGroup;
 | 
				
			||||||
 | 
								children = (
 | 
				
			||||||
 | 
									FA322D1C0CEF74B1001761B3 /* .cvsignore */,
 | 
				
			||||||
 | 
									FA322D1D0CEF74B1001761B3 /* channel-test.e */,
 | 
				
			||||||
 | 
									FA322D1E0CEF74B1001761B3 /* check-idle.e */,
 | 
				
			||||||
 | 
									FA322D1F0CEF74B1001761B3 /* connect-test.e */,
 | 
				
			||||||
 | 
									FA322D200CEF74B1001761B3 /* functions.inc */,
 | 
				
			||||||
 | 
									FA322D210CEF74B1001761B3 /* getpid.sh */,
 | 
				
			||||||
 | 
									FA322D220CEF74B1001761B3 /* Makefile.am */,
 | 
				
			||||||
 | 
									FA322D230CEF74B1001761B3 /* mode-test.e */,
 | 
				
			||||||
 | 
									FA322D240CEF74B1001761B3 /* ngircd-test.conf */,
 | 
				
			||||||
 | 
									FA322D250CEF74B1001761B3 /* README */,
 | 
				
			||||||
 | 
									FA322D260CEF74B1001761B3 /* start-server.sh */,
 | 
				
			||||||
 | 
									FA322D270CEF74B1001761B3 /* stop-server.sh */,
 | 
				
			||||||
 | 
									FA322D280CEF74B1001761B3 /* stress-A.e */,
 | 
				
			||||||
 | 
									FA322D290CEF74B1001761B3 /* stress-B.e */,
 | 
				
			||||||
 | 
									FA322D2A0CEF74B1001761B3 /* stress-server.sh */,
 | 
				
			||||||
 | 
									FA322D2B0CEF74B1001761B3 /* test-loop.sh */,
 | 
				
			||||||
 | 
									FA322D2C0CEF74B1001761B3 /* tests.sh */,
 | 
				
			||||||
 | 
									FA322D2D0CEF74B1001761B3 /* wait-tests.sh */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								path = testsuite;
 | 
				
			||||||
 | 
								sourceTree = "<group>";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							FA322D2E0CEF74B1001761B3 /* tool */ = {
 | 
				
			||||||
 | 
								isa = PBXGroup;
 | 
				
			||||||
 | 
								children = (
 | 
				
			||||||
 | 
									FA322D2F0CEF74B1001761B3 /* .cvsignore */,
 | 
				
			||||||
 | 
									FA322D300CEF74B1001761B3 /* ansi2knr.1 */,
 | 
				
			||||||
 | 
									FA322D310CEF74B1001761B3 /* ansi2knr.c */,
 | 
				
			||||||
 | 
									FA322D320CEF74B1001761B3 /* Makefile.am */,
 | 
				
			||||||
 | 
									FA322D330CEF74B1001761B3 /* tool.c */,
 | 
				
			||||||
 | 
									FA322D340CEF74B1001761B3 /* tool.h */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								path = tool;
 | 
				
			||||||
 | 
								sourceTree = "<group>";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							FA322D660CEF7523001761B3 /* contrib */ = {
 | 
				
			||||||
 | 
								isa = PBXGroup;
 | 
				
			||||||
 | 
								children = (
 | 
				
			||||||
 | 
									FA322D670CEF7523001761B3 /* .cvsignore */,
 | 
				
			||||||
 | 
									FA322D680CEF7523001761B3 /* Debian */,
 | 
				
			||||||
 | 
									FA322D730CEF7523001761B3 /* MacOSX */,
 | 
				
			||||||
 | 
									FA322D910CEF7523001761B3 /* Makefile.am */,
 | 
				
			||||||
 | 
									FA322D920CEF7523001761B3 /* ngindent */,
 | 
				
			||||||
 | 
									FA322D930CEF7523001761B3 /* ngircd.sh */,
 | 
				
			||||||
 | 
									FA322D940CEF7523001761B3 /* ngircd.spec */,
 | 
				
			||||||
 | 
									FA322D950CEF7523001761B3 /* README */,
 | 
				
			||||||
 | 
									FA322D960CEF7523001761B3 /* systrace.policy */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								name = contrib;
 | 
				
			||||||
 | 
								path = ..;
 | 
				
			||||||
 | 
								sourceTree = SOURCE_ROOT;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							FA322D680CEF7523001761B3 /* Debian */ = {
 | 
				
			||||||
 | 
								isa = PBXGroup;
 | 
				
			||||||
 | 
								children = (
 | 
				
			||||||
 | 
									FA322D690CEF7523001761B3 /* .cvsignore */,
 | 
				
			||||||
 | 
									FA322D6A0CEF7523001761B3 /* changelog */,
 | 
				
			||||||
 | 
									FA322D6B0CEF7523001761B3 /* compat */,
 | 
				
			||||||
 | 
									FA322D6C0CEF7523001761B3 /* control */,
 | 
				
			||||||
 | 
									FA322D6D0CEF7523001761B3 /* copyright */,
 | 
				
			||||||
 | 
									FA322D6E0CEF7523001761B3 /* Makefile.am */,
 | 
				
			||||||
 | 
									FA322D6F0CEF7523001761B3 /* ngircd.default */,
 | 
				
			||||||
 | 
									FA322D700CEF7523001761B3 /* ngircd.init */,
 | 
				
			||||||
 | 
									FA322D710CEF7523001761B3 /* ngircd.postinst */,
 | 
				
			||||||
 | 
									FA322D720CEF7523001761B3 /* rules */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								path = Debian;
 | 
				
			||||||
 | 
								sourceTree = "<group>";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							FA322D730CEF7523001761B3 /* MacOSX */ = {
 | 
				
			||||||
 | 
								isa = PBXGroup;
 | 
				
			||||||
 | 
								children = (
 | 
				
			||||||
 | 
									FA322D740CEF7523001761B3 /* .cvsignore */,
 | 
				
			||||||
 | 
									FA322D750CEF7523001761B3 /* build */,
 | 
				
			||||||
 | 
									FA322D8D0CEF7523001761B3 /* Makefile.am */,
 | 
				
			||||||
 | 
									FA322D8E0CEF7523001761B3 /* ngIRCd.xcodeproj */,
 | 
				
			||||||
 | 
									FA322DB10CEF7565001761B3 /* config.h */,
 | 
				
			||||||
 | 
									FA322DBB0CEF773C001761B3 /* cvs-version.h */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								path = MacOSX;
 | 
				
			||||||
 | 
								sourceTree = "<group>";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							FA322D750CEF7523001761B3 /* build */ = {
 | 
				
			||||||
 | 
								isa = PBXGroup;
 | 
				
			||||||
 | 
								children = (
 | 
				
			||||||
 | 
									FA322D760CEF7523001761B3 /* ngIRCd.build */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								path = build;
 | 
				
			||||||
 | 
								sourceTree = "<group>";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							FA322D760CEF7523001761B3 /* ngIRCd.build */ = {
 | 
				
			||||||
 | 
								isa = PBXGroup;
 | 
				
			||||||
 | 
								children = (
 | 
				
			||||||
 | 
									FA322D770CEF7523001761B3 /* Default */,
 | 
				
			||||||
 | 
									FA322D7F0CEF7523001761B3 /* ngIRCd.pbxindex */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								path = ngIRCd.build;
 | 
				
			||||||
 | 
								sourceTree = "<group>";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							FA322D770CEF7523001761B3 /* Default */ = {
 | 
				
			||||||
 | 
								isa = PBXGroup;
 | 
				
			||||||
 | 
								children = (
 | 
				
			||||||
 | 
									FA322D780CEF7523001761B3 /* ngIRCd.build */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								path = Default;
 | 
				
			||||||
 | 
								sourceTree = "<group>";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							FA322D780CEF7523001761B3 /* ngIRCd.build */ = {
 | 
				
			||||||
 | 
								isa = PBXGroup;
 | 
				
			||||||
 | 
								children = (
 | 
				
			||||||
 | 
									FA322D7A0CEF7523001761B3 /* Objects-normal */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								path = ngIRCd.build;
 | 
				
			||||||
 | 
								sourceTree = "<group>";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							FA322D7A0CEF7523001761B3 /* Objects-normal */ = {
 | 
				
			||||||
 | 
								isa = PBXGroup;
 | 
				
			||||||
 | 
								children = (
 | 
				
			||||||
 | 
									FA322D7B0CEF7523001761B3 /* i386 */,
 | 
				
			||||||
 | 
									FA322D7D0CEF7523001761B3 /* ppc */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								path = "Objects-normal";
 | 
				
			||||||
 | 
								sourceTree = "<group>";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							FA322D7B0CEF7523001761B3 /* i386 */ = {
 | 
				
			||||||
 | 
								isa = PBXGroup;
 | 
				
			||||||
 | 
								children = (
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								path = i386;
 | 
				
			||||||
 | 
								sourceTree = "<group>";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							FA322D7D0CEF7523001761B3 /* ppc */ = {
 | 
				
			||||||
 | 
								isa = PBXGroup;
 | 
				
			||||||
 | 
								children = (
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								path = ppc;
 | 
				
			||||||
 | 
								sourceTree = "<group>";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							FA322D7F0CEF7523001761B3 /* ngIRCd.pbxindex */ = {
 | 
				
			||||||
 | 
								isa = PBXGroup;
 | 
				
			||||||
 | 
								children = (
 | 
				
			||||||
 | 
									FA322D880CEF7523001761B3 /* strings.pbxstrings */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								path = ngIRCd.pbxindex;
 | 
				
			||||||
 | 
								sourceTree = "<group>";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							FA322D880CEF7523001761B3 /* strings.pbxstrings */ = {
 | 
				
			||||||
 | 
								isa = PBXGroup;
 | 
				
			||||||
 | 
								children = (
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								path = strings.pbxstrings;
 | 
				
			||||||
 | 
								sourceTree = "<group>";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							FA322D8F0CEF7523001761B3 /* Products */ = {
 | 
				
			||||||
 | 
								isa = PBXGroup;
 | 
				
			||||||
 | 
								children = (
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								name = Products;
 | 
				
			||||||
 | 
								sourceTree = "<group>";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							FA322D970CEF752C001761B3 /* doc */ = {
 | 
				
			||||||
 | 
								isa = PBXGroup;
 | 
				
			||||||
 | 
								children = (
 | 
				
			||||||
 | 
									FA322D980CEF752C001761B3 /* .cvsignore */,
 | 
				
			||||||
 | 
									FA322D990CEF752C001761B3 /* CVS.txt */,
 | 
				
			||||||
 | 
									FA322D9A0CEF752C001761B3 /* FAQ.txt */,
 | 
				
			||||||
 | 
									FA322D9B0CEF752C001761B3 /* Makefile.am */,
 | 
				
			||||||
 | 
									FA322D9C0CEF752C001761B3 /* Platforms.txt */,
 | 
				
			||||||
 | 
									FA322D9D0CEF752C001761B3 /* Protocol.txt */,
 | 
				
			||||||
 | 
									FA322D9E0CEF752C001761B3 /* README-AUX.txt */,
 | 
				
			||||||
 | 
									FA322D9F0CEF752C001761B3 /* README-BeOS.txt */,
 | 
				
			||||||
 | 
									FA322DA00CEF752C001761B3 /* RFC.txt */,
 | 
				
			||||||
 | 
									FA322DA10CEF752C001761B3 /* sample-ngircd.conf */,
 | 
				
			||||||
 | 
									FA322DA20CEF752C001761B3 /* src */,
 | 
				
			||||||
 | 
									FA322DA90CEF752C001761B3 /* SSL.txt */,
 | 
				
			||||||
 | 
									FA322DAA0CEF752C001761B3 /* Zeroconf.txt */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								name = doc;
 | 
				
			||||||
 | 
								path = ../../doc;
 | 
				
			||||||
 | 
								sourceTree = SOURCE_ROOT;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							FA322DA20CEF752C001761B3 /* src */ = {
 | 
				
			||||||
 | 
								isa = PBXGroup;
 | 
				
			||||||
 | 
								children = (
 | 
				
			||||||
 | 
									FA322DA30CEF752C001761B3 /* .cvsignore */,
 | 
				
			||||||
 | 
									FA322DA40CEF752C001761B3 /* Doxyfile */,
 | 
				
			||||||
 | 
									FA322DA50CEF752C001761B3 /* footer.inc.html */,
 | 
				
			||||||
 | 
									FA322DA60CEF752C001761B3 /* header.inc.html */,
 | 
				
			||||||
 | 
									FA322DA70CEF752C001761B3 /* Makefile.am */,
 | 
				
			||||||
 | 
									FA322DA80CEF752C001761B3 /* ngircd-doc.css */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								path = src;
 | 
				
			||||||
 | 
								sourceTree = "<group>";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							FA322DAB0CEF7538001761B3 /* man */ = {
 | 
				
			||||||
 | 
								isa = PBXGroup;
 | 
				
			||||||
 | 
								children = (
 | 
				
			||||||
 | 
									FA322DAC0CEF7538001761B3 /* .cvsignore */,
 | 
				
			||||||
 | 
									FA322DAD0CEF7538001761B3 /* Makefile.am */,
 | 
				
			||||||
 | 
									FA322DAE0CEF7538001761B3 /* ngircd.8.tmpl */,
 | 
				
			||||||
 | 
									FA322DAF0CEF7538001761B3 /* ngircd.conf.5.tmpl */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								name = man;
 | 
				
			||||||
 | 
								path = ../../man;
 | 
				
			||||||
 | 
								sourceTree = SOURCE_ROOT;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					/* End PBXGroup section */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Begin PBXNativeTarget section */
 | 
				
			||||||
 | 
							8DD76FA90486AB0100D96B5E /* ngIRCd */ = {
 | 
				
			||||||
 | 
								isa = PBXNativeTarget;
 | 
				
			||||||
 | 
								buildConfigurationList = 1DEB928508733DD80010E9CD /* Build configuration list for PBXNativeTarget "ngIRCd" */;
 | 
				
			||||||
 | 
								buildPhases = (
 | 
				
			||||||
 | 
									8DD76FAB0486AB0100D96B5E /* Sources */,
 | 
				
			||||||
 | 
									8DD76FAD0486AB0100D96B5E /* Frameworks */,
 | 
				
			||||||
 | 
									8DD76FAF0486AB0100D96B5E /* CopyFiles */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								buildRules = (
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								dependencies = (
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								name = ngIRCd;
 | 
				
			||||||
 | 
								productInstallPath = "$(HOME)/bin";
 | 
				
			||||||
 | 
								productName = ngIRCd;
 | 
				
			||||||
 | 
								productReference = FA322BBA0CEF72E4001761B3 /* ngIRCd */;
 | 
				
			||||||
 | 
								productType = "com.apple.product-type.tool";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					/* End PBXNativeTarget section */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Begin PBXProject section */
 | 
				
			||||||
 | 
							08FB7793FE84155DC02AAC07 /* Project object */ = {
 | 
				
			||||||
 | 
								isa = PBXProject;
 | 
				
			||||||
 | 
								buildConfigurationList = 1DEB928908733DD80010E9CD /* Build configuration list for PBXProject "ngIRCd" */;
 | 
				
			||||||
 | 
								compatibilityVersion = "Xcode 3.0";
 | 
				
			||||||
 | 
								hasScannedForEncodings = 1;
 | 
				
			||||||
 | 
								mainGroup = 08FB7794FE84155DC02AAC07 /* ngIRCd */;
 | 
				
			||||||
 | 
								projectDirPath = "";
 | 
				
			||||||
 | 
								projectReferences = (
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										ProductGroup = FA322D8F0CEF7523001761B3 /* Products */;
 | 
				
			||||||
 | 
										ProjectRef = FA322D8E0CEF7523001761B3 /* ngIRCd.xcodeproj */;
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								projectRoot = "";
 | 
				
			||||||
 | 
								targets = (
 | 
				
			||||||
 | 
									8DD76FA90486AB0100D96B5E /* ngIRCd */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					/* End PBXProject section */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Begin PBXSourcesBuildPhase section */
 | 
				
			||||||
 | 
							8DD76FAB0486AB0100D96B5E /* Sources */ = {
 | 
				
			||||||
 | 
								isa = PBXSourcesBuildPhase;
 | 
				
			||||||
 | 
								buildActionMask = 2147483647;
 | 
				
			||||||
 | 
								files = (
 | 
				
			||||||
 | 
									FA322D350CEF74B1001761B3 /* array.c in Sources */,
 | 
				
			||||||
 | 
									FA322D360CEF74B1001761B3 /* channel.c in Sources */,
 | 
				
			||||||
 | 
									FA322D370CEF74B1001761B3 /* client.c in Sources */,
 | 
				
			||||||
 | 
									FA322D380CEF74B1001761B3 /* conf.c in Sources */,
 | 
				
			||||||
 | 
									FA322D390CEF74B1001761B3 /* conn-func.c in Sources */,
 | 
				
			||||||
 | 
									FA322D3A0CEF74B1001761B3 /* conn-zip.c in Sources */,
 | 
				
			||||||
 | 
									FA322D3B0CEF74B1001761B3 /* conn.c in Sources */,
 | 
				
			||||||
 | 
									FA322D3C0CEF74B1001761B3 /* hash.c in Sources */,
 | 
				
			||||||
 | 
									FA322D3D0CEF74B1001761B3 /* io.c in Sources */,
 | 
				
			||||||
 | 
									FA322D3E0CEF74B1001761B3 /* irc-channel.c in Sources */,
 | 
				
			||||||
 | 
									FA322D3F0CEF74B1001761B3 /* irc-info.c in Sources */,
 | 
				
			||||||
 | 
									FA322D400CEF74B1001761B3 /* irc-login.c in Sources */,
 | 
				
			||||||
 | 
									FA322D410CEF74B1001761B3 /* irc-mode.c in Sources */,
 | 
				
			||||||
 | 
									FA322D420CEF74B1001761B3 /* irc-op.c in Sources */,
 | 
				
			||||||
 | 
									FA322D430CEF74B1001761B3 /* irc-oper.c in Sources */,
 | 
				
			||||||
 | 
									FA322D440CEF74B1001761B3 /* irc-server.c in Sources */,
 | 
				
			||||||
 | 
									FA322D450CEF74B1001761B3 /* irc-write.c in Sources */,
 | 
				
			||||||
 | 
									FA322D460CEF74B1001761B3 /* irc.c in Sources */,
 | 
				
			||||||
 | 
									FA322D470CEF74B1001761B3 /* lists.c in Sources */,
 | 
				
			||||||
 | 
									FA322D480CEF74B1001761B3 /* log.c in Sources */,
 | 
				
			||||||
 | 
									FA322D490CEF74B1001761B3 /* match.c in Sources */,
 | 
				
			||||||
 | 
									FA322D4A0CEF74B1001761B3 /* ngircd.c in Sources */,
 | 
				
			||||||
 | 
									FA322D4B0CEF74B1001761B3 /* parse.c in Sources */,
 | 
				
			||||||
 | 
									FA322D4C0CEF74B1001761B3 /* rendezvous.c in Sources */,
 | 
				
			||||||
 | 
									FA322D4D0CEF74B1001761B3 /* resolve.c in Sources */,
 | 
				
			||||||
 | 
									FA322DBE0CEF7766001761B3 /* tool.c in Sources */,
 | 
				
			||||||
 | 
									FAE5CC2E0CF2308A007D69B6 /* numeric.c in Sources */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								runOnlyForDeploymentPostprocessing = 0;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					/* End PBXSourcesBuildPhase section */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Begin XCBuildConfiguration section */
 | 
				
			||||||
 | 
							1DEB928708733DD80010E9CD /* Default */ = {
 | 
				
			||||||
 | 
								isa = XCBuildConfiguration;
 | 
				
			||||||
 | 
								buildSettings = {
 | 
				
			||||||
 | 
									DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 | 
				
			||||||
 | 
									GCC_MODEL_TUNING = G5;
 | 
				
			||||||
 | 
									INSTALL_PATH = /usr/local/bin;
 | 
				
			||||||
 | 
									PRODUCT_NAME = ngIRCd;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
								name = Default;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							1DEB928B08733DD80010E9CD /* Default */ = {
 | 
				
			||||||
 | 
								isa = XCBuildConfiguration;
 | 
				
			||||||
 | 
								buildSettings = {
 | 
				
			||||||
 | 
									ARCHS = (
 | 
				
			||||||
 | 
										ppc,
 | 
				
			||||||
 | 
										i386,
 | 
				
			||||||
 | 
									);
 | 
				
			||||||
 | 
									GCC_WARN_ABOUT_RETURN_TYPE = YES;
 | 
				
			||||||
 | 
									GCC_WARN_UNUSED_VARIABLE = YES;
 | 
				
			||||||
 | 
									PREBINDING = NO;
 | 
				
			||||||
 | 
									SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk";
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
								name = Default;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					/* End XCBuildConfiguration section */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Begin XCConfigurationList section */
 | 
				
			||||||
 | 
							1DEB928508733DD80010E9CD /* Build configuration list for PBXNativeTarget "ngIRCd" */ = {
 | 
				
			||||||
 | 
								isa = XCConfigurationList;
 | 
				
			||||||
 | 
								buildConfigurations = (
 | 
				
			||||||
 | 
									1DEB928708733DD80010E9CD /* Default */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								defaultConfigurationIsVisible = 0;
 | 
				
			||||||
 | 
								defaultConfigurationName = Default;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							1DEB928908733DD80010E9CD /* Build configuration list for PBXProject "ngIRCd" */ = {
 | 
				
			||||||
 | 
								isa = XCConfigurationList;
 | 
				
			||||||
 | 
								buildConfigurations = (
 | 
				
			||||||
 | 
									1DEB928B08733DD80010E9CD /* Default */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								defaultConfigurationIsVisible = 0;
 | 
				
			||||||
 | 
								defaultConfigurationName = Default;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					/* End XCConfigurationList section */
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                     ngIRCd - Next Generation IRC Server
 | 
					                     ngIRCd - Next Generation IRC Server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                      (c)2001-2004 by Alexander Barton,
 | 
					                        (c)2001-2005 Alexander Barton,
 | 
				
			||||||
                    alex@barton.de, http://www.barton.de/
 | 
					                    alex@barton.de, http://www.barton.de/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
               ngIRCd is free software and published under the
 | 
					               ngIRCd is free software and published under the
 | 
				
			||||||
@@ -10,11 +10,17 @@
 | 
				
			|||||||
                            -- Contributions --
 | 
					                            -- Contributions --
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MacOSX/
 | 
					 | 
				
			||||||
 - Project file for XCode "project builder" of Mac OS X.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Debian/
 | 
					Debian/
 | 
				
			||||||
 - Various files for building Debian packages.
 | 
					 - Various files for building Debian GNU/Linux packages (".deb's").
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MacOSX/
 | 
				
			||||||
 | 
					 - Project files for XCode, the "project builder" of Apple Mac OS X.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ngindent
 | 
				
			||||||
 | 
					 - Script to indent the code of ngIRCd in the "standard way".
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ngircd.sh
 | 
				
			||||||
 | 
					 - Start script for FreeBSD.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ngircd.spec
 | 
					ngircd.spec
 | 
				
			||||||
 - RPM "spec" file.
 | 
					 - RPM "spec" file.
 | 
				
			||||||
@@ -24,4 +30,4 @@ systrace.policy
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
--
 | 
					--
 | 
				
			||||||
$Id: README,v 1.1 2004/04/28 12:18:50 alex Exp $
 | 
					$Id: README,v 1.3 2006/07/23 11:34:32 alex Exp $
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								contrib/ngindent
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										16
									
								
								contrib/ngindent
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					#/bin/sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					INDENTARGS="-kr -i8 -ts8 -l80 -c3 -cd41 -ss -ncs -psl"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# check if indent(1) is available
 | 
				
			||||||
 | 
					type indent >/dev/null 2>&1 && INDENT="indent"
 | 
				
			||||||
 | 
					type gnuindent >/dev/null 2>&1 && INDENT="gnuindent"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ -z "$INDENT" ]; then
 | 
				
			||||||
 | 
						echo "Error: GNU \"indent\" not found!"
 | 
				
			||||||
 | 
						exit 1
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$INDENT -v $INDENTARGS $*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# -eof-
 | 
				
			||||||
							
								
								
									
										51
									
								
								contrib/ngircd.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								contrib/ngircd.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
				
			|||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# PROVIDE: ngircd
 | 
				
			||||||
 | 
					# REQUIRE: NETWORKING SERVERS
 | 
				
			||||||
 | 
					# BEFORE: DAEMON
 | 
				
			||||||
 | 
					# KEYWORD: FreeBSD shutdown
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Add the following line to /etc/rc.conf to enable `ngircd':
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#ngircd_enable="YES"
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					. "/etc/rc.subr"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					name="ngircd"
 | 
				
			||||||
 | 
					rcvar=`set_rcvar`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					command="/usr/local/sbin/ngircd"
 | 
				
			||||||
 | 
					command_args=""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					load_rc_config "$name"
 | 
				
			||||||
 | 
					: ${ngircd_enable="NO"}
 | 
				
			||||||
 | 
					: ${ngircd_flags=""}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					required_files="/usr/local/etc/$name.conf"
 | 
				
			||||||
 | 
					pidfile="${ngircd_pidfile:-/var/run/${name}/${name}.pid}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ ! x"${ngircd_chrootdir}" = x ];then
 | 
				
			||||||
 | 
						# Mount a devfs in the chroot directory if needed
 | 
				
			||||||
 | 
						if [ ! -c ${ngircd_chrootdir}/dev/random \
 | 
				
			||||||
 | 
						  -o ! -c ${ngircd_chrootdir}/dev/null ]; then
 | 
				
			||||||
 | 
							umount ${ngircd_chrootdir}/dev 2>/dev/null
 | 
				
			||||||
 | 
							mount_devfs devfs ${ngircd_chrootdir}/dev
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						devfs -m ${ngircd_chrootdir}/dev rule apply hide
 | 
				
			||||||
 | 
						devfs -m ${ngircd_chrootdir}/dev rule apply path null unhide
 | 
				
			||||||
 | 
						devfs -m ${ngircd_chrootdir}/dev rule apply path random unhide
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Copy local timezone information if it is not up to date.
 | 
				
			||||||
 | 
						if [ -f /etc/localtime ]; then
 | 
				
			||||||
 | 
							cmp -s /etc/localtime "${named_chrootdir}/etc/localtime" || \
 | 
				
			||||||
 | 
								cp -p /etc/localtime "${named_chrootdir}/etc/localtime"
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pidfile="${ngircd_chrootdir}${pidfile}"
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					run_rc_command "$1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# -eof-
 | 
				
			||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
%define name    ngircd
 | 
					%define name    ngircd
 | 
				
			||||||
%define version 0.9.2
 | 
					%define version 0.11.1
 | 
				
			||||||
%define release 1
 | 
					%define release 1
 | 
				
			||||||
%define prefix  %{_prefix}
 | 
					%define prefix  %{_prefix}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								doc/.cvsignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								doc/.cvsignore
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					Makefile
 | 
				
			||||||
 | 
					Makefile.in
 | 
				
			||||||
							
								
								
									
										19
									
								
								doc/CVS.txt
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								doc/CVS.txt
									
									
									
									
									
								
							@@ -1,7 +1,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                     ngIRCd - Next Generation IRC Server
 | 
					                     ngIRCd - Next Generation IRC Server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                      (c)2001-2003 by Alexander Barton,
 | 
					                        (c)2001-2006 Alexander Barton,
 | 
				
			||||||
                    alex@barton.de, http://www.barton.de/
 | 
					                    alex@barton.de, http://www.barton.de/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
               ngIRCd is free software and published under the
 | 
					               ngIRCd is free software and published under the
 | 
				
			||||||
@@ -21,18 +21,19 @@ To access the source tree anonymously in read-only mode, follow these steps:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Login to the CVS server:
 | 
					Login to the CVS server:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 $ cvs -d:pserver:anonymous@arthur.ath.cx:/usr/local/CVS/ngircd login
 | 
					 $ cvs -d:pserver:anonymous@ngircd.barton.de:/srv/cvs/ngircd login
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Use "anonymous" as user name and no password (just hit Return). Now you can
 | 
					Use "anonymous" as user name and no password (just hit Return). Now you can
 | 
				
			||||||
check out the sources:
 | 
					check out the sources:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 $ cvs -d:pserver:anonymous@arthur.ath.cx:/usr/local/CVS/ngircd checkout ngircd
 | 
					 $ cvs -d:pserver:anonymous@ngircd.barton.de:/srv/cvs/ngircd checkout ngircd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Thereby a new folder "ngircd" will be created containing all the individual
 | 
					Thereby a new folder "ngircd" will be created containing all the individual
 | 
				
			||||||
source files.
 | 
					source files. (Substitute the last "ngircd" with "website" to check out all
 | 
				
			||||||
 | 
					the files of the homepage of ngIRCd.)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This is the "working folder", all CVS commands will be executed from within
 | 
					The newly created folder ("ngircd" or "website") is the "working folder", all
 | 
				
			||||||
this folder in the future.
 | 
					CVS commands will be executed from within this folder in the future.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Please note: When checking out a fresh copy of ngIRCd from CVS, the
 | 
					Please note: When checking out a fresh copy of ngIRCd from CVS, the
 | 
				
			||||||
configure script doesn't exist; you have to run the autogen.sh shell script
 | 
					configure script doesn't exist; you have to run the autogen.sh shell script
 | 
				
			||||||
@@ -46,11 +47,11 @@ Updating the CVS tree:
 | 
				
			|||||||
You can update a single file or the complete source tree.
 | 
					You can update a single file or the complete source tree.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
III. Write Access
 | 
					II. Write Access
 | 
				
			||||||
~~~~~~~~~~~~~~~~~
 | 
					~~~~~~~~~~~~~~~~
 | 
				
			||||||
If you want to contribute a couple of patches and write access to the CVS
 | 
					If you want to contribute a couple of patches and write access to the CVS
 | 
				
			||||||
repository would be handy, please contact Alex Barton, <alex@barton.de>.
 | 
					repository would be handy, please contact Alex Barton, <alex@barton.de>.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- 
 | 
					-- 
 | 
				
			||||||
$Id: CVS.txt,v 1.7 2003/03/26 22:34:33 alex Exp $
 | 
					$Id: CVS.txt,v 1.9 2006/08/03 14:37:29 alex Exp $
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -76,4 +76,4 @@ A: Please file a bug report at <http://ngircd.barton.de/bugzilla/index.cgi>!
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- 
 | 
					-- 
 | 
				
			||||||
$Id: FAQ.txt,v 1.7.4.1 2005/07/09 14:41:39 alex Exp $
 | 
					$Id: FAQ.txt,v 1.11.4.1 2008/01/02 22:36:48 fw Exp $
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
#
 | 
					#
 | 
				
			||||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
					# ngIRCd -- The Next Generation IRC Daemon
 | 
				
			||||||
# Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
 | 
					# Copyright (c)2001-2007 by Alexander Barton (alex@barton.de)
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
 | 
					# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
 | 
				
			||||||
# der GNU General Public License (GPL), wie von der Free Software Foundation
 | 
					# der GNU General Public License (GPL), wie von der Free Software Foundation
 | 
				
			||||||
@@ -9,18 +9,17 @@
 | 
				
			|||||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
 | 
					# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
 | 
				
			||||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
 | 
					# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# $Id: Makefile.am,v 1.18 2005/04/27 07:52:29 alex Exp $
 | 
					# $Id: Makefile.am,v 1.22 2007/11/20 21:39:35 alex Exp $
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EXTRA_DIST = CVS.txt FAQ.txt Protocol.txt Platforms.txt \
 | 
					SUBDIRS = src
 | 
				
			||||||
	README-AUX.txt README-BeOS.txt RFC.txt sample-ngircd.conf
 | 
					
 | 
				
			||||||
 | 
					EXTRA_DIST = CVS.txt FAQ.txt Protocol.txt Platforms.txt README-AUX.txt \
 | 
				
			||||||
 | 
						README-BeOS.txt RFC.txt SSL.txt Zeroconf.txt sample-ngircd.conf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
maintainer-clean-local:
 | 
					maintainer-clean-local:
 | 
				
			||||||
	rm -f Makefile Makefile.in
 | 
						rm -f Makefile Makefile.in
 | 
				
			||||||
 | 
					
 | 
				
			||||||
distclean-local:
 | 
					 | 
				
			||||||
	rm -rf src
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
docdir = $(datadir)/doc/$(PACKAGE)
 | 
					docdir = $(datadir)/doc/$(PACKAGE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
documents = $(EXTRA_DIST) ../AUTHORS ../COPYING ../ChangeLog ../INSTALL \
 | 
					documents = $(EXTRA_DIST) ../AUTHORS ../COPYING ../ChangeLog ../INSTALL \
 | 
				
			||||||
@@ -39,4 +38,7 @@ install-data-hook:
 | 
				
			|||||||
uninstall-hook:
 | 
					uninstall-hook:
 | 
				
			||||||
	rm -rf $(DESTDIR)$(docdir)
 | 
						rm -rf $(DESTDIR)$(docdir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					srcdoc:
 | 
				
			||||||
 | 
						make -C src srcdoc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# -eof-
 | 
					# -eof-
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                     ngIRCd - Next Generation IRC Server
 | 
					                     ngIRCd - Next Generation IRC Server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        (c)2001-2005 Alexander Barton
 | 
					                        (c)2001-2006 Alexander Barton
 | 
				
			||||||
                    alex@barton.de, http://www.barton.de/
 | 
					                    alex@barton.de, http://www.barton.de/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
               ngIRCd is free software and published under the
 | 
					               ngIRCd is free software and published under the
 | 
				
			||||||
@@ -26,23 +26,32 @@ list can be updated. Thanks for your help!
 | 
				
			|||||||
                                                                    | | | |
 | 
					                                                                    | | | |
 | 
				
			||||||
Platform                    Compiler     ngIRCd     Date     Tester C M T R See
 | 
					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
 | 
					hppa/unknown/openbsd3.5     gcc 2.95.3   CVSHEAD    04-05-25 alex   Y Y Y Y
 | 
				
			||||||
hppa1.1/unknown/linux-gnu   gcc 3.3.3    0.8.0      04-05-30 alex   Y Y Y Y
 | 
					hppa1.1/unknown/linux-gnu   gcc 3.3.3    0.8.0      04-05-30 alex   Y Y Y Y
 | 
				
			||||||
hppa2.0/unknown/linux-gnu   gcc 3.3.5    0.9.x-CVS  05-06-27 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.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/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/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/netbsdelf1.6.1 gcc 2.95.3   CVSHEAD    04-02-24 alex   Y Y Y Y
 | 
				
			||||||
i686/pc/cygwin              gcc 3.3.1    0.9.x-CVS  05-07-08 alex   Y Y n Y
 | 
					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 2.95.4   0.8.0      04-05-30 alex   Y Y Y Y (1)
 | 
				
			||||||
i686/pc/linux-gnu           gcc 3.3.5    0.9.x-CVS  05-07-09 alex   Y Y Y Y (1)
 | 
					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/apple/aux3.1.1         Orig. A/UX   0.7.x-CVS  03-04-22 alex   Y Y Y Y (2)
 | 
				
			||||||
m68k/hp/hp-ux9.10           Orig. HPUX   0.7.x-CVS  03-04-30 goetz  Y Y Y Y
 | 
					m68k/hp/hp-ux9.10           Orig. HPUX   0.7.x-CVS  03-04-30 goetz  Y Y Y Y
 | 
				
			||||||
m88k/dg/dgux5.4R3.10        gcc 2.5.8    CVSHEAD    04-03-15 alex   Y Y ? ?
 | 
					m88k/dg/dgux5.4R3.10        gcc 2.5.8    CVSHEAD    04-03-15 alex   Y Y ? ?
 | 
				
			||||||
powerpc/apple/darwin6.5     gcc 3.1      0.7.x-CVS  03-04-23 alex   Y Y 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.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/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/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.6        gcc 2.95.3   0.7.x-CVS  03-04-22 alex   Y Y Y Y
 | 
				
			||||||
sparc/sun/solaris2.7        gcc 3.3      0.8.0      04-05-30 alex   Y Y Y Y
 | 
					sparc/sun/solaris2.7        gcc 3.3      0.8.0      04-05-30 alex   Y Y Y Y
 | 
				
			||||||
sparc/unkn./netbsdelf1.6.1  gcc 2.95.3   0.8.0      04-05-30 alex   Y Y Y Y
 | 
					sparc/unkn./netbsdelf1.6.1  gcc 2.95.3   0.8.0      04-05-30 alex   Y Y Y Y
 | 
				
			||||||
@@ -50,16 +59,19 @@ sparc/unkn./netbsdelf1.6.1  gcc 2.95.3   0.8.0      04-05-30 alex   Y Y Y Y
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Notes
 | 
					Notes
 | 
				
			||||||
~~~~~
 | 
					~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(1) i686/pc/linux-gnu:
 | 
					(1) i686/pc/linux-gnu:
 | 
				
			||||||
    ngIRCd has been tested with various Linux distributions, such as SuSE,
 | 
					    ngIRCd has been tested with various Linux distributions, such as SuSE,
 | 
				
			||||||
    RedHat, Debian, and Gentoo using Kernels 2.2.x, 2.4.x and 2.6.x with
 | 
					    RedHat, Debian, and Gentoo using Kernels 2.2.x, 2.4.x and 2.6.x with
 | 
				
			||||||
    various versions of the GNU C compiler (2.95.3, 3.0, 3.2, and 3.3). The
 | 
					    various versions of the GNU C compiler (starting with 2.95.x and up to
 | 
				
			||||||
    eldest glibc used was glibc-2.0.7. ngIRCd compiled and run on all these
 | 
					    version 4.1.x). The eldest glibc used was glibc-2.0.7. ngIRCd compiled
 | 
				
			||||||
    systems without problems.
 | 
					    and run on all these systems without problems.
 | 
				
			||||||
 | 
					    Actual Linux kernels (2.6.x) and glic's support the epoll() IO interface.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(2) This compiler is an pre-ANSI C compiler, therefore the source code is
 | 
					(2) This compiler is an pre-ANSI C compiler, therefore the source code is
 | 
				
			||||||
    automatically converted using the included ansi2knr tool while building.
 | 
					    automatically converted using the included ansi2knr tool while building.
 | 
				
			||||||
			
 | 
					
 | 
				
			||||||
 | 
					(3) Using the kqueue() IO interface.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- 
 | 
					-- 
 | 
				
			||||||
$Id: Platforms.txt,v 1.13.2.2 2005/07/09 11:16:38 alex Exp $
 | 
					$Id: Platforms.txt,v 1.18 2006/10/08 14:09:16 alex Exp $
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                     ngIRCd - Next Generation IRC Server
 | 
					                     ngIRCd - Next Generation IRC Server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                      (c)2001-2003 by Alexander Barton,
 | 
					                        (c)2001-2007 Alexander Barton,
 | 
				
			||||||
                    alex@barton.de, http://www.barton.de/
 | 
					                    alex@barton.de, http://www.barton.de/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
               ngIRCd is free software and published under the
 | 
					               ngIRCd is free software and published under the
 | 
				
			||||||
@@ -79,6 +79,9 @@ The following <serverflags> are defined at the moment:
 | 
				
			|||||||
     peer understands this flag, it will send "MODE +I" and "MODE +b"
 | 
					     peer understands this flag, it will send "MODE +I" and "MODE +b"
 | 
				
			||||||
     commands after the server link has been established.
 | 
					     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
 | 
					- o: IRC operators are allowed to change channel- and channel-user-modes
 | 
				
			||||||
     even if they aren't channel-operator of the affected channel.
 | 
					     even if they aren't channel-operator of the affected channel.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -90,10 +93,53 @@ The optional parameter <options> is used to propagate server options as
 | 
				
			|||||||
defined in RFC 2813, section 4.1.1.
 | 
					defined in RFC 2813, section 4.1.1.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
II.2 Exchange channel-modes, topics, and persistent channels
 | 
					II.2 Enhanced Server Handshake
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The "enhanced server handshake" is used when both servers support this IRC+
 | 
				
			||||||
 | 
					extension, which is indicated by the 'H' flag in the <serverflags> sent with
 | 
				
			||||||
 | 
					the PASS command, see section II.1.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					It basically means, that after exchanging the PASS and SERVER commands the
 | 
				
			||||||
 | 
					server is not registered in the network (as usual), but that IRC numerics
 | 
				
			||||||
 | 
					are exchanged until the numeric 376 (ENDOFMOTD) is received. Afterwards the
 | 
				
			||||||
 | 
					peer is registered in the network as with the regular IRC protocol.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A server implementing the enhanced server handshake (and indicating this
 | 
				
			||||||
 | 
					using 'H' in the <serverflags>) MUST ignore all unknown numerics to it
 | 
				
			||||||
 | 
					silently.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In addition, such a server should at least send the numeric 005 (ISUPPORT)
 | 
				
			||||||
 | 
					to its peer, containing the following information. Syntax: <key>=<value>,
 | 
				
			||||||
 | 
					one token per IRC parameter. If the server has to send more than 12 token
 | 
				
			||||||
 | 
					it must send separate ISUPPORT numerics (this is a limitation of the IRC
 | 
				
			||||||
 | 
					protocol which allows at max 15 arguments per command).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 - NICKLEN: Maximum nickname length. Default: 9.
 | 
				
			||||||
 | 
					 - CASEMAPPING: Case mapping used for nick- and channel name comparing.
 | 
				
			||||||
 | 
					   Default: "ascii", the chars [a-z] are lowercase of [A-Z].
 | 
				
			||||||
 | 
					 - PREFIX: List of channel modes a person can get and the respective prefix
 | 
				
			||||||
 | 
					   a channel or nickname will get in case the person has it. The order of the
 | 
				
			||||||
 | 
					   modes goes from most powerful to least powerful. Default: "(ov)@+"
 | 
				
			||||||
 | 
					 - CHANTYPES: Supported channel prefixes. Default: "#".
 | 
				
			||||||
 | 
					 - CHANMODES: List of channel modes for 4 types, separated by comma (","):
 | 
				
			||||||
 | 
					   Mode that adds or removes a nick or address to a list, mode that changes
 | 
				
			||||||
 | 
					   a setting (both have always has a parameter), mode that changes a setting
 | 
				
			||||||
 | 
					   and only has a parameter when set, and mode that changes a setting and
 | 
				
			||||||
 | 
					   never has a parameter. For example "bI,k,l,imnPst".
 | 
				
			||||||
 | 
					 - CHANLIMIT: Maximum number of channels allowed to join by channel prefix,
 | 
				
			||||||
 | 
					   for example "#:10".
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Please see <http://www.irc.org/tech_docs/005.html> for details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The information exchanged using ISUPPORT can be used to detect configuration
 | 
				
			||||||
 | 
					incompatibilities (different maximum nick name length, for example) and
 | 
				
			||||||
 | 
					therefore to disconnect the peer prior to registering it in the network.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					II.3 Exchange channel-modes, topics, and persistent channels
 | 
				
			||||||
 | 
					
 | 
				
			||||||
     Command: CHANINFO
 | 
					     Command: CHANINFO
 | 
				
			||||||
  Parameters: <channel> +<modes> <key> <maxusers> [<topic>]
 | 
					  Parameters: <channel> +<modes> <key> <limit> [<topic>]
 | 
				
			||||||
     Used by: servers only
 | 
					     Used by: servers only
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CHANINFO is used by servers to inform each other about a channel: its
 | 
					CHANINFO is used by servers to inform each other about a channel: its
 | 
				
			||||||
@@ -115,4 +161,4 @@ channel mode). In this case <limit> should be "0".
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- 
 | 
					-- 
 | 
				
			||||||
$Id: Protocol.txt,v 1.12 2004/04/25 15:44:10 alex Exp $
 | 
					$Id: Protocol.txt,v 1.14 2007/11/21 12:16:35 alex Exp $
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,7 @@ The following software packages are needed:
 | 
				
			|||||||
 - GNU sed
 | 
					 - GNU sed
 | 
				
			||||||
   Source:
 | 
					   Source:
 | 
				
			||||||
   http://www.rezepte-im-web.de/appleux/sed-3.02.tar.gz
 | 
					   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
 | 
					   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
 | 
					   A/UX comes with /bin/sed which isn't supporting all functions needed
 | 
				
			||||||
   by GNU automake/autoconf.
 | 
					   by GNU automake/autoconf.
 | 
				
			||||||
@@ -34,7 +34,7 @@ The following software packages are needed:
 | 
				
			|||||||
 - libUTIL.a
 | 
					 - libUTIL.a
 | 
				
			||||||
   Source:
 | 
					   Source:
 | 
				
			||||||
   ftp://ftp.mayn.de/pub/really_old_stuff/apple/apple_unix/Sys_stuff/libUTIL-2.1.tar.gz>
 | 
					   ftp://ftp.mayn.de/pub/really_old_stuff/apple/apple_unix/Sys_stuff/libUTIL-2.1.tar.gz>
 | 
				
			||||||
   ftp://arthur.barton.de/pub/UNIX/AUX/Libraries/libUTIL-2.1.tar.gz
 | 
					   ftp://arthur.barton.de/pub/unix/aux/libraries/libUTIL-2.1.tar.gz
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   This library contains functions that are common on other UNIX
 | 
					   This library contains functions that are common on other UNIX
 | 
				
			||||||
   systems but not on A/UX e.g. memmove(), strerror() und strdup().
 | 
					   systems but not on A/UX e.g. memmove(), strerror() und strdup().
 | 
				
			||||||
@@ -50,7 +50,7 @@ A few hints in case of errors:
 | 
				
			|||||||
   (so 'configure' uses its own shell script) or use a fully functionable one.
 | 
					   (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
 | 
					   There's at least one binary "out there" causing problems. The one
 | 
				
			||||||
   of the GNU fileutils works fine:
 | 
					   of the GNU fileutils works fine:
 | 
				
			||||||
   ftp://arthur.barton.de/pub/UNIX/AUX/Software/Tools/fileutils-4.0.tar.gz
 | 
					   ftp://arthur.barton.de/pub/unix/aux/tools/fileutils-4.0.tar.gz
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 - The precompiled binary of the old 'bash' shouldn't be installed within
 | 
					 - The precompiled binary of the old 'bash' shouldn't be installed within
 | 
				
			||||||
   /bin (better do this in /usr/local/bin) because 'configure' would
 | 
					   /bin (better do this in /usr/local/bin) because 'configure' would
 | 
				
			||||||
@@ -64,4 +64,4 @@ A few hints in case of errors:
 | 
				
			|||||||
   even if you don't use ngIRCd.
 | 
					   even if you don't use ngIRCd.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- 
 | 
					-- 
 | 
				
			||||||
$Id: README-AUX.txt,v 1.9 2005/06/24 20:59:13 alex Exp $
 | 
					$Id: README-AUX.txt,v 1.10 2006/07/23 12:19:57 alex Exp $
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										40
									
								
								doc/Zeroconf.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								doc/Zeroconf.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					                     ngIRCd - Next Generation IRC Server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        (c)2001-2006 Alexander Barton
 | 
				
			||||||
 | 
					                    alex@barton.de, http://www.barton.de/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					               ngIRCd is free software and published under the
 | 
				
			||||||
 | 
					                   terms of the GNU General Public License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								      -- Zeroconf.txt --
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ngIRCd supports one aspect of Zeroconf Networking[1]: Multicast DNS (mDNS[2])
 | 
				
			||||||
 | 
					with DNS Service Discovery (DNS-SD[3]).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To use this features you can use one of two APIs:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  a) Apple "Bonjour" API as used by Mac OS X,
 | 
				
			||||||
 | 
					  b) the Howl[4] Zeroconf library or the Howl compatibility layer
 | 
				
			||||||
 | 
					     of the newer Avahi[5] library.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					When calling the configure script using the "--with-zeroconf" switch the
 | 
				
			||||||
 | 
					avalable API will be autodetected and the required additional libraries will
 | 
				
			||||||
 | 
					be linked to the ngircd binary as required.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ngIRCd then registers a DNS-SD service for each port it is listening on using
 | 
				
			||||||
 | 
					the service type "_ircu._tcp.".
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Links:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 [1] http://www.zeroconf.org/
 | 
				
			||||||
 | 
					 [2] http://www.multicastdns.org/
 | 
				
			||||||
 | 
					 [3] http://www.dns-sd.org/
 | 
				
			||||||
 | 
					 [4] http://www.porchdogsoft.com/products/howl/
 | 
				
			||||||
 | 
					 [5] http://avahi.org/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- 
 | 
				
			||||||
 | 
					$Id: Zeroconf.txt,v 1.2 2006/08/03 14:37:29 alex Exp $
 | 
				
			||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
# $Id: sample-ngircd.conf,v 1.33 2005/03/15 16:58:01 alex Exp $
 | 
					# $Id: sample-ngircd.conf,v 1.43.2.1 2008/01/07 23:10:28 alex Exp $
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This is a sample configuration file for the ngIRCd, which must be adepted
 | 
					# This is a sample configuration file for the ngIRCd, which must be adepted
 | 
				
			||||||
@@ -6,26 +6,30 @@
 | 
				
			|||||||
#
 | 
					#
 | 
				
			||||||
# Comments are started with "#" or ";".
 | 
					# Comments are started with "#" or ";".
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
 | 
					# A lot of configuration options in this file start with a ";". You have
 | 
				
			||||||
 | 
					# to remove the ";" in front of each variable to actually set a value!
 | 
				
			||||||
 | 
					# The disabled variables are shown with example values for completeness.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
# Use "ngircd --configtest" (see manual page ngircd(8)) to validate that the
 | 
					# Use "ngircd --configtest" (see manual page ngircd(8)) to validate that the
 | 
				
			||||||
# server interpreted the configuration file as expected!
 | 
					# server interprets the configuration file as expected!
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Global]
 | 
					[Global]
 | 
				
			||||||
	# The [Global] section of this file is used to define the main
 | 
						# The [Global] section of this file is used to define the main
 | 
				
			||||||
	# configuration of the server, like the server name and the ports
 | 
						# configuration of the server, like the server name and the ports
 | 
				
			||||||
	# on which the server should be listening.
 | 
						# on which the server should be listening.
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	# Server name in the IRC network, must contain at least one dot
 | 
						# Server name in the IRC network, must contain at least one dot
 | 
				
			||||||
	# (".") and be unique in the IRC network. Required!
 | 
						# (".") and be unique in the IRC network. Required!
 | 
				
			||||||
	Name = irc.the.net
 | 
						Name = irc.the.net
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	# Info text of the server. This will be shown by WHOIS and
 | 
						# Info text of the server. This will be shown by WHOIS and
 | 
				
			||||||
	# LINKS requests for example.
 | 
						# LINKS requests for example.
 | 
				
			||||||
	Info = Server Info Text
 | 
						Info = Server Info Text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Global password for all users needed to connect to the server
 | 
						# Global password for all users needed to connect to the server
 | 
				
			||||||
	;Password = abc
 | 
						;Password = abc
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	# Information about the server and the administrator, used by the
 | 
						# Information about the server and the administrator, used by the
 | 
				
			||||||
	# ADMIN command. Not required by server but by RFC!
 | 
						# ADMIN command. Not required by server but by RFC!
 | 
				
			||||||
	;AdminInfo1 = Description
 | 
						;AdminInfo1 = Description
 | 
				
			||||||
@@ -39,7 +43,7 @@
 | 
				
			|||||||
	# IP address on which the server should listen. (Default: empty,
 | 
						# IP address on which the server should listen. (Default: empty,
 | 
				
			||||||
	# so the server listens on all IP addresses of the system)
 | 
						# so the server listens on all IP addresses of the system)
 | 
				
			||||||
	;Listen = 1.2.3.4
 | 
						;Listen = 1.2.3.4
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	# Text file with the "message of the day" (MOTD). This message will
 | 
						# Text file with the "message of the day" (MOTD). This message will
 | 
				
			||||||
	# be shown to all users connecting to the server:
 | 
						# be shown to all users connecting to the server:
 | 
				
			||||||
	;MotdFile = /usr/local/etc/ngircd.motd
 | 
						;MotdFile = /usr/local/etc/ngircd.motd
 | 
				
			||||||
@@ -92,22 +96,33 @@
 | 
				
			|||||||
	# Mask IRC Operator mode requests as if they were coming from the
 | 
						# Mask IRC Operator mode requests as if they were coming from the
 | 
				
			||||||
	# server? (This is a compatibility hack for ircd-irc2 servers)
 | 
						# server? (This is a compatibility hack for ircd-irc2 servers)
 | 
				
			||||||
	;OperServerMode = no
 | 
						;OperServerMode = no
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
 | 
						# Allow Pre-Defined Channels only (see Section [Channels])
 | 
				
			||||||
 | 
						;PredefChannelsOnly = no
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Don't do any DNS lookups when a client connects to the server.
 | 
				
			||||||
 | 
						;NoDNS = no
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Maximum number of simultaneous connection the server is allowed
 | 
						# Maximum number of simultaneous connection the server is allowed
 | 
				
			||||||
	# to accept (<=0: unlimited):
 | 
						# to accept (0: unlimited):
 | 
				
			||||||
	;MaxConnections = -1
 | 
						;MaxConnections = 0
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	# Maximum number of simultaneous connections from a single IP address
 | 
						# Maximum number of simultaneous connections from a single IP address
 | 
				
			||||||
	# the server will accept (<=0: unlimited):
 | 
						# the server will accept (0: unlimited):
 | 
				
			||||||
	;MaxConnectionsIP = 5
 | 
						;MaxConnectionsIP = 5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Maximum number of channels a user can be member of (<=0: no limit):
 | 
						# Maximum number of channels a user can be member of (0: no limit):
 | 
				
			||||||
	;MaxJoins = 10
 | 
						;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]
 | 
				
			||||||
	# [Operator] sections are used to define IRC Operators. There may be
 | 
						# [Operator] sections are used to define IRC Operators. There may be
 | 
				
			||||||
	# more than one [Operator] block, one for each local operator.
 | 
						# more than one [Operator] block, one for each local operator.
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	# ID of the operator (may be different of the nick name)
 | 
						# ID of the operator (may be different of the nick name)
 | 
				
			||||||
	;Name = TheOper
 | 
						;Name = TheOper
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -125,7 +140,7 @@
 | 
				
			|||||||
	# configure a port for the connection, then this ngircd tries to
 | 
						# 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
 | 
						# connect to to the other server on the given port; if not it waits
 | 
				
			||||||
	# for the other server to connect.
 | 
						# for the other server to connect.
 | 
				
			||||||
	# There may be more than one server block.
 | 
						# There may be more than one server block, one for each server.
 | 
				
			||||||
	#
 | 
						#
 | 
				
			||||||
	# Server Groups:
 | 
						# Server Groups:
 | 
				
			||||||
	# The ngIRCd allows "server groups": You can assign an "ID" to every
 | 
						# The ngIRCd allows "server groups": You can assign an "ID" to every
 | 
				
			||||||
@@ -133,16 +148,22 @@
 | 
				
			|||||||
	# group won't answer, the ngIRCd tries to connect to the next server
 | 
						# 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
 | 
						# in the given group. But the ngircd never tries to connect to two
 | 
				
			||||||
	# servers with the same group ID.
 | 
						# servers with the same group ID.
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	# IRC name of the server
 | 
						# IRC name of the remote server, must match the "Name" variable in
 | 
				
			||||||
 | 
						# the [Global] section of the other server (when using ngIRCd).
 | 
				
			||||||
	;Name = irc2.the.net
 | 
						;Name = irc2.the.net
 | 
				
			||||||
   
 | 
					  
 | 
				
			||||||
	# Internet host name of the peer
 | 
						# Internet host name or IP address of the peer (only required when
 | 
				
			||||||
 | 
						# this server should establish the connection).
 | 
				
			||||||
	;Host = connect-to-host.the.net
 | 
						;Host = connect-to-host.the.net
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# IP address to use as _source_ address for the connection. if unspecified,
 | 
				
			||||||
 | 
						# ngircd will let the operating system pick an address.
 | 
				
			||||||
 | 
						;Bind = 10.0.0.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Port of the server to which the ngIRCd should connect. If you
 | 
						# Port of the server to which the ngIRCd should connect. If you
 | 
				
			||||||
	# assign no port the ngIRCd waits for incoming connections.
 | 
						# assign no port the ngIRCd waits for incoming connections.
 | 
				
			||||||
	;Port = 6666
 | 
						;Port = 6667
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Own password for the connection. This password has to be configured
 | 
						# Own password for the connection. This password has to be configured
 | 
				
			||||||
	# as "PeerPassword" on the other server.
 | 
						# as "PeerPassword" on the other server.
 | 
				
			||||||
@@ -151,10 +172,17 @@
 | 
				
			|||||||
	# Foreign password for this connection. This password has to be
 | 
						# Foreign password for this connection. This password has to be
 | 
				
			||||||
	# configured as "MyPassword" on the other server.
 | 
						# configured as "MyPassword" on the other server.
 | 
				
			||||||
	;PeerPassword = PeerSecret
 | 
						;PeerPassword = PeerSecret
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	# Group of this server (optional)
 | 
						# Group of this server (optional)
 | 
				
			||||||
	;Group = 123
 | 
						;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]
 | 
					[Server]
 | 
				
			||||||
	# More [Server] sections, if you like ...
 | 
						# More [Server] sections, if you like ...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -164,16 +192,22 @@
 | 
				
			|||||||
	# persist when there are no more members left.
 | 
						# persist when there are no more members left.
 | 
				
			||||||
	# Persistent channels are marked with the mode 'P', which can be set
 | 
						# Persistent channels are marked with the mode 'P', which can be set
 | 
				
			||||||
	# and unset by IRC operators like other modes on the fly.
 | 
						# and unset by IRC operators like other modes on the fly.
 | 
				
			||||||
	# There may be more than one [Channel] block.
 | 
						# There may be more than one [Channel] block, one for each channel.
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	# Name of the channel
 | 
						# Name of the channel
 | 
				
			||||||
	;Name = #TheName
 | 
						;Name = #TheName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Topic for this channel
 | 
						# Topic for this channel
 | 
				
			||||||
	;Topic = a great topic
 | 
						;Topic = a great topic
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	# Initial channel modes
 | 
						# Initial channel modes
 | 
				
			||||||
	;Modes = tn
 | 
						;Modes = tnk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# initial channel password (mode k)
 | 
				
			||||||
 | 
						;Key = Secret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# maximum users per channel (mode l)
 | 
				
			||||||
 | 
						;MaxUsers = 23
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Channel]
 | 
					[Channel]
 | 
				
			||||||
	# More [Channel] sections, if you like ...
 | 
						# More [Channel] sections, if you like ...
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								doc/src/.cvsignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								doc/src/.cvsignore
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					Makefile
 | 
				
			||||||
 | 
					Makefile.in
 | 
				
			||||||
 | 
					html
 | 
				
			||||||
@@ -8,7 +8,7 @@
 | 
				
			|||||||
# (at your option) any later version.
 | 
					# (at your option) any later version.
 | 
				
			||||||
# Please read the file COPYING, README and AUTHORS for more information.
 | 
					# Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# $Id: Doxyfile,v 1.1 2005/04/09 12:21:51 alex Exp $
 | 
					# $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
 | 
					# This file describes the settings to be used by the documentation system
 | 
				
			||||||
@@ -28,7 +28,16 @@ PROJECT_NAME           = ngIRCd
 | 
				
			|||||||
# If a relative path is entered, it will be relative to the location 
 | 
					# 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.
 | 
					# where doxygen was started. If left blank the current directory will be used.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
OUTPUT_DIRECTORY       = ../doc/src
 | 
					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 
 | 
					# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
 | 
				
			||||||
# will interpret the first line (until the first dot) of a JavaDoc-style 
 | 
					# will interpret the first line (until the first dot) of a JavaDoc-style 
 | 
				
			||||||
@@ -88,7 +97,7 @@ EXTRACT_LOCAL_CLASSES  = YES
 | 
				
			|||||||
# or directories like "/usr/src/myproject". Separate the files or directories 
 | 
					# or directories like "/usr/src/myproject". Separate the files or directories 
 | 
				
			||||||
# with spaces.
 | 
					# with spaces.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
INPUT                  = ngircd portab tool
 | 
					INPUT                  = ../../src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
 | 
					# 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. 
 | 
					# should be searched for input files as well. Possible values are YES and NO. 
 | 
				
			||||||
@@ -112,6 +121,13 @@ SOURCE_BROWSER         = YES
 | 
				
			|||||||
#---------------------------------------------------------------------------
 | 
					#---------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GENERATE_HTML          = YES
 | 
					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_HTMLHELP      = NO
 | 
				
			||||||
GENERATE_LATEX         = NO
 | 
					GENERATE_LATEX         = NO
 | 
				
			||||||
GENERATE_RTF           = NO
 | 
					GENERATE_RTF           = NO
 | 
				
			||||||
							
								
								
									
										25
									
								
								doc/src/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								doc/src/Makefile.am
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
				
			|||||||
 | 
					#
 | 
				
			||||||
 | 
					# ngIRCd -- The Next Generation IRC Daemon
 | 
				
			||||||
 | 
					# Copyright (c)2001-2006 Alexander Barton (alex@barton.de)
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# This program is free software; you can redistribute it and/or modify
 | 
				
			||||||
 | 
					# it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					# the Free Software Foundation; either version 2 of the License, or
 | 
				
			||||||
 | 
					# (at your option) any later version.
 | 
				
			||||||
 | 
					# Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# $Id: Makefile.am,v 1.3 2006/12/28 14:04:28 alex Exp $
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					maintainer-clean-local:
 | 
				
			||||||
 | 
						rm -f Makefile Makefile.in
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					distclean-local:
 | 
				
			||||||
 | 
						rm -rf html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					srcdoc:
 | 
				
			||||||
 | 
						@doxygen --version >/dev/null 2>&1 \
 | 
				
			||||||
 | 
						  || ( echo; echo "Error: \"doxygen\" not found!"; echo; exit 1 )
 | 
				
			||||||
 | 
						doxygen
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# -eof-
 | 
				
			||||||
							
								
								
									
										11
									
								
								doc/src/footer.inc.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								doc/src/footer.inc.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					<hr class="footer">
 | 
				
			||||||
 | 
					<p>
 | 
				
			||||||
 | 
					  ngIRCd
 | 
				
			||||||
 | 
					  <a href="http://ngircd.barton.de/">Homepage</a>,
 | 
				
			||||||
 | 
					  <a href="http://arthur.barton.de/cgi-bin/viewcvs.cgi/ngircd/">CVS-Repository</a>,
 | 
				
			||||||
 | 
					  <a href="http://ngircd.barton.de/bugzilla/index.cgi">Bug-Tracker</a>.
 | 
				
			||||||
 | 
					</p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
							
								
								
									
										10
									
								
								doc/src/header.inc.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								doc/src/header.inc.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 | 
				
			||||||
 | 
					<html lang="en">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<head>
 | 
				
			||||||
 | 
					  <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
 | 
				
			||||||
 | 
					  <title>ngIRCd Source Documentation</title>
 | 
				
			||||||
 | 
					  <link href="ngircd-doc.css" rel="stylesheet" type="text/css">
 | 
				
			||||||
 | 
					</head>
 | 
				
			||||||
 | 
					<body>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										77
									
								
								doc/src/ngircd-doc.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								doc/src/ngircd-doc.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,77 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Cascading Style Sheet for the ngIRCd source documentation
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * $Id: ngircd-doc.css,v 1.2 2005/07/22 21:23:22 alex Exp $
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					BODY {
 | 
				
			||||||
 | 
						background-color: white;
 | 
				
			||||||
 | 
						color: black;
 | 
				
			||||||
 | 
						margin: 30px;
 | 
				
			||||||
 | 
						font-family: Geneva, sans-serif;
 | 
				
			||||||
 | 
						font-size: 12px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A:visited { color: purple; background: transparent; }
 | 
				
			||||||
 | 
					A:link { color: navy; background: transparent; }
 | 
				
			||||||
 | 
					A:active { color: red; background: transparent; }
 | 
				
			||||||
 | 
					A:hover { background: #ffa; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					H1, H2, H3 {
 | 
				
			||||||
 | 
						font-family: Verdana, sans-serif;
 | 
				
			||||||
 | 
						background-color: white;
 | 
				
			||||||
 | 
						color: #005555;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					H1 { margin-bottom: 10px; }
 | 
				
			||||||
 | 
					H2 {
 | 
				
			||||||
 | 
						margin-top: 20px;
 | 
				
			||||||
 | 
						margin-bottom: 10px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					P, LI, TD, TH, DT {
 | 
				
			||||||
 | 
						font-family: Geneva, sans-serif;
 | 
				
			||||||
 | 
						font-size: 12px;
 | 
				
			||||||
 | 
						line-height: 1.2
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DD { margin-bottom: 1em; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					UL { list-style-type: square; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					HR { margin: 2em 0px; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					BODY>TABLE { padding: 1em 0px; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TD.mdRow {
 | 
				
			||||||
 | 
						border: 1px dotted silver;
 | 
				
			||||||
 | 
						background-color: #fff9dd;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TD.md { font-weight: bold; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TD.memItemLeft { padding-top: 4px; }
 | 
				
			||||||
 | 
					TD.memItemRight { padding-top: 4px; }
 | 
				
			||||||
 | 
					TD.mdescRight { font-style: italic; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DIV.qindex {
 | 
				
			||||||
 | 
						background-color: #eee;
 | 
				
			||||||
 | 
						border: 1px dotted silver;
 | 
				
			||||||
 | 
						padding: 3px;
 | 
				
			||||||
 | 
						margin-bottom: 2px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DIV.nav {
 | 
				
			||||||
 | 
						margin: 1em 0px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					HR.footer { margin-top: 50px; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.comment {
 | 
				
			||||||
 | 
						color: gray;
 | 
				
			||||||
 | 
						font-style: italic;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					.preprocessor { color: #f90; }
 | 
				
			||||||
 | 
					.keyword, .keywordflow, .keywordtype { color: red; }
 | 
				
			||||||
 | 
					.stringliteral { color: green; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* -eof- */
 | 
				
			||||||
							
								
								
									
										4
									
								
								man/.cvsignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								man/.cvsignore
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					Makefile
 | 
				
			||||||
 | 
					Makefile.in
 | 
				
			||||||
 | 
					ngircd.8
 | 
				
			||||||
 | 
					ngircd.conf.5
 | 
				
			||||||
@@ -9,12 +9,25 @@
 | 
				
			|||||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
 | 
					# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
 | 
				
			||||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
 | 
					# 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
 | 
					man_MANS = ngircd.conf.5 ngircd.8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EXTRA_DIST = $(man_MANS)
 | 
					CLEANFILES = $(man_MANS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					EXTRA_DIST = $(TEMPLATE_MANS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
maintainer-clean-local:
 | 
					maintainer-clean-local:
 | 
				
			||||||
	rm -f Makefile Makefile.in
 | 
						rm -f Makefile Makefile.in
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
.\"
 | 
					.\"
 | 
				
			||||||
.\" $Id: ngircd.8,v 1.10 2005/06/04 13:39:20 alex Exp $
 | 
					.\" $Id: ngircd.8.tmpl,v 1.2 2007/11/15 01:03:29 fw Exp $
 | 
				
			||||||
.\"
 | 
					.\"
 | 
				
			||||||
.TH ngircd 8 "Juni 2005" ngircd "ngIRCd Manual"
 | 
					.TH ngircd 8 "August 2005" ngircd "ngIRCd Manual"
 | 
				
			||||||
.SH NAME
 | 
					.SH NAME
 | 
				
			||||||
ngIRCd \- the next generation IRC daemon
 | 
					ngIRCd \- the next generation IRC daemon
 | 
				
			||||||
.SH SYNOPSIS
 | 
					.SH SYNOPSIS
 | 
				
			||||||
@@ -23,7 +23,8 @@ Linux, Mac OS X, NetBSD, OpenBSD, Solaris, and Windows with Cygwin.
 | 
				
			|||||||
.PP
 | 
					.PP
 | 
				
			||||||
As ngIRCd relies on UNIX standards and uses GNU automake and GNU autoconf
 | 
					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
 | 
					there are good chances that it also supports other UNIX-based operating
 | 
				
			||||||
systems as well.
 | 
					systems as well. By default, ngIRCd writes diagnostic and informational messages using
 | 
				
			||||||
 | 
					the syslog mechanism.
 | 
				
			||||||
.SH OPTIONS
 | 
					.SH OPTIONS
 | 
				
			||||||
The default behaviour of
 | 
					The default behaviour of
 | 
				
			||||||
.BR ngircd
 | 
					.BR ngircd
 | 
				
			||||||
@@ -55,11 +56,11 @@ Output version information and exit.
 | 
				
			|||||||
\fB\-\-help\fR
 | 
					\fB\-\-help\fR
 | 
				
			||||||
Display a brief help text and exit.
 | 
					Display a brief help text and exit.
 | 
				
			||||||
.SH FILES
 | 
					.SH FILES
 | 
				
			||||||
.I /usr/local/etc/ngircd.conf
 | 
					.I :ETCDIR:/ngircd.conf
 | 
				
			||||||
.RS
 | 
					.RS
 | 
				
			||||||
The system wide default configuration file.
 | 
					The system wide default configuration file.
 | 
				
			||||||
.RE
 | 
					.RE
 | 
				
			||||||
.I /usr/local/etc/ngircd.motd
 | 
					.I :ETCDIR:/ngircd.motd
 | 
				
			||||||
.RS
 | 
					.RS
 | 
				
			||||||
Default "message of the day" (MOTD).
 | 
					Default "message of the day" (MOTD).
 | 
				
			||||||
.RE
 | 
					.RE
 | 
				
			||||||
@@ -70,8 +71,8 @@ alex@barton.de
 | 
				
			|||||||
.UE
 | 
					.UE
 | 
				
			||||||
.br
 | 
					.br
 | 
				
			||||||
Homepage:
 | 
					Homepage:
 | 
				
			||||||
.UR http://arthur.ath.cx/~alex/ngircd/
 | 
					.UR http://ngircd.barton.de/
 | 
				
			||||||
http://arthur.ath.cx/~alex/ngircd/
 | 
					http://ngircd.barton.de/
 | 
				
			||||||
.UE
 | 
					.UE
 | 
				
			||||||
.SH "SEE ALSO"
 | 
					.SH "SEE ALSO"
 | 
				
			||||||
.BR ngircd.conf (5),
 | 
					.BR ngircd.conf (5),
 | 
				
			||||||
@@ -1,16 +1,17 @@
 | 
				
			|||||||
.\"
 | 
					.\"
 | 
				
			||||||
.\" $Id: ngircd.conf.5,v 1.18 2005/06/04 13:39:20 alex Exp $
 | 
					.\" $Id: ngircd.conf.5.tmpl,v 1.7 2007/11/23 16:26:03 fw Exp $
 | 
				
			||||||
.\"
 | 
					.\"
 | 
				
			||||||
.TH ngircd.conf 5 "Juni 2005" ngircd "ngIRCd Manual"
 | 
					.TH ngircd.conf 5 "August 2005" ngircd "ngIRCd Manual"
 | 
				
			||||||
.SH NAME
 | 
					.SH NAME
 | 
				
			||||||
ngircd.conf \- configuration file of ngIRCd
 | 
					ngircd.conf \- configuration file of ngIRCd
 | 
				
			||||||
.SH SYNOPSIS
 | 
					.SH SYNOPSIS
 | 
				
			||||||
.B /usr/local/etc/ngircd.conf
 | 
					.B :ETCDIR:/ngircd.conf
 | 
				
			||||||
.SH DESCRIPTION
 | 
					.SH DESCRIPTION
 | 
				
			||||||
.BR ngircd.conf
 | 
					.BR ngircd.conf
 | 
				
			||||||
is the configuration file for
 | 
					is the configuration file of the
 | 
				
			||||||
.BR ngircd (8)
 | 
					.BR ngircd (8)
 | 
				
			||||||
which you should adept to your local preferences and needs.
 | 
					Internet Relay Chat (IRC) daemon which you should adept to your local
 | 
				
			||||||
 | 
					preferences and needs.
 | 
				
			||||||
.SH "FILE FORMAT"
 | 
					.SH "FILE FORMAT"
 | 
				
			||||||
The file consists of sections and parameters. A section begins with the name
 | 
					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
 | 
					of the section in square brackets and continues until the next section
 | 
				
			||||||
@@ -24,8 +25,8 @@ Sections contain parameters of the form
 | 
				
			|||||||
.I value
 | 
					.I value
 | 
				
			||||||
.RE
 | 
					.RE
 | 
				
			||||||
.PP
 | 
					.PP
 | 
				
			||||||
Any line beginning with a semicolon (';') or a hash ('#') character is
 | 
					Empty lines and any line beginning with a semicolon (';') or a hash ('#')
 | 
				
			||||||
treated as a comment and ignored.
 | 
					character is treated as a comment and will be ignored.
 | 
				
			||||||
.PP
 | 
					.PP
 | 
				
			||||||
The file format is line-based - that means, each newline-terminated line
 | 
					The file format is line-based - that means, each newline-terminated line
 | 
				
			||||||
represents either a comment, a section name or a parameter.
 | 
					represents either a comment, a section name or a parameter.
 | 
				
			||||||
@@ -145,18 +146,35 @@ If OperCanUseMode is enabled, this may lead the compatibility problems with
 | 
				
			|||||||
Servers that run the ircd-irc2 Software. This Option "masks" mode requests
 | 
					Servers that run the ircd-irc2 Software. This Option "masks" mode requests
 | 
				
			||||||
by non-chanops as if they were coming from the server. Default: no.
 | 
					by non-chanops as if they were coming from the server. Default: no.
 | 
				
			||||||
.TP
 | 
					.TP
 | 
				
			||||||
 | 
					\fBPredefChannelsOnly\fR
 | 
				
			||||||
 | 
					If enabled, no new channels can be created. Useful if
 | 
				
			||||||
 | 
					you do not want to have channels other than those defined in
 | 
				
			||||||
 | 
					the config file.
 | 
				
			||||||
 | 
					Default: No.
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
 | 
					\fBNoDNS\fR
 | 
				
			||||||
 | 
					If enabled, ngircd will not make DNS lookups when clients connect.
 | 
				
			||||||
 | 
					If you configure ngircd to connect to other servers, ngircd may still
 | 
				
			||||||
 | 
					perform a DNS lookup if required.
 | 
				
			||||||
 | 
					Default: No.
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
\fBMaxConnections\fR
 | 
					\fBMaxConnections\fR
 | 
				
			||||||
Maximum number of simultaneous connection the server is allowed to accept
 | 
					Maximum number of simultaneous connection the server is allowed to accept
 | 
				
			||||||
(<=0: unlimited). Default: -1.
 | 
					(0: unlimited). Default: 0.
 | 
				
			||||||
.TP
 | 
					.TP
 | 
				
			||||||
\fBMaxConnectionsIP\fR
 | 
					\fBMaxConnectionsIP\fR
 | 
				
			||||||
Maximum number of simultaneous connections from a single IP address that
 | 
					Maximum number of simultaneous connections from a single IP address that
 | 
				
			||||||
the server will accept (<=0: unlimited). This configuration options lowers
 | 
					the server will accept (0: unlimited). This configuration options lowers
 | 
				
			||||||
the risk of denial of service attacks (DoS). Default: 5.
 | 
					the risk of denial of service attacks (DoS). Default: 5.
 | 
				
			||||||
.TP
 | 
					.TP
 | 
				
			||||||
\fBMaxJoins\fR
 | 
					\fBMaxJoins\fR
 | 
				
			||||||
Maximum number of channels a user can be member of (<=0: no limit).
 | 
					Maximum number of channels a user can be member of (0: no limit).
 | 
				
			||||||
Default: 10.
 | 
					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]
 | 
					.SH [OPERATOR]
 | 
				
			||||||
.I [Operator]
 | 
					.I [Operator]
 | 
				
			||||||
sections are used to define IRC Operators. There may be more than one
 | 
					sections are used to define IRC Operators. There may be more than one
 | 
				
			||||||
@@ -194,13 +212,17 @@ IRC name of the server
 | 
				
			|||||||
\fBHost\fR
 | 
					\fBHost\fR
 | 
				
			||||||
Internet host name of the peer
 | 
					Internet host name of the peer
 | 
				
			||||||
.TP
 | 
					.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
 | 
					\fBPort\fR
 | 
				
			||||||
Port of the server to which the ngIRCd should connect. If you assign no port
 | 
					Port of the server to which the ngIRCd should connect. If you assign no port
 | 
				
			||||||
the ngIRCd waits for incoming connections.
 | 
					the ngIRCd waits for incoming connections.
 | 
				
			||||||
.TP
 | 
					.TP
 | 
				
			||||||
\fBMyPassword\fR
 | 
					\fBMyPassword\fR
 | 
				
			||||||
Own password for this connection. This password has to be configured as
 | 
					Own password for this connection. This password has to be configured as
 | 
				
			||||||
"PeerPassword" on the other server.
 | 
					"PeerPassword" on the other server. Must not have ':' as first character.
 | 
				
			||||||
.TP
 | 
					.TP
 | 
				
			||||||
\fBPeerPassword\fR
 | 
					\fBPeerPassword\fR
 | 
				
			||||||
Foreign password for this connection. This password has to be configured as
 | 
					Foreign password for this connection. This password has to be configured as
 | 
				
			||||||
@@ -208,6 +230,9 @@ Foreign password for this connection. This password has to be configured as
 | 
				
			|||||||
.TP
 | 
					.TP
 | 
				
			||||||
\fBGroup\fR
 | 
					\fBGroup\fR
 | 
				
			||||||
Group of this server (optional).
 | 
					Group of this server (optional).
 | 
				
			||||||
 | 
					\fBPassive\fR
 | 
				
			||||||
 | 
					Disable automatic connection even if port value is specified. Default: false.
 | 
				
			||||||
 | 
					You can use the IRC Operator command CONNECT later on to create the link.
 | 
				
			||||||
.SH [CHANNEL]
 | 
					.SH [CHANNEL]
 | 
				
			||||||
Pre-defined channels can be configured in
 | 
					Pre-defined channels can be configured in
 | 
				
			||||||
.I [Channel]
 | 
					.I [Channel]
 | 
				
			||||||
@@ -229,6 +254,12 @@ Topic for this channel
 | 
				
			|||||||
.TP
 | 
					.TP
 | 
				
			||||||
\fBModes\fR
 | 
					\fBModes\fR
 | 
				
			||||||
Initial channel modes.
 | 
					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
 | 
					.SH HINTS
 | 
				
			||||||
It's wise to use "ngircd --configtest" to validate the configuration file
 | 
					It's wise to use "ngircd --configtest" to validate the configuration file
 | 
				
			||||||
after changing it. See
 | 
					after changing it. See
 | 
				
			||||||
@@ -241,8 +272,8 @@ alex@barton.de
 | 
				
			|||||||
.UE
 | 
					.UE
 | 
				
			||||||
.br
 | 
					.br
 | 
				
			||||||
Homepage:
 | 
					Homepage:
 | 
				
			||||||
.UR http://arthur.ath.cx/~alex/ngircd/
 | 
					.UR http://ngircd.barton.de/
 | 
				
			||||||
http://arthur.ath.cx/~alex/ngircd/
 | 
					http://ngircd.barton.de/
 | 
				
			||||||
.UE
 | 
					.UE
 | 
				
			||||||
.SH "SEE ALSO"
 | 
					.SH "SEE ALSO"
 | 
				
			||||||
.BR ngircd (8)
 | 
					.BR ngircd (8)
 | 
				
			||||||
							
								
								
									
										5
									
								
								src/.cvsignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								src/.cvsignore
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					Makefile
 | 
				
			||||||
 | 
					Makefile.in
 | 
				
			||||||
 | 
					config.h
 | 
				
			||||||
 | 
					config.h.in
 | 
				
			||||||
 | 
					stamp-h1
 | 
				
			||||||
@@ -8,7 +8,7 @@
 | 
				
			|||||||
# (at your option) any later version.
 | 
					# (at your option) any later version.
 | 
				
			||||||
# Please read the file COPYING, README and AUTHORS for more information.
 | 
					# Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# $Id: Makefile.am,v 1.6 2005/04/09 12:22:41 alex Exp $
 | 
					# $Id: Makefile.am,v 1.7 2005/07/22 21:01:03 alex Exp $
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SUBDIRS = portab tool ngircd testsuite
 | 
					SUBDIRS = portab tool ngircd testsuite
 | 
				
			||||||
@@ -16,9 +16,4 @@ SUBDIRS = portab tool ngircd testsuite
 | 
				
			|||||||
maintainer-clean-local:
 | 
					maintainer-clean-local:
 | 
				
			||||||
	rm -f Makefile Makefile.in config.h config.h.in stamp-h.in
 | 
						rm -f Makefile Makefile.in config.h config.h.in stamp-h.in
 | 
				
			||||||
 | 
					
 | 
				
			||||||
srcdoc:
 | 
					 | 
				
			||||||
	@doxygen --version >/dev/null 2>&1 \
 | 
					 | 
				
			||||||
	 || ( echo; echo "Error: \"doxygen\" not found!"; echo; exit 1 )
 | 
					 | 
				
			||||||
	doxygen
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# -eof-
 | 
					# -eof-
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										8
									
								
								src/ngircd/.cvsignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/ngircd/.cvsignore
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					Makefile
 | 
				
			||||||
 | 
					Makefile.in
 | 
				
			||||||
 | 
					.deps
 | 
				
			||||||
 | 
					check-help
 | 
				
			||||||
 | 
					check-version
 | 
				
			||||||
 | 
					cvs-version.h
 | 
				
			||||||
 | 
					cvs-version.new
 | 
				
			||||||
 | 
					ngircd
 | 
				
			||||||
@@ -8,7 +8,7 @@
 | 
				
			|||||||
# (at your option) any later version.
 | 
					# (at your option) any later version.
 | 
				
			||||||
# Please read the file COPYING, README and AUTHORS for more information.
 | 
					# Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# $Id: Makefile.am,v 1.46 2005/05/23 00:11:15 alex Exp $
 | 
					# $Id: Makefile.am,v 1.50 2007/11/21 12:16:36 alex Exp $
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
AUTOMAKE_OPTIONS = ../portab/ansi2knr
 | 
					AUTOMAKE_OPTIONS = ../portab/ansi2knr
 | 
				
			||||||
@@ -20,20 +20,20 @@ LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN \
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
sbin_PROGRAMS = ngircd
 | 
					sbin_PROGRAMS = ngircd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ngircd_SOURCES = ngircd.c channel.c client.c conf.c conn.c conn-zip.c conn-func.c \
 | 
					ngircd_SOURCES = ngircd.c array.c channel.c client.c conf.c conn.c conn-func.c \
 | 
				
			||||||
	hash.c irc.c irc-channel.c irc-info.c irc-login.c irc-mode.c irc-op.c \
 | 
						conn-zip.c hash.c io.c irc.c irc-channel.c irc-info.c irc-login.c \
 | 
				
			||||||
	irc-oper.c irc-server.c irc-write.c lists.c log.c match.c parse.c \
 | 
						irc-mode.c irc-op.c irc-oper.c irc-server.c irc-write.c lists.c log.c \
 | 
				
			||||||
	rendezvous.c resolve.c
 | 
						match.c numeric.c parse.c rendezvous.c resolve.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ngircd_LDFLAGS = -L../portab -L../tool
 | 
					ngircd_LDFLAGS = -L../portab -L../tool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ngircd_LDADD = -lngportab -lngtool
 | 
					ngircd_LDADD = -lngportab -lngtool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
noinst_HEADERS = ngircd.h channel.h client.h conf.h conn.h conn-zip.h conn-func.h \
 | 
					noinst_HEADERS = ngircd.h array.h channel.h client.h conf.h conn.h conn-func.h \
 | 
				
			||||||
	hash.h irc.h irc-channel.h irc-info.h irc-login.h irc-mode.h irc-op.h \
 | 
						conn-zip.h hash.h io.h irc.h irc-channel.h irc-info.h irc-login.h \
 | 
				
			||||||
	irc-oper.h irc-server.h irc-write.h lists.h log.h match.h parse.h \
 | 
						irc-mode.h irc-op.h irc-oper.h irc-server.h irc-write.h lists.h log.h \
 | 
				
			||||||
	rendezvous.h resolve.h \
 | 
						match.h numeric.h parse.h rendezvous.h resolve.h \
 | 
				
			||||||
	messages.h defines.h
 | 
						defines.h messages.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
clean-local:
 | 
					clean-local:
 | 
				
			||||||
	rm -f check-version check-help lint.out cvs-version.*
 | 
						rm -f check-version check-help lint.out cvs-version.*
 | 
				
			||||||
@@ -43,12 +43,12 @@ maintainer-clean-local:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
check-version: Makefile
 | 
					check-version: Makefile
 | 
				
			||||||
	echo "#!/bin/sh" > check-version
 | 
						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
 | 
						chmod 755 check-version
 | 
				
			||||||
 | 
					
 | 
				
			||||||
check-help: Makefile
 | 
					check-help: Makefile
 | 
				
			||||||
	echo "#!/bin/sh" > check-help
 | 
						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
 | 
						chmod 755 check-help
 | 
				
			||||||
 | 
					
 | 
				
			||||||
lint:
 | 
					lint:
 | 
				
			||||||
@@ -63,7 +63,7 @@ lint:
 | 
				
			|||||||
	 if [ $$? -ne 0 ]; then \
 | 
						 if [ $$? -ne 0 ]; then \
 | 
				
			||||||
	  waswarning=1; \
 | 
						  waswarning=1; \
 | 
				
			||||||
	  echo; grep -v "^Command Line: " lint.out; echo; \
 | 
						  echo; grep -v "^Command Line: " lint.out; echo; \
 | 
				
			||||||
	  w=$$( grep "code warning" lint.out | awk "{ print \$$4 }" ); \
 | 
						  w=$$( grep "code warning" lint.out | $(AWK) "{ print \$$4 }" ); \
 | 
				
			||||||
	  [ "$$w" -gt 0 ] && warnings=`expr $$warnings + $$w`; \
 | 
						  [ "$$w" -gt 0 ] && warnings=`expr $$warnings + $$w`; \
 | 
				
			||||||
	  files=`expr $$files + 1`; \
 | 
						  files=`expr $$files + 1`; \
 | 
				
			||||||
	 else \
 | 
						 else \
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										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- */
 | 
				
			||||||
@@ -17,12 +17,13 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "portab.h"
 | 
					#include "portab.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char UNUSED id[] = "$Id: channel.c,v 1.50 2005/06/18 08:57:37 fw Exp $";
 | 
					static char UNUSED id[] = "$Id: channel.c,v 1.63 2007/06/11 20:06:46 fw Exp $";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "imp.h"
 | 
					#include "imp.h"
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
#include <strings.h>
 | 
					#include <strings.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "defines.h"
 | 
					#include "defines.h"
 | 
				
			||||||
@@ -49,16 +50,16 @@ static char UNUSED id[] = "$Id: channel.c,v 1.50 2005/06/18 08:57:37 fw Exp $";
 | 
				
			|||||||
#define REMOVE_KICK 2
 | 
					#define REMOVE_KICK 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL CHANNEL *My_Channels;
 | 
					static CHANNEL *My_Channels;
 | 
				
			||||||
LOCAL CL2CHAN *My_Cl2Chan;
 | 
					static CL2CHAN *My_Cl2Chan;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL CL2CHAN *Get_Cl2Chan PARAMS(( CHANNEL *Chan, CLIENT *Client ));
 | 
					static CL2CHAN *Get_Cl2Chan PARAMS(( CHANNEL *Chan, CLIENT *Client ));
 | 
				
			||||||
LOCAL CL2CHAN *Add_Client PARAMS(( CHANNEL *Chan, CLIENT *Client ));
 | 
					static CL2CHAN *Add_Client PARAMS(( CHANNEL *Chan, CLIENT *Client ));
 | 
				
			||||||
LOCAL bool Remove_Client PARAMS(( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Reason, bool InformServer ));
 | 
					static bool Remove_Client PARAMS(( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Reason, bool InformServer ));
 | 
				
			||||||
LOCAL CL2CHAN *Get_First_Cl2Chan PARAMS(( CLIENT *Client, CHANNEL *Chan ));
 | 
					static CL2CHAN *Get_First_Cl2Chan PARAMS(( CLIENT *Client, CHANNEL *Chan ));
 | 
				
			||||||
LOCAL CL2CHAN *Get_Next_Cl2Chan PARAMS(( CL2CHAN *Start, CLIENT *Client, CHANNEL *Chan ));
 | 
					static CL2CHAN *Get_Next_Cl2Chan PARAMS(( CL2CHAN *Start, CLIENT *Client, CHANNEL *Chan ));
 | 
				
			||||||
LOCAL bool Delete_Channel PARAMS(( CHANNEL *Chan ));
 | 
					static bool Delete_Channel PARAMS(( CHANNEL *Chan ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL void
 | 
					GLOBAL void
 | 
				
			||||||
@@ -69,6 +70,22 @@ Channel_Init( void )
 | 
				
			|||||||
} /* Channel_Init */
 | 
					} /* Channel_Init */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GLOBAL struct list_head *
 | 
				
			||||||
 | 
					Channel_GetListBans(CHANNEL *c)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						assert(c != NULL);
 | 
				
			||||||
 | 
						return &c->list_bans;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GLOBAL struct list_head *
 | 
				
			||||||
 | 
					Channel_GetListInvites(CHANNEL *c)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						assert(c != NULL);
 | 
				
			||||||
 | 
						return &c->list_invites;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL void
 | 
					GLOBAL void
 | 
				
			||||||
Channel_InitPredefined( void )
 | 
					Channel_InitPredefined( void )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -76,7 +93,7 @@ Channel_InitPredefined( void )
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	CHANNEL *chan;
 | 
						CHANNEL *chan;
 | 
				
			||||||
	char *c;
 | 
						char *c;
 | 
				
			||||||
	int i;
 | 
						unsigned int i;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	for( i = 0; i < Conf_Channel_Count; i++ )
 | 
						for( i = 0; i < Conf_Channel_Count; i++ )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@@ -87,6 +104,7 @@ Channel_InitPredefined( void )
 | 
				
			|||||||
		if( ! Channel_IsValidName( Conf_Channel[i].name ))
 | 
							if( ! Channel_IsValidName( Conf_Channel[i].name ))
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			Log( LOG_ERR, "Can't create pre-defined channel: invalid name: \"%s\"!", Conf_Channel[i].name );
 | 
								Log( LOG_ERR, "Can't create pre-defined channel: invalid name: \"%s\"!", Conf_Channel[i].name );
 | 
				
			||||||
 | 
								array_free(&Conf_Channel[i].topic);
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -95,20 +113,32 @@ Channel_InitPredefined( void )
 | 
				
			|||||||
		if( chan )
 | 
							if( chan )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			Log( LOG_INFO, "Can't create pre-defined channel \"%s\": name already in use.", Conf_Channel[i].name );
 | 
								Log( LOG_INFO, "Can't create pre-defined channel \"%s\": name already in use.", Conf_Channel[i].name );
 | 
				
			||||||
 | 
								array_free(&Conf_Channel[i].topic);
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		
 | 
					
 | 
				
			||||||
		/* Channel anlegen */
 | 
							/* Create channel */
 | 
				
			||||||
		chan = Channel_Create( Conf_Channel[i].name );
 | 
							chan = Channel_Create(Conf_Channel[i].name);
 | 
				
			||||||
		if( chan )
 | 
							if (chan) {
 | 
				
			||||||
		{
 | 
								Channel_ModeAdd(chan, 'P');
 | 
				
			||||||
			Channel_ModeAdd( chan, 'P' );
 | 
					
 | 
				
			||||||
			Channel_SetTopic( chan, Conf_Channel[i].topic );
 | 
								if (array_start(&Conf_Channel[i].topic) != NULL)
 | 
				
			||||||
 | 
									Channel_SetTopic(chan, NULL,
 | 
				
			||||||
 | 
										 array_start(&Conf_Channel[i].topic));
 | 
				
			||||||
 | 
								array_free(&Conf_Channel[i].topic);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			c = Conf_Channel[i].modes;
 | 
								c = Conf_Channel[i].modes;
 | 
				
			||||||
			while( *c ) Channel_ModeAdd( chan, *c++ );
 | 
								while (*c)
 | 
				
			||||||
			Log( LOG_INFO, "Created pre-defined channel \"%s\".", Conf_Channel[i].name );
 | 
									Channel_ModeAdd(chan, *c++);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								Channel_SetKey(chan, Conf_Channel[i].key);
 | 
				
			||||||
 | 
								Channel_SetMaxUsers(chan, Conf_Channel[i].maxusers);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								Log(LOG_INFO, "Created pre-defined channel \"%s\".",
 | 
				
			||||||
 | 
												Conf_Channel[i].name );
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else Log( LOG_ERR, "Can't create pre-defined channel \"%s\"!", Conf_Channel[i].name );
 | 
							else Log(LOG_ERR, "Can't create pre-defined channel \"%s\"!",
 | 
				
			||||||
 | 
												Conf_Channel[i].name );
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
} /* Channel_InitPredefined */
 | 
					} /* Channel_InitPredefined */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -118,12 +148,13 @@ Channel_Exit( void )
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	CHANNEL *c, *c_next;
 | 
						CHANNEL *c, *c_next;
 | 
				
			||||||
	CL2CHAN *cl2chan, *cl2chan_next;
 | 
						CL2CHAN *cl2chan, *cl2chan_next;
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	/* Channel-Strukturen freigeben */
 | 
						/* Channel-Strukturen freigeben */
 | 
				
			||||||
	c = My_Channels;
 | 
						c = My_Channels;
 | 
				
			||||||
	while( c )
 | 
						while( c )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		c_next = c->next;
 | 
							c_next = c->next;
 | 
				
			||||||
 | 
							array_free(&c->topic);
 | 
				
			||||||
		free( c );
 | 
							free( c );
 | 
				
			||||||
		c = c_next;
 | 
							c = c_next;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -147,17 +178,13 @@ Channel_Join( CLIENT *Client, char *Name )
 | 
				
			|||||||
	assert( Client != NULL );
 | 
						assert( Client != NULL );
 | 
				
			||||||
	assert( Name != NULL );
 | 
						assert( Name != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Valider Channel-Name? */
 | 
						if( ! Channel_IsValidName( Name )) {
 | 
				
			||||||
	if( ! Channel_IsValidName( Name ))
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		IRC_WriteStrClient( Client, ERR_NOSUCHCHANNEL_MSG, Client_ID( Client ), Name );
 | 
							IRC_WriteStrClient( Client, ERR_NOSUCHCHANNEL_MSG, Client_ID( Client ), Name );
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Channel suchen */
 | 
					 | 
				
			||||||
	chan = Channel_Search( Name );
 | 
						chan = Channel_Search( Name );
 | 
				
			||||||
	if( chan )
 | 
						if( chan ) {
 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		/* Ist der Client bereits Mitglied? */
 | 
							/* Ist der Client bereits Mitglied? */
 | 
				
			||||||
		if( Get_Cl2Chan( chan, Client )) return false;
 | 
							if( Get_Cl2Chan( chan, Client )) return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -165,7 +192,7 @@ Channel_Join( CLIENT *Client, char *Name )
 | 
				
			|||||||
	{
 | 
						{
 | 
				
			||||||
		/* Gibt es noch nicht? Dann neu anlegen: */
 | 
							/* Gibt es noch nicht? Dann neu anlegen: */
 | 
				
			||||||
		chan = Channel_Create( Name );
 | 
							chan = Channel_Create( Name );
 | 
				
			||||||
		if( ! chan ) return false;
 | 
							if (!chan) return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* User dem Channel hinzufuegen */
 | 
						/* User dem Channel hinzufuegen */
 | 
				
			||||||
@@ -183,7 +210,6 @@ Channel_Part( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason )
 | 
				
			|||||||
	assert( Name != NULL );
 | 
						assert( Name != NULL );
 | 
				
			||||||
	assert( Reason != NULL );
 | 
						assert( Reason != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Channel suchen */
 | 
					 | 
				
			||||||
	chan = Channel_Search( Name );
 | 
						chan = Channel_Search( Name );
 | 
				
			||||||
	if(( ! chan ) || ( ! Get_Cl2Chan( chan, Client )))
 | 
						if(( ! chan ) || ( ! Get_Cl2Chan( chan, Client )))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@@ -207,7 +233,6 @@ Channel_Kick( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason )
 | 
				
			|||||||
	assert( Name != NULL );
 | 
						assert( Name != NULL );
 | 
				
			||||||
	assert( Reason != NULL );
 | 
						assert( Reason != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Channel suchen */
 | 
					 | 
				
			||||||
	chan = Channel_Search( Name );
 | 
						chan = Channel_Search( Name );
 | 
				
			||||||
	if( ! chan )
 | 
						if( ! chan )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@@ -215,21 +240,20 @@ Channel_Kick( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason )
 | 
				
			|||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Ist der User Mitglied in dem Channel? */
 | 
					 | 
				
			||||||
	if( ! Channel_IsMemberOf( chan, Origin ))
 | 
						if( ! Channel_IsMemberOf( chan, Origin ))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		IRC_WriteStrClient( Origin, ERR_NOTONCHANNEL_MSG, Client_ID( Origin ), Name );
 | 
							IRC_WriteStrClient( Origin, ERR_NOTONCHANNEL_MSG, Client_ID( Origin ), Name );
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Ist der User Channel-Operator? */
 | 
						/* Is User Channel-Operator? */
 | 
				
			||||||
	if( ! strchr( Channel_UserModes( chan, Origin ), 'o' ))
 | 
						if( ! strchr( Channel_UserModes( chan, Origin ), 'o' ))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Name);
 | 
							IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Name);
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Ist der Ziel-User Mitglied im Channel? */
 | 
						/* Ist the kickED User member of channel? */
 | 
				
			||||||
	if( ! Channel_IsMemberOf( chan, Client ))
 | 
						if( ! Channel_IsMemberOf( chan, Client ))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		IRC_WriteStrClient( Origin, ERR_USERNOTINCHANNEL_MSG, Client_ID( Origin ), Client_ID( Client ), Name );
 | 
							IRC_WriteStrClient( Origin, ERR_USERNOTINCHANNEL_MSG, Client_ID( Origin ), Client_ID( Client ), Name );
 | 
				
			||||||
@@ -260,11 +284,11 @@ Channel_Quit( CLIENT *Client, char *Reason )
 | 
				
			|||||||
} /* Channel_Quit */
 | 
					} /* Channel_Quit */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL long
 | 
					GLOBAL unsigned long
 | 
				
			||||||
Channel_Count( void )
 | 
					Channel_Count( void )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	CHANNEL *c;
 | 
						CHANNEL *c;
 | 
				
			||||||
	long count = 0;
 | 
						unsigned long count = 0;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	c = My_Channels;
 | 
						c = My_Channels;
 | 
				
			||||||
	while( c )
 | 
						while( c )
 | 
				
			||||||
@@ -276,11 +300,11 @@ Channel_Count( void )
 | 
				
			|||||||
} /* Channel_Count */
 | 
					} /* Channel_Count */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL long
 | 
					GLOBAL unsigned long
 | 
				
			||||||
Channel_MemberCount( CHANNEL *Chan )
 | 
					Channel_MemberCount( CHANNEL *Chan )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	CL2CHAN *cl2chan;
 | 
						CL2CHAN *cl2chan;
 | 
				
			||||||
	long count = 0;
 | 
						unsigned long count = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert( Chan != NULL );
 | 
						assert( Chan != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -315,27 +339,9 @@ Channel_CountForUser( CLIENT *Client )
 | 
				
			|||||||
} /* Channel_CountForUser */
 | 
					} /* Channel_CountForUser */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL int
 | 
					 | 
				
			||||||
Channel_PCount( void )
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	/* Count the number of persistent (mode 'P') channels */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	CHANNEL *chan;
 | 
					GLOBAL const char *
 | 
				
			||||||
	int count = 0;
 | 
					Channel_Name( const CHANNEL *Chan )
 | 
				
			||||||
 | 
					 | 
				
			||||||
	chan = My_Channels;
 | 
					 | 
				
			||||||
	while( chan )
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if( strchr( chan->modes, 'P' )) count++;
 | 
					 | 
				
			||||||
		chan = chan->next;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return count;
 | 
					 | 
				
			||||||
} /* Channel_PCount */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
GLOBAL char *
 | 
					 | 
				
			||||||
Channel_Name( CHANNEL *Chan )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	assert( Chan != NULL );
 | 
						assert( Chan != NULL );
 | 
				
			||||||
	return Chan->name;
 | 
						return Chan->name;
 | 
				
			||||||
@@ -358,7 +364,7 @@ Channel_Key( CHANNEL *Chan )
 | 
				
			|||||||
} /* Channel_Key */
 | 
					} /* Channel_Key */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL long
 | 
					GLOBAL unsigned long
 | 
				
			||||||
Channel_MaxUsers( CHANNEL *Chan )
 | 
					Channel_MaxUsers( CHANNEL *Chan )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	assert( Chan != NULL );
 | 
						assert( Chan != NULL );
 | 
				
			||||||
@@ -457,25 +463,13 @@ Channel_GetChannel( CL2CHAN *Cl2Chan )
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool
 | 
					GLOBAL bool
 | 
				
			||||||
Channel_IsValidName( char *Name )
 | 
					Channel_IsValidName( const char *Name )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Pruefen, ob Name als Channelname gueltig */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	char *ptr, badchars[10];
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	assert( Name != NULL );
 | 
						assert( Name != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if(( Name[0] != '#' ) || ( strlen( Name ) >= CHANNEL_NAME_LEN )) return false;
 | 
						if(( Name[0] != '#' ) || ( strlen( Name ) >= CHANNEL_NAME_LEN )) return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ptr = Name;
 | 
						return Name[strcspn(Name, " ,:\007")] == 0;
 | 
				
			||||||
	strcpy( badchars, " ,:\007" );
 | 
					 | 
				
			||||||
	while( *ptr )
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if( strchr( badchars, *ptr )) return false;
 | 
					 | 
				
			||||||
		ptr++;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	return true;
 | 
					 | 
				
			||||||
} /* Channel_IsValidName */
 | 
					} /* Channel_IsValidName */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -509,13 +503,11 @@ Channel_ModeDel( CHANNEL *Chan, char Mode )
 | 
				
			|||||||
	 * if the mode was removed return true.
 | 
						 * if the mode was removed return true.
 | 
				
			||||||
	 * if the channel did not have the mode, return false.
 | 
						 * if the channel did not have the mode, return false.
 | 
				
			||||||
	*/
 | 
						*/
 | 
				
			||||||
	char x[2], *p;
 | 
						char *p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert( Chan != NULL );
 | 
						assert( Chan != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	x[0] = Mode; x[1] = '\0';
 | 
						p = strchr( Chan->modes, Mode );
 | 
				
			||||||
 | 
					 | 
				
			||||||
	p = strchr( Chan->modes, x[0] );
 | 
					 | 
				
			||||||
	if( ! p ) return false;
 | 
						if( ! p ) return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Channel has mode -> delete */
 | 
						/* Channel has mode -> delete */
 | 
				
			||||||
@@ -544,7 +536,7 @@ Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, char Mode )
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	cl2chan = Get_Cl2Chan( Chan, Client );
 | 
						cl2chan = Get_Cl2Chan( Chan, Client );
 | 
				
			||||||
	assert( cl2chan != NULL );
 | 
						assert( cl2chan != NULL );
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	x[0] = Mode; x[1] = '\0';
 | 
						x[0] = Mode; x[1] = '\0';
 | 
				
			||||||
	if( ! strchr( cl2chan->modes, x[0] ))
 | 
						if( ! strchr( cl2chan->modes, x[0] ))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@@ -565,7 +557,7 @@ Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, char Mode )
 | 
				
			|||||||
	 */
 | 
						 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	CL2CHAN *cl2chan;
 | 
						CL2CHAN *cl2chan;
 | 
				
			||||||
	char x[2], *p;
 | 
						char *p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert( Chan != NULL );
 | 
						assert( Chan != NULL );
 | 
				
			||||||
	assert( Client != NULL );
 | 
						assert( Client != NULL );
 | 
				
			||||||
@@ -573,9 +565,7 @@ Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, char Mode )
 | 
				
			|||||||
	cl2chan = Get_Cl2Chan( Chan, Client );
 | 
						cl2chan = Get_Cl2Chan( Chan, Client );
 | 
				
			||||||
	assert( cl2chan != NULL );
 | 
						assert( cl2chan != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	x[0] = Mode; x[1] = '\0';
 | 
						p = strchr( cl2chan->modes, Mode );
 | 
				
			||||||
 | 
					 | 
				
			||||||
	p = strchr( cl2chan->modes, x[0] );
 | 
					 | 
				
			||||||
	if( ! p ) return false;
 | 
						if( ! p ) return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Client has Mode -> delete */
 | 
						/* Client has Mode -> delete */
 | 
				
			||||||
@@ -592,7 +582,7 @@ GLOBAL char *
 | 
				
			|||||||
Channel_UserModes( CHANNEL *Chan, CLIENT *Client )
 | 
					Channel_UserModes( CHANNEL *Chan, CLIENT *Client )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* return Users' Channel-Modes */
 | 
						/* return Users' Channel-Modes */
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	CL2CHAN *cl2chan;
 | 
						CL2CHAN *cl2chan;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert( Chan != NULL );
 | 
						assert( Chan != NULL );
 | 
				
			||||||
@@ -612,27 +602,65 @@ Channel_IsMemberOf( CHANNEL *Chan, CLIENT *Client )
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	assert( Chan != NULL );
 | 
						assert( Chan != NULL );
 | 
				
			||||||
	assert( Client != NULL );
 | 
						assert( Client != NULL );
 | 
				
			||||||
 | 
						return Get_Cl2Chan(Chan, Client) != NULL;
 | 
				
			||||||
	if( Get_Cl2Chan( Chan, Client )) return true;
 | 
					 | 
				
			||||||
	else return false;
 | 
					 | 
				
			||||||
} /* Channel_IsMemberOf */
 | 
					} /* Channel_IsMemberOf */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL char *
 | 
					GLOBAL char *
 | 
				
			||||||
Channel_Topic( CHANNEL *Chan )
 | 
					Channel_Topic( CHANNEL *Chan )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						char *ret;
 | 
				
			||||||
	assert( Chan != NULL );
 | 
						assert( Chan != NULL );
 | 
				
			||||||
	return Chan->topic;
 | 
						ret = array_start(&Chan->topic);
 | 
				
			||||||
 | 
						return ret ? ret : "";
 | 
				
			||||||
} /* Channel_Topic */
 | 
					} /* Channel_Topic */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					#ifndef STRICT_RFC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GLOBAL unsigned int
 | 
				
			||||||
 | 
					Channel_TopicTime(CHANNEL *Chan)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						assert(Chan != NULL);
 | 
				
			||||||
 | 
						return (unsigned int) Chan->topic_time;
 | 
				
			||||||
 | 
					} /* Channel_TopicTime */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GLOBAL char *
 | 
				
			||||||
 | 
					Channel_TopicWho(CHANNEL *Chan)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						assert(Chan != NULL);
 | 
				
			||||||
 | 
						return Chan->topic_who;
 | 
				
			||||||
 | 
					} /* Channel_TopicWho */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL void
 | 
					GLOBAL void
 | 
				
			||||||
Channel_SetTopic( CHANNEL *Chan, char *Topic )
 | 
					Channel_SetTopic(CHANNEL *Chan, CLIENT *Client, char *Topic)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						size_t len;
 | 
				
			||||||
	assert( Chan != NULL );
 | 
						assert( Chan != NULL );
 | 
				
			||||||
	assert( Topic != NULL );
 | 
						assert( Topic != NULL );
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	strlcpy( Chan->topic, Topic, sizeof( Chan->topic ));
 | 
						len = strlen(Topic);
 | 
				
			||||||
 | 
						if (len < array_bytes(&Chan->topic))
 | 
				
			||||||
 | 
							array_free(&Chan->topic);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (len >= COMMAND_LEN || !array_copyb(&Chan->topic, Topic, len+1))
 | 
				
			||||||
 | 
							Log(LOG_WARNING, "could not set new Topic \"%s\" on %s: %s",
 | 
				
			||||||
 | 
										Topic, Chan->name, strerror(errno));
 | 
				
			||||||
 | 
					#ifndef STRICT_RFC
 | 
				
			||||||
 | 
						Chan->topic_time = time(NULL);
 | 
				
			||||||
 | 
						if (Client != NULL && Client_Type(Client) != CLIENT_SERVER)
 | 
				
			||||||
 | 
							strlcpy(Chan->topic_who, Client_ID(Client),
 | 
				
			||||||
 | 
								sizeof Chan->topic_who);
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							strlcpy(Chan->topic_who, DEFAULT_TOPIC_ID,
 | 
				
			||||||
 | 
								sizeof Chan->topic_who);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						(void) Client;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
} /* Channel_SetTopic */
 | 
					} /* Channel_SetTopic */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -653,17 +681,17 @@ Channel_SetKey( CHANNEL *Chan, char *Key )
 | 
				
			|||||||
	assert( Key != NULL );
 | 
						assert( Key != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	strlcpy( Chan->key, Key, sizeof( Chan->key ));
 | 
						strlcpy( Chan->key, Key, sizeof( Chan->key ));
 | 
				
			||||||
	Log( LOG_DEBUG, "Channel %s: Key is now \"%s\".", Chan->name, Chan->key );
 | 
						LogDebug("Channel %s: Key is now \"%s\".", Chan->name, Chan->key );
 | 
				
			||||||
} /* Channel_SetKey */
 | 
					} /* Channel_SetKey */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL void
 | 
					GLOBAL void
 | 
				
			||||||
Channel_SetMaxUsers( CHANNEL *Chan, long Count )
 | 
					Channel_SetMaxUsers(CHANNEL *Chan, unsigned long Count)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	assert( Chan != NULL );
 | 
						assert( Chan != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Chan->maxusers = Count;
 | 
						Chan->maxusers = Count;
 | 
				
			||||||
	Log( LOG_DEBUG, "Channel %s: Member limit is now %ld.", Chan->name, Chan->maxusers );
 | 
						LogDebug("Channel %s: Member limit is now %lu.", Chan->name, Chan->maxusers );
 | 
				
			||||||
} /* Channel_SetMaxUsers */
 | 
					} /* Channel_SetMaxUsers */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -685,11 +713,11 @@ Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, char *Text )
 | 
				
			|||||||
	ok = true;
 | 
						ok = true;
 | 
				
			||||||
	if( strchr( Channel_Modes( Chan ), 'n' ) && ( ! is_member )) ok = false;
 | 
						if( strchr( Channel_Modes( Chan ), 'n' ) && ( ! is_member )) ok = false;
 | 
				
			||||||
	if( strchr( Channel_Modes( Chan ), 'm' ) && ( ! is_op ) && ( ! has_voice )) ok = false;
 | 
						if( strchr( Channel_Modes( Chan ), 'm' ) && ( ! is_op ) && ( ! has_voice )) ok = false;
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	/* Is the client banned? */
 | 
						/* Is the client banned? */
 | 
				
			||||||
	if( Lists_CheckBanned( From, Chan ))
 | 
						if( Lists_Check(&Chan->list_bans, From))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		/* Client is banned, bus is he channel operator or has voice? */
 | 
							/* Client is banned, but is he channel operator or has voice? */
 | 
				
			||||||
		if(( ! has_voice ) && ( ! is_op )) ok = false;
 | 
							if(( ! has_voice ) && ( ! is_op )) ok = false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -708,7 +736,7 @@ Channel_Create( char *Name )
 | 
				
			|||||||
	CHANNEL *c;
 | 
						CHANNEL *c;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert( Name != NULL );
 | 
						assert( Name != NULL );
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	c = (CHANNEL *)malloc( sizeof( CHANNEL ));
 | 
						c = (CHANNEL *)malloc( sizeof( CHANNEL ));
 | 
				
			||||||
	if( ! c )
 | 
						if( ! c )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@@ -720,14 +748,12 @@ Channel_Create( char *Name )
 | 
				
			|||||||
	c->hash = Hash( c->name );
 | 
						c->hash = Hash( c->name );
 | 
				
			||||||
	c->next = My_Channels;
 | 
						c->next = My_Channels;
 | 
				
			||||||
	My_Channels = c;
 | 
						My_Channels = c;
 | 
				
			||||||
	
 | 
						LogDebug("Created new channel structure for \"%s\".", Name);
 | 
				
			||||||
	Log( LOG_DEBUG, "Created new channel structure for \"%s\".", Name );
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	return c;
 | 
						return c;
 | 
				
			||||||
} /* Channel_Create */
 | 
					} /* Channel_Create */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL CL2CHAN *
 | 
					static CL2CHAN *
 | 
				
			||||||
Get_Cl2Chan( CHANNEL *Chan, CLIENT *Client )
 | 
					Get_Cl2Chan( CHANNEL *Chan, CLIENT *Client )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	CL2CHAN *cl2chan;
 | 
						CL2CHAN *cl2chan;
 | 
				
			||||||
@@ -745,7 +771,7 @@ Get_Cl2Chan( CHANNEL *Chan, CLIENT *Client )
 | 
				
			|||||||
} /* Get_Cl2Chan */
 | 
					} /* Get_Cl2Chan */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL CL2CHAN *
 | 
					static CL2CHAN *
 | 
				
			||||||
Add_Client( CHANNEL *Chan, CLIENT *Client )
 | 
					Add_Client( CHANNEL *Chan, CLIENT *Client )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	CL2CHAN *cl2chan;
 | 
						CL2CHAN *cl2chan;
 | 
				
			||||||
@@ -774,7 +800,7 @@ Add_Client( CHANNEL *Chan, CLIENT *Client )
 | 
				
			|||||||
} /* Add_Client */
 | 
					} /* Add_Client */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL bool
 | 
					static bool
 | 
				
			||||||
Remove_Client( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Reason, bool InformServer )
 | 
					Remove_Client( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Reason, bool InformServer )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	CL2CHAN *cl2chan, *last_cl2chan;
 | 
						CL2CHAN *cl2chan, *last_cl2chan;
 | 
				
			||||||
@@ -806,25 +832,42 @@ Remove_Client( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Re
 | 
				
			|||||||
	switch( Type )
 | 
						switch( Type )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		case REMOVE_QUIT:
 | 
							case REMOVE_QUIT:
 | 
				
			||||||
			/* QUIT: andere Server wurden bereits informiert, vgl. Client_Destroy();
 | 
								/* QUIT: other servers have already been notified, see Client_Destroy();
 | 
				
			||||||
			 * hier also "nur" noch alle User in betroffenen Channeln infomieren */
 | 
								 * so only inform other clients in same channel. */
 | 
				
			||||||
			assert( InformServer == false );
 | 
								assert( InformServer == false );
 | 
				
			||||||
			Log( LOG_DEBUG, "User \"%s\" left channel \"%s\" (%s).", Client_Mask( Client ), c->name, Reason );
 | 
								LogDebug("User \"%s\" left channel \"%s\" (%s).",
 | 
				
			||||||
 | 
										Client_Mask( Client ), c->name, Reason );
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case REMOVE_KICK:
 | 
							case REMOVE_KICK:
 | 
				
			||||||
			/* User wurde geKICKed: ggf. andere Server sowie alle betroffenen User
 | 
								/* User was KICKed: inform other servers and all users in channel */
 | 
				
			||||||
			 * im entsprechenden Channel informieren */
 | 
								if( InformServer )
 | 
				
			||||||
			if( InformServer ) IRC_WriteStrServersPrefix( Client_NextHop( Origin ), Origin, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason );
 | 
									IRC_WriteStrServersPrefix( Client_NextHop( Origin ),
 | 
				
			||||||
			IRC_WriteStrChannelPrefix( Client, c, Origin, false, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason );
 | 
										Origin, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason);
 | 
				
			||||||
			if(( Client_Conn( Client ) > NONE ) && ( Client_Type( Client ) == CLIENT_USER )) IRC_WriteStrClientPrefix( Client, Origin, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason );
 | 
								IRC_WriteStrChannelPrefix(Client, c, Origin, false, "KICK %s %s :%s",
 | 
				
			||||||
			Log( LOG_DEBUG, "User \"%s\" has been kicked of \"%s\" by \"%s\": %s.", Client_Mask( Client ), c->name, Client_ID( Origin ), Reason );
 | 
												c->name, Client_ID( Client ), Reason );
 | 
				
			||||||
 | 
								if ((Client_Conn(Client) > NONE) &&
 | 
				
			||||||
 | 
										(Client_Type(Client) == CLIENT_USER))
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									IRC_WriteStrClientPrefix(Client, Origin, "KICK %s %s :%s",
 | 
				
			||||||
 | 
													c->name, Client_ID( Client ), Reason);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								LogDebug("User \"%s\" has been kicked of \"%s\" by \"%s\": %s.",
 | 
				
			||||||
 | 
									Client_Mask( Client ), c->name, Client_ID(Origin), Reason);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		default:
 | 
							default: /* PART */
 | 
				
			||||||
			/* PART */
 | 
								if (InformServer)
 | 
				
			||||||
			if( InformServer ) IRC_WriteStrServersPrefix( Origin, Client, "PART %s :%s", c->name, Reason );
 | 
									IRC_WriteStrServersPrefix(Origin, Client, "PART %s :%s", c->name, Reason);
 | 
				
			||||||
			IRC_WriteStrChannelPrefix( Origin, c, Client, false, "PART %s :%s", c->name, Reason );
 | 
					
 | 
				
			||||||
			if(( Client_Conn( Origin ) > NONE ) && ( Client_Type( Origin ) == CLIENT_USER )) IRC_WriteStrClientPrefix( Origin, Client, "PART %s :%s", c->name, Reason );
 | 
								IRC_WriteStrChannelPrefix(Origin, c, Client, false, "PART %s :%s",
 | 
				
			||||||
			Log( LOG_DEBUG, "User \"%s\" left channel \"%s\" (%s).", Client_Mask( Client ), c->name, Reason );
 | 
														c->name, Reason);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if ((Client_Conn(Origin) > NONE) &&
 | 
				
			||||||
 | 
										(Client_Type(Origin) == CLIENT_USER))
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									IRC_WriteStrClientPrefix( Origin, Client, "PART %s :%s", c->name, Reason);
 | 
				
			||||||
 | 
									LogDebug("User \"%s\" left channel \"%s\" (%s).",
 | 
				
			||||||
 | 
										Client_Mask(Client), c->name, Reason);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Wenn Channel nun leer und nicht pre-defined: loeschen */
 | 
						/* Wenn Channel nun leer und nicht pre-defined: loeschen */
 | 
				
			||||||
@@ -837,14 +880,76 @@ Remove_Client( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Re
 | 
				
			|||||||
} /* Remove_Client */
 | 
					} /* Remove_Client */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL CL2CHAN *
 | 
					GLOBAL bool
 | 
				
			||||||
 | 
					Channel_AddBan(CHANNEL *c, const char *mask )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct list_head *h = Channel_GetListBans(c);
 | 
				
			||||||
 | 
						return Lists_Add(h, mask, false);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GLOBAL bool
 | 
				
			||||||
 | 
					Channel_AddInvite(CHANNEL *c, const char *mask, bool onlyonce)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct list_head *h = Channel_GetListInvites(c);
 | 
				
			||||||
 | 
						return Lists_Add(h, mask, onlyonce);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static bool
 | 
				
			||||||
 | 
					ShowInvitesBans(struct list_head *head, CLIENT *Client, CHANNEL *Channel, bool invite)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct list_elem *e;
 | 
				
			||||||
 | 
						char *msg = invite ? RPL_INVITELIST_MSG : RPL_BANLIST_MSG;
 | 
				
			||||||
 | 
						char *msg_end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert( Client != NULL );
 | 
				
			||||||
 | 
						assert( Channel != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						e = Lists_GetFirst(head);
 | 
				
			||||||
 | 
						while (e) {
 | 
				
			||||||
 | 
							if( ! IRC_WriteStrClient( Client, msg, Client_ID( Client ),
 | 
				
			||||||
 | 
									Channel_Name( Channel ), Lists_GetMask(e) )) return DISCONNECTED;
 | 
				
			||||||
 | 
							e = Lists_GetNext(e);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						msg_end = invite ? RPL_ENDOFINVITELIST_MSG : RPL_ENDOFBANLIST_MSG;
 | 
				
			||||||
 | 
						return IRC_WriteStrClient( Client, msg_end, Client_ID( Client ), Channel_Name( Channel ));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GLOBAL bool
 | 
				
			||||||
 | 
					Channel_ShowBans( CLIENT *Client, CHANNEL *Channel )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct list_head *h;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert( Channel != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						h = Channel_GetListBans(Channel);
 | 
				
			||||||
 | 
						return ShowInvitesBans(h, Client, Channel, false);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GLOBAL bool
 | 
				
			||||||
 | 
					Channel_ShowInvites( CLIENT *Client, CHANNEL *Channel )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct list_head *h;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert( Channel != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						h = Channel_GetListInvites(Channel);
 | 
				
			||||||
 | 
						return ShowInvitesBans(h, Client, Channel, true);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static CL2CHAN *
 | 
				
			||||||
Get_First_Cl2Chan( CLIENT *Client, CHANNEL *Chan )
 | 
					Get_First_Cl2Chan( CLIENT *Client, CHANNEL *Chan )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return Get_Next_Cl2Chan( My_Cl2Chan, Client, Chan );
 | 
						return Get_Next_Cl2Chan( My_Cl2Chan, Client, Chan );
 | 
				
			||||||
} /* Get_First_Cl2Chan */
 | 
					} /* Get_First_Cl2Chan */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL CL2CHAN *
 | 
					static CL2CHAN *
 | 
				
			||||||
Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Channel )
 | 
					Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Channel )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	CL2CHAN *cl2chan;
 | 
						CL2CHAN *cl2chan;
 | 
				
			||||||
@@ -862,11 +967,11 @@ Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Channel )
 | 
				
			|||||||
} /* Get_Next_Cl2Chan */
 | 
					} /* Get_Next_Cl2Chan */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL bool
 | 
					static bool
 | 
				
			||||||
Delete_Channel( CHANNEL *Chan )
 | 
					Delete_Channel( CHANNEL *Chan )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Channel-Struktur loeschen */
 | 
						/* Channel-Struktur loeschen */
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	CHANNEL *chan, *last_chan;
 | 
						CHANNEL *chan, *last_chan;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	last_chan = NULL;
 | 
						last_chan = NULL;
 | 
				
			||||||
@@ -882,13 +987,14 @@ Delete_Channel( CHANNEL *Chan )
 | 
				
			|||||||
	Log( LOG_DEBUG, "Freed channel structure for \"%s\".", Chan->name );
 | 
						Log( LOG_DEBUG, "Freed channel structure for \"%s\".", Chan->name );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Invite- und Ban-Lists aufraeumen */
 | 
						/* Invite- und Ban-Lists aufraeumen */
 | 
				
			||||||
	Lists_DeleteChannel( chan );
 | 
						Lists_Free( &chan->list_bans );
 | 
				
			||||||
 | 
						Lists_Free( &chan->list_invites );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Neu verketten und freigeben */
 | 
						/* Neu verketten und freigeben */
 | 
				
			||||||
	if( last_chan ) last_chan->next = chan->next;
 | 
						if( last_chan ) last_chan->next = chan->next;
 | 
				
			||||||
	else My_Channels = chan->next;
 | 
						else My_Channels = chan->next;
 | 
				
			||||||
	free( chan );
 | 
						free( chan );
 | 
				
			||||||
		
 | 
					
 | 
				
			||||||
	return true;
 | 
						return true;
 | 
				
			||||||
} /* Delete_Channel */
 | 
					} /* Delete_Channel */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,7 @@
 | 
				
			|||||||
 * (at your option) any later version.
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
					 * Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * $Id: channel.h,v 1.27 2005/03/19 18:43:48 fw Exp $
 | 
					 * $Id: channel.h,v 1.33 2006/12/07 22:23:39 fw Exp $
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Channel management (header)
 | 
					 * Channel management (header)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@@ -20,7 +20,9 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#if defined(__channel_c__) | defined(S_SPLINT_S)
 | 
					#if defined(__channel_c__) | defined(S_SPLINT_S)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "lists.h"
 | 
				
			||||||
#include "defines.h"
 | 
					#include "defines.h"
 | 
				
			||||||
 | 
					#include "array.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct _CHANNEL
 | 
					typedef struct _CHANNEL
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -28,9 +30,15 @@ typedef struct _CHANNEL
 | 
				
			|||||||
	char name[CHANNEL_NAME_LEN];	/* Name of the channel */
 | 
						char name[CHANNEL_NAME_LEN];	/* Name of the channel */
 | 
				
			||||||
	UINT32 hash;			/* Hash of the (lowecase!) name */
 | 
						UINT32 hash;			/* Hash of the (lowecase!) name */
 | 
				
			||||||
	char modes[CHANNEL_MODE_LEN];	/* Channel modes */
 | 
						char modes[CHANNEL_MODE_LEN];	/* Channel modes */
 | 
				
			||||||
	char topic[CHANNEL_TOPIC_LEN];	/* Topic of the channel */
 | 
						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" ) */
 | 
						char key[CLIENT_PASS_LEN];	/* Channel key ("password", mode "k" ) */
 | 
				
			||||||
	long maxusers;			/* Maximum number of members (mode "l") */
 | 
						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;
 | 
					} CHANNEL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct _CLIENT2CHAN
 | 
					typedef struct _CLIENT2CHAN
 | 
				
			||||||
@@ -48,6 +56,8 @@ typedef POINTER CL2CHAN;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#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_Init PARAMS(( void ));
 | 
				
			||||||
GLOBAL void Channel_InitPredefined PARAMS((  void ));
 | 
					GLOBAL void Channel_InitPredefined PARAMS((  void ));
 | 
				
			||||||
@@ -60,21 +70,20 @@ GLOBAL void Channel_Quit PARAMS(( CLIENT *Client, char *Reason ));
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
GLOBAL void Channel_Kick PARAMS((  CLIENT *Client, CLIENT *Origin, char *Name, char *Reason ));
 | 
					GLOBAL void Channel_Kick PARAMS((  CLIENT *Client, CLIENT *Origin, char *Name, char *Reason ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL long Channel_Count PARAMS(( void ));
 | 
					GLOBAL unsigned long Channel_Count PARAMS(( void ));
 | 
				
			||||||
GLOBAL long Channel_MemberCount PARAMS(( CHANNEL *Chan ));
 | 
					GLOBAL unsigned long Channel_MemberCount PARAMS(( CHANNEL *Chan ));
 | 
				
			||||||
GLOBAL int Channel_CountForUser PARAMS(( CLIENT *Client ));
 | 
					GLOBAL int Channel_CountForUser PARAMS(( CLIENT *Client ));
 | 
				
			||||||
GLOBAL int Channel_PCount PARAMS(( void ));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL char *Channel_Name PARAMS(( CHANNEL *Chan ));
 | 
					GLOBAL const char *Channel_Name PARAMS(( const CHANNEL *Chan ));
 | 
				
			||||||
GLOBAL char *Channel_Modes PARAMS(( CHANNEL *Chan ));
 | 
					GLOBAL char *Channel_Modes PARAMS(( CHANNEL *Chan ));
 | 
				
			||||||
GLOBAL char *Channel_Topic PARAMS(( CHANNEL *Chan ));
 | 
					GLOBAL char *Channel_Topic PARAMS(( CHANNEL *Chan ));
 | 
				
			||||||
GLOBAL char *Channel_Key PARAMS(( CHANNEL *Chan ));
 | 
					GLOBAL char *Channel_Key PARAMS(( CHANNEL *Chan ));
 | 
				
			||||||
GLOBAL long Channel_MaxUsers PARAMS(( CHANNEL *Chan ));
 | 
					GLOBAL unsigned long Channel_MaxUsers PARAMS(( CHANNEL *Chan ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL void Channel_SetTopic PARAMS(( CHANNEL *Chan, char *Topic ));
 | 
					GLOBAL void Channel_SetTopic PARAMS(( CHANNEL *Chan, CLIENT *Client, char *Topic ));
 | 
				
			||||||
GLOBAL void Channel_SetModes PARAMS(( CHANNEL *Chan, char *Modes ));
 | 
					GLOBAL void Channel_SetModes PARAMS(( CHANNEL *Chan, char *Modes ));
 | 
				
			||||||
GLOBAL void Channel_SetKey PARAMS(( CHANNEL *Chan, char *Key ));
 | 
					GLOBAL void Channel_SetKey PARAMS(( CHANNEL *Chan, char *Key ));
 | 
				
			||||||
GLOBAL void Channel_SetMaxUsers PARAMS(( CHANNEL *Chan, long Count ));
 | 
					GLOBAL void Channel_SetMaxUsers PARAMS(( CHANNEL *Chan, unsigned long Count ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL CHANNEL *Channel_Search PARAMS(( char *Name ));
 | 
					GLOBAL CHANNEL *Channel_Search PARAMS(( char *Name ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -89,7 +98,7 @@ GLOBAL CL2CHAN *Channel_NextChannelOf PARAMS(( CLIENT *Client, CL2CHAN *Cl2Chan
 | 
				
			|||||||
GLOBAL CLIENT *Channel_GetClient PARAMS(( CL2CHAN *Cl2Chan ));
 | 
					GLOBAL CLIENT *Channel_GetClient PARAMS(( CL2CHAN *Cl2Chan ));
 | 
				
			||||||
GLOBAL CHANNEL *Channel_GetChannel PARAMS(( CL2CHAN *Cl2Chan ));
 | 
					GLOBAL CHANNEL *Channel_GetChannel PARAMS(( CL2CHAN *Cl2Chan ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool Channel_IsValidName PARAMS(( char *Name ));
 | 
					GLOBAL bool Channel_IsValidName PARAMS(( const char *Name ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool Channel_ModeAdd PARAMS(( CHANNEL *Chan, char Mode ));
 | 
					GLOBAL bool Channel_ModeAdd PARAMS(( CHANNEL *Chan, char Mode ));
 | 
				
			||||||
GLOBAL bool Channel_ModeDel PARAMS(( CHANNEL *Chan, char Mode ));
 | 
					GLOBAL bool Channel_ModeDel PARAMS(( CHANNEL *Chan, char Mode ));
 | 
				
			||||||
@@ -104,8 +113,15 @@ GLOBAL bool Channel_Write PARAMS(( CHANNEL *Chan, CLIENT *From, CLIENT *Client,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
GLOBAL CHANNEL *Channel_Create PARAMS(( char *Name ));
 | 
					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
 | 
					#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- */
 | 
					/* -eof- */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,7 +17,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "portab.h"
 | 
					#include "portab.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char UNUSED id[] = "$Id: client.c,v 1.84 2005/06/12 16:39:42 alex Exp $";
 | 
					static char UNUSED id[] = "$Id: client.c,v 1.97 2007/11/21 12:16:36 alex Exp $";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "imp.h"
 | 
					#include "imp.h"
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
@@ -50,23 +50,23 @@ static char UNUSED id[] = "$Id: client.c,v 1.84 2005/06/12 16:39:42 alex Exp $";
 | 
				
			|||||||
#define GETID_LEN (CLIENT_NICK_LEN-1) + 1 + (CLIENT_USER_LEN-1) + 1 + (CLIENT_HOST_LEN-1) + 1
 | 
					#define GETID_LEN (CLIENT_NICK_LEN-1) + 1 + (CLIENT_USER_LEN-1) + 1 + (CLIENT_HOST_LEN-1) + 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL CLIENT *This_Server, *My_Clients;
 | 
					static CLIENT *This_Server, *My_Clients;
 | 
				
			||||||
LOCAL char GetID_Buffer[GETID_LEN];
 | 
					static char GetID_Buffer[GETID_LEN];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL WHOWAS My_Whowas[MAX_WHOWAS];
 | 
					static WHOWAS My_Whowas[MAX_WHOWAS];
 | 
				
			||||||
LOCAL int Last_Whowas = -1;
 | 
					static int Last_Whowas = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL long Count PARAMS(( CLIENT_TYPE Type ));
 | 
					static unsigned long Count PARAMS(( CLIENT_TYPE Type ));
 | 
				
			||||||
LOCAL long MyCount PARAMS(( CLIENT_TYPE Type ));
 | 
					static unsigned long MyCount PARAMS(( CLIENT_TYPE Type ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL CLIENT *New_Client_Struct PARAMS(( void ));
 | 
					static CLIENT *New_Client_Struct PARAMS(( void ));
 | 
				
			||||||
LOCAL void Generate_MyToken PARAMS(( CLIENT *Client ));
 | 
					static void Generate_MyToken PARAMS(( CLIENT *Client ));
 | 
				
			||||||
LOCAL void Adjust_Counters PARAMS(( CLIENT *Client ));
 | 
					static void Adjust_Counters PARAMS(( CLIENT *Client ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef Client_DestroyNow
 | 
					static CLIENT *Init_New_Client PARAMS((CONN_ID Idx, CLIENT *Introducer,
 | 
				
			||||||
GLOBAL void Client_DestroyNow PARAMS((CLIENT *Client ));
 | 
					 CLIENT *TopServer, int Type, char *ID, char *User, char *Hostname,
 | 
				
			||||||
#endif
 | 
					 char *Info, int Hops, int Token, char *Modes, bool Idented));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
long Max_Users = 0, My_Max_Users = 0;
 | 
					long Max_Users = 0, My_Max_Users = 0;
 | 
				
			||||||
@@ -94,9 +94,10 @@ Client_Init( void )
 | 
				
			|||||||
	This_Server->hops = 0;
 | 
						This_Server->hops = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	gethostname( This_Server->host, CLIENT_HOST_LEN );
 | 
						gethostname( This_Server->host, CLIENT_HOST_LEN );
 | 
				
			||||||
	h = gethostbyname( This_Server->host );
 | 
						if (!Conf_NoDNS) {
 | 
				
			||||||
	if( h ) strlcpy( This_Server->host, h->h_name, sizeof( This_Server->host ));
 | 
							h = gethostbyname( This_Server->host );
 | 
				
			||||||
 | 
							if (h) strlcpy(This_Server->host, h->h_name, sizeof(This_Server->host));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	Client_SetID( This_Server, Conf_ServerName );
 | 
						Client_SetID( This_Server, Conf_ServerName );
 | 
				
			||||||
	Client_SetInfo( This_Server, Conf_ServerInfo );
 | 
						Client_SetInfo( This_Server, Conf_ServerInfo );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -135,32 +136,53 @@ Client_ThisServer( void )
 | 
				
			|||||||
} /* Client_ThisServer */
 | 
					} /* Client_ThisServer */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Initialize new local client; wrapper function for Init_New_Client().
 | 
				
			||||||
 | 
					 * @return New CLIENT structure.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
GLOBAL CLIENT *
 | 
					GLOBAL CLIENT *
 | 
				
			||||||
Client_NewLocal( CONN_ID Idx, char *Hostname, int Type, bool Idented )
 | 
					Client_NewLocal(CONN_ID Idx, char *Hostname, int Type, bool Idented)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Neuen lokalen Client erzeugen: Wrapper-Funktion fuer Client_New(). */
 | 
						return Init_New_Client(Idx, This_Server, NULL, Type, NULL, NULL,
 | 
				
			||||||
	return Client_New( Idx, This_Server, NULL, Type, NULL, NULL, Hostname, NULL, 0, 0, NULL, Idented );
 | 
							Hostname, NULL, 0, 0, NULL, Idented);
 | 
				
			||||||
} /* Client_NewLocal */
 | 
					} /* Client_NewLocal */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Initialize new remote server; wrapper function for Init_New_Client().
 | 
				
			||||||
 | 
					 * @return New CLIENT structure.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
GLOBAL CLIENT *
 | 
					GLOBAL CLIENT *
 | 
				
			||||||
Client_NewRemoteServer( CLIENT *Introducer, char *Hostname, CLIENT *TopServer, int Hops, int Token, char *Info, bool Idented )
 | 
					Client_NewRemoteServer(CLIENT *Introducer, char *Hostname, CLIENT *TopServer,
 | 
				
			||||||
 | 
					 int Hops, int Token, char *Info, bool Idented)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Neuen Remote-Client erzeugen: Wrapper-Funktion fuer Client_New (). */
 | 
						return Init_New_Client(NONE, Introducer, TopServer, CLIENT_SERVER,
 | 
				
			||||||
	return Client_New( NONE, Introducer, TopServer, CLIENT_SERVER, Hostname, NULL, Hostname, Info, Hops, Token, NULL, Idented );
 | 
							Hostname, NULL, Hostname, Info, Hops, Token, NULL, Idented);
 | 
				
			||||||
} /* Client_NewRemoteServer */
 | 
					} /* Client_NewRemoteServer */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Initialize new remote client; wrapper function for Init_New_Client().
 | 
				
			||||||
 | 
					 * @return New CLIENT structure.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
GLOBAL CLIENT *
 | 
					GLOBAL CLIENT *
 | 
				
			||||||
Client_NewRemoteUser( CLIENT *Introducer, char *Nick, int Hops, char *User, char *Hostname, int Token, char *Modes, char *Info, bool Idented )
 | 
					Client_NewRemoteUser(CLIENT *Introducer, char *Nick, int Hops, char *User,
 | 
				
			||||||
 | 
					 char *Hostname, int Token, char *Modes, char *Info, bool Idented)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Neuen Remote-Client erzeugen: Wrapper-Funktion fuer Client_New (). */
 | 
						return Init_New_Client(NONE, Introducer, NULL, CLIENT_USER, Nick,
 | 
				
			||||||
	return Client_New( NONE, Introducer, NULL, CLIENT_USER, Nick, User, Hostname, Info, Hops, Token, Modes, Idented );
 | 
							User, Hostname, Info, Hops, Token, Modes, Idented);
 | 
				
			||||||
} /* Client_NewRemoteUser */
 | 
					} /* Client_NewRemoteUser */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL CLIENT *
 | 
					/**
 | 
				
			||||||
Client_New( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, int Type, char *ID, char *User, char *Hostname, char *Info, int Hops, int Token, char *Modes, bool Idented )
 | 
					 * Initialize new client and set up the given parameters like client type,
 | 
				
			||||||
 | 
					 * user name, host name, introducing server etc. ...
 | 
				
			||||||
 | 
					 * @return New CLIENT structure.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static CLIENT *
 | 
				
			||||||
 | 
					Init_New_Client(CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer,
 | 
				
			||||||
 | 
					 int Type, char *ID, char *User, char *Hostname, char *Info, int Hops,
 | 
				
			||||||
 | 
					 int Token, char *Modes, bool Idented)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	CLIENT *client;
 | 
						CLIENT *client;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -186,8 +208,8 @@ Client_New( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, int Type, char *
 | 
				
			|||||||
	if( Modes ) Client_SetModes( client, Modes );
 | 
						if( Modes ) Client_SetModes( client, Modes );
 | 
				
			||||||
	if( Type == CLIENT_SERVER ) Generate_MyToken( client );
 | 
						if( Type == CLIENT_SERVER ) Generate_MyToken( client );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* ist der User away? */
 | 
						if( strchr( client->modes, 'a' ))
 | 
				
			||||||
	if( strchr( client->modes, 'a' )) strlcpy( client->away, DEFAULT_AWAY_MSG, sizeof( client->away ));
 | 
							strlcpy( client->away, DEFAULT_AWAY_MSG, sizeof( client->away ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Verketten */
 | 
						/* Verketten */
 | 
				
			||||||
	client->next = (POINTER *)My_Clients;
 | 
						client->next = (POINTER *)My_Clients;
 | 
				
			||||||
@@ -197,7 +219,7 @@ Client_New( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, int Type, char *
 | 
				
			|||||||
	Adjust_Counters( client );
 | 
						Adjust_Counters( client );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return client;
 | 
						return client;
 | 
				
			||||||
} /* Client_New */
 | 
					} /* Init_New_Client */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL void
 | 
					GLOBAL void
 | 
				
			||||||
@@ -296,11 +318,9 @@ Client_Destroy( CLIENT *Client, char *LogMsg, char *FwdMsg, bool SendQuit )
 | 
				
			|||||||
				{
 | 
									{
 | 
				
			||||||
					if( c->id[0] ) Log( LOG_NOTICE, "Client \"%s\" unregistered (connection %d): %s", c->id, c->conn_id, txt );
 | 
										if( c->id[0] ) Log( LOG_NOTICE, "Client \"%s\" unregistered (connection %d): %s", c->id, c->conn_id, txt );
 | 
				
			||||||
					else Log( LOG_NOTICE, "Client unregistered (connection %d): %s", c->conn_id, txt );
 | 
										else Log( LOG_NOTICE, "Client unregistered (connection %d): %s", c->conn_id, txt );
 | 
				
			||||||
				}
 | 
									} else {
 | 
				
			||||||
				else
 | 
										Log(LOG_WARNING, "Unregistered unknown client \"%s\": %s",
 | 
				
			||||||
				{
 | 
													c->id[0] ? c->id : "(No Nick)", txt );
 | 
				
			||||||
					if( c->id[0] ) Log( LOG_WARNING, "Unregistered unknown client \"%s\": %s", c->id, txt );
 | 
					 | 
				
			||||||
					else Log( LOG_WARNING, "Unregistered unknown client: %s", c->id, txt );
 | 
					 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -313,43 +333,14 @@ Client_Destroy( CLIENT *Client, char *LogMsg, char *FwdMsg, bool SendQuit )
 | 
				
			|||||||
} /* Client_Destroy */
 | 
					} /* Client_Destroy */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL void
 | 
					 | 
				
			||||||
Client_DestroyNow( CLIENT *Client )
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	/* Destroy client structure immediately. This function is only
 | 
					 | 
				
			||||||
	 * intended for the connection layer to remove client structures
 | 
					 | 
				
			||||||
	 * of connections that can't be established! */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	CLIENT *last, *c;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	assert( Client != NULL );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	last = NULL;
 | 
					 | 
				
			||||||
	c = My_Clients;
 | 
					 | 
				
			||||||
	while( c )
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if( c == Client )
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			/* Wir haben den Client gefunden: entfernen */
 | 
					 | 
				
			||||||
			if( last ) last->next = c->next;
 | 
					 | 
				
			||||||
			else My_Clients = (CLIENT *)c->next;
 | 
					 | 
				
			||||||
			free( c );
 | 
					 | 
				
			||||||
			break;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		last = c;
 | 
					 | 
				
			||||||
		c = (CLIENT *)c->next;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
} /* Client_DestroyNow */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
GLOBAL void
 | 
					GLOBAL void
 | 
				
			||||||
Client_SetHostname( CLIENT *Client, char *Hostname )
 | 
					Client_SetHostname( CLIENT *Client, char *Hostname )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Hostname eines Clients setzen */
 | 
						/* Hostname eines Clients setzen */
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	assert( Client != NULL );
 | 
						assert( Client != NULL );
 | 
				
			||||||
	assert( Hostname != NULL );
 | 
						assert( Hostname != NULL );
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	strlcpy( Client->host, Hostname, sizeof( Client->host ));
 | 
						strlcpy( Client->host, Hostname, sizeof( Client->host ));
 | 
				
			||||||
} /* Client_SetHostname */
 | 
					} /* Client_SetHostname */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -376,7 +367,7 @@ Client_SetUser( CLIENT *Client, char *User, bool Idented )
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	assert( Client != NULL );
 | 
						assert( Client != NULL );
 | 
				
			||||||
	assert( User != NULL );
 | 
						assert( User != NULL );
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	if( Idented ) strlcpy( Client->user, User, sizeof( Client->user ));
 | 
						if( Idented ) strlcpy( Client->user, User, sizeof( Client->user ));
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@@ -393,7 +384,7 @@ Client_SetInfo( CLIENT *Client, char *Info )
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	assert( Client != NULL );
 | 
						assert( Client != NULL );
 | 
				
			||||||
	assert( Info != NULL );
 | 
						assert( Info != NULL );
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	strlcpy( Client->info, Info, sizeof( Client->info ));
 | 
						strlcpy( Client->info, Info, sizeof( Client->info ));
 | 
				
			||||||
} /* Client_SetInfo */
 | 
					} /* Client_SetInfo */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -429,7 +420,7 @@ Client_SetPassword( CLIENT *Client, char *Pwd )
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	assert( Client != NULL );
 | 
						assert( Client != NULL );
 | 
				
			||||||
	assert( Pwd != NULL );
 | 
						assert( Pwd != NULL );
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	strlcpy( Client->pwd, Pwd, sizeof( Client->pwd ));
 | 
						strlcpy( Client->pwd, Pwd, sizeof( Client->pwd ));
 | 
				
			||||||
} /* Client_SetPassword */
 | 
					} /* Client_SetPassword */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -499,7 +490,7 @@ Client_ModeAdd( CLIENT *Client, char Mode )
 | 
				
			|||||||
	 */
 | 
						 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	char x[2];
 | 
						char x[2];
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	assert( Client != NULL );
 | 
						assert( Client != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	x[0] = Mode; x[1] = '\0';
 | 
						x[0] = Mode; x[1] = '\0';
 | 
				
			||||||
@@ -540,27 +531,6 @@ Client_ModeDel( CLIENT *Client, char Mode )
 | 
				
			|||||||
} /* Client_ModeDel */
 | 
					} /* Client_ModeDel */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL CLIENT *
 | 
					 | 
				
			||||||
Client_GetFromConn( CONN_ID Idx )
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	/* return Client-Structure that belongs to the local Connection Idx gehoert.
 | 
					 | 
				
			||||||
	 * If none is found, return NULL.
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	CLIENT *c;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	assert( Idx >= 0 );
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	c = My_Clients;
 | 
					 | 
				
			||||||
	while( c )
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if( c->conn_id == Idx ) return c;
 | 
					 | 
				
			||||||
		c = (CLIENT *)c->next;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return NULL;
 | 
					 | 
				
			||||||
} /* Client_GetFromConn */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
GLOBAL CLIENT *
 | 
					GLOBAL CLIENT *
 | 
				
			||||||
Client_Search( char *Nick )
 | 
					Client_Search( char *Nick )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -639,7 +609,8 @@ Client_ID( CLIENT *Client )
 | 
				
			|||||||
	assert( Client != NULL );
 | 
						assert( Client != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef DEBUG
 | 
					#ifdef DEBUG
 | 
				
			||||||
	if( Client->type == CLIENT_USER ) assert( strlen( Client->id ) < CLIENT_NICK_LEN );
 | 
						if(Client->type == CLIENT_USER)
 | 
				
			||||||
 | 
							assert(strlen(Client->id) < Conf_MaxNickLength);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
						   
 | 
											   
 | 
				
			||||||
	if( Client->id[0] ) return Client->id;
 | 
						if( Client->id[0] ) return Client->id;
 | 
				
			||||||
@@ -659,8 +630,7 @@ GLOBAL char *
 | 
				
			|||||||
Client_User( CLIENT *Client )
 | 
					Client_User( CLIENT *Client )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	assert( Client != NULL );
 | 
						assert( Client != NULL );
 | 
				
			||||||
	if( Client->user[0] ) return Client->user;
 | 
						return Client->user[0] ? Client->user : "~";
 | 
				
			||||||
	else return "~";
 | 
					 | 
				
			||||||
} /* Client_User */
 | 
					} /* Client_User */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -732,11 +702,13 @@ GLOBAL CLIENT *
 | 
				
			|||||||
Client_NextHop( CLIENT *Client )
 | 
					Client_NextHop( CLIENT *Client )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	CLIENT *c;
 | 
						CLIENT *c;
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	assert( Client != NULL );
 | 
						assert( Client != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	c = Client;
 | 
						c = Client;
 | 
				
			||||||
	while( c->introducer && ( c->introducer != c ) && ( c->introducer != This_Server )) c = c->introducer;
 | 
						while( c->introducer && ( c->introducer != c ) && ( c->introducer != This_Server ))
 | 
				
			||||||
 | 
							c = c->introducer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return c;
 | 
						return c;
 | 
				
			||||||
} /* Client_NextHop */
 | 
					} /* Client_NextHop */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -748,7 +720,7 @@ Client_Mask( CLIENT *Client )
 | 
				
			|||||||
	 * Prefixe benoetigt wird. */
 | 
						 * Prefixe benoetigt wird. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert( Client != NULL );
 | 
						assert( Client != NULL );
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	if( Client->type == CLIENT_SERVER ) return Client->id;
 | 
						if( Client->type == CLIENT_SERVER ) return Client->id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	snprintf( GetID_Buffer, GETID_LEN, "%s!%s@%s", Client->id, Client->user, Client->host );
 | 
						snprintf( GetID_Buffer, GETID_LEN, "%s!%s@%s", Client->id, Client->user, Client->host );
 | 
				
			||||||
@@ -793,12 +765,9 @@ Client_Away( CLIENT *Client )
 | 
				
			|||||||
GLOBAL bool
 | 
					GLOBAL bool
 | 
				
			||||||
Client_CheckNick( CLIENT *Client, char *Nick )
 | 
					Client_CheckNick( CLIENT *Client, char *Nick )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Nick ueberpruefen */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	assert( Client != NULL );
 | 
						assert( Client != NULL );
 | 
				
			||||||
	assert( Nick != NULL );
 | 
						assert( Nick != NULL );
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	/* Nick ungueltig? */
 | 
					 | 
				
			||||||
	if( ! Client_IsValidNick( Nick ))
 | 
						if( ! Client_IsValidNick( Nick ))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		IRC_WriteStrClient( Client, ERR_ERRONEUSNICKNAME_MSG, Client_ID( Client ), Nick );
 | 
							IRC_WriteStrClient( Client, ERR_ERRONEUSNICKNAME_MSG, Client_ID( Client ), Nick );
 | 
				
			||||||
@@ -911,13 +880,12 @@ Client_MyServiceCount( void )
 | 
				
			|||||||
} /* Client_MyServiceCount */
 | 
					} /* Client_MyServiceCount */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL long
 | 
					GLOBAL unsigned long
 | 
				
			||||||
Client_MyServerCount( void )
 | 
					Client_MyServerCount( void )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	CLIENT *c;
 | 
						CLIENT *c;
 | 
				
			||||||
	long cnt;
 | 
						unsigned long cnt = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cnt = 0;
 | 
					 | 
				
			||||||
	c = My_Clients;
 | 
						c = My_Clients;
 | 
				
			||||||
	while( c )
 | 
						while( c )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@@ -928,13 +896,12 @@ Client_MyServerCount( void )
 | 
				
			|||||||
} /* Client_MyServerCount */
 | 
					} /* Client_MyServerCount */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL long
 | 
					GLOBAL unsigned long
 | 
				
			||||||
Client_OperCount( void )
 | 
					Client_OperCount( void )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	CLIENT *c;
 | 
						CLIENT *c;
 | 
				
			||||||
	long cnt;
 | 
						unsigned long cnt = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cnt = 0;
 | 
					 | 
				
			||||||
	c = My_Clients;
 | 
						c = My_Clients;
 | 
				
			||||||
	while( c )
 | 
						while( c )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@@ -945,19 +912,19 @@ Client_OperCount( void )
 | 
				
			|||||||
} /* Client_OperCount */
 | 
					} /* Client_OperCount */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL long
 | 
					GLOBAL unsigned long
 | 
				
			||||||
Client_UnknownCount( void )
 | 
					Client_UnknownCount( void )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	CLIENT *c;
 | 
						CLIENT *c;
 | 
				
			||||||
	long cnt;
 | 
						unsigned long cnt = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cnt = 0;
 | 
					 | 
				
			||||||
	c = My_Clients;
 | 
						c = My_Clients;
 | 
				
			||||||
	while( c )
 | 
						while( c )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if( c && ( c->type != CLIENT_USER ) && ( c->type != CLIENT_SERVICE ) && ( c->type != CLIENT_SERVER )) cnt++;
 | 
							if( c && ( c->type != CLIENT_USER ) && ( c->type != CLIENT_SERVICE ) && ( c->type != CLIENT_SERVER )) cnt++;
 | 
				
			||||||
		c = (CLIENT *)c->next;
 | 
							c = (CLIENT *)c->next;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return cnt;
 | 
						return cnt;
 | 
				
			||||||
} /* Client_UnknownCount */
 | 
					} /* Client_UnknownCount */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -977,28 +944,25 @@ Client_MyMaxUserCount( void )
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool
 | 
					GLOBAL bool
 | 
				
			||||||
Client_IsValidNick( char *Nick )
 | 
					Client_IsValidNick( const char *Nick )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Ist der Nick gueltig? */
 | 
						const char *ptr;
 | 
				
			||||||
 | 
						static const char goodchars[] = ";0123456789-";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	char *ptr, goodchars[20];
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	assert( Nick != NULL );
 | 
						assert( Nick != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	strcpy( goodchars, ";0123456789-" );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if( Nick[0] == '#' ) return false;
 | 
						if( Nick[0] == '#' ) return false;
 | 
				
			||||||
	if( strchr( goodchars, Nick[0] )) return false;
 | 
						if( strchr( goodchars, Nick[0] )) return false;
 | 
				
			||||||
	if( strlen( Nick ) >= CLIENT_NICK_LEN ) return false;
 | 
						if( strlen( Nick ) >= Conf_MaxNickLength) return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ptr = Nick;
 | 
						ptr = Nick;
 | 
				
			||||||
	while( *ptr )
 | 
						while( *ptr )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if(( *ptr < 'A' ) && ( ! strchr( goodchars, *ptr ))) return false;
 | 
							if (( *ptr < 'A' ) && ( ! strchr( goodchars, *ptr ))) return false;
 | 
				
			||||||
		if(( *ptr > '}' ) && ( ! strchr( goodchars, *ptr ))) return false;
 | 
							if ( *ptr > '}' ) return false;
 | 
				
			||||||
		ptr++;
 | 
							ptr++;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	return true;
 | 
						return true;
 | 
				
			||||||
} /* Client_IsValidNick */
 | 
					} /* Client_IsValidNick */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1035,13 +999,12 @@ Client_StartTime(CLIENT *Client)
 | 
				
			|||||||
} /* Client_Uptime */
 | 
					} /* Client_Uptime */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL long
 | 
					static unsigned long
 | 
				
			||||||
Count( CLIENT_TYPE Type )
 | 
					Count( CLIENT_TYPE Type )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	CLIENT *c;
 | 
						CLIENT *c;
 | 
				
			||||||
	long cnt;
 | 
						unsigned long cnt = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cnt = 0;
 | 
					 | 
				
			||||||
	c = My_Clients;
 | 
						c = My_Clients;
 | 
				
			||||||
	while( c )
 | 
						while( c )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@@ -1052,13 +1015,12 @@ Count( CLIENT_TYPE Type )
 | 
				
			|||||||
} /* Count */
 | 
					} /* Count */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL long
 | 
					static unsigned long
 | 
				
			||||||
MyCount( CLIENT_TYPE Type )
 | 
					MyCount( CLIENT_TYPE Type )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	CLIENT *c;
 | 
						CLIENT *c;
 | 
				
			||||||
	long cnt;
 | 
						unsigned long cnt = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cnt = 0;
 | 
					 | 
				
			||||||
	c = My_Clients;
 | 
						c = My_Clients;
 | 
				
			||||||
	while( c )
 | 
						while( c )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@@ -1069,13 +1031,13 @@ MyCount( CLIENT_TYPE Type )
 | 
				
			|||||||
} /* MyCount */
 | 
					} /* MyCount */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL CLIENT *
 | 
					static CLIENT *
 | 
				
			||||||
New_Client_Struct( void )
 | 
					New_Client_Struct( void )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Neue CLIENT-Struktur pre-initialisieren */
 | 
						/* Neue CLIENT-Struktur pre-initialisieren */
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	CLIENT *c;
 | 
						CLIENT *c;
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	c = (CLIENT *)malloc( sizeof( CLIENT ));
 | 
						c = (CLIENT *)malloc( sizeof( CLIENT ));
 | 
				
			||||||
	if( ! c )
 | 
						if( ! c )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@@ -1096,7 +1058,7 @@ New_Client_Struct( void )
 | 
				
			|||||||
} /* New_Client */
 | 
					} /* New_Client */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL void
 | 
					static void
 | 
				
			||||||
Generate_MyToken( CLIENT *Client )
 | 
					Generate_MyToken( CLIENT *Client )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	CLIENT *c;
 | 
						CLIENT *c;
 | 
				
			||||||
@@ -1120,7 +1082,7 @@ Generate_MyToken( CLIENT *Client )
 | 
				
			|||||||
} /* Generate_MyToken */
 | 
					} /* Generate_MyToken */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL void
 | 
					static void
 | 
				
			||||||
Adjust_Counters( CLIENT *Client )
 | 
					Adjust_Counters( CLIENT *Client )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	long count;
 | 
						long count;
 | 
				
			||||||
@@ -1128,7 +1090,7 @@ Adjust_Counters( CLIENT *Client )
 | 
				
			|||||||
	assert( Client != NULL );
 | 
						assert( Client != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if( Client->type != CLIENT_USER ) return;
 | 
						if( Client->type != CLIENT_USER ) return;
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	if( Client->conn_id != NONE )
 | 
						if( Client->conn_id != NONE )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		/* Local connection */
 | 
							/* Local connection */
 | 
				
			||||||
@@ -1150,11 +1112,13 @@ GLOBAL void
 | 
				
			|||||||
Client_RegisterWhowas( CLIENT *Client )
 | 
					Client_RegisterWhowas( CLIENT *Client )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int slot;
 | 
						int slot;
 | 
				
			||||||
	
 | 
						time_t now;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert( Client != NULL );
 | 
						assert( Client != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						now = time(NULL);
 | 
				
			||||||
	/* Don't register clients that were connected less than 30 seconds. */
 | 
						/* Don't register clients that were connected less than 30 seconds. */
 | 
				
			||||||
	if( time(NULL) - Client->starttime < 30 )
 | 
						if( now - Client->starttime < 30 )
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	slot = Last_Whowas + 1;
 | 
						slot = Last_Whowas + 1;
 | 
				
			||||||
@@ -1163,8 +1127,8 @@ Client_RegisterWhowas( CLIENT *Client )
 | 
				
			|||||||
#ifdef DEBUG
 | 
					#ifdef DEBUG
 | 
				
			||||||
	Log( LOG_DEBUG, "Saving WHOWAS information to slot %d ...", slot );
 | 
						Log( LOG_DEBUG, "Saving WHOWAS information to slot %d ...", slot );
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	My_Whowas[slot].time = time( NULL );
 | 
						My_Whowas[slot].time = now;
 | 
				
			||||||
	strlcpy( My_Whowas[slot].id, Client_ID( Client ),
 | 
						strlcpy( My_Whowas[slot].id, Client_ID( Client ),
 | 
				
			||||||
		 sizeof( My_Whowas[slot].id ));
 | 
							 sizeof( My_Whowas[slot].id ));
 | 
				
			||||||
	strlcpy( My_Whowas[slot].user, Client_User( Client ),
 | 
						strlcpy( My_Whowas[slot].user, Client_User( Client ),
 | 
				
			||||||
@@ -1175,7 +1139,7 @@ Client_RegisterWhowas( CLIENT *Client )
 | 
				
			|||||||
		 sizeof( My_Whowas[slot].info ));
 | 
							 sizeof( My_Whowas[slot].info ));
 | 
				
			||||||
	strlcpy( My_Whowas[slot].server, Client_ID( Client_Introducer( Client )),
 | 
						strlcpy( My_Whowas[slot].server, Client_ID( Client_Introducer( Client )),
 | 
				
			||||||
		 sizeof( My_Whowas[slot].server ));
 | 
							 sizeof( My_Whowas[slot].server ));
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	Last_Whowas = slot;
 | 
						Last_Whowas = slot;
 | 
				
			||||||
} /* Client_RegisterWhowas */
 | 
					} /* Client_RegisterWhowas */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,7 @@
 | 
				
			|||||||
 * (at your option) any later version.
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
					 * Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * $Id: client.h,v 1.39 2005/06/12 16:18:49 alex Exp $
 | 
					 * $Id: client.h,v 1.46 2007/01/23 16:07:19 alex Exp $
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Client management (header)
 | 
					 * Client management (header)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@@ -23,13 +23,13 @@
 | 
				
			|||||||
#define CLIENT_GOTNICK 4		/* client did send NICK */
 | 
					#define CLIENT_GOTNICK 4		/* client did send NICK */
 | 
				
			||||||
#define CLIENT_GOTUSER 8		/* client did send USER */
 | 
					#define CLIENT_GOTUSER 8		/* client did send USER */
 | 
				
			||||||
#define CLIENT_USER 16			/* client is an IRC user */
 | 
					#define CLIENT_USER 16			/* client is an IRC user */
 | 
				
			||||||
#define CLIENT_UNKNOWNSERVER 32		/* unregistered server connection */
 | 
					#define CLIENT_SERVER 32		/* client is a server */
 | 
				
			||||||
#define CLIENT_GOTPASSSERVER 64		/* client did send PASS in "server style" */
 | 
					#define CLIENT_SERVICE 64		/* client is a service */
 | 
				
			||||||
#define CLIENT_SERVER 128		/* client is a server */
 | 
					#define CLIENT_UNKNOWNSERVER 128	/* unregistered server connection */
 | 
				
			||||||
#define CLIENT_SERVICE 256		/* client is a service */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CLIENT_TYPE int
 | 
					#define CLIENT_TYPE int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "defines.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(__client_c__) | defined(S_SPLINT_S)
 | 
					#if defined(__client_c__) | defined(S_SPLINT_S)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -78,16 +78,11 @@ GLOBAL void Client_Exit PARAMS(( void ));
 | 
				
			|||||||
GLOBAL CLIENT *Client_NewLocal PARAMS(( CONN_ID Idx, char *Hostname, int Type, bool Idented ));
 | 
					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_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_NewRemoteUser PARAMS(( CLIENT *Introducer, char *Nick, int Hops, char *User, char *Hostname, int Token, char *Modes, char *Info, bool Idented ));
 | 
				
			||||||
GLOBAL CLIENT *Client_New PARAMS(( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, int Type, char *ID, char *User, char *Hostname, char *Info, int Hops, int Token, char *Modes, bool Idented ));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL void Client_Destroy PARAMS(( CLIENT *Client, char *LogMsg, char *FwdMsg, bool SendQuit ));
 | 
					GLOBAL void Client_Destroy PARAMS(( CLIENT *Client, char *LogMsg, char *FwdMsg, bool SendQuit ));
 | 
				
			||||||
#ifdef CONN_MODULE
 | 
					 | 
				
			||||||
GLOBAL void Client_DestroyNow PARAMS(( CLIENT *Client ));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL CLIENT *Client_ThisServer PARAMS(( void ));
 | 
					GLOBAL CLIENT *Client_ThisServer PARAMS(( void ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL CLIENT *Client_GetFromConn PARAMS(( CONN_ID Idx ));
 | 
					 | 
				
			||||||
GLOBAL CLIENT *Client_GetFromToken PARAMS(( CLIENT *Client, int Token ));
 | 
					GLOBAL CLIENT *Client_GetFromToken PARAMS(( CLIENT *Client, int Token ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL CLIENT *Client_Search PARAMS(( char *ID ));
 | 
					GLOBAL CLIENT *Client_Search PARAMS(( char *ID ));
 | 
				
			||||||
@@ -139,15 +134,15 @@ GLOBAL bool Client_CheckID PARAMS(( CLIENT *Client, char *ID ));
 | 
				
			|||||||
GLOBAL long Client_UserCount PARAMS(( void ));
 | 
					GLOBAL long Client_UserCount PARAMS(( void ));
 | 
				
			||||||
GLOBAL long Client_ServiceCount PARAMS(( void ));
 | 
					GLOBAL long Client_ServiceCount PARAMS(( void ));
 | 
				
			||||||
GLOBAL long Client_ServerCount PARAMS(( void ));
 | 
					GLOBAL long Client_ServerCount PARAMS(( void ));
 | 
				
			||||||
GLOBAL long Client_OperCount PARAMS(( void ));
 | 
					GLOBAL unsigned long Client_OperCount PARAMS(( void ));
 | 
				
			||||||
GLOBAL long Client_UnknownCount PARAMS(( void ));
 | 
					GLOBAL unsigned long Client_UnknownCount PARAMS(( void ));
 | 
				
			||||||
GLOBAL long Client_MyUserCount PARAMS(( void ));
 | 
					GLOBAL long Client_MyUserCount PARAMS(( void ));
 | 
				
			||||||
GLOBAL long Client_MyServiceCount PARAMS(( void ));
 | 
					GLOBAL long Client_MyServiceCount PARAMS(( void ));
 | 
				
			||||||
GLOBAL long Client_MyServerCount PARAMS(( void ));
 | 
					GLOBAL unsigned long Client_MyServerCount PARAMS(( void ));
 | 
				
			||||||
GLOBAL long Client_MaxUserCount PARAMS((  void ));
 | 
					GLOBAL long Client_MaxUserCount PARAMS((  void ));
 | 
				
			||||||
GLOBAL long Client_MyMaxUserCount PARAMS((  void ));
 | 
					GLOBAL long Client_MyMaxUserCount PARAMS((  void ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool Client_IsValidNick PARAMS(( char *Nick ));
 | 
					GLOBAL bool Client_IsValidNick PARAMS(( const char *Nick ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL WHOWAS *Client_GetWhowas PARAMS(( void ));
 | 
					GLOBAL WHOWAS *Client_GetWhowas PARAMS(( void ));
 | 
				
			||||||
GLOBAL int Client_GetLastWhowasIndex PARAMS(( void ));
 | 
					GLOBAL int Client_GetLastWhowasIndex PARAMS(( void ));
 | 
				
			||||||
 
 | 
				
			|||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -8,7 +8,7 @@
 | 
				
			|||||||
 * (at your option) any later version.
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
					 * Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * $Id: conf.h,v 1.34 2005/03/20 13:54:06 fw Exp $
 | 
					 * $Id: conf.h,v 1.47 2007/11/23 16:28:37 fw Exp $
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Configuration management (header)
 | 
					 * Configuration management (header)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@@ -20,6 +20,7 @@
 | 
				
			|||||||
#include <time.h>
 | 
					#include <time.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "defines.h"
 | 
					#include "defines.h"
 | 
				
			||||||
 | 
					#include "array.h"
 | 
				
			||||||
#include "portab.h"
 | 
					#include "portab.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct _Conf_Oper
 | 
					typedef struct _Conf_Oper
 | 
				
			||||||
@@ -32,23 +33,25 @@ typedef struct _Conf_Oper
 | 
				
			|||||||
typedef struct _Conf_Server
 | 
					typedef struct _Conf_Server
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char host[HOST_LEN];		/* Hostname */
 | 
						char host[HOST_LEN];		/* Hostname */
 | 
				
			||||||
	char ip[16];			/* IP address (Resolver) */
 | 
					 | 
				
			||||||
	char name[CLIENT_ID_LEN];	/* IRC-Client-ID */
 | 
						char name[CLIENT_ID_LEN];	/* IRC-Client-ID */
 | 
				
			||||||
	char pwd_in[CLIENT_PASS_LEN];	/* Password which must be received */
 | 
						char pwd_in[CLIENT_PASS_LEN];	/* Password which must be received */
 | 
				
			||||||
	char pwd_out[CLIENT_PASS_LEN];	/* Password to send to peer */
 | 
						char pwd_out[CLIENT_PASS_LEN];	/* Password to send to peer */
 | 
				
			||||||
	UINT16 port;			/* Server port */
 | 
						UINT16 port;			/* Server port */
 | 
				
			||||||
	int group;			/* Group of server */
 | 
						int group;			/* Group of server */
 | 
				
			||||||
	time_t lasttry;			/* Last connect attempt */
 | 
						time_t lasttry;			/* Last connect attempt */
 | 
				
			||||||
	RES_STAT *res_stat;		/* Status of the resolver */
 | 
						RES_STAT res_stat;		/* Status of the resolver */
 | 
				
			||||||
	int flags;			/* Flags */
 | 
						int flags;			/* Flags */
 | 
				
			||||||
	CONN_ID conn_id;		/* ID of server connection or NONE */
 | 
						CONN_ID conn_id;		/* ID of server connection or NONE */
 | 
				
			||||||
 | 
						struct in_addr bind_addr;	/* source address to use for outgoing connections */
 | 
				
			||||||
} CONF_SERVER;
 | 
					} CONF_SERVER;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct _Conf_Channel
 | 
					typedef struct _Conf_Channel
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char name[CHANNEL_NAME_LEN];	/* Name of the channel */
 | 
						char name[CHANNEL_NAME_LEN];	/* Name of the channel */
 | 
				
			||||||
	char modes[CHANNEL_MODE_LEN];	/* Initial channel modes */
 | 
						char modes[CHANNEL_MODE_LEN];	/* Initial channel modes */
 | 
				
			||||||
	char topic[CHANNEL_TOPIC_LEN];	/* Initial topic */
 | 
						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;
 | 
					} CONF_CHANNEL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -77,15 +80,14 @@ GLOBAL char Conf_MotdFile[FNAME_LEN];
 | 
				
			|||||||
GLOBAL char Conf_MotdPhrase[LINE_LEN];
 | 
					GLOBAL char Conf_MotdPhrase[LINE_LEN];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Ports the server should listen on */
 | 
					/* Ports the server should listen on */
 | 
				
			||||||
GLOBAL UINT16 Conf_ListenPorts[MAX_LISTEN_PORTS];
 | 
					GLOBAL array Conf_ListenPorts;
 | 
				
			||||||
GLOBAL int Conf_ListenPorts_Count;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Address to which the socket should be bound or empty (=all) */
 | 
					/* Address to which the socket should be bound or empty (=all) */
 | 
				
			||||||
GLOBAL char Conf_ListenAddress[16];
 | 
					GLOBAL char Conf_ListenAddress[16];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* User and group ID the server should run with */
 | 
					/* User and group ID the server should run with */
 | 
				
			||||||
GLOBAL unsigned int Conf_UID;
 | 
					GLOBAL uid_t Conf_UID;
 | 
				
			||||||
GLOBAL unsigned int Conf_GID;
 | 
					GLOBAL gid_t Conf_GID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* A directory to chroot() in */
 | 
					/* A directory to chroot() in */
 | 
				
			||||||
GLOBAL char Conf_Chroot[FNAME_LEN];
 | 
					GLOBAL char Conf_Chroot[FNAME_LEN];
 | 
				
			||||||
@@ -102,18 +104,23 @@ GLOBAL int Conf_ConnectRetry;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/* Operators */
 | 
					/* Operators */
 | 
				
			||||||
GLOBAL CONF_OPER Conf_Oper[MAX_OPERATORS];
 | 
					GLOBAL CONF_OPER Conf_Oper[MAX_OPERATORS];
 | 
				
			||||||
GLOBAL int Conf_Oper_Count;
 | 
					GLOBAL unsigned int Conf_Oper_Count;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Servers */
 | 
					/* Servers */
 | 
				
			||||||
GLOBAL CONF_SERVER Conf_Server[MAX_SERVERS];
 | 
					GLOBAL CONF_SERVER Conf_Server[MAX_SERVERS];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Pre-defined channels */
 | 
					/* Pre-defined channels */
 | 
				
			||||||
GLOBAL CONF_CHANNEL Conf_Channel[MAX_DEFCHANNELS];
 | 
					GLOBAL CONF_CHANNEL Conf_Channel[MAX_DEFCHANNELS];
 | 
				
			||||||
GLOBAL int Conf_Channel_Count;
 | 
					GLOBAL unsigned int Conf_Channel_Count;
 | 
				
			||||||
 | 
					/* Pre-defined channels only */
 | 
				
			||||||
 | 
					GLOBAL bool Conf_PredefChannelsOnly;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Are IRC operators allowed to always use MODE? */
 | 
					/* Are IRC operators allowed to always use MODE? */
 | 
				
			||||||
GLOBAL bool Conf_OperCanMode;
 | 
					GLOBAL bool Conf_OperCanMode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Disable all DNS functions? */
 | 
				
			||||||
 | 
					GLOBAL bool Conf_NoDNS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* If an IRC op gives chanop privileges without being a chanop,
 | 
					/* If an IRC op gives chanop privileges without being a chanop,
 | 
				
			||||||
 * ircd2 will ignore the command. This enables a workaround:
 | 
					 * ircd2 will ignore the command. This enables a workaround:
 | 
				
			||||||
 * It masks the command as coming from the server */
 | 
					 * It masks the command as coming from the server */
 | 
				
			||||||
@@ -128,16 +135,19 @@ GLOBAL int Conf_MaxJoins;
 | 
				
			|||||||
/* Maximum number of connections per IP address */
 | 
					/* Maximum number of connections per IP address */
 | 
				
			||||||
GLOBAL int Conf_MaxConnectionsIP;
 | 
					GLOBAL int Conf_MaxConnectionsIP;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Maximum length of a nick name */
 | 
				
			||||||
 | 
					GLOBAL unsigned int Conf_MaxNickLength;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL void Conf_Init PARAMS((void ));
 | 
					GLOBAL void Conf_Init PARAMS((void));
 | 
				
			||||||
GLOBAL void Conf_Rehash PARAMS((void ));
 | 
					GLOBAL void Conf_Rehash PARAMS((void));
 | 
				
			||||||
GLOBAL int Conf_Test PARAMS((void ));
 | 
					GLOBAL int Conf_Test PARAMS((void));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL void Conf_UnsetServer PARAMS(( CONN_ID Idx ));
 | 
					GLOBAL void Conf_UnsetServer PARAMS(( CONN_ID Idx ));
 | 
				
			||||||
GLOBAL void Conf_SetServer PARAMS(( int ConfServer, CONN_ID Idx ));
 | 
					GLOBAL void Conf_SetServer PARAMS(( int ConfServer, CONN_ID Idx ));
 | 
				
			||||||
GLOBAL int Conf_GetServer PARAMS(( CONN_ID Idx ));
 | 
					GLOBAL int Conf_GetServer PARAMS(( CONN_ID Idx ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool Conf_EnableServer PARAMS(( char *Name, UINT16 Port ));
 | 
					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_DisableServer PARAMS(( char *Name ));
 | 
				
			||||||
GLOBAL bool Conf_AddServer PARAMS(( char *Name, UINT16 Port, char *Host, char *MyPwd, char *PeerPwd ));
 | 
					GLOBAL bool Conf_AddServer PARAMS(( char *Name, UINT16 Port, char *Host, char *MyPwd, char *PeerPwd ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,7 +16,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "portab.h"
 | 
					#include "portab.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char UNUSED id[] = "$Id: conn-func.c,v 1.6 2005/06/12 16:32:17 alex Exp $";
 | 
					static char UNUSED id[] = "$Id: conn-func.c,v 1.11 2007/10/04 15:03:56 alex Exp $";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "imp.h"
 | 
					#include "imp.h"
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
@@ -39,6 +39,16 @@ Conn_UpdateIdle( CONN_ID Idx )
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Get signon time of a connection.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					GLOBAL time_t
 | 
				
			||||||
 | 
					Conn_GetSignon(CONN_ID Idx)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						assert(Idx > NONE);
 | 
				
			||||||
 | 
						return My_Connections[Idx].signon;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL time_t
 | 
					GLOBAL time_t
 | 
				
			||||||
Conn_GetIdle( CONN_ID Idx )
 | 
					Conn_GetIdle( CONN_ID Idx )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -73,7 +83,13 @@ Conn_SetPenalty( CONN_ID Idx, time_t Seconds )
 | 
				
			|||||||
	assert( Seconds >= 0 );
 | 
						assert( Seconds >= 0 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	t = time( NULL ) + Seconds;
 | 
						t = time( NULL ) + Seconds;
 | 
				
			||||||
	if( t > My_Connections[Idx].delaytime ) My_Connections[Idx].delaytime = t;
 | 
						if (t > My_Connections[Idx].delaytime)
 | 
				
			||||||
 | 
							My_Connections[Idx].delaytime = t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef DEBUG
 | 
				
			||||||
 | 
						Log(LOG_DEBUG, "Add penalty time on connection %d: %ld second(s).",
 | 
				
			||||||
 | 
								Idx, (long)Seconds);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
} /* Conn_SetPenalty */
 | 
					} /* Conn_SetPenalty */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -150,7 +166,7 @@ Conn_Next( CONN_ID Idx )
 | 
				
			|||||||
} /* Conn_Next */
 | 
					} /* Conn_Next */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL int
 | 
					GLOBAL UINT16
 | 
				
			||||||
Conn_Options( CONN_ID Idx )
 | 
					Conn_Options( CONN_ID Idx )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	assert( Idx > NONE );
 | 
						assert( Idx > NONE );
 | 
				
			||||||
@@ -171,7 +187,7 @@ Conn_StartTime( CONN_ID Idx )
 | 
				
			|||||||
	assert(Idx > NONE);
 | 
						assert(Idx > NONE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Search client structure for this link ... */
 | 
						/* Search client structure for this link ... */
 | 
				
			||||||
	c = Client_GetFromConn(Idx);
 | 
						c = Conn_GetClient(Idx);
 | 
				
			||||||
	if(c != NULL)
 | 
						if(c != NULL)
 | 
				
			||||||
		return Client_StartTime(c);
 | 
							return Client_StartTime(c);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -179,17 +195,18 @@ Conn_StartTime( CONN_ID Idx )
 | 
				
			|||||||
} /* Conn_StartTime */
 | 
					} /* Conn_StartTime */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL int
 | 
					GLOBAL size_t
 | 
				
			||||||
Conn_SendQ( CONN_ID Idx )
 | 
					Conn_SendQ( CONN_ID Idx )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Laenge der Daten im Schreibbuffer liefern */
 | 
						/* Laenge der Daten im Schreibbuffer liefern */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert( Idx > NONE );
 | 
						assert( Idx > NONE );
 | 
				
			||||||
#ifdef ZLIB
 | 
					#ifdef ZLIB
 | 
				
			||||||
	if( My_Connections[Idx].options & CONN_ZIP ) return My_Connections[Idx].zip.wdatalen;
 | 
						if( My_Connections[Idx].options & CONN_ZIP )
 | 
				
			||||||
 | 
							return array_bytes(&My_Connections[Idx].zip.wbuf);
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	return My_Connections[Idx].wdatalen;
 | 
						return array_bytes(&My_Connections[Idx].wbuf);
 | 
				
			||||||
} /* Conn_SendQ */
 | 
					} /* Conn_SendQ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -213,17 +230,18 @@ Conn_SendBytes( CONN_ID Idx )
 | 
				
			|||||||
} /* Conn_SendBytes */
 | 
					} /* Conn_SendBytes */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL int
 | 
					GLOBAL size_t
 | 
				
			||||||
Conn_RecvQ( CONN_ID Idx )
 | 
					Conn_RecvQ( CONN_ID Idx )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Laenge der Daten im Lesebuffer liefern */
 | 
						/* Laenge der Daten im Lesebuffer liefern */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert( Idx > NONE );
 | 
						assert( Idx > NONE );
 | 
				
			||||||
#ifdef ZLIB
 | 
					#ifdef ZLIB
 | 
				
			||||||
	if( My_Connections[Idx].options & CONN_ZIP ) return My_Connections[Idx].zip.rdatalen;
 | 
						if( My_Connections[Idx].options & CONN_ZIP )
 | 
				
			||||||
 | 
							return array_bytes(&My_Connections[Idx].zip.rbuf);
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	return My_Connections[Idx].rdatalen;
 | 
						return array_bytes(&My_Connections[Idx].rbuf);
 | 
				
			||||||
} /* Conn_RecvQ */
 | 
					} /* Conn_RecvQ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,7 @@
 | 
				
			|||||||
 * (at your option) any later version.
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
					 * Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * $Id: conn-func.h,v 1.4 2005/04/25 18:37:16 fw Exp $
 | 
					 * $Id: conn-func.h,v 1.7 2007/10/04 15:03:56 alex Exp $
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Connection management: Global functions (header)
 | 
					 * Connection management: Global functions (header)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@@ -27,11 +27,12 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL void Conn_UpdateIdle PARAMS(( CONN_ID Idx ));
 | 
					GLOBAL void Conn_UpdateIdle PARAMS(( CONN_ID Idx ));
 | 
				
			||||||
 | 
					GLOBAL time_t Conn_GetSignon PARAMS((CONN_ID Idx));
 | 
				
			||||||
GLOBAL time_t Conn_GetIdle PARAMS(( CONN_ID Idx ));
 | 
					GLOBAL time_t Conn_GetIdle PARAMS(( CONN_ID Idx ));
 | 
				
			||||||
GLOBAL time_t Conn_LastPing PARAMS(( CONN_ID Idx ));
 | 
					GLOBAL time_t Conn_LastPing PARAMS(( CONN_ID Idx ));
 | 
				
			||||||
GLOBAL time_t Conn_StartTime PARAMS(( CONN_ID Idx ));
 | 
					GLOBAL time_t Conn_StartTime PARAMS(( CONN_ID Idx ));
 | 
				
			||||||
GLOBAL int Conn_SendQ PARAMS(( CONN_ID Idx ));
 | 
					GLOBAL size_t Conn_SendQ PARAMS(( CONN_ID Idx ));
 | 
				
			||||||
GLOBAL int Conn_RecvQ PARAMS(( CONN_ID Idx ));
 | 
					GLOBAL size_t Conn_RecvQ PARAMS(( CONN_ID Idx ));
 | 
				
			||||||
GLOBAL long Conn_SendMsg PARAMS(( CONN_ID Idx ));
 | 
					GLOBAL long Conn_SendMsg PARAMS(( CONN_ID Idx ));
 | 
				
			||||||
GLOBAL long Conn_RecvMsg PARAMS(( CONN_ID Idx ));
 | 
					GLOBAL long Conn_RecvMsg PARAMS(( CONN_ID Idx ));
 | 
				
			||||||
GLOBAL long Conn_SendBytes PARAMS(( CONN_ID Idx ));
 | 
					GLOBAL long Conn_SendBytes PARAMS(( CONN_ID Idx ));
 | 
				
			||||||
@@ -47,14 +48,14 @@ GLOBAL void Conn_SetFlag PARAMS(( CONN_ID Idx, int Flag ));
 | 
				
			|||||||
GLOBAL CONN_ID Conn_First PARAMS(( void ));
 | 
					GLOBAL CONN_ID Conn_First PARAMS(( void ));
 | 
				
			||||||
GLOBAL CONN_ID Conn_Next PARAMS(( CONN_ID Idx ));
 | 
					GLOBAL CONN_ID Conn_Next PARAMS(( CONN_ID Idx ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL int Conn_Options PARAMS(( CONN_ID Idx ));
 | 
					GLOBAL UINT16 Conn_Options PARAMS(( CONN_ID Idx ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL void Conn_ResetWCounter PARAMS(( void ));
 | 
					GLOBAL void Conn_ResetWCounter PARAMS(( void ));
 | 
				
			||||||
GLOBAL long Conn_WCounter PARAMS(( void ));
 | 
					GLOBAL long Conn_WCounter PARAMS(( void ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define Conn_OPTION_ADD( x, opt )   ( (x)->options |= opt ) 
 | 
					#define Conn_OPTION_ADD( x, opt )   ( (x)->options |= (opt) )
 | 
				
			||||||
#define Conn_OPTION_DEL( x, opt )   ( (x)->options &= ~opt )
 | 
					#define Conn_OPTION_DEL( x, opt )   ( (x)->options &= ~(opt) )
 | 
				
			||||||
#define Conn_OPTION_ISSET( x, opt ) ( (x)->options & opt )
 | 
					#define Conn_OPTION_ISSET( x, opt ) ( ((x)->options & (opt)) != 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
					 * ngIRCd -- The Next Generation IRC Daemon
 | 
				
			||||||
 * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
 | 
					 * Copyright (c)2001-2007 Alexander Barton (alex@barton.de)
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software; you can redistribute it and/or modify
 | 
					 * This program is free software; you can redistribute it and/or modify
 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -19,7 +19,10 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#ifdef ZLIB
 | 
					#ifdef ZLIB
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char UNUSED id[] = "$Id: conn-zip.c,v 1.7 2005/04/25 18:37:16 fw Exp $";
 | 
					/* enable more zlib related debug messages: */
 | 
				
			||||||
 | 
					/* #define DEBUG_ZLIB */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static char UNUSED id[] = "$Id: conn-zip.c,v 1.16 2007/05/17 23:34:24 alex Exp $";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "imp.h"
 | 
					#include "imp.h"
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
@@ -30,6 +33,7 @@ static char UNUSED id[] = "$Id: conn-zip.c,v 1.7 2005/04/25 18:37:16 fw Exp $";
 | 
				
			|||||||
#include "conn-func.h"
 | 
					#include "conn-func.h"
 | 
				
			||||||
#include "log.h"
 | 
					#include "log.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "array.h"
 | 
				
			||||||
#include "exp.h"
 | 
					#include "exp.h"
 | 
				
			||||||
#include "conn-zip.h"
 | 
					#include "conn-zip.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -78,47 +82,71 @@ Zip_InitConn( CONN_ID Idx )
 | 
				
			|||||||
} /* Zip_InitConn */
 | 
					} /* 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
 | 
					GLOBAL bool
 | 
				
			||||||
Zip_Buffer( CONN_ID Idx, char *Data, int Len )
 | 
					Zip_Buffer( CONN_ID Idx, char *Data, size_t Len )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Daten zum Komprimieren im "Kompressions-Puffer" sammeln.
 | 
						size_t buflen;
 | 
				
			||||||
	* Es wird true bei Erfolg, sonst false geliefert. */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert( Idx > NONE );
 | 
						assert( Idx > NONE );
 | 
				
			||||||
	assert( Data != NULL );
 | 
						assert( Data != NULL );
 | 
				
			||||||
	assert( Len > 0 );
 | 
						assert( Len > 0 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Ist noch Platz im Kompressions-Puffer? */
 | 
						buflen = array_bytes(&My_Connections[Idx].zip.wbuf);
 | 
				
			||||||
	if( ZWRITEBUFFER_LEN - My_Connections[Idx].zip.wdatalen < Len + 50 )
 | 
						if (buflen + Len >= WRITEBUFFER_SLINK_LEN) {
 | 
				
			||||||
	{
 | 
							/* compression buffer is full, flush */
 | 
				
			||||||
		/* Nein! Puffer zunaechst leeren ...*/
 | 
					 | 
				
			||||||
		if( ! Zip_Flush( Idx )) return false;
 | 
							if( ! Zip_Flush( Idx )) return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Daten kopieren */
 | 
						/* check again; if zip buf is still too large do not append data:
 | 
				
			||||||
	memmove( My_Connections[Idx].zip.wbuf + My_Connections[Idx].zip.wdatalen, Data, Len );
 | 
						 * otherwise the zip wbuf would grow too large */
 | 
				
			||||||
	My_Connections[Idx].zip.wdatalen += Len;
 | 
						buflen = array_bytes(&My_Connections[Idx].zip.wbuf);
 | 
				
			||||||
 | 
						if (buflen + Len >= WRITEBUFFER_SLINK_LEN)
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return true;
 | 
						return array_catb(&My_Connections[Idx].zip.wbuf, Data, Len);
 | 
				
			||||||
} /* Zip_Buffer */
 | 
					} /* 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
 | 
					GLOBAL bool
 | 
				
			||||||
Zip_Flush( CONN_ID Idx )
 | 
					Zip_Flush( CONN_ID Idx )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Daten komprimieren und in Schreibpuffer kopieren.
 | 
						int result;
 | 
				
			||||||
	* Es wird true bei Erfolg, sonst false geliefert. */
 | 
						unsigned char zipbuf[WRITEBUFFER_SLINK_LEN];
 | 
				
			||||||
 | 
						int zipbuf_used = 0;
 | 
				
			||||||
	int result, out_len;
 | 
					 | 
				
			||||||
	z_stream *out;
 | 
						z_stream *out;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	out = &My_Connections[Idx].zip.out;
 | 
						out = &My_Connections[Idx].zip.out;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	out->next_in = (void *)My_Connections[Idx].zip.wbuf;
 | 
						out->avail_in = (uInt)array_bytes(&My_Connections[Idx].zip.wbuf);
 | 
				
			||||||
	out->avail_in = My_Connections[Idx].zip.wdatalen;
 | 
						if (!out->avail_in)
 | 
				
			||||||
	out->next_out = (void *)(My_Connections[Idx].wbuf + My_Connections[Idx].wdatalen);
 | 
							return true;	/* nothing to do. */
 | 
				
			||||||
	out->avail_out = WRITEBUFFER_LEN - My_Connections[Idx].wdatalen;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						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 );
 | 
						result = deflate( out, Z_SYNC_FLUSH );
 | 
				
			||||||
	if(( result != Z_OK ) || ( out->avail_in > 0 ))
 | 
						if(( result != Z_OK ) || ( out->avail_in > 0 ))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@@ -127,11 +155,30 @@ Zip_Flush( CONN_ID Idx )
 | 
				
			|||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	out_len = WRITEBUFFER_LEN - My_Connections[Idx].wdatalen - out->avail_out;
 | 
						if (out->avail_out <= 0) {
 | 
				
			||||||
	My_Connections[Idx].wdatalen += out_len;
 | 
							/* Not all data was compressed, because data became
 | 
				
			||||||
	My_Connections[Idx].bytes_out += out_len;
 | 
							 * bigger while compressing it. */
 | 
				
			||||||
	My_Connections[Idx].zip.bytes_out += My_Connections[Idx].zip.wdatalen;
 | 
							Log (LOG_ALERT, "Compression error: buffer overvlow!?");
 | 
				
			||||||
	My_Connections[Idx].zip.wdatalen = 0;
 | 
							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;
 | 
						return true;
 | 
				
			||||||
} /* Zip_Flush */
 | 
					} /* Zip_Flush */
 | 
				
			||||||
@@ -144,20 +191,33 @@ Unzip_Buffer( CONN_ID Idx )
 | 
				
			|||||||
	* wird false geliefert, ansonsten true. Der Fall, dass keine
 | 
						* wird false geliefert, ansonsten true. Der Fall, dass keine
 | 
				
			||||||
	* Daten mehr zu entpacken sind, ist _kein_ Fehler! */
 | 
						* Daten mehr zu entpacken sind, ist _kein_ Fehler! */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int result, in_len, out_len;
 | 
						int result;
 | 
				
			||||||
 | 
						unsigned char unzipbuf[READBUFFER_LEN];
 | 
				
			||||||
 | 
						int unzipbuf_used = 0;
 | 
				
			||||||
 | 
						unsigned int z_rdatalen;
 | 
				
			||||||
 | 
						unsigned int in_len;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
	z_stream *in;
 | 
						z_stream *in;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert( Idx > NONE );
 | 
						assert( Idx > NONE );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if( My_Connections[Idx].zip.rdatalen <= 0 ) return true;
 | 
						z_rdatalen = (unsigned int)array_bytes(&My_Connections[Idx].zip.rbuf);
 | 
				
			||||||
 | 
						if (z_rdatalen == 0)
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	in = &My_Connections[Idx].zip.in;
 | 
						in = &My_Connections[Idx].zip.in;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	in->next_in = (void *)My_Connections[Idx].zip.rbuf;
 | 
						in->next_in = array_start(&My_Connections[Idx].zip.rbuf);
 | 
				
			||||||
	in->avail_in = My_Connections[Idx].zip.rdatalen;
 | 
						assert(in->next_in != NULL);
 | 
				
			||||||
	in->next_out = (void *)(My_Connections[Idx].rbuf + My_Connections[Idx].rdatalen);
 | 
					 | 
				
			||||||
	in->avail_out = READBUFFER_LEN - My_Connections[Idx].rdatalen - 1;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						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 );
 | 
						result = inflate( in, Z_SYNC_FLUSH );
 | 
				
			||||||
	if( result != Z_OK )
 | 
						if( result != Z_OK )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@@ -166,19 +226,24 @@ Unzip_Buffer( CONN_ID Idx )
 | 
				
			|||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	in_len = My_Connections[Idx].zip.rdatalen - in->avail_in;
 | 
						assert(z_rdatalen >= in->avail_in);
 | 
				
			||||||
	out_len = READBUFFER_LEN - My_Connections[Idx].rdatalen - 1 - in->avail_out;
 | 
						in_len = z_rdatalen - in->avail_in;
 | 
				
			||||||
	My_Connections[Idx].rdatalen += out_len;
 | 
						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 )
 | 
						if( in->avail_in > 0 ) {
 | 
				
			||||||
	{
 | 
							array_moveleft(&My_Connections[Idx].zip.rbuf, 1, in_len );
 | 
				
			||||||
		/* es konnten nicht alle Daten entpackt werden, vermutlich war
 | 
						} else {
 | 
				
			||||||
		* im Ziel-Puffer kein Platz mehr. Umkopieren ... */
 | 
							array_trunc( &My_Connections[Idx].zip.rbuf );
 | 
				
			||||||
		My_Connections[Idx].zip.rdatalen -= in_len;
 | 
							My_Connections[Idx].zip.bytes_in += unzipbuf_used;
 | 
				
			||||||
		memmove( My_Connections[Idx].zip.rbuf, My_Connections[Idx].zip.rbuf + in_len, My_Connections[Idx].zip.rdatalen );
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else My_Connections[Idx].zip.rdatalen = 0;
 | 
					 | 
				
			||||||
	My_Connections[Idx].zip.bytes_in += out_len;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return true;
 | 
						return true;
 | 
				
			||||||
} /* Unzip_Buffer */
 | 
					} /* Unzip_Buffer */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,7 @@
 | 
				
			|||||||
 * (at your option) any later version.
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
					 * Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * $Id: conn-zip.h,v 1.3 2005/03/19 18:43:48 fw Exp $
 | 
					 * $Id: conn-zip.h,v 1.4 2006/05/10 21:24:01 alex Exp $
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Connection compression using ZLIB (header)
 | 
					 * Connection compression using ZLIB (header)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@@ -22,7 +22,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
GLOBAL bool Zip_InitConn PARAMS(( CONN_ID Idx ));
 | 
					GLOBAL bool Zip_InitConn PARAMS(( CONN_ID Idx ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool Zip_Buffer PARAMS(( CONN_ID Idx, char *Data, int Len ));
 | 
					GLOBAL bool Zip_Buffer PARAMS(( CONN_ID Idx, char *Data, size_t Len ));
 | 
				
			||||||
GLOBAL bool Zip_Flush PARAMS(( CONN_ID Idx ));
 | 
					GLOBAL bool Zip_Flush PARAMS(( CONN_ID Idx ));
 | 
				
			||||||
GLOBAL bool Unzip_Buffer PARAMS(( CONN_ID Idx ));
 | 
					GLOBAL bool Unzip_Buffer PARAMS(( CONN_ID Idx ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1792
									
								
								src/ngircd/conn.c
									
									
									
									
									
								
							
							
						
						
									
										1792
									
								
								src/ngircd/conn.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -8,7 +8,7 @@
 | 
				
			|||||||
 * (at your option) any later version.
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
					 * Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * $Id: conn.h,v 1.35.2.1 2005/07/30 23:24:50 alex Exp $
 | 
					 * $Id: conn.h,v 1.45 2007/10/04 15:03:56 alex Exp $
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Connection management (header)
 | 
					 * Connection management (header)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@@ -31,11 +31,13 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
typedef int CONN_ID;
 | 
					typedef int CONN_ID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "client.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONN_MODULE
 | 
					#ifdef CONN_MODULE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "defines.h"
 | 
					#include "defines.h"
 | 
				
			||||||
#include "resolve.h"
 | 
					#include "resolve.h"
 | 
				
			||||||
 | 
					#include "array.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef ZLIB
 | 
					#ifdef ZLIB
 | 
				
			||||||
#include <zlib.h>
 | 
					#include <zlib.h>
 | 
				
			||||||
@@ -43,10 +45,8 @@ typedef struct _ZipData
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	z_stream in;			/* "Handle" for input stream */
 | 
						z_stream in;			/* "Handle" for input stream */
 | 
				
			||||||
	z_stream out;			/* "Handle" for output stream */
 | 
						z_stream out;			/* "Handle" for output stream */
 | 
				
			||||||
	char rbuf[READBUFFER_LEN];	/* Read buffer */
 | 
						array rbuf;			/* Read buffer (compressed) */
 | 
				
			||||||
	int rdatalen;			/* Length of data in read buffer (compressed) */
 | 
						array wbuf;			/* Write buffer (uncompressed) */
 | 
				
			||||||
	char wbuf[WRITEBUFFER_LEN];	/* Write buffer */
 | 
					 | 
				
			||||||
	int wdatalen;			/* Length of data in write buffer (uncompressed) */
 | 
					 | 
				
			||||||
	long bytes_in, bytes_out;	/* Counter for statistics (uncompressed!) */
 | 
						long bytes_in, bytes_out;	/* Counter for statistics (uncompressed!) */
 | 
				
			||||||
} ZIPDATA;
 | 
					} ZIPDATA;
 | 
				
			||||||
#endif /* ZLIB */
 | 
					#endif /* ZLIB */
 | 
				
			||||||
@@ -55,12 +55,11 @@ typedef struct _Connection
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	int sock;			/* Socket handle */
 | 
						int sock;			/* Socket handle */
 | 
				
			||||||
	struct sockaddr_in addr;	/* Client address */
 | 
						struct sockaddr_in addr;	/* Client address */
 | 
				
			||||||
	RES_STAT *res_stat;		/* Status of resolver process, if any */
 | 
						RES_STAT res_stat;		/* Status of resolver process */
 | 
				
			||||||
	char host[HOST_LEN];		/* Hostname */
 | 
						char host[HOST_LEN];		/* Hostname */
 | 
				
			||||||
	char rbuf[READBUFFER_LEN];	/* Read buffer */
 | 
						array rbuf;			/* Read buffer */
 | 
				
			||||||
	int rdatalen;			/* Length of data in read buffer */
 | 
						array wbuf;			/* Write buffer */
 | 
				
			||||||
	char wbuf[WRITEBUFFER_LEN];	/* Write buffer */
 | 
						time_t signon;			/* Signon ("connect") time */
 | 
				
			||||||
	int wdatalen;			/* Length of data in write buffer */
 | 
					 | 
				
			||||||
	time_t lastdata;		/* Last activity */
 | 
						time_t lastdata;		/* Last activity */
 | 
				
			||||||
	time_t lastping;		/* Last PING */
 | 
						time_t lastping;		/* Last PING */
 | 
				
			||||||
	time_t lastprivmsg;		/* Last PRIVMSG */
 | 
						time_t lastprivmsg;		/* Last PRIVMSG */
 | 
				
			||||||
@@ -69,6 +68,7 @@ typedef struct _Connection
 | 
				
			|||||||
	long msg_in, msg_out;		/* Received and sent IRC messages */
 | 
						long msg_in, msg_out;		/* Received and sent IRC messages */
 | 
				
			||||||
	int flag;			/* Flag (see "irc-write" module) */
 | 
						int flag;			/* Flag (see "irc-write" module) */
 | 
				
			||||||
	UINT16 options;			/* Link options / connection state */
 | 
						UINT16 options;			/* Link options / connection state */
 | 
				
			||||||
 | 
						CLIENT *client;			/* pointer to client structure */
 | 
				
			||||||
#ifdef ZLIB
 | 
					#ifdef ZLIB
 | 
				
			||||||
	ZIPDATA zip;			/* Compression information */
 | 
						ZIPDATA zip;			/* Compression information */
 | 
				
			||||||
#endif  /* ZLIB */
 | 
					#endif  /* ZLIB */
 | 
				
			||||||
@@ -84,24 +84,18 @@ GLOBAL long WCounter;
 | 
				
			|||||||
GLOBAL void Conn_Init PARAMS((void ));
 | 
					GLOBAL void Conn_Init PARAMS((void ));
 | 
				
			||||||
GLOBAL void Conn_Exit PARAMS(( void ));
 | 
					GLOBAL void Conn_Exit PARAMS(( void ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL int Conn_InitListeners PARAMS(( void ));
 | 
					GLOBAL unsigned int Conn_InitListeners PARAMS(( void ));
 | 
				
			||||||
GLOBAL void Conn_ExitListeners PARAMS(( void ));
 | 
					GLOBAL void Conn_ExitListeners PARAMS(( void ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool Conn_NewListener PARAMS(( const UINT16 Port ));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
GLOBAL void Conn_Handler PARAMS(( void ));
 | 
					GLOBAL void Conn_Handler PARAMS(( void ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool Conn_Write PARAMS(( CONN_ID Idx, char *Data, int Len ));
 | 
					 | 
				
			||||||
GLOBAL bool Conn_WriteStr PARAMS(( CONN_ID Idx, char *Format, ... ));
 | 
					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_Close PARAMS(( CONN_ID Idx, char *LogMsg, char *FwdMsg, bool InformClient ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL void Conn_SyncServerStruct PARAMS(( void ));
 | 
					GLOBAL void Conn_SyncServerStruct PARAMS(( void ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL int Conn_MaxFD;
 | 
					GLOBAL CLIENT* Conn_GetClient PARAMS((CONN_ID i));
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
/* -eof- */
 | 
					/* -eof- */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
					 * ngIRCd -- The Next Generation IRC Daemon
 | 
				
			||||||
 * Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
 | 
					 * Copyright (c)2001-2007 Alexander Barton (alex@barton.de)
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software; you can redistribute it and/or modify
 | 
					 * This program is free software; you can redistribute it and/or modify
 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -8,101 +8,119 @@
 | 
				
			|||||||
 * (at your option) any later version.
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
					 * Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * $Id: defines.h,v 1.52.2.2 2005/07/05 22:58:25 alex Exp $
 | 
					 * $Id: defines.h,v 1.62 2007/11/21 12:16:36 alex Exp $
 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Global defines of ngIRCd.
 | 
					 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef __defines_h__
 | 
					#ifndef __defines_h__
 | 
				
			||||||
#define __defines_h__
 | 
					#define __defines_h__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @file
 | 
				
			||||||
 | 
					 * Global constants ("#defines") used by the ngIRCd.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define NONE -1
 | 
					#define NONE -1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define FNAME_LEN 256			/* max. length of file name */
 | 
					#define FNAME_LEN 256			/* Max. length of file name */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define LINE_LEN 256			/* max. length of a line in the configuration file */
 | 
					#define LINE_LEN 256			/* Max. length of a line in the
 | 
				
			||||||
 | 
										   configuration file */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define HOST_LEN 256			/* max. lenght of fully qualified host names */
 | 
					#define HOST_LEN 256			/* Max. lenght of fully qualified host
 | 
				
			||||||
 | 
										   names (e. g. "abc.domain.tld") */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MAX_LISTEN_PORTS 16		/* max. count of listening ports */
 | 
					#define MAX_LISTEN_PORTS 16		/* Max. count of listening ports */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MAX_OPERATORS 16		/* max. count of configurable operators */
 | 
					#define MAX_OPERATORS 16		/* Max. count of configurable IRC Ops */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MAX_SERVERS 16			/* max. count of configurable servers ("peers") */
 | 
					#define MAX_SERVERS 16			/* Max. count of configurable servers */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MAX_DEFCHANNELS 16		/* max. count of preconfigurable channels */
 | 
					#define MAX_DEFCHANNELS 16		/* Max. count of predefined channels */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MAX_SERVICES 8			/* max. number of configurable services */
 | 
					#define MAX_SERVICES 8			/* Max. count of services */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MAX_WHOWAS 64			/* max. number of WHOWAS items */
 | 
					#define MAX_WHOWAS 64			/* Max. number of WHOWAS items */
 | 
				
			||||||
#define DEFAULT_WHOWAS 5		/* default count for WHOWAS command */
 | 
					#define DEFAULT_WHOWAS 5		/* default count for WHOWAS command */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CONNECTION_POOL 100		/* size of default connection pool */
 | 
					#define CONNECTION_POOL 100		/* Size of default connection pool */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CLIENT_ID_LEN 64		/* max. length of an IRC ID; see RFC 2812, 1.1 and 1.2.1 */
 | 
					#define CLIENT_ID_LEN 64		/* Max. length of an IRC ID; see RFC
 | 
				
			||||||
#define CLIENT_NICK_LEN 10		/* max. nick length; see. RFC 2812, 1.2.1 */
 | 
										   RFC 2812 section 1.1 and 1.2.1 */
 | 
				
			||||||
#define CLIENT_PASS_LEN 21		/* max. password length */
 | 
					#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")
 | 
					#define CLIENT_USER_LEN 10		/* Max. length of user name ("login")
 | 
				
			||||||
 					   see RFC 2812, section 1.2.1 */
 | 
										   see RFC 2812, section 1.2.1 */
 | 
				
			||||||
#define CLIENT_NAME_LEN 32		/* max. length of "real names" */
 | 
					#define CLIENT_NAME_LEN 32		/* Max. length of "real names" */
 | 
				
			||||||
#define CLIENT_HOST_LEN 64		/* max. host name length */
 | 
					#define CLIENT_HOST_LEN 64		/* Max. host name length */
 | 
				
			||||||
#define CLIENT_MODE_LEN 8		/* max. lenth of all client modes */
 | 
					#define CLIENT_MODE_LEN 9		/* Max. lenth of all client modes */
 | 
				
			||||||
#define CLIENT_INFO_LEN 64		/* max. length of server info texts */
 | 
					#define CLIENT_INFO_LEN 64		/* Max. length of server info texts */
 | 
				
			||||||
#define CLIENT_AWAY_LEN 128		/* max. length of away messages */
 | 
					#define CLIENT_AWAY_LEN 128		/* Max. length of away messages */
 | 
				
			||||||
#define CLIENT_FLAGS_LEN 100		/* max. length of client flags */
 | 
					#define CLIENT_FLAGS_LEN 100		/* Max. length of client flags */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CHANNEL_NAME_LEN 51		/* max. length of a channel name, see. RFC 2812, 1.3 */
 | 
					#define CHANNEL_NAME_LEN 51		/* Max. length of a channel name, see
 | 
				
			||||||
#define CHANNEL_MODE_LEN 9		/* max. length of channel modes */
 | 
										   RFC 2812 section 1.3 */
 | 
				
			||||||
#define CHANNEL_TOPIC_LEN 128		/* max. length of a channel topic */
 | 
					#define CHANNEL_MODE_LEN 9		/* Max. length of channel modes */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define COMMAND_LEN 513			/* max. IRC command length, see. RFC 2812, 3.2 */
 | 
					#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 (bytes) */
 | 
					#define READBUFFER_LEN 2048		/* Size of the read buffer of a
 | 
				
			||||||
#define WRITEBUFFER_LEN 4096		/* size of the write buffer of a connection (bytes) */
 | 
										   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. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef ZLIB
 | 
					#define PROTOVER "0210"			/* Implemented IRC protocol version,
 | 
				
			||||||
#define ZREADBUFFER_LEN 1024		/* compressed read buffer of a connection (bytes) */
 | 
										   see RFC 2813 section 4.1.1. */
 | 
				
			||||||
#define ZWRITEBUFFER_LEN 4096		/* compressed write buffer of a connection (bytes) */
 | 
					#define PROTOIRC "-IRC"			/* Protocol suffix, see RFC 2813
 | 
				
			||||||
#endif
 | 
										   section 4.1.1 */
 | 
				
			||||||
 | 
					#define PROTOIRCPLUS "-IRC+"		/* Protocol suffix used by the IRC+
 | 
				
			||||||
#define PROTOVER "0210"			/* implemented IRC protocol version (see RFC 2813, 4.1.1) */
 | 
										   protocol, see doc/Protocol.txt */
 | 
				
			||||||
#define PROTOIRC "-IRC"			/* protocol suffix (see RFC 2813, 4.1.1) */
 | 
					 | 
				
			||||||
#define PROTOIRCPLUS "-IRC+"		/* protokol suffix for IRC+ protocol (see doc/Protocol.txt) */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef IRCPLUS
 | 
					#ifdef IRCPLUS
 | 
				
			||||||
# define IRCPLUSFLAGS "CL"		/* standard IRC+ flags */
 | 
					# define IRCPLUSFLAGS "CHL"		/* Standard IRC+ flags */
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define STARTUP_DELAY 1			/* delay outgoing connections n seconds after startup */
 | 
					#define STARTUP_DELAY 1			/* Delay outgoing connections n seconds
 | 
				
			||||||
#define RECONNECT_DELAY 3		/* time to delay re-connect attempts (seconds) */
 | 
										   after startup. */
 | 
				
			||||||
 | 
					#define RECONNECT_DELAY 3		/* Time to delay re-connect attempts
 | 
				
			||||||
 | 
										   in seconds. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define USERMODES "aios"		/* supported user modes */
 | 
					#define USERMODES "aios"		/* Supported user modes. */
 | 
				
			||||||
#define CHANMODES "biklImnoPstv"	/* supported channel modes */
 | 
					#define CHANMODES "biIklmnoPstv"	/* Supported channel modes. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CONNECTED true			/* internal status codes */
 | 
					#define CONNECTED true			/* Internal status codes. */
 | 
				
			||||||
#define DISCONNECTED false
 | 
					#define DISCONNECTED false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define DEFAULT_AWAY_MSG "Away"		/* away message for users connected to linked servers */
 | 
					#define DEFAULT_AWAY_MSG "Away"		/* Away message for users connected to
 | 
				
			||||||
 | 
										   linked servers. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CONFIG_FILE "/ngircd.conf"
 | 
					#define DEFAULT_TOPIC_ID "-Server-"	/* Default ID for "topic owner". */
 | 
				
			||||||
#define MOTD_FILE "/ngircd.motd"
 | 
					 | 
				
			||||||
#define MOTD_PHRASE ""
 | 
					 | 
				
			||||||
#define CHROOT_DIR ""
 | 
					 | 
				
			||||||
#define PID_FILE ""
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ERROR_DIR "/tmp"
 | 
					#define CONFIG_FILE "/ngircd.conf"	/* Configuration file name. */
 | 
				
			||||||
 | 
					#define MOTD_FILE "/ngircd.motd"	/* Name of the MOTD file. */
 | 
				
			||||||
 | 
					#define MOTD_PHRASE ""			/* Default MOTD phrase string. */
 | 
				
			||||||
 | 
					#define CHROOT_DIR ""			/* Default chroot() directory. */
 | 
				
			||||||
 | 
					#define PID_FILE ""			/* Default file for the process ID. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MAX_LOG_MSG_LEN 256		/* max. length of a log message */
 | 
					#define ERROR_DIR "/tmp"		/* Error directory used in debug mode */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TOKEN_OUTBOUND -2		/* tag for outbound server links */
 | 
					#define MAX_LOG_MSG_LEN 256		/* Max. length of a log message. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define NOTICE_TXTPREFIX ""		/* prefix for NOTICEs from the server to users */
 | 
					#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
 | 
					#define CUT_TXTSUFFIX "[CUT]"		/* Suffix for oversized messages that
 | 
				
			||||||
					   have been shortened and cut off. */
 | 
										   have been shortened and cut off. */
 | 
				
			||||||
#ifdef RENDEZVOUS
 | 
					
 | 
				
			||||||
#define RENDEZVOUS_TYPE "_ircu._tcp."	/* service type to register with Rendezvous */
 | 
					#ifdef ZEROCONF
 | 
				
			||||||
 | 
					#define MDNS_TYPE "_ircu._tcp."		/* Service type to register with mDNS */
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "portab.h"
 | 
					#include "portab.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char UNUSED id[] = "$Id: hash.c,v 1.11 2005/03/19 18:43:48 fw Exp $";
 | 
					static char UNUSED id[] = "$Id: hash.c,v 1.13 2006/10/06 21:23:47 fw Exp $";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "imp.h"
 | 
					#include "imp.h"
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
@@ -27,11 +27,11 @@ static char UNUSED id[] = "$Id: hash.c,v 1.11 2005/03/19 18:43:48 fw Exp $";
 | 
				
			|||||||
#include "hash.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
 | 
					GLOBAL UINT32
 | 
				
			||||||
Hash( char *String )
 | 
					Hash( const char *String )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Hash-Wert ueber String berechnen */
 | 
						/* Hash-Wert ueber String berechnen */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -72,7 +72,7 @@ Hash( char *String )
 | 
				
			|||||||
} /* mix */
 | 
					} /* mix */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL UINT32
 | 
					static UINT32
 | 
				
			||||||
jenkins_hash( register UINT8 *k, register UINT32 length, register UINT32 initval )
 | 
					jenkins_hash( register UINT8 *k, register UINT32 length, register UINT32 initval )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* k: the key
 | 
						/* k: the key
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,7 @@
 | 
				
			|||||||
 * (at your option) any later version.
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
					 * Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * $Id: hash.h,v 1.5 2005/03/19 18:43:48 fw Exp $
 | 
					 * $Id: hash.h,v 1.6 2006/10/06 21:23:47 fw Exp $
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Hash calculation (header)
 | 
					 * Hash calculation (header)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@@ -17,8 +17,7 @@
 | 
				
			|||||||
#ifndef __hash_h__
 | 
					#ifndef __hash_h__
 | 
				
			||||||
#define __hash_h__
 | 
					#define __hash_h__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GLOBAL UINT32 Hash PARAMS((const char *String ));
 | 
				
			||||||
GLOBAL UINT32 Hash PARAMS((char *String ));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										931
									
								
								src/ngircd/io.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										931
									
								
								src/ngircd/io.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,931 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * This program is free software; you can redistribute it and/or modify
 | 
				
			||||||
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					 * the Free Software Foundation; either version 2 of the License, or
 | 
				
			||||||
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 | 
					 * Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * I/O abstraction interface.
 | 
				
			||||||
 | 
					 * Copyright (c) 2005 Florian Westphal (westphal@foo.fh-furtwangen.de)
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "portab.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static char UNUSED id[] = "$Id: io.c,v 1.28.2.1 2008/04/03 14:16:35 fw Exp $";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <assert.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <sys/time.h>
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					#include <fcntl.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "array.h"
 | 
				
			||||||
 | 
					#include "io.h"
 | 
				
			||||||
 | 
					#include "log.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Enables extra debug messages in event add/delete/callback code. */
 | 
				
			||||||
 | 
					/* #define DEBUG_IO */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					#ifdef PROTOTYPES
 | 
				
			||||||
 | 
					 void (*callback)(int, short);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					 void (*callback)();
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					 short what;
 | 
				
			||||||
 | 
					} io_event;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define INIT_IOEVENT		{ NULL, -1, 0, NULL }
 | 
				
			||||||
 | 
					#define IO_ERROR		4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef HAVE_EPOLL_CREATE
 | 
				
			||||||
 | 
					#  define IO_USE_EPOLL		1
 | 
				
			||||||
 | 
					#  ifdef HAVE_SELECT
 | 
				
			||||||
 | 
					#    define IO_USE_SELECT	1
 | 
				
			||||||
 | 
					#  endif
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#  ifdef HAVE_KQUEUE
 | 
				
			||||||
 | 
					#    define IO_USE_KQUEUE	1
 | 
				
			||||||
 | 
					#  else
 | 
				
			||||||
 | 
					#    ifdef HAVE_SYS_DEVPOLL_H
 | 
				
			||||||
 | 
					#      define IO_USE_DEVPOLL	1
 | 
				
			||||||
 | 
					#    else
 | 
				
			||||||
 | 
					#      ifdef HAVE_POLL
 | 
				
			||||||
 | 
					#        define IO_USE_POLL	1
 | 
				
			||||||
 | 
					#      else
 | 
				
			||||||
 | 
					#        ifdef HAVE_SELECT
 | 
				
			||||||
 | 
					#          define IO_USE_SELECT	1
 | 
				
			||||||
 | 
					#        else
 | 
				
			||||||
 | 
					#          error "no IO API available!?"
 | 
				
			||||||
 | 
					#        endif /* HAVE_SELECT */
 | 
				
			||||||
 | 
					#      endif /* HAVE_POLL */
 | 
				
			||||||
 | 
					#    endif /* HAVE_SYS_DEVPOLL_H */
 | 
				
			||||||
 | 
					#  endif /* HAVE_KQUEUE */
 | 
				
			||||||
 | 
					#endif /* HAVE_EPOLL_CREATE */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static bool library_initialized = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IO_USE_EPOLL
 | 
				
			||||||
 | 
					#include <sys/epoll.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int io_masterfd = -1;
 | 
				
			||||||
 | 
					static bool io_event_change_epoll(int fd, short what, const int action);
 | 
				
			||||||
 | 
					static int io_dispatch_epoll(struct timeval *tv);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IO_USE_KQUEUE
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <sys/event.h>
 | 
				
			||||||
 | 
					static array io_evcache;
 | 
				
			||||||
 | 
					static int io_masterfd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int io_dispatch_kqueue(struct timeval *tv);
 | 
				
			||||||
 | 
					static bool io_event_change_kqueue(int, short, const int action);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IO_USE_POLL
 | 
				
			||||||
 | 
					#include <poll.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static array pollfds;
 | 
				
			||||||
 | 
					static int poll_maxfd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static bool io_event_change_poll PARAMS((int fd, short what));
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IO_USE_DEVPOLL
 | 
				
			||||||
 | 
					#include <sys/devpoll.h>
 | 
				
			||||||
 | 
					static int io_masterfd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static bool io_event_change_devpoll(int fd, short what);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IO_USE_SELECT
 | 
				
			||||||
 | 
					#include "defines.h"	/* for conn.h */
 | 
				
			||||||
 | 
					#include "conn.h"	/* for CONN_IDX (needed by resolve.h) */
 | 
				
			||||||
 | 
					#include "resolve.h"	/* for RES_STAT (needed by conf.h) */
 | 
				
			||||||
 | 
					#include "conf.h"	/* for Conf_MaxConnections */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static fd_set readers;
 | 
				
			||||||
 | 
					static fd_set writers;
 | 
				
			||||||
 | 
					static int select_maxfd;		/* the select() interface sucks badly */
 | 
				
			||||||
 | 
					static int io_dispatch_select(struct timeval *tv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef IO_USE_EPOLL
 | 
				
			||||||
 | 
					#define io_masterfd -1
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#endif /* IO_USE_SELECT */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static array io_events;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void io_docallback PARAMS((int fd, short what));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static io_event *
 | 
				
			||||||
 | 
					io_event_get(int fd)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						io_event *i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert(fd >= 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						i = (io_event *) array_get(&io_events, sizeof(io_event), (size_t) fd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert(i != NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return i;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IO_USE_DEVPOLL
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					io_library_init_devpoll(unsigned int eventsize)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						io_masterfd = open("/dev/poll", O_RDWR);
 | 
				
			||||||
 | 
						if (io_masterfd >= 0)
 | 
				
			||||||
 | 
							library_initialized = true;
 | 
				
			||||||
 | 
						Log(LOG_INFO, "IO subsystem: /dev/poll (initial maxfd %u, masterfd %d).",
 | 
				
			||||||
 | 
							eventsize, io_masterfd);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IO_USE_POLL
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					io_library_init_poll(unsigned int eventsize)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct pollfd *p;
 | 
				
			||||||
 | 
						array_init(&pollfds);
 | 
				
			||||||
 | 
						poll_maxfd = 0;
 | 
				
			||||||
 | 
						Log(LOG_INFO, "IO subsystem: poll (initial maxfd %u).",
 | 
				
			||||||
 | 
						    eventsize);
 | 
				
			||||||
 | 
						p = array_alloc(&pollfds, sizeof(struct pollfd), eventsize);
 | 
				
			||||||
 | 
						if (p) {
 | 
				
			||||||
 | 
							unsigned i;
 | 
				
			||||||
 | 
							p = array_start(&pollfds);
 | 
				
			||||||
 | 
							for (i = 0; i < eventsize; i++)
 | 
				
			||||||
 | 
								p[i].fd = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							library_initialized = true;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IO_USE_SELECT
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					io_library_init_select(unsigned int eventsize)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						Log(LOG_INFO, "IO subsystem: select (initial maxfd %u).",
 | 
				
			||||||
 | 
						    eventsize);
 | 
				
			||||||
 | 
						FD_ZERO(&readers);
 | 
				
			||||||
 | 
						FD_ZERO(&writers);
 | 
				
			||||||
 | 
					#ifdef FD_SETSIZE
 | 
				
			||||||
 | 
						if (Conf_MaxConnections >= (int)FD_SETSIZE) {
 | 
				
			||||||
 | 
							Log(LOG_WARNING,
 | 
				
			||||||
 | 
							    "MaxConnections (%d) exceeds limit (%u), changed MaxConnections to %u.",
 | 
				
			||||||
 | 
							    Conf_MaxConnections, FD_SETSIZE, FD_SETSIZE - 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Conf_MaxConnections = FD_SETSIZE - 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#endif /* FD_SETSIZE */
 | 
				
			||||||
 | 
						library_initialized = true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif /* SELECT */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IO_USE_EPOLL
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					io_library_init_epoll(unsigned int eventsize)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int ecreate_hint = (int)eventsize;
 | 
				
			||||||
 | 
						if (ecreate_hint <= 0)
 | 
				
			||||||
 | 
							ecreate_hint = 128;
 | 
				
			||||||
 | 
						io_masterfd = epoll_create(ecreate_hint);
 | 
				
			||||||
 | 
						if (io_masterfd >= 0) {
 | 
				
			||||||
 | 
							library_initialized = true;
 | 
				
			||||||
 | 
							Log(LOG_INFO,
 | 
				
			||||||
 | 
							    "IO subsystem: epoll (hint size %d, initial maxfd %u, masterfd %d).",
 | 
				
			||||||
 | 
							    ecreate_hint, eventsize, io_masterfd);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IO_USE_KQUEUE
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					io_library_init_kqueue(unsigned int eventsize)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						io_masterfd = kqueue();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Log(LOG_INFO,
 | 
				
			||||||
 | 
						    "IO subsystem: kqueue (initial maxfd %u, masterfd %d)",
 | 
				
			||||||
 | 
						    eventsize, io_masterfd);
 | 
				
			||||||
 | 
						if (io_masterfd >= 0)
 | 
				
			||||||
 | 
							library_initialized = true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool
 | 
				
			||||||
 | 
					io_library_init(unsigned int eventsize)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (library_initialized)
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
					#ifdef IO_USE_SELECT
 | 
				
			||||||
 | 
					#ifndef FD_SETSIZE
 | 
				
			||||||
 | 
						Log(LOG_WARNING,
 | 
				
			||||||
 | 
						    "FD_SETSIZE undefined, don't know how many descriptors select() can handle on your platform ...");
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						if (eventsize >= FD_SETSIZE)
 | 
				
			||||||
 | 
							eventsize = FD_SETSIZE - 1;
 | 
				
			||||||
 | 
					#endif /* FD_SETSIZE */
 | 
				
			||||||
 | 
					#endif /* IO_USE_SELECT */
 | 
				
			||||||
 | 
						if ((eventsize > 0) && !array_alloc(&io_events, sizeof(io_event), (size_t)eventsize))
 | 
				
			||||||
 | 
							eventsize = 0;
 | 
				
			||||||
 | 
					#ifdef IO_USE_EPOLL
 | 
				
			||||||
 | 
						io_library_init_epoll(eventsize);
 | 
				
			||||||
 | 
					#ifdef IO_USE_SELECT
 | 
				
			||||||
 | 
						if (io_masterfd < 0)
 | 
				
			||||||
 | 
							Log(LOG_INFO, "Can't initialize epoll() IO interface, falling back to select() ...");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef IO_USE_KQUEUE
 | 
				
			||||||
 | 
						io_library_init_kqueue(eventsize);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef IO_USE_DEVPOLL
 | 
				
			||||||
 | 
						io_library_init_devpoll(eventsize);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef IO_USE_POLL
 | 
				
			||||||
 | 
						io_library_init_poll(eventsize);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef IO_USE_SELECT
 | 
				
			||||||
 | 
						if (! library_initialized)
 | 
				
			||||||
 | 
							io_library_init_select(eventsize);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						return library_initialized;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					io_library_shutdown(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifdef IO_USE_SELECT
 | 
				
			||||||
 | 
						FD_ZERO(&readers);
 | 
				
			||||||
 | 
						FD_ZERO(&writers);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef IO_USE_EPOLL
 | 
				
			||||||
 | 
						if (io_masterfd >= 0)
 | 
				
			||||||
 | 
							close(io_masterfd);
 | 
				
			||||||
 | 
						io_masterfd = -1;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef IO_USE_KQUEUE
 | 
				
			||||||
 | 
						close(io_masterfd);
 | 
				
			||||||
 | 
						io_masterfd = -1;
 | 
				
			||||||
 | 
						array_free(&io_evcache);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						library_initialized = false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool
 | 
				
			||||||
 | 
					io_event_setcb(int fd, void (*cbfunc) (int, short))
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						io_event *i = io_event_get(fd);
 | 
				
			||||||
 | 
						if (!i)
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						i->callback = cbfunc;
 | 
				
			||||||
 | 
						return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool
 | 
				
			||||||
 | 
					io_event_create(int fd, short what, void (*cbfunc) (int, short))
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						bool ret;
 | 
				
			||||||
 | 
						io_event *i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert(fd >= 0);
 | 
				
			||||||
 | 
					#if defined(IO_USE_SELECT) && defined(FD_SETSIZE)
 | 
				
			||||||
 | 
						if (io_masterfd < 0 && fd >= FD_SETSIZE) {
 | 
				
			||||||
 | 
							Log(LOG_ERR,
 | 
				
			||||||
 | 
							    "fd %d exceeds FD_SETSIZE (%u) (select can't handle more file descriptors)",
 | 
				
			||||||
 | 
							    fd, FD_SETSIZE);
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						i = (io_event *) array_alloc(&io_events, sizeof(io_event), (size_t) fd);
 | 
				
			||||||
 | 
						if (!i) {
 | 
				
			||||||
 | 
							Log(LOG_WARNING,
 | 
				
			||||||
 | 
							    "array_alloc failed: could not allocate space for %d io_event structures",
 | 
				
			||||||
 | 
							    fd);
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						i->callback = cbfunc;
 | 
				
			||||||
 | 
						i->what = 0;
 | 
				
			||||||
 | 
					#ifdef IO_USE_DEVPOLL
 | 
				
			||||||
 | 
						ret = io_event_change_devpoll(fd, what);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef IO_USE_POLL
 | 
				
			||||||
 | 
						ret = io_event_change_poll(fd, what);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef IO_USE_EPOLL
 | 
				
			||||||
 | 
						ret = io_event_change_epoll(fd, what, EPOLL_CTL_ADD);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef IO_USE_KQUEUE
 | 
				
			||||||
 | 
						ret = io_event_change_kqueue(fd, what, EV_ADD|EV_ENABLE);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef IO_USE_SELECT
 | 
				
			||||||
 | 
						if (io_masterfd < 0)
 | 
				
			||||||
 | 
							ret = io_event_add(fd, what);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						if (ret) i->what = what;
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IO_USE_DEVPOLL
 | 
				
			||||||
 | 
					static bool
 | 
				
			||||||
 | 
					io_event_change_devpoll(int fd, short what)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct pollfd p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						p.events = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (what & IO_WANTREAD)
 | 
				
			||||||
 | 
							p.events = POLLIN | POLLPRI;
 | 
				
			||||||
 | 
						if (what & IO_WANTWRITE)
 | 
				
			||||||
 | 
							p.events |= POLLOUT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						p.fd = fd;
 | 
				
			||||||
 | 
						return write(io_masterfd, &p, sizeof p) == (ssize_t)sizeof p;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IO_USE_POLL
 | 
				
			||||||
 | 
					static bool
 | 
				
			||||||
 | 
					io_event_change_poll(int fd, short what)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct pollfd *p;
 | 
				
			||||||
 | 
						short events = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (what & IO_WANTREAD)
 | 
				
			||||||
 | 
							events = POLLIN | POLLPRI;
 | 
				
			||||||
 | 
						if (what & IO_WANTWRITE)
 | 
				
			||||||
 | 
							events |= POLLOUT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						p = array_alloc(&pollfds, sizeof *p, fd);
 | 
				
			||||||
 | 
						if (p) {
 | 
				
			||||||
 | 
							p->events = events;
 | 
				
			||||||
 | 
							p->fd = fd;
 | 
				
			||||||
 | 
							if (fd > poll_maxfd)
 | 
				
			||||||
 | 
								poll_maxfd = fd;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return p != NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IO_USE_EPOLL
 | 
				
			||||||
 | 
					static bool
 | 
				
			||||||
 | 
					io_event_change_epoll(int fd, short what, const int action)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct epoll_event ev = { 0, {0} };
 | 
				
			||||||
 | 
						ev.data.fd = fd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (what & IO_WANTREAD)
 | 
				
			||||||
 | 
							ev.events = EPOLLIN | EPOLLPRI;
 | 
				
			||||||
 | 
						if (what & IO_WANTWRITE)
 | 
				
			||||||
 | 
							ev.events |= EPOLLOUT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return epoll_ctl(io_masterfd, action, fd, &ev) == 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IO_USE_KQUEUE
 | 
				
			||||||
 | 
					static bool
 | 
				
			||||||
 | 
					io_event_kqueue_commit_cache(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct kevent *events;
 | 
				
			||||||
 | 
						bool ret;
 | 
				
			||||||
 | 
						int len = (int) array_length(&io_evcache, sizeof (struct kevent));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!len) /* nothing to do */
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert(len>0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (len < 0) {
 | 
				
			||||||
 | 
							array_free(&io_evcache);
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						events = array_start(&io_evcache);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert(events != NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ret = kevent(io_masterfd, events, len, NULL, 0, NULL) == 0;
 | 
				
			||||||
 | 
						if (ret)
 | 
				
			||||||
 | 
							array_trunc(&io_evcache);
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static bool
 | 
				
			||||||
 | 
					io_event_change_kqueue(int fd, short what, const int action)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct kevent kev;
 | 
				
			||||||
 | 
						bool ret = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (what & IO_WANTREAD) {
 | 
				
			||||||
 | 
							EV_SET(&kev, fd, EVFILT_READ, action, 0, 0, 0);
 | 
				
			||||||
 | 
							ret = array_catb(&io_evcache, (char*) &kev, sizeof (kev));
 | 
				
			||||||
 | 
							if (!ret)
 | 
				
			||||||
 | 
								ret = kevent(io_masterfd, &kev,1, NULL, 0, NULL) == 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (ret && (what & IO_WANTWRITE)) {
 | 
				
			||||||
 | 
							EV_SET(&kev, fd, EVFILT_WRITE, action, 0, 0, 0);
 | 
				
			||||||
 | 
							ret = array_catb(&io_evcache, (char*) &kev, sizeof (kev));
 | 
				
			||||||
 | 
							if (!ret)
 | 
				
			||||||
 | 
								ret = kevent(io_masterfd, &kev, 1, NULL, 0, NULL) == 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (array_length(&io_evcache, sizeof kev) >= 100)
 | 
				
			||||||
 | 
							io_event_kqueue_commit_cache();
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool
 | 
				
			||||||
 | 
					io_event_add(int fd, short what)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						io_event *i = io_event_get(fd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!i) return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ((i->what & what) == what) /* event type is already registered */
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
					#ifdef DEBUG_IO
 | 
				
			||||||
 | 
						Log(LOG_DEBUG, "io_event_add(): fd %d, what %d.", fd, what);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						i->what |= what;
 | 
				
			||||||
 | 
					#ifdef IO_USE_EPOLL
 | 
				
			||||||
 | 
						if (io_masterfd >= 0)
 | 
				
			||||||
 | 
							return io_event_change_epoll(fd, i->what, EPOLL_CTL_MOD);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IO_USE_KQUEUE
 | 
				
			||||||
 | 
						return io_event_change_kqueue(fd, what, EV_ADD | EV_ENABLE);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef IO_USE_DEVPOLL
 | 
				
			||||||
 | 
						return io_event_change_devpoll(fd, i->what);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef IO_USE_POLL
 | 
				
			||||||
 | 
						return io_event_change_poll(fd, i->what);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef IO_USE_SELECT
 | 
				
			||||||
 | 
						if (fd > select_maxfd)
 | 
				
			||||||
 | 
							select_maxfd = fd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (what & IO_WANTREAD)
 | 
				
			||||||
 | 
							FD_SET(fd, &readers);
 | 
				
			||||||
 | 
						if (what & IO_WANTWRITE)
 | 
				
			||||||
 | 
							FD_SET(fd, &writers);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return true;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool
 | 
				
			||||||
 | 
					io_setnonblock(int fd)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int flags = fcntl(fd, F_GETFL);
 | 
				
			||||||
 | 
						if (flags == -1)
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef O_NONBLOCK
 | 
				
			||||||
 | 
					#define O_NONBLOCK O_NDELAY
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						flags |= O_NONBLOCK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return fcntl(fd, F_SETFL, flags) == 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IO_USE_DEVPOLL
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					io_close_devpoll(int fd)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct pollfd p;
 | 
				
			||||||
 | 
						p.events = POLLREMOVE;
 | 
				
			||||||
 | 
						p.fd = fd;
 | 
				
			||||||
 | 
						write(io_masterfd, &p, sizeof p);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					static inline void
 | 
				
			||||||
 | 
					io_close_devpoll(int UNUSED x)
 | 
				
			||||||
 | 
					{ 
 | 
				
			||||||
 | 
						/* NOTHING */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IO_USE_POLL
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					io_close_poll(int fd)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct pollfd *p;
 | 
				
			||||||
 | 
						p = array_get(&pollfds, sizeof *p, fd);
 | 
				
			||||||
 | 
						if (!p) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						p->fd = -1;
 | 
				
			||||||
 | 
						if (fd == poll_maxfd) {
 | 
				
			||||||
 | 
							while (poll_maxfd > 0) {
 | 
				
			||||||
 | 
								--poll_maxfd;
 | 
				
			||||||
 | 
								p = array_get(&pollfds, sizeof *p, poll_maxfd);
 | 
				
			||||||
 | 
								if (p && p->fd >= 0)
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					static inline void io_close_poll(int UNUSED x) { /* NOTHING */ }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IO_USE_SELECT
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					io_close_select(int fd)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						io_event *i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (io_masterfd >= 0)	/* Are we using epoll()? */
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						FD_CLR(fd, &writers);
 | 
				
			||||||
 | 
						FD_CLR(fd, &readers);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						i = io_event_get(fd);
 | 
				
			||||||
 | 
						if (!i) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (fd == select_maxfd) {
 | 
				
			||||||
 | 
							while (select_maxfd>0) {
 | 
				
			||||||
 | 
								--select_maxfd; /* find largest fd */
 | 
				
			||||||
 | 
								i = io_event_get(select_maxfd);
 | 
				
			||||||
 | 
								if (i && i->callback) break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					static inline void
 | 
				
			||||||
 | 
					io_close_select(int UNUSED x)
 | 
				
			||||||
 | 
					{ 
 | 
				
			||||||
 | 
						/* NOTHING */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool
 | 
				
			||||||
 | 
					io_close(int fd)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						io_event *i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						i = io_event_get(fd);
 | 
				
			||||||
 | 
					#ifdef IO_USE_KQUEUE
 | 
				
			||||||
 | 
						if (array_length(&io_evcache, sizeof (struct kevent)))	/* pending data in cache? */
 | 
				
			||||||
 | 
							io_event_kqueue_commit_cache();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* both kqueue and epoll remove fd from all sets automatically on the last close
 | 
				
			||||||
 | 
						 * of the descriptor. since we don't know if this is the last close we'll have
 | 
				
			||||||
 | 
						 * to remove the set explicitly. */
 | 
				
			||||||
 | 
						if (i) {
 | 
				
			||||||
 | 
							io_event_change_kqueue(fd, i->what, EV_DELETE);
 | 
				
			||||||
 | 
							io_event_kqueue_commit_cache();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						io_close_devpoll(fd);
 | 
				
			||||||
 | 
						io_close_poll(fd);
 | 
				
			||||||
 | 
						io_close_select(fd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IO_USE_EPOLL
 | 
				
			||||||
 | 
						io_event_change_epoll(fd, 0, EPOLL_CTL_DEL);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						if (i) {
 | 
				
			||||||
 | 
							i->callback = NULL;
 | 
				
			||||||
 | 
							i->what = 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return close(fd) == 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool
 | 
				
			||||||
 | 
					io_event_del(int fd, short what)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						io_event *i = io_event_get(fd);
 | 
				
			||||||
 | 
					#ifdef DEBUG_IO
 | 
				
			||||||
 | 
						Log(LOG_DEBUG, "io_event_del(): trying to delete eventtype %d on fd %d", what, fd);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						if (!i) return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!(i->what & what)) /* event is already disabled */
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						i->what &= ~what;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IO_USE_DEVPOLL
 | 
				
			||||||
 | 
						return io_event_change_devpoll(fd, i->what);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef IO_USE_POLL
 | 
				
			||||||
 | 
						return io_event_change_poll(fd, i->what);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef IO_USE_EPOLL
 | 
				
			||||||
 | 
						if (io_masterfd >= 0)
 | 
				
			||||||
 | 
							return io_event_change_epoll(fd, i->what, EPOLL_CTL_MOD);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IO_USE_KQUEUE
 | 
				
			||||||
 | 
						return io_event_change_kqueue(fd, what, EV_DISABLE);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef IO_USE_SELECT
 | 
				
			||||||
 | 
						if (what & IO_WANTWRITE)
 | 
				
			||||||
 | 
							FD_CLR(fd, &writers);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (what & IO_WANTREAD)
 | 
				
			||||||
 | 
							FD_CLR(fd, &readers);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return true;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IO_USE_SELECT
 | 
				
			||||||
 | 
					static int
 | 
				
			||||||
 | 
					io_dispatch_select(struct timeval *tv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						fd_set readers_tmp = readers;
 | 
				
			||||||
 | 
						fd_set writers_tmp = writers;
 | 
				
			||||||
 | 
						short what;
 | 
				
			||||||
 | 
						int ret, i;
 | 
				
			||||||
 | 
						int fds_ready;
 | 
				
			||||||
 | 
						ret = select(select_maxfd + 1, &readers_tmp, &writers_tmp, NULL, tv);
 | 
				
			||||||
 | 
						if (ret <= 0)
 | 
				
			||||||
 | 
							return ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fds_ready = ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 0; i <= select_maxfd; i++) {
 | 
				
			||||||
 | 
							what = 0;
 | 
				
			||||||
 | 
							if (FD_ISSET(i, &readers_tmp)) {
 | 
				
			||||||
 | 
								what = IO_WANTREAD;
 | 
				
			||||||
 | 
								fds_ready--;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (FD_ISSET(i, &writers_tmp)) {
 | 
				
			||||||
 | 
								what |= IO_WANTWRITE;
 | 
				
			||||||
 | 
								fds_ready--;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (what)
 | 
				
			||||||
 | 
								io_docallback(i, what);
 | 
				
			||||||
 | 
							if (fds_ready <= 0)
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IO_USE_DEVPOLL
 | 
				
			||||||
 | 
					static int
 | 
				
			||||||
 | 
					io_dispatch_devpoll(struct timeval *tv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct dvpoll dvp;
 | 
				
			||||||
 | 
						time_t sec = tv->tv_sec * 1000;
 | 
				
			||||||
 | 
						int i, total, ret, timeout = tv->tv_usec + sec;
 | 
				
			||||||
 | 
						short what;
 | 
				
			||||||
 | 
						struct pollfd p[100];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (timeout < 0)
 | 
				
			||||||
 | 
							timeout = 1000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						total = 0;
 | 
				
			||||||
 | 
						do {
 | 
				
			||||||
 | 
							dvp.dp_timeout = timeout;
 | 
				
			||||||
 | 
							dvp.dp_nfds = 100;
 | 
				
			||||||
 | 
							dvp.dp_fds = p;
 | 
				
			||||||
 | 
							ret = ioctl(io_masterfd, DP_POLL, &dvp);
 | 
				
			||||||
 | 
							total += ret;
 | 
				
			||||||
 | 
							if (ret <= 0)
 | 
				
			||||||
 | 
								return total;
 | 
				
			||||||
 | 
							for (i=0; i < ret ; i++) {
 | 
				
			||||||
 | 
								what = 0;
 | 
				
			||||||
 | 
								if (p[i].revents & (POLLIN|POLLPRI))
 | 
				
			||||||
 | 
									what = IO_WANTREAD;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (p[i].revents & POLLOUT)
 | 
				
			||||||
 | 
									what |= IO_WANTWRITE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (p[i].revents && !what) {
 | 
				
			||||||
 | 
									/* other flag is set, probably POLLERR */
 | 
				
			||||||
 | 
									what = IO_ERROR;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								io_docallback(p[i].fd, what);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} while (ret == 100);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return total;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IO_USE_POLL
 | 
				
			||||||
 | 
					static int
 | 
				
			||||||
 | 
					io_dispatch_poll(struct timeval *tv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						time_t sec = tv->tv_sec * 1000;
 | 
				
			||||||
 | 
						int i, ret, timeout = tv->tv_usec + sec;
 | 
				
			||||||
 | 
						int fds_ready;
 | 
				
			||||||
 | 
						short what;
 | 
				
			||||||
 | 
						struct pollfd *p = array_start(&pollfds);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (timeout < 0)
 | 
				
			||||||
 | 
							timeout = 1000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ret = poll(p, poll_maxfd + 1, timeout);
 | 
				
			||||||
 | 
						if (ret <= 0)
 | 
				
			||||||
 | 
							return ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fds_ready = ret;
 | 
				
			||||||
 | 
						for (i=0; i <= poll_maxfd; i++) {
 | 
				
			||||||
 | 
							what = 0;
 | 
				
			||||||
 | 
							if (p[i].revents & (POLLIN|POLLPRI))
 | 
				
			||||||
 | 
								what = IO_WANTREAD;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (p[i].revents & POLLOUT)
 | 
				
			||||||
 | 
								what |= IO_WANTWRITE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (p[i].revents && !what) {
 | 
				
			||||||
 | 
								/* other flag is set, probably POLLERR */
 | 
				
			||||||
 | 
								what = IO_ERROR;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (what) {
 | 
				
			||||||
 | 
								fds_ready--;
 | 
				
			||||||
 | 
								io_docallback(i, what);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (fds_ready <= 0)
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IO_USE_EPOLL
 | 
				
			||||||
 | 
					static int
 | 
				
			||||||
 | 
					io_dispatch_epoll(struct timeval *tv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						time_t sec = tv->tv_sec * 1000;
 | 
				
			||||||
 | 
						int i, total = 0, ret, timeout = tv->tv_usec + sec;
 | 
				
			||||||
 | 
						struct epoll_event epoll_ev[100];
 | 
				
			||||||
 | 
						short type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (timeout < 0)
 | 
				
			||||||
 | 
							timeout = 1000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						do {
 | 
				
			||||||
 | 
							ret = epoll_wait(io_masterfd, epoll_ev, 100, timeout);
 | 
				
			||||||
 | 
							total += ret;
 | 
				
			||||||
 | 
							if (ret <= 0)
 | 
				
			||||||
 | 
								return total;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for (i = 0; i < ret; i++) {
 | 
				
			||||||
 | 
								type = 0;
 | 
				
			||||||
 | 
								if (epoll_ev[i].events & (EPOLLERR | EPOLLHUP))
 | 
				
			||||||
 | 
									type = IO_ERROR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (epoll_ev[i].events & (EPOLLIN | EPOLLPRI))
 | 
				
			||||||
 | 
									type |= IO_WANTREAD;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (epoll_ev[i].events & EPOLLOUT)
 | 
				
			||||||
 | 
									type |= IO_WANTWRITE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								io_docallback(epoll_ev[i].data.fd, type);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							timeout = 0;
 | 
				
			||||||
 | 
						} while (ret == 100);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return total;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IO_USE_KQUEUE
 | 
				
			||||||
 | 
					static int
 | 
				
			||||||
 | 
					io_dispatch_kqueue(struct timeval *tv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i, total = 0, ret;
 | 
				
			||||||
 | 
						struct kevent kev[100];
 | 
				
			||||||
 | 
						struct kevent *newevents;
 | 
				
			||||||
 | 
						struct timespec ts;
 | 
				
			||||||
 | 
						int newevents_len;
 | 
				
			||||||
 | 
						ts.tv_sec = tv->tv_sec;
 | 
				
			||||||
 | 
						ts.tv_nsec = tv->tv_usec * 1000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						do {
 | 
				
			||||||
 | 
							newevents_len = (int) array_length(&io_evcache, sizeof (struct kevent));
 | 
				
			||||||
 | 
							newevents = (newevents_len > 0) ? array_start(&io_evcache) : NULL;
 | 
				
			||||||
 | 
							assert(newevents_len >= 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ret = kevent(io_masterfd, newevents, newevents_len, kev, 100, &ts);
 | 
				
			||||||
 | 
							if (newevents && ret != -1)
 | 
				
			||||||
 | 
								array_trunc(&io_evcache);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							total += ret;
 | 
				
			||||||
 | 
							if (ret <= 0)
 | 
				
			||||||
 | 
								return total;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for (i = 0; i < ret; i++) {
 | 
				
			||||||
 | 
					#ifdef DEBUG_IO
 | 
				
			||||||
 | 
								LogDebug("fd %d, kev.flags: %x", (int)kev[i].ident, kev[i].flags);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
								if (kev[i].flags & (EV_EOF|EV_ERROR)) {
 | 
				
			||||||
 | 
									if (kev[i].flags & EV_ERROR)
 | 
				
			||||||
 | 
										Log(LOG_ERR, "kevent fd %d: EV_ERROR (%s)",
 | 
				
			||||||
 | 
											(int)kev[i].ident, strerror((int)kev[i].data));
 | 
				
			||||||
 | 
									io_docallback((int)kev[i].ident, IO_ERROR);
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								switch (kev[i].filter) {
 | 
				
			||||||
 | 
								case EVFILT_READ:
 | 
				
			||||||
 | 
									io_docallback((int)kev[i].ident, IO_WANTREAD);
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								case EVFILT_WRITE:
 | 
				
			||||||
 | 
									io_docallback((int)kev[i].ident, IO_WANTWRITE);
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								default:
 | 
				
			||||||
 | 
									LogDebug("Unknown kev.filter number %d for fd %d",
 | 
				
			||||||
 | 
										kev[i].filter, kev[i].ident);
 | 
				
			||||||
 | 
									/* Fall through */
 | 
				
			||||||
 | 
								case EV_ERROR:
 | 
				
			||||||
 | 
									io_docallback((int)kev[i].ident, IO_ERROR);
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							ts.tv_sec = 0;
 | 
				
			||||||
 | 
							ts.tv_nsec = 0;
 | 
				
			||||||
 | 
						} while (ret == 100);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return total;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					io_dispatch(struct timeval *tv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifdef IO_USE_EPOLL
 | 
				
			||||||
 | 
						if (io_masterfd >= 0)
 | 
				
			||||||
 | 
							return io_dispatch_epoll(tv);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef IO_USE_SELECT
 | 
				
			||||||
 | 
						return io_dispatch_select(tv);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef IO_USE_KQUEUE
 | 
				
			||||||
 | 
						return io_dispatch_kqueue(tv);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef IO_USE_DEVPOLL
 | 
				
			||||||
 | 
						return io_dispatch_devpoll(tv);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef IO_USE_POLL
 | 
				
			||||||
 | 
						return io_dispatch_poll(tv);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* call the callback function inside the struct matching fd */
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					io_docallback(int fd, short what)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						io_event *i;
 | 
				
			||||||
 | 
					#ifdef DEBUG_IO
 | 
				
			||||||
 | 
						Log(LOG_DEBUG, "doing callback for fd %d, what %d", fd, what);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						i = io_event_get(fd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (i->callback) {	/* callback might be NULL if a previous callback function
 | 
				
			||||||
 | 
									   called io_close on this fd */
 | 
				
			||||||
 | 
							i->callback(fd, (what & IO_ERROR) ? i->what : what);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						/* if error indicator is set, we return the event(s) that were registered */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										51
									
								
								src/ngircd/io.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								src/ngircd/io.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * This program is free software; you can redistribute it and/or modify
 | 
				
			||||||
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					 * the Free Software Foundation; either version 2 of the License, or
 | 
				
			||||||
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 | 
					 * Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * I/O abstraction interface header
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * $Id: io.h,v 1.4 2006/12/25 22:53:52 alex Exp $
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef io_H_included
 | 
				
			||||||
 | 
					#define io_H_included
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "portab.h"
 | 
				
			||||||
 | 
					#include <sys/time.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define IO_WANTREAD	1
 | 
				
			||||||
 | 
					#define IO_WANTWRITE	2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* init library.
 | 
				
			||||||
 | 
					   sets up epoll/kqueue descriptors and tries to allocate space for ioevlen
 | 
				
			||||||
 | 
					   file descriptors. ioevlen is just the _initial_ size, not a limit. */
 | 
				
			||||||
 | 
					bool io_library_init PARAMS((unsigned int ioevlen));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* shutdown and free all internal data structures */
 | 
				
			||||||
 | 
					void io_library_shutdown PARAMS((void));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* add fd to internal set, enable readability check, set callback */
 | 
				
			||||||
 | 
					bool io_event_create PARAMS((int fd, short what, void (*cbfunc)(int, short)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* change callback function associated with fd */
 | 
				
			||||||
 | 
					bool io_event_setcb PARAMS((int fd, void (*cbfunc)(int, short)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* watch fd for event of type what */
 | 
				
			||||||
 | 
					bool io_event_add PARAMS((int fd, short what));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* do not watch fd for event of type what */
 | 
				
			||||||
 | 
					bool io_event_del PARAMS((int fd, short what));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* remove fd from watchlist, close() fd.  */
 | 
				
			||||||
 | 
					bool io_close PARAMS((int fd));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* set O_NONBLOCK */
 | 
				
			||||||
 | 
					bool io_setnonblock PARAMS((int fd));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* watch fds for activity */
 | 
				
			||||||
 | 
					int io_dispatch PARAMS((struct timeval *tv));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* io_H_included */
 | 
				
			||||||
@@ -14,7 +14,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "portab.h"
 | 
					#include "portab.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char UNUSED id[] = "$Id: irc-channel.c,v 1.30 2005/06/12 18:23:59 alex Exp $";
 | 
					static char UNUSED id[] = "$Id: irc-channel.c,v 1.40.2.2 2008/02/26 12:07:41 fw Exp $";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "imp.h"
 | 
					#include "imp.h"
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
@@ -43,16 +43,18 @@ static char UNUSED id[] = "$Id: irc-channel.c,v 1.30 2005/06/12 18:23:59 alex Ex
 | 
				
			|||||||
GLOBAL bool
 | 
					GLOBAL bool
 | 
				
			||||||
IRC_JOIN( CLIENT *Client, REQUEST *Req )
 | 
					IRC_JOIN( CLIENT *Client, REQUEST *Req )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char *channame, *key, *flags, *topic, modes[8];
 | 
						char *channame, *channame_ptr, *key, *key_ptr, *flags, *topic, modes[8];
 | 
				
			||||||
	bool is_new_chan, is_invited, is_banned;
 | 
						bool is_new_chan, is_invited, is_banned;
 | 
				
			||||||
	CLIENT *target;
 | 
						CLIENT *target;
 | 
				
			||||||
	CHANNEL *chan;
 | 
						CHANNEL *chan;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
	assert( Client != NULL );
 | 
						assert( Client != NULL );
 | 
				
			||||||
	assert( Req != NULL );
 | 
						assert( Req != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Bad number of arguments? */
 | 
						/* Bad number of arguments? */
 | 
				
			||||||
	if(( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
						if (Req->argc < 1 || Req->argc > 2)
 | 
				
			||||||
 | 
							return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
				
			||||||
 | 
										  Client_ID(Client), Req->command);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Who is the sender? */
 | 
						/* Who is the sender? */
 | 
				
			||||||
	if( Client_Type( Client ) == CLIENT_SERVER ) target = Client_Search( Req->prefix );
 | 
						if( Client_Type( Client ) == CLIENT_SERVER ) target = Client_Search( Req->prefix );
 | 
				
			||||||
@@ -60,44 +62,51 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
	if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
 | 
						if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Are channel keys given? */
 | 
						/* Are channel keys given? */
 | 
				
			||||||
	if( Req->argc > 1 ) key = Req->argv[1];
 | 
						if (Req->argc > 1) {
 | 
				
			||||||
	else key = NULL;
 | 
							key = Req->argv[1];
 | 
				
			||||||
 | 
							key_ptr = strchr(key, ',');
 | 
				
			||||||
 | 
							if (key_ptr) *key_ptr = '\0';
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							key = key_ptr = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						channame = Req->argv[0];
 | 
				
			||||||
 | 
						channame_ptr = strchr(channame, ',');
 | 
				
			||||||
 | 
						if (channame_ptr) *channame_ptr = '\0';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Channel-Namen durchgehen */
 | 
						/* Channel-Namen durchgehen */
 | 
				
			||||||
	chan = NULL;
 | 
						while (channame)
 | 
				
			||||||
	channame = strtok( Req->argv[0], "," );
 | 
					 | 
				
			||||||
	while( channame )
 | 
					 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		chan = NULL; flags = NULL;
 | 
							chan = NULL; flags = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* wird der Channel neu angelegt? */
 | 
							if (Client_Type(Client) == CLIENT_SERVER) {
 | 
				
			||||||
		if( Channel_Search( channame )) is_new_chan = false;
 | 
					 | 
				
			||||||
		else is_new_chan = true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		/* Hat ein Server Channel-User-Modes uebergeben? */
 | 
					 | 
				
			||||||
		if( Client_Type( Client ) == CLIENT_SERVER )
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			/* Channel-Flags extrahieren */
 | 
					 | 
				
			||||||
			flags = strchr( channame, 0x7 );
 | 
								flags = strchr( channame, 0x7 );
 | 
				
			||||||
			if( flags )
 | 
								if( flags ) {
 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				*flags = '\0';
 | 
									*flags = '\0';
 | 
				
			||||||
				flags++;
 | 
									flags++;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* wird der Channel neu angelegt? */
 | 
				
			||||||
 | 
							if( Channel_Search( channame )) {
 | 
				
			||||||
 | 
								is_new_chan = false;
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								if (Conf_PredefChannelsOnly) { /* this server does not allow creation of channels */
 | 
				
			||||||
 | 
									IRC_WriteStrClient( Client, ERR_BANNEDFROMCHAN_MSG, Client_ID( Client ), channame );
 | 
				
			||||||
 | 
									/* Try next name, if any */
 | 
				
			||||||
 | 
									channame = strchr(channame, ',');
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								is_new_chan = true;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Local client? */
 | 
							/* Local client? */
 | 
				
			||||||
		if( Client_Type( Client ) == CLIENT_USER )
 | 
							if( Client_Type( Client ) == CLIENT_USER )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			/* Test if the user has reached his maximum channel count */
 | 
								/* Test if the user has reached his maximum channel count */
 | 
				
			||||||
			if( Client_Type( Client ) == CLIENT_USER )
 | 
								if(( Conf_MaxJoins > 0 ) && ( Channel_CountForUser( Client ) >= Conf_MaxJoins ))
 | 
				
			||||||
			{
 | 
									return IRC_WriteStrClient( Client, ERR_TOOMANYCHANNELS_MSG,
 | 
				
			||||||
				if(( Conf_MaxJoins > 0 ) && ( Channel_CountForUser( Client ) >= Conf_MaxJoins ))
 | 
												Client_ID( Client ), channame );
 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
					IRC_WriteStrClient( Client, ERR_TOOMANYCHANNELS_MSG, Client_ID( Client ), channame );
 | 
					 | 
				
			||||||
					return CONNECTED;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
			/* Existiert der Channel bereits, oder wird er im Moment neu erzeugt? */
 | 
								/* Existiert der Channel bereits, oder wird er im Moment neu erzeugt? */
 | 
				
			||||||
			if( is_new_chan )
 | 
								if( is_new_chan )
 | 
				
			||||||
@@ -111,8 +120,8 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
				chan = Channel_Search( channame );
 | 
									chan = Channel_Search( channame );
 | 
				
			||||||
				assert( chan != NULL );
 | 
									assert( chan != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				is_banned = Lists_CheckBanned( target, chan );
 | 
									is_banned = Lists_Check(Channel_GetListBans(chan), target );
 | 
				
			||||||
				is_invited = Lists_CheckInvited( target, chan );
 | 
									is_invited = Lists_Check(Channel_GetListInvites(chan), target );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				/* Testen, ob Client gebanned ist */
 | 
									/* Testen, ob Client gebanned ist */
 | 
				
			||||||
				if(( is_banned == true) &&  ( is_invited == false ))
 | 
									if(( is_banned == true) &&  ( is_invited == false ))
 | 
				
			||||||
@@ -121,7 +130,7 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
					IRC_WriteStrClient( Client, ERR_BANNEDFROMCHAN_MSG, Client_ID( Client ), channame );
 | 
										IRC_WriteStrClient( Client, ERR_BANNEDFROMCHAN_MSG, Client_ID( Client ), channame );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					/* Try next name, if any */
 | 
										/* Try next name, if any */
 | 
				
			||||||
					channame = strtok( NULL, "," );
 | 
										channame = strchr(channame, ',');
 | 
				
			||||||
					continue;
 | 
										continue;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -132,7 +141,7 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
					IRC_WriteStrClient( Client, ERR_INVITEONLYCHAN_MSG, Client_ID( Client ), channame );
 | 
										IRC_WriteStrClient( Client, ERR_INVITEONLYCHAN_MSG, Client_ID( Client ), channame );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					/* Try next name, if any */
 | 
										/* Try next name, if any */
 | 
				
			||||||
					channame = strtok( NULL, "," );
 | 
										channame = strchr(channame, ',');
 | 
				
			||||||
					continue;
 | 
										continue;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -143,7 +152,7 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
					IRC_WriteStrClient( Client, ERR_BADCHANNELKEY_MSG, Client_ID( Client ), channame );
 | 
										IRC_WriteStrClient( Client, ERR_BADCHANNELKEY_MSG, Client_ID( Client ), channame );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					/* Try next name, if any */
 | 
										/* Try next name, if any */
 | 
				
			||||||
					channame = strtok( NULL, "," );
 | 
										channame = strchr(channame, ',');
 | 
				
			||||||
					continue;
 | 
										continue;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -154,7 +163,7 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
					IRC_WriteStrClient( Client, ERR_CHANNELISFULL_MSG, Client_ID( Client ), channame );
 | 
										IRC_WriteStrClient( Client, ERR_CHANNELISFULL_MSG, Client_ID( Client ), channame );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					/* Try next name, if any */
 | 
										/* Try next name, if any */
 | 
				
			||||||
					channame = strtok( NULL, "," );
 | 
										channame = strchr(channame, ',');
 | 
				
			||||||
					continue;
 | 
										continue;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -167,14 +176,14 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
			 * commands) in this list become deleted when a user
 | 
								 * commands) in this list become deleted when a user
 | 
				
			||||||
			 * joins a channel this way. */
 | 
								 * joins a channel this way. */
 | 
				
			||||||
			chan = Channel_Search( channame );
 | 
								chan = Channel_Search( channame );
 | 
				
			||||||
			if( chan != NULL ) (void)Lists_CheckInvited( target, chan );
 | 
								if( chan != NULL ) (void)Lists_Check(Channel_GetListInvites(chan), target);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Channel joinen (und ggf. anlegen) */
 | 
							/* Channel joinen (und ggf. anlegen) */
 | 
				
			||||||
		if( ! Channel_Join( target, channame ))
 | 
							if( ! Channel_Join( target, channame ))
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			/* naechsten Namen ermitteln */
 | 
								/* naechsten Namen ermitteln */
 | 
				
			||||||
			channame = strtok( NULL, "," );
 | 
								channame = strchr(channame, ',');
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if( ! chan ) chan = Channel_Search( channame );
 | 
							if( ! chan ) chan = Channel_Search( channame );
 | 
				
			||||||
@@ -211,17 +220,37 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
			/* an Client bestaetigen */
 | 
								/* an Client bestaetigen */
 | 
				
			||||||
			IRC_WriteStrClientPrefix( Client, target, "JOIN :%s", channame );
 | 
								IRC_WriteStrClientPrefix( Client, target, "JOIN :%s", channame );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			/* Topic an Client schicken */
 | 
								/* Send topic to client, if any */
 | 
				
			||||||
			topic = Channel_Topic( chan );
 | 
								topic = Channel_Topic(chan);
 | 
				
			||||||
			if( *topic ) IRC_WriteStrClient( Client, RPL_TOPIC_MSG, Client_ID( Client ), channame, topic );
 | 
								if (*topic) {
 | 
				
			||||||
 | 
									IRC_WriteStrClient(Client, RPL_TOPIC_MSG,
 | 
				
			||||||
 | 
										Client_ID(Client), channame, topic);
 | 
				
			||||||
 | 
					#ifndef STRICT_RFC
 | 
				
			||||||
 | 
									IRC_WriteStrClient(Client, RPL_TOPICSETBY_MSG,
 | 
				
			||||||
 | 
										Client_ID(Client), channame,
 | 
				
			||||||
 | 
										Channel_TopicWho(chan),
 | 
				
			||||||
 | 
										Channel_TopicTime(chan));
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			/* Mitglieder an Client Melden */
 | 
								/* Mitglieder an Client Melden */
 | 
				
			||||||
			IRC_Send_NAMES( Client, chan );
 | 
								IRC_Send_NAMES( Client, chan );
 | 
				
			||||||
			IRC_WriteStrClient( Client, RPL_ENDOFNAMES_MSG, Client_ID( Client ), Channel_Name( chan ));
 | 
								IRC_WriteStrClient( Client, RPL_ENDOFNAMES_MSG, Client_ID( Client ), Channel_Name( chan ));
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* naechsten Namen ermitteln */
 | 
							/* next channel? */
 | 
				
			||||||
		channame = strtok( NULL, "," );
 | 
							channame = channame_ptr;
 | 
				
			||||||
 | 
							if (channame) {
 | 
				
			||||||
 | 
								channame++;
 | 
				
			||||||
 | 
								channame_ptr = strchr(channame, ',');
 | 
				
			||||||
 | 
								if (channame_ptr) *channame_ptr = '\0';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (key_ptr) {
 | 
				
			||||||
 | 
									key = ++key_ptr;
 | 
				
			||||||
 | 
									key_ptr = strchr(key, ',');
 | 
				
			||||||
 | 
									if (key_ptr) *key_ptr = '\0';
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return CONNECTED;
 | 
						return CONNECTED;
 | 
				
			||||||
} /* IRC_JOIN */
 | 
					} /* IRC_JOIN */
 | 
				
			||||||
@@ -236,8 +265,9 @@ IRC_PART( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
	assert( Client != NULL );
 | 
						assert( Client != NULL );
 | 
				
			||||||
	assert( Req != NULL );
 | 
						assert( Req != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Falsche Anzahl Parameter? */
 | 
						if (Req->argc < 1 || Req->argc > 2)
 | 
				
			||||||
	if(( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
							return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
				
			||||||
 | 
										Client_ID(Client), Req->command);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Wer ist der Absender? */
 | 
						/* Wer ist der Absender? */
 | 
				
			||||||
	if( Client_Type( Client ) == CLIENT_SERVER ) target = Client_Search( Req->prefix );
 | 
						if( Client_Type( Client ) == CLIENT_SERVER ) target = Client_Search( Req->prefix );
 | 
				
			||||||
@@ -245,18 +275,11 @@ IRC_PART( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
	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 */
 | 
						/* Channel-Namen durchgehen */
 | 
				
			||||||
	chan = strtok( Req->argv[0], "," );
 | 
						chan = strtok(Req->argv[0], ",");
 | 
				
			||||||
	while( chan )
 | 
						while (chan) {
 | 
				
			||||||
	{
 | 
							Channel_Part(target, Client, chan, Req->argc > 1 ? Req->argv[1] : Client_ID(target));
 | 
				
			||||||
		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, ",");
 | 
				
			||||||
		chan = strtok( NULL, "," );
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return CONNECTED;
 | 
						return CONNECTED;
 | 
				
			||||||
} /* IRC_PART */
 | 
					} /* IRC_PART */
 | 
				
			||||||
@@ -268,6 +291,7 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
	CHANNEL *chan;
 | 
						CHANNEL *chan;
 | 
				
			||||||
	CLIENT *from;
 | 
						CLIENT *from;
 | 
				
			||||||
	char *topic;
 | 
						char *topic;
 | 
				
			||||||
 | 
						bool r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert( Client != NULL );
 | 
						assert( Client != NULL );
 | 
				
			||||||
	assert( Req != NULL );
 | 
						assert( Req != NULL );
 | 
				
			||||||
@@ -288,10 +312,22 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if( Req->argc == 1 )
 | 
						if( Req->argc == 1 )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		/* Topic erfragen */
 | 
							/* Request actual topic */
 | 
				
			||||||
		topic = Channel_Topic( chan );
 | 
							topic = Channel_Topic(chan);
 | 
				
			||||||
		if( *topic ) return IRC_WriteStrClient( from, RPL_TOPIC_MSG, Client_ID( from ), Channel_Name( chan ), topic );
 | 
							if (*topic) {
 | 
				
			||||||
		else return IRC_WriteStrClient( from, RPL_NOTOPIC_MSG, Client_ID( from ), Channel_Name( chan ));
 | 
								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' ))
 | 
						if( strchr( Channel_Modes( chan ), 't' ))
 | 
				
			||||||
@@ -300,9 +336,11 @@ 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 ));
 | 
							if( ! strchr( Channel_UserModes( chan, from ), 'o' )) return IRC_WriteStrClient( from, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( from ), Channel_Name( chan ));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Topic setzen */
 | 
						/* Set new topic */
 | 
				
			||||||
	Channel_SetTopic( chan, Req->argv[1] );
 | 
						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>" );
 | 
						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 */
 | 
						/* im Channel bekannt machen und an Server weiterleiten */
 | 
				
			||||||
	IRC_WriteStrServersPrefix( Client, from, "TOPIC %s :%s", Req->argv[0], Req->argv[1] );
 | 
						IRC_WriteStrServersPrefix( Client, from, "TOPIC %s :%s", Req->argv[0], Req->argv[1] );
 | 
				
			||||||
@@ -454,7 +492,7 @@ IRC_CHANINFO( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
			{
 | 
								{
 | 
				
			||||||
				if( *ptr == 'l' )
 | 
									if( *ptr == 'l' )
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					snprintf( l, sizeof( l ), " %ld", Channel_MaxUsers( chan ));
 | 
										snprintf( l, sizeof( l ), " %lu", Channel_MaxUsers( chan ));
 | 
				
			||||||
					strlcat( modes_add, l, sizeof( modes_add ));
 | 
										strlcat( modes_add, l, sizeof( modes_add ));
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				if( *ptr == 'k' )
 | 
									if( *ptr == 'k' )
 | 
				
			||||||
@@ -478,8 +516,9 @@ IRC_CHANINFO( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
		if(( ! *ptr ) && ( Req->argv[arg_topic][0] ))
 | 
							if(( ! *ptr ) && ( Req->argv[arg_topic][0] ))
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			/* OK, there is no topic jet */
 | 
								/* OK, there is no topic jet */
 | 
				
			||||||
			Channel_SetTopic( chan, Req->argv[arg_topic] );
 | 
								Channel_SetTopic(chan, Client, Req->argv[arg_topic]);
 | 
				
			||||||
			IRC_WriteStrChannelPrefix( Client, chan, from, false, "TOPIC %s :%s", Req->argv[0], Channel_Topic( chan ));
 | 
								IRC_WriteStrChannelPrefix(Client, chan, from, false,
 | 
				
			||||||
 | 
								     "TOPIC %s :%s", Req->argv[0], Channel_Topic(chan));
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "portab.h"
 | 
					#include "portab.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char UNUSED id[] = "$Id: irc-info.c,v 1.30 2005/06/17 19:15:43 fw Exp $";
 | 
					static char UNUSED id[] = "$Id: irc-info.c,v 1.41.2.1 2008/02/26 12:06:57 fw Exp $";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "imp.h"
 | 
					#include "imp.h"
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
@@ -335,6 +335,41 @@ IRC_NAMES( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
} /* IRC_NAMES */
 | 
					} /* IRC_NAMES */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static unsigned int
 | 
				
			||||||
 | 
					t_diff(time_t *t, const time_t div)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						time_t diff, remain;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						diff = *t / div;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						remain = diff * div;
 | 
				
			||||||
 | 
						*t -= remain;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return diff;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static unsigned int
 | 
				
			||||||
 | 
					uptime_days(time_t *now)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return t_diff(now, 60 * 60 * 24);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static unsigned int
 | 
				
			||||||
 | 
					uptime_hrs(time_t *now)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return t_diff(now, 60 * 60);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static unsigned int
 | 
				
			||||||
 | 
					uptime_mins(time_t *now)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						 return t_diff(now, 60);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool
 | 
					GLOBAL bool
 | 
				
			||||||
IRC_STATS( CLIENT *Client, REQUEST *Req )
 | 
					IRC_STATS( CLIENT *Client, REQUEST *Req )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -342,75 +377,94 @@ IRC_STATS( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
	CONN_ID con;
 | 
						CONN_ID con;
 | 
				
			||||||
	char query;
 | 
						char query;
 | 
				
			||||||
	COMMAND *cmd;
 | 
						COMMAND *cmd;
 | 
				
			||||||
 | 
						time_t time_now;
 | 
				
			||||||
 | 
						unsigned int days, hrs, mins;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert( Client != NULL );
 | 
						assert( Client != NULL );
 | 
				
			||||||
	assert( Req != NULL );
 | 
						assert( Req != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Falsche Anzahl Parameter? */
 | 
						/* Falsche Anzahl Parameter? */
 | 
				
			||||||
	if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
						if (Req->argc > 2)
 | 
				
			||||||
 | 
							return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* From aus Prefix ermitteln */
 | 
						/* From aus Prefix ermitteln */
 | 
				
			||||||
	if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
 | 
						if (Client_Type(Client) == CLIENT_SERVER)
 | 
				
			||||||
	else from = Client;
 | 
							from = Client_Search(Req->prefix);
 | 
				
			||||||
	if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
 | 
						else
 | 
				
			||||||
 | 
							from = Client;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if( Req->argc == 2 )
 | 
						if (! from)
 | 
				
			||||||
	{
 | 
							return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (Req->argc == 2) {
 | 
				
			||||||
		/* an anderen Server forwarden */
 | 
							/* an anderen Server forwarden */
 | 
				
			||||||
		target = Client_Search( Req->argv[1] );
 | 
							target = Client_Search( Req->argv[1] );
 | 
				
			||||||
		if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER )) return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG, Client_ID( from ), Req->argv[1] );
 | 
							if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER ))
 | 
				
			||||||
 | 
								return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG, Client_ID( from ), Req->argv[1] );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if( target != Client_ThisServer( ))
 | 
							if( target != Client_ThisServer()) {
 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			/* Ok, anderer Server ist das Ziel: forwarden */
 | 
								/* Ok, anderer Server ist das Ziel: forwarden */
 | 
				
			||||||
			return IRC_WriteStrClientPrefix( target, from, "STATS %s %s", Req->argv[0], Req->argv[1] );
 | 
								return IRC_WriteStrClientPrefix( target, from, "STATS %s %s", Req->argv[0], Req->argv[1] );
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if( Req->argc > 0 ) query = Req->argv[0][0] ? Req->argv[0][0] : '*';
 | 
						if (Req->argc > 0)
 | 
				
			||||||
	else query = '*';
 | 
							query = Req->argv[0][0] ? Req->argv[0][0] : '*';
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							query = '*';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch ( query )
 | 
						switch (query) {
 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		case 'l':	/* Links */
 | 
							case 'l':	/* Links */
 | 
				
			||||||
		case 'L':
 | 
							case 'L':
 | 
				
			||||||
			con = Conn_First( );
 | 
								time_now = time(NULL);
 | 
				
			||||||
			while( con != NONE )
 | 
								for (con = Conn_First(); con != NONE ;con = Conn_Next(con)) {
 | 
				
			||||||
			{
 | 
									cl = Conn_GetClient(con);
 | 
				
			||||||
				cl = Client_GetFromConn( con );
 | 
									if (!cl)
 | 
				
			||||||
				if( cl && (( Client_Type( cl ) == CLIENT_SERVER ) || ( cl == Client )))
 | 
										continue;
 | 
				
			||||||
				{
 | 
									if ((Client_Type(cl) == CLIENT_SERVER) || (cl == Client)) {
 | 
				
			||||||
					/* Server link or our own connection */
 | 
										/* Server link or our own connection */
 | 
				
			||||||
#ifdef ZLIB
 | 
					#ifdef ZLIB
 | 
				
			||||||
					if( Conn_Options( con ) & CONN_ZIP )
 | 
										if (Conn_Options(con) & CONN_ZIP) {
 | 
				
			||||||
					{
 | 
											if (!IRC_WriteStrClient(from, RPL_STATSLINKINFOZIP_MSG,
 | 
				
			||||||
						if( ! IRC_WriteStrClient( from, RPL_STATSLINKINFOZIP_MSG, Client_ID( from ), Client_Mask( cl ), Conn_SendQ( con ), Conn_SendMsg( con ), Zip_SendBytes( con ), Conn_SendBytes( con ), Conn_RecvMsg( con ), Zip_RecvBytes( con ), Conn_RecvBytes( con ), (long)( time( NULL ) - Conn_StartTime( con )))) return DISCONNECTED;
 | 
												Client_ID(from), Client_Mask(cl), Conn_SendQ(con),
 | 
				
			||||||
 | 
												Conn_SendMsg(con), Zip_SendBytes(con), Conn_SendBytes(con),
 | 
				
			||||||
 | 
												Conn_RecvMsg(con), Zip_RecvBytes(con), Conn_RecvBytes(con), (long)(time_now - Conn_StartTime(con))))
 | 
				
			||||||
 | 
													return DISCONNECTED;
 | 
				
			||||||
 | 
											continue;
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					else
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
					{
 | 
										if (!IRC_WriteStrClient(from, RPL_STATSLINKINFO_MSG, Client_ID(from),
 | 
				
			||||||
						if( ! IRC_WriteStrClient( from, RPL_STATSLINKINFO_MSG, Client_ID( from ), Client_Mask( cl ), Conn_SendQ( con ), Conn_SendMsg( con ), Conn_SendBytes( con ), Conn_RecvMsg( con ), Conn_RecvBytes( con ), (long)( time( NULL ) - Conn_StartTime( con )))) return DISCONNECTED;
 | 
											Client_Mask(cl), Conn_SendQ(con), Conn_SendMsg(con), Conn_SendBytes(con),
 | 
				
			||||||
					}
 | 
											Conn_RecvMsg(con), Conn_RecvBytes(con), (long)(time_now - Conn_StartTime(con))))
 | 
				
			||||||
 | 
												return DISCONNECTED;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				con = Conn_Next( con );
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case 'm':	/* IRC-Befehle */
 | 
							case 'm':	/* IRC-Commands */
 | 
				
			||||||
		case 'M':
 | 
							case 'M':
 | 
				
			||||||
			cmd = Parse_GetCommandStruct( );
 | 
								cmd = Parse_GetCommandStruct( );
 | 
				
			||||||
			while( cmd->name )
 | 
								for (; cmd->name ; cmd++) {
 | 
				
			||||||
			{
 | 
									if (cmd->lcount == 0 && cmd->rcount == 0)
 | 
				
			||||||
				if( cmd->lcount > 0 || cmd->rcount > 0 )
 | 
										continue;
 | 
				
			||||||
				{
 | 
									if (!IRC_WriteStrClient(from, RPL_STATSCOMMANDS_MSG, Client_ID(from),
 | 
				
			||||||
					if( ! IRC_WriteStrClient( from, RPL_STATSCOMMANDS_MSG, Client_ID( from ), cmd->name, cmd->lcount, cmd->bytes, cmd->rcount )) return DISCONNECTED;
 | 
											cmd->name, cmd->lcount, cmd->bytes, cmd->rcount))
 | 
				
			||||||
				}
 | 
												return DISCONNECTED;
 | 
				
			||||||
				cmd++;
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
							case 'u':	/* server uptime */
 | 
				
			||||||
 | 
							case 'U':
 | 
				
			||||||
 | 
								time_now = time(NULL) - NGIRCd_Start;
 | 
				
			||||||
 | 
								days = uptime_days(&time_now);
 | 
				
			||||||
 | 
								hrs = uptime_hrs(&time_now);
 | 
				
			||||||
 | 
								mins = uptime_mins(&time_now);
 | 
				
			||||||
 | 
								if (!IRC_WriteStrClient(from, RPL_STATSUPTIME, Client_ID(from),
 | 
				
			||||||
 | 
										days, hrs, mins, (unsigned int) time_now))
 | 
				
			||||||
 | 
											return DISCONNECTED;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	IRC_SetPenalty( from, 2 );
 | 
						IRC_SetPenalty(from, 2);
 | 
				
			||||||
	return IRC_WriteStrClient( from, RPL_ENDOFSTATS_MSG, Client_ID( from ), query );
 | 
						return IRC_WriteStrClient(from, RPL_ENDOFSTATS_MSG, Client_ID(from), query);
 | 
				
			||||||
} /* IRC_STATS */
 | 
					} /* IRC_STATS */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -542,7 +596,8 @@ GLOBAL bool
 | 
				
			|||||||
IRC_WHO( CLIENT *Client, REQUEST *Req )
 | 
					IRC_WHO( CLIENT *Client, REQUEST *Req )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	bool ok, only_ops;
 | 
						bool ok, only_ops;
 | 
				
			||||||
	char flags[8], *ptr;
 | 
						char flags[8];
 | 
				
			||||||
 | 
						const char *ptr;
 | 
				
			||||||
	CL2CHAN *cl2chan;
 | 
						CL2CHAN *cl2chan;
 | 
				
			||||||
	CHANNEL *chan, *cn;
 | 
						CHANNEL *chan, *cn;
 | 
				
			||||||
	CLIENT *c;
 | 
						CLIENT *c;
 | 
				
			||||||
@@ -593,7 +648,11 @@ IRC_WHO( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
			if( ok && (( ! only_ops ) || ( strchr( Client_Modes( c ), 'o' ))))
 | 
								if( ok && (( ! only_ops ) || ( strchr( Client_Modes( c ), 'o' ))))
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				/* Get flags */
 | 
									/* Get flags */
 | 
				
			||||||
				strcpy( flags, "H" );
 | 
									if (strchr(Client_Modes( c ), 'a'))
 | 
				
			||||||
 | 
										strcpy(flags, "G"); /* away */
 | 
				
			||||||
 | 
									else
 | 
				
			||||||
 | 
										strcpy(flags, "H");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if( strchr( Client_Modes( c ), 'o' )) strlcat( flags, "*", sizeof( flags ));
 | 
									if( strchr( Client_Modes( c ), 'o' )) strlcat( flags, "*", sizeof( flags ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				/* Search suitable channel */
 | 
									/* Search suitable channel */
 | 
				
			||||||
@@ -706,10 +765,13 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
		if( ! IRC_WriteStrClient( from, RPL_WHOISOPERATOR_MSG, Client_ID( from ), Client_ID( c ))) return DISCONNECTED;
 | 
							if( ! IRC_WriteStrClient( from, RPL_WHOISOPERATOR_MSG, Client_ID( from ), Client_ID( c ))) return DISCONNECTED;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Idle (only local clients) */
 | 
						/* Idle and signon time (local clients only!) */
 | 
				
			||||||
	if( Client_Conn( c ) > NONE )
 | 
						if (Client_Conn(c) > NONE ) {
 | 
				
			||||||
	{
 | 
							if (! IRC_WriteStrClient(from, RPL_WHOISIDLE_MSG,
 | 
				
			||||||
		if( ! IRC_WriteStrClient( from, RPL_WHOISIDLE_MSG, Client_ID( from ), Client_ID( c ), Conn_GetIdle( Client_Conn ( c )))) return DISCONNECTED;
 | 
								Client_ID(from), Client_ID(c),
 | 
				
			||||||
 | 
								(unsigned long)Conn_GetIdle(Client_Conn(c)),
 | 
				
			||||||
 | 
								(unsigned long)Conn_GetSignon(Client_Conn(c))))
 | 
				
			||||||
 | 
									return DISCONNECTED;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Away? */
 | 
						/* Away? */
 | 
				
			||||||
@@ -832,7 +894,10 @@ IRC_WHOWAS( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
GLOBAL bool
 | 
					GLOBAL bool
 | 
				
			||||||
IRC_Send_LUSERS( CLIENT *Client )
 | 
					IRC_Send_LUSERS( CLIENT *Client )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	long cnt;
 | 
						unsigned long cnt;
 | 
				
			||||||
 | 
					#ifndef STRICT_RFC
 | 
				
			||||||
 | 
						unsigned long max;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert( Client != NULL );
 | 
						assert( Client != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -861,56 +926,81 @@ IRC_Send_LUSERS( CLIENT *Client )
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#ifndef STRICT_RFC
 | 
					#ifndef STRICT_RFC
 | 
				
			||||||
	/* Maximum number of local users */
 | 
						/* Maximum number of local users */
 | 
				
			||||||
	if( ! IRC_WriteStrClient( Client, RPL_LOCALUSERS_MSG, Client_ID( Client ), Client_MyUserCount( ), Client_MyMaxUserCount( ))) return DISCONNECTED;
 | 
						cnt = Client_MyUserCount();
 | 
				
			||||||
 | 
						max = Client_MyMaxUserCount();
 | 
				
			||||||
 | 
						if (! IRC_WriteStrClient(Client, RPL_LOCALUSERS_MSG, Client_ID(Client),
 | 
				
			||||||
 | 
								cnt, max, cnt, max))
 | 
				
			||||||
 | 
							return DISCONNECTED;
 | 
				
			||||||
	/* Maximum number of users in the network */
 | 
						/* Maximum number of users in the network */
 | 
				
			||||||
	if( ! IRC_WriteStrClient( Client, RPL_NETUSERS_MSG, Client_ID( Client ), Client_UserCount( ), Client_MaxUserCount( ))) return DISCONNECTED;
 | 
						cnt = Client_UserCount();
 | 
				
			||||||
 | 
						max = Client_MaxUserCount();
 | 
				
			||||||
 | 
						if(! IRC_WriteStrClient(Client, RPL_NETUSERS_MSG, Client_ID(Client),
 | 
				
			||||||
 | 
								cnt, max, cnt, max))
 | 
				
			||||||
 | 
							return DISCONNECTED;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	return CONNECTED;
 | 
						return CONNECTED;
 | 
				
			||||||
} /* IRC_Send_LUSERS */
 | 
					} /* IRC_Send_LUSERS */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static bool
 | 
				
			||||||
 | 
					Show_MOTD_Start(CLIENT *Client)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return IRC_WriteStrClient(Client, RPL_MOTDSTART_MSG,
 | 
				
			||||||
 | 
							Client_ID( Client ), Client_ID( Client_ThisServer( )));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static bool
 | 
				
			||||||
 | 
					Show_MOTD_Sendline(CLIENT *Client, const char *msg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return IRC_WriteStrClient(Client, RPL_MOTD_MSG, Client_ID( Client ), msg);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static bool
 | 
				
			||||||
 | 
					Show_MOTD_End(CLIENT *Client)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return IRC_WriteStrClient( Client, RPL_ENDOFMOTD_MSG, Client_ID( Client ));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool
 | 
					GLOBAL bool
 | 
				
			||||||
IRC_Show_MOTD( CLIENT *Client )
 | 
					IRC_Show_MOTD( CLIENT *Client )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	bool ok;
 | 
					 | 
				
			||||||
	char line[127];
 | 
						char line[127];
 | 
				
			||||||
	FILE *fd;
 | 
						FILE *fd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert( Client != NULL );
 | 
						assert( Client != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if( Conf_MotdPhrase[0] )
 | 
						if (Conf_MotdPhrase[0]) {
 | 
				
			||||||
	{
 | 
							if (!Show_MOTD_Start(Client))
 | 
				
			||||||
		if( ! IRC_WriteStrClient( Client, RPL_MOTDSTART_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )))) return DISCONNECTED;
 | 
								return DISCONNECTED;
 | 
				
			||||||
		if( ! IRC_WriteStrClient( Client, RPL_MOTD_MSG, Client_ID( Client ), Conf_MotdPhrase )) return DISCONNECTED;
 | 
							if (!Show_MOTD_Sendline(Client, Conf_MotdPhrase))
 | 
				
			||||||
		return IRC_WriteStrClient( Client, RPL_ENDOFMOTD_MSG, Client_ID( Client ));
 | 
								return DISCONNECTED;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return Show_MOTD_End(Client);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fd = fopen( Conf_MotdFile, "r" );
 | 
						fd = fopen( Conf_MotdFile, "r" );
 | 
				
			||||||
	if( ! fd )
 | 
						if( ! fd ) {
 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		Log( LOG_WARNING, "Can't read MOTD file \"%s\": %s", Conf_MotdFile, strerror( errno ));
 | 
							Log( LOG_WARNING, "Can't read MOTD file \"%s\": %s", Conf_MotdFile, strerror( errno ));
 | 
				
			||||||
		return IRC_WriteStrClient( Client, ERR_NOMOTD_MSG, Client_ID( Client ) );
 | 
							return IRC_WriteStrClient( Client, ERR_NOMOTD_MSG, Client_ID( Client ) );
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if( ! IRC_WriteStrClient( Client, RPL_MOTDSTART_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )))) return DISCONNECTED;
 | 
						if (!Show_MOTD_Start( Client )) {
 | 
				
			||||||
	while( true )
 | 
							fclose(fd);
 | 
				
			||||||
	{
 | 
							return false;
 | 
				
			||||||
		if( ! fgets( line, sizeof( line ), fd )) break;
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while (fgets( line, (int)sizeof line, fd )) {
 | 
				
			||||||
		ngt_TrimLastChr( line, '\n');
 | 
							ngt_TrimLastChr( line, '\n');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if( ! IRC_WriteStrClient( Client, RPL_MOTD_MSG, Client_ID( Client ), line ))
 | 
							if( ! Show_MOTD_Sendline( Client, line)) {
 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			fclose( fd );
 | 
								fclose( fd );
 | 
				
			||||||
			return false;
 | 
								return false;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	ok = IRC_WriteStrClient( Client, RPL_ENDOFMOTD_MSG, Client_ID( Client ) );
 | 
						fclose(fd);
 | 
				
			||||||
 | 
						return Show_MOTD_End(Client);
 | 
				
			||||||
	fclose( fd );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return ok;
 | 
					 | 
				
			||||||
} /* IRC_Show_MOTD */
 | 
					} /* IRC_Show_MOTD */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -996,10 +1086,12 @@ IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, bool OnlyOps )
 | 
				
			|||||||
		if( strchr( Client_Modes( c ), 'i' )) is_visible = false;
 | 
							if( strchr( Client_Modes( c ), 'i' )) is_visible = false;
 | 
				
			||||||
		else is_visible = true;
 | 
							else is_visible = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if( is_member || is_visible )
 | 
							if( is_member || is_visible ) {
 | 
				
			||||||
		{
 | 
								if (strchr(Client_Modes( c ), 'a'))
 | 
				
			||||||
			/* Flags zusammenbasteln */
 | 
									strcpy(flags, "G"); /* away */
 | 
				
			||||||
			strcpy( flags, "H" );
 | 
								else
 | 
				
			||||||
 | 
									strcpy(flags, "H");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if( strchr( Client_Modes( c ), 'o' )) strlcat( flags, "*", sizeof( flags ));
 | 
								if( strchr( Client_Modes( c ), 'o' )) strlcat( flags, "*", sizeof( flags ));
 | 
				
			||||||
			if( strchr( Channel_UserModes( Chan, c ), 'o' )) strlcat( flags, "@", sizeof( flags ));
 | 
								if( strchr( Channel_UserModes( Chan, c ), 'o' )) strlcat( flags, "@", sizeof( flags ));
 | 
				
			||||||
			else if( strchr( Channel_UserModes( Chan, c ), 'v' )) strlcat( flags, "+", sizeof( flags ));
 | 
								else if( strchr( Channel_UserModes( Chan, c ), 'v' )) strlcat( flags, "+", sizeof( flags ));
 | 
				
			||||||
@@ -1018,4 +1110,22 @@ IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, bool OnlyOps )
 | 
				
			|||||||
} /* IRC_Send_WHO */
 | 
					} /* IRC_Send_WHO */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Send the ISUPPORT numeric (005).
 | 
				
			||||||
 | 
					 * This numeric indicates the features that are supported by this server.
 | 
				
			||||||
 | 
					 * See <http://www.irc.org/tech_docs/005.html> for details.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					GLOBAL bool
 | 
				
			||||||
 | 
					IRC_Send_ISUPPORT PARAMS((CLIENT * Client))
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (!IRC_WriteStrClient(Client, RPL_ISUPPORT1_MSG, Client_ID(Client),
 | 
				
			||||||
 | 
									Conf_MaxJoins))
 | 
				
			||||||
 | 
							return DISCONNECTED;
 | 
				
			||||||
 | 
						return IRC_WriteStrClient(Client, RPL_ISUPPORT2_MSG, Client_ID(Client),
 | 
				
			||||||
 | 
									  CHANNEL_NAME_LEN - 1, Conf_MaxNickLength - 1,
 | 
				
			||||||
 | 
									  COMMAND_LEN - 23, CLIENT_AWAY_LEN - 1,
 | 
				
			||||||
 | 
									  COMMAND_LEN - 113);
 | 
				
			||||||
 | 
					} /* IRC_Send_ISUPPORT */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* -eof- */
 | 
					/* -eof- */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,7 @@
 | 
				
			|||||||
 * (at your option) any later version.
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
					 * Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * $Id: irc-info.h,v 1.3 2005/03/19 18:43:48 fw Exp $
 | 
					 * $Id: irc-info.h,v 1.4 2007/11/21 12:16:36 alex Exp $
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * IRC info commands (header)
 | 
					 * IRC info commands (header)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@@ -36,6 +36,7 @@ GLOBAL bool IRC_Send_LUSERS PARAMS(( CLIENT *Client ));
 | 
				
			|||||||
GLOBAL bool IRC_Send_NAMES PARAMS(( CLIENT *Client, CHANNEL *Chan ));
 | 
					GLOBAL bool IRC_Send_NAMES PARAMS(( CLIENT *Client, CHANNEL *Chan ));
 | 
				
			||||||
GLOBAL bool IRC_Show_MOTD PARAMS(( CLIENT *Client ));
 | 
					GLOBAL bool IRC_Show_MOTD PARAMS(( CLIENT *Client ));
 | 
				
			||||||
GLOBAL bool IRC_Send_WHO PARAMS(( CLIENT *Client, CHANNEL *Chan, bool OnlyOps ));
 | 
					GLOBAL bool IRC_Send_WHO PARAMS(( CLIENT *Client, CHANNEL *Chan, bool OnlyOps ));
 | 
				
			||||||
 | 
					GLOBAL bool IRC_Send_ISUPPORT PARAMS(( CLIENT *Client ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "portab.h"
 | 
					#include "portab.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char UNUSED id[] = "$Id: irc-login.c,v 1.44 2005/06/04 12:32:09 fw Exp $";
 | 
					static char UNUSED id[] = "$Id: irc-login.c,v 1.54.2.1 2008/02/05 11:48:37 fw Exp $";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "imp.h"
 | 
					#include "imp.h"
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
@@ -41,105 +41,123 @@ static char UNUSED id[] = "$Id: irc-login.c,v 1.44 2005/06/04 12:32:09 fw Exp $"
 | 
				
			|||||||
#include "irc-login.h"
 | 
					#include "irc-login.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL bool Hello_User PARAMS(( CLIENT *Client ));
 | 
					static bool Hello_User PARAMS(( CLIENT *Client ));
 | 
				
			||||||
LOCAL void Kill_Nick PARAMS(( char *Nick, char *Reason ));
 | 
					static void Kill_Nick PARAMS(( char *Nick, char *Reason ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Handler for the IRC command "PASS".
 | 
				
			||||||
 | 
					 * See RFC 2813 section 4.1.1, and RFC 2812 section 3.1.1.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
GLOBAL bool
 | 
					GLOBAL bool
 | 
				
			||||||
IRC_PASS( CLIENT *Client, REQUEST *Req )
 | 
					IRC_PASS( CLIENT *Client, REQUEST *Req )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						char *type, *orig_flags;
 | 
				
			||||||
 | 
						int protohigh, protolow;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert( Client != NULL );
 | 
						assert( Client != NULL );
 | 
				
			||||||
	assert( Req != NULL );
 | 
						assert( Req != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Fehler liefern, wenn kein lokaler Client */
 | 
						/* 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_Conn(Client) <= NONE)
 | 
				
			||||||
 | 
							return IRC_WriteStrClient(Client, ERR_UNKNOWNCOMMAND_MSG,
 | 
				
			||||||
 | 
										  Client_ID(Client), Req->command);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	if(( Client_Type( Client ) == CLIENT_UNKNOWN ) && ( Req->argc == 1))
 | 
						if (Client_Type(Client) == CLIENT_UNKNOWN && Req->argc == 1) {
 | 
				
			||||||
	{
 | 
							/* Not yet registered "unknown" connection, PASS with one
 | 
				
			||||||
		/* noch nicht registrierte unbekannte Verbindung */
 | 
							 * argument: either a regular client, service, or server
 | 
				
			||||||
		Log( LOG_DEBUG, "Connection %d: got PASS command ...", Client_Conn( Client ));
 | 
							 * using the old RFC 1459 section 4.1.1 syntax. */
 | 
				
			||||||
 | 
							LogDebug("Connection %d: got PASS command ...",
 | 
				
			||||||
		/* Passwort speichern */
 | 
								 Client_Conn(Client));
 | 
				
			||||||
		Client_SetPassword( Client, Req->argv[0] );
 | 
						} else if ((Client_Type(Client) == CLIENT_UNKNOWN ||
 | 
				
			||||||
 | 
							    Client_Type(Client) == CLIENT_UNKNOWNSERVER) &&
 | 
				
			||||||
		Client_SetType( Client, CLIENT_GOTPASS );
 | 
							   (Req->argc == 3 || Req->argc == 4)) {
 | 
				
			||||||
		return CONNECTED;
 | 
							/* Not yet registered "unknown" connection or outgoing server
 | 
				
			||||||
 | 
							 * link, PASS with three or four argument: server using the
 | 
				
			||||||
 | 
							 * RFC 2813 section 4.1.1 syntax. */
 | 
				
			||||||
 | 
							LogDebug("Connection %d: got PASS command (new server link) ...",
 | 
				
			||||||
 | 
								 Client_Conn(Client));
 | 
				
			||||||
 | 
						} else if (Client_Type(Client) == CLIENT_UNKNOWN ||
 | 
				
			||||||
 | 
							   Client_Type(Client) == CLIENT_UNKNOWNSERVER) {
 | 
				
			||||||
 | 
							/* Unregistered connection, but wrong number of arguments: */
 | 
				
			||||||
 | 
							return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
				
			||||||
 | 
										  Client_ID(Client), Req->command);
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							/* Registered connection, PASS command is not allowed! */
 | 
				
			||||||
 | 
							return IRC_WriteStrClient(Client, ERR_ALREADYREGISTRED_MSG,
 | 
				
			||||||
 | 
										  Client_ID(Client));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else if((( Client_Type( Client ) == CLIENT_UNKNOWN ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER )) && (( Req->argc == 3 ) || ( Req->argc == 4 )))
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		char c2, c4, *type, *impl, *serverver, *flags, *ptr, *ircflags;
 | 
					 | 
				
			||||||
		int protohigh, protolow;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* noch nicht registrierte Server-Verbindung */
 | 
						Client_SetPassword(Client, Req->argv[0]);
 | 
				
			||||||
		Log( LOG_DEBUG, "Connection %d: got PASS command (new server link) ...", Client_Conn( Client ));
 | 
						Client_SetType(Client, CLIENT_GOTPASS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Passwort speichern */
 | 
						/* Protocol version */
 | 
				
			||||||
		Client_SetPassword( Client, Req->argv[0] );
 | 
						if (Req->argc >= 2 && strlen(Req->argv[1]) >= 4) {
 | 
				
			||||||
 | 
							int c2, c4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Protokollversion ermitteln */
 | 
							c2 = Req->argv[1][2];
 | 
				
			||||||
		if( strlen( Req->argv[1] ) >= 4 )
 | 
							c4 = Req->argv[1][4];
 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			c2 = Req->argv[1][2];
 | 
					 | 
				
			||||||
			c4 = Req->argv[1][4];
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
			Req->argv[1][4] = '\0';
 | 
							Req->argv[1][4] = '\0';
 | 
				
			||||||
			protolow = atoi( &Req->argv[1][2] );
 | 
							protolow = atoi(&Req->argv[1][2]);
 | 
				
			||||||
			Req->argv[1][2] = '\0';
 | 
							Req->argv[1][2] = '\0';
 | 
				
			||||||
			protohigh = atoi( Req->argv[1] );
 | 
							protohigh = atoi(Req->argv[1]);
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			Req->argv[1][2] = c2;
 | 
							Req->argv[1][2] = c2;
 | 
				
			||||||
			Req->argv[1][4] = c4;
 | 
							Req->argv[1][4] = c4;
 | 
				
			||||||
		}			
 | 
						} else
 | 
				
			||||||
		else protohigh = protolow = 0;
 | 
							protohigh = protolow = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Protokoll-Typ */
 | 
						/* Protocol type, see doc/Protocol.txt */
 | 
				
			||||||
		if( strlen( Req->argv[1] ) > 4 ) type = &Req->argv[1][4];
 | 
						if (Req->argc >= 2 && strlen(Req->argv[1]) > 4)
 | 
				
			||||||
		else type = NULL;
 | 
							type = &Req->argv[1][4];
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							type = NULL;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/* Protocol flags/options */
 | 
				
			||||||
 | 
						if (Req->argc >= 4)
 | 
				
			||||||
 | 
							orig_flags = Req->argv[3];
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							orig_flags = "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* IRC-Flags (nach RFC 2813) */
 | 
						/* Implementation, version and IRC+ flags */
 | 
				
			||||||
		if( Req->argc >= 4 ) ircflags = Req->argv[3];
 | 
						if (Req->argc >= 3) {
 | 
				
			||||||
		else ircflags = "";
 | 
							char *impl, *ptr, *serverver, *flags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Implementation, Version und ngIRCd-Flags */
 | 
					 | 
				
			||||||
		impl = Req->argv[2];
 | 
							impl = Req->argv[2];
 | 
				
			||||||
		ptr = strchr( impl, '|' );
 | 
							ptr = strchr(impl, '|');
 | 
				
			||||||
		if( ptr ) *ptr = '\0';
 | 
							if (ptr)
 | 
				
			||||||
 | 
								*ptr = '\0';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if( type && ( strcmp( type, PROTOIRCPLUS ) == 0 ))
 | 
							if (type && strcmp(type, PROTOIRCPLUS) == 0) {
 | 
				
			||||||
		{
 | 
								/* The peer seems to be a server which supports the
 | 
				
			||||||
			/* auf der anderen Seite laeuft ein Server, der
 | 
								 * IRC+ protocol (see doc/Protocol.txt). */
 | 
				
			||||||
			 * ebenfalls das IRC+-Protokoll versteht */
 | 
					 | 
				
			||||||
			serverver = ptr + 1;
 | 
								serverver = ptr + 1;
 | 
				
			||||||
			flags = strchr( serverver, ':' );
 | 
								flags = strchr(serverver, ':');
 | 
				
			||||||
			if( flags )
 | 
								if (flags) {
 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				*flags = '\0';
 | 
									*flags = '\0';
 | 
				
			||||||
				flags++;
 | 
									flags++;
 | 
				
			||||||
			}
 | 
								} else
 | 
				
			||||||
			else flags = "";
 | 
									flags = "";
 | 
				
			||||||
			Log( LOG_INFO, "Peer announces itself as %s-%s using protocol %d.%d/IRC+ (flags: \"%s\").", impl, serverver, protohigh, protolow, flags );
 | 
								Log(LOG_INFO,
 | 
				
			||||||
		}
 | 
								    "Peer announces itself as %s-%s using protocol %d.%d/IRC+ (flags: \"%s\").",
 | 
				
			||||||
		else
 | 
								    impl, serverver, protohigh, protolow, flags);
 | 
				
			||||||
		{
 | 
							} else {
 | 
				
			||||||
			/* auf der anderen Seite laeuft ein Server, der
 | 
								/* The peer seems to be a server supporting the
 | 
				
			||||||
			 * nur das Originalprotokoll unterstuetzt */
 | 
								 * "original" IRC protocol (RFC 2813). */
 | 
				
			||||||
			serverver = "";
 | 
								serverver = "";
 | 
				
			||||||
			if( strchr( ircflags, 'Z' )) flags = "Z";
 | 
								if (strchr(orig_flags, 'Z'))
 | 
				
			||||||
			else flags = "";
 | 
									flags = "Z";
 | 
				
			||||||
			Log( LOG_INFO, "Peer announces itself as \"%s\" using protocol %d.%d (flags: \"%s\").", impl, protohigh, protolow, flags );
 | 
								else
 | 
				
			||||||
 | 
									flags = "";
 | 
				
			||||||
 | 
								Log(LOG_INFO,
 | 
				
			||||||
 | 
								    "Peer announces itself as \"%s\" using protocol %d.%d (flags: \"%s\").",
 | 
				
			||||||
 | 
								    impl, protohigh, protolow, flags);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							Client_SetFlags(Client, flags);
 | 
				
			||||||
		Client_SetType( Client, CLIENT_GOTPASSSERVER );
 | 
					 | 
				
			||||||
		Client_SetFlags( Client, flags );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		return CONNECTED;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else if(( Client_Type( Client ) == CLIENT_UNKNOWN  ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER ))
 | 
					
 | 
				
			||||||
	{
 | 
						return CONNECTED;
 | 
				
			||||||
		/* 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 ));
 | 
					 | 
				
			||||||
} /* IRC_PASS */
 | 
					} /* IRC_PASS */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -268,13 +286,13 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
						   "NICK :%s", Req->argv[0] );
 | 
											   "NICK :%s", Req->argv[0] );
 | 
				
			||||||
			IRC_WriteStrRelatedPrefix( target, target, false,
 | 
								IRC_WriteStrRelatedPrefix( target, target, false,
 | 
				
			||||||
						   "NICK :%s", Req->argv[0] );
 | 
											   "NICK :%s", Req->argv[0] );
 | 
				
			||||||
			
 | 
					
 | 
				
			||||||
			/* Register old nickname for WHOWAS queries */
 | 
								/* Register old nickname for WHOWAS queries */
 | 
				
			||||||
			Client_RegisterWhowas( target );
 | 
								Client_RegisterWhowas( target );
 | 
				
			||||||
				
 | 
					
 | 
				
			||||||
			/* Save new nickname */
 | 
								/* Save new nickname */
 | 
				
			||||||
			Client_SetID( target, Req->argv[0] );
 | 
								Client_SetID( target, Req->argv[0] );
 | 
				
			||||||
			
 | 
					
 | 
				
			||||||
			IRC_SetPenalty( target, 2 );
 | 
								IRC_SetPenalty( target, 2 );
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -427,77 +445,134 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool
 | 
					GLOBAL bool
 | 
				
			||||||
IRC_PING( CLIENT *Client, REQUEST *Req )
 | 
					IRC_PING(CLIENT *Client, REQUEST *Req)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	CLIENT *target, *from;
 | 
						CLIENT *target, *from;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert( Client != NULL );
 | 
						assert(Client != NULL);
 | 
				
			||||||
	assert( Req != NULL );
 | 
						assert(Req != NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Falsche Anzahl Parameter? */
 | 
						/* Wrong number of arguments? */
 | 
				
			||||||
	if( Req->argc < 1 ) return IRC_WriteStrClient( Client, ERR_NOORIGIN_MSG, Client_ID( Client ));
 | 
						if (Req->argc < 1)
 | 
				
			||||||
 | 
							return IRC_WriteStrClient(Client, ERR_NOORIGIN_MSG,
 | 
				
			||||||
 | 
										  Client_ID(Client));
 | 
				
			||||||
#ifdef STRICT_RFC
 | 
					#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
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if( Req->argc > 1 )
 | 
						if (Req->argc > 1) {
 | 
				
			||||||
	{
 | 
							/* A target has been specified ... */
 | 
				
			||||||
		/* es wurde ein Ziel-Client angegeben */
 | 
							target = Client_Search(Req->argv[1]);
 | 
				
			||||||
		target = Client_Search( Req->argv[1] );
 | 
					
 | 
				
			||||||
		if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] );
 | 
							if (!target || Client_Type(target) != CLIENT_SERVER)
 | 
				
			||||||
		if( target != Client_ThisServer( ))
 | 
								return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
 | 
				
			||||||
		{
 | 
										Client_ID(Client), Req->argv[1]);
 | 
				
			||||||
			/* ok, forwarden */
 | 
					
 | 
				
			||||||
			if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
 | 
							if (target != Client_ThisServer()) {
 | 
				
			||||||
			else from = Client;
 | 
								/* Ok, we have to forward the PING */
 | 
				
			||||||
			if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix );
 | 
								if (Client_Type(Client) == CLIENT_SERVER)
 | 
				
			||||||
			return IRC_WriteStrClientPrefix( target, from, "PING %s :%s", Client_ID( from ), Req->argv[1] );
 | 
									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 ));
 | 
						if (Client_Type(Client) == CLIENT_SERVER) {
 | 
				
			||||||
	return IRC_WriteStrClient( Client, "PONG %s :%s", Client_ID( Client_ThisServer( )), Client_ID( Client ));
 | 
							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 */
 | 
					} /* IRC_PING */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool
 | 
					GLOBAL bool
 | 
				
			||||||
IRC_PONG( CLIENT *Client, REQUEST *Req )
 | 
					IRC_PONG(CLIENT *Client, REQUEST *Req)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	CLIENT *target, *from;
 | 
						CLIENT *target, *from;
 | 
				
			||||||
 | 
						char *s;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert( Client != NULL );
 | 
						assert(Client != NULL);
 | 
				
			||||||
	assert( Req != NULL );
 | 
						assert(Req != NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Falsche Anzahl Parameter? */
 | 
						/* Wrong number of arguments? */
 | 
				
			||||||
	if( Req->argc < 1 ) return IRC_WriteStrClient( Client, ERR_NOORIGIN_MSG, Client_ID( Client ));
 | 
						if (Req->argc < 1)
 | 
				
			||||||
	if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
							return IRC_WriteStrClient(Client, ERR_NOORIGIN_MSG,
 | 
				
			||||||
 | 
										  Client_ID(Client));
 | 
				
			||||||
 | 
						if (Req->argc > 2)
 | 
				
			||||||
 | 
							return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
				
			||||||
 | 
										  Client_ID(Client), Req->command);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* forwarden? */
 | 
						/* Forward? */
 | 
				
			||||||
	if( Req->argc == 2 )
 | 
						if (Req->argc == 2 && Client_Type(Client) == CLIENT_SERVER) {
 | 
				
			||||||
	{
 | 
							target = Client_Search(Req->argv[0]);
 | 
				
			||||||
		target = Client_Search( Req->argv[1] );
 | 
							if (!target)
 | 
				
			||||||
		if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] );
 | 
								return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
 | 
				
			||||||
		if( target != Client_ThisServer( ))
 | 
										Client_ID(Client), Req->argv[0]);
 | 
				
			||||||
		{
 | 
					
 | 
				
			||||||
			/* ok, forwarden */
 | 
							from = Client_Search(Req->prefix);
 | 
				
			||||||
			if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
 | 
					
 | 
				
			||||||
			else from = Client;
 | 
							if (target != Client_ThisServer() && target != from) {
 | 
				
			||||||
			if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix );
 | 
								/* Ok, we have to forward the message. */
 | 
				
			||||||
			return IRC_WriteStrClientPrefix( target, from, "PONG %s :%s", Client_ID( from ), Req->argv[1] );
 | 
								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
 | 
						/* The connection timestamp has already been updated when the data has
 | 
				
			||||||
	 * aktualisiert, daher muss das hier nicht mehr gemacht werden. */
 | 
						 * 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 )));
 | 
						if (Client_Conn(Client) > NONE)
 | 
				
			||||||
	else Log( LOG_DEBUG, "Connection %d: received PONG.", Client_Conn( Client ));
 | 
							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;
 | 
						return CONNECTED;
 | 
				
			||||||
} /* IRC_PONG */
 | 
					} /* IRC_PONG */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL bool
 | 
					static bool
 | 
				
			||||||
Hello_User( CLIENT *Client )
 | 
					Hello_User( CLIENT *Client )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef CVSDATE
 | 
					#ifdef CVSDATE
 | 
				
			||||||
@@ -526,8 +601,8 @@ Hello_User( CLIENT *Client )
 | 
				
			|||||||
	/* Version and system type */
 | 
						/* Version and system type */
 | 
				
			||||||
#ifdef CVSDATE
 | 
					#ifdef CVSDATE
 | 
				
			||||||
	strlcpy( ver, CVSDATE, sizeof( ver ));
 | 
						strlcpy( ver, CVSDATE, sizeof( ver ));
 | 
				
			||||||
	strncpy( ver + 4, ver + 5, 2 );
 | 
						memmove( ver + 4, ver + 5, 2 );
 | 
				
			||||||
	strncpy( ver + 6, ver + 8, 3 );
 | 
						memmove( ver + 6, ver + 8, 3 );
 | 
				
			||||||
	snprintf( vertxt, sizeof( vertxt ), "%s(%s)", PACKAGE_VERSION, ver );
 | 
						snprintf( vertxt, sizeof( vertxt ), "%s(%s)", PACKAGE_VERSION, ver );
 | 
				
			||||||
	if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), vertxt, TARGET_CPU, TARGET_VENDOR, TARGET_OS )) return false;
 | 
						if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), vertxt, TARGET_CPU, TARGET_VENDOR, TARGET_OS )) return false;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
@@ -541,8 +616,10 @@ Hello_User( CLIENT *Client )
 | 
				
			|||||||
	if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), PACKAGE_VERSION, USERMODES, CHANMODES )) return false;
 | 
						if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), PACKAGE_VERSION, USERMODES, CHANMODES )) return false;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Features */
 | 
						/* Features supported by this server (005 numeric, ISUPPORT),
 | 
				
			||||||
	if( ! IRC_WriteStrClient( Client, RPL_ISUPPORT_MSG, Client_ID( Client ), CLIENT_NICK_LEN - 1, CHANNEL_TOPIC_LEN - 1, CLIENT_AWAY_LEN - 1, Conf_MaxJoins )) return DISCONNECTED;
 | 
						 * see <http://www.irc.org/tech_docs/005.html> for details. */
 | 
				
			||||||
 | 
						if (! IRC_Send_ISUPPORT(Client))
 | 
				
			||||||
 | 
							return DISCONNECTED;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Client_SetType( Client, CLIENT_USER );
 | 
						Client_SetType( Client, CLIENT_USER );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -556,7 +633,7 @@ Hello_User( CLIENT *Client )
 | 
				
			|||||||
} /* Hello_User */
 | 
					} /* Hello_User */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL void
 | 
					static void
 | 
				
			||||||
Kill_Nick( char *Nick, char *Reason )
 | 
					Kill_Nick( char *Nick, char *Reason )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	REQUEST r;
 | 
						REQUEST r;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "portab.h"
 | 
					#include "portab.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char UNUSED id[] = "$Id: irc-mode.c,v 1.43 2005/06/17 19:14:58 fw Exp $";
 | 
					static char UNUSED id[] = "$Id: irc-mode.c,v 1.50.2.1 2008/02/16 11:26:12 fw Exp $";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "imp.h"
 | 
					#include "imp.h"
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
@@ -38,16 +38,16 @@ static char UNUSED id[] = "$Id: irc-mode.c,v 1.43 2005/06/17 19:14:58 fw Exp $";
 | 
				
			|||||||
#include "irc-mode.h"
 | 
					#include "irc-mode.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL bool Client_Mode PARAMS(( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ));
 | 
					static bool Client_Mode PARAMS(( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ));
 | 
				
			||||||
LOCAL bool Channel_Mode PARAMS(( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel ));
 | 
					static bool Channel_Mode PARAMS(( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL bool Add_Invite PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ));
 | 
					static bool Add_Invite PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ));
 | 
				
			||||||
LOCAL bool Add_Ban PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ));
 | 
					static bool Add_Ban PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL bool Del_Invite PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ));
 | 
					static bool Del_Invite PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ));
 | 
				
			||||||
LOCAL bool Del_Ban PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ));
 | 
					static bool Del_Ban PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL bool Send_ListChange PARAMS(( char *Mode, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Mask ));
 | 
					static bool Send_ListChange PARAMS(( char *Mode, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Mask ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool
 | 
					GLOBAL bool
 | 
				
			||||||
@@ -69,21 +69,26 @@ IRC_MODE( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
		if( ! origin ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
 | 
							if( ! origin ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else origin = Client;
 | 
						else origin = Client;
 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	/* Channel or user mode? */
 | 
					 | 
				
			||||||
	cl = chan = NULL;
 | 
					 | 
				
			||||||
	if( Client_IsValidNick( Req->argv[0] )) cl = Client_Search( Req->argv[0] );
 | 
					 | 
				
			||||||
	if( Channel_IsValidName( Req->argv[0] )) chan = Channel_Search( Req->argv[0] );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if( cl ) return Client_Mode( Client, Req, origin, cl );
 | 
						/* Channel or user mode? */
 | 
				
			||||||
	if( chan ) return Channel_Mode( Client, Req, origin, chan );
 | 
						cl = NULL; chan = NULL;
 | 
				
			||||||
 | 
						if (Client_IsValidNick(Req->argv[0]))
 | 
				
			||||||
 | 
							cl = Client_Search(Req->argv[0]);
 | 
				
			||||||
 | 
						if (Channel_IsValidName(Req->argv[0]))
 | 
				
			||||||
 | 
							chan = Channel_Search(Req->argv[0]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (cl)
 | 
				
			||||||
 | 
							return Client_Mode(Client, Req, origin, cl);
 | 
				
			||||||
 | 
						if (chan)
 | 
				
			||||||
 | 
							return Channel_Mode(Client, Req, origin, chan);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* No target found! */
 | 
						/* No target found! */
 | 
				
			||||||
	return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
 | 
						return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG,
 | 
				
			||||||
 | 
								Client_ID(Client), Req->argv[0]);
 | 
				
			||||||
} /* IRC_MODE */
 | 
					} /* IRC_MODE */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL bool
 | 
					static bool
 | 
				
			||||||
Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
 | 
					Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Handle client mode requests */
 | 
						/* Handle client mode requests */
 | 
				
			||||||
@@ -159,6 +164,7 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
 | 
				
			|||||||
		{
 | 
							{
 | 
				
			||||||
			case 'i': /* Invisible */
 | 
								case 'i': /* Invisible */
 | 
				
			||||||
			case 's': /* Server messages */
 | 
								case 's': /* Server messages */
 | 
				
			||||||
 | 
								case 'w': /* Wallops messages */
 | 
				
			||||||
				x[0] = *mode_ptr;
 | 
									x[0] = *mode_ptr;
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -236,7 +242,7 @@ client_exit:
 | 
				
			|||||||
} /* Client_Mode */
 | 
					} /* Client_Mode */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL bool
 | 
					static bool
 | 
				
			||||||
Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
 | 
					Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Handle channel and channel-user modes */
 | 
						/* Handle channel and channel-user modes */
 | 
				
			||||||
@@ -263,7 +269,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
 | 
				
			|||||||
			switch( *mode_ptr )
 | 
								switch( *mode_ptr )
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				case 'l':
 | 
									case 'l':
 | 
				
			||||||
					snprintf( argadd, sizeof( argadd ), " %ld", Channel_MaxUsers( Channel ));
 | 
										snprintf( argadd, sizeof( argadd ), " %lu", Channel_MaxUsers( Channel ));
 | 
				
			||||||
					strlcat( the_args, argadd, sizeof( the_args ));
 | 
										strlcat( the_args, argadd, sizeof( the_args ));
 | 
				
			||||||
					break;
 | 
										break;
 | 
				
			||||||
				case 'k':
 | 
									case 'k':
 | 
				
			||||||
@@ -311,7 +317,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
 | 
				
			|||||||
	/* Prepare reply string */
 | 
						/* Prepare reply string */
 | 
				
			||||||
	if( set ) strcpy( the_modes, "+" );
 | 
						if( set ) strcpy( the_modes, "+" );
 | 
				
			||||||
	else strcpy( the_modes, "-" );
 | 
						else strcpy( the_modes, "-" );
 | 
				
			||||||
	strcpy( the_args, " " );
 | 
						the_args[0] = '\0';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	x[1] = '\0';
 | 
						x[1] = '\0';
 | 
				
			||||||
	ok = CONNECTED;
 | 
						ok = CONNECTED;
 | 
				
			||||||
@@ -426,16 +432,21 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
 | 
				
			|||||||
				break;
 | 
									break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			case 'P': /* Persistent channel */
 | 
								case 'P': /* Persistent channel */
 | 
				
			||||||
				if( modeok )
 | 
									if (modeok) {
 | 
				
			||||||
				{
 | 
										/* Only IRC operators are allowed to
 | 
				
			||||||
					if( set && ( ! Client_OperByMe( Client )))
 | 
										 * set the 'P' channel mode! */
 | 
				
			||||||
					{
 | 
										if (set && ! (Client_OperByMe(Client)
 | 
				
			||||||
						/* Only IRC operators are allowed to set P mode */
 | 
										    || Client_Type(Client) == CLIENT_SERVER)) {
 | 
				
			||||||
						ok = IRC_WriteStrClient( Origin, ERR_NOPRIVILEGES_MSG, Client_ID( Origin ));
 | 
											ok = IRC_WriteStrClient(Origin,
 | 
				
			||||||
					}
 | 
												ERR_NOPRIVILEGES_MSG,
 | 
				
			||||||
					else x[0] = 'P';
 | 
												Client_ID(Origin));
 | 
				
			||||||
				}
 | 
										} else
 | 
				
			||||||
				else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
 | 
											x[0] = 'P';
 | 
				
			||||||
 | 
									} else
 | 
				
			||||||
 | 
										ok = IRC_WriteStrClient(Origin,
 | 
				
			||||||
 | 
											ERR_CHANOPRIVSNEEDED_MSG,
 | 
				
			||||||
 | 
											Client_ID(Origin),
 | 
				
			||||||
 | 
											Channel_Name(Channel));
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			/* --- Channel user modes --- */
 | 
								/* --- Channel user modes --- */
 | 
				
			||||||
@@ -472,7 +483,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
 | 
				
			|||||||
					Req->argv[arg_arg][0] = '\0';
 | 
										Req->argv[arg_arg][0] = '\0';
 | 
				
			||||||
					arg_arg++;
 | 
										arg_arg++;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				else Lists_ShowInvites( Origin, Channel );
 | 
									else Channel_ShowInvites( Origin, Channel );
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			case 'b': /* Ban lists */
 | 
								case 'b': /* Ban lists */
 | 
				
			||||||
@@ -488,7 +499,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
 | 
				
			|||||||
					Req->argv[arg_arg][0] = '\0';
 | 
										Req->argv[arg_arg][0] = '\0';
 | 
				
			||||||
					arg_arg++;
 | 
										arg_arg++;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				else Lists_ShowBans( Origin, Channel );
 | 
									else Channel_ShowBans( Origin, Channel );
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			default:
 | 
								default:
 | 
				
			||||||
@@ -517,8 +528,8 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
 | 
				
			|||||||
				/* Channel-User-Mode */
 | 
									/* Channel-User-Mode */
 | 
				
			||||||
				if( Channel_UserModeAdd( Channel, client, x[0] ))
 | 
									if( Channel_UserModeAdd( Channel, client, x[0] ))
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					strlcat( the_args, Client_ID( client ), sizeof( the_args ));
 | 
					 | 
				
			||||||
					strlcat( the_args, " ", sizeof( the_args ));
 | 
										strlcat( the_args, " ", sizeof( the_args ));
 | 
				
			||||||
 | 
										strlcat( the_args, Client_ID( client ), sizeof( the_args ));
 | 
				
			||||||
					strlcat( the_modes, x, sizeof( the_modes ));
 | 
										strlcat( the_modes, x, sizeof( the_modes ));
 | 
				
			||||||
					Log( LOG_DEBUG, "User \"%s\": Mode change on %s, now \"%s\"", Client_Mask( client ), Channel_Name( Channel ), Channel_UserModes( Channel, client ));
 | 
										Log( LOG_DEBUG, "User \"%s\": Mode change on %s, now \"%s\"", Client_Mask( client ), Channel_Name( Channel ), Channel_UserModes( Channel, client ));
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
@@ -541,8 +552,8 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
 | 
				
			|||||||
				/* Channel-User-Mode */
 | 
									/* Channel-User-Mode */
 | 
				
			||||||
				if( Channel_UserModeDel( Channel, client, x[0] ))
 | 
									if( Channel_UserModeDel( Channel, client, x[0] ))
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					strlcat( the_args, Client_ID( client ), sizeof( the_args ));
 | 
					 | 
				
			||||||
					strlcat( the_args, " ", sizeof( the_args ));
 | 
										strlcat( the_args, " ", sizeof( the_args ));
 | 
				
			||||||
 | 
										strlcat( the_args, Client_ID( client ), sizeof( the_args ));
 | 
				
			||||||
					strlcat( the_modes, x, sizeof( the_modes ));
 | 
										strlcat( the_modes, x, sizeof( the_modes ));
 | 
				
			||||||
					Log( LOG_DEBUG, "User \"%s\": Mode change on %s, now \"%s\"", Client_Mask( client ), Channel_Name( Channel ), Channel_UserModes( Channel, client ));
 | 
										Log( LOG_DEBUG, "User \"%s\": Mode change on %s, now \"%s\"", Client_Mask( client ), Channel_Name( Channel ), Channel_UserModes( Channel, client ));
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
@@ -561,8 +572,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
 | 
				
			|||||||
		/* Are there additional arguments to add? */
 | 
							/* Are there additional arguments to add? */
 | 
				
			||||||
		if( argadd[0] )
 | 
							if( argadd[0] )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			len = strlen( the_args ) - 1;
 | 
								strlcat( the_args, " ", sizeof( the_args ));
 | 
				
			||||||
			if( the_args[len] != ' ' ) strlcat( the_args, " ", sizeof( the_args ));
 | 
					 | 
				
			||||||
			strlcat( the_args, argadd, sizeof( the_args ));
 | 
								strlcat( the_args, argadd, sizeof( the_args ));
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -575,9 +585,6 @@ chan_exit:
 | 
				
			|||||||
		len = strlen( the_modes ) - 1;
 | 
							len = strlen( the_modes ) - 1;
 | 
				
			||||||
		if(( the_modes[len] == '+' ) || ( the_modes[len] == '-' )) the_modes[len] = '\0';
 | 
							if(( the_modes[len] == '+' ) || ( the_modes[len] == '-' )) the_modes[len] = '\0';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Clean up argument string if there are none */
 | 
					 | 
				
			||||||
		if( ! the_args[1] ) the_args[0] = '\0';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if( Client_Type( Client ) == CLIENT_SERVER )
 | 
							if( Client_Type( Client ) == CLIENT_SERVER )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			/* Forward mode changes to channel users and other servers */
 | 
								/* Forward mode changes to channel users and other servers */
 | 
				
			||||||
@@ -627,7 +634,7 @@ IRC_AWAY( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
} /* IRC_AWAY */
 | 
					} /* IRC_AWAY */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL bool
 | 
					static bool
 | 
				
			||||||
Add_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
 | 
					Add_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char *mask;
 | 
						char *mask;
 | 
				
			||||||
@@ -639,17 +646,19 @@ Add_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	mask = Lists_MakeMask( Pattern );
 | 
						mask = Lists_MakeMask( Pattern );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	already = Lists_IsInviteEntry( mask, Channel );
 | 
						already = Lists_CheckDupeMask(Channel_GetListInvites(Channel), mask );
 | 
				
			||||||
	
 | 
						if (!already) {
 | 
				
			||||||
	if( ! Lists_AddInvited( mask, Channel, false )) return CONNECTED;
 | 
							if( ! Channel_AddInvite(Channel, mask, false ))
 | 
				
			||||||
	
 | 
								return CONNECTED;
 | 
				
			||||||
	if(( Client_Type( Prefix ) == CLIENT_SERVER ) && ( already == true)) return CONNECTED;
 | 
						}
 | 
				
			||||||
 | 
						if ( already && ( Client_Type( Prefix ) == CLIENT_SERVER ))
 | 
				
			||||||
 | 
							return CONNECTED;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return Send_ListChange( "+I", Prefix, Client, Channel, mask );
 | 
						return Send_ListChange( "+I", Prefix, Client, Channel, mask );
 | 
				
			||||||
} /* Add_Invite */
 | 
					} /* Add_Invite */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL bool
 | 
					static bool
 | 
				
			||||||
Add_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
 | 
					Add_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char *mask;
 | 
						char *mask;
 | 
				
			||||||
@@ -661,17 +670,19 @@ Add_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	mask = Lists_MakeMask( Pattern );
 | 
						mask = Lists_MakeMask( Pattern );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	already = Lists_IsBanEntry( mask, Channel );
 | 
						already = Lists_CheckDupeMask(Channel_GetListBans(Channel), mask );
 | 
				
			||||||
 | 
						if (!already) {
 | 
				
			||||||
	if( ! Lists_AddBanned( mask, Channel )) return CONNECTED;
 | 
							if( ! Channel_AddBan(Channel, mask))
 | 
				
			||||||
 | 
								return CONNECTED;
 | 
				
			||||||
	if(( Client_Type( Prefix ) == CLIENT_SERVER ) && ( already == true)) return CONNECTED;
 | 
						}
 | 
				
			||||||
 | 
						if ( already && ( Client_Type( Prefix ) == CLIENT_SERVER ))
 | 
				
			||||||
 | 
							return CONNECTED;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return Send_ListChange( "+b", Prefix, Client, Channel, mask );
 | 
						return Send_ListChange( "+b", Prefix, Client, Channel, mask );
 | 
				
			||||||
} /* Add_Ban */
 | 
					} /* Add_Ban */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL bool
 | 
					static bool
 | 
				
			||||||
Del_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
 | 
					Del_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char *mask;
 | 
						char *mask;
 | 
				
			||||||
@@ -681,12 +692,12 @@ Del_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
 | 
				
			|||||||
	assert( Pattern != NULL );
 | 
						assert( Pattern != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mask = Lists_MakeMask( Pattern );
 | 
						mask = Lists_MakeMask( Pattern );
 | 
				
			||||||
	Lists_DelInvited( mask, Channel );
 | 
						Lists_Del(Channel_GetListInvites(Channel), mask);
 | 
				
			||||||
	return Send_ListChange( "-I", Prefix, Client, Channel, mask );
 | 
						return Send_ListChange( "-I", Prefix, Client, Channel, mask );
 | 
				
			||||||
} /* Del_Invite */
 | 
					} /* Del_Invite */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL bool
 | 
					static bool
 | 
				
			||||||
Del_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
 | 
					Del_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char *mask;
 | 
						char *mask;
 | 
				
			||||||
@@ -696,12 +707,12 @@ Del_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
 | 
				
			|||||||
	assert( Pattern != NULL );
 | 
						assert( Pattern != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mask = Lists_MakeMask( Pattern );
 | 
						mask = Lists_MakeMask( Pattern );
 | 
				
			||||||
	Lists_DelBanned( mask, Channel );
 | 
						Lists_Del(Channel_GetListBans(Channel), mask);
 | 
				
			||||||
	return Send_ListChange( "-b", Prefix, Client, Channel, mask );
 | 
						return Send_ListChange( "-b", Prefix, Client, Channel, mask );
 | 
				
			||||||
} /* Del_Ban */
 | 
					} /* Del_Ban */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL bool
 | 
					static bool
 | 
				
			||||||
Send_ListChange( char *Mode, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Mask )
 | 
					Send_ListChange( char *Mode, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Mask )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Bestaetigung an Client schicken & andere Server sowie Channel-User informieren */
 | 
						/* Bestaetigung an Client schicken & andere Server sowie Channel-User informieren */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "portab.h"
 | 
					#include "portab.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char UNUSED id[] = "$Id: irc-op.c,v 1.15 2005/04/27 07:39:18 alex Exp $";
 | 
					static char UNUSED id[] = "$Id: irc-op.c,v 1.17 2006/12/07 17:57:20 fw Exp $";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "imp.h"
 | 
					#include "imp.h"
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
@@ -99,17 +99,17 @@ IRC_INVITE( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
		if( Channel_IsMemberOf( chan, target )) return IRC_WriteStrClient( from, ERR_USERONCHANNEL_MSG, Client_ID( from ), Req->argv[0], Req->argv[1] );
 | 
							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 the target user is banned on that channel: remember invite */
 | 
				
			||||||
		if( Lists_CheckBanned( target, chan )) remember = true;
 | 
							if( Lists_Check(Channel_GetListBans(chan), target )) remember = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if( remember )
 | 
							if (remember) {
 | 
				
			||||||
		{
 | 
								/* We must remember this invite */
 | 
				
			||||||
			/* We must memember this invite */
 | 
								if( ! Channel_AddInvite(chan, Client_Mask( target ), true))
 | 
				
			||||||
			if( ! Lists_AddInvited( Client_Mask( target ), chan, true)) return CONNECTED;
 | 
									return CONNECTED;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Log( LOG_DEBUG, "User \"%s\" invites \"%s\" to \"%s\" ...", Client_Mask( from ), Req->argv[0], Req->argv[1] );
 | 
						LogDebug("User \"%s\" invites \"%s\" to \"%s\" ...", Client_Mask(from), Req->argv[0], Req->argv[1]);
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	/* Inform target client */
 | 
						/* Inform target client */
 | 
				
			||||||
	IRC_WriteStrClientPrefix( target, from, "INVITE %s %s", Req->argv[0], Req->argv[1] );
 | 
						IRC_WriteStrClientPrefix( target, from, "INVITE %s %s", Req->argv[0], Req->argv[1] );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "portab.h"
 | 
					#include "portab.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char UNUSED id[] = "$Id: irc-oper.c,v 1.22 2005/06/12 18:02:09 fw Exp $";
 | 
					static char UNUSED id[] = "$Id: irc-oper.c,v 1.29 2007/08/02 10:14:26 fw Exp $";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "imp.h"
 | 
					#include "imp.h"
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
@@ -23,7 +23,7 @@ static char UNUSED id[] = "$Id: irc-oper.c,v 1.22 2005/06/12 18:02:09 fw Exp $";
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "ngircd.h"
 | 
					#include "ngircd.h"
 | 
				
			||||||
#include "resolve.h"
 | 
					#include "resolve.h"
 | 
				
			||||||
#include "conn.h"
 | 
					#include "conn-func.h"
 | 
				
			||||||
#include "conf.h"
 | 
					#include "conf.h"
 | 
				
			||||||
#include "client.h"
 | 
					#include "client.h"
 | 
				
			||||||
#include "channel.h"
 | 
					#include "channel.h"
 | 
				
			||||||
@@ -37,7 +37,7 @@ static char UNUSED id[] = "$Id: irc-oper.c,v 1.22 2005/06/12 18:02:09 fw Exp $";
 | 
				
			|||||||
#include "irc-oper.h"
 | 
					#include "irc-oper.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL bool
 | 
					static bool
 | 
				
			||||||
Bad_OperPass(CLIENT *Client, char *errtoken, char *errmsg)
 | 
					Bad_OperPass(CLIENT *Client, char *errtoken, char *errmsg)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Log( LOG_WARNING, "Got invalid OPER from \"%s\": \"%s\" -- %s", Client_Mask( Client ),
 | 
						Log( LOG_WARNING, "Got invalid OPER from \"%s\": \"%s\" -- %s", Client_Mask( Client ),
 | 
				
			||||||
@@ -50,7 +50,7 @@ Bad_OperPass(CLIENT *Client, char *errtoken, char *errmsg)
 | 
				
			|||||||
GLOBAL bool
 | 
					GLOBAL bool
 | 
				
			||||||
IRC_OPER( CLIENT *Client, REQUEST *Req )
 | 
					IRC_OPER( CLIENT *Client, REQUEST *Req )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int i;
 | 
						unsigned int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert( Client != NULL );
 | 
						assert( Client != NULL );
 | 
				
			||||||
	assert( Req != NULL );
 | 
						assert( Req != NULL );
 | 
				
			||||||
@@ -90,21 +90,46 @@ IRC_OPER( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool
 | 
					GLOBAL bool
 | 
				
			||||||
IRC_DIE( CLIENT *Client, REQUEST *Req )
 | 
					IRC_DIE(CLIENT * Client, REQUEST * Req)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Shut down server */
 | 
						/* Shut down server */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert( Client != NULL );
 | 
						CONN_ID c;
 | 
				
			||||||
	assert( Req != NULL );
 | 
						CLIENT *cl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert(Client != NULL);
 | 
				
			||||||
 | 
						assert(Req != NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Not a local IRC operator? */
 | 
						/* Not a local IRC operator? */
 | 
				
			||||||
	if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
 | 
						if ((!Client_HasMode(Client, 'o')) || (!Client_OperByMe(Client)))
 | 
				
			||||||
	
 | 
							return IRC_WriteStrClient(Client, ERR_NOPRIVILEGES_MSG,
 | 
				
			||||||
	/* Bad number of parameters? */
 | 
										  Client_ID(Client));
 | 
				
			||||||
	if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Log( LOG_NOTICE|LOG_snotice, "Got DIE command from \"%s\" ...", Client_Mask( Client ));
 | 
						/* 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;
 | 
						NGIRCd_SignalQuit = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return CONNECTED;
 | 
						return CONNECTED;
 | 
				
			||||||
} /* IRC_DIE */
 | 
					} /* IRC_DIE */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -150,35 +175,60 @@ IRC_RESTART( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
} /* IRC_RESTART */
 | 
					} /* IRC_RESTART */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Connect configured or new server.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
GLOBAL bool
 | 
					GLOBAL bool
 | 
				
			||||||
IRC_CONNECT(CLIENT *Client, REQUEST *Req )
 | 
					IRC_CONNECT(CLIENT * Client, REQUEST * Req)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Connect configured or new server */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert( Client != NULL );
 | 
						assert(Client != NULL);
 | 
				
			||||||
	assert( Req != NULL );
 | 
						assert(Req != NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Not a local IRC operator? */
 | 
						/* Not a local IRC operator? */
 | 
				
			||||||
	if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
 | 
						if ((!Client_HasMode(Client, 'o')) || (!Client_OperByMe(Client)))
 | 
				
			||||||
 | 
							return IRC_WriteStrClient(Client, ERR_NOPRIVILEGES_MSG,
 | 
				
			||||||
 | 
										  Client_ID(Client));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Bad number of parameters? */
 | 
						/* Bad number of parameters? */
 | 
				
			||||||
	if(( Req->argc != 2 ) && ( Req->argc != 5 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
						if ((Req->argc != 1) && (Req->argc != 2) && (Req->argc != 5))
 | 
				
			||||||
 | 
							return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
				
			||||||
 | 
										  Client_ID(Client), Req->command);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Invalid port number? */
 | 
						/* Invalid port number? */
 | 
				
			||||||
	if( atoi( Req->argv[1] ) < 1 )  return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
						if ((Req->argc > 1) && atoi(Req->argv[1]) < 1)
 | 
				
			||||||
 | 
							return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
				
			||||||
 | 
										  Client_ID(Client), Req->command);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Log( LOG_NOTICE|LOG_snotice, "Got CONNECT command from \"%s\" for \"%s\".", Client_Mask( Client ), Req->argv[0]);
 | 
						Log(LOG_NOTICE | LOG_snotice,
 | 
				
			||||||
 | 
						    "Got CONNECT command from \"%s\" for \"%s\".", Client_Mask(Client),
 | 
				
			||||||
 | 
						    Req->argv[0]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if( Req->argc == 2 )
 | 
						switch (Req->argc) {
 | 
				
			||||||
	{
 | 
						case 1:
 | 
				
			||||||
 | 
							if (!Conf_EnablePassiveServer(Req->argv[0]))
 | 
				
			||||||
 | 
								return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
 | 
				
			||||||
 | 
											  Client_ID(Client),
 | 
				
			||||||
 | 
											  Req->argv[0]);
 | 
				
			||||||
 | 
						break;
 | 
				
			||||||
 | 
						case 2:
 | 
				
			||||||
		/* Connect configured server */
 | 
							/* Connect configured server */
 | 
				
			||||||
		if( ! Conf_EnableServer( Req->argv[0], atoi( Req->argv[1] ))) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] );
 | 
							if (!Conf_EnableServer
 | 
				
			||||||
	}
 | 
							    (Req->argv[0], (UINT16) atoi(Req->argv[1])))
 | 
				
			||||||
	else
 | 
								return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
 | 
				
			||||||
	{
 | 
											  Client_ID(Client),
 | 
				
			||||||
 | 
											  Req->argv[0]);
 | 
				
			||||||
 | 
						break;
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
		/* Add server */
 | 
							/* Add server */
 | 
				
			||||||
		if( ! Conf_AddServer( Req->argv[0], atoi( Req->argv[1] ), Req->argv[2], Req->argv[3], Req->argv[4] )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] );
 | 
							if (!Conf_AddServer
 | 
				
			||||||
 | 
							    (Req->argv[0], (UINT16) atoi(Req->argv[1]), Req->argv[2],
 | 
				
			||||||
 | 
							     Req->argv[3], Req->argv[4]))
 | 
				
			||||||
 | 
								return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
 | 
				
			||||||
 | 
											  Client_ID(Client),
 | 
				
			||||||
 | 
											  Req->argv[0]);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return CONNECTED;
 | 
						return CONNECTED;
 | 
				
			||||||
} /* IRC_CONNECT */
 | 
					} /* IRC_CONNECT */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -208,9 +258,59 @@ IRC_DISCONNECT(CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
	if( ! Conf_DisableServer( Req->argv[0] )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] );
 | 
						if( ! Conf_DisableServer( Req->argv[0] )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Are we still connected or were we killed, too? */
 | 
						/* Are we still connected or were we killed, too? */
 | 
				
			||||||
	if( Client_GetFromConn( my_conn )) return CONNECTED;
 | 
						if( Conn_GetClient( my_conn )) return CONNECTED;
 | 
				
			||||||
	else return DISCONNECTED;
 | 
						else return DISCONNECTED;
 | 
				
			||||||
} /* IRC_CONNECT */
 | 
					} /* 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- */
 | 
					/* -eof- */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,7 @@
 | 
				
			|||||||
 * (at your option) any later version.
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
					 * Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * $Id: irc-oper.h,v 1.11 2005/03/19 18:43:48 fw Exp $
 | 
					 * $Id: irc-oper.h,v 1.12 2007/08/02 10:14:26 fw Exp $
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * IRC operator commands (header)
 | 
					 * IRC operator commands (header)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@@ -24,6 +24,7 @@ GLOBAL bool IRC_REHASH PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
				
			|||||||
GLOBAL bool IRC_RESTART PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
					GLOBAL bool IRC_RESTART PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
				
			||||||
GLOBAL bool IRC_CONNECT PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
					GLOBAL bool IRC_CONNECT PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
				
			||||||
GLOBAL bool IRC_DISCONNECT PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
					GLOBAL bool IRC_DISCONNECT PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
				
			||||||
 | 
					GLOBAL bool IRC_WALLOPS PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
					 * ngIRCd -- The Next Generation IRC Daemon
 | 
				
			||||||
 * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
 | 
					 * Copyright (c)2001-2007 Alexander Barton (alex@barton.de)
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software; you can redistribute it and/or modify
 | 
					 * This program is free software; you can redistribute it and/or modify
 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -14,7 +14,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "portab.h"
 | 
					#include "portab.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char UNUSED id[] = "$Id: irc-server.c,v 1.38 2005/03/19 18:43:49 fw Exp $";
 | 
					static char UNUSED id[] = "$Id: irc-server.c,v 1.46 2007/11/21 12:16:36 alex Exp $";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "imp.h"
 | 
					#include "imp.h"
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
@@ -35,33 +35,40 @@ static char UNUSED id[] = "$Id: irc-server.c,v 1.38 2005/03/19 18:43:49 fw Exp $
 | 
				
			|||||||
#include "log.h"
 | 
					#include "log.h"
 | 
				
			||||||
#include "messages.h"
 | 
					#include "messages.h"
 | 
				
			||||||
#include "parse.h"
 | 
					#include "parse.h"
 | 
				
			||||||
 | 
					#include "numeric.h"
 | 
				
			||||||
#include "ngircd.h"
 | 
					#include "ngircd.h"
 | 
				
			||||||
 | 
					#include "irc-info.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "exp.h"
 | 
					#include "exp.h"
 | 
				
			||||||
#include "irc-server.h"
 | 
					#include "irc-server.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Handler for the IRC command "SERVER".
 | 
				
			||||||
 | 
					 * See RFC 2813 section 4.1.2.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
GLOBAL bool
 | 
					GLOBAL bool
 | 
				
			||||||
IRC_SERVER( CLIENT *Client, REQUEST *Req )
 | 
					IRC_SERVER( CLIENT *Client, REQUEST *Req )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char str[LINE_LEN], *ptr, *modes, *topic;
 | 
						char str[LINE_LEN], *ptr;
 | 
				
			||||||
	CLIENT *from, *c, *cl;
 | 
						CLIENT *from, *c;
 | 
				
			||||||
	CL2CHAN *cl2chan;
 | 
					 | 
				
			||||||
	int max_hops, i;
 | 
					 | 
				
			||||||
	CHANNEL *chan;
 | 
					 | 
				
			||||||
	bool ok;
 | 
						bool ok;
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
	CONN_ID con;
 | 
						CONN_ID con;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	assert( Client != NULL );
 | 
						assert( Client != NULL );
 | 
				
			||||||
	assert( Req != NULL );
 | 
						assert( Req != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Fehler liefern, wenn kein lokaler Client */
 | 
						/* 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_Conn(Client) <= NONE)
 | 
				
			||||||
 | 
							return IRC_WriteStrClient(Client, ERR_UNKNOWNCOMMAND_MSG,
 | 
				
			||||||
 | 
										  Client_ID(Client), Req->command);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if( Client_Type( Client ) == CLIENT_GOTPASSSERVER )
 | 
						if (Client_Type(Client) == CLIENT_GOTPASS) {
 | 
				
			||||||
	{
 | 
							/* We got a PASS command from the peer, and now a SERVER
 | 
				
			||||||
		/* Verbindung soll als Server-Server-Verbindung registriert werden */
 | 
							 * command: the peer tries to register itself as a server. */
 | 
				
			||||||
		Log( LOG_DEBUG, "Connection %d: got SERVER command (new server link) ...", Client_Conn( Client ));
 | 
							LogDebug("Connection %d: got SERVER command (new server link) ...",
 | 
				
			||||||
 | 
								Client_Conn(Client));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Falsche Anzahl Parameter? */
 | 
							/* Falsche Anzahl Parameter? */
 | 
				
			||||||
		if(( Req->argc != 2 ) && ( Req->argc != 3 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
							if(( Req->argc != 2 ) && ( Req->argc != 3 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
				
			||||||
@@ -115,10 +122,10 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
			Client_SetToken( Client, atoi( Req->argv[1] ));
 | 
								Client_SetToken( Client, atoi( Req->argv[1] ));
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Log( LOG_NOTICE|LOG_snotice, "Server \"%s\" registered (connection %d, 1 hop - direct link).", Client_ID( Client ), con );
 | 
							/* Mark this connection as belonging to an configured server */
 | 
				
			||||||
 | 
							Conf_SetServer(i, con);
 | 
				
			||||||
		Client_SetType( Client, CLIENT_SERVER );
 | 
							
 | 
				
			||||||
		Conf_SetServer( i, con );
 | 
							Client_SetType(Client, CLIENT_UNKNOWNSERVER);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef ZLIB
 | 
					#ifdef ZLIB
 | 
				
			||||||
		/* Kompression initialisieren, wenn erforderlich */
 | 
							/* Kompression initialisieren, wenn erforderlich */
 | 
				
			||||||
@@ -133,134 +140,23 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* maximalen Hop Count ermitteln */
 | 
					 | 
				
			||||||
		max_hops = 0;
 | 
					 | 
				
			||||||
		c = Client_First( );
 | 
					 | 
				
			||||||
		while( c )
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			if( Client_Hops( c ) > max_hops ) max_hops = Client_Hops( c );
 | 
					 | 
				
			||||||
			c = Client_Next( c );
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		/* Alle bisherigen Server dem neuen Server bekannt machen,
 | 
					 | 
				
			||||||
		 * die bisherigen Server ueber den neuen informierenn */
 | 
					 | 
				
			||||||
		for( i = 0; i < ( max_hops + 1 ); i++ )
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			c = Client_First( );
 | 
					 | 
				
			||||||
			while( c )
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				if(( Client_Type( c ) == CLIENT_SERVER ) && ( c != Client ) && ( c != Client_ThisServer( )) && ( Client_Hops( c ) == i ))
 | 
					 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
					if( Client_Conn( c ) > NONE )
 | 
					 | 
				
			||||||
					{
 | 
					 | 
				
			||||||
						/* Dem gefundenen Server gleich den neuen
 | 
					 | 
				
			||||||
						 * Server bekannt machen */
 | 
					 | 
				
			||||||
						if( ! IRC_WriteStrClient( c, "SERVER %s %d %d :%s", Client_ID( Client ), Client_Hops( Client ) + 1, Client_MyToken( Client ), Client_Info( Client ))) return DISCONNECTED;
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					
 | 
					 | 
				
			||||||
					/* Den neuen Server ueber den alten informieren */
 | 
					 | 
				
			||||||
					if( ! IRC_WriteStrClientPrefix( Client, Client_Hops( c ) == 1 ? Client_ThisServer( ) : Client_Introducer( c ), "SERVER %s %d %d :%s", Client_ID( c ), Client_Hops( c ) + 1, Client_MyToken( c ), Client_Info( c ))) return DISCONNECTED;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				c = Client_Next( c );
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		/* alle User dem neuen Server bekannt machen */
 | 
					 | 
				
			||||||
		c = Client_First( );
 | 
					 | 
				
			||||||
		while( c )
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			if( Client_Type( c ) == CLIENT_USER )
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				/* User an neuen Server melden */
 | 
					 | 
				
			||||||
				if( ! IRC_WriteStrClient( Client, "NICK %s %d %s %s %d +%s :%s", Client_ID( c ), Client_Hops( c ) + 1, Client_User( c ), Client_Hostname( c ), Client_MyToken( Client_Introducer( c )), Client_Modes( c ), Client_Info( c ))) return DISCONNECTED;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			c = Client_Next( c );
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		/* Channels dem neuen Server bekannt machen */
 | 
					 | 
				
			||||||
		chan = Channel_First( );
 | 
					 | 
				
			||||||
		while( chan )
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
#ifdef IRCPLUS
 | 
					#ifdef IRCPLUS
 | 
				
			||||||
			/* Send CHANINFO if the peer supports it */
 | 
							if (strchr(Client_Flags(Client), 'H')) {
 | 
				
			||||||
			if( strchr( Client_Flags( Client ), 'C' ))
 | 
								LogDebug("Peer supports IRC+ extended server handshake ...");
 | 
				
			||||||
			{
 | 
								if (!IRC_Send_ISUPPORT(Client))
 | 
				
			||||||
#ifdef DEBUG
 | 
									return DISCONNECTED;
 | 
				
			||||||
				Log( LOG_DEBUG, "Sending CHANINFO commands ..." );
 | 
								return IRC_WriteStrClient(Client, RPL_ENDOFMOTD_MSG,
 | 
				
			||||||
 | 
											  Client_ID(Client));
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
				modes = Channel_Modes( chan );
 | 
								if (Conf_MaxNickLength != CLIENT_NICK_LEN_DEFAULT)
 | 
				
			||||||
				topic = Channel_Topic( chan );
 | 
									Log(LOG_CRIT,
 | 
				
			||||||
 | 
									    "Attention: this server uses a non-standard nick length, but the peer doesn't support the IRC+ extended server handshake!");
 | 
				
			||||||
				if( *modes || *topic )
 | 
					 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
					/* send CHANINFO */
 | 
					 | 
				
			||||||
					if(( ! strchr( Channel_Modes( chan ), 'k' )) && ( ! strchr( Channel_Modes( chan ), 'l' )) && ( ! *topic ))
 | 
					 | 
				
			||||||
					{
 | 
					 | 
				
			||||||
						/* "CHANINFO <chan> +<modes>" */
 | 
					 | 
				
			||||||
						if( ! IRC_WriteStrClient( Client, "CHANINFO %s +%s", Channel_Name( chan ), modes )) return DISCONNECTED;
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					else if(( ! strchr( Channel_Modes( chan ), 'k' )) && ( ! strchr( Channel_Modes( chan ), 'l' )))
 | 
					 | 
				
			||||||
					{
 | 
					 | 
				
			||||||
						/* "CHANINFO <chan> +<modes> :<topic>" */
 | 
					 | 
				
			||||||
						if( ! IRC_WriteStrClient( Client, "CHANINFO %s +%s :%s", Channel_Name( chan ), modes, topic )) return DISCONNECTED;
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					else
 | 
					 | 
				
			||||||
					{
 | 
					 | 
				
			||||||
						/* "CHANINFO <chan> +<modes> <key> <limit> :<topic>" */
 | 
					 | 
				
			||||||
						if( ! IRC_WriteStrClient( Client, "CHANINFO %s +%s %s %ld :%s", Channel_Name( chan ), modes, strchr( Channel_Modes( chan ), 'k' ) ? Channel_Key( chan ) : "*", strchr( Channel_Modes( chan ), 'l' ) ? Channel_MaxUsers( chan ) : 0L, topic )) return DISCONNECTED;
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			/* alle Member suchen */
 | 
					 | 
				
			||||||
			cl2chan = Channel_FirstMember( chan );
 | 
					 | 
				
			||||||
			snprintf( str, sizeof( str ), "NJOIN %s :", Channel_Name( chan ));
 | 
					 | 
				
			||||||
			while( cl2chan )
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				cl = Channel_GetClient( cl2chan );
 | 
					 | 
				
			||||||
				assert( cl != NULL );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				/* Nick, ggf. mit Modes, anhaengen */
 | 
					 | 
				
			||||||
				if( str[strlen( str ) - 1] != ':' ) strlcat( str, ",", sizeof( str ));
 | 
					 | 
				
			||||||
				if( strchr( Channel_UserModes( chan, cl ), 'v' )) strlcat( str, "+", sizeof( str ));
 | 
					 | 
				
			||||||
				if( strchr( Channel_UserModes( chan, cl ), 'o' )) strlcat( str, "@", sizeof( str ));
 | 
					 | 
				
			||||||
				strlcat( str, Client_ID( cl ), sizeof( str ));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				if( strlen( str ) > ( LINE_LEN - CLIENT_NICK_LEN - 8 ))
 | 
					 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
					/* Zeile senden */
 | 
					 | 
				
			||||||
					if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
 | 
					 | 
				
			||||||
					snprintf( str, sizeof( str ), "NJOIN %s :", Channel_Name( chan ));
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				
 | 
					 | 
				
			||||||
				cl2chan = Channel_NextMember( chan, cl2chan );
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			/* noch Daten da? */
 | 
					 | 
				
			||||||
			if( str[strlen( str ) - 1] != ':')
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				/* Ja; Also senden ... */
 | 
					 | 
				
			||||||
				if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef IRCPLUS
 | 
					#ifdef IRCPLUS
 | 
				
			||||||
			if( strchr( Client_Flags( Client ), 'L' ))
 | 
							}
 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
#ifdef DEBUG
 | 
					 | 
				
			||||||
				Log( LOG_DEBUG, "Synchronizing INVITE- and BAN-lists ..." );
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
				/* Synchronize INVITE- and BAN-lists */
 | 
					 | 
				
			||||||
				if( ! Lists_SendInvites( Client )) return DISCONNECTED;
 | 
					 | 
				
			||||||
				if( ! Lists_SendBans( Client )) return DISCONNECTED;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			/* naechsten Channel suchen */
 | 
							return IRC_Num_ENDOFMOTD(Client, Req);
 | 
				
			||||||
			chan = Channel_Next( chan );
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		return CONNECTED;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else if( Client_Type( Client ) == CLIENT_SERVER )
 | 
						else if( Client_Type( Client ) == CLIENT_SERVER )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@@ -304,8 +200,9 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
		IRC_WriteStrServersPrefix( Client, from, "SERVER %s %d %d :%s", Client_ID( c ), Client_Hops( c ) + 1, Client_MyToken( c ), Client_Info( c ));
 | 
							IRC_WriteStrServersPrefix( Client, from, "SERVER %s %d %d :%s", Client_ID( c ), Client_Hops( c ) + 1, Client_MyToken( c ), Client_Info( c ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return CONNECTED;
 | 
							return CONNECTED;
 | 
				
			||||||
	}
 | 
						} else
 | 
				
			||||||
	else return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
							return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
				
			||||||
 | 
										  Client_ID(Client), Req->command);
 | 
				
			||||||
} /* IRC_SERVER */
 | 
					} /* IRC_SERVER */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,7 @@
 | 
				
			|||||||
 * (at your option) any later version.
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
					 * Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * $Id: irc-server.h,v 1.5 2005/03/19 18:43:49 fw Exp $
 | 
					 * $Id: irc-server.h,v 1.6 2007/11/21 12:16:36 alex Exp $
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * IRC commands for server links (header)
 | 
					 * IRC commands for server links (header)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@@ -22,6 +22,8 @@ GLOBAL bool IRC_SERVER PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
				
			|||||||
GLOBAL bool IRC_NJOIN PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
					GLOBAL bool IRC_NJOIN PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
				
			||||||
GLOBAL bool IRC_SQUIT PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
					GLOBAL bool IRC_SQUIT PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GLOBAL bool IRC_ENDOFMOTD_Server PARAMS((CLIENT *Client));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "portab.h"
 | 
					#include "portab.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char UNUSED id[] = "$Id: irc-write.c,v 1.18 2005/04/27 07:39:18 alex Exp $";
 | 
					static char UNUSED id[] = "$Id: irc-write.c,v 1.21 2006/08/12 11:56:24 fw Exp $";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "imp.h"
 | 
					#include "imp.h"
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
@@ -39,7 +39,7 @@ static char UNUSED id[] = "$Id: irc-write.c,v 1.18 2005/04/27 07:39:18 alex Exp
 | 
				
			|||||||
#define SEND_TO_SERVER 2
 | 
					#define SEND_TO_SERVER 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL char *Get_Prefix PARAMS(( CLIENT *Target, CLIENT *Client ));
 | 
					static char *Get_Prefix PARAMS(( CLIENT *Target, CLIENT *Client ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef PROTOTYPES
 | 
					#ifdef PROTOTYPES
 | 
				
			||||||
@@ -378,7 +378,7 @@ va_dcl
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
			cl2chan = Channel_NextMember( chan, cl2chan );
 | 
								cl2chan = Channel_NextMember( chan, cl2chan );
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		
 | 
					
 | 
				
			||||||
		/* naechsten Channel */
 | 
							/* naechsten Channel */
 | 
				
			||||||
		chan_cl2chan = Channel_NextChannelOf( Client, chan_cl2chan );
 | 
							chan_cl2chan = Channel_NextChannelOf( Client, chan_cl2chan );
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -400,21 +400,22 @@ va_dcl
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL void
 | 
					GLOBAL void
 | 
				
			||||||
IRC_SetPenalty( CLIENT *Client, int Seconds )
 | 
					IRC_SetPenalty( CLIENT *Client, time_t Seconds )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	CONN_ID c;
 | 
						CONN_ID c;
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	assert( Client != NULL );
 | 
						assert( Client != NULL );
 | 
				
			||||||
	assert( Seconds > 0 );
 | 
						assert( Seconds > 0 );
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	if( Client_Type( Client ) == CLIENT_SERVER ) return;
 | 
						if( Client_Type( Client ) == CLIENT_SERVER ) return;
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	c = Client_Conn( Client );
 | 
						c = Client_Conn( Client );
 | 
				
			||||||
	if( c > NONE ) Conn_SetPenalty( c, Seconds );		
 | 
						if (c > NONE)
 | 
				
			||||||
 | 
							Conn_SetPenalty(c, Seconds);
 | 
				
			||||||
} /* IRC_SetPenalty */
 | 
					} /* IRC_SetPenalty */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL char *
 | 
					static char *
 | 
				
			||||||
Get_Prefix( CLIENT *Target, CLIENT *Client )
 | 
					Get_Prefix( CLIENT *Target, CLIENT *Client )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	assert( Target != NULL );
 | 
						assert( Target != NULL );
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,7 @@
 | 
				
			|||||||
 * (at your option) any later version.
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
					 * Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * $Id: irc-write.h,v 1.7 2005/03/19 18:43:49 fw Exp $
 | 
					 * $Id: irc-write.h,v 1.8 2006/05/10 21:24:01 alex Exp $
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Sending IRC commands over the network (header)
 | 
					 * Sending IRC commands over the network (header)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@@ -30,7 +30,7 @@ GLOBAL void IRC_WriteStrServersPrefixFlag PARAMS(( CLIENT *ExceptOf, CLIENT *Pre
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
GLOBAL bool IRC_WriteStrRelatedPrefix PARAMS(( CLIENT *Client, CLIENT *Prefix, bool Remote, char *Format, ... ));
 | 
					GLOBAL bool IRC_WriteStrRelatedPrefix PARAMS(( CLIENT *Client, CLIENT *Prefix, bool Remote, char *Format, ... ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL void IRC_SetPenalty PARAMS(( CLIENT *Client, int Seconds ));
 | 
					GLOBAL void IRC_SetPenalty PARAMS(( CLIENT *Client, time_t Seconds ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "portab.h"
 | 
					#include "portab.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char UNUSED id[] = "$Id: irc.c,v 1.126.2.1 2005/08/02 23:08:27 alex Exp $";
 | 
					static char UNUSED id[] = "$Id: irc.c,v 1.131 2006/07/23 14:55:40 alex Exp $";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "imp.h"
 | 
					#include "imp.h"
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
@@ -22,10 +22,9 @@ static char UNUSED id[] = "$Id: irc.c,v 1.126.2.1 2005/08/02 23:08:27 alex Exp $
 | 
				
			|||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "ngircd.h"
 | 
					#include "ngircd.h"
 | 
				
			||||||
#include "conn.h"
 | 
					 | 
				
			||||||
#include "resolve.h"
 | 
					#include "resolve.h"
 | 
				
			||||||
#include "conf.h"
 | 
					 | 
				
			||||||
#include "conn-func.h"
 | 
					#include "conn-func.h"
 | 
				
			||||||
 | 
					#include "conf.h"
 | 
				
			||||||
#include "client.h"
 | 
					#include "client.h"
 | 
				
			||||||
#include "channel.h"
 | 
					#include "channel.h"
 | 
				
			||||||
#include "defines.h"
 | 
					#include "defines.h"
 | 
				
			||||||
@@ -38,7 +37,7 @@ static char UNUSED id[] = "$Id: irc.c,v 1.126.2.1 2005/08/02 23:08:27 alex Exp $
 | 
				
			|||||||
#include "irc.h"
 | 
					#include "irc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL char *Option_String PARAMS(( CONN_ID Idx ));
 | 
					static char *Option_String PARAMS(( CONN_ID Idx ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool
 | 
					GLOBAL bool
 | 
				
			||||||
@@ -160,7 +159,7 @@ IRC_KILL( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
		Log( LOG_NOTICE, "Client with nick \"%s\" is unknown here.", Req->argv[0] );
 | 
							Log( LOG_NOTICE, "Client with nick \"%s\" is unknown here.", Req->argv[0] );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Are we still connected or were we killed, too? */
 | 
						/* Are we still connected or were we killed, too? */
 | 
				
			||||||
	if(( my_conn > NONE ) && ( Client_GetFromConn( my_conn )))
 | 
						if(( my_conn > NONE ) && ( Conn_GetClient( my_conn )))
 | 
				
			||||||
		return CONNECTED;
 | 
							return CONNECTED;
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		return DISCONNECTED;
 | 
							return DISCONNECTED;
 | 
				
			||||||
@@ -325,17 +324,19 @@ IRC_HELP( CLIENT *Client, REQUEST *Req )
 | 
				
			|||||||
} /* IRC_HELP */
 | 
					} /* IRC_HELP */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL char *
 | 
					static char *
 | 
				
			||||||
Option_String( CONN_ID Idx )
 | 
					Option_String( CONN_ID Idx )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	static char option_txt[8];
 | 
						static char option_txt[8];
 | 
				
			||||||
	int options;
 | 
						UINT16 options;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	options = Conn_Options( Idx );
 | 
						options = Conn_Options(Idx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	strcpy( option_txt, "F" );	/* No idea what this means but the original ircd sends it ... */
 | 
						strcpy(option_txt, "F");	/* No idea what this means, but the
 | 
				
			||||||
 | 
										 * original ircd sends it ... */
 | 
				
			||||||
#ifdef ZLIB
 | 
					#ifdef ZLIB
 | 
				
			||||||
	if( options & CONN_ZIP ) strcat( option_txt, "z" );
 | 
						if(options & CONN_ZIP)		/* zlib compression supported. */
 | 
				
			||||||
 | 
							strcat(option_txt, "z");
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return option_txt;
 | 
						return option_txt;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "portab.h"
 | 
					#include "portab.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char UNUSED id[] = "$Id: lists.c,v 1.17 2005/03/19 18:43:49 fw Exp $";
 | 
					static char UNUSED id[] = "$Id: lists.c,v 1.21 2007/01/29 21:13:26 fw Exp $";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "imp.h"
 | 
					#include "imp.h"
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
@@ -35,326 +35,131 @@ static char UNUSED id[] = "$Id: lists.c,v 1.17 2005/03/19 18:43:49 fw Exp $";
 | 
				
			|||||||
#include "exp.h"
 | 
					#include "exp.h"
 | 
				
			||||||
#include "lists.h"
 | 
					#include "lists.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MASK_LEN	(2*CLIENT_HOST_LEN)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MASK_LEN 2*CLIENT_HOST_LEN
 | 
					struct list_elem {
 | 
				
			||||||
 | 
						struct list_elem *next;
 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct _C2C
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct _C2C *next;
 | 
					 | 
				
			||||||
	char mask[MASK_LEN];
 | 
						char mask[MASK_LEN];
 | 
				
			||||||
	CHANNEL *channel;
 | 
					 | 
				
			||||||
	bool onlyonce;
 | 
						bool onlyonce;
 | 
				
			||||||
} C2C;
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL C2C *My_Invites, *My_Bans;
 | 
					GLOBAL const char *
 | 
				
			||||||
 | 
					Lists_GetMask(const struct list_elem *e)
 | 
				
			||||||
 | 
					 | 
				
			||||||
LOCAL C2C *New_C2C PARAMS(( char *Mask, CHANNEL *Chan, bool OnlyOnce ));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LOCAL bool Check_List PARAMS(( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan ));
 | 
					 | 
				
			||||||
LOCAL bool Already_Registered PARAMS(( C2C *Cl2Chan, char *Mask, CHANNEL *Chan ));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
GLOBAL void
 | 
					 | 
				
			||||||
Lists_Init( void )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Modul initialisieren */
 | 
						return e->mask;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
	My_Invites = My_Bans = NULL;
 | 
					 | 
				
			||||||
} /* Lists_Init */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL void
 | 
					GLOBAL struct list_elem*
 | 
				
			||||||
Lists_Exit( void )
 | 
					Lists_GetFirst(const struct list_head *h)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Modul abmelden */
 | 
						return h->first;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
	C2C *c2c, *next;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Invite-Lists freigeben */
 | 
					 | 
				
			||||||
	c2c = My_Invites;
 | 
					 | 
				
			||||||
	while( c2c )
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		next = c2c->next;
 | 
					 | 
				
			||||||
		free( c2c );
 | 
					 | 
				
			||||||
		c2c = next;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Ban-Lists freigeben */
 | 
					 | 
				
			||||||
	c2c = My_Bans;
 | 
					 | 
				
			||||||
	while( c2c )
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		next = c2c->next;
 | 
					 | 
				
			||||||
		free( c2c );
 | 
					 | 
				
			||||||
		c2c = next;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
} /* Lists_Exit */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool
 | 
					GLOBAL struct list_elem*
 | 
				
			||||||
Lists_CheckInvited( CLIENT *Client, CHANNEL *Chan )
 | 
					Lists_GetNext(const struct list_elem *e)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return Check_List( &My_Invites, Client, Chan );
 | 
						return e->next;
 | 
				
			||||||
} /* Lists_CheckInvited */
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool
 | 
					bool
 | 
				
			||||||
Lists_IsInviteEntry( char *Mask, CHANNEL *Chan )
 | 
					Lists_Add(struct list_head *header, const char *Mask, bool OnlyOnce )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						struct list_elem *e, *newelem;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert( header != NULL );
 | 
				
			||||||
	assert( Mask != NULL );
 | 
						assert( Mask != NULL );
 | 
				
			||||||
	assert( Chan != NULL );
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	return Already_Registered( My_Invites, Mask, Chan );
 | 
					 | 
				
			||||||
} /* Lists_IsInviteEntry */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (Lists_CheckDupeMask(header, Mask )) return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool
 | 
						e = Lists_GetFirst(header);
 | 
				
			||||||
Lists_AddInvited( char *Mask, CHANNEL *Chan, bool OnlyOnce )
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	C2C *c2c;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert( Mask != NULL );
 | 
						newelem = malloc(sizeof(struct list_elem));
 | 
				
			||||||
	assert( Chan != NULL );
 | 
						if( ! newelem ) {
 | 
				
			||||||
 | 
							Log( LOG_EMERG, "Can't allocate memory for new Ban/Invite entry!" );
 | 
				
			||||||
	if( Already_Registered( My_Invites, Mask, Chan )) return true;
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	c2c = New_C2C( Mask, Chan, OnlyOnce );
 | 
					 | 
				
			||||||
	if( ! c2c )
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		Log( LOG_ERR, "Can't add new invite list entry!" );
 | 
					 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* verketten */
 | 
						strlcpy( newelem->mask, Mask, sizeof( newelem->mask ));
 | 
				
			||||||
	c2c->next = My_Invites;
 | 
						newelem->onlyonce = OnlyOnce;
 | 
				
			||||||
	My_Invites = c2c;
 | 
						newelem->next = e;
 | 
				
			||||||
 | 
						header->first = newelem;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Log( LOG_DEBUG, "Added \"%s\" to invite list for \"%s\".", Mask, Channel_Name( Chan ));
 | 
						LogDebug("Added \"%s\" to invite list", Mask);
 | 
				
			||||||
	return true;
 | 
						return true;
 | 
				
			||||||
} /* Lists_AddInvited */
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					Lists_Unlink(struct list_head *header, struct list_elem *p, struct list_elem *victim)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						assert(victim != NULL);
 | 
				
			||||||
 | 
						assert(header != NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (p) p->next = victim->next;
 | 
				
			||||||
 | 
						else header->first = victim->next;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						free(victim);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL void
 | 
					GLOBAL void
 | 
				
			||||||
Lists_DelInvited( char *Mask, CHANNEL *Chan )
 | 
					Lists_Del(struct list_head *header, const char *Mask)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	C2C *c2c, *last, *next;
 | 
						struct list_elem *e, *last, *victim;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert( header != NULL );
 | 
				
			||||||
	assert( Mask != NULL );
 | 
						assert( Mask != NULL );
 | 
				
			||||||
	assert( Chan != NULL );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	last = NULL;
 | 
						last = NULL;
 | 
				
			||||||
	c2c = My_Invites;
 | 
						e = Lists_GetFirst(header);
 | 
				
			||||||
	while( c2c )
 | 
						while( e ) {
 | 
				
			||||||
	{
 | 
							if(strcasecmp( e->mask, Mask ) == 0 ) {
 | 
				
			||||||
		next = c2c->next;
 | 
								LogDebug("Deleted \"%s\" from list", e->mask);
 | 
				
			||||||
		if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 ))
 | 
								victim = e;
 | 
				
			||||||
		{
 | 
								e = victim->next;
 | 
				
			||||||
			/* dieser Eintrag muss geloescht werden */
 | 
								Lists_Unlink(header, last, victim);
 | 
				
			||||||
			Log( LOG_DEBUG, "Deleted \"%s\" from invite list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
 | 
								continue;
 | 
				
			||||||
			if( last ) last->next = next;
 | 
					 | 
				
			||||||
			else My_Invites = next;
 | 
					 | 
				
			||||||
			free( c2c );
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else last = c2c;
 | 
							last = e;
 | 
				
			||||||
		c2c = next;
 | 
							e = e->next;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
} /* Lists_DelInvited */
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
GLOBAL bool
 | 
					 | 
				
			||||||
Lists_ShowInvites( CLIENT *Client, CHANNEL *Channel )
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	C2C *c2c;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	assert( Client != NULL );
 | 
					 | 
				
			||||||
	assert( Channel != NULL );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	c2c = My_Invites;
 | 
					 | 
				
			||||||
	while( c2c )
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if( c2c->channel == Channel )
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			/* Eintrag fuer Channel gefunden; ausgeben: */
 | 
					 | 
				
			||||||
			if( ! IRC_WriteStrClient( Client, RPL_INVITELIST_MSG, Client_ID( Client ), Channel_Name( Channel ), c2c->mask )) return DISCONNECTED;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		c2c = c2c->next;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return IRC_WriteStrClient( Client, RPL_ENDOFINVITELIST_MSG, Client_ID( Client ), Channel_Name( Channel ));
 | 
					 | 
				
			||||||
} /* Lists_ShowInvites */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
GLOBAL bool
 | 
					 | 
				
			||||||
Lists_SendInvites( CLIENT *Client )
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	C2C *c2c;
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	assert( Client != NULL );
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	c2c = My_Invites;
 | 
					 | 
				
			||||||
	while( c2c )
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if( ! IRC_WriteStrClient( Client, "MODE %s +I %s", Channel_Name( c2c->channel ), c2c->mask )) return DISCONNECTED;
 | 
					 | 
				
			||||||
		c2c = c2c->next;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return CONNECTED;
 | 
					 | 
				
			||||||
} /* Lists_SendInvites */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
GLOBAL bool
 | 
					 | 
				
			||||||
Lists_SendBans( CLIENT *Client )
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	C2C *c2c;
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	assert( Client != NULL );
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	c2c = My_Bans;
 | 
					 | 
				
			||||||
	while( c2c )
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if( ! IRC_WriteStrClient( Client, "MODE %s +b %s", Channel_Name( c2c->channel ), c2c->mask )) return DISCONNECTED;
 | 
					 | 
				
			||||||
		c2c = c2c->next;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return CONNECTED;
 | 
					 | 
				
			||||||
} /* Lists_SendBans */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
GLOBAL bool
 | 
					 | 
				
			||||||
Lists_CheckBanned( CLIENT *Client, CHANNEL *Chan )
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return Check_List( &My_Bans, Client, Chan );
 | 
					 | 
				
			||||||
} /* Lists_CheckBanned */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
GLOBAL bool
 | 
					 | 
				
			||||||
Lists_IsBanEntry( char *Mask, CHANNEL *Chan )
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	assert( Mask != NULL );
 | 
					 | 
				
			||||||
	assert( Chan != NULL );
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	return Already_Registered( My_Bans, Mask, Chan );
 | 
					 | 
				
			||||||
} /* Lists_IsBanEntry */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
GLOBAL bool
 | 
					 | 
				
			||||||
Lists_AddBanned( char *Mask, CHANNEL *Chan )
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	C2C *c2c;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	assert( Mask != NULL );
 | 
					 | 
				
			||||||
	assert( Chan != NULL );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if( Already_Registered( My_Bans, Mask, Chan )) return true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	c2c = New_C2C( Mask, Chan, false );
 | 
					 | 
				
			||||||
	if( ! c2c )
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		Log( LOG_ERR, "Can't add new ban list entry!" );
 | 
					 | 
				
			||||||
		return false;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* verketten */
 | 
					 | 
				
			||||||
	c2c->next = My_Bans;
 | 
					 | 
				
			||||||
	My_Bans = c2c;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	Log( LOG_DEBUG, "Added \"%s\" to ban list for \"%s\".", Mask, Channel_Name( Chan ));
 | 
					 | 
				
			||||||
	return true;
 | 
					 | 
				
			||||||
} /* Lists_AddBanned */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL void
 | 
					GLOBAL void
 | 
				
			||||||
Lists_DelBanned( char *Mask, CHANNEL *Chan )
 | 
					Lists_Free(struct list_head *head)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	C2C *c2c, *last, *next;
 | 
						struct list_elem *e, *victim;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert( Mask != NULL );
 | 
						assert(head != NULL);
 | 
				
			||||||
	assert( Chan != NULL );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	last = NULL;
 | 
						e = head->first;
 | 
				
			||||||
	c2c = My_Bans;
 | 
						head->first = NULL;
 | 
				
			||||||
	while( c2c )
 | 
						while (e) {
 | 
				
			||||||
	{
 | 
							LogDebug("Deleted \"%s\" from invite list" , e->mask);
 | 
				
			||||||
		next = c2c->next;
 | 
							victim = e;
 | 
				
			||||||
		if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 ))
 | 
							e = e->next;
 | 
				
			||||||
		{
 | 
							free( victim );
 | 
				
			||||||
			/* dieser Eintrag muss geloescht werden */
 | 
					 | 
				
			||||||
			Log( LOG_DEBUG, "Deleted \"%s\" from ban list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
 | 
					 | 
				
			||||||
			if( last ) last->next = next;
 | 
					 | 
				
			||||||
			else My_Bans = next;
 | 
					 | 
				
			||||||
			free( c2c );
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		else last = c2c;
 | 
					 | 
				
			||||||
		c2c = next;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
} /* Lists_DelBanned */
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool
 | 
					GLOBAL bool
 | 
				
			||||||
Lists_ShowBans( CLIENT *Client, CHANNEL *Channel )
 | 
					Lists_CheckDupeMask(const struct list_head *h, const char *Mask )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	C2C *c2c;
 | 
						struct list_elem *e;
 | 
				
			||||||
 | 
						e = h->first;
 | 
				
			||||||
	assert( Client != NULL );
 | 
						while (e) {
 | 
				
			||||||
	assert( Channel != NULL );
 | 
							if (strcasecmp( e->mask, Mask ) == 0 )
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
	c2c = My_Bans;
 | 
							e = e->next;
 | 
				
			||||||
	while( c2c )
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if( c2c->channel == Channel )
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			/* Eintrag fuer Channel gefunden; ausgeben: */
 | 
					 | 
				
			||||||
			if( ! IRC_WriteStrClient( Client, RPL_BANLIST_MSG, Client_ID( Client ), Channel_Name( Channel ), c2c->mask )) return DISCONNECTED;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		c2c = c2c->next;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return IRC_WriteStrClient( Client, RPL_ENDOFBANLIST_MSG, Client_ID( Client ), Channel_Name( Channel ));
 | 
						return false;
 | 
				
			||||||
} /* Lists_ShowBans */
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
GLOBAL void
 | 
					 | 
				
			||||||
Lists_DeleteChannel( CHANNEL *Chan )
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	/* Channel wurde geloescht, Invite- und Ban-Lists aufraeumen */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	C2C *c2c, *last, *next;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Invite-List */
 | 
					 | 
				
			||||||
	last = NULL;
 | 
					 | 
				
			||||||
	c2c = My_Invites;
 | 
					 | 
				
			||||||
	while( c2c )
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		next = c2c->next;
 | 
					 | 
				
			||||||
		if( c2c->channel == Chan )
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			/* dieser Eintrag muss geloescht werden */
 | 
					 | 
				
			||||||
			Log( LOG_DEBUG, "Deleted \"%s\" from invite list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
 | 
					 | 
				
			||||||
			if( last ) last->next = next;
 | 
					 | 
				
			||||||
			else My_Invites = next;
 | 
					 | 
				
			||||||
			free( c2c );
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		else last = c2c;
 | 
					 | 
				
			||||||
		c2c = next;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Ban-List */
 | 
					 | 
				
			||||||
	last = NULL;
 | 
					 | 
				
			||||||
	c2c = My_Bans;
 | 
					 | 
				
			||||||
	while( c2c )
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		next = c2c->next;
 | 
					 | 
				
			||||||
		if( c2c->channel == Chan )
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			/* dieser Eintrag muss geloescht werden */
 | 
					 | 
				
			||||||
			Log( LOG_DEBUG, "Deleted \"%s\" from ban list for \"%s\"." , c2c->mask, Channel_Name( Chan ));
 | 
					 | 
				
			||||||
			if( last ) last->next = next;
 | 
					 | 
				
			||||||
			else My_Bans = next;
 | 
					 | 
				
			||||||
			free( c2c );
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		else last = c2c;
 | 
					 | 
				
			||||||
		c2c = next;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
} /* Lists_DeleteChannel */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL char *
 | 
					GLOBAL char *
 | 
				
			||||||
@@ -407,82 +212,30 @@ Lists_MakeMask( char *Pattern )
 | 
				
			|||||||
} /* Lists_MakeMask */
 | 
					} /* Lists_MakeMask */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL C2C *
 | 
					
 | 
				
			||||||
New_C2C( char *Mask, CHANNEL *Chan, bool OnlyOnce )
 | 
					bool
 | 
				
			||||||
 | 
					Lists_Check( struct list_head *header, CLIENT *Client)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	C2C *c2c;
 | 
						struct list_elem *e, *last;
 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	assert( Mask != NULL );
 | 
					 | 
				
			||||||
	assert( Chan != NULL );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Speicher fuer Eintrag anfordern */
 | 
						assert( header != NULL );
 | 
				
			||||||
	c2c = (C2C *)malloc( sizeof( C2C ));
 | 
					 | 
				
			||||||
	if( ! c2c )
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		Log( LOG_EMERG, "Can't allocate memory! [New_C2C]" );
 | 
					 | 
				
			||||||
		return NULL;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	strlcpy( c2c->mask, Mask, sizeof( c2c->mask ));
 | 
						e = header->first;
 | 
				
			||||||
	c2c->channel = Chan;
 | 
					 | 
				
			||||||
	c2c->onlyonce = OnlyOnce;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return c2c;
 | 
					 | 
				
			||||||
} /* New_C2C */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LOCAL bool
 | 
					 | 
				
			||||||
Check_List( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan )
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	C2C *c2c, *last;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	assert( Cl2Chan != NULL );
 | 
					 | 
				
			||||||
	assert( Client != NULL );
 | 
					 | 
				
			||||||
	assert( Chan != NULL );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	c2c = *Cl2Chan;
 | 
					 | 
				
			||||||
	last = NULL;
 | 
						last = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while( c2c )
 | 
						while( e ) {
 | 
				
			||||||
	{
 | 
							if( Match( e->mask, Client_Mask( Client ))) {
 | 
				
			||||||
		if( c2c->channel == Chan )
 | 
								if( e->onlyonce ) { /* delete entry */
 | 
				
			||||||
		{
 | 
									LogDebug("Deleted \"%s\" from list", e->mask);
 | 
				
			||||||
			/* Ok, richtiger Channel. Passt die Maske? */
 | 
									Lists_Unlink(header, last, e);
 | 
				
			||||||
			if( Match( c2c->mask, Client_Mask( Client )))
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				/* Treffer! */
 | 
					 | 
				
			||||||
				if( c2c->onlyonce )
 | 
					 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
					/* Eintrag loeschen */
 | 
					 | 
				
			||||||
					Log( LOG_DEBUG, "Deleted \"%s\" from %s list for \"%s\".", c2c->mask, *Cl2Chan == My_Invites ? "invite" : "ban", Channel_Name( Chan ));
 | 
					 | 
				
			||||||
					if( last ) last->next = c2c->next;
 | 
					 | 
				
			||||||
					else *Cl2Chan = c2c->next;
 | 
					 | 
				
			||||||
					free( c2c );
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return true;
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		last = c2c;
 | 
							last = e;
 | 
				
			||||||
		c2c = c2c->next;
 | 
							e = e->next;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return false;
 | 
						return false;
 | 
				
			||||||
} /* Check_List */
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LOCAL bool
 | 
					 | 
				
			||||||
Already_Registered( C2C *List, char *Mask, CHANNEL *Chan )
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	C2C *c2c;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	c2c = List;
 | 
					 | 
				
			||||||
	while( c2c )
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 )) return true;
 | 
					 | 
				
			||||||
		c2c = c2c->next;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return false;
 | 
					 | 
				
			||||||
} /* Already_Registered */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* -eof- */
 | 
					/* -eof- */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,7 @@
 | 
				
			|||||||
 * (at your option) any later version.
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
					 * Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * $Id: lists.h,v 1.12 2005/03/19 18:43:49 fw Exp $
 | 
					 * $Id: lists.h,v 1.13 2006/12/07 17:57:20 fw Exp $
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Management of IRC lists: ban, invite, ... (header)
 | 
					 * Management of IRC lists: ban, invite, ... (header)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@@ -16,31 +16,31 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#ifndef __lists_h__
 | 
					#ifndef __lists_h__
 | 
				
			||||||
#define __lists_h__
 | 
					#define __lists_h__
 | 
				
			||||||
 | 
					#include "portab.h"
 | 
				
			||||||
 | 
					#include "client.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct list_elem;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct list_head {
 | 
				
			||||||
 | 
						struct list_elem *first;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL void Lists_Init PARAMS(( void ));
 | 
					GLOBAL struct list_elem *Lists_GetFirst PARAMS((const struct list_head *));
 | 
				
			||||||
GLOBAL void Lists_Exit PARAMS(( void ));
 | 
					GLOBAL struct list_elem *Lists_GetNext PARAMS((const struct list_elem *));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool Lists_CheckInvited PARAMS(( CLIENT *Client, CHANNEL *Chan ));
 | 
					GLOBAL bool Lists_Check PARAMS((struct list_head *head, CLIENT *client ));
 | 
				
			||||||
GLOBAL bool Lists_AddInvited PARAMS(( char *Mask, CHANNEL *Chan, bool OnlyOnce ));
 | 
					GLOBAL bool Lists_CheckDupeMask PARAMS((const struct list_head *head, const char *mask ));
 | 
				
			||||||
GLOBAL void Lists_DelInvited PARAMS(( char *Mask, CHANNEL *Chan ));
 | 
					 | 
				
			||||||
GLOBAL bool Lists_ShowInvites PARAMS(( CLIENT *Client, CHANNEL *Channel ));
 | 
					 | 
				
			||||||
GLOBAL bool Lists_SendInvites PARAMS(( CLIENT *Client ));
 | 
					 | 
				
			||||||
GLOBAL bool Lists_IsInviteEntry PARAMS(( char *Mask, CHANNEL *Chan ));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool Lists_CheckBanned PARAMS(( CLIENT *Client, CHANNEL *Chan ));
 | 
					GLOBAL bool Lists_Add PARAMS((struct list_head *header, const char *Mask, bool OnlyOnce ));
 | 
				
			||||||
GLOBAL bool Lists_AddBanned PARAMS(( char *Mask, CHANNEL *Chan ));
 | 
					GLOBAL void Lists_Del PARAMS((struct list_head *head, const char *Mask ));
 | 
				
			||||||
GLOBAL void Lists_DelBanned PARAMS(( char *Mask, CHANNEL *Chan ));
 | 
					 | 
				
			||||||
GLOBAL bool Lists_ShowBans PARAMS(( CLIENT *Client, CHANNEL *Channel ));
 | 
					 | 
				
			||||||
GLOBAL bool Lists_SendBans PARAMS(( CLIENT *Client ));
 | 
					 | 
				
			||||||
GLOBAL bool Lists_IsBanEntry PARAMS(( char *Mask, CHANNEL *Chan ));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL void Lists_DeleteChannel PARAMS(( CHANNEL *Chan ));
 | 
					GLOBAL bool Lists_AlreadyRegistered PARAMS(( const struct list_head *head, const char *Mask));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GLOBAL void Lists_Free PARAMS(( struct list_head *head ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL char *Lists_MakeMask PARAMS(( char *Pattern ));
 | 
					GLOBAL char *Lists_MakeMask PARAMS(( char *Pattern ));
 | 
				
			||||||
 | 
					GLOBAL const char *Lists_GetMask PARAMS(( const struct list_elem *e ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* -eof- */
 | 
					/* -eof- */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "portab.h"
 | 
					#include "portab.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char UNUSED id[] = "$Id: log.c,v 1.57.2.1 2005/08/29 11:19:48 alex Exp $";
 | 
					static char UNUSED id[] = "$Id: log.c,v 1.62 2006/08/05 09:16:21 fw Exp $";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "imp.h"
 | 
					#include "imp.h"
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
@@ -44,15 +44,15 @@ static char UNUSED id[] = "$Id: log.c,v 1.57.2.1 2005/08/29 11:19:48 alex Exp $"
 | 
				
			|||||||
#include "log.h"
 | 
					#include "log.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL char Init_Txt[127];
 | 
					static char Init_Txt[127];
 | 
				
			||||||
LOCAL bool Is_Daemon;
 | 
					static bool Is_Daemon;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef DEBUG
 | 
					#ifdef DEBUG
 | 
				
			||||||
LOCAL char Error_File[FNAME_LEN];
 | 
					static char Error_File[FNAME_LEN];
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL void Wall_ServerNotice PARAMS(( char *Msg ));
 | 
					static void Wall_ServerNotice PARAMS(( char *Msg ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL void
 | 
					GLOBAL void
 | 
				
			||||||
@@ -162,6 +162,51 @@ Log_Exit( void )
 | 
				
			|||||||
} /* Log_Exit */
 | 
					} /* Log_Exit */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Log function for debug messages.
 | 
				
			||||||
 | 
					 * This function is only functional when the program is compiled with debug
 | 
				
			||||||
 | 
					 * code enabled; otherwise it is an empty function which the compiler will
 | 
				
			||||||
 | 
					 * hopefully mangle down to "nothing" (see log.h). Therefore you should use
 | 
				
			||||||
 | 
					 * LogDebug(...) in favor to Log(LOG_DEBUG, ...).
 | 
				
			||||||
 | 
					 * @param Format Format string like printf().
 | 
				
			||||||
 | 
					 * @param ... Further arguments.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#ifdef DEBUG
 | 
				
			||||||
 | 
					# ifdef PROTOTYPES
 | 
				
			||||||
 | 
					GLOBAL void
 | 
				
			||||||
 | 
					LogDebug( const char *Format, ... )
 | 
				
			||||||
 | 
					# else
 | 
				
			||||||
 | 
					GLOBAL void
 | 
				
			||||||
 | 
					LogDebug( Format, va_alist )
 | 
				
			||||||
 | 
					const char *Format;
 | 
				
			||||||
 | 
					va_dcl
 | 
				
			||||||
 | 
					# endif /* PROTOTYPES */
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char msg[MAX_LOG_MSG_LEN];
 | 
				
			||||||
 | 
						va_list ap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!NGIRCd_Debug) return;
 | 
				
			||||||
 | 
					#ifdef PROTOTYPES
 | 
				
			||||||
 | 
						va_start( ap, Format );
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						va_start( ap );
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap );
 | 
				
			||||||
 | 
						va_end( ap );
 | 
				
			||||||
 | 
						Log(LOG_DEBUG, "%s", msg);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif	/* DEBUG */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Logging function of ngIRCd.
 | 
				
			||||||
 | 
					 * This function logs messages to the console and/or syslog, whichever is
 | 
				
			||||||
 | 
					 * suitable for the mode ngIRCd is running in (daemon vs. non-daemon).
 | 
				
			||||||
 | 
					 * Please note: you sould use LogDebug(...) for debug messages!
 | 
				
			||||||
 | 
					 * @param Level syslog level (LOG_xxx)
 | 
				
			||||||
 | 
					 * @param Format Format string like printf().
 | 
				
			||||||
 | 
					 * @param ... Further arguments.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
#ifdef PROTOTYPES
 | 
					#ifdef PROTOTYPES
 | 
				
			||||||
GLOBAL void
 | 
					GLOBAL void
 | 
				
			||||||
Log( int Level, const char *Format, ... )
 | 
					Log( int Level, const char *Format, ... )
 | 
				
			||||||
@@ -174,7 +219,6 @@ va_dcl
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Eintrag in Logfile(s) schreiben */
 | 
						/* Eintrag in Logfile(s) schreiben */
 | 
				
			||||||
 | 
					 | 
				
			||||||
	char msg[MAX_LOG_MSG_LEN];
 | 
						char msg[MAX_LOG_MSG_LEN];
 | 
				
			||||||
	bool snotice;
 | 
						bool snotice;
 | 
				
			||||||
	va_list ap;
 | 
						va_list ap;
 | 
				
			||||||
@@ -306,7 +350,7 @@ va_dcl
 | 
				
			|||||||
 * Send log messages to users flagged with the "s" mode.
 | 
					 * Send log messages to users flagged with the "s" mode.
 | 
				
			||||||
 * @param Msg The message to send.
 | 
					 * @param Msg The message to send.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
LOCAL void
 | 
					static void
 | 
				
			||||||
Wall_ServerNotice( char *Msg )
 | 
					Wall_ServerNotice( char *Msg )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	CLIENT *c;
 | 
						CLIENT *c;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,7 @@
 | 
				
			|||||||
 * (at your option) any later version.
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
					 * Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * $Id: log.h,v 1.18 2005/06/24 19:55:10 alex Exp $
 | 
					 * $Id: log.h,v 1.20 2006/08/05 09:16:21 fw Exp $
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Logging functions (header)
 | 
					 * Logging functions (header)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@@ -40,6 +40,13 @@ GLOBAL void Log_Exit PARAMS(( void ));
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
GLOBAL void Log PARAMS(( int Level, const char *Format, ... ));
 | 
					GLOBAL void Log PARAMS(( int Level, const char *Format, ... ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef DEBUG
 | 
				
			||||||
 | 
					GLOBAL void LogDebug PARAMS(( const char *Format, ... ));
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					static inline void LogDebug PARAMS(( UNUSED const char *Format, ... )){/* Do nothing. The compiler should optimize this out, please ;-) */}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL void Log_Init_Resolver PARAMS(( void ));
 | 
					GLOBAL void Log_Init_Resolver PARAMS(( void ));
 | 
				
			||||||
GLOBAL void Log_Exit_Resolver PARAMS(( void ));
 | 
					GLOBAL void Log_Exit_Resolver PARAMS(( void ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "portab.h"
 | 
					#include "portab.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char UNUSED id[] = "$Id: match.c,v 1.3 2005/03/19 18:43:49 fw Exp $";
 | 
					static char UNUSED id[] = "$Id: match.c,v 1.5 2006/10/06 21:23:47 fw Exp $";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "imp.h"
 | 
					#include "imp.h"
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
@@ -32,8 +32,8 @@ static char UNUSED id[] = "$Id: match.c,v 1.3 2005/03/19 18:43:49 fw Exp $";
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL int Matche PARAMS(( char *p, char *t ));
 | 
					static int Matche PARAMS(( const char *p, const char *t ));
 | 
				
			||||||
LOCAL int Matche_After_Star PARAMS(( char *p, char *t ));
 | 
					static int Matche_After_Star PARAMS(( const char *p, const char *t ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MATCH_PATTERN	6	/* bad pattern */
 | 
					#define MATCH_PATTERN	6	/* bad pattern */
 | 
				
			||||||
@@ -45,7 +45,7 @@ LOCAL int Matche_After_Star PARAMS(( char *p, char *t ));
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool
 | 
					GLOBAL bool
 | 
				
			||||||
Match( char *Pattern, char *String )
 | 
					Match( const char *Pattern, const char *String )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Pattern mit String vergleichen */
 | 
						/* Pattern mit String vergleichen */
 | 
				
			||||||
	if( Matche( Pattern, String ) == MATCH_VALID ) return true;
 | 
						if( Matche( Pattern, String ) == MATCH_VALID ) return true;
 | 
				
			||||||
@@ -53,8 +53,8 @@ Match( char *Pattern, char *String )
 | 
				
			|||||||
} /* Match */
 | 
					} /* Match */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL int
 | 
					static int
 | 
				
			||||||
Matche( char *p, char *t )
 | 
					Matche( const char *p, const char *t )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	register char range_start, range_end;
 | 
						register char range_start, range_end;
 | 
				
			||||||
	bool invert;
 | 
						bool invert;
 | 
				
			||||||
@@ -200,8 +200,8 @@ Matche( char *p, char *t )
 | 
				
			|||||||
} /* Matche */
 | 
					} /* Matche */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL int
 | 
					static int
 | 
				
			||||||
Matche_After_Star( char *p, char *t )
 | 
					Matche_After_Star( const char *p, const char *t )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	register int nextp, match = 0;
 | 
						register int nextp, match = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,7 @@
 | 
				
			|||||||
 * (at your option) any later version.
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
					 * Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * $Id: match.h,v 1.3 2005/03/19 18:43:49 fw Exp $
 | 
					 * $Id: match.h,v 1.4 2006/10/06 21:23:47 fw Exp $
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Wildcard pattern matching (header)
 | 
					 * Wildcard pattern matching (header)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@@ -18,7 +18,7 @@
 | 
				
			|||||||
#define __match_h__
 | 
					#define __match_h__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool Match PARAMS(( char *Pattern, char *String ));
 | 
					GLOBAL bool Match PARAMS(( const char *Pattern, const char *String ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,7 @@
 | 
				
			|||||||
 * (at your option) any later version.
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
					 * Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * $Id: messages.h,v 1.66 2004/02/28 02:18:16 alex Exp $
 | 
					 * $Id: messages.h,v 1.74 2007/12/11 11:29:44 fw Exp $
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * IRC numerics (Header)
 | 
					 * IRC numerics (Header)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@@ -22,7 +22,8 @@
 | 
				
			|||||||
#define RPL_YOURHOST_MSG		"002 %s :Your host is %s, running version ngircd-%s (%s/%s/%s)"
 | 
					#define RPL_YOURHOST_MSG		"002 %s :Your host is %s, running version ngircd-%s (%s/%s/%s)"
 | 
				
			||||||
#define RPL_CREATED_MSG			"003 %s :This server has been started %s"
 | 
					#define RPL_CREATED_MSG			"003 %s :This server has been started %s"
 | 
				
			||||||
#define RPL_MYINFO_MSG			"004 %s %s ngircd-%s %s %s"
 | 
					#define RPL_MYINFO_MSG			"004 %s %s ngircd-%s %s %s"
 | 
				
			||||||
#define RPL_ISUPPORT_MSG		"005 %s NICKLEN=%d TOPICLEN=%d AWAYLEN=%d MAXCHANNELS=%d :are supported on this server"
 | 
					#define RPL_ISUPPORT1_MSG		"005 %s RFC2812 CASEMAPPING=ascii PREFIX=(ov)@+ CHANTYPES=# CHANMODES=bI,k,l,imnPst CHANLIMIT=#:%d :are supported on this server"
 | 
				
			||||||
 | 
					#define RPL_ISUPPORT2_MSG		"005 %s CHANNELLEN=%d NICKLEN=%d TOPICLEN=%d AWAYLEN=%d KICKLEN=%d PENALTY :are supported on this server"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define RPL_TRACELINK_MSG		"200 %s Link %s-%s %s %s V%s %ld %d %d"
 | 
					#define RPL_TRACELINK_MSG		"200 %s Link %s-%s %s %s V%s %ld %d %d"
 | 
				
			||||||
#define RPL_TRACEOPERATOR_MSG		"204 %s Oper 2 :%s"
 | 
					#define RPL_TRACEOPERATOR_MSG		"204 %s Oper 2 :%s"
 | 
				
			||||||
@@ -31,18 +32,19 @@
 | 
				
			|||||||
#define RPL_STATSCOMMANDS_MSG		"212 %s %s %ld %ld %ld"
 | 
					#define RPL_STATSCOMMANDS_MSG		"212 %s %s %ld %ld %ld"
 | 
				
			||||||
#define RPL_ENDOFSTATS_MSG		"219 %s %c :End of STATS report"
 | 
					#define RPL_ENDOFSTATS_MSG		"219 %s %c :End of STATS report"
 | 
				
			||||||
#define RPL_UMODEIS_MSG			"221 %s +%s"
 | 
					#define RPL_UMODEIS_MSG			"221 %s +%s"
 | 
				
			||||||
 | 
					#define RPL_STATSUPTIME			"242 %s :Server Up %u days %u:%02u:%02u"
 | 
				
			||||||
#define RPL_LUSERCLIENT_MSG		"251 %s :There are %ld users and %ld services on %ld servers"
 | 
					#define RPL_LUSERCLIENT_MSG		"251 %s :There are %ld users and %ld services on %ld servers"
 | 
				
			||||||
#define RPL_LUSEROP_MSG			"252 %s %ld :operator(s) online"
 | 
					#define RPL_LUSEROP_MSG			"252 %s %lu :operator(s) online"
 | 
				
			||||||
#define RPL_LUSERUNKNOWN_MSG		"253 %s %ld :unknown connection(s)"
 | 
					#define RPL_LUSERUNKNOWN_MSG		"253 %s %lu :unknown connection(s)"
 | 
				
			||||||
#define RPL_LUSERCHANNELS_MSG		"254 %s %ld :channels formed"
 | 
					#define RPL_LUSERCHANNELS_MSG		"254 %s %lu :channels formed"
 | 
				
			||||||
#define RPL_LUSERME_MSG			"255 %s :I have %ld users, %ld services and %ld servers"
 | 
					#define RPL_LUSERME_MSG			"255 %s :I have %lu users, %lu services and %lu servers"
 | 
				
			||||||
#define RPL_ADMINME_MSG			"256 %s %s :Administrative info"
 | 
					#define RPL_ADMINME_MSG			"256 %s %s :Administrative info"
 | 
				
			||||||
#define RPL_ADMINLOC1_MSG		"257 %s :%s"
 | 
					#define RPL_ADMINLOC1_MSG		"257 %s :%s"
 | 
				
			||||||
#define RPL_ADMINLOC2_MSG		"258 %s :%s"
 | 
					#define RPL_ADMINLOC2_MSG		"258 %s :%s"
 | 
				
			||||||
#define RPL_ADMINEMAIL_MSG		"259 %s :%s"
 | 
					#define RPL_ADMINEMAIL_MSG		"259 %s :%s"
 | 
				
			||||||
#define RPL_TRACEEND_MSG		"262 %s %s %s-%s.%s :End of TRACE"
 | 
					#define RPL_TRACEEND_MSG		"262 %s %s %s-%s.%s :End of TRACE"
 | 
				
			||||||
#define RPL_LOCALUSERS_MSG		"265 %s :Current local users: %ld, Max: %ld"
 | 
					#define RPL_LOCALUSERS_MSG		"265 %s %lu %lu :Current local users: %lu, Max: %lu"
 | 
				
			||||||
#define RPL_NETUSERS_MSG		"266 %s :Current global users: %ld, Max: %ld"
 | 
					#define RPL_NETUSERS_MSG		"266 %s %lu %lu :Current global users: %lu, Max: %lu"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define RPL_AWAY_MSG			"301 %s %s :%s"
 | 
					#define RPL_AWAY_MSG			"301 %s %s :%s"
 | 
				
			||||||
#define RPL_USERHOST_MSG		"302 %s :"
 | 
					#define RPL_USERHOST_MSG		"302 %s :"
 | 
				
			||||||
@@ -54,7 +56,7 @@
 | 
				
			|||||||
#define RPL_WHOISOPERATOR_MSG		"313 %s %s :is an IRC operator"
 | 
					#define RPL_WHOISOPERATOR_MSG		"313 %s %s :is an IRC operator"
 | 
				
			||||||
#define RPL_WHOWASUSER_MSG		"314 %s %s %s %s * :%s"
 | 
					#define RPL_WHOWASUSER_MSG		"314 %s %s %s %s * :%s"
 | 
				
			||||||
#define RPL_ENDOFWHO_MSG		"315 %s %s :End of WHO list"
 | 
					#define RPL_ENDOFWHO_MSG		"315 %s %s :End of WHO list"
 | 
				
			||||||
#define RPL_WHOISIDLE_MSG		"317 %s %s %ld :seconds idle"
 | 
					#define RPL_WHOISIDLE_MSG		"317 %s %s %lu %lu :seconds idle, signon time"
 | 
				
			||||||
#define RPL_ENDOFWHOIS_MSG		"318 %s %s :End of WHOIS list"
 | 
					#define RPL_ENDOFWHOIS_MSG		"318 %s %s :End of WHOIS list"
 | 
				
			||||||
#define RPL_WHOISCHANNELS_MSG		"319 %s %s :"
 | 
					#define RPL_WHOISCHANNELS_MSG		"319 %s %s :"
 | 
				
			||||||
#define RPL_LIST_MSG			"322 %s %s %ld :%s"
 | 
					#define RPL_LIST_MSG			"322 %s %s %ld :%s"
 | 
				
			||||||
@@ -62,6 +64,7 @@
 | 
				
			|||||||
#define RPL_CHANNELMODEIS_MSG		"324 %s %s +%s"
 | 
					#define RPL_CHANNELMODEIS_MSG		"324 %s %s +%s"
 | 
				
			||||||
#define RPL_NOTOPIC_MSG			"331 %s %s :No topic is set"
 | 
					#define RPL_NOTOPIC_MSG			"331 %s %s :No topic is set"
 | 
				
			||||||
#define RPL_TOPIC_MSG			"332 %s %s :%s"
 | 
					#define RPL_TOPIC_MSG			"332 %s %s :%s"
 | 
				
			||||||
 | 
					#define RPL_TOPICSETBY_MSG		"333 %s %s %s %u"
 | 
				
			||||||
#define RPL_INVITING_MSG		"341 %s %s %s"
 | 
					#define RPL_INVITING_MSG		"341 %s %s %s"
 | 
				
			||||||
#define RPL_INVITELIST_MSG		"346 %s %s %s"
 | 
					#define RPL_INVITELIST_MSG		"346 %s %s %s"
 | 
				
			||||||
#define RPL_ENDOFINVITELIST_MSG		"347 %s %s :End of channel invite list"
 | 
					#define RPL_ENDOFINVITELIST_MSG		"347 %s %s :End of channel invite list"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
					 * ngIRCd -- The Next Generation IRC Daemon
 | 
				
			||||||
 * Copyright (c)2001-2005 by Alexander Barton (alex@barton.de)
 | 
					 * Copyright (c)2001-2007 Alexander Barton (alex@barton.de).
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software; you can redistribute it and/or modify
 | 
					 * This program is free software; you can redistribute it and/or modify
 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -12,7 +12,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "portab.h"
 | 
					#include "portab.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char UNUSED id[] = "$Id: ngircd.c,v 1.102.2.2 2005/07/08 23:20:04 alex Exp $";
 | 
					static char UNUSED id[] = "$Id: ngircd.c,v 1.117 2007/11/21 12:16:36 alex Exp $";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @file
 | 
					 * @file
 | 
				
			||||||
@@ -48,7 +48,7 @@ static char UNUSED id[] = "$Id: ngircd.c,v 1.102.2.2 2005/07/08 23:20:04 alex Ex
 | 
				
			|||||||
#include "parse.h"
 | 
					#include "parse.h"
 | 
				
			||||||
#include "irc.h"
 | 
					#include "irc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef RENDEZVOUS
 | 
					#ifdef ZEROCONF
 | 
				
			||||||
#include "rendezvous.h"
 | 
					#include "rendezvous.h"
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -56,20 +56,20 @@ static char UNUSED id[] = "$Id: ngircd.c,v 1.102.2.2 2005/07/08 23:20:04 alex Ex
 | 
				
			|||||||
#include "ngircd.h"
 | 
					#include "ngircd.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL void Initialize_Signal_Handler PARAMS(( void ));
 | 
					static void Initialize_Signal_Handler PARAMS(( void ));
 | 
				
			||||||
LOCAL void Signal_Handler PARAMS(( int Signal ));
 | 
					static void Signal_Handler PARAMS(( int Signal ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL void Show_Version PARAMS(( void ));
 | 
					static void Show_Version PARAMS(( void ));
 | 
				
			||||||
LOCAL void Show_Help PARAMS(( void ));
 | 
					static void Show_Help PARAMS(( void ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL void Pidfile_Create PARAMS(( long ));
 | 
					static void Pidfile_Create PARAMS(( pid_t pid ));
 | 
				
			||||||
LOCAL void Pidfile_Delete PARAMS(( void ));
 | 
					static void Pidfile_Delete PARAMS(( void ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL void Fill_Version PARAMS(( void ));
 | 
					static void Fill_Version PARAMS(( void ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL void Setup_FDStreams PARAMS(( void ));
 | 
					static void Setup_FDStreams PARAMS(( void ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL bool NGIRCd_Init PARAMS(( bool ));
 | 
					static bool NGIRCd_Init PARAMS(( bool ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * The main() function of ngIRCd.
 | 
					 * The main() function of ngIRCd.
 | 
				
			||||||
@@ -262,18 +262,18 @@ main( int argc, const char *argv[] )
 | 
				
			|||||||
		Log_Init( ! NGIRCd_NoDaemon );
 | 
							Log_Init( ! NGIRCd_NoDaemon );
 | 
				
			||||||
		Conf_Init( );
 | 
							Conf_Init( );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (!NGIRCd_Init( NGIRCd_NoDaemon )) {
 | 
							/* Initialize the "main program": chroot environment, user and
 | 
				
			||||||
			Log(LOG_WARNING, "Fatal: Initialization failed");
 | 
							 * group ID, ... */
 | 
				
			||||||
 | 
							if (!NGIRCd_Init(NGIRCd_NoDaemon)) {
 | 
				
			||||||
 | 
								Log(LOG_ALERT, "Fatal: Initialization failed");
 | 
				
			||||||
			exit(1);
 | 
								exit(1);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Initialize modules, part II: these functions are eventually
 | 
							/* Initialize modules, part II: these functions are eventually
 | 
				
			||||||
		 * called with already dropped privileges ... */
 | 
							 * called with already dropped privileges ... */
 | 
				
			||||||
		Resolve_Init( );
 | 
					 | 
				
			||||||
		Lists_Init( );
 | 
					 | 
				
			||||||
		Channel_Init( );
 | 
							Channel_Init( );
 | 
				
			||||||
		Client_Init( );
 | 
							Client_Init( );
 | 
				
			||||||
#ifdef RENDEZVOUS
 | 
					#ifdef ZEROCONF
 | 
				
			||||||
		Rendezvous_Init( );
 | 
							Rendezvous_Init( );
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
		Conn_Init( );
 | 
							Conn_Init( );
 | 
				
			||||||
@@ -322,12 +322,11 @@ main( int argc, const char *argv[] )
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		/* Alles abmelden */
 | 
							/* Alles abmelden */
 | 
				
			||||||
		Conn_Exit( );
 | 
							Conn_Exit( );
 | 
				
			||||||
#ifdef RENDEZVOUS
 | 
					#ifdef ZEROCONF
 | 
				
			||||||
		Rendezvous_Exit( );
 | 
							Rendezvous_Exit( );
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
		Client_Exit( );
 | 
							Client_Exit( );
 | 
				
			||||||
		Channel_Exit( );
 | 
							Channel_Exit( );
 | 
				
			||||||
		Lists_Exit( );
 | 
					 | 
				
			||||||
		Log_Exit( );
 | 
							Log_Exit( );
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	Pidfile_Delete( );
 | 
						Pidfile_Delete( );
 | 
				
			||||||
@@ -342,7 +341,7 @@ main( int argc, const char *argv[] )
 | 
				
			|||||||
 * further usage, for example by the IRC command VERSION and the --version
 | 
					 * further usage, for example by the IRC command VERSION and the --version
 | 
				
			||||||
 * command line switch.
 | 
					 * command line switch.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
LOCAL void
 | 
					static void
 | 
				
			||||||
Fill_Version( void )
 | 
					Fill_Version( void )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	NGIRCd_VersionAddition[0] = '\0';
 | 
						NGIRCd_VersionAddition[0] = '\0';
 | 
				
			||||||
@@ -362,11 +361,11 @@ Fill_Version( void )
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	strlcat( NGIRCd_VersionAddition, "TCPWRAP", sizeof NGIRCd_VersionAddition );
 | 
						strlcat( NGIRCd_VersionAddition, "TCPWRAP", sizeof NGIRCd_VersionAddition );
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef RENDEZVOUS
 | 
					#ifdef ZEROCONF
 | 
				
			||||||
	if( NGIRCd_VersionAddition[0] )
 | 
						if( NGIRCd_VersionAddition[0] )
 | 
				
			||||||
		strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
 | 
							strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	strlcat( NGIRCd_VersionAddition, "RENDEZVOUS", sizeof NGIRCd_VersionAddition );
 | 
						strlcat( NGIRCd_VersionAddition, "ZEROCONF", sizeof NGIRCd_VersionAddition );
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef IDENTAUTH
 | 
					#ifdef IDENTAUTH
 | 
				
			||||||
	if( NGIRCd_VersionAddition[0] )
 | 
						if( NGIRCd_VersionAddition[0] )
 | 
				
			||||||
@@ -423,6 +422,7 @@ GLOBAL void
 | 
				
			|||||||
NGIRCd_Rehash( void )
 | 
					NGIRCd_Rehash( void )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char old_name[CLIENT_ID_LEN];
 | 
						char old_name[CLIENT_ID_LEN];
 | 
				
			||||||
 | 
						unsigned old_nicklen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Log( LOG_NOTICE|LOG_snotice, "Re-reading configuration NOW!" );
 | 
						Log( LOG_NOTICE|LOG_snotice, "Re-reading configuration NOW!" );
 | 
				
			||||||
	NGIRCd_SignalRehash = false;
 | 
						NGIRCd_SignalRehash = false;
 | 
				
			||||||
@@ -430,17 +430,22 @@ NGIRCd_Rehash( void )
 | 
				
			|||||||
	/* Close down all listening sockets */
 | 
						/* Close down all listening sockets */
 | 
				
			||||||
	Conn_ExitListeners( );
 | 
						Conn_ExitListeners( );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Remember old server name */
 | 
						/* Remember old server name and nick name length */
 | 
				
			||||||
	strlcpy( old_name, Conf_ServerName, sizeof old_name );
 | 
						strlcpy( old_name, Conf_ServerName, sizeof old_name );
 | 
				
			||||||
 | 
						old_nicklen = Conf_MaxNickLength;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Re-read configuration ... */
 | 
						/* Re-read configuration ... */
 | 
				
			||||||
	Conf_Rehash( );
 | 
						Conf_Rehash( );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Recover old server name: it can't be changed during run-time */
 | 
						/* Recover old server name and nick name length: these values can't
 | 
				
			||||||
	if( strcmp( old_name, Conf_ServerName ) != 0 )
 | 
						 * be changed during run-time */
 | 
				
			||||||
	{
 | 
						if (strcmp(old_name, Conf_ServerName) != 0 ) {
 | 
				
			||||||
		strcpy( Conf_ServerName, old_name );
 | 
							strlcpy(Conf_ServerName, old_name, sizeof Conf_ServerName);
 | 
				
			||||||
		Log( LOG_ERR, "Can't change \"ServerName\" on runtime! Ignored new name." );
 | 
							Log(LOG_ERR, "Can't change \"ServerName\" on runtime! Ignored new name.");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (old_nicklen != Conf_MaxNickLength) {
 | 
				
			||||||
 | 
							Conf_MaxNickLength = old_nicklen;
 | 
				
			||||||
 | 
							Log(LOG_ERR, "Can't change \"MaxNickLength\" on runtime! Ignored new value.");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Create new pre-defined channels */
 | 
						/* Create new pre-defined channels */
 | 
				
			||||||
@@ -459,7 +464,7 @@ NGIRCd_Rehash( void )
 | 
				
			|||||||
/**
 | 
					/**
 | 
				
			||||||
 * Initialize the signal handler.
 | 
					 * Initialize the signal handler.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
LOCAL void
 | 
					static void
 | 
				
			||||||
Initialize_Signal_Handler( void )
 | 
					Initialize_Signal_Handler( void )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Signal-Handler initialisieren: einige Signale
 | 
						/* Signal-Handler initialisieren: einige Signale
 | 
				
			||||||
@@ -481,27 +486,27 @@ Initialize_Signal_Handler( void )
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Signal-Handler einhaengen */
 | 
						/* Signal-Handler einhaengen */
 | 
				
			||||||
	sigaction( SIGINT, &saction, NULL );
 | 
						sigaction(SIGINT, &saction, NULL);
 | 
				
			||||||
	sigaction( SIGQUIT, &saction, NULL );
 | 
						sigaction(SIGQUIT, &saction, NULL);
 | 
				
			||||||
	sigaction( SIGTERM, &saction, NULL);
 | 
						sigaction(SIGTERM, &saction, NULL);
 | 
				
			||||||
	sigaction( SIGHUP, &saction, NULL);
 | 
						sigaction(SIGHUP, &saction, NULL);
 | 
				
			||||||
	sigaction( SIGCHLD, &saction, NULL);
 | 
						sigaction(SIGCHLD, &saction, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* einige Signale ignorieren */
 | 
						/* einige Signale ignorieren */
 | 
				
			||||||
	saction.sa_handler = SIG_IGN;
 | 
						saction.sa_handler = SIG_IGN;
 | 
				
			||||||
	sigaction( SIGPIPE, &saction, NULL );
 | 
						sigaction(SIGPIPE, &saction, NULL);
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
	/* kein sigaction() vorhanden */
 | 
						/* kein sigaction() vorhanden */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Signal-Handler einhaengen */
 | 
						/* Signal-Handler einhaengen */
 | 
				
			||||||
	signal( SIGINT, Signal_Handler );
 | 
						signal(SIGINT, Signal_Handler);
 | 
				
			||||||
	signal( SIGQUIT, Signal_Handler );
 | 
						signal(SIGQUIT, Signal_Handler);
 | 
				
			||||||
	signal( SIGTERM, Signal_Handler );
 | 
						signal(SIGTERM, Signal_Handler);
 | 
				
			||||||
	signal( SIGHUP, Signal_Handler );
 | 
						signal(SIGHUP, Signal_Handler);
 | 
				
			||||||
	signal( SIGCHLD, Signal_Handler );
 | 
						signal(SIGCHLD, Signal_Handler);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* einige Signale ignorieren */
 | 
						/* einige Signale ignorieren */
 | 
				
			||||||
	signal( SIGPIPE, SIG_IGN );
 | 
						signal(SIGPIPE, SIG_IGN);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
} /* Initialize_Signal_Handler */
 | 
					} /* Initialize_Signal_Handler */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -512,7 +517,7 @@ Initialize_Signal_Handler( void )
 | 
				
			|||||||
 * user and/or the system to it. For example SIGTERM and SIGHUP.
 | 
					 * user and/or the system to it. For example SIGTERM and SIGHUP.
 | 
				
			||||||
 * @param Signal Number of the signal to handle.
 | 
					 * @param Signal Number of the signal to handle.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
LOCAL void
 | 
					static void
 | 
				
			||||||
Signal_Handler( int Signal )
 | 
					Signal_Handler( int Signal )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	switch( Signal )
 | 
						switch( Signal )
 | 
				
			||||||
@@ -543,12 +548,12 @@ Signal_Handler( int Signal )
 | 
				
			|||||||
/**
 | 
					/**
 | 
				
			||||||
 * Display copyright and version information of ngIRCd on the console.
 | 
					 * Display copyright and version information of ngIRCd on the console.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
LOCAL void
 | 
					static void
 | 
				
			||||||
Show_Version( void )
 | 
					Show_Version( void )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	puts( NGIRCd_Version );
 | 
						puts( NGIRCd_Version );
 | 
				
			||||||
	puts( "Copyright (c)2001-2005 by Alexander Barton (<alex@barton.de>)." );
 | 
						puts( "Copyright (c)2001-2007 Alexander Barton (<alex@barton.de>) and Contributors." );
 | 
				
			||||||
	puts( "Homepage: <http://arthur.ath.cx/~alex/ngircd/>\n" );
 | 
						puts( "Homepage: <http://ngircd.barton.de/>\n" );
 | 
				
			||||||
	puts( "This is free software; see the source for copying conditions. There is NO" );
 | 
						puts( "This is free software; see the source for copying conditions. There is NO" );
 | 
				
			||||||
	puts( "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." );
 | 
						puts( "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." );
 | 
				
			||||||
} /* Show_Version */
 | 
					} /* Show_Version */
 | 
				
			||||||
@@ -559,7 +564,7 @@ Show_Version( void )
 | 
				
			|||||||
 * This help depends on the configuration of the executable and only shows
 | 
					 * This help depends on the configuration of the executable and only shows
 | 
				
			||||||
 * options that are actually enabled.
 | 
					 * options that are actually enabled.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
LOCAL void
 | 
					static void
 | 
				
			||||||
Show_Help( void )
 | 
					Show_Help( void )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef DEBUG
 | 
					#ifdef DEBUG
 | 
				
			||||||
@@ -580,7 +585,7 @@ Show_Help( void )
 | 
				
			|||||||
/**
 | 
					/**
 | 
				
			||||||
 * Delete the file containing the process ID (PID).
 | 
					 * Delete the file containing the process ID (PID).
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
LOCAL void
 | 
					static void
 | 
				
			||||||
Pidfile_Delete( void )
 | 
					Pidfile_Delete( void )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Pidfile configured? */
 | 
						/* Pidfile configured? */
 | 
				
			||||||
@@ -599,8 +604,8 @@ Pidfile_Delete( void )
 | 
				
			|||||||
 * Create the file containing the process ID of ngIRCd ("PID file").
 | 
					 * Create the file containing the process ID of ngIRCd ("PID file").
 | 
				
			||||||
 * @param pid The process ID to be stored in this file.
 | 
					 * @param pid The process ID to be stored in this file.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
LOCAL void
 | 
					static void
 | 
				
			||||||
Pidfile_Create( long pid )
 | 
					Pidfile_Create(pid_t pid)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int pidfd;
 | 
						int pidfd;
 | 
				
			||||||
	char pidbuf[64];
 | 
						char pidbuf[64];
 | 
				
			||||||
@@ -619,13 +624,13 @@ Pidfile_Create( long pid )
 | 
				
			|||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	len = snprintf( pidbuf, sizeof pidbuf, "%ld\n", pid );
 | 
						len = snprintf(pidbuf, sizeof pidbuf, "%ld\n", (long)pid);
 | 
				
			||||||
	if (len < 0|| len < (int)sizeof pid) {
 | 
						if (len < 0 || len >= (int)sizeof pidbuf) {
 | 
				
			||||||
		Log( LOG_ERR, "Error converting pid");
 | 
							Log( LOG_ERR, "Error converting pid");
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	if( write( pidfd, pidbuf, len) != len)
 | 
						if (write(pidfd, pidbuf, (size_t)len) != (ssize_t)len)
 | 
				
			||||||
		Log( LOG_ERR, "Can't write PID file (%s): %s", Conf_PidFile, strerror( errno ));
 | 
							Log( LOG_ERR, "Can't write PID file (%s): %s", Conf_PidFile, strerror( errno ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if( close(pidfd) != 0 )
 | 
						if( close(pidfd) != 0 )
 | 
				
			||||||
@@ -636,7 +641,7 @@ Pidfile_Create( long pid )
 | 
				
			|||||||
/**
 | 
					/**
 | 
				
			||||||
 * Redirect stdin, stdout and stderr to apropriate file handles.
 | 
					 * Redirect stdin, stdout and stderr to apropriate file handles.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
LOCAL void
 | 
					static void
 | 
				
			||||||
Setup_FDStreams( void )
 | 
					Setup_FDStreams( void )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int fd;
 | 
						int fd;
 | 
				
			||||||
@@ -661,8 +666,8 @@ Setup_FDStreams( void )
 | 
				
			|||||||
} /* Setup_FDStreams */
 | 
					} /* Setup_FDStreams */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL bool
 | 
					static bool
 | 
				
			||||||
NGIRCd_getNobodyID(unsigned int *uid, unsigned int *gid )
 | 
					NGIRCd_getNobodyID(uid_t *uid, gid_t *gid )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct passwd *pwd;
 | 
						struct passwd *pwd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -680,7 +685,7 @@ NGIRCd_getNobodyID(unsigned int *uid, unsigned int *gid )
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL bool
 | 
					static bool
 | 
				
			||||||
NGIRCd_Init( bool NGIRCd_NoDaemon ) 
 | 
					NGIRCd_Init( bool NGIRCd_NoDaemon ) 
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	static bool initialized;
 | 
						static bool initialized;
 | 
				
			||||||
@@ -688,7 +693,7 @@ NGIRCd_Init( bool NGIRCd_NoDaemon )
 | 
				
			|||||||
	struct passwd *pwd;
 | 
						struct passwd *pwd;
 | 
				
			||||||
	struct group *grp;
 | 
						struct group *grp;
 | 
				
			||||||
	int real_errno;
 | 
						int real_errno;
 | 
				
			||||||
	long pid;
 | 
						pid_t pid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (initialized)
 | 
						if (initialized)
 | 
				
			||||||
		return true;
 | 
							return true;
 | 
				
			||||||
@@ -748,7 +753,7 @@ NGIRCd_Init( bool NGIRCd_NoDaemon )
 | 
				
			|||||||
	 * connected to ther controlling terminal. Use "--nodaemon"
 | 
						 * connected to ther controlling terminal. Use "--nodaemon"
 | 
				
			||||||
	 * to disable this "daemon mode" (useful for debugging). */
 | 
						 * to disable this "daemon mode" (useful for debugging). */
 | 
				
			||||||
	if ( ! NGIRCd_NoDaemon ) {
 | 
						if ( ! NGIRCd_NoDaemon ) {
 | 
				
			||||||
		pid = (long)fork( );
 | 
							pid = fork( );
 | 
				
			||||||
		if( pid > 0 ) {
 | 
							if( pid > 0 ) {
 | 
				
			||||||
			/* "Old" process: exit. */
 | 
								/* "Old" process: exit. */
 | 
				
			||||||
			exit( 0 );
 | 
								exit( 0 );
 | 
				
			||||||
@@ -798,7 +803,7 @@ NGIRCd_Init( bool NGIRCd_NoDaemon )
 | 
				
			|||||||
			if( chdir( pwd->pw_dir ) == 0 ) 
 | 
								if( chdir( pwd->pw_dir ) == 0 ) 
 | 
				
			||||||
				Log( LOG_DEBUG, "Changed working directory to \"%s\" ...", pwd->pw_dir );
 | 
									Log( LOG_DEBUG, "Changed working directory to \"%s\" ...", pwd->pw_dir );
 | 
				
			||||||
			else 
 | 
								else 
 | 
				
			||||||
				Log( LOG_ERR, "Can't change working directory to \"%s\": %s",
 | 
									Log( LOG_INFO, "Notice: Can't change working directory to \"%s\": %s",
 | 
				
			||||||
								pwd->pw_dir, strerror( errno ));
 | 
													pwd->pw_dir, strerror( errno ));
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										334
									
								
								src/ngircd/numeric.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										334
									
								
								src/ngircd/numeric.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,334 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * ngIRCd -- The Next Generation IRC Daemon
 | 
				
			||||||
 | 
					 * Copyright (c)2001-2007 Alexander Barton (alex@barton.de)
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This program is free software; you can redistribute it and/or modify
 | 
				
			||||||
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					 * the Free Software Foundation; either version 2 of the License, or
 | 
				
			||||||
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 | 
					 * Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Handlers for IRC numerics sent to the server
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "portab.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static char UNUSED id[] = "$Id: numeric.c,v 1.1 2007/11/21 12:20:32 alex Exp $";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "imp.h"
 | 
				
			||||||
 | 
					#include <assert.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "defines.h"
 | 
				
			||||||
 | 
					#include "resolve.h"
 | 
				
			||||||
 | 
					#include "conn.h"
 | 
				
			||||||
 | 
					#include "conf.h"
 | 
				
			||||||
 | 
					#include "conn.h"
 | 
				
			||||||
 | 
					#include "client.h"
 | 
				
			||||||
 | 
					#include "channel.h"
 | 
				
			||||||
 | 
					#include "irc-write.h"
 | 
				
			||||||
 | 
					#include "lists.h"
 | 
				
			||||||
 | 
					#include "log.h"
 | 
				
			||||||
 | 
					#include "messages.h"
 | 
				
			||||||
 | 
					#include "parse.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "exp.h"
 | 
				
			||||||
 | 
					#include "numeric.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Announce new server in the network
 | 
				
			||||||
 | 
					 * @param Client New server
 | 
				
			||||||
 | 
					 * @param Server Existing server in the network
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static bool
 | 
				
			||||||
 | 
					Announce_Server(CLIENT * Client, CLIENT * Server)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						CLIENT *c;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (Client_Conn(Server) > NONE) {
 | 
				
			||||||
 | 
							/* Announce the new server to the one already registered
 | 
				
			||||||
 | 
							 * which is directly connected to the local server */
 | 
				
			||||||
 | 
							if (!IRC_WriteStrClient
 | 
				
			||||||
 | 
							    (Server, "SERVER %s %d %d :%s", Client_ID(Client),
 | 
				
			||||||
 | 
							     Client_Hops(Client) + 1, Client_MyToken(Client),
 | 
				
			||||||
 | 
							     Client_Info(Client)))
 | 
				
			||||||
 | 
								return DISCONNECTED;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (Client_Hops(Server) == 1)
 | 
				
			||||||
 | 
							c = Client_ThisServer();
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							c = Client_Introducer(Server);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Inform new server about the one already registered in the network */
 | 
				
			||||||
 | 
						return IRC_WriteStrClientPrefix(Client, c, "SERVER %s %d %d :%s",
 | 
				
			||||||
 | 
							Client_ID(Server), Client_Hops(Server) + 1,
 | 
				
			||||||
 | 
							Client_MyToken(Server), Client_Info(Server));
 | 
				
			||||||
 | 
					} /* Announce_Server */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Announce existing user to a new server
 | 
				
			||||||
 | 
					 * @param Client New server
 | 
				
			||||||
 | 
					 * @param User Existing user in the network
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static bool
 | 
				
			||||||
 | 
					Announce_User(CLIENT * Client, CLIENT * User)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return IRC_WriteStrClient(Client, "NICK %s %d %s %s %d +%s :%s",
 | 
				
			||||||
 | 
							Client_ID(User), Client_Hops(User) + 1, Client_User(User),
 | 
				
			||||||
 | 
							Client_Hostname(User), Client_MyToken(Client_Introducer(User)),
 | 
				
			||||||
 | 
							Client_Modes(User), Client_Info(User));
 | 
				
			||||||
 | 
					} /* Announce_User */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IRCPLUS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Synchronize invite and ban lists between servers
 | 
				
			||||||
 | 
					 * @param Client New server
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static bool
 | 
				
			||||||
 | 
					Synchronize_Lists(CLIENT * Client)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						CHANNEL *c;
 | 
				
			||||||
 | 
						struct list_head *head;
 | 
				
			||||||
 | 
						struct list_elem *elem;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert(Client != NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						c = Channel_First();
 | 
				
			||||||
 | 
						while (c) {
 | 
				
			||||||
 | 
							/* ban list */
 | 
				
			||||||
 | 
							head = Channel_GetListBans(c);
 | 
				
			||||||
 | 
							elem = Lists_GetFirst(head);
 | 
				
			||||||
 | 
							while (elem) {
 | 
				
			||||||
 | 
								if (!IRC_WriteStrClient(Client, "MODE %s +b %s",
 | 
				
			||||||
 | 
											Channel_Name(c),
 | 
				
			||||||
 | 
											Lists_GetMask(elem))) {
 | 
				
			||||||
 | 
									return DISCONNECTED;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								elem = Lists_GetNext(elem);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* invite list */
 | 
				
			||||||
 | 
							head = Channel_GetListInvites(c);
 | 
				
			||||||
 | 
							elem = Lists_GetFirst(head);
 | 
				
			||||||
 | 
							while (elem) {
 | 
				
			||||||
 | 
								if (!IRC_WriteStrClient(Client, "MODE %s +I %s",
 | 
				
			||||||
 | 
											Channel_Name(c),
 | 
				
			||||||
 | 
											Lists_GetMask(elem))) {
 | 
				
			||||||
 | 
									return DISCONNECTED;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								elem = Lists_GetNext(elem);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							c = Channel_Next(c);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return CONNECTED;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Send CHANINFO commands to a new server (inform it about existing channels).
 | 
				
			||||||
 | 
					 * @param Client New server
 | 
				
			||||||
 | 
					 * @param Chan Channel
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static bool
 | 
				
			||||||
 | 
					Send_CHANINFO(CLIENT * Client, CHANNEL * Chan)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char *modes, *topic;
 | 
				
			||||||
 | 
						bool has_k, has_l;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					#ifdef DEBUG
 | 
				
			||||||
 | 
						Log(LOG_DEBUG, "Sending CHANINFO commands ...");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						modes = Channel_Modes(Chan);
 | 
				
			||||||
 | 
						topic = Channel_Topic(Chan);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if (!*modes && !*topic)
 | 
				
			||||||
 | 
							return CONNECTED;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						has_k = strchr(modes, 'k') != NULL;
 | 
				
			||||||
 | 
						has_l = strchr(modes, 'l') != NULL;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/* send CHANINFO */
 | 
				
			||||||
 | 
						if (!has_k && !has_l) {
 | 
				
			||||||
 | 
							if (!*topic) {
 | 
				
			||||||
 | 
								/* "CHANINFO <chan> +<modes>" */
 | 
				
			||||||
 | 
								return IRC_WriteStrClient(Client, "CHANINFO %s +%s",
 | 
				
			||||||
 | 
											  Channel_Name(Chan), modes);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							/* "CHANINFO <chan> +<modes> :<topic>" */
 | 
				
			||||||
 | 
							return IRC_WriteStrClient(Client, "CHANINFO %s +%s :%s",
 | 
				
			||||||
 | 
										  Channel_Name(Chan), modes, topic);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						/* "CHANINFO <chan> +<modes> <key> <limit> :<topic>" */
 | 
				
			||||||
 | 
						return IRC_WriteStrClient(Client, "CHANINFO %s +%s %s %lu :%s",
 | 
				
			||||||
 | 
									  Channel_Name(Chan), modes,
 | 
				
			||||||
 | 
									  has_k ? Channel_Key(Chan) : "*",
 | 
				
			||||||
 | 
									  has_l ? Channel_MaxUsers(Chan) : 0, topic);
 | 
				
			||||||
 | 
					} /* Send_CHANINFO */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* IRCPLUS */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Handle ENDOFMOTD (376) numeric and login remote server.
 | 
				
			||||||
 | 
					 * The peer is either an IRC server (no IRC+ protocol), or we got the
 | 
				
			||||||
 | 
					 * ENDOFMOTD numeric from an IRC+ server. We have to register the new server.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					GLOBAL bool
 | 
				
			||||||
 | 
					IRC_Num_ENDOFMOTD(CLIENT * Client, UNUSED REQUEST * Req)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char str[LINE_LEN];
 | 
				
			||||||
 | 
						int max_hops, i;
 | 
				
			||||||
 | 
						CLIENT *c, *cl;
 | 
				
			||||||
 | 
						CHANNEL *chan;
 | 
				
			||||||
 | 
						CL2CHAN *cl2chan;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Client_SetType(Client, CLIENT_SERVER);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Log(LOG_NOTICE | LOG_snotice,
 | 
				
			||||||
 | 
						    "Server \"%s\" registered (connection %d, 1 hop - direct link).",
 | 
				
			||||||
 | 
						    Client_ID(Client), Client_Conn(Client));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Get highest hop count */
 | 
				
			||||||
 | 
						max_hops = 0;
 | 
				
			||||||
 | 
						c = Client_First();
 | 
				
			||||||
 | 
						while (c) {
 | 
				
			||||||
 | 
							if (Client_Hops(c) > max_hops)
 | 
				
			||||||
 | 
								max_hops = Client_Hops(c);
 | 
				
			||||||
 | 
							c = Client_Next(c);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Inform the new server about all other servers, and announce the
 | 
				
			||||||
 | 
						 * new server to all the already registered ones. Important: we have
 | 
				
			||||||
 | 
						 * to do this "in order" and can't introduce servers of which the
 | 
				
			||||||
 | 
						 * "toplevel server" isn't known already. */
 | 
				
			||||||
 | 
						for (i = 0; i < (max_hops + 1); i++) {
 | 
				
			||||||
 | 
							for (c = Client_First(); c != NULL; c = Client_Next(c)) {
 | 
				
			||||||
 | 
								if (Client_Type(c) != CLIENT_SERVER)
 | 
				
			||||||
 | 
									continue;	/* not a server */
 | 
				
			||||||
 | 
								if (Client_Hops(c) != i)
 | 
				
			||||||
 | 
									continue;	/* not actual "nesting level" */
 | 
				
			||||||
 | 
								if (c == Client || c == Client_ThisServer())
 | 
				
			||||||
 | 
									continue;	/* that's us or the peer! */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (!Announce_Server(Client, c))
 | 
				
			||||||
 | 
									return DISCONNECTED;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Announce all the users to the new server */
 | 
				
			||||||
 | 
						c = Client_First();
 | 
				
			||||||
 | 
						while (c) {
 | 
				
			||||||
 | 
							if (Client_Type(c) == CLIENT_USER) {
 | 
				
			||||||
 | 
								if (!Announce_User(Client, c))
 | 
				
			||||||
 | 
									return DISCONNECTED;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							c = Client_Next(c);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Announce all channels to the new server */
 | 
				
			||||||
 | 
						chan = Channel_First();
 | 
				
			||||||
 | 
						while (chan) {
 | 
				
			||||||
 | 
					#ifdef IRCPLUS
 | 
				
			||||||
 | 
							/* Send CHANINFO if the peer supports it */
 | 
				
			||||||
 | 
							if (strchr(Client_Flags(Client), 'C')) {
 | 
				
			||||||
 | 
								if (!Send_CHANINFO(Client, chan))
 | 
				
			||||||
 | 
									return DISCONNECTED;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* Get all the members of this channel */
 | 
				
			||||||
 | 
							cl2chan = Channel_FirstMember(chan);
 | 
				
			||||||
 | 
							snprintf(str, sizeof(str), "NJOIN %s :", Channel_Name(chan));
 | 
				
			||||||
 | 
							while (cl2chan) {
 | 
				
			||||||
 | 
								cl = Channel_GetClient(cl2chan);
 | 
				
			||||||
 | 
								assert(cl != NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								/* Nick name, with modes (if applicable) */
 | 
				
			||||||
 | 
								if (str[strlen(str) - 1] != ':')
 | 
				
			||||||
 | 
									strlcat(str, ",", sizeof(str));
 | 
				
			||||||
 | 
								if (strchr(Channel_UserModes(chan, cl), 'v'))
 | 
				
			||||||
 | 
									strlcat(str, "+", sizeof(str));
 | 
				
			||||||
 | 
								if (strchr(Channel_UserModes(chan, cl), 'o'))
 | 
				
			||||||
 | 
									strlcat(str, "@", sizeof(str));
 | 
				
			||||||
 | 
								strlcat(str, Client_ID(cl), sizeof(str));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								/* Send the data if the buffer is "full" */
 | 
				
			||||||
 | 
								if (strlen(str) > (LINE_LEN - CLIENT_NICK_LEN - 8)) {
 | 
				
			||||||
 | 
									if (!IRC_WriteStrClient(Client, "%s", str))
 | 
				
			||||||
 | 
										return DISCONNECTED;
 | 
				
			||||||
 | 
									snprintf(str, sizeof(str), "NJOIN %s :",
 | 
				
			||||||
 | 
										 Channel_Name(chan));
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								cl2chan = Channel_NextMember(chan, cl2chan);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* Data left in the buffer? */
 | 
				
			||||||
 | 
							if (str[strlen(str) - 1] != ':') {
 | 
				
			||||||
 | 
								/* Yes, send it ... */
 | 
				
			||||||
 | 
								if (!IRC_WriteStrClient(Client, "%s", str))
 | 
				
			||||||
 | 
									return DISCONNECTED;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* Get next channel ... */
 | 
				
			||||||
 | 
							chan = Channel_Next(chan);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IRCPLUS
 | 
				
			||||||
 | 
						if (strchr(Client_Flags(Client), 'L')) {
 | 
				
			||||||
 | 
							LogDebug("Synchronizing INVITE- and BAN-lists ...");
 | 
				
			||||||
 | 
							if (!Synchronize_Lists(Client))
 | 
				
			||||||
 | 
								return DISCONNECTED;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return CONNECTED;
 | 
				
			||||||
 | 
					} /* IRC_Num_ENDOFMOTD */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Handle ISUPPORT (005) numeric.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					GLOBAL bool
 | 
				
			||||||
 | 
					IRC_Num_ISUPPORT(CLIENT * Client, REQUEST * Req)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
						char *key, *value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 1; i < Req->argc - 1; i++) {
 | 
				
			||||||
 | 
							key = Req->argv[i];
 | 
				
			||||||
 | 
							value = strchr(key, '=');
 | 
				
			||||||
 | 
							if (value)
 | 
				
			||||||
 | 
								*value++ = '\0';
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								value = "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (strcmp("NICKLEN", key) == 0) {
 | 
				
			||||||
 | 
								if ((unsigned int)atol(value) == Conf_MaxNickLength - 1)
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								/* Nick name length settings are different! */
 | 
				
			||||||
 | 
								Log(LOG_ERR,
 | 
				
			||||||
 | 
								    "Peer uses incompatible nick name length (%d/%d)! Disconnecting ...",
 | 
				
			||||||
 | 
								    Conf_MaxNickLength - 1, atoi(value));
 | 
				
			||||||
 | 
								Conn_Close(Client_Conn(Client),
 | 
				
			||||||
 | 
									   "Incompatible nick name length",
 | 
				
			||||||
 | 
									   NULL, false);
 | 
				
			||||||
 | 
								return DISCONNECTED;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return CONNECTED;
 | 
				
			||||||
 | 
					} /* IRC_Num_ISUPPORT */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* -eof- */
 | 
				
			||||||
							
								
								
									
										24
									
								
								src/ngircd/numeric.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/ngircd/numeric.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * ngIRCd -- The Next Generation IRC Daemon
 | 
				
			||||||
 | 
					 * Copyright (c)2001-2007 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: numeric.h,v 1.1 2007/11/21 12:20:32 alex Exp $
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Handlers for IRC numerics sent to the server (header)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef __numeric_h__
 | 
				
			||||||
 | 
					#define __numeric_h__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GLOBAL bool IRC_Num_ENDOFMOTD PARAMS((CLIENT *Client, UNUSED REQUEST *Req));
 | 
				
			||||||
 | 
					GLOBAL bool IRC_Num_ISUPPORT PARAMS((CLIENT *Client, REQUEST *Req));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* -eof- */
 | 
				
			||||||
@@ -12,7 +12,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "portab.h"
 | 
					#include "portab.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char UNUSED id[] = "$Id: parse.c,v 1.63.2.1 2005/07/24 21:06:51 alex Exp $";
 | 
					static char UNUSED id[] = "$Id: parse.c,v 1.69.2.1 2008/02/05 13:11:20 fw Exp $";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @file
 | 
					 * @file
 | 
				
			||||||
@@ -48,6 +48,7 @@ static char UNUSED id[] = "$Id: parse.c,v 1.63.2.1 2005/07/24 21:06:51 alex Exp
 | 
				
			|||||||
#include "irc-oper.h"
 | 
					#include "irc-oper.h"
 | 
				
			||||||
#include "irc-server.h"
 | 
					#include "irc-server.h"
 | 
				
			||||||
#include "irc-write.h"
 | 
					#include "irc-write.h"
 | 
				
			||||||
 | 
					#include "numeric.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "exp.h"
 | 
					#include "exp.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -93,6 +94,7 @@ COMMAND My_Commands[] =
 | 
				
			|||||||
	{ "USER", IRC_USER, 0xFFFF, 0, 0, 0 },
 | 
						{ "USER", IRC_USER, 0xFFFF, 0, 0, 0 },
 | 
				
			||||||
	{ "USERHOST", IRC_USERHOST, CLIENT_USER, 0, 0, 0 },
 | 
						{ "USERHOST", IRC_USERHOST, CLIENT_USER, 0, 0, 0 },
 | 
				
			||||||
	{ "VERSION", IRC_VERSION, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
 | 
						{ "VERSION", IRC_VERSION, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
 | 
				
			||||||
 | 
						{ "WALLOPS", IRC_WALLOPS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
 | 
				
			||||||
	{ "WHO", IRC_WHO, CLIENT_USER, 0, 0, 0 },
 | 
						{ "WHO", IRC_WHO, CLIENT_USER, 0, 0, 0 },
 | 
				
			||||||
	{ "WHOIS", IRC_WHOIS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
 | 
						{ "WHOIS", IRC_WHOIS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
 | 
				
			||||||
	{ "WHOWAS", IRC_WHOWAS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
 | 
						{ "WHOWAS", IRC_WHOWAS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
 | 
				
			||||||
@@ -102,14 +104,21 @@ COMMAND My_Commands[] =
 | 
				
			|||||||
	{ NULL, NULL, 0x0, 0, 0, 0 } /* Ende-Marke */
 | 
						{ NULL, NULL, 0x0, 0, 0, 0 } /* Ende-Marke */
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					NUMERIC My_Numerics[] =
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						{ 005, IRC_Num_ISUPPORT },
 | 
				
			||||||
 | 
						{ 376, IRC_Num_ENDOFMOTD },
 | 
				
			||||||
 | 
						{ 0, NULL } /* end marker */
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL void Init_Request PARAMS(( REQUEST *Req ));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL bool Validate_Prefix PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed ));
 | 
					static void Init_Request PARAMS(( REQUEST *Req ));
 | 
				
			||||||
LOCAL bool Validate_Command PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed ));
 | 
					 | 
				
			||||||
LOCAL bool Validate_Args PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed ));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL bool Handle_Request PARAMS(( CONN_ID Idx, REQUEST *Req ));
 | 
					static bool Validate_Prefix PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed ));
 | 
				
			||||||
 | 
					static bool Validate_Command PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed ));
 | 
				
			||||||
 | 
					static bool Validate_Args PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static bool Handle_Request PARAMS(( CONN_ID Idx, REQUEST *Req ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -247,7 +256,7 @@ Parse_Request( CONN_ID Idx, char *Request )
 | 
				
			|||||||
 * Initialize request structure.
 | 
					 * Initialize request structure.
 | 
				
			||||||
 * @param Req Request structure to be initialized.
 | 
					 * @param Req Request structure to be initialized.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
LOCAL void
 | 
					static void
 | 
				
			||||||
Init_Request( REQUEST *Req )
 | 
					Init_Request( REQUEST *Req )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Neue Request-Struktur initialisieren */
 | 
						/* Neue Request-Struktur initialisieren */
 | 
				
			||||||
@@ -263,7 +272,7 @@ Init_Request( REQUEST *Req )
 | 
				
			|||||||
} /* Init_Request */
 | 
					} /* Init_Request */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL bool
 | 
					static bool
 | 
				
			||||||
Validate_Prefix( CONN_ID Idx, REQUEST *Req, bool *Closed )
 | 
					Validate_Prefix( CONN_ID Idx, REQUEST *Req, bool *Closed )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	CLIENT *client, *c;
 | 
						CLIENT *client, *c;
 | 
				
			||||||
@@ -277,7 +286,7 @@ Validate_Prefix( CONN_ID Idx, REQUEST *Req, bool *Closed )
 | 
				
			|||||||
	if( ! Req->prefix ) return true;
 | 
						if( ! Req->prefix ) return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Client-Struktur der Connection ermitteln */
 | 
						/* Client-Struktur der Connection ermitteln */
 | 
				
			||||||
	client = Client_GetFromConn( Idx );
 | 
						client = Conn_GetClient( Idx );
 | 
				
			||||||
	assert( client != NULL );
 | 
						assert( client != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* nur validieren, wenn bereits registrierte Verbindung */
 | 
						/* nur validieren, wenn bereits registrierte Verbindung */
 | 
				
			||||||
@@ -306,7 +315,7 @@ Validate_Prefix( CONN_ID Idx, REQUEST *Req, bool *Closed )
 | 
				
			|||||||
	{
 | 
						{
 | 
				
			||||||
		/* das angegebene Prefix ist aus dieser Richtung, also
 | 
							/* das angegebene Prefix ist aus dieser Richtung, also
 | 
				
			||||||
		 * aus der gegebenen Connection, ungueltig! */
 | 
							 * aus der gegebenen Connection, ungueltig! */
 | 
				
			||||||
		Log( LOG_ERR, "Spoofed prefix \"%s\" from \"%s\" (connection %d, command %s)!", Req->prefix, Client_Mask( Client_GetFromConn( Idx )), Idx, Req->command );
 | 
							Log( LOG_ERR, "Spoofed prefix \"%s\" from \"%s\" (connection %d, command %s)!", Req->prefix, Client_Mask( Conn_GetClient( Idx )), Idx, Req->command );
 | 
				
			||||||
		Conn_Close( Idx, NULL, "Spoofed prefix", true);
 | 
							Conn_Close( Idx, NULL, "Spoofed prefix", true);
 | 
				
			||||||
		*Closed = true;
 | 
							*Closed = true;
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
@@ -316,7 +325,7 @@ Validate_Prefix( CONN_ID Idx, REQUEST *Req, bool *Closed )
 | 
				
			|||||||
} /* Validate_Prefix */
 | 
					} /* Validate_Prefix */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL bool
 | 
					static bool
 | 
				
			||||||
Validate_Command( UNUSED CONN_ID Idx, UNUSED REQUEST *Req, bool *Closed )
 | 
					Validate_Command( UNUSED CONN_ID Idx, UNUSED REQUEST *Req, bool *Closed )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	assert( Idx >= 0 );
 | 
						assert( Idx >= 0 );
 | 
				
			||||||
@@ -327,7 +336,7 @@ Validate_Command( UNUSED CONN_ID Idx, UNUSED REQUEST *Req, bool *Closed )
 | 
				
			|||||||
} /* Validate_Comman */
 | 
					} /* Validate_Comman */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL bool
 | 
					static bool
 | 
				
			||||||
Validate_Args( UNUSED CONN_ID Idx, UNUSED REQUEST *Req, bool *Closed )
 | 
					Validate_Args( UNUSED CONN_ID Idx, UNUSED REQUEST *Req, bool *Closed )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	assert( Idx >= 0 );
 | 
						assert( Idx >= 0 );
 | 
				
			||||||
@@ -338,7 +347,7 @@ Validate_Args( UNUSED CONN_ID Idx, UNUSED REQUEST *Req, bool *Closed )
 | 
				
			|||||||
} /* Validate_Args */
 | 
					} /* Validate_Args */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL bool
 | 
					static bool
 | 
				
			||||||
Handle_Request( CONN_ID Idx, REQUEST *Req )
 | 
					Handle_Request( CONN_ID Idx, REQUEST *Req )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Client-Request verarbeiten. Bei einem schwerwiegenden Fehler
 | 
						/* Client-Request verarbeiten. Bei einem schwerwiegenden Fehler
 | 
				
			||||||
@@ -348,34 +357,55 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
 | 
				
			|||||||
	char str[LINE_LEN];
 | 
						char str[LINE_LEN];
 | 
				
			||||||
	bool result;
 | 
						bool result;
 | 
				
			||||||
	COMMAND *cmd;
 | 
						COMMAND *cmd;
 | 
				
			||||||
	int i;
 | 
						NUMERIC *num;
 | 
				
			||||||
 | 
						int i, client_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert( Idx >= 0 );
 | 
						assert( Idx >= 0 );
 | 
				
			||||||
	assert( Req != NULL );
 | 
						assert( Req != NULL );
 | 
				
			||||||
	assert( Req->command != NULL );
 | 
						assert( Req->command != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	client = Client_GetFromConn( Idx );
 | 
						client = Conn_GetClient( Idx );
 | 
				
			||||||
	assert( client != NULL );
 | 
						assert( client != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Statuscode? */
 | 
						/* Numeric? */
 | 
				
			||||||
	if(( Client_Type( client ) == CLIENT_SERVER ) && ( strlen( Req->command ) == 3 ) && ( atoi( Req->command ) > 100 ))
 | 
						if ((Client_Type(client) == CLIENT_SERVER ||
 | 
				
			||||||
	{
 | 
						     Client_Type(client) == CLIENT_UNKNOWNSERVER)
 | 
				
			||||||
		/* Command is a status code from an other server */
 | 
						    && strlen(Req->command) == 3 && atoi(Req->command) > 1) {
 | 
				
			||||||
 | 
							/* Command is a status code ("numeric") from an other server */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Determine target */
 | 
							/* Determine target */
 | 
				
			||||||
		if( Req->argc > 0 ) target = Client_Search( Req->argv[0] );
 | 
							if (Req->argc > 0)
 | 
				
			||||||
		else target = NULL;
 | 
								target = Client_Search( Req->argv[0] );
 | 
				
			||||||
		if( ! target )
 | 
							else
 | 
				
			||||||
		{
 | 
								target = NULL;
 | 
				
			||||||
 | 
							if (!target) {
 | 
				
			||||||
			/* Status code without target!? */
 | 
								/* Status code without target!? */
 | 
				
			||||||
			if( Req->argc > 0 ) Log( LOG_WARNING, "Unknown target for status code %s: \"%s\"", Req->command, Req->argv[0] );
 | 
								if (Req->argc > 0)
 | 
				
			||||||
			else Log( LOG_WARNING, "Unknown target for status code %s!", Req->command );
 | 
									Log(LOG_WARNING,
 | 
				
			||||||
 | 
									    "Unknown target for status code %s: \"%s\"",
 | 
				
			||||||
 | 
									    Req->command, Req->argv[0]);
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
									Log(LOG_WARNING,
 | 
				
			||||||
 | 
									    "Unknown target for status code %s!",
 | 
				
			||||||
 | 
									    Req->command);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if( target == Client_ThisServer( ))
 | 
							if (target == Client_ThisServer()) {
 | 
				
			||||||
		{
 | 
								/* This server is the target of the numeric */
 | 
				
			||||||
			/* This server is the target, ignore it */
 | 
								i = atoi(Req->command);
 | 
				
			||||||
			Log( LOG_DEBUG, "Ignored status code %s from \"%s\".", Req->command, Client_ID( client ));
 | 
					
 | 
				
			||||||
 | 
								num = My_Numerics;
 | 
				
			||||||
 | 
								while (num->numeric > 0) {
 | 
				
			||||||
 | 
									if (i != num->numeric) {
 | 
				
			||||||
 | 
										num++;
 | 
				
			||||||
 | 
										continue;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									result = (num->function)(client, Req);
 | 
				
			||||||
 | 
									return result;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								LogDebug("Ignored status code %s from \"%s\".",
 | 
				
			||||||
 | 
									 Req->command, Client_ID(client));
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -406,6 +436,7 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cmd = My_Commands;
 | 
						cmd = My_Commands;
 | 
				
			||||||
 | 
						client_type = Client_Type(client);
 | 
				
			||||||
	while( cmd->name )
 | 
						while( cmd->name )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		/* Befehl suchen */
 | 
							/* Befehl suchen */
 | 
				
			||||||
@@ -414,7 +445,7 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
 | 
				
			|||||||
			cmd++; continue;
 | 
								cmd++; continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if( Client_Type( client ) & cmd->type )
 | 
							if( client_type & cmd->type )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			/* Command is allowed for this client: call it and count produced bytes */
 | 
								/* Command is allowed for this client: call it and count produced bytes */
 | 
				
			||||||
			Conn_ResetWCounter( );
 | 
								Conn_ResetWCounter( );
 | 
				
			||||||
@@ -422,7 +453,7 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
 | 
				
			|||||||
			cmd->bytes += Conn_WCounter( );
 | 
								cmd->bytes += Conn_WCounter( );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			/* Adjust counters */
 | 
								/* Adjust counters */
 | 
				
			||||||
			if( Client_Type( client ) != CLIENT_SERVER ) cmd->lcount++;
 | 
								if( client_type != CLIENT_SERVER ) cmd->lcount++;
 | 
				
			||||||
			else cmd->rcount++;
 | 
								else cmd->rcount++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			return result;
 | 
								return result;
 | 
				
			||||||
@@ -445,9 +476,12 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
 | 
				
			|||||||
			Req->argc == 1 ? "parameter" : "parameters",
 | 
								Req->argc == 1 ? "parameter" : "parameters",
 | 
				
			||||||
			Req->prefix ? "" : " no" );
 | 
								Req->prefix ? "" : " no" );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if( Client_Type( client ) != CLIENT_SERVER )
 | 
						if (Client_Type(client) != CLIENT_SERVER) {
 | 
				
			||||||
		return IRC_WriteStrClient( client, ERR_UNKNOWNCOMMAND_MSG,
 | 
							result = IRC_WriteStrClient(client, ERR_UNKNOWNCOMMAND_MSG,
 | 
				
			||||||
				Client_ID( client ), Req->command );
 | 
									Client_ID(client), Req->command);
 | 
				
			||||||
 | 
							Conn_SetPenalty(Idx, 1);
 | 
				
			||||||
 | 
							return result;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return true;
 | 
						return true;
 | 
				
			||||||
} /* Handle_Request */
 | 
					} /* Handle_Request */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,7 @@
 | 
				
			|||||||
 * (at your option) any later version.
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
					 * Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * $Id: parse.h,v 1.11 2005/03/19 18:43:49 fw Exp $
 | 
					 * $Id: parse.h,v 1.12 2007/11/21 12:16:36 alex Exp $
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * IRC command parser and validator (header)
 | 
					 * IRC command parser and validator (header)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@@ -33,11 +33,18 @@ typedef struct _COMMAND
 | 
				
			|||||||
	char *name;			/* command name */
 | 
						char *name;			/* command name */
 | 
				
			||||||
	bool (*function) PARAMS(( CLIENT *Client, REQUEST *Request ));
 | 
						bool (*function) PARAMS(( CLIENT *Client, REQUEST *Request ));
 | 
				
			||||||
	CLIENT_TYPE type;		/* valid client types (bit mask) */
 | 
						CLIENT_TYPE type;		/* valid client types (bit mask) */
 | 
				
			||||||
	long lcount, rcount;	/* number of local and remote calls */
 | 
						long lcount, rcount;		/* number of local and remote calls */
 | 
				
			||||||
	long bytes;		/* number of bytes created */
 | 
						long bytes;			/* number of bytes created */
 | 
				
			||||||
} COMMAND;
 | 
					} COMMAND;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct _NUMERIC
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int numeric;			/* numeric */
 | 
				
			||||||
 | 
						bool (*function) PARAMS(( CLIENT *Client, REQUEST *Request ));
 | 
				
			||||||
 | 
					} NUMERIC;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool Parse_Request PARAMS((CONN_ID Idx, char *Request ));
 | 
					GLOBAL bool Parse_Request PARAMS((CONN_ID Idx, char *Request ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL COMMAND *Parse_GetCommandStruct PARAMS(( void ));
 | 
					GLOBAL COMMAND *Parse_GetCommandStruct PARAMS(( void ));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,10 +18,10 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "portab.h"
 | 
					#include "portab.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef RENDEZVOUS
 | 
					#ifdef ZEROCONF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char UNUSED id[] = "$Id: rendezvous.c,v 1.5 2005/03/19 18:43:49 fw Exp $";
 | 
					static char UNUSED id[] = "$Id: rendezvous.c,v 1.8 2006/05/10 21:24:01 alex Exp $";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "imp.h"
 | 
					#include "imp.h"
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
@@ -72,10 +72,10 @@ typedef struct _service
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
} SERVICE;
 | 
					} SERVICE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL SERVICE My_Rendezvous[MAX_RENDEZVOUS];
 | 
					static SERVICE My_Rendezvous[MAX_RENDEZVOUS];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL void Unregister( int Idx );
 | 
					static void Unregister( int Idx );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* -- Apple API -- */
 | 
					/* -- Apple API -- */
 | 
				
			||||||
@@ -84,7 +84,7 @@ LOCAL void Unregister( int Idx );
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define MAX_MACH_MSG_SIZE 512
 | 
					#define MAX_MACH_MSG_SIZE 512
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL void Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrCode, void *Context );
 | 
					static void Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrCode, void *Context );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* Apple */
 | 
					#endif /* Apple */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -93,10 +93,10 @@ LOCAL void Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrC
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#ifdef HOWL
 | 
					#ifdef HOWL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL sw_discovery My_Discovery_Session = NULL;
 | 
					static sw_discovery My_Discovery_Session = NULL;
 | 
				
			||||||
LOCAL sw_salt My_Salt;
 | 
					static sw_salt My_Salt;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL sw_result HOWL_API Registration_Reply_Handler( sw_discovery Session, sw_discovery_publish_status Status, sw_discovery_oid Id, sw_opaque Extra );
 | 
					static sw_result HOWL_API Registration_Reply_Handler( sw_discovery Session, sw_discovery_publish_status Status, sw_discovery_oid Id, sw_opaque Extra );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* Howl */
 | 
					#endif /* Howl */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -144,7 +144,7 @@ GLOBAL void Rendezvous_Exit( void )
 | 
				
			|||||||
} /* Rendezvous_Exit */
 | 
					} /* Rendezvous_Exit */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool Rendezvous_Register( char *Name, char *Type, unsigned int Port )
 | 
					GLOBAL bool Rendezvous_Register( char *Name, char *Type, UINT16 Port )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Register new service */
 | 
						/* Register new service */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -263,7 +263,7 @@ GLOBAL void Rendezvous_Handler( void )
 | 
				
			|||||||
} /* Rendezvous_Handler */
 | 
					} /* Rendezvous_Handler */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL void Unregister( int Idx )
 | 
					static void Unregister( int Idx )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Unregister service */
 | 
						/* Unregister service */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -289,7 +289,7 @@ LOCAL void Unregister( int Idx )
 | 
				
			|||||||
#ifdef APPLE
 | 
					#ifdef APPLE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL void Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrCode, void *Context )
 | 
					static void Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrCode, void *Context )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	SERVICE *s = (SERVICE *)Context;
 | 
						SERVICE *s = (SERVICE *)Context;
 | 
				
			||||||
	char txt[50];
 | 
						char txt[50];
 | 
				
			||||||
@@ -310,7 +310,8 @@ LOCAL void Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrC
 | 
				
			|||||||
			strcpy( txt, "name conflict!" );
 | 
								strcpy( txt, "name conflict!" );
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			sprintf( txt, "error code %ld!", (long)ErrCode );
 | 
								snprintf(txt, sizeof txt, "error code %ld!",
 | 
				
			||||||
 | 
								 	 (long)ErrCode);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Log( LOG_INFO, "Can't register \"%s\" with Rendezvous: %s", s->Desc, txt );
 | 
						Log( LOG_INFO, "Can't register \"%s\" with Rendezvous: %s", s->Desc, txt );
 | 
				
			||||||
@@ -326,7 +327,7 @@ LOCAL void Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrC
 | 
				
			|||||||
#ifdef HOWL
 | 
					#ifdef HOWL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL sw_result HOWL_API Registration_Reply_Handler( sw_discovery Session, sw_discovery_publish_status Status, UNUSED sw_discovery_oid Id, sw_opaque Extra )
 | 
					static sw_result HOWL_API Registration_Reply_Handler( sw_discovery Session, sw_discovery_publish_status Status, UNUSED sw_discovery_oid Id, sw_opaque Extra )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	SERVICE *s = (SERVICE *)Extra;
 | 
						SERVICE *s = (SERVICE *)Extra;
 | 
				
			||||||
	char txt[50];
 | 
						char txt[50];
 | 
				
			||||||
@@ -347,7 +348,8 @@ LOCAL sw_result HOWL_API Registration_Reply_Handler( sw_discovery Session, sw_di
 | 
				
			|||||||
			strcpy( txt, "name conflict!" );
 | 
								strcpy( txt, "name conflict!" );
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			sprintf( txt, "error code %ld!", (long)Status );
 | 
								snprintf(txt, sizeof txt, "error code %ld!",
 | 
				
			||||||
 | 
								 	 (long)Status);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Log( LOG_INFO, "Can't register \"%s\" with Rendezvous: %s", s->Desc, txt );
 | 
						Log( LOG_INFO, "Can't register \"%s\" with Rendezvous: %s", s->Desc, txt );
 | 
				
			||||||
@@ -360,7 +362,7 @@ LOCAL sw_result HOWL_API Registration_Reply_Handler( sw_discovery Session, sw_di
 | 
				
			|||||||
#endif /* Howl */
 | 
					#endif /* Howl */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif	/* RENDEZVOUS */
 | 
					#endif	/* ZEROCONF */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* -eof- */
 | 
					/* -eof- */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,13 +8,13 @@
 | 
				
			|||||||
 * (at your option) any later version.
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
					 * Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * $Id: rendezvous.h,v 1.2 2005/03/19 18:43:49 fw Exp $
 | 
					 * $Id: rendezvous.h,v 1.4 2006/05/10 21:24:01 alex Exp $
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * "Rendezvous" functions (Header)
 | 
					 * "Rendezvous" functions (Header)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef RENDEZVOUS
 | 
					#ifdef ZEROCONF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef __rdezvous_h__
 | 
					#ifndef __rdezvous_h__
 | 
				
			||||||
#define __rdezvous_h__
 | 
					#define __rdezvous_h__
 | 
				
			||||||
@@ -23,7 +23,7 @@
 | 
				
			|||||||
GLOBAL void Rendezvous_Init( void );
 | 
					GLOBAL void Rendezvous_Init( void );
 | 
				
			||||||
GLOBAL void Rendezvous_Exit( void );
 | 
					GLOBAL void Rendezvous_Exit( void );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool Rendezvous_Register( char *Name, char *Type, unsigned int Port );
 | 
					GLOBAL bool Rendezvous_Register( char *Name, char *Type, UINT16 Port );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL bool Rendezvous_Unregister( char *Name );
 | 
					GLOBAL bool Rendezvous_Unregister( char *Name );
 | 
				
			||||||
GLOBAL void Rendezvous_UnregisterListeners( void );
 | 
					GLOBAL void Rendezvous_UnregisterListeners( void );
 | 
				
			||||||
@@ -33,7 +33,7 @@ GLOBAL void Rendezvous_Handler( void );
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#endif	/* __rdezvous_h__ */
 | 
					#endif	/* __rdezvous_h__ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif	/* RENDEZVOUS */
 | 
					#endif	/* ZEROCONF */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* -eof- */
 | 
					/* -eof- */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "portab.h"
 | 
					#include "portab.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char UNUSED id[] = "$Id: resolve.c,v 1.12.2.1 2005/09/02 22:07:38 fw Exp $";
 | 
					static char UNUSED id[] = "$Id: resolve.c,v 1.28 2008/01/02 11:03:29 fw Exp $";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "imp.h"
 | 
					#include "imp.h"
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
@@ -24,7 +24,6 @@ static char UNUSED id[] = "$Id: resolve.c,v 1.12.2.1 2005/09/02 22:07:38 fw Exp
 | 
				
			|||||||
#include <unistd.h>
 | 
					#include <unistd.h>
 | 
				
			||||||
#include <sys/socket.h>
 | 
					#include <sys/socket.h>
 | 
				
			||||||
#include <netinet/in.h>
 | 
					#include <netinet/in.h>
 | 
				
			||||||
#include <arpa/inet.h>
 | 
					 | 
				
			||||||
#include <netdb.h>
 | 
					#include <netdb.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef IDENTAUTH
 | 
					#ifdef IDENTAUTH
 | 
				
			||||||
@@ -36,198 +35,210 @@ static char UNUSED id[] = "$Id: resolve.c,v 1.12.2.1 2005/09/02 22:07:38 fw Exp
 | 
				
			|||||||
#include "conn.h"
 | 
					#include "conn.h"
 | 
				
			||||||
#include "defines.h"
 | 
					#include "defines.h"
 | 
				
			||||||
#include "log.h"
 | 
					#include "log.h"
 | 
				
			||||||
 | 
					#include "tool.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "exp.h"
 | 
					#include "exp.h"
 | 
				
			||||||
#include "resolve.h"
 | 
					#include "resolve.h"
 | 
				
			||||||
 | 
					#include "io.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef IDENTAUTH
 | 
					static void Do_ResolveAddr PARAMS(( struct sockaddr_in *Addr, int Sock, int w_fd ));
 | 
				
			||||||
LOCAL void Do_ResolveAddr PARAMS(( struct sockaddr_in *Addr, int Sock, int w_fd ));
 | 
					static void Do_ResolveName PARAMS(( const char *Host, int w_fd ));
 | 
				
			||||||
#else
 | 
					static bool register_callback PARAMS((RES_STAT *s, void (*cbfunc)(int, short)));
 | 
				
			||||||
LOCAL void Do_ResolveAddr PARAMS(( struct sockaddr_in *Addr, int w_fd ));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LOCAL void Do_ResolveName PARAMS(( char *Host, int w_fd ));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef h_errno
 | 
					#ifdef h_errno
 | 
				
			||||||
LOCAL char *Get_Error PARAMS(( int H_Error ));
 | 
					static char *Get_Error PARAMS(( int H_Error ));
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL RES_STAT *New_Res_Stat PARAMS(( void ));
 | 
					static pid_t
 | 
				
			||||||
 | 
					Resolver_fork(int *pipefds)
 | 
				
			||||||
 | 
					 | 
				
			||||||
GLOBAL void
 | 
					 | 
				
			||||||
Resolve_Init( void )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Initialize module */
 | 
						pid_t pid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	FD_ZERO( &Resolver_FDs );
 | 
						if (pipe(pipefds) != 0) {
 | 
				
			||||||
} /* Resolve_Init */
 | 
					                Log( LOG_ALERT, "Resolver: Can't create output pipe: %s!", strerror( errno ));
 | 
				
			||||||
 | 
					                return -1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pid = fork();
 | 
				
			||||||
 | 
						switch(pid) {
 | 
				
			||||||
 | 
							case -1:
 | 
				
			||||||
 | 
								Log( LOG_CRIT, "Resolver: Can't fork: %s!", strerror( errno ));
 | 
				
			||||||
 | 
								close(pipefds[0]);
 | 
				
			||||||
 | 
								close(pipefds[1]);
 | 
				
			||||||
 | 
								return -1;
 | 
				
			||||||
 | 
							case 0: /* child */
 | 
				
			||||||
 | 
								close(pipefds[0]);
 | 
				
			||||||
 | 
								Log_Init_Resolver( );
 | 
				
			||||||
 | 
								return 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						/* parent */
 | 
				
			||||||
 | 
						close(pipefds[1]);
 | 
				
			||||||
 | 
						return pid; 
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef IDENTAUTH
 | 
					/**
 | 
				
			||||||
GLOBAL RES_STAT *
 | 
					 * Resolve IP (asynchronous!).
 | 
				
			||||||
Resolve_Addr( struct sockaddr_in *Addr, int Sock )
 | 
					 */
 | 
				
			||||||
#else
 | 
					GLOBAL bool
 | 
				
			||||||
GLOBAL RES_STAT *
 | 
					Resolve_Addr(RES_STAT * s, struct sockaddr_in *Addr, int identsock,
 | 
				
			||||||
Resolve_Addr( struct sockaddr_in *Addr )
 | 
						     void (*cbfunc) (int, short))
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Resolve IP (asynchronous!). On errors, e.g. if the child process
 | 
						int pipefd[2];
 | 
				
			||||||
	 * can't be forked, this functions returns NULL. */
 | 
						pid_t pid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	RES_STAT *s;
 | 
						assert(s != NULL);
 | 
				
			||||||
	int pid;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	s = New_Res_Stat( );
 | 
						pid = Resolver_fork(pipefd);
 | 
				
			||||||
	if( ! s ) return NULL;
 | 
						if (pid > 0) {
 | 
				
			||||||
 | 
					#ifdef DEBUG
 | 
				
			||||||
	/* For sub-process */
 | 
					 | 
				
			||||||
	pid = fork( );
 | 
					 | 
				
			||||||
	if( pid > 0 )
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		/* Main process */
 | 
					 | 
				
			||||||
		Log( LOG_DEBUG, "Resolver for %s created (PID %d).", inet_ntoa( Addr->sin_addr ), pid );
 | 
							Log( LOG_DEBUG, "Resolver for %s created (PID %d).", inet_ntoa( Addr->sin_addr ), pid );
 | 
				
			||||||
		FD_SET( s->pipe[0], &Resolver_FDs );
 | 
					 | 
				
			||||||
		if( s->pipe[0] > Conn_MaxFD ) Conn_MaxFD = s->pipe[0];
 | 
					 | 
				
			||||||
		s->pid = pid;
 | 
					 | 
				
			||||||
		return s;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	else if( pid == 0 )
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		/* Sub process */
 | 
					 | 
				
			||||||
		Log_Init_Resolver( );
 | 
					 | 
				
			||||||
#ifdef IDENTAUTH
 | 
					 | 
				
			||||||
		Do_ResolveAddr( Addr, Sock, s->pipe[1] );
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
		Do_ResolveAddr( Addr, s->pipe[1] );
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
							s->pid = pid;
 | 
				
			||||||
 | 
							s->resolver_fd = pipefd[0];
 | 
				
			||||||
 | 
							return register_callback(s, cbfunc);
 | 
				
			||||||
 | 
						} else if( pid == 0 ) {
 | 
				
			||||||
 | 
							/* Sub process */
 | 
				
			||||||
 | 
							Do_ResolveAddr( Addr, identsock, pipefd[1]);
 | 
				
			||||||
		Log_Exit_Resolver( );
 | 
							Log_Exit_Resolver( );
 | 
				
			||||||
		exit( 0 );
 | 
							exit(0);
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		/* Error! */
 | 
					 | 
				
			||||||
		close(s->pipe[0]);
 | 
					 | 
				
			||||||
		close(s->pipe[1]);
 | 
					 | 
				
			||||||
		free( s );
 | 
					 | 
				
			||||||
		Log( LOG_CRIT, "Resolver: Can't fork: %s!", strerror( errno ));
 | 
					 | 
				
			||||||
		return NULL;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						return false;
 | 
				
			||||||
} /* Resolve_Addr */
 | 
					} /* Resolve_Addr */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL RES_STAT *
 | 
					/**
 | 
				
			||||||
Resolve_Name( char *Host )
 | 
					 * Resolve hostname (asynchronous!).
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					GLOBAL bool
 | 
				
			||||||
 | 
					Resolve_Name( RES_STAT *s, const char *Host, void (*cbfunc)(int, short))
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Resolve hostname (asynchronous!). On errors, e.g. if the child
 | 
						int pipefd[2];
 | 
				
			||||||
	 * process can't be forked, this functions returns NULL. */
 | 
						pid_t pid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	RES_STAT *s;
 | 
						assert(s != NULL);
 | 
				
			||||||
	int pid;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	s = New_Res_Stat( );
 | 
						pid = Resolver_fork(pipefd);
 | 
				
			||||||
	if( ! s ) return NULL;
 | 
						if (pid > 0) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Fork sub-process */
 | 
					 | 
				
			||||||
	pid = fork( );
 | 
					 | 
				
			||||||
	if( pid > 0 )
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		/* Main process */
 | 
							/* Main process */
 | 
				
			||||||
 | 
					#ifdef DEBUG
 | 
				
			||||||
		Log( LOG_DEBUG, "Resolver for \"%s\" created (PID %d).", Host, pid );
 | 
							Log( LOG_DEBUG, "Resolver for \"%s\" created (PID %d).", Host, pid );
 | 
				
			||||||
		FD_SET( s->pipe[0], &Resolver_FDs );
 | 
					#endif
 | 
				
			||||||
		if( s->pipe[0] > Conn_MaxFD ) Conn_MaxFD = s->pipe[0];
 | 
					 | 
				
			||||||
		s->pid = pid;
 | 
							s->pid = pid;
 | 
				
			||||||
		return s;
 | 
							s->resolver_fd = pipefd[0];
 | 
				
			||||||
	}
 | 
							return register_callback(s, cbfunc);
 | 
				
			||||||
	else if( pid == 0 )
 | 
						} else if( pid == 0 ) {
 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		/* Sub process */
 | 
							/* Sub process */
 | 
				
			||||||
		Log_Init_Resolver( );
 | 
							Do_ResolveName(Host, pipefd[1]);
 | 
				
			||||||
		Do_ResolveName( Host, s->pipe[1] );
 | 
					 | 
				
			||||||
		Log_Exit_Resolver( );
 | 
							Log_Exit_Resolver( );
 | 
				
			||||||
		exit( 0 );
 | 
							exit(0);
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		/* Error! */
 | 
					 | 
				
			||||||
		close(s->pipe[0]);
 | 
					 | 
				
			||||||
		close(s->pipe[1]);
 | 
					 | 
				
			||||||
		free( s );
 | 
					 | 
				
			||||||
		Log( LOG_CRIT, "Resolver: Can't fork: %s!", strerror( errno ));
 | 
					 | 
				
			||||||
		return NULL;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						return false;
 | 
				
			||||||
} /* Resolve_Name */
 | 
					} /* Resolve_Name */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef IDENTAUTH
 | 
					GLOBAL void
 | 
				
			||||||
LOCAL void
 | 
					Resolve_Init(RES_STAT *s)
 | 
				
			||||||
Do_ResolveAddr( struct sockaddr_in *Addr, int Sock, int w_fd )
 | 
					{
 | 
				
			||||||
#else
 | 
						assert(s != NULL);
 | 
				
			||||||
LOCAL void
 | 
						s->resolver_fd = -1;
 | 
				
			||||||
Do_ResolveAddr( struct sockaddr_in *Addr, int w_fd )
 | 
						s->pid = 0;
 | 
				
			||||||
#endif
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					Do_ResolveAddr( struct sockaddr_in *Addr, int identsock, int w_fd )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Resolver sub-process: resolve IP address and write result into
 | 
						/* Resolver sub-process: resolve IP address and write result into
 | 
				
			||||||
	 * pipe to parent. */
 | 
						 * pipe to parent. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	char hostname[HOST_LEN];
 | 
						char hostname[CLIENT_HOST_LEN];
 | 
				
			||||||
 | 
						char ipstr[CLIENT_HOST_LEN];
 | 
				
			||||||
	struct hostent *h;
 | 
						struct hostent *h;
 | 
				
			||||||
	size_t len;
 | 
						size_t len;
 | 
				
			||||||
 | 
						struct in_addr *addr;
 | 
				
			||||||
 | 
						char *ntoaptr;
 | 
				
			||||||
 | 
						array resolved_addr;
 | 
				
			||||||
#ifdef IDENTAUTH
 | 
					#ifdef IDENTAUTH
 | 
				
			||||||
	char *res;
 | 
						char *res;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
						array_init(&resolved_addr);
 | 
				
			||||||
	/* Resolve IP address */
 | 
						/* Resolve IP address */
 | 
				
			||||||
 | 
					#ifdef DEBUG
 | 
				
			||||||
	Log_Resolver( LOG_DEBUG, "Now resolving %s ...", inet_ntoa( Addr->sin_addr ));
 | 
						Log_Resolver( LOG_DEBUG, "Now resolving %s ...", inet_ntoa( Addr->sin_addr ));
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
	h = gethostbyaddr( (char *)&Addr->sin_addr, sizeof( Addr->sin_addr ), AF_INET );
 | 
						h = gethostbyaddr( (char *)&Addr->sin_addr, sizeof( Addr->sin_addr ), AF_INET );
 | 
				
			||||||
	if( h ) strlcpy( hostname, h->h_name, sizeof( hostname ));
 | 
						if (!h || strlen(h->h_name) >= sizeof(hostname)) {
 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
#ifdef h_errno
 | 
					#ifdef h_errno
 | 
				
			||||||
		Log_Resolver( LOG_WARNING, "Can't resolve address \"%s\": %s!", inet_ntoa( Addr->sin_addr ), Get_Error( h_errno ));
 | 
							Log_Resolver( LOG_WARNING, "Can't resolve address \"%s\": %s!", inet_ntoa( Addr->sin_addr ), Get_Error( h_errno ));
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
		Log_Resolver( LOG_WARNING, "Can't resolve address \"%s\"!", inet_ntoa( Addr->sin_addr ));
 | 
							Log_Resolver( LOG_WARNING, "Can't resolve address \"%s\"!", inet_ntoa( Addr->sin_addr ));
 | 
				
			||||||
#endif	
 | 
					#endif	
 | 
				
			||||||
		strlcpy( hostname, inet_ntoa( Addr->sin_addr ), sizeof( hostname ));
 | 
							strlcpy( hostname, inet_ntoa( Addr->sin_addr ), sizeof( hostname ));
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
					 		strlcpy( hostname, h->h_name, sizeof( hostname ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							h = gethostbyname( hostname );
 | 
				
			||||||
 | 
							if ( h ) {
 | 
				
			||||||
 | 
								if (memcmp(h->h_addr, &Addr->sin_addr, sizeof (struct in_addr))) {
 | 
				
			||||||
 | 
									addr = (struct in_addr*) h->h_addr;
 | 
				
			||||||
 | 
									strlcpy(ipstr, inet_ntoa(*addr), sizeof ipstr); 
 | 
				
			||||||
 | 
									ntoaptr = inet_ntoa( Addr->sin_addr );
 | 
				
			||||||
 | 
									Log(LOG_WARNING,"Possible forgery: %s resolved to %s (which is at ip %s!)",
 | 
				
			||||||
 | 
															ntoaptr, hostname, ipstr);
 | 
				
			||||||
 | 
									strlcpy( hostname, ntoaptr, sizeof hostname);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								ntoaptr = inet_ntoa( Addr->sin_addr );
 | 
				
			||||||
 | 
								Log(LOG_WARNING, "Possible forgery: %s resolved to %s (which has no ip address)",
 | 
				
			||||||
 | 
																ntoaptr, hostname);
 | 
				
			||||||
 | 
								strlcpy( hostname, ntoaptr, sizeof hostname);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	Log_Resolver( LOG_DEBUG, "Ok, translated %s to \"%s\".", inet_ntoa( Addr->sin_addr ), hostname );
 | 
						Log_Resolver( LOG_DEBUG, "Ok, translated %s to \"%s\".", inet_ntoa( Addr->sin_addr ), hostname );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Write resolver result into pipe to parent */
 | 
					 | 
				
			||||||
	len = strlen( hostname ); 
 | 
						len = strlen( hostname ); 
 | 
				
			||||||
	hostname[len] = '\n'; len++;
 | 
						hostname[len] = '\n'; len++;
 | 
				
			||||||
	if( (size_t)write( w_fd, hostname, len ) != (size_t)len )
 | 
						if (!array_copyb(&resolved_addr, hostname, len )) {
 | 
				
			||||||
	{
 | 
							Log_Resolver( LOG_CRIT, "Resolver: Can't copy resolved name: %s!", strerror( errno ));
 | 
				
			||||||
		Log_Resolver( LOG_CRIT, "Resolver: Can't write to parent: %s!", strerror( errno ));
 | 
					 | 
				
			||||||
		close( w_fd );
 | 
							close( w_fd );
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef IDENTAUTH
 | 
					#ifdef IDENTAUTH
 | 
				
			||||||
	/* Do "IDENT" (aka "AUTH") lookup and write result to parent */
 | 
						assert(identsock >= 0);
 | 
				
			||||||
	Log_Resolver( LOG_DEBUG, "Doing IDENT lookup on socket %d ...", Sock );
 | 
						if (identsock >= 0) {
 | 
				
			||||||
	res = ident_id( Sock, 10 );
 | 
							/* Do "IDENT" (aka "AUTH") lookup and append result to resolved_addr array */
 | 
				
			||||||
	Log_Resolver( LOG_DEBUG, "Ok, IDENT lookup on socket %d done: \"%s\"", Sock, res ? res : "" );
 | 
					#ifdef DEBUG
 | 
				
			||||||
 | 
							Log_Resolver( LOG_DEBUG, "Doing IDENT lookup on socket %d ...", identsock );
 | 
				
			||||||
	/* Write IDENT result into pipe to parent */
 | 
					 | 
				
			||||||
	if (res) {
 | 
					 | 
				
			||||||
		len = strlen(res);
 | 
					 | 
				
			||||||
		res[len] = '\n';
 | 
					 | 
				
			||||||
		len++;
 | 
					 | 
				
			||||||
	} else len = 1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if( (size_t)write( w_fd, res ? res : "\n", len ) != (size_t)len )
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		Log_Resolver( LOG_CRIT, "Resolver: Can't write to parent (IDENT): %s!", strerror( errno ));
 | 
					 | 
				
			||||||
		close( w_fd );
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	free( res );
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
							res = ident_id( identsock, 10 );
 | 
				
			||||||
 | 
					#ifdef DEBUG
 | 
				
			||||||
 | 
							Log_Resolver(LOG_DEBUG, "Ok, IDENT lookup on socket %d done: \"%s\"",
 | 
				
			||||||
 | 
												identsock, res ? res : "(NULL)" );
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
							if (res && !array_cats(&resolved_addr, res)) {
 | 
				
			||||||
 | 
								Log_Resolver(LOG_WARNING, "Resolver: Cannot copy IDENT result: %s!", strerror(errno));
 | 
				
			||||||
 | 
								/* omit ident and return hostname only */ 
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (res) free(res);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						(void)identsock;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						len = array_bytes(&resolved_addr);
 | 
				
			||||||
 | 
						if( (size_t)write( w_fd, array_start(&resolved_addr), len) != len )
 | 
				
			||||||
 | 
							Log_Resolver( LOG_CRIT, "Resolver: Can't write result to parent: %s!", strerror( errno ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						close(w_fd);
 | 
				
			||||||
 | 
						array_free(&resolved_addr);
 | 
				
			||||||
} /* Do_ResolveAddr */
 | 
					} /* Do_ResolveAddr */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL void
 | 
					static void
 | 
				
			||||||
Do_ResolveName( char *Host, int w_fd )
 | 
					Do_ResolveName( const char *Host, int w_fd )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Resolver sub-process: resolve name and write result into pipe
 | 
						/* Resolver sub-process: resolve name and write result into pipe
 | 
				
			||||||
	 * to parent. */
 | 
						 * to parent. */
 | 
				
			||||||
@@ -235,33 +246,30 @@ Do_ResolveName( char *Host, int w_fd )
 | 
				
			|||||||
	char ip[16];
 | 
						char ip[16];
 | 
				
			||||||
	struct hostent *h;
 | 
						struct hostent *h;
 | 
				
			||||||
	struct in_addr *addr;
 | 
						struct in_addr *addr;
 | 
				
			||||||
	int len;
 | 
						size_t len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Log_Resolver( LOG_DEBUG, "Now resolving \"%s\" ...", Host );
 | 
						Log_Resolver( LOG_DEBUG, "Now resolving \"%s\" ...", Host );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Resolve hostname */
 | 
						/* Resolve hostname */
 | 
				
			||||||
	h = gethostbyname( Host );
 | 
						h = gethostbyname( Host );
 | 
				
			||||||
	if( h )
 | 
						if( h ) {
 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		addr = (struct in_addr *)h->h_addr;
 | 
							addr = (struct in_addr *)h->h_addr;
 | 
				
			||||||
		strlcpy( ip, inet_ntoa( *addr ), sizeof( ip ));
 | 
							strlcpy( ip, inet_ntoa( *addr ), sizeof( ip ));
 | 
				
			||||||
	}
 | 
						} else {
 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
#ifdef h_errno
 | 
					#ifdef h_errno
 | 
				
			||||||
		Log_Resolver( LOG_WARNING, "Can't resolve \"%s\": %s!", Host, Get_Error( h_errno ));
 | 
							Log_Resolver( LOG_WARNING, "Can't resolve \"%s\": %s!", Host, Get_Error( h_errno ));
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
		Log_Resolver( LOG_WARNING, "Can't resolve \"%s\"!", Host );
 | 
							Log_Resolver( LOG_WARNING, "Can't resolve \"%s\"!", Host );
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
		ip[0] = '\0';
 | 
							close(w_fd);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if( ip[0] ) Log_Resolver( LOG_DEBUG, "Ok, translated \"%s\" to %s.", Host, ip );
 | 
					#ifdef DEBUG
 | 
				
			||||||
 | 
						Log_Resolver( LOG_DEBUG, "Ok, translated \"%s\" to %s.", Host, ip );
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
	/* Write result into pipe to parent */
 | 
						/* Write result into pipe to parent */
 | 
				
			||||||
	len = strlen( ip );
 | 
						len = strlen( ip );
 | 
				
			||||||
	ip[len] = '\n'; len++;
 | 
						if ((size_t)write( w_fd, ip, len ) != len) {
 | 
				
			||||||
	if( (size_t)write( w_fd, ip, len ) != (size_t)len )
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		Log_Resolver( LOG_CRIT, "Resolver: Can't write to parent: %s!", strerror( errno ));
 | 
							Log_Resolver( LOG_CRIT, "Resolver: Can't write to parent: %s!", strerror( errno ));
 | 
				
			||||||
		close( w_fd );
 | 
							close( w_fd );
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -270,7 +278,7 @@ Do_ResolveName( char *Host, int w_fd )
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#ifdef h_errno
 | 
					#ifdef h_errno
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL char *
 | 
					static char *
 | 
				
			||||||
Get_Error( int H_Error )
 | 
					Get_Error( int H_Error )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Get error message for H_Error */
 | 
						/* Get error message for H_Error */
 | 
				
			||||||
@@ -293,33 +301,65 @@ Get_Error( int H_Error )
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL RES_STAT *
 | 
					static bool
 | 
				
			||||||
New_Res_Stat( void )
 | 
					register_callback( RES_STAT *s, void (*cbfunc)(int, short))
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	RES_STAT *s;
 | 
						assert(cbfunc != NULL);
 | 
				
			||||||
 | 
						assert(s != NULL);
 | 
				
			||||||
 | 
						assert(s->resolver_fd >= 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Allocate memory */
 | 
						if (io_setnonblock(s->resolver_fd) &&
 | 
				
			||||||
	s = (RES_STAT *)malloc( sizeof( RES_STAT ));
 | 
							io_event_create(s->resolver_fd, IO_WANTREAD, cbfunc))
 | 
				
			||||||
	if( ! s )
 | 
								return true;
 | 
				
			||||||
	{
 | 
					
 | 
				
			||||||
		Log( LOG_EMERG, "Resolver: Can't allocate memory! [Resolve_Addr]" );
 | 
						Log( LOG_CRIT, "Resolver: Could not register callback function: %s!", strerror(errno));
 | 
				
			||||||
		return NULL;
 | 
						close(s->resolver_fd);
 | 
				
			||||||
 | 
						Resolve_Init(s);
 | 
				
			||||||
 | 
						return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GLOBAL bool
 | 
				
			||||||
 | 
					Resolve_Shutdown( RES_STAT *s)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						bool ret = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert(s != NULL);
 | 
				
			||||||
 | 
						assert(s->resolver_fd >= 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (s->resolver_fd >= 0)
 | 
				
			||||||
 | 
							ret = io_close(s->resolver_fd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Resolve_Init(s);
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Read result of resolver sub-process from pipe
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					GLOBAL size_t
 | 
				
			||||||
 | 
					Resolve_Read( RES_STAT *s, void* readbuf, size_t buflen)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						ssize_t bytes_read;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert(buflen > 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Read result from pipe */
 | 
				
			||||||
 | 
						bytes_read = read(s->resolver_fd, readbuf, buflen);
 | 
				
			||||||
 | 
						if (bytes_read < 0) {
 | 
				
			||||||
 | 
							if (errno == EAGAIN)
 | 
				
			||||||
 | 
								return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Log( LOG_CRIT, "Resolver: Can't read result: %s!", strerror(errno));
 | 
				
			||||||
 | 
							bytes_read = 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					#ifdef DEBUG
 | 
				
			||||||
	/* Initialize pipe for result */
 | 
						else if (bytes_read == 0)
 | 
				
			||||||
	if( pipe( s->pipe ) != 0 )
 | 
							Log( LOG_DEBUG, "Resolver: Can't read result: EOF");
 | 
				
			||||||
	{
 | 
					#endif
 | 
				
			||||||
		free( s );
 | 
						Resolve_Shutdown(s);
 | 
				
			||||||
		Log( LOG_ALERT, "Resolver: Can't create output pipe: %s!", strerror( errno ));
 | 
						return (size_t)bytes_read;
 | 
				
			||||||
		return NULL;
 | 
					}
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	s->stage = 0;
 | 
					 | 
				
			||||||
	s->bufpos = 0;
 | 
					 | 
				
			||||||
	s->pid = -1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return s;
 | 
					 | 
				
			||||||
} /* New_Res_Stat */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* -eof- */
 | 
					/* -eof- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,7 @@
 | 
				
			|||||||
 * (at your option) any later version.
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
					 * Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * $Id: resolve.h,v 1.8 2005/03/19 18:43:49 fw Exp $
 | 
					 * $Id: resolve.h,v 1.13 2006/05/10 21:24:02 alex Exp $
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Asynchronous resolver (header)
 | 
					 * Asynchronous resolver (header)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@@ -17,39 +17,24 @@
 | 
				
			|||||||
#ifndef __resolve_h__
 | 
					#ifndef __resolve_h__
 | 
				
			||||||
#define __resolve_h__
 | 
					#define __resolve_h__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "array.h"
 | 
				
			||||||
#ifdef HAVE_SYS_SELECT_H
 | 
					 | 
				
			||||||
#	include <sys/select.h>
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#include <sys/types.h>
 | 
					 | 
				
			||||||
#include <netinet/in.h>
 | 
					#include <netinet/in.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* This struct must not be accessed directly */
 | 
				
			||||||
typedef struct _Res_Stat
 | 
					typedef struct _Res_Stat {
 | 
				
			||||||
{
 | 
						pid_t pid;			/* PID of resolver process */
 | 
				
			||||||
	int pid;			/* PID des Child-Prozess */
 | 
						int resolver_fd;		/* pipe fd for lookup result. */
 | 
				
			||||||
	int pipe[2];			/* Pipe fuer IPC */
 | 
					 | 
				
			||||||
	int stage;			/* Hostname/IP(0) or IDENT(1)? */
 | 
					 | 
				
			||||||
	int bufpos;			/* Position in buffer */
 | 
					 | 
				
			||||||
	char buffer[HOST_LEN];		/* Buffer */
 | 
					 | 
				
			||||||
} RES_STAT;
 | 
					} RES_STAT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL fd_set Resolver_FDs;
 | 
					#define Resolve_Getfd(x)		((x)->resolver_fd)
 | 
				
			||||||
 | 
					#define Resolve_INPROGRESS(x)		((x)->resolver_fd >= 0)
 | 
				
			||||||
 | 
					 | 
				
			||||||
GLOBAL void Resolve_Init PARAMS(( void ));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef IDENTAUTH
 | 
					 | 
				
			||||||
GLOBAL RES_STAT *Resolve_Addr PARAMS(( struct sockaddr_in *Addr, int Sock ));
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
GLOBAL RES_STAT *Resolve_Addr PARAMS(( struct sockaddr_in *Addr ));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
GLOBAL RES_STAT *Resolve_Name PARAMS(( char *Host ));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GLOBAL bool Resolve_Addr PARAMS(( RES_STAT *s, struct sockaddr_in *Addr, int identsock, void (*cbfunc)(int, short)));
 | 
				
			||||||
 | 
					GLOBAL bool Resolve_Name PARAMS(( RES_STAT *s, const char *Host, void (*cbfunc)(int, short) ));
 | 
				
			||||||
 | 
					GLOBAL size_t Resolve_Read PARAMS(( RES_STAT *s, void *buf, size_t buflen));
 | 
				
			||||||
 | 
					GLOBAL void Resolve_Init PARAMS(( RES_STAT *s));
 | 
				
			||||||
 | 
					GLOBAL bool Resolve_Shutdown PARAMS(( RES_STAT *s));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* -eof- */
 | 
					/* -eof- */
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								src/portab/.cvsignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								src/portab/.cvsignore
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					Makefile
 | 
				
			||||||
 | 
					Makefile.in
 | 
				
			||||||
 | 
					.deps
 | 
				
			||||||
 | 
					portabtest
 | 
				
			||||||
@@ -8,7 +8,7 @@
 | 
				
			|||||||
 * (at your option) any later version.
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
					 * Please read the file COPYING, README and AUTHORS for more information.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * $Id: portab.h,v 1.21 2005/04/16 09:23:01 fw Exp $
 | 
					 * $Id: portab.h,v 1.22 2005/07/31 20:13:11 alex Exp $
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Portability functions and declarations (header for libngbportab).
 | 
					 * Portability functions and declarations (header for libngbportab).
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@@ -65,9 +65,6 @@
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* keywords */
 | 
					 | 
				
			||||||
#define LOCAL static
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* datatypes */
 | 
					/* datatypes */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef PROTOTYPES
 | 
					#ifndef PROTOTYPES
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "portab.h"
 | 
					#include "portab.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char UNUSED id[] = "$Id: portabtest.c,v 1.12 2005/03/19 18:43:50 fw Exp $";
 | 
					static char UNUSED id[] = "$Id: portabtest.c,v 1.13 2005/07/31 20:13:11 alex Exp $";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "imp.h"
 | 
					#include "imp.h"
 | 
				
			||||||
#include <stdarg.h>
 | 
					#include <stdarg.h>
 | 
				
			||||||
@@ -25,7 +25,7 @@ static char UNUSED id[] = "$Id: portabtest.c,v 1.12 2005/03/19 18:43:50 fw Exp $
 | 
				
			|||||||
#include "exp.h"
 | 
					#include "exp.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL void Panic PARAMS (( char *Reason, int Code ));
 | 
					static void Panic PARAMS (( char *Reason, int Code ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOBAL int
 | 
					GLOBAL int
 | 
				
			||||||
@@ -51,7 +51,7 @@ main( void )
 | 
				
			|||||||
} /* portab_check_types */
 | 
					} /* portab_check_types */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOCAL void
 | 
					static void
 | 
				
			||||||
Panic( char *Reason, int Code )
 | 
					Panic( char *Reason, int Code )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Oops, something failed!? */
 | 
						/* Oops, something failed!? */
 | 
				
			||||||
 
 | 
				
			|||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user