mirror of
				https://github.com/osmarks/ngircd.git
				synced 2025-11-03 23:43:00 +00:00 
			
		
		
		
	Compare commits
	
		
			349 Commits
		
	
	
		
			rel-0-7-6
			...
			branch-0-9
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					ab1e81841b | ||
| 
						 | 
					957cdda1c0 | ||
| 
						 | 
					c35b810b90 | ||
| 
						 | 
					3179bd3090 | ||
| 
						 | 
					f95d813064 | ||
| 
						 | 
					a854a38616 | ||
| 
						 | 
					51b22759b6 | ||
| 
						 | 
					521782ad05 | ||
| 
						 | 
					84e23f09fc | ||
| 
						 | 
					4429afe3c2 | ||
| 
						 | 
					216eb30c73 | ||
| 
						 | 
					ff91c6db38 | ||
| 
						 | 
					a8d50a1ee4 | ||
| 
						 | 
					7962ba5fe0 | ||
| 
						 | 
					04766b8f3d | ||
| 
						 | 
					2019324741 | ||
| 
						 | 
					99e718eff9 | ||
| 
						 | 
					61776e9a57 | ||
| 
						 | 
					eccf4ea5f2 | ||
| 
						 | 
					914fbac0f1 | ||
| 
						 | 
					b6ce4ce002 | ||
| 
						 | 
					1246ec04b8 | ||
| 
						 | 
					6335461bc1 | ||
| 
						 | 
					8e5d37efc8 | ||
| 
						 | 
					ac8559171b | ||
| 
						 | 
					d052fdff78 | ||
| 
						 | 
					fe9525d105 | ||
| 
						 | 
					5b29518ae5 | ||
| 
						 | 
					b715a5f061 | ||
| 
						 | 
					0b31b46353 | ||
| 
						 | 
					8a7ae2dfc1 | ||
| 
						 | 
					01ee1bdf2c | ||
| 
						 | 
					13ee3e62be | ||
| 
						 | 
					fc038ae444 | ||
| 
						 | 
					8d1fe3b89a | ||
| 
						 | 
					d74029851f | ||
| 
						 | 
					8ff1a4b666 | ||
| 
						 | 
					5f68d5f1e1 | ||
| 
						 | 
					db2a41e5bc | ||
| 
						 | 
					eeccc193dd | ||
| 
						 | 
					0e3ce63ec1 | ||
| 
						 | 
					0c33f46fc2 | ||
| 
						 | 
					117a9e21e7 | ||
| 
						 | 
					162338b8c8 | ||
| 
						 | 
					de395db8e3 | ||
| 
						 | 
					dbea187373 | ||
| 
						 | 
					d81dab99fa | ||
| 
						 | 
					9dc5e50226 | ||
| 
						 | 
					c06c815c28 | ||
| 
						 | 
					04169f34cf | ||
| 
						 | 
					aec535c8b6 | ||
| 
						 | 
					2d4dd33627 | ||
| 
						 | 
					b0699efdab | ||
| 
						 | 
					1ca8bb5255 | ||
| 
						 | 
					bc2dac3c74 | ||
| 
						 | 
					94dd7fa7d6 | ||
| 
						 | 
					fcf65beea4 | ||
| 
						 | 
					1cf8ccd8fe | ||
| 
						 | 
					74424cb1a5 | ||
| 
						 | 
					5c20474fdb | ||
| 
						 | 
					8b0ac2306e | ||
| 
						 | 
					5195555c5a | ||
| 
						 | 
					a4660f40db | ||
| 
						 | 
					9fa9c1fdda | ||
| 
						 | 
					cac9f279fa | ||
| 
						 | 
					517321807e | ||
| 
						 | 
					ae98008c1c | ||
| 
						 | 
					45404a1644 | ||
| 
						 | 
					50338126e0 | ||
| 
						 | 
					8ac701d6c8 | ||
| 
						 | 
					158bf554c3 | ||
| 
						 | 
					9c3c7e5a09 | ||
| 
						 | 
					cd0dc8627d | ||
| 
						 | 
					44fdde7610 | ||
| 
						 | 
					95f8b963a6 | ||
| 
						 | 
					1aeaf64c66 | ||
| 
						 | 
					06caecb0c4 | ||
| 
						 | 
					b1c14598e1 | ||
| 
						 | 
					7f0d101184 | ||
| 
						 | 
					9f247ebd5a | ||
| 
						 | 
					dd9b4bc956 | ||
| 
						 | 
					6f97dd4938 | ||
| 
						 | 
					a02f25a810 | ||
| 
						 | 
					aa25cd7da2 | ||
| 
						 | 
					70fcdf1b5c | ||
| 
						 | 
					dfe662ad45 | ||
| 
						 | 
					7daa7fb278 | ||
| 
						 | 
					e7c2c86aee | ||
| 
						 | 
					c4bc2114c9 | ||
| 
						 | 
					129a22a29b | ||
| 
						 | 
					8304210c06 | ||
| 
						 | 
					aee48a3b38 | ||
| 
						 | 
					77faf14b29 | ||
| 
						 | 
					8b17579e60 | ||
| 
						 | 
					b4363162ce | ||
| 
						 | 
					873edc6311 | ||
| 
						 | 
					6ed37415fc | ||
| 
						 | 
					55fadbfb1d | ||
| 
						 | 
					ca8ab38cac | ||
| 
						 | 
					dec7eba531 | ||
| 
						 | 
					b0ae15e01d | ||
| 
						 | 
					43ba1bc805 | ||
| 
						 | 
					811ac48bd2 | ||
| 
						 | 
					e936a79f6b | ||
| 
						 | 
					0545288ebd | ||
| 
						 | 
					e635ed43bf | ||
| 
						 | 
					4d0b03b423 | ||
| 
						 | 
					f6df13d5f8 | ||
| 
						 | 
					f56a1bdf20 | ||
| 
						 | 
					9dfcc6504e | ||
| 
						 | 
					a822153309 | ||
| 
						 | 
					49f5a4d454 | ||
| 
						 | 
					326607eea1 | ||
| 
						 | 
					bfba1f37ed | ||
| 
						 | 
					374f90f392 | ||
| 
						 | 
					8adff59223 | ||
| 
						 | 
					27d93d7d8c | ||
| 
						 | 
					8a2ed0a75f | ||
| 
						 | 
					5fdd5be12b | ||
| 
						 | 
					795802f2b0 | ||
| 
						 | 
					1869766331 | ||
| 
						 | 
					1d08d51e2e | ||
| 
						 | 
					5e929effca | ||
| 
						 | 
					e618041168 | ||
| 
						 | 
					e7f8782831 | ||
| 
						 | 
					4ef172d603 | ||
| 
						 | 
					490c9d04d7 | ||
| 
						 | 
					8579b2a1e5 | ||
| 
						 | 
					3da942e237 | ||
| 
						 | 
					bcb6cf3ffa | ||
| 
						 | 
					972b07ff29 | ||
| 
						 | 
					ba19fb8ff4 | ||
| 
						 | 
					8d8b133bdf | ||
| 
						 | 
					ec30cd4e5f | ||
| 
						 | 
					f2fbf206b6 | ||
| 
						 | 
					1fdd5478c6 | ||
| 
						 | 
					9537542647 | ||
| 
						 | 
					0993ff81bb | ||
| 
						 | 
					894cd2cd68 | ||
| 
						 | 
					c16d1b03aa | ||
| 
						 | 
					451315643f | ||
| 
						 | 
					d77182e7a6 | ||
| 
						 | 
					8edeed8418 | ||
| 
						 | 
					112102b10c | ||
| 
						 | 
					ae63ed04c5 | ||
| 
						 | 
					85acb82469 | ||
| 
						 | 
					51d09fb4f7 | ||
| 
						 | 
					8308c170db | ||
| 
						 | 
					07fe19889b | ||
| 
						 | 
					0c293ae988 | ||
| 
						 | 
					18c92d9de7 | ||
| 
						 | 
					2440ed080c | ||
| 
						 | 
					669da58715 | ||
| 
						 | 
					39f1ddd9d0 | ||
| 
						 | 
					34e912d9f2 | ||
| 
						 | 
					44172a8c7f | ||
| 
						 | 
					a6d7fb8739 | ||
| 
						 | 
					d16ce5a735 | ||
| 
						 | 
					a40a026d15 | ||
| 
						 | 
					6c5f4beb53 | ||
| 
						 | 
					26b0ddf200 | ||
| 
						 | 
					b6690df2be | ||
| 
						 | 
					6dacec7ded | ||
| 
						 | 
					429b5f3ec9 | ||
| 
						 | 
					81bacda627 | ||
| 
						 | 
					6960cb4c38 | ||
| 
						 | 
					7b61b34c56 | ||
| 
						 | 
					386d3b9e67 | ||
| 
						 | 
					5049c5c694 | ||
| 
						 | 
					292879aca4 | ||
| 
						 | 
					dcb9e2a004 | ||
| 
						 | 
					0d10c60b31 | ||
| 
						 | 
					08e0b277bc | ||
| 
						 | 
					58736b3902 | ||
| 
						 | 
					f7354cdf28 | ||
| 
						 | 
					196f27c4ad | ||
| 
						 | 
					c1f32e8214 | ||
| 
						 | 
					eee2762852 | ||
| 
						 | 
					c79fa28a66 | ||
| 
						 | 
					1e692e5890 | ||
| 
						 | 
					ceafdf109b | ||
| 
						 | 
					450251f082 | ||
| 
						 | 
					ceef058065 | ||
| 
						 | 
					b04a526a19 | ||
| 
						 | 
					2f195a07b2 | ||
| 
						 | 
					f38eeedfd7 | ||
| 
						 | 
					8ca1e4d548 | ||
| 
						 | 
					e07cc4bb63 | ||
| 
						 | 
					c5bdd86f96 | ||
| 
						 | 
					aa26e2ef36 | ||
| 
						 | 
					9445962237 | ||
| 
						 | 
					6b898b63f0 | ||
| 
						 | 
					f7a4d03ba2 | ||
| 
						 | 
					ade1e2eb7b | ||
| 
						 | 
					a9a605de3e | ||
| 
						 | 
					7ec11de523 | ||
| 
						 | 
					18eb92a72b | ||
| 
						 | 
					9ddb934784 | ||
| 
						 | 
					4f8ac179bf | ||
| 
						 | 
					02b8e51562 | ||
| 
						 | 
					d27196e334 | ||
| 
						 | 
					3edaa35d49 | ||
| 
						 | 
					88258070c4 | ||
| 
						 | 
					beb4edd3cf | ||
| 
						 | 
					364ff7087d | ||
| 
						 | 
					0b3ee07a2a | ||
| 
						 | 
					a49a580a77 | ||
| 
						 | 
					7080e9f83c | ||
| 
						 | 
					59a48bfa1f | ||
| 
						 | 
					42e8063a32 | ||
| 
						 | 
					c23bbe6b65 | ||
| 
						 | 
					d8f47ed195 | ||
| 
						 | 
					d7c975e8d8 | ||
| 
						 | 
					bf21dd1578 | ||
| 
						 | 
					9013f56451 | ||
| 
						 | 
					3012c232eb | ||
| 
						 | 
					26390c60fb | ||
| 
						 | 
					cdb039672c | ||
| 
						 | 
					7281b8dd4d | ||
| 
						 | 
					39fc76c4e4 | ||
| 
						 | 
					a6d51c3a9e | ||
| 
						 | 
					18b2227a0a | ||
| 
						 | 
					47701feb08 | ||
| 
						 | 
					59b903f3bb | ||
| 
						 | 
					d433eb3896 | ||
| 
						 | 
					c1e9841118 | ||
| 
						 | 
					dd59820051 | ||
| 
						 | 
					967476799f | ||
| 
						 | 
					6b1e322865 | ||
| 
						 | 
					1d8da4b525 | ||
| 
						 | 
					292c7bd4c0 | ||
| 
						 | 
					558fe6b453 | ||
| 
						 | 
					bed119c9e5 | ||
| 
						 | 
					64d330b726 | ||
| 
						 | 
					cc25c52048 | ||
| 
						 | 
					233210b906 | ||
| 
						 | 
					f68e92eb9a | ||
| 
						 | 
					b225081c2b | ||
| 
						 | 
					30bbc5e1e1 | ||
| 
						 | 
					0c07eb71a7 | ||
| 
						 | 
					0b1202cd9e | ||
| 
						 | 
					8212662d9d | ||
| 
						 | 
					f697923c48 | ||
| 
						 | 
					af77ce70b6 | ||
| 
						 | 
					507a9e9cb3 | ||
| 
						 | 
					779446298c | ||
| 
						 | 
					cb76d96efb | ||
| 
						 | 
					de1489b39b | ||
| 
						 | 
					5155e1c67a | ||
| 
						 | 
					1e9a958324 | ||
| 
						 | 
					56227abc5e | ||
| 
						 | 
					f9e651b333 | ||
| 
						 | 
					bdaf53e799 | ||
| 
						 | 
					33f4e6763b | ||
| 
						 | 
					eaa550d690 | ||
| 
						 | 
					f275c66e95 | ||
| 
						 | 
					17fffea873 | ||
| 
						 | 
					1e3363d2a4 | ||
| 
						 | 
					6667bb6b77 | ||
| 
						 | 
					b90bedbcb2 | ||
| 
						 | 
					c2a154a33e | ||
| 
						 | 
					6bbc086760 | ||
| 
						 | 
					bb98fd8c85 | ||
| 
						 | 
					e9b0ec9148 | ||
| 
						 | 
					c53903eb3f | ||
| 
						 | 
					57c7e23622 | ||
| 
						 | 
					cdb694aeb3 | ||
| 
						 | 
					6cafa16a56 | ||
| 
						 | 
					5589ebd9c3 | ||
| 
						 | 
					f645e5b62e | ||
| 
						 | 
					ad07c94c8d | ||
| 
						 | 
					5a9c04619f | ||
| 
						 | 
					ed94d5d5cd | ||
| 
						 | 
					ea076a28f2 | ||
| 
						 | 
					c9ccb66944 | ||
| 
						 | 
					cb6279f102 | ||
| 
						 | 
					b79b315dd4 | ||
| 
						 | 
					c40592d2ce | ||
| 
						 | 
					05170bc94c | ||
| 
						 | 
					07ad774f0a | ||
| 
						 | 
					a8da1afe05 | ||
| 
						 | 
					ff2c1efae8 | ||
| 
						 | 
					05e2c0f048 | ||
| 
						 | 
					d329a961bd | ||
| 
						 | 
					606cdb69bf | ||
| 
						 | 
					a5695e7ef8 | ||
| 
						 | 
					2978b5edff | ||
| 
						 | 
					be79fabcbf | ||
| 
						 | 
					ec2f16fa16 | ||
| 
						 | 
					7b6e26628a | ||
| 
						 | 
					2981fe9eb7 | ||
| 
						 | 
					20d002e155 | ||
| 
						 | 
					cfe6356531 | ||
| 
						 | 
					e33ab90379 | ||
| 
						 | 
					d8f3c2b42b | ||
| 
						 | 
					3debe00581 | ||
| 
						 | 
					eb6113fc33 | ||
| 
						 | 
					166c610957 | ||
| 
						 | 
					b9f16c9635 | ||
| 
						 | 
					1ed708ef39 | ||
| 
						 | 
					5e4124d38d | ||
| 
						 | 
					0d00ce6e38 | ||
| 
						 | 
					057df41a9b | ||
| 
						 | 
					5eb89619d6 | ||
| 
						 | 
					6e03626eed | ||
| 
						 | 
					d9efbe80e1 | ||
| 
						 | 
					da9456dbca | ||
| 
						 | 
					ac9390f08c | ||
| 
						 | 
					3f602e5a25 | ||
| 
						 | 
					6647da58fc | ||
| 
						 | 
					225a338139 | ||
| 
						 | 
					bfdf17ff32 | ||
| 
						 | 
					260b8e5f36 | ||
| 
						 | 
					9a009b24da | ||
| 
						 | 
					83765a5a34 | ||
| 
						 | 
					bdc08ae28e | ||
| 
						 | 
					34ede2a91a | ||
| 
						 | 
					0424747e95 | ||
| 
						 | 
					8d5e170091 | ||
| 
						 | 
					68ee133f87 | ||
| 
						 | 
					27cd1e0d05 | ||
| 
						 | 
					3dc4c92553 | ||
| 
						 | 
					188e95f680 | ||
| 
						 | 
					c5f4e9d095 | ||
| 
						 | 
					e541da2a8f | ||
| 
						 | 
					e55399c667 | ||
| 
						 | 
					e7102559b9 | ||
| 
						 | 
					32f8eb46ee | ||
| 
						 | 
					0e01a37a69 | ||
| 
						 | 
					927e626f03 | ||
| 
						 | 
					277a048f4f | ||
| 
						 | 
					dd0b37690b | ||
| 
						 | 
					83194a23a3 | ||
| 
						 | 
					a1ff081b8a | ||
| 
						 | 
					e1c70a3c93 | ||
| 
						 | 
					c43d47d69c | ||
| 
						 | 
					bbf978dbcf | ||
| 
						 | 
					090756523e | ||
| 
						 | 
					8497d28fba | ||
| 
						 | 
					cef95681ff | ||
| 
						 | 
					52a24c4bbd | ||
| 
						 | 
					e2968dd98d | ||
| 
						 | 
					79b9592f27 | ||
| 
						 | 
					0551f688f6 | ||
| 
						 | 
					c74ac55832 | ||
| 
						 | 
					b4dc216db3 | ||
| 
						 | 
					cbf87971a4 | ||
| 
						 | 
					4d656d12e9 | ||
| 
						 | 
					da78dc4785 | 
							
								
								
									
										19
									
								
								AUTHORS
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								AUTHORS
									
									
									
									
									
								
							@@ -1,7 +1,7 @@
 | 
			
		||||
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
 | 
			
		||||
                      (c)2001-2003 by Alexander Barton,
 | 
			
		||||
                        (c)2001-2005 Alexander Barton,
 | 
			
		||||
                    alex@barton.de, http://www.barton.de/
 | 
			
		||||
 | 
			
		||||
               ngIRCd is free software and published under the
 | 
			
		||||
@@ -12,15 +12,24 @@
 | 
			
		||||
 | 
			
		||||
Main Authors
 | 
			
		||||
~~~~~~~~~~~~
 | 
			
		||||
Alexander Barton, <alex@barton.de>, "alex"
 | 
			
		||||
Alexander Barton, <alex@barton.de> (alex)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Contributors
 | 
			
		||||
~~~~~~~~~~~~
 | 
			
		||||
Goetz Hoffart, <goetz@hoffart.de>
 | 
			
		||||
Ilja Osthoff, <i.osthoff@gmx.net>
 | 
			
		||||
Goetz Hoffart, <goetz@hoffart.de> (goetz)
 | 
			
		||||
Ilja Osthoff, <i.osthoff@gmx.net> (ilja)
 | 
			
		||||
Benjamin Pineau, <ben@zouh.org>
 | 
			
		||||
Sean Reifschneider, <jafo-rpms@tummy.com>
 | 
			
		||||
Florian Westphal, <westphal@foo.fh-furtwangen.de> (fw)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Code snippets
 | 
			
		||||
~~~~~~~~~~~~~
 | 
			
		||||
J. Kercheval: pattern matching functions
 | 
			
		||||
Patrick Powell, <papowell@astart.com>: snprintf()-function
 | 
			
		||||
Andrew Tridgell & Martin Pool: strl{cpy|cat}()-functions
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- 
 | 
			
		||||
$Id: AUTHORS,v 1.5 2003/04/21 21:33:18 alex Exp $
 | 
			
		||||
$Id: AUTHORS,v 1.11 2005/03/19 14:24:52 alex Exp $
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										202
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										202
									
								
								ChangeLog
									
									
									
									
									
								
							@@ -1,7 +1,7 @@
 | 
			
		||||
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
 | 
			
		||||
                      (c)2001-2003 by Alexander Barton,
 | 
			
		||||
                        (c)2001-2005 Alexander Barton,
 | 
			
		||||
                    alex@barton.de, http://www.barton.de/
 | 
			
		||||
 | 
			
		||||
               ngIRCd is free software and published under the
 | 
			
		||||
@@ -10,8 +10,204 @@
 | 
			
		||||
                               -- ChangeLog --
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ngIRCd CVS-HEAD
 | 
			
		||||
ngIRCd 0.9.2 (2005-10-15)
 | 
			
		||||
 | 
			
		||||
  - Fixed a bug that could cause the damon to crash when outgoing server
 | 
			
		||||
    connections can't be established.
 | 
			
		||||
  - Fixed a bug that caused the daemon to leak file descriptors when no
 | 
			
		||||
    resolver subprocesses could be created.
 | 
			
		||||
  - Fixed server NOTICEs to users with "s" mode ("server messages").
 | 
			
		||||
  - Fixed a format string bug in "connection statistics" messages to clients.
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.9.1 (2005-08-03)
 | 
			
		||||
 | 
			
		||||
  - The KILL command killed much more than desired (including server links!)
 | 
			
		||||
    when the target user is connected to a remote server. Bug introduced in
 | 
			
		||||
    ngIRCd 0.9.0 ...  Reported by <qssl@fastmail.fm>, Thanks!
 | 
			
		||||
  - Changed some constants to be "signed" (instead of unsigned) to solve
 | 
			
		||||
    problems with old (pre-ANSI) compilers.
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.9.0 (2005-07-24)
 | 
			
		||||
 | 
			
		||||
  ngIRCd 0.9.0-pre1 (2005-07-09)
 | 
			
		||||
  - Fixed maximum length of user names, now allow up to 9 characters.
 | 
			
		||||
  - Cut off oversized IRC messages that should be sent to the network instead
 | 
			
		||||
    of shuttding down the (wrong) connection.
 | 
			
		||||
  - Don't generate error messages for unknown commands received before the
 | 
			
		||||
    client is registered with the server (like the original ircd).
 | 
			
		||||
  - Never run with root privileges but always switch the user ID.
 | 
			
		||||
  - Make "netsplit" messages RFC compliant.
 | 
			
		||||
  - Fix handling of QUIT Messages: send only one message, even if the client
 | 
			
		||||
    is member of multiple channels.
 | 
			
		||||
  - Don't exit server if closing of a socket fails; instead ignore it and
 | 
			
		||||
    pray that this will be "the right thing" ...
 | 
			
		||||
  - Implemented the IRC function "WHOWAS".
 | 
			
		||||
  - Don't enable assert() calls when not ./configure'd with --enable-debug.
 | 
			
		||||
  - Fixed ./configure test for TCP Wrappers: now it runs on Mac OS X as well.
 | 
			
		||||
  - Enhanced configure script: now you can pass an (optional) search path
 | 
			
		||||
    to all --with-XXX parameters, e. g. "--with-ident=/opt/ident".
 | 
			
		||||
  - Removed typedefs for the native C datatypes.
 | 
			
		||||
    Use stdbool.h / inttypes.h if available.
 | 
			
		||||
  - New configuration option "OperServerMode" to enable a workaround needed
 | 
			
		||||
    when running an network with ircd2 servers and "OperCanUseMode" enabled
 | 
			
		||||
    to prevent the ircd2 daemon to drop mode changes of IRC operators.
 | 
			
		||||
    Patch by Florian Westphal, <westphal@foo.fh-furtwangen.de>.
 | 
			
		||||
  - Implemented support for "secret channels" (channel mode "s").
 | 
			
		||||
  - New configuration option "Mask" for [Operator] sections to limit OPER
 | 
			
		||||
    commands to users with a specific IRC mask. Patch from Florian Westphal.
 | 
			
		||||
  - Write "error file" (/tmp/ngircd-XXX.err) only if compiled with debug
 | 
			
		||||
    code ("--enable-debug") and running as daemon process.
 | 
			
		||||
  - Don't create version information string each time a client connects
 | 
			
		||||
    but instead on server startup. By Florian Westphal.
 | 
			
		||||
  - New configuration variable "PidFile", section "[Global]": if defined,
 | 
			
		||||
    the server writes its process ID (PID) to this file. Default: off.
 | 
			
		||||
    Idea of Florian Westphal, <westphal@foo.fh-furtwangen.de>.
 | 
			
		||||
  - Code cleanups from Florian Westphal, <westphal@foo.fh-furtwangen.de>.
 | 
			
		||||
  - Raised the maximum length of passwords to 20 characters.
 | 
			
		||||
  - Fixed a memory leak when resizing the connection pool and realloc()
 | 
			
		||||
    failed. Now we don't fall back to malloc(), which should be sane anyway.
 | 
			
		||||
    Patch from Florian Westphal, <westphal@foo.fh-furtwangen.de>.
 | 
			
		||||
  - Added support for the Howl (http://www.porchdogsoft.com/products/howl/)
 | 
			
		||||
    Rendezvous API, in addition to the API of Apple (Mac OS X). The available
 | 
			
		||||
    API will be autodetected when you call "./configure --with-rendezvous".
 | 
			
		||||
  - Made ngIRCd compile on HP/UX 10.20 with native HP pre-ANSI C compiler and
 | 
			
		||||
    most probably other older C compilers on other systems.
 | 
			
		||||
  - When the daemon should switch to another user ID (ServerID is defined in
 | 
			
		||||
    the configuration file) and is not running in a chroot environment, it
 | 
			
		||||
    changes its working directory to the home directory of this user. This
 | 
			
		||||
    should enable the system to write proper core files when not running with
 | 
			
		||||
    root privileges ...
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.8.3 (2005-02-03)
 | 
			
		||||
 | 
			
		||||
  - Fixed a bug that could case a root exploit when the daemon is compiled
 | 
			
		||||
    to do IDENT lookups and is logging to syslog. Bug discovered by CoKi,
 | 
			
		||||
    <coki@nosystem.com.ar>, thanks a lot!
 | 
			
		||||
    (http://www.nosystem.com.ar/advisories/advisory-11.txt)
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.8.2 (2005-01-26)
 | 
			
		||||
 | 
			
		||||
  - Added doc/SSL.txt to distribution.
 | 
			
		||||
  - Fixed a buffer overflow that could cause the daemon to crash. Bug found
 | 
			
		||||
    by Florian Westphal, <westphal@foo.fh-furtwangen.de>.
 | 
			
		||||
  - Fixed a possible buffer underrun when reading the MOTD file. Thanks
 | 
			
		||||
    to Florian Westphal, <westphal@foo.fh-furtwangen.de>.
 | 
			
		||||
  - Fixed detection of IRC lines which are too long to send. Detected by
 | 
			
		||||
    Florian Westphal, <westphal@foo.fh-furtwangen.de>.
 | 
			
		||||
  - Fixed return values of our own implementation of strlcpy(). The code has
 | 
			
		||||
    been taken from rsync and they fixed it, but we didn't until today :-/
 | 
			
		||||
    It has only been used when the system didn't implement strlcpy by itself,
 | 
			
		||||
    not on "modern" systems. Florian Westphal, <westphal@foo.fh-furtwangen.de>.
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.8.1 (2004-12-25)
 | 
			
		||||
 | 
			
		||||
  - Autoconf: Updated config.guess and config.sub
 | 
			
		||||
  - Added some more debug code ...
 | 
			
		||||
  - Fixed wrong variable names in output of "ngircd --configtest".
 | 
			
		||||
  - Debian: Fixed the name of the "default file" in the init script for
 | 
			
		||||
    ngircd-full packages. And do the test if the binary is executable after
 | 
			
		||||
    reading this file.
 | 
			
		||||
  - Enhanced the "test suite": please have a look at src/testsuite/README!
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.8.0 (2004-06-26)
 | 
			
		||||
 | 
			
		||||
  - Fixed wrong buffer size calculation for results of the resolver.
 | 
			
		||||
 | 
			
		||||
  ngircd 0.8.0-pre2 (2004-05-16)
 | 
			
		||||
  - Enhanced logging to console when running in "no-detached mode": added
 | 
			
		||||
    PID and log messages of resolver sub-processes.
 | 
			
		||||
  - Fixed host name lookups when using IDENT user lookups.
 | 
			
		||||
  - "make clean" and "make maintainer-clean" remove more files now.
 | 
			
		||||
 | 
			
		||||
  ngIRCd 0.8.0-pre1 (2004-05-07)
 | 
			
		||||
  - Two new configuration options: "ChrootDir" and "MotdPhrase", thanks to
 | 
			
		||||
    Benjamin Pineau <ben@zouh.org>. Now you can force the daemon to change
 | 
			
		||||
    its root and working directory to something "safe". MotdPhrase is used
 | 
			
		||||
    to define an "MOTD string" instead of a whole file, useful if the
 | 
			
		||||
    "real" MOTD file would be outside the "jail".
 | 
			
		||||
  - INVITE- and BAN-lists become synchronized between IRC+ servers when
 | 
			
		||||
    establishing new connections, if the peer supports this as well.
 | 
			
		||||
  - Reorganized autogen.sh and configure scripts.
 | 
			
		||||
  - Fixed a wrong assert() which could cause the daemon to exit spuriously
 | 
			
		||||
    when closing down connections.
 | 
			
		||||
  - Better logging of decompression errors returned by zlib.
 | 
			
		||||
  - Servers other than the destination server didn't clean up the invite
 | 
			
		||||
    list of an "invite-only" channel properly when an INVITE'd user joined.
 | 
			
		||||
  - Changed the reply of the MODE command to match the syntax of the
 | 
			
		||||
    original ircd exactly: the unnecessary but missing ":" before the last
 | 
			
		||||
    parameter has been added.
 | 
			
		||||
  - Fixed TRACE: don't output "Serv" lines for ourself; display more info.
 | 
			
		||||
  - Results of the resolver (hostnames and IDENT names) are discarded after
 | 
			
		||||
    the client is successfully registered with the server.
 | 
			
		||||
  - Better logging while establishing and shutting down connections.
 | 
			
		||||
  - The type of service (TOS) of all sockets is set to "interactive" now.
 | 
			
		||||
  - Added short command line option "-t" as alternative to "--configtest".
 | 
			
		||||
  - Added optional support for "IDENT" lookups on incoming connections. You
 | 
			
		||||
    have to enable this function with the ./configure switch "--with-ident".
 | 
			
		||||
    The default is not to do IDENT lookups.
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.7.7 (2004-02-05)
 | 
			
		||||
 | 
			
		||||
  - The info text ("real name") of users is set to "-" if none has been
 | 
			
		||||
    specified using the USER command (e. g. "USER user * * :"). Reason:
 | 
			
		||||
    the original ircd doesn't like empty ones and would KILL such users.
 | 
			
		||||
  - Fixed (optional) TCP Wrapper test which was broken and could result in
 | 
			
		||||
    false results. Thanks to Fuminori Tanizaki <tany@mcnet.ad.jp>!
 | 
			
		||||
  - Removed "USE_" prefixes of configuration #defines.
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.7.6 (2003-12-05)
 | 
			
		||||
 | 
			
		||||
  - Fixed abort() ("server crash") when INVITE'ing users to nonexistent
 | 
			
		||||
    channels. Bug found by <hiddenx@wp.pl>.
 | 
			
		||||
  - Extended version numbering of CVS versions (added date).
 | 
			
		||||
  - Enhanced/fixed doc/Protocol.txt;
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.7.5 (2003-11-07)
 | 
			
		||||
 | 
			
		||||
  - Fixed ban behavior: users which are banned from a channel can't no
 | 
			
		||||
    longer send PRIVMSG's to this channel (fixes Bug #47).
 | 
			
		||||
  - Fixed and enhanced the "penalty handling" of the server: commands that
 | 
			
		||||
    require more resources block the client for a short time.
 | 
			
		||||
  - Changed the internal time resolution to one second.
 | 
			
		||||
  - New configuration variable "MaxConnectionsIP" to limit the number of
 | 
			
		||||
    simultaneous connections from a single IP that the server will accept.
 | 
			
		||||
    This configuration options lowers the risk of denial of service attacks
 | 
			
		||||
    (DoS), the default is 5 connections per client IP.
 | 
			
		||||
  - Fixed build problems under Mac OS X 10.3.
 | 
			
		||||
  - Use "-pipe" when compiling with gcc, speeds things up a little :-)
 | 
			
		||||
  - Added new configuration variable "Listen" to bind all listening
 | 
			
		||||
    sockets of the server to a single IP address.
 | 
			
		||||
  - Suppress misleading error message of diff during make run.
 | 
			
		||||
  - Enhanced test-suite and made it work on GNU/Hurd.
 | 
			
		||||
  - Fixed minor typo in debug output :-)
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.7.1 (2003-07-18)
 | 
			
		||||
 | 
			
		||||
  - Included files to build Debian packages (located in "debian/").
 | 
			
		||||
  - Updated config.guess and config.sub to newer upstream versions.
 | 
			
		||||
  - NJOIN propagates user channel modes correctly again ... Upsa.
 | 
			
		||||
  - Made Makefile more compatible with "make -j<n>".
 | 
			
		||||
  - Added support for GNU/Hurd.
 | 
			
		||||
  - Fixed a compiler warning related to an unnecessary assert().
 | 
			
		||||
  - Enhanced VERSION command when using debug versions.
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.7.0 (2003-05-01)
 | 
			
		||||
 | 
			
		||||
  - "ServerName" is checked better now: a dot (".") is required.
 | 
			
		||||
  - The KILL command verifies and logs more parameters.
 | 
			
		||||
 | 
			
		||||
  ngIRCd 0.7.0-pre2 (2003-04-27)
 | 
			
		||||
  - CVS build system fixes (made autogen.sh more portable).
 | 
			
		||||
  - Fixed compilation and test-suite on Solaris (tested with 2.6).
 | 
			
		||||
  - New documentation file "doc/Platforms.txt" describing the status of
 | 
			
		||||
    ngIRCd on the various tested platforms.
 | 
			
		||||
  - Test for broken GCC on Mac OS X and disable "-pedantic" in this case.
 | 
			
		||||
  - Disable "-ansi" on Cygwin: system headers are incompatible.
 | 
			
		||||
  - The server tried to connect to other servers only once when DNS or
 | 
			
		||||
    socket failures occurred.
 | 
			
		||||
  - Fixed --configtest: There is no variable "ServerPwd", it's "Password".
 | 
			
		||||
 | 
			
		||||
  ngIRCd 0.7.0-pre1 (2003-04-22)
 | 
			
		||||
  - New signal handler (more secure, actions are executed outside).
 | 
			
		||||
  - GCC: the compiler is now called with more warning options enabled.
 | 
			
		||||
  - Replaced a lot of str[n]cpy(), str[n]cat() and sprintf() calls with the
 | 
			
		||||
@@ -433,4 +629,4 @@ ngIRCd 0.0.1, 31.12.2001
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- 
 | 
			
		||||
$Id: ChangeLog,v 1.188 2003/04/20 23:12:57 alex Exp $
 | 
			
		||||
$Id: ChangeLog,v 1.276.2.12 2005/10/15 12:44:08 alex Exp $
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										32
									
								
								INSTALL
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								INSTALL
									
									
									
									
									
								
							@@ -1,7 +1,7 @@
 | 
			
		||||
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
 | 
			
		||||
                      (c)2001-2003 by Alexander Barton,
 | 
			
		||||
                      (c)2001-2004 by Alexander Barton,
 | 
			
		||||
                    alex@barton.de, http://www.barton.de/
 | 
			
		||||
 | 
			
		||||
               ngIRCd is free software and published under the
 | 
			
		||||
@@ -14,6 +14,12 @@
 | 
			
		||||
I. Upgrade Information
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Differences to version 0.8.x
 | 
			
		||||
 | 
			
		||||
- The maximum length of passwords has been raised to 20 characters (instead
 | 
			
		||||
  of 8 characters). If your passwords are longer than 8 characters then they
 | 
			
		||||
  are cut at an other position now.
 | 
			
		||||
 | 
			
		||||
Differences to version 0.6.x
 | 
			
		||||
 | 
			
		||||
- Some options of the configure script have been renamed:
 | 
			
		||||
@@ -46,6 +52,20 @@ files (using a distribution archive or CVS) is as following:
 | 
			
		||||
  3) make
 | 
			
		||||
  4) make install
 | 
			
		||||
 | 
			
		||||
(Please see details below!)
 | 
			
		||||
 | 
			
		||||
Now the newly compiled executable "ngircd" is installed in its standard
 | 
			
		||||
location, /usr/local/sbin/.
 | 
			
		||||
 | 
			
		||||
The next step is to configure and afterwards starting the daemon. Please
 | 
			
		||||
have a look at the ngircd(8) and ngircd.conf(5) manual pages for details
 | 
			
		||||
and all possible options.
 | 
			
		||||
 | 
			
		||||
If no previous version of the configuration file exists (the standard name
 | 
			
		||||
is /usr/local/etc/ngircd.conf), a sample configuration file containing all
 | 
			
		||||
possible options will be installed there. You'll find its template in the
 | 
			
		||||
doc/ directory: sample-ngircd.conf.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1): "autogen.sh"
 | 
			
		||||
 | 
			
		||||
@@ -75,6 +95,11 @@ In addition, you can pass some command line options to "configure" to enable
 | 
			
		||||
and/or disable some features of ngIRCd. All these options are shown using
 | 
			
		||||
"./configure --help", too.
 | 
			
		||||
 | 
			
		||||
Compiling a static binary will avoid you the hassle of feeding a chroot dir
 | 
			
		||||
(if you want use the chroot feature). Just do something like:
 | 
			
		||||
  CFLAGS=-static ./configure [--your-options ...]
 | 
			
		||||
Then you can use a void directory as ChrootDir (like OpenSSH's /var/empty).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
3): "make"
 | 
			
		||||
 | 
			
		||||
@@ -93,6 +118,7 @@ This files will be installed by default:
 | 
			
		||||
 | 
			
		||||
- /usr/local/sbin/ngircd: executable server
 | 
			
		||||
- /usr/local/etc/ngircd.conf: sample configuration (if not already present)
 | 
			
		||||
- /usr/local/share/doc/ngircd/: documentation
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
II. Useful make-targets
 | 
			
		||||
@@ -147,7 +173,7 @@ These parameters could be passed to the ngIRCd:
 | 
			
		||||
-p, --passive
 | 
			
		||||
	Server-links won't be automatically established.
 | 
			
		||||
 | 
			
		||||
--configtest
 | 
			
		||||
-t, --configtest
 | 
			
		||||
	Reads, validates and dumps the configuration file as interpreted
 | 
			
		||||
	by the server. Then exits.
 | 
			
		||||
 | 
			
		||||
@@ -157,4 +183,4 @@ number. In both cases the server exits after the output.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- 
 | 
			
		||||
$Id: INSTALL,v 1.15 2003/03/23 23:13:15 alex Exp $
 | 
			
		||||
$Id: INSTALL,v 1.21 2005/02/10 08:20:09 alex Exp $
 | 
			
		||||
 
 | 
			
		||||
@@ -1,21 +0,0 @@
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
# Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
 | 
			
		||||
#
 | 
			
		||||
# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
 | 
			
		||||
# der GNU General Public License (GPL), wie von der Free Software Foundation
 | 
			
		||||
# herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
 | 
			
		||||
# der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
 | 
			
		||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
 | 
			
		||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile.am,v 1.4 2002/03/12 14:37:51 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
SUBDIRS = ngircd.pbproj
 | 
			
		||||
 | 
			
		||||
maintainer-clean-local:
 | 
			
		||||
	rm -f Makefile Makefile.in
 | 
			
		||||
	rm -rf build
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
@@ -1,20 +0,0 @@
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
# Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
 | 
			
		||||
#
 | 
			
		||||
# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
 | 
			
		||||
# der GNU General Public License (GPL), wie von der Free Software Foundation
 | 
			
		||||
# herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
 | 
			
		||||
# der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
 | 
			
		||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
 | 
			
		||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile.am,v 1.3 2002/03/12 14:37:51 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST = project.pbxproj
 | 
			
		||||
 | 
			
		||||
maintainer-clean-local:
 | 
			
		||||
	rm -f Makefile Makefile.in
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										35
									
								
								Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								Makefile.am
									
									
									
									
									
								
							@@ -1,31 +1,46 @@
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
# Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
 | 
			
		||||
# Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
 | 
			
		||||
#
 | 
			
		||||
# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
 | 
			
		||||
# der GNU General Public License (GPL), wie von der Free Software Foundation
 | 
			
		||||
# herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
 | 
			
		||||
# der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
 | 
			
		||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
 | 
			
		||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
 | 
			
		||||
# This program is free software; you can redistribute it and/or modify
 | 
			
		||||
# it under the terms of the GNU General Public License as published by
 | 
			
		||||
# the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
# (at your option) any later version.
 | 
			
		||||
# Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile.am,v 1.10 2002/10/01 09:57:08 alex Exp $
 | 
			
		||||
# $Id: Makefile.am,v 1.16 2005/04/09 12:27:40 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
AUTOMAKE_OPTIONS = gnu
 | 
			
		||||
 | 
			
		||||
SUBDIRS = doc MacOSX src man contrib
 | 
			
		||||
SUBDIRS = doc src man contrib
 | 
			
		||||
 | 
			
		||||
clean-local:
 | 
			
		||||
	rm -f build-stamp*
 | 
			
		||||
 | 
			
		||||
maintainer-clean-local:
 | 
			
		||||
	rm -rf autom4te.cache
 | 
			
		||||
	rm -f Makefile.in Makefile aclocal.m4 configure
 | 
			
		||||
	rm -f mkinstalldirs missing depcomp install-sh
 | 
			
		||||
	rm -f config.log
 | 
			
		||||
	rm -f config.log debian
 | 
			
		||||
 | 
			
		||||
lint:
 | 
			
		||||
	make -C src/ngircd lint
 | 
			
		||||
 | 
			
		||||
srcdoc:
 | 
			
		||||
	make -C src srcdoc
 | 
			
		||||
 | 
			
		||||
xcode:
 | 
			
		||||
	@xcodebuild -project contrib/MacOSX/ngIRCd.xcode -list >/dev/null 2>&1 \
 | 
			
		||||
	 || ( echo; echo "Error: \"xcodebuild\" not found!"; echo; exit 1 )
 | 
			
		||||
	xcodebuild -project contrib/MacOSX/ngIRCd.xcode -alltargets \
 | 
			
		||||
	 -buildstyle Development
 | 
			
		||||
 | 
			
		||||
rpm: distcheck
 | 
			
		||||
	rpm -ta ngircd-*.tar.gz
 | 
			
		||||
 | 
			
		||||
deb:
 | 
			
		||||
	[ -f debian/rules ] || ln -s contrib/Debian debian
 | 
			
		||||
	dpkg-buildpackage -rfakeroot
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										55
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								NEWS
									
									
									
									
									
								
							@@ -1,7 +1,7 @@
 | 
			
		||||
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
 | 
			
		||||
                      (c)2001-2003 by Alexander Barton,
 | 
			
		||||
                        (c)2001-2005 Alexander Barton,
 | 
			
		||||
                    alex@barton.de, http://www.barton.de/
 | 
			
		||||
 | 
			
		||||
               ngIRCd is free software and published under the
 | 
			
		||||
@@ -10,7 +10,54 @@
 | 
			
		||||
                                  -- NEWS --
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ngIRCd CVS-HEAD
 | 
			
		||||
ngIRCd 0.9.0 (2005-07-24)
 | 
			
		||||
 | 
			
		||||
  - Never run with root privileges but always switch the user ID.
 | 
			
		||||
  - Make "netsplit" messages RFC compliant.
 | 
			
		||||
  - Implemented the IRC function "WHOWAS".
 | 
			
		||||
  - New configuration option "OperServerMode" to enable a workaround needed
 | 
			
		||||
    when running an network with ircd2 servers and "OperCanUseMode" enabled
 | 
			
		||||
    to prevent the ircd2 daemon to drop mode changes of IRC operators.
 | 
			
		||||
    Patch by Florian Westphal, <westphal@foo.fh-furtwangen.de>.
 | 
			
		||||
  - Implemented support for "secret channels" (channel mode "s").
 | 
			
		||||
  - New configuration option "Mask" for [Operator] sections to limit OPER
 | 
			
		||||
    commands to users with a specific IRC mask. Patch from Florian Westphal.
 | 
			
		||||
  - New configuration variable "PidFile", section "[Global]": if defined,
 | 
			
		||||
    the server writes its process ID (PID) to this file. Default: off.
 | 
			
		||||
    Idea of Florian Westphal, <westphal@foo.fh-furtwangen.de>.
 | 
			
		||||
  - Added support for the Howl (http://www.porchdogsoft.com/products/howl/)
 | 
			
		||||
    Rendezvous API, in addition to the API of Apple (Mac OS X). The available
 | 
			
		||||
    API will be autodetected when you call "./configure --with-rendezvous".
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.8.0 (2004-06-26)
 | 
			
		||||
 | 
			
		||||
  - Two new configuration options: "ChrootDir" and "MotdPhrase", thanks to
 | 
			
		||||
    Benjamin Pineau <ben@zouh.org>. Now you can force the daemon to change
 | 
			
		||||
    its root and working directory to something "safe". MotdPhrase is used
 | 
			
		||||
    to define an "MOTD string" instead of a whole file, useful if the
 | 
			
		||||
    "real" MOTD file would be outside the "jail".
 | 
			
		||||
  - INVITE- and BAN-lists become synchronized between IRC+ servers when
 | 
			
		||||
    establishing new connections, if the peer supports this as well.
 | 
			
		||||
  - The type of service (TOS) of all sockets is set to "interactive" now.
 | 
			
		||||
  - Added short command line option "-t" as alternative to "--configtest".
 | 
			
		||||
  - Added optional support for "IDENT" lookups on incoming connections. You
 | 
			
		||||
    have to enable this function with the ./configure switch "--with-ident".
 | 
			
		||||
    The default is not to do IDENT lookups.
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.7.5 (2003-07-11)
 | 
			
		||||
 | 
			
		||||
  - New configuration variable "MaxConnectionsIP" to limit the number of
 | 
			
		||||
    simultaneous connections from a single IP that the server will accept.
 | 
			
		||||
    This configuration options lowers the risk of denial of service attacks
 | 
			
		||||
    (DoS), the default is 5 connections per client IP.
 | 
			
		||||
  - Added new configuration variable "Listen" to bind all listening
 | 
			
		||||
    sockets of the server to a single IP address.
 | 
			
		||||
       
 | 
			
		||||
ngIRCd 0.7.1 (2003-07-18)
 | 
			
		||||
 | 
			
		||||
  - Added support for GNU/Hurd.
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.7.0 (2003-05-01)
 | 
			
		||||
 | 
			
		||||
  - New command CONNECT to enable and add server links. The syntax is not
 | 
			
		||||
    RFC-compatible: use "CONNECT <name> <port>" to enable and connect an
 | 
			
		||||
@@ -24,7 +71,7 @@ ngIRCd CVS-HEAD
 | 
			
		||||
  - Added support for TCP Wrappers library: pass "--with-tcp-wrappers" to
 | 
			
		||||
    configure to enable it.
 | 
			
		||||
  - Changed some configure options to use "--with"/"--without" as prefix
 | 
			
		||||
    insetead of "--enable"/"--disable": "--without-syslog", "--without-zlib",
 | 
			
		||||
    instead of "--enable"/"--disable": "--without-syslog", "--without-zlib",
 | 
			
		||||
    "--with-tcp-wrappers", and "--with-rendezvous".
 | 
			
		||||
  - Enhanced manual pages ngircd(8) and ngircd.conf(5).
 | 
			
		||||
  - Documentation is now installed in $(datadir)/doc/ngircd.
 | 
			
		||||
@@ -161,4 +208,4 @@ ngIRCd 0.0.1, 31.12.2001
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- 
 | 
			
		||||
$Id: NEWS,v 1.53 2003/04/20 23:14:28 alex Exp $
 | 
			
		||||
$Id: NEWS,v 1.74.2.1 2005/07/24 21:39:45 alex Exp $
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										41
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								README
									
									
									
									
									
								
							@@ -1,21 +1,19 @@
 | 
			
		||||
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
 | 
			
		||||
                      (c)2001-2003 by Alexander Barton,
 | 
			
		||||
                        (c)2001-2005 Alexander Barton,
 | 
			
		||||
                    alex@barton.de, http://www.barton.de/
 | 
			
		||||
 | 
			
		||||
               ngIRCd is free software and published under the
 | 
			
		||||
                   terms of the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
                                -- README --
 | 
			
		||||
                           
 | 
			
		||||
                      Ilja Osthoff, <ilja@glide.ath.cx>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
I. Introduction
 | 
			
		||||
~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
ngIRCd is an Open-Source server for the Internet Relay Chat (IRC), which
 | 
			
		||||
ngIRCd is an Open Source server for the Internet Relay Chat (IRC), which
 | 
			
		||||
is developed and published under the terms of the GNU General Public
 | 
			
		||||
Licence (URL: http://www.gnu.org/licenses/gpl.html). ngIRCd means "next
 | 
			
		||||
generation IRC daemon", it's written from scratch and not deduced from the
 | 
			
		||||
@@ -25,15 +23,19 @@ generation IRC daemon", it's written from scratch and not deduced from the
 | 
			
		||||
II. Status
 | 
			
		||||
~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
At present, the ngIRCd is under active development, some features are not
 | 
			
		||||
implemented, some only partly.
 | 
			
		||||
It is not the goal of ngIRCd to implement all the nasty behaviours of the
 | 
			
		||||
original ircd, but to implement most of the useful commands and semantics
 | 
			
		||||
specified by the RFCs.
 | 
			
		||||
 | 
			
		||||
Till today (more or less complete) implemented IRC-commands:
 | 
			
		||||
In the meantime ngIRCd should be quite feature complete and stable to be
 | 
			
		||||
used in real IRC networks.
 | 
			
		||||
 | 
			
		||||
Implemented IRC-commands are:
 | 
			
		||||
 | 
			
		||||
ADMIN, AWAY, CHANINFO, CONNECT, DIE, DISCONNECT, ERROR, HELP, INVITE, ISON,
 | 
			
		||||
JOIN, KICK, KILL, LINKS, LIST, LUSERS, MODE, MOTD, NAMES, NICK, NJOIN,
 | 
			
		||||
NOTICE, OPER, PART, PASS, PING, PONG, PRIVMSG, QUIT, REHASH, RESTART, SERVER,
 | 
			
		||||
SQUIT, STATS, TIME, TOPIC, TRACE, USER, USERHOST, VERSION, WHO, WHOIS.
 | 
			
		||||
JOIN, KICK, KILL, LINKS, LIST, LUSERS, MODE, MOTD, NAMES, NICK, NJOIN, NOTICE,
 | 
			
		||||
OPER, PART, PASS, PING, PONG, PRIVMSG, QUIT, REHASH, RESTART, SERVER, SQUIT,
 | 
			
		||||
STATS, TIME, TOPIC, TRACE, USER, USERHOST, VERSION, WHO, WHOIS, WHOWAS.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
III. Features (or: why use ngIRCd?)
 | 
			
		||||
@@ -43,24 +45,23 @@ III. Features (or: why use ngIRCd?)
 | 
			
		||||
- simple, easy understandable configuration file,
 | 
			
		||||
- freely published open-source C source code,
 | 
			
		||||
- ngIRCd will be developed on in the future.
 | 
			
		||||
- supported platforms (tested versions): AIX (3.2.5), A/UX (3.0.1), FreeBSD
 | 
			
		||||
  (4.5), HP-UX (10.20), IRIX (6.5), Linux (2.x), Mac OS X (10.x), NetBSD
 | 
			
		||||
  (1.5.2/i386, 1.5.3/m68k), Solaris (2.5.1, 2.6), and Windows with Cygwin.
 | 
			
		||||
- wide field of supported platforms, including AIX, A/UX, FreeBSD, HP-UX,
 | 
			
		||||
  IRIX, Linux, Mac OS X, NetBSD, OpenBSD, Solaris, and Windows with Cygwin.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
IV. Documentation
 | 
			
		||||
~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
More documentation can be found in the "doc/" directory and the homepage of
 | 
			
		||||
the ngIRCd: <http://arthur.ath.cx/~alex/ngircd/>.
 | 
			
		||||
the ngIRCd: <http://ngircd.barton.de/>.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
V. Download
 | 
			
		||||
~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
The homepage of the ngIRCd is: <http://arthur.ath.cx/~alex/ngircd>; you
 | 
			
		||||
will find the newest information about the ngIRCd and the most recent
 | 
			
		||||
("stable") releases there.
 | 
			
		||||
The homepage of the ngIRCd is: <http://ngircd.barton.de/>; you will find
 | 
			
		||||
the newest information about the ngIRCd and the most recent ("stable")
 | 
			
		||||
releases there.
 | 
			
		||||
 | 
			
		||||
If you are interested in the latest development versions (which are not
 | 
			
		||||
always stable), then please read the section "CVS" on the homepage and
 | 
			
		||||
@@ -74,13 +75,13 @@ VI. Bugs
 | 
			
		||||
If you find bugs in the ngIRCd (which might be there :-), please report
 | 
			
		||||
them at the following URL:
 | 
			
		||||
 | 
			
		||||
<http://arthur.ath.cx/~alex/ngircd/#bugs>
 | 
			
		||||
<http://ngircd.barton.de/#bugs>
 | 
			
		||||
 | 
			
		||||
There you can read about known bugs and limitations, too.
 | 
			
		||||
 | 
			
		||||
If you have critics, patches or something else, please feel free to post a
 | 
			
		||||
mail to: <alex@barton.de> or <alex@arthur.ath.cx>
 | 
			
		||||
mail to <alex@barton.de>.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- 
 | 
			
		||||
$Id: README,v 1.17 2003/03/09 22:03:58 alex Exp $
 | 
			
		||||
$Id: README,v 1.20.2.1 2005/07/09 14:41:39 alex Exp $
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										187
									
								
								autogen.sh
									
									
									
									
									
								
							
							
						
						
									
										187
									
								
								autogen.sh
									
									
									
									
									
								
							@@ -1,14 +1,187 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#
 | 
			
		||||
# $Id: autogen.sh,v 1.6 2003/04/13 22:34:17 alex Exp $
 | 
			
		||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
# Copyright (c)2001-2004 Alexander Barton <alex@barton.de>
 | 
			
		||||
#
 | 
			
		||||
# This program is free software; you can redistribute it and/or modify
 | 
			
		||||
# it under the terms of the GNU General Public License as published by
 | 
			
		||||
# the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
# (at your option) any later version.
 | 
			
		||||
# Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
#
 | 
			
		||||
# $Id: autogen.sh,v 1.14 2005/02/21 15:23:23 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
export WANT_AUTOMAKE=1.6
 | 
			
		||||
#
 | 
			
		||||
# Usage: [VAR=<value>] ./autogen.sh [<configure-args>]
 | 
			
		||||
#
 | 
			
		||||
# This script generates the ./configure script using GNU automake and
 | 
			
		||||
# GNU autoconf. It tries to be smart in finding the correct/usable/available
 | 
			
		||||
# installed versions of these tools on your system.
 | 
			
		||||
#
 | 
			
		||||
# The following strategy is used for each of aclocal, autoheader, automake,
 | 
			
		||||
# and autoconf: first, "tool" (the regular name of the tool, e. g. "autoconf"
 | 
			
		||||
# or "automake") is checked. If this fails, "tool<major><minor>" (for example
 | 
			
		||||
# "automake16") and "tool-<major>.<minor>" (e. g. "autoconf-2.54") are tried
 | 
			
		||||
# with <major> being 2 for tool of GNU autoconf and 1 for tools of automake;
 | 
			
		||||
# <minor> is tried from 99 to 0. The first occurrence will be used.
 | 
			
		||||
#
 | 
			
		||||
# When you pass <configure-args> to autogen.sh it will call the generated
 | 
			
		||||
# ./configure script on success and pass these parameters to it.
 | 
			
		||||
#
 | 
			
		||||
# You can tweak the behaviour using these environment variables:
 | 
			
		||||
#
 | 
			
		||||
# - ACLOCAL=<cmd>, AUTOHEADER=<cmd>, AUTOMAKE=<cmd>, AUTOCONF=<cmd>
 | 
			
		||||
#   Name and optionally path to the particular tool.
 | 
			
		||||
# - PREFIX=<path>
 | 
			
		||||
#   Search the GNU autoconf and GNU automake tools in <path> first. If the
 | 
			
		||||
#   generated ./configure script will be called, pass "--prefix=<path>" to it.
 | 
			
		||||
# - EXIST=<tool>
 | 
			
		||||
#   Use <tool> to test for aclocal, autoheader etc. pp. ...
 | 
			
		||||
#   When not specified, either "type" or "which" is used.
 | 
			
		||||
# - VERBOSE=1
 | 
			
		||||
#   Output the detected names of the GNU automake and GNU autoconf tools.
 | 
			
		||||
# - GO=1
 | 
			
		||||
#   Call ./configure even if no arguments have been passed to autogen.sh.
 | 
			
		||||
#
 | 
			
		||||
# Examples:
 | 
			
		||||
#
 | 
			
		||||
# - ./autogen.sh
 | 
			
		||||
#   Generates the ./configure script.
 | 
			
		||||
# - GO=1 ./autogen.sh
 | 
			
		||||
#   Generates the ./configure script and runs it as "./configure".
 | 
			
		||||
# - VERBOSE=1 ./autogen.sh --with-ident
 | 
			
		||||
#   Show tool names, generates the ./configure script, and runs it with
 | 
			
		||||
#   these arguments: "./configure --with-ident".
 | 
			
		||||
# - ACLOCAL=aclocal-1.6 GO=1 PREFIX=$HOME ./autogen.sh
 | 
			
		||||
#   Uses "aclocal-1.6" as aclocal tool, generates the ./configure script,
 | 
			
		||||
#   and runs it with these arguments: "./configure --prefix=$HOME".
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
aclocal && \
 | 
			
		||||
 autoheader && \
 | 
			
		||||
 automake --add-missing && \
 | 
			
		||||
 autoconf && \
 | 
			
		||||
 echo "Okay, autogen.sh done."
 | 
			
		||||
Search()
 | 
			
		||||
{
 | 
			
		||||
	[ $# -eq 2 ] || exit 1
 | 
			
		||||
 | 
			
		||||
	searchlist="$1"
 | 
			
		||||
	major="$2"
 | 
			
		||||
	minor=99
 | 
			
		||||
 | 
			
		||||
	[ -n "$PREFIX" ] && searchlist="${PREFIX}/$1 ${PREFIX}/bin/$1 $searchlist"
 | 
			
		||||
 | 
			
		||||
	for name in $searchlist; do
 | 
			
		||||
		$EXIST "${name}" >/dev/null 2>&1
 | 
			
		||||
		if [ $? -eq 0 ]; then
 | 
			
		||||
			echo "${name}"
 | 
			
		||||
			return 0
 | 
			
		||||
		fi
 | 
			
		||||
	done
 | 
			
		||||
 | 
			
		||||
	while [ $minor -ge 0 ]; do
 | 
			
		||||
		for name in $searchlist; do
 | 
			
		||||
			$EXIST "${name}${major}${minor}" >/dev/null 2>&1
 | 
			
		||||
			if [ $? -eq 0 ]; then
 | 
			
		||||
				echo "${name}${major}${minor}"
 | 
			
		||||
				return 0
 | 
			
		||||
			fi
 | 
			
		||||
			$EXIST "${name}-${major}.${minor}" >/dev/null 2>&1
 | 
			
		||||
			if [ $? -eq 0 ]; then
 | 
			
		||||
				echo "${name}-${major}.${minor}"
 | 
			
		||||
				return 0
 | 
			
		||||
			fi
 | 
			
		||||
		done
 | 
			
		||||
		minor=`expr $minor - 1`
 | 
			
		||||
	done
 | 
			
		||||
	return 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Notfound()
 | 
			
		||||
{
 | 
			
		||||
	echo "Error: $* not found!"
 | 
			
		||||
	echo "Please install recent versions of GNU autoconf and GNU automake."
 | 
			
		||||
	exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Reset locale settings to suppress warning messages of Perl
 | 
			
		||||
unset LC_ALL
 | 
			
		||||
unset LANG
 | 
			
		||||
 | 
			
		||||
# Which command should be used to detect the automake/autoconf tools?
 | 
			
		||||
[ -z "$EXIST" ] && existlist="type which" || existlist="$EXIST"
 | 
			
		||||
EXIST=""
 | 
			
		||||
for t in $existlist; do
 | 
			
		||||
	$t /bin/ls >/dev/null 2>&1
 | 
			
		||||
	if [ $? -eq 0 ]; then
 | 
			
		||||
		rm -f /tmp/test.$$
 | 
			
		||||
		$t /tmp/test.$$ >/dev/null 2>&1
 | 
			
		||||
		[ $? -ne 0 ] && EXIST="$t"
 | 
			
		||||
	fi
 | 
			
		||||
	[ -n "$EXIST" ] && break
 | 
			
		||||
done
 | 
			
		||||
if [ -z "$EXIST" ]; then
 | 
			
		||||
	echo "Didn't detect a working command to test for the autoconf/automake tools!"
 | 
			
		||||
	echo "Searchlist: $existlist"
 | 
			
		||||
	exit 1
 | 
			
		||||
fi
 | 
			
		||||
[ "$VERBOSE" = "1" ] && echo "Using \"$EXIST\" to test for tools."
 | 
			
		||||
 | 
			
		||||
# We want to use GNU automake 1.7, if available (WANT_AUTOMAKE is used by
 | 
			
		||||
# the wrapper scripts of Gentoo Linux, AUTOMAKE_VERSION is used by OpenBSD);
 | 
			
		||||
# same applies for GNU autoconf, we want to use version 2.59.
 | 
			
		||||
AUTOMAKE_VERSION=1.7
 | 
			
		||||
AUTOCONF_VERSION=2.59
 | 
			
		||||
export AUTOMAKE_VERSION AUTOCONF_VERSION
 | 
			
		||||
WANT_AUTOMAKE=1.7
 | 
			
		||||
export WANT_AUTOMAKE
 | 
			
		||||
 | 
			
		||||
# Try to detect the needed tools when no environment variable already
 | 
			
		||||
# spezifies one:
 | 
			
		||||
echo "Searching tools ..."
 | 
			
		||||
[ -z "$ACLOCAL" ] && ACLOCAL=`Search aclocal 1`
 | 
			
		||||
[ "$VERBOSE" = "1" ] && echo "ACLOCAL=$ACLOCAL"
 | 
			
		||||
[ -z "$AUTOHEADER" ] && AUTOHEADER=`Search autoheader 2`
 | 
			
		||||
[ "$VERBOSE" = "1" ] && echo "AUTOHEADER=$AUTOHEADER"
 | 
			
		||||
[ -z "$AUTOMAKE" ] && AUTOMAKE=`Search automake 1`
 | 
			
		||||
[ "$VERBOSE" = "1" ] && echo "AUTOMAKE=$AUTOMAKE"
 | 
			
		||||
[ -z "$AUTOCONF" ] && AUTOCONF=`Search autoconf 2`
 | 
			
		||||
[ "$VERBOSE" = "1" ] && echo "AUTOCONF=$AUTOCONF"
 | 
			
		||||
 | 
			
		||||
# Call ./configure when parameters have been passed to this script and
 | 
			
		||||
# GO isn't already defined.
 | 
			
		||||
[ -z "$GO" -a $# -gt 0 ] && GO=1
 | 
			
		||||
 | 
			
		||||
# Verify that all tools have been found
 | 
			
		||||
[ -z "$AUTOCONF" ] && Notfound autoconf
 | 
			
		||||
[ -z "$AUTOHEADER" ] && Notfound autoheader
 | 
			
		||||
[ -z "$AUTOMAKE" ] && Notfound automake
 | 
			
		||||
[ -z "$AUTOCONF" ] && Notfound autoconf
 | 
			
		||||
 | 
			
		||||
export AUTOCONF AUTOHEADER AUTOMAKE AUTOCONF
 | 
			
		||||
 | 
			
		||||
# Generate files
 | 
			
		||||
echo "Generating files ..."
 | 
			
		||||
$ACLOCAL && \
 | 
			
		||||
	$AUTOHEADER && \
 | 
			
		||||
	$AUTOMAKE --add-missing && \
 | 
			
		||||
	$AUTOCONF
 | 
			
		||||
 | 
			
		||||
if [ $? -eq 0 -a -x ./configure ]; then
 | 
			
		||||
	# Success: if we got some parameters we call ./configure and pass
 | 
			
		||||
	# all of them to it.
 | 
			
		||||
	if [ "$GO" = "1" ]; then
 | 
			
		||||
		[ -n "$PREFIX" ] && p=" --prefix=$PREFIX" || p=""
 | 
			
		||||
		[ -n "$*" ] && a=" $*" || a=""
 | 
			
		||||
		c="./configure${p}${a}"
 | 
			
		||||
		echo "Calling \"$c\" ..."
 | 
			
		||||
		$c
 | 
			
		||||
		exit $?
 | 
			
		||||
	else
 | 
			
		||||
		echo "Okay, autogen.sh done; now run the \"configure\" script."
 | 
			
		||||
		exit 0
 | 
			
		||||
	fi
 | 
			
		||||
else
 | 
			
		||||
	# Failure!?
 | 
			
		||||
	echo "Error! Check your installation of GNU automake and autoconf!"
 | 
			
		||||
	exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										416
									
								
								config.guess
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										416
									
								
								config.guess
									
									
									
									
										vendored
									
									
								
							@@ -1,9 +1,9 @@
 | 
			
		||||
#! /bin/sh
 | 
			
		||||
# Attempt to guess a canonical system name.
 | 
			
		||||
#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
 | 
			
		||||
#   2000, 2001, 2002 Free Software Foundation, Inc.
 | 
			
		||||
#   2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 | 
			
		||||
 | 
			
		||||
timestamp='2002-03-04'
 | 
			
		||||
timestamp='2005-04-22'
 | 
			
		||||
 | 
			
		||||
# 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
 | 
			
		||||
@@ -53,7 +53,7 @@ version="\
 | 
			
		||||
GNU config.guess ($timestamp)
 | 
			
		||||
 | 
			
		||||
Originally written by Per Bothner.
 | 
			
		||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
 | 
			
		||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
 | 
			
		||||
Free Software Foundation, Inc.
 | 
			
		||||
 | 
			
		||||
This is free software; see the source for copying conditions.  There is NO
 | 
			
		||||
@@ -88,30 +88,42 @@ if test $# != 0; then
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
trap 'exit 1' 1 2 15
 | 
			
		||||
 | 
			
		||||
dummy=dummy-$$
 | 
			
		||||
trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15
 | 
			
		||||
# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
 | 
			
		||||
# compiler to aid in system detection is discouraged as it requires
 | 
			
		||||
# temporary files to be created and, as you can see below, it is a
 | 
			
		||||
# headache to deal with in a portable fashion.
 | 
			
		||||
 | 
			
		||||
# CC_FOR_BUILD -- compiler used by this script.
 | 
			
		||||
# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
 | 
			
		||||
# use `HOST_CC' if defined, but it is deprecated.
 | 
			
		||||
 | 
			
		||||
set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in
 | 
			
		||||
 ,,)    echo "int dummy(){}" > $dummy.c ;
 | 
			
		||||
	for c in cc gcc c89 ; do
 | 
			
		||||
	  ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ;
 | 
			
		||||
	  if test $? = 0 ; then
 | 
			
		||||
# Portable tmp directory creation inspired by the Autoconf team.
 | 
			
		||||
 | 
			
		||||
set_cc_for_build='
 | 
			
		||||
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 ;
 | 
			
		||||
: ${TMPDIR=/tmp} ;
 | 
			
		||||
 { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$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 ; } ||
 | 
			
		||||
 { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
 | 
			
		||||
dummy=$tmp/dummy ;
 | 
			
		||||
tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
 | 
			
		||||
case $CC_FOR_BUILD,$HOST_CC,$CC in
 | 
			
		||||
 ,,)    echo "int x;" > $dummy.c ;
 | 
			
		||||
	for c in cc gcc c89 c99 ; do
 | 
			
		||||
	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
 | 
			
		||||
	     CC_FOR_BUILD="$c"; break ;
 | 
			
		||||
	  fi ;
 | 
			
		||||
	done ;
 | 
			
		||||
	rm -f $dummy.c $dummy.o $dummy.rel ;
 | 
			
		||||
	if test x"$CC_FOR_BUILD" = x ; then
 | 
			
		||||
	  CC_FOR_BUILD=no_compiler_found ;
 | 
			
		||||
	fi
 | 
			
		||||
	;;
 | 
			
		||||
 ,,*)   CC_FOR_BUILD=$CC ;;
 | 
			
		||||
 ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
 | 
			
		||||
esac'
 | 
			
		||||
esac ;'
 | 
			
		||||
 | 
			
		||||
# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
 | 
			
		||||
# (ghazi@noc.rutgers.edu 1994-08-24)
 | 
			
		||||
@@ -142,6 +154,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 | 
			
		||||
	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
 | 
			
		||||
	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
 | 
			
		||||
	case "${UNAME_MACHINE_ARCH}" in
 | 
			
		||||
	    armeb) machine=armeb-unknown ;;
 | 
			
		||||
	    arm*) machine=arm-unknown ;;
 | 
			
		||||
	    sh3el) machine=shl-unknown ;;
 | 
			
		||||
	    sh3eb) machine=sh-unknown ;;
 | 
			
		||||
@@ -167,21 +180,38 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 | 
			
		||||
		;;
 | 
			
		||||
	esac
 | 
			
		||||
	# The OS release
 | 
			
		||||
	release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
 | 
			
		||||
	# Debian GNU/NetBSD machines have a different userland, and
 | 
			
		||||
	# thus, need a distinct triplet. However, they do not need
 | 
			
		||||
	# kernel version information, so it can be replaced with a
 | 
			
		||||
	# suitable tag, in the style of linux-gnu.
 | 
			
		||||
	case "${UNAME_VERSION}" in
 | 
			
		||||
	    Debian*)
 | 
			
		||||
		release='-gnu'
 | 
			
		||||
		;;
 | 
			
		||||
	    *)
 | 
			
		||||
		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
 | 
			
		||||
		;;
 | 
			
		||||
	esac
 | 
			
		||||
	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
 | 
			
		||||
	# contains redundant information, the shorter form:
 | 
			
		||||
	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
 | 
			
		||||
	echo "${machine}-${os}${release}"
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    amd64:OpenBSD:*:*)
 | 
			
		||||
	echo x86_64-unknown-openbsd${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    amiga:OpenBSD:*:*)
 | 
			
		||||
	echo m68k-unknown-openbsd${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    arc:OpenBSD:*:*)
 | 
			
		||||
	echo mipsel-unknown-openbsd${UNAME_RELEASE}
 | 
			
		||||
    cats:OpenBSD:*:*)
 | 
			
		||||
	echo arm-unknown-openbsd${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    hp300:OpenBSD:*:*)
 | 
			
		||||
	echo m68k-unknown-openbsd${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    luna88k:OpenBSD:*:*)
 | 
			
		||||
    	echo m88k-unknown-openbsd${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    mac68k:OpenBSD:*:*)
 | 
			
		||||
	echo m68k-unknown-openbsd${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
@@ -197,83 +227,76 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 | 
			
		||||
    mvmeppc:OpenBSD:*:*)
 | 
			
		||||
	echo powerpc-unknown-openbsd${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    pmax:OpenBSD:*:*)
 | 
			
		||||
	echo mipsel-unknown-openbsd${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    sgi:OpenBSD:*:*)
 | 
			
		||||
	echo mipseb-unknown-openbsd${UNAME_RELEASE}
 | 
			
		||||
	echo mips64-unknown-openbsd${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    sun3:OpenBSD:*:*)
 | 
			
		||||
	echo m68k-unknown-openbsd${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    wgrisc:OpenBSD:*:*)
 | 
			
		||||
	echo mipsel-unknown-openbsd${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    *:OpenBSD:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    *:ekkoBSD:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    macppc:MirBSD:*:*)
 | 
			
		||||
	echo powerppc-unknown-mirbsd${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    *:MirBSD:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    alpha:OSF1:*:*)
 | 
			
		||||
	if test $UNAME_RELEASE = "V4.0"; then
 | 
			
		||||
	case $UNAME_RELEASE in
 | 
			
		||||
	*4.0)
 | 
			
		||||
		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
 | 
			
		||||
	fi
 | 
			
		||||
		;;
 | 
			
		||||
	*5.*)
 | 
			
		||||
	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
 | 
			
		||||
		;;
 | 
			
		||||
	esac
 | 
			
		||||
	# According to Compaq, /usr/sbin/psrinfo has been available on
 | 
			
		||||
	# OSF/1 and Tru64 systems produced since 1995.  I hope that
 | 
			
		||||
	# covers most systems running today.  This code pipes the CPU
 | 
			
		||||
	# types through head -n 1, so we only detect the type of CPU 0.
 | 
			
		||||
	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
 | 
			
		||||
	case "$ALPHA_CPU_TYPE" in
 | 
			
		||||
	    "EV4 (21064)")
 | 
			
		||||
		UNAME_MACHINE="alpha" ;;
 | 
			
		||||
	    "EV4.5 (21064)")
 | 
			
		||||
		UNAME_MACHINE="alpha" ;;
 | 
			
		||||
	    "LCA4 (21066/21068)")
 | 
			
		||||
		UNAME_MACHINE="alpha" ;;
 | 
			
		||||
	    "EV5 (21164)")
 | 
			
		||||
		UNAME_MACHINE="alphaev5" ;;
 | 
			
		||||
	    "EV5.6 (21164A)")
 | 
			
		||||
		UNAME_MACHINE="alphaev56" ;;
 | 
			
		||||
	    "EV5.6 (21164PC)")
 | 
			
		||||
		UNAME_MACHINE="alphapca56" ;;
 | 
			
		||||
	    "EV5.7 (21164PC)")
 | 
			
		||||
		UNAME_MACHINE="alphapca57" ;;
 | 
			
		||||
	    "EV6 (21264)")
 | 
			
		||||
		UNAME_MACHINE="alphaev6" ;;
 | 
			
		||||
	    "EV6.7 (21264A)")
 | 
			
		||||
		UNAME_MACHINE="alphaev67" ;;
 | 
			
		||||
	    "EV6.8CB (21264C)")
 | 
			
		||||
		UNAME_MACHINE="alphaev68" ;;
 | 
			
		||||
	    "EV6.8AL (21264B)")
 | 
			
		||||
		UNAME_MACHINE="alphaev68" ;;
 | 
			
		||||
	    "EV6.8CX (21264D)")
 | 
			
		||||
		UNAME_MACHINE="alphaev68" ;;
 | 
			
		||||
	    "EV6.9A (21264/EV69A)")
 | 
			
		||||
		UNAME_MACHINE="alphaev69" ;;
 | 
			
		||||
	    "EV7 (21364)")
 | 
			
		||||
		UNAME_MACHINE="alphaev7" ;;
 | 
			
		||||
	    "EV7.9 (21364A)")
 | 
			
		||||
		UNAME_MACHINE="alphaev79" ;;
 | 
			
		||||
	esac
 | 
			
		||||
	# A Pn.n version is a patched version.
 | 
			
		||||
	# A Vn.n version is a released version.
 | 
			
		||||
	# A Tn.n version is a released field test version.
 | 
			
		||||
	# A Xn.n version is an unreleased experimental baselevel.
 | 
			
		||||
	# 1.2 uses "1.2" for uname -r.
 | 
			
		||||
	cat <<EOF >$dummy.s
 | 
			
		||||
	.data
 | 
			
		||||
\$Lformat:
 | 
			
		||||
	.byte 37,100,45,37,120,10,0	# "%d-%x\n"
 | 
			
		||||
 | 
			
		||||
	.text
 | 
			
		||||
	.globl main
 | 
			
		||||
	.align 4
 | 
			
		||||
	.ent main
 | 
			
		||||
main:
 | 
			
		||||
	.frame \$30,16,\$26,0
 | 
			
		||||
	ldgp \$29,0(\$27)
 | 
			
		||||
	.prologue 1
 | 
			
		||||
	.long 0x47e03d80 # implver \$0
 | 
			
		||||
	lda \$2,-1
 | 
			
		||||
	.long 0x47e20c21 # amask \$2,\$1
 | 
			
		||||
	lda \$16,\$Lformat
 | 
			
		||||
	mov \$0,\$17
 | 
			
		||||
	not \$1,\$18
 | 
			
		||||
	jsr \$26,printf
 | 
			
		||||
	ldgp \$29,0(\$26)
 | 
			
		||||
	mov 0,\$16
 | 
			
		||||
	jsr \$26,exit
 | 
			
		||||
	.end main
 | 
			
		||||
EOF
 | 
			
		||||
	eval $set_cc_for_build
 | 
			
		||||
	$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
 | 
			
		||||
	if test "$?" = 0 ; then
 | 
			
		||||
		case `./$dummy` in
 | 
			
		||||
			0-0)
 | 
			
		||||
				UNAME_MACHINE="alpha"
 | 
			
		||||
				;;
 | 
			
		||||
			1-0)
 | 
			
		||||
				UNAME_MACHINE="alphaev5"
 | 
			
		||||
				;;
 | 
			
		||||
			1-1)
 | 
			
		||||
				UNAME_MACHINE="alphaev56"
 | 
			
		||||
				;;
 | 
			
		||||
			1-101)
 | 
			
		||||
				UNAME_MACHINE="alphapca56"
 | 
			
		||||
				;;
 | 
			
		||||
			2-303)
 | 
			
		||||
				UNAME_MACHINE="alphaev6"
 | 
			
		||||
				;;
 | 
			
		||||
			2-307)
 | 
			
		||||
				UNAME_MACHINE="alphaev67"
 | 
			
		||||
				;;
 | 
			
		||||
			2-1307)
 | 
			
		||||
				UNAME_MACHINE="alphaev68"
 | 
			
		||||
				;;
 | 
			
		||||
		esac
 | 
			
		||||
	fi
 | 
			
		||||
	rm -f $dummy.s $dummy
 | 
			
		||||
	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
 | 
			
		||||
	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    Alpha\ *:Windows_NT*:*)
 | 
			
		||||
	# How do we know it's Interix rather than the generic POSIX subsystem?
 | 
			
		||||
@@ -296,6 +319,12 @@ EOF
 | 
			
		||||
    *:OS/390:*:*)
 | 
			
		||||
	echo i370-ibm-openedition
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    *:z/VM:*:*)
 | 
			
		||||
	echo s390-ibm-zvmoe
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    *:OS400:*:*)
 | 
			
		||||
        echo powerpc-ibm-os400
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
 | 
			
		||||
	echo arm-acorn-riscix${UNAME_RELEASE}
 | 
			
		||||
	exit 0;;
 | 
			
		||||
@@ -313,6 +342,13 @@ EOF
 | 
			
		||||
    NILE*:*:*:dcosx)
 | 
			
		||||
	echo pyramid-pyramid-svr4
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    DRS?6000:unix:4.0:6*)
 | 
			
		||||
	echo sparc-icl-nx6
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
 | 
			
		||||
	case `/usr/bin/uname -p` in
 | 
			
		||||
	    sparc) echo sparc-icl-nx7 && exit 0 ;;
 | 
			
		||||
	esac ;;
 | 
			
		||||
    sun4H:SunOS:5.*:*)
 | 
			
		||||
	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
@@ -381,6 +417,9 @@ EOF
 | 
			
		||||
    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
 | 
			
		||||
        echo m68k-unknown-mint${UNAME_RELEASE}
 | 
			
		||||
        exit 0 ;;
 | 
			
		||||
    m68k:machten:*:*)
 | 
			
		||||
	echo m68k-apple-machten${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    powerpc:machten:*:*)
 | 
			
		||||
	echo powerpc-apple-machten${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
@@ -419,15 +458,20 @@ EOF
 | 
			
		||||
	  exit (-1);
 | 
			
		||||
	}
 | 
			
		||||
EOF
 | 
			
		||||
	$CC_FOR_BUILD $dummy.c -o $dummy \
 | 
			
		||||
	  && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
 | 
			
		||||
	  && rm -f $dummy.c $dummy && exit 0
 | 
			
		||||
	rm -f $dummy.c $dummy
 | 
			
		||||
	$CC_FOR_BUILD -o $dummy $dummy.c \
 | 
			
		||||
	  && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
 | 
			
		||||
	  && exit 0
 | 
			
		||||
	echo mips-mips-riscos${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    Motorola:PowerMAX_OS:*:*)
 | 
			
		||||
	echo powerpc-motorola-powermax
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    Motorola:*:4.3:PL8-*)
 | 
			
		||||
	echo powerpc-harris-powermax
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
 | 
			
		||||
	echo powerpc-harris-powermax
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    Night_Hawk:Power_UNIX:*:*)
 | 
			
		||||
	echo powerpc-harris-powerunix
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
@@ -500,8 +544,7 @@ EOF
 | 
			
		||||
			exit(0);
 | 
			
		||||
			}
 | 
			
		||||
EOF
 | 
			
		||||
		$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
 | 
			
		||||
		rm -f $dummy.c $dummy
 | 
			
		||||
		$CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0
 | 
			
		||||
		echo rs6000-ibm-aix3.2.5
 | 
			
		||||
	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
 | 
			
		||||
		echo rs6000-ibm-aix3.2.4
 | 
			
		||||
@@ -599,11 +642,21 @@ EOF
 | 
			
		||||
                  exit (0);
 | 
			
		||||
              }
 | 
			
		||||
EOF
 | 
			
		||||
		    (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null) && HP_ARCH=`./$dummy`
 | 
			
		||||
		    if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi
 | 
			
		||||
		    rm -f $dummy.c $dummy
 | 
			
		||||
		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
 | 
			
		||||
		    test -z "$HP_ARCH" && HP_ARCH=hppa
 | 
			
		||||
		fi ;;
 | 
			
		||||
	esac
 | 
			
		||||
	if [ ${HP_ARCH} = "hppa2.0w" ]
 | 
			
		||||
	then
 | 
			
		||||
	    # avoid double evaluation of $set_cc_for_build
 | 
			
		||||
	    test -n "$CC_FOR_BUILD" || eval $set_cc_for_build
 | 
			
		||||
	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null
 | 
			
		||||
	    then
 | 
			
		||||
		HP_ARCH="hppa2.0w"
 | 
			
		||||
	    else
 | 
			
		||||
		HP_ARCH="hppa64"
 | 
			
		||||
	    fi
 | 
			
		||||
	fi
 | 
			
		||||
	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    ia64:HP-UX:*:*)
 | 
			
		||||
@@ -637,8 +690,7 @@ EOF
 | 
			
		||||
	  exit (0);
 | 
			
		||||
	}
 | 
			
		||||
EOF
 | 
			
		||||
	$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
 | 
			
		||||
	rm -f $dummy.c $dummy
 | 
			
		||||
	$CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0
 | 
			
		||||
	echo unknown-hitachi-hiuxwe2
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
 | 
			
		||||
@@ -696,21 +748,26 @@ EOF
 | 
			
		||||
    CRAY*TS:*:*:*)
 | 
			
		||||
	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    CRAY*T3D:*:*:*)
 | 
			
		||||
	echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    CRAY*T3E:*:*:*)
 | 
			
		||||
	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    CRAY*SV1:*:*:*)
 | 
			
		||||
	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    *:UNICOS/mp:*:*)
 | 
			
		||||
	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
 | 
			
		||||
	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
 | 
			
		||||
        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
 | 
			
		||||
        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
 | 
			
		||||
        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
 | 
			
		||||
        exit 0 ;;
 | 
			
		||||
    5000:UNIX_System_V:4.*:*)
 | 
			
		||||
        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
 | 
			
		||||
        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
 | 
			
		||||
        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
@@ -732,18 +789,24 @@ EOF
 | 
			
		||||
    i*:PW*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-pc-pw32
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    x86:Interix*:3*)
 | 
			
		||||
	echo i386-pc-interix3
 | 
			
		||||
    x86:Interix*:[34]*)
 | 
			
		||||
	echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//'
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
 | 
			
		||||
	echo i${UNAME_MACHINE}-pc-mks
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
 | 
			
		||||
	# How do we know it's Interix rather than the generic POSIX subsystem?
 | 
			
		||||
	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
 | 
			
		||||
	# UNAME_MACHINE based on the output of uname instead of i386?
 | 
			
		||||
	echo i386-pc-interix
 | 
			
		||||
	echo i586-pc-interix
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    i*:UWIN*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-pc-uwin
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    amd64:CYGWIN*:*:*)
 | 
			
		||||
	echo x86_64-unknown-cygwin
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    p*:CYGWIN*:*)
 | 
			
		||||
	echo powerpcle-unknown-cygwin
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
@@ -751,16 +814,33 @@ EOF
 | 
			
		||||
	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    *:GNU:*:*)
 | 
			
		||||
	# the GNU system
 | 
			
		||||
	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    *:GNU/*:*:*)
 | 
			
		||||
	# other systems with GNU libc and userland
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    i*86:Minix:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-pc-minix
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    arm*:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-gnu
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    cris:Linux:*:*)
 | 
			
		||||
	echo cris-axis-linux-gnu
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    crisv32:Linux:*:*)
 | 
			
		||||
	echo crisv32-axis-linux-gnu
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    frv:Linux:*:*)
 | 
			
		||||
    	echo frv-unknown-linux-gnu
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    ia64:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-gnu
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    m32r*:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-gnu
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    m68*:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-gnu
 | 
			
		||||
@@ -771,19 +851,37 @@ EOF
 | 
			
		||||
	#undef CPU
 | 
			
		||||
	#undef mips
 | 
			
		||||
	#undef mipsel
 | 
			
		||||
	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) 
 | 
			
		||||
	CPU=mipsel 
 | 
			
		||||
	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
 | 
			
		||||
	CPU=mipsel
 | 
			
		||||
	#else
 | 
			
		||||
	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) 
 | 
			
		||||
	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
 | 
			
		||||
	CPU=mips
 | 
			
		||||
	#else
 | 
			
		||||
	CPU=
 | 
			
		||||
	#endif
 | 
			
		||||
	#endif 
 | 
			
		||||
	#endif
 | 
			
		||||
EOF
 | 
			
		||||
	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
 | 
			
		||||
	rm -f $dummy.c
 | 
			
		||||
	test x"${CPU}" != x && echo "${CPU}-pc-linux-gnu" && exit 0
 | 
			
		||||
	test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
 | 
			
		||||
	;;
 | 
			
		||||
    mips64:Linux:*:*)
 | 
			
		||||
	eval $set_cc_for_build
 | 
			
		||||
	sed 's/^	//' << EOF >$dummy.c
 | 
			
		||||
	#undef CPU
 | 
			
		||||
	#undef mips64
 | 
			
		||||
	#undef mips64el
 | 
			
		||||
	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
 | 
			
		||||
	CPU=mips64el
 | 
			
		||||
	#else
 | 
			
		||||
	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
 | 
			
		||||
	CPU=mips64
 | 
			
		||||
	#else
 | 
			
		||||
	CPU=
 | 
			
		||||
	#endif
 | 
			
		||||
	#endif
 | 
			
		||||
EOF
 | 
			
		||||
	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
 | 
			
		||||
	test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
 | 
			
		||||
	;;
 | 
			
		||||
    ppc:Linux:*:*)
 | 
			
		||||
	echo powerpc-unknown-linux-gnu
 | 
			
		||||
@@ -819,6 +917,9 @@ EOF
 | 
			
		||||
    s390:Linux:*:* | s390x:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-ibm-linux
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    sh64*:Linux:*:*)
 | 
			
		||||
    	echo ${UNAME_MACHINE}-unknown-linux-gnu
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    sh*:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-gnu
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
@@ -845,7 +946,7 @@ EOF
 | 
			
		||||
		;;
 | 
			
		||||
	  a.out-i386-linux)
 | 
			
		||||
		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
 | 
			
		||||
		exit 0 ;;		
 | 
			
		||||
		exit 0 ;;
 | 
			
		||||
	  coff-i386)
 | 
			
		||||
		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
 | 
			
		||||
		exit 0 ;;
 | 
			
		||||
@@ -876,9 +977,11 @@ EOF
 | 
			
		||||
	LIBC=gnuaout
 | 
			
		||||
	#endif
 | 
			
		||||
	#endif
 | 
			
		||||
	#ifdef __dietlibc__
 | 
			
		||||
	LIBC=dietlibc
 | 
			
		||||
	#endif
 | 
			
		||||
EOF
 | 
			
		||||
	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
 | 
			
		||||
	rm -f $dummy.c
 | 
			
		||||
	test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0
 | 
			
		||||
	test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
 | 
			
		||||
	;;
 | 
			
		||||
@@ -896,6 +999,26 @@ EOF
 | 
			
		||||
        # Use sysv4.2uw... so that sysv4* matches it.
 | 
			
		||||
	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    i*86:OS/2:*:*)
 | 
			
		||||
	# If we were able to find `uname', then EMX Unix compatibility
 | 
			
		||||
	# is probably installed.
 | 
			
		||||
	echo ${UNAME_MACHINE}-pc-os2-emx
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    i*86:XTS-300:*:STOP)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-stop
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    i*86:atheos:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-atheos
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
	i*86:syllable:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-pc-syllable
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
 | 
			
		||||
	echo i386-unknown-lynxos${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    i*86:*DOS:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-pc-msdosdjgpp
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
 | 
			
		||||
	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
 | 
			
		||||
	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
 | 
			
		||||
@@ -917,22 +1040,19 @@ EOF
 | 
			
		||||
		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
 | 
			
		||||
		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
 | 
			
		||||
	elif /bin/uname -X 2>/dev/null >/dev/null ; then
 | 
			
		||||
		UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
 | 
			
		||||
		(/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
 | 
			
		||||
		(/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
 | 
			
		||||
		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
 | 
			
		||||
		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
 | 
			
		||||
		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
 | 
			
		||||
			&& UNAME_MACHINE=i586
 | 
			
		||||
		(/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \
 | 
			
		||||
		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
 | 
			
		||||
			&& UNAME_MACHINE=i686
 | 
			
		||||
		(/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \
 | 
			
		||||
		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
 | 
			
		||||
			&& UNAME_MACHINE=i686
 | 
			
		||||
		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
 | 
			
		||||
	else
 | 
			
		||||
		echo ${UNAME_MACHINE}-pc-sysv32
 | 
			
		||||
	fi
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    i*86:*DOS:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-pc-msdosdjgpp
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    pc:*:*:*)
 | 
			
		||||
	# Left here for compatibility:
 | 
			
		||||
        # uname -m prints for DJGPP always 'pc', but it prints nothing about
 | 
			
		||||
@@ -956,9 +1076,15 @@ EOF
 | 
			
		||||
	# "miniframe"
 | 
			
		||||
	echo m68010-convergent-sysv
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    M68*:*:R3V[567]*:*)
 | 
			
		||||
    mc68k:UNIX:SYSTEM5:3.51m)
 | 
			
		||||
	echo m68k-convergent-sysv
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    M680?0:D-NIX:5.3:*)
 | 
			
		||||
	echo m68k-diab-dnix
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    M68*:*:R3V[5678]*:*)
 | 
			
		||||
	test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
 | 
			
		||||
    3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0)
 | 
			
		||||
    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
 | 
			
		||||
	OS_REL=''
 | 
			
		||||
	test -r /etc/.relid \
 | 
			
		||||
	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
 | 
			
		||||
@@ -975,9 +1101,6 @@ EOF
 | 
			
		||||
    mc68030:UNIX_System_V:4.*:*)
 | 
			
		||||
	echo m68k-atari-sysv4
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
 | 
			
		||||
	echo i386-unknown-lynxos${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    TSUNAMI:LynxOS:2.*:*)
 | 
			
		||||
	echo sparc-unknown-lynxos${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
@@ -1017,6 +1140,10 @@ EOF
 | 
			
		||||
	# From seanf@swdc.stratus.com.
 | 
			
		||||
	echo i860-stratus-sysv4
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    i*86:VOS:*:*)
 | 
			
		||||
	# From Paul.Green@stratus.com.
 | 
			
		||||
	echo ${UNAME_MACHINE}-stratus-vos
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    *:VOS:*:*)
 | 
			
		||||
	# From Paul.Green@stratus.com.
 | 
			
		||||
	echo hppa1.1-stratus-vos
 | 
			
		||||
@@ -1049,6 +1176,9 @@ EOF
 | 
			
		||||
    SX-5:SUPER-UX:*:*)
 | 
			
		||||
	echo sx5-nec-superux${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    SX-6:SUPER-UX:*:*)
 | 
			
		||||
	echo sx6-nec-superux${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    Power*:Rhapsody:*:*)
 | 
			
		||||
	echo powerpc-apple-rhapsody${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
@@ -1056,20 +1186,28 @@ EOF
 | 
			
		||||
	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    *:Darwin:*:*)
 | 
			
		||||
	echo `uname -p`-apple-darwin${UNAME_RELEASE}
 | 
			
		||||
	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
 | 
			
		||||
	case $UNAME_PROCESSOR in
 | 
			
		||||
	    *86) UNAME_PROCESSOR=i686 ;;
 | 
			
		||||
	    unknown) UNAME_PROCESSOR=powerpc ;;
 | 
			
		||||
	esac
 | 
			
		||||
	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    *:procnto*:*:* | *:QNX:[0123456789]*:*)
 | 
			
		||||
	if test "${UNAME_MACHINE}" = "x86pc"; then
 | 
			
		||||
	UNAME_PROCESSOR=`uname -p`
 | 
			
		||||
	if test "$UNAME_PROCESSOR" = "x86"; then
 | 
			
		||||
		UNAME_PROCESSOR=i386
 | 
			
		||||
		UNAME_MACHINE=pc
 | 
			
		||||
		echo i386-${UNAME_MACHINE}-nto-qnx
 | 
			
		||||
	else
 | 
			
		||||
		echo `uname -p`-${UNAME_MACHINE}-nto-qnx
 | 
			
		||||
	fi
 | 
			
		||||
	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    *:QNX:*:4*)
 | 
			
		||||
	echo i386-pc-qnx
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    NSR-[GKLNPTVW]:NONSTOP_KERNEL:*:*)
 | 
			
		||||
    NSE-?:NONSTOP_KERNEL:*:*)
 | 
			
		||||
	echo nse-tandem-nsk${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    NSR-?:NONSTOP_KERNEL:*:*)
 | 
			
		||||
	echo nsr-tandem-nsk${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    *:NonStop-UX:*:*)
 | 
			
		||||
@@ -1092,11 +1230,6 @@ EOF
 | 
			
		||||
	fi
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-plan9
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    i*86:OS/2:*:*)
 | 
			
		||||
	# If we were able to find `uname', then EMX Unix compatibility
 | 
			
		||||
	# is probably installed.
 | 
			
		||||
	echo ${UNAME_MACHINE}-pc-os2-emx
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    *:TOPS-10:*:*)
 | 
			
		||||
	echo pdp10-unknown-tops10
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
@@ -1115,11 +1248,21 @@ EOF
 | 
			
		||||
    *:ITS:*:*)
 | 
			
		||||
	echo pdp10-unknown-its
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    i*86:XTS-300:*:STOP)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-stop
 | 
			
		||||
    SEI:*:*:SEIUX)
 | 
			
		||||
        echo mips-sei-seiux${UNAME_RELEASE}
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    i*86:atheos:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-atheos
 | 
			
		||||
    *:DragonFly:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
    *:*VMS:*:*)
 | 
			
		||||
    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
 | 
			
		||||
	case "${UNAME_MACHINE}" in
 | 
			
		||||
	    A*) echo alpha-dec-vms && exit 0 ;;
 | 
			
		||||
	    I*) echo ia64-dec-vms && exit 0 ;;
 | 
			
		||||
	    V*) echo vax-dec-vms && exit 0 ;;
 | 
			
		||||
	esac ;;
 | 
			
		||||
    *:XENIX:*:SysV)
 | 
			
		||||
	echo i386-pc-xenix
 | 
			
		||||
	exit 0 ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
@@ -1241,8 +1384,7 @@ main ()
 | 
			
		||||
}
 | 
			
		||||
EOF
 | 
			
		||||
 | 
			
		||||
$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0
 | 
			
		||||
rm -f $dummy.c $dummy
 | 
			
		||||
$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0
 | 
			
		||||
 | 
			
		||||
# Apollos put the system type in the environment.
 | 
			
		||||
 | 
			
		||||
@@ -1281,7 +1423,9 @@ This script, last modified $timestamp, has failed to recognize
 | 
			
		||||
the operating system you are using. It is advised that you
 | 
			
		||||
download the most up to date version of the config scripts from
 | 
			
		||||
 | 
			
		||||
    ftp://ftp.gnu.org/pub/gnu/config/
 | 
			
		||||
  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
 | 
			
		||||
and
 | 
			
		||||
  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
 | 
			
		||||
 | 
			
		||||
If the version you run ($0) is already up to date, please
 | 
			
		||||
send the following data and any information you think might be
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										286
									
								
								config.sub
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										286
									
								
								config.sub
									
									
									
									
										vendored
									
									
								
							@@ -1,9 +1,9 @@
 | 
			
		||||
#! /bin/sh
 | 
			
		||||
# Configuration validation subroutine script.
 | 
			
		||||
#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
 | 
			
		||||
#   2000, 2001, 2002 Free Software Foundation, Inc.
 | 
			
		||||
#   2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 | 
			
		||||
 | 
			
		||||
timestamp='2002-03-04'
 | 
			
		||||
timestamp='2005-04-22'
 | 
			
		||||
 | 
			
		||||
# This file is (in principle) common to ALL GNU software.
 | 
			
		||||
# The presence of a machine in this file suggests that SOME GNU software
 | 
			
		||||
@@ -70,7 +70,7 @@ Report bugs and patches to <config-patches@gnu.org>."
 | 
			
		||||
version="\
 | 
			
		||||
GNU config.sub ($timestamp)
 | 
			
		||||
 | 
			
		||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
 | 
			
		||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
 | 
			
		||||
Free Software Foundation, Inc.
 | 
			
		||||
 | 
			
		||||
This is free software; see the source for copying conditions.  There is NO
 | 
			
		||||
@@ -118,7 +118,8 @@ esac
 | 
			
		||||
# Here we must recognize all the valid KERNEL-OS combinations.
 | 
			
		||||
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 | 
			
		||||
case $maybe_os in
 | 
			
		||||
  nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-* | rtmk-nova*)
 | 
			
		||||
  nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \
 | 
			
		||||
  kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
 | 
			
		||||
    os=-$maybe_os
 | 
			
		||||
    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
 | 
			
		||||
    ;;
 | 
			
		||||
@@ -144,7 +145,7 @@ case $os in
 | 
			
		||||
	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
 | 
			
		||||
	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
 | 
			
		||||
	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
 | 
			
		||||
	-apple | -axis)
 | 
			
		||||
	-apple | -axis | -knuth | -cray)
 | 
			
		||||
		os=
 | 
			
		||||
		basic_machine=$1
 | 
			
		||||
		;;
 | 
			
		||||
@@ -228,31 +229,47 @@ case $basic_machine in
 | 
			
		||||
	| a29k \
 | 
			
		||||
	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
 | 
			
		||||
	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
 | 
			
		||||
	| am33_2.0 \
 | 
			
		||||
	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
 | 
			
		||||
	| bfin \
 | 
			
		||||
	| c4x | clipper \
 | 
			
		||||
	| d10v | d30v | dsp16xx \
 | 
			
		||||
	| fr30 \
 | 
			
		||||
	| d10v | d30v | dlx | dsp16xx \
 | 
			
		||||
	| fr30 | frv \
 | 
			
		||||
	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
 | 
			
		||||
	| i370 | i860 | i960 | ia64 \
 | 
			
		||||
	| m32r | m68000 | m68k | m88k | mcore \
 | 
			
		||||
	| mips | mips16 | mips64 | mips64el | mips64orion | mips64orionel \
 | 
			
		||||
	| mips64vr4100 | mips64vr4100el | mips64vr4300 \
 | 
			
		||||
	| mips64vr4300el | mips64vr5000 | mips64vr5000el \
 | 
			
		||||
	| mipsbe | mipseb | mipsel | mipsle | mipstx39 | mipstx39el \
 | 
			
		||||
	| mipsisa32 \
 | 
			
		||||
	| ip2k | iq2000 \
 | 
			
		||||
	| m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \
 | 
			
		||||
	| mips | mipsbe | mipseb | mipsel | mipsle \
 | 
			
		||||
	| mips16 \
 | 
			
		||||
	| mips64 | mips64el \
 | 
			
		||||
	| mips64vr | mips64vrel \
 | 
			
		||||
	| mips64orion | mips64orionel \
 | 
			
		||||
	| mips64vr4100 | mips64vr4100el \
 | 
			
		||||
	| mips64vr4300 | mips64vr4300el \
 | 
			
		||||
	| mips64vr5000 | mips64vr5000el \
 | 
			
		||||
	| mipsisa32 | mipsisa32el \
 | 
			
		||||
	| mipsisa32r2 | mipsisa32r2el \
 | 
			
		||||
	| mipsisa64 | mipsisa64el \
 | 
			
		||||
	| mipsisa64r2 | mipsisa64r2el \
 | 
			
		||||
	| mipsisa64sb1 | mipsisa64sb1el \
 | 
			
		||||
	| mipsisa64sr71k | mipsisa64sr71kel \
 | 
			
		||||
	| mipstx39 | mipstx39el \
 | 
			
		||||
	| mn10200 | mn10300 \
 | 
			
		||||
	| msp430 \
 | 
			
		||||
	| ns16k | ns32k \
 | 
			
		||||
	| openrisc | or32 \
 | 
			
		||||
	| pdp10 | pdp11 | pj | pjl \
 | 
			
		||||
	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
 | 
			
		||||
	| pyramid \
 | 
			
		||||
	| sh | sh[34] | sh[34]eb | shbe | shle | sh64 \
 | 
			
		||||
	| sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \
 | 
			
		||||
	| sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
 | 
			
		||||
	| sh64 | sh64le \
 | 
			
		||||
	| sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \
 | 
			
		||||
	| sparcv8 | sparcv9 | sparcv9b \
 | 
			
		||||
	| strongarm \
 | 
			
		||||
	| tahoe | thumb | tic80 | tron \
 | 
			
		||||
	| tahoe | thumb | tic4x | tic80 | tron \
 | 
			
		||||
	| v850 | v850e \
 | 
			
		||||
	| we32k \
 | 
			
		||||
	| x86 | xscale | xstormy16 | xtensa \
 | 
			
		||||
	| x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
 | 
			
		||||
	| z8k)
 | 
			
		||||
		basic_machine=$basic_machine-unknown
 | 
			
		||||
		;;
 | 
			
		||||
@@ -281,38 +298,56 @@ case $basic_machine in
 | 
			
		||||
	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
 | 
			
		||||
	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
 | 
			
		||||
	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
 | 
			
		||||
	| arm-*  | armbe-* | armle-* | armv*-* \
 | 
			
		||||
	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
 | 
			
		||||
	| avr-* \
 | 
			
		||||
	| bs2000-* \
 | 
			
		||||
	| c[123]* | c30-* | [cjt]90-* | c54x-* \
 | 
			
		||||
	| clipper-* | cydra-* \
 | 
			
		||||
	| d10v-* | d30v-* \
 | 
			
		||||
	| bfin-* | bs2000-* \
 | 
			
		||||
	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
 | 
			
		||||
	| clipper-* | craynv-* | cydra-* \
 | 
			
		||||
	| d10v-* | d30v-* | dlx-* \
 | 
			
		||||
	| elxsi-* \
 | 
			
		||||
	| f30[01]-* | f700-* | fr30-* | fx80-* \
 | 
			
		||||
	| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
 | 
			
		||||
	| h8300-* | h8500-* \
 | 
			
		||||
	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
 | 
			
		||||
	| i*86-* | i860-* | i960-* | ia64-* \
 | 
			
		||||
	| m32r-* \
 | 
			
		||||
	| ip2k-* | iq2000-* \
 | 
			
		||||
	| m32r-* | m32rle-* \
 | 
			
		||||
	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
 | 
			
		||||
	| m88110-* | m88k-* | mcore-* \
 | 
			
		||||
	| mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \
 | 
			
		||||
	| mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \
 | 
			
		||||
	| mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipseb-* \
 | 
			
		||||
	| mipsle-* | mipsel-* | mipstx39-* | mipstx39el-* \
 | 
			
		||||
	| m88110-* | m88k-* | maxq-* | mcore-* \
 | 
			
		||||
	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
 | 
			
		||||
	| mips16-* \
 | 
			
		||||
	| mips64-* | mips64el-* \
 | 
			
		||||
	| mips64vr-* | mips64vrel-* \
 | 
			
		||||
	| mips64orion-* | mips64orionel-* \
 | 
			
		||||
	| mips64vr4100-* | mips64vr4100el-* \
 | 
			
		||||
	| mips64vr4300-* | mips64vr4300el-* \
 | 
			
		||||
	| mips64vr5000-* | mips64vr5000el-* \
 | 
			
		||||
	| mipsisa32-* | mipsisa32el-* \
 | 
			
		||||
	| mipsisa32r2-* | mipsisa32r2el-* \
 | 
			
		||||
	| mipsisa64-* | mipsisa64el-* \
 | 
			
		||||
	| mipsisa64r2-* | mipsisa64r2el-* \
 | 
			
		||||
	| mipsisa64sb1-* | mipsisa64sb1el-* \
 | 
			
		||||
	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
 | 
			
		||||
	| mipstx39-* | mipstx39el-* \
 | 
			
		||||
	| mmix-* \
 | 
			
		||||
	| msp430-* \
 | 
			
		||||
	| none-* | np1-* | ns16k-* | ns32k-* \
 | 
			
		||||
	| orion-* \
 | 
			
		||||
	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
 | 
			
		||||
	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
 | 
			
		||||
	| pyramid-* \
 | 
			
		||||
	| romp-* | rs6000-* \
 | 
			
		||||
	| sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* | sh64-* \
 | 
			
		||||
	| sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \
 | 
			
		||||
	| sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
 | 
			
		||||
	| tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \
 | 
			
		||||
	| sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \
 | 
			
		||||
	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
 | 
			
		||||
	| sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \
 | 
			
		||||
	| sparclite-* \
 | 
			
		||||
	| sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
 | 
			
		||||
	| tahoe-* | thumb-* \
 | 
			
		||||
	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
 | 
			
		||||
	| tron-* \
 | 
			
		||||
	| v850-* | v850e-* | vax-* \
 | 
			
		||||
	| we32k-* \
 | 
			
		||||
	| x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \
 | 
			
		||||
	| xtensa-* \
 | 
			
		||||
	| x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
 | 
			
		||||
	| xstormy16-* | xtensa-* \
 | 
			
		||||
	| ymp-* \
 | 
			
		||||
	| z8k-*)
 | 
			
		||||
		;;
 | 
			
		||||
@@ -332,6 +367,9 @@ case $basic_machine in
 | 
			
		||||
		basic_machine=a29k-amd
 | 
			
		||||
		os=-udi
 | 
			
		||||
		;;
 | 
			
		||||
    	abacus)
 | 
			
		||||
		basic_machine=abacus-unknown
 | 
			
		||||
		;;
 | 
			
		||||
	adobe68k)
 | 
			
		||||
		basic_machine=m68010-adobe
 | 
			
		||||
		os=-scout
 | 
			
		||||
@@ -346,6 +384,12 @@ case $basic_machine in
 | 
			
		||||
		basic_machine=a29k-none
 | 
			
		||||
		os=-bsd
 | 
			
		||||
		;;
 | 
			
		||||
	amd64)
 | 
			
		||||
		basic_machine=x86_64-pc
 | 
			
		||||
		;;
 | 
			
		||||
	amd64-*)
 | 
			
		||||
		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
 | 
			
		||||
		;;
 | 
			
		||||
	amdahl)
 | 
			
		||||
		basic_machine=580-amdahl
 | 
			
		||||
		os=-sysv
 | 
			
		||||
@@ -405,12 +449,27 @@ case $basic_machine in
 | 
			
		||||
		basic_machine=j90-cray
 | 
			
		||||
		os=-unicos
 | 
			
		||||
		;;
 | 
			
		||||
	craynv)
 | 
			
		||||
		basic_machine=craynv-cray
 | 
			
		||||
		os=-unicosmp
 | 
			
		||||
		;;
 | 
			
		||||
	cr16c)
 | 
			
		||||
		basic_machine=cr16c-unknown
 | 
			
		||||
		os=-elf
 | 
			
		||||
		;;
 | 
			
		||||
	crds | unos)
 | 
			
		||||
		basic_machine=m68k-crds
 | 
			
		||||
		;;
 | 
			
		||||
	crisv32 | crisv32-* | etraxfs*)
 | 
			
		||||
		basic_machine=crisv32-axis
 | 
			
		||||
		;;
 | 
			
		||||
	cris | cris-* | etrax*)
 | 
			
		||||
		basic_machine=cris-axis
 | 
			
		||||
		;;
 | 
			
		||||
	crx)
 | 
			
		||||
		basic_machine=crx-unknown
 | 
			
		||||
		os=-elf
 | 
			
		||||
		;;
 | 
			
		||||
	da30 | da30-*)
 | 
			
		||||
		basic_machine=m68k-da30
 | 
			
		||||
		;;
 | 
			
		||||
@@ -433,6 +492,10 @@ case $basic_machine in
 | 
			
		||||
		basic_machine=m88k-motorola
 | 
			
		||||
		os=-sysv3
 | 
			
		||||
		;;
 | 
			
		||||
	djgpp)
 | 
			
		||||
		basic_machine=i586-pc
 | 
			
		||||
		os=-msdosdjgpp
 | 
			
		||||
		;;
 | 
			
		||||
	dpx20 | dpx20-*)
 | 
			
		||||
		basic_machine=rs6000-bull
 | 
			
		||||
		os=-bosx
 | 
			
		||||
@@ -611,10 +674,6 @@ case $basic_machine in
 | 
			
		||||
	mips3*)
 | 
			
		||||
		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
 | 
			
		||||
		;;
 | 
			
		||||
	mmix*)
 | 
			
		||||
		basic_machine=mmix-knuth
 | 
			
		||||
		os=-mmixware
 | 
			
		||||
		;;
 | 
			
		||||
	monitor)
 | 
			
		||||
		basic_machine=m68k-rom68k
 | 
			
		||||
		os=-coff
 | 
			
		||||
@@ -706,6 +765,10 @@ case $basic_machine in
 | 
			
		||||
		basic_machine=or32-unknown
 | 
			
		||||
		os=-coff
 | 
			
		||||
		;;
 | 
			
		||||
	os400)
 | 
			
		||||
		basic_machine=powerpc-ibm
 | 
			
		||||
		os=-os400
 | 
			
		||||
		;;
 | 
			
		||||
	OSE68000 | ose68000)
 | 
			
		||||
		basic_machine=m68000-ericsson
 | 
			
		||||
		os=-ose
 | 
			
		||||
@@ -728,49 +791,55 @@ case $basic_machine in
 | 
			
		||||
	pbb)
 | 
			
		||||
		basic_machine=m68k-tti
 | 
			
		||||
		;;
 | 
			
		||||
        pc532 | pc532-*)
 | 
			
		||||
	pc532 | pc532-*)
 | 
			
		||||
		basic_machine=ns32k-pc532
 | 
			
		||||
		;;
 | 
			
		||||
	pentium | p5 | k5 | k6 | nexgen | viac3)
 | 
			
		||||
		basic_machine=i586-pc
 | 
			
		||||
		;;
 | 
			
		||||
	pentiumpro | p6 | 6x86 | athlon)
 | 
			
		||||
	pentiumpro | p6 | 6x86 | athlon | athlon_*)
 | 
			
		||||
		basic_machine=i686-pc
 | 
			
		||||
		;;
 | 
			
		||||
	pentiumii | pentium2)
 | 
			
		||||
	pentiumii | pentium2 | pentiumiii | pentium3)
 | 
			
		||||
		basic_machine=i686-pc
 | 
			
		||||
		;;
 | 
			
		||||
	pentium4)
 | 
			
		||||
		basic_machine=i786-pc
 | 
			
		||||
		;;
 | 
			
		||||
	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
 | 
			
		||||
		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
 | 
			
		||||
		;;
 | 
			
		||||
	pentiumpro-* | p6-* | 6x86-* | athlon-*)
 | 
			
		||||
		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
 | 
			
		||||
		;;
 | 
			
		||||
	pentiumii-* | pentium2-*)
 | 
			
		||||
	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
 | 
			
		||||
		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
 | 
			
		||||
		;;
 | 
			
		||||
	pentium4-*)
 | 
			
		||||
		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
 | 
			
		||||
		;;
 | 
			
		||||
	pn)
 | 
			
		||||
		basic_machine=pn-gould
 | 
			
		||||
		;;
 | 
			
		||||
	power)	basic_machine=power-ibm
 | 
			
		||||
		;;
 | 
			
		||||
	ppc)	basic_machine=powerpc-unknown
 | 
			
		||||
	        ;;
 | 
			
		||||
		;;
 | 
			
		||||
	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
 | 
			
		||||
		;;
 | 
			
		||||
	ppcle | powerpclittle | ppc-le | powerpc-little)
 | 
			
		||||
		basic_machine=powerpcle-unknown
 | 
			
		||||
	        ;;
 | 
			
		||||
		;;
 | 
			
		||||
	ppcle-* | powerpclittle-*)
 | 
			
		||||
		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
 | 
			
		||||
		;;
 | 
			
		||||
	ppc64)	basic_machine=powerpc64-unknown
 | 
			
		||||
	        ;;
 | 
			
		||||
		;;
 | 
			
		||||
	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
 | 
			
		||||
		;;
 | 
			
		||||
	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
 | 
			
		||||
		basic_machine=powerpc64le-unknown
 | 
			
		||||
	        ;;
 | 
			
		||||
		;;
 | 
			
		||||
	ppc64le-* | powerpc64little-*)
 | 
			
		||||
		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
 | 
			
		||||
		;;
 | 
			
		||||
@@ -801,6 +870,16 @@ case $basic_machine in
 | 
			
		||||
		basic_machine=a29k-amd
 | 
			
		||||
		os=-udi
 | 
			
		||||
		;;
 | 
			
		||||
	sb1)
 | 
			
		||||
		basic_machine=mipsisa64sb1-unknown
 | 
			
		||||
		;;
 | 
			
		||||
	sb1el)
 | 
			
		||||
		basic_machine=mipsisa64sb1el-unknown
 | 
			
		||||
		;;
 | 
			
		||||
	sei)
 | 
			
		||||
		basic_machine=mips-sei
 | 
			
		||||
		os=-seiux
 | 
			
		||||
		;;
 | 
			
		||||
	sequent)
 | 
			
		||||
		basic_machine=i386-sequent
 | 
			
		||||
		;;
 | 
			
		||||
@@ -808,6 +887,9 @@ case $basic_machine in
 | 
			
		||||
		basic_machine=sh-hitachi
 | 
			
		||||
		os=-hms
 | 
			
		||||
		;;
 | 
			
		||||
	sh64)
 | 
			
		||||
		basic_machine=sh64-unknown
 | 
			
		||||
		;;
 | 
			
		||||
	sparclite-wrs | simso-wrs)
 | 
			
		||||
		basic_machine=sparclite-wrs
 | 
			
		||||
		os=-vxworks
 | 
			
		||||
@@ -866,7 +948,7 @@ case $basic_machine in
 | 
			
		||||
	sun386 | sun386i | roadrunner)
 | 
			
		||||
		basic_machine=i386-sun
 | 
			
		||||
		;;
 | 
			
		||||
        sv1)
 | 
			
		||||
	sv1)
 | 
			
		||||
		basic_machine=sv1-cray
 | 
			
		||||
		os=-unicos
 | 
			
		||||
		;;
 | 
			
		||||
@@ -874,10 +956,6 @@ case $basic_machine in
 | 
			
		||||
		basic_machine=i386-sequent
 | 
			
		||||
		os=-dynix
 | 
			
		||||
		;;
 | 
			
		||||
	t3d)
 | 
			
		||||
		basic_machine=alpha-cray
 | 
			
		||||
		os=-unicos
 | 
			
		||||
		;;
 | 
			
		||||
	t3e)
 | 
			
		||||
		basic_machine=alphaev5-cray
 | 
			
		||||
		os=-unicos
 | 
			
		||||
@@ -890,6 +968,14 @@ case $basic_machine in
 | 
			
		||||
		basic_machine=tic54x-unknown
 | 
			
		||||
		os=-coff
 | 
			
		||||
		;;
 | 
			
		||||
	tic55x | c55x*)
 | 
			
		||||
		basic_machine=tic55x-unknown
 | 
			
		||||
		os=-coff
 | 
			
		||||
		;;
 | 
			
		||||
	tic6x | c6x*)
 | 
			
		||||
		basic_machine=tic6x-unknown
 | 
			
		||||
		os=-coff
 | 
			
		||||
		;;
 | 
			
		||||
	tx39)
 | 
			
		||||
		basic_machine=mipstx39-unknown
 | 
			
		||||
		;;
 | 
			
		||||
@@ -903,6 +989,10 @@ case $basic_machine in
 | 
			
		||||
	tower | tower-32)
 | 
			
		||||
		basic_machine=m68k-ncr
 | 
			
		||||
		;;
 | 
			
		||||
	tpf)
 | 
			
		||||
		basic_machine=s390x-ibm
 | 
			
		||||
		os=-tpf
 | 
			
		||||
		;;
 | 
			
		||||
	udi29k)
 | 
			
		||||
		basic_machine=a29k-amd
 | 
			
		||||
		os=-udi
 | 
			
		||||
@@ -924,8 +1014,8 @@ case $basic_machine in
 | 
			
		||||
		os=-vms
 | 
			
		||||
		;;
 | 
			
		||||
	vpp*|vx|vx-*)
 | 
			
		||||
               basic_machine=f301-fujitsu
 | 
			
		||||
               ;;
 | 
			
		||||
		basic_machine=f301-fujitsu
 | 
			
		||||
		;;
 | 
			
		||||
	vxworks960)
 | 
			
		||||
		basic_machine=i960-wrs
 | 
			
		||||
		os=-vxworks
 | 
			
		||||
@@ -946,11 +1036,11 @@ case $basic_machine in
 | 
			
		||||
		basic_machine=hppa1.1-winbond
 | 
			
		||||
		os=-proelf
 | 
			
		||||
		;;
 | 
			
		||||
	windows32)
 | 
			
		||||
		basic_machine=i386-pc
 | 
			
		||||
		os=-windows32-msvcrt
 | 
			
		||||
	xbox)
 | 
			
		||||
		basic_machine=i686-pc
 | 
			
		||||
		os=-mingw32
 | 
			
		||||
		;;
 | 
			
		||||
        xps | xps100)
 | 
			
		||||
	xps | xps100)
 | 
			
		||||
		basic_machine=xps100-honeywell
 | 
			
		||||
		;;
 | 
			
		||||
	ymp)
 | 
			
		||||
@@ -980,6 +1070,9 @@ case $basic_machine in
 | 
			
		||||
	romp)
 | 
			
		||||
		basic_machine=romp-ibm
 | 
			
		||||
		;;
 | 
			
		||||
	mmix)
 | 
			
		||||
		basic_machine=mmix-knuth
 | 
			
		||||
		;;
 | 
			
		||||
	rs6000)
 | 
			
		||||
		basic_machine=rs6000-ibm
 | 
			
		||||
		;;
 | 
			
		||||
@@ -996,16 +1089,16 @@ case $basic_machine in
 | 
			
		||||
	we32k)
 | 
			
		||||
		basic_machine=we32k-att
 | 
			
		||||
		;;
 | 
			
		||||
	sh3 | sh4 | sh3eb | sh4eb)
 | 
			
		||||
	sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele)
 | 
			
		||||
		basic_machine=sh-unknown
 | 
			
		||||
		;;
 | 
			
		||||
	sh64)
 | 
			
		||||
		basic_machine=sh64-unknown
 | 
			
		||||
		;;
 | 
			
		||||
	sparc | sparcv9 | sparcv9b)
 | 
			
		||||
	sparc | sparcv8 | sparcv9 | sparcv9b)
 | 
			
		||||
		basic_machine=sparc-sun
 | 
			
		||||
		;;
 | 
			
		||||
        cydra)
 | 
			
		||||
	cydra)
 | 
			
		||||
		basic_machine=cydra-cydrome
 | 
			
		||||
		;;
 | 
			
		||||
	orion)
 | 
			
		||||
@@ -1020,10 +1113,6 @@ case $basic_machine in
 | 
			
		||||
	pmac | pmac-mpw)
 | 
			
		||||
		basic_machine=powerpc-apple
 | 
			
		||||
		;;
 | 
			
		||||
	c4x*)
 | 
			
		||||
		basic_machine=c4x-none
 | 
			
		||||
		os=-coff
 | 
			
		||||
		;;
 | 
			
		||||
	*-unknown)
 | 
			
		||||
		# Make sure to match an already-canonicalized machine name.
 | 
			
		||||
		;;
 | 
			
		||||
@@ -1079,18 +1168,20 @@ case $os in
 | 
			
		||||
	      | -aos* \
 | 
			
		||||
	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
 | 
			
		||||
	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
 | 
			
		||||
	      | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
 | 
			
		||||
	      | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
 | 
			
		||||
	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \
 | 
			
		||||
	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
 | 
			
		||||
	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
 | 
			
		||||
	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
 | 
			
		||||
	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
 | 
			
		||||
	      | -chorusos* | -chorusrdb* \
 | 
			
		||||
	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
 | 
			
		||||
	      | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
 | 
			
		||||
	      | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \
 | 
			
		||||
	      | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \
 | 
			
		||||
	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
 | 
			
		||||
	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
 | 
			
		||||
	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
 | 
			
		||||
	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
 | 
			
		||||
	      | -morphos* | -superux* | -rtmk* | -rtmk-nova*)
 | 
			
		||||
	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
 | 
			
		||||
	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*)
 | 
			
		||||
	# Remember, each alternative MUST END IN *, to match a version number.
 | 
			
		||||
		;;
 | 
			
		||||
	-qnx*)
 | 
			
		||||
@@ -1102,8 +1193,10 @@ case $os in
 | 
			
		||||
			;;
 | 
			
		||||
		esac
 | 
			
		||||
		;;
 | 
			
		||||
	-nto-qnx*)
 | 
			
		||||
		;;
 | 
			
		||||
	-nto*)
 | 
			
		||||
		os=-nto-qnx
 | 
			
		||||
		os=`echo $os | sed -e 's|nto|nto-qnx|'`
 | 
			
		||||
		;;
 | 
			
		||||
	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
 | 
			
		||||
	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
 | 
			
		||||
@@ -1112,6 +1205,9 @@ case $os in
 | 
			
		||||
	-mac*)
 | 
			
		||||
		os=`echo $os | sed -e 's|mac|macos|'`
 | 
			
		||||
		;;
 | 
			
		||||
	-linux-dietlibc)
 | 
			
		||||
		os=-linux-dietlibc
 | 
			
		||||
		;;
 | 
			
		||||
	-linux*)
 | 
			
		||||
		os=`echo $os | sed -e 's|linux|linux-gnu|'`
 | 
			
		||||
		;;
 | 
			
		||||
@@ -1124,6 +1220,9 @@ case $os in
 | 
			
		||||
	-opened*)
 | 
			
		||||
		os=-openedition
 | 
			
		||||
		;;
 | 
			
		||||
        -os400*)
 | 
			
		||||
		os=-os400
 | 
			
		||||
		;;
 | 
			
		||||
	-wince*)
 | 
			
		||||
		os=-wince
 | 
			
		||||
		;;
 | 
			
		||||
@@ -1145,6 +1244,9 @@ case $os in
 | 
			
		||||
	-atheos*)
 | 
			
		||||
		os=-atheos
 | 
			
		||||
		;;
 | 
			
		||||
	-syllable*)
 | 
			
		||||
		os=-syllable
 | 
			
		||||
		;;
 | 
			
		||||
	-386bsd)
 | 
			
		||||
		os=-bsd
 | 
			
		||||
		;;
 | 
			
		||||
@@ -1155,7 +1257,7 @@ case $os in
 | 
			
		||||
		os=-rtmk-nova
 | 
			
		||||
		;;
 | 
			
		||||
	-ns2 )
 | 
			
		||||
	        os=-nextstep2
 | 
			
		||||
		os=-nextstep2
 | 
			
		||||
		;;
 | 
			
		||||
	-nsk*)
 | 
			
		||||
		os=-nsk
 | 
			
		||||
@@ -1167,6 +1269,9 @@ case $os in
 | 
			
		||||
	-sinix*)
 | 
			
		||||
		os=-sysv4
 | 
			
		||||
		;;
 | 
			
		||||
        -tpf*)
 | 
			
		||||
		os=-tpf
 | 
			
		||||
		;;
 | 
			
		||||
	-triton*)
 | 
			
		||||
		os=-sysv3
 | 
			
		||||
		;;
 | 
			
		||||
@@ -1194,8 +1299,17 @@ case $os in
 | 
			
		||||
	-xenix)
 | 
			
		||||
		os=-xenix
 | 
			
		||||
		;;
 | 
			
		||||
        -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
 | 
			
		||||
	        os=-mint
 | 
			
		||||
	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
 | 
			
		||||
		os=-mint
 | 
			
		||||
		;;
 | 
			
		||||
	-aros*)
 | 
			
		||||
		os=-aros
 | 
			
		||||
		;;
 | 
			
		||||
	-kaos*)
 | 
			
		||||
		os=-kaos
 | 
			
		||||
		;;
 | 
			
		||||
	-zvmoe)
 | 
			
		||||
		os=-zvmoe
 | 
			
		||||
		;;
 | 
			
		||||
	-none)
 | 
			
		||||
		;;
 | 
			
		||||
@@ -1228,11 +1342,14 @@ case $basic_machine in
 | 
			
		||||
	arm*-semi)
 | 
			
		||||
		os=-aout
 | 
			
		||||
		;;
 | 
			
		||||
    c4x-* | tic4x-*)
 | 
			
		||||
        os=-coff
 | 
			
		||||
        ;;
 | 
			
		||||
	# This must come before the *-dec entry.
 | 
			
		||||
	pdp10-*)
 | 
			
		||||
		os=-tops20
 | 
			
		||||
		;;
 | 
			
		||||
        pdp11-*)
 | 
			
		||||
	pdp11-*)
 | 
			
		||||
		os=-none
 | 
			
		||||
		;;
 | 
			
		||||
	*-dec | vax-*)
 | 
			
		||||
@@ -1274,6 +1391,9 @@ case $basic_machine in
 | 
			
		||||
	*-ibm)
 | 
			
		||||
		os=-aix
 | 
			
		||||
		;;
 | 
			
		||||
    	*-knuth)
 | 
			
		||||
		os=-mmixware
 | 
			
		||||
		;;
 | 
			
		||||
	*-wec)
 | 
			
		||||
		os=-proelf
 | 
			
		||||
		;;
 | 
			
		||||
@@ -1325,19 +1445,19 @@ case $basic_machine in
 | 
			
		||||
	*-next)
 | 
			
		||||
		os=-nextstep3
 | 
			
		||||
		;;
 | 
			
		||||
        *-gould)
 | 
			
		||||
	*-gould)
 | 
			
		||||
		os=-sysv
 | 
			
		||||
		;;
 | 
			
		||||
        *-highlevel)
 | 
			
		||||
	*-highlevel)
 | 
			
		||||
		os=-bsd
 | 
			
		||||
		;;
 | 
			
		||||
	*-encore)
 | 
			
		||||
		os=-bsd
 | 
			
		||||
		;;
 | 
			
		||||
        *-sgi)
 | 
			
		||||
	*-sgi)
 | 
			
		||||
		os=-irix
 | 
			
		||||
		;;
 | 
			
		||||
        *-siemens)
 | 
			
		||||
	*-siemens)
 | 
			
		||||
		os=-sysv4
 | 
			
		||||
		;;
 | 
			
		||||
	*-masscomp)
 | 
			
		||||
@@ -1406,10 +1526,16 @@ case $basic_machine in
 | 
			
		||||
			-mvs* | -opened*)
 | 
			
		||||
				vendor=ibm
 | 
			
		||||
				;;
 | 
			
		||||
			-os400*)
 | 
			
		||||
				vendor=ibm
 | 
			
		||||
				;;
 | 
			
		||||
			-ptx*)
 | 
			
		||||
				vendor=sequent
 | 
			
		||||
				;;
 | 
			
		||||
			-vxsim* | -vxworks*)
 | 
			
		||||
			-tpf*)
 | 
			
		||||
				vendor=ibm
 | 
			
		||||
				;;
 | 
			
		||||
			-vxsim* | -vxworks* | -windiss*)
 | 
			
		||||
				vendor=wrs
 | 
			
		||||
				;;
 | 
			
		||||
			-aux*)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										235
									
								
								configure.in
									
									
									
									
									
								
							
							
						
						
									
										235
									
								
								configure.in
									
									
									
									
									
								
							@@ -1,6 +1,6 @@
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
# Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
 | 
			
		||||
# Copyright (c)2001-2005 Alexander Barton <alex@barton.de>
 | 
			
		||||
#
 | 
			
		||||
# This program is free software; you can redistribute it and/or modify
 | 
			
		||||
# it under the terms of the GNU General Public License as published by
 | 
			
		||||
@@ -8,29 +8,30 @@
 | 
			
		||||
# (at your option) any later version.
 | 
			
		||||
# Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
#
 | 
			
		||||
# $Id: configure.in,v 1.89 2003/04/21 10:51:44 alex Exp $
 | 
			
		||||
# $Id: configure.in,v 1.111.2.6 2005/10/15 12:44:08 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
# -- Initialisierung --
 | 
			
		||||
# -- Initialisation --
 | 
			
		||||
 | 
			
		||||
AC_PREREQ(2.50)
 | 
			
		||||
AC_INIT(ngircd, CVSHEAD)
 | 
			
		||||
AC_INIT(ngircd, 0.9.2)
 | 
			
		||||
AC_CONFIG_SRCDIR(src/ngircd/ngircd.c)
 | 
			
		||||
AC_CANONICAL_TARGET
 | 
			
		||||
AM_INIT_AUTOMAKE(1.6)
 | 
			
		||||
AM_CONFIG_HEADER(src/config.h)
 | 
			
		||||
 | 
			
		||||
# -- Templates fuer config.h --
 | 
			
		||||
# -- Templates for config.h --
 | 
			
		||||
 | 
			
		||||
AH_TEMPLATE([DEBUG], [Define if debug-mode should be enabled])
 | 
			
		||||
AH_TEMPLATE([HAVE_socklen_t], [Define if socklen_t exists])
 | 
			
		||||
AH_TEMPLATE([SNIFFER], [Define if IRC sniffer should be enabled])
 | 
			
		||||
AH_TEMPLATE([STRICT_RFC], [Define if ngIRCd should behave strict RFC compliant])
 | 
			
		||||
AH_TEMPLATE([USE_SYSLOG], [Define if syslog should be used for logging])
 | 
			
		||||
AH_TEMPLATE([USE_ZLIB], [Define if zlib compression should be enabled])
 | 
			
		||||
AH_TEMPLATE([USE_TCPWRAP], [Define if TCP wrappers should be used])
 | 
			
		||||
AH_TEMPLATE([SYSLOG], [Define if syslog should be used for logging])
 | 
			
		||||
AH_TEMPLATE([ZLIB], [Define if zlib compression should be enabled])
 | 
			
		||||
AH_TEMPLATE([TCPWRAP], [Define if TCP wrappers should be used])
 | 
			
		||||
AH_TEMPLATE([IRCPLUS], [Define if IRC+ protocol should be used])
 | 
			
		||||
AH_TEMPLATE([RENDEZVOUS], [Define if Rendezvous support should be included])
 | 
			
		||||
AH_TEMPLATE([IDENTAUTH], [Define if the server should do IDENT requests])
 | 
			
		||||
 | 
			
		||||
AH_TEMPLATE([TARGET_OS], [Target operating system name])
 | 
			
		||||
AH_TEMPLATE([TARGET_VENDOR], [Target system vendor])
 | 
			
		||||
@@ -40,7 +41,7 @@ AH_TEMPLATE([TARGET_CPU], [Target CPU name])
 | 
			
		||||
 | 
			
		||||
AC_PROG_CC
 | 
			
		||||
 | 
			
		||||
# -- Hilfsprogramme --
 | 
			
		||||
# -- Helper programs --
 | 
			
		||||
 | 
			
		||||
AC_PROG_AWK
 | 
			
		||||
AC_PROG_INSTALL
 | 
			
		||||
@@ -50,38 +51,33 @@ AC_PROG_RANLIB
 | 
			
		||||
 | 
			
		||||
# -- Compiler Features --
 | 
			
		||||
 | 
			
		||||
AC_LANG_C
 | 
			
		||||
 | 
			
		||||
AM_C_PROTOTYPES
 | 
			
		||||
AC_C_CONST
 | 
			
		||||
 | 
			
		||||
# -- Defines --
 | 
			
		||||
# -- Hard coded system and compiler dependencies/features/options ... --
 | 
			
		||||
 | 
			
		||||
if test `uname` = "Linux"; then
 | 
			
		||||
	# define _POSIX_SOURCE, _GNU_SOURCE and _BSD_SOURCE when compiling
 | 
			
		||||
	# on Linux (glibc-based systems):
 | 
			
		||||
	AC_MSG_RESULT([detected Linux, defining _POSIX_SOURCE, _GNU_SOURCE and _BSD_SOURCE])
 | 
			
		||||
	add_DEFINES="-D_POSIX_SOURCE -D_GNU_SOURCE -D_BSD_SOURCE $add_DEFINES"
 | 
			
		||||
if test "$GCC" = "yes"; then
 | 
			
		||||
	# We are using the GNU C compiler. Good!
 | 
			
		||||
	CFLAGS="$CFLAGS -pipe -W -Wall -Wpointer-arith -Wstrict-prototypes"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if test `uname` = "A/UX"; then
 | 
			
		||||
	# define _POSIX_SOURCE when compiling on A/UX:
 | 
			
		||||
	AC_MSG_RESULT([detected A/UX, defining _POSIX_SOURCE])
 | 
			
		||||
	add_DEFINES="-D_POSIX_SOURCE $add_DEFINES"
 | 
			
		||||
fi
 | 
			
		||||
case "$target_os" in
 | 
			
		||||
	hpux*)
 | 
			
		||||
		# This is HP/UX, we need to define _XOPEN_SOURCE_EXTENDED
 | 
			
		||||
		# (tested with HP/UX 11.11)
 | 
			
		||||
		CFLAGS="$CFLAGS -D_XOPEN_SOURCE_EXTENDED"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
if test `uname` = "HP-UX"; then
 | 
			
		||||
	# define _XOPEN_SOURCE_EXTENDED when compiling on HP-UX (11.11):
 | 
			
		||||
	AC_MSG_RESULT([detected HP-UX, defining _XOPEN_SOURCE_EXTENDED])
 | 
			
		||||
	add_DEFINES="-D_XOPEN_SOURCE_EXTENDED $add_DEFINES"
 | 
			
		||||
fi
 | 
			
		||||
# Add additional CFLAGS, eventually specified on the command line:
 | 
			
		||||
test -n "$CFLAGS_ADD" && CFLAGS="$CFLAGS $CFLAGS_ADD"
 | 
			
		||||
 | 
			
		||||
# -- Header --
 | 
			
		||||
CFLAGS="$CFLAGS -DSYSCONFDIR='\"\$(sysconfdir)\"'"
 | 
			
		||||
 | 
			
		||||
# -- Headers --
 | 
			
		||||
 | 
			
		||||
AC_HEADER_STDC
 | 
			
		||||
 | 
			
		||||
AC_HEADER_TIME
 | 
			
		||||
 | 
			
		||||
AC_HEADER_SYS_WAIT
 | 
			
		||||
 | 
			
		||||
AC_CHECK_HEADERS([ \
 | 
			
		||||
@@ -89,14 +85,14 @@ AC_CHECK_HEADERS([ \
 | 
			
		||||
	strings.h sys/socket.h sys/time.h unistd.h \
 | 
			
		||||
	],,AC_MSG_ERROR([required C header missing!]))
 | 
			
		||||
 | 
			
		||||
AC_CHECK_HEADERS([arpa/inet.h ctype.h malloc.h stdint.h varargs.h])
 | 
			
		||||
AC_CHECK_HEADERS([arpa/inet.h ctype.h malloc.h stdbool.h stddef.h varargs.h])
 | 
			
		||||
 | 
			
		||||
# -- Datentypen --
 | 
			
		||||
# -- Datatypes --
 | 
			
		||||
 | 
			
		||||
AC_MSG_CHECKING(whether socklen_t exists)
 | 
			
		||||
AC_TRY_COMPILE([
 | 
			
		||||
	#include <sys/socket.h>
 | 
			
		||||
	#include <sys/types.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/socket.h>
 | 
			
		||||
	],[
 | 
			
		||||
	socklen_t a, b;
 | 
			
		||||
	a = 2; b = 4; a += b;
 | 
			
		||||
@@ -107,7 +103,6 @@ AC_TRY_COMPILE([
 | 
			
		||||
])
 | 
			
		||||
 | 
			
		||||
AC_TYPE_SIGNAL
 | 
			
		||||
 | 
			
		||||
AC_TYPE_SIZE_T
 | 
			
		||||
 | 
			
		||||
# -- Libraries --
 | 
			
		||||
@@ -116,31 +111,33 @@ AC_CHECK_LIB(UTIL,memmove)
 | 
			
		||||
AC_CHECK_LIB(socket,bind)
 | 
			
		||||
AC_CHECK_LIB(nsl,gethostent)
 | 
			
		||||
 | 
			
		||||
# -- Funktionen --
 | 
			
		||||
 | 
			
		||||
AC_FUNC_MALLOC
 | 
			
		||||
# -- Functions --
 | 
			
		||||
 | 
			
		||||
AC_FUNC_FORK
 | 
			
		||||
 | 
			
		||||
AC_FUNC_STRFTIME
 | 
			
		||||
 | 
			
		||||
AC_CHECK_FUNCS([ \
 | 
			
		||||
	bind gethostbyaddr gethostbyname gethostname inet_ntoa memmove \
 | 
			
		||||
	memset setsockopt socket strcasecmp strchr strerror strstr waitpid \
 | 
			
		||||
	],,AC_MSG_ERROR([required function missing!]))
 | 
			
		||||
	bind gethostbyaddr gethostbyname gethostname inet_ntoa malloc memmove \
 | 
			
		||||
	memset realloc setsid setsockopt socket strcasecmp strchr strerror \
 | 
			
		||||
	strstr waitpid],,AC_MSG_ERROR([required function missing!]))
 | 
			
		||||
 | 
			
		||||
AC_CHECK_FUNCS(inet_aton isdigit sigaction snprintf vsnprintf 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!])
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
# -- Konfigurationsoptionen --
 | 
			
		||||
# -- Configuration options --
 | 
			
		||||
 | 
			
		||||
x_syslog_on=no
 | 
			
		||||
AC_ARG_WITH(syslog,
 | 
			
		||||
	[  --without-syslog        disable syslog (autodetected by default)],
 | 
			
		||||
	[	if test "$withval" = "yes"; then
 | 
			
		||||
	[	if test "$withval" != "no"; then
 | 
			
		||||
			if test "$withval" != "yes"; then
 | 
			
		||||
				CFLAGS="-I$withval/include $CFLAGS"
 | 
			
		||||
				CPPFLAGS="-I$withval/include $CPPFLAGS"
 | 
			
		||||
				LDFLAGS="-L$withval/lib $LDFLAGS"
 | 
			
		||||
			fi
 | 
			
		||||
			AC_CHECK_LIB(be, syslog)
 | 
			
		||||
			AC_CHECK_FUNCS(syslog, x_syslog_on=yes,
 | 
			
		||||
				AC_MSG_ERROR([Can't enable syslog!])
 | 
			
		||||
@@ -153,14 +150,19 @@ AC_ARG_WITH(syslog,
 | 
			
		||||
	]
 | 
			
		||||
)
 | 
			
		||||
if test "$x_syslog_on" = "yes"; then
 | 
			
		||||
	AC_DEFINE(USE_SYSLOG, 1)
 | 
			
		||||
	AC_CHECK_HEADERS(syslog.h)
 | 
			
		||||
	AC_DEFINE(SYSLOG, 1)
 | 
			
		||||
	AC_CHECK_HEADERS(syslog.h,,AC_MSG_ERROR([required C header missing!]))
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
x_zlib_on=no
 | 
			
		||||
AC_ARG_WITH(zlib,
 | 
			
		||||
	[  --without-zlib          disable zlib compression (autodetected by default)],
 | 
			
		||||
	[	if test "$withval" = "yes"; then
 | 
			
		||||
	[	if test "$withval" != "no"; then
 | 
			
		||||
			if test "$withval" != "yes"; then
 | 
			
		||||
				CFLAGS="-I$withval/include $CFLAGS"
 | 
			
		||||
				CPPFLAGS="-I$withval/include $CPPFLAGS"
 | 
			
		||||
				LDFLAGS="-L$withval/lib $LDFLAGS"
 | 
			
		||||
			fi
 | 
			
		||||
			AC_CHECK_LIB(z, deflate)
 | 
			
		||||
			AC_CHECK_FUNCS(deflate, x_zlib_on=yes,
 | 
			
		||||
				AC_MSG_ERROR([Can't enable zlib!])
 | 
			
		||||
@@ -172,24 +174,30 @@ AC_ARG_WITH(zlib,
 | 
			
		||||
	]
 | 
			
		||||
)
 | 
			
		||||
if test "$x_zlib_on" = "yes"; then
 | 
			
		||||
	AC_DEFINE(USE_ZLIB, 1)
 | 
			
		||||
	AC_CHECK_HEADERS(zlib.h)
 | 
			
		||||
	AC_DEFINE(ZLIB, 1)
 | 
			
		||||
	AC_CHECK_HEADERS(zlib.h,,AC_MSG_ERROR([required C header missing!]))
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
x_tcpwrap_on=no
 | 
			
		||||
AC_ARG_WITH(tcp-wrappers,
 | 
			
		||||
	[  --with-tcp-wrappers     enable TCP wrappers support],
 | 
			
		||||
	[	if test "$withval" = "yes"; then
 | 
			
		||||
			AC_CHECK_LIB(wrap, tcpd_warn)
 | 
			
		||||
	[	if test "$withval" != "no"; then
 | 
			
		||||
			if test "$withval" != "yes"; then
 | 
			
		||||
				CFLAGS="-I$withval/include $CFLAGS"
 | 
			
		||||
				CPPFLAGS="-I$withval/include $CPPFLAGS"
 | 
			
		||||
				LDFLAGS="-L$withval/lib $LDFLAGS"
 | 
			
		||||
			fi
 | 
			
		||||
			AC_MSG_CHECKING(for hosts_access)
 | 
			
		||||
			LIBS="-lwrap $LIBS"
 | 
			
		||||
			AC_TRY_LINK([
 | 
			
		||||
				#include <tcpd.h>
 | 
			
		||||
#include <tcpd.h>
 | 
			
		||||
int allow_severity = 0;
 | 
			
		||||
int deny_severity = 0;
 | 
			
		||||
				],[
 | 
			
		||||
				void *ptr;
 | 
			
		||||
				ptr = hosts_access;
 | 
			
		||||
				tcpd_warn("link test");
 | 
			
		||||
				],[
 | 
			
		||||
				AC_MSG_RESULT(yes)
 | 
			
		||||
				AC_DEFINE(USE_TCPWRAP, 1)
 | 
			
		||||
				AC_DEFINE(TCPWRAP, 1)
 | 
			
		||||
				x_tcpwrap_on=yes
 | 
			
		||||
				],[
 | 
			
		||||
				AC_MSG_RESULT(no)
 | 
			
		||||
@@ -202,16 +210,69 @@ AC_ARG_WITH(tcp-wrappers,
 | 
			
		||||
x_rendezvous_on=no
 | 
			
		||||
AC_ARG_WITH(rendezvous,
 | 
			
		||||
	[  --with-rendezvous       enable support for "Rendezvous"],
 | 
			
		||||
	[	if test "$withval" = "yes"; then
 | 
			
		||||
			AC_CHECK_FUNCS(DNSServiceRegistrationCreate, x_rendezvous_on=yes,
 | 
			
		||||
				AC_MSG_ERROR([Can't enable Rendezvous!])
 | 
			
		||||
	[	if test "$withval" != "no"; then
 | 
			
		||||
			if test "$withval" != "yes"; then
 | 
			
		||||
				CFLAGS="-I$withval/include $CFLAGS"
 | 
			
		||||
				CPPFLAGS="-I$withval/include $CPPFLAGS"
 | 
			
		||||
				LDFLAGS="-L$withval/lib $LDFLAGS"
 | 
			
		||||
			fi
 | 
			
		||||
			AC_CHECK_FUNCS(DNSServiceRegistrationCreate, x_rendezvous_on=osx,
 | 
			
		||||
			[
 | 
			
		||||
				AC_CHECK_LIB(pthread, pthread_mutexattr_init)
 | 
			
		||||
				AC_CHECK_LIB(howl, sw_discovery_init)
 | 
			
		||||
				AC_CHECK_FUNCS(sw_discovery_init, \
 | 
			
		||||
				 x_rendezvous_on=howl, \
 | 
			
		||||
				 AC_MSG_ERROR([Can't enable Rendezvous!]))
 | 
			
		||||
			])
 | 
			
		||||
		fi
 | 
			
		||||
	]
 | 
			
		||||
)
 | 
			
		||||
if test "$x_rendezvous_on" = "osx"; then
 | 
			
		||||
	AC_CHECK_HEADERS([DNSServiceDiscovery/DNSServiceDiscovery.h \
 | 
			
		||||
	 mach/port.h],,AC_MSG_ERROR([required C header missing!]))
 | 
			
		||||
	AC_DEFINE(RENDEZVOUS, 1)
 | 
			
		||||
fi
 | 
			
		||||
if test "$x_rendezvous_on" = "howl"; then
 | 
			
		||||
	for dir in /usr/local/include /usr/local/include/howl* \
 | 
			
		||||
	 /usr/include /usr/include/howl*; do
 | 
			
		||||
	 	test -d "$dir" || continue
 | 
			
		||||
		AC_MSG_CHECKING([for Howl headers in $dir])
 | 
			
		||||
		if test -f "$dir/rendezvous/rendezvous.h"; then
 | 
			
		||||
			if test "$dir" != "/usr/local/include" -a \
 | 
			
		||||
			 "$dir" != "/usr/include"; then
 | 
			
		||||
				CFLAGS="-I$dir $CFLAGS"
 | 
			
		||||
				CPPFLAGS="-I$dir $CPPFLAGS"
 | 
			
		||||
			fi
 | 
			
		||||
			AC_MSG_RESULT(yes)
 | 
			
		||||
			break
 | 
			
		||||
		else
 | 
			
		||||
			AC_MSG_RESULT(no)
 | 
			
		||||
		fi
 | 
			
		||||
	done
 | 
			
		||||
	AC_CHECK_HEADERS([rendezvous/rendezvous.h],, \
 | 
			
		||||
	 AC_MSG_ERROR([required C header missing!]))
 | 
			
		||||
	AC_DEFINE(RENDEZVOUS, 1)
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
x_identauth_on=no
 | 
			
		||||
AC_ARG_WITH(ident,
 | 
			
		||||
	[  --with-ident            enable "IDENT" ("AUTH") protocol support],
 | 
			
		||||
	[	if test "$withval" != "no"; then
 | 
			
		||||
			if test "$withval" != "yes"; then
 | 
			
		||||
				CFLAGS="-I$withval/include $CFLAGS"
 | 
			
		||||
				CPPFLAGS="-I$withval/include $CPPFLAGS"
 | 
			
		||||
				LDFLAGS="-L$withval/lib $LDFLAGS"
 | 
			
		||||
			fi
 | 
			
		||||
			AC_CHECK_LIB(ident, ident_id)
 | 
			
		||||
			AC_CHECK_FUNCS(ident_id, x_identauth_on=yes,
 | 
			
		||||
				AC_MSG_ERROR([Can't enable IDENT support!])
 | 
			
		||||
			)
 | 
			
		||||
		fi
 | 
			
		||||
	]
 | 
			
		||||
)
 | 
			
		||||
if test "$x_rendezvous_on" = "yes"; then
 | 
			
		||||
	AC_DEFINE(RENDEZVOUS, 1)
 | 
			
		||||
	AC_CHECK_HEADERS(DNSServiceDiscovery/DNSServiceDiscovery.h mach/port.h)
 | 
			
		||||
if test "$x_identauth_on" = "yes"; then
 | 
			
		||||
	AC_DEFINE(IDENTAUTH, 1)
 | 
			
		||||
	AC_CHECK_HEADERS(ident.h,,AC_MSG_ERROR([required C header missing!]))
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
x_ircplus_on=yes
 | 
			
		||||
@@ -238,6 +299,7 @@ AC_ARG_ENABLE(debug,
 | 
			
		||||
)
 | 
			
		||||
if test "$x_debug_on" = "yes"; then
 | 
			
		||||
	AC_DEFINE(DEBUG, 1)
 | 
			
		||||
	test "$GCC" = "yes" && CFLAGS="-pedantic $CFLAGS"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
x_strict_rfc_on=no
 | 
			
		||||
@@ -249,31 +311,21 @@ AC_ARG_ENABLE(strict-rfc,
 | 
			
		||||
	fi
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
# -- Definitionen --
 | 
			
		||||
# -- Definitions --
 | 
			
		||||
 | 
			
		||||
AC_DEFINE_UNQUOTED(TARGET_CPU, "$target_cpu" )
 | 
			
		||||
AC_DEFINE_UNQUOTED(TARGET_VENDOR, "$target_vendor" )
 | 
			
		||||
AC_DEFINE_UNQUOTED(TARGET_OS, "$target_os" )
 | 
			
		||||
 | 
			
		||||
# -- Variablen --
 | 
			
		||||
# Add additional CFLAGS, eventually specified on the command line, but after
 | 
			
		||||
# running this configure script. Useful for "-Werror" for example.
 | 
			
		||||
test -n "$CFLAGS_END" && CFLAGS="$CFLAGS $CFLAGS_END"
 | 
			
		||||
 | 
			
		||||
if test "$GCC" = "yes"; then
 | 
			
		||||
	the_CFLAGS="-Wmissing-declarations -Wpointer-arith -Wstrict-prototypes"
 | 
			
		||||
	add_CFLAGS="-Wall -W -ansi -pedantic $CFLAGS $CFLAGS_ADD"
 | 
			
		||||
else
 | 
			
		||||
	the_CFLAGS="$CFLAGS"
 | 
			
		||||
	add_CFLAGS="$CFLAGS_ADD"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
CFLAGS="$the_CFLAGS $add_CFLAGS $add_DEFINES -DSYSCONFDIR='\"\$(sysconfdir)\"'"
 | 
			
		||||
 | 
			
		||||
# -- Ausgabe der Dateien --
 | 
			
		||||
# -- Generate files --
 | 
			
		||||
 | 
			
		||||
AC_OUTPUT([ \
 | 
			
		||||
	Makefile \
 | 
			
		||||
	doc/Makefile \
 | 
			
		||||
	MacOSX/Makefile \
 | 
			
		||||
	MacOSX/ngircd.pbproj/Makefile \
 | 
			
		||||
	src/Makefile \
 | 
			
		||||
	src/portab/Makefile \
 | 
			
		||||
	src/tool/Makefile \
 | 
			
		||||
@@ -281,12 +333,22 @@ AC_OUTPUT([ \
 | 
			
		||||
	src/testsuite/Makefile \
 | 
			
		||||
	man/Makefile \
 | 
			
		||||
	contrib/Makefile \
 | 
			
		||||
	contrib/Debian/Makefile \
 | 
			
		||||
	contrib/MacOSX/Makefile \
 | 
			
		||||
])
 | 
			
		||||
 | 
			
		||||
type dpkg >/dev/null 2>&1
 | 
			
		||||
if test $? -eq 0; then
 | 
			
		||||
	# Generate debian/ link if the dpkg command exists
 | 
			
		||||
	# (read: if we are running on a debian compatible system)
 | 
			
		||||
	echo "creating Debian-specific links ..."
 | 
			
		||||
	test -f debian/rules || ln -s contrib/Debian debian
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# -- Result --
 | 
			
		||||
 | 
			
		||||
echo
 | 
			
		||||
echo "ngIRCd has been configured with the following options:"
 | 
			
		||||
echo "ngIRCd $PACKAGE_VERSION has been configured with the following options:"
 | 
			
		||||
echo
 | 
			
		||||
 | 
			
		||||
# Someone please show me a better way :)  [borrowed by OpenSSH]
 | 
			
		||||
@@ -296,11 +358,10 @@ C=`eval echo ${sysconfdir}` ; C=`eval echo ${C}`
 | 
			
		||||
M=`eval echo ${mandir}` ; M=`eval echo ${M}`
 | 
			
		||||
D=`eval echo ${datadir}/doc/${PACKAGE}` ; D=`eval echo ${D}`
 | 
			
		||||
 | 
			
		||||
echo "               Host: ${host}"
 | 
			
		||||
echo "             Target: ${target}"
 | 
			
		||||
test "$target" != "$host" && echo "               Host: ${host}"
 | 
			
		||||
echo "           Compiler: ${CC}"
 | 
			
		||||
echo "     Compiler flags: ${the_CFLAGS}"
 | 
			
		||||
test -n "$add_CFLAGS"	&& echo "                     ${add_CFLAGS}"
 | 
			
		||||
test -n "$add_DEFINES"	&& echo "                     ${add_DEFINES}"
 | 
			
		||||
test -n "$CFLAGS"	&& echo "     Compiler flags: ${CFLAGS}"
 | 
			
		||||
test -n "$CPPFLAGS"	&& echo " Preprocessor flags: ${CPPFLAGS}"
 | 
			
		||||
test -n "$LDFLAGS"	&& echo "       Linker flags: ${LDFLAGS}"
 | 
			
		||||
test -n "$LIBS"		&& echo "          Libraries: ${LIBS}"
 | 
			
		||||
@@ -339,13 +400,19 @@ test "$x_strict_rfc_on" = "yes" \
 | 
			
		||||
	|| echo "no"
 | 
			
		||||
 | 
			
		||||
echo $ECHO_N " Rendezvous support: $ECHO_C"
 | 
			
		||||
test "$x_rendezvous_on" = "yes"	\
 | 
			
		||||
test "$x_rendezvous_on" = "osx" -o "$x_rendezvous_on" = "howl" \
 | 
			
		||||
	&& echo $ECHO_N "yes $ECHO_C" \
 | 
			
		||||
	|| echo $ECHO_N "no  $ECHO_C"
 | 
			
		||||
echo $ECHO_N "      IRC+ protocol: $ECHO_C"
 | 
			
		||||
test "$x_ircplus_on" = "yes" \
 | 
			
		||||
	&& echo "yes" \
 | 
			
		||||
	|| echo "no"
 | 
			
		||||
echo
 | 
			
		||||
 | 
			
		||||
echo $ECHO_N "      IDENT support: $ECHO_C"
 | 
			
		||||
test "$x_identauth_on" = "yes" \
 | 
			
		||||
	&& echo $ECHO_N "yes $ECHO_C" \
 | 
			
		||||
	|| echo $ECHO_N "no  $ECHO_C"
 | 
			
		||||
 | 
			
		||||
echo; echo
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										28
									
								
								contrib/Debian/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								contrib/Debian/Makefile.am
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
# Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
 | 
			
		||||
#
 | 
			
		||||
# This program is free software; you can redistribute it and/or modify
 | 
			
		||||
# it under the terms of the GNU General Public License as published by
 | 
			
		||||
# the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
# (at your option) any later version.
 | 
			
		||||
# Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile.am,v 1.4 2004/05/11 00:32:31 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST = rules changelog compat control copyright \
 | 
			
		||||
	ngircd.init ngircd.postinst
 | 
			
		||||
 | 
			
		||||
maintainer-clean-local:
 | 
			
		||||
	rm -f Makefile Makefile.in
 | 
			
		||||
 | 
			
		||||
clean-local:
 | 
			
		||||
	rm -f ngircd.postinst.debhelper ngircd.postrm.debhelper \
 | 
			
		||||
	 ngircd.prerm.debhelper ngircd.substvars
 | 
			
		||||
	rm -f ngircd-full.postinst.debhelper ngircd-full.postrm.debhelper \
 | 
			
		||||
	 ngircd-full.prerm.debhelper ngircd-full.substvars
 | 
			
		||||
	rm -rf ngircd ngircd-full
 | 
			
		||||
	rm -f files
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
							
								
								
									
										187
									
								
								contrib/Debian/changelog
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										187
									
								
								contrib/Debian/changelog
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,187 @@
 | 
			
		||||
ngircd (0.9.2-0ab1) stable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * New "upstream release" fixing a few bugs in 0.9.1.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Sat, 15 Oct 2005 14:10:34 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.9.1-0ab1) unstable; urgency=medium
 | 
			
		||||
 | 
			
		||||
  * New "upstream release" addressing two problems in ngIRCd 0.9.0.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Wed,  3 Aug 2005 15:10:41 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.9.0-0ab2) unstable; urgency=medium
 | 
			
		||||
 | 
			
		||||
  * Init script: fixed a problem with symbolic links in runlevel directories
 | 
			
		||||
    that could prevent the init script from working correctly.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Tue, 26 Jul 2005 21:31:18 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.9.0-0ab1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * New "upstream release".
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Sat,  24 Jul 2005 23:30:00 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.8.3-0ab1) unstable; urgency=high
 | 
			
		||||
 | 
			
		||||
  * New "upstream release", including security fixes.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Thu,  3 Feb 2005 10:41:55 +0100
 | 
			
		||||
 | 
			
		||||
ngircd (0.8.2-0ab1) unstable; urgency=high
 | 
			
		||||
 | 
			
		||||
  * New "upstream release", including security fixes.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Wed, 26 Jan 2005 23:14:12 +0100
 | 
			
		||||
 | 
			
		||||
ngircd (0.8.1-0ab1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * New "upstream release".
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Sat, 25 Dec 2004 01:18:32 +0100
 | 
			
		||||
 | 
			
		||||
ngircd (0.8.0-0ab2) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Added missing commas to debian control file, fixes bug #56.
 | 
			
		||||
    Thanks to Kevin Otte.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Thu, 15 Jul 2004 10:53:39 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.8.0-0ab1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * New upstream version.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Sat, 26 Jun 2004 11:25:59 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.7.7+HEAD-0ab6) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Incorporated actual CVS HEAD version which includes all features of
 | 
			
		||||
    version 0.8.0-pre1 and patches for the resolver and logger.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Tue, 11 May 2004 02:18:50 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.7.7+HEAD-0ab5) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Updates from CVS HEAD branch, most notably: "INVITE- and BAN-lists
 | 
			
		||||
    become synchronized between IRC+ servers when establishing new
 | 
			
		||||
    connections, if the peer supports this as well."
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Mon, 26 Apr 2004 01:53:15 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.7.7+HEAD-0ab4) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * This version includes fixes for INVITE command and the handling of the
 | 
			
		||||
    invite and ban lists from CVS-HEAD.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Fri,  9 Apr 2004 23:55:13 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.7.7+HEAD-0ab3) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Included MODE fix from CVS-HEAD branch.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Mon,  5 Apr 2004 13:09:24 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.7.7+HEAD-0ab2) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Incorporated more fixes and enhancements of CVS-HEAD version,
 | 
			
		||||
    e. g. better connection logging and fixed TRACE command.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Sat, 28 Feb 2004 03:20:32 +0100
 | 
			
		||||
 | 
			
		||||
ngircd (0.7.7+HEAD-0ab1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * New upstream version. This debian package includes all features of
 | 
			
		||||
    ngIRCd 0.7.7 and changes of the CVS-HEAD development tree.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Thu,  5 Feb 2004 15:23:22 +0100
 | 
			
		||||
 | 
			
		||||
ngircd (0.7.6+HEAD-0ab2) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Included new fixes and additions from the CVS-HEAD upstream branch,
 | 
			
		||||
    e. g. the setting of type of service (TOS) on sockets.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Mon, 26 Jan 2004 04:05:41 +0100
 | 
			
		||||
 | 
			
		||||
ngircd (0.7.6+HEAD-0ab1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Included all changes from the CVS-HEAD upstream version.
 | 
			
		||||
  * Restructured debian packaging system: now there are two packages, a
 | 
			
		||||
    "standard" version that includes all the default options and a "full"
 | 
			
		||||
    version that additionally includes support for TCP wrappers and IDENT
 | 
			
		||||
    lookups.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Thu,  1 Jan 2004 23:12:11 +0100
 | 
			
		||||
 | 
			
		||||
ngircd (0.7.6-0ab1) unstable; urgency=medium
 | 
			
		||||
 | 
			
		||||
  * New upstream version.
 | 
			
		||||
  * Changed version numvering scheme of debian package.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Fri,  5 Dec 2003 14:26:41 +0100
 | 
			
		||||
 | 
			
		||||
ngircd (0.7.5-0.2ab) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Updated RPM and Debian package description and configuration.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Sat, 29 Nov 2003 21:24:32 +0100
 | 
			
		||||
 | 
			
		||||
ngircd (0.7.5-0.1ab) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * New upstream version.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Fri,  7 Nov 2003 21:59:58 +0100
 | 
			
		||||
 | 
			
		||||
ngircd (0.7.1-0.1ab) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * New upstream version :-)
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Fri, 18 Jul 2003 22:53:02 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.7.0-0.7ab) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Fixed up post installation script (added interpreter, fixed chmod call).
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Sun, 13 Jul 2003 00:52:38 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.7.0-0.6ab) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Added /etc/default/ngircd.
 | 
			
		||||
  * Included own post installation script.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Sat, 12 Jul 2003 20:31:09 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.7.0-0.5ab) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Enhanced init script.
 | 
			
		||||
  * Included NJOIN fix from actual CVS "HEAD" branch.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Wed,  9 Jul 2003 22:40:49 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.7.0-0.4ab) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Reverted use of dh_installexamples.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Thu, 22 May 2003 00:15:03 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.7.0-0.3ab) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Removed "debian/docs" and "debian/conffiles"; debhelper takes care of
 | 
			
		||||
    this for us automagically.
 | 
			
		||||
  * Excluded "etc/ngircd.conf" from dh_fixperms.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@Arthur.Ath.CX>  Wed, 21 May 2003 23:25:05 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.7.0-0.2ab) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Fixed wrong variable substitution in init script.
 | 
			
		||||
  * Added some CVS "Id-Tags" (but not checked in, yet).
 | 
			
		||||
  * Removed own "Provides:" from control file.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Wed, 21 May 2003 12:32:34 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (0.7.0-0.1ab) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Initial Release.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Wed, 21 May 2003 02:36:52 +0200
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/Debian/compat
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/Debian/compat
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
4
 | 
			
		||||
							
								
								
									
										47
									
								
								contrib/Debian/control
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								contrib/Debian/control
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,47 @@
 | 
			
		||||
Source: ngircd
 | 
			
		||||
Section: net
 | 
			
		||||
Priority: optional
 | 
			
		||||
Maintainer: Alexander Barton <alex@barton.de>
 | 
			
		||||
Build-Depends: debhelper (>> 4.0.0), libz-dev, libwrap-dev, libident-dev
 | 
			
		||||
Standards-Version: 3.5.8
 | 
			
		||||
 | 
			
		||||
Package: ngircd
 | 
			
		||||
Architecture: any
 | 
			
		||||
Depends: ${shlibs:Depends}, ${misc:Depends}
 | 
			
		||||
Description: A lightweight daemon for the Internet Relay Chat (IRC)
 | 
			
		||||
 ngIRCd is a free open source daemon for the Internet Relay Chat (IRC)
 | 
			
		||||
 network. It is written from scratch and is not based upon the original
 | 
			
		||||
 IRCd like many others.
 | 
			
		||||
 .
 | 
			
		||||
 This package contains the "standard distribution", including support for
 | 
			
		||||
 syslog logging and compressed server-links using zlib.
 | 
			
		||||
 .
 | 
			
		||||
 Advantages of ngIRCd:
 | 
			
		||||
  - no problems with servers using changing/non-static IP addresses.
 | 
			
		||||
  - small and lean configuration file.
 | 
			
		||||
  - free, modern and open source C code.
 | 
			
		||||
  - still under active development.
 | 
			
		||||
 .
 | 
			
		||||
 ngIRCd is compatible to the "original" ircd 2.10.3p3, so you can run
 | 
			
		||||
 mixed networks.
 | 
			
		||||
 | 
			
		||||
Package: ngircd-full
 | 
			
		||||
Architecture: any
 | 
			
		||||
Depends: ${shlibs:Depends}, ${misc:Depends}
 | 
			
		||||
Conflicts: ngircd
 | 
			
		||||
Description: A lightweight daemon for the Internet Relay Chat (IRC)
 | 
			
		||||
 ngIRCd is a free open source daemon for the Internet Relay Chat (IRC)
 | 
			
		||||
 network. It is written from scratch and is not based upon the original
 | 
			
		||||
 IRCd like many others.
 | 
			
		||||
 .
 | 
			
		||||
 This package includes support for TCP wrappers and IDENT requests in
 | 
			
		||||
 addition to the features of the "standard package".
 | 
			
		||||
 .
 | 
			
		||||
 Advantages of ngIRCd:
 | 
			
		||||
  - no problems with servers using changing/non-static IP addresses.
 | 
			
		||||
  - small and lean configuration file.
 | 
			
		||||
  - free, modern and open source C code.
 | 
			
		||||
  - still under active development.
 | 
			
		||||
 .
 | 
			
		||||
 ngIRCd is compatible to the "original" ircd 2.10.3p3, so you can run
 | 
			
		||||
 mixed networks.
 | 
			
		||||
							
								
								
									
										13
									
								
								contrib/Debian/copyright
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								contrib/Debian/copyright
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
This package was debianized by Alexander Barton <alex@barton.de> on
 | 
			
		||||
Tue, 20 May 2003 15:47:40 +0200.
 | 
			
		||||
 | 
			
		||||
It was downloaded from ftp://Arthur.Ath.CX/pub/Users/alex/ngircd/
 | 
			
		||||
 | 
			
		||||
Upstream Author: Alexander Barton <alex@barton.de>
 | 
			
		||||
 | 
			
		||||
This software is copyright (c) 1999-2003 by Alexander Barton.
 | 
			
		||||
 | 
			
		||||
You are free to distribute this software under the terms of the
 | 
			
		||||
GNU General Public License.
 | 
			
		||||
On Debian systems, the complete text of the GNU General Public
 | 
			
		||||
License can be found in /usr/share/common-licenses/GPL file.
 | 
			
		||||
							
								
								
									
										12
									
								
								contrib/Debian/ngircd.default
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								contrib/Debian/ngircd.default
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
			
		||||
#
 | 
			
		||||
# Defaults for ngIRCd start and stop script
 | 
			
		||||
#
 | 
			
		||||
# $Id: ngircd.default,v 1.1 2003/12/31 17:20:11 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
# Parameters to pass to the ngircd daemon on startup, see ngircd(8) for
 | 
			
		||||
# possible options (default: empty).
 | 
			
		||||
 | 
			
		||||
PARAMS=""
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
							
								
								
									
										75
									
								
								contrib/Debian/ngircd.init
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										75
									
								
								contrib/Debian/ngircd.init
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,75 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd start and stop script for Debian-based systems
 | 
			
		||||
#
 | 
			
		||||
# $Id: ngircd.init,v 1.5.2.1 2005/07/26 19:30:54 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
 | 
			
		||||
DAEMON=/usr/sbin/ngircd
 | 
			
		||||
NAME=ngIRCd
 | 
			
		||||
DESC="IRC daemon"
 | 
			
		||||
PARAMS=""
 | 
			
		||||
 | 
			
		||||
test -h "$0" && me=`readlink $0` || me="$0"
 | 
			
		||||
BASENAME=`basename $me`
 | 
			
		||||
 | 
			
		||||
test -f /etc/default/$BASENAME && . /etc/default/$BASENAME
 | 
			
		||||
 | 
			
		||||
test -x $DAEMON || exit 0
 | 
			
		||||
 | 
			
		||||
Check_Config()
 | 
			
		||||
{
 | 
			
		||||
	$DAEMON --configtest >/dev/null 2>&1
 | 
			
		||||
	if [ $? -ne 0 ]; then
 | 
			
		||||
		echo "Configuration of $NAME is not valide, won't (re)start!"
 | 
			
		||||
		echo "Please run \"$DAEMON --configtest\" manually and fix it up ..."
 | 
			
		||||
		exit 1
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Try_Start()
 | 
			
		||||
{
 | 
			
		||||
	[ ! -d /var/run/ircd ] || chown irc:irc /var/run/ircd
 | 
			
		||||
	start-stop-daemon --start --quiet --exec $DAEMON -- $PARAMS
 | 
			
		||||
	if [ $? -ne 0 ]; then
 | 
			
		||||
		echo "$NAME failed!"
 | 
			
		||||
		exit 1
 | 
			
		||||
	fi
 | 
			
		||||
	echo "$NAME."
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
case "$1" in
 | 
			
		||||
  start)
 | 
			
		||||
	Check_Config
 | 
			
		||||
	echo -n "Starting $DESC: "
 | 
			
		||||
	Try_Start
 | 
			
		||||
	;;
 | 
			
		||||
  stop)
 | 
			
		||||
	echo -n "Stopping $DESC: "
 | 
			
		||||
	start-stop-daemon --stop --quiet --pidfile /var/run/ircd/ngircd.pid --exec $DAEMON \
 | 
			
		||||
	  && echo "$NAME." \
 | 
			
		||||
	  || echo "(none running)"
 | 
			
		||||
	;;
 | 
			
		||||
  reload|force-reload)
 | 
			
		||||
	Check_Config
 | 
			
		||||
	echo "Reloading $DESC configuration files."
 | 
			
		||||
	start-stop-daemon --stop --signal 1 --quiet --exec $DAEMON
 | 
			
		||||
	;;
 | 
			
		||||
  restart)
 | 
			
		||||
	Check_Config
 | 
			
		||||
	echo -n "Restarting $DESC: "
 | 
			
		||||
	start-stop-daemon --stop --quiet --oknodo --exec $DAEMON
 | 
			
		||||
	sleep 1
 | 
			
		||||
	Try_Start
 | 
			
		||||
	;;
 | 
			
		||||
  *)
 | 
			
		||||
	N=/etc/init.d/$NAME
 | 
			
		||||
	echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
 | 
			
		||||
	exit 1
 | 
			
		||||
	;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
exit 0
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
							
								
								
									
										14
									
								
								contrib/Debian/ngircd.postinst
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										14
									
								
								contrib/Debian/ngircd.postinst
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#
 | 
			
		||||
# Debian post-installation script
 | 
			
		||||
# $Id: ngircd.postinst,v 1.1 2003/12/31 17:20:11 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
if [ -f /etc/ngircd/ngircd.conf ]; then
 | 
			
		||||
	# make sure that configuration file is not world readable
 | 
			
		||||
	chmod o= /etc/ngircd/ngircd.conf
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
#DEBHELPER#
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
							
								
								
									
										172
									
								
								contrib/Debian/rules
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										172
									
								
								contrib/Debian/rules
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,172 @@
 | 
			
		||||
#!/usr/bin/make -f
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
# Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
 | 
			
		||||
#
 | 
			
		||||
# This program is free software; you can redistribute it and/or modify
 | 
			
		||||
# it under the terms of the GNU General Public License as published by
 | 
			
		||||
# the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
# (at your option) any later version.
 | 
			
		||||
# Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
#
 | 
			
		||||
# debian/rules for ngIRCd
 | 
			
		||||
#
 | 
			
		||||
# $Id: rules,v 1.3 2005/02/07 23:09:31 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
# Based on the sample debian/rules that uses debhelper,
 | 
			
		||||
# GNU copyright 1997 to 1999 by Joey Hess.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
# Uncomment this to turn on verbose mode.
 | 
			
		||||
#export DH_VERBOSE=1
 | 
			
		||||
 | 
			
		||||
# These are used for cross-compiling and for saving the configure script
 | 
			
		||||
# from having to guess our platform (since we know it already)
 | 
			
		||||
DEB_HOST_GNU_TYPE  ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
 | 
			
		||||
DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
 | 
			
		||||
 | 
			
		||||
CFLAGS = -Wall -g
 | 
			
		||||
 | 
			
		||||
ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
 | 
			
		||||
	CFLAGS += -O0
 | 
			
		||||
else
 | 
			
		||||
	CFLAGS += -O2
 | 
			
		||||
endif
 | 
			
		||||
ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
 | 
			
		||||
	INSTALL_PROGRAM += -s
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
configure-ngircd: configure
 | 
			
		||||
	dh_testdir
 | 
			
		||||
	
 | 
			
		||||
	# configure "standard" variant:
 | 
			
		||||
	./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) \
 | 
			
		||||
	  --prefix=/usr \
 | 
			
		||||
	  --sysconfdir=/etc/ngircd \
 | 
			
		||||
	  --mandir=\$${prefix}/share/man \
 | 
			
		||||
	  --with-syslog --with-zlib
 | 
			
		||||
 | 
			
		||||
configure-ngircd-full: configure
 | 
			
		||||
	dh_testdir
 | 
			
		||||
	
 | 
			
		||||
	# configure "full" variant:
 | 
			
		||||
	./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) \
 | 
			
		||||
	  --prefix=/usr \
 | 
			
		||||
	  --sysconfdir=/etc/ngircd \
 | 
			
		||||
	  --mandir=\$${prefix}/share/man \
 | 
			
		||||
	  --with-syslog --with-zlib --with-tcp-wrappers --with-ident
 | 
			
		||||
 | 
			
		||||
build:
 | 
			
		||||
	dh_clean -k
 | 
			
		||||
 | 
			
		||||
build-ngircd: build-stamp-ngircd
 | 
			
		||||
build-stamp-ngircd: configure-ngircd
 | 
			
		||||
	dh_testdir
 | 
			
		||||
	rm -f build-stamp-*
 | 
			
		||||
	
 | 
			
		||||
	# Add here commands to compile the "standard" package:
 | 
			
		||||
	$(MAKE)
 | 
			
		||||
	
 | 
			
		||||
	touch build-stamp-ngircd
 | 
			
		||||
 | 
			
		||||
build-ngircd-full: build-stamp-ngircd-full
 | 
			
		||||
build-stamp-ngircd-full: configure-ngircd-full
 | 
			
		||||
	dh_testdir
 | 
			
		||||
	rm -f build-stamp-*
 | 
			
		||||
	
 | 
			
		||||
	# Add here commands to compile the "full" package:
 | 
			
		||||
	$(MAKE)
 | 
			
		||||
	
 | 
			
		||||
	touch build-stamp-ngircd-full
 | 
			
		||||
 | 
			
		||||
clean:
 | 
			
		||||
	dh_testdir
 | 
			
		||||
	dh_testroot
 | 
			
		||||
	rm -f build-stamp*
 | 
			
		||||
	rm -f $(CURDIR)/debian/ngircd-full.default
 | 
			
		||||
	rm -f $(CURDIR)/debian/ngircd-full.init
 | 
			
		||||
	rm -f $(CURDIR)/debian/ngircd-full.postinst
 | 
			
		||||
	
 | 
			
		||||
	# Add here commands to clean up after the build process:
 | 
			
		||||
	-$(MAKE) clean
 | 
			
		||||
	
 | 
			
		||||
ifneq "$(wildcard /usr/share/misc/config.sub)" ""
 | 
			
		||||
	cp -f /usr/share/misc/config.sub config.sub
 | 
			
		||||
endif
 | 
			
		||||
ifneq "$(wildcard /usr/share/misc/config.guess)" ""
 | 
			
		||||
	cp -f /usr/share/misc/config.guess config.guess
 | 
			
		||||
endif
 | 
			
		||||
	dh_clean
 | 
			
		||||
 | 
			
		||||
install: install-ngircd install-ngircd-full
 | 
			
		||||
 | 
			
		||||
install-ngircd: build-ngircd
 | 
			
		||||
	dh_testdir
 | 
			
		||||
	dh_testroot
 | 
			
		||||
	dh_installdirs
 | 
			
		||||
	
 | 
			
		||||
	# Add here commands to install the "standard" package into debian/ngircd:
 | 
			
		||||
	$(MAKE) install DESTDIR=$(CURDIR)/debian/ngircd
 | 
			
		||||
	rm $(CURDIR)/debian/ngircd/usr/share/doc/ngircd/INSTALL*
 | 
			
		||||
	rm $(CURDIR)/debian/ngircd/usr/share/doc/ngircd/COPYING*
 | 
			
		||||
	mkdir -p $(CURDIR)/debian/ngircd/var/run/ircd
 | 
			
		||||
	cat $(CURDIR)/debian/ngircd/usr/share/doc/ngircd/sample-ngircd.conf | \
 | 
			
		||||
	 sed -e "s/;ServerUID = 65534/ServerUID = irc/g" | \
 | 
			
		||||
	 sed -e "s/;ServerGID = 65534/ServerGID = irc/g" | \
 | 
			
		||||
	 sed -e "s/;MotdFile = \/usr\/local\/etc\/ngircd.motd/MotdFile = \/etc\/ngircd\/ngircd.motd/g" | \
 | 
			
		||||
	 sed -e "s/;PidFile = \/var\/run\/ngircd\/ngircd.pid/PidFile = \/var\/run\/ircd\/ngircd.pid/g" \
 | 
			
		||||
	 >$(CURDIR)/debian/ngircd/etc/ngircd/ngircd.conf
 | 
			
		||||
	touch $(CURDIR)/debian/ngircd/etc/ngircd/ngircd.motd
 | 
			
		||||
 | 
			
		||||
install-ngircd-full: build-ngircd-full
 | 
			
		||||
	dh_testdir
 | 
			
		||||
	dh_testroot
 | 
			
		||||
	dh_installdirs
 | 
			
		||||
	
 | 
			
		||||
	# Add here commands to install the "full" package into debian/ngircd-full:
 | 
			
		||||
	$(MAKE) install DESTDIR=$(CURDIR)/debian/ngircd-full
 | 
			
		||||
	rm $(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd/INSTALL*
 | 
			
		||||
	rm $(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd/COPYING*
 | 
			
		||||
	mv $(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd \
 | 
			
		||||
	 $(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd-full
 | 
			
		||||
	mkdir -p $(CURDIR)/debian/ngircd-full/var/run/ircd
 | 
			
		||||
	cat $(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd-full/sample-ngircd.conf | \
 | 
			
		||||
	 sed -e "s/;ServerUID = 65534/ServerUID = irc/g" | \
 | 
			
		||||
	 sed -e "s/;ServerGID = 65534/ServerGID = irc/g" | \
 | 
			
		||||
	 sed -e "s/;MotdFile = \/usr\/local\/etc\/ngircd.motd/MotdFile = \/etc\/ngircd\/ngircd.motd/g" | \
 | 
			
		||||
	 sed -e "s/;PidFile = \/var\/run\/ngircd\/ngircd.pid/PidFile = \/var\/run\/ircd\/ngircd.pid/g" \
 | 
			
		||||
	 >$(CURDIR)/debian/ngircd-full/etc/ngircd/ngircd.conf
 | 
			
		||||
	touch $(CURDIR)/debian/ngircd-full/etc/ngircd/ngircd.motd
 | 
			
		||||
 | 
			
		||||
# Build architecture-independent files here.
 | 
			
		||||
binary-indep:
 | 
			
		||||
	# We have nothing to do by default.
 | 
			
		||||
 | 
			
		||||
# Build architecture-dependent files here.
 | 
			
		||||
binary-arch: build install
 | 
			
		||||
	ln -s $(CURDIR)/debian/ngircd.default \
 | 
			
		||||
	 $(CURDIR)/debian/ngircd-full.default
 | 
			
		||||
	ln -s $(CURDIR)/debian/ngircd.init \
 | 
			
		||||
	 $(CURDIR)/debian/ngircd-full.init
 | 
			
		||||
	ln -s $(CURDIR)/debian/ngircd.postinst \
 | 
			
		||||
	 $(CURDIR)/debian/ngircd-full.postinst
 | 
			
		||||
	
 | 
			
		||||
	dh_testdir
 | 
			
		||||
	dh_testroot
 | 
			
		||||
	dh_installchangelogs -a -A ChangeLog
 | 
			
		||||
	dh_installdocs -a
 | 
			
		||||
	dh_installinit -a
 | 
			
		||||
	dh_strip -a
 | 
			
		||||
	dh_compress -a
 | 
			
		||||
	dh_fixperms -a
 | 
			
		||||
	dh_installdeb -a
 | 
			
		||||
	dh_shlibdeps -a
 | 
			
		||||
	dh_gencontrol -a
 | 
			
		||||
	dh_md5sums -a
 | 
			
		||||
	dh_builddeb -a
 | 
			
		||||
 | 
			
		||||
binary: binary-indep binary-arch
 | 
			
		||||
 | 
			
		||||
.PHONY: build clean binary-indep binary-arch binary install 
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
							
								
								
									
										20
									
								
								contrib/MacOSX/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								contrib/MacOSX/Makefile.am
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
# Copyright (c)2001-2004 Alexander Barton <alex@barton.de>
 | 
			
		||||
#
 | 
			
		||||
# This program is free software; you can redistribute it and/or modify
 | 
			
		||||
# it under the terms of the GNU General Public License as published by
 | 
			
		||||
# the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
# (at your option) any later version.
 | 
			
		||||
# Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile.am,v 1.2 2004/05/11 00:34:26 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
clean-local:
 | 
			
		||||
	rm -rf build
 | 
			
		||||
 | 
			
		||||
maintainer-clean-local:
 | 
			
		||||
	rm -f Makefile Makefile.in
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
							
								
								
									
										1883
									
								
								contrib/MacOSX/ngIRCd.xcode/project.pbxproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1883
									
								
								contrib/MacOSX/ngIRCd.xcode/project.pbxproj
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,6 +1,6 @@
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
# Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
 | 
			
		||||
# Copyright (c)2001-2004 Alexander Barton <alex@barton.de>
 | 
			
		||||
#
 | 
			
		||||
# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
 | 
			
		||||
# der GNU General Public License (GPL), wie von der Free Software Foundation
 | 
			
		||||
@@ -9,10 +9,12 @@
 | 
			
		||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
 | 
			
		||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile.am,v 1.1 2002/10/01 09:57:08 alex Exp $
 | 
			
		||||
# $Id: Makefile.am,v 1.4 2004/04/28 12:18:02 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST = ngircd.spec
 | 
			
		||||
SUBDIRS = Debian MacOSX
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST = README ngircd.spec systrace.policy
 | 
			
		||||
 | 
			
		||||
maintainer-clean-local:
 | 
			
		||||
	rm -f Makefile Makefile.in
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										27
									
								
								contrib/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								contrib/README
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
			
		||||
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
 | 
			
		||||
                      (c)2001-2004 by Alexander Barton,
 | 
			
		||||
                    alex@barton.de, http://www.barton.de/
 | 
			
		||||
 | 
			
		||||
               ngIRCd is free software and published under the
 | 
			
		||||
                   terms of the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
                            -- Contributions --
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
MacOSX/
 | 
			
		||||
 - Project file for XCode "project builder" of Mac OS X.
 | 
			
		||||
 | 
			
		||||
Debian/
 | 
			
		||||
 - Various files for building Debian packages.
 | 
			
		||||
 | 
			
		||||
ngircd.spec
 | 
			
		||||
 - RPM "spec" file.
 | 
			
		||||
 | 
			
		||||
systrace.policy
 | 
			
		||||
 - Systrace policy file for OpenBSD (and probably NetBSD).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
--
 | 
			
		||||
$Id: README,v 1.1 2004/04/28 12:18:50 alex Exp $
 | 
			
		||||
@@ -1,9 +1,9 @@
 | 
			
		||||
%define name    ngircd
 | 
			
		||||
%define version CurrentCVS
 | 
			
		||||
%define version 0.9.2
 | 
			
		||||
%define release 1
 | 
			
		||||
%define prefix  %{_prefix}
 | 
			
		||||
 | 
			
		||||
Summary:      Next Generation Internet Relay Chat Daemon
 | 
			
		||||
Summary:      A lightweight daemon for the Internet Relay Chat (IRC)
 | 
			
		||||
Name:         %{name}
 | 
			
		||||
Version:      %{version}
 | 
			
		||||
Release:      %{release}
 | 
			
		||||
@@ -15,17 +15,18 @@ Packager:     Sean Reifschneider <jafo-rpms@tummy.com>
 | 
			
		||||
BuildRoot:    /var/tmp/%{name}-root
 | 
			
		||||
 | 
			
		||||
%description
 | 
			
		||||
ngIRCd is a free open source daemon for Internet Relay Chat (IRC),
 | 
			
		||||
ngIRCd is a free open source daemon for the Internet Relay Chat (IRC),
 | 
			
		||||
developed under the GNU General Public License (GPL). It's written from
 | 
			
		||||
scratch and is not based upon the original IRCd like many others.
 | 
			
		||||
 | 
			
		||||
Why should you use ngIRCd? Because ...
 | 
			
		||||
Advantages:
 | 
			
		||||
 - no problems with servers using changing/non-static IP addresses.
 | 
			
		||||
 - small and lean configuration file.
 | 
			
		||||
 - free, modern and open source C code.
 | 
			
		||||
 - still under active development.
 | 
			
		||||
 | 
			
		||||
   * ... there are no problems with servers on changing or non-static IP
 | 
			
		||||
         addresses.
 | 
			
		||||
   * ... there is a small and lean configuration file.
 | 
			
		||||
   * ... there is a free, modern and open source C source code.
 | 
			
		||||
   * ... it is still under active development. 
 | 
			
		||||
ngIRCd is compatible to the "original" ircd 2.10.3p3, so you can run
 | 
			
		||||
mixed networks.
 | 
			
		||||
 | 
			
		||||
%prep
 | 
			
		||||
%setup
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										77
									
								
								contrib/systrace.policy
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								contrib/systrace.policy
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,77 @@
 | 
			
		||||
#
 | 
			
		||||
# Sample systrace policy for ngIRCd on OpenBSD
 | 
			
		||||
# Author: Benjamin Pineau <ben@zouh.org>
 | 
			
		||||
#
 | 
			
		||||
# $Id: systrace.policy,v 1.1 2004/04/28 12:16:59 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
# Tune me, put me in /etc/systrace/usr_local_bin_ngircd and start ngIRCd
 | 
			
		||||
# (with root privileges) as:
 | 
			
		||||
#
 | 
			
		||||
#   systrace -a /usr/local/bin/ngircd
 | 
			
		||||
#
 | 
			
		||||
# I didn't tried this on NetBSD, but it should work as is.
 | 
			
		||||
#
 | 
			
		||||
# On systems with pf, it can be supplemented by strict firewall rules:
 | 
			
		||||
# for a ngircd running as '$ircuser', binding on '$ircport' and accepting
 | 
			
		||||
# 30 connections:
 | 
			
		||||
#
 | 
			
		||||
#   block out log quick proto tcp from any port $ircport to any \
 | 
			
		||||
#    user != $ircuser
 | 
			
		||||
#   pass in inet proto tcp from any to any port $ircport user $ircuser \
 | 
			
		||||
#    keep state (max 30) flags S/SA
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
Policy: /usr/local/bin/ngircd, Emulation: native
 | 
			
		||||
	native-__sysctl: permit
 | 
			
		||||
	native-fsread: filename eq "/etc/malloc.conf" then permit
 | 
			
		||||
	native-fsread: filename sub "/usr/share/zoneinfo/" then permit
 | 
			
		||||
	native-fsread: filename eq "/usr/local/etc/ngircd.conf" then permit
 | 
			
		||||
	native-fsread: filename eq "/usr/local/etc/ngircd.motd" then permit
 | 
			
		||||
	native-fsread: filename eq "/etc/ngircd.conf" then permit
 | 
			
		||||
	native-fsread: filename eq "/etc/ngircd.motd" then permit
 | 
			
		||||
	native-fsread: filename eq "/etc/spwd.db" then deny[eperm]
 | 
			
		||||
	native-fsread: filename eq "/etc/group" then permit
 | 
			
		||||
	native-fsread: filename eq "/etc/resolv.conf" then permit
 | 
			
		||||
	native-fsread: filename eq "/etc/localtime" then permit
 | 
			
		||||
	native-fsread: filename eq "/etc/hosts" then permit
 | 
			
		||||
	native-fsread: filename sub "<non-existent filename>" then deny[enoent]
 | 
			
		||||
	native-socket: sockdom eq "AF_UNIX" and socktype eq "SOCK_DGRAM" then permit
 | 
			
		||||
	native-socket: sockdom eq "AF_INET" and socktype eq "SOCK_STREAM" then permit
 | 
			
		||||
	native-bind: sockaddr match "inet-*:6667" then permit, if user != root
 | 
			
		||||
	native-connect: sockaddr eq "/dev/log" then permit, if user != root
 | 
			
		||||
	native-connect: sockaddr match "inet-*:53" then permit, if user != root
 | 
			
		||||
	native-setsockopt: permit, if user != root
 | 
			
		||||
	native-listen: permit, if user != root
 | 
			
		||||
	native-accept: permit, if user != root
 | 
			
		||||
	native-sendto: true then permit, if user != root
 | 
			
		||||
	native-recvfrom: permit, if user != root
 | 
			
		||||
	native-read: permit
 | 
			
		||||
	native-pread: permit
 | 
			
		||||
	native-write: permit, if user != root
 | 
			
		||||
	native-mmap: permit
 | 
			
		||||
	native-munmap: permit
 | 
			
		||||
	native-mprotect: permit
 | 
			
		||||
	native-break: permit
 | 
			
		||||
	native-umask: permit
 | 
			
		||||
	native-fork: permit
 | 
			
		||||
	native-setsid: permit
 | 
			
		||||
	native-chdir: permit
 | 
			
		||||
	native-chroot: permit
 | 
			
		||||
	native-setgid: gid neq "0" then permit
 | 
			
		||||
	native-setuid: uid neq "0" and uname neq "root" then permit
 | 
			
		||||
	native-getuid: permit
 | 
			
		||||
	native-getgid: permit
 | 
			
		||||
	native-gettimeofday: permit
 | 
			
		||||
	native-getpid: permit
 | 
			
		||||
	native-select: permit
 | 
			
		||||
	native-fcntl: permit
 | 
			
		||||
	native-fstat: permit
 | 
			
		||||
	native-issetugid: permit
 | 
			
		||||
	native-sigaction: permit
 | 
			
		||||
	native-pipe: permit
 | 
			
		||||
	native-sigreturn: permit
 | 
			
		||||
	native-close: permit
 | 
			
		||||
	native-exit: permit
 | 
			
		||||
	native-fswrite: deny[eperm]
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
							
								
								
									
										30
									
								
								doc/FAQ.txt
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								doc/FAQ.txt
									
									
									
									
									
								
							@@ -17,7 +17,11 @@ A: Yes. ngIRCd is compatible to the original ircd used by IRCNet. Actually
 | 
			
		||||
   this is being tested with version 2.10.3p3.
 | 
			
		||||
 | 
			
		||||
Q: Is there a homepage with further information and downloads?
 | 
			
		||||
A: Yes. Please visit <http://arthur.ath.cx/~alex/ngircd/>.
 | 
			
		||||
A: Yes. Please visit <http://ngircd.barton.de/>.
 | 
			
		||||
 | 
			
		||||
Q: Why should I use ngIRCd instead of the original one?
 | 
			
		||||
A: ngIRCd offers several benefits: no problems with dynamic IPs, easy to
 | 
			
		||||
   configure, open source (GPL), under active development.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
II. Compilation
 | 
			
		||||
@@ -47,17 +51,29 @@ A: Most probably you are using version 1.5 of GNU automake which seems to be
 | 
			
		||||
   1.4 of GNU automake shipped with this distribution; it should work, too.)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
III. Bugs!?
 | 
			
		||||
~~~~~~~~~~~
 | 
			
		||||
III. Runtime
 | 
			
		||||
~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Q: I cannot connect to remote peers when I use the chroot option, the
 | 
			
		||||
   following is logged: "Can't resolve example.com: unknown error!".
 | 
			
		||||
A: On Linux/glibc with chroot enabled you need to put some libraries inside
 | 
			
		||||
   the chroot as well, notably libnss_dns; maybe others. Unfortunately, even
 | 
			
		||||
   linking ngircd statically does not help this. The only known workaround
 | 
			
		||||
   is to either disable chroot support or to link against dietlibc instead
 | 
			
		||||
   of glibc. (tnx to Sebastian Siewior)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
IV. Bugs!?
 | 
			
		||||
~~~~~~~~~~
 | 
			
		||||
Q: Is there a list of known bugs and desired feature enhancements?
 | 
			
		||||
A: Yes. Have a look at the bug tracking system (Bugzilla) for ngIRCd located
 | 
			
		||||
   at <http://arthur.ath.cx/bugzilla/ngircd/>. There you can file bug reports
 | 
			
		||||
   and feature requests as well as search the bug database.
 | 
			
		||||
   at <http://ngircd.barton.de/bugzilla/index.cgi>. There you can file bug
 | 
			
		||||
   reports and feature requests as well as search the bug database.
 | 
			
		||||
 | 
			
		||||
Q: What should I do if I found a bug?
 | 
			
		||||
A: Please file a bug report at <http://arthur.ath.cx/bugzilla/ngircd/>!
 | 
			
		||||
A: Please file a bug report at <http://ngircd.barton.de/bugzilla/index.cgi>!
 | 
			
		||||
   The author of the particular component will be notified automagically :-)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- 
 | 
			
		||||
$Id: FAQ.txt,v 1.5 2003/04/05 11:37:17 alex Exp $
 | 
			
		||||
$Id: FAQ.txt,v 1.7.4.1 2005/07/09 14:41:39 alex Exp $
 | 
			
		||||
 
 | 
			
		||||
@@ -9,15 +9,18 @@
 | 
			
		||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
 | 
			
		||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile.am,v 1.16 2003/04/21 08:01:29 alex Exp $
 | 
			
		||||
# $Id: Makefile.am,v 1.18 2005/04/27 07:52:29 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST = CVS.txt FAQ.txt Protocol.txt README-AUX.txt \
 | 
			
		||||
	README-BeOS.txt RFC.txt sample-ngircd.conf
 | 
			
		||||
EXTRA_DIST = CVS.txt FAQ.txt Protocol.txt Platforms.txt \
 | 
			
		||||
	README-AUX.txt README-BeOS.txt RFC.txt sample-ngircd.conf
 | 
			
		||||
 | 
			
		||||
maintainer-clean-local:
 | 
			
		||||
	rm -f Makefile Makefile.in
 | 
			
		||||
 | 
			
		||||
distclean-local:
 | 
			
		||||
	rm -rf src
 | 
			
		||||
 | 
			
		||||
docdir = $(datadir)/doc/$(PACKAGE)
 | 
			
		||||
 | 
			
		||||
documents = $(EXTRA_DIST) ../AUTHORS ../COPYING ../ChangeLog ../INSTALL \
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										65
									
								
								doc/Platforms.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								doc/Platforms.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,65 @@
 | 
			
		||||
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
 | 
			
		||||
                        (c)2001-2005 Alexander Barton
 | 
			
		||||
                    alex@barton.de, http://www.barton.de/
 | 
			
		||||
 | 
			
		||||
               ngIRCd is free software and published under the
 | 
			
		||||
                   terms of the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
                              -- Platforms.txt --
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
This file lists the status of all platforms on which the ngIRCd has been
 | 
			
		||||
tested. Included is the date and version of the last "official" test and
 | 
			
		||||
the name of the tester/maintainer.
 | 
			
		||||
 | 
			
		||||
If you successfully compiled and tested ngIRCd on a platform that isn't
 | 
			
		||||
listed here, please contact Alexander Barton, <alex@barton.de>, so that this
 | 
			
		||||
list can be updated. Thanks for your help!
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                              the executable works ("runs") as expected --+
 | 
			
		||||
                                tests run successfully ("make check") --+ |
 | 
			
		||||
                                           ngIRCd compiles ("make") --+ | |
 | 
			
		||||
                                                ./configure works --+ | | |
 | 
			
		||||
                                                                    | | | |
 | 
			
		||||
Platform                    Compiler     ngIRCd     Date     Tester C M T R See
 | 
			
		||||
--------------------------- ------------ ---------- -------- ------ - - - - ---
 | 
			
		||||
hppa/unknown/openbsd3.5     gcc 2.95.3   CVSHEAD    04-05-25 alex   Y Y Y Y
 | 
			
		||||
hppa1.1/unknown/linux-gnu   gcc 3.3.3    0.8.0      04-05-30 alex   Y Y Y Y
 | 
			
		||||
hppa2.0/unknown/linux-gnu   gcc 3.3.5    0.9.x-CVS  05-06-27 alex   Y Y Y Y
 | 
			
		||||
i386/pc/solaris2.9          gcc 3.2.2    CVSHEAD    04-02-24 alex   Y Y Y Y
 | 
			
		||||
i386/unknown/freebsd5.2.1   gcc 3.3.3    0.8.0      04-05-30 alex   Y Y Y Y
 | 
			
		||||
i386/unknown/gnu0.3         gcc 3.3.3    0.8.0      04-05-30 alex   Y Y n Y
 | 
			
		||||
i386/unknown/netbsdelf1.6.1 gcc 2.95.3   CVSHEAD    04-02-24 alex   Y Y Y Y
 | 
			
		||||
i686/pc/cygwin              gcc 3.3.1    0.9.x-CVS  05-07-08 alex   Y Y n Y
 | 
			
		||||
i686/pc/linux-gnu           gcc 2.95.4   0.8.0      04-05-30 alex   Y Y Y Y (1)
 | 
			
		||||
i686/pc/linux-gnu           gcc 3.3.5    0.9.x-CVS  05-07-09 alex   Y Y Y Y (1)
 | 
			
		||||
m68k/apple/aux3.1.1         Orig. A/UX   0.7.x-CVS  03-04-22 alex   Y Y Y Y (2)
 | 
			
		||||
m68k/hp/hp-ux9.10           Orig. HPUX   0.7.x-CVS  03-04-30 goetz  Y Y Y Y
 | 
			
		||||
m88k/dg/dgux5.4R3.10        gcc 2.5.8    CVSHEAD    04-03-15 alex   Y Y ? ?
 | 
			
		||||
powerpc/apple/darwin6.5     gcc 3.1      0.7.x-CVS  03-04-23 alex   Y Y Y Y
 | 
			
		||||
powerpc/apple/darwin7.4.0   gcc 3.3      0.8.0      04-05-30 alex   Y Y Y Y
 | 
			
		||||
powerpc/apple/darwin8.1.0   gcc 4.0      0.9.x-CVS  05-06-27 alex   Y Y Y Y
 | 
			
		||||
powerpc/unknown/linux-gnu   gcc 3.3.3    0.8.0      04-05-30 alex   Y Y Y Y
 | 
			
		||||
sparc/sun/solaris2.6        gcc 2.95.3   0.7.x-CVS  03-04-22 alex   Y Y Y Y
 | 
			
		||||
sparc/sun/solaris2.7        gcc 3.3      0.8.0      04-05-30 alex   Y Y Y Y
 | 
			
		||||
sparc/unkn./netbsdelf1.6.1  gcc 2.95.3   0.8.0      04-05-30 alex   Y Y Y Y
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Notes
 | 
			
		||||
~~~~~
 | 
			
		||||
(1) i686/pc/linux-gnu:
 | 
			
		||||
    ngIRCd has been tested with various Linux distributions, such as SuSE,
 | 
			
		||||
    RedHat, Debian, and Gentoo using Kernels 2.2.x, 2.4.x and 2.6.x with
 | 
			
		||||
    various versions of the GNU C compiler (2.95.3, 3.0, 3.2, and 3.3). The
 | 
			
		||||
    eldest glibc used was glibc-2.0.7. ngIRCd compiled and run on all these
 | 
			
		||||
    systems without problems.
 | 
			
		||||
 | 
			
		||||
(2) This compiler is an pre-ANSI C compiler, therefore the source code is
 | 
			
		||||
    automatically converted using the included ansi2knr tool while building.
 | 
			
		||||
			
 | 
			
		||||
 | 
			
		||||
-- 
 | 
			
		||||
$Id: Platforms.txt,v 1.13.2.2 2005/07/09 11:16:38 alex Exp $
 | 
			
		||||
@@ -22,9 +22,10 @@ in all details. But because the ngIRCd should be a fully compatible
 | 
			
		||||
replacement for this server ("ircd") it tries to emulate these differences.
 | 
			
		||||
 | 
			
		||||
If you don't like this behavior please ./configure the ngIRCd using the
 | 
			
		||||
"--enable-strict-rfc" command line option. But please not: not all IRC
 | 
			
		||||
clients are compatible with such an server, some can't even connect at all!
 | 
			
		||||
Therefore this option isn't desired for "normal operation".
 | 
			
		||||
"--enable-strict-rfc" command line option. But keep in mind: not all IRC
 | 
			
		||||
clients are compatible with a server configured that way, some can't even
 | 
			
		||||
connect at all! Therefore this option usually isn't desired for "normal
 | 
			
		||||
server operation".
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
II. The IRC+ Protocol
 | 
			
		||||
@@ -35,8 +36,8 @@ as defined in RFC 2810-2813. This enhanced protocol is named "IRC+". It is
 | 
			
		||||
backwards compatible to the "plain" IRC protocol and will only be used by
 | 
			
		||||
the ngIRCd if it detects that the peer supports it as well.
 | 
			
		||||
 | 
			
		||||
The "PASSV" command is used to detect the protocol and peer versions (see
 | 
			
		||||
RFC 2813, section 4.1.1).
 | 
			
		||||
The "PASS" command is used to detect the protocol and peer versions see
 | 
			
		||||
RFC 2813 (section 4.1.1) and below.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
II.1 Register new server link
 | 
			
		||||
@@ -57,9 +58,11 @@ The following optional(!) 10 bytes contain an implementation-dependent
 | 
			
		||||
version number. Servers supporting the IRC+ protocol as defined in this
 | 
			
		||||
document provide the string "-IRC+" here.
 | 
			
		||||
 | 
			
		||||
Example for <version>: "0210-IRC+".
 | 
			
		||||
 | 
			
		||||
<flags> consists of two parts separated with the character "|" and is at
 | 
			
		||||
most 100 bytes long. The first part contains the name of the implementation
 | 
			
		||||
(ngIRCd sets this to "ngIRCd", the original ircd to "IRC", e.g.). The second
 | 
			
		||||
(ngIRCd sets this to "ngircd", the original ircd to "IRC", e.g.). The second
 | 
			
		||||
part is implementation-dependent and should only be parsed if the peer
 | 
			
		||||
supports the IRC+ protocol as well. In this case the following syntax is
 | 
			
		||||
used: "<serverversion>[:<serverflags>]".
 | 
			
		||||
@@ -68,15 +71,23 @@ used: "<serverversion>[:<serverflags>]".
 | 
			
		||||
number, <serverflags> indicates the supported IRC+ protocol extensions (and
 | 
			
		||||
may be empty!).
 | 
			
		||||
 | 
			
		||||
The optional parameter <options> is used to propagate server options as
 | 
			
		||||
defined in RFC 2813, section 4.1.1.
 | 
			
		||||
 | 
			
		||||
The following <serverflags> are defined at the moment:
 | 
			
		||||
 | 
			
		||||
- C: The server supports the CHANINFO command.
 | 
			
		||||
 | 
			
		||||
- L: INVITE- and BAN-lists should be synchronized between servers: if the
 | 
			
		||||
     peer understands this flag, it will send "MODE +I" and "MODE +b"
 | 
			
		||||
     commands after the server link has been established.
 | 
			
		||||
 | 
			
		||||
- o: IRC operators are allowed to change channel- and channel-user-modes
 | 
			
		||||
     even if they aren't channel-operator of the affected channel.
 | 
			
		||||
 | 
			
		||||
- C: The server supports the CHANINFO command.
 | 
			
		||||
- Z: Compressed server links are supported by the server.
 | 
			
		||||
 | 
			
		||||
Example for a complete <flags> string: "ngircd|0.7.5:CZ".
 | 
			
		||||
 | 
			
		||||
The optional parameter <options> is used to propagate server options as
 | 
			
		||||
defined in RFC 2813, section 4.1.1.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
II.2 Exchange channel-modes, topics, and persistent channels
 | 
			
		||||
@@ -104,4 +115,4 @@ channel mode). In this case <limit> should be "0".
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- 
 | 
			
		||||
$Id: Protocol.txt,v 1.9 2003/04/21 12:48:40 alex Exp $
 | 
			
		||||
$Id: Protocol.txt,v 1.12 2004/04/25 15:44:10 alex Exp $
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
 | 
			
		||||
                    ngIRCd - Next Generation IRC Server
 | 
			
		||||
 | 
			
		||||
                     (c)2001-2003 by Alexander Barton,
 | 
			
		||||
                      (c)2001-2005 Alexander Barton,
 | 
			
		||||
                   alex@barton.de, http://www.barton.de/
 | 
			
		||||
 | 
			
		||||
               ngIRCd is free software and published under the
 | 
			
		||||
@@ -22,7 +22,7 @@ The following software packages are needed:
 | 
			
		||||
 - GNU sed
 | 
			
		||||
   Source:
 | 
			
		||||
   http://www.rezepte-im-web.de/appleux/sed-3.02.tar.gz
 | 
			
		||||
   ftp://arthur.ath.cx/pub/AUX/Software/Tools/sed-3.02.tar.gz
 | 
			
		||||
   ftp://arthur.barton.de/pub/UNIX/AUX/Tools/sed-3.02.tar.gz
 | 
			
		||||
 | 
			
		||||
   A/UX comes with /bin/sed which isn't supporting all functions needed
 | 
			
		||||
   by GNU automake/autoconf.
 | 
			
		||||
@@ -33,8 +33,8 @@ The following software packages are needed:
 | 
			
		||||
 | 
			
		||||
 - libUTIL.a
 | 
			
		||||
   Source:
 | 
			
		||||
   http://ftp.mayn.de/pub/apple/apple_unix/Sys_stuff/libUTIL-2.1.tar.gz
 | 
			
		||||
   ftp://arthur.ath.cx/pub/AUX/Software/Libraries/libUTIL-2.1.tar.gz
 | 
			
		||||
   ftp://ftp.mayn.de/pub/really_old_stuff/apple/apple_unix/Sys_stuff/libUTIL-2.1.tar.gz>
 | 
			
		||||
   ftp://arthur.barton.de/pub/UNIX/AUX/Libraries/libUTIL-2.1.tar.gz
 | 
			
		||||
 | 
			
		||||
   This library contains functions that are common on other UNIX
 | 
			
		||||
   systems but not on A/UX e.g. memmove(), strerror() und strdup().
 | 
			
		||||
@@ -50,7 +50,7 @@ A few hints in case of errors:
 | 
			
		||||
   (so 'configure' uses its own shell script) or use a fully functionable one.
 | 
			
		||||
   There's at least one binary "out there" causing problems. The one
 | 
			
		||||
   of the GNU fileutils works fine:
 | 
			
		||||
   ftp://arthur.ath.cx/pub/UNIX/AUX/Software/Tools/fileutils-4.0.tar.gz
 | 
			
		||||
   ftp://arthur.barton.de/pub/UNIX/AUX/Software/Tools/fileutils-4.0.tar.gz
 | 
			
		||||
 | 
			
		||||
 - The precompiled binary of the old 'bash' shouldn't be installed within
 | 
			
		||||
   /bin (better do this in /usr/local/bin) because 'configure' would
 | 
			
		||||
@@ -64,4 +64,4 @@ A few hints in case of errors:
 | 
			
		||||
   even if you don't use ngIRCd.
 | 
			
		||||
 | 
			
		||||
-- 
 | 
			
		||||
$Id: README-AUX.txt,v 1.8 2003/04/21 21:59:34 goetz Exp $
 | 
			
		||||
$Id: README-AUX.txt,v 1.9 2005/06/24 20:59:13 alex Exp $
 | 
			
		||||
 
 | 
			
		||||
@@ -10,10 +10,10 @@
 | 
			
		||||
                             -- README-BeOS.txt --
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      +--------------------------------------------------------------+
 | 
			
		||||
      | This text is only available in german at the moment, sorry!  |
 | 
			
		||||
      | Contributors are welcome :-)                                 |
 | 
			
		||||
      +--------------------------------------------------------------+
 | 
			
		||||
      +-------------------------------------------------------------+
 | 
			
		||||
      | This text is only available in german at the moment, sorry! |
 | 
			
		||||
      | Contributors for this text or the BeOS port are welcome :-) |
 | 
			
		||||
      +-------------------------------------------------------------+
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
BeOS gehoert im Moment (noch?) nicht zu den offiziell unterstuetzten Plat-
 | 
			
		||||
@@ -50,4 +50,4 @@ mir in Verbindung setzen (alex@barton.de), ich maile gerne meine Patches zu.
 | 
			
		||||
Fuer eine Aenderung im CVS ist es aber meiner Meinung nach noch zu frueh ...
 | 
			
		||||
 | 
			
		||||
-- 
 | 
			
		||||
$Id: README-BeOS.txt,v 1.6 2003/04/21 12:55:39 alex Exp $
 | 
			
		||||
$Id: README-BeOS.txt,v 1.7 2003/05/15 21:47:57 alex Exp $
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										58
									
								
								doc/SSL.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								doc/SSL.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,58 @@
 | 
			
		||||
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
 | 
			
		||||
                      (c)2001-2004 by Alexander Barton,
 | 
			
		||||
                    alex@barton.de, http://www.barton.de/
 | 
			
		||||
 | 
			
		||||
               ngIRCd is free software and published under the
 | 
			
		||||
                   terms of the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
                                 -- SSL.txt --
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ngIRCd actually doesn't support secure connections for client-server or
 | 
			
		||||
server-server links using SSL, the Secure Socket Layer, by itself. But you can
 | 
			
		||||
use the stunnel(8) command to make this work.
 | 
			
		||||
 | 
			
		||||
  <http://stunnel.mirt.net/>
 | 
			
		||||
  <http://www.stunnel.org/>
 | 
			
		||||
 | 
			
		||||
Stefan Sperling (stefan at binarchy dot net) mailed me the following text as a
 | 
			
		||||
short "how-to", thanks Stefan!
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=== snip ===
 | 
			
		||||
    ! This guide applies to stunnel 4.x !
 | 
			
		||||
 | 
			
		||||
    Put this in your stunnel.conf:
 | 
			
		||||
 | 
			
		||||
        [ircs]
 | 
			
		||||
        accept = 6667
 | 
			
		||||
        connect = 6668
 | 
			
		||||
 | 
			
		||||
    This makes stunnel listen for incoming connections
 | 
			
		||||
    on port 6667 and forward decrypted data to port 6668.
 | 
			
		||||
    We call the connection 'ircs'. Stunnel will use this
 | 
			
		||||
    name when logging connection attempts via syslog.
 | 
			
		||||
    You can also use the name in /etc/hosts.{allow,deny}
 | 
			
		||||
    if you run tcp-wrappers.
 | 
			
		||||
 | 
			
		||||
    To make sure ngircd is listening on the port where
 | 
			
		||||
    the decrypted data arrives, set
 | 
			
		||||
 | 
			
		||||
        Ports = 6668
 | 
			
		||||
 | 
			
		||||
    in your ngircd.conf.
 | 
			
		||||
 | 
			
		||||
    Start stunnel and restart ngircd.
 | 
			
		||||
 | 
			
		||||
    That's it.
 | 
			
		||||
    Don't forget to activate ssl support in your irc client ;)
 | 
			
		||||
=== snip ===
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Probably ngIRCd will include support for SSL in the future ...
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- 
 | 
			
		||||
$Id: SSL.txt,v 1.2 2004/12/27 01:11:40 alex Exp $
 | 
			
		||||
@@ -1,42 +1,53 @@
 | 
			
		||||
# $Id: sample-ngircd.conf,v 1.20 2003/03/10 00:23:34 alex Exp $
 | 
			
		||||
# $Id: sample-ngircd.conf,v 1.33 2005/03/15 16:58:01 alex Exp $
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# This is a sample configuration file for the ngIRCd, which must adept to
 | 
			
		||||
# the local preferences and needs.
 | 
			
		||||
# This is a sample configuration file for the ngIRCd, which must be adepted
 | 
			
		||||
# to the local preferences and needs.
 | 
			
		||||
#
 | 
			
		||||
# Comments are started with "#" or ";".
 | 
			
		||||
#
 | 
			
		||||
# Author: Alexander Barton, <alex@barton.de>
 | 
			
		||||
# Initial translation by Ilja Osthoff, <ilja@glide.ath.cx>
 | 
			
		||||
# Use "ngircd --configtest" (see manual page ngircd(8)) to validate that the
 | 
			
		||||
# server interpreted the configuration file as expected!
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
[Global]
 | 
			
		||||
 | 
			
		||||
	# The [Global] section of this file is used to define the main
 | 
			
		||||
	# configuration of the server, like the server name and the ports
 | 
			
		||||
	# on which the server should be listening.
 | 
			
		||||
	
 | 
			
		||||
	# Server name in the IRC-network
 | 
			
		||||
	# Server name in the IRC network, must contain at least one dot
 | 
			
		||||
	# (".") and be unique in the IRC network. Required!
 | 
			
		||||
	Name = irc.the.net
 | 
			
		||||
	
 | 
			
		||||
	# Info text of the server. This will be shown by WHOIS and
 | 
			
		||||
	# LINKS requests for example.
 | 
			
		||||
	Info = Server Info Text
 | 
			
		||||
 | 
			
		||||
	# Global password for all users needed to connect to the server
 | 
			
		||||
	;Password = abc
 | 
			
		||||
	
 | 
			
		||||
	# Information about the server and the administrator, used by the
 | 
			
		||||
	# ADMIN command.
 | 
			
		||||
	# ADMIN command. Not required by server but by RFC!
 | 
			
		||||
	;AdminInfo1 = Description
 | 
			
		||||
	;AdminInfo2 = Location
 | 
			
		||||
	;AdminEMail = admin@irc.server
 | 
			
		||||
 
 | 
			
		||||
	# Ports on which the server should listen. There may be more than
 | 
			
		||||
	# one port, separated with ";". (Default: 6667)
 | 
			
		||||
	;Ports = 6667, 6668, 66694
 | 
			
		||||
	# one port, separated with ",". (Default: 6667)
 | 
			
		||||
	;Ports = 6667, 6668, 6669
 | 
			
		||||
 | 
			
		||||
	# IP address on which the server should listen. (Default: empty,
 | 
			
		||||
	# so the server listens on all IP addresses of the system)
 | 
			
		||||
	;Listen = 1.2.3.4
 | 
			
		||||
	
 | 
			
		||||
	# Text file with the "message of the day" (MOTD). This message will
 | 
			
		||||
	# be shown to all users connecting to the server:
 | 
			
		||||
	;MotdFile = /usr/local/etc/ngircd.motd
 | 
			
		||||
 | 
			
		||||
	# A simple Phrase (<256 chars) if you don't want to use a motd file.
 | 
			
		||||
	# If it is set no MotdFile will be read at all.
 | 
			
		||||
	;MotdPhrase = "Hello world!"
 | 
			
		||||
 | 
			
		||||
	# User ID under which the server should run; you can use the name
 | 
			
		||||
	# of the user or the numerical ID. ATTENTION: For this to work the
 | 
			
		||||
	# server must have been started with root privileges! In addition,
 | 
			
		||||
@@ -49,6 +60,19 @@
 | 
			
		||||
	# server must have been started with root privileges!
 | 
			
		||||
	;ServerGID = 65534
 | 
			
		||||
 | 
			
		||||
	# A directory to chroot in when everything is initialized. It
 | 
			
		||||
	# doesn't need to be populated if ngIRCd is compiled as a static
 | 
			
		||||
	# binary. By default ngIRCd won't use the chroot() feature.
 | 
			
		||||
	# ATTENTION: For this to work the server must have been started
 | 
			
		||||
	# with root privileges!
 | 
			
		||||
	;ChrootDir = /var/empty
 | 
			
		||||
 | 
			
		||||
	# This tells ngircd to write its current process id to a file.
 | 
			
		||||
	# Note that the pidfile is written AFTER chroot and switching uid,
 | 
			
		||||
	# i. e. the Directory the pidfile resides in must be writeable by
 | 
			
		||||
	# the ngircd user and exist in the chroot directory.
 | 
			
		||||
	;PidFile = /var/run/ngircd/ngircd.pid
 | 
			
		||||
 | 
			
		||||
	# After <PingTimeout> seconds of inactivity the server will send a
 | 
			
		||||
	# PING to the peer to test whether it is alive or not.
 | 
			
		||||
	;PingTimeout = 120
 | 
			
		||||
@@ -65,9 +89,17 @@
 | 
			
		||||
	# they are not(!) channel-operators?
 | 
			
		||||
	;OperCanUseMode = no
 | 
			
		||||
 | 
			
		||||
	# Mask IRC Operator mode requests as if they were coming from the
 | 
			
		||||
	# server? (This is a compatibility hack for ircd-irc2 servers)
 | 
			
		||||
	;OperServerMode = no
 | 
			
		||||
	
 | 
			
		||||
	# Maximum number of simultaneous connection the server is allowed
 | 
			
		||||
	# to accept (<=0: unlimited):
 | 
			
		||||
	;MaxConnections = -1
 | 
			
		||||
	
 | 
			
		||||
	# Maximum number of simultaneous connections from a single IP address
 | 
			
		||||
	# the server will accept (<=0: unlimited):
 | 
			
		||||
	;MaxConnectionsIP = 5
 | 
			
		||||
 | 
			
		||||
	# Maximum number of channels a user can be member of (<=0: no limit):
 | 
			
		||||
	;MaxJoins = 10
 | 
			
		||||
@@ -82,6 +114,12 @@
 | 
			
		||||
	# Password of the IRC operator
 | 
			
		||||
	;Password = ThePwd
 | 
			
		||||
 | 
			
		||||
	# Optional Mask from which /OPER will be accepted
 | 
			
		||||
	;Mask = *!ident@somewhere.example.com
 | 
			
		||||
 | 
			
		||||
[Operator]
 | 
			
		||||
	# More [Operator] sections, if you like ...
 | 
			
		||||
 | 
			
		||||
[Server]
 | 
			
		||||
	# Other servers are configured in [Server] sections. If you
 | 
			
		||||
	# configure a port for the connection, then this ngircd tries to
 | 
			
		||||
@@ -117,6 +155,9 @@
 | 
			
		||||
	# Group of this server (optional)
 | 
			
		||||
	;Group = 123
 | 
			
		||||
 | 
			
		||||
[Server]
 | 
			
		||||
	# More [Server] sections, if you like ...
 | 
			
		||||
 | 
			
		||||
[Channel]
 | 
			
		||||
	# Pre-defined channels can be configured in [Channel] sections.
 | 
			
		||||
	# Such channels are created by the server when starting up and even
 | 
			
		||||
@@ -134,4 +175,7 @@
 | 
			
		||||
	# Initial channel modes
 | 
			
		||||
	;Modes = tn
 | 
			
		||||
 | 
			
		||||
[Channel]
 | 
			
		||||
	# More [Channel] sections, if you like ...
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										27
									
								
								man/ngircd.8
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								man/ngircd.8
									
									
									
									
									
								
							@@ -1,15 +1,15 @@
 | 
			
		||||
.\"
 | 
			
		||||
.\" $Id: ngircd.8,v 1.8 2003/03/10 00:58:06 alex Exp $
 | 
			
		||||
.\" $Id: ngircd.8,v 1.10 2005/06/04 13:39:20 alex Exp $
 | 
			
		||||
.\"
 | 
			
		||||
.TH ngircd 8 "March 2003" ngircd "ngIRCd Manual"
 | 
			
		||||
.TH ngircd 8 "Juni 2005" ngircd "ngIRCd Manual"
 | 
			
		||||
.SH NAME
 | 
			
		||||
ngircd \- the next generation IRC daemon
 | 
			
		||||
ngIRCd \- the next generation IRC daemon
 | 
			
		||||
.SH SYNOPSIS
 | 
			
		||||
.B ngircd [
 | 
			
		||||
.I Options
 | 
			
		||||
.B ]
 | 
			
		||||
.SH DESCRIPTION
 | 
			
		||||
.BR ngircd
 | 
			
		||||
.BR ngIRCd
 | 
			
		||||
is a free open source daemon for the Internet Relay Chat (IRC),
 | 
			
		||||
developed under the GNU General Public License (GPL).
 | 
			
		||||
.PP
 | 
			
		||||
@@ -18,16 +18,12 @@ many others. It is easy to configure, supports server links (even with
 | 
			
		||||
original ircd's) and runs on hosts with changing IP addresses (such as
 | 
			
		||||
dial-in networks).
 | 
			
		||||
.PP
 | 
			
		||||
Currently supported platforms (tested versions) are: AIX (3.2.5 with IBM XL
 | 
			
		||||
C Compiler), A/UX (3.x, Apple pre-ANSI C Compiler and GNU C), FreeBSD
 | 
			
		||||
(4.5/i386, GNU C), HP-UX (10.20, GNU C), IRIX (6.5, SGI MIPSpro C 7.30),
 | 
			
		||||
Linux (2.2.x/i386, 2.4.x/i386 and 2.4.x/hppa, GNU C), Mac OS X (10.x, GNU C),
 | 
			
		||||
NetBSD (1.5.2/i386 and 1.5.3/m68k, GNU C), Solaris (2.5.1 and 2.6, GNU C),
 | 
			
		||||
and Windows with Cygwin (GNU C).
 | 
			
		||||
Currently supported platforms include AIX, A/UX, FreeBSD, HP-UX, IRIX,
 | 
			
		||||
Linux, Mac OS X, NetBSD, OpenBSD, Solaris, and Windows with Cygwin.
 | 
			
		||||
.PP
 | 
			
		||||
As ngIRCd relies on UNIX standards and uses GNU automake and GNU autoconf
 | 
			
		||||
there are good chances that it also supports other UNIX-based operating
 | 
			
		||||
systems.
 | 
			
		||||
systems as well.
 | 
			
		||||
.SH OPTIONS
 | 
			
		||||
The default behaviour of
 | 
			
		||||
.BR ngircd
 | 
			
		||||
@@ -36,9 +32,6 @@ controlling terminal and to wait for clients.
 | 
			
		||||
.PP
 | 
			
		||||
You can use these options to modify this default:
 | 
			
		||||
.TP
 | 
			
		||||
\fB\-\-configtest\fR
 | 
			
		||||
Read, validate and display the configuration; then exit.
 | 
			
		||||
.TP
 | 
			
		||||
\fB\-f\fR \fIfile\fR, \fB\-\-config\fR \fIfile\fR
 | 
			
		||||
Use
 | 
			
		||||
.I file
 | 
			
		||||
@@ -46,12 +39,16 @@ as configuration file.
 | 
			
		||||
.TP
 | 
			
		||||
\fB\-n\fR, \fB\-\-nodaemon\fR
 | 
			
		||||
Don't fork a child and don't detach from controlling terminal.
 | 
			
		||||
All log messages go to the console.
 | 
			
		||||
All log messages go to the console and you can use CTRL-C to
 | 
			
		||||
terminate the server.
 | 
			
		||||
.TP
 | 
			
		||||
\fB\-p\fR, \fB\-\-passive\fR
 | 
			
		||||
Disable automatic connections to other servers. You can use the IRC command
 | 
			
		||||
CONNECT later on as IRC Operator to link this ngIRCd to other servers.
 | 
			
		||||
.TP
 | 
			
		||||
\fB\-t\fR, \fB\-\-configtest\fR
 | 
			
		||||
Read, validate and display the configuration; then exit.
 | 
			
		||||
.TP
 | 
			
		||||
\fB\-\-version\fR
 | 
			
		||||
Output version information and exit.
 | 
			
		||||
.TP
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
.\"
 | 
			
		||||
.\" $Id: ngircd.conf.5,v 1.9 2003/03/10 00:58:06 alex Exp $
 | 
			
		||||
.\" $Id: ngircd.conf.5,v 1.18 2005/06/04 13:39:20 alex Exp $
 | 
			
		||||
.\"
 | 
			
		||||
.TH ngircd.conf 5 "March 2003" ngircd "ngIRCd Manual"
 | 
			
		||||
.TH ngircd.conf 5 "Juni 2005" ngircd "ngIRCd Manual"
 | 
			
		||||
.SH NAME
 | 
			
		||||
ngircd.conf \- configuration file of ngIRCd
 | 
			
		||||
.SH SYNOPSIS
 | 
			
		||||
@@ -32,13 +32,13 @@ represents either a comment, a section name or a parameter.
 | 
			
		||||
.PP
 | 
			
		||||
Section and parameter names are not case sensitive.
 | 
			
		||||
.SH "SECTION OVERVIEW"
 | 
			
		||||
The file is separated in four blocks: [Global], [Operator], [Server],
 | 
			
		||||
The file can contain blocks of four types: [Global], [Operator], [Server],
 | 
			
		||||
and [Channel].
 | 
			
		||||
.PP
 | 
			
		||||
In the
 | 
			
		||||
.I [Global]
 | 
			
		||||
section, there is the main configuration like the server name and the
 | 
			
		||||
ports, on which the server should be listening. IRC operators of this
 | 
			
		||||
ports on which the server should be listening. IRC operators of this
 | 
			
		||||
server are defined in
 | 
			
		||||
.I [Operator]
 | 
			
		||||
blocks.
 | 
			
		||||
@@ -46,6 +46,9 @@ blocks.
 | 
			
		||||
is the section where server links are configured. And
 | 
			
		||||
.I [Channel]
 | 
			
		||||
blocks are used to configure pre-defined ("persistent") IRC channels.
 | 
			
		||||
.PP
 | 
			
		||||
There can be more than one [Operator], [Server] and [Channel] sections
 | 
			
		||||
per configuration file, but only one [Global] section.
 | 
			
		||||
.SH [GLOBAL]
 | 
			
		||||
The
 | 
			
		||||
.I [Global]
 | 
			
		||||
@@ -65,12 +68,20 @@ command.
 | 
			
		||||
.TP
 | 
			
		||||
\fBPorts\fR
 | 
			
		||||
Ports on which the server should listen. There may be more than one port,
 | 
			
		||||
separated with ';'. Default: 6667.
 | 
			
		||||
separated with ','. Default: 6667.
 | 
			
		||||
.TP
 | 
			
		||||
\fBListen\fR
 | 
			
		||||
The IP address on which the server should listen. Default is empty, so
 | 
			
		||||
the server listens on all configured IP addresses and interfaces.
 | 
			
		||||
.TP
 | 
			
		||||
\fBMotdFile\fR
 | 
			
		||||
Text file with the "message of the day" (MOTD). This message will be shown
 | 
			
		||||
to all users connecting to the server.
 | 
			
		||||
.TP
 | 
			
		||||
\fBMotdPhrase\fR
 | 
			
		||||
A simple Phrase (<256 chars) if you don't want to use a MOTD file.
 | 
			
		||||
If it is set no MotdFile will be read at all.
 | 
			
		||||
.TP
 | 
			
		||||
\fBServerUID\fR
 | 
			
		||||
User ID under which the server should run; you can use the name of the user
 | 
			
		||||
or the numerical ID.
 | 
			
		||||
@@ -94,6 +105,25 @@ For this to work the server must have
 | 
			
		||||
been started with root privileges!
 | 
			
		||||
.RE
 | 
			
		||||
.TP
 | 
			
		||||
\fBChrootDir\fR
 | 
			
		||||
A directory to chroot in when everything is initialized. It doesn't need
 | 
			
		||||
to be populated if ngIRCd is compiled as a static binary. By default ngIRCd
 | 
			
		||||
won't use the chroot() feature.
 | 
			
		||||
.PP
 | 
			
		||||
.RS
 | 
			
		||||
.B Attention:
 | 
			
		||||
.br
 | 
			
		||||
For this to work the server must have
 | 
			
		||||
been started with root privileges!
 | 
			
		||||
.RE
 | 
			
		||||
.TP
 | 
			
		||||
\fBPidFile\fR
 | 
			
		||||
This tells ngIRCd to write its current process ID to a file. Note that the
 | 
			
		||||
pidfile is written AFTER chroot and switching the user ID, i. e. the
 | 
			
		||||
directory the pidfile resides in must be writeable by the ngIRCd user and
 | 
			
		||||
exist in the chroot directory (if configured, see above).
 | 
			
		||||
.RE
 | 
			
		||||
.TP
 | 
			
		||||
\fBPingTimeout\fR
 | 
			
		||||
After <PingTimeout> seconds of inactivity the server will send a PING to
 | 
			
		||||
the peer to test whether it is alive or not. Default: 120.
 | 
			
		||||
@@ -101,7 +131,7 @@ the peer to test whether it is alive or not. Default: 120.
 | 
			
		||||
\fBPongTimeout\fR
 | 
			
		||||
If a client fails to answer a PING with a PONG within <PongTimeout>
 | 
			
		||||
seconds, it will be disconnected by the server. Default: 20.
 | 
			
		||||
.IT
 | 
			
		||||
.TP
 | 
			
		||||
\fBConnectRetry\fR
 | 
			
		||||
The server tries every <ConnectRetry> seconds to establish a link to not yet
 | 
			
		||||
(or no longer) connected servers. Default: 60.
 | 
			
		||||
@@ -110,10 +140,20 @@ The server tries every <ConnectRetry> seconds to establish a link to not yet
 | 
			
		||||
Should IRC Operators be allowed to use the MODE command even if they are
 | 
			
		||||
not(!) channel-operators? Default: no.
 | 
			
		||||
.TP
 | 
			
		||||
\fBOperServerMode\fR
 | 
			
		||||
If OperCanUseMode is enabled, this may lead the compatibility problems with
 | 
			
		||||
Servers that run the ircd-irc2 Software. This Option "masks" mode requests
 | 
			
		||||
by non-chanops as if they were coming from the server. Default: no.
 | 
			
		||||
.TP
 | 
			
		||||
\fBMaxConnections\fR
 | 
			
		||||
Maximum number of simultaneous connection the server is allowed to accept
 | 
			
		||||
(<=0: unlimited). Default: -1.
 | 
			
		||||
.TP
 | 
			
		||||
\fBMaxConnectionsIP\fR
 | 
			
		||||
Maximum number of simultaneous connections from a single IP address that
 | 
			
		||||
the server will accept (<=0: unlimited). This configuration options lowers
 | 
			
		||||
the risk of denial of service attacks (DoS). Default: 5.
 | 
			
		||||
.TP
 | 
			
		||||
\fBMaxJoins\fR
 | 
			
		||||
Maximum number of channels a user can be member of (<=0: no limit).
 | 
			
		||||
Default: 10.
 | 
			
		||||
@@ -128,6 +168,10 @@ ID of the operator (may be different of the nick name).
 | 
			
		||||
.TP
 | 
			
		||||
\fBPassword\fR
 | 
			
		||||
Password of the IRC operator.
 | 
			
		||||
.TP
 | 
			
		||||
\fBMask\fR
 | 
			
		||||
Mask that is to be checked before an /OPER for this account is accepted.
 | 
			
		||||
Example: nick!ident@*.example.com
 | 
			
		||||
.SH [SERVER]
 | 
			
		||||
Other servers are configured in
 | 
			
		||||
.I [Server]
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										137
									
								
								src/Doxyfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										137
									
								
								src/Doxyfile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,137 @@
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
# Copyright (c)2001-2005 Alexander Barton (alex@barton.de)
 | 
			
		||||
#
 | 
			
		||||
# This program is free software; you can redistribute it and/or modify
 | 
			
		||||
# it under the terms of the GNU General Public License as published by
 | 
			
		||||
# the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
# (at your option) any later version.
 | 
			
		||||
# Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
#
 | 
			
		||||
# $Id: Doxyfile,v 1.1 2005/04/09 12:21:51 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
# This file describes the settings to be used by the documentation system
 | 
			
		||||
# doxygen (www.doxygen.org) for ngIRCd.
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# Project related configuration options
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
 | 
			
		||||
# by quotes) that should identify the project.
 | 
			
		||||
 | 
			
		||||
PROJECT_NAME           = ngIRCd
 | 
			
		||||
 | 
			
		||||
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
 | 
			
		||||
# base path where the generated documentation will be put. 
 | 
			
		||||
# If a relative path is entered, it will be relative to the location 
 | 
			
		||||
# where doxygen was started. If left blank the current directory will be used.
 | 
			
		||||
 | 
			
		||||
OUTPUT_DIRECTORY       = ../doc/src
 | 
			
		||||
 | 
			
		||||
# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
 | 
			
		||||
# will interpret the first line (until the first dot) of a JavaDoc-style 
 | 
			
		||||
# comment as the brief description. If set to NO, the JavaDoc 
 | 
			
		||||
# comments will behave just like the Qt-style comments (thus requiring an 
 | 
			
		||||
# explicit @brief command for a brief description.
 | 
			
		||||
 | 
			
		||||
JAVADOC_AUTOBRIEF      = YES
 | 
			
		||||
 | 
			
		||||
# If the DETAILS_AT_TOP tag is set to YES then Doxygen 
 | 
			
		||||
# will output the detailed description near the top, like JavaDoc.
 | 
			
		||||
# If set to NO, the detailed description appears after the member 
 | 
			
		||||
# documentation.
 | 
			
		||||
 | 
			
		||||
DETAILS_AT_TOP         = NO
 | 
			
		||||
 | 
			
		||||
# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
 | 
			
		||||
# sources only. Doxygen will then generate output that is more tailored for C. 
 | 
			
		||||
# For instance, some of the names that are used will be different. The list 
 | 
			
		||||
# of all members will be omitted, etc.
 | 
			
		||||
 | 
			
		||||
OPTIMIZE_OUTPUT_FOR_C  = YES
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# Build related configuration options
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
 | 
			
		||||
# documentation are documented, even if no documentation was available. 
 | 
			
		||||
# Private class members and static file members will be hidden unless 
 | 
			
		||||
# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
 | 
			
		||||
 | 
			
		||||
EXTRACT_ALL            = YES
 | 
			
		||||
 | 
			
		||||
# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
 | 
			
		||||
# will be included in the documentation.
 | 
			
		||||
 | 
			
		||||
EXTRACT_PRIVATE        = YES
 | 
			
		||||
 | 
			
		||||
# If the EXTRACT_STATIC tag is set to YES all static members of a file 
 | 
			
		||||
# will be included in the documentation.
 | 
			
		||||
 | 
			
		||||
EXTRACT_STATIC         = YES
 | 
			
		||||
 | 
			
		||||
# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
 | 
			
		||||
# defined locally in source files will be included in the documentation. 
 | 
			
		||||
# If set to NO only classes defined in header files are included.
 | 
			
		||||
 | 
			
		||||
EXTRACT_LOCAL_CLASSES  = YES
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# configuration options related to the input files
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
# The INPUT tag can be used to specify the files and/or directories that
 | 
			
		||||
# contain documented source files. You may enter file names like "myfile.cpp"
 | 
			
		||||
# or directories like "/usr/src/myproject". Separate the files or directories 
 | 
			
		||||
# with spaces.
 | 
			
		||||
 | 
			
		||||
INPUT                  = ngircd portab tool
 | 
			
		||||
 | 
			
		||||
# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
 | 
			
		||||
# should be searched for input files as well. Possible values are YES and NO. 
 | 
			
		||||
# If left blank NO is used.
 | 
			
		||||
 | 
			
		||||
RECURSIVE              = YES
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# configuration options related to source browsing
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
 | 
			
		||||
# be generated. Documented entities will be cross-referenced with these sources. 
 | 
			
		||||
# Note: To get rid of all source code in the generated output, make sure also 
 | 
			
		||||
# VERBATIM_HEADERS is set to NO.
 | 
			
		||||
 | 
			
		||||
SOURCE_BROWSER         = YES
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# Output formats
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
GENERATE_HTML          = YES
 | 
			
		||||
GENERATE_HTMLHELP      = NO
 | 
			
		||||
GENERATE_LATEX         = NO
 | 
			
		||||
GENERATE_RTF           = NO
 | 
			
		||||
GENERATE_MAN           = NO
 | 
			
		||||
GENERATE_XML           = NO
 | 
			
		||||
GENERATE_AUTOGEN_DEF   = NO
 | 
			
		||||
GENERATE_PERLMOD       = NO
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# Configuration options related to the preprocessor   
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
# The PREDEFINED tag can be used to specify one or more macro names that 
 | 
			
		||||
# are defined before the preprocessor is started (similar to the -D option of 
 | 
			
		||||
# gcc). The argument of the tag is a list of macros of the form: name 
 | 
			
		||||
# or name=definition (no spaces). If the definition and the = are 
 | 
			
		||||
# omitted =1 is assumed. To prevent a macro definition from being 
 | 
			
		||||
# undefined via #undef or recursively expanded use the := operator 
 | 
			
		||||
# instead of the = operator.
 | 
			
		||||
 | 
			
		||||
PREDEFINED             = CONN_MODULE __client_c__
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
# (at your option) any later version.
 | 
			
		||||
# Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile.am,v 1.5 2003/01/13 12:20:16 alex Exp $
 | 
			
		||||
# $Id: Makefile.am,v 1.6 2005/04/09 12:22:41 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
SUBDIRS = portab tool ngircd testsuite
 | 
			
		||||
@@ -16,4 +16,9 @@ SUBDIRS = portab tool ngircd testsuite
 | 
			
		||||
maintainer-clean-local:
 | 
			
		||||
	rm -f Makefile Makefile.in config.h config.h.in stamp-h.in
 | 
			
		||||
 | 
			
		||||
srcdoc:
 | 
			
		||||
	@doxygen --version >/dev/null 2>&1 \
 | 
			
		||||
	 || ( echo; echo "Error: \"doxygen\" not found!"; echo; exit 1 )
 | 
			
		||||
	doxygen
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
 
 | 
			
		||||
@@ -8,14 +8,15 @@
 | 
			
		||||
# (at your option) any later version.
 | 
			
		||||
# Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile.am,v 1.39 2003/03/31 19:01:02 alex Exp $
 | 
			
		||||
# $Id: Makefile.am,v 1.46 2005/05/23 00:11:15 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
AUTOMAKE_OPTIONS = ../portab/ansi2knr
 | 
			
		||||
 | 
			
		||||
INCLUDES = -I$(srcdir)/../portab -I$(srcdir)/../tool
 | 
			
		||||
 | 
			
		||||
LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN
 | 
			
		||||
LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN \
 | 
			
		||||
 -varuse -retvalother -emptyret -unrecog
 | 
			
		||||
 | 
			
		||||
sbin_PROGRAMS = ngircd
 | 
			
		||||
 | 
			
		||||
@@ -51,17 +52,38 @@ check-help: Makefile
 | 
			
		||||
	chmod 755 check-help
 | 
			
		||||
 | 
			
		||||
lint:
 | 
			
		||||
	rm -f lint.out
 | 
			
		||||
	@splint --version >/dev/null 2>&1 \
 | 
			
		||||
	 || ( echo; echo "Error: \"splint\" not found!"; echo; exit 1 )
 | 
			
		||||
	@echo; warnings=0; files=0; \
 | 
			
		||||
	for f in *.c; do \
 | 
			
		||||
	 echo "checking $$f ..."; \
 | 
			
		||||
	 splint $$f $(LINTARGS) -I./.. -I./../portab $(AM_CFLAGS) > lint.out 2>&1; \
 | 
			
		||||
	 splint $$f $(LINTARGS) -I$(srcdir) -I$(srcdir)/.. \
 | 
			
		||||
	  $(INCLUDES) $(AM_CFLAGS) >lint.out 2>&1; \
 | 
			
		||||
	 grep "no warnings" lint.out > /dev/null 2>&1; \
 | 
			
		||||
	 if [ $$? -ne 0 ]; then \
 | 
			
		||||
	  echo; cat lint.out; echo; \
 | 
			
		||||
	  waswarning=1; \
 | 
			
		||||
	  echo; grep -v "^Command Line: " lint.out; echo; \
 | 
			
		||||
	  w=$$( grep "code warning" lint.out | awk "{ print \$$4 }" ); \
 | 
			
		||||
	  [ "$$w" -gt 0 ] && warnings=`expr $$warnings + $$w`; \
 | 
			
		||||
	  files=`expr $$files + 1`; \
 | 
			
		||||
	 else \
 | 
			
		||||
	  waswarning=0; \
 | 
			
		||||
	 fi; \
 | 
			
		||||
	done;
 | 
			
		||||
	 rm -f lint.out; \
 | 
			
		||||
	done; \
 | 
			
		||||
	[ $$waswarning -eq 0 ] && echo; \
 | 
			
		||||
	[ $$warnings -gt 0 ] \
 | 
			
		||||
	 && echo "Result: $$warnings warning(s) in $$files file(s)!" \
 | 
			
		||||
	 || echo "Result: no warnings found."; \
 | 
			
		||||
	echo; [ $$warnings -gt 0 ] && exit 1
 | 
			
		||||
 | 
			
		||||
ngircd.c: cvs-date cvs-version.h
 | 
			
		||||
ngircd.c: cvs-version.h
 | 
			
		||||
 | 
			
		||||
irc-login.c: cvs-version.h
 | 
			
		||||
 | 
			
		||||
irc-info.c: cvs-version.h
 | 
			
		||||
 | 
			
		||||
cvs-version.h: cvs-date
 | 
			
		||||
 | 
			
		||||
cvs-date:
 | 
			
		||||
	grep VERSION ../config.h | grep "CVS" \
 | 
			
		||||
@@ -69,7 +91,8 @@ cvs-date:
 | 
			
		||||
	    | $(AWK) "{ print \$$9 }" | sort | tail -1 \
 | 
			
		||||
	    | sed -e "s/\//-/g" )\"" > cvs-version.new \
 | 
			
		||||
	 || echo "" > cvs-version.new
 | 
			
		||||
	diff cvs-version.h cvs-version.new || cp cvs-version.new cvs-version.h
 | 
			
		||||
	diff cvs-version.h cvs-version.new 2>/dev/null \
 | 
			
		||||
	 || cp cvs-version.new cvs-version.h
 | 
			
		||||
 | 
			
		||||
TESTS = check-version check-help
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 * Copyright (c)2001-2005 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
@@ -17,13 +17,15 @@
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: channel.c,v 1.42 2002/12/30 17:15:42 alex Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: channel.c,v 1.50 2005/06/18 08:57:37 fw Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <strings.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "conn-func.h"
 | 
			
		||||
#include "client.h"
 | 
			
		||||
 | 
			
		||||
@@ -53,28 +55,28 @@ LOCAL CL2CHAN *My_Cl2Chan;
 | 
			
		||||
 | 
			
		||||
LOCAL CL2CHAN *Get_Cl2Chan PARAMS(( CHANNEL *Chan, CLIENT *Client ));
 | 
			
		||||
LOCAL CL2CHAN *Add_Client PARAMS(( CHANNEL *Chan, CLIENT *Client ));
 | 
			
		||||
LOCAL BOOLEAN Remove_Client PARAMS(( INT Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Reason, BOOLEAN InformServer ));
 | 
			
		||||
LOCAL bool Remove_Client PARAMS(( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Reason, bool InformServer ));
 | 
			
		||||
LOCAL CL2CHAN *Get_First_Cl2Chan PARAMS(( CLIENT *Client, CHANNEL *Chan ));
 | 
			
		||||
LOCAL CL2CHAN *Get_Next_Cl2Chan PARAMS(( CL2CHAN *Start, CLIENT *Client, CHANNEL *Chan ));
 | 
			
		||||
LOCAL BOOLEAN Delete_Channel PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
LOCAL bool Delete_Channel PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Channel_Init( VOID )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Channel_Init( void )
 | 
			
		||||
{
 | 
			
		||||
	My_Channels = NULL;
 | 
			
		||||
	My_Cl2Chan = NULL;
 | 
			
		||||
} /* Channel_Init */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Channel_InitPredefined( VOID )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Channel_InitPredefined( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Vordefinierte persistente Channels erzeugen */
 | 
			
		||||
 | 
			
		||||
	CHANNEL *chan;
 | 
			
		||||
	CHAR *c;
 | 
			
		||||
	INT i;
 | 
			
		||||
	char *c;
 | 
			
		||||
	int i;
 | 
			
		||||
	
 | 
			
		||||
	for( i = 0; i < Conf_Channel_Count; i++ )
 | 
			
		||||
	{
 | 
			
		||||
@@ -111,8 +113,8 @@ Channel_InitPredefined( VOID )
 | 
			
		||||
} /* Channel_InitPredefined */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Channel_Exit( VOID )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Channel_Exit( void )
 | 
			
		||||
{
 | 
			
		||||
	CHANNEL *c, *c_next;
 | 
			
		||||
	CL2CHAN *cl2chan, *cl2chan_next;
 | 
			
		||||
@@ -137,8 +139,8 @@ Channel_Exit( VOID )
 | 
			
		||||
} /* Channel_Exit */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
Channel_Join( CLIENT *Client, CHAR *Name )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Channel_Join( CLIENT *Client, char *Name )
 | 
			
		||||
{
 | 
			
		||||
	CHANNEL *chan;
 | 
			
		||||
	
 | 
			
		||||
@@ -149,7 +151,7 @@ Channel_Join( CLIENT *Client, CHAR *Name )
 | 
			
		||||
	if( ! Channel_IsValidName( Name ))
 | 
			
		||||
	{
 | 
			
		||||
		IRC_WriteStrClient( Client, ERR_NOSUCHCHANNEL_MSG, Client_ID( Client ), Name );
 | 
			
		||||
		return FALSE;
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Channel suchen */
 | 
			
		||||
@@ -157,23 +159,23 @@ Channel_Join( CLIENT *Client, CHAR *Name )
 | 
			
		||||
	if( chan )
 | 
			
		||||
	{
 | 
			
		||||
		/* Ist der Client bereits Mitglied? */
 | 
			
		||||
		if( Get_Cl2Chan( chan, Client )) return FALSE;
 | 
			
		||||
		if( Get_Cl2Chan( chan, Client )) return false;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		/* Gibt es noch nicht? Dann neu anlegen: */
 | 
			
		||||
		chan = Channel_Create( Name );
 | 
			
		||||
		if( ! chan ) return FALSE;
 | 
			
		||||
		if( ! chan ) return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* User dem Channel hinzufuegen */
 | 
			
		||||
	if( ! Add_Client( chan, Client )) return FALSE;
 | 
			
		||||
	else return TRUE;
 | 
			
		||||
	if( ! Add_Client( chan, Client )) return false;
 | 
			
		||||
	else return true;
 | 
			
		||||
} /* Channel_Join */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
Channel_Part( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Channel_Part( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason )
 | 
			
		||||
{
 | 
			
		||||
	CHANNEL *chan;
 | 
			
		||||
 | 
			
		||||
@@ -186,17 +188,17 @@ Channel_Part( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason )
 | 
			
		||||
	if(( ! chan ) || ( ! Get_Cl2Chan( chan, Client )))
 | 
			
		||||
	{
 | 
			
		||||
		IRC_WriteStrClient( Client, ERR_NOSUCHCHANNEL_MSG, Client_ID( Client ), Name );
 | 
			
		||||
		return FALSE;
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* User aus Channel entfernen */
 | 
			
		||||
	if( ! Remove_Client( REMOVE_PART, chan, Client, Origin, Reason, TRUE )) return FALSE;
 | 
			
		||||
	else return TRUE;
 | 
			
		||||
	if( ! Remove_Client( REMOVE_PART, chan, Client, Origin, Reason, true)) return false;
 | 
			
		||||
	else return true;
 | 
			
		||||
} /* Channel_Part */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Channel_Kick( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Channel_Kick( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason )
 | 
			
		||||
{
 | 
			
		||||
	CHANNEL *chan;
 | 
			
		||||
 | 
			
		||||
@@ -234,35 +236,36 @@ Channel_Kick( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason )
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	Remove_Client( REMOVE_KICK, chan, Client, Origin, Reason, TRUE );
 | 
			
		||||
	Remove_Client( REMOVE_KICK, chan, Client, Origin, Reason, true);
 | 
			
		||||
} /* Channel_Kick */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Channel_Quit( CLIENT *Client, CHAR *Reason )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Channel_Quit( CLIENT *Client, char *Reason )
 | 
			
		||||
{
 | 
			
		||||
	CHANNEL *c, *next_c;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Reason != NULL );
 | 
			
		||||
 | 
			
		||||
	IRC_WriteStrRelatedPrefix( Client, Client, false, "QUIT :%s", Reason );
 | 
			
		||||
 | 
			
		||||
	c = My_Channels;
 | 
			
		||||
	while( c )
 | 
			
		||||
	{
 | 
			
		||||
		next_c = c->next;
 | 
			
		||||
		Remove_Client( REMOVE_QUIT, c, Client, Client, Reason, FALSE );
 | 
			
		||||
		Remove_Client( REMOVE_QUIT, c, Client, Client, Reason, false );
 | 
			
		||||
		c = next_c;
 | 
			
		||||
	}
 | 
			
		||||
} /* Channel_Quit */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL LONG
 | 
			
		||||
Channel_Count( VOID )
 | 
			
		||||
GLOBAL long
 | 
			
		||||
Channel_Count( void )
 | 
			
		||||
{
 | 
			
		||||
	CHANNEL *c;
 | 
			
		||||
	LONG count;
 | 
			
		||||
	long count = 0;
 | 
			
		||||
	
 | 
			
		||||
	count = 0;
 | 
			
		||||
	c = My_Channels;
 | 
			
		||||
	while( c )
 | 
			
		||||
	{
 | 
			
		||||
@@ -273,15 +276,14 @@ Channel_Count( VOID )
 | 
			
		||||
} /* Channel_Count */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL LONG
 | 
			
		||||
GLOBAL long
 | 
			
		||||
Channel_MemberCount( CHANNEL *Chan )
 | 
			
		||||
{
 | 
			
		||||
	CL2CHAN *cl2chan;
 | 
			
		||||
	LONG count;
 | 
			
		||||
	long count = 0;
 | 
			
		||||
 | 
			
		||||
	assert( Chan != NULL );
 | 
			
		||||
 | 
			
		||||
	count = 0;
 | 
			
		||||
	cl2chan = My_Cl2Chan;
 | 
			
		||||
	while( cl2chan )
 | 
			
		||||
	{
 | 
			
		||||
@@ -292,17 +294,16 @@ Channel_MemberCount( CHANNEL *Chan )
 | 
			
		||||
} /* Channel_MemberCount */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL INT
 | 
			
		||||
GLOBAL int
 | 
			
		||||
Channel_CountForUser( CLIENT *Client )
 | 
			
		||||
{
 | 
			
		||||
	/* Count number of channels a user is member of. */
 | 
			
		||||
 | 
			
		||||
	CL2CHAN *cl2chan;
 | 
			
		||||
	INT count;
 | 
			
		||||
	int count = 0;
 | 
			
		||||
	
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	
 | 
			
		||||
	count = 0;
 | 
			
		||||
	cl2chan = My_Cl2Chan;
 | 
			
		||||
	while( cl2chan )
 | 
			
		||||
	{
 | 
			
		||||
@@ -314,15 +315,14 @@ Channel_CountForUser( CLIENT *Client )
 | 
			
		||||
} /* Channel_CountForUser */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL INT
 | 
			
		||||
Channel_PCount( VOID )
 | 
			
		||||
GLOBAL int
 | 
			
		||||
Channel_PCount( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Count the number of persistent (mode 'P') channels */
 | 
			
		||||
 | 
			
		||||
	CHANNEL *chan;
 | 
			
		||||
	INT count;
 | 
			
		||||
	int count = 0;
 | 
			
		||||
 | 
			
		||||
	count = 0;
 | 
			
		||||
	chan = My_Channels;
 | 
			
		||||
	while( chan )
 | 
			
		||||
	{
 | 
			
		||||
@@ -334,7 +334,7 @@ Channel_PCount( VOID )
 | 
			
		||||
} /* Channel_PCount */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CHAR *
 | 
			
		||||
GLOBAL char *
 | 
			
		||||
Channel_Name( CHANNEL *Chan )
 | 
			
		||||
{
 | 
			
		||||
	assert( Chan != NULL );
 | 
			
		||||
@@ -342,7 +342,7 @@ Channel_Name( CHANNEL *Chan )
 | 
			
		||||
} /* Channel_Name */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CHAR *
 | 
			
		||||
GLOBAL char *
 | 
			
		||||
Channel_Modes( CHANNEL *Chan )
 | 
			
		||||
{
 | 
			
		||||
	assert( Chan != NULL );
 | 
			
		||||
@@ -350,7 +350,7 @@ Channel_Modes( CHANNEL *Chan )
 | 
			
		||||
} /* Channel_Modes */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CHAR *
 | 
			
		||||
GLOBAL char *
 | 
			
		||||
Channel_Key( CHANNEL *Chan )
 | 
			
		||||
{
 | 
			
		||||
	assert( Chan != NULL );
 | 
			
		||||
@@ -358,7 +358,7 @@ Channel_Key( CHANNEL *Chan )
 | 
			
		||||
} /* Channel_Key */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL LONG
 | 
			
		||||
GLOBAL long
 | 
			
		||||
Channel_MaxUsers( CHANNEL *Chan )
 | 
			
		||||
{
 | 
			
		||||
	assert( Chan != NULL );
 | 
			
		||||
@@ -367,7 +367,7 @@ Channel_MaxUsers( CHANNEL *Chan )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CHANNEL *
 | 
			
		||||
Channel_First( VOID )
 | 
			
		||||
Channel_First( void )
 | 
			
		||||
{
 | 
			
		||||
	return My_Channels;
 | 
			
		||||
} /* Channel_First */
 | 
			
		||||
@@ -382,7 +382,7 @@ Channel_Next( CHANNEL *Chan )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CHANNEL *
 | 
			
		||||
Channel_Search( CHAR *Name )
 | 
			
		||||
Channel_Search( char *Name )
 | 
			
		||||
{
 | 
			
		||||
	/* Channel-Struktur suchen */
 | 
			
		||||
	
 | 
			
		||||
@@ -456,86 +456,88 @@ Channel_GetChannel( CL2CHAN *Cl2Chan )
 | 
			
		||||
} /* Channel_GetChannel */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
Channel_IsValidName( CHAR *Name )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Channel_IsValidName( char *Name )
 | 
			
		||||
{
 | 
			
		||||
	/* Pruefen, ob Name als Channelname gueltig */
 | 
			
		||||
 | 
			
		||||
	CHAR *ptr, badchars[10];
 | 
			
		||||
	char *ptr, badchars[10];
 | 
			
		||||
	
 | 
			
		||||
	assert( Name != NULL );
 | 
			
		||||
 | 
			
		||||
	if(( Name[0] != '#' ) || ( strlen( Name ) >= CHANNEL_NAME_LEN )) return FALSE;
 | 
			
		||||
	if(( Name[0] != '#' ) || ( strlen( Name ) >= CHANNEL_NAME_LEN )) return false;
 | 
			
		||||
 | 
			
		||||
	ptr = Name;
 | 
			
		||||
	strcpy( badchars, " ,:\007" );
 | 
			
		||||
	while( *ptr )
 | 
			
		||||
	{
 | 
			
		||||
		if( strchr( badchars, *ptr )) return FALSE;
 | 
			
		||||
		if( strchr( badchars, *ptr )) return false;
 | 
			
		||||
		ptr++;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	return TRUE;
 | 
			
		||||
	return true;
 | 
			
		||||
} /* Channel_IsValidName */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
Channel_ModeAdd( CHANNEL *Chan, CHAR Mode )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Channel_ModeAdd( CHANNEL *Chan, char Mode )
 | 
			
		||||
{
 | 
			
		||||
	/* Mode soll gesetzt werden. TRUE wird geliefert, wenn der
 | 
			
		||||
	 * Mode neu gesetzt wurde, FALSE, wenn der Channel den Mode
 | 
			
		||||
	 * bereits hatte. */
 | 
			
		||||
	/* set Mode.
 | 
			
		||||
	 * If the channel already had this mode, return false.
 | 
			
		||||
	 * If the channel mode was newly set return true.
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
	CHAR x[2];
 | 
			
		||||
	char x[2];
 | 
			
		||||
 | 
			
		||||
	assert( Chan != NULL );
 | 
			
		||||
 | 
			
		||||
	x[0] = Mode; x[1] = '\0';
 | 
			
		||||
	if( ! strchr( Chan->modes, x[0] ))
 | 
			
		||||
	{
 | 
			
		||||
		/* Client hat den Mode noch nicht -> setzen */
 | 
			
		||||
		/* Channel does not have this mode yet, set it */
 | 
			
		||||
		strlcat( Chan->modes, x, sizeof( Chan->modes ));
 | 
			
		||||
		return TRUE;
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
	else return FALSE;
 | 
			
		||||
	else return false;
 | 
			
		||||
} /* Channel_ModeAdd */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
Channel_ModeDel( CHANNEL *Chan, CHAR Mode )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Channel_ModeDel( CHANNEL *Chan, char Mode )
 | 
			
		||||
{
 | 
			
		||||
	/* Mode soll geloescht werden. TRUE wird geliefert, wenn der
 | 
			
		||||
	 * Mode entfernt wurde, FALSE, wenn der Channel den Mode
 | 
			
		||||
	 * ueberhaupt nicht hatte. */
 | 
			
		||||
 | 
			
		||||
	CHAR x[2], *p;
 | 
			
		||||
	/* Delete mode.
 | 
			
		||||
	 * if the mode was removed return true.
 | 
			
		||||
	 * if the channel did not have the mode, return false.
 | 
			
		||||
	*/
 | 
			
		||||
	char x[2], *p;
 | 
			
		||||
 | 
			
		||||
	assert( Chan != NULL );
 | 
			
		||||
 | 
			
		||||
	x[0] = Mode; x[1] = '\0';
 | 
			
		||||
 | 
			
		||||
	p = strchr( Chan->modes, x[0] );
 | 
			
		||||
	if( ! p ) return FALSE;
 | 
			
		||||
	if( ! p ) return false;
 | 
			
		||||
 | 
			
		||||
	/* Client hat den Mode -> loeschen */
 | 
			
		||||
	/* Channel has mode -> delete */
 | 
			
		||||
	while( *p )
 | 
			
		||||
	{
 | 
			
		||||
		*p = *(p + 1);
 | 
			
		||||
		p++;
 | 
			
		||||
	}
 | 
			
		||||
	return TRUE;
 | 
			
		||||
	return true;
 | 
			
		||||
} /* Channel_ModeDel */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, CHAR Mode )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, char Mode )
 | 
			
		||||
{
 | 
			
		||||
	/* Channel-User-Mode soll gesetzt werden. TRUE wird geliefert,
 | 
			
		||||
	 * wenn der Mode neu gesetzt wurde, FALSE, wenn der User den
 | 
			
		||||
	 * Channel-Mode bereits hatte. */
 | 
			
		||||
	/* Set Channel-User-Mode.
 | 
			
		||||
	 * if mode was newly set, return true.
 | 
			
		||||
	 * if the User already had this channel-mode, return false.
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
	CL2CHAN *cl2chan;
 | 
			
		||||
	CHAR x[2];
 | 
			
		||||
	char x[2];
 | 
			
		||||
 | 
			
		||||
	assert( Chan != NULL );
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
@@ -546,23 +548,24 @@ Channel_UserModeAdd( CHANNEL *Chan, CLIENT *Client, CHAR Mode )
 | 
			
		||||
	x[0] = Mode; x[1] = '\0';
 | 
			
		||||
	if( ! strchr( cl2chan->modes, x[0] ))
 | 
			
		||||
	{
 | 
			
		||||
		/* Client hat den Mode noch nicht -> setzen */
 | 
			
		||||
		/* mode not set, -> set it */
 | 
			
		||||
		strlcat( cl2chan->modes, x, sizeof( cl2chan->modes ));
 | 
			
		||||
		return TRUE;
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
	else return FALSE;
 | 
			
		||||
	else return false;
 | 
			
		||||
} /* Channel_UserModeAdd */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, CHAR Mode )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, char Mode )
 | 
			
		||||
{
 | 
			
		||||
	/* Channel-User-Mode soll geloescht werden. TRUE wird geliefert,
 | 
			
		||||
	 * wenn der Mode entfernt wurde, FALSE, wenn der User den Channel-Mode
 | 
			
		||||
	 * ueberhaupt nicht hatte. */
 | 
			
		||||
	/* Delete Channel-User-Mode.
 | 
			
		||||
	 * If Mode was removed, return true.
 | 
			
		||||
	 * If User did not have the Channel-Mode, return false.
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
	CL2CHAN *cl2chan;
 | 
			
		||||
	CHAR x[2], *p;
 | 
			
		||||
	char x[2], *p;
 | 
			
		||||
 | 
			
		||||
	assert( Chan != NULL );
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
@@ -573,22 +576,22 @@ Channel_UserModeDel( CHANNEL *Chan, CLIENT *Client, CHAR Mode )
 | 
			
		||||
	x[0] = Mode; x[1] = '\0';
 | 
			
		||||
 | 
			
		||||
	p = strchr( cl2chan->modes, x[0] );
 | 
			
		||||
	if( ! p ) return FALSE;
 | 
			
		||||
	if( ! p ) return false;
 | 
			
		||||
 | 
			
		||||
	/* Client hat den Mode -> loeschen */
 | 
			
		||||
	/* Client has Mode -> delete */
 | 
			
		||||
	while( *p )
 | 
			
		||||
	{
 | 
			
		||||
		*p = *(p + 1);
 | 
			
		||||
		p++;
 | 
			
		||||
	}
 | 
			
		||||
	return TRUE;
 | 
			
		||||
	return true;
 | 
			
		||||
} /* Channel_UserModeDel */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CHAR *
 | 
			
		||||
GLOBAL char *
 | 
			
		||||
Channel_UserModes( CHANNEL *Chan, CLIENT *Client )
 | 
			
		||||
{
 | 
			
		||||
	/* Channel-Modes eines Users liefern */
 | 
			
		||||
	/* return Users' Channel-Modes */
 | 
			
		||||
	
 | 
			
		||||
	CL2CHAN *cl2chan;
 | 
			
		||||
 | 
			
		||||
@@ -602,20 +605,20 @@ Channel_UserModes( CHANNEL *Chan, CLIENT *Client )
 | 
			
		||||
} /* Channel_UserModes */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Channel_IsMemberOf( CHANNEL *Chan, CLIENT *Client )
 | 
			
		||||
{
 | 
			
		||||
	/* Pruefen, ob Client Mitglied in Channel ist */
 | 
			
		||||
	/* Test if Client is on Channel Chan */
 | 
			
		||||
 | 
			
		||||
	assert( Chan != NULL );
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
 | 
			
		||||
	if( Get_Cl2Chan( Chan, Client )) return TRUE;
 | 
			
		||||
	else return FALSE;
 | 
			
		||||
	if( Get_Cl2Chan( Chan, Client )) return true;
 | 
			
		||||
	else return false;
 | 
			
		||||
} /* Channel_IsMemberOf */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CHAR *
 | 
			
		||||
GLOBAL char *
 | 
			
		||||
Channel_Topic( CHANNEL *Chan )
 | 
			
		||||
{
 | 
			
		||||
	assert( Chan != NULL );
 | 
			
		||||
@@ -623,8 +626,8 @@ Channel_Topic( CHANNEL *Chan )
 | 
			
		||||
} /* Channel_Topic */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Channel_SetTopic( CHANNEL *Chan, CHAR *Topic )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Channel_SetTopic( CHANNEL *Chan, char *Topic )
 | 
			
		||||
{
 | 
			
		||||
	assert( Chan != NULL );
 | 
			
		||||
	assert( Topic != NULL );
 | 
			
		||||
@@ -633,8 +636,8 @@ Channel_SetTopic( CHANNEL *Chan, CHAR *Topic )
 | 
			
		||||
} /* Channel_SetTopic */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Channel_SetModes( CHANNEL *Chan, CHAR *Modes )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Channel_SetModes( CHANNEL *Chan, char *Modes )
 | 
			
		||||
{
 | 
			
		||||
	assert( Chan != NULL );
 | 
			
		||||
	assert( Modes != NULL );
 | 
			
		||||
@@ -643,8 +646,8 @@ Channel_SetModes( CHANNEL *Chan, CHAR *Modes )
 | 
			
		||||
} /* Channel_SetModes */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Channel_SetKey( CHANNEL *Chan, CHAR *Key )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Channel_SetKey( CHANNEL *Chan, char *Key )
 | 
			
		||||
{
 | 
			
		||||
	assert( Chan != NULL );
 | 
			
		||||
	assert( Key != NULL );
 | 
			
		||||
@@ -654,8 +657,8 @@ Channel_SetKey( CHANNEL *Chan, CHAR *Key )
 | 
			
		||||
} /* Channel_SetKey */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Channel_SetMaxUsers( CHANNEL *Chan, LONG Count )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Channel_SetMaxUsers( CHANNEL *Chan, long Count )
 | 
			
		||||
{
 | 
			
		||||
	assert( Chan != NULL );
 | 
			
		||||
 | 
			
		||||
@@ -664,58 +667,57 @@ Channel_SetMaxUsers( CHANNEL *Chan, LONG Count )
 | 
			
		||||
} /* Channel_SetMaxUsers */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR *Text )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, char *Text )
 | 
			
		||||
{
 | 
			
		||||
	BOOLEAN is_member, has_voice, is_op, ok;
 | 
			
		||||
	bool is_member, has_voice, is_op, ok;
 | 
			
		||||
 | 
			
		||||
	/* Okay, Ziel ist ein Channel */
 | 
			
		||||
	is_member = has_voice = is_op = FALSE;
 | 
			
		||||
	/* Okay, target is a channel */
 | 
			
		||||
	is_member = has_voice = is_op = false;
 | 
			
		||||
	if( Channel_IsMemberOf( Chan, From ))
 | 
			
		||||
	{
 | 
			
		||||
		is_member = TRUE;
 | 
			
		||||
		if( strchr( Channel_UserModes( Chan, From ), 'v' )) has_voice = TRUE;
 | 
			
		||||
		if( strchr( Channel_UserModes( Chan, From ), 'o' )) is_op = TRUE;
 | 
			
		||||
		is_member = true;
 | 
			
		||||
		if( strchr( Channel_UserModes( Chan, From ), 'v' )) has_voice = true;
 | 
			
		||||
		if( strchr( Channel_UserModes( Chan, From ), 'o' )) is_op = true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* pruefen, ob Client in Channel schreiben darf */
 | 
			
		||||
	ok = TRUE;
 | 
			
		||||
	if( strchr( Channel_Modes( Chan ), 'n' ) && ( ! is_member )) ok = FALSE;
 | 
			
		||||
	if( strchr( Channel_Modes( Chan ), 'm' ) && ( ! is_op ) && ( ! has_voice )) ok = FALSE;
 | 
			
		||||
	/* Is the client allowed to write to channel? */
 | 
			
		||||
	ok = true;
 | 
			
		||||
	if( strchr( Channel_Modes( Chan ), 'n' ) && ( ! is_member )) ok = false;
 | 
			
		||||
	if( strchr( Channel_Modes( Chan ), 'm' ) && ( ! is_op ) && ( ! has_voice )) ok = false;
 | 
			
		||||
	
 | 
			
		||||
	/* Is the client banned? */
 | 
			
		||||
	if( Lists_CheckBanned( From, Chan ))
 | 
			
		||||
	{
 | 
			
		||||
		/* Client is banned, bus is he channel operator or has voice? */
 | 
			
		||||
		if(( ! has_voice ) && ( ! is_op )) ok = false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if( ! ok ) return IRC_WriteStrClient( From, ERR_CANNOTSENDTOCHAN_MSG, Client_ID( From ), Channel_Name( Chan ));
 | 
			
		||||
 | 
			
		||||
	/* Text senden */
 | 
			
		||||
	/* Send text */
 | 
			
		||||
	if( Client_Conn( From ) > NONE ) Conn_UpdateIdle( Client_Conn( From ));
 | 
			
		||||
	return IRC_WriteStrChannelPrefix( Client, Chan, From, TRUE, "PRIVMSG %s :%s", Channel_Name( Chan ), Text );
 | 
			
		||||
	return IRC_WriteStrChannelPrefix( Client, Chan, From, true, "PRIVMSG %s :%s", Channel_Name( Chan ), Text );
 | 
			
		||||
} /* Channel_Write */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CHANNEL *
 | 
			
		||||
Channel_Create( CHAR *Name )
 | 
			
		||||
Channel_Create( char *Name )
 | 
			
		||||
{
 | 
			
		||||
	/* Neue Channel-Struktur anlegen */
 | 
			
		||||
 | 
			
		||||
	/* Create new CHANNEL structure and add it to linked list */
 | 
			
		||||
	CHANNEL *c;
 | 
			
		||||
 | 
			
		||||
	assert( Name != NULL );
 | 
			
		||||
	
 | 
			
		||||
	c = malloc( sizeof( CHANNEL ));
 | 
			
		||||
	c = (CHANNEL *)malloc( sizeof( CHANNEL ));
 | 
			
		||||
	if( ! c )
 | 
			
		||||
	{
 | 
			
		||||
		Log( LOG_EMERG, "Can't allocate memory! [New_Chan]" );
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
	c->next = NULL;
 | 
			
		||||
	memset( c, 0, sizeof( CHANNEL ));
 | 
			
		||||
	strlcpy( c->name, Name, sizeof( c->name ));
 | 
			
		||||
	c->name[CHANNEL_NAME_LEN - 1] = '\0';
 | 
			
		||||
	strcpy( c->modes, "" );
 | 
			
		||||
	strcpy( c->topic, "" );
 | 
			
		||||
	c->hash = Hash( c->name );
 | 
			
		||||
	strcpy( c->key, "" );
 | 
			
		||||
	c->maxusers = 0;
 | 
			
		||||
 | 
			
		||||
	/* Verketten */
 | 
			
		||||
	c->next = My_Channels;
 | 
			
		||||
	My_Channels = c;
 | 
			
		||||
	
 | 
			
		||||
@@ -752,7 +754,7 @@ Add_Client( CHANNEL *Chan, CLIENT *Client )
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
 | 
			
		||||
	/* neue CL2CHAN-Struktur anlegen */
 | 
			
		||||
	cl2chan = malloc( sizeof( CL2CHAN ));
 | 
			
		||||
	cl2chan = (CL2CHAN *)malloc( sizeof( CL2CHAN ));
 | 
			
		||||
	if( ! cl2chan )
 | 
			
		||||
	{
 | 
			
		||||
		Log( LOG_EMERG, "Can't allocate memory! [Add_Client]" );
 | 
			
		||||
@@ -772,8 +774,8 @@ Add_Client( CHANNEL *Chan, CLIENT *Client )
 | 
			
		||||
} /* Add_Client */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL BOOLEAN
 | 
			
		||||
Remove_Client( INT Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Reason, BOOLEAN InformServer )
 | 
			
		||||
LOCAL bool
 | 
			
		||||
Remove_Client( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Reason, bool InformServer )
 | 
			
		||||
{
 | 
			
		||||
	CL2CHAN *cl2chan, *last_cl2chan;
 | 
			
		||||
	CHANNEL *c;
 | 
			
		||||
@@ -791,7 +793,7 @@ Remove_Client( INT Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Re
 | 
			
		||||
		last_cl2chan = cl2chan;
 | 
			
		||||
		cl2chan = cl2chan->next;
 | 
			
		||||
	}
 | 
			
		||||
	if( ! cl2chan ) return FALSE;
 | 
			
		||||
	if( ! cl2chan ) return false;
 | 
			
		||||
 | 
			
		||||
	c = cl2chan->channel;
 | 
			
		||||
	assert( c != NULL );
 | 
			
		||||
@@ -806,22 +808,21 @@ Remove_Client( INT Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Re
 | 
			
		||||
		case REMOVE_QUIT:
 | 
			
		||||
			/* QUIT: andere Server wurden bereits informiert, vgl. Client_Destroy();
 | 
			
		||||
			 * hier also "nur" noch alle User in betroffenen Channeln infomieren */
 | 
			
		||||
			assert( InformServer == FALSE );
 | 
			
		||||
			IRC_WriteStrChannelPrefix( Origin, c, Origin, FALSE, "QUIT :%s", Reason );
 | 
			
		||||
			assert( InformServer == false );
 | 
			
		||||
			Log( LOG_DEBUG, "User \"%s\" left channel \"%s\" (%s).", Client_Mask( Client ), c->name, Reason );
 | 
			
		||||
			break;
 | 
			
		||||
		case REMOVE_KICK:
 | 
			
		||||
			/* User wurde geKICKed: ggf. andere Server sowie alle betroffenen User
 | 
			
		||||
			 * im entsprechenden Channel informieren */
 | 
			
		||||
			if( InformServer ) IRC_WriteStrServersPrefix( Client_NextHop( Origin ), Origin, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason );
 | 
			
		||||
			IRC_WriteStrChannelPrefix( Client, c, Origin, FALSE, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason );
 | 
			
		||||
			IRC_WriteStrChannelPrefix( Client, c, Origin, false, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason );
 | 
			
		||||
			if(( Client_Conn( Client ) > NONE ) && ( Client_Type( Client ) == CLIENT_USER )) IRC_WriteStrClientPrefix( Client, Origin, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason );
 | 
			
		||||
			Log( LOG_DEBUG, "User \"%s\" has been kicked of \"%s\" by \"%s\": %s.", Client_Mask( Client ), c->name, Client_ID( Origin ), Reason );
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
			/* PART */
 | 
			
		||||
			if( InformServer ) IRC_WriteStrServersPrefix( Origin, Client, "PART %s :%s", c->name, Reason );
 | 
			
		||||
			IRC_WriteStrChannelPrefix( Origin, c, Client, FALSE, "PART %s :%s", c->name, Reason );
 | 
			
		||||
			IRC_WriteStrChannelPrefix( Origin, c, Client, false, "PART %s :%s", c->name, Reason );
 | 
			
		||||
			if(( Client_Conn( Origin ) > NONE ) && ( Client_Type( Origin ) == CLIENT_USER )) IRC_WriteStrClientPrefix( Origin, Client, "PART %s :%s", c->name, Reason );
 | 
			
		||||
			Log( LOG_DEBUG, "User \"%s\" left channel \"%s\" (%s).", Client_Mask( Client ), c->name, Reason );
 | 
			
		||||
	}
 | 
			
		||||
@@ -832,7 +833,7 @@ Remove_Client( INT Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Re
 | 
			
		||||
		if( ! Get_First_Cl2Chan( NULL, Chan )) Delete_Channel( Chan );
 | 
			
		||||
	}
 | 
			
		||||
		
 | 
			
		||||
	return TRUE;
 | 
			
		||||
	return true;
 | 
			
		||||
} /* Remove_Client */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -861,7 +862,7 @@ Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Channel )
 | 
			
		||||
} /* Get_Next_Cl2Chan */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL BOOLEAN
 | 
			
		||||
LOCAL bool
 | 
			
		||||
Delete_Channel( CHANNEL *Chan )
 | 
			
		||||
{
 | 
			
		||||
	/* Channel-Struktur loeschen */
 | 
			
		||||
@@ -876,7 +877,7 @@ Delete_Channel( CHANNEL *Chan )
 | 
			
		||||
		last_chan = chan;
 | 
			
		||||
		chan = chan->next;
 | 
			
		||||
	}
 | 
			
		||||
	if( ! chan ) return FALSE;
 | 
			
		||||
	if( ! chan ) return false;
 | 
			
		||||
 | 
			
		||||
	Log( LOG_DEBUG, "Freed channel structure for \"%s\".", Chan->name );
 | 
			
		||||
 | 
			
		||||
@@ -888,7 +889,7 @@ Delete_Channel( CHANNEL *Chan )
 | 
			
		||||
	else My_Channels = chan->next;
 | 
			
		||||
	free( chan );
 | 
			
		||||
		
 | 
			
		||||
	return TRUE;
 | 
			
		||||
	return true;
 | 
			
		||||
} /* Delete_Channel */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: channel.h,v 1.26 2002/12/16 23:05:24 alex Exp $
 | 
			
		||||
 * $Id: channel.h,v 1.27 2005/03/19 18:43:48 fw Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * Channel management (header)
 | 
			
		||||
 */
 | 
			
		||||
@@ -25,12 +25,12 @@
 | 
			
		||||
typedef struct _CHANNEL
 | 
			
		||||
{
 | 
			
		||||
	struct _CHANNEL *next;
 | 
			
		||||
	CHAR name[CHANNEL_NAME_LEN];	/* Name of the channel */
 | 
			
		||||
	char name[CHANNEL_NAME_LEN];	/* Name of the channel */
 | 
			
		||||
	UINT32 hash;			/* Hash of the (lowecase!) name */
 | 
			
		||||
	CHAR modes[CHANNEL_MODE_LEN];	/* Channel modes */
 | 
			
		||||
	CHAR topic[CHANNEL_TOPIC_LEN];	/* Topic of the channel */
 | 
			
		||||
	CHAR key[CLIENT_PASS_LEN];	/* Channel key ("password", mode "k" ) */
 | 
			
		||||
	LONG maxusers;			/* Maximum number of members (mode "l") */
 | 
			
		||||
	char modes[CHANNEL_MODE_LEN];	/* Channel modes */
 | 
			
		||||
	char topic[CHANNEL_TOPIC_LEN];	/* Topic of the channel */
 | 
			
		||||
	char key[CLIENT_PASS_LEN];	/* Channel key ("password", mode "k" ) */
 | 
			
		||||
	long maxusers;			/* Maximum number of members (mode "l") */
 | 
			
		||||
} CHANNEL;
 | 
			
		||||
 | 
			
		||||
typedef struct _CLIENT2CHAN
 | 
			
		||||
@@ -38,7 +38,7 @@ typedef struct _CLIENT2CHAN
 | 
			
		||||
	struct _CLIENT2CHAN *next;
 | 
			
		||||
	CLIENT *client;
 | 
			
		||||
	CHANNEL *channel;
 | 
			
		||||
	CHAR modes[CHANNEL_MODE_LEN];	/* User-Modes in dem Channel */
 | 
			
		||||
	char modes[CHANNEL_MODE_LEN];	/* User-Modes in dem Channel */
 | 
			
		||||
} CL2CHAN;
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
@@ -49,36 +49,36 @@ typedef POINTER CL2CHAN;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Channel_Init PARAMS(( VOID ));
 | 
			
		||||
GLOBAL VOID Channel_InitPredefined PARAMS((  VOID ));
 | 
			
		||||
GLOBAL VOID Channel_Exit PARAMS(( VOID ));
 | 
			
		||||
GLOBAL void Channel_Init PARAMS(( void ));
 | 
			
		||||
GLOBAL void Channel_InitPredefined PARAMS((  void ));
 | 
			
		||||
GLOBAL void Channel_Exit PARAMS(( void ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Channel_Join PARAMS(( CLIENT *Client, CHAR *Name ));
 | 
			
		||||
GLOBAL BOOLEAN Channel_Part PARAMS(( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason ));
 | 
			
		||||
GLOBAL bool Channel_Join PARAMS(( CLIENT *Client, char *Name ));
 | 
			
		||||
GLOBAL bool Channel_Part PARAMS(( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason ));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Channel_Quit PARAMS(( CLIENT *Client, CHAR *Reason ));
 | 
			
		||||
GLOBAL void Channel_Quit PARAMS(( CLIENT *Client, char *Reason ));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Channel_Kick PARAMS((  CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason ));
 | 
			
		||||
GLOBAL void Channel_Kick PARAMS((  CLIENT *Client, CLIENT *Origin, char *Name, char *Reason ));
 | 
			
		||||
 | 
			
		||||
GLOBAL LONG Channel_Count PARAMS(( VOID ));
 | 
			
		||||
GLOBAL LONG Channel_MemberCount PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
GLOBAL INT Channel_CountForUser PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL INT Channel_PCount PARAMS(( VOID ));
 | 
			
		||||
GLOBAL long Channel_Count PARAMS(( void ));
 | 
			
		||||
GLOBAL long Channel_MemberCount PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
GLOBAL int Channel_CountForUser PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL int Channel_PCount PARAMS(( void ));
 | 
			
		||||
 | 
			
		||||
GLOBAL CHAR *Channel_Name PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
GLOBAL CHAR *Channel_Modes PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
GLOBAL CHAR *Channel_Topic PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
GLOBAL CHAR *Channel_Key PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
GLOBAL LONG Channel_MaxUsers PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
GLOBAL char *Channel_Name PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
GLOBAL char *Channel_Modes PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
GLOBAL char *Channel_Topic PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
GLOBAL char *Channel_Key PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
GLOBAL long Channel_MaxUsers PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Channel_SetTopic PARAMS(( CHANNEL *Chan, CHAR *Topic ));
 | 
			
		||||
GLOBAL VOID Channel_SetModes PARAMS(( CHANNEL *Chan, CHAR *Modes ));
 | 
			
		||||
GLOBAL VOID Channel_SetKey PARAMS(( CHANNEL *Chan, CHAR *Key ));
 | 
			
		||||
GLOBAL VOID Channel_SetMaxUsers PARAMS(( CHANNEL *Chan, LONG Count ));
 | 
			
		||||
GLOBAL void Channel_SetTopic PARAMS(( CHANNEL *Chan, char *Topic ));
 | 
			
		||||
GLOBAL void Channel_SetModes PARAMS(( CHANNEL *Chan, char *Modes ));
 | 
			
		||||
GLOBAL void Channel_SetKey PARAMS(( CHANNEL *Chan, char *Key ));
 | 
			
		||||
GLOBAL void Channel_SetMaxUsers PARAMS(( CHANNEL *Chan, long Count ));
 | 
			
		||||
 | 
			
		||||
GLOBAL CHANNEL *Channel_Search PARAMS(( CHAR *Name ));
 | 
			
		||||
GLOBAL CHANNEL *Channel_Search PARAMS(( char *Name ));
 | 
			
		||||
 | 
			
		||||
GLOBAL CHANNEL *Channel_First PARAMS(( VOID ));
 | 
			
		||||
GLOBAL CHANNEL *Channel_First PARAMS(( void ));
 | 
			
		||||
GLOBAL CHANNEL *Channel_Next PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
 | 
			
		||||
GLOBAL CL2CHAN *Channel_FirstMember PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
@@ -89,20 +89,20 @@ GLOBAL CL2CHAN *Channel_NextChannelOf PARAMS(( CLIENT *Client, CL2CHAN *Cl2Chan
 | 
			
		||||
GLOBAL CLIENT *Channel_GetClient PARAMS(( CL2CHAN *Cl2Chan ));
 | 
			
		||||
GLOBAL CHANNEL *Channel_GetChannel PARAMS(( CL2CHAN *Cl2Chan ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Channel_IsValidName PARAMS(( CHAR *Name ));
 | 
			
		||||
GLOBAL bool Channel_IsValidName PARAMS(( char *Name ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Channel_ModeAdd PARAMS(( CHANNEL *Chan, CHAR Mode ));
 | 
			
		||||
GLOBAL BOOLEAN Channel_ModeDel PARAMS(( CHANNEL *Chan, CHAR Mode ));
 | 
			
		||||
GLOBAL bool Channel_ModeAdd PARAMS(( CHANNEL *Chan, char Mode ));
 | 
			
		||||
GLOBAL bool Channel_ModeDel PARAMS(( CHANNEL *Chan, char Mode ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Channel_UserModeAdd PARAMS(( CHANNEL *Chan, CLIENT *Client, CHAR Mode ));
 | 
			
		||||
GLOBAL BOOLEAN Channel_UserModeDel PARAMS(( CHANNEL *Chan, CLIENT *Client, CHAR Mode ));
 | 
			
		||||
GLOBAL CHAR *Channel_UserModes PARAMS(( CHANNEL *Chan, CLIENT *Client ));
 | 
			
		||||
GLOBAL bool Channel_UserModeAdd PARAMS(( CHANNEL *Chan, CLIENT *Client, char Mode ));
 | 
			
		||||
GLOBAL bool Channel_UserModeDel PARAMS(( CHANNEL *Chan, CLIENT *Client, char Mode ));
 | 
			
		||||
GLOBAL char *Channel_UserModes PARAMS(( CHANNEL *Chan, CLIENT *Client ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Channel_IsMemberOf PARAMS(( CHANNEL *Chan, CLIENT *Client ));
 | 
			
		||||
GLOBAL bool Channel_IsMemberOf PARAMS(( CHANNEL *Chan, CLIENT *Client ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Channel_Write PARAMS(( CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR *Text ));
 | 
			
		||||
GLOBAL bool Channel_Write PARAMS(( CHANNEL *Chan, CLIENT *From, CLIENT *Client, char *Text ));
 | 
			
		||||
 | 
			
		||||
GLOBAL CHANNEL *Channel_Create PARAMS(( CHAR *Name ));
 | 
			
		||||
GLOBAL CHANNEL *Channel_Create PARAMS(( char *Name ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 * Copyright (c)2001-2005 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
@@ -17,7 +17,7 @@
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: client.c,v 1.74 2003/03/31 15:54:21 alex Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: client.c,v 1.84.2.1 2006/03/24 23:30:34 fw Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
@@ -25,8 +25,10 @@ static char UNUSED id[] = "$Id: client.c,v 1.74 2003/03/31 15:54:21 alex Exp $";
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <strings.h>
 | 
			
		||||
#include <netdb.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
@@ -49,26 +51,29 @@ static char UNUSED id[] = "$Id: client.c,v 1.74 2003/03/31 15:54:21 alex Exp $";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL CLIENT *This_Server, *My_Clients;
 | 
			
		||||
LOCAL CHAR GetID_Buffer[GETID_LEN];
 | 
			
		||||
LOCAL char GetID_Buffer[GETID_LEN];
 | 
			
		||||
 | 
			
		||||
LOCAL WHOWAS My_Whowas[MAX_WHOWAS];
 | 
			
		||||
LOCAL int Last_Whowas = -1;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL LONG Count PARAMS(( CLIENT_TYPE Type ));
 | 
			
		||||
LOCAL LONG MyCount PARAMS(( CLIENT_TYPE Type ));
 | 
			
		||||
LOCAL long Count PARAMS(( CLIENT_TYPE Type ));
 | 
			
		||||
LOCAL long MyCount PARAMS(( CLIENT_TYPE Type ));
 | 
			
		||||
 | 
			
		||||
LOCAL CLIENT *New_Client_Struct PARAMS(( VOID ));
 | 
			
		||||
LOCAL VOID Generate_MyToken PARAMS(( CLIENT *Client ));
 | 
			
		||||
LOCAL VOID Adjust_Counters PARAMS(( CLIENT *Client ));
 | 
			
		||||
LOCAL CLIENT *New_Client_Struct PARAMS(( void ));
 | 
			
		||||
LOCAL void Generate_MyToken PARAMS(( CLIENT *Client ));
 | 
			
		||||
LOCAL void Adjust_Counters PARAMS(( CLIENT *Client ));
 | 
			
		||||
 | 
			
		||||
#ifndef Client_DestroyNow
 | 
			
		||||
GLOBAL VOID Client_DestroyNow PARAMS((CLIENT *Client ));
 | 
			
		||||
GLOBAL void Client_DestroyNow PARAMS((CLIENT *Client ));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LONG Max_Users = 0, My_Max_Users = 0;
 | 
			
		||||
long Max_Users = 0, My_Max_Users = 0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Client_Init( VOID )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Client_Init( void )
 | 
			
		||||
{
 | 
			
		||||
	struct hostent *h;
 | 
			
		||||
	
 | 
			
		||||
@@ -96,17 +101,19 @@ Client_Init( VOID )
 | 
			
		||||
	Client_SetInfo( This_Server, Conf_ServerInfo );
 | 
			
		||||
 | 
			
		||||
	My_Clients = This_Server;
 | 
			
		||||
	
 | 
			
		||||
	memset( &My_Whowas, 0, sizeof( My_Whowas ));
 | 
			
		||||
} /* Client_Init */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Client_Exit( VOID )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Client_Exit( void )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *c, *next;
 | 
			
		||||
	INT cnt;
 | 
			
		||||
	int cnt;
 | 
			
		||||
 | 
			
		||||
	if( NGIRCd_SignalRestart ) Client_Destroy( This_Server, "Server going down (restarting).", NULL, FALSE );
 | 
			
		||||
	else Client_Destroy( This_Server, "Server going down.", NULL, FALSE );
 | 
			
		||||
	if( NGIRCd_SignalRestart ) Client_Destroy( This_Server, "Server going down (restarting).", NULL, false );
 | 
			
		||||
	else Client_Destroy( This_Server, "Server going down.", NULL, false );
 | 
			
		||||
	
 | 
			
		||||
	cnt = 0;
 | 
			
		||||
	c = My_Clients;
 | 
			
		||||
@@ -122,14 +129,14 @@ Client_Exit( VOID )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CLIENT *
 | 
			
		||||
Client_ThisServer( VOID )
 | 
			
		||||
Client_ThisServer( void )
 | 
			
		||||
{
 | 
			
		||||
	return This_Server;
 | 
			
		||||
} /* Client_ThisServer */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CLIENT *
 | 
			
		||||
Client_NewLocal( CONN_ID Idx, CHAR *Hostname, INT Type, BOOLEAN Idented )
 | 
			
		||||
Client_NewLocal( CONN_ID Idx, char *Hostname, int Type, bool Idented )
 | 
			
		||||
{
 | 
			
		||||
	/* Neuen lokalen Client erzeugen: Wrapper-Funktion fuer Client_New(). */
 | 
			
		||||
	return Client_New( Idx, This_Server, NULL, Type, NULL, NULL, Hostname, NULL, 0, 0, NULL, Idented );
 | 
			
		||||
@@ -137,7 +144,7 @@ Client_NewLocal( CONN_ID Idx, CHAR *Hostname, INT Type, BOOLEAN Idented )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CLIENT *
 | 
			
		||||
Client_NewRemoteServer( CLIENT *Introducer, CHAR *Hostname, CLIENT *TopServer, INT Hops, INT Token, CHAR *Info, BOOLEAN Idented )
 | 
			
		||||
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 Client_New( NONE, Introducer, TopServer, CLIENT_SERVER, Hostname, NULL, Hostname, Info, Hops, Token, NULL, Idented );
 | 
			
		||||
@@ -145,7 +152,7 @@ Client_NewRemoteServer( CLIENT *Introducer, CHAR *Hostname, CLIENT *TopServer, I
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CLIENT *
 | 
			
		||||
Client_NewRemoteUser( CLIENT *Introducer, CHAR *Nick, INT Hops, CHAR *User, CHAR *Hostname, INT Token, CHAR *Modes, CHAR *Info, BOOLEAN 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 Client_New( NONE, Introducer, NULL, CLIENT_USER, Nick, User, Hostname, Info, Hops, Token, Modes, Idented );
 | 
			
		||||
@@ -153,7 +160,7 @@ Client_NewRemoteUser( CLIENT *Introducer, CHAR *Nick, INT Hops, CHAR *User, CHAR
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CLIENT *
 | 
			
		||||
Client_New( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, INT Type, CHAR *ID, CHAR *User, CHAR *Hostname, CHAR *Info, INT Hops, INT Token, CHAR *Modes, BOOLEAN Idented )
 | 
			
		||||
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 )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *client;
 | 
			
		||||
 | 
			
		||||
@@ -165,6 +172,7 @@ Client_New( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, INT Type, CHAR *
 | 
			
		||||
	if( ! client ) return NULL;
 | 
			
		||||
 | 
			
		||||
	/* Initialisieren */
 | 
			
		||||
	client->starttime = time(NULL);
 | 
			
		||||
	client->conn_id = Idx;
 | 
			
		||||
	client->introducer = Introducer;
 | 
			
		||||
	client->topserver = TopServer;
 | 
			
		||||
@@ -192,13 +200,13 @@ Client_New( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, INT Type, CHAR *
 | 
			
		||||
} /* Client_New */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN SendQuit )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Client_Destroy( CLIENT *Client, char *LogMsg, char *FwdMsg, bool SendQuit )
 | 
			
		||||
{
 | 
			
		||||
	/* Client entfernen. */
 | 
			
		||||
	
 | 
			
		||||
	CLIENT *last, *c;
 | 
			
		||||
	CHAR msg[LINE_LEN], *txt;
 | 
			
		||||
	char msg[LINE_LEN], *txt;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
 | 
			
		||||
@@ -207,7 +215,11 @@ Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN SendQuit )
 | 
			
		||||
	if( ! txt ) txt = "Reason unknown.";
 | 
			
		||||
 | 
			
		||||
	/* Netz-Split-Nachricht vorbereiten (noch nicht optimal) */
 | 
			
		||||
	if( Client->type == CLIENT_SERVER ) snprintf( msg, sizeof( msg ), "%s: lost server %s", This_Server->id, Client->id );
 | 
			
		||||
	if( Client->type == CLIENT_SERVER ) {
 | 
			
		||||
		strlcpy(msg, This_Server->id, sizeof (msg));
 | 
			
		||||
		strlcat(msg, " ", sizeof (msg));
 | 
			
		||||
		strlcat(msg, Client->id, sizeof (msg));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	last = NULL;
 | 
			
		||||
	c = My_Clients;
 | 
			
		||||
@@ -217,7 +229,7 @@ Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN SendQuit )
 | 
			
		||||
		{
 | 
			
		||||
			/* der Client, der geloescht wird ist ein Server. Der Client, den wir gerade
 | 
			
		||||
			 * pruefen, ist ein Child von diesem und muss daher auch entfernt werden */
 | 
			
		||||
			Client_Destroy( c, NULL, msg, FALSE );
 | 
			
		||||
			Client_Destroy( c, NULL, msg, false );
 | 
			
		||||
			last = NULL;
 | 
			
		||||
			c = My_Clients;
 | 
			
		||||
			continue;
 | 
			
		||||
@@ -256,7 +268,12 @@ Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN SendQuit )
 | 
			
		||||
						else IRC_WriteStrServersPrefix( Client_NextHop( c ), c, "QUIT :" );
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				/* Unregister client from channels */
 | 
			
		||||
				Channel_Quit( c, FwdMsg ? FwdMsg : c->id );
 | 
			
		||||
				
 | 
			
		||||
				/* Register client in My_Whowas structure */
 | 
			
		||||
				Client_RegisterWhowas( c );
 | 
			
		||||
			}
 | 
			
		||||
			else if( c->type == CLIENT_SERVER )
 | 
			
		||||
			{
 | 
			
		||||
@@ -279,11 +296,9 @@ Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN SendQuit )
 | 
			
		||||
				{
 | 
			
		||||
					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
 | 
			
		||||
				{
 | 
			
		||||
					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 );
 | 
			
		||||
				} else {
 | 
			
		||||
					Log(LOG_WARNING, "Unregistered unknown client \"%s\": %s",
 | 
			
		||||
								c->id[0] ? c->id : "(No Nick)", txt );
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
@@ -296,7 +311,7 @@ Client_Destroy( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN SendQuit )
 | 
			
		||||
} /* Client_Destroy */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Client_DestroyNow( CLIENT *Client )
 | 
			
		||||
{
 | 
			
		||||
	/* Destroy client structure immediately. This function is only
 | 
			
		||||
@@ -325,8 +340,8 @@ Client_DestroyNow( CLIENT *Client )
 | 
			
		||||
} /* Client_DestroyNow */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Client_SetHostname( CLIENT *Client, CHAR *Hostname )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Client_SetHostname( CLIENT *Client, char *Hostname )
 | 
			
		||||
{
 | 
			
		||||
	/* Hostname eines Clients setzen */
 | 
			
		||||
	
 | 
			
		||||
@@ -337,8 +352,8 @@ Client_SetHostname( CLIENT *Client, CHAR *Hostname )
 | 
			
		||||
} /* Client_SetHostname */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Client_SetID( CLIENT *Client, CHAR *ID )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Client_SetID( CLIENT *Client, char *ID )
 | 
			
		||||
{
 | 
			
		||||
	/* Hostname eines Clients setzen, Hash-Wert berechnen */
 | 
			
		||||
 | 
			
		||||
@@ -352,8 +367,8 @@ Client_SetID( CLIENT *Client, CHAR *ID )
 | 
			
		||||
} /* Client_SetID */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Client_SetUser( CLIENT *Client, CHAR *User, BOOLEAN Idented )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Client_SetUser( CLIENT *Client, char *User, bool Idented )
 | 
			
		||||
{
 | 
			
		||||
	/* Username eines Clients setzen */
 | 
			
		||||
 | 
			
		||||
@@ -369,8 +384,8 @@ Client_SetUser( CLIENT *Client, CHAR *User, BOOLEAN Idented )
 | 
			
		||||
} /* Client_SetUser */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Client_SetInfo( CLIENT *Client, CHAR *Info )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Client_SetInfo( CLIENT *Client, char *Info )
 | 
			
		||||
{
 | 
			
		||||
	/* Hostname eines Clients setzen */
 | 
			
		||||
 | 
			
		||||
@@ -381,8 +396,8 @@ Client_SetInfo( CLIENT *Client, CHAR *Info )
 | 
			
		||||
} /* Client_SetInfo */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Client_SetModes( CLIENT *Client, CHAR *Modes )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Client_SetModes( CLIENT *Client, char *Modes )
 | 
			
		||||
{
 | 
			
		||||
	/* Modes eines Clients setzen */
 | 
			
		||||
 | 
			
		||||
@@ -393,8 +408,8 @@ Client_SetModes( CLIENT *Client, CHAR *Modes )
 | 
			
		||||
} /* Client_SetModes */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Client_SetFlags( CLIENT *Client, CHAR *Flags )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Client_SetFlags( CLIENT *Client, char *Flags )
 | 
			
		||||
{
 | 
			
		||||
	/* Flags eines Clients setzen */
 | 
			
		||||
 | 
			
		||||
@@ -405,8 +420,8 @@ Client_SetFlags( CLIENT *Client, CHAR *Flags )
 | 
			
		||||
} /* Client_SetFlags */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Client_SetPassword( CLIENT *Client, CHAR *Pwd )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Client_SetPassword( CLIENT *Client, char *Pwd )
 | 
			
		||||
{
 | 
			
		||||
	/* Von einem Client geliefertes Passwort */
 | 
			
		||||
 | 
			
		||||
@@ -417,8 +432,8 @@ Client_SetPassword( CLIENT *Client, CHAR *Pwd )
 | 
			
		||||
} /* Client_SetPassword */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Client_SetAway( CLIENT *Client, CHAR *Txt )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Client_SetAway( CLIENT *Client, char *Txt )
 | 
			
		||||
{
 | 
			
		||||
	/* Set AWAY reason of client */
 | 
			
		||||
 | 
			
		||||
@@ -430,8 +445,8 @@ Client_SetAway( CLIENT *Client, CHAR *Txt )
 | 
			
		||||
} /* Client_SetAway */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Client_SetType( CLIENT *Client, INT Type )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Client_SetType( CLIENT *Client, int Type )
 | 
			
		||||
{
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	Client->type = Type;
 | 
			
		||||
@@ -440,23 +455,23 @@ Client_SetType( CLIENT *Client, INT Type )
 | 
			
		||||
} /* Client_SetType */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Client_SetHops( CLIENT *Client, INT Hops )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Client_SetHops( CLIENT *Client, int Hops )
 | 
			
		||||
{
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	Client->hops = Hops;
 | 
			
		||||
} /* Client_SetHops */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Client_SetToken( CLIENT *Client, INT Token )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Client_SetToken( CLIENT *Client, int Token )
 | 
			
		||||
{
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	Client->token = Token;
 | 
			
		||||
} /* Client_SetToken */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Client_SetIntroducer( CLIENT *Client, CLIENT *Introducer )
 | 
			
		||||
{
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
@@ -465,22 +480,23 @@ Client_SetIntroducer( CLIENT *Client, CLIENT *Introducer )
 | 
			
		||||
} /* Client_SetIntroducer */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Client_SetOperByMe( CLIENT *Client, BOOLEAN OperByMe )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Client_SetOperByMe( CLIENT *Client, bool OperByMe )
 | 
			
		||||
{
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	Client->oper_by_me = OperByMe;
 | 
			
		||||
} /* Client_SetOperByMe */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
Client_ModeAdd( CLIENT *Client, CHAR Mode )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Client_ModeAdd( CLIENT *Client, char Mode )
 | 
			
		||||
{
 | 
			
		||||
	/* Mode soll gesetzt werden. TRUE wird geliefert, wenn der
 | 
			
		||||
	 * Mode neu gesetzt wurde, FALSE, wenn der Client den Mode
 | 
			
		||||
	 * bereits hatte. */
 | 
			
		||||
	/* Set Mode.
 | 
			
		||||
	 * If Client already alread had Mode, return false.
 | 
			
		||||
	 * If the Mode was newly set, return true.
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
	CHAR x[2];
 | 
			
		||||
	char x[2];
 | 
			
		||||
	
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
 | 
			
		||||
@@ -489,43 +505,45 @@ Client_ModeAdd( CLIENT *Client, CHAR Mode )
 | 
			
		||||
	{
 | 
			
		||||
		/* Client hat den Mode noch nicht -> setzen */
 | 
			
		||||
		strlcat( Client->modes, x, sizeof( Client->modes ));
 | 
			
		||||
		return TRUE;
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
	else return FALSE;
 | 
			
		||||
	else return false;
 | 
			
		||||
} /* Client_ModeAdd */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
Client_ModeDel( CLIENT *Client, CHAR Mode )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Client_ModeDel( CLIENT *Client, char Mode )
 | 
			
		||||
{
 | 
			
		||||
	/* Mode soll geloescht werden. TRUE wird geliefert, wenn der
 | 
			
		||||
	* Mode entfernt wurde, FALSE, wenn der Client den Mode
 | 
			
		||||
	* ueberhaupt nicht hatte. */
 | 
			
		||||
	/* Delete Mode.
 | 
			
		||||
	 * If Mode was removed, return true.
 | 
			
		||||
	 * If Client did not have Mode, return false.
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
	CHAR x[2], *p;
 | 
			
		||||
	char x[2], *p;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
 | 
			
		||||
	x[0] = Mode; x[1] = '\0';
 | 
			
		||||
 | 
			
		||||
	p = strchr( Client->modes, x[0] );
 | 
			
		||||
	if( ! p ) return FALSE;
 | 
			
		||||
	if( ! p ) return false;
 | 
			
		||||
 | 
			
		||||
	/* Client hat den Mode -> loeschen */
 | 
			
		||||
	/* Client has Mode -> delete */
 | 
			
		||||
	while( *p )
 | 
			
		||||
	{
 | 
			
		||||
		*p = *(p + 1);
 | 
			
		||||
		p++;
 | 
			
		||||
	}
 | 
			
		||||
	return TRUE;
 | 
			
		||||
	return true;
 | 
			
		||||
} /* Client_ModeDel */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CLIENT *
 | 
			
		||||
Client_GetFromConn( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
	/* Client-Struktur, die zur lokalen Verbindung Idx gehoert,
 | 
			
		||||
	 * liefern. Wird keine gefunden, so wird NULL geliefert. */
 | 
			
		||||
	/* return Client-Structure that belongs to the local Connection Idx gehoert.
 | 
			
		||||
	 * If none is found, return NULL.
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
	CLIENT *c;
 | 
			
		||||
 | 
			
		||||
@@ -542,18 +560,19 @@ Client_GetFromConn( CONN_ID Idx )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CLIENT *
 | 
			
		||||
Client_Search( CHAR *Nick )
 | 
			
		||||
Client_Search( char *Nick )
 | 
			
		||||
{
 | 
			
		||||
	/* Client-Struktur, die den entsprechenden Nick hat, liefern.
 | 
			
		||||
	 * Wird keine gefunden, so wird NULL geliefert. */
 | 
			
		||||
	/* return Client-Structure that has the corresponding Nick.
 | 
			
		||||
	 * If none is found, return NULL.
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
	CHAR search_id[CLIENT_ID_LEN], *ptr;
 | 
			
		||||
	char search_id[CLIENT_ID_LEN], *ptr;
 | 
			
		||||
	CLIENT *c = NULL;
 | 
			
		||||
	UINT32 search_hash;
 | 
			
		||||
 | 
			
		||||
	assert( Nick != NULL );
 | 
			
		||||
 | 
			
		||||
	/* Nick kopieren und ggf. Host-Mask abschneiden */
 | 
			
		||||
	/* copy Nick and truncate hostmask if necessary */
 | 
			
		||||
	strlcpy( search_id, Nick, sizeof( search_id ));
 | 
			
		||||
	ptr = strchr( search_id, '!' );
 | 
			
		||||
	if( ptr ) *ptr = '\0';
 | 
			
		||||
@@ -575,7 +594,7 @@ Client_Search( CHAR *Nick )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CLIENT *
 | 
			
		||||
Client_GetFromToken( CLIENT *Client, INT Token )
 | 
			
		||||
Client_GetFromToken( CLIENT *Client, int Token )
 | 
			
		||||
{
 | 
			
		||||
	/* Client-Struktur, die den entsprechenden Introducer (=Client)
 | 
			
		||||
	 * und das gegebene Token hat, liefern. Wird keine gefunden,
 | 
			
		||||
@@ -596,7 +615,7 @@ Client_GetFromToken( CLIENT *Client, INT Token )
 | 
			
		||||
} /* Client_GetFromToken */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL INT
 | 
			
		||||
GLOBAL int
 | 
			
		||||
Client_Type( CLIENT *Client )
 | 
			
		||||
{
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
@@ -612,7 +631,7 @@ Client_Conn( CLIENT *Client )
 | 
			
		||||
} /* Client_Conn */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CHAR *
 | 
			
		||||
GLOBAL char *
 | 
			
		||||
Client_ID( CLIENT *Client )
 | 
			
		||||
{
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
@@ -626,7 +645,7 @@ Client_ID( CLIENT *Client )
 | 
			
		||||
} /* Client_ID */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CHAR *
 | 
			
		||||
GLOBAL char *
 | 
			
		||||
Client_Info( CLIENT *Client )
 | 
			
		||||
{
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
@@ -634,7 +653,7 @@ Client_Info( CLIENT *Client )
 | 
			
		||||
} /* Client_Info */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CHAR *
 | 
			
		||||
GLOBAL char *
 | 
			
		||||
Client_User( CLIENT *Client )
 | 
			
		||||
{
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
@@ -643,7 +662,7 @@ Client_User( CLIENT *Client )
 | 
			
		||||
} /* Client_User */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CHAR *
 | 
			
		||||
GLOBAL char *
 | 
			
		||||
Client_Hostname( CLIENT *Client )
 | 
			
		||||
{
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
@@ -651,7 +670,7 @@ Client_Hostname( CLIENT *Client )
 | 
			
		||||
} /* Client_Hostname */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CHAR *
 | 
			
		||||
GLOBAL char *
 | 
			
		||||
Client_Password( CLIENT *Client )
 | 
			
		||||
{
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
@@ -659,7 +678,7 @@ Client_Password( CLIENT *Client )
 | 
			
		||||
} /* Client_Password */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CHAR *
 | 
			
		||||
GLOBAL char *
 | 
			
		||||
Client_Modes( CLIENT *Client )
 | 
			
		||||
{
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
@@ -667,7 +686,7 @@ Client_Modes( CLIENT *Client )
 | 
			
		||||
} /* Client_Modes */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CHAR *
 | 
			
		||||
GLOBAL char *
 | 
			
		||||
Client_Flags( CLIENT *Client )
 | 
			
		||||
{
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
@@ -675,7 +694,7 @@ Client_Flags( CLIENT *Client )
 | 
			
		||||
} /* Client_Flags */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Client_OperByMe( CLIENT *Client )
 | 
			
		||||
{
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
@@ -683,7 +702,7 @@ Client_OperByMe( CLIENT *Client )
 | 
			
		||||
} /* Client_OperByMe */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL INT
 | 
			
		||||
GLOBAL int
 | 
			
		||||
Client_Hops( CLIENT *Client )
 | 
			
		||||
{
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
@@ -691,7 +710,7 @@ Client_Hops( CLIENT *Client )
 | 
			
		||||
} /* Client_Hops */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL INT
 | 
			
		||||
GLOBAL int
 | 
			
		||||
Client_Token( CLIENT *Client )
 | 
			
		||||
{
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
@@ -699,7 +718,7 @@ Client_Token( CLIENT *Client )
 | 
			
		||||
} /* Client_Token */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL INT
 | 
			
		||||
GLOBAL int
 | 
			
		||||
Client_MyToken( CLIENT *Client )
 | 
			
		||||
{
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
@@ -720,7 +739,7 @@ Client_NextHop( CLIENT *Client )
 | 
			
		||||
} /* Client_NextHop */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CHAR *
 | 
			
		||||
GLOBAL char *
 | 
			
		||||
Client_Mask( CLIENT *Client )
 | 
			
		||||
{
 | 
			
		||||
	/* Client-"ID" liefern, wie sie z.B. fuer
 | 
			
		||||
@@ -751,15 +770,15 @@ Client_TopServer( CLIENT *Client )
 | 
			
		||||
} /* Client_TopServer */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
Client_HasMode( CLIENT *Client, CHAR Mode )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Client_HasMode( CLIENT *Client, char Mode )
 | 
			
		||||
{
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	return strchr( Client->modes, Mode ) != NULL;
 | 
			
		||||
} /* Client_HasMode */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CHAR *
 | 
			
		||||
GLOBAL char *
 | 
			
		||||
Client_Away( CLIENT *Client )
 | 
			
		||||
{
 | 
			
		||||
	/* AWAY-Text liefern */
 | 
			
		||||
@@ -769,8 +788,8 @@ Client_Away( CLIENT *Client )
 | 
			
		||||
} /* Client_Away */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
Client_CheckNick( CLIENT *Client, CHAR *Nick )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Client_CheckNick( CLIENT *Client, char *Nick )
 | 
			
		||||
{
 | 
			
		||||
	/* Nick ueberpruefen */
 | 
			
		||||
 | 
			
		||||
@@ -781,7 +800,7 @@ Client_CheckNick( CLIENT *Client, CHAR *Nick )
 | 
			
		||||
	if( ! Client_IsValidNick( Nick ))
 | 
			
		||||
	{
 | 
			
		||||
		IRC_WriteStrClient( Client, ERR_ERRONEUSNICKNAME_MSG, Client_ID( Client ), Nick );
 | 
			
		||||
		return FALSE;
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Nick bereits vergeben? */
 | 
			
		||||
@@ -789,19 +808,19 @@ Client_CheckNick( CLIENT *Client, CHAR *Nick )
 | 
			
		||||
	{
 | 
			
		||||
		/* den Nick gibt es bereits */
 | 
			
		||||
		IRC_WriteStrClient( Client, ERR_NICKNAMEINUSE_MSG, Client_ID( Client ), Nick );
 | 
			
		||||
		return FALSE;
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return TRUE;
 | 
			
		||||
	return true;
 | 
			
		||||
} /* Client_CheckNick */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
Client_CheckID( CLIENT *Client, CHAR *ID )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Client_CheckID( CLIENT *Client, char *ID )
 | 
			
		||||
{
 | 
			
		||||
	/* Nick ueberpruefen */
 | 
			
		||||
 | 
			
		||||
	CHAR str[COMMAND_LEN];
 | 
			
		||||
	char str[COMMAND_LEN];
 | 
			
		||||
	CLIENT *c;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
@@ -812,7 +831,7 @@ Client_CheckID( CLIENT *Client, CHAR *ID )
 | 
			
		||||
	if( strlen( ID ) > CLIENT_ID_LEN )
 | 
			
		||||
	{
 | 
			
		||||
		IRC_WriteStrClient( Client, ERR_ERRONEUSNICKNAME_MSG, Client_ID( Client ), ID );
 | 
			
		||||
		return FALSE;
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* ID bereits vergeben? */
 | 
			
		||||
@@ -825,18 +844,18 @@ Client_CheckID( CLIENT *Client, CHAR *ID )
 | 
			
		||||
			snprintf( str, sizeof( str ), "ID \"%s\" already registered", ID );
 | 
			
		||||
			if( Client->conn_id != c->conn_id ) Log( LOG_ERR, "%s (on connection %d)!", str, c->conn_id );
 | 
			
		||||
			else Log( LOG_ERR, "%s (via network)!", str );
 | 
			
		||||
			Conn_Close( Client->conn_id, str, str, TRUE );
 | 
			
		||||
			return FALSE;
 | 
			
		||||
			Conn_Close( Client->conn_id, str, str, true);
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
		c = (CLIENT *)c->next;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return TRUE;
 | 
			
		||||
	return true;
 | 
			
		||||
} /* Client_CheckID */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CLIENT *
 | 
			
		||||
Client_First( VOID )
 | 
			
		||||
Client_First( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Ersten Client liefern. */
 | 
			
		||||
 | 
			
		||||
@@ -855,46 +874,46 @@ Client_Next( CLIENT *c )
 | 
			
		||||
} /* Client_Next */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL LONG
 | 
			
		||||
Client_UserCount( VOID )
 | 
			
		||||
GLOBAL long
 | 
			
		||||
Client_UserCount( void )
 | 
			
		||||
{
 | 
			
		||||
	return Count( CLIENT_USER );
 | 
			
		||||
} /* Client_UserCount */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL LONG
 | 
			
		||||
Client_ServiceCount( VOID )
 | 
			
		||||
GLOBAL long
 | 
			
		||||
Client_ServiceCount( void )
 | 
			
		||||
{
 | 
			
		||||
	return Count( CLIENT_SERVICE );;
 | 
			
		||||
} /* Client_ServiceCount */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL LONG
 | 
			
		||||
Client_ServerCount( VOID )
 | 
			
		||||
GLOBAL long
 | 
			
		||||
Client_ServerCount( void )
 | 
			
		||||
{
 | 
			
		||||
	return Count( CLIENT_SERVER );
 | 
			
		||||
} /* Client_ServerCount */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL LONG
 | 
			
		||||
Client_MyUserCount( VOID )
 | 
			
		||||
GLOBAL long
 | 
			
		||||
Client_MyUserCount( void )
 | 
			
		||||
{
 | 
			
		||||
	return MyCount( CLIENT_USER );
 | 
			
		||||
} /* Client_MyUserCount */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL LONG
 | 
			
		||||
Client_MyServiceCount( VOID )
 | 
			
		||||
GLOBAL long
 | 
			
		||||
Client_MyServiceCount( void )
 | 
			
		||||
{
 | 
			
		||||
	return MyCount( CLIENT_SERVICE );
 | 
			
		||||
} /* Client_MyServiceCount */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL LONG
 | 
			
		||||
Client_MyServerCount( VOID )
 | 
			
		||||
GLOBAL long
 | 
			
		||||
Client_MyServerCount( void )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *c;
 | 
			
		||||
	LONG cnt;
 | 
			
		||||
	long cnt;
 | 
			
		||||
 | 
			
		||||
	cnt = 0;
 | 
			
		||||
	c = My_Clients;
 | 
			
		||||
@@ -907,11 +926,11 @@ Client_MyServerCount( VOID )
 | 
			
		||||
} /* Client_MyServerCount */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL LONG
 | 
			
		||||
Client_OperCount( VOID )
 | 
			
		||||
GLOBAL long
 | 
			
		||||
Client_OperCount( void )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *c;
 | 
			
		||||
	LONG cnt;
 | 
			
		||||
	long cnt;
 | 
			
		||||
 | 
			
		||||
	cnt = 0;
 | 
			
		||||
	c = My_Clients;
 | 
			
		||||
@@ -924,11 +943,11 @@ Client_OperCount( VOID )
 | 
			
		||||
} /* Client_OperCount */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL LONG
 | 
			
		||||
Client_UnknownCount( VOID )
 | 
			
		||||
GLOBAL long
 | 
			
		||||
Client_UnknownCount( void )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *c;
 | 
			
		||||
	LONG cnt;
 | 
			
		||||
	long cnt;
 | 
			
		||||
 | 
			
		||||
	cnt = 0;
 | 
			
		||||
	c = My_Clients;
 | 
			
		||||
@@ -941,52 +960,84 @@ Client_UnknownCount( VOID )
 | 
			
		||||
} /* Client_UnknownCount */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL LONG
 | 
			
		||||
Client_MaxUserCount( VOID )
 | 
			
		||||
GLOBAL long
 | 
			
		||||
Client_MaxUserCount( void )
 | 
			
		||||
{
 | 
			
		||||
	return Max_Users;
 | 
			
		||||
} /* Client_MaxUserCount */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL LONG
 | 
			
		||||
Client_MyMaxUserCount( VOID )
 | 
			
		||||
GLOBAL long
 | 
			
		||||
Client_MyMaxUserCount( void )
 | 
			
		||||
{
 | 
			
		||||
	return My_Max_Users;
 | 
			
		||||
} /* Client_MyMaxUserCount */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
Client_IsValidNick( CHAR *Nick )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Client_IsValidNick( char *Nick )
 | 
			
		||||
{
 | 
			
		||||
	/* Ist der Nick gueltig? */
 | 
			
		||||
 | 
			
		||||
	CHAR *ptr, goodchars[20];
 | 
			
		||||
	char *ptr, goodchars[20];
 | 
			
		||||
	
 | 
			
		||||
	assert( Nick != NULL );
 | 
			
		||||
 | 
			
		||||
	strcpy( goodchars, ";0123456789-" );
 | 
			
		||||
 | 
			
		||||
	if( Nick[0] == '#' ) return FALSE;
 | 
			
		||||
	if( strchr( goodchars, Nick[0] )) return FALSE;
 | 
			
		||||
	if( strlen( Nick ) >= CLIENT_NICK_LEN ) return FALSE;
 | 
			
		||||
	if( Nick[0] == '#' ) return false;
 | 
			
		||||
	if( strchr( goodchars, Nick[0] )) return false;
 | 
			
		||||
	if( strlen( Nick ) >= CLIENT_NICK_LEN ) return false;
 | 
			
		||||
 | 
			
		||||
	ptr = Nick;
 | 
			
		||||
	while( *ptr )
 | 
			
		||||
	{
 | 
			
		||||
		if(( *ptr < 'A' ) && ( ! strchr( goodchars, *ptr ))) return FALSE;
 | 
			
		||||
		if(( *ptr > '}' ) && ( ! strchr( goodchars, *ptr ))) return FALSE;
 | 
			
		||||
		if(( *ptr < 'A' ) && ( ! strchr( goodchars, *ptr ))) return false;
 | 
			
		||||
		if(( *ptr > '}' ) && ( ! strchr( goodchars, *ptr ))) return false;
 | 
			
		||||
		ptr++;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	return TRUE;
 | 
			
		||||
	return true;
 | 
			
		||||
} /* Client_IsValidNick */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL LONG
 | 
			
		||||
/**
 | 
			
		||||
 * Return pointer to "My_Whowas" structure.
 | 
			
		||||
 */
 | 
			
		||||
GLOBAL WHOWAS *
 | 
			
		||||
Client_GetWhowas( void )
 | 
			
		||||
{
 | 
			
		||||
	return My_Whowas;
 | 
			
		||||
} /* Client_GetWhowas */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Return the index of the last used WHOWAS entry.
 | 
			
		||||
 */
 | 
			
		||||
GLOBAL int
 | 
			
		||||
Client_GetLastWhowasIndex( void )
 | 
			
		||||
{
 | 
			
		||||
	return Last_Whowas;
 | 
			
		||||
} /* Client_GetLastWhowasIndex */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Get the start time of this client.
 | 
			
		||||
 * The result is the start time in seconds since 1970-01-01, as reported
 | 
			
		||||
 * by the C function time(NULL).
 | 
			
		||||
 */
 | 
			
		||||
GLOBAL time_t
 | 
			
		||||
Client_StartTime(CLIENT *Client)
 | 
			
		||||
{
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	return Client->starttime;
 | 
			
		||||
} /* Client_Uptime */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL long
 | 
			
		||||
Count( CLIENT_TYPE Type )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *c;
 | 
			
		||||
	LONG cnt;
 | 
			
		||||
	long cnt;
 | 
			
		||||
 | 
			
		||||
	cnt = 0;
 | 
			
		||||
	c = My_Clients;
 | 
			
		||||
@@ -999,11 +1050,11 @@ Count( CLIENT_TYPE Type )
 | 
			
		||||
} /* Count */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL LONG
 | 
			
		||||
LOCAL long
 | 
			
		||||
MyCount( CLIENT_TYPE Type )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *c;
 | 
			
		||||
	LONG cnt;
 | 
			
		||||
	long cnt;
 | 
			
		||||
 | 
			
		||||
	cnt = 0;
 | 
			
		||||
	c = My_Clients;
 | 
			
		||||
@@ -1017,47 +1068,37 @@ MyCount( CLIENT_TYPE Type )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL CLIENT *
 | 
			
		||||
New_Client_Struct( VOID )
 | 
			
		||||
New_Client_Struct( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Neue CLIENT-Struktur pre-initialisieren */
 | 
			
		||||
	
 | 
			
		||||
	CLIENT *c;
 | 
			
		||||
	
 | 
			
		||||
	c = malloc( sizeof( CLIENT ));
 | 
			
		||||
	c = (CLIENT *)malloc( sizeof( CLIENT ));
 | 
			
		||||
	if( ! c )
 | 
			
		||||
	{
 | 
			
		||||
		Log( LOG_EMERG, "Can't allocate memory! [New_Client_Struct]" );
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c->next = NULL;
 | 
			
		||||
	c->hash = 0;
 | 
			
		||||
	memset( c, 0, sizeof ( CLIENT ));
 | 
			
		||||
 | 
			
		||||
	c->type = CLIENT_UNKNOWN;
 | 
			
		||||
	c->conn_id = NONE;
 | 
			
		||||
	c->introducer = NULL;
 | 
			
		||||
	c->topserver = NULL;
 | 
			
		||||
	strcpy( c->id, "" );
 | 
			
		||||
	strcpy( c->pwd, "" );
 | 
			
		||||
	strcpy( c->host, "" );
 | 
			
		||||
	strcpy( c->user, "" );
 | 
			
		||||
	strcpy( c->info, "" );
 | 
			
		||||
	strcpy( c->modes, "" );
 | 
			
		||||
	c->oper_by_me = FALSE;
 | 
			
		||||
	c->oper_by_me = false;
 | 
			
		||||
	c->hops = -1;
 | 
			
		||||
	c->token = -1;
 | 
			
		||||
	c->mytoken = -1;
 | 
			
		||||
	strcpy( c->away, "" );
 | 
			
		||||
	strcpy( c->flags, "" );
 | 
			
		||||
 | 
			
		||||
	return c;
 | 
			
		||||
} /* New_Client */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID
 | 
			
		||||
LOCAL void
 | 
			
		||||
Generate_MyToken( CLIENT *Client )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *c;
 | 
			
		||||
	INT token;
 | 
			
		||||
	int token;
 | 
			
		||||
 | 
			
		||||
	c = My_Clients;
 | 
			
		||||
	token = 2;
 | 
			
		||||
@@ -1077,10 +1118,10 @@ Generate_MyToken( CLIENT *Client )
 | 
			
		||||
} /* Generate_MyToken */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID
 | 
			
		||||
LOCAL void
 | 
			
		||||
Adjust_Counters( CLIENT *Client )
 | 
			
		||||
{
 | 
			
		||||
	LONG count;
 | 
			
		||||
	long count;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
 | 
			
		||||
@@ -1097,4 +1138,44 @@ Adjust_Counters( CLIENT *Client )
 | 
			
		||||
} /* Adjust_Counters */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Register client in My_Whowas structure for further recall by WHOWAS.
 | 
			
		||||
 * Note: Only clients that have been connected at least 30 seconds will be
 | 
			
		||||
 * registered to prevent automated IRC bots to "destroy" a nice server
 | 
			
		||||
 * history database.
 | 
			
		||||
 */
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Client_RegisterWhowas( CLIENT *Client )
 | 
			
		||||
{
 | 
			
		||||
	int slot;
 | 
			
		||||
	
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
 | 
			
		||||
	/* Don't register clients that were connected less than 30 seconds. */
 | 
			
		||||
	if( time(NULL) - Client->starttime < 30 )
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	slot = Last_Whowas + 1;
 | 
			
		||||
	if( slot >= MAX_WHOWAS || slot < 0 ) slot = 0;
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
	Log( LOG_DEBUG, "Saving WHOWAS information to slot %d ...", slot );
 | 
			
		||||
#endif
 | 
			
		||||
	
 | 
			
		||||
	My_Whowas[slot].time = time( NULL );
 | 
			
		||||
	strlcpy( My_Whowas[slot].id, Client_ID( Client ),
 | 
			
		||||
		 sizeof( My_Whowas[slot].id ));
 | 
			
		||||
	strlcpy( My_Whowas[slot].user, Client_User( Client ),
 | 
			
		||||
		 sizeof( My_Whowas[slot].user ));
 | 
			
		||||
	strlcpy( My_Whowas[slot].host, Client_Hostname( Client ),
 | 
			
		||||
		 sizeof( My_Whowas[slot].host ));
 | 
			
		||||
	strlcpy( My_Whowas[slot].info, Client_Info( Client ),
 | 
			
		||||
		 sizeof( My_Whowas[slot].info ));
 | 
			
		||||
	strlcpy( My_Whowas[slot].server, Client_ID( Client_Introducer( Client )),
 | 
			
		||||
		 sizeof( My_Whowas[slot].server ));
 | 
			
		||||
	
 | 
			
		||||
	Last_Whowas = slot;
 | 
			
		||||
} /* Client_RegisterWhowas */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* -eof- */
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: client.h,v 1.34 2003/01/15 14:28:25 alex Exp $
 | 
			
		||||
 * $Id: client.h,v 1.39 2005/06/12 16:18:49 alex Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * Client management (header)
 | 
			
		||||
 */
 | 
			
		||||
@@ -28,31 +28,30 @@
 | 
			
		||||
#define CLIENT_SERVER 128		/* client is a server */
 | 
			
		||||
#define CLIENT_SERVICE 256		/* client is a service */
 | 
			
		||||
 | 
			
		||||
#define CLIENT_TYPE INT
 | 
			
		||||
#define CLIENT_TYPE int
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#if defined(__client_c__) | defined(S_SPLINT_S)
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
 | 
			
		||||
typedef struct _CLIENT
 | 
			
		||||
{
 | 
			
		||||
	CHAR id[CLIENT_ID_LEN];		/* nick (user) / ID (server) */
 | 
			
		||||
	time_t starttime;		/* Start time of link */
 | 
			
		||||
	char id[CLIENT_ID_LEN];		/* nick (user) / ID (server) */
 | 
			
		||||
	UINT32 hash;			/* hash of lower-case ID */
 | 
			
		||||
	POINTER *next;			/* pointer to next client structure */
 | 
			
		||||
	CLIENT_TYPE type;		/* type of client, see CLIENT_xxx */
 | 
			
		||||
	CONN_ID conn_id;		/* ID of the connection (if local) or NONE (remote) */
 | 
			
		||||
	struct _CLIENT *introducer;	/* ID of the servers which the client is connected to */
 | 
			
		||||
	struct _CLIENT *topserver;	/* toplevel servers (only valid if client is a server) */
 | 
			
		||||
	CHAR pwd[CLIENT_PASS_LEN];	/* password received of the client */
 | 
			
		||||
	CHAR host[CLIENT_HOST_LEN];	/* hostname of the client */
 | 
			
		||||
	CHAR user[CLIENT_USER_LEN];	/* user name ("login") */
 | 
			
		||||
	CHAR info[CLIENT_INFO_LEN];	/* long user name (user) / info text (server) */
 | 
			
		||||
	CHAR modes[CLIENT_MODE_LEN];	/* client modes */
 | 
			
		||||
	INT hops, token, mytoken;	/* "hops" and "Token" (see SERVER command) */
 | 
			
		||||
	BOOLEAN oper_by_me;		/* client is local IRC operator on this server? */
 | 
			
		||||
	CHAR away[CLIENT_AWAY_LEN];	/* AWAY text (valid if mode 'a' is set) */
 | 
			
		||||
	CHAR flags[CLIENT_FLAGS_LEN];	/* flags of the client */
 | 
			
		||||
	char pwd[CLIENT_PASS_LEN];	/* password received of the client */
 | 
			
		||||
	char host[CLIENT_HOST_LEN];	/* hostname of the client */
 | 
			
		||||
	char user[CLIENT_USER_LEN];	/* user name ("login") */
 | 
			
		||||
	char info[CLIENT_INFO_LEN];	/* long user name (user) / info text (server) */
 | 
			
		||||
	char modes[CLIENT_MODE_LEN];	/* client modes */
 | 
			
		||||
	int hops, token, mytoken;	/* "hops" and "Token" (see SERVER command) */
 | 
			
		||||
	bool oper_by_me;		/* client is local IRC operator on this server? */
 | 
			
		||||
	char away[CLIENT_AWAY_LEN];	/* AWAY text (valid if mode 'a' is set) */
 | 
			
		||||
	char flags[CLIENT_FLAGS_LEN];	/* flags of the client */
 | 
			
		||||
} CLIENT;
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
@@ -62,81 +61,98 @@ typedef POINTER CLIENT;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Client_Init PARAMS(( VOID ));
 | 
			
		||||
GLOBAL VOID Client_Exit PARAMS(( VOID ));
 | 
			
		||||
typedef struct _WHOWAS
 | 
			
		||||
{
 | 
			
		||||
	time_t time;			/* time stamp of entry or 0 if unused */
 | 
			
		||||
	char id[CLIENT_NICK_LEN];	/* client nick name */
 | 
			
		||||
	char host[CLIENT_HOST_LEN];	/* hostname of the client */
 | 
			
		||||
	char user[CLIENT_USER_LEN];	/* user name ("login") */
 | 
			
		||||
	char info[CLIENT_INFO_LEN];	/* long user name */
 | 
			
		||||
	char server[CLIENT_HOST_LEN];	/* server name */
 | 
			
		||||
} WHOWAS;
 | 
			
		||||
 | 
			
		||||
GLOBAL CLIENT *Client_NewLocal PARAMS(( CONN_ID Idx, CHAR *Hostname, INT Type, BOOLEAN Idented ));
 | 
			
		||||
GLOBAL CLIENT *Client_NewRemoteServer PARAMS(( CLIENT *Introducer, CHAR *Hostname, CLIENT *TopServer, INT Hops, INT Token, CHAR *Info, BOOLEAN Idented ));
 | 
			
		||||
GLOBAL CLIENT *Client_NewRemoteUser PARAMS(( CLIENT *Introducer, CHAR *Nick, INT Hops, CHAR *User, CHAR *Hostname, INT Token, CHAR *Modes, CHAR *Info, BOOLEAN Idented ));
 | 
			
		||||
GLOBAL CLIENT *Client_New PARAMS(( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, INT Type, CHAR *ID, CHAR *User, CHAR *Hostname, CHAR *Info, INT Hops, INT Token, CHAR *Modes, BOOLEAN Idented ));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Client_Destroy PARAMS(( CLIENT *Client, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN SendQuit ));
 | 
			
		||||
GLOBAL void Client_Init PARAMS(( void ));
 | 
			
		||||
GLOBAL void Client_Exit PARAMS(( void ));
 | 
			
		||||
 | 
			
		||||
GLOBAL CLIENT *Client_NewLocal PARAMS(( CONN_ID Idx, char *Hostname, int Type, bool Idented ));
 | 
			
		||||
GLOBAL CLIENT *Client_NewRemoteServer PARAMS(( CLIENT *Introducer, char *Hostname, CLIENT *TopServer, int Hops, int Token, char *Info, bool Idented ));
 | 
			
		||||
GLOBAL CLIENT *Client_NewRemoteUser PARAMS(( CLIENT *Introducer, char *Nick, int Hops, char *User, char *Hostname, int Token, char *Modes, char *Info, bool Idented ));
 | 
			
		||||
GLOBAL CLIENT *Client_New PARAMS(( CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, int Type, char *ID, char *User, char *Hostname, char *Info, int Hops, int Token, char *Modes, bool Idented ));
 | 
			
		||||
 | 
			
		||||
GLOBAL void Client_Destroy PARAMS(( CLIENT *Client, char *LogMsg, char *FwdMsg, bool SendQuit ));
 | 
			
		||||
#ifdef CONN_MODULE
 | 
			
		||||
GLOBAL VOID Client_DestroyNow PARAMS(( CLIENT *Client ));
 | 
			
		||||
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_First PARAMS(( VOID ));
 | 
			
		||||
GLOBAL CLIENT *Client_Search PARAMS(( char *ID ));
 | 
			
		||||
GLOBAL CLIENT *Client_First PARAMS(( void ));
 | 
			
		||||
GLOBAL CLIENT *Client_Next PARAMS(( CLIENT *c ));
 | 
			
		||||
 | 
			
		||||
GLOBAL INT Client_Type PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL int Client_Type PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL CONN_ID Client_Conn PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL CHAR *Client_ID PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL CHAR *Client_Mask PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL CHAR *Client_Info PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL CHAR *Client_User PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL CHAR *Client_Hostname PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL CHAR *Client_Password PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL CHAR *Client_Modes PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL CHAR *Client_Flags PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL char *Client_ID PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL char *Client_Mask PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL char *Client_Info PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL char *Client_User PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL char *Client_Hostname PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL char *Client_Password PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL char *Client_Modes PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL char *Client_Flags PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL CLIENT *Client_Introducer PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL BOOLEAN Client_OperByMe PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL INT Client_Hops PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL INT Client_Token PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL INT Client_MyToken PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL bool Client_OperByMe PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL int Client_Hops PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL int Client_Token PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL int Client_MyToken PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL CLIENT *Client_TopServer PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL CLIENT *Client_NextHop PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL CHAR *Client_Away PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL char *Client_Away PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL time_t Client_StartTime PARAMS(( CLIENT *Client ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Client_HasMode PARAMS(( CLIENT *Client, CHAR Mode ));
 | 
			
		||||
GLOBAL bool Client_HasMode PARAMS(( CLIENT *Client, char Mode ));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Client_SetHostname PARAMS(( CLIENT *Client, CHAR *Hostname ));
 | 
			
		||||
GLOBAL VOID Client_SetID PARAMS(( CLIENT *Client, CHAR *Nick ));
 | 
			
		||||
GLOBAL VOID Client_SetUser PARAMS(( CLIENT *Client, CHAR *User, BOOLEAN Idented ));
 | 
			
		||||
GLOBAL VOID Client_SetInfo PARAMS(( CLIENT *Client, CHAR *Info ));
 | 
			
		||||
GLOBAL VOID Client_SetPassword PARAMS(( CLIENT *Client, CHAR *Pwd ));
 | 
			
		||||
GLOBAL VOID Client_SetType PARAMS(( CLIENT *Client, INT Type ));
 | 
			
		||||
GLOBAL VOID Client_SetHops PARAMS(( CLIENT *Client, INT Hops ));
 | 
			
		||||
GLOBAL VOID Client_SetToken PARAMS(( CLIENT *Client, INT Token ));
 | 
			
		||||
GLOBAL VOID Client_SetOperByMe PARAMS(( CLIENT *Client, BOOLEAN OperByMe ));
 | 
			
		||||
GLOBAL VOID Client_SetModes PARAMS(( CLIENT *Client, CHAR *Modes ));
 | 
			
		||||
GLOBAL VOID Client_SetFlags PARAMS(( CLIENT *Client, CHAR *Flags ));
 | 
			
		||||
GLOBAL VOID Client_SetIntroducer PARAMS(( CLIENT *Client, CLIENT *Introducer ));
 | 
			
		||||
GLOBAL VOID Client_SetAway PARAMS(( CLIENT *Client, CHAR *Txt ));
 | 
			
		||||
GLOBAL void Client_SetHostname PARAMS(( CLIENT *Client, char *Hostname ));
 | 
			
		||||
GLOBAL void Client_SetID PARAMS(( CLIENT *Client, char *Nick ));
 | 
			
		||||
GLOBAL void Client_SetUser PARAMS(( CLIENT *Client, char *User, bool Idented ));
 | 
			
		||||
GLOBAL void Client_SetInfo PARAMS(( CLIENT *Client, char *Info ));
 | 
			
		||||
GLOBAL void Client_SetPassword PARAMS(( CLIENT *Client, char *Pwd ));
 | 
			
		||||
GLOBAL void Client_SetType PARAMS(( CLIENT *Client, int Type ));
 | 
			
		||||
GLOBAL void Client_SetHops PARAMS(( CLIENT *Client, int Hops ));
 | 
			
		||||
GLOBAL void Client_SetToken PARAMS(( CLIENT *Client, int Token ));
 | 
			
		||||
GLOBAL void Client_SetOperByMe PARAMS(( CLIENT *Client, bool OperByMe ));
 | 
			
		||||
GLOBAL void Client_SetModes PARAMS(( CLIENT *Client, char *Modes ));
 | 
			
		||||
GLOBAL void Client_SetFlags PARAMS(( CLIENT *Client, char *Flags ));
 | 
			
		||||
GLOBAL void Client_SetIntroducer PARAMS(( CLIENT *Client, CLIENT *Introducer ));
 | 
			
		||||
GLOBAL void Client_SetAway PARAMS(( CLIENT *Client, char *Txt ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Client_ModeAdd PARAMS(( CLIENT *Client, CHAR Mode ));
 | 
			
		||||
GLOBAL BOOLEAN Client_ModeDel PARAMS(( CLIENT *Client, CHAR Mode ));
 | 
			
		||||
GLOBAL bool Client_ModeAdd PARAMS(( CLIENT *Client, char Mode ));
 | 
			
		||||
GLOBAL bool Client_ModeDel PARAMS(( CLIENT *Client, char Mode ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Client_CheckNick PARAMS(( CLIENT *Client, CHAR *Nick ));
 | 
			
		||||
GLOBAL BOOLEAN Client_CheckID PARAMS(( CLIENT *Client, CHAR *ID ));
 | 
			
		||||
GLOBAL bool Client_CheckNick PARAMS(( CLIENT *Client, char *Nick ));
 | 
			
		||||
GLOBAL bool Client_CheckID PARAMS(( CLIENT *Client, char *ID ));
 | 
			
		||||
 | 
			
		||||
GLOBAL LONG Client_UserCount PARAMS(( VOID ));
 | 
			
		||||
GLOBAL LONG Client_ServiceCount PARAMS(( VOID ));
 | 
			
		||||
GLOBAL LONG Client_ServerCount PARAMS(( VOID ));
 | 
			
		||||
GLOBAL LONG Client_OperCount PARAMS(( VOID ));
 | 
			
		||||
GLOBAL LONG Client_UnknownCount PARAMS(( VOID ));
 | 
			
		||||
GLOBAL LONG Client_MyUserCount PARAMS(( VOID ));
 | 
			
		||||
GLOBAL LONG Client_MyServiceCount PARAMS(( VOID ));
 | 
			
		||||
GLOBAL LONG Client_MyServerCount PARAMS(( VOID ));
 | 
			
		||||
GLOBAL LONG Client_MaxUserCount PARAMS((  VOID ));
 | 
			
		||||
GLOBAL LONG Client_MyMaxUserCount PARAMS((  VOID ));
 | 
			
		||||
GLOBAL long Client_UserCount PARAMS(( void ));
 | 
			
		||||
GLOBAL long Client_ServiceCount PARAMS(( void ));
 | 
			
		||||
GLOBAL long Client_ServerCount PARAMS(( void ));
 | 
			
		||||
GLOBAL long Client_OperCount PARAMS(( void ));
 | 
			
		||||
GLOBAL long Client_UnknownCount PARAMS(( void ));
 | 
			
		||||
GLOBAL long Client_MyUserCount PARAMS(( void ));
 | 
			
		||||
GLOBAL long Client_MyServiceCount PARAMS(( void ));
 | 
			
		||||
GLOBAL long Client_MyServerCount PARAMS(( void ));
 | 
			
		||||
GLOBAL long Client_MaxUserCount PARAMS((  void ));
 | 
			
		||||
GLOBAL long Client_MyMaxUserCount PARAMS((  void ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Client_IsValidNick PARAMS(( CHAR *Nick ));
 | 
			
		||||
GLOBAL bool Client_IsValidNick PARAMS(( char *Nick ));
 | 
			
		||||
 | 
			
		||||
GLOBAL WHOWAS *Client_GetWhowas PARAMS(( void ));
 | 
			
		||||
GLOBAL int Client_GetLastWhowasIndex PARAMS(( void ));
 | 
			
		||||
 | 
			
		||||
GLOBAL void Client_RegisterWhowas PARAMS(( CLIENT *Client ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -14,15 +14,20 @@
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: conf.c,v 1.57 2003/04/21 11:06:07 alex Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: conf.c,v 1.77.2.1 2005/10/11 19:28:47 alex Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <stdarg.h>
 | 
			
		||||
#ifdef PROTOTYPES
 | 
			
		||||
#	include <stdarg.h>
 | 
			
		||||
#else
 | 
			
		||||
#	include <varargs.h>
 | 
			
		||||
#endif
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <strings.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <pwd.h>
 | 
			
		||||
#include <grp.h>
 | 
			
		||||
@@ -45,60 +50,64 @@ static char UNUSED id[] = "$Id: conf.c,v 1.57 2003/04/21 11:06:07 alex Exp $";
 | 
			
		||||
#include "conf.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL BOOLEAN Use_Log = TRUE;
 | 
			
		||||
LOCAL bool Use_Log = true;
 | 
			
		||||
LOCAL CONF_SERVER New_Server;
 | 
			
		||||
LOCAL INT New_Server_Idx;
 | 
			
		||||
LOCAL int New_Server_Idx;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID Set_Defaults PARAMS(( BOOLEAN InitServers ));
 | 
			
		||||
LOCAL VOID Read_Config PARAMS(( VOID ));
 | 
			
		||||
LOCAL VOID Validate_Config PARAMS(( BOOLEAN TestOnly ));
 | 
			
		||||
LOCAL void Set_Defaults PARAMS(( bool InitServers ));
 | 
			
		||||
LOCAL void Read_Config PARAMS(( void ));
 | 
			
		||||
LOCAL void Validate_Config PARAMS(( bool TestOnly ));
 | 
			
		||||
 | 
			
		||||
LOCAL VOID Handle_GLOBAL PARAMS(( INT Line, CHAR *Var, CHAR *Arg ));
 | 
			
		||||
LOCAL VOID Handle_OPERATOR PARAMS(( INT Line, CHAR *Var, CHAR *Arg ));
 | 
			
		||||
LOCAL VOID Handle_SERVER PARAMS(( INT Line, CHAR *Var, CHAR *Arg ));
 | 
			
		||||
LOCAL VOID Handle_CHANNEL PARAMS(( INT Line, CHAR *Var, CHAR *Arg ));
 | 
			
		||||
LOCAL void Handle_GLOBAL PARAMS(( int Line, char *Var, char *Arg ));
 | 
			
		||||
LOCAL void Handle_OPERATOR PARAMS(( int Line, char *Var, char *Arg ));
 | 
			
		||||
LOCAL void Handle_SERVER PARAMS(( int Line, char *Var, char *Arg ));
 | 
			
		||||
LOCAL void Handle_CHANNEL PARAMS(( int Line, char *Var, char *Arg ));
 | 
			
		||||
 | 
			
		||||
LOCAL VOID Config_Error PARAMS(( CONST INT Level, CONST CHAR *Format, ... ));
 | 
			
		||||
LOCAL void Config_Error PARAMS(( const int Level, const char *Format, ... ));
 | 
			
		||||
 | 
			
		||||
LOCAL VOID Init_Server_Struct PARAMS(( CONF_SERVER *Server ));
 | 
			
		||||
LOCAL void Config_Error_NaN PARAMS(( const int LINE, const char *Value ));
 | 
			
		||||
LOCAL void Config_Error_TooLong PARAMS(( const int LINE, const char *Value ));
 | 
			
		||||
 | 
			
		||||
LOCAL void Init_Server_Struct PARAMS(( CONF_SERVER *Server ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Conf_Init( VOID )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Conf_Init( void )
 | 
			
		||||
{
 | 
			
		||||
	Set_Defaults( TRUE );
 | 
			
		||||
	Set_Defaults( true );
 | 
			
		||||
	Read_Config( );
 | 
			
		||||
	Validate_Config( FALSE );
 | 
			
		||||
	Validate_Config( false );
 | 
			
		||||
} /* Config_Init */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Conf_Rehash( VOID )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Conf_Rehash( void )
 | 
			
		||||
{
 | 
			
		||||
	Set_Defaults( FALSE );
 | 
			
		||||
	Set_Defaults( false );
 | 
			
		||||
	Read_Config( );
 | 
			
		||||
	Validate_Config( FALSE );
 | 
			
		||||
	Validate_Config( false );
 | 
			
		||||
} /* Config_Rehash */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL INT
 | 
			
		||||
Conf_Test( VOID )
 | 
			
		||||
GLOBAL int
 | 
			
		||||
Conf_Test( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Read configuration, validate and output it. */
 | 
			
		||||
 | 
			
		||||
	struct passwd *pwd;
 | 
			
		||||
	struct group *grp;
 | 
			
		||||
	INT i;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	Use_Log = FALSE;
 | 
			
		||||
	Set_Defaults( TRUE );
 | 
			
		||||
	Use_Log = false;
 | 
			
		||||
	Set_Defaults( true );
 | 
			
		||||
 | 
			
		||||
	Read_Config( );
 | 
			
		||||
	Validate_Config( TRUE );
 | 
			
		||||
	Validate_Config( true );
 | 
			
		||||
 | 
			
		||||
	/* If stdin is a valid tty wait for a key: */
 | 
			
		||||
	if( isatty( fileno( stdout )))
 | 
			
		||||
	/* If stdin and stdout ("you can read our nice message and we can
 | 
			
		||||
	 * read in your keypress") are valid tty's, wait for a key: */
 | 
			
		||||
	if( isatty( fileno( stdin )) && isatty( fileno( stdout )))
 | 
			
		||||
	{
 | 
			
		||||
		puts( "OK, press enter to see a dump of your service configuration ..." );
 | 
			
		||||
		getchar( );
 | 
			
		||||
@@ -106,32 +115,39 @@ Conf_Test( VOID )
 | 
			
		||||
	else puts( "Ok, dump of your server configuration follows:\n" );
 | 
			
		||||
 | 
			
		||||
	puts( "[GLOBAL]" );
 | 
			
		||||
	printf( "  ServerName = %s\n", Conf_ServerName );
 | 
			
		||||
	printf( "  ServerInfo = %s\n", Conf_ServerInfo );
 | 
			
		||||
	printf( "  ServerPwd = %s\n", Conf_ServerPwd );
 | 
			
		||||
	printf( "  Name = %s\n", Conf_ServerName );
 | 
			
		||||
	printf( "  Info = %s\n", Conf_ServerInfo );
 | 
			
		||||
	printf( "  Password = %s\n", Conf_ServerPwd );
 | 
			
		||||
	printf( "  AdminInfo1 = %s\n", Conf_ServerAdmin1 );
 | 
			
		||||
	printf( "  AdminInfo2 = %s\n", Conf_ServerAdmin2 );
 | 
			
		||||
	printf( "  AdminEMail = %s\n", Conf_ServerAdminMail );
 | 
			
		||||
	printf( "  MotdFile = %s\n", Conf_MotdFile );
 | 
			
		||||
	printf( "  MotdPhrase = %s\n", Conf_MotdPhrase );
 | 
			
		||||
	printf( "  ChrootDir = %s\n", Conf_Chroot );
 | 
			
		||||
	printf( "  PidFile = %s\n", Conf_PidFile);
 | 
			
		||||
	printf( "  Ports = " );
 | 
			
		||||
	for( i = 0; i < Conf_ListenPorts_Count; i++ )
 | 
			
		||||
	{
 | 
			
		||||
		if( i != 0 ) printf( ", " );
 | 
			
		||||
		printf( "%u", Conf_ListenPorts[i] );
 | 
			
		||||
		printf( "%u", (unsigned int) Conf_ListenPorts[i] );
 | 
			
		||||
	}
 | 
			
		||||
	puts( "" );
 | 
			
		||||
	printf( "  Listen = %s\n", Conf_ListenAddress );
 | 
			
		||||
	pwd = getpwuid( Conf_UID );
 | 
			
		||||
	if( pwd ) printf( "  ServerUID = %s\n", pwd->pw_name );
 | 
			
		||||
	else printf( "  ServerUID = %ld\n", (LONG)Conf_UID );
 | 
			
		||||
	else printf( "  ServerUID = %ld\n", (long)Conf_UID );
 | 
			
		||||
	grp = getgrgid( Conf_GID );
 | 
			
		||||
	if( grp ) printf( "  ServerGID = %s\n", grp->gr_name );
 | 
			
		||||
	else printf( "  ServerGID = %ld\n", (LONG)Conf_GID );
 | 
			
		||||
	else printf( "  ServerGID = %ld\n", (long)Conf_GID );
 | 
			
		||||
	printf( "  PingTimeout = %d\n", Conf_PingTimeout );
 | 
			
		||||
	printf( "  PongTimeout = %d\n", Conf_PongTimeout );
 | 
			
		||||
	printf( "  ConnectRetry = %d\n", Conf_ConnectRetry );
 | 
			
		||||
	printf( "  OperCanUseMode = %s\n", Conf_OperCanMode == TRUE ? "yes" : "no" );
 | 
			
		||||
	printf( "  OperCanUseMode = %s\n", Conf_OperCanMode == true? "yes" : "no" );
 | 
			
		||||
	printf( "  OperServerMode = %s\n", Conf_OperServerMode == true? "yes" : "no" );
 | 
			
		||||
	if( Conf_MaxConnections > 0 ) printf( "  MaxConnections = %ld\n", Conf_MaxConnections );
 | 
			
		||||
	else printf( "  MaxConnections = -1\n" );
 | 
			
		||||
	if( Conf_MaxConnectionsIP > 0 ) printf( "  MaxConnectionsIP = %d\n", Conf_MaxConnectionsIP );
 | 
			
		||||
	else printf( "  MaxConnectionsIP = -1\n" );
 | 
			
		||||
	if( Conf_MaxJoins > 0 ) printf( "  MaxJoins = %d\n", Conf_MaxJoins );
 | 
			
		||||
	else printf( "  MaxJoins = -1\n" );
 | 
			
		||||
	puts( "" );
 | 
			
		||||
@@ -144,6 +160,7 @@ Conf_Test( VOID )
 | 
			
		||||
		puts( "[OPERATOR]" );
 | 
			
		||||
		printf( "  Name = %s\n", Conf_Oper[i].name );
 | 
			
		||||
		printf( "  Password = %s\n", Conf_Oper[i].pwd );
 | 
			
		||||
		if ( Conf_Oper[i].mask ) printf( "  Mask = %s\n", Conf_Oper[i].mask );
 | 
			
		||||
		puts( "" );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -178,7 +195,7 @@ Conf_Test( VOID )
 | 
			
		||||
} /* Conf_Test */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Conf_UnsetServer( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
	/* Set next time for next connection attempt, if this is a server
 | 
			
		||||
@@ -186,7 +203,8 @@ Conf_UnsetServer( CONN_ID Idx )
 | 
			
		||||
	 * "once", delete it from our configuration.
 | 
			
		||||
	 * Non-Server-Connections will be silently ignored. */
 | 
			
		||||
 | 
			
		||||
	INT i;
 | 
			
		||||
	int i;
 | 
			
		||||
	time_t t;
 | 
			
		||||
 | 
			
		||||
	/* Check all our configured servers */
 | 
			
		||||
	for( i = 0; i < MAX_SERVERS; i++ )
 | 
			
		||||
@@ -204,18 +222,21 @@ Conf_UnsetServer( CONN_ID Idx )
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			/* Set time for next connect attempt */
 | 
			
		||||
			if( Conf_Server[i].lasttry <  time( NULL ) - Conf_ConnectRetry )
 | 
			
		||||
			{
 | 
			
		||||
				/* Okay, the connection was established "long enough": */
 | 
			
		||||
				Conf_Server[i].lasttry = time( NULL ) - Conf_ConnectRetry + RECONNECT_DELAY;
 | 
			
		||||
			}
 | 
			
		||||
			t = time(NULL);
 | 
			
		||||
			if (Conf_Server[i].lasttry < t - Conf_ConnectRetry) {
 | 
			
		||||
				/* The connection has been "long", so we don't
 | 
			
		||||
				 * require the next attempt to be delayed. */
 | 
			
		||||
				Conf_Server[i].lasttry =
 | 
			
		||||
					t - Conf_ConnectRetry + RECONNECT_DELAY;
 | 
			
		||||
			} else
 | 
			
		||||
				Conf_Server[i].lasttry = t;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
} /* Conf_UnsetServer */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Conf_SetServer( INT ConfServer, CONN_ID Idx )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Conf_SetServer( int ConfServer, CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
	/* Set connection for specified configured server */
 | 
			
		||||
 | 
			
		||||
@@ -226,12 +247,12 @@ Conf_SetServer( INT ConfServer, CONN_ID Idx )
 | 
			
		||||
} /* Conf_SetServer */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL INT
 | 
			
		||||
GLOBAL int
 | 
			
		||||
Conf_GetServer( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
	/* Get index of server in configuration structure */
 | 
			
		||||
	
 | 
			
		||||
	INT i = 0;
 | 
			
		||||
	int i = 0;
 | 
			
		||||
	
 | 
			
		||||
	assert( Idx > NONE );
 | 
			
		||||
 | 
			
		||||
@@ -243,12 +264,12 @@ Conf_GetServer( CONN_ID Idx )
 | 
			
		||||
} /* Conf_GetServer */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
Conf_EnableServer( CHAR *Name, INT Port )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Conf_EnableServer( char *Name, UINT16 Port )
 | 
			
		||||
{
 | 
			
		||||
	/* Enable specified server and adjust port */
 | 
			
		||||
 | 
			
		||||
	INT i;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	assert( Name != NULL );
 | 
			
		||||
 | 
			
		||||
@@ -259,19 +280,19 @@ Conf_EnableServer( CHAR *Name, INT Port )
 | 
			
		||||
			/* Gotcha! Set port and enable server: */
 | 
			
		||||
			Conf_Server[i].port = Port;
 | 
			
		||||
			Conf_Server[i].flags &= ~CONF_SFLAG_DISABLED;
 | 
			
		||||
			return TRUE;
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return FALSE;
 | 
			
		||||
	return false;
 | 
			
		||||
} /* Conf_EnableServer */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
Conf_DisableServer( CHAR *Name )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Conf_DisableServer( char *Name )
 | 
			
		||||
{
 | 
			
		||||
	/* Enable specified server and adjust port */
 | 
			
		||||
 | 
			
		||||
	INT i;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	assert( Name != NULL );
 | 
			
		||||
 | 
			
		||||
@@ -281,20 +302,20 @@ Conf_DisableServer( CHAR *Name )
 | 
			
		||||
		{
 | 
			
		||||
			/* Gotcha! Disable and disconnect server: */
 | 
			
		||||
			Conf_Server[i].flags |= CONF_SFLAG_DISABLED;
 | 
			
		||||
			if( Conf_Server[i].conn_id > NONE ) Conn_Close( Conf_Server[i].conn_id, NULL, "Server link terminated on operator request", TRUE );
 | 
			
		||||
			return TRUE;
 | 
			
		||||
			if( Conf_Server[i].conn_id > NONE ) Conn_Close( Conf_Server[i].conn_id, NULL, "Server link terminated on operator request", true);
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return FALSE;
 | 
			
		||||
	return false;
 | 
			
		||||
} /* Conf_DisableServer */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
Conf_AddServer( CHAR *Name, INT Port, CHAR *Host, CHAR *MyPwd, CHAR *PeerPwd )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Conf_AddServer( char *Name, UINT16 Port, char *Host, char *MyPwd, char *PeerPwd )
 | 
			
		||||
{
 | 
			
		||||
	/* Add new server to configuration */
 | 
			
		||||
 | 
			
		||||
	INT i;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	assert( Name != NULL );
 | 
			
		||||
	assert( Host != NULL );
 | 
			
		||||
@@ -307,7 +328,7 @@ Conf_AddServer( CHAR *Name, INT Port, CHAR *Host, CHAR *MyPwd, CHAR *PeerPwd )
 | 
			
		||||
		/* Is this item used? */
 | 
			
		||||
		if( ! Conf_Server[i].name[0] ) break;
 | 
			
		||||
	}
 | 
			
		||||
	if( i >= MAX_SERVERS ) return FALSE;
 | 
			
		||||
	if( i >= MAX_SERVERS ) return false;
 | 
			
		||||
 | 
			
		||||
	Init_Server_Struct( &Conf_Server[i] );
 | 
			
		||||
	strlcpy( Conf_Server[i].name, Name, sizeof( Conf_Server[i].name ));
 | 
			
		||||
@@ -317,19 +338,19 @@ Conf_AddServer( CHAR *Name, INT Port, CHAR *Host, CHAR *MyPwd, CHAR *PeerPwd )
 | 
			
		||||
	Conf_Server[i].port = Port;
 | 
			
		||||
	Conf_Server[i].flags = CONF_SFLAG_ONCE;
 | 
			
		||||
	
 | 
			
		||||
	return TRUE;
 | 
			
		||||
	return true;
 | 
			
		||||
} /* Conf_AddServer */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID
 | 
			
		||||
Set_Defaults( BOOLEAN InitServers )
 | 
			
		||||
LOCAL void
 | 
			
		||||
Set_Defaults( bool InitServers )
 | 
			
		||||
{
 | 
			
		||||
	/* Initialize configuration variables with default values. */
 | 
			
		||||
 | 
			
		||||
	INT i;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	strcpy( Conf_ServerName, "" );
 | 
			
		||||
	sprintf( Conf_ServerInfo, "%s %s", PACKAGE_NAME, PACKAGE_VERSION );
 | 
			
		||||
	snprintf( Conf_ServerInfo, sizeof Conf_ServerInfo, "%s %s", PACKAGE_NAME, PACKAGE_VERSION );
 | 
			
		||||
	strcpy( Conf_ServerPwd, "" );
 | 
			
		||||
 | 
			
		||||
	strcpy( Conf_ServerAdmin1, "" );
 | 
			
		||||
@@ -339,7 +360,14 @@ Set_Defaults( BOOLEAN InitServers )
 | 
			
		||||
	strlcpy( Conf_MotdFile, SYSCONFDIR, sizeof( Conf_MotdFile ));
 | 
			
		||||
	strlcat( Conf_MotdFile, MOTD_FILE, sizeof( Conf_MotdFile ));
 | 
			
		||||
 | 
			
		||||
	strlcpy( Conf_MotdPhrase, MOTD_PHRASE, sizeof( Conf_MotdPhrase ));
 | 
			
		||||
 | 
			
		||||
	strlcpy( Conf_Chroot, CHROOT_DIR, sizeof( Conf_Chroot ));
 | 
			
		||||
 | 
			
		||||
	strlcpy( Conf_PidFile, PID_FILE, sizeof( Conf_PidFile ));
 | 
			
		||||
 | 
			
		||||
	Conf_ListenPorts_Count = 0;
 | 
			
		||||
	strcpy( Conf_ListenAddress, "" );
 | 
			
		||||
 | 
			
		||||
	Conf_UID = Conf_GID = 0;
 | 
			
		||||
	
 | 
			
		||||
@@ -351,9 +379,11 @@ Set_Defaults( BOOLEAN InitServers )
 | 
			
		||||
	Conf_Oper_Count = 0;
 | 
			
		||||
	Conf_Channel_Count = 0;
 | 
			
		||||
 | 
			
		||||
	Conf_OperCanMode = FALSE;
 | 
			
		||||
	Conf_OperCanMode = false;
 | 
			
		||||
	Conf_OperServerMode = false;
 | 
			
		||||
	
 | 
			
		||||
	Conf_MaxConnections = -1;
 | 
			
		||||
	Conf_MaxConnectionsIP = 5;
 | 
			
		||||
	Conf_MaxJoins = 10;
 | 
			
		||||
 | 
			
		||||
	/* Initialize server configuration structures */
 | 
			
		||||
@@ -361,13 +391,13 @@ Set_Defaults( BOOLEAN InitServers )
 | 
			
		||||
} /* Set_Defaults */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID
 | 
			
		||||
Read_Config( VOID )
 | 
			
		||||
LOCAL void
 | 
			
		||||
Read_Config( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Read configuration file. */
 | 
			
		||||
 | 
			
		||||
	CHAR section[LINE_LEN], str[LINE_LEN], *var, *arg, *ptr;
 | 
			
		||||
	INT line, i, n;
 | 
			
		||||
	char section[LINE_LEN], str[LINE_LEN], *var, *arg, *ptr;
 | 
			
		||||
	int line, i, n;
 | 
			
		||||
	FILE *fd;
 | 
			
		||||
 | 
			
		||||
	/* Open configuration file */
 | 
			
		||||
@@ -424,7 +454,7 @@ Read_Config( VOID )
 | 
			
		||||
	New_Server_Idx = NONE;
 | 
			
		||||
 | 
			
		||||
	/* Read configuration file */
 | 
			
		||||
	while( TRUE )
 | 
			
		||||
	while( true )
 | 
			
		||||
	{
 | 
			
		||||
		if( ! fgets( str, LINE_LEN, fd )) break;
 | 
			
		||||
		ngt_TrimStr( str );
 | 
			
		||||
@@ -444,8 +474,12 @@ Read_Config( VOID )
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					/* Initialize new operator structure */
 | 
			
		||||
					strcpy( Conf_Oper[Conf_Oper_Count].name, "" );
 | 
			
		||||
					strcpy( Conf_Oper[Conf_Oper_Count].pwd, "" );
 | 
			
		||||
					Conf_Oper[Conf_Oper_Count].name[0] = '\0';
 | 
			
		||||
					Conf_Oper[Conf_Oper_Count].pwd[0] = '\0';
 | 
			
		||||
					if (Conf_Oper[Conf_Oper_Count].mask) {
 | 
			
		||||
						free(Conf_Oper[Conf_Oper_Count].mask );
 | 
			
		||||
						Conf_Oper[Conf_Oper_Count].mask = NULL;
 | 
			
		||||
					}
 | 
			
		||||
					Conf_Oper_Count++;
 | 
			
		||||
				}
 | 
			
		||||
				continue;
 | 
			
		||||
@@ -534,13 +568,24 @@ Read_Config( VOID )
 | 
			
		||||
} /* Read_Config */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID
 | 
			
		||||
Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg )
 | 
			
		||||
LOCAL bool
 | 
			
		||||
Check_ArgIsTrue( const char *Arg )
 | 
			
		||||
{
 | 
			
		||||
	if( strcasecmp( Arg, "yes" ) == 0 ) return true;
 | 
			
		||||
	if( strcasecmp( Arg, "true" ) == 0 ) return true;
 | 
			
		||||
	if( atoi( Arg ) != 0 ) return true;
 | 
			
		||||
 | 
			
		||||
	return false;
 | 
			
		||||
} /* Check_ArgIsTrue */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL void
 | 
			
		||||
Handle_GLOBAL( int Line, char *Var, char *Arg )
 | 
			
		||||
{
 | 
			
		||||
	struct passwd *pwd;
 | 
			
		||||
	struct group *grp;
 | 
			
		||||
	CHAR *ptr;
 | 
			
		||||
	LONG port;
 | 
			
		||||
	char *ptr;
 | 
			
		||||
	long port;
 | 
			
		||||
	
 | 
			
		||||
	assert( Line > 0 );
 | 
			
		||||
	assert( Var != NULL );
 | 
			
		||||
@@ -549,37 +594,43 @@ Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg )
 | 
			
		||||
	if( strcasecmp( Var, "Name" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Server name */
 | 
			
		||||
		if( strlcpy( Conf_ServerName, Arg, sizeof( Conf_ServerName )) >= sizeof( Conf_ServerName )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Name\" too long!", NGIRCd_ConfFile, Line );
 | 
			
		||||
		if( strlcpy( Conf_ServerName, Arg, sizeof( Conf_ServerName )) >= sizeof( Conf_ServerName ))
 | 
			
		||||
			Config_Error_TooLong( Line, Var );
 | 
			
		||||
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if( strcasecmp( Var, "Info" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Info text of server */
 | 
			
		||||
		if( strlcpy( Conf_ServerInfo, Arg, sizeof( Conf_ServerInfo )) >= sizeof( Conf_ServerInfo )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Info\" too long!", NGIRCd_ConfFile, Line );
 | 
			
		||||
		if( strlcpy( Conf_ServerInfo, Arg, sizeof( Conf_ServerInfo )) >= sizeof( Conf_ServerInfo ))
 | 
			
		||||
			Config_Error_TooLong ( Line, Var );
 | 
			
		||||
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if( strcasecmp( Var, "Password" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Global server password */
 | 
			
		||||
		if( strlcpy( Conf_ServerPwd, Arg, sizeof( Conf_ServerPwd )) >= sizeof( Conf_ServerPwd )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Password\" too long!", NGIRCd_ConfFile, Line );
 | 
			
		||||
		if( strlcpy( Conf_ServerPwd, Arg, sizeof( Conf_ServerPwd )) >= sizeof( Conf_ServerPwd ))
 | 
			
		||||
			Config_Error_TooLong( Line, Var );
 | 
			
		||||
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if( strcasecmp( Var, "AdminInfo1" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Administrative info #1 */
 | 
			
		||||
		if( strlcpy( Conf_ServerAdmin1, Arg, sizeof( Conf_ServerAdmin1 )) >= sizeof( Conf_ServerAdmin1 )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"AdminInfo1\" too long!", NGIRCd_ConfFile, Line );
 | 
			
		||||
		if( strlcpy( Conf_ServerAdmin1, Arg, sizeof( Conf_ServerAdmin1 )) >= sizeof( Conf_ServerAdmin1 )) Config_Error_TooLong ( Line, Var );
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if( strcasecmp( Var, "AdminInfo2" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Administrative info #2 */
 | 
			
		||||
		if( strlcpy( Conf_ServerAdmin2, Arg, sizeof( Conf_ServerAdmin2 )) >= sizeof( Conf_ServerAdmin2 )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"AdminInfo2\" too long!", NGIRCd_ConfFile, Line );
 | 
			
		||||
		if( strlcpy( Conf_ServerAdmin2, Arg, sizeof( Conf_ServerAdmin2 )) >= sizeof( Conf_ServerAdmin2 )) Config_Error_TooLong ( Line, Var );
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if( strcasecmp( Var, "AdminEMail" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Administrative email contact */
 | 
			
		||||
		if( strlcpy( Conf_ServerAdminMail, Arg, sizeof( Conf_ServerAdminMail )) >= sizeof( Conf_ServerAdminMail )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"AdminEMail\" too long!", NGIRCd_ConfFile, Line );
 | 
			
		||||
		if( strlcpy( Conf_ServerAdminMail, Arg, sizeof( Conf_ServerAdminMail )) >= sizeof( Conf_ServerAdminMail )) Config_Error_TooLong( Line, Var );
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if( strcasecmp( Var, "Ports" ) == 0 )
 | 
			
		||||
@@ -594,7 +645,7 @@ Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg )
 | 
			
		||||
			if( Conf_ListenPorts_Count + 1 > MAX_LISTEN_PORTS ) Config_Error( LOG_ERR, "Too many listen ports configured. Port %ld ignored.", port );
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				if( port > 0 && port < 0xFFFF ) Conf_ListenPorts[Conf_ListenPorts_Count++] = (UINT)port;
 | 
			
		||||
				if( port > 0 && port < 0xFFFF ) Conf_ListenPorts[Conf_ListenPorts_Count++] = (UINT16)port;
 | 
			
		||||
				else Config_Error( LOG_ERR, "%s, line %d (section \"Global\"): Illegal port number %ld!", NGIRCd_ConfFile, Line, port );
 | 
			
		||||
			}
 | 
			
		||||
			ptr = strtok( NULL, "," );
 | 
			
		||||
@@ -604,9 +655,37 @@ Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg )
 | 
			
		||||
	if( strcasecmp( Var, "MotdFile" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* "Message of the day" (MOTD) file */
 | 
			
		||||
		if( strlcpy( Conf_MotdFile, Arg, sizeof( Conf_MotdFile )) >= sizeof( Conf_MotdFile )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"MotdFile\" too long!", NGIRCd_ConfFile, Line );
 | 
			
		||||
		if( strlcpy( Conf_MotdFile, Arg, sizeof( Conf_MotdFile )) >= sizeof( Conf_MotdFile ))
 | 
			
		||||
			Config_Error_TooLong( Line, Var );
 | 
			
		||||
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if( strcasecmp( Var, "MotdPhrase" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* "Message of the day" phrase (instead of file) */
 | 
			
		||||
		if( strlcpy( Conf_MotdPhrase, Arg, sizeof( Conf_MotdPhrase )) >= sizeof( Conf_MotdPhrase ))
 | 
			
		||||
			Config_Error_TooLong( Line, Var );
 | 
			
		||||
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if( strcasecmp( Var, "ChrootDir" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* directory for chroot() */
 | 
			
		||||
		if( strlcpy( Conf_Chroot, Arg, sizeof( Conf_Chroot )) >= sizeof( Conf_Chroot ))
 | 
			
		||||
			Config_Error_TooLong( Line, Var );
 | 
			
		||||
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if ( strcasecmp( Var, "PidFile" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* name of pidfile */
 | 
			
		||||
		if( strlcpy( Conf_PidFile, Arg, sizeof( Conf_PidFile )) >= sizeof( Conf_PidFile ))
 | 
			
		||||
			Config_Error_TooLong( Line, Var );
 | 
			
		||||
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if( strcasecmp( Var, "ServerUID" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* UID the daemon should switch to */
 | 
			
		||||
@@ -615,10 +694,10 @@ Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg )
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
#ifdef HAVE_ISDIGIT
 | 
			
		||||
			if( ! isdigit( *Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"ServerUID\" is not a number!", NGIRCd_ConfFile, Line );
 | 
			
		||||
			if( ! isdigit( (int)*Arg )) Config_Error_NaN( Line, Var );
 | 
			
		||||
			else
 | 
			
		||||
#endif
 | 
			
		||||
			Conf_UID = (UINT)atoi( Arg );
 | 
			
		||||
			Conf_UID = (unsigned int)atoi( Arg );
 | 
			
		||||
		}
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
@@ -630,10 +709,10 @@ Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg )
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
#ifdef HAVE_ISDIGIT
 | 
			
		||||
			if( ! isdigit( *Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"ServerGID\" is not a number!", NGIRCd_ConfFile, Line );
 | 
			
		||||
			if( ! isdigit( (int)*Arg )) Config_Error_NaN( Line, Var );
 | 
			
		||||
			else
 | 
			
		||||
#endif
 | 
			
		||||
			Conf_GID = (UINT)atoi( Arg );
 | 
			
		||||
			Conf_GID = (unsigned int)atoi( Arg );
 | 
			
		||||
		}
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
@@ -673,39 +752,61 @@ Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg )
 | 
			
		||||
	if( strcasecmp( Var, "OperCanUseMode" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Are IRC operators allowed to use MODE in channels they aren't Op in? */
 | 
			
		||||
		if( strcasecmp( Arg, "yes" ) == 0 ) Conf_OperCanMode = TRUE;
 | 
			
		||||
		else if( strcasecmp( Arg, "true" ) == 0 ) Conf_OperCanMode = TRUE;
 | 
			
		||||
		else if( atoi( Arg ) != 0 ) Conf_OperCanMode = TRUE;
 | 
			
		||||
		else Conf_OperCanMode = FALSE;
 | 
			
		||||
		Conf_OperCanMode = Check_ArgIsTrue( Arg );
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if( strcasecmp( Var, "OperServerMode" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Mask IRC operator as if coming from the server? (ircd-irc2 compat hack) */
 | 
			
		||||
		Conf_OperServerMode = Check_ArgIsTrue( Arg );
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if( strcasecmp( Var, "MaxConnections" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Maximum number of connections. Values <= 0 are equal to "no limit". */
 | 
			
		||||
#ifdef HAVE_ISDIGIT
 | 
			
		||||
		if( ! isdigit( *Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"MaxConnections\" is not a number!", NGIRCd_ConfFile, Line );
 | 
			
		||||
		if( ! isdigit( (int)*Arg )) Config_Error_NaN( Line, Var);
 | 
			
		||||
		else
 | 
			
		||||
#endif
 | 
			
		||||
		Conf_MaxConnections = atol( Arg );
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if( strcasecmp( Var, "MaxConnectionsIP" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Maximum number of simoultanous connections from one IP. Values <= 0 are equal to "no limit". */
 | 
			
		||||
#ifdef HAVE_ISDIGIT
 | 
			
		||||
		if( ! isdigit( (int)*Arg )) Config_Error_NaN( Line, Var );
 | 
			
		||||
		else
 | 
			
		||||
#endif
 | 
			
		||||
		Conf_MaxConnectionsIP = atoi( Arg );
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if( strcasecmp( Var, "MaxJoins" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Maximum number of channels a user can join. Values <= 0 are equal to "no limit". */
 | 
			
		||||
#ifdef HAVE_ISDIGIT
 | 
			
		||||
		if( ! isdigit( *Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"MaxJoins\" is not a number!", NGIRCd_ConfFile, Line );
 | 
			
		||||
		if( ! isdigit( (int)*Arg )) Config_Error_NaN( Line, Var );
 | 
			
		||||
		else
 | 
			
		||||
#endif
 | 
			
		||||
		Conf_MaxJoins = atoi( Arg );
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if( strcasecmp( Var, "Listen" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* IP-Address to bind sockets */
 | 
			
		||||
		if( strlcpy( Conf_ListenAddress, Arg, sizeof( Conf_ListenAddress )) >= sizeof( Conf_ListenAddress ))
 | 
			
		||||
		{
 | 
			
		||||
			Config_Error_TooLong( Line, Var );
 | 
			
		||||
		}
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	Config_Error( LOG_ERR, "%s, line %d (section \"Global\"): Unknown variable \"%s\"!", NGIRCd_ConfFile, Line, Var );
 | 
			
		||||
} /* Handle_GLOBAL */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID
 | 
			
		||||
Handle_OPERATOR( INT Line, CHAR *Var, CHAR *Arg )
 | 
			
		||||
LOCAL void
 | 
			
		||||
Handle_OPERATOR( int Line, char *Var, char *Arg )
 | 
			
		||||
{
 | 
			
		||||
	assert( Line > 0 );
 | 
			
		||||
	assert( Var != NULL );
 | 
			
		||||
@@ -715,24 +816,34 @@ Handle_OPERATOR( INT Line, CHAR *Var, CHAR *Arg )
 | 
			
		||||
	if( strcasecmp( Var, "Name" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Name of IRC operator */
 | 
			
		||||
		if( strlcpy( Conf_Oper[Conf_Oper_Count - 1].name, Arg, sizeof( Conf_Oper[Conf_Oper_Count - 1].name )) >= sizeof( Conf_Oper[Conf_Oper_Count - 1].name )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Name\" too long!", NGIRCd_ConfFile, Line );
 | 
			
		||||
		if( strlcpy( Conf_Oper[Conf_Oper_Count - 1].name, Arg, sizeof( Conf_Oper[Conf_Oper_Count - 1].name )) >= sizeof( Conf_Oper[Conf_Oper_Count - 1].name )) Config_Error_TooLong( Line, Var );
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if( strcasecmp( Var, "Password" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Password of IRC operator */
 | 
			
		||||
		if( strlcpy( Conf_Oper[Conf_Oper_Count - 1].pwd, Arg, sizeof( Conf_Oper[Conf_Oper_Count - 1].pwd )) >= sizeof( Conf_Oper[Conf_Oper_Count - 1].pwd )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Password\" too long!", NGIRCd_ConfFile, Line );
 | 
			
		||||
		if( strlcpy( Conf_Oper[Conf_Oper_Count - 1].pwd, Arg, sizeof( Conf_Oper[Conf_Oper_Count - 1].pwd )) >= sizeof( Conf_Oper[Conf_Oper_Count - 1].pwd )) Config_Error_TooLong( Line, Var );
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if( strcasecmp( Var, "Mask" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		if (Conf_Oper[Conf_Oper_Count - 1].mask) return; /* Hostname already configured */
 | 
			
		||||
		Conf_Oper[Conf_Oper_Count - 1].mask = strdup( Arg );
 | 
			
		||||
		if (! Conf_Oper[Conf_Oper_Count - 1].mask) {
 | 
			
		||||
			Config_Error( LOG_ERR, "%s, line %d: Cannot allocate memory for operator mask: %s", NGIRCd_ConfFile, Line, strerror(errno) );
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	Config_Error( LOG_ERR, "%s, line %d (section \"Operator\"): Unknown variable \"%s\"!", NGIRCd_ConfFile, Line, Var );
 | 
			
		||||
} /* Handle_OPERATOR */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID
 | 
			
		||||
Handle_SERVER( INT Line, CHAR *Var, CHAR *Arg )
 | 
			
		||||
LOCAL void
 | 
			
		||||
Handle_SERVER( int Line, char *Var, char *Arg )
 | 
			
		||||
{
 | 
			
		||||
	LONG port;
 | 
			
		||||
	long port;
 | 
			
		||||
	
 | 
			
		||||
	assert( Line > 0 );
 | 
			
		||||
	assert( Var != NULL );
 | 
			
		||||
@@ -744,32 +855,35 @@ Handle_SERVER( INT Line, CHAR *Var, CHAR *Arg )
 | 
			
		||||
	if( strcasecmp( Var, "Host" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Hostname of the server */
 | 
			
		||||
		if( strlcpy( New_Server.host, Arg, sizeof( New_Server.host )) >= sizeof( New_Server.host )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Host\" too long!", NGIRCd_ConfFile, Line );
 | 
			
		||||
		if( strlcpy( New_Server.host, Arg, sizeof( New_Server.host )) >= sizeof( New_Server.host ))
 | 
			
		||||
			Config_Error_TooLong ( Line, Var );
 | 
			
		||||
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if( strcasecmp( Var, "Name" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Name of the server ("Nick"/"ID") */
 | 
			
		||||
		if( strlcpy( New_Server.name, Arg, sizeof( New_Server.name )) >= sizeof( New_Server.name )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Name\" too long!", NGIRCd_ConfFile, Line );
 | 
			
		||||
		if( strlcpy( New_Server.name, Arg, sizeof( New_Server.name )) >= sizeof( New_Server.name ))
 | 
			
		||||
			Config_Error_TooLong( Line, Var );
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if( strcasecmp( Var, "MyPassword" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Password of this server which is sent to the peer */
 | 
			
		||||
		if( strlcpy( New_Server.pwd_in, Arg, sizeof( New_Server.pwd_in )) >= sizeof( New_Server.pwd_in )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"MyPassword\" too long!", NGIRCd_ConfFile, Line );
 | 
			
		||||
		if( strlcpy( New_Server.pwd_in, Arg, sizeof( New_Server.pwd_in )) >= sizeof( New_Server.pwd_in )) Config_Error_TooLong( Line, Var );
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if( strcasecmp( Var, "PeerPassword" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Passwort of the peer which must be received */
 | 
			
		||||
		if( strlcpy( New_Server.pwd_out, Arg, sizeof( New_Server.pwd_out )) >= sizeof( New_Server.pwd_out )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"PeerPassword\" too long!", NGIRCd_ConfFile, Line );
 | 
			
		||||
		if( strlcpy( New_Server.pwd_out, Arg, sizeof( New_Server.pwd_out )) >= sizeof( New_Server.pwd_out )) Config_Error_TooLong( Line, Var );
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if( strcasecmp( Var, "Port" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Port to which this server should connect */
 | 
			
		||||
		port = atol( Arg );
 | 
			
		||||
		if( port > 0 && port < 0xFFFF ) New_Server.port = (INT)port;
 | 
			
		||||
		if( port > 0 && port < 0xFFFF ) New_Server.port = (UINT16)port;
 | 
			
		||||
		else Config_Error( LOG_ERR, "%s, line %d (section \"Server\"): Illegal port number %ld!", NGIRCd_ConfFile, Line, port );
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
@@ -777,7 +891,7 @@ Handle_SERVER( INT Line, CHAR *Var, CHAR *Arg )
 | 
			
		||||
	{
 | 
			
		||||
		/* Server group */
 | 
			
		||||
#ifdef HAVE_ISDIGIT
 | 
			
		||||
		if( ! isdigit( *Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Group\" is not a number!", NGIRCd_ConfFile, Line );
 | 
			
		||||
		if( ! isdigit( (int)*Arg )) Config_Error_NaN( Line, Var );
 | 
			
		||||
		else
 | 
			
		||||
#endif
 | 
			
		||||
		New_Server.group = atoi( Arg );
 | 
			
		||||
@@ -788,8 +902,8 @@ Handle_SERVER( INT Line, CHAR *Var, CHAR *Arg )
 | 
			
		||||
} /* Handle_SERVER */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID
 | 
			
		||||
Handle_CHANNEL( INT Line, CHAR *Var, CHAR *Arg )
 | 
			
		||||
LOCAL void
 | 
			
		||||
Handle_CHANNEL( int Line, char *Var, char *Arg )
 | 
			
		||||
{
 | 
			
		||||
	assert( Line > 0 );
 | 
			
		||||
	assert( Var != NULL );
 | 
			
		||||
@@ -798,19 +912,23 @@ Handle_CHANNEL( INT Line, CHAR *Var, CHAR *Arg )
 | 
			
		||||
	if( strcasecmp( Var, "Name" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Name of the channel */
 | 
			
		||||
		if( strlcpy( Conf_Channel[Conf_Channel_Count - 1].name, Arg, sizeof( Conf_Channel[Conf_Channel_Count - 1].name )) >= sizeof( Conf_Channel[Conf_Channel_Count - 1].name )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Name\" too long!", NGIRCd_ConfFile, Line );
 | 
			
		||||
		if( strlcpy( Conf_Channel[Conf_Channel_Count - 1].name, Arg, sizeof( Conf_Channel[Conf_Channel_Count - 1].name )) >= sizeof( Conf_Channel[Conf_Channel_Count - 1].name ))
 | 
			
		||||
			Config_Error_TooLong( Line, Var );
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if( strcasecmp( Var, "Modes" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Initial modes */
 | 
			
		||||
		if( strlcpy( Conf_Channel[Conf_Channel_Count - 1].modes, Arg, sizeof( Conf_Channel[Conf_Channel_Count - 1].modes )) >= sizeof( Conf_Channel[Conf_Channel_Count - 1].modes )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Modes\" too long!", NGIRCd_ConfFile, Line );
 | 
			
		||||
		if( strlcpy( Conf_Channel[Conf_Channel_Count - 1].modes, Arg, sizeof( Conf_Channel[Conf_Channel_Count - 1].modes )) >= sizeof( Conf_Channel[Conf_Channel_Count - 1].modes ))
 | 
			
		||||
			Config_Error_TooLong( Line, Var );
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if( strcasecmp( Var, "Topic" ) == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Initial topic */
 | 
			
		||||
		if( strlcpy( Conf_Channel[Conf_Channel_Count - 1].topic, Arg, sizeof( Conf_Channel[Conf_Channel_Count - 1].topic )) >= sizeof( Conf_Channel[Conf_Channel_Count - 1].topic )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Topic\" too long!", NGIRCd_ConfFile, Line );
 | 
			
		||||
		if( strlcpy( Conf_Channel[Conf_Channel_Count - 1].topic, Arg, sizeof( Conf_Channel[Conf_Channel_Count - 1].topic )) >= sizeof( Conf_Channel[Conf_Channel_Count - 1].topic ))
 | 
			
		||||
			Config_Error_TooLong( Line, Var );
 | 
			
		||||
 
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -818,19 +936,30 @@ Handle_CHANNEL( INT Line, CHAR *Var, CHAR *Arg )
 | 
			
		||||
} /* Handle_CHANNEL */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID
 | 
			
		||||
Validate_Config( BOOLEAN Configtest )
 | 
			
		||||
LOCAL void
 | 
			
		||||
Validate_Config( bool Configtest )
 | 
			
		||||
{
 | 
			
		||||
	/* Validate configuration settings. */
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
	INT i, servers, servers_once;
 | 
			
		||||
	int i, servers, servers_once;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	if( ! Conf_ServerName[0] )
 | 
			
		||||
	{
 | 
			
		||||
		/* No server name configured! */
 | 
			
		||||
		Config_Error( LOG_ALERT, "No server name configured in \"%s\" ('ServerName')!", NGIRCd_ConfFile );
 | 
			
		||||
		Config_Error( LOG_ALERT, "No server name configured in \"%s\" (section 'Global': 'Name')!", NGIRCd_ConfFile );
 | 
			
		||||
		if( ! Configtest )
 | 
			
		||||
		{
 | 
			
		||||
			Config_Error( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME );
 | 
			
		||||
			exit( 1 );
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	if( Conf_ServerName[0] && ! strchr( Conf_ServerName, '.' ))
 | 
			
		||||
	{
 | 
			
		||||
		/* No dot in server name! */
 | 
			
		||||
		Config_Error( LOG_ALERT, "Invalid server name configured in \"%s\" (section 'Global': 'Name'): Dot missing!", NGIRCd_ConfFile );
 | 
			
		||||
		if( ! Configtest )
 | 
			
		||||
		{
 | 
			
		||||
			Config_Error( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME );
 | 
			
		||||
@@ -857,9 +986,9 @@ Validate_Config( BOOLEAN Configtest )
 | 
			
		||||
		Config_Error( LOG_WARNING, "No administrative information configured but required by RFC!" );
 | 
			
		||||
	}
 | 
			
		||||
#ifdef FD_SETSIZE	
 | 
			
		||||
	if(( Conf_MaxConnections > (LONG)FD_SETSIZE ) || ( Conf_MaxConnections < 1 ))
 | 
			
		||||
	if(( Conf_MaxConnections > (long)FD_SETSIZE ) || ( Conf_MaxConnections < 1 ))
 | 
			
		||||
	{
 | 
			
		||||
		Conf_MaxConnections = (LONG)FD_SETSIZE;
 | 
			
		||||
		Conf_MaxConnections = (long)FD_SETSIZE;
 | 
			
		||||
		Config_Error( LOG_ERR, "Setting MaxConnections to %ld, select() can't handle more file descriptors!", Conf_MaxConnections );
 | 
			
		||||
	}
 | 
			
		||||
#else
 | 
			
		||||
@@ -881,18 +1010,30 @@ Validate_Config( BOOLEAN Configtest )
 | 
			
		||||
} /* Validate_Config */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL void
 | 
			
		||||
Config_Error_TooLong ( const int Line, const char *Item )
 | 
			
		||||
{
 | 
			
		||||
	Config_Error( LOG_WARNING, "%s, line %d: Value of \"%s\" too long!", NGIRCd_ConfFile, Line, Item );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
LOCAL void
 | 
			
		||||
Config_Error_NaN( const int Line, const char *Item )
 | 
			
		||||
{
 | 
			
		||||
	Config_Error( LOG_WARNING, "%s, line %d: Value of \"%s\" is not a number!", NGIRCd_ConfFile, Line, Item );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef PROTOTYPES
 | 
			
		||||
LOCAL VOID Config_Error( CONST INT Level, CONST CHAR *Format, ... )
 | 
			
		||||
LOCAL void Config_Error( const int Level, const char *Format, ... )
 | 
			
		||||
#else
 | 
			
		||||
LOCAL VOID Config_Error( Level, Format, va_alist )
 | 
			
		||||
CONST INT Level;
 | 
			
		||||
CONST CHAR *Format;
 | 
			
		||||
LOCAL void Config_Error( Level, Format, va_alist )
 | 
			
		||||
const int Level;
 | 
			
		||||
const char *Format;
 | 
			
		||||
va_dcl
 | 
			
		||||
#endif
 | 
			
		||||
{
 | 
			
		||||
	/* Error! Write to console and/or logfile. */
 | 
			
		||||
 | 
			
		||||
	CHAR msg[MAX_LOG_MSG_LEN];
 | 
			
		||||
	char msg[MAX_LOG_MSG_LEN];
 | 
			
		||||
	va_list ap;
 | 
			
		||||
 | 
			
		||||
	assert( Format != NULL );
 | 
			
		||||
@@ -913,24 +1054,20 @@ va_dcl
 | 
			
		||||
} /* Config_Error */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID
 | 
			
		||||
LOCAL void
 | 
			
		||||
Init_Server_Struct( CONF_SERVER *Server )
 | 
			
		||||
{
 | 
			
		||||
	/* Initialize server configuration structur to default values */
 | 
			
		||||
 | 
			
		||||
	assert( Server != NULL );
 | 
			
		||||
 | 
			
		||||
	strcpy( Server->host, "" );
 | 
			
		||||
	strcpy( Server->ip, "" );
 | 
			
		||||
	strcpy( Server->name, "" );
 | 
			
		||||
	strcpy( Server->pwd_in, "" );
 | 
			
		||||
	strcpy( Server->pwd_out, "" );
 | 
			
		||||
	Server->port = 0;
 | 
			
		||||
	memset( Server, 0, sizeof (CONF_SERVER) );
 | 
			
		||||
 | 
			
		||||
	Server->group = NONE;
 | 
			
		||||
	Server->lasttry = time( NULL ) - Conf_ConnectRetry + STARTUP_DELAY;
 | 
			
		||||
	Server->res_stat = NULL;
 | 
			
		||||
 | 
			
		||||
	if( NGIRCd_Passive ) Server->flags = CONF_SFLAG_DISABLED;
 | 
			
		||||
	else Server->flags = 0;
 | 
			
		||||
 | 
			
		||||
	Server->conn_id = NONE;
 | 
			
		||||
} /* Init_Server_Struct */
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: conf.h,v 1.26 2002/12/31 16:12:50 alex Exp $
 | 
			
		||||
 * $Id: conf.h,v 1.34 2005/03/20 13:54:06 fw Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * Configuration management (header)
 | 
			
		||||
 */
 | 
			
		||||
@@ -20,34 +20,35 @@
 | 
			
		||||
#include <time.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
typedef struct _Conf_Oper
 | 
			
		||||
{
 | 
			
		||||
	CHAR name[CLIENT_PASS_LEN];	/* Name (ID) of IRC operator */
 | 
			
		||||
	CHAR pwd[CLIENT_PASS_LEN];	/* Password */
 | 
			
		||||
	char name[CLIENT_PASS_LEN];	/* Name (ID) of IRC operator */
 | 
			
		||||
	char pwd[CLIENT_PASS_LEN];	/* Password */
 | 
			
		||||
	char *mask;
 | 
			
		||||
} CONF_OPER;
 | 
			
		||||
 | 
			
		||||
typedef struct _Conf_Server
 | 
			
		||||
{
 | 
			
		||||
	CHAR host[HOST_LEN];		/* Hostname */
 | 
			
		||||
	CHAR ip[16];			/* IP address (Resolver) */
 | 
			
		||||
	CHAR name[CLIENT_ID_LEN];	/* IRC-Client-ID */
 | 
			
		||||
	CHAR pwd_in[CLIENT_PASS_LEN];	/* Password which must be received */
 | 
			
		||||
	CHAR pwd_out[CLIENT_PASS_LEN];	/* Password to send to peer */
 | 
			
		||||
	INT port;			/* Server port */
 | 
			
		||||
	INT group;			/* Group of server */
 | 
			
		||||
	char host[HOST_LEN];		/* Hostname */
 | 
			
		||||
	char ip[16];			/* IP address (Resolver) */
 | 
			
		||||
	char name[CLIENT_ID_LEN];	/* IRC-Client-ID */
 | 
			
		||||
	char pwd_in[CLIENT_PASS_LEN];	/* Password which must be received */
 | 
			
		||||
	char pwd_out[CLIENT_PASS_LEN];	/* Password to send to peer */
 | 
			
		||||
	UINT16 port;			/* Server port */
 | 
			
		||||
	int group;			/* Group of server */
 | 
			
		||||
	time_t lasttry;			/* Last connect attempt */
 | 
			
		||||
	RES_STAT *res_stat;		/* Status of the resolver */
 | 
			
		||||
	INT flags;			/* Flags */
 | 
			
		||||
	int flags;			/* Flags */
 | 
			
		||||
	CONN_ID conn_id;		/* ID of server connection or NONE */
 | 
			
		||||
} CONF_SERVER;
 | 
			
		||||
 | 
			
		||||
typedef struct _Conf_Channel
 | 
			
		||||
{
 | 
			
		||||
	CHAR name[CHANNEL_NAME_LEN];	/* Name of the channel */
 | 
			
		||||
	CHAR modes[CHANNEL_MODE_LEN];	/* Initial channel modes */
 | 
			
		||||
	CHAR topic[CHANNEL_TOPIC_LEN];	/* Initial topic */
 | 
			
		||||
	char name[CHANNEL_NAME_LEN];	/* Name of the channel */
 | 
			
		||||
	char modes[CHANNEL_MODE_LEN];	/* Initial channel modes */
 | 
			
		||||
	char topic[CHANNEL_TOPIC_LEN];	/* Initial topic */
 | 
			
		||||
} CONF_CHANNEL;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -56,69 +57,89 @@ typedef struct _Conf_Channel
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Name ("Nick") of the servers */
 | 
			
		||||
GLOBAL CHAR Conf_ServerName[CLIENT_ID_LEN];
 | 
			
		||||
GLOBAL char Conf_ServerName[CLIENT_ID_LEN];
 | 
			
		||||
 | 
			
		||||
/* Server info text */
 | 
			
		||||
GLOBAL CHAR Conf_ServerInfo[CLIENT_INFO_LEN];
 | 
			
		||||
GLOBAL char Conf_ServerInfo[CLIENT_INFO_LEN];
 | 
			
		||||
 | 
			
		||||
/* Global server passwort */
 | 
			
		||||
GLOBAL CHAR Conf_ServerPwd[CLIENT_PASS_LEN];
 | 
			
		||||
GLOBAL char Conf_ServerPwd[CLIENT_PASS_LEN];
 | 
			
		||||
 | 
			
		||||
/* Administrative information */
 | 
			
		||||
GLOBAL CHAR Conf_ServerAdmin1[CLIENT_INFO_LEN];
 | 
			
		||||
GLOBAL CHAR Conf_ServerAdmin2[CLIENT_INFO_LEN];
 | 
			
		||||
GLOBAL CHAR Conf_ServerAdminMail[CLIENT_INFO_LEN];
 | 
			
		||||
GLOBAL char Conf_ServerAdmin1[CLIENT_INFO_LEN];
 | 
			
		||||
GLOBAL char Conf_ServerAdmin2[CLIENT_INFO_LEN];
 | 
			
		||||
GLOBAL char Conf_ServerAdminMail[CLIENT_INFO_LEN];
 | 
			
		||||
 | 
			
		||||
/* File with MOTD text */
 | 
			
		||||
GLOBAL CHAR Conf_MotdFile[FNAME_LEN];
 | 
			
		||||
GLOBAL char Conf_MotdFile[FNAME_LEN];
 | 
			
		||||
 | 
			
		||||
/* Phrase with MOTD text */
 | 
			
		||||
GLOBAL char Conf_MotdPhrase[LINE_LEN];
 | 
			
		||||
 | 
			
		||||
/* Ports the server should listen on */
 | 
			
		||||
GLOBAL UINT Conf_ListenPorts[MAX_LISTEN_PORTS];
 | 
			
		||||
GLOBAL INT Conf_ListenPorts_Count;
 | 
			
		||||
GLOBAL UINT16 Conf_ListenPorts[MAX_LISTEN_PORTS];
 | 
			
		||||
GLOBAL int Conf_ListenPorts_Count;
 | 
			
		||||
 | 
			
		||||
/* Address to which the socket should be bound or empty (=all) */
 | 
			
		||||
GLOBAL char Conf_ListenAddress[16];
 | 
			
		||||
 | 
			
		||||
/* User and group ID the server should run with */
 | 
			
		||||
GLOBAL UINT Conf_UID;
 | 
			
		||||
GLOBAL UINT Conf_GID;
 | 
			
		||||
GLOBAL unsigned int Conf_UID;
 | 
			
		||||
GLOBAL unsigned int Conf_GID;
 | 
			
		||||
 | 
			
		||||
/* A directory to chroot() in */
 | 
			
		||||
GLOBAL char Conf_Chroot[FNAME_LEN];
 | 
			
		||||
 | 
			
		||||
/* File with PID of daemon */
 | 
			
		||||
GLOBAL char Conf_PidFile[FNAME_LEN];
 | 
			
		||||
 | 
			
		||||
/* Timeouts for PING and PONG */
 | 
			
		||||
GLOBAL INT Conf_PingTimeout;
 | 
			
		||||
GLOBAL INT Conf_PongTimeout;
 | 
			
		||||
GLOBAL int Conf_PingTimeout;
 | 
			
		||||
GLOBAL int Conf_PongTimeout;
 | 
			
		||||
 | 
			
		||||
/* Seconds between connect attempts to other servers */
 | 
			
		||||
GLOBAL INT Conf_ConnectRetry;
 | 
			
		||||
GLOBAL int Conf_ConnectRetry;
 | 
			
		||||
 | 
			
		||||
/* Operators */
 | 
			
		||||
GLOBAL CONF_OPER Conf_Oper[MAX_OPERATORS];
 | 
			
		||||
GLOBAL INT Conf_Oper_Count;
 | 
			
		||||
GLOBAL int Conf_Oper_Count;
 | 
			
		||||
 | 
			
		||||
/* Servers */
 | 
			
		||||
GLOBAL CONF_SERVER Conf_Server[MAX_SERVERS];
 | 
			
		||||
 | 
			
		||||
/* Pre-defined channels */
 | 
			
		||||
GLOBAL CONF_CHANNEL Conf_Channel[MAX_DEFCHANNELS];
 | 
			
		||||
GLOBAL INT Conf_Channel_Count;
 | 
			
		||||
GLOBAL int Conf_Channel_Count;
 | 
			
		||||
 | 
			
		||||
/* Are IRC operators allowed to always use MODE? */
 | 
			
		||||
GLOBAL BOOLEAN Conf_OperCanMode;
 | 
			
		||||
GLOBAL bool Conf_OperCanMode;
 | 
			
		||||
 | 
			
		||||
/* If an IRC op gives chanop privileges without being a chanop,
 | 
			
		||||
 * ircd2 will ignore the command. This enables a workaround:
 | 
			
		||||
 * It masks the command as coming from the server */
 | 
			
		||||
GLOBAL bool Conf_OperServerMode;
 | 
			
		||||
 | 
			
		||||
/* Maximum number of connections to this server */
 | 
			
		||||
GLOBAL LONG Conf_MaxConnections;
 | 
			
		||||
GLOBAL long Conf_MaxConnections;
 | 
			
		||||
 | 
			
		||||
/* Maximum number of channels a user can join */
 | 
			
		||||
GLOBAL INT Conf_MaxJoins;
 | 
			
		||||
GLOBAL int Conf_MaxJoins;
 | 
			
		||||
 | 
			
		||||
/* Maximum number of connections per IP address */
 | 
			
		||||
GLOBAL int Conf_MaxConnectionsIP;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Conf_Init PARAMS((VOID ));
 | 
			
		||||
GLOBAL VOID Conf_Rehash PARAMS((VOID ));
 | 
			
		||||
GLOBAL INT Conf_Test PARAMS((VOID ));
 | 
			
		||||
GLOBAL void Conf_Init PARAMS((void ));
 | 
			
		||||
GLOBAL void Conf_Rehash PARAMS((void ));
 | 
			
		||||
GLOBAL int Conf_Test PARAMS((void ));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Conf_UnsetServer PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL VOID Conf_SetServer PARAMS(( INT ConfServer, CONN_ID Idx ));
 | 
			
		||||
GLOBAL INT Conf_GetServer PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL void Conf_UnsetServer PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL void Conf_SetServer PARAMS(( int ConfServer, CONN_ID Idx ));
 | 
			
		||||
GLOBAL int Conf_GetServer PARAMS(( CONN_ID Idx ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Conf_EnableServer PARAMS(( CHAR *Name, INT Port ));
 | 
			
		||||
GLOBAL BOOLEAN Conf_DisableServer PARAMS(( CHAR *Name ));
 | 
			
		||||
GLOBAL BOOLEAN Conf_AddServer PARAMS(( CHAR *Name, INT Port, CHAR *Host, CHAR *MyPwd, CHAR *PeerPwd ));
 | 
			
		||||
GLOBAL bool Conf_EnableServer PARAMS(( char *Name, UINT16 Port ));
 | 
			
		||||
GLOBAL bool Conf_DisableServer PARAMS(( char *Name ));
 | 
			
		||||
GLOBAL bool Conf_AddServer PARAMS(( char *Name, UINT16 Port, char *Host, char *MyPwd, char *PeerPwd ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -16,18 +16,20 @@
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: conn-func.c,v 1.1 2002/12/30 17:14:28 alex Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: conn-func.c,v 1.6 2005/06/12 16:32:17 alex Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <log.h>
 | 
			
		||||
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "client.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "conn-func.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Conn_UpdateIdle( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
	/* Idle-Timer zuruecksetzen */
 | 
			
		||||
@@ -57,7 +59,7 @@ Conn_LastPing( CONN_ID Idx )
 | 
			
		||||
} /* Conn_LastPing */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Conn_SetPenalty( CONN_ID Idx, time_t Seconds )
 | 
			
		||||
{
 | 
			
		||||
	/* Penalty-Delay fuer eine Verbindung (in Sekunden) setzen;
 | 
			
		||||
@@ -69,13 +71,13 @@ Conn_SetPenalty( CONN_ID Idx, time_t Seconds )
 | 
			
		||||
	
 | 
			
		||||
	assert( Idx > NONE );
 | 
			
		||||
	assert( Seconds >= 0 );
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	t = time( NULL ) + Seconds;
 | 
			
		||||
	if( t > My_Connections[Idx].delaytime ) My_Connections[Idx].delaytime = t;
 | 
			
		||||
} /* Conn_SetPenalty */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Conn_ResetPenalty( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
	assert( Idx > NONE );
 | 
			
		||||
@@ -83,8 +85,8 @@ Conn_ResetPenalty( CONN_ID Idx )
 | 
			
		||||
} /* Conn_ResetPenalty */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Conn_ClearFlags( VOID )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Conn_ClearFlags( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Alle Connection auf "nicht-markiert" setzen */
 | 
			
		||||
 | 
			
		||||
@@ -94,18 +96,18 @@ Conn_ClearFlags( VOID )
 | 
			
		||||
} /* Conn_ClearFlags */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL INT
 | 
			
		||||
GLOBAL int
 | 
			
		||||
Conn_Flag( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
	/* Ist eine Connection markiert (TRUE) oder nicht? */
 | 
			
		||||
	/* Ist eine Connection markiert (true) oder nicht? */
 | 
			
		||||
 | 
			
		||||
	assert( Idx > NONE );
 | 
			
		||||
	return My_Connections[Idx].flag;
 | 
			
		||||
} /* Conn_Flag */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Conn_SetFlag( CONN_ID Idx, INT Flag )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Conn_SetFlag( CONN_ID Idx, int Flag )
 | 
			
		||||
{
 | 
			
		||||
	/* Connection markieren */
 | 
			
		||||
 | 
			
		||||
@@ -115,7 +117,7 @@ Conn_SetFlag( CONN_ID Idx, INT Flag )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CONN_ID
 | 
			
		||||
Conn_First( VOID )
 | 
			
		||||
Conn_First( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Connection-Struktur der ersten Verbindung liefern;
 | 
			
		||||
	 * Ist keine Verbindung vorhanden, wird NONE geliefert. */
 | 
			
		||||
@@ -148,32 +150,7 @@ Conn_Next( CONN_ID Idx )
 | 
			
		||||
} /* Conn_Next */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Conn_SetOption( CONN_ID Idx, INT Option )
 | 
			
		||||
{
 | 
			
		||||
	/* Option fuer Verbindung setzen.
 | 
			
		||||
	 * Initial sind alle Optionen _nicht_ gesetzt. */
 | 
			
		||||
 | 
			
		||||
	assert( Idx > NONE );
 | 
			
		||||
	assert( Option != 0 );
 | 
			
		||||
 | 
			
		||||
	My_Connections[Idx].options |= Option;
 | 
			
		||||
} /* Conn_SetOption */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Conn_UnsetOption( CONN_ID Idx, INT Option )
 | 
			
		||||
{
 | 
			
		||||
	/* Option fuer Verbindung loeschen */
 | 
			
		||||
 | 
			
		||||
	assert( Idx > NONE );
 | 
			
		||||
	assert( Option != 0 );
 | 
			
		||||
 | 
			
		||||
	My_Connections[Idx].options &= ~Option;
 | 
			
		||||
} /* Conn_UnsetOption */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL INT
 | 
			
		||||
GLOBAL int
 | 
			
		||||
Conn_Options( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
	assert( Idx > NONE );
 | 
			
		||||
@@ -181,23 +158,34 @@ Conn_Options( CONN_ID Idx )
 | 
			
		||||
} /* Conn_Options */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Get the start time of the connection.
 | 
			
		||||
 * The result is the start time in seconds since 1970-01-01, as reported
 | 
			
		||||
 * by the C function time(NULL).
 | 
			
		||||
 */
 | 
			
		||||
GLOBAL time_t
 | 
			
		||||
Conn_StartTime( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
	/* Zeitpunkt des Link-Starts liefern (in Sekunden) */
 | 
			
		||||
	CLIENT *c;
 | 
			
		||||
 | 
			
		||||
	assert( Idx > NONE );
 | 
			
		||||
	return My_Connections[Idx].starttime;
 | 
			
		||||
} /* Conn_Uptime */
 | 
			
		||||
	assert(Idx > NONE);
 | 
			
		||||
 | 
			
		||||
	/* Search client structure for this link ... */
 | 
			
		||||
	c = Client_GetFromConn(Idx);
 | 
			
		||||
	if(c != NULL)
 | 
			
		||||
		return Client_StartTime(c);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
} /* Conn_StartTime */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL INT
 | 
			
		||||
GLOBAL int
 | 
			
		||||
Conn_SendQ( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
	/* Laenge der Daten im Schreibbuffer liefern */
 | 
			
		||||
 | 
			
		||||
	assert( Idx > NONE );
 | 
			
		||||
#ifdef USE_ZLIB
 | 
			
		||||
#ifdef ZLIB
 | 
			
		||||
	if( My_Connections[Idx].options & CONN_ZIP ) return My_Connections[Idx].zip.wdatalen;
 | 
			
		||||
	else
 | 
			
		||||
#endif
 | 
			
		||||
@@ -205,7 +193,7 @@ Conn_SendQ( CONN_ID Idx )
 | 
			
		||||
} /* Conn_SendQ */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL LONG
 | 
			
		||||
GLOBAL long
 | 
			
		||||
Conn_SendMsg( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
	/* Anzahl gesendeter Nachrichten liefern */
 | 
			
		||||
@@ -215,7 +203,7 @@ Conn_SendMsg( CONN_ID Idx )
 | 
			
		||||
} /* Conn_SendMsg */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL LONG
 | 
			
		||||
GLOBAL long
 | 
			
		||||
Conn_SendBytes( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
	/* Anzahl gesendeter Bytes (unkomprimiert) liefern */
 | 
			
		||||
@@ -225,13 +213,13 @@ Conn_SendBytes( CONN_ID Idx )
 | 
			
		||||
} /* Conn_SendBytes */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL INT
 | 
			
		||||
GLOBAL int
 | 
			
		||||
Conn_RecvQ( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
	/* Laenge der Daten im Lesebuffer liefern */
 | 
			
		||||
 | 
			
		||||
	assert( Idx > NONE );
 | 
			
		||||
#ifdef USE_ZLIB
 | 
			
		||||
#ifdef ZLIB
 | 
			
		||||
	if( My_Connections[Idx].options & CONN_ZIP ) return My_Connections[Idx].zip.rdatalen;
 | 
			
		||||
	else
 | 
			
		||||
#endif
 | 
			
		||||
@@ -239,7 +227,7 @@ Conn_RecvQ( CONN_ID Idx )
 | 
			
		||||
} /* Conn_RecvQ */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL LONG
 | 
			
		||||
GLOBAL long
 | 
			
		||||
Conn_RecvMsg( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
	/* Anzahl empfangener Nachrichten liefern */
 | 
			
		||||
@@ -249,7 +237,7 @@ Conn_RecvMsg( CONN_ID Idx )
 | 
			
		||||
} /* Conn_RecvMsg */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL LONG
 | 
			
		||||
GLOBAL long
 | 
			
		||||
Conn_RecvBytes( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
	/* Anzahl empfangener Bytes (unkomprimiert) liefern */
 | 
			
		||||
@@ -259,15 +247,15 @@ Conn_RecvBytes( CONN_ID Idx )
 | 
			
		||||
} /* Conn_RecvBytes */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Conn_ResetWCounter( VOID )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Conn_ResetWCounter( void )
 | 
			
		||||
{
 | 
			
		||||
	WCounter = 0;
 | 
			
		||||
} /* Conn_ResetWCounter */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL LONG
 | 
			
		||||
Conn_WCounter( VOID )
 | 
			
		||||
GLOBAL long
 | 
			
		||||
Conn_WCounter( void )
 | 
			
		||||
{
 | 
			
		||||
	return WCounter;
 | 
			
		||||
} /* Conn_WCounter */
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: conn-func.h,v 1.1 2002/12/30 17:14:28 alex Exp $
 | 
			
		||||
 * $Id: conn-func.h,v 1.4 2005/04/25 18:37:16 fw Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * Connection management: Global functions (header)
 | 
			
		||||
 */
 | 
			
		||||
@@ -26,34 +26,35 @@
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Conn_UpdateIdle PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL void Conn_UpdateIdle PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL time_t Conn_GetIdle PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL time_t Conn_LastPing PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL time_t Conn_StartTime PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL INT Conn_SendQ PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL INT Conn_RecvQ PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL LONG Conn_SendMsg PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL LONG Conn_RecvMsg PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL LONG Conn_SendBytes PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL LONG Conn_RecvBytes PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL int Conn_SendQ PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL int Conn_RecvQ PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL long Conn_SendMsg PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL long Conn_RecvMsg PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL long Conn_SendBytes PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL long Conn_RecvBytes PARAMS(( CONN_ID Idx ));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Conn_SetPenalty PARAMS(( CONN_ID Idx, time_t Seconds ));
 | 
			
		||||
GLOBAL VOID Conn_ResetPenalty PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL void Conn_SetPenalty PARAMS(( CONN_ID Idx, time_t Seconds ));
 | 
			
		||||
GLOBAL void Conn_ResetPenalty PARAMS(( CONN_ID Idx ));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Conn_ClearFlags PARAMS(( VOID ));
 | 
			
		||||
GLOBAL INT Conn_Flag PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL VOID Conn_SetFlag PARAMS(( CONN_ID Idx, INT Flag ));
 | 
			
		||||
GLOBAL void Conn_ClearFlags PARAMS(( void ));
 | 
			
		||||
GLOBAL int Conn_Flag PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL void Conn_SetFlag PARAMS(( CONN_ID Idx, int Flag ));
 | 
			
		||||
 | 
			
		||||
GLOBAL CONN_ID Conn_First PARAMS(( VOID ));
 | 
			
		||||
GLOBAL CONN_ID Conn_First PARAMS(( void ));
 | 
			
		||||
GLOBAL CONN_ID Conn_Next PARAMS(( CONN_ID Idx ));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Conn_SetOption PARAMS(( CONN_ID Idx, INT Option ));
 | 
			
		||||
GLOBAL VOID Conn_UnsetOption PARAMS(( CONN_ID Idx, INT Option ));
 | 
			
		||||
GLOBAL INT Conn_Options PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL int Conn_Options PARAMS(( CONN_ID Idx ));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Conn_ResetWCounter PARAMS(( VOID ));
 | 
			
		||||
GLOBAL LONG Conn_WCounter PARAMS(( VOID ));
 | 
			
		||||
GLOBAL void Conn_ResetWCounter PARAMS(( void ));
 | 
			
		||||
GLOBAL long Conn_WCounter PARAMS(( void ));
 | 
			
		||||
 | 
			
		||||
#define Conn_OPTION_ADD( x, opt )   ( (x)->options |= opt ) 
 | 
			
		||||
#define Conn_OPTION_DEL( x, opt )   ( (x)->options &= ~opt )
 | 
			
		||||
#define Conn_OPTION_ISSET( x, opt ) ( (x)->options & opt )
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -17,9 +17,9 @@
 | 
			
		||||
#define CONN_MODULE
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef USE_ZLIB
 | 
			
		||||
#ifdef ZLIB
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: conn-zip.c,v 1.3 2003/04/21 10:52:26 alex Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: conn-zip.c,v 1.7 2005/04/25 18:37:16 fw Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
@@ -34,7 +34,7 @@ static char UNUSED id[] = "$Id: conn-zip.c,v 1.3 2003/04/21 10:52:26 alex Exp $"
 | 
			
		||||
#include "conn-zip.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Zip_InitConn( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
	/* Kompression fuer Link initialisieren */
 | 
			
		||||
@@ -52,7 +52,7 @@ Zip_InitConn( CONN_ID Idx )
 | 
			
		||||
	{
 | 
			
		||||
		/* Fehler! */
 | 
			
		||||
		Log( LOG_ALERT, "Can't initialize compression on connection %d (zlib inflate)!", Idx );
 | 
			
		||||
		return FALSE;
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	My_Connections[Idx].zip.out.total_in = 0;
 | 
			
		||||
@@ -65,24 +65,24 @@ Zip_InitConn( CONN_ID Idx )
 | 
			
		||||
	{
 | 
			
		||||
		/* Fehler! */
 | 
			
		||||
		Log( LOG_ALERT, "Can't initialize compression on connection %d (zlib deflate)!", Idx );
 | 
			
		||||
		return FALSE;
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	My_Connections[Idx].zip.bytes_in = My_Connections[Idx].bytes_in;
 | 
			
		||||
	My_Connections[Idx].zip.bytes_out = My_Connections[Idx].bytes_out;
 | 
			
		||||
 | 
			
		||||
	Log( LOG_INFO, "Enabled link compression (zlib) on connection %d.", Idx );
 | 
			
		||||
	Conn_SetOption( Idx, CONN_ZIP );
 | 
			
		||||
	Conn_OPTION_ADD( &My_Connections[Idx], CONN_ZIP );
 | 
			
		||||
 | 
			
		||||
	return TRUE;
 | 
			
		||||
	return true;
 | 
			
		||||
} /* Zip_InitConn */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
Zip_Buffer( CONN_ID Idx, CHAR *Data, INT Len )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Zip_Buffer( CONN_ID Idx, char *Data, int Len )
 | 
			
		||||
{
 | 
			
		||||
	/* Daten zum Komprimieren im "Kompressions-Puffer" sammeln.
 | 
			
		||||
	* Es wird TRUE bei Erfolg, sonst FALSE geliefert. */
 | 
			
		||||
	* Es wird true bei Erfolg, sonst false geliefert. */
 | 
			
		||||
 | 
			
		||||
	assert( Idx > NONE );
 | 
			
		||||
	assert( Data != NULL );
 | 
			
		||||
@@ -92,39 +92,39 @@ Zip_Buffer( CONN_ID Idx, CHAR *Data, INT Len )
 | 
			
		||||
	if( ZWRITEBUFFER_LEN - My_Connections[Idx].zip.wdatalen < Len + 50 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Nein! Puffer zunaechst leeren ...*/
 | 
			
		||||
		if( ! Zip_Flush( Idx )) return FALSE;
 | 
			
		||||
		if( ! Zip_Flush( Idx )) return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Daten kopieren */
 | 
			
		||||
	memmove( My_Connections[Idx].zip.wbuf + My_Connections[Idx].zip.wdatalen, Data, Len );
 | 
			
		||||
	My_Connections[Idx].zip.wdatalen += Len;
 | 
			
		||||
 | 
			
		||||
	return TRUE;
 | 
			
		||||
	return true;
 | 
			
		||||
} /* Zip_Buffer */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Zip_Flush( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
	/* Daten komprimieren und in Schreibpuffer kopieren.
 | 
			
		||||
	* Es wird TRUE bei Erfolg, sonst FALSE geliefert. */
 | 
			
		||||
	* Es wird true bei Erfolg, sonst false geliefert. */
 | 
			
		||||
 | 
			
		||||
	INT result, out_len;
 | 
			
		||||
	int result, out_len;
 | 
			
		||||
	z_stream *out;
 | 
			
		||||
 | 
			
		||||
	out = &My_Connections[Idx].zip.out;
 | 
			
		||||
 | 
			
		||||
	out->next_in = (VOID *)My_Connections[Idx].zip.wbuf;
 | 
			
		||||
	out->next_in = (void *)My_Connections[Idx].zip.wbuf;
 | 
			
		||||
	out->avail_in = My_Connections[Idx].zip.wdatalen;
 | 
			
		||||
	out->next_out = (VOID *)(My_Connections[Idx].wbuf + My_Connections[Idx].wdatalen);
 | 
			
		||||
	out->next_out = (void *)(My_Connections[Idx].wbuf + My_Connections[Idx].wdatalen);
 | 
			
		||||
	out->avail_out = WRITEBUFFER_LEN - My_Connections[Idx].wdatalen;
 | 
			
		||||
 | 
			
		||||
	result = deflate( out, Z_SYNC_FLUSH );
 | 
			
		||||
	if(( result != Z_OK ) || ( out->avail_in > 0 ))
 | 
			
		||||
	{
 | 
			
		||||
		Log( LOG_ALERT, "Compression error: code %d!?", result );
 | 
			
		||||
		Conn_Close( Idx, "Compression error!", NULL, FALSE );
 | 
			
		||||
		return FALSE;
 | 
			
		||||
		Conn_Close( Idx, "Compression error!", NULL, false );
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	out_len = WRITEBUFFER_LEN - My_Connections[Idx].wdatalen - out->avail_out;
 | 
			
		||||
@@ -133,37 +133,37 @@ Zip_Flush( CONN_ID Idx )
 | 
			
		||||
	My_Connections[Idx].zip.bytes_out += My_Connections[Idx].zip.wdatalen;
 | 
			
		||||
	My_Connections[Idx].zip.wdatalen = 0;
 | 
			
		||||
 | 
			
		||||
	return TRUE;
 | 
			
		||||
	return true;
 | 
			
		||||
} /* Zip_Flush */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Unzip_Buffer( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
	/* Daten entpacken und in Lesepuffer kopieren. Bei Fehlern
 | 
			
		||||
	* wird FALSE geliefert, ansonsten TRUE. Der Fall, dass keine
 | 
			
		||||
	* wird false geliefert, ansonsten true. Der Fall, dass keine
 | 
			
		||||
	* Daten mehr zu entpacken sind, ist _kein_ Fehler! */
 | 
			
		||||
 | 
			
		||||
	INT result, in_len, out_len;
 | 
			
		||||
	int result, in_len, out_len;
 | 
			
		||||
	z_stream *in;
 | 
			
		||||
 | 
			
		||||
	assert( Idx > NONE );
 | 
			
		||||
 | 
			
		||||
	if( My_Connections[Idx].zip.rdatalen <= 0 ) return TRUE;
 | 
			
		||||
	if( My_Connections[Idx].zip.rdatalen <= 0 ) return true;
 | 
			
		||||
 | 
			
		||||
	in = &My_Connections[Idx].zip.in;
 | 
			
		||||
 | 
			
		||||
	in->next_in = (VOID *)My_Connections[Idx].zip.rbuf;
 | 
			
		||||
	in->next_in = (void *)My_Connections[Idx].zip.rbuf;
 | 
			
		||||
	in->avail_in = My_Connections[Idx].zip.rdatalen;
 | 
			
		||||
	in->next_out = (VOID *)(My_Connections[Idx].rbuf + My_Connections[Idx].rdatalen);
 | 
			
		||||
	in->next_out = (void *)(My_Connections[Idx].rbuf + My_Connections[Idx].rdatalen);
 | 
			
		||||
	in->avail_out = READBUFFER_LEN - My_Connections[Idx].rdatalen - 1;
 | 
			
		||||
 | 
			
		||||
	result = inflate( in, Z_SYNC_FLUSH );
 | 
			
		||||
	if( result != Z_OK )
 | 
			
		||||
	{
 | 
			
		||||
		Log( LOG_ALERT, "Decompression error: code %d (ni=%d, ai=%d, no=%d, ao=%d)!?", result, in->next_in, in->avail_in, in->next_out, in->avail_out );
 | 
			
		||||
		Conn_Close( Idx, "Decompression error!", NULL, FALSE );
 | 
			
		||||
		return FALSE;
 | 
			
		||||
		Log( LOG_ALERT, "Decompression error: %s (code=%d, ni=%d, ai=%d, no=%d, ao=%d)!?", in->msg, result, in->next_in, in->avail_in, in->next_out, in->avail_out );
 | 
			
		||||
		Conn_Close( Idx, "Decompression error!", NULL, false );
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	in_len = My_Connections[Idx].zip.rdatalen - in->avail_in;
 | 
			
		||||
@@ -180,11 +180,11 @@ Unzip_Buffer( CONN_ID Idx )
 | 
			
		||||
	else My_Connections[Idx].zip.rdatalen = 0;
 | 
			
		||||
	My_Connections[Idx].zip.bytes_in += out_len;
 | 
			
		||||
 | 
			
		||||
	return TRUE;
 | 
			
		||||
	return true;
 | 
			
		||||
} /* Unzip_Buffer */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL LONG
 | 
			
		||||
GLOBAL long
 | 
			
		||||
Zip_SendBytes( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
	/* Anzahl gesendeter Bytes (komprimiert!) liefern */
 | 
			
		||||
@@ -194,7 +194,7 @@ Zip_SendBytes( CONN_ID Idx )
 | 
			
		||||
} /* Zip_SendBytes */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL LONG
 | 
			
		||||
GLOBAL long
 | 
			
		||||
Zip_RecvBytes( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
	/* Anzahl gesendeter Bytes (komprimiert!) liefern */
 | 
			
		||||
 
 | 
			
		||||
@@ -8,31 +8,31 @@
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: conn-zip.h,v 1.1 2002/12/30 16:07:23 alex Exp $
 | 
			
		||||
 * $Id: conn-zip.h,v 1.3 2005/03/19 18:43:48 fw Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * Connection compression using ZLIB (header)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef USE_ZLIB
 | 
			
		||||
#ifdef ZLIB
 | 
			
		||||
 | 
			
		||||
#ifndef __conn_zip_h__
 | 
			
		||||
#define __conn_zip_h__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Zip_InitConn PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL bool Zip_InitConn PARAMS(( CONN_ID Idx ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Zip_Buffer PARAMS(( CONN_ID Idx, CHAR *Data, INT Len ));
 | 
			
		||||
GLOBAL BOOLEAN Zip_Flush PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL BOOLEAN Unzip_Buffer PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL bool Zip_Buffer PARAMS(( CONN_ID Idx, char *Data, int Len ));
 | 
			
		||||
GLOBAL bool Zip_Flush PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL bool Unzip_Buffer PARAMS(( CONN_ID Idx ));
 | 
			
		||||
 | 
			
		||||
GLOBAL LONG Zip_SendBytes PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL LONG Zip_RecvBytes PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL long Zip_SendBytes PARAMS(( CONN_ID Idx ));
 | 
			
		||||
GLOBAL long Zip_RecvBytes PARAMS(( CONN_ID Idx ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif /* __conn_zip_h__ */
 | 
			
		||||
 | 
			
		||||
#endif /* USE_ZLIB */
 | 
			
		||||
#endif /* ZLIB */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* -eof- */
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1050
									
								
								src/ngircd/conn.c
									
									
									
									
									
								
							
							
						
						
									
										1050
									
								
								src/ngircd/conn.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -8,7 +8,7 @@
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: conn.h,v 1.31 2003/03/27 01:20:22 alex Exp $
 | 
			
		||||
 * $Id: conn.h,v 1.35.2.1 2005/07/30 23:24:50 alex Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * Connection management (header)
 | 
			
		||||
 */
 | 
			
		||||
@@ -18,17 +18,18 @@
 | 
			
		||||
#define __conn_h__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include <time.h>			/* fro time_t, see below */
 | 
			
		||||
#include <time.h>			/* for time_t, see below */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define CONN_ISCLOSING 1		/* Conn_Close() already called */
 | 
			
		||||
#define CONN_ISCLOSING		1	/* Conn_Close() already called */
 | 
			
		||||
#define CONN_ISCONNECTING	2	/* connect() in progress */
 | 
			
		||||
 | 
			
		||||
#ifdef USE_ZLIB
 | 
			
		||||
#define CONN_ZIP 2			/* zlib compressed link */
 | 
			
		||||
#ifdef ZLIB
 | 
			
		||||
#define CONN_ZIP		4	/* zlib compressed link */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef INT CONN_ID;
 | 
			
		||||
typedef int CONN_ID;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef CONN_MODULE
 | 
			
		||||
@@ -36,69 +37,68 @@ typedef INT CONN_ID;
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "resolve.h"
 | 
			
		||||
 | 
			
		||||
#ifdef USE_ZLIB
 | 
			
		||||
#ifdef ZLIB
 | 
			
		||||
#include <zlib.h>
 | 
			
		||||
typedef struct _ZipData
 | 
			
		||||
{
 | 
			
		||||
	z_stream in;			/* "Handle" for input stream */
 | 
			
		||||
	z_stream out;			/* "Handle" for output stream */
 | 
			
		||||
	CHAR rbuf[READBUFFER_LEN];	/* Read buffer */
 | 
			
		||||
	INT rdatalen;			/* Length of data in read buffer (compressed) */
 | 
			
		||||
	CHAR wbuf[WRITEBUFFER_LEN];	/* Write buffer */
 | 
			
		||||
	INT wdatalen;			/* Length of data in write buffer (uncompressed) */
 | 
			
		||||
	LONG bytes_in, bytes_out;	/* Counter for statistics (uncompressed!) */
 | 
			
		||||
	char rbuf[READBUFFER_LEN];	/* Read buffer */
 | 
			
		||||
	int rdatalen;			/* Length of data in read buffer (compressed) */
 | 
			
		||||
	char wbuf[WRITEBUFFER_LEN];	/* Write buffer */
 | 
			
		||||
	int wdatalen;			/* Length of data in write buffer (uncompressed) */
 | 
			
		||||
	long bytes_in, bytes_out;	/* Counter for statistics (uncompressed!) */
 | 
			
		||||
} ZIPDATA;
 | 
			
		||||
#endif /* USE_ZLIB */
 | 
			
		||||
#endif /* ZLIB */
 | 
			
		||||
 | 
			
		||||
typedef struct _Connection
 | 
			
		||||
{
 | 
			
		||||
	INT sock;			/* Socket handle */
 | 
			
		||||
	int sock;			/* Socket handle */
 | 
			
		||||
	struct sockaddr_in addr;	/* Client address */
 | 
			
		||||
	RES_STAT *res_stat;		/* Status of resolver process, if any */
 | 
			
		||||
	CHAR host[HOST_LEN];		/* Hostname */
 | 
			
		||||
	CHAR rbuf[READBUFFER_LEN];	/* Read buffer */
 | 
			
		||||
	INT rdatalen;			/* Length of data in read buffer */
 | 
			
		||||
	CHAR wbuf[WRITEBUFFER_LEN];	/* Write buffer */
 | 
			
		||||
	INT wdatalen;			/* Length of data in write buffer */
 | 
			
		||||
	time_t starttime;		/* Start time of link */
 | 
			
		||||
	char host[HOST_LEN];		/* Hostname */
 | 
			
		||||
	char rbuf[READBUFFER_LEN];	/* Read buffer */
 | 
			
		||||
	int rdatalen;			/* Length of data in read buffer */
 | 
			
		||||
	char wbuf[WRITEBUFFER_LEN];	/* Write buffer */
 | 
			
		||||
	int wdatalen;			/* Length of data in write buffer */
 | 
			
		||||
	time_t lastdata;		/* Last activity */
 | 
			
		||||
	time_t lastping;		/* Last PING */
 | 
			
		||||
	time_t lastprivmsg;		/* Last PRIVMSG */
 | 
			
		||||
	time_t delaytime;		/* Ignore link ("penalty") */
 | 
			
		||||
	LONG bytes_in, bytes_out;	/* Received and sent bytes */
 | 
			
		||||
	LONG msg_in, msg_out;		/* Received and sent IRC messages */
 | 
			
		||||
	INT flag;			/* Flag (see "irc-write" module) */
 | 
			
		||||
	INT options;			/* Link options */
 | 
			
		||||
#ifdef USE_ZLIB
 | 
			
		||||
	long bytes_in, bytes_out;	/* Received and sent bytes */
 | 
			
		||||
	long msg_in, msg_out;		/* Received and sent IRC messages */
 | 
			
		||||
	int flag;			/* Flag (see "irc-write" module) */
 | 
			
		||||
	UINT16 options;			/* Link options / connection state */
 | 
			
		||||
#ifdef ZLIB
 | 
			
		||||
	ZIPDATA zip;			/* Compression information */
 | 
			
		||||
#endif  /* USE_ZLIB */
 | 
			
		||||
#endif  /* ZLIB */
 | 
			
		||||
} CONNECTION;
 | 
			
		||||
 | 
			
		||||
GLOBAL CONNECTION *My_Connections;
 | 
			
		||||
GLOBAL CONN_ID Pool_Size;
 | 
			
		||||
GLOBAL LONG WCounter;
 | 
			
		||||
GLOBAL long WCounter;
 | 
			
		||||
 | 
			
		||||
#endif /* CONN_MODULE */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Conn_Init PARAMS((VOID ));
 | 
			
		||||
GLOBAL VOID Conn_Exit PARAMS(( VOID ));
 | 
			
		||||
GLOBAL void Conn_Init PARAMS((void ));
 | 
			
		||||
GLOBAL void Conn_Exit PARAMS(( void ));
 | 
			
		||||
 | 
			
		||||
GLOBAL INT Conn_InitListeners PARAMS(( VOID ));
 | 
			
		||||
GLOBAL VOID Conn_ExitListeners PARAMS(( VOID ));
 | 
			
		||||
GLOBAL int Conn_InitListeners PARAMS(( void ));
 | 
			
		||||
GLOBAL void Conn_ExitListeners PARAMS(( void ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Conn_NewListener PARAMS(( CONST UINT Port ));
 | 
			
		||||
GLOBAL bool Conn_NewListener PARAMS(( const UINT16 Port ));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Conn_Handler PARAMS(( VOID ));
 | 
			
		||||
GLOBAL void Conn_Handler PARAMS(( void ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Conn_Write PARAMS(( CONN_ID Idx, CHAR *Data, INT Len ));
 | 
			
		||||
GLOBAL BOOLEAN Conn_WriteStr PARAMS(( CONN_ID Idx, CHAR *Format, ... ));
 | 
			
		||||
GLOBAL bool Conn_Write PARAMS(( CONN_ID Idx, char *Data, int Len ));
 | 
			
		||||
GLOBAL bool Conn_WriteStr PARAMS(( CONN_ID Idx, char *Format, ... ));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Conn_Close PARAMS(( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformClient ));
 | 
			
		||||
GLOBAL void Conn_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 int Conn_MaxFD;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: defines.h,v 1.42 2003/02/23 12:03:39 alex Exp $
 | 
			
		||||
 * $Id: defines.h,v 1.52.2.2 2005/07/05 22:58:25 alex Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * Global defines of ngIRCd.
 | 
			
		||||
 */
 | 
			
		||||
@@ -19,83 +19,90 @@
 | 
			
		||||
 | 
			
		||||
#define NONE -1
 | 
			
		||||
 | 
			
		||||
#define TIME_RES 2			/* Zeit-Aufloesung des Servers in Sekunden */
 | 
			
		||||
#define FNAME_LEN 256			/* max. length of file name */
 | 
			
		||||
 | 
			
		||||
#define FNAME_LEN 256			/* max. Laenge eines Dateinamen */
 | 
			
		||||
#define LINE_LEN 256			/* max. length of a line in the configuration file */
 | 
			
		||||
 | 
			
		||||
#define LINE_LEN 256			/* max. Laenge einer Konfigurationszeile */
 | 
			
		||||
#define HOST_LEN 256			/* max. lenght of fully qualified host names */
 | 
			
		||||
 | 
			
		||||
#define HOST_LEN 256			/* max. Laenge eines Hostnamen */
 | 
			
		||||
#define MAX_LISTEN_PORTS 16		/* max. count of listening ports */
 | 
			
		||||
 | 
			
		||||
#define MAX_LISTEN_PORTS 16		/* max. Anzahl von Listen-Ports */
 | 
			
		||||
#define MAX_OPERATORS 16		/* max. count of configurable operators */
 | 
			
		||||
 | 
			
		||||
#define MAX_OPERATORS 16		/* max. Anzahl konfigurierbarer Operatoren */
 | 
			
		||||
#define MAX_SERVERS 16			/* max. count of configurable servers ("peers") */
 | 
			
		||||
 | 
			
		||||
#define MAX_SERVERS 16			/* max. Anzahl konfigurierbarer Server ("Peers") */
 | 
			
		||||
#define MAX_DEFCHANNELS 16		/* max. count of preconfigurable channels */
 | 
			
		||||
 | 
			
		||||
#define MAX_DEFCHANNELS 16		/* max. Anzahl vorkonfigurierbarerr Channels */
 | 
			
		||||
#define MAX_SERVICES 8			/* max. number of configurable services */
 | 
			
		||||
 | 
			
		||||
#define MAX_SERVICES 8			/* maximum number of configurable services */
 | 
			
		||||
#define MAX_WHOWAS 64			/* max. number of WHOWAS items */
 | 
			
		||||
#define DEFAULT_WHOWAS 5		/* default count for WHOWAS command */
 | 
			
		||||
 | 
			
		||||
#define CONNECTION_POOL 100		/* Anzahl Verbindungs-Strukturen, die blockweise alloziert werden */
 | 
			
		||||
#define CONNECTION_POOL 100		/* size of default connection pool */
 | 
			
		||||
 | 
			
		||||
#define CLIENT_ID_LEN 64		/* max. ID-Laenge; vgl. RFC 2812, 1.1 und 1.2.1 */
 | 
			
		||||
#define CLIENT_NICK_LEN 10		/* max. Nick-Laenge; vgl. RFC 2812, 1.2.1 */
 | 
			
		||||
#define CLIENT_PASS_LEN 9		/* max. Laenge des Passwortes */
 | 
			
		||||
#define CLIENT_USER_LEN 9		/* max. Laenge des Benutzernamen ("Login") */
 | 
			
		||||
#define CLIENT_NAME_LEN 32		/* max. Laenge des "langen Benutzernamen" */
 | 
			
		||||
#define CLIENT_HOST_LEN 64		/* max. Laenge des Hostname */
 | 
			
		||||
#define CLIENT_MODE_LEN 8		/* max. Laenge der Client-Modes */
 | 
			
		||||
#define CLIENT_INFO_LEN 64		/* max. Infotext-Laenge (Server) */
 | 
			
		||||
#define CLIENT_AWAY_LEN 128		/* max. Laenger der AWAY-Nachricht */
 | 
			
		||||
#define CLIENT_FLAGS_LEN 100		/* max. Laenger der Client-Flags */
 | 
			
		||||
#define CLIENT_ID_LEN 64		/* max. length of an IRC ID; see RFC 2812, 1.1 and 1.2.1 */
 | 
			
		||||
#define CLIENT_NICK_LEN 10		/* max. nick length; see. RFC 2812, 1.2.1 */
 | 
			
		||||
#define CLIENT_PASS_LEN 21		/* max. password length */
 | 
			
		||||
#define CLIENT_USER_LEN 10		/* Max. length of user name ("login")
 | 
			
		||||
 					   see RFC 2812, section 1.2.1 */
 | 
			
		||||
#define CLIENT_NAME_LEN 32		/* max. length of "real names" */
 | 
			
		||||
#define CLIENT_HOST_LEN 64		/* max. host name length */
 | 
			
		||||
#define CLIENT_MODE_LEN 8		/* max. lenth of all client modes */
 | 
			
		||||
#define CLIENT_INFO_LEN 64		/* max. length of server info texts */
 | 
			
		||||
#define CLIENT_AWAY_LEN 128		/* max. length of away messages */
 | 
			
		||||
#define CLIENT_FLAGS_LEN 100		/* max. length of client flags */
 | 
			
		||||
 | 
			
		||||
#define CHANNEL_NAME_LEN 51		/* max. Laenge eines Channel-Namens, vgl. RFC 2812, 1.3 */
 | 
			
		||||
#define CHANNEL_MODE_LEN 8		/* max. Laenge der Channel-Modes */
 | 
			
		||||
#define CHANNEL_TOPIC_LEN 128		/* max. Laenge eines Channel-Topics */
 | 
			
		||||
#define CHANNEL_NAME_LEN 51		/* max. length of a channel name, see. RFC 2812, 1.3 */
 | 
			
		||||
#define CHANNEL_MODE_LEN 9		/* max. length of channel modes */
 | 
			
		||||
#define CHANNEL_TOPIC_LEN 128		/* max. length of a channel topic */
 | 
			
		||||
 | 
			
		||||
#define COMMAND_LEN 513			/* max. Laenge eines Befehls, vgl. RFC 2812, 3.2 */
 | 
			
		||||
#define COMMAND_LEN 513			/* max. IRC command length, see. RFC 2812, 3.2 */
 | 
			
		||||
 | 
			
		||||
#define READBUFFER_LEN 2048		/* Laenge des Lesepuffers je Verbindung (Bytes) */
 | 
			
		||||
#define WRITEBUFFER_LEN 4096		/* Laenge des Schreibpuffers je Verbindung (Bytes) */
 | 
			
		||||
#define READBUFFER_LEN 2048		/* size of the read buffer of a connection (bytes) */
 | 
			
		||||
#define WRITEBUFFER_LEN 4096		/* size of the write buffer of a connection (bytes) */
 | 
			
		||||
 | 
			
		||||
#ifdef USE_ZLIB
 | 
			
		||||
#define ZREADBUFFER_LEN 1024		/* Laenge des Lesepuffers je Verbindung (Bytes) */
 | 
			
		||||
#define ZWRITEBUFFER_LEN 4096		/* Laenge des Schreibpuffers fuer Kompression (Bytes) */
 | 
			
		||||
#ifdef ZLIB
 | 
			
		||||
#define ZREADBUFFER_LEN 1024		/* compressed read buffer of a connection (bytes) */
 | 
			
		||||
#define ZWRITEBUFFER_LEN 4096		/* compressed write buffer of a connection (bytes) */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define PROTOVER "0210"			/* implementierte Protokoll-Version (RFC 2813, 4.1.1) */
 | 
			
		||||
#define PROTOIRC "-IRC"			/* Protokoll-Suffix (RFC 2813, 4.1.1) */
 | 
			
		||||
#define PROTOIRCPLUS "-IRC+"		/* Protokoll-Suffix f<EFBFBD>r IRC+-Protokoll */
 | 
			
		||||
#define PROTOVER "0210"			/* implemented IRC protocol version (see RFC 2813, 4.1.1) */
 | 
			
		||||
#define PROTOIRC "-IRC"			/* protocol suffix (see RFC 2813, 4.1.1) */
 | 
			
		||||
#define PROTOIRCPLUS "-IRC+"		/* protokol suffix for IRC+ protocol (see doc/Protocol.txt) */
 | 
			
		||||
 | 
			
		||||
#ifdef IRCPLUS
 | 
			
		||||
# define IRCPLUSFLAGS "C"		/* IRC+-Flags, die immer zutreffen */
 | 
			
		||||
# define IRCPLUSFLAGS "CL"		/* standard IRC+ flags */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define STARTUP_DELAY 1			/* Erst n Sek. nach Start zu anderen Servern verbinden */
 | 
			
		||||
#define RECONNECT_DELAY 3		/* Server-Links erst nach 3 Sekunden versuchen, wieder aufzubauen */
 | 
			
		||||
#define STARTUP_DELAY 1			/* delay outgoing connections n seconds after startup */
 | 
			
		||||
#define RECONNECT_DELAY 3		/* time to delay re-connect attempts (seconds) */
 | 
			
		||||
 | 
			
		||||
#define USERMODES "aios"		/* unterstuetzte User-Modes */
 | 
			
		||||
#define CHANMODES "biklImnoPtv"		/* unterstuetzte Channel-Modes */
 | 
			
		||||
#define USERMODES "aios"		/* supported user modes */
 | 
			
		||||
#define CHANMODES "biklImnoPstv"	/* supported channel modes */
 | 
			
		||||
 | 
			
		||||
#define CONNECTED TRUE			/* fuer die irc-xxx-Module */
 | 
			
		||||
#define DISCONNECTED FALSE
 | 
			
		||||
#define CONNECTED true			/* internal status codes */
 | 
			
		||||
#define DISCONNECTED false
 | 
			
		||||
 | 
			
		||||
#define DEFAULT_AWAY_MSG "Away"		/* Away-Meldung fuer User von anderen Servern */
 | 
			
		||||
#define DEFAULT_AWAY_MSG "Away"		/* away message for users connected to linked servers */
 | 
			
		||||
 | 
			
		||||
#define CONFIG_FILE "/ngircd.conf"
 | 
			
		||||
#define MOTD_FILE "/ngircd.motd"
 | 
			
		||||
#define MOTD_PHRASE ""
 | 
			
		||||
#define CHROOT_DIR ""
 | 
			
		||||
#define PID_FILE ""
 | 
			
		||||
 | 
			
		||||
#define ERROR_DIR "/tmp"
 | 
			
		||||
 | 
			
		||||
#define MAX_LOG_MSG_LEN 256		/* max. Laenge einer Log-Meldung */
 | 
			
		||||
#define MAX_LOG_MSG_LEN 256		/* max. length of a log message */
 | 
			
		||||
 | 
			
		||||
#define TOKEN_OUTBOUND -2		/* Kennzeichnung fuer ausgehende Server-Links im Aufbau */
 | 
			
		||||
#define TOKEN_OUTBOUND -2		/* tag for outbound server links */
 | 
			
		||||
 | 
			
		||||
#define NOTICE_TXTPREFIX ""		/* Kennzeichnung fuer Server-NOTICEs an User */
 | 
			
		||||
#define NOTICE_TXTPREFIX ""		/* prefix for NOTICEs from the server to users */
 | 
			
		||||
 | 
			
		||||
#define CUT_TXTSUFFIX "[CUT]"		/* Suffix for oversized messages that
 | 
			
		||||
					   have been shortened and cut off. */
 | 
			
		||||
#ifdef RENDEZVOUS
 | 
			
		||||
#define RENDEZVOUS_TYPE "_ircu._tcp."	/* Service type to register with Rendezvous */
 | 
			
		||||
#define RENDEZVOUS_TYPE "_ircu._tcp."	/* service type to register with Rendezvous */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -14,14 +14,13 @@
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: hash.c,v 1.9 2002/12/26 16:25:43 alex Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: hash.c,v 1.11 2005/03/19 18:43:48 fw Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "tool.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
@@ -32,11 +31,11 @@ LOCAL UINT32 jenkins_hash PARAMS(( register UINT8 *k, register UINT32 length, re
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL UINT32
 | 
			
		||||
Hash( CHAR *String )
 | 
			
		||||
Hash( char *String )
 | 
			
		||||
{
 | 
			
		||||
	/* Hash-Wert ueber String berechnen */
 | 
			
		||||
 | 
			
		||||
	CHAR buffer[LINE_LEN];
 | 
			
		||||
	char buffer[LINE_LEN];
 | 
			
		||||
 | 
			
		||||
	strlcpy( buffer, String, sizeof( buffer ));
 | 
			
		||||
	return jenkins_hash( (UINT8 *)ngt_LowerStr( buffer ), strlen( buffer ), 42 );
 | 
			
		||||
@@ -100,7 +99,7 @@ jenkins_hash( register UINT8 *k, register UINT32 length, register UINT32 initval
 | 
			
		||||
 | 
			
		||||
	/* handle the last 11 bytes */
 | 
			
		||||
	c += length;
 | 
			
		||||
	switch( (INT)len )	/* all the case statements fall through */
 | 
			
		||||
	switch( (int)len )	/* all the case statements fall through */
 | 
			
		||||
	{
 | 
			
		||||
		case 11: c+=((UINT32)k[10]<<24);
 | 
			
		||||
		case 10: c+=((UINT32)k[9]<<16);
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: hash.h,v 1.4 2002/12/12 12:23:43 alex Exp $
 | 
			
		||||
 * $Id: hash.h,v 1.5 2005/03/19 18:43:48 fw Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * Hash calculation (header)
 | 
			
		||||
 */
 | 
			
		||||
@@ -18,7 +18,7 @@
 | 
			
		||||
#define __hash_h__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL UINT32 Hash PARAMS((CHAR *String ));
 | 
			
		||||
GLOBAL UINT32 Hash PARAMS((char *String ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: irc-channel.c,v 1.25 2003/01/08 22:04:05 alex Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: irc-channel.c,v 1.30.2.2 2006/03/16 20:14:46 fw Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
@@ -40,11 +40,11 @@ static char UNUSED id[] = "$Id: irc-channel.c,v 1.25 2003/01/08 22:04:05 alex Ex
 | 
			
		||||
#include "irc-channel.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_JOIN( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CHAR *channame, *key, *flags, *topic, modes[8];
 | 
			
		||||
	BOOLEAN is_new_chan, is_invited, is_banned;
 | 
			
		||||
	char *channame, *key, *flags, *topic, modes[8];
 | 
			
		||||
	bool is_new_chan, is_invited, is_banned;
 | 
			
		||||
	CLIENT *target;
 | 
			
		||||
	CHANNEL *chan;
 | 
			
		||||
 | 
			
		||||
@@ -68,11 +68,11 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	channame = strtok( Req->argv[0], "," );
 | 
			
		||||
	while( channame )
 | 
			
		||||
	{
 | 
			
		||||
		chan = flags = NULL;
 | 
			
		||||
		chan = NULL; flags = NULL;
 | 
			
		||||
 | 
			
		||||
		/* wird der Channel neu angelegt? */
 | 
			
		||||
		if( Channel_Search( channame )) is_new_chan = FALSE;
 | 
			
		||||
		else is_new_chan = TRUE;
 | 
			
		||||
		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 )
 | 
			
		||||
@@ -86,18 +86,13 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Lokaler Client? */
 | 
			
		||||
		/* Local client? */
 | 
			
		||||
		if( Client_Type( Client ) == CLIENT_USER )
 | 
			
		||||
		{
 | 
			
		||||
			/* Test if the user has reached his maximum channel count */
 | 
			
		||||
			if( Client_Type( Client ) == CLIENT_USER )
 | 
			
		||||
			{
 | 
			
		||||
				if(( Conf_MaxJoins > 0 ) && ( Channel_CountForUser( Client ) >= Conf_MaxJoins ))
 | 
			
		||||
				{
 | 
			
		||||
					IRC_WriteStrClient( Client, ERR_TOOMANYCHANNELS_MSG, Client_ID( Client ), channame );
 | 
			
		||||
					return CONNECTED;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if(( Conf_MaxJoins > 0 ) && ( Channel_CountForUser( Client ) >= Conf_MaxJoins ))
 | 
			
		||||
				return IRC_WriteStrClient( Client, ERR_TOOMANYCHANNELS_MSG,
 | 
			
		||||
							Client_ID( Client ), channame );
 | 
			
		||||
 | 
			
		||||
			/* Existiert der Channel bereits, oder wird er im Moment neu erzeugt? */
 | 
			
		||||
			if( is_new_chan )
 | 
			
		||||
@@ -115,7 +110,7 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
				is_invited = Lists_CheckInvited( target, chan );
 | 
			
		||||
 | 
			
		||||
				/* Testen, ob Client gebanned ist */
 | 
			
		||||
				if(( is_banned == TRUE ) &&  ( is_invited == FALSE ))
 | 
			
		||||
				if(( is_banned == true) &&  ( is_invited == false ))
 | 
			
		||||
				{
 | 
			
		||||
					/* Client ist gebanned (und nicht invited): */
 | 
			
		||||
					IRC_WriteStrClient( Client, ERR_BANNEDFROMCHAN_MSG, Client_ID( Client ), channame );
 | 
			
		||||
@@ -126,7 +121,7 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				/* Ist der Channel "invite-only"? */
 | 
			
		||||
				if(( strchr( Channel_Modes( chan ), 'i' )) && ( is_invited == FALSE ))
 | 
			
		||||
				if(( strchr( Channel_Modes( chan ), 'i' )) && ( is_invited == false ))
 | 
			
		||||
				{
 | 
			
		||||
					/* Channel ist "invite-only" und Client wurde nicht invited: */
 | 
			
		||||
					IRC_WriteStrClient( Client, ERR_INVITEONLYCHAN_MSG, Client_ID( Client ), channame );
 | 
			
		||||
@@ -159,6 +154,16 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			/* Remote server: we don't need to know whether the
 | 
			
		||||
			 * client is invited or not, but we have to make sure
 | 
			
		||||
			 * that the "one shot" entries (generated by INVITE
 | 
			
		||||
			 * commands) in this list become deleted when a user
 | 
			
		||||
			 * joins a channel this way. */
 | 
			
		||||
			chan = Channel_Search( channame );
 | 
			
		||||
			if( chan != NULL ) (void)Lists_CheckInvited( target, chan );
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Channel joinen (und ggf. anlegen) */
 | 
			
		||||
		if( ! Channel_Join( target, channame ))
 | 
			
		||||
@@ -189,11 +194,11 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
		IRC_WriteStrServersPrefix( Client, target, "JOIN :%s%s", channame, modes );
 | 
			
		||||
 | 
			
		||||
		/* im Channel bekannt machen */
 | 
			
		||||
		IRC_WriteStrChannelPrefix( Client, chan, target, FALSE, "JOIN :%s", channame );
 | 
			
		||||
		IRC_WriteStrChannelPrefix( Client, chan, target, false, "JOIN :%s", channame );
 | 
			
		||||
		if( modes[1] )
 | 
			
		||||
		{
 | 
			
		||||
			/* Modes im Channel bekannt machen */
 | 
			
		||||
			IRC_WriteStrChannelPrefix( Client, chan, target, FALSE, "MODE %s +%s %s", channame, &modes[1], Client_ID( target ));
 | 
			
		||||
			IRC_WriteStrChannelPrefix( Client, chan, target, false, "MODE %s +%s %s", channame, &modes[1], Client_ID( target ));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if( Client_Type( Client ) == CLIENT_USER )
 | 
			
		||||
@@ -217,11 +222,11 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
} /* IRC_JOIN */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_PART( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *target;
 | 
			
		||||
	CHAR *chan;
 | 
			
		||||
	char *chan;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
@@ -252,12 +257,12 @@ IRC_PART( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
} /* IRC_PART */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_TOPIC( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CHANNEL *chan;
 | 
			
		||||
	CLIENT *from;
 | 
			
		||||
	CHAR *topic;
 | 
			
		||||
	char *topic;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
@@ -296,78 +301,107 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
 | 
			
		||||
	/* im Channel bekannt machen und an Server weiterleiten */
 | 
			
		||||
	IRC_WriteStrServersPrefix( Client, from, "TOPIC %s :%s", Req->argv[0], Req->argv[1] );
 | 
			
		||||
	IRC_WriteStrChannelPrefix( Client, chan, from, FALSE, "TOPIC %s :%s", Req->argv[0], Req->argv[1] );
 | 
			
		||||
	IRC_WriteStrChannelPrefix( Client, chan, from, false, "TOPIC %s :%s", Req->argv[0], Req->argv[1] );
 | 
			
		||||
 | 
			
		||||
	if( Client_Type( Client ) == CLIENT_USER ) return IRC_WriteStrClientPrefix( Client, Client, "TOPIC %s :%s", Req->argv[0], Req->argv[1] );
 | 
			
		||||
	else return CONNECTED;
 | 
			
		||||
} /* IRC_TOPIC */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
/**
 | 
			
		||||
 * Handler for the IRC "LIST" command.
 | 
			
		||||
 * This implementation handles the local case as well as the forwarding of the
 | 
			
		||||
 * LIST command to other servers in the IRC network.
 | 
			
		||||
 */
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_LIST( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CHAR *pattern;
 | 
			
		||||
	char *pattern;
 | 
			
		||||
	CHANNEL *chan;
 | 
			
		||||
	CLIENT *from, *target;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
 | 
			
		||||
	/* Falsche Anzahl Parameter? */
 | 
			
		||||
	if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
	/* Bad number of prameters? */
 | 
			
		||||
	if( Req->argc > 2 )
 | 
			
		||||
		return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
			Client_ID( Client ), Req->command );
 | 
			
		||||
 | 
			
		||||
	if( Req->argc > 0 ) pattern = strtok( Req->argv[0], "," );
 | 
			
		||||
	else pattern = "*";
 | 
			
		||||
	if( Req->argc > 0 )
 | 
			
		||||
		pattern = strtok( Req->argv[0], "," );
 | 
			
		||||
	else
 | 
			
		||||
		pattern = "*";
 | 
			
		||||
 | 
			
		||||
	/* From aus Prefix ermitteln */
 | 
			
		||||
	if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
 | 
			
		||||
	else from = Client;
 | 
			
		||||
	if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix );
 | 
			
		||||
	/* Get sender from prefix, if any */
 | 
			
		||||
	if( Client_Type( Client ) == CLIENT_SERVER )
 | 
			
		||||
		from = Client_Search( Req->prefix );
 | 
			
		||||
	else
 | 
			
		||||
		from = Client;
 | 
			
		||||
 | 
			
		||||
	if( ! from )
 | 
			
		||||
		return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG,
 | 
			
		||||
				Client_ID( Client ), Req->prefix );
 | 
			
		||||
 | 
			
		||||
	if( Req->argc == 2 )
 | 
			
		||||
	{
 | 
			
		||||
		/* an anderen Server forwarden */
 | 
			
		||||
		/* Forward to other server? */
 | 
			
		||||
		target = Client_Search( Req->argv[1] );
 | 
			
		||||
		if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER )) return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] );
 | 
			
		||||
		if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER ))
 | 
			
		||||
			return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG,
 | 
			
		||||
					Client_ID( Client ), Req->argv[1] );
 | 
			
		||||
 | 
			
		||||
		if( target != Client_ThisServer( ))
 | 
			
		||||
		{
 | 
			
		||||
			/* Ok, anderer Server ist das Ziel: forwarden */
 | 
			
		||||
			return IRC_WriteStrClientPrefix( target, from, "LIST %s :%s", from, Req->argv[1] );
 | 
			
		||||
			/* Target is indeed an other server, forward it! */
 | 
			
		||||
			return IRC_WriteStrClientPrefix( target, from,
 | 
			
		||||
					"LIST %s :%s", Client_ID( from ),
 | 
			
		||||
					Req->argv[1] );
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	while( pattern )
 | 
			
		||||
	{
 | 
			
		||||
		/* alle Channel durchgehen */
 | 
			
		||||
		/* Loop through all the channels */
 | 
			
		||||
		chan = Channel_First( );
 | 
			
		||||
		while( chan )
 | 
			
		||||
		{
 | 
			
		||||
			/* Passt die Suchmaske auf diesen Channel? */
 | 
			
		||||
			/* Check search pattern */
 | 
			
		||||
			if( Match( pattern, Channel_Name( chan )))
 | 
			
		||||
			{
 | 
			
		||||
				/* Treffer! */
 | 
			
		||||
				if( ! IRC_WriteStrClient( from, RPL_LIST_MSG, from, Channel_Name( chan ), Channel_MemberCount( chan ), Channel_Topic( chan ))) return DISCONNECTED;
 | 
			
		||||
				/* Gotcha! */
 | 
			
		||||
				if( ! strchr( Channel_Modes( chan ), 's' ) ||
 | 
			
		||||
				    Channel_IsMemberOf( chan, from ))
 | 
			
		||||
				{
 | 
			
		||||
					if( ! IRC_WriteStrClient( from,
 | 
			
		||||
					    RPL_LIST_MSG, Client_ID( from ),
 | 
			
		||||
					    Channel_Name( chan ),
 | 
			
		||||
					    Channel_MemberCount( chan ),
 | 
			
		||||
					    Channel_Topic( chan )))
 | 
			
		||||
						return DISCONNECTED;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			chan = Channel_Next( chan );
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		/* naechsten Namen ermitteln */
 | 
			
		||||
		if( Req->argc > 0 ) pattern = strtok( NULL, "," );
 | 
			
		||||
		else pattern = NULL;
 | 
			
		||||
		/* Get next name ... */
 | 
			
		||||
		if( Req->argc > 0 )
 | 
			
		||||
			pattern = strtok( NULL, "," );
 | 
			
		||||
		else
 | 
			
		||||
			pattern = NULL;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	return IRC_WriteStrClient( from, RPL_LISTEND_MSG, from );
 | 
			
		||||
	return IRC_WriteStrClient( from, RPL_LISTEND_MSG, Client_ID( from ));
 | 
			
		||||
} /* IRC_LIST */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_CHANINFO( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CHAR modes_add[COMMAND_LEN], l[16], *ptr;
 | 
			
		||||
	char modes_add[COMMAND_LEN], l[16], *ptr;
 | 
			
		||||
	CLIENT *from;
 | 
			
		||||
	CHANNEL *chan;
 | 
			
		||||
	INT arg_topic;
 | 
			
		||||
	int arg_topic;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
@@ -427,7 +461,7 @@ IRC_CHANINFO( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			/* Inform members of this channel */
 | 
			
		||||
			IRC_WriteStrChannelPrefix( Client, chan, from, FALSE, "MODE %s +%s%s", Req->argv[0], Channel_Modes( chan ), modes_add );
 | 
			
		||||
			IRC_WriteStrChannelPrefix( Client, chan, from, false, "MODE %s +%s%s", Req->argv[0], Channel_Modes( chan ), modes_add );
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	else Log( LOG_WARNING, "CHANINFO: invalid MODE format ignored!" );
 | 
			
		||||
@@ -440,7 +474,7 @@ IRC_CHANINFO( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
		{
 | 
			
		||||
			/* OK, there is no topic jet */
 | 
			
		||||
			Channel_SetTopic( chan, Req->argv[arg_topic] );
 | 
			
		||||
			IRC_WriteStrChannelPrefix( Client, chan, from, FALSE, "TOPIC %s :%s", Req->argv[0], Channel_Topic( chan ));
 | 
			
		||||
			IRC_WriteStrChannelPrefix( Client, chan, from, false, "TOPIC %s :%s", Req->argv[0], Channel_Topic( chan ));
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: irc-channel.h,v 1.6 2002/12/12 12:23:43 alex Exp $
 | 
			
		||||
 * $Id: irc-channel.h,v 1.7 2005/03/19 18:43:48 fw Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * IRC channel commands (header)
 | 
			
		||||
 */
 | 
			
		||||
@@ -18,13 +18,13 @@
 | 
			
		||||
#define __irc_channel_h__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN IRC_JOIN PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_PART PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_TOPIC PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_JOIN PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_PART PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_TOPIC PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN IRC_LIST PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_LIST PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN IRC_CHANINFO PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_CHANINFO PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 * Copyright (c)2001-2005 Alexander Barton (alex@barton.de)
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
@@ -14,15 +14,18 @@
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: irc-info.c,v 1.16 2003/04/21 10:54:30 alex Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: irc-info.c,v 1.30 2005/06/17 19:15:43 fw Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <strings.h>
 | 
			
		||||
 | 
			
		||||
#include "ngircd.h"
 | 
			
		||||
#include "cvs-version.h"
 | 
			
		||||
#include "conn-func.h"
 | 
			
		||||
#include "conn-zip.h"
 | 
			
		||||
#include "client.h"
 | 
			
		||||
@@ -40,7 +43,7 @@ static char UNUSED id[] = "$Id: irc-info.c,v 1.16 2003/04/21 10:54:30 alex Exp $
 | 
			
		||||
#include "irc-info.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_ADMIN(CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *target, *prefix;
 | 
			
		||||
@@ -76,17 +79,18 @@ IRC_ADMIN(CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	if( ! IRC_WriteStrClient( Client, RPL_ADMINLOC2_MSG, Client_ID( prefix ), Conf_ServerAdmin2 )) return DISCONNECTED;
 | 
			
		||||
	if( ! IRC_WriteStrClient( Client, RPL_ADMINEMAIL_MSG, Client_ID( prefix ), Conf_ServerAdminMail )) return DISCONNECTED;
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty( Client, 1 );
 | 
			
		||||
	return CONNECTED;
 | 
			
		||||
} /* IRC_ADMIN */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_ISON( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CHAR rpl[COMMAND_LEN];
 | 
			
		||||
	char rpl[COMMAND_LEN];
 | 
			
		||||
	CLIENT *c;
 | 
			
		||||
	CHAR *ptr;
 | 
			
		||||
	INT i;
 | 
			
		||||
	char *ptr;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
@@ -94,7 +98,7 @@ IRC_ISON( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	/* Falsche Anzahl Parameter? */
 | 
			
		||||
	if(( Req->argc < 1 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
 | 
			
		||||
	strcpy( rpl, RPL_ISON_MSG );
 | 
			
		||||
	strlcpy( rpl, RPL_ISON_MSG, sizeof rpl );
 | 
			
		||||
	for( i = 0; i < Req->argc; i++ )
 | 
			
		||||
	{
 | 
			
		||||
		ptr = strtok( Req->argv[i], " " );
 | 
			
		||||
@@ -111,17 +115,17 @@ IRC_ISON( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
			ptr = strtok( NULL, " " );
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0';
 | 
			
		||||
	ngt_TrimLastChr(rpl, ' ');
 | 
			
		||||
 | 
			
		||||
	return IRC_WriteStrClient( Client, rpl, Client_ID( Client ) );
 | 
			
		||||
} /* IRC_ISON */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_LINKS( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *target, *from, *c;
 | 
			
		||||
	CHAR *mask;
 | 
			
		||||
	char *mask;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
@@ -160,12 +164,13 @@ IRC_LINKS( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
		}
 | 
			
		||||
		c = Client_Next( c );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	IRC_SetPenalty( target, 1 );
 | 
			
		||||
	return IRC_WriteStrClient( target, RPL_ENDOFLINKS_MSG, Client_ID( target ), mask );
 | 
			
		||||
} /* IRC_LINKS */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_LUSERS( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *target, *from;
 | 
			
		||||
@@ -196,11 +201,12 @@ IRC_LUSERS( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
 | 
			
		||||
	IRC_Send_LUSERS( target );
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty( target, 1 );
 | 
			
		||||
	return CONNECTED;
 | 
			
		||||
} /* IRC_LUSERS */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_MOTD( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *from, *target;
 | 
			
		||||
@@ -229,14 +235,15 @@ IRC_MOTD( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty( from, 3 );
 | 
			
		||||
	return IRC_Show_MOTD( from );
 | 
			
		||||
} /* IRC_MOTD */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_NAMES( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CHAR rpl[COMMAND_LEN], *ptr;
 | 
			
		||||
	char rpl[COMMAND_LEN], *ptr;
 | 
			
		||||
	CLIENT *target, *from, *c;
 | 
			
		||||
	CHANNEL *chan;
 | 
			
		||||
 | 
			
		||||
@@ -323,16 +330,17 @@ IRC_NAMES( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
		if( ! IRC_WriteStrClient( from, "%s", rpl )) return DISCONNECTED;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty( from, 1 );
 | 
			
		||||
	return IRC_WriteStrClient( from, RPL_ENDOFNAMES_MSG, Client_ID( from ), "*" );
 | 
			
		||||
} /* IRC_NAMES */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_STATS( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *from, *target, *cl;
 | 
			
		||||
	CONN_ID con;
 | 
			
		||||
	CHAR query;
 | 
			
		||||
	char query;
 | 
			
		||||
	COMMAND *cmd;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
@@ -373,15 +381,15 @@ IRC_STATS( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
				if( cl && (( Client_Type( cl ) == CLIENT_SERVER ) || ( cl == Client )))
 | 
			
		||||
				{
 | 
			
		||||
					/* Server link or our own connection */
 | 
			
		||||
#ifdef USE_ZLIB
 | 
			
		||||
#ifdef ZLIB
 | 
			
		||||
					if( Conn_Options( con ) & CONN_ZIP )
 | 
			
		||||
					{
 | 
			
		||||
						if( ! IRC_WriteStrClient( from, RPL_STATSLINKINFOZIP_MSG, Client_ID( from ), Client_Mask( cl ), Conn_SendQ( con ), Conn_SendMsg( con ), Zip_SendBytes( con ), Conn_SendBytes( con ), Conn_RecvMsg( con ), Zip_RecvBytes( con ), Conn_RecvBytes( con ), (LONG)( time( NULL ) - Conn_StartTime( con )))) return DISCONNECTED;
 | 
			
		||||
						if( ! 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;
 | 
			
		||||
					}
 | 
			
		||||
					else
 | 
			
		||||
#endif
 | 
			
		||||
					{
 | 
			
		||||
						if( ! IRC_WriteStrClient( from, RPL_STATSLINKINFO_MSG, Client_ID( from ), Client_Mask( cl ), Conn_SendQ( con ), Conn_SendMsg( con ), Conn_SendBytes( con ), Conn_RecvMsg( con ), Conn_RecvBytes( con ), (LONG)( time( NULL ) - Conn_StartTime( con )))) return DISCONNECTED;
 | 
			
		||||
						if( ! IRC_WriteStrClient( from, RPL_STATSLINKINFO_MSG, Client_ID( from ), Client_Mask( cl ), Conn_SendQ( con ), Conn_SendMsg( con ), Conn_SendBytes( con ), Conn_RecvMsg( con ), Conn_RecvBytes( con ), (long)( time( NULL ) - Conn_StartTime( con )))) return DISCONNECTED;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				con = Conn_Next( con );
 | 
			
		||||
@@ -401,15 +409,16 @@ IRC_STATS( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty( from, 2 );
 | 
			
		||||
	return IRC_WriteStrClient( from, RPL_ENDOFSTATS_MSG, Client_ID( from ), query );
 | 
			
		||||
} /* IRC_STATS */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_TIME( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *from, *target;
 | 
			
		||||
	CHAR t_str[64];
 | 
			
		||||
	char t_str[64];
 | 
			
		||||
	time_t t;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
@@ -437,17 +446,17 @@ IRC_TIME( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	t = time( NULL );
 | 
			
		||||
	(VOID)strftime( t_str, 60, "%A %B %d %Y -- %H:%M %Z", localtime( &t ));
 | 
			
		||||
	(void)strftime( t_str, 60, "%A %B %d %Y -- %H:%M %Z", localtime( &t ));
 | 
			
		||||
	return IRC_WriteStrClient( from, RPL_TIME_MSG, Client_ID( from ), Client_ID( Client_ThisServer( )), t_str );
 | 
			
		||||
} /* IRC_TIME */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_USERHOST( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CHAR rpl[COMMAND_LEN];
 | 
			
		||||
	char rpl[COMMAND_LEN];
 | 
			
		||||
	CLIENT *c;
 | 
			
		||||
	INT max, i;
 | 
			
		||||
	int max, i;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
@@ -458,7 +467,7 @@ IRC_USERHOST( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	if( Req->argc > 5 ) max = 5;
 | 
			
		||||
	else max = Req->argc;
 | 
			
		||||
 | 
			
		||||
	strcpy( rpl, RPL_USERHOST_MSG );
 | 
			
		||||
	strlcpy( rpl, RPL_USERHOST_MSG, sizeof rpl );
 | 
			
		||||
	for( i = 0; i < max; i++ )
 | 
			
		||||
	{
 | 
			
		||||
		c = Client_Search( Req->argv[i] );
 | 
			
		||||
@@ -476,16 +485,19 @@ IRC_USERHOST( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
			strlcat( rpl, " ", sizeof( rpl ));
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0';
 | 
			
		||||
	ngt_TrimLastChr( rpl, ' ');
 | 
			
		||||
 | 
			
		||||
	return IRC_WriteStrClient( Client, rpl, Client_ID( Client ) );
 | 
			
		||||
} /* IRC_USERHOST */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_VERSION( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *target, *prefix;
 | 
			
		||||
#ifdef CVSDATE
 | 
			
		||||
	char ver[12], vertxt[30];
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
@@ -513,17 +525,26 @@ IRC_VERSION( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* mit Versionsinfo antworten */
 | 
			
		||||
	return IRC_WriteStrClient( Client, RPL_VERSION_MSG, Client_ID( prefix ), PACKAGE_NAME, PACKAGE_VERSION, NGIRCd_DebugLevel, Conf_ServerName, NGIRCd_VersionAddition( ));
 | 
			
		||||
	IRC_SetPenalty( Client, 1 );
 | 
			
		||||
#ifdef CVSDATE
 | 
			
		||||
	strlcpy( ver, CVSDATE, sizeof( ver ));
 | 
			
		||||
	strncpy( ver + 4, ver + 5, 2 );
 | 
			
		||||
	strncpy( ver + 6, ver + 8, 3 );
 | 
			
		||||
	snprintf( vertxt, sizeof( vertxt ), "%s(%s)", PACKAGE_VERSION, ver );
 | 
			
		||||
	return IRC_WriteStrClient( Client, RPL_VERSION_MSG, Client_ID( prefix ), PACKAGE_NAME, vertxt, NGIRCd_DebugLevel, Conf_ServerName, NGIRCd_VersionAddition );
 | 
			
		||||
#else
 | 
			
		||||
	return IRC_WriteStrClient( Client, RPL_VERSION_MSG, Client_ID( prefix ), PACKAGE_NAME, PACKAGE_VERSION, NGIRCd_DebugLevel, Conf_ServerName, NGIRCd_VersionAddition );
 | 
			
		||||
#endif
 | 
			
		||||
} /* IRC_VERSION */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_WHO( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	BOOLEAN ok, only_ops;
 | 
			
		||||
	CHAR flags[8], *ptr;
 | 
			
		||||
	bool ok, only_ops;
 | 
			
		||||
	char flags[8], *ptr;
 | 
			
		||||
	CL2CHAN *cl2chan;
 | 
			
		||||
	CHANNEL *chan;
 | 
			
		||||
	CHANNEL *chan, *cn;
 | 
			
		||||
	CLIENT *c;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
@@ -532,13 +553,13 @@ IRC_WHO( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	/* Falsche Anzahl Parameter? */
 | 
			
		||||
	if(( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
 | 
			
		||||
	only_ops = FALSE;
 | 
			
		||||
	only_ops = false;
 | 
			
		||||
	chan = NULL;
 | 
			
		||||
 | 
			
		||||
	if( Req->argc == 2 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Nur OPs anzeigen? */
 | 
			
		||||
		if( strcmp( Req->argv[1], "o" ) == 0 ) only_ops = TRUE;
 | 
			
		||||
		if( strcmp( Req->argv[1], "o" ) == 0 ) only_ops = true;
 | 
			
		||||
#ifdef STRICT_RFC
 | 
			
		||||
		else return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
#endif
 | 
			
		||||
@@ -561,24 +582,35 @@ IRC_WHO( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	{
 | 
			
		||||
		if(( Client_Type( c ) == CLIENT_USER ) && ( ! strchr( Client_Modes( c ), 'i' )))
 | 
			
		||||
		{
 | 
			
		||||
			ok = FALSE;
 | 
			
		||||
			if( Req->argc == 0 ) ok = TRUE;
 | 
			
		||||
			ok = false;
 | 
			
		||||
			if( Req->argc == 0 ) ok = true;
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				if( strcasecmp( Req->argv[0], Client_ID( c )) == 0 ) ok = TRUE;
 | 
			
		||||
				else if( strcmp( Req->argv[0], "0" ) == 0 ) ok = TRUE;
 | 
			
		||||
				if( strcasecmp( Req->argv[0], Client_ID( c )) == 0 ) ok = true;
 | 
			
		||||
				else if( strcmp( Req->argv[0], "0" ) == 0 ) ok = true;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if( ok && (( ! only_ops ) || ( strchr( Client_Modes( c ), 'o' ))))
 | 
			
		||||
			{
 | 
			
		||||
				/* Flags zusammenbasteln */
 | 
			
		||||
				/* Get flags */
 | 
			
		||||
				strcpy( flags, "H" );
 | 
			
		||||
				if( strchr( Client_Modes( c ), 'o' )) strlcat( flags, "*", sizeof( flags ));
 | 
			
		||||
 | 
			
		||||
				/* ausgeben */
 | 
			
		||||
				/* Search suitable channel */
 | 
			
		||||
				cl2chan = Channel_FirstChannelOf( c );
 | 
			
		||||
				if( cl2chan ) ptr = Channel_Name( Channel_GetChannel( cl2chan ));
 | 
			
		||||
				else ptr = "*";
 | 
			
		||||
				while( cl2chan )
 | 
			
		||||
				{
 | 
			
		||||
					cn = Channel_GetChannel( cl2chan );
 | 
			
		||||
					if( Channel_IsMemberOf( cn, Client ) ||
 | 
			
		||||
					    ! strchr( Channel_Modes( cn ), 's' ))
 | 
			
		||||
					{
 | 
			
		||||
						ptr = Channel_Name( cn );
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
					cl2chan = Channel_NextChannelOf( c, cl2chan );
 | 
			
		||||
				}
 | 
			
		||||
				if( ! cl2chan ) ptr = "*";
 | 
			
		||||
 | 
			
		||||
				if( ! IRC_WriteStrClient( Client, RPL_WHOREPLY_MSG, Client_ID( Client ), ptr, Client_User( c ), Client_Hostname( c ), Client_ID( Client_Introducer( c )), Client_ID( c ), flags, Client_Hops( c ), Client_Info( c ))) return DISCONNECTED;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
@@ -593,11 +625,11 @@ IRC_WHO( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
} /* IRC_WHO */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_WHOIS( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *from, *target, *c;
 | 
			
		||||
	CHAR str[LINE_LEN + 1];
 | 
			
		||||
	char str[LINE_LEN + 1];
 | 
			
		||||
	CL2CHAN *cl2chan;
 | 
			
		||||
	CHANNEL *chan;
 | 
			
		||||
 | 
			
		||||
@@ -643,6 +675,12 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
		chan = Channel_GetChannel( cl2chan );
 | 
			
		||||
		assert( chan != NULL );
 | 
			
		||||
 | 
			
		||||
		/* next */
 | 
			
		||||
		cl2chan = Channel_NextChannelOf( c, cl2chan );
 | 
			
		||||
 | 
			
		||||
		/* Secret channel? */
 | 
			
		||||
		if( strchr( Channel_Modes( chan ), 's' ) && ! Channel_IsMemberOf( chan, Client )) continue;
 | 
			
		||||
 | 
			
		||||
		/* Concatenate channel names */
 | 
			
		||||
		if( str[strlen( str ) - 1] != ':' ) strlcat( str, " ", sizeof( str ));
 | 
			
		||||
		if( strchr( Channel_UserModes( chan, c ), 'o' )) strlcat( str, "@", sizeof( str ));
 | 
			
		||||
@@ -655,9 +693,6 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
			if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
 | 
			
		||||
			snprintf( str, sizeof( str ), RPL_WHOISCHANNELS_MSG, Client_ID( from ), Client_ID( c ));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* next */
 | 
			
		||||
		cl2chan = Channel_NextChannelOf( c, cl2chan );
 | 
			
		||||
	}
 | 
			
		||||
	if( str[strlen( str ) - 1] != ':')
 | 
			
		||||
	{
 | 
			
		||||
@@ -688,25 +723,116 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
} /* IRC_WHOIS */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
/**
 | 
			
		||||
 * IRC "WHOWAS" function.
 | 
			
		||||
 * This function implements the IRC command "WHOWHAS". It handles local
 | 
			
		||||
 * requests and request that should be forwarded to other servers.
 | 
			
		||||
 */
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_WHOWAS( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *target, *prefix;
 | 
			
		||||
	WHOWAS *whowas;
 | 
			
		||||
	int max, last, count, i;
 | 
			
		||||
	char t_str[60];
 | 
			
		||||
	
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
 | 
			
		||||
	/* Falsche Anzahl Parameter? */
 | 
			
		||||
	if(( Req->argc < 1 ) || ( Req->argc > 3 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
	/* Wrong number of parameters? */
 | 
			
		||||
	if(( Req->argc < 1 ) || ( Req->argc > 3 ))
 | 
			
		||||
		return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
					   Client_ID( Client ), Req->command );
 | 
			
		||||
 | 
			
		||||
	/* ... */
 | 
			
		||||
	/* Search taget */
 | 
			
		||||
	if( Req->argc == 3 )
 | 
			
		||||
		target = Client_Search( Req->argv[2] );
 | 
			
		||||
	else
 | 
			
		||||
		target = Client_ThisServer( );
 | 
			
		||||
 | 
			
		||||
	return CONNECTED;
 | 
			
		||||
	/* Get prefix */
 | 
			
		||||
	if( Client_Type( Client ) == CLIENT_SERVER )
 | 
			
		||||
		prefix = Client_Search( Req->prefix );
 | 
			
		||||
	else
 | 
			
		||||
		prefix = Client;
 | 
			
		||||
 | 
			
		||||
	if( ! prefix )
 | 
			
		||||
		return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG,
 | 
			
		||||
					   Client_ID( Client ), Req->prefix );
 | 
			
		||||
 | 
			
		||||
	/* Forward to other server? */
 | 
			
		||||
	if( target != Client_ThisServer( ))
 | 
			
		||||
	{
 | 
			
		||||
		if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER ))
 | 
			
		||||
			return IRC_WriteStrClient( prefix, ERR_NOSUCHSERVER_MSG,
 | 
			
		||||
						   Client_ID( prefix ),
 | 
			
		||||
						   Req->argv[2] );
 | 
			
		||||
 | 
			
		||||
		/* Forward */
 | 
			
		||||
		IRC_WriteStrClientPrefix( target, prefix, "WHOWAS %s %s %s",
 | 
			
		||||
					  Req->argv[0], Req->argv[1],
 | 
			
		||||
					  Req->argv[2] );
 | 
			
		||||
		return CONNECTED;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	whowas = Client_GetWhowas( );
 | 
			
		||||
	last = Client_GetLastWhowasIndex( );
 | 
			
		||||
	if( last < 0 ) last = 0;
 | 
			
		||||
	
 | 
			
		||||
	if( Req->argc > 1 )
 | 
			
		||||
	{
 | 
			
		||||
		max = atoi( Req->argv[1] );
 | 
			
		||||
		if( max < 1 ) max = MAX_WHOWAS;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
		max = DEFAULT_WHOWAS;
 | 
			
		||||
	
 | 
			
		||||
	i = last;
 | 
			
		||||
	count = 0;
 | 
			
		||||
	do
 | 
			
		||||
	{
 | 
			
		||||
		/* Used entry? */
 | 
			
		||||
		if( whowas[i].time > 0 &&
 | 
			
		||||
		    strcasecmp( Req->argv[0], whowas[i].id ) == 0 )
 | 
			
		||||
		{
 | 
			
		||||
			(void)strftime( t_str, sizeof(t_str),
 | 
			
		||||
					"%a %b %d %H:%M:%S %Y",
 | 
			
		||||
					localtime( &whowas[i].time ));
 | 
			
		||||
		
 | 
			
		||||
			if( ! IRC_WriteStrClient( prefix, RPL_WHOWASUSER_MSG,
 | 
			
		||||
						  Client_ID( prefix ),
 | 
			
		||||
						  whowas[i].id,
 | 
			
		||||
						  whowas[i].user,
 | 
			
		||||
						  whowas[i].host, 
 | 
			
		||||
						  whowas[i].info ))
 | 
			
		||||
				return DISCONNECTED;
 | 
			
		||||
		
 | 
			
		||||
			if( ! IRC_WriteStrClient( prefix, RPL_WHOISSERVER_MSG,
 | 
			
		||||
						  Client_ID( prefix ),
 | 
			
		||||
						  whowas[i].id,
 | 
			
		||||
						  whowas[i].server, t_str ))
 | 
			
		||||
				return DISCONNECTED;
 | 
			
		||||
		
 | 
			
		||||
			count++;
 | 
			
		||||
			if( count >= max ) break;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		/* previos entry */
 | 
			
		||||
		i--;
 | 
			
		||||
 | 
			
		||||
		/* "underflow", wrap around */
 | 
			
		||||
		if( i < 0 ) i = MAX_WHOWAS - 1;
 | 
			
		||||
	} while( i != last );
 | 
			
		||||
	
 | 
			
		||||
	return IRC_WriteStrClient( prefix, RPL_ENDOFWHOWAS_MSG,
 | 
			
		||||
				   Client_ID( prefix ), Req->argv[0] );
 | 
			
		||||
} /* IRC_WHOWAS */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_Send_LUSERS( CLIENT *Client )
 | 
			
		||||
{
 | 
			
		||||
	LONG cnt;
 | 
			
		||||
	long cnt;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
 | 
			
		||||
@@ -744,15 +870,22 @@ IRC_Send_LUSERS( CLIENT *Client )
 | 
			
		||||
} /* IRC_Send_LUSERS */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_Show_MOTD( CLIENT *Client )
 | 
			
		||||
{
 | 
			
		||||
	BOOLEAN ok;
 | 
			
		||||
	CHAR line[127];
 | 
			
		||||
	bool ok;
 | 
			
		||||
	char line[127];
 | 
			
		||||
	FILE *fd;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
 | 
			
		||||
	if( Conf_MotdPhrase[0] )
 | 
			
		||||
	{
 | 
			
		||||
		if( ! IRC_WriteStrClient( Client, RPL_MOTDSTART_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )))) return DISCONNECTED;
 | 
			
		||||
		if( ! IRC_WriteStrClient( Client, RPL_MOTD_MSG, Client_ID( Client ), Conf_MotdPhrase )) return DISCONNECTED;
 | 
			
		||||
		return IRC_WriteStrClient( Client, RPL_ENDOFMOTD_MSG, Client_ID( Client ));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fd = fopen( Conf_MotdFile, "r" );
 | 
			
		||||
	if( ! fd )
 | 
			
		||||
	{
 | 
			
		||||
@@ -760,15 +893,17 @@ IRC_Show_MOTD( CLIENT *Client )
 | 
			
		||||
		return IRC_WriteStrClient( Client, ERR_NOMOTD_MSG, Client_ID( Client ) );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	IRC_WriteStrClient( Client, RPL_MOTDSTART_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )));
 | 
			
		||||
	while( TRUE )
 | 
			
		||||
	if( ! IRC_WriteStrClient( Client, RPL_MOTDSTART_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )))) return DISCONNECTED;
 | 
			
		||||
	while( true )
 | 
			
		||||
	{
 | 
			
		||||
		if( ! fgets( line, 126, fd )) break;
 | 
			
		||||
		if( line[strlen( line ) - 1] == '\n' ) line[strlen( line ) - 1] = '\0';
 | 
			
		||||
		if( ! fgets( line, sizeof( line ), fd )) break;
 | 
			
		||||
 | 
			
		||||
		ngt_TrimLastChr( line, '\n');
 | 
			
		||||
 | 
			
		||||
		if( ! IRC_WriteStrClient( Client, RPL_MOTD_MSG, Client_ID( Client ), line ))
 | 
			
		||||
		{
 | 
			
		||||
			fclose( fd );
 | 
			
		||||
			return FALSE;
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	ok = IRC_WriteStrClient( Client, RPL_ENDOFMOTD_MSG, Client_ID( Client ) );
 | 
			
		||||
@@ -779,19 +914,22 @@ IRC_Show_MOTD( CLIENT *Client )
 | 
			
		||||
} /* IRC_Show_MOTD */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan )
 | 
			
		||||
{
 | 
			
		||||
	BOOLEAN is_visible, is_member;
 | 
			
		||||
	CHAR str[LINE_LEN + 1];
 | 
			
		||||
	bool is_visible, is_member;
 | 
			
		||||
	char str[LINE_LEN + 1];
 | 
			
		||||
	CL2CHAN *cl2chan;
 | 
			
		||||
	CLIENT *cl;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Chan != NULL );
 | 
			
		||||
 | 
			
		||||
	if( Channel_IsMemberOf( Chan, Client )) is_member = TRUE;
 | 
			
		||||
	else is_member = FALSE;
 | 
			
		||||
	if( Channel_IsMemberOf( Chan, Client )) is_member = true;
 | 
			
		||||
	else is_member = false;
 | 
			
		||||
 | 
			
		||||
	/* Secret channel? */
 | 
			
		||||
	if( ! is_member && strchr( Channel_Modes( Chan ), 's' )) return CONNECTED;
 | 
			
		||||
 | 
			
		||||
	/* Alle Mitglieder suchen */
 | 
			
		||||
	snprintf( str, sizeof( str ), RPL_NAMREPLY_MSG, Client_ID( Client ), "=", Channel_Name( Chan ));
 | 
			
		||||
@@ -800,8 +938,8 @@ IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan )
 | 
			
		||||
	{
 | 
			
		||||
		cl = Channel_GetClient( cl2chan );
 | 
			
		||||
 | 
			
		||||
		if( strchr( Client_Modes( cl ), 'i' )) is_visible = FALSE;
 | 
			
		||||
		else is_visible = TRUE;
 | 
			
		||||
		if( strchr( Client_Modes( cl ), 'i' )) is_visible = false;
 | 
			
		||||
		else is_visible = true;
 | 
			
		||||
 | 
			
		||||
		if( is_member || is_visible )
 | 
			
		||||
		{
 | 
			
		||||
@@ -832,19 +970,22 @@ IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan )
 | 
			
		||||
} /* IRC_Send_NAMES */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, bool OnlyOps )
 | 
			
		||||
{
 | 
			
		||||
	BOOLEAN is_visible, is_member;
 | 
			
		||||
	bool is_visible, is_member;
 | 
			
		||||
	CL2CHAN *cl2chan;
 | 
			
		||||
	CHAR flags[8];
 | 
			
		||||
	char flags[8];
 | 
			
		||||
	CLIENT *c;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Chan != NULL );
 | 
			
		||||
 | 
			
		||||
	if( Channel_IsMemberOf( Chan, Client )) is_member = TRUE;
 | 
			
		||||
	else is_member = FALSE;
 | 
			
		||||
	if( Channel_IsMemberOf( Chan, Client )) is_member = true;
 | 
			
		||||
	else is_member = false;
 | 
			
		||||
 | 
			
		||||
	/* Secret channel? */
 | 
			
		||||
	if( ! is_member && strchr( Channel_Modes( Chan ), 's' )) return CONNECTED;
 | 
			
		||||
 | 
			
		||||
	/* Alle Mitglieder suchen */
 | 
			
		||||
	cl2chan = Channel_FirstMember( Chan );
 | 
			
		||||
@@ -852,8 +993,8 @@ IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps )
 | 
			
		||||
	{
 | 
			
		||||
		c = Channel_GetClient( cl2chan );
 | 
			
		||||
 | 
			
		||||
		if( strchr( Client_Modes( c ), 'i' )) is_visible = FALSE;
 | 
			
		||||
		else is_visible = TRUE;
 | 
			
		||||
		if( strchr( Client_Modes( c ), 'i' )) is_visible = false;
 | 
			
		||||
		else is_visible = true;
 | 
			
		||||
 | 
			
		||||
		if( is_member || is_visible )
 | 
			
		||||
		{
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: irc-info.h,v 1.2 2002/12/12 12:23:43 alex Exp $
 | 
			
		||||
 * $Id: irc-info.h,v 1.3 2005/03/19 18:43:48 fw Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * IRC info commands (header)
 | 
			
		||||
 */
 | 
			
		||||
@@ -18,24 +18,24 @@
 | 
			
		||||
#define __irc_info_h__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN IRC_ADMIN PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_ISON PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_LINKS PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_LUSERS PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_MOTD PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_NAMES PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_STATS PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_TIME PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_USERHOST PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_VERSION PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_WHO PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_WHOIS PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_WHOWAS PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_ADMIN PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_ISON PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_LINKS PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_LUSERS PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_MOTD PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_NAMES PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_STATS PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_TIME PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_USERHOST PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_VERSION PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_WHO PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_WHOIS PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_WHOWAS PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN IRC_Send_LUSERS PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_Send_NAMES PARAMS(( CLIENT *Client, CHANNEL *Chan ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_Show_MOTD PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_Send_WHO PARAMS(( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps ));
 | 
			
		||||
GLOBAL bool IRC_Send_LUSERS PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL bool IRC_Send_NAMES PARAMS(( CLIENT *Client, CHANNEL *Chan ));
 | 
			
		||||
GLOBAL bool IRC_Show_MOTD PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL bool IRC_Send_WHO PARAMS(( CLIENT *Client, CHANNEL *Chan, bool OnlyOps ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -14,13 +14,14 @@
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: irc-login.c,v 1.34 2003/03/31 15:54:21 alex Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: irc-login.c,v 1.44.2.1 2005/12/15 11:01:59 alex Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <strings.h>
 | 
			
		||||
 | 
			
		||||
#include "ngircd.h"
 | 
			
		||||
#include "resolve.h"
 | 
			
		||||
@@ -34,16 +35,17 @@ static char UNUSED id[] = "$Id: irc-login.c,v 1.34 2003/03/31 15:54:21 alex Exp
 | 
			
		||||
#include "irc.h"
 | 
			
		||||
#include "irc-info.h"
 | 
			
		||||
#include "irc-write.h"
 | 
			
		||||
#include "cvs-version.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "irc-login.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL BOOLEAN Hello_User PARAMS(( CLIENT *Client ));
 | 
			
		||||
LOCAL VOID Kill_Nick PARAMS(( CHAR *Nick, CHAR *Reason ));
 | 
			
		||||
LOCAL bool Hello_User PARAMS(( CLIENT *Client ));
 | 
			
		||||
LOCAL void Kill_Nick PARAMS(( char *Nick, char *Reason ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_PASS( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
@@ -65,8 +67,8 @@ IRC_PASS( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	}
 | 
			
		||||
	else if((( Client_Type( Client ) == CLIENT_UNKNOWN ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER )) && (( Req->argc == 3 ) || ( Req->argc == 4 )))
 | 
			
		||||
	{
 | 
			
		||||
		CHAR c2, c4, *type, *impl, *serverver, *flags, *ptr, *ircflags;
 | 
			
		||||
		INT protohigh, protolow;
 | 
			
		||||
		char c2, c4, *type, *impl, *serverver, *flags, *ptr, *ircflags;
 | 
			
		||||
		int protohigh, protolow;
 | 
			
		||||
 | 
			
		||||
		/* noch nicht registrierte Server-Verbindung */
 | 
			
		||||
		Log( LOG_DEBUG, "Connection %d: got PASS command (new server link) ...", Client_Conn( Client ));
 | 
			
		||||
@@ -141,95 +143,146 @@ IRC_PASS( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
} /* IRC_PASS */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
/**
 | 
			
		||||
 * IRC "NICK" command.
 | 
			
		||||
 * This function implements the IRC command "NICK" which is used to register
 | 
			
		||||
 * with the server, to change already registered nicknames and to introduce
 | 
			
		||||
 * new users which are connected to other servers.
 | 
			
		||||
 */
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_NICK( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *intr_c, *target, *c;
 | 
			
		||||
	CHAR *modes;
 | 
			
		||||
	char *modes;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
 | 
			
		||||
	/* Zumindest BitchX sendet NICK-USER in der falschen Reihenfolge. */
 | 
			
		||||
#ifndef STRICT_RFC
 | 
			
		||||
	if( Client_Type( Client ) == CLIENT_UNKNOWN || Client_Type( Client ) == CLIENT_GOTPASS || Client_Type( Client ) == CLIENT_GOTNICK || Client_Type( Client ) == CLIENT_GOTUSER || Client_Type( Client ) == CLIENT_USER || ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
 | 
			
		||||
	/* Some IRC clients, for example BitchX, send the NICK and USER
 | 
			
		||||
	 * commands in the wrong order ... */
 | 
			
		||||
	if( Client_Type( Client ) == CLIENT_UNKNOWN
 | 
			
		||||
	    || Client_Type( Client ) == CLIENT_GOTPASS
 | 
			
		||||
	    || Client_Type( Client ) == CLIENT_GOTNICK
 | 
			
		||||
	    || Client_Type( Client ) == CLIENT_GOTUSER
 | 
			
		||||
	    || Client_Type( Client ) == CLIENT_USER
 | 
			
		||||
	    || ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
 | 
			
		||||
#else
 | 
			
		||||
	if( Client_Type( Client ) == CLIENT_UNKNOWN || Client_Type( Client ) == CLIENT_GOTPASS || Client_Type( Client ) == CLIENT_GOTNICK || Client_Type( Client ) == CLIENT_USER || ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
 | 
			
		||||
	if( Client_Type( Client ) == CLIENT_UNKNOWN
 | 
			
		||||
	    || Client_Type( Client ) == CLIENT_GOTPASS
 | 
			
		||||
	    || Client_Type( Client ) == CLIENT_GOTNICK
 | 
			
		||||
	    || Client_Type( Client ) == CLIENT_USER
 | 
			
		||||
	    || ( Client_Type( Client ) == CLIENT_SERVER && Req->argc == 1 ))
 | 
			
		||||
#endif
 | 
			
		||||
	{
 | 
			
		||||
		/* User-Registrierung bzw. Nick-Aenderung */
 | 
			
		||||
		/* User registration or change of nickname */
 | 
			
		||||
 | 
			
		||||
		/* Falsche Anzahl Parameter? */
 | 
			
		||||
		if( Req->argc != 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
		/* Wrong number of arguments? */
 | 
			
		||||
		if( Req->argc != 1 )
 | 
			
		||||
			return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
						   Client_ID( Client ),
 | 
			
		||||
						   Req->command );
 | 
			
		||||
 | 
			
		||||
		/* "Ziel-Client" ermitteln */
 | 
			
		||||
		/* Search "target" client */
 | 
			
		||||
		if( Client_Type( Client ) == CLIENT_SERVER )
 | 
			
		||||
		{
 | 
			
		||||
			target = Client_Search( Req->prefix );
 | 
			
		||||
			if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
 | 
			
		||||
			if( ! target )
 | 
			
		||||
				return IRC_WriteStrClient( Client,
 | 
			
		||||
							   ERR_NOSUCHNICK_MSG,
 | 
			
		||||
							   Client_ID( Client ),
 | 
			
		||||
							   Req->argv[0] );
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			/* Ist der Client "restricted"? */
 | 
			
		||||
			if( Client_HasMode( Client, 'r' )) return IRC_WriteStrClient( Client, ERR_RESTRICTED_MSG, Client_ID( Client ));
 | 
			
		||||
			/* Is this a restricted client? */
 | 
			
		||||
			if( Client_HasMode( Client, 'r' ))
 | 
			
		||||
				return IRC_WriteStrClient( Client,
 | 
			
		||||
							   ERR_RESTRICTED_MSG,
 | 
			
		||||
							   Client_ID( Client ));
 | 
			
		||||
 | 
			
		||||
			target = Client;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
#ifndef STRICT_RFC
 | 
			
		||||
		/* Wenn der Client zu seinem eigenen Nick wechseln will, so machen
 | 
			
		||||
		 * wir nichts. So macht es das Original und mind. Snak hat probleme,
 | 
			
		||||
		 * wenn wir es nicht so machen. Ob es so okay ist? Hm ... */
 | 
			
		||||
		if( strcmp( Client_ID( target ), Req->argv[0] ) == 0 ) return CONNECTED;
 | 
			
		||||
		/* If the clients tries to change to its own nickname we won't
 | 
			
		||||
		 * do anything. This is how the original ircd behaves and some
 | 
			
		||||
		 * clients (for example Snak) expect it to be like this.
 | 
			
		||||
		 * But I doubt that this is "really the right thing" ... */
 | 
			
		||||
		if( strcmp( Client_ID( target ), Req->argv[0] ) == 0 )
 | 
			
		||||
			return CONNECTED;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
		/* pruefen, ob Nick bereits vergeben. Speziallfall: der Client
 | 
			
		||||
		 * will nur die Gross- und Kleinschreibung aendern. Das darf
 | 
			
		||||
		 * er natuerlich machen :-) */
 | 
			
		||||
		/* Check that the new nickname is available. Special case:
 | 
			
		||||
		 * the client only changes from/to upper to lower case. */
 | 
			
		||||
		if( strcasecmp( Client_ID( target ), Req->argv[0] ) != 0 )
 | 
			
		||||
		{
 | 
			
		||||
			if( ! Client_CheckNick( target, Req->argv[0] )) return CONNECTED;
 | 
			
		||||
			if( ! Client_CheckNick( target, Req->argv[0] ))
 | 
			
		||||
				return CONNECTED;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if(( Client_Type( target ) != CLIENT_USER ) && ( Client_Type( target ) != CLIENT_SERVER ))
 | 
			
		||||
		if(( Client_Type( target ) != CLIENT_USER )
 | 
			
		||||
		   && ( Client_Type( target ) != CLIENT_SERVER ))
 | 
			
		||||
		{
 | 
			
		||||
			/* Neuer Client */
 | 
			
		||||
			Log( LOG_DEBUG, "Connection %d: got valid NICK command ...", Client_Conn( Client ));
 | 
			
		||||
			/* New client */
 | 
			
		||||
			Log( LOG_DEBUG, "Connection %d: got valid NICK command ...", 
 | 
			
		||||
			     Client_Conn( Client ));
 | 
			
		||||
 | 
			
		||||
			/* Client-Nick registrieren */
 | 
			
		||||
			/* Register new nickname of this client */
 | 
			
		||||
			Client_SetID( target, Req->argv[0] );
 | 
			
		||||
 | 
			
		||||
			/* schon ein USER da? Dann registrieren! */
 | 
			
		||||
			if( Client_Type( Client ) == CLIENT_GOTUSER ) return Hello_User( Client );
 | 
			
		||||
			else Client_SetType( Client, CLIENT_GOTNICK );
 | 
			
		||||
			/* If we received a valid USER command already then
 | 
			
		||||
			 * register the new client! */
 | 
			
		||||
			if( Client_Type( Client ) == CLIENT_GOTUSER )
 | 
			
		||||
				return Hello_User( Client );
 | 
			
		||||
			else
 | 
			
		||||
				Client_SetType( Client, CLIENT_GOTNICK );
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			/* Nick-Aenderung */
 | 
			
		||||
			/* Nickname change */
 | 
			
		||||
			if( Client_Conn( target ) > NONE )
 | 
			
		||||
			{
 | 
			
		||||
				/* lokaler Client */
 | 
			
		||||
				Log( LOG_INFO, "User \"%s\" changed nick (connection %d): \"%s\" -> \"%s\".", Client_Mask( target ), Client_Conn( target ), Client_ID( target ), Req->argv[0] );
 | 
			
		||||
				/* Local client */
 | 
			
		||||
				Log( LOG_INFO,
 | 
			
		||||
				     "User \"%s\" changed nick (connection %d): \"%s\" -> \"%s\".",
 | 
			
		||||
				     Client_Mask( target ), Client_Conn( target ),
 | 
			
		||||
				     Client_ID( target ), Req->argv[0] );
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				/* Remote-Client */
 | 
			
		||||
				Log( LOG_DEBUG, "User \"%s\" changed nick: \"%s\" -> \"%s\".", Client_Mask( target ), Client_ID( target ), Req->argv[0] );
 | 
			
		||||
				/* Remote client */
 | 
			
		||||
				Log( LOG_DEBUG,
 | 
			
		||||
				     "User \"%s\" changed nick: \"%s\" -> \"%s\".",
 | 
			
		||||
				     Client_Mask( target ), Client_ID( target ),
 | 
			
		||||
				     Req->argv[0] );
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/* alle betroffenen User und Server ueber Nick-Aenderung informieren */
 | 
			
		||||
			if( Client_Type( Client ) == CLIENT_USER ) IRC_WriteStrClientPrefix( Client, Client, "NICK :%s", Req->argv[0] );
 | 
			
		||||
			IRC_WriteStrServersPrefix( Client, target, "NICK :%s", Req->argv[0] );
 | 
			
		||||
			IRC_WriteStrRelatedPrefix( target, target, FALSE, "NICK :%s", Req->argv[0] );
 | 
			
		||||
			/* Inform all users and servers (which have to know)
 | 
			
		||||
			 * of this nickname change */
 | 
			
		||||
			if( Client_Type( Client ) == CLIENT_USER )
 | 
			
		||||
				IRC_WriteStrClientPrefix( Client, Client,
 | 
			
		||||
							  "NICK :%s",
 | 
			
		||||
							  Req->argv[0] );
 | 
			
		||||
			IRC_WriteStrServersPrefix( Client, target,
 | 
			
		||||
						   "NICK :%s", Req->argv[0] );
 | 
			
		||||
			IRC_WriteStrRelatedPrefix( target, target, false,
 | 
			
		||||
						   "NICK :%s", Req->argv[0] );
 | 
			
		||||
			
 | 
			
		||||
			/* neuen Client-Nick speichern */
 | 
			
		||||
			/* Register old nickname for WHOWAS queries */
 | 
			
		||||
			Client_RegisterWhowas( target );
 | 
			
		||||
				
 | 
			
		||||
			/* Save new nickname */
 | 
			
		||||
			Client_SetID( target, Req->argv[0] );
 | 
			
		||||
			
 | 
			
		||||
			IRC_SetPenalty( target, 2 );
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return CONNECTED;
 | 
			
		||||
	}
 | 
			
		||||
	else if( Client_Type( Client ) == CLIENT_SERVER )
 | 
			
		||||
	{
 | 
			
		||||
		/* Server fuehrt neuen Client ein */
 | 
			
		||||
		/* Server introduces new client */
 | 
			
		||||
 | 
			
		||||
		/* Falsche Anzahl Parameter? */
 | 
			
		||||
		if( Req->argc != 7 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
@@ -256,7 +309,7 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Neue Client-Struktur anlegen */
 | 
			
		||||
		c = Client_NewRemoteUser( intr_c, Req->argv[0], atoi( Req->argv[1] ), Req->argv[2], Req->argv[3], atoi( Req->argv[4] ), Req->argv[5] + 1, Req->argv[6], TRUE );
 | 
			
		||||
		c = Client_NewRemoteUser( intr_c, Req->argv[0], atoi( Req->argv[1] ), Req->argv[2], Req->argv[3], atoi( Req->argv[4] ), Req->argv[5] + 1, Req->argv[6], true);
 | 
			
		||||
		if( ! c )
 | 
			
		||||
		{
 | 
			
		||||
			/* Eine neue Client-Struktur konnte nicht angelegt werden.
 | 
			
		||||
@@ -280,9 +333,13 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
} /* IRC_NICK */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_USER( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
#ifdef IDENTAUTH
 | 
			
		||||
	char *ptr;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
 | 
			
		||||
@@ -292,11 +349,21 @@ IRC_USER( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	if( Client_Type( Client ) == CLIENT_GOTNICK || Client_Type( Client ) == CLIENT_GOTPASS )
 | 
			
		||||
#endif
 | 
			
		||||
	{
 | 
			
		||||
		/* Falsche Anzahl Parameter? */
 | 
			
		||||
		/* Wrong number of parameters? */
 | 
			
		||||
		if( Req->argc != 4 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
 | 
			
		||||
		Client_SetUser( Client, Req->argv[0], FALSE );
 | 
			
		||||
		Client_SetInfo( Client, Req->argv[3] );
 | 
			
		||||
		/* User name */
 | 
			
		||||
#ifdef IDENTAUTH
 | 
			
		||||
		ptr = Client_User( Client );
 | 
			
		||||
		if( ! ptr || ! *ptr || *ptr == '~' ) Client_SetUser( Client, Req->argv[0], false );
 | 
			
		||||
#else
 | 
			
		||||
		Client_SetUser( Client, Req->argv[0], false );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
		/* "Real name" or user info text: Don't set it to the empty string, the original ircd
 | 
			
		||||
		 * can't deal with such "real names" (e. g. "USER user * * :") ... */
 | 
			
		||||
		if( *Req->argv[3] ) Client_SetInfo( Client, Req->argv[3] );
 | 
			
		||||
		else Client_SetInfo( Client, "-" );
 | 
			
		||||
 | 
			
		||||
		Log( LOG_DEBUG, "Connection %d: got valid USER command ...", Client_Conn( Client ));
 | 
			
		||||
		if( Client_Type( Client ) == CLIENT_GOTNICK ) return Hello_User( Client );
 | 
			
		||||
@@ -311,21 +378,25 @@ IRC_USER( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
} /* IRC_USER */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_QUIT( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *target;
 | 
			
		||||
	char quitmsg[LINE_LEN];
 | 
			
		||||
	
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
		
 | 
			
		||||
	/* Wrong number of arguments? */
 | 
			
		||||
	if( Req->argc > 1 )
 | 
			
		||||
		return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
 | 
			
		||||
	if (Req->argc == 1)
 | 
			
		||||
		strlcpy(quitmsg, Req->argv[0], sizeof quitmsg);
 | 
			
		||||
 | 
			
		||||
	if ( Client_Type( Client ) == CLIENT_SERVER )
 | 
			
		||||
	{
 | 
			
		||||
		/* Server */
 | 
			
		||||
 | 
			
		||||
		/* Falsche Anzahl Parameter? */
 | 
			
		||||
		if( Req->argc > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
 | 
			
		||||
		target = Client_Search( Req->prefix );
 | 
			
		||||
		if( ! target )
 | 
			
		||||
		{
 | 
			
		||||
@@ -334,27 +405,28 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
			return CONNECTED;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if( Req->argc == 0 ) Client_Destroy( target, "Got QUIT command.", NULL, TRUE );
 | 
			
		||||
		else Client_Destroy( target, "Got QUIT command.", Req->argv[0], TRUE );
 | 
			
		||||
		Client_Destroy( target, "Got QUIT command.", Req->argc == 1 ? quitmsg : NULL, true);
 | 
			
		||||
 | 
			
		||||
		return CONNECTED;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		/* User, Service, oder noch nicht registriert */
 | 
			
		||||
		
 | 
			
		||||
		/* Falsche Anzahl Parameter? */
 | 
			
		||||
		if( Req->argc > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
		if (Req->argc == 1 && quitmsg[0] != '\"') {
 | 
			
		||||
			/* " " to avoid confusion */
 | 
			
		||||
			strlcpy(quitmsg, "\"", sizeof quitmsg);
 | 
			
		||||
			strlcat(quitmsg, Req->argv[0], sizeof quitmsg-1);
 | 
			
		||||
			strlcat(quitmsg, "\"", sizeof quitmsg );
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if( Req->argc == 0 ) Conn_Close( Client_Conn( Client ), "Got QUIT command.", NULL, TRUE );
 | 
			
		||||
		else Conn_Close( Client_Conn( Client ), "Got QUIT command.", Req->argv[0], TRUE );
 | 
			
		||||
		/* User, Service, oder noch nicht registriert */
 | 
			
		||||
		Conn_Close( Client_Conn( Client ), "Got QUIT command.", Req->argc == 1 ? quitmsg : NULL, true);
 | 
			
		||||
		
 | 
			
		||||
		return DISCONNECTED;
 | 
			
		||||
	}
 | 
			
		||||
} /* IRC_QUIT */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_PING( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *target, *from;
 | 
			
		||||
@@ -384,11 +456,19 @@ IRC_PING( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	Log( LOG_DEBUG, "Connection %d: got PING, sending PONG ...", Client_Conn( Client ));
 | 
			
		||||
	return IRC_WriteStrClient( Client, "PONG %s :%s", Client_ID( Client_ThisServer( )), Client_ID( Client ));
 | 
			
		||||
#ifdef STRICT_RFC
 | 
			
		||||
	return IRC_WriteStrClient(Client, "PONG %s :%s",
 | 
			
		||||
		Client_ID(Client_ThisServer()), Client_ID(Client));
 | 
			
		||||
#else
 | 
			
		||||
	/* Some clients depend on the argument being returned in the PONG
 | 
			
		||||
	 * reply (not mentioned in any RFC, though) */
 | 
			
		||||
	return IRC_WriteStrClient(Client, "PONG %s :%s",
 | 
			
		||||
		Client_ID(Client_ThisServer( )), Req->argv[0]);
 | 
			
		||||
#endif	
 | 
			
		||||
} /* IRC_PING */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_PONG( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *target, *from;
 | 
			
		||||
@@ -425,29 +505,49 @@ IRC_PONG( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
} /* IRC_PONG */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL BOOLEAN
 | 
			
		||||
LOCAL bool
 | 
			
		||||
Hello_User( CLIENT *Client )
 | 
			
		||||
{
 | 
			
		||||
#ifdef CVSDATE
 | 
			
		||||
	char ver[12], vertxt[30];
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
 | 
			
		||||
	/* Passwort ueberpruefen */
 | 
			
		||||
	/* Check password ... */
 | 
			
		||||
	if( strcmp( Client_Password( Client ), Conf_ServerPwd ) != 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Falsches Passwort */
 | 
			
		||||
		/* Bad password! */
 | 
			
		||||
		Log( LOG_ERR, "User \"%s\" rejected (connection %d): Bad password!", Client_Mask( Client ), Client_Conn( Client ));
 | 
			
		||||
		Conn_Close( Client_Conn( Client ), NULL, "Bad password", TRUE );
 | 
			
		||||
		Conn_Close( Client_Conn( Client ), NULL, "Bad password", true);
 | 
			
		||||
		return DISCONNECTED;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	Log( LOG_NOTICE, "User \"%s\" registered (connection %d).", Client_Mask( Client ), Client_Conn( Client ));
 | 
			
		||||
 | 
			
		||||
	/* Andere Server informieren */
 | 
			
		||||
	/* Inform other servers */
 | 
			
		||||
	IRC_WriteStrServers( NULL, "NICK %s 1 %s %s 1 +%s :%s", Client_ID( Client ), Client_User( Client ), Client_Hostname( Client ), Client_Modes( Client ), Client_Info( Client ));
 | 
			
		||||
 | 
			
		||||
	if( ! IRC_WriteStrClient( Client, RPL_WELCOME_MSG, Client_ID( Client ), Client_Mask( Client ))) return FALSE;
 | 
			
		||||
	if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), PACKAGE_VERSION, TARGET_CPU, TARGET_VENDOR, TARGET_OS )) return FALSE;
 | 
			
		||||
	if( ! IRC_WriteStrClient( Client, RPL_CREATED_MSG, Client_ID( Client ), NGIRCd_StartStr )) return FALSE;
 | 
			
		||||
	if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), PACKAGE_VERSION, USERMODES, CHANMODES )) return FALSE;
 | 
			
		||||
	/* Welcome :-) */
 | 
			
		||||
	if( ! IRC_WriteStrClient( Client, RPL_WELCOME_MSG, Client_ID( Client ), Client_Mask( Client ))) return false;
 | 
			
		||||
 | 
			
		||||
	/* Version and system type */
 | 
			
		||||
#ifdef CVSDATE
 | 
			
		||||
	strlcpy( ver, CVSDATE, sizeof( ver ));
 | 
			
		||||
	strncpy( ver + 4, ver + 5, 2 );
 | 
			
		||||
	strncpy( ver + 6, ver + 8, 3 );
 | 
			
		||||
	snprintf( vertxt, sizeof( vertxt ), "%s(%s)", PACKAGE_VERSION, ver );
 | 
			
		||||
	if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), vertxt, TARGET_CPU, TARGET_VENDOR, TARGET_OS )) return false;
 | 
			
		||||
#else
 | 
			
		||||
	if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), PACKAGE_VERSION, TARGET_CPU, TARGET_VENDOR, TARGET_OS )) return false;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	if( ! IRC_WriteStrClient( Client, RPL_CREATED_MSG, Client_ID( Client ), NGIRCd_StartStr )) return false;
 | 
			
		||||
#ifdef CVSDATE
 | 
			
		||||
	if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), vertxt, USERMODES, CHANMODES )) return false;	
 | 
			
		||||
#else
 | 
			
		||||
	if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), PACKAGE_VERSION, USERMODES, CHANMODES )) return false;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	/* Features */
 | 
			
		||||
	if( ! IRC_WriteStrClient( Client, RPL_ISUPPORT_MSG, Client_ID( Client ), CLIENT_NICK_LEN - 1, CHANNEL_TOPIC_LEN - 1, CLIENT_AWAY_LEN - 1, Conf_MaxJoins )) return DISCONNECTED;
 | 
			
		||||
@@ -457,19 +557,22 @@ Hello_User( CLIENT *Client )
 | 
			
		||||
	if( ! IRC_Send_LUSERS( Client )) return DISCONNECTED;
 | 
			
		||||
	if( ! IRC_Show_MOTD( Client )) return DISCONNECTED;
 | 
			
		||||
 | 
			
		||||
	/* Suspend the client for a second ... */
 | 
			
		||||
	IRC_SetPenalty( Client, 1 );
 | 
			
		||||
 | 
			
		||||
	return CONNECTED;
 | 
			
		||||
} /* Hello_User */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID
 | 
			
		||||
Kill_Nick( CHAR *Nick, CHAR *Reason )
 | 
			
		||||
LOCAL void
 | 
			
		||||
Kill_Nick( char *Nick, char *Reason )
 | 
			
		||||
{
 | 
			
		||||
	REQUEST r;
 | 
			
		||||
 | 
			
		||||
	assert( Nick != NULL );
 | 
			
		||||
	assert( Reason != NULL );
 | 
			
		||||
 | 
			
		||||
	r.prefix = Client_ThisServer( );
 | 
			
		||||
	r.prefix = (char *)Client_ThisServer( );
 | 
			
		||||
	r.argv[0] = Nick;
 | 
			
		||||
	r.argv[1] = Reason;
 | 
			
		||||
	r.argc = 2;
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: irc-login.h,v 1.5 2002/12/12 12:23:43 alex Exp $
 | 
			
		||||
 * $Id: irc-login.h,v 1.6 2005/03/19 18:43:48 fw Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * Login and logout (header)
 | 
			
		||||
 */
 | 
			
		||||
@@ -18,12 +18,12 @@
 | 
			
		||||
#define __irc_login_h__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN IRC_PASS PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_NICK PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_USER PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_PING PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_PONG PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_QUIT PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_PASS PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_NICK PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_USER PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_PING PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_PONG PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_QUIT PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 * Copyright (c)2001-2005 Alexander Barton (alex@barton.de)
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
@@ -14,7 +14,7 @@
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: irc-mode.c,v 1.31 2003/01/21 21:04:16 alex Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: irc-mode.c,v 1.43 2005/06/17 19:14:58 fw Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
@@ -22,10 +22,10 @@ static char UNUSED id[] = "$Id: irc-mode.c,v 1.31 2003/01/21 21:04:16 alex Exp $
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "client.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "irc-write.h"
 | 
			
		||||
#include "lists.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
@@ -38,19 +38,19 @@ static char UNUSED id[] = "$Id: irc-mode.c,v 1.31 2003/01/21 21:04:16 alex Exp $
 | 
			
		||||
#include "irc-mode.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL BOOLEAN Client_Mode PARAMS(( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ));
 | 
			
		||||
LOCAL BOOLEAN Channel_Mode PARAMS(( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel ));
 | 
			
		||||
LOCAL 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 ));
 | 
			
		||||
 | 
			
		||||
LOCAL BOOLEAN Add_Invite PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern ));
 | 
			
		||||
LOCAL BOOLEAN Add_Ban PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern ));
 | 
			
		||||
LOCAL 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 ));
 | 
			
		||||
 | 
			
		||||
LOCAL BOOLEAN Del_Invite PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern ));
 | 
			
		||||
LOCAL BOOLEAN Del_Ban PARAMS(( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern ));
 | 
			
		||||
LOCAL 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 ));
 | 
			
		||||
 | 
			
		||||
LOCAL BOOLEAN Send_ListChange PARAMS(( CHAR *Mode, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Mask ));
 | 
			
		||||
LOCAL bool Send_ListChange PARAMS(( char *Mode, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Mask ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_MODE( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *cl, *origin;
 | 
			
		||||
@@ -83,14 +83,15 @@ IRC_MODE( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
} /* IRC_MODE */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL BOOLEAN
 | 
			
		||||
LOCAL bool
 | 
			
		||||
Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
 | 
			
		||||
{
 | 
			
		||||
	/* Handle client mode requests */
 | 
			
		||||
 | 
			
		||||
	CHAR the_modes[COMMAND_LEN], x[2], *mode_ptr;
 | 
			
		||||
	BOOLEAN ok, set;
 | 
			
		||||
	INT mode_arg;
 | 
			
		||||
	char the_modes[COMMAND_LEN], x[2], *mode_ptr;
 | 
			
		||||
	bool ok, set;
 | 
			
		||||
	int mode_arg;
 | 
			
		||||
	size_t len;
 | 
			
		||||
 | 
			
		||||
	/* Is the client allowed to request or change the modes? */
 | 
			
		||||
	if( Client_Type( Client ) == CLIENT_USER )
 | 
			
		||||
@@ -106,8 +107,8 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
 | 
			
		||||
	mode_ptr = Req->argv[mode_arg];
 | 
			
		||||
 | 
			
		||||
	/* Initial state: set or unset modes? */
 | 
			
		||||
	if( *mode_ptr == '+' ) set = TRUE;
 | 
			
		||||
	else if( *mode_ptr == '-' ) set = FALSE;
 | 
			
		||||
	if( *mode_ptr == '+' ) set = true;
 | 
			
		||||
	else if( *mode_ptr == '-' ) set = false;
 | 
			
		||||
	else return IRC_WriteStrClient( Origin, ERR_UMODEUNKNOWNFLAG_MSG, Client_ID( Origin ));
 | 
			
		||||
 | 
			
		||||
	/* Prepare reply string */
 | 
			
		||||
@@ -134,10 +135,11 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
 | 
			
		||||
				if((( *mode_ptr == '+' ) && ( ! set )) || (( *mode_ptr == '-' ) && ( set )))
 | 
			
		||||
				{
 | 
			
		||||
					/* Action modifier ("+"/"-") must be changed ... */
 | 
			
		||||
					if(( the_modes[strlen( the_modes ) - 1] == '+' ) || ( the_modes[strlen( the_modes ) - 1] == '-' ))
 | 
			
		||||
					len = strlen( the_modes ) - 1;
 | 
			
		||||
					if(( the_modes[len] == '+' ) || ( the_modes[len] == '-' ))
 | 
			
		||||
					{
 | 
			
		||||
						/* Adjust last action modifier in result */
 | 
			
		||||
						the_modes[strlen( the_modes ) - 1] = *mode_ptr;
 | 
			
		||||
						the_modes[len] = *mode_ptr;
 | 
			
		||||
					}
 | 
			
		||||
					else
 | 
			
		||||
					{
 | 
			
		||||
@@ -145,8 +147,8 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
 | 
			
		||||
						x[0] = *mode_ptr;
 | 
			
		||||
						strlcat( the_modes, x, sizeof( the_modes ));
 | 
			
		||||
					}
 | 
			
		||||
					if( *mode_ptr == '+' ) set = TRUE;
 | 
			
		||||
					else set = FALSE;
 | 
			
		||||
					if( *mode_ptr == '+' ) set = true;
 | 
			
		||||
					else set = false;
 | 
			
		||||
				}
 | 
			
		||||
				continue;
 | 
			
		||||
		}
 | 
			
		||||
@@ -155,37 +157,34 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
 | 
			
		||||
		x[0] = '\0';
 | 
			
		||||
		switch( *mode_ptr )
 | 
			
		||||
		{
 | 
			
		||||
			case 'a':
 | 
			
		||||
				/* Away */
 | 
			
		||||
			case 'i': /* Invisible */
 | 
			
		||||
			case 's': /* Server messages */
 | 
			
		||||
				x[0] = *mode_ptr;
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'a': /* Away */
 | 
			
		||||
				if( Client_Type( Client ) == CLIENT_SERVER )
 | 
			
		||||
				{
 | 
			
		||||
					x[0] = 'a';
 | 
			
		||||
					Client_SetAway( Client, DEFAULT_AWAY_MSG );
 | 
			
		||||
					Client_SetAway( Origin, DEFAULT_AWAY_MSG );
 | 
			
		||||
				}
 | 
			
		||||
				else ok = IRC_WriteStrClient( Origin, ERR_NOPRIVILEGES_MSG, Client_ID( Origin ));
 | 
			
		||||
				break;
 | 
			
		||||
			case 'i':
 | 
			
		||||
				/* Invisible */
 | 
			
		||||
				x[0] = 'i';
 | 
			
		||||
				break;
 | 
			
		||||
			case 'o':
 | 
			
		||||
				/* IRC operator (only unsetable!) */
 | 
			
		||||
 | 
			
		||||
			case 'o': /* IRC operator (only unsettable!) */
 | 
			
		||||
				if(( ! set ) || ( Client_Type( Client ) == CLIENT_SERVER ))
 | 
			
		||||
				{
 | 
			
		||||
					Client_SetOperByMe( Target, FALSE );
 | 
			
		||||
					Client_SetOperByMe( Target, false );
 | 
			
		||||
					x[0] = 'o';
 | 
			
		||||
				}
 | 
			
		||||
				else ok = IRC_WriteStrClient( Origin, ERR_NOPRIVILEGES_MSG, Client_ID( Origin ));
 | 
			
		||||
				break;
 | 
			
		||||
			case 'r':
 | 
			
		||||
				/* Restricted (only setable) */
 | 
			
		||||
 | 
			
		||||
			case 'r': /* Restricted (only settable) */
 | 
			
		||||
				if(( set ) || ( Client_Type( Client ) == CLIENT_SERVER )) x[0] = 'r';
 | 
			
		||||
				else ok = IRC_WriteStrClient( Origin, ERR_RESTRICTED_MSG, Client_ID( Origin ));
 | 
			
		||||
				break;
 | 
			
		||||
			case 's':
 | 
			
		||||
				/* Server messages */
 | 
			
		||||
				x[0] = 's';
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			default:
 | 
			
		||||
				Log( LOG_DEBUG, "Unknown mode \"%c%c\" from \"%s\"!?", set ? '+' : '-', *mode_ptr, Client_ID( Origin ));
 | 
			
		||||
				if( Client_Type( Client ) != CLIENT_SERVER ) ok = IRC_WriteStrClient( Origin, ERR_UMODEUNKNOWNFLAG2_MSG, Client_ID( Origin ), set ? '+' : '-', *mode_ptr );
 | 
			
		||||
@@ -215,7 +214,8 @@ client_exit:
 | 
			
		||||
	if( the_modes[1] )
 | 
			
		||||
	{
 | 
			
		||||
		/* Remoce needless action modifier characters */
 | 
			
		||||
		if(( the_modes[strlen( the_modes ) - 1] == '+' ) || ( the_modes[strlen( the_modes ) - 1] == '-' )) the_modes[strlen( the_modes ) - 1] = '\0';
 | 
			
		||||
		len = strlen( the_modes ) - 1;
 | 
			
		||||
		if(( the_modes[len] == '+' ) || ( the_modes[len] == '-' )) the_modes[len] = '\0';
 | 
			
		||||
 | 
			
		||||
		if( Client_Type( Client ) == CLIENT_SERVER )
 | 
			
		||||
		{
 | 
			
		||||
@@ -225,26 +225,28 @@ client_exit:
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			/* Send reply to client and inform other servers */
 | 
			
		||||
			ok = IRC_WriteStrClientPrefix( Client, Origin, "MODE %s %s", Client_ID( Target ), the_modes );
 | 
			
		||||
			ok = IRC_WriteStrClientPrefix( Client, Origin, "MODE %s :%s", Client_ID( Target ), the_modes );
 | 
			
		||||
			IRC_WriteStrServersPrefix( Client, Origin, "MODE %s :%s", Client_ID( Target ), the_modes );
 | 
			
		||||
		}
 | 
			
		||||
		Log( LOG_DEBUG, "User \"%s\": Mode change, now \"%s\".", Client_Mask( Target ), Client_Modes( Target ));
 | 
			
		||||
	}
 | 
			
		||||
		
 | 
			
		||||
	
 | 
			
		||||
	IRC_SetPenalty( Client, 1 );	
 | 
			
		||||
	return ok;
 | 
			
		||||
} /* Client_Mode */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL BOOLEAN
 | 
			
		||||
LOCAL bool
 | 
			
		||||
Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
 | 
			
		||||
{
 | 
			
		||||
	/* Handle channel and channel-user modes */
 | 
			
		||||
 | 
			
		||||
	CHAR the_modes[COMMAND_LEN], the_args[COMMAND_LEN], x[2], argadd[CLIENT_PASS_LEN], *mode_ptr;
 | 
			
		||||
	BOOLEAN ok, set, modeok, skiponce;
 | 
			
		||||
	INT mode_arg, arg_arg;
 | 
			
		||||
	char the_modes[COMMAND_LEN], the_args[COMMAND_LEN], x[2], argadd[CLIENT_PASS_LEN], *mode_ptr;
 | 
			
		||||
	bool ok, set, modeok = false, skiponce, use_servermode = false;
 | 
			
		||||
	int mode_arg, arg_arg;
 | 
			
		||||
	CLIENT *client;
 | 
			
		||||
	LONG l;
 | 
			
		||||
	long l;
 | 
			
		||||
	size_t len;
 | 
			
		||||
 | 
			
		||||
	/* Mode request: let's answer it :-) */
 | 
			
		||||
	if( Req->argc == 1 )
 | 
			
		||||
@@ -255,7 +257,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
 | 
			
		||||
		/* The sender is a member: generate extended reply */
 | 
			
		||||
		strlcpy( the_modes, Channel_Modes( Channel ), sizeof( the_modes ));
 | 
			
		||||
		mode_ptr = the_modes;
 | 
			
		||||
		strcpy( the_args, "" );
 | 
			
		||||
		the_args[0] = '\0';
 | 
			
		||||
		while( *mode_ptr )
 | 
			
		||||
		{
 | 
			
		||||
			switch( *mode_ptr )
 | 
			
		||||
@@ -283,15 +285,17 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
 | 
			
		||||
		if( ! Channel_IsMemberOf( Channel, Origin )) return IRC_WriteStrClient( Origin, ERR_NOTONCHANNEL_MSG, Client_ID( Origin ), Channel_Name( Channel ));
 | 
			
		||||
 | 
			
		||||
		/* Is he channel operator? */
 | 
			
		||||
		if( strchr( Channel_UserModes( Channel, Origin ), 'o' )) modeok = TRUE;
 | 
			
		||||
		else modeok = FALSE;
 | 
			
		||||
		if( Conf_OperCanMode )
 | 
			
		||||
		if( strchr( Channel_UserModes( Channel, Origin ), 'o' )) modeok = true;
 | 
			
		||||
		else if( Conf_OperCanMode )
 | 
			
		||||
		{
 | 
			
		||||
			/* auch IRC-Operatoren duerfen MODE verwenden */
 | 
			
		||||
			if( Client_OperByMe( Origin )) modeok = TRUE;
 | 
			
		||||
			/* IRC-Operators can use MODE as well */
 | 
			
		||||
			if( Client_OperByMe( Origin )) {
 | 
			
		||||
				modeok = true;
 | 
			
		||||
				if ( Conf_OperServerMode ) use_servermode = true; /* Change Origin to Server */
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	else modeok = TRUE;
 | 
			
		||||
	else modeok = true;
 | 
			
		||||
 | 
			
		||||
	mode_arg = 1;
 | 
			
		||||
	mode_ptr = Req->argv[mode_arg];
 | 
			
		||||
@@ -299,10 +303,10 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
 | 
			
		||||
	else arg_arg = -1;
 | 
			
		||||
 | 
			
		||||
	/* Initial state: set or unset modes? */
 | 
			
		||||
	skiponce = FALSE;
 | 
			
		||||
	if( *mode_ptr == '-' ) set = FALSE;
 | 
			
		||||
	else if( *mode_ptr == '+' ) set = TRUE;
 | 
			
		||||
	else set = skiponce = TRUE;
 | 
			
		||||
	skiponce = false;
 | 
			
		||||
	if( *mode_ptr == '-' ) set = false;
 | 
			
		||||
	else if( *mode_ptr == '+' ) set = true;
 | 
			
		||||
	else set = skiponce = true;
 | 
			
		||||
 | 
			
		||||
	/* Prepare reply string */
 | 
			
		||||
	if( set ) strcpy( the_modes, "+" );
 | 
			
		||||
@@ -324,7 +328,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
 | 
			
		||||
			if( Req->argc > mode_arg + 1 ) arg_arg = mode_arg + 1;
 | 
			
		||||
			else arg_arg = -1;
 | 
			
		||||
		}
 | 
			
		||||
		skiponce = FALSE;
 | 
			
		||||
		skiponce = false;
 | 
			
		||||
 | 
			
		||||
		switch( *mode_ptr )
 | 
			
		||||
		{
 | 
			
		||||
@@ -333,10 +337,11 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
 | 
			
		||||
				if((( *mode_ptr == '+' ) && ( ! set )) || (( *mode_ptr == '-' ) && ( set )))
 | 
			
		||||
				{
 | 
			
		||||
					/* Action modifier ("+"/"-") must be changed ... */
 | 
			
		||||
					if(( the_modes[strlen( the_modes ) - 1] == '+' ) || ( the_modes[strlen( the_modes ) - 1] == '-' ))
 | 
			
		||||
					len = strlen( the_modes ) - 1;
 | 
			
		||||
					if(( the_modes[len] == '+' ) || ( the_modes[len] == '-' ))
 | 
			
		||||
					{
 | 
			
		||||
						/* Adjust last action modifier in result */
 | 
			
		||||
						the_modes[strlen( the_modes ) - 1] = *mode_ptr;
 | 
			
		||||
						the_modes[len] = *mode_ptr;
 | 
			
		||||
					}
 | 
			
		||||
					else
 | 
			
		||||
					{
 | 
			
		||||
@@ -344,8 +349,8 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
 | 
			
		||||
						x[0] = *mode_ptr;
 | 
			
		||||
						strlcat( the_modes, x, sizeof( the_modes ));
 | 
			
		||||
					}
 | 
			
		||||
					if( *mode_ptr == '+' ) set = TRUE;
 | 
			
		||||
					else set = FALSE;
 | 
			
		||||
					if( *mode_ptr == '+' ) set = true;
 | 
			
		||||
					else set = false;
 | 
			
		||||
				}
 | 
			
		||||
				continue;
 | 
			
		||||
		}
 | 
			
		||||
@@ -359,62 +364,18 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
 | 
			
		||||
		client = NULL;
 | 
			
		||||
		switch( *mode_ptr )
 | 
			
		||||
		{
 | 
			
		||||
			/* Channel modes */
 | 
			
		||||
			case 'i':
 | 
			
		||||
				/* Invite-Only */
 | 
			
		||||
				if( modeok ) x[0] = 'i';
 | 
			
		||||
				else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
 | 
			
		||||
				break;
 | 
			
		||||
			case 'm':
 | 
			
		||||
				/* Moderated */
 | 
			
		||||
				if( modeok ) x[0] = 'm';
 | 
			
		||||
				else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
 | 
			
		||||
				break;
 | 
			
		||||
			case 'n':
 | 
			
		||||
				/* kein Schreiben in den Channel von aussen */
 | 
			
		||||
				if( modeok ) x[0] = 'n';
 | 
			
		||||
				else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
 | 
			
		||||
				break;
 | 
			
		||||
			case 't':
 | 
			
		||||
				/* Topic Lock */
 | 
			
		||||
				if( modeok ) x[0] = 't';
 | 
			
		||||
				else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
 | 
			
		||||
				break;
 | 
			
		||||
			case 'P':
 | 
			
		||||
				/* Persistent channel */
 | 
			
		||||
				if( modeok )
 | 
			
		||||
				{
 | 
			
		||||
					if( set && ( ! Client_OperByMe( Client )))
 | 
			
		||||
					{
 | 
			
		||||
						/* Only IRC operators are allowed to set P mode */
 | 
			
		||||
						ok = IRC_WriteStrClient( Origin, ERR_NOPRIVILEGES_MSG, Client_ID( Origin ));
 | 
			
		||||
					}
 | 
			
		||||
					else x[0] = 'P';
 | 
			
		||||
				}
 | 
			
		||||
			/* --- Channel modes --- */
 | 
			
		||||
 | 
			
		||||
			case 'i': /* Invite only */
 | 
			
		||||
			case 'm': /* Moderated */
 | 
			
		||||
			case 'n': /* Only members can write */
 | 
			
		||||
			case 's': /* Secret channel */
 | 
			
		||||
			case 't': /* Topic locked */
 | 
			
		||||
				if( modeok ) x[0] = *mode_ptr;
 | 
			
		||||
				else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			/* Channel user modes */
 | 
			
		||||
			case 'o':
 | 
			
		||||
				/* Channel operator */
 | 
			
		||||
			case 'v':
 | 
			
		||||
				/* Voice */
 | 
			
		||||
				if( arg_arg > mode_arg )
 | 
			
		||||
				{
 | 
			
		||||
					if( modeok )
 | 
			
		||||
					{
 | 
			
		||||
						client = Client_Search( Req->argv[arg_arg] );
 | 
			
		||||
						if( client ) x[0] = *mode_ptr;
 | 
			
		||||
						else ok = IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[arg_arg] );
 | 
			
		||||
					}
 | 
			
		||||
					else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
 | 
			
		||||
					Req->argv[arg_arg][0] = '\0';
 | 
			
		||||
					arg_arg++;
 | 
			
		||||
				}
 | 
			
		||||
				else ok = IRC_WriteStrClient( Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID( Origin ), Req->command );
 | 
			
		||||
				break;
 | 
			
		||||
			case 'k':
 | 
			
		||||
				/* Channel key */
 | 
			
		||||
			case 'k': /* Channel key */
 | 
			
		||||
				if( ! set )
 | 
			
		||||
				{
 | 
			
		||||
					if( modeok ) x[0] = *mode_ptr;
 | 
			
		||||
@@ -436,8 +397,8 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
 | 
			
		||||
				}
 | 
			
		||||
				else ok = IRC_WriteStrClient( Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID( Origin ), Req->command );
 | 
			
		||||
				break;
 | 
			
		||||
			case 'l':
 | 
			
		||||
				/* Member limit */
 | 
			
		||||
 | 
			
		||||
			case 'l': /* Member limit */
 | 
			
		||||
				if( ! set )
 | 
			
		||||
				{
 | 
			
		||||
					if( modeok ) x[0] = *mode_ptr;
 | 
			
		||||
@@ -464,9 +425,41 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
 | 
			
		||||
				else ok = IRC_WriteStrClient( Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID( Origin ), Req->command );
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			/* Channel lists */
 | 
			
		||||
			case 'I':
 | 
			
		||||
				/* Invite lists */
 | 
			
		||||
			case 'P': /* Persistent channel */
 | 
			
		||||
				if( modeok )
 | 
			
		||||
				{
 | 
			
		||||
					if( set && ( ! Client_OperByMe( Client )))
 | 
			
		||||
					{
 | 
			
		||||
						/* Only IRC operators are allowed to set P mode */
 | 
			
		||||
						ok = IRC_WriteStrClient( Origin, ERR_NOPRIVILEGES_MSG, Client_ID( Origin ));
 | 
			
		||||
					}
 | 
			
		||||
					else x[0] = 'P';
 | 
			
		||||
				}
 | 
			
		||||
				else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			/* --- Channel user modes --- */
 | 
			
		||||
 | 
			
		||||
			case 'o': /* Channel operator */
 | 
			
		||||
			case 'v': /* Voice */
 | 
			
		||||
				if( arg_arg > mode_arg )
 | 
			
		||||
				{
 | 
			
		||||
					if( modeok )
 | 
			
		||||
					{
 | 
			
		||||
						client = Client_Search( Req->argv[arg_arg] );
 | 
			
		||||
						if( client ) x[0] = *mode_ptr;
 | 
			
		||||
						else ok = IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[arg_arg] );
 | 
			
		||||
					}
 | 
			
		||||
					else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
 | 
			
		||||
					Req->argv[arg_arg][0] = '\0';
 | 
			
		||||
					arg_arg++;
 | 
			
		||||
				}
 | 
			
		||||
				else ok = IRC_WriteStrClient( Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID( Origin ), Req->command );
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			/* --- Channel lists --- */
 | 
			
		||||
 | 
			
		||||
			case 'I': /* Invite lists */
 | 
			
		||||
				if( arg_arg > mode_arg )
 | 
			
		||||
				{
 | 
			
		||||
					/* modify list */
 | 
			
		||||
@@ -481,8 +474,8 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
 | 
			
		||||
				}
 | 
			
		||||
				else Lists_ShowInvites( Origin, Channel );
 | 
			
		||||
				break;
 | 
			
		||||
			case 'b':
 | 
			
		||||
				/* Ban lists */
 | 
			
		||||
 | 
			
		||||
			case 'b': /* Ban lists */
 | 
			
		||||
				if( arg_arg > mode_arg )
 | 
			
		||||
				{
 | 
			
		||||
					/* modify list */
 | 
			
		||||
@@ -568,7 +561,8 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
 | 
			
		||||
		/* Are there additional arguments to add? */
 | 
			
		||||
		if( argadd[0] )
 | 
			
		||||
		{
 | 
			
		||||
			if( the_args[strlen( the_args ) - 1] != ' ' ) strlcat( the_args, " ", sizeof( the_args ));
 | 
			
		||||
			len = strlen( the_args ) - 1;
 | 
			
		||||
			if( the_args[len] != ' ' ) strlcat( the_args, " ", sizeof( the_args ));
 | 
			
		||||
			strlcat( the_args, argadd, sizeof( the_args ));
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -578,7 +572,8 @@ chan_exit:
 | 
			
		||||
	if( the_modes[1] )
 | 
			
		||||
	{
 | 
			
		||||
		/* Clean up mode string */
 | 
			
		||||
		if(( the_modes[strlen( the_modes ) - 1] == '+' ) || ( the_modes[strlen( the_modes ) - 1] == '-' )) the_modes[strlen( the_modes ) - 1] = '\0';
 | 
			
		||||
		len = strlen( the_modes ) - 1;
 | 
			
		||||
		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';
 | 
			
		||||
@@ -587,22 +582,25 @@ chan_exit:
 | 
			
		||||
		{
 | 
			
		||||
			/* Forward mode changes to channel users and other servers */
 | 
			
		||||
			IRC_WriteStrServersPrefix( Client, Origin, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args );
 | 
			
		||||
			IRC_WriteStrChannelPrefix( Client, Channel, Origin, FALSE, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args );
 | 
			
		||||
			IRC_WriteStrChannelPrefix( Client, Channel, Origin, false, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args );
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			if ( use_servermode ) Origin = Client_ThisServer();
 | 
			
		||||
 | 
			
		||||
			/* Send reply to client and inform other servers and channel users */
 | 
			
		||||
			ok = IRC_WriteStrClientPrefix( Client, Origin, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args );
 | 
			
		||||
			IRC_WriteStrServersPrefix( Client, Origin, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args );
 | 
			
		||||
			IRC_WriteStrChannelPrefix( Client, Channel, Origin, FALSE, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args );
 | 
			
		||||
			IRC_WriteStrChannelPrefix( Client, Channel, Origin, false, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args );
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty( Client, 1 );
 | 
			
		||||
	return CONNECTED;
 | 
			
		||||
} /* Channel_Mode */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_AWAY( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
@@ -629,10 +627,11 @@ IRC_AWAY( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
} /* IRC_AWAY */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL BOOLEAN
 | 
			
		||||
Add_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern )
 | 
			
		||||
LOCAL bool
 | 
			
		||||
Add_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
 | 
			
		||||
{
 | 
			
		||||
	CHAR *mask;
 | 
			
		||||
	char *mask;
 | 
			
		||||
	bool already;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Channel != NULL );
 | 
			
		||||
@@ -640,15 +639,21 @@ Add_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern )
 | 
			
		||||
 | 
			
		||||
	mask = Lists_MakeMask( Pattern );
 | 
			
		||||
 | 
			
		||||
	if( ! Lists_AddInvited( Prefix, mask, Channel, FALSE )) return CONNECTED;
 | 
			
		||||
	already = Lists_IsInviteEntry( mask, Channel );
 | 
			
		||||
	
 | 
			
		||||
	if( ! Lists_AddInvited( mask, Channel, false )) return CONNECTED;
 | 
			
		||||
	
 | 
			
		||||
	if(( Client_Type( Prefix ) == CLIENT_SERVER ) && ( already == true)) return CONNECTED;
 | 
			
		||||
 | 
			
		||||
	return Send_ListChange( "+I", Prefix, Client, Channel, mask );
 | 
			
		||||
} /* Add_Invite */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL BOOLEAN
 | 
			
		||||
Add_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern )
 | 
			
		||||
LOCAL bool
 | 
			
		||||
Add_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
 | 
			
		||||
{
 | 
			
		||||
	CHAR *mask;
 | 
			
		||||
	char *mask;
 | 
			
		||||
	bool already;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Channel != NULL );
 | 
			
		||||
@@ -656,15 +661,20 @@ Add_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern )
 | 
			
		||||
 | 
			
		||||
	mask = Lists_MakeMask( Pattern );
 | 
			
		||||
 | 
			
		||||
	if( ! Lists_AddBanned( Prefix, mask, Channel )) return CONNECTED;
 | 
			
		||||
	already = Lists_IsBanEntry( mask, Channel );
 | 
			
		||||
 | 
			
		||||
	if( ! Lists_AddBanned( mask, Channel )) return CONNECTED;
 | 
			
		||||
 | 
			
		||||
	if(( Client_Type( Prefix ) == CLIENT_SERVER ) && ( already == true)) return CONNECTED;
 | 
			
		||||
 | 
			
		||||
	return Send_ListChange( "+b", Prefix, Client, Channel, mask );
 | 
			
		||||
} /* Add_Ban */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL BOOLEAN
 | 
			
		||||
Del_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern )
 | 
			
		||||
LOCAL bool
 | 
			
		||||
Del_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
 | 
			
		||||
{
 | 
			
		||||
	CHAR *mask;
 | 
			
		||||
	char *mask;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Channel != NULL );
 | 
			
		||||
@@ -676,10 +686,10 @@ Del_Invite( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern )
 | 
			
		||||
} /* Del_Invite */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL BOOLEAN
 | 
			
		||||
Del_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern )
 | 
			
		||||
LOCAL bool
 | 
			
		||||
Del_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Pattern )
 | 
			
		||||
{
 | 
			
		||||
	CHAR *mask;
 | 
			
		||||
	char *mask;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Channel != NULL );
 | 
			
		||||
@@ -691,25 +701,25 @@ Del_Ban( CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Pattern )
 | 
			
		||||
} /* Del_Ban */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL BOOLEAN
 | 
			
		||||
Send_ListChange( CHAR *Mode, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, CHAR *Mask )
 | 
			
		||||
LOCAL bool
 | 
			
		||||
Send_ListChange( char *Mode, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, char *Mask )
 | 
			
		||||
{
 | 
			
		||||
	/* Bestaetigung an Client schicken & andere Server sowie Channel-User informieren */
 | 
			
		||||
 | 
			
		||||
	BOOLEAN ok;
 | 
			
		||||
	bool ok;
 | 
			
		||||
 | 
			
		||||
	if( Client_Type( Client ) == CLIENT_USER )
 | 
			
		||||
	{
 | 
			
		||||
		/* Bestaetigung an Client */
 | 
			
		||||
		ok = IRC_WriteStrClientPrefix( Client, Prefix, "MODE %s %s %s", Channel_Name( Channel ), Mode, Mask );
 | 
			
		||||
	}
 | 
			
		||||
	else ok = TRUE;
 | 
			
		||||
	else ok = true;
 | 
			
		||||
 | 
			
		||||
	/* an andere Server */
 | 
			
		||||
	IRC_WriteStrServersPrefix( Client, Prefix, "MODE %s %s %s", Channel_Name( Channel ), Mode, Mask );
 | 
			
		||||
 | 
			
		||||
	/* und lokale User im Channel */
 | 
			
		||||
	IRC_WriteStrChannelPrefix( Client, Channel, Prefix, FALSE, "MODE %s %s %s", Channel_Name( Channel ), Mode, Mask );
 | 
			
		||||
	IRC_WriteStrChannelPrefix( Client, Channel, Prefix, false, "MODE %s %s %s", Channel_Name( Channel ), Mode, Mask );
 | 
			
		||||
	
 | 
			
		||||
	return ok;
 | 
			
		||||
} /* Send_ListChange */
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: irc-mode.h,v 1.5 2002/12/12 12:23:43 alex Exp $
 | 
			
		||||
 * $Id: irc-mode.h,v 1.6 2005/03/19 18:43:48 fw Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * IRC commands for mode changes (header)
 | 
			
		||||
 */
 | 
			
		||||
@@ -18,8 +18,8 @@
 | 
			
		||||
#define __irc_mode_h__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN IRC_MODE PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_AWAY PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_MODE PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_AWAY PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 * Copyright (c)2001-2005 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
@@ -14,17 +14,17 @@
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: irc-op.c,v 1.11 2002/12/12 12:24:18 alex Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: irc-op.c,v 1.15 2005/04/27 07:39:18 alex Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "client.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "irc-write.h"
 | 
			
		||||
#include "lists.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
@@ -35,7 +35,7 @@ static char UNUSED id[] = "$Id: irc-op.c,v 1.11 2002/12/12 12:24:18 alex Exp $";
 | 
			
		||||
#include "irc-op.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_KICK( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *target, *from;
 | 
			
		||||
@@ -59,24 +59,24 @@ IRC_KICK( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
} /* IRC_KICK */	
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_INVITE( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CHANNEL *chan;
 | 
			
		||||
	CLIENT *target, *from;
 | 
			
		||||
	BOOLEAN remember = FALSE;
 | 
			
		||||
	bool remember = false;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
 | 
			
		||||
	/* Falsche Anzahl Parameter? */
 | 
			
		||||
	/* Wrong number of parameters? */
 | 
			
		||||
	if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
 | 
			
		||||
	if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
 | 
			
		||||
	else from = Client;
 | 
			
		||||
	if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
 | 
			
		||||
	
 | 
			
		||||
	/* User suchen */
 | 
			
		||||
	/* Search user */
 | 
			
		||||
	target = Client_Search( Req->argv[0] );
 | 
			
		||||
	if(( ! target ) || ( Client_Type( target ) != CLIENT_USER )) return IRC_WriteStrClient( from, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
 | 
			
		||||
 | 
			
		||||
@@ -84,36 +84,38 @@ IRC_INVITE( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
 | 
			
		||||
	if( chan )
 | 
			
		||||
	{
 | 
			
		||||
		/* Der Channel existiert bereits; ist der User Mitglied? */
 | 
			
		||||
		/* Channel exists. Is the user a valid member of the channel? */
 | 
			
		||||
		if( ! Channel_IsMemberOf( chan, from )) return IRC_WriteStrClient( from, ERR_NOTONCHANNEL_MSG, Client_ID( Client ), Req->argv[1] );
 | 
			
		||||
 | 
			
		||||
		/* Ist der Channel "invite-only"? */
 | 
			
		||||
		/* Is the channel "invite-only"? */
 | 
			
		||||
		if( strchr( Channel_Modes( chan ), 'i' ))
 | 
			
		||||
		{
 | 
			
		||||
			/* Ja. Der User muss Channel-Operator sein! */
 | 
			
		||||
			/* Yes. The user must be channel operator! */
 | 
			
		||||
			if( ! strchr( Channel_UserModes( chan, from ), 'o' )) return IRC_WriteStrClient( from, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( from ), Channel_Name( chan ));
 | 
			
		||||
			remember = TRUE;
 | 
			
		||||
			remember = true;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Ist der Ziel-User bereits Mitglied? */
 | 
			
		||||
		/* Is the target user already member of the channel? */
 | 
			
		||||
		if( Channel_IsMemberOf( chan, target )) return IRC_WriteStrClient( from, ERR_USERONCHANNEL_MSG, Client_ID( from ), Req->argv[0], Req->argv[1] );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Wenn der User gebanned ist, so muss das Invite auch gespeichert werden */
 | 
			
		||||
	if( Lists_CheckBanned( target, chan )) remember = TRUE;
 | 
			
		||||
		/* If the target user is banned on that channel: remember invite */
 | 
			
		||||
		if( Lists_CheckBanned( target, chan )) remember = true;
 | 
			
		||||
 | 
			
		||||
		if( remember )
 | 
			
		||||
		{
 | 
			
		||||
			/* We must memember this invite */
 | 
			
		||||
			if( ! Lists_AddInvited( Client_Mask( target ), chan, true)) return CONNECTED;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	Log( LOG_DEBUG, "User \"%s\" invites \"%s\" to \"%s\" ...", Client_Mask( from ), Req->argv[0], Req->argv[1] );
 | 
			
		||||
	if( remember )
 | 
			
		||||
	{
 | 
			
		||||
		if( ! Lists_AddInvited( from, Client_Mask( target ), chan, TRUE )) return CONNECTED;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/* an Ziel-Client forwarden ... */
 | 
			
		||||
	/* Inform target client */
 | 
			
		||||
	IRC_WriteStrClientPrefix( target, from, "INVITE %s %s", Req->argv[0], Req->argv[1] );
 | 
			
		||||
 | 
			
		||||
	if( Client_Conn( target ) > NONE )
 | 
			
		||||
	{
 | 
			
		||||
		/* lokaler Ziel-Client, Status-Code melden */
 | 
			
		||||
		/* The target user is local, so we have to send the status code */
 | 
			
		||||
		if( ! IRC_WriteStrClientPrefix( from, target, RPL_INVITING_MSG, Client_ID( from ), Req->argv[0], Req->argv[1] )) return DISCONNECTED;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: irc-op.h,v 1.3 2002/12/12 12:23:43 alex Exp $
 | 
			
		||||
 * $Id: irc-op.h,v 1.4 2005/03/19 18:43:48 fw Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * Channel operator commands (header)
 | 
			
		||||
 */
 | 
			
		||||
@@ -18,8 +18,8 @@
 | 
			
		||||
#define __irc_op_h__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN IRC_KICK PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_INVITE PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_KICK PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_INVITE PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: irc-oper.c,v 1.17 2002/12/31 16:10:55 alex Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: irc-oper.c,v 1.22 2005/06/12 18:02:09 fw Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
@@ -29,6 +29,7 @@ static char UNUSED id[] = "$Id: irc-oper.c,v 1.17 2002/12/31 16:10:55 alex Exp $
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
#include "irc-write.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "match.h"
 | 
			
		||||
#include "messages.h"
 | 
			
		||||
#include "parse.h"
 | 
			
		||||
 | 
			
		||||
@@ -36,10 +37,20 @@ static char UNUSED id[] = "$Id: irc-oper.c,v 1.17 2002/12/31 16:10:55 alex Exp $
 | 
			
		||||
#include "irc-oper.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
LOCAL bool
 | 
			
		||||
Bad_OperPass(CLIENT *Client, char *errtoken, char *errmsg)
 | 
			
		||||
{
 | 
			
		||||
	Log( LOG_WARNING, "Got invalid OPER from \"%s\": \"%s\" -- %s", Client_Mask( Client ),
 | 
			
		||||
										errtoken, errmsg);
 | 
			
		||||
	IRC_SetPenalty(Client, 3);
 | 
			
		||||
	return IRC_WriteStrClient( Client, ERR_PASSWDMISMATCH_MSG, Client_ID( Client ));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_OPER( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	INT i;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
@@ -53,17 +64,15 @@ IRC_OPER( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
		if( Conf_Oper[i].name[0] && Conf_Oper[i].pwd[0] && ( strcmp( Conf_Oper[i].name, Req->argv[0] ) == 0 )) break;
 | 
			
		||||
	}
 | 
			
		||||
	if( i >= Conf_Oper_Count )
 | 
			
		||||
	{
 | 
			
		||||
		Log( LOG_WARNING, "Got invalid OPER from \"%s\": Name \"%s\" not configured!", Client_Mask( Client ), Req->argv[0] );
 | 
			
		||||
		return IRC_WriteStrClient( Client, ERR_PASSWDMISMATCH_MSG, Client_ID( Client ));
 | 
			
		||||
	}
 | 
			
		||||
		return Bad_OperPass(Client, Req->argv[0], "not configured");
 | 
			
		||||
 | 
			
		||||
	/* Stimmt das Passwort? */
 | 
			
		||||
	if( strcmp( Conf_Oper[i].pwd, Req->argv[1] ) != 0 )
 | 
			
		||||
	{
 | 
			
		||||
		Log( LOG_WARNING, "Got invalid OPER from \"%s\": Bad password for \"%s\"!", Client_Mask( Client ), Conf_Oper[i].name );
 | 
			
		||||
		return IRC_WriteStrClient( Client, ERR_PASSWDMISMATCH_MSG, Client_ID( Client ));
 | 
			
		||||
	}
 | 
			
		||||
		return Bad_OperPass(Client, Conf_Oper[i].name, "Bad password");
 | 
			
		||||
 | 
			
		||||
	/* Authorized Mask? */
 | 
			
		||||
	if( Conf_Oper[i].mask && (! Match( Conf_Oper[i].mask, Client_Mask( Client ) )))
 | 
			
		||||
		return Bad_OperPass(Client, Conf_Oper[i].mask, "hostmask check failed" );
 | 
			
		||||
 | 
			
		||||
	if( ! Client_HasMode( Client, 'o' ))
 | 
			
		||||
	{
 | 
			
		||||
@@ -75,12 +84,12 @@ IRC_OPER( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
 | 
			
		||||
	if( ! Client_OperByMe( Client )) Log( LOG_NOTICE|LOG_snotice, "Got valid OPER from \"%s\", user is an IRC operator now.", Client_Mask( Client ));
 | 
			
		||||
 | 
			
		||||
	Client_SetOperByMe( Client, TRUE );
 | 
			
		||||
	Client_SetOperByMe( Client, true);
 | 
			
		||||
	return IRC_WriteStrClient( Client, RPL_YOUREOPER_MSG, Client_ID( Client ));
 | 
			
		||||
} /* IRC_OPER */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_DIE( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	/* Shut down server */
 | 
			
		||||
@@ -95,12 +104,12 @@ IRC_DIE( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
 | 
			
		||||
	Log( LOG_NOTICE|LOG_snotice, "Got DIE command from \"%s\" ...", Client_Mask( Client ));
 | 
			
		||||
	NGIRCd_SignalQuit = TRUE;
 | 
			
		||||
	NGIRCd_SignalQuit = true;
 | 
			
		||||
	return CONNECTED;
 | 
			
		||||
} /* IRC_DIE */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_REHASH( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	/* Reload configuration file */
 | 
			
		||||
@@ -115,13 +124,13 @@ IRC_REHASH( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
 | 
			
		||||
	Log( LOG_NOTICE|LOG_snotice, "Got REHASH command from \"%s\" ...", Client_Mask( Client ));
 | 
			
		||||
	NGIRCd_SignalRehash = TRUE;
 | 
			
		||||
	NGIRCd_SignalRehash = true;
 | 
			
		||||
	
 | 
			
		||||
	return CONNECTED;
 | 
			
		||||
} /* IRC_REHASH */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_RESTART( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	/* Restart IRC server (fork a new process) */
 | 
			
		||||
@@ -136,12 +145,12 @@ IRC_RESTART( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
 | 
			
		||||
	Log( LOG_NOTICE|LOG_snotice, "Got RESTART command from \"%s\" ...", Client_Mask( Client ));
 | 
			
		||||
	NGIRCd_SignalRestart = TRUE;
 | 
			
		||||
	NGIRCd_SignalRestart = true;
 | 
			
		||||
	return CONNECTED;
 | 
			
		||||
} /* IRC_RESTART */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_CONNECT(CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	/* Connect configured or new server */
 | 
			
		||||
@@ -174,7 +183,7 @@ IRC_CONNECT(CLIENT *Client, REQUEST *Req )
 | 
			
		||||
} /* IRC_CONNECT */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_DISCONNECT(CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	/* Disconnect and disable configured server */
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: irc-oper.h,v 1.10 2002/12/31 16:11:06 alex Exp $
 | 
			
		||||
 * $Id: irc-oper.h,v 1.11 2005/03/19 18:43:48 fw Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * IRC operator commands (header)
 | 
			
		||||
 */
 | 
			
		||||
@@ -18,12 +18,12 @@
 | 
			
		||||
#define __irc_oper_h__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN IRC_OPER PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_DIE PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_REHASH PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_RESTART PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_CONNECT PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_DISCONNECT PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_OPER PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_DIE PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_REHASH PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_RESTART PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_CONNECT PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_DISCONNECT PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -14,14 +14,16 @@
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: irc-server.c,v 1.32 2003/04/20 23:09:26 alex Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: irc-server.c,v 1.38 2005/03/19 18:43:49 fw Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <strings.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "resolve.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "conn-zip.h"
 | 
			
		||||
@@ -29,6 +31,7 @@ static char UNUSED id[] = "$Id: irc-server.c,v 1.32 2003/04/20 23:09:26 alex Exp
 | 
			
		||||
#include "client.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
#include "irc-write.h"
 | 
			
		||||
#include "lists.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "messages.h"
 | 
			
		||||
#include "parse.h"
 | 
			
		||||
@@ -38,15 +41,15 @@ static char UNUSED id[] = "$Id: irc-server.c,v 1.32 2003/04/20 23:09:26 alex Exp
 | 
			
		||||
#include "irc-server.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_SERVER( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CHAR str[LINE_LEN], *ptr, *modes, *topic;
 | 
			
		||||
	char str[LINE_LEN], *ptr, *modes, *topic;
 | 
			
		||||
	CLIENT *from, *c, *cl;
 | 
			
		||||
	CL2CHAN *cl2chan;
 | 
			
		||||
	INT max_hops, i;
 | 
			
		||||
	int max_hops, i;
 | 
			
		||||
	CHANNEL *chan;
 | 
			
		||||
	BOOLEAN ok;
 | 
			
		||||
	bool ok;
 | 
			
		||||
	CONN_ID con;
 | 
			
		||||
	
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
@@ -69,14 +72,14 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
		{
 | 
			
		||||
			/* Server ist nicht konfiguriert! */
 | 
			
		||||
			Log( LOG_ERR, "Connection %d: Server \"%s\" not configured here!", Client_Conn( Client ), Req->argv[0] );
 | 
			
		||||
			Conn_Close( Client_Conn( Client ), NULL, "Server not configured here", TRUE );
 | 
			
		||||
			Conn_Close( Client_Conn( Client ), NULL, "Server not configured here", true);
 | 
			
		||||
			return DISCONNECTED;
 | 
			
		||||
		}
 | 
			
		||||
		if( strcmp( Client_Password( Client ), Conf_Server[i].pwd_in ) != 0 )
 | 
			
		||||
		{
 | 
			
		||||
			/* Falsches Passwort */
 | 
			
		||||
			Log( LOG_ERR, "Connection %d: Got bad password from server \"%s\"!", Client_Conn( Client ), Req->argv[0] );
 | 
			
		||||
			Conn_Close( Client_Conn( Client ), NULL, "Bad password", TRUE );
 | 
			
		||||
			Conn_Close( Client_Conn( Client ), NULL, "Bad password", true);
 | 
			
		||||
			return DISCONNECTED;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
@@ -94,12 +97,12 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
		if( Client_Token( Client ) != TOKEN_OUTBOUND )
 | 
			
		||||
		{
 | 
			
		||||
			/* Eingehende Verbindung: Unseren SERVER- und PASS-Befehl senden */
 | 
			
		||||
			ok = TRUE;
 | 
			
		||||
			if( ! IRC_WriteStrClient( Client, "PASS %s %s", Conf_Server[i].pwd_out, NGIRCd_ProtoID )) ok = FALSE;
 | 
			
		||||
			ok = true;
 | 
			
		||||
			if( ! IRC_WriteStrClient( Client, "PASS %s %s", Conf_Server[i].pwd_out, NGIRCd_ProtoID )) ok = false;
 | 
			
		||||
			else ok = IRC_WriteStrClient( Client, "SERVER %s 1 :%s", Conf_ServerName, Conf_ServerInfo );
 | 
			
		||||
			if( ! ok )
 | 
			
		||||
			{
 | 
			
		||||
				Conn_Close( con, "Unexpected server behavior!", NULL, FALSE );
 | 
			
		||||
				Conn_Close( con, "Unexpected server behavior!", NULL, false );
 | 
			
		||||
				return DISCONNECTED;
 | 
			
		||||
			}
 | 
			
		||||
			Client_SetIntroducer( Client, Client );
 | 
			
		||||
@@ -117,14 +120,14 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
		Client_SetType( Client, CLIENT_SERVER );
 | 
			
		||||
		Conf_SetServer( i, con );
 | 
			
		||||
 | 
			
		||||
#ifdef USE_ZLIB
 | 
			
		||||
#ifdef ZLIB
 | 
			
		||||
		/* Kompression initialisieren, wenn erforderlich */
 | 
			
		||||
		if( strchr( Client_Flags( Client ), 'Z' ))
 | 
			
		||||
		{
 | 
			
		||||
			if( ! Zip_InitConn( con ))
 | 
			
		||||
			{
 | 
			
		||||
				/* Fehler! */
 | 
			
		||||
				Conn_Close( con, "Can't inizialize compression (zlib)!", NULL, FALSE );
 | 
			
		||||
				Conn_Close( con, "Can't inizialize compression (zlib)!", NULL, false );
 | 
			
		||||
				return DISCONNECTED;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
@@ -182,6 +185,9 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
			/* Send CHANINFO if the peer supports it */
 | 
			
		||||
			if( strchr( Client_Flags( Client ), 'C' ))
 | 
			
		||||
			{
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
				Log( LOG_DEBUG, "Sending CHANINFO commands ..." );
 | 
			
		||||
#endif
 | 
			
		||||
				modes = Channel_Modes( chan );
 | 
			
		||||
				topic = Channel_Topic( chan );
 | 
			
		||||
 | 
			
		||||
@@ -238,6 +244,18 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
				if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
#ifdef IRCPLUS
 | 
			
		||||
			if( strchr( Client_Flags( Client ), 'L' ))
 | 
			
		||||
			{
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
				Log( LOG_DEBUG, "Synchronizing INVITE- and BAN-lists ..." );
 | 
			
		||||
#endif
 | 
			
		||||
				/* Synchronize INVITE- and BAN-lists */
 | 
			
		||||
				if( ! Lists_SendInvites( Client )) return DISCONNECTED;
 | 
			
		||||
				if( ! Lists_SendBans( Client )) return DISCONNECTED;
 | 
			
		||||
			}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
			/* naechsten Channel suchen */
 | 
			
		||||
			chan = Channel_Next( chan );
 | 
			
		||||
		}
 | 
			
		||||
@@ -263,17 +281,17 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
		{
 | 
			
		||||
			/* Hm, Server, der diesen einfuehrt, ist nicht bekannt!? */
 | 
			
		||||
			Log( LOG_ALERT, "Unknown ID in prefix of SERVER: \"%s\"! (on connection %d)", Req->prefix, Client_Conn( Client ));
 | 
			
		||||
			Conn_Close( Client_Conn( Client ), NULL, "Unknown ID in prefix of SERVER", TRUE );
 | 
			
		||||
			Conn_Close( Client_Conn( Client ), NULL, "Unknown ID in prefix of SERVER", true);
 | 
			
		||||
			return DISCONNECTED;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Neue Client-Struktur anlegen */
 | 
			
		||||
		c = Client_NewRemoteServer( Client, Req->argv[0], from, atoi( Req->argv[1] ), atoi( Req->argv[2] ), ptr, TRUE );
 | 
			
		||||
		c = Client_NewRemoteServer( Client, Req->argv[0], from, atoi( Req->argv[1] ), atoi( Req->argv[2] ), ptr, true);
 | 
			
		||||
		if( ! c )
 | 
			
		||||
		{
 | 
			
		||||
			/* Neue Client-Struktur konnte nicht angelegt werden */
 | 
			
		||||
			Log( LOG_ALERT, "Can't create client structure for server! (on connection %d)", Client_Conn( Client ));
 | 
			
		||||
			Conn_Close( Client_Conn( Client ), NULL, "Can't allocate client structure for remote server", TRUE );
 | 
			
		||||
			Conn_Close( Client_Conn( Client ), NULL, "Can't allocate client structure for remote server", true);
 | 
			
		||||
			return DISCONNECTED;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@@ -291,11 +309,11 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
} /* IRC_SERVER */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_NJOIN( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CHAR nick_in[COMMAND_LEN], nick_out[COMMAND_LEN], *channame, *ptr, modes[8];
 | 
			
		||||
	BOOLEAN is_op, is_voiced;
 | 
			
		||||
	char nick_in[COMMAND_LEN], nick_out[COMMAND_LEN], *channame, *ptr, modes[8];
 | 
			
		||||
	bool is_op, is_voiced;
 | 
			
		||||
	CHANNEL *chan;
 | 
			
		||||
	CLIENT *c;
 | 
			
		||||
	
 | 
			
		||||
@@ -312,13 +330,13 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	ptr = strtok( nick_in, "," );
 | 
			
		||||
	while( ptr )
 | 
			
		||||
	{
 | 
			
		||||
		is_op = is_voiced = FALSE;
 | 
			
		||||
		is_op = is_voiced = false;
 | 
			
		||||
		
 | 
			
		||||
		/* Prefixe abschneiden */
 | 
			
		||||
		while(( *ptr == '@' ) || ( *ptr == '+' ))
 | 
			
		||||
		{
 | 
			
		||||
			if( *ptr == '@' ) is_op = TRUE;
 | 
			
		||||
			if( *ptr == '+' ) is_voiced = TRUE;
 | 
			
		||||
			if( *ptr == '@' ) is_op = true;
 | 
			
		||||
			if( *ptr == '+' ) is_voiced = true;
 | 
			
		||||
			ptr++;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@@ -333,17 +351,19 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
			if( is_voiced ) Channel_UserModeAdd( chan, c, 'v' );
 | 
			
		||||
 | 
			
		||||
			/* im Channel bekannt machen */
 | 
			
		||||
			IRC_WriteStrChannelPrefix( Client, chan, c, FALSE, "JOIN :%s", channame );
 | 
			
		||||
			IRC_WriteStrChannelPrefix( Client, chan, c, false, "JOIN :%s", channame );
 | 
			
		||||
 | 
			
		||||
			/* Channel-User-Modes setzen */
 | 
			
		||||
			strlcpy( modes, Channel_UserModes( chan, c ), sizeof( modes ));
 | 
			
		||||
			if( modes[0] )
 | 
			
		||||
			{
 | 
			
		||||
				/* Modes im Channel bekannt machen */
 | 
			
		||||
				IRC_WriteStrChannelPrefix( Client, chan, Client, FALSE, "MODE %s +%s %s", channame, modes, Client_ID( c ));
 | 
			
		||||
				IRC_WriteStrChannelPrefix( Client, chan, Client, false, "MODE %s +%s %s", channame, modes, Client_ID( c ));
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if( nick_out[0] != '\0' ) strlcat( nick_out, ",", sizeof( nick_out ));
 | 
			
		||||
			if( is_op ) strlcat( nick_out, "@", sizeof( nick_out ));
 | 
			
		||||
			if( is_voiced ) strlcat( nick_out, "+", sizeof( nick_out ));
 | 
			
		||||
			strlcat( nick_out, ptr, sizeof( nick_out ));
 | 
			
		||||
		}
 | 
			
		||||
		else Log( LOG_ERR, "Got NJOIN for unknown nick \"%s\" for channel \"%s\"!", ptr, channame );
 | 
			
		||||
@@ -359,11 +379,11 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
} /* IRC_NJOIN */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_SQUIT( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *target;
 | 
			
		||||
	CHAR msg[LINE_LEN + 64];
 | 
			
		||||
	char msg[LINE_LEN + 64];
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
@@ -391,14 +411,14 @@ IRC_SQUIT( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	if( Client_Conn( target ) > NONE )
 | 
			
		||||
	{
 | 
			
		||||
		/* dieser Server hat die Connection */
 | 
			
		||||
		if( Req->argv[1][0] ) Conn_Close( Client_Conn( target ), msg, Req->argv[1], TRUE );
 | 
			
		||||
		else Conn_Close( Client_Conn( target ), msg, NULL, TRUE );
 | 
			
		||||
		if( Req->argv[1][0] ) Conn_Close( Client_Conn( target ), msg, Req->argv[1], true);
 | 
			
		||||
		else Conn_Close( Client_Conn( target ), msg, NULL, true);
 | 
			
		||||
		return DISCONNECTED;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		/* Verbindung hielt anderer Server */
 | 
			
		||||
		Client_Destroy( target, msg, Req->argv[1], FALSE );
 | 
			
		||||
		Client_Destroy( target, msg, Req->argv[1], false );
 | 
			
		||||
		return CONNECTED;
 | 
			
		||||
	}
 | 
			
		||||
} /* IRC_SQUIT */
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: irc-server.h,v 1.4 2002/12/12 12:23:43 alex Exp $
 | 
			
		||||
 * $Id: irc-server.h,v 1.5 2005/03/19 18:43:49 fw Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * IRC commands for server links (header)
 | 
			
		||||
 */
 | 
			
		||||
@@ -18,9 +18,9 @@
 | 
			
		||||
#define __irc_server_h__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN IRC_SERVER PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_NJOIN PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_SQUIT PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_SERVER PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_NJOIN PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_SQUIT PARAMS((CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 * Copyright (c)2001-2005 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
@@ -14,18 +14,22 @@
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: irc-write.c,v 1.14 2002/12/30 17:15:42 alex Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: irc-write.c,v 1.18 2005/04/27 07:39:18 alex Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <stdarg.h>
 | 
			
		||||
#ifdef PROTOTYPES
 | 
			
		||||
#	include <stdarg.h>
 | 
			
		||||
#else
 | 
			
		||||
#	include <varargs.h>
 | 
			
		||||
#endif
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "conn-func.h"
 | 
			
		||||
#include "client.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "irc-write.h"
 | 
			
		||||
@@ -35,22 +39,22 @@ static char UNUSED id[] = "$Id: irc-write.c,v 1.14 2002/12/30 17:15:42 alex Exp
 | 
			
		||||
#define SEND_TO_SERVER 2
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL CHAR *Get_Prefix PARAMS(( CLIENT *Target, CLIENT *Client ));
 | 
			
		||||
LOCAL char *Get_Prefix PARAMS(( CLIENT *Target, CLIENT *Client ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef PROTOTYPES
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
IRC_WriteStrClient( CLIENT *Client, CHAR *Format, ... )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_WriteStrClient( CLIENT *Client, char *Format, ... )
 | 
			
		||||
#else
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_WriteStrClient( Client, Format, va_alist )
 | 
			
		||||
CLIENT *Client;
 | 
			
		||||
CHAR *Format;
 | 
			
		||||
char *Format;
 | 
			
		||||
va_dcl
 | 
			
		||||
#endif
 | 
			
		||||
{
 | 
			
		||||
	CHAR buffer[1000];
 | 
			
		||||
	BOOLEAN ok = CONNECTED;
 | 
			
		||||
	char buffer[1000];
 | 
			
		||||
	bool ok = CONNECTED;
 | 
			
		||||
	va_list ap;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
@@ -72,20 +76,20 @@ va_dcl
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef PROTOTYPES
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, CHAR *Format, ... )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, char *Format, ... )
 | 
			
		||||
#else
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_WriteStrClientPrefix( Client, Prefix, Format, va_alist )
 | 
			
		||||
CLIENT *Client;
 | 
			
		||||
CLIENT *Prefix;
 | 
			
		||||
CHAR *Format;
 | 
			
		||||
char *Format;
 | 
			
		||||
va_dcl
 | 
			
		||||
#endif
 | 
			
		||||
{
 | 
			
		||||
	/* Text an Clients, lokal bzw. remote, senden. */
 | 
			
		||||
 | 
			
		||||
	CHAR buffer[1000];
 | 
			
		||||
	char buffer[1000];
 | 
			
		||||
	va_list ap;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
@@ -105,19 +109,19 @@ va_dcl
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef PROTOTYPES
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
IRC_WriteStrChannel( CLIENT *Client, CHANNEL *Chan, BOOLEAN Remote, CHAR *Format, ... )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_WriteStrChannel( CLIENT *Client, CHANNEL *Chan, bool Remote, char *Format, ... )
 | 
			
		||||
#else
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_WriteStrChannel( Client, Chan, Remote, Format, va_alist )
 | 
			
		||||
CLIENT *Client;
 | 
			
		||||
CHANNEL *Chan;
 | 
			
		||||
BOOLEAN Remote;
 | 
			
		||||
CHAR *Format;
 | 
			
		||||
bool Remote;
 | 
			
		||||
char *Format;
 | 
			
		||||
va_dcl
 | 
			
		||||
#endif
 | 
			
		||||
{
 | 
			
		||||
	CHAR buffer[1000];
 | 
			
		||||
	char buffer[1000];
 | 
			
		||||
	va_list ap;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
@@ -136,21 +140,21 @@ va_dcl
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef PROTOTYPES
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, bool Remote, char *Format, ... )
 | 
			
		||||
#else
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_WriteStrChannelPrefix( Client, Chan, Prefix, Remote, Format, va_alist )
 | 
			
		||||
CLIENT *Client;
 | 
			
		||||
CHANNEL *Chan;
 | 
			
		||||
CLIENT *Prefix;
 | 
			
		||||
BOOLEAN Remote;
 | 
			
		||||
CHAR *Format;
 | 
			
		||||
bool Remote;
 | 
			
		||||
char *Format;
 | 
			
		||||
va_dcl
 | 
			
		||||
#endif
 | 
			
		||||
{
 | 
			
		||||
	BOOLEAN ok = CONNECTED;
 | 
			
		||||
	CHAR buffer[1000];
 | 
			
		||||
	bool ok = CONNECTED;
 | 
			
		||||
	char buffer[1000];
 | 
			
		||||
	CL2CHAN *cl2chan;
 | 
			
		||||
	CONN_ID conn;
 | 
			
		||||
	CLIENT *c;
 | 
			
		||||
@@ -212,17 +216,17 @@ va_dcl
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef PROTOTYPES
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
IRC_WriteStrServers( CLIENT *ExceptOf, CHAR *Format, ... )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
IRC_WriteStrServers( CLIENT *ExceptOf, char *Format, ... )
 | 
			
		||||
#else
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
GLOBAL void
 | 
			
		||||
IRC_WriteStrServers( ExceptOf, Format, va_alist )
 | 
			
		||||
CLIENT *ExceptOf;
 | 
			
		||||
CHAR *Format;
 | 
			
		||||
char *Format;
 | 
			
		||||
va_dcl
 | 
			
		||||
#endif
 | 
			
		||||
{
 | 
			
		||||
	CHAR buffer[1000];
 | 
			
		||||
	char buffer[1000];
 | 
			
		||||
	va_list ap;
 | 
			
		||||
 | 
			
		||||
	assert( Format != NULL );
 | 
			
		||||
@@ -241,18 +245,18 @@ va_dcl
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef PROTOTYPES
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *Format, ... )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, char *Format, ... )
 | 
			
		||||
#else
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
GLOBAL void
 | 
			
		||||
IRC_WriteStrServersPrefix( ExceptOf, Prefix, Format, va_alist )
 | 
			
		||||
CLIENT *ExceptOf;
 | 
			
		||||
CLIENT *Prefix;
 | 
			
		||||
CHAR *Format;
 | 
			
		||||
char *Format;
 | 
			
		||||
va_dcl
 | 
			
		||||
#endif
 | 
			
		||||
{
 | 
			
		||||
	CHAR buffer[1000];
 | 
			
		||||
	char buffer[1000];
 | 
			
		||||
	va_list ap;
 | 
			
		||||
 | 
			
		||||
	assert( Format != NULL );
 | 
			
		||||
@@ -271,19 +275,19 @@ va_dcl
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
#ifdef PROTOTYPES
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
IRC_WriteStrServersPrefixFlag( CLIENT *ExceptOf, CLIENT *Prefix, CHAR Flag, CHAR *Format, ... )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
IRC_WriteStrServersPrefixFlag( CLIENT *ExceptOf, CLIENT *Prefix, char Flag, char *Format, ... )
 | 
			
		||||
#else
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
GLOBAL void
 | 
			
		||||
IRC_WriteStrServersPrefixFlag( ExceptOf, Prefix, Flag, Format, va_alist )
 | 
			
		||||
CLIENT *ExceptOf;
 | 
			
		||||
CLIENT *Prefix;
 | 
			
		||||
CHAR Flag;
 | 
			
		||||
CHAR *Format;
 | 
			
		||||
char Flag;
 | 
			
		||||
char *Format;
 | 
			
		||||
va_dcl
 | 
			
		||||
#endif
 | 
			
		||||
{
 | 
			
		||||
	CHAR buffer[1000];
 | 
			
		||||
	char buffer[1000];
 | 
			
		||||
	CLIENT *c;
 | 
			
		||||
	va_list ap;
 | 
			
		||||
	
 | 
			
		||||
@@ -312,21 +316,21 @@ va_dcl
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef PROTOTYPES
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, bool Remote, char *Format, ... )
 | 
			
		||||
#else
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_WriteStrRelatedPrefix( Client, Prefix, Remote, Format, va_alist )
 | 
			
		||||
CLIENT *Client;
 | 
			
		||||
CLIENT *Prefix;
 | 
			
		||||
BOOLEAN Remote;
 | 
			
		||||
CHAR *Format;
 | 
			
		||||
bool Remote;
 | 
			
		||||
char *Format;
 | 
			
		||||
va_dcl
 | 
			
		||||
#endif
 | 
			
		||||
{
 | 
			
		||||
	BOOLEAN ok = CONNECTED;
 | 
			
		||||
	bool ok = CONNECTED;
 | 
			
		||||
	CL2CHAN *chan_cl2chan, *cl2chan;
 | 
			
		||||
	CHAR buffer[1000];
 | 
			
		||||
	char buffer[1000];
 | 
			
		||||
	CHANNEL *chan;
 | 
			
		||||
	CONN_ID conn;
 | 
			
		||||
	va_list ap;
 | 
			
		||||
@@ -395,7 +399,22 @@ va_dcl
 | 
			
		||||
} /* IRC_WriteStrRelatedPrefix */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL CHAR *
 | 
			
		||||
GLOBAL void
 | 
			
		||||
IRC_SetPenalty( CLIENT *Client, int Seconds )
 | 
			
		||||
{
 | 
			
		||||
	CONN_ID c;
 | 
			
		||||
	
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Seconds > 0 );
 | 
			
		||||
	
 | 
			
		||||
	if( Client_Type( Client ) == CLIENT_SERVER ) return;
 | 
			
		||||
	
 | 
			
		||||
	c = Client_Conn( Client );
 | 
			
		||||
	if( c > NONE ) Conn_SetPenalty( c, Seconds );		
 | 
			
		||||
} /* IRC_SetPenalty */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL char *
 | 
			
		||||
Get_Prefix( CLIENT *Target, CLIENT *Client )
 | 
			
		||||
{
 | 
			
		||||
	assert( Target != NULL );
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: irc-write.h,v 1.5 2002/12/12 12:23:43 alex Exp $
 | 
			
		||||
 * $Id: irc-write.h,v 1.7 2005/03/19 18:43:49 fw Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * Sending IRC commands over the network (header)
 | 
			
		||||
 */
 | 
			
		||||
@@ -18,17 +18,19 @@
 | 
			
		||||
#define __irc_write_h__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN IRC_WriteStrClient PARAMS((CLIENT *Client, CHAR *Format, ... ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_WriteStrClientPrefix PARAMS((CLIENT *Client, CLIENT *Prefix, CHAR *Format, ... ));
 | 
			
		||||
GLOBAL bool IRC_WriteStrClient PARAMS(( CLIENT *Client, char *Format, ... ));
 | 
			
		||||
GLOBAL bool IRC_WriteStrClientPrefix PARAMS(( CLIENT *Client, CLIENT *Prefix, char *Format, ... ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN IRC_WriteStrChannel PARAMS((CLIENT *Client, CHANNEL *Chan, BOOLEAN Remote, CHAR *Format, ... ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_WriteStrChannelPrefix PARAMS((CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... ));
 | 
			
		||||
GLOBAL bool IRC_WriteStrChannel PARAMS(( CLIENT *Client, CHANNEL *Chan, bool Remote, char *Format, ... ));
 | 
			
		||||
GLOBAL bool IRC_WriteStrChannelPrefix PARAMS(( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, bool Remote, char *Format, ... ));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID IRC_WriteStrServers PARAMS((CLIENT *ExceptOf, CHAR *Format, ... ));
 | 
			
		||||
GLOBAL VOID IRC_WriteStrServersPrefix PARAMS((CLIENT *ExceptOf, CLIENT *Prefix, CHAR *Format, ... ));
 | 
			
		||||
GLOBAL VOID IRC_WriteStrServersPrefixFlag PARAMS((CLIENT *ExceptOf, CLIENT *Prefix, CHAR Flag, CHAR *Format, ... ));
 | 
			
		||||
GLOBAL void IRC_WriteStrServers PARAMS(( CLIENT *ExceptOf, char *Format, ... ));
 | 
			
		||||
GLOBAL void IRC_WriteStrServersPrefix PARAMS(( CLIENT *ExceptOf, CLIENT *Prefix, char *Format, ... ));
 | 
			
		||||
GLOBAL void IRC_WriteStrServersPrefixFlag PARAMS(( CLIENT *ExceptOf, CLIENT *Prefix, char Flag, char *Format, ... ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN IRC_WriteStrRelatedPrefix PARAMS((CLIENT *Client, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... ));
 | 
			
		||||
GLOBAL bool IRC_WriteStrRelatedPrefix PARAMS(( CLIENT *Client, CLIENT *Prefix, bool Remote, char *Format, ... ));
 | 
			
		||||
 | 
			
		||||
GLOBAL void IRC_SetPenalty PARAMS(( CLIENT *Client, int Seconds ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										135
									
								
								src/ngircd/irc.c
									
									
									
									
									
								
							
							
						
						
									
										135
									
								
								src/ngircd/irc.c
									
									
									
									
									
								
							@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 * Copyright (c)2001-2004 Alexander Barton <alex@barton.de>
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
@@ -14,7 +14,7 @@
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: irc.c,v 1.120 2003/03/31 15:54:21 alex Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: irc.c,v 1.126.2.1 2005/08/02 23:08:27 alex Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
@@ -38,10 +38,10 @@ static char UNUSED id[] = "$Id: irc.c,v 1.120 2003/03/31 15:54:21 alex Exp $";
 | 
			
		||||
#include "irc.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL CHAR *Option_String PARAMS(( CONN_ID Idx ));
 | 
			
		||||
LOCAL char *Option_String PARAMS(( CONN_ID Idx ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_ERROR( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
@@ -54,66 +54,120 @@ IRC_ERROR( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
} /* IRC_ERROR */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
/**
 | 
			
		||||
 * Kill client on request.
 | 
			
		||||
 * This function implements the IRC command "KILL" wich is used to selectively
 | 
			
		||||
 * disconnect clients. It can be used by IRC operators and servers, for example
 | 
			
		||||
 * to "solve" nick collisions after netsplits.
 | 
			
		||||
 * Please note that this function is also called internally, without a real
 | 
			
		||||
 * KILL command beeing received over the network! Client is Client_ThisServer()
 | 
			
		||||
 * in this case. */
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_KILL( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *prefix, *c;
 | 
			
		||||
	CHAR reason[COMMAND_LEN];
 | 
			
		||||
	char reason[COMMAND_LEN], *msg;
 | 
			
		||||
	CONN_ID my_conn, conn;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
 | 
			
		||||
	/* Is the user an IRC operator? */
 | 
			
		||||
	if(( Client_Type( Client ) != CLIENT_SERVER ) && ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
 | 
			
		||||
	if(( Client_Type( Client ) != CLIENT_SERVER ) &&
 | 
			
		||||
	   ( ! Client_OperByMe( Client )))
 | 
			
		||||
	{
 | 
			
		||||
		/* The originator of the KILL is neither an IRC operator of
 | 
			
		||||
		 * this server nor a server. */
 | 
			
		||||
		return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG,
 | 
			
		||||
					   Client_ID( Client ));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Bad number of parameters? */
 | 
			
		||||
	if(( Req->argc != 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 | 
			
		||||
	if( Req->argc != 2 )
 | 
			
		||||
	{
 | 
			
		||||
		/* This command requires exactly 2 parameters! */
 | 
			
		||||
		return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
					   Client_ID( Client ), Req->command );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if( Req->prefix ) prefix = Client_Search( Req->prefix );
 | 
			
		||||
	else prefix = Client;
 | 
			
		||||
	if( ! prefix )
 | 
			
		||||
	{
 | 
			
		||||
		Log( LOG_WARNING, "Got KILL with invalid prefix: \"%s\"!", Req->prefix );
 | 
			
		||||
		Log( LOG_WARNING, "Got KILL with invalid prefix: \"%s\"!",
 | 
			
		||||
		     Req->prefix );
 | 
			
		||||
		prefix = Client_ThisServer( );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if( Client != Client_ThisServer( )) Log( LOG_NOTICE|LOG_snotice, "Got KILL command from \"%s\" for \"%s\": %s", Client_Mask( prefix ), Req->argv[0], Req->argv[1] );
 | 
			
		||||
	if( Client != Client_ThisServer( ))
 | 
			
		||||
	{
 | 
			
		||||
		/* This is a "real" KILL received from the network. */
 | 
			
		||||
		Log( LOG_NOTICE|LOG_snotice, "Got KILL command from \"%s\" for \"%s\": %s",
 | 
			
		||||
		     Client_Mask( prefix ), Req->argv[0], Req->argv[1] );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Build reason string */
 | 
			
		||||
	if( Client_Type( Client ) == CLIENT_USER ) snprintf( reason, sizeof( reason ), "KILLed by %s: %s", Client_ID( Client ), Req->argv[1] );
 | 
			
		||||
	else strlcpy( reason, Req->argv[1], sizeof( reason ));
 | 
			
		||||
	if( Client_Type( Client ) == CLIENT_USER )
 | 
			
		||||
	{
 | 
			
		||||
		/* Prefix the "reason" if the originator is a regular user,
 | 
			
		||||
		 * so users can't spoof KILLs of servers. */
 | 
			
		||||
		snprintf( reason, sizeof( reason ), "KILLed by %s: %s",
 | 
			
		||||
			  Client_ID( Client ), Req->argv[1] );
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
		strlcpy( reason, Req->argv[1], sizeof( reason ));
 | 
			
		||||
 | 
			
		||||
	/* Inform other servers */
 | 
			
		||||
	IRC_WriteStrServersPrefix( Client, prefix, "KILL %s :%s", Req->argv[0], reason );
 | 
			
		||||
	IRC_WriteStrServersPrefix( Client, prefix, "KILL %s :%s",
 | 
			
		||||
				   Req->argv[0], reason );
 | 
			
		||||
 | 
			
		||||
	/* Save ID of this connection */
 | 
			
		||||
	my_conn = Client_Conn( Client );
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	/* Do we host such a client? */
 | 
			
		||||
	c = Client_Search( Req->argv[0] );
 | 
			
		||||
	if( c )
 | 
			
		||||
	{
 | 
			
		||||
		/* Yes, there is such a client -- but is it a valid user? */
 | 
			
		||||
		if( Client_Type( c ) == CLIENT_SERVER ) IRC_WriteStrClient( Client, ERR_CANTKILLSERVER_MSG, Client_ID( Client ));
 | 
			
		||||
		else if( Client_Type( c ) != CLIENT_USER  )IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
 | 
			
		||||
		else
 | 
			
		||||
		if(( Client_Type( c ) != CLIENT_USER ) &&
 | 
			
		||||
		   ( Client_Type( c ) != CLIENT_GOTNICK ))
 | 
			
		||||
		{
 | 
			
		||||
			/* Kill user NOW! */
 | 
			
		||||
			conn = Client_Conn( c );
 | 
			
		||||
			Client_Destroy( c, NULL, reason, FALSE );
 | 
			
		||||
			if( conn != NONE ) Conn_Close( conn, NULL, reason, TRUE );
 | 
			
		||||
			/* Target of this KILL is not a regular user, this is
 | 
			
		||||
			 * invalid! So we ignore this case if we received a
 | 
			
		||||
			 * regular KILL from the network and try to kill the
 | 
			
		||||
			 * client/connection anyway (but log an error!) if the
 | 
			
		||||
			 * origin is the local server. */
 | 
			
		||||
 | 
			
		||||
			if( Client != Client_ThisServer( ))
 | 
			
		||||
			{
 | 
			
		||||
				/* Invalid KILL received from remote */
 | 
			
		||||
				if( Client_Type( c ) == CLIENT_SERVER )
 | 
			
		||||
					msg = ERR_CANTKILLSERVER_MSG;
 | 
			
		||||
				else
 | 
			
		||||
					msg = ERR_NOPRIVILEGES_MSG;
 | 
			
		||||
				return IRC_WriteStrClient( Client, msg,
 | 
			
		||||
					Client_ID( Client ));
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			Log( LOG_ERR, "Got KILL for invalid client type: %d, \"%s\"!",
 | 
			
		||||
			     Client_Type( c ), Req->argv[0] );
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Kill client NOW! */
 | 
			
		||||
		conn = Client_Conn( c );
 | 
			
		||||
		Client_Destroy( c, NULL, reason, false );
 | 
			
		||||
		if( conn > NONE )
 | 
			
		||||
			Conn_Close( conn, NULL, reason, true );
 | 
			
		||||
	}
 | 
			
		||||
	else Log( LOG_NOTICE, "Client with nick \"%s\" is unknown here.", Req->argv[0] );
 | 
			
		||||
	else
 | 
			
		||||
		Log( LOG_NOTICE, "Client with nick \"%s\" is unknown here.", Req->argv[0] );
 | 
			
		||||
 | 
			
		||||
	/* Are we still connected or were we killed, too? */
 | 
			
		||||
	if(( my_conn > NONE ) && ( Client_GetFromConn( my_conn ))) return CONNECTED;
 | 
			
		||||
	else return DISCONNECTED;
 | 
			
		||||
	if(( my_conn > NONE ) && ( Client_GetFromConn( my_conn )))
 | 
			
		||||
		return CONNECTED;
 | 
			
		||||
	else
 | 
			
		||||
		return DISCONNECTED;
 | 
			
		||||
} /* IRC_KILL */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_NOTICE( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *to, *from;
 | 
			
		||||
@@ -140,7 +194,7 @@ IRC_NOTICE( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
} /* IRC_NOTICE */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_PRIVMSG( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *cl, *from;
 | 
			
		||||
@@ -183,11 +237,12 @@ IRC_PRIVMSG( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
} /* IRC_PRIVMSG */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_TRACE( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *from, *target, *c;
 | 
			
		||||
	CONN_ID idx, idx2;
 | 
			
		||||
	char user[CLIENT_USER_LEN];
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
@@ -229,7 +284,9 @@ IRC_TRACE( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
			if( Client_Type( c ) == CLIENT_SERVER )
 | 
			
		||||
			{
 | 
			
		||||
				/* Server link */
 | 
			
		||||
				if( ! IRC_WriteStrClient( from, RPL_TRACESERVER_MSG, Client_ID( from ), Client_ID( c ), Client_Mask( c ), Option_String( Client_Conn( c )))) return DISCONNECTED;
 | 
			
		||||
				strlcpy( user, Client_User( c ), sizeof( user ));
 | 
			
		||||
				if( user[0] == '~' ) strlcpy( user, "unknown", sizeof( user ));
 | 
			
		||||
				if( ! IRC_WriteStrClient( from, RPL_TRACESERVER_MSG, Client_ID( from ), Client_ID( c ), user, Client_Hostname( c ), Client_Mask( Client_ThisServer( )), Option_String( Client_Conn( c )))) return DISCONNECTED;
 | 
			
		||||
			}
 | 
			
		||||
			if(( Client_Type( c ) == CLIENT_USER ) && ( strchr( Client_Modes( c ), 'o' )))
 | 
			
		||||
			{
 | 
			
		||||
@@ -240,14 +297,12 @@ IRC_TRACE( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
		c = Client_Next( c );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Some information about us */
 | 
			
		||||
	if( ! IRC_WriteStrClient( from, RPL_TRACESERVER_MSG, Client_ID( from ), Conf_ServerName, Client_Mask( Client_ThisServer( )), Option_String( Client_Conn( Client )))) return DISCONNECTED;
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty( Client, 3 );
 | 
			
		||||
	return IRC_WriteStrClient( from, RPL_TRACEEND_MSG, Client_ID( from ), Conf_ServerName, PACKAGE_NAME, PACKAGE_VERSION, NGIRCd_DebugLevel );
 | 
			
		||||
} /* IRC_TRACE */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_HELP( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	COMMAND *cmd;
 | 
			
		||||
@@ -264,20 +319,22 @@ IRC_HELP( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
		if( ! IRC_WriteStrClient( Client, "NOTICE %s :%s", Client_ID( Client ), cmd->name )) return DISCONNECTED;
 | 
			
		||||
		cmd++;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	IRC_SetPenalty( Client, 2 );
 | 
			
		||||
	return CONNECTED;
 | 
			
		||||
} /* IRC_HELP */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL CHAR *
 | 
			
		||||
LOCAL char *
 | 
			
		||||
Option_String( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
	STATIC CHAR option_txt[8];
 | 
			
		||||
	INT options;
 | 
			
		||||
	static char option_txt[8];
 | 
			
		||||
	int options;
 | 
			
		||||
 | 
			
		||||
	options = Conn_Options( Idx );
 | 
			
		||||
 | 
			
		||||
	strcpy( option_txt, "F" );	/* No idea what this means but the original ircd sends it ... */
 | 
			
		||||
#ifdef USE_ZLIB
 | 
			
		||||
#ifdef ZLIB
 | 
			
		||||
	if( options & CONN_ZIP ) strcat( option_txt, "z" );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: irc.h,v 1.38 2003/01/15 13:49:20 alex Exp $
 | 
			
		||||
 * $Id: irc.h,v 1.39 2005/03/19 18:43:49 fw Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * IRC commands (header)
 | 
			
		||||
 */
 | 
			
		||||
@@ -18,12 +18,12 @@
 | 
			
		||||
#define __irc_h__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN IRC_ERROR PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_KILL PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_NOTICE PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_PRIVMSG PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_TRACE PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL BOOLEAN IRC_HELP PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_ERROR PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_KILL PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_NOTICE PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_PRIVMSG PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_TRACE PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
GLOBAL bool IRC_HELP PARAMS(( CLIENT *Client, REQUEST *Req ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 * Copyright (c)2001-2005 Alexander Barton (alex@barton.de)
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
@@ -14,7 +14,7 @@
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: lists.c,v 1.11 2002/12/26 16:25:43 alex Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: lists.c,v 1.17 2005/03/19 18:43:49 fw Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
@@ -30,6 +30,7 @@ static char UNUSED id[] = "$Id: lists.c,v 1.11 2002/12/26 16:25:43 alex Exp $";
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <strings.h>
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "lists.h"
 | 
			
		||||
@@ -41,24 +42,24 @@ static char UNUSED id[] = "$Id: lists.c,v 1.11 2002/12/26 16:25:43 alex Exp $";
 | 
			
		||||
typedef struct _C2C
 | 
			
		||||
{
 | 
			
		||||
	struct _C2C *next;
 | 
			
		||||
	CHAR mask[MASK_LEN];
 | 
			
		||||
	char mask[MASK_LEN];
 | 
			
		||||
	CHANNEL *channel;
 | 
			
		||||
	BOOLEAN onlyonce;
 | 
			
		||||
	bool onlyonce;
 | 
			
		||||
} C2C;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL C2C *My_Invites, *My_Bans;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL C2C *New_C2C PARAMS(( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce ));
 | 
			
		||||
LOCAL C2C *New_C2C PARAMS(( char *Mask, CHANNEL *Chan, bool OnlyOnce ));
 | 
			
		||||
 | 
			
		||||
LOCAL BOOLEAN Check_List PARAMS(( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan ));
 | 
			
		||||
LOCAL BOOLEAN Already_Registered PARAMS(( C2C *Cl2Chan, CHAR *Mask, CHANNEL *Chan ));
 | 
			
		||||
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 )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Lists_Init( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Modul initialisieren */
 | 
			
		||||
 | 
			
		||||
@@ -66,8 +67,8 @@ Lists_Init( VOID )
 | 
			
		||||
} /* Lists_Init */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Lists_Exit( VOID )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Lists_Exit( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Modul abmelden */
 | 
			
		||||
 | 
			
		||||
@@ -93,33 +94,38 @@ Lists_Exit( VOID )
 | 
			
		||||
} /* Lists_Exit */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Lists_CheckInvited( CLIENT *Client, CHANNEL *Chan )
 | 
			
		||||
{
 | 
			
		||||
	return Check_List( &My_Invites, Client, Chan );
 | 
			
		||||
} /* Lists_CheckInvited */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
Lists_AddInvited( CLIENT *From, CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Lists_IsInviteEntry( char *Mask, CHANNEL *Chan )
 | 
			
		||||
{
 | 
			
		||||
	assert( Mask != NULL );
 | 
			
		||||
	assert( Chan != NULL );
 | 
			
		||||
	
 | 
			
		||||
	return Already_Registered( My_Invites, Mask, Chan );
 | 
			
		||||
} /* Lists_IsInviteEntry */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Lists_AddInvited( char *Mask, CHANNEL *Chan, bool OnlyOnce )
 | 
			
		||||
{
 | 
			
		||||
	C2C *c2c;
 | 
			
		||||
 | 
			
		||||
	assert( Mask != NULL );
 | 
			
		||||
	assert( Chan != NULL );
 | 
			
		||||
 | 
			
		||||
	if( Already_Registered( My_Invites, Mask, Chan ))
 | 
			
		||||
	{
 | 
			
		||||
		/* Eintrag ist bereits vorhanden */
 | 
			
		||||
		IRC_WriteStrClient( From, RPL_INVITELIST_MSG, Client_ID( From ), Channel_Name( Chan ), Mask );
 | 
			
		||||
		return FALSE;
 | 
			
		||||
	}
 | 
			
		||||
	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 */
 | 
			
		||||
@@ -127,12 +133,12 @@ Lists_AddInvited( CLIENT *From, CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce )
 | 
			
		||||
	My_Invites = c2c;
 | 
			
		||||
 | 
			
		||||
	Log( LOG_DEBUG, "Added \"%s\" to invite list for \"%s\".", Mask, Channel_Name( Chan ));
 | 
			
		||||
	return TRUE;
 | 
			
		||||
	return true;
 | 
			
		||||
} /* Lists_AddInvited */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Lists_DelInvited( CHAR *Mask, CHANNEL *Chan )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Lists_DelInvited( char *Mask, CHANNEL *Chan )
 | 
			
		||||
{
 | 
			
		||||
	C2C *c2c, *last, *next;
 | 
			
		||||
 | 
			
		||||
@@ -158,7 +164,7 @@ Lists_DelInvited( CHAR *Mask, CHANNEL *Chan )
 | 
			
		||||
} /* Lists_DelInvited */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Lists_ShowInvites( CLIENT *Client, CHANNEL *Channel )
 | 
			
		||||
{
 | 
			
		||||
	C2C *c2c;
 | 
			
		||||
@@ -180,33 +186,72 @@ Lists_ShowInvites( CLIENT *Client, CHANNEL *Channel )
 | 
			
		||||
} /* Lists_ShowInvites */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
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 BOOLEAN
 | 
			
		||||
Lists_AddBanned( CLIENT *From, CHAR *Mask, CHANNEL *Chan )
 | 
			
		||||
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 ))
 | 
			
		||||
	{
 | 
			
		||||
		/* Eintrag ist bereits vorhanden */
 | 
			
		||||
		IRC_WriteStrClient( From, RPL_BANLIST_MSG, Client_ID( From ), Channel_Name( Chan ), Mask );
 | 
			
		||||
		return FALSE;
 | 
			
		||||
	}
 | 
			
		||||
	if( Already_Registered( My_Bans, Mask, Chan )) return true;
 | 
			
		||||
 | 
			
		||||
	c2c = New_C2C( Mask, Chan, FALSE );
 | 
			
		||||
	c2c = New_C2C( Mask, Chan, false );
 | 
			
		||||
	if( ! c2c )
 | 
			
		||||
	{
 | 
			
		||||
		Log( LOG_ERR, "Can't add new ban list entry!" );
 | 
			
		||||
		return FALSE;
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* verketten */
 | 
			
		||||
@@ -214,12 +259,12 @@ Lists_AddBanned( CLIENT *From, CHAR *Mask, CHANNEL *Chan )
 | 
			
		||||
	My_Bans = c2c;
 | 
			
		||||
 | 
			
		||||
	Log( LOG_DEBUG, "Added \"%s\" to ban list for \"%s\".", Mask, Channel_Name( Chan ));
 | 
			
		||||
	return TRUE;
 | 
			
		||||
	return true;
 | 
			
		||||
} /* Lists_AddBanned */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Lists_DelBanned( CHAR *Mask, CHANNEL *Chan )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Lists_DelBanned( char *Mask, CHANNEL *Chan )
 | 
			
		||||
{
 | 
			
		||||
	C2C *c2c, *last, *next;
 | 
			
		||||
 | 
			
		||||
@@ -245,7 +290,7 @@ Lists_DelBanned( CHAR *Mask, CHANNEL *Chan )
 | 
			
		||||
} /* Lists_DelBanned */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Lists_ShowBans( CLIENT *Client, CHANNEL *Channel )
 | 
			
		||||
{
 | 
			
		||||
	C2C *c2c;
 | 
			
		||||
@@ -267,7 +312,7 @@ Lists_ShowBans( CLIENT *Client, CHANNEL *Channel )
 | 
			
		||||
} /* Lists_ShowBans */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Lists_DeleteChannel( CHANNEL *Chan )
 | 
			
		||||
{
 | 
			
		||||
	/* Channel wurde geloescht, Invite- und Ban-Lists aufraeumen */
 | 
			
		||||
@@ -312,15 +357,16 @@ Lists_DeleteChannel( CHANNEL *Chan )
 | 
			
		||||
} /* Lists_DeleteChannel */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CHAR *
 | 
			
		||||
Lists_MakeMask( CHAR *Pattern )
 | 
			
		||||
GLOBAL char *
 | 
			
		||||
Lists_MakeMask( char *Pattern )
 | 
			
		||||
{
 | 
			
		||||
	/* Hier wird aus einem "beliebigen" Pattern eine gueltige IRC-Mask erzeugt.
 | 
			
		||||
	 * Diese ist aber nur bis zum naechsten Aufruf von Lists_MakeMask() gueltig,
 | 
			
		||||
	 * da ein einziger globaler Puffer verwendet wird. ->Umkopieren!*/
 | 
			
		||||
	/* This function generats a valid IRC mask of "any" string. This
 | 
			
		||||
	 * mask is only valid until the next call to Lists_MakeMask(),
 | 
			
		||||
	 * because a single global buffer is used. You have to copy the
 | 
			
		||||
	 * generated mask to some sane location yourself! */
 | 
			
		||||
 | 
			
		||||
	STATIC CHAR TheMask[MASK_LEN];
 | 
			
		||||
	CHAR *excl, *at;
 | 
			
		||||
	static char TheMask[MASK_LEN];
 | 
			
		||||
	char *excl, *at;
 | 
			
		||||
 | 
			
		||||
	assert( Pattern != NULL );
 | 
			
		||||
 | 
			
		||||
@@ -331,7 +377,7 @@ Lists_MakeMask( CHAR *Pattern )
 | 
			
		||||
 | 
			
		||||
	if(( ! at ) && ( ! excl ))
 | 
			
		||||
	{
 | 
			
		||||
		/* weder ! noch @ vorhanden: als Nick annehmen */
 | 
			
		||||
		/* Neither "!" nor "@" found: use string as nick name */
 | 
			
		||||
		strlcpy( TheMask, Pattern, sizeof( TheMask ) - 5 );
 | 
			
		||||
		strlcat( TheMask, "!*@*", sizeof( TheMask ));
 | 
			
		||||
		return TheMask;
 | 
			
		||||
@@ -339,7 +385,7 @@ Lists_MakeMask( CHAR *Pattern )
 | 
			
		||||
 | 
			
		||||
	if(( ! at ) && ( excl ))
 | 
			
		||||
	{
 | 
			
		||||
		/* Domain fehlt */
 | 
			
		||||
		/* Domain part is missing */
 | 
			
		||||
		strlcpy( TheMask, Pattern, sizeof( TheMask ) - 3 );
 | 
			
		||||
		strlcat( TheMask, "@*", sizeof( TheMask ));
 | 
			
		||||
		return TheMask;
 | 
			
		||||
@@ -347,22 +393,22 @@ Lists_MakeMask( CHAR *Pattern )
 | 
			
		||||
 | 
			
		||||
	if(( at ) && ( ! excl ))
 | 
			
		||||
	{
 | 
			
		||||
		/* User fehlt */
 | 
			
		||||
		/* User name is missing */
 | 
			
		||||
		*at = '\0'; at++;
 | 
			
		||||
		strlcpy( TheMask, Pattern, sizeof( TheMask ) - strlen( at ) - 4 );
 | 
			
		||||
		strlcpy( TheMask, Pattern, sizeof( TheMask ) - 5 );
 | 
			
		||||
		strlcat( TheMask, "!*@", sizeof( TheMask ));
 | 
			
		||||
		strlcat( TheMask, at, sizeof( TheMask ));
 | 
			
		||||
		return TheMask;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* alle Teile vorhanden */
 | 
			
		||||
	/* All parts (nick, user and domain name) are given */
 | 
			
		||||
	strlcpy( TheMask, Pattern, sizeof( TheMask ));
 | 
			
		||||
	return TheMask;
 | 
			
		||||
} /* Lists_MakeMask */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL C2C *
 | 
			
		||||
New_C2C( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce )
 | 
			
		||||
New_C2C( char *Mask, CHANNEL *Chan, bool OnlyOnce )
 | 
			
		||||
{
 | 
			
		||||
	C2C *c2c;
 | 
			
		||||
	
 | 
			
		||||
@@ -370,7 +416,7 @@ New_C2C( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce )
 | 
			
		||||
	assert( Chan != NULL );
 | 
			
		||||
 | 
			
		||||
	/* Speicher fuer Eintrag anfordern */
 | 
			
		||||
	c2c = malloc( sizeof( C2C ));
 | 
			
		||||
	c2c = (C2C *)malloc( sizeof( C2C ));
 | 
			
		||||
	if( ! c2c )
 | 
			
		||||
	{
 | 
			
		||||
		Log( LOG_EMERG, "Can't allocate memory! [New_C2C]" );
 | 
			
		||||
@@ -385,7 +431,7 @@ New_C2C( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce )
 | 
			
		||||
} /* New_C2C */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL BOOLEAN
 | 
			
		||||
LOCAL bool
 | 
			
		||||
Check_List( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan )
 | 
			
		||||
{
 | 
			
		||||
	C2C *c2c, *last;
 | 
			
		||||
@@ -413,29 +459,29 @@ Check_List( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan )
 | 
			
		||||
					else *Cl2Chan = c2c->next;
 | 
			
		||||
					free( c2c );
 | 
			
		||||
				}
 | 
			
		||||
				return TRUE;
 | 
			
		||||
				return true;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		last = c2c;
 | 
			
		||||
		c2c = c2c->next;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return FALSE;
 | 
			
		||||
	return false;
 | 
			
		||||
} /* Check_List */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL BOOLEAN
 | 
			
		||||
Already_Registered( C2C *List, CHAR *Mask, CHANNEL *Chan )
 | 
			
		||||
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;
 | 
			
		||||
		if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 )) return true;
 | 
			
		||||
		c2c = c2c->next;
 | 
			
		||||
	}
 | 
			
		||||
	return FALSE;
 | 
			
		||||
	return false;
 | 
			
		||||
} /* Already_Registered */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: lists.h,v 1.9 2002/12/12 12:23:43 alex Exp $
 | 
			
		||||
 * $Id: lists.h,v 1.12 2005/03/19 18:43:49 fw Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * Management of IRC lists: ban, invite, ... (header)
 | 
			
		||||
 */
 | 
			
		||||
@@ -18,22 +18,26 @@
 | 
			
		||||
#define __lists_h__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Lists_Init PARAMS(( VOID ));
 | 
			
		||||
GLOBAL VOID Lists_Exit PARAMS(( VOID ));
 | 
			
		||||
GLOBAL void Lists_Init PARAMS(( void ));
 | 
			
		||||
GLOBAL void Lists_Exit PARAMS(( void ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Lists_CheckInvited PARAMS(( CLIENT *Client, CHANNEL *Chan ));
 | 
			
		||||
GLOBAL BOOLEAN Lists_AddInvited PARAMS(( CLIENT *From, CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce ));
 | 
			
		||||
GLOBAL VOID Lists_DelInvited PARAMS(( CHAR *Mask, CHANNEL *Chan ));
 | 
			
		||||
GLOBAL BOOLEAN Lists_ShowInvites PARAMS(( CLIENT *Client, CHANNEL *Channel ));
 | 
			
		||||
GLOBAL bool Lists_CheckInvited PARAMS(( CLIENT *Client, CHANNEL *Chan ));
 | 
			
		||||
GLOBAL bool Lists_AddInvited PARAMS(( char *Mask, CHANNEL *Chan, bool OnlyOnce ));
 | 
			
		||||
GLOBAL void Lists_DelInvited PARAMS(( char *Mask, CHANNEL *Chan ));
 | 
			
		||||
GLOBAL bool Lists_ShowInvites PARAMS(( CLIENT *Client, CHANNEL *Channel ));
 | 
			
		||||
GLOBAL bool Lists_SendInvites PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL bool Lists_IsInviteEntry PARAMS(( char *Mask, CHANNEL *Chan ));
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Lists_CheckBanned PARAMS(( CLIENT *Client, CHANNEL *Chan ));
 | 
			
		||||
GLOBAL BOOLEAN Lists_AddBanned PARAMS(( CLIENT *From, CHAR *Mask, CHANNEL *Chan ));
 | 
			
		||||
GLOBAL VOID Lists_DelBanned PARAMS(( CHAR *Mask, CHANNEL *Chan ));
 | 
			
		||||
GLOBAL BOOLEAN Lists_ShowBans PARAMS(( CLIENT *Client, CHANNEL *Channel ));
 | 
			
		||||
GLOBAL bool Lists_CheckBanned PARAMS(( CLIENT *Client, CHANNEL *Chan ));
 | 
			
		||||
GLOBAL bool Lists_AddBanned PARAMS(( char *Mask, CHANNEL *Chan ));
 | 
			
		||||
GLOBAL void Lists_DelBanned PARAMS(( char *Mask, CHANNEL *Chan ));
 | 
			
		||||
GLOBAL bool Lists_ShowBans PARAMS(( CLIENT *Client, CHANNEL *Channel ));
 | 
			
		||||
GLOBAL bool Lists_SendBans PARAMS(( CLIENT *Client ));
 | 
			
		||||
GLOBAL bool Lists_IsBanEntry PARAMS(( char *Mask, CHANNEL *Chan ));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Lists_DeleteChannel PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
GLOBAL void Lists_DeleteChannel PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
 | 
			
		||||
GLOBAL CHAR *Lists_MakeMask PARAMS(( CHAR *Pattern ));
 | 
			
		||||
GLOBAL char *Lists_MakeMask PARAMS(( char *Pattern ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										211
									
								
								src/ngircd/log.c
									
									
									
									
									
								
							
							
						
						
									
										211
									
								
								src/ngircd/log.c
									
									
									
									
									
								
							@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 * Copyright (c)2001-2005 Alexander Barton (alex@barton.de)
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
@@ -14,18 +14,22 @@
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: log.c,v 1.43 2003/03/31 15:54:21 alex Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: log.c,v 1.57.2.2 2006/02/08 21:23:21 fw Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <stdarg.h>
 | 
			
		||||
#ifdef PROTOTYPES
 | 
			
		||||
#	include <stdarg.h>
 | 
			
		||||
#else
 | 
			
		||||
#	include <varargs.h>
 | 
			
		||||
#endif
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
#ifdef USE_SYSLOG
 | 
			
		||||
#ifdef SYSLOG
 | 
			
		||||
#include <syslog.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@@ -40,62 +44,79 @@ static char UNUSED id[] = "$Id: log.c,v 1.43 2003/03/31 15:54:21 alex Exp $";
 | 
			
		||||
#include "log.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL CHAR Error_File[FNAME_LEN];
 | 
			
		||||
LOCAL CHAR Init_Txt[127];
 | 
			
		||||
static char Init_Txt[127];
 | 
			
		||||
static bool Is_Daemon;
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
static char Error_File[FNAME_LEN];
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID Wall_ServerNotice PARAMS(( CHAR *Msg ));
 | 
			
		||||
static void Wall_ServerNotice PARAMS(( char *Msg ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Log_Init( VOID )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Log_Init( bool Daemon_Mode )
 | 
			
		||||
{
 | 
			
		||||
#ifdef USE_SYSLOG
 | 
			
		||||
	Is_Daemon = Daemon_Mode;
 | 
			
		||||
	
 | 
			
		||||
#ifdef SYSLOG
 | 
			
		||||
#ifndef LOG_CONS	/* Kludge: mips-dec-ultrix4.5 has no LOG_CONS/LOG_LOCAL5 */
 | 
			
		||||
#define LOG_CONS 0
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef LOG_LOCAL5
 | 
			
		||||
#define LOG_LOCAL5 0
 | 
			
		||||
#endif
 | 
			
		||||
	/* Syslog initialisieren */
 | 
			
		||||
	openlog( PACKAGE_NAME, LOG_CONS|LOG_PID, LOG_LOCAL5 );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	/* Hello World! */
 | 
			
		||||
	Log( LOG_NOTICE, "%s started.", NGIRCd_Version( ));
 | 
			
		||||
	Log( LOG_NOTICE, "%s started.", NGIRCd_Version );
 | 
			
		||||
	  
 | 
			
		||||
	/* Informationen uebern den "Operation Mode" */
 | 
			
		||||
	strcpy( Init_Txt, "" );
 | 
			
		||||
	Init_Txt[0] = '\0';
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
	if( NGIRCd_Debug )
 | 
			
		||||
	{
 | 
			
		||||
		if( Init_Txt[0] ) strcat( Init_Txt, ", " );
 | 
			
		||||
		strcat( Init_Txt, "debug-mode" );
 | 
			
		||||
		strlcpy( Init_Txt, "debug-mode", sizeof Init_Txt );
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
	if( NGIRCd_NoDaemon )
 | 
			
		||||
	if( ! Is_Daemon )
 | 
			
		||||
	{
 | 
			
		||||
		if( Init_Txt[0] ) strcat( Init_Txt, ", " );
 | 
			
		||||
		strcat( Init_Txt, "no-daemon-mode" );
 | 
			
		||||
		if( Init_Txt[0] ) strlcat( Init_Txt, ", ", sizeof Init_Txt );
 | 
			
		||||
		strlcat( Init_Txt, "no-daemon-mode", sizeof Init_Txt );
 | 
			
		||||
	}
 | 
			
		||||
	if( NGIRCd_Passive )
 | 
			
		||||
	{
 | 
			
		||||
		if( Init_Txt[0] ) strcat( Init_Txt, ", " );
 | 
			
		||||
		strcat( Init_Txt, "passive-mode" );
 | 
			
		||||
		if( Init_Txt[0] ) strlcat( Init_Txt, ", ", sizeof Init_Txt );
 | 
			
		||||
		strlcat( Init_Txt, "passive-mode", sizeof Init_Txt );
 | 
			
		||||
	}
 | 
			
		||||
#ifdef SNIFFER
 | 
			
		||||
	if( NGIRCd_Sniffer )
 | 
			
		||||
	{
 | 
			
		||||
		if( Init_Txt[0] ) strcat( Init_Txt, ", " );
 | 
			
		||||
		strcat( Init_Txt, "network sniffer" );
 | 
			
		||||
		if( Init_Txt[0] ) strlcat( Init_Txt, ", ", sizeof Init_Txt );
 | 
			
		||||
		strlcat( Init_Txt, "network sniffer", sizeof Init_Txt );
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
	if( Init_Txt[0] ) Log( LOG_INFO, "Activating: %s.", Init_Txt );
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
	Error_File[0] = '\0';
 | 
			
		||||
#endif
 | 
			
		||||
} /* Log_Init */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Log_InitErrorfile( VOID )
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Log_InitErrorfile( void )
 | 
			
		||||
{
 | 
			
		||||
	/* "Error-Log" initialisieren: stderr in Datei umlenken. Dort
 | 
			
		||||
	 * landen z.B. alle Ausgaben von assert()-Aufrufen. */
 | 
			
		||||
 | 
			
		||||
	/* Dateiname zusammen bauen */
 | 
			
		||||
	sprintf( Error_File, "%s/%s-%ld.err", ERROR_DIR, PACKAGE_NAME, (LONG)getpid( ));
 | 
			
		||||
	snprintf( Error_File, sizeof Error_File, "%s/%s-%ld.err", ERROR_DIR, PACKAGE_NAME, (long)getpid( ));
 | 
			
		||||
 | 
			
		||||
	/* stderr umlenken */
 | 
			
		||||
	fflush( stderr );
 | 
			
		||||
@@ -107,46 +128,83 @@ Log_InitErrorfile( VOID )
 | 
			
		||||
 | 
			
		||||
	/* Einige Infos in das Error-File schreiben */
 | 
			
		||||
	fputs( ctime( &NGIRCd_Start ), stderr );
 | 
			
		||||
	fprintf( stderr, "%s started.\n", NGIRCd_Version( ));
 | 
			
		||||
	fprintf( stderr, "%s started.\n", NGIRCd_Version );
 | 
			
		||||
	fprintf( stderr, "Activating: %s\n\n", Init_Txt[0] ? Init_Txt : "-" );
 | 
			
		||||
	fflush( stderr );
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
	Log( LOG_DEBUG, "Redirected stderr to \"%s\".", Error_File );
 | 
			
		||||
#endif
 | 
			
		||||
} /* Log_InitErrfile */
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Log_Exit( VOID )
 | 
			
		||||
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Log_Exit( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Good Bye! */
 | 
			
		||||
	if( NGIRCd_SignalRestart ) Log( LOG_NOTICE, "%s done (restarting).", PACKAGE_NAME );
 | 
			
		||||
	else Log( LOG_NOTICE, "%s done.", PACKAGE_NAME );
 | 
			
		||||
 | 
			
		||||
	/* Error-File (stderr) loeschen */
 | 
			
		||||
	if( unlink( Error_File ) != 0 ) Log( LOG_ERR, "Can't delete \"%s\": %s", Error_File, strerror( errno ));
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
	if( Error_File[0] )
 | 
			
		||||
	{
 | 
			
		||||
		/* Error-File (stderr) loeschen */
 | 
			
		||||
		if( unlink( Error_File ) != 0 ) Log( LOG_ERR, "Can't delete \"%s\": %s", Error_File, strerror( errno ));
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef USE_SYSLOG
 | 
			
		||||
#ifdef SYSLOG
 | 
			
		||||
	/* syslog abmelden */
 | 
			
		||||
	closelog( );
 | 
			
		||||
#endif
 | 
			
		||||
} /* Log_Exit */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# ifdef PROTOTYPES
 | 
			
		||||
GLOBAL void
 | 
			
		||||
LogDebug( const char *Format, ... )
 | 
			
		||||
# else
 | 
			
		||||
GLOBAL void
 | 
			
		||||
LogDebug( Format, va_alist )
 | 
			
		||||
const char *Format;
 | 
			
		||||
va_dcl
 | 
			
		||||
# endif
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
{
 | 
			
		||||
	char msg[MAX_LOG_MSG_LEN];
 | 
			
		||||
	va_list ap;
 | 
			
		||||
 | 
			
		||||
	if (!NGIRCd_Debug) return;
 | 
			
		||||
#ifdef PROTOTYPES
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Log( INT Level, CONST CHAR *Format, ... )
 | 
			
		||||
	va_start( ap, Format );
 | 
			
		||||
#else
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
	va_start( ap );
 | 
			
		||||
#endif
 | 
			
		||||
	vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap );
 | 
			
		||||
	va_end( ap );
 | 
			
		||||
	Log(LOG_DEBUG, "%s", msg);
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
{ /* do nothing */ }
 | 
			
		||||
#endif	/* DEBUG */
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
#ifdef PROTOTYPES
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Log( int Level, const char *Format, ... )
 | 
			
		||||
#else
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Log( Level, Format, va_alist )
 | 
			
		||||
INT Level;
 | 
			
		||||
CONST CHAR *Format;
 | 
			
		||||
int Level;
 | 
			
		||||
const char *Format;
 | 
			
		||||
va_dcl
 | 
			
		||||
#endif
 | 
			
		||||
{
 | 
			
		||||
	/* Eintrag in Logfile(s) schreiben */
 | 
			
		||||
 | 
			
		||||
	CHAR msg[MAX_LOG_MSG_LEN];
 | 
			
		||||
	BOOLEAN snotice;
 | 
			
		||||
	char msg[MAX_LOG_MSG_LEN];
 | 
			
		||||
	bool snotice;
 | 
			
		||||
	va_list ap;
 | 
			
		||||
 | 
			
		||||
	assert( Format != NULL );
 | 
			
		||||
@@ -154,10 +212,10 @@ va_dcl
 | 
			
		||||
	if( Level & LOG_snotice )
 | 
			
		||||
	{
 | 
			
		||||
		/* Notice an User mit "s" Mode */
 | 
			
		||||
		snotice = TRUE;
 | 
			
		||||
		snotice = true;
 | 
			
		||||
		Level &= ~LOG_snotice;
 | 
			
		||||
	}
 | 
			
		||||
	else snotice = FALSE;
 | 
			
		||||
	else snotice = false;
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
	if(( Level == LOG_DEBUG ) && ( ! NGIRCd_Debug )) return;
 | 
			
		||||
@@ -174,13 +232,13 @@ va_dcl
 | 
			
		||||
	vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap );
 | 
			
		||||
	va_end( ap );
 | 
			
		||||
 | 
			
		||||
	if( NGIRCd_NoDaemon )
 | 
			
		||||
	if( ! Is_Daemon )
 | 
			
		||||
	{
 | 
			
		||||
		/* auf Konsole ausgeben */
 | 
			
		||||
		fprintf( stdout, "[%d] %s\n", Level, msg );
 | 
			
		||||
		fprintf( stdout, "[%d:%d] %s\n", (int)getpid( ), Level, msg );
 | 
			
		||||
		fflush( stdout );
 | 
			
		||||
	}
 | 
			
		||||
#ifdef USE_SYSLOG
 | 
			
		||||
#ifdef SYSLOG
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		/* Syslog */
 | 
			
		||||
@@ -190,7 +248,7 @@ va_dcl
 | 
			
		||||
 | 
			
		||||
	if( Level <= LOG_CRIT )
 | 
			
		||||
	{
 | 
			
		||||
		/* Kritische Meldungen in Error-File (stderr) */
 | 
			
		||||
		/* log critical messages to stderr */
 | 
			
		||||
		fprintf( stderr, "%s\n", msg );
 | 
			
		||||
		fflush( stderr );
 | 
			
		||||
	}
 | 
			
		||||
@@ -203,48 +261,48 @@ va_dcl
 | 
			
		||||
} /* Log */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Log_Init_Resolver( VOID )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Log_Init_Resolver( void )
 | 
			
		||||
{
 | 
			
		||||
#ifdef USE_SYSLOG
 | 
			
		||||
#ifdef SYSLOG
 | 
			
		||||
	openlog( PACKAGE_NAME, LOG_CONS|LOG_PID, LOG_LOCAL5 );
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
	Log_Resolver( LOG_DEBUG, "Resolver sub-process starting, PID %d.", getpid( ));
 | 
			
		||||
#endif
 | 
			
		||||
} /* Log_Init_Resolver */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Log_Exit_Resolver( VOID )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Log_Exit_Resolver( void )
 | 
			
		||||
{
 | 
			
		||||
#ifdef USE_SYSLOG
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
	Log_Resolver( LOG_DEBUG, "Resolver sub-process %d done.", getpid( ));
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef SYSLOG
 | 
			
		||||
	closelog( );
 | 
			
		||||
#endif
 | 
			
		||||
} /* Log_Exit_Resolver */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef PROTOTYPES
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Log_Resolver( CONST INT Level, CONST CHAR *Format, ... )
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Log_Resolver( const int Level, const char *Format, ... )
 | 
			
		||||
#else
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Log_Resolver( Level, Format, va_alist )
 | 
			
		||||
CONST INT Level;
 | 
			
		||||
CONST CHAR *Format;
 | 
			
		||||
const int Level;
 | 
			
		||||
const char *Format;
 | 
			
		||||
va_dcl
 | 
			
		||||
#endif
 | 
			
		||||
{
 | 
			
		||||
	/* Eintrag des Resolver in Logfile(s) schreiben */
 | 
			
		||||
 | 
			
		||||
#ifndef USE_SYSLOG
 | 
			
		||||
	return;
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
	CHAR msg[MAX_LOG_MSG_LEN];
 | 
			
		||||
	char msg[MAX_LOG_MSG_LEN];
 | 
			
		||||
	va_list ap;
 | 
			
		||||
 | 
			
		||||
	assert( Format != NULL );
 | 
			
		||||
 | 
			
		||||
	if( NGIRCd_NoDaemon ) return;
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
	if(( Level == LOG_DEBUG ) && ( ! NGIRCd_Debug )) return;
 | 
			
		||||
#else
 | 
			
		||||
@@ -260,26 +318,35 @@ va_dcl
 | 
			
		||||
	vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap );
 | 
			
		||||
	va_end( ap );
 | 
			
		||||
 | 
			
		||||
	/* ... und ausgeben */
 | 
			
		||||
	syslog( Level, msg );
 | 
			
		||||
 | 
			
		||||
	if( ! Is_Daemon )
 | 
			
		||||
	{
 | 
			
		||||
		/* Output to console */
 | 
			
		||||
		fprintf( stdout, "[%d:%d] %s\n", (int)getpid( ), Level, msg );
 | 
			
		||||
		fflush( stdout );
 | 
			
		||||
	}
 | 
			
		||||
#ifdef SYSLOG
 | 
			
		||||
	else syslog( Level, "%s", msg );
 | 
			
		||||
#endif
 | 
			
		||||
} /* Log_Resolver */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID
 | 
			
		||||
Wall_ServerNotice( CHAR *Msg )
 | 
			
		||||
/**
 | 
			
		||||
 * Send log messages to users flagged with the "s" mode.
 | 
			
		||||
 * @param Msg The message to send.
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
Wall_ServerNotice( char *Msg )
 | 
			
		||||
{
 | 
			
		||||
	/* Server-Notice an entsprechende User verschicken */
 | 
			
		||||
 | 
			
		||||
	CLIENT *c;
 | 
			
		||||
 | 
			
		||||
	assert( Msg != NULL );
 | 
			
		||||
 | 
			
		||||
	c = Client_First( );
 | 
			
		||||
	while( c )
 | 
			
		||||
	{
 | 
			
		||||
		if(( Client_Conn( c ) > NONE ) && ( Client_HasMode( c, 's' ))) IRC_WriteStrClient( c, "NOTICE %s :%s%s", Client_ThisServer( ), NOTICE_TXTPREFIX, Msg );
 | 
			
		||||
	while(c) {
 | 
			
		||||
		if (Client_Conn(c) > NONE && Client_HasMode(c, 's'))
 | 
			
		||||
			IRC_WriteStrClient(c, "NOTICE %s :%s%s", Client_ID(c),
 | 
			
		||||
							NOTICE_TXTPREFIX, Msg);
 | 
			
		||||
 | 
			
		||||
		c = Client_Next( c );
 | 
			
		||||
	}
 | 
			
		||||
} /* Wall_ServerNotice */
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: log.h,v 1.13 2002/12/12 12:23:43 alex Exp $
 | 
			
		||||
 * $Id: log.h,v 1.18.2.1 2006/02/08 21:23:21 fw Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * Logging functions (header)
 | 
			
		||||
 */
 | 
			
		||||
@@ -18,7 +18,7 @@
 | 
			
		||||
#define __log_h__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef USE_SYSLOG
 | 
			
		||||
#ifdef SYSLOG
 | 
			
		||||
#	include <syslog.h>
 | 
			
		||||
#else
 | 
			
		||||
#	define LOG_EMERG 0
 | 
			
		||||
@@ -35,16 +35,20 @@
 | 
			
		||||
#define LOG_snotice 1024
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Log_Init PARAMS((VOID ));
 | 
			
		||||
GLOBAL VOID Log_Exit PARAMS((VOID ));
 | 
			
		||||
GLOBAL void Log_Init PARAMS(( bool Daemon_Mode ));
 | 
			
		||||
GLOBAL void Log_Exit PARAMS(( void ));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Log_InitErrorfile PARAMS((VOID ));
 | 
			
		||||
GLOBAL VOID Log PARAMS((INT Level, CONST CHAR *Format, ... ));
 | 
			
		||||
GLOBAL void Log PARAMS(( int Level, const char *Format, ... ));
 | 
			
		||||
GLOBAL void LogDebug PARAMS(( const char *Format, ... ));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Log_Init_Resolver PARAMS((VOID ));
 | 
			
		||||
GLOBAL VOID Log_Exit_Resolver PARAMS((VOID ));
 | 
			
		||||
GLOBAL void Log_Init_Resolver PARAMS(( void ));
 | 
			
		||||
GLOBAL void Log_Exit_Resolver PARAMS(( void ));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Log_Resolver PARAMS((CONST INT Level, CONST CHAR *Format, ... ));
 | 
			
		||||
GLOBAL void Log_Resolver PARAMS(( const int Level, const char *Format, ... ));
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
GLOBAL void Log_InitErrorfile PARAMS(( void ));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: match.c,v 1.2 2002/12/12 12:24:18 alex Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: match.c,v 1.3 2005/03/19 18:43:49 fw Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
@@ -32,8 +32,8 @@ static char UNUSED id[] = "$Id: match.c,v 1.2 2002/12/12 12:24:18 alex Exp $";
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL INT Matche PARAMS(( REGISTER CHAR *p, REGISTER CHAR *t ));
 | 
			
		||||
LOCAL INT Matche_After_Star PARAMS(( REGISTER CHAR *p, REGISTER CHAR *t ));
 | 
			
		||||
LOCAL int Matche PARAMS(( char *p, char *t ));
 | 
			
		||||
LOCAL int Matche_After_Star PARAMS(( char *p, char *t ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define MATCH_PATTERN	6	/* bad pattern */
 | 
			
		||||
@@ -44,22 +44,22 @@ LOCAL INT Matche_After_Star PARAMS(( REGISTER CHAR *p, REGISTER CHAR *t ));
 | 
			
		||||
#define MATCH_VALID	1	/* valid match */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
Match( CHAR *Pattern, CHAR *String )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Match( char *Pattern, char *String )
 | 
			
		||||
{
 | 
			
		||||
	/* Pattern mit String vergleichen */
 | 
			
		||||
	if( Matche( Pattern, String ) == MATCH_VALID ) return TRUE;
 | 
			
		||||
	else return FALSE;
 | 
			
		||||
	if( Matche( Pattern, String ) == MATCH_VALID ) return true;
 | 
			
		||||
	else return false;
 | 
			
		||||
} /* Match */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL INT
 | 
			
		||||
Matche( REGISTER CHAR *p, REGISTER CHAR *t )
 | 
			
		||||
LOCAL int
 | 
			
		||||
Matche( char *p, char *t )
 | 
			
		||||
{
 | 
			
		||||
	REGISTER CHAR range_start, range_end;
 | 
			
		||||
	BOOLEAN invert;
 | 
			
		||||
	BOOLEAN member_match;
 | 
			
		||||
	BOOLEAN loop;
 | 
			
		||||
	register char range_start, range_end;
 | 
			
		||||
	bool invert;
 | 
			
		||||
	bool member_match;
 | 
			
		||||
	bool loop;
 | 
			
		||||
 | 
			
		||||
	for( ; *p; p++, t++ )
 | 
			
		||||
	{
 | 
			
		||||
@@ -83,25 +83,25 @@ Matche( REGISTER CHAR *p, REGISTER CHAR *t )
 | 
			
		||||
				p++;
 | 
			
		||||
 | 
			
		||||
				/* check if this is a member match or exclusion match */
 | 
			
		||||
				invert = FALSE;
 | 
			
		||||
				invert = false;
 | 
			
		||||
				if( *p == '!' || *p == '^' )
 | 
			
		||||
				{
 | 
			
		||||
					invert = TRUE;
 | 
			
		||||
					invert = true;
 | 
			
		||||
					p++;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				/* if closing bracket here or at range start then we have a malformed pattern */
 | 
			
		||||
				if ( *p == ']' ) return MATCH_PATTERN;
 | 
			
		||||
 | 
			
		||||
				member_match = FALSE;
 | 
			
		||||
				loop = TRUE;
 | 
			
		||||
				member_match = false;
 | 
			
		||||
				loop = true;
 | 
			
		||||
 | 
			
		||||
				while( loop )
 | 
			
		||||
				{
 | 
			
		||||
					/* if end of construct then loop is done */
 | 
			
		||||
					if( *p == ']' )
 | 
			
		||||
					{
 | 
			
		||||
						loop = FALSE;
 | 
			
		||||
						loop = false;
 | 
			
		||||
						continue;
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
@@ -140,16 +140,16 @@ Matche( REGISTER CHAR *p, REGISTER CHAR *t )
 | 
			
		||||
					{
 | 
			
		||||
						if( *t >= range_start && *t <= range_end )
 | 
			
		||||
						{
 | 
			
		||||
							member_match = TRUE;
 | 
			
		||||
							loop = FALSE;
 | 
			
		||||
							member_match = true;
 | 
			
		||||
							loop = false;
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
					else
 | 
			
		||||
					{
 | 
			
		||||
						if( *t >= range_end && *t <= range_start )
 | 
			
		||||
						{
 | 
			
		||||
							member_match = TRUE;
 | 
			
		||||
							loop = FALSE;
 | 
			
		||||
							member_match = true;
 | 
			
		||||
							loop = false;
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
@@ -200,10 +200,10 @@ Matche( REGISTER CHAR *p, REGISTER CHAR *t )
 | 
			
		||||
} /* Matche */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL INT
 | 
			
		||||
Matche_After_Star( REGISTER CHAR *p, REGISTER CHAR *t )
 | 
			
		||||
LOCAL int
 | 
			
		||||
Matche_After_Star( char *p, char *t )
 | 
			
		||||
{
 | 
			
		||||
	REGISTER INT nextp, match = 0;
 | 
			
		||||
	register int nextp, match = 0;
 | 
			
		||||
 | 
			
		||||
	/* pass over existing ? and * in pattern */
 | 
			
		||||
	while( *p == '?' || *p == '*' )
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: match.h,v 1.2 2002/12/12 12:23:43 alex Exp $
 | 
			
		||||
 * $Id: match.h,v 1.3 2005/03/19 18:43:49 fw Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * Wildcard pattern matching (header)
 | 
			
		||||
 */
 | 
			
		||||
@@ -18,7 +18,7 @@
 | 
			
		||||
#define __match_h__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Match PARAMS(( CHAR *Pattern, CHAR *String ));
 | 
			
		||||
GLOBAL bool Match PARAMS(( char *Pattern, char *String ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 * Copyright (c)2001-2004 Alexander Barton <alex@barton.de>
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: messages.h,v 1.64 2003/03/19 21:16:16 alex Exp $
 | 
			
		||||
 * $Id: messages.h,v 1.66 2004/02/28 02:18:16 alex Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * IRC numerics (Header)
 | 
			
		||||
 */
 | 
			
		||||
@@ -26,7 +26,7 @@
 | 
			
		||||
 | 
			
		||||
#define RPL_TRACELINK_MSG		"200 %s Link %s-%s %s %s V%s %ld %d %d"
 | 
			
		||||
#define RPL_TRACEOPERATOR_MSG		"204 %s Oper 2 :%s"
 | 
			
		||||
#define RPL_TRACESERVER_MSG		"206 %s Serv 1 0S 0C %s *!*@%s :V%s"
 | 
			
		||||
#define RPL_TRACESERVER_MSG		"206 %s Serv 1 0S 0C %s[%s@%s] *!*@%s :V%s"
 | 
			
		||||
#define RPL_STATSLINKINFO_MSG		"211 %s %s %d %ld %ld %ld %ld :%ld"
 | 
			
		||||
#define RPL_STATSCOMMANDS_MSG		"212 %s %s %ld %ld %ld"
 | 
			
		||||
#define RPL_ENDOFSTATS_MSG		"219 %s %c :End of STATS report"
 | 
			
		||||
@@ -117,7 +117,7 @@
 | 
			
		||||
#define ERR_UMODEUNKNOWNFLAG2_MSG	"501 %s :Unknown mode \"%c%c\""
 | 
			
		||||
#define ERR_USERSDONTMATCH_MSG		"502 %s :Can't set/get mode for other users"
 | 
			
		||||
 | 
			
		||||
#ifdef USE_ZLIB
 | 
			
		||||
#ifdef ZLIB
 | 
			
		||||
#define RPL_STATSLINKINFOZIP_MSG	"211 %s %s %d %ld %ld/%ld %ld %ld/%ld :%ld"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,24 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 * Copyright (c)2001-2005 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * Main program -- main()
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: ngircd.c,v 1.76 2003/03/31 15:54:21 alex Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: ngircd.c,v 1.102.2.2 2005/07/08 23:20:04 alex Exp $";
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * The main program, including the C function main() which is called
 | 
			
		||||
 * by the loader of the operating system.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
@@ -24,20 +28,21 @@ static char UNUSED id[] = "$Id: ngircd.c,v 1.76 2003/03/31 15:54:21 alex Exp $";
 | 
			
		||||
#include <signal.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
#include <sys/wait.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
#include <pwd.h>
 | 
			
		||||
#include <grp.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "resolve.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "client.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
#include "conf.h"
 | 
			
		||||
#include "cvs-version.h"
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "lists.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "parse.h"
 | 
			
		||||
@@ -51,39 +56,56 @@ static char UNUSED id[] = "$Id: ngircd.c,v 1.76 2003/03/31 15:54:21 alex Exp $";
 | 
			
		||||
#include "ngircd.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID Initialize_Signal_Handler PARAMS(( VOID ));
 | 
			
		||||
LOCAL VOID Signal_Handler PARAMS(( INT Signal ));
 | 
			
		||||
LOCAL void Initialize_Signal_Handler PARAMS(( void ));
 | 
			
		||||
LOCAL void Signal_Handler PARAMS(( int Signal ));
 | 
			
		||||
 | 
			
		||||
LOCAL VOID Show_Version PARAMS(( VOID ));
 | 
			
		||||
LOCAL VOID Show_Help PARAMS(( VOID ));
 | 
			
		||||
LOCAL void Show_Version PARAMS(( void ));
 | 
			
		||||
LOCAL void Show_Help PARAMS(( void ));
 | 
			
		||||
 | 
			
		||||
LOCAL void Pidfile_Create PARAMS(( long ));
 | 
			
		||||
LOCAL void Pidfile_Delete PARAMS(( void ));
 | 
			
		||||
 | 
			
		||||
LOCAL void Fill_Version PARAMS(( void ));
 | 
			
		||||
 | 
			
		||||
LOCAL void Setup_FDStreams PARAMS(( void ));
 | 
			
		||||
 | 
			
		||||
LOCAL bool NGIRCd_Init PARAMS(( bool ));
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The main() function of ngIRCd.
 | 
			
		||||
 * Here all starts: this function is called by the operating system loader,
 | 
			
		||||
 * it is the first portion of code executed of ngIRCd.
 | 
			
		||||
 * @param argc The number of arguments passed to ngIRCd on the command line.
 | 
			
		||||
 * @param argv An array containing all the arguments passed to ngIRCd.
 | 
			
		||||
 * @return Global exit code of ngIRCd, zero on success.
 | 
			
		||||
 */
 | 
			
		||||
GLOBAL int
 | 
			
		||||
main( int argc, const char *argv[] )
 | 
			
		||||
{
 | 
			
		||||
	struct passwd *pwd;
 | 
			
		||||
	struct group *grp;
 | 
			
		||||
	BOOLEAN ok, configtest = FALSE;
 | 
			
		||||
	LONG pid, n;
 | 
			
		||||
	INT i;
 | 
			
		||||
	bool ok, configtest = false;
 | 
			
		||||
	bool NGIRCd_NoDaemon = false;
 | 
			
		||||
	int i;
 | 
			
		||||
	size_t n;
 | 
			
		||||
 | 
			
		||||
	umask( 0077 );
 | 
			
		||||
 | 
			
		||||
	NGIRCd_SignalQuit = NGIRCd_SignalRestart = NGIRCd_SignalRehash = FALSE;
 | 
			
		||||
	NGIRCd_NoDaemon = NGIRCd_Passive = FALSE;
 | 
			
		||||
	NGIRCd_SignalQuit = NGIRCd_SignalRestart = NGIRCd_SignalRehash = false;
 | 
			
		||||
	NGIRCd_Passive = false;
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
	NGIRCd_Debug = FALSE;
 | 
			
		||||
	NGIRCd_Debug = false;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef SNIFFER
 | 
			
		||||
	NGIRCd_Sniffer = FALSE;
 | 
			
		||||
	NGIRCd_Sniffer = false;
 | 
			
		||||
#endif
 | 
			
		||||
	strlcpy( NGIRCd_ConfFile, SYSCONFDIR, sizeof( NGIRCd_ConfFile ));
 | 
			
		||||
	strlcat( NGIRCd_ConfFile, CONFIG_FILE, sizeof( NGIRCd_ConfFile ));
 | 
			
		||||
 | 
			
		||||
	Fill_Version( );
 | 
			
		||||
 | 
			
		||||
	/* Kommandozeile parsen */
 | 
			
		||||
	for( i = 1; i < argc; i++ )
 | 
			
		||||
	{
 | 
			
		||||
		ok = FALSE;
 | 
			
		||||
		ok = false;
 | 
			
		||||
		if(( argv[i][0] == '-' ) && ( argv[i][1] == '-' ))
 | 
			
		||||
		{
 | 
			
		||||
			/* Lange Option */
 | 
			
		||||
@@ -96,19 +118,19 @@ main( int argc, const char *argv[] )
 | 
			
		||||
					strlcpy( NGIRCd_ConfFile, argv[i + 1], sizeof( NGIRCd_ConfFile ));
 | 
			
		||||
 | 
			
		||||
					/* next parameter */
 | 
			
		||||
					i++; ok = TRUE;
 | 
			
		||||
					i++; ok = true;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if( strcmp( argv[i], "--configtest" ) == 0 )
 | 
			
		||||
			{
 | 
			
		||||
				configtest = TRUE;
 | 
			
		||||
				ok = TRUE;
 | 
			
		||||
				configtest = true;
 | 
			
		||||
				ok = true;
 | 
			
		||||
			}
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
			if( strcmp( argv[i], "--debug" ) == 0 )
 | 
			
		||||
			{
 | 
			
		||||
				NGIRCd_Debug = TRUE;
 | 
			
		||||
				ok = TRUE;
 | 
			
		||||
				NGIRCd_Debug = true;
 | 
			
		||||
				ok = true;
 | 
			
		||||
			}
 | 
			
		||||
#endif
 | 
			
		||||
			if( strcmp( argv[i], "--help" ) == 0 )
 | 
			
		||||
@@ -119,19 +141,19 @@ main( int argc, const char *argv[] )
 | 
			
		||||
			}
 | 
			
		||||
			if( strcmp( argv[i], "--nodaemon" ) == 0 )
 | 
			
		||||
			{
 | 
			
		||||
				NGIRCd_NoDaemon = TRUE;
 | 
			
		||||
				ok = TRUE;
 | 
			
		||||
				NGIRCd_NoDaemon = true;
 | 
			
		||||
				ok = true;
 | 
			
		||||
			}
 | 
			
		||||
			if( strcmp( argv[i], "--passive" ) == 0 )
 | 
			
		||||
			{
 | 
			
		||||
				NGIRCd_Passive = TRUE;
 | 
			
		||||
				ok = TRUE;
 | 
			
		||||
				NGIRCd_Passive = true;
 | 
			
		||||
				ok = true;
 | 
			
		||||
			}
 | 
			
		||||
#ifdef SNIFFER
 | 
			
		||||
			if( strcmp( argv[i], "--sniffer" ) == 0 )
 | 
			
		||||
			{
 | 
			
		||||
				NGIRCd_Sniffer = TRUE;
 | 
			
		||||
				ok = TRUE;
 | 
			
		||||
				NGIRCd_Sniffer = true;
 | 
			
		||||
				ok = true;
 | 
			
		||||
			}
 | 
			
		||||
#endif
 | 
			
		||||
			if( strcmp( argv[i], "--version" ) == 0 )
 | 
			
		||||
@@ -143,15 +165,14 @@ main( int argc, const char *argv[] )
 | 
			
		||||
		else if(( argv[i][0] == '-' ) && ( argv[i][1] != '-' ))
 | 
			
		||||
		{
 | 
			
		||||
			/* Kurze Option */
 | 
			
		||||
			
 | 
			
		||||
			for( n = 1; n < (LONG)strlen( argv[i] ); n++ )
 | 
			
		||||
			for( n = 1; n < strlen( argv[i] ); n++ )
 | 
			
		||||
			{
 | 
			
		||||
				ok = FALSE;
 | 
			
		||||
				ok = false;
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
				if( argv[i][n] == 'd' )
 | 
			
		||||
				{
 | 
			
		||||
					NGIRCd_Debug = TRUE;
 | 
			
		||||
					ok = TRUE;
 | 
			
		||||
					NGIRCd_Debug = true;
 | 
			
		||||
					ok = true;
 | 
			
		||||
				}
 | 
			
		||||
#endif
 | 
			
		||||
				if( argv[i][n] == 'f' )
 | 
			
		||||
@@ -162,27 +183,33 @@ main( int argc, const char *argv[] )
 | 
			
		||||
						strlcpy( NGIRCd_ConfFile, argv[i + 1], sizeof( NGIRCd_ConfFile ));
 | 
			
		||||
 | 
			
		||||
						/* go to the following parameter */
 | 
			
		||||
						i++; n = (LONG)strlen( argv[i] );
 | 
			
		||||
						ok = TRUE;
 | 
			
		||||
						i++;
 | 
			
		||||
						n = strlen( argv[i] );
 | 
			
		||||
						ok = true;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				if( argv[i][n] == 'n' )
 | 
			
		||||
				{
 | 
			
		||||
					NGIRCd_NoDaemon = TRUE;
 | 
			
		||||
					ok = TRUE;
 | 
			
		||||
					NGIRCd_NoDaemon = true;
 | 
			
		||||
					ok = true;
 | 
			
		||||
				}
 | 
			
		||||
				if( argv[i][n] == 'p' )
 | 
			
		||||
				{
 | 
			
		||||
					NGIRCd_Passive = TRUE;
 | 
			
		||||
					ok = TRUE;
 | 
			
		||||
					NGIRCd_Passive = true;
 | 
			
		||||
					ok = true;
 | 
			
		||||
				}
 | 
			
		||||
#ifdef SNIFFER
 | 
			
		||||
				if( argv[i][n] == 's' )
 | 
			
		||||
				{
 | 
			
		||||
					NGIRCd_Sniffer = TRUE;
 | 
			
		||||
					ok = TRUE;
 | 
			
		||||
					NGIRCd_Sniffer = true;
 | 
			
		||||
					ok = true;
 | 
			
		||||
				}
 | 
			
		||||
#endif
 | 
			
		||||
				if( argv[i][n] == 't' )
 | 
			
		||||
				{
 | 
			
		||||
					configtest = true;
 | 
			
		||||
					ok = true;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if( ! ok )
 | 
			
		||||
				{
 | 
			
		||||
@@ -202,14 +229,14 @@ main( int argc, const char *argv[] )
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Debug-Level (fuer IRC-Befehl "VERSION") ermitteln */
 | 
			
		||||
	strcpy( NGIRCd_DebugLevel, "" );
 | 
			
		||||
	NGIRCd_DebugLevel[0] = '\0';
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
	if( NGIRCd_Debug ) strcpy( NGIRCd_DebugLevel, "1" );
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef SNIFFER
 | 
			
		||||
	if( NGIRCd_Sniffer )
 | 
			
		||||
	{
 | 
			
		||||
		NGIRCd_Debug = TRUE;
 | 
			
		||||
		NGIRCd_Debug = true;
 | 
			
		||||
		strcpy( NGIRCd_DebugLevel, "2" );
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
@@ -223,42 +250,26 @@ main( int argc, const char *argv[] )
 | 
			
		||||
	
 | 
			
		||||
	while( ! NGIRCd_SignalQuit )
 | 
			
		||||
	{
 | 
			
		||||
		/* In der Regel wird ein Sub-Prozess ge-fork()'t, der
 | 
			
		||||
		 * nicht mehr mit dem Terminal verbunden ist. Mit der
 | 
			
		||||
		 * Option "--nodaemon" kann dies (z.B. zum Debuggen)
 | 
			
		||||
		 * verhindert werden. */
 | 
			
		||||
		if( ! NGIRCd_NoDaemon )
 | 
			
		||||
		{
 | 
			
		||||
			/* Daemon im Hintergrund erzeugen */
 | 
			
		||||
			pid = (LONG)fork( );
 | 
			
		||||
			if( pid > 0 )
 | 
			
		||||
			{
 | 
			
		||||
				/* "alter" Prozess */
 | 
			
		||||
				exit( 0 );
 | 
			
		||||
			}
 | 
			
		||||
			if( pid < 0 )
 | 
			
		||||
			{
 | 
			
		||||
				/* Fehler */
 | 
			
		||||
				printf( "%s: Can't fork: %s!\nFatal error, exiting now ...\n", PACKAGE_NAME, strerror( errno ));
 | 
			
		||||
				exit( 1 );
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/* Child-Prozess initialisieren */
 | 
			
		||||
			(VOID)setsid( );
 | 
			
		||||
			chdir( "/" );
 | 
			
		||||
		}
 | 
			
		||||
	
 | 
			
		||||
		/* Globale Variablen initialisieren */
 | 
			
		||||
		/* Initialize global variables */
 | 
			
		||||
		NGIRCd_Start = time( NULL );
 | 
			
		||||
		(VOID)strftime( NGIRCd_StartStr, 64, "%a %b %d %Y at %H:%M:%S (%Z)", localtime( &NGIRCd_Start ));
 | 
			
		||||
		NGIRCd_SignalRehash = FALSE;
 | 
			
		||||
		NGIRCd_SignalRestart = FALSE;
 | 
			
		||||
		NGIRCd_SignalQuit = FALSE;
 | 
			
		||||
		(void)strftime( NGIRCd_StartStr, 64, "%a %b %d %Y at %H:%M:%S (%Z)", localtime( &NGIRCd_Start ));
 | 
			
		||||
 | 
			
		||||
		/* Module initialisieren */
 | 
			
		||||
		Log_Init( );
 | 
			
		||||
		Resolve_Init( );
 | 
			
		||||
		NGIRCd_SignalRehash = false;
 | 
			
		||||
		NGIRCd_SignalRestart = false;
 | 
			
		||||
		NGIRCd_SignalQuit = false;
 | 
			
		||||
 | 
			
		||||
		/* Initialize modules, part I */
 | 
			
		||||
		Log_Init( ! NGIRCd_NoDaemon );
 | 
			
		||||
		Conf_Init( );
 | 
			
		||||
 | 
			
		||||
		if (!NGIRCd_Init( NGIRCd_NoDaemon )) {
 | 
			
		||||
			Log(LOG_WARNING, "Fatal: Initialization failed");
 | 
			
		||||
			exit(1);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Initialize modules, part II: these functions are eventually
 | 
			
		||||
		 * called with already dropped privileges ... */
 | 
			
		||||
		Resolve_Init( );
 | 
			
		||||
		Lists_Init( );
 | 
			
		||||
		Channel_Init( );
 | 
			
		||||
		Client_Init( );
 | 
			
		||||
@@ -267,28 +278,11 @@ main( int argc, const char *argv[] )
 | 
			
		||||
#endif
 | 
			
		||||
		Conn_Init( );
 | 
			
		||||
 | 
			
		||||
		/* Wenn als root ausgefuehrt und eine andere UID
 | 
			
		||||
		 * konfiguriert ist, jetzt zu dieser wechseln */
 | 
			
		||||
		if( getuid( ) == 0 )
 | 
			
		||||
		{
 | 
			
		||||
			if( Conf_GID != 0 )
 | 
			
		||||
			{
 | 
			
		||||
				/* Neue Group-ID setzen */
 | 
			
		||||
				if( setgid( Conf_GID ) != 0 ) Log( LOG_ERR, "Can't change Group-ID to %u: %s", Conf_GID, strerror( errno ));
 | 
			
		||||
			}
 | 
			
		||||
			if( Conf_UID != 0 )
 | 
			
		||||
			{
 | 
			
		||||
				/* Neue User-ID setzen */
 | 
			
		||||
				if( setuid( Conf_UID ) != 0 ) Log( LOG_ERR, "Can't change User-ID to %u: %s", Conf_UID, strerror( errno ));
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		/* User, Gruppe und Prozess-ID des Daemon ausgeben */
 | 
			
		||||
		pwd = getpwuid( getuid( )); grp = getgrgid( getgid( ));
 | 
			
		||||
		Log( LOG_INFO, "Running as user %s(%ld), group %s(%ld), with PID %ld.", pwd ? pwd->pw_name : "unknown", (LONG)getuid( ), grp ? grp->gr_name : "unknown", (LONG)getgid( ), (LONG)getpid( ));
 | 
			
		||||
 | 
			
		||||
		/* stderr in "Error-File" umlenken */
 | 
			
		||||
		Log_InitErrorfile( );
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
		/* Redirect stderr handle to "error file" for debugging
 | 
			
		||||
		 * when not running in "no daemon" mode: */
 | 
			
		||||
		if( ! NGIRCd_NoDaemon ) Log_InitErrorfile( );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
		/* Signal-Handler initialisieren */
 | 
			
		||||
		Initialize_Signal_Handler( );
 | 
			
		||||
@@ -297,17 +291,17 @@ main( int argc, const char *argv[] )
 | 
			
		||||
		 * beim PASS-Befehl verwendete Syntax sowie die erweiterten Flags
 | 
			
		||||
		 * sind in doc/Protocol.txt beschrieben. */
 | 
			
		||||
#ifdef IRCPLUS
 | 
			
		||||
		sprintf( NGIRCd_ProtoID, "%s%s %s|%s:%s", PROTOVER, PROTOIRCPLUS, PACKAGE_NAME, PACKAGE_VERSION, IRCPLUSFLAGS );
 | 
			
		||||
#ifdef USE_ZLIB
 | 
			
		||||
		snprintf( NGIRCd_ProtoID, sizeof NGIRCd_ProtoID, "%s%s %s|%s:%s", PROTOVER, PROTOIRCPLUS, PACKAGE_NAME, PACKAGE_VERSION, IRCPLUSFLAGS );
 | 
			
		||||
#ifdef ZLIB
 | 
			
		||||
		strcat( NGIRCd_ProtoID, "Z" );
 | 
			
		||||
#endif
 | 
			
		||||
		if( Conf_OperCanMode ) strcat( NGIRCd_ProtoID, "o" );
 | 
			
		||||
#else
 | 
			
		||||
		sprintf( NGIRCd_ProtoID, "%s%s %s|%s", PROTOVER, PROTOIRC, PACKAGE_NAME, PACKAGE_VERSION );
 | 
			
		||||
		snprintf( NGIRCd_ProtoID, sizeof NGIRCd_ProtoID, "%s%s %s|%s", PROTOVER, PROTOIRC, PACKAGE_NAME, PACKAGE_VERSION );
 | 
			
		||||
#endif
 | 
			
		||||
		strcat( NGIRCd_ProtoID, " P" );
 | 
			
		||||
#ifdef USE_ZLIB
 | 
			
		||||
		strcat( NGIRCd_ProtoID, "Z" );
 | 
			
		||||
		strlcat( NGIRCd_ProtoID, " P", sizeof NGIRCd_ProtoID );
 | 
			
		||||
#ifdef ZLIB
 | 
			
		||||
		strlcat( NGIRCd_ProtoID, "Z", sizeof NGIRCd_ProtoID );
 | 
			
		||||
#endif
 | 
			
		||||
		Log( LOG_DEBUG, "Protocol and server ID is \"%s\".", NGIRCd_ProtoID );
 | 
			
		||||
 | 
			
		||||
@@ -319,6 +313,7 @@ main( int argc, const char *argv[] )
 | 
			
		||||
		{
 | 
			
		||||
			Log( LOG_ALERT, "Server isn't listening on a single port!" );
 | 
			
		||||
			Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME );
 | 
			
		||||
			Pidfile_Delete( );
 | 
			
		||||
			exit( 1 );
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
@@ -335,106 +330,123 @@ main( int argc, const char *argv[] )
 | 
			
		||||
		Lists_Exit( );
 | 
			
		||||
		Log_Exit( );
 | 
			
		||||
	}
 | 
			
		||||
	Pidfile_Delete( );
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
} /* main */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CHAR *
 | 
			
		||||
NGIRCd_Version( VOID )
 | 
			
		||||
/**
 | 
			
		||||
 * Generate ngIRCd "version string".
 | 
			
		||||
 * This string is generated once and then stored in NGIRCd_Version for
 | 
			
		||||
 * further usage, for example by the IRC command VERSION and the --version
 | 
			
		||||
 * command line switch.
 | 
			
		||||
 */
 | 
			
		||||
LOCAL void
 | 
			
		||||
Fill_Version( void )
 | 
			
		||||
{
 | 
			
		||||
	STATIC CHAR version[126];
 | 
			
		||||
	
 | 
			
		||||
#ifdef CVSDATE
 | 
			
		||||
	sprintf( version, "%s %s(%s)-%s", PACKAGE_NAME, PACKAGE_VERSION, CVSDATE, NGIRCd_VersionAddition( ));
 | 
			
		||||
#else
 | 
			
		||||
	sprintf( version, "%s %s-%s", PACKAGE_NAME, PACKAGE_VERSION, NGIRCd_VersionAddition( ));
 | 
			
		||||
	NGIRCd_VersionAddition[0] = '\0';
 | 
			
		||||
 | 
			
		||||
#ifdef SYSLOG
 | 
			
		||||
	strlcpy( NGIRCd_VersionAddition, "SYSLOG", sizeof NGIRCd_VersionAddition );
 | 
			
		||||
#endif
 | 
			
		||||
	return version;
 | 
			
		||||
} /* NGIRCd_Version */
 | 
			
		||||
#ifdef ZLIB
 | 
			
		||||
	if( NGIRCd_VersionAddition[0] )
 | 
			
		||||
		strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CHAR *
 | 
			
		||||
NGIRCd_VersionAddition( VOID )
 | 
			
		||||
{
 | 
			
		||||
	STATIC CHAR txt[200];
 | 
			
		||||
 | 
			
		||||
	strcpy( txt, "" );
 | 
			
		||||
 | 
			
		||||
#ifdef USE_SYSLOG
 | 
			
		||||
	if( txt[0] ) strcat( txt, "+" );
 | 
			
		||||
	strcat( txt, "SYSLOG" );
 | 
			
		||||
	strlcat( NGIRCd_VersionAddition, "ZLIB", sizeof NGIRCd_VersionAddition );
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef USE_ZLIB
 | 
			
		||||
	if( txt[0] ) strcat( txt, "+" );
 | 
			
		||||
	strcat( txt, "ZLIB" );
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef USE_TCPWRAP
 | 
			
		||||
	if( txt[0] ) strcat( txt, "+" );
 | 
			
		||||
	strcat( txt, "TCPWRAP" );
 | 
			
		||||
#ifdef TCPWRAP
 | 
			
		||||
	if( NGIRCd_VersionAddition[0] )
 | 
			
		||||
			strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
 | 
			
		||||
 | 
			
		||||
	strlcat( NGIRCd_VersionAddition, "TCPWRAP", sizeof NGIRCd_VersionAddition );
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef RENDEZVOUS
 | 
			
		||||
	if( txt[0] ) strcat( txt, "+" );
 | 
			
		||||
	strcat( txt, "RENDEZVOUS" );
 | 
			
		||||
	if( NGIRCd_VersionAddition[0] )
 | 
			
		||||
		strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
 | 
			
		||||
 | 
			
		||||
	strlcat( NGIRCd_VersionAddition, "RENDEZVOUS", sizeof NGIRCd_VersionAddition );
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef IDENTAUTH
 | 
			
		||||
	if( NGIRCd_VersionAddition[0] )
 | 
			
		||||
		strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
 | 
			
		||||
 | 
			
		||||
	strlcat( NGIRCd_VersionAddition, "IDENT", sizeof NGIRCd_VersionAddition );
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
	if( txt[0] ) strcat( txt, "+" );
 | 
			
		||||
	strcat( txt, "DEBUG" );
 | 
			
		||||
	if( NGIRCd_VersionAddition[0] )
 | 
			
		||||
		strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
 | 
			
		||||
 | 
			
		||||
	strlcat( NGIRCd_VersionAddition, "DEBUG", sizeof NGIRCd_VersionAddition );
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef SNIFFER
 | 
			
		||||
	if( txt[0] ) strcat( txt, "+" );
 | 
			
		||||
	strcat( txt, "SNIFFER" );
 | 
			
		||||
	if( NGIRCd_VersionAddition[0] )
 | 
			
		||||
		strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
 | 
			
		||||
 | 
			
		||||
	strlcat( NGIRCd_VersionAddition, "SNIFFER", sizeof NGIRCd_VersionAddition );
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef STRICT_RFC
 | 
			
		||||
	if( txt[0] ) strcat( txt, "+" );
 | 
			
		||||
	strcat( txt, "RFC" );
 | 
			
		||||
	if( NGIRCd_VersionAddition[0] )
 | 
			
		||||
		strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
 | 
			
		||||
 | 
			
		||||
	strlcat( NGIRCd_VersionAddition, "RFC", sizeof NGIRCd_VersionAddition );
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef IRCPLUS
 | 
			
		||||
	if( txt[0] ) strcat( txt, "+" );
 | 
			
		||||
	strcat( txt, "IRCPLUS" );
 | 
			
		||||
	if( NGIRCd_VersionAddition[0] )
 | 
			
		||||
		strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
 | 
			
		||||
 | 
			
		||||
	strlcat( NGIRCd_VersionAddition, "IRCPLUS", sizeof NGIRCd_VersionAddition );
 | 
			
		||||
#endif
 | 
			
		||||
	
 | 
			
		||||
	if( txt[0] ) strlcat( txt, "-", sizeof( txt ));
 | 
			
		||||
	strlcat( txt, TARGET_CPU, sizeof( txt ));
 | 
			
		||||
	strlcat( txt, "/", sizeof( txt ));
 | 
			
		||||
	strlcat( txt, TARGET_VENDOR, sizeof( txt ));
 | 
			
		||||
	strlcat( txt, "/", sizeof( txt ));
 | 
			
		||||
	strlcat( txt, TARGET_OS, sizeof( txt ));
 | 
			
		||||
 | 
			
		||||
	return txt;
 | 
			
		||||
} /* NGIRCd_VersionAddition */
 | 
			
		||||
	if( NGIRCd_VersionAddition[0] )
 | 
			
		||||
		strlcat( NGIRCd_VersionAddition, "-", sizeof( NGIRCd_VersionAddition ));
 | 
			
		||||
 | 
			
		||||
	strlcat( NGIRCd_VersionAddition, TARGET_CPU, sizeof( NGIRCd_VersionAddition ));
 | 
			
		||||
	strlcat( NGIRCd_VersionAddition, "/", sizeof( NGIRCd_VersionAddition ));
 | 
			
		||||
	strlcat( NGIRCd_VersionAddition, TARGET_VENDOR, sizeof( NGIRCd_VersionAddition ));
 | 
			
		||||
	strlcat( NGIRCd_VersionAddition, "/", sizeof( NGIRCd_VersionAddition ));
 | 
			
		||||
	strlcat( NGIRCd_VersionAddition, TARGET_OS, sizeof( NGIRCd_VersionAddition ));
 | 
			
		||||
 | 
			
		||||
#ifdef CVSDATE
 | 
			
		||||
	snprintf( NGIRCd_Version, sizeof NGIRCd_Version,"%s %s(%s)-%s", PACKAGE_NAME, PACKAGE_VERSION, CVSDATE, NGIRCd_VersionAddition);
 | 
			
		||||
#else
 | 
			
		||||
	snprintf( NGIRCd_Version, sizeof NGIRCd_Version, "%s %s-%s", PACKAGE_NAME, PACKAGE_VERSION, NGIRCd_VersionAddition);
 | 
			
		||||
#endif
 | 
			
		||||
} /* Fill_Version */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
NGIRCd_Rehash( VOID )
 | 
			
		||||
/**
 | 
			
		||||
 * Reload the server configuration file.
 | 
			
		||||
 */
 | 
			
		||||
GLOBAL void
 | 
			
		||||
NGIRCd_Rehash( void )
 | 
			
		||||
{
 | 
			
		||||
	CHAR old_name[CLIENT_ID_LEN];
 | 
			
		||||
	char old_name[CLIENT_ID_LEN];
 | 
			
		||||
 | 
			
		||||
	Log( LOG_NOTICE|LOG_snotice, "Re-reading configuration NOW!" );
 | 
			
		||||
	NGIRCd_SignalRehash = FALSE;
 | 
			
		||||
	NGIRCd_SignalRehash = false;
 | 
			
		||||
 | 
			
		||||
	/* Alle Listen-Sockets schliessen */
 | 
			
		||||
	/* Close down all listening sockets */
 | 
			
		||||
	Conn_ExitListeners( );
 | 
			
		||||
 | 
			
		||||
	/* Alten Server-Namen merken */
 | 
			
		||||
	assert( sizeof( old_name ) == sizeof( Conf_ServerName ));
 | 
			
		||||
	strcpy( old_name, Conf_ServerName );
 | 
			
		||||
	/* Remember old server name */
 | 
			
		||||
	strlcpy( old_name, Conf_ServerName, sizeof old_name );
 | 
			
		||||
 | 
			
		||||
	/* Konfiguration neu lesen ... */
 | 
			
		||||
	/* Re-read configuration ... */
 | 
			
		||||
	Conf_Rehash( );
 | 
			
		||||
 | 
			
		||||
	/* Alten Server-Namen wiederherstellen: dieser
 | 
			
		||||
	 * kann nicht zur Laufzeit geaendert werden ... */
 | 
			
		||||
	/* Recover old server name: it can't be changed during run-time */
 | 
			
		||||
	if( strcmp( old_name, Conf_ServerName ) != 0 )
 | 
			
		||||
	{
 | 
			
		||||
		strcpy( Conf_ServerName, old_name );
 | 
			
		||||
		Log( LOG_ERR, "Can't change \"ServerName\" on runtime! Ignored new name." );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* neue pre-defined Channel anlegen: */
 | 
			
		||||
	/* Create new pre-defined channels */
 | 
			
		||||
	Channel_InitPredefined( );
 | 
			
		||||
	
 | 
			
		||||
	/* Listen-Sockets neu anlegen: */
 | 
			
		||||
	/* Start listening on sockets */
 | 
			
		||||
	Conn_InitListeners( );
 | 
			
		||||
 | 
			
		||||
	/* Sync configuration with established connections */
 | 
			
		||||
@@ -444,8 +456,11 @@ NGIRCd_Rehash( VOID )
 | 
			
		||||
} /* NGIRCd_Rehash */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID
 | 
			
		||||
Initialize_Signal_Handler( VOID )
 | 
			
		||||
/**
 | 
			
		||||
 * Initialize the signal handler.
 | 
			
		||||
 */
 | 
			
		||||
LOCAL void
 | 
			
		||||
Initialize_Signal_Handler( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Signal-Handler initialisieren: einige Signale
 | 
			
		||||
	 * werden ignoriert, andere speziell behandelt. */
 | 
			
		||||
@@ -491,24 +506,26 @@ Initialize_Signal_Handler( VOID )
 | 
			
		||||
} /* Initialize_Signal_Handler */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID
 | 
			
		||||
Signal_Handler( INT Signal )
 | 
			
		||||
/**
 | 
			
		||||
 * Signal handler of ngIRCd.
 | 
			
		||||
 * This function is called whenever ngIRCd catches a signal sent by the
 | 
			
		||||
 * user and/or the system to it. For example SIGTERM and SIGHUP.
 | 
			
		||||
 * @param Signal Number of the signal to handle.
 | 
			
		||||
 */
 | 
			
		||||
LOCAL void
 | 
			
		||||
Signal_Handler( int Signal )
 | 
			
		||||
{
 | 
			
		||||
	/* Signal-Handler. Dieser wird aufgerufen, wenn eines der Signale eintrifft,
 | 
			
		||||
	 * fuer das wir uns registriert haben (vgl. Initialize_Signal_Handler). Die
 | 
			
		||||
	 * Nummer des eingetroffenen Signals wird der Funktion uebergeben. */
 | 
			
		||||
 | 
			
		||||
	switch( Signal )
 | 
			
		||||
	{
 | 
			
		||||
		case SIGTERM:
 | 
			
		||||
		case SIGINT:
 | 
			
		||||
		case SIGQUIT:
 | 
			
		||||
			/* wir soll(t)en uns wohl beenden ... */
 | 
			
		||||
			NGIRCd_SignalQuit = TRUE;
 | 
			
		||||
			NGIRCd_SignalQuit = true;
 | 
			
		||||
			break;
 | 
			
		||||
		case SIGHUP:
 | 
			
		||||
			/* Konfiguration neu einlesen: */
 | 
			
		||||
			NGIRCd_SignalRehash = TRUE;
 | 
			
		||||
			NGIRCd_SignalRehash = true;
 | 
			
		||||
			break;
 | 
			
		||||
		case SIGCHLD:
 | 
			
		||||
			/* Child-Prozess wurde beendet. Zombies vermeiden: */
 | 
			
		||||
@@ -523,33 +540,272 @@ Signal_Handler( INT Signal )
 | 
			
		||||
} /* Signal_Handler */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID
 | 
			
		||||
Show_Version( VOID )
 | 
			
		||||
/**
 | 
			
		||||
 * Display copyright and version information of ngIRCd on the console.
 | 
			
		||||
 */
 | 
			
		||||
LOCAL void
 | 
			
		||||
Show_Version( void )
 | 
			
		||||
{
 | 
			
		||||
	puts( NGIRCd_Version( ));
 | 
			
		||||
	puts( "Copyright (c)2001-2003 by Alexander Barton (<alex@barton.de>)." );
 | 
			
		||||
	puts( NGIRCd_Version );
 | 
			
		||||
	puts( "Copyright (c)2001-2005 by Alexander Barton (<alex@barton.de>)." );
 | 
			
		||||
	puts( "Homepage: <http://arthur.ath.cx/~alex/ngircd/>\n" );
 | 
			
		||||
	puts( "This is free software; see the source for copying conditions. There is NO" );
 | 
			
		||||
	puts( "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." );
 | 
			
		||||
} /* Show_Version */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID
 | 
			
		||||
Show_Help( VOID )
 | 
			
		||||
/**
 | 
			
		||||
 * Display a short help text on the console.
 | 
			
		||||
 * This help depends on the configuration of the executable and only shows
 | 
			
		||||
 * options that are actually enabled.
 | 
			
		||||
 */
 | 
			
		||||
LOCAL void
 | 
			
		||||
Show_Help( void )
 | 
			
		||||
{
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
	puts( "  -d, --debug        log extra debug messages" );
 | 
			
		||||
#endif
 | 
			
		||||
	puts( "  -f, --config <f>   use file <f> as configuration file" );
 | 
			
		||||
        puts( "  -n, --nodaemon     don't fork and don't detach from controlling terminal" );
 | 
			
		||||
        puts( "  -p, --passive      disable automatic connections to other servers" );
 | 
			
		||||
	puts( "  -n, --nodaemon     don't fork and don't detach from controlling terminal" );
 | 
			
		||||
	puts( "  -p, --passive      disable automatic connections to other servers" );
 | 
			
		||||
#ifdef SNIFFER
 | 
			
		||||
	puts( "  -s, --sniffer      enable network sniffer and display all IRC traffic" );
 | 
			
		||||
#endif
 | 
			
		||||
	puts( "      --configtest   read, validate and display configuration; then exit" );
 | 
			
		||||
	puts( "  -t, --configtest   read, validate and display configuration; then exit" );
 | 
			
		||||
 	puts( "      --version      output version information and exit" );
 | 
			
		||||
	puts( "      --help         display this help and exit" );
 | 
			
		||||
} /* Show_Help */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Delete the file containing the process ID (PID).
 | 
			
		||||
 */
 | 
			
		||||
LOCAL void
 | 
			
		||||
Pidfile_Delete( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Pidfile configured? */
 | 
			
		||||
	if( ! Conf_PidFile[0] ) return;
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
	Log( LOG_DEBUG, "Removing PID file (%s) ...", Conf_PidFile );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	if( unlink( Conf_PidFile ))
 | 
			
		||||
		Log( LOG_ERR, "Error unlinking PID file (%s): %s", Conf_PidFile, strerror( errno ));
 | 
			
		||||
} /* Pidfile_Delete */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Create the file containing the process ID of ngIRCd ("PID file").
 | 
			
		||||
 * @param pid The process ID to be stored in this file.
 | 
			
		||||
 */
 | 
			
		||||
LOCAL void
 | 
			
		||||
Pidfile_Create( long pid )
 | 
			
		||||
{
 | 
			
		||||
	int pidfd;
 | 
			
		||||
	char pidbuf[64];
 | 
			
		||||
	int len;
 | 
			
		||||
 | 
			
		||||
	/* Pidfile configured? */
 | 
			
		||||
	if( ! Conf_PidFile[0] ) return;
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
	Log( LOG_DEBUG, "Creating PID file (%s) ...", Conf_PidFile );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	pidfd = open( Conf_PidFile, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
 | 
			
		||||
	if ( pidfd < 0 ) {
 | 
			
		||||
		Log( LOG_ERR, "Error writing PID file (%s): %s", Conf_PidFile, strerror( errno ));
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	len = snprintf( pidbuf, sizeof pidbuf, "%ld\n", pid );
 | 
			
		||||
	if (len < 0|| len < (int)sizeof pid) {
 | 
			
		||||
		Log( LOG_ERR, "Error converting pid");
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	if( write( pidfd, pidbuf, len) != len)
 | 
			
		||||
		Log( LOG_ERR, "Can't write PID file (%s): %s", Conf_PidFile, strerror( errno ));
 | 
			
		||||
 | 
			
		||||
	if( close(pidfd) != 0 )
 | 
			
		||||
		Log( LOG_ERR, "Error closing PID file (%s): %s", Conf_PidFile, strerror( errno ));
 | 
			
		||||
} /* Pidfile_Create */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Redirect stdin, stdout and stderr to apropriate file handles.
 | 
			
		||||
 */
 | 
			
		||||
LOCAL void
 | 
			
		||||
Setup_FDStreams( void )
 | 
			
		||||
{
 | 
			
		||||
	int fd;
 | 
			
		||||
 | 
			
		||||
	/* Test if we can open /dev/null for reading and writing. If not
 | 
			
		||||
	 * we are most probably chrooted already and the server has been
 | 
			
		||||
	 * restarted. So we simply don't try to redirect stdXXX ... */
 | 
			
		||||
	fd = open( "/dev/null", O_RDWR );
 | 
			
		||||
	if ( fd < 0 ) {
 | 
			
		||||
		Log(LOG_WARNING, "Could not open /dev/null: %s", strerror(errno));	
 | 
			
		||||
		return;
 | 
			
		||||
	} 
 | 
			
		||||
 | 
			
		||||
	fflush(stdout);
 | 
			
		||||
	fflush(stderr);
 | 
			
		||||
 | 
			
		||||
	/* Create new stdin(0), stdout(1) and stderr(2) descriptors */
 | 
			
		||||
	dup2( fd, 0 ); dup2( fd, 1 ); dup2( fd, 2 );
 | 
			
		||||
 | 
			
		||||
	/* Close newly opened file descriptor if not stdin/out/err */
 | 
			
		||||
	if( fd > 2 ) close( fd );
 | 
			
		||||
} /* Setup_FDStreams */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL bool
 | 
			
		||||
NGIRCd_getNobodyID(unsigned int *uid, unsigned int *gid )
 | 
			
		||||
{
 | 
			
		||||
	struct passwd *pwd;
 | 
			
		||||
 | 
			
		||||
	pwd = getpwnam("nobody");
 | 
			
		||||
	if (!pwd) return false;
 | 
			
		||||
 | 
			
		||||
	if ( !pwd->pw_uid || !pwd->pw_gid)
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	*uid = pwd->pw_uid;	
 | 
			
		||||
	*gid = pwd->pw_gid;
 | 
			
		||||
	endpwent();
 | 
			
		||||
 | 
			
		||||
	return true;	
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL bool
 | 
			
		||||
NGIRCd_Init( bool NGIRCd_NoDaemon ) 
 | 
			
		||||
{
 | 
			
		||||
	static bool initialized;
 | 
			
		||||
	bool chrooted = false;
 | 
			
		||||
	struct passwd *pwd;
 | 
			
		||||
	struct group *grp;
 | 
			
		||||
	int real_errno;
 | 
			
		||||
	long pid;
 | 
			
		||||
 | 
			
		||||
	if (initialized)
 | 
			
		||||
		return true;
 | 
			
		||||
 | 
			
		||||
	if( Conf_Chroot[0] ) {
 | 
			
		||||
		if( chdir( Conf_Chroot ) != 0 ) {
 | 
			
		||||
			Log( LOG_ERR, "Can't chdir() in ChrootDir (%s): %s", Conf_Chroot, strerror( errno ));
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if( chroot( Conf_Chroot ) != 0 ) {
 | 
			
		||||
			if (errno != EPERM) {
 | 
			
		||||
				Log( LOG_ERR, "Can't change root directory to \"%s\": %s",
 | 
			
		||||
								Conf_Chroot, strerror( errno ));
 | 
			
		||||
 | 
			
		||||
				return false;
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			chrooted = true;
 | 
			
		||||
			Log( LOG_INFO, "Changed root and working directory to \"%s\".", Conf_Chroot );
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (Conf_UID == 0) {
 | 
			
		||||
		Log(LOG_INFO, "ServerUID must not be 0, using \"nobody\" instead.", Conf_UID);
 | 
			
		||||
 | 
			
		||||
  		if (! NGIRCd_getNobodyID(&Conf_UID, &Conf_GID)) {
 | 
			
		||||
			Log(LOG_WARNING, "Could not get user/group ID of user \"nobody\": %s",
 | 
			
		||||
					errno ? strerror(errno) : "not found" );
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (getgid() != Conf_GID) {
 | 
			
		||||
		/* Change group ID */
 | 
			
		||||
		if (setgid(Conf_GID) != 0) {
 | 
			
		||||
			real_errno = errno;
 | 
			
		||||
			Log( LOG_ERR, "Can't change group ID to %u: %s", Conf_GID, strerror( errno ));
 | 
			
		||||
			if (real_errno != EPERM) 
 | 
			
		||||
				return false;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (getuid() != Conf_UID) {
 | 
			
		||||
		/* Change user ID */
 | 
			
		||||
		if (setuid(Conf_UID) != 0) {
 | 
			
		||||
			real_errno = errno;
 | 
			
		||||
			Log(LOG_ERR, "Can't change user ID to %u: %s", Conf_UID, strerror(errno));
 | 
			
		||||
			if (real_errno != EPERM) 
 | 
			
		||||
				return false;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	initialized = true;
 | 
			
		||||
 | 
			
		||||
	/* Normally a child process is forked which isn't any longer
 | 
			
		||||
	 * connected to ther controlling terminal. Use "--nodaemon"
 | 
			
		||||
	 * to disable this "daemon mode" (useful for debugging). */
 | 
			
		||||
	if ( ! NGIRCd_NoDaemon ) {
 | 
			
		||||
		pid = (long)fork( );
 | 
			
		||||
		if( pid > 0 ) {
 | 
			
		||||
			/* "Old" process: exit. */
 | 
			
		||||
			exit( 0 );
 | 
			
		||||
		}
 | 
			
		||||
		if( pid < 0 ) {
 | 
			
		||||
			/* Error!? */
 | 
			
		||||
			fprintf( stderr, "%s: Can't fork: %s!\nFatal error, exiting now ...\n",
 | 
			
		||||
								PACKAGE_NAME, strerror( errno ));
 | 
			
		||||
			exit( 1 );
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* New child process */
 | 
			
		||||
		(void)setsid( );
 | 
			
		||||
		chdir( "/" );
 | 
			
		||||
 | 
			
		||||
		/* Detach stdin, stdout and stderr */
 | 
			
		||||
		Setup_FDStreams( );
 | 
			
		||||
	}
 | 
			
		||||
	pid = getpid();
 | 
			
		||||
 | 
			
		||||
	Pidfile_Create( pid );
 | 
			
		||||
 | 
			
		||||
	/* Check UID/GID we are running as, can be different from values
 | 
			
		||||
	 * configured (e. g. if we were already started with a UID>0. */
 | 
			
		||||
	Conf_UID = getuid();
 | 
			
		||||
	Conf_GID = getgid();
 | 
			
		||||
 | 
			
		||||
	pwd = getpwuid( Conf_UID );
 | 
			
		||||
	grp = getgrgid( Conf_GID );
 | 
			
		||||
 | 
			
		||||
	Log( LOG_INFO, "Running as user %s(%ld), group %s(%ld), with PID %ld.",
 | 
			
		||||
				pwd ? pwd->pw_name : "unknown", Conf_UID,
 | 
			
		||||
				grp ? grp->gr_name : "unknown", Conf_GID, pid);
 | 
			
		||||
 | 
			
		||||
	if ( chrooted ) {
 | 
			
		||||
		Log( LOG_INFO, "Running chrooted, chrootdir \"%s\".",  Conf_Chroot );
 | 
			
		||||
		return true;
 | 
			
		||||
	} else {
 | 
			
		||||
		Log( LOG_INFO, "Not running chrooted." );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Change working directory to home directory of the user
 | 
			
		||||
	 * we are running as (only when running in daemon mode and not in chroot) */
 | 
			
		||||
	
 | 
			
		||||
	if ( pwd ) {
 | 
			
		||||
		if (!NGIRCd_NoDaemon ) {
 | 
			
		||||
			if( chdir( pwd->pw_dir ) == 0 ) 
 | 
			
		||||
				Log( LOG_DEBUG, "Changed working directory to \"%s\" ...", pwd->pw_dir );
 | 
			
		||||
			else 
 | 
			
		||||
				Log( LOG_ERR, "Can't change working directory to \"%s\": %s",
 | 
			
		||||
								pwd->pw_dir, strerror( errno ));
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		Log( LOG_ERR, "Can't get user informaton for UID %d!?", Conf_UID );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* -eof- */
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: ngircd.h,v 1.19 2002/12/26 16:48:14 alex Exp $
 | 
			
		||||
 * $Id: ngircd.h,v 1.22 2005/06/24 19:20:56 fw Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * Prototypes of the "main module".
 | 
			
		||||
 */
 | 
			
		||||
@@ -23,35 +23,32 @@
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL time_t NGIRCd_Start;		/* Startzeitpunkt des Daemon */
 | 
			
		||||
GLOBAL CHAR NGIRCd_StartStr[64];
 | 
			
		||||
GLOBAL char NGIRCd_StartStr[64];
 | 
			
		||||
GLOBAL char NGIRCd_Version[126];
 | 
			
		||||
GLOBAL char NGIRCd_VersionAddition[126];
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
GLOBAL BOOLEAN NGIRCd_Debug;		/* Debug-Modus aktivieren */
 | 
			
		||||
GLOBAL bool NGIRCd_Debug;		/* Debug-Modus aktivieren */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SNIFFER
 | 
			
		||||
GLOBAL BOOLEAN NGIRCd_Sniffer;		/* Sniffer aktivieren */
 | 
			
		||||
GLOBAL bool NGIRCd_Sniffer;		/* Sniffer aktivieren */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN NGIRCd_NoDaemon;		/* nicht im Hintergrund laufen */
 | 
			
		||||
GLOBAL bool NGIRCd_Passive;		/* nicht zu anderen Servern connecten */
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN NGIRCd_Passive;		/* nicht zu anderen Servern connecten */
 | 
			
		||||
GLOBAL bool NGIRCd_SignalQuit;	/* true: quit server*/
 | 
			
		||||
GLOBAL bool NGIRCd_SignalRestart;	/* true: restart server */
 | 
			
		||||
GLOBAL bool NGIRCd_SignalRehash;	/* true: reload configuration */
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN NGIRCd_SignalQuit;	/* TRUE: quit server*/
 | 
			
		||||
GLOBAL BOOLEAN NGIRCd_SignalRestart;	/* TRUE: restart server */
 | 
			
		||||
GLOBAL BOOLEAN NGIRCd_SignalRehash;	/* TRUE: reload configuration */
 | 
			
		||||
GLOBAL char NGIRCd_DebugLevel[2];	/* Debug-Level fuer IRC_VERSION() */
 | 
			
		||||
 | 
			
		||||
GLOBAL CHAR NGIRCd_DebugLevel[2];	/* Debug-Level fuer IRC_VERSION() */
 | 
			
		||||
GLOBAL char NGIRCd_ConfFile[FNAME_LEN];	/* Konfigurationsdatei */
 | 
			
		||||
 | 
			
		||||
GLOBAL CHAR NGIRCd_ConfFile[FNAME_LEN];	/* Konfigurationsdatei */
 | 
			
		||||
 | 
			
		||||
GLOBAL CHAR NGIRCd_ProtoID[COMMAND_LEN];/* Protokoll- und Server-Identifikation */
 | 
			
		||||
GLOBAL char NGIRCd_ProtoID[COMMAND_LEN];/* Protokoll- und Server-Identifikation */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CHAR *NGIRCd_Version PARAMS((VOID ));
 | 
			
		||||
GLOBAL CHAR *NGIRCd_VersionAddition PARAMS((VOID ));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID NGIRCd_Rehash PARAMS(( VOID ));
 | 
			
		||||
GLOBAL void NGIRCd_Rehash PARAMS(( void ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -7,20 +7,24 @@
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * IRC command parser and validator
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: parse.c,v 1.59 2003/01/15 13:49:20 alex Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: parse.c,v 1.63.2.1 2005/07/24 21:06:51 alex Exp $";
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * IRC command parser and validator.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <strings.h>
 | 
			
		||||
 | 
			
		||||
#include "ngircd.h"
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
@@ -99,32 +103,52 @@ COMMAND My_Commands[] =
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID Init_Request PARAMS(( REQUEST *Req ));
 | 
			
		||||
LOCAL void Init_Request PARAMS(( REQUEST *Req ));
 | 
			
		||||
 | 
			
		||||
LOCAL BOOLEAN Validate_Prefix PARAMS(( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed ));
 | 
			
		||||
LOCAL BOOLEAN Validate_Command PARAMS(( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed ));
 | 
			
		||||
LOCAL BOOLEAN Validate_Args PARAMS(( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed ));
 | 
			
		||||
LOCAL bool Validate_Prefix PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed ));
 | 
			
		||||
LOCAL bool Validate_Command PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed ));
 | 
			
		||||
LOCAL bool Validate_Args PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed ));
 | 
			
		||||
 | 
			
		||||
LOCAL BOOLEAN Handle_Request PARAMS(( CONN_ID Idx, REQUEST *Req ));
 | 
			
		||||
LOCAL bool Handle_Request PARAMS(( CONN_ID Idx, REQUEST *Req ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Return the pointer to the global "IRC command structure".
 | 
			
		||||
 * This structure, an array of type "COMMAND" describes all the IRC commands
 | 
			
		||||
 * implemented by ngIRCd and how to handle them.
 | 
			
		||||
 * @return Pointer to the global command structure.
 | 
			
		||||
 */
 | 
			
		||||
GLOBAL COMMAND *
 | 
			
		||||
Parse_GetCommandStruct( VOID )
 | 
			
		||||
Parse_GetCommandStruct( void )
 | 
			
		||||
{
 | 
			
		||||
	return My_Commands;
 | 
			
		||||
} /* Parse_GetCommandStruct */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN
 | 
			
		||||
Parse_Request( CONN_ID Idx, CHAR *Request )
 | 
			
		||||
/**
 | 
			
		||||
 * Parse a command ("request") received from a client.
 | 
			
		||||
 * 
 | 
			
		||||
 * This function is called after the connection layer received a valid CR+LF
 | 
			
		||||
 * terminated line of text: we asume that this is a valid IRC command and
 | 
			
		||||
 * try to do something useful with it :-)
 | 
			
		||||
 *
 | 
			
		||||
 * All errors are reported to the client from which the command has been
 | 
			
		||||
 * received, and if the error is fatal this connection is closed down.
 | 
			
		||||
 *
 | 
			
		||||
 * This function is able to parse the syntax as described in RFC 2812,
 | 
			
		||||
 * section 2.3.
 | 
			
		||||
 *
 | 
			
		||||
 * @param Idx Index of the connection from which the command has been received.
 | 
			
		||||
 * @param Request NULL terminated line of text (the "command").
 | 
			
		||||
 * @return true on success (valid command or "regular" error), false if a
 | 
			
		||||
 * 	fatal error occured and the connection has been shut down.
 | 
			
		||||
 */
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Parse_Request( CONN_ID Idx, char *Request )
 | 
			
		||||
{
 | 
			
		||||
	/* Client-Request parsen. Bei einem schwerwiegenden Fehler wird
 | 
			
		||||
	 * die Verbindung geschlossen und FALSE geliefert.
 | 
			
		||||
	 * Der Aufbau gueltiger Requests ist in RFC 2812, 2.3 definiert. */
 | 
			
		||||
 | 
			
		||||
	REQUEST req;
 | 
			
		||||
	CHAR *start, *ptr;
 | 
			
		||||
	BOOLEAN closed;
 | 
			
		||||
	char *start, *ptr;
 | 
			
		||||
	bool closed;
 | 
			
		||||
 | 
			
		||||
	assert( Idx >= 0 );
 | 
			
		||||
	assert( Request != NULL );
 | 
			
		||||
@@ -219,12 +243,16 @@ Parse_Request( CONN_ID Idx, CHAR *Request )
 | 
			
		||||
} /* Parse_Request */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID
 | 
			
		||||
/**
 | 
			
		||||
 * Initialize request structure.
 | 
			
		||||
 * @param Req Request structure to be initialized.
 | 
			
		||||
 */
 | 
			
		||||
LOCAL void
 | 
			
		||||
Init_Request( REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	/* Neue Request-Struktur initialisieren */
 | 
			
		||||
 | 
			
		||||
	INT i;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
 | 
			
		||||
@@ -235,18 +263,18 @@ Init_Request( REQUEST *Req )
 | 
			
		||||
} /* Init_Request */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL BOOLEAN
 | 
			
		||||
Validate_Prefix( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed )
 | 
			
		||||
LOCAL bool
 | 
			
		||||
Validate_Prefix( CONN_ID Idx, REQUEST *Req, bool *Closed )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *client, *c;
 | 
			
		||||
 | 
			
		||||
	assert( Idx >= 0 );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
 | 
			
		||||
	*Closed = FALSE;
 | 
			
		||||
	*Closed = false;
 | 
			
		||||
 | 
			
		||||
	/* ist ueberhaupt ein Prefix vorhanden? */
 | 
			
		||||
	if( ! Req->prefix ) return TRUE;
 | 
			
		||||
	if( ! Req->prefix ) return true;
 | 
			
		||||
 | 
			
		||||
	/* Client-Struktur der Connection ermitteln */
 | 
			
		||||
	client = Client_GetFromConn( Idx );
 | 
			
		||||
@@ -258,7 +286,7 @@ Validate_Prefix( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed )
 | 
			
		||||
		/* noch nicht registrierte Verbindung.
 | 
			
		||||
		 * Das Prefix wird ignoriert. */
 | 
			
		||||
		Req->prefix = NULL;
 | 
			
		||||
		return TRUE;
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* pruefen, ob der im Prefix angegebene Client bekannt ist */
 | 
			
		||||
@@ -267,8 +295,8 @@ Validate_Prefix( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed )
 | 
			
		||||
	{
 | 
			
		||||
		/* im Prefix angegebener Client ist nicht bekannt */
 | 
			
		||||
		Log( LOG_ERR, "Invalid prefix \"%s\", client not known (connection %d, command %s)!?", Req->prefix, Idx, Req->command );
 | 
			
		||||
		if( ! Conn_WriteStr( Idx, "ERROR :Invalid prefix \"%s\", client not known!?", Req->prefix )) *Closed = TRUE;
 | 
			
		||||
		return FALSE;
 | 
			
		||||
		if( ! Conn_WriteStr( Idx, "ERROR :Invalid prefix \"%s\", client not known!?", Req->prefix )) *Closed = true;
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* pruefen, ob der Client mit dem angegebenen Prefix in Richtung
 | 
			
		||||
@@ -279,48 +307,48 @@ Validate_Prefix( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed )
 | 
			
		||||
		/* das angegebene Prefix ist aus dieser Richtung, also
 | 
			
		||||
		 * aus der gegebenen Connection, ungueltig! */
 | 
			
		||||
		Log( LOG_ERR, "Spoofed prefix \"%s\" from \"%s\" (connection %d, command %s)!", Req->prefix, Client_Mask( Client_GetFromConn( Idx )), Idx, Req->command );
 | 
			
		||||
		Conn_Close( Idx, NULL, "Spoofed prefix", TRUE );
 | 
			
		||||
		*Closed = TRUE;
 | 
			
		||||
		return FALSE;
 | 
			
		||||
		Conn_Close( Idx, NULL, "Spoofed prefix", true);
 | 
			
		||||
		*Closed = true;
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return TRUE;
 | 
			
		||||
	return true;
 | 
			
		||||
} /* Validate_Prefix */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL BOOLEAN
 | 
			
		||||
Validate_Command( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed )
 | 
			
		||||
LOCAL bool
 | 
			
		||||
Validate_Command( UNUSED CONN_ID Idx, UNUSED REQUEST *Req, bool *Closed )
 | 
			
		||||
{
 | 
			
		||||
	assert( Idx >= 0 );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
	*Closed = FALSE;
 | 
			
		||||
	*Closed = false;
 | 
			
		||||
 | 
			
		||||
	return TRUE;
 | 
			
		||||
	return true;
 | 
			
		||||
} /* Validate_Comman */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL BOOLEAN
 | 
			
		||||
Validate_Args( CONN_ID Idx, REQUEST *Req, BOOLEAN *Closed )
 | 
			
		||||
LOCAL bool
 | 
			
		||||
Validate_Args( UNUSED CONN_ID Idx, UNUSED REQUEST *Req, bool *Closed )
 | 
			
		||||
{
 | 
			
		||||
	assert( Idx >= 0 );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
	*Closed = FALSE;
 | 
			
		||||
	*Closed = false;
 | 
			
		||||
 | 
			
		||||
	return TRUE;
 | 
			
		||||
	return true;
 | 
			
		||||
} /* Validate_Args */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL BOOLEAN
 | 
			
		||||
LOCAL bool
 | 
			
		||||
Handle_Request( CONN_ID Idx, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	/* Client-Request verarbeiten. Bei einem schwerwiegenden Fehler
 | 
			
		||||
	 * wird die Verbindung geschlossen und FALSE geliefert. */
 | 
			
		||||
	 * wird die Verbindung geschlossen und false geliefert. */
 | 
			
		||||
 | 
			
		||||
	CLIENT *client, *target, *prefix;
 | 
			
		||||
	CHAR str[LINE_LEN];
 | 
			
		||||
	BOOLEAN result;
 | 
			
		||||
	char str[LINE_LEN];
 | 
			
		||||
	bool result;
 | 
			
		||||
	COMMAND *cmd;
 | 
			
		||||
	INT i;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	assert( Idx >= 0 );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
@@ -342,13 +370,13 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
 | 
			
		||||
			/* Status code without target!? */
 | 
			
		||||
			if( Req->argc > 0 ) Log( LOG_WARNING, "Unknown target for status code %s: \"%s\"", Req->command, Req->argv[0] );
 | 
			
		||||
			else Log( LOG_WARNING, "Unknown target for status code %s!", Req->command );
 | 
			
		||||
			return TRUE;
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
		if( target == Client_ThisServer( ))
 | 
			
		||||
		{
 | 
			
		||||
			/* This server is the target, ignore it */
 | 
			
		||||
			Log( LOG_DEBUG, "Ignored status code %s from \"%s\".", Req->command, Client_ID( client ));
 | 
			
		||||
			return TRUE;
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Determine source */
 | 
			
		||||
@@ -356,14 +384,14 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
 | 
			
		||||
		{
 | 
			
		||||
			/* Oops, no prefix!? */
 | 
			
		||||
			Log( LOG_WARNING, "Got status code %s from \"%s\" without prefix!?", Req->command, Client_ID( client ));
 | 
			
		||||
			return TRUE;
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
		else prefix = Client_Search( Req->prefix );
 | 
			
		||||
		if( ! prefix )
 | 
			
		||||
		{
 | 
			
		||||
			/* Oops, unknown prefix!? */
 | 
			
		||||
			Log( LOG_WARNING, "Got status code %s from unknown source: \"%s\"", Req->command, Req->prefix );
 | 
			
		||||
			return TRUE;
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Forward status code */
 | 
			
		||||
@@ -405,11 +433,23 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
 | 
			
		||||
			return IRC_WriteStrClient( client, ERR_NOTREGISTERED_MSG, Client_ID( client ));
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if( Client_Type( client ) != CLIENT_USER &&
 | 
			
		||||
	    Client_Type( client ) != CLIENT_SERVER &&
 | 
			
		||||
	    Client_Type( client ) != CLIENT_SERVICE )
 | 
			
		||||
		return true;
 | 
			
		||||
	
 | 
			
		||||
	/* Unbekannter Befehl */
 | 
			
		||||
	Log( LOG_DEBUG, "Connection %d: Unknown command \"%s\", %d %s,%s prefix.", Client_Conn( client ), Req->command, Req->argc, Req->argc == 1 ? "parameter" : "parameters", Req->prefix ? "" : " no" );
 | 
			
		||||
	if( Client_Type( client ) != CLIENT_SERVER ) return IRC_WriteStrClient( client, ERR_UNKNOWNCOMMAND_MSG, Client_ID( client ), Req->command );
 | 
			
		||||
	else return TRUE;
 | 
			
		||||
	/* Unknown command and registered connection: generate error: */
 | 
			
		||||
	Log( LOG_DEBUG, "Connection %d: Unknown command \"%s\", %d %s,%s prefix.",
 | 
			
		||||
			Client_Conn( client ), Req->command, Req->argc,
 | 
			
		||||
			Req->argc == 1 ? "parameter" : "parameters",
 | 
			
		||||
			Req->prefix ? "" : " no" );
 | 
			
		||||
 | 
			
		||||
	if( Client_Type( client ) != CLIENT_SERVER )
 | 
			
		||||
		return IRC_WriteStrClient( client, ERR_UNKNOWNCOMMAND_MSG,
 | 
			
		||||
				Client_ID( client ), Req->command );
 | 
			
		||||
 | 
			
		||||
	return true;
 | 
			
		||||
} /* Handle_Request */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: parse.h,v 1.10 2003/01/03 22:03:51 alex Exp $
 | 
			
		||||
 * $Id: parse.h,v 1.11 2005/03/19 18:43:49 fw Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * IRC command parser and validator (header)
 | 
			
		||||
 */
 | 
			
		||||
@@ -17,29 +17,30 @@
 | 
			
		||||
#ifndef __parse_h__
 | 
			
		||||
#define __parse_h__
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
typedef struct _REQUEST			/* vgl. RFC 2812, 2.3 */
 | 
			
		||||
{
 | 
			
		||||
	CHAR *prefix;			/* Prefix */
 | 
			
		||||
	CHAR *command;			/* IRC-Befehl */
 | 
			
		||||
	CHAR *argv[15];			/* Parameter (max. 15: 0..14) */
 | 
			
		||||
	INT argc;			/* Anzahl vorhandener Parameter */
 | 
			
		||||
	char *prefix;			/* Prefix */
 | 
			
		||||
	char *command;			/* IRC-Befehl */
 | 
			
		||||
	char *argv[15];			/* Parameter (max. 15: 0..14) */
 | 
			
		||||
	int argc;			/* Anzahl vorhandener Parameter */
 | 
			
		||||
} REQUEST;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct _COMMAND
 | 
			
		||||
{
 | 
			
		||||
	CHAR *name;		/* command name */
 | 
			
		||||
	BOOLEAN (*function) PARAMS(( CLIENT *Client, REQUEST *Request ));
 | 
			
		||||
	CLIENT_TYPE type;	/* valid client types (bit mask) */
 | 
			
		||||
	LONG lcount, rcount;	/* number of local and remote calls */
 | 
			
		||||
	LONG bytes;		/* number of bytes created */
 | 
			
		||||
	char *name;			/* command name */
 | 
			
		||||
	bool (*function) PARAMS(( CLIENT *Client, REQUEST *Request ));
 | 
			
		||||
	CLIENT_TYPE type;		/* valid client types (bit mask) */
 | 
			
		||||
	long lcount, rcount;	/* number of local and remote calls */
 | 
			
		||||
	long bytes;		/* number of bytes created */
 | 
			
		||||
} COMMAND;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN 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 ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 * Copyright (c)2001-2004 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
@@ -8,7 +8,11 @@
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * Rendezvous service registration (using Mach Ports, e.g. Mac OS X)
 | 
			
		||||
 * Rendezvous service registration.
 | 
			
		||||
 *
 | 
			
		||||
 * Supported APIs are:
 | 
			
		||||
 *  - Apple Mac OS X
 | 
			
		||||
 *  - Howl
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -17,7 +21,7 @@
 | 
			
		||||
#ifdef RENDEZVOUS
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: rendezvous.c,v 1.2 2003/03/27 01:24:32 alex Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: rendezvous.c,v 1.5 2005/03/19 18:43:49 fw Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
@@ -34,6 +38,10 @@ static char UNUSED id[] = "$Id: rendezvous.c,v 1.2 2003/03/27 01:24:32 alex Exp
 | 
			
		||||
#include <DNSServiceDiscovery/DNSServiceDiscovery.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_RENDEZVOUS_RENDEZVOUS_H
 | 
			
		||||
#include <rendezvous/rendezvous.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
 | 
			
		||||
@@ -41,73 +49,124 @@ static char UNUSED id[] = "$Id: rendezvous.c,v 1.2 2003/03/27 01:24:32 alex Exp
 | 
			
		||||
#include "rendezvous.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct _service
 | 
			
		||||
{
 | 
			
		||||
	dns_service_discovery_ref Discovery_Ref;
 | 
			
		||||
	mach_port_t Mach_Port;
 | 
			
		||||
	CHAR Desc[CLIENT_ID_LEN];
 | 
			
		||||
} SERVICE;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrCode, VOID *Context );
 | 
			
		||||
LOCAL VOID Unregister( INT Idx );
 | 
			
		||||
#if defined(HAVE_DNSSERVICEREGISTRATIONCREATE)
 | 
			
		||||
#	define APPLE
 | 
			
		||||
#elif defined(HAVE_SW_DISCOVERY_INIT)
 | 
			
		||||
#	define HOWL
 | 
			
		||||
#else
 | 
			
		||||
#	error "Can't detect Rendezvous API!?"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define MAX_RENDEZVOUS 1000
 | 
			
		||||
#define MAX_MACH_MSG_SIZE 512
 | 
			
		||||
 | 
			
		||||
typedef struct _service
 | 
			
		||||
{
 | 
			
		||||
	char Desc[CLIENT_ID_LEN];
 | 
			
		||||
#ifdef APPLE
 | 
			
		||||
	dns_service_discovery_ref Discovery_Ref;
 | 
			
		||||
	mach_port_t Mach_Port;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef HOWL
 | 
			
		||||
	sw_discovery_oid Id;
 | 
			
		||||
#endif
 | 
			
		||||
} SERVICE;
 | 
			
		||||
 | 
			
		||||
LOCAL SERVICE My_Rendezvous[MAX_RENDEZVOUS];
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Rendezvous_Init( VOID )
 | 
			
		||||
LOCAL void Unregister( int Idx );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* -- Apple API -- */
 | 
			
		||||
 | 
			
		||||
#ifdef APPLE
 | 
			
		||||
 | 
			
		||||
#define MAX_MACH_MSG_SIZE 512
 | 
			
		||||
 | 
			
		||||
LOCAL void Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrCode, void *Context );
 | 
			
		||||
 | 
			
		||||
#endif /* Apple */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* -- Howl API -- */
 | 
			
		||||
 | 
			
		||||
#ifdef HOWL
 | 
			
		||||
 | 
			
		||||
LOCAL sw_discovery My_Discovery_Session = NULL;
 | 
			
		||||
LOCAL sw_salt My_Salt;
 | 
			
		||||
 | 
			
		||||
LOCAL sw_result HOWL_API Registration_Reply_Handler( sw_discovery Session, sw_discovery_publish_status Status, sw_discovery_oid Id, sw_opaque Extra );
 | 
			
		||||
 | 
			
		||||
#endif /* Howl */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL void Rendezvous_Init( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Initialize structures */
 | 
			
		||||
 | 
			
		||||
	INT i;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	for( i = 0; i < MAX_RENDEZVOUS; i++ )
 | 
			
		||||
#ifdef HOWL
 | 
			
		||||
	if( sw_discovery_init( &My_Discovery_Session ) != SW_OKAY )
 | 
			
		||||
	{
 | 
			
		||||
		My_Rendezvous[i].Discovery_Ref = 0;
 | 
			
		||||
		My_Rendezvous[i].Mach_Port = 0;
 | 
			
		||||
		Log( LOG_EMERG, "Can't initialize Rendezvous (Howl): sw_discovery_init() failed!" );
 | 
			
		||||
		Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME );
 | 
			
		||||
		exit( 1 );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if( sw_discovery_salt( My_Discovery_Session, &My_Salt ) != SW_OKAY )
 | 
			
		||||
	{
 | 
			
		||||
		Log( LOG_EMERG, "Can't initialize Rendezvous (Howl): sw_discovery_salt() failed!" );
 | 
			
		||||
		Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME );
 | 
			
		||||
		exit( 1 );
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	for( i = 0; i < MAX_RENDEZVOUS; i++ ) My_Rendezvous[i].Desc[0] = '\0';
 | 
			
		||||
} /* Rendezvous_Init */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Rendezvous_Exit( VOID )
 | 
			
		||||
GLOBAL void Rendezvous_Exit( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Clean up & exit module */
 | 
			
		||||
 | 
			
		||||
	INT i;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	for( i = 0; i < MAX_RENDEZVOUS; i++ )
 | 
			
		||||
	{
 | 
			
		||||
		if( My_Rendezvous[i].Discovery_Ref ) Unregister( i );
 | 
			
		||||
		if( My_Rendezvous[i].Desc[0] ) Unregister( i );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#ifdef HOWL
 | 
			
		||||
	sw_discovery_fina( My_Discovery_Session );
 | 
			
		||||
#endif
 | 
			
		||||
} /* Rendezvous_Exit */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Rendezvous_Register( CHAR *Name, CHAR *Type, UINT Port )
 | 
			
		||||
GLOBAL bool Rendezvous_Register( char *Name, char *Type, unsigned int Port )
 | 
			
		||||
{
 | 
			
		||||
	/* Register new service */
 | 
			
		||||
 | 
			
		||||
	INT i;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	/* Search free port structure */
 | 
			
		||||
	for( i = 0; i < MAX_RENDEZVOUS; i++ ) if( ! My_Rendezvous[i].Discovery_Ref ) break;
 | 
			
		||||
	for( i = 0; i < MAX_RENDEZVOUS; i++ ) if( ! My_Rendezvous[i].Desc[0] ) break;
 | 
			
		||||
	if( i >= MAX_RENDEZVOUS )
 | 
			
		||||
	{
 | 
			
		||||
		Log( LOG_ERR, "Can't register \"%s\" with Rendezvous: limit (%d) reached!", Name, MAX_RENDEZVOUS );
 | 
			
		||||
		return FALSE;
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
	strlcpy( My_Rendezvous[i].Desc, Name, sizeof( My_Rendezvous[i].Desc ));
 | 
			
		||||
	
 | 
			
		||||
#ifdef APPLE
 | 
			
		||||
	/* Register new service */
 | 
			
		||||
	My_Rendezvous[i].Discovery_Ref = DNSServiceRegistrationCreate( Name, Type, "", htonl( Port ), "", Registration_Reply_Handler, My_Rendezvous[i].Desc );
 | 
			
		||||
	My_Rendezvous[i].Discovery_Ref = DNSServiceRegistrationCreate( Name, Type, "", htonl( Port ), "", Registration_Reply_Handler, &My_Rendezvous[i] );
 | 
			
		||||
	if( ! My_Rendezvous[i].Discovery_Ref )
 | 
			
		||||
	{
 | 
			
		||||
		Log( LOG_ERR, "Can't register \"%s\" with Rendezvous: can't register service!", My_Rendezvous[i].Desc );
 | 
			
		||||
		return FALSE;
 | 
			
		||||
		My_Rendezvous[i].Desc[0] = '\0';
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/* Get and save the corresponding Mach Port */
 | 
			
		||||
@@ -117,28 +176,39 @@ GLOBAL BOOLEAN Rendezvous_Register( CHAR *Name, CHAR *Type, UINT Port )
 | 
			
		||||
		Log( LOG_ERR, "Can't register \"%s\" with Rendezvous: got no Mach Port!", My_Rendezvous[i].Desc );
 | 
			
		||||
		/* Here we actually leek a descriptor :-( */
 | 
			
		||||
		My_Rendezvous[i].Discovery_Ref = 0;
 | 
			
		||||
		return FALSE;
 | 
			
		||||
		My_Rendezvous[i].Desc[0] = '\0';
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
#endif /* Apple */
 | 
			
		||||
 | 
			
		||||
#ifdef HOWL
 | 
			
		||||
	if( sw_discovery_publish( My_Discovery_Session, 0, Name, Type, NULL, NULL, Port, NULL, 0, Registration_Reply_Handler, &My_Rendezvous[i], &My_Rendezvous[i].Id ) != SW_OKAY )
 | 
			
		||||
	{
 | 
			
		||||
		Log( LOG_ERR, "Can't register \"%s\" with Rendezvous: can't register service!", My_Rendezvous[i].Desc );
 | 
			
		||||
		My_Rendezvous[i].Desc[0] = '\0';
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
#endif /* Howl */
 | 
			
		||||
 | 
			
		||||
	Log( LOG_DEBUG, "Rendezvous: Registering \"%s\" ...", My_Rendezvous[i].Desc );
 | 
			
		||||
	return TRUE;
 | 
			
		||||
	return true;
 | 
			
		||||
} /* Rendezvous_Register */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Rendezvous_Unregister( CHAR *Name )
 | 
			
		||||
GLOBAL bool Rendezvous_Unregister( char *Name )
 | 
			
		||||
{
 | 
			
		||||
	/* Unregister service from rendezvous */
 | 
			
		||||
 | 
			
		||||
	INT i;
 | 
			
		||||
	BOOLEAN ok;
 | 
			
		||||
	int i;
 | 
			
		||||
	bool ok;
 | 
			
		||||
 | 
			
		||||
	ok = FALSE;
 | 
			
		||||
	ok = false;
 | 
			
		||||
	for( i = 0; i < MAX_RENDEZVOUS; i++ )
 | 
			
		||||
	{
 | 
			
		||||
		if( strcmp( Name, My_Rendezvous[i].Desc ) == 0 )
 | 
			
		||||
		{
 | 
			
		||||
			Unregister( i );
 | 
			
		||||
			ok = TRUE;
 | 
			
		||||
			ok = true;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -146,26 +216,27 @@ GLOBAL BOOLEAN Rendezvous_Unregister( CHAR *Name )
 | 
			
		||||
} /* Rendezvous_Unregister */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Rendezvous_UnregisterListeners( VOID )
 | 
			
		||||
GLOBAL void Rendezvous_UnregisterListeners( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Unregister all our listening sockets from Rendezvous */
 | 
			
		||||
 | 
			
		||||
	INT i;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	for( i = 0; i < MAX_RENDEZVOUS; i++ )
 | 
			
		||||
	{
 | 
			
		||||
		if( My_Rendezvous[i].Discovery_Ref ) Unregister( i );
 | 
			
		||||
		if( My_Rendezvous[i].Desc[0] ) Unregister( i );
 | 
			
		||||
	}
 | 
			
		||||
} /* Rendezvous_UnregisterListeners */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Rendezvous_Handler( VOID )
 | 
			
		||||
GLOBAL void Rendezvous_Handler( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Handle all Rendezvous stuff; this function must be called
 | 
			
		||||
	 * periodically from the run loop of the main program */
 | 
			
		||||
 | 
			
		||||
	INT i;
 | 
			
		||||
	CHAR buffer[MAX_MACH_MSG_SIZE];
 | 
			
		||||
#ifdef APPLE
 | 
			
		||||
	int i;
 | 
			
		||||
	char buffer[MAX_MACH_MSG_SIZE];
 | 
			
		||||
	mach_msg_return_t result;
 | 
			
		||||
	mach_msg_header_t *msg;
 | 
			
		||||
 | 
			
		||||
@@ -180,20 +251,53 @@ GLOBAL VOID Rendezvous_Handler( VOID )
 | 
			
		||||
		/* Handle message */
 | 
			
		||||
		if( result == MACH_MSG_SUCCESS ) DNSServiceDiscovery_handleReply( msg );
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
		else if( result != MACH_RCV_TIMED_OUT ) Log( LOG_DEBUG, "mach_msg(): %ld", (LONG)result );
 | 
			
		||||
#endif
 | 
			
		||||
		else if( result != MACH_RCV_TIMED_OUT ) Log( LOG_DEBUG, "mach_msg(): %ld", (long)result );
 | 
			
		||||
#endif /* Debug */
 | 
			
		||||
	}
 | 
			
		||||
#endif /* Apple */
 | 
			
		||||
 | 
			
		||||
#ifdef HOWL
 | 
			
		||||
	sw_ulong msecs = 10;
 | 
			
		||||
	sw_salt_step( My_Salt, &msecs );
 | 
			
		||||
#endif
 | 
			
		||||
} /* Rendezvous_Handler */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrCode, VOID *Context )
 | 
			
		||||
LOCAL void Unregister( int Idx )
 | 
			
		||||
{
 | 
			
		||||
	CHAR txt[50];
 | 
			
		||||
	/* Unregister service */
 | 
			
		||||
 | 
			
		||||
#ifdef APPLE
 | 
			
		||||
	DNSServiceDiscoveryDeallocate( My_Rendezvous[Idx].Discovery_Ref );
 | 
			
		||||
#endif /* Apple */
 | 
			
		||||
 | 
			
		||||
#ifdef HOWL
 | 
			
		||||
	if( sw_discovery_cancel( My_Discovery_Session, My_Rendezvous[Idx].Id ) != SW_OKAY )
 | 
			
		||||
	{
 | 
			
		||||
		Log( LOG_ERR, "Rendezvous: Failed to unregister \"%s\"!", My_Rendezvous[Idx].Desc );
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
#endif /* Howl */
 | 
			
		||||
	
 | 
			
		||||
	Log( LOG_INFO, "Unregistered \"%s\" from Rendezvous.", My_Rendezvous[Idx].Desc );
 | 
			
		||||
	My_Rendezvous[Idx].Desc[0] = '\0';
 | 
			
		||||
} /* Unregister */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* -- Apple API -- */
 | 
			
		||||
 | 
			
		||||
#ifdef APPLE
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL void Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrCode, void *Context )
 | 
			
		||||
{
 | 
			
		||||
	SERVICE *s = (SERVICE *)Context;
 | 
			
		||||
	char txt[50];
 | 
			
		||||
 | 
			
		||||
	if( ErrCode == kDNSServiceDiscoveryNoError )
 | 
			
		||||
	{
 | 
			
		||||
		/* Success! */
 | 
			
		||||
		Log( LOG_INFO, "Successfully registered \"%s\" with Rendezvous.", Context ? Context : "NULL" );
 | 
			
		||||
		Log( LOG_INFO, "Successfully registered \"%s\" with Rendezvous.", s->Desc );
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -206,21 +310,54 @@ LOCAL VOID Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrC
 | 
			
		||||
			strcpy( txt, "name conflict!" );
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
			sprintf( txt, "error code %ld!", (LONG)ErrCode );
 | 
			
		||||
			sprintf( txt, "error code %ld!", (long)ErrCode );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	Log( LOG_INFO, "Can't register \"%s\" with Rendezvous: %s", Context ? Context : "NULL", txt );
 | 
			
		||||
	Log( LOG_INFO, "Can't register \"%s\" with Rendezvous: %s", s->Desc, txt );
 | 
			
		||||
	s->Desc[0] = '\0';
 | 
			
		||||
} /* Registration_Reply_Handler */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID Unregister( INT Idx )
 | 
			
		||||
{
 | 
			
		||||
	/* Unregister service */
 | 
			
		||||
#endif /* Apple */
 | 
			
		||||
 | 
			
		||||
	DNSServiceDiscoveryDeallocate( My_Rendezvous[Idx].Discovery_Ref );
 | 
			
		||||
	Log( LOG_INFO, "Unregistered \"%s\" from Rendezvous.", My_Rendezvous[Idx].Desc );
 | 
			
		||||
	My_Rendezvous[Idx].Discovery_Ref = 0;
 | 
			
		||||
} /* Unregister */
 | 
			
		||||
 | 
			
		||||
/* -- Howl API -- */
 | 
			
		||||
 | 
			
		||||
#ifdef HOWL
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL sw_result HOWL_API Registration_Reply_Handler( sw_discovery Session, sw_discovery_publish_status Status, UNUSED sw_discovery_oid Id, sw_opaque Extra )
 | 
			
		||||
{
 | 
			
		||||
	SERVICE *s = (SERVICE *)Extra;
 | 
			
		||||
	char txt[50];
 | 
			
		||||
 | 
			
		||||
	assert( Session == My_Discovery_Session );
 | 
			
		||||
	assert( Extra != NULL );
 | 
			
		||||
 | 
			
		||||
	if( Status == SW_DISCOVERY_PUBLISH_STARTED || Status == SW_DISCOVERY_PUBLISH_STOPPED )
 | 
			
		||||
	{
 | 
			
		||||
		/* Success! */
 | 
			
		||||
		Log( LOG_INFO, "Successfully registered \"%s\" with Rendezvous.", s->Desc );
 | 
			
		||||
		return SW_OKAY;
 | 
			
		||||
	}
 | 
			
		||||
		
 | 
			
		||||
	switch( Status )
 | 
			
		||||
	{
 | 
			
		||||
		case SW_DISCOVERY_PUBLISH_NAME_COLLISION:
 | 
			
		||||
			strcpy( txt, "name conflict!" );
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
			sprintf( txt, "error code %ld!", (long)Status );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	Log( LOG_INFO, "Can't register \"%s\" with Rendezvous: %s", s->Desc, txt );
 | 
			
		||||
	s->Desc[0] = '\0';
 | 
			
		||||
 | 
			
		||||
	return SW_OKAY;
 | 
			
		||||
} /* Registration_Reply_Handler */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif /* Howl */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif	/* RENDEZVOUS */
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: rendezvous.h,v 1.1 2003/02/23 12:02:26 alex Exp $
 | 
			
		||||
 * $Id: rendezvous.h,v 1.2 2005/03/19 18:43:49 fw Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * "Rendezvous" functions (Header)
 | 
			
		||||
 */
 | 
			
		||||
@@ -20,15 +20,15 @@
 | 
			
		||||
#define __rdezvous_h__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Rendezvous_Init( VOID );
 | 
			
		||||
GLOBAL VOID Rendezvous_Exit( VOID );
 | 
			
		||||
GLOBAL void Rendezvous_Init( void );
 | 
			
		||||
GLOBAL void Rendezvous_Exit( void );
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Rendezvous_Register( CHAR *Name, CHAR *Type, UINT Port );
 | 
			
		||||
GLOBAL bool Rendezvous_Register( char *Name, char *Type, unsigned int Port );
 | 
			
		||||
 | 
			
		||||
GLOBAL BOOLEAN Rendezvous_Unregister( CHAR *Name );
 | 
			
		||||
GLOBAL VOID Rendezvous_UnregisterListeners( VOID );
 | 
			
		||||
GLOBAL bool Rendezvous_Unregister( char *Name );
 | 
			
		||||
GLOBAL void Rendezvous_UnregisterListeners( void );
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Rendezvous_Handler( VOID );
 | 
			
		||||
GLOBAL void Rendezvous_Handler( void );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif	/* __rdezvous_h__ */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 * Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
@@ -14,7 +14,7 @@
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: resolve.c,v 1.6 2003/04/21 10:52:51 alex Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: resolve.c,v 1.12.2.1 2005/09/02 22:07:38 fw Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
@@ -27,6 +27,12 @@ static char UNUSED id[] = "$Id: resolve.c,v 1.6 2003/04/21 10:52:51 alex Exp $";
 | 
			
		||||
#include <arpa/inet.h>
 | 
			
		||||
#include <netdb.h>
 | 
			
		||||
 | 
			
		||||
#ifdef IDENTAUTH
 | 
			
		||||
#ifdef HAVE_IDENT_H
 | 
			
		||||
#include <ident.h>
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
@@ -35,54 +41,52 @@ static char UNUSED id[] = "$Id: resolve.c,v 1.6 2003/04/21 10:52:51 alex Exp $";
 | 
			
		||||
#include "resolve.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID Do_ResolveAddr PARAMS(( struct sockaddr_in *Addr, INT w_fd ));
 | 
			
		||||
LOCAL VOID Do_ResolveName PARAMS(( CHAR *Host, INT w_fd ));
 | 
			
		||||
 | 
			
		||||
#ifdef h_errno
 | 
			
		||||
LOCAL CHAR *Get_Error PARAMS(( INT H_Error ));
 | 
			
		||||
#ifdef IDENTAUTH
 | 
			
		||||
LOCAL void Do_ResolveAddr PARAMS(( struct sockaddr_in *Addr, int Sock, int w_fd ));
 | 
			
		||||
#else
 | 
			
		||||
LOCAL void Do_ResolveAddr PARAMS(( struct sockaddr_in *Addr, int w_fd ));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
LOCAL void Do_ResolveName PARAMS(( char *Host, int w_fd ));
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID
 | 
			
		||||
Resolve_Init( VOID )
 | 
			
		||||
#ifdef h_errno
 | 
			
		||||
LOCAL char *Get_Error PARAMS(( int H_Error ));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
LOCAL RES_STAT *New_Res_Stat PARAMS(( void ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Resolve_Init( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Modul initialisieren */
 | 
			
		||||
	/* Initialize module */
 | 
			
		||||
 | 
			
		||||
	FD_ZERO( &Resolver_FDs );
 | 
			
		||||
} /* Resolve_Init */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef IDENTAUTH
 | 
			
		||||
GLOBAL RES_STAT *
 | 
			
		||||
Resolve_Addr( struct sockaddr_in *Addr, int Sock )
 | 
			
		||||
#else
 | 
			
		||||
GLOBAL RES_STAT *
 | 
			
		||||
Resolve_Addr( struct sockaddr_in *Addr )
 | 
			
		||||
#endif
 | 
			
		||||
{
 | 
			
		||||
	/* IP (asyncron!) aufloesen. Bei Fehler, z.B. wenn der
 | 
			
		||||
	 * Child-Prozess nicht erzeugt werden kann, wird NULL geliefert.
 | 
			
		||||
	 * Der Host kann dann nicht aufgeloest werden. */
 | 
			
		||||
	/* Resolve IP (asynchronous!). On errors, e.g. if the child process
 | 
			
		||||
	 * can't be forked, this functions returns NULL. */
 | 
			
		||||
 | 
			
		||||
	RES_STAT *s;
 | 
			
		||||
	INT pid;
 | 
			
		||||
	int pid;
 | 
			
		||||
 | 
			
		||||
	/* Speicher anfordern */
 | 
			
		||||
	s = malloc( sizeof( RES_STAT ));
 | 
			
		||||
	if( ! s )
 | 
			
		||||
	{
 | 
			
		||||
		Log( LOG_EMERG, "Resolver: Can't allocate memory! [Resolve_Addr]" );
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
	s = New_Res_Stat( );
 | 
			
		||||
	if( ! s ) return NULL;
 | 
			
		||||
 | 
			
		||||
	/* Pipe fuer Antwort initialisieren */
 | 
			
		||||
	if( pipe( s->pipe ) != 0 )
 | 
			
		||||
	{
 | 
			
		||||
		free( s );
 | 
			
		||||
		Log( LOG_ALERT, "Resolver: Can't create output pipe: %s!", strerror( errno ));
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Sub-Prozess erzeugen */
 | 
			
		||||
	/* For sub-process */
 | 
			
		||||
	pid = fork( );
 | 
			
		||||
	if( pid > 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Haupt-Prozess */
 | 
			
		||||
		/* Main process */
 | 
			
		||||
		Log( LOG_DEBUG, "Resolver for %s created (PID %d).", inet_ntoa( Addr->sin_addr ), pid );
 | 
			
		||||
		FD_SET( s->pipe[0], &Resolver_FDs );
 | 
			
		||||
		if( s->pipe[0] > Conn_MaxFD ) Conn_MaxFD = s->pipe[0];
 | 
			
		||||
@@ -91,15 +95,21 @@ Resolve_Addr( struct sockaddr_in *Addr )
 | 
			
		||||
	}
 | 
			
		||||
	else if( pid == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Sub-Prozess */
 | 
			
		||||
		/* Sub process */
 | 
			
		||||
		Log_Init_Resolver( );
 | 
			
		||||
#ifdef IDENTAUTH
 | 
			
		||||
		Do_ResolveAddr( Addr, Sock, s->pipe[1] );
 | 
			
		||||
#else
 | 
			
		||||
		Do_ResolveAddr( Addr, s->pipe[1] );
 | 
			
		||||
#endif
 | 
			
		||||
		Log_Exit_Resolver( );
 | 
			
		||||
		exit( 0 );
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		/* Fehler */
 | 
			
		||||
		/* Error! */
 | 
			
		||||
		close(s->pipe[0]);
 | 
			
		||||
		close(s->pipe[1]);
 | 
			
		||||
		free( s );
 | 
			
		||||
		Log( LOG_CRIT, "Resolver: Can't fork: %s!", strerror( errno ));
 | 
			
		||||
		return NULL;
 | 
			
		||||
@@ -108,36 +118,22 @@ Resolve_Addr( struct sockaddr_in *Addr )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL RES_STAT *
 | 
			
		||||
Resolve_Name( CHAR *Host )
 | 
			
		||||
Resolve_Name( char *Host )
 | 
			
		||||
{
 | 
			
		||||
	/* Hostnamen (asyncron!) aufloesen. Bei Fehler, z.B. wenn der
 | 
			
		||||
	 * Child-Prozess nicht erzeugt werden kann, wird NULL geliefert.
 | 
			
		||||
	 * Der Host kann dann nicht aufgeloest werden. */
 | 
			
		||||
	/* Resolve hostname (asynchronous!). On errors, e.g. if the child
 | 
			
		||||
	 * process can't be forked, this functions returns NULL. */
 | 
			
		||||
 | 
			
		||||
	RES_STAT *s;
 | 
			
		||||
	INT pid;
 | 
			
		||||
	int pid;
 | 
			
		||||
 | 
			
		||||
	/* Speicher anfordern */
 | 
			
		||||
	s = malloc( sizeof( RES_STAT ));
 | 
			
		||||
	if( ! s )
 | 
			
		||||
	{
 | 
			
		||||
		Log( LOG_EMERG, "Resolver: Can't allocate memory! [Resolve_Name]" );
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
	s = New_Res_Stat( );
 | 
			
		||||
	if( ! s ) return NULL;
 | 
			
		||||
 | 
			
		||||
	/* Pipe fuer Antwort initialisieren */
 | 
			
		||||
	if( pipe( s->pipe ) != 0 )
 | 
			
		||||
	{
 | 
			
		||||
		free( s );
 | 
			
		||||
		Log( LOG_ALERT, "Resolver: Can't create output pipe: %s!", strerror( errno ));
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Sub-Prozess erzeugen */
 | 
			
		||||
	/* Fork sub-process */
 | 
			
		||||
	pid = fork( );
 | 
			
		||||
	if( pid > 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Haupt-Prozess */
 | 
			
		||||
		/* Main process */
 | 
			
		||||
		Log( LOG_DEBUG, "Resolver for \"%s\" created (PID %d).", Host, pid );
 | 
			
		||||
		FD_SET( s->pipe[0], &Resolver_FDs );
 | 
			
		||||
		if( s->pipe[0] > Conn_MaxFD ) Conn_MaxFD = s->pipe[0];
 | 
			
		||||
@@ -146,7 +142,7 @@ Resolve_Name( CHAR *Host )
 | 
			
		||||
	}
 | 
			
		||||
	else if( pid == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Sub-Prozess */
 | 
			
		||||
		/* Sub process */
 | 
			
		||||
		Log_Init_Resolver( );
 | 
			
		||||
		Do_ResolveName( Host, s->pipe[1] );
 | 
			
		||||
		Log_Exit_Resolver( );
 | 
			
		||||
@@ -154,7 +150,9 @@ Resolve_Name( CHAR *Host )
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		/* Fehler */
 | 
			
		||||
		/* Error! */
 | 
			
		||||
		close(s->pipe[0]);
 | 
			
		||||
		close(s->pipe[1]);
 | 
			
		||||
		free( s );
 | 
			
		||||
		Log( LOG_CRIT, "Resolver: Can't fork: %s!", strerror( errno ));
 | 
			
		||||
		return NULL;
 | 
			
		||||
@@ -162,18 +160,27 @@ Resolve_Name( CHAR *Host )
 | 
			
		||||
} /* Resolve_Name */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID
 | 
			
		||||
Do_ResolveAddr( struct sockaddr_in *Addr, INT w_fd )
 | 
			
		||||
#ifdef IDENTAUTH
 | 
			
		||||
LOCAL void
 | 
			
		||||
Do_ResolveAddr( struct sockaddr_in *Addr, int Sock, int w_fd )
 | 
			
		||||
#else
 | 
			
		||||
LOCAL void
 | 
			
		||||
Do_ResolveAddr( struct sockaddr_in *Addr, int w_fd )
 | 
			
		||||
#endif
 | 
			
		||||
{
 | 
			
		||||
	/* Resolver Sub-Prozess: IP aufloesen und Ergebnis in Pipe schreiben. */
 | 
			
		||||
	/* Resolver sub-process: resolve IP address and write result into
 | 
			
		||||
	 * pipe to parent. */
 | 
			
		||||
 | 
			
		||||
	CHAR hostname[HOST_LEN];
 | 
			
		||||
	char hostname[HOST_LEN];
 | 
			
		||||
	struct hostent *h;
 | 
			
		||||
	size_t len;
 | 
			
		||||
#ifdef IDENTAUTH
 | 
			
		||||
	char *res;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	/* Resolve IP address */
 | 
			
		||||
	Log_Resolver( LOG_DEBUG, "Now resolving %s ...", inet_ntoa( Addr->sin_addr ));
 | 
			
		||||
 | 
			
		||||
	/* Namen aufloesen */
 | 
			
		||||
	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 ));
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
@@ -184,31 +191,55 @@ Do_ResolveAddr( struct sockaddr_in *Addr, INT w_fd )
 | 
			
		||||
#endif	
 | 
			
		||||
		strlcpy( hostname, inet_ntoa( Addr->sin_addr ), sizeof( hostname ));
 | 
			
		||||
	}
 | 
			
		||||
	Log_Resolver( LOG_DEBUG, "Ok, translated %s to \"%s\".", inet_ntoa( Addr->sin_addr ), hostname );
 | 
			
		||||
 | 
			
		||||
	/* Antwort an Parent schreiben */
 | 
			
		||||
	if( (size_t)write( w_fd, hostname, strlen( hostname ) + 1 ) != (size_t)( strlen( hostname ) + 1 ))
 | 
			
		||||
	/* Write resolver result into pipe to parent */
 | 
			
		||||
	len = strlen( hostname ); 
 | 
			
		||||
	hostname[len] = '\n'; len++;
 | 
			
		||||
	if( (size_t)write( w_fd, hostname, len ) != (size_t)len )
 | 
			
		||||
	{
 | 
			
		||||
		Log_Resolver( LOG_CRIT, "Resolver: Can't write to parent: %s!", strerror( errno ));
 | 
			
		||||
		close( w_fd );
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	Log_Resolver( LOG_DEBUG, "Ok, translated %s to \"%s\".", inet_ntoa( Addr->sin_addr ), hostname );
 | 
			
		||||
#ifdef IDENTAUTH
 | 
			
		||||
	/* Do "IDENT" (aka "AUTH") lookup and write result to parent */
 | 
			
		||||
	Log_Resolver( LOG_DEBUG, "Doing IDENT lookup on socket %d ...", Sock );
 | 
			
		||||
	res = ident_id( Sock, 10 );
 | 
			
		||||
	Log_Resolver( LOG_DEBUG, "Ok, IDENT lookup on socket %d done: \"%s\"", Sock, res ? res : "" );
 | 
			
		||||
 | 
			
		||||
	/* Write IDENT result into pipe to parent */
 | 
			
		||||
	if (res) {
 | 
			
		||||
		len = strlen(res);
 | 
			
		||||
		res[len] = '\n';
 | 
			
		||||
		len++;
 | 
			
		||||
	} else len = 1;
 | 
			
		||||
 | 
			
		||||
	if( (size_t)write( w_fd, res ? res : "\n", len ) != (size_t)len )
 | 
			
		||||
	{
 | 
			
		||||
		Log_Resolver( LOG_CRIT, "Resolver: Can't write to parent (IDENT): %s!", strerror( errno ));
 | 
			
		||||
		close( w_fd );
 | 
			
		||||
	}
 | 
			
		||||
	free( res );
 | 
			
		||||
#endif
 | 
			
		||||
} /* Do_ResolveAddr */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID
 | 
			
		||||
Do_ResolveName( CHAR *Host, INT w_fd )
 | 
			
		||||
LOCAL void
 | 
			
		||||
Do_ResolveName( char *Host, int w_fd )
 | 
			
		||||
{
 | 
			
		||||
	/* Resolver Sub-Prozess: Name aufloesen und Ergebnis in Pipe schreiben. */
 | 
			
		||||
	/* Resolver sub-process: resolve name and write result into pipe
 | 
			
		||||
	 * to parent. */
 | 
			
		||||
 | 
			
		||||
	CHAR ip[16];
 | 
			
		||||
	char ip[16];
 | 
			
		||||
	struct hostent *h;
 | 
			
		||||
	struct in_addr *addr;
 | 
			
		||||
	int len;
 | 
			
		||||
 | 
			
		||||
	Log_Resolver( LOG_DEBUG, "Now resolving \"%s\" ...", Host );
 | 
			
		||||
 | 
			
		||||
	/* Namen aufloesen */
 | 
			
		||||
	/* Resolve hostname */
 | 
			
		||||
	h = gethostbyname( Host );
 | 
			
		||||
	if( h )
 | 
			
		||||
	{
 | 
			
		||||
@@ -222,27 +253,27 @@ Do_ResolveName( CHAR *Host, INT w_fd )
 | 
			
		||||
#else
 | 
			
		||||
		Log_Resolver( LOG_WARNING, "Can't resolve \"%s\"!", Host );
 | 
			
		||||
#endif
 | 
			
		||||
		strcpy( ip, "" );
 | 
			
		||||
		ip[0] = '\0';
 | 
			
		||||
	}
 | 
			
		||||
	if( ip[0] ) Log_Resolver( LOG_DEBUG, "Ok, translated \"%s\" to %s.", Host, ip );
 | 
			
		||||
 | 
			
		||||
	/* Antwort an Parent schreiben */
 | 
			
		||||
	if( (size_t)write( w_fd, ip, strlen( ip ) + 1 ) != (size_t)( strlen( ip ) + 1 ))
 | 
			
		||||
	/* Write result into pipe to parent */
 | 
			
		||||
	len = strlen( ip );
 | 
			
		||||
	ip[len] = '\n'; len++;
 | 
			
		||||
	if( (size_t)write( w_fd, ip, len ) != (size_t)len )
 | 
			
		||||
	{
 | 
			
		||||
		Log_Resolver( LOG_CRIT, "Resolver: Can't write to parent: %s!", strerror( errno ));
 | 
			
		||||
		close( w_fd );
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if( ip[0] ) Log_Resolver( LOG_DEBUG, "Ok, translated \"%s\" to %s.", Host, ip );
 | 
			
		||||
} /* Do_ResolveName */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef h_errno
 | 
			
		||||
 | 
			
		||||
LOCAL CHAR *
 | 
			
		||||
Get_Error( INT H_Error )
 | 
			
		||||
LOCAL char *
 | 
			
		||||
Get_Error( int H_Error )
 | 
			
		||||
{
 | 
			
		||||
	/* Fehlerbeschreibung fuer H_Error liefern */
 | 
			
		||||
	/* Get error message for H_Error */
 | 
			
		||||
 | 
			
		||||
	switch( H_Error )
 | 
			
		||||
	{
 | 
			
		||||
@@ -262,4 +293,33 @@ Get_Error( INT H_Error )
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL RES_STAT *
 | 
			
		||||
New_Res_Stat( void )
 | 
			
		||||
{
 | 
			
		||||
	RES_STAT *s;
 | 
			
		||||
 | 
			
		||||
	/* Allocate memory */
 | 
			
		||||
	s = (RES_STAT *)malloc( sizeof( RES_STAT ));
 | 
			
		||||
	if( ! s )
 | 
			
		||||
	{
 | 
			
		||||
		Log( LOG_EMERG, "Resolver: Can't allocate memory! [Resolve_Addr]" );
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Initialize pipe for result */
 | 
			
		||||
	if( pipe( s->pipe ) != 0 )
 | 
			
		||||
	{
 | 
			
		||||
		free( s );
 | 
			
		||||
		Log( LOG_ALERT, "Resolver: Can't create output pipe: %s!", strerror( errno ));
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	s->stage = 0;
 | 
			
		||||
	s->bufpos = 0;
 | 
			
		||||
	s->pid = -1;
 | 
			
		||||
 | 
			
		||||
	return s;
 | 
			
		||||
} /* New_Res_Stat */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* -eof- */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 * Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: resolve.h,v 1.5 2003/04/21 10:53:10 alex Exp $
 | 
			
		||||
 * $Id: resolve.h,v 1.8 2005/03/19 18:43:49 fw Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * Asynchronous resolver (header)
 | 
			
		||||
 */
 | 
			
		||||
@@ -27,18 +27,26 @@
 | 
			
		||||
 | 
			
		||||
typedef struct _Res_Stat
 | 
			
		||||
{
 | 
			
		||||
	INT pid;			/* PID des Child-Prozess */
 | 
			
		||||
	INT pipe[2];			/* Pipe fuer IPC */
 | 
			
		||||
	int pid;			/* PID des Child-Prozess */
 | 
			
		||||
	int pipe[2];			/* Pipe fuer IPC */
 | 
			
		||||
	int stage;			/* Hostname/IP(0) or IDENT(1)? */
 | 
			
		||||
	int bufpos;			/* Position in buffer */
 | 
			
		||||
	char buffer[HOST_LEN];		/* Buffer */
 | 
			
		||||
} RES_STAT;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL fd_set Resolver_FDs;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL VOID Resolve_Init PARAMS(( VOID ));
 | 
			
		||||
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 ));
 | 
			
		||||
GLOBAL RES_STAT *Resolve_Name PARAMS(( CHAR *Host ));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
GLOBAL RES_STAT *Resolve_Name PARAMS(( char *Host ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -9,14 +9,14 @@
 | 
			
		||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
 | 
			
		||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile.am,v 1.7 2003/01/03 22:04:14 alex Exp $
 | 
			
		||||
# $Id: Makefile.am,v 1.8 2005/04/16 09:23:01 fw Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
AUTOMAKE_OPTIONS = ansi2knr
 | 
			
		||||
 | 
			
		||||
noinst_LIBRARIES = libngportab.a
 | 
			
		||||
 | 
			
		||||
libngportab_a_SOURCES = strlcpy.c vsnprintf.c
 | 
			
		||||
libngportab_a_SOURCES = strlcpy.c strdup.c vsnprintf.c
 | 
			
		||||
 | 
			
		||||
check_PROGRAMS = portabtest
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 * Copyright (c)2001-2005 Alexander Barton (alex@barton.de)
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: portab.h,v 1.15 2003/03/31 19:01:02 alex Exp $
 | 
			
		||||
 * $Id: portab.h,v 1.21 2005/04/16 09:23:01 fw Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * Portability functions and declarations (header for libngbportab).
 | 
			
		||||
 */
 | 
			
		||||
@@ -20,14 +20,35 @@
 | 
			
		||||
 | 
			
		||||
#include "config.h"
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_SYS_TYPES_H
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#ifndef DEBUG
 | 
			
		||||
# define NDEBUG
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_SYS_TYPES_H
 | 
			
		||||
# include <sys/types.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_INTTYPES_H
 | 
			
		||||
# include <inttypes.h>
 | 
			
		||||
# define NGIRC_GOT_INTTYPES
 | 
			
		||||
#else
 | 
			
		||||
# ifdef HAVE_STDINT_H
 | 
			
		||||
#  include <stdint.h>
 | 
			
		||||
#  define NGIRC_GOT_INTTYPES
 | 
			
		||||
# endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_STDDEF_H
 | 
			
		||||
# include <stddef.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_STDBOOL_H
 | 
			
		||||
# include <stdbool.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* compiler features */
 | 
			
		||||
 | 
			
		||||
#ifdef __GNUC__
 | 
			
		||||
#if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7))
 | 
			
		||||
# define PUNUSED(x) __attribute__ ((unused)) x
 | 
			
		||||
# define UNUSED     __attribute__ ((unused))
 | 
			
		||||
#else
 | 
			
		||||
@@ -45,13 +66,7 @@
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* keywords */
 | 
			
		||||
 | 
			
		||||
#define EXTERN extern
 | 
			
		||||
#define STATIC static
 | 
			
		||||
#define LOCAL static
 | 
			
		||||
#define CONST const
 | 
			
		||||
#define REGISTER register
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* datatypes */
 | 
			
		||||
 | 
			
		||||
@@ -61,40 +76,31 @@
 | 
			
		||||
# endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
typedef void VOID;
 | 
			
		||||
typedef void POINTER;
 | 
			
		||||
 | 
			
		||||
typedef signed int INT;
 | 
			
		||||
typedef unsigned int UINT;
 | 
			
		||||
typedef signed long LONG;
 | 
			
		||||
typedef unsigned long ULONG;
 | 
			
		||||
 | 
			
		||||
typedef signed char INT8;
 | 
			
		||||
#ifdef NGIRC_GOT_INTTYPES
 | 
			
		||||
typedef uint8_t UINT8;
 | 
			
		||||
typedef uint16_t UINT16;
 | 
			
		||||
typedef uint32_t UINT32;
 | 
			
		||||
#else
 | 
			
		||||
typedef unsigned char UINT8;
 | 
			
		||||
typedef signed short INT16;
 | 
			
		||||
typedef unsigned short UINT16;
 | 
			
		||||
typedef signed long INT32;
 | 
			
		||||
typedef unsigned long UINT32;
 | 
			
		||||
typedef unsigned int UINT32;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
typedef double DOUBLE;
 | 
			
		||||
typedef float FLOAT;
 | 
			
		||||
#ifndef HAVE_STDBOOL_H
 | 
			
		||||
typedef unsigned char bool;
 | 
			
		||||
#define true (bool)1
 | 
			
		||||
#define false (bool)0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
typedef char CHAR;
 | 
			
		||||
 | 
			
		||||
typedef UINT8 BOOLEAN;
 | 
			
		||||
 | 
			
		||||
#undef TRUE
 | 
			
		||||
#define TRUE (BOOLEAN)1
 | 
			
		||||
 | 
			
		||||
#undef FALSE
 | 
			
		||||
#define FALSE (BOOLEAN)0
 | 
			
		||||
 | 
			
		||||
#undef NULL
 | 
			
		||||
#ifndef NULL
 | 
			
		||||
#ifdef PROTOTYPES
 | 
			
		||||
# define NULL (VOID *)0
 | 
			
		||||
# define NULL (void *)0
 | 
			
		||||
#else
 | 
			
		||||
# define NULL 0L
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#undef GLOBAL
 | 
			
		||||
#define GLOBAL
 | 
			
		||||
@@ -126,24 +132,28 @@ typedef UINT8 BOOLEAN;
 | 
			
		||||
/* configure options */
 | 
			
		||||
 | 
			
		||||
#ifndef HAVE_socklen_t
 | 
			
		||||
#define socklen_t int			/* u.a. fuer Mac OS X */
 | 
			
		||||
typedef int socklen_t;			/* for Mac OS X, amongst others */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef HAVE_SNPRINTF
 | 
			
		||||
EXTERN INT snprintf PARAMS(( CHAR *str, size_t count, CONST CHAR *fmt, ... ));
 | 
			
		||||
extern int snprintf PARAMS(( char *str, size_t count, const char *fmt, ... ));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef HAVE_STRLCAT
 | 
			
		||||
EXTERN size_t strlcat PARAMS(( CHAR *dst, CONST CHAR *src, size_t size ));
 | 
			
		||||
extern size_t strlcat PARAMS(( char *dst, const char *src, size_t size ));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef HAVE_STRLCPY
 | 
			
		||||
EXTERN size_t strlcpy PARAMS(( CHAR *dst, CONST CHAR *src, size_t size ));
 | 
			
		||||
extern size_t strlcpy PARAMS(( char *dst, const char *src, size_t size ));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef HAVE_STRDUP
 | 
			
		||||
extern char * strdup PARAMS(( const char *s ));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef HAVE_VSNPRINTF
 | 
			
		||||
#include <stdarg.h>
 | 
			
		||||
EXTERN INT vsnprintf PARAMS(( CHAR *str, size_t count, CONST CHAR *fmt, va_list args ));
 | 
			
		||||
extern int vsnprintf PARAMS(( char *str, size_t count, const char *fmt, va_list args ));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef PACKAGE_NAME
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: portabtest.c,v 1.11 2003/01/04 10:40:01 alex Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: portabtest.c,v 1.12 2005/03/19 18:43:50 fw Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <stdarg.h>
 | 
			
		||||
@@ -25,20 +25,17 @@ static char UNUSED id[] = "$Id: portabtest.c,v 1.11 2003/01/04 10:40:01 alex Exp
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID Panic PARAMS (( CHAR *Reason, INT Code ));
 | 
			
		||||
LOCAL void Panic PARAMS (( char *Reason, int Code ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL int
 | 
			
		||||
main( VOID )
 | 
			
		||||
main( void )
 | 
			
		||||
{
 | 
			
		||||
	/* validate datatypes */
 | 
			
		||||
	if( FALSE != 0 ) Panic( "FALSE", 1 );
 | 
			
		||||
	if( TRUE != 1 ) Panic( "TRUE", 1 );
 | 
			
		||||
	if( sizeof( INT8 ) != 1 ) Panic( "INT8", 1 );
 | 
			
		||||
	if( false != 0 ) Panic( "false", 1 );
 | 
			
		||||
	if( true != 1 ) Panic( "true", 1 );
 | 
			
		||||
	if( sizeof( UINT8 ) != 1 ) Panic( "UINT8", 1 );
 | 
			
		||||
	if( sizeof( INT16 ) != 2 ) Panic( "INT16", 1 );
 | 
			
		||||
	if( sizeof( UINT16 ) != 2 ) Panic( "UINT16", 1 );
 | 
			
		||||
	if( sizeof( INT32 ) != 4 ) Panic( "INT32", 1 );
 | 
			
		||||
	if( sizeof( UINT32 ) != 4 ) Panic( "UINT32", 1 );
 | 
			
		||||
 | 
			
		||||
#ifdef PROTOTYPES
 | 
			
		||||
@@ -54,8 +51,8 @@ main( VOID )
 | 
			
		||||
} /* portab_check_types */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LOCAL VOID
 | 
			
		||||
Panic( CHAR *Reason, INT Code )
 | 
			
		||||
LOCAL void
 | 
			
		||||
Panic( char *Reason, int Code )
 | 
			
		||||
{
 | 
			
		||||
	/* Oops, something failed!? */
 | 
			
		||||
	fprintf( stderr, "Oops, test for %s failed!?", Reason );
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										35
									
								
								src/portab/strdup.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								src/portab/strdup.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,35 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 *
 | 
			
		||||
 * strdup() implementation.  Public domain.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: strdup.c,v 1.1 2005/04/16 09:20:53 fw Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
 | 
			
		||||
#ifndef HAVE_STRDUP
 | 
			
		||||
 | 
			
		||||
GLOBAL char *
 | 
			
		||||
strdup( const char *s )
 | 
			
		||||
{
 | 
			
		||||
 char *dup;
 | 
			
		||||
 size_t len = strlen( s );
 | 
			
		||||
 size_t alloc = len + 1;
 | 
			
		||||
 | 
			
		||||
 if (len >= alloc ) return NULL;
 | 
			
		||||
 dup = malloc( alloc );
 | 
			
		||||
 if (dup) strlcpy(dup, s, alloc );
 | 
			
		||||
 | 
			
		||||
return dup;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 * Copyright (c)2001-2005 Alexander Barton (alex@barton.de)
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
@@ -13,13 +13,13 @@
 | 
			
		||||
 *
 | 
			
		||||
 * Code partially borrowed from compat.c of rsync, written by Andrew
 | 
			
		||||
 * Tridgell (1998) and Martin Pool (2002):
 | 
			
		||||
 * <http://samba.anu.edu.au/rsync/doxygen/head/lib_2compat_8c.html>
 | 
			
		||||
 * <http://cvs.samba.org/cgi-bin/cvsweb/rsync/lib/compat.c>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: strlcpy.c,v 1.2 2002/12/26 14:34:11 alex Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: strlcpy.c,v 1.5 2005/03/19 18:43:50 fw Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <string.h>
 | 
			
		||||
@@ -31,7 +31,7 @@ static char UNUSED id[] = "$Id: strlcpy.c,v 1.2 2002/12/26 14:34:11 alex Exp $";
 | 
			
		||||
#ifndef HAVE_STRLCAT
 | 
			
		||||
 | 
			
		||||
GLOBAL size_t
 | 
			
		||||
strlcat( CHAR *dst, CONST CHAR *src, size_t size )
 | 
			
		||||
strlcat( char *dst, const char *src, size_t size )
 | 
			
		||||
{
 | 
			
		||||
	/* Like strncat() but does not 0 fill the buffer and
 | 
			
		||||
	 * always null terminates. */
 | 
			
		||||
@@ -39,10 +39,10 @@ strlcat( CHAR *dst, CONST CHAR *src, size_t size )
 | 
			
		||||
	size_t len1 = strlen( dst );
 | 
			
		||||
	size_t len2 = strlen( src );
 | 
			
		||||
	size_t ret = len1 + len2;
 | 
			
		||||
	
 | 
			
		||||
	if( len1 + len2 >= size ) len2 = size - ( len1 + 1 );
 | 
			
		||||
	if( len2 > 0 )
 | 
			
		||||
	{
 | 
			
		||||
 | 
			
		||||
	if( size && ( len1 < size - 1 )) {
 | 
			
		||||
		if( len2 >= size - len1 )
 | 
			
		||||
			len2 = size - len1 - 1;
 | 
			
		||||
		memcpy( dst + len1, src, len2 );
 | 
			
		||||
		dst[len1 + len2] = 0;
 | 
			
		||||
	}
 | 
			
		||||
@@ -55,18 +55,20 @@ strlcat( CHAR *dst, CONST CHAR *src, size_t size )
 | 
			
		||||
#ifndef HAVE_STRLCPY
 | 
			
		||||
 | 
			
		||||
GLOBAL size_t
 | 
			
		||||
strlcpy( CHAR *dst, CONST CHAR *src, size_t size )
 | 
			
		||||
strlcpy( char *dst, const char *src, size_t size )
 | 
			
		||||
{
 | 
			
		||||
	/* Like strncpy but does not 0 fill the buffer and
 | 
			
		||||
	 * always null terminates. */
 | 
			
		||||
 | 
			
		||||
	size_t len = strlen( src );
 | 
			
		||||
	size_t ret = len;
 | 
			
		||||
 | 
			
		||||
	if( size <= 0 ) return len;
 | 
			
		||||
	if( len >= size ) len = size - 1;
 | 
			
		||||
	memcpy( dst, src, len );
 | 
			
		||||
	dst[len] = 0;
 | 
			
		||||
	return len;
 | 
			
		||||
	if( size > 0 ) {
 | 
			
		||||
		if( len >= size ) len = size - 1;
 | 
			
		||||
		memcpy( dst, src, len );
 | 
			
		||||
		dst[len] = 0;
 | 
			
		||||
	}
 | 
			
		||||
	return ret;
 | 
			
		||||
} /* strlcpy */
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
 | 
			
		||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile.am,v 1.9 2002/11/10 14:28:06 alex Exp $
 | 
			
		||||
# $Id: Makefile.am,v 1.14 2004/09/08 09:40:51 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
AUTOMAKE_OPTIONS = ../portab/ansi2knr
 | 
			
		||||
@@ -17,12 +17,15 @@ AUTOMAKE_OPTIONS = ../portab/ansi2knr
 | 
			
		||||
INCLUDES = -I$(srcdir)/../portab
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST = \
 | 
			
		||||
	getpid.sh \
 | 
			
		||||
	README functions.inc getpid.sh \
 | 
			
		||||
	start-server.sh stop-server.sh tests.sh stress-server.sh \
 | 
			
		||||
	test-loop.sh wait-tests.sh \
 | 
			
		||||
	connect-test.e channel-test.e mode-test.e \
 | 
			
		||||
	stress-A.e stress-B.e check-idle.e \
 | 
			
		||||
	ngircd-test.conf
 | 
			
		||||
 | 
			
		||||
all:
 | 
			
		||||
 | 
			
		||||
clean-local:
 | 
			
		||||
	rm -rf logs tests *-test ngircd-test.log ngircd-test.motd \
 | 
			
		||||
	 T-ngircd procs.tmp 
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										72
									
								
								src/testsuite/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								src/testsuite/README
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,72 @@
 | 
			
		||||
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
 | 
			
		||||
                      (c)2001-2004 by Alexander Barton,
 | 
			
		||||
                    alex@barton.de, http://www.barton.de/
 | 
			
		||||
 | 
			
		||||
               ngIRCd is free software and published under the
 | 
			
		||||
                   terms of the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
		       -- README for the Test Suite --
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
I. Overview
 | 
			
		||||
~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
The purpose of the "test suite" contained in this directory is to detect
 | 
			
		||||
bugs and incompatibilities in ngIRCd introduced during coding and after
 | 
			
		||||
building ngIRCd on a specific platform.
 | 
			
		||||
 | 
			
		||||
To run the "standard" tests call "make check". It will build ngIRCd (if
 | 
			
		||||
required) and run some tests on it. These tests should be portable and run
 | 
			
		||||
on all supported platforms without errors.
 | 
			
		||||
 | 
			
		||||
Please note: most tests of this suite depend on the external tools expect(1)
 | 
			
		||||
and telnet(1), so make sure you have them installed. If not, the tests will
 | 
			
		||||
not fail but simply be skipped.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
II. Shell Scripts
 | 
			
		||||
~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
getpid.sh <name>
 | 
			
		||||
 | 
			
		||||
	This script is used to detect the PID of the running process with
 | 
			
		||||
	the given name in a portable manner. The result is echoed on the
 | 
			
		||||
	console. It is a helper script for some other scripts of this suite.
 | 
			
		||||
 | 
			
		||||
start-server.sh
 | 
			
		||||
 | 
			
		||||
	start-server.sh starts up the test binary, "T-ngircd". It makes sure
 | 
			
		||||
	that getpid.sh is available and working, and that no other instance
 | 
			
		||||
	of the test binary is already running.
 | 
			
		||||
	The exit code is 0 if the test binary could be started.
 | 
			
		||||
 | 
			
		||||
stop-server.sh
 | 
			
		||||
 | 
			
		||||
	This script uses getpid.sh to detect a running test binary "T-ngircd"
 | 
			
		||||
	and then shuts it down using the TERM signal.
 | 
			
		||||
	The exit code is 0 if the test binary could be stopped.
 | 
			
		||||
 | 
			
		||||
stress-server.sh
 | 
			
		||||
 | 
			
		||||
	...
 | 
			
		||||
 | 
			
		||||
tests.sh
 | 
			
		||||
 | 
			
		||||
	...
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
III. Scripts for expect(1)
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
channel-test.e
 | 
			
		||||
check-idle.e
 | 
			
		||||
connect-test.e
 | 
			
		||||
mode-test.e
 | 
			
		||||
stress-A.e
 | 
			
		||||
stress-B.e
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- 
 | 
			
		||||
$Id: README,v 1.1 2004/09/04 13:58:31 alex Exp $
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
# $Id: channel-test.e,v 1.2 2002/09/09 21:26:00 alex Exp $
 | 
			
		||||
# $Id: channel-test.e,v 1.3 2003/12/27 13:01:12 alex Exp $
 | 
			
		||||
 | 
			
		||||
spawn telnet localhost 6789
 | 
			
		||||
expect {
 | 
			
		||||
@@ -16,7 +16,7 @@ expect {
 | 
			
		||||
send "join #channel\r"
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
	":nick!~user@* JOIN :#channel"
 | 
			
		||||
	"@* JOIN :#channel"
 | 
			
		||||
}
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
@@ -26,13 +26,17 @@ expect {
 | 
			
		||||
send "topic #channel :Test-Topic\r"
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
	":nick!~user@* TOPIC #channel :Test-Topic"
 | 
			
		||||
	"@* TOPIC #channel :Test-Topic"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
send "who #channel\r"
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
	"352 nick #channel ~user * nick H@ :0 User"
 | 
			
		||||
	"352 nick #channel"
 | 
			
		||||
}
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
	"* nick H@ :0 User"
 | 
			
		||||
}
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
@@ -62,7 +66,7 @@ expect {
 | 
			
		||||
send "part #channel\r"
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
	":nick!~user@* PART #channel :nick"
 | 
			
		||||
	"@* PART #channel :nick"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
send "quit\r"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
# $Id: check-idle.e,v 1.1 2002/09/09 22:56:07 alex Exp $
 | 
			
		||||
# $Id: check-idle.e,v 1.2 2004/09/04 14:22:13 alex Exp $
 | 
			
		||||
 | 
			
		||||
spawn telnet localhost 6789
 | 
			
		||||
expect {
 | 
			
		||||
@@ -10,6 +10,7 @@ send "nick IdleTest\r"
 | 
			
		||||
send "user idle . . :Idle-Test\r"
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
	"433 * IdleTest :Nickname already in use" { exit 99 }
 | 
			
		||||
	"376"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										28
									
								
								src/testsuite/functions.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/testsuite/functions.inc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd Test Suite
 | 
			
		||||
# Copyright (c)2002-2004 by Alexander Barton (alex@barton.de)
 | 
			
		||||
#
 | 
			
		||||
# This program is free software; you can redistribute it and/or modify
 | 
			
		||||
# it under the terms of the GNU General Public License as published by
 | 
			
		||||
# the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
# (at your option) any later version.
 | 
			
		||||
# Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
#
 | 
			
		||||
# $Id: functions.inc,v 1.1 2004/09/06 22:04:06 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
# test how to call echo to get output without newline
 | 
			
		||||
echo -n | grep -- -n >/dev/null 2>&1
 | 
			
		||||
if [ $? -eq 0 ]; then
 | 
			
		||||
	ECHO_N=""; ECHO_C="\c"
 | 
			
		||||
else
 | 
			
		||||
	ECHO_N="-n"; ECHO_C=""
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
echo_n()
 | 
			
		||||
{
 | 
			
		||||
	echo $ECHO_N "$*$ECHO_C"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
@@ -1,26 +1,35 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
# ngIRCd Test Suite
 | 
			
		||||
# $Id: getpid.sh,v 1.2 2002/11/10 14:28:06 alex Exp $
 | 
			
		||||
# $Id: getpid.sh,v 1.4 2003/08/22 11:31:18 alex Exp $
 | 
			
		||||
 | 
			
		||||
# wurde ein Name uebergeben?
 | 
			
		||||
# did we get a name?
 | 
			
		||||
[ $# -ne 1 ] && exit 1
 | 
			
		||||
 | 
			
		||||
# Flags fuer "ps" ermitteln
 | 
			
		||||
# detect flags for "ps" and "head"
 | 
			
		||||
if [ `uname` = "FreeBSD" ]; then
 | 
			
		||||
  PS_FLAGS="-a"; PS_PIDCOL="1"; HEAD_FLAGS="-n 1"
 | 
			
		||||
elif [ `uname` = "A/UX" ]; then
 | 
			
		||||
  PS_FLAGS="-ae"; PS_PIDCOL="1"; HEAD_FLAGS="-1"
 | 
			
		||||
elif [ `uname` = "GNU" ]; then
 | 
			
		||||
  PS_FLAGS="-ax"; PS_PIDCOL="2"; HEAD_FLAGS="-n 1"
 | 
			
		||||
else
 | 
			
		||||
  PS_FLAGS="-f"; PS_PIDCOL="2"; HEAD_FLAGS="-n 1"
 | 
			
		||||
  ps $PS_FLAGS > /dev/null 2>&1
 | 
			
		||||
  if [ $? -ne 0 ]; then PS_FLAGS="a"; PS_PIDCOL="1"; fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# PID ermitteln
 | 
			
		||||
ps $PS_FLAGS > procs.tmp
 | 
			
		||||
pid=$( cat procs.tmp | grep "$1" | awk "{print \$$PS_PIDCOL}" | sort -n | head $HEAD_FLAGS )
 | 
			
		||||
# debug output
 | 
			
		||||
#echo "$0: PS_FLAGS=$PS_FLAGS"
 | 
			
		||||
#echo "$0: PS_PIDCOL=$PS_PIDCOL"
 | 
			
		||||
#echo "$0: HEAD_FLAGS=$HEAD_FLAGS"
 | 
			
		||||
 | 
			
		||||
# ermittelte PID validieren
 | 
			
		||||
# search PID
 | 
			
		||||
ps $PS_FLAGS > procs.tmp
 | 
			
		||||
cat procs.tmp | grep -v "$0" | grep "$1" | awk "{print \$$PS_PIDCOL}" | sort -n > pids.tmp
 | 
			
		||||
pid=`head $HEAD_FLAGS pids.tmp`
 | 
			
		||||
rm -rf procs.tmp pids.tmp
 | 
			
		||||
 | 
			
		||||
# validate PID
 | 
			
		||||
[ "$pid" -gt 1 ] > /dev/null 2>&1
 | 
			
		||||
[ $? -ne 0 ] && exit 1
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user