mirror of
				https://github.com/osmarks/ngircd.git
				synced 2025-11-04 07:52:59 +00:00 
			
		
		
		
	Compare commits
	
		
			219 Commits
		
	
	
		
			rel-21-rc1
			...
			rel-23-rc1
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					1e84b2640e | ||
| 
						 | 
					86d27eaf89 | ||
| 
						 | 
					4acf95ab61 | ||
| 
						 | 
					57cd41d289 | ||
| 
						 | 
					eb9929e82c | ||
| 
						 | 
					c2e4c304e3 | ||
| 
						 | 
					c56138c280 | ||
| 
						 | 
					a1ce3fc779 | ||
| 
						 | 
					ccc899c7f4 | ||
| 
						 | 
					2a52befa56 | ||
| 
						 | 
					2c18e9a7f8 | ||
| 
						 | 
					9811223fb8 | ||
| 
						 | 
					0083fe177f | ||
| 
						 | 
					34578b8b30 | ||
| 
						 | 
					85dc4d8777 | ||
| 
						 | 
					64c265cf33 | ||
| 
						 | 
					b72a7a4b96 | ||
| 
						 | 
					b8482fd3cf | ||
| 
						 | 
					90ea23ab4f | ||
| 
						 | 
					6e7e744cc6 | ||
| 
						 | 
					24cec978ee | ||
| 
						 | 
					a02524465e | ||
| 
						 | 
					813ea874f8 | ||
| 
						 | 
					813897023e | ||
| 
						 | 
					a5ca8be658 | ||
| 
						 | 
					c364d67f80 | ||
| 
						 | 
					5545e1bebf | ||
| 
						 | 
					d118cd74b6 | ||
| 
						 | 
					599626d570 | ||
| 
						 | 
					571b1a8b83 | ||
| 
						 | 
					b71a0ddbd5 | ||
| 
						 | 
					7ff16e8116 | ||
| 
						 | 
					f6b7764eb5 | ||
| 
						 | 
					adfe5affed | ||
| 
						 | 
					27934afd7e | ||
| 
						 | 
					f64cb901ef | ||
| 
						 | 
					d28d838cb9 | ||
| 
						 | 
					2fc61ce8a6 | ||
| 
						 | 
					5c48d7e9c7 | ||
| 
						 | 
					0f490b5cae | ||
| 
						 | 
					a43d79aeff | ||
| 
						 | 
					93a872a36b | ||
| 
						 | 
					c4245220de | ||
| 
						 | 
					f8f7f83f5a | ||
| 
						 | 
					03c8997af3 | ||
| 
						 | 
					4396936f38 | ||
| 
						 | 
					4da04640e6 | ||
| 
						 | 
					10c7ba99e7 | ||
| 
						 | 
					1136b97690 | ||
| 
						 | 
					d9a97f2857 | ||
| 
						 | 
					a4af9024fd | ||
| 
						 | 
					6fc53558ed | ||
| 
						 | 
					21767c968d | ||
| 
						 | 
					c5da483685 | ||
| 
						 | 
					4330f5d1c9 | ||
| 
						 | 
					81b81c818c | ||
| 
						 | 
					52825cde29 | ||
| 
						 | 
					03e6568079 | ||
| 
						 | 
					7dacc314f9 | ||
| 
						 | 
					24adfb88b4 | ||
| 
						 | 
					6ed440a030 | ||
| 
						 | 
					c7bbc9a390 | ||
| 
						 | 
					6171beb7ab | ||
| 
						 | 
					2196e945e4 | ||
| 
						 | 
					f16eb1b686 | ||
| 
						 | 
					c41f18e3f9 | ||
| 
						 | 
					dbfe1beca8 | ||
| 
						 | 
					6bdae55177 | ||
| 
						 | 
					fb5ae9e844 | ||
| 
						 | 
					bd8d4e710c | ||
| 
						 | 
					9a931a549b | ||
| 
						 | 
					3c30490d54 | ||
| 
						 | 
					6250335352 | ||
| 
						 | 
					7e14bd3b58 | ||
| 
						 | 
					31b3c83c1f | ||
| 
						 | 
					6e4235443e | ||
| 
						 | 
					cdcf474f15 | ||
| 
						 | 
					f33a4067a1 | ||
| 
						 | 
					100de3e4cc | ||
| 
						 | 
					7b58538074 | ||
| 
						 | 
					3f436e1810 | ||
| 
						 | 
					967deebacd | ||
| 
						 | 
					74262a4093 | ||
| 
						 | 
					be88707027 | ||
| 
						 | 
					7d7eb735f0 | ||
| 
						 | 
					fa7fac88d2 | ||
| 
						 | 
					84ff5a6eb9 | ||
| 
						 | 
					bf2eae3249 | ||
| 
						 | 
					ffad2da835 | ||
| 
						 | 
					3f1547ecde | ||
| 
						 | 
					7893dc5241 | ||
| 
						 | 
					896d45471a | ||
| 
						 | 
					01c3552140 | ||
| 
						 | 
					ce3c4074ba | ||
| 
						 | 
					40ed94a1f2 | ||
| 
						 | 
					c1f180b87b | ||
| 
						 | 
					f5944a17e4 | ||
| 
						 | 
					06920df4bb | ||
| 
						 | 
					e864b1f33e | ||
| 
						 | 
					3f807e1045 | ||
| 
						 | 
					39b8fc65b6 | ||
| 
						 | 
					3de972e0bd | ||
| 
						 | 
					ec2bf5c5a2 | ||
| 
						 | 
					70160b3a5b | ||
| 
						 | 
					a90004b913 | ||
| 
						 | 
					9e79ed8605 | ||
| 
						 | 
					cdd6b961af | ||
| 
						 | 
					bfc727ce49 | ||
| 
						 | 
					dee824a3f0 | ||
| 
						 | 
					f5ae1dd36c | ||
| 
						 | 
					794cb51e4b | ||
| 
						 | 
					dd4b74e29b | ||
| 
						 | 
					daed2467dd | ||
| 
						 | 
					d314c75a37 | ||
| 
						 | 
					5009ab3e8c | ||
| 
						 | 
					5713c49c84 | ||
| 
						 | 
					35f1db5f28 | ||
| 
						 | 
					4c2acd55c6 | ||
| 
						 | 
					f547981188 | ||
| 
						 | 
					b35f8916a5 | ||
| 
						 | 
					3d7aa9f906 | ||
| 
						 | 
					a534e71e8d | ||
| 
						 | 
					a13bb78b1e | ||
| 
						 | 
					b130b35f48 | ||
| 
						 | 
					37090a28e8 | ||
| 
						 | 
					67256f9da1 | ||
| 
						 | 
					7b10a0e4ee | ||
| 
						 | 
					259c314d14 | ||
| 
						 | 
					51396f8f1c | ||
| 
						 | 
					6238196dac | ||
| 
						 | 
					43fb18f2f5 | ||
| 
						 | 
					a4ed90ba9a | ||
| 
						 | 
					af9161a9bc | ||
| 
						 | 
					485d0aec81 | ||
| 
						 | 
					abf280d5bd | ||
| 
						 | 
					ccc9e1baa4 | ||
| 
						 | 
					755562d147 | ||
| 
						 | 
					384b27cee0 | ||
| 
						 | 
					6496fa4655 | ||
| 
						 | 
					20b52fe33d | ||
| 
						 | 
					0fc822d8c4 | ||
| 
						 | 
					2e168c7809 | ||
| 
						 | 
					14a84dfca5 | ||
| 
						 | 
					4cb36e370e | ||
| 
						 | 
					e273bd226a | ||
| 
						 | 
					3b24ebf122 | ||
| 
						 | 
					599cfd0944 | ||
| 
						 | 
					90062111f7 | ||
| 
						 | 
					e747fe9277 | ||
| 
						 | 
					0f85c4c6a7 | ||
| 
						 | 
					e73d70ce6f | ||
| 
						 | 
					2560e5f156 | ||
| 
						 | 
					1f5508d049 | ||
| 
						 | 
					97b4fd8a08 | ||
| 
						 | 
					fe73835666 | ||
| 
						 | 
					5b4b7e2f55 | ||
| 
						 | 
					8ae2cdfce9 | ||
| 
						 | 
					6685ae063f | ||
| 
						 | 
					e2b85ccde3 | ||
| 
						 | 
					7b358a57ac | ||
| 
						 | 
					5d88030bd1 | ||
| 
						 | 
					8872653ef6 | ||
| 
						 | 
					4d4512cd72 | ||
| 
						 | 
					bc098794ee | ||
| 
						 | 
					788da901ee | ||
| 
						 | 
					2a40112f09 | ||
| 
						 | 
					61b7932e82 | ||
| 
						 | 
					f024a4992a | ||
| 
						 | 
					d38747d951 | ||
| 
						 | 
					18070e5381 | ||
| 
						 | 
					d913323ca9 | ||
| 
						 | 
					9230f2fff1 | ||
| 
						 | 
					86bdf6e1d4 | ||
| 
						 | 
					1a628fff51 | ||
| 
						 | 
					bd33bd770d | ||
| 
						 | 
					b8433e9261 | ||
| 
						 | 
					5a424f60da | ||
| 
						 | 
					444308ccde | ||
| 
						 | 
					1ad536eeed | ||
| 
						 | 
					c68ae1a9f5 | ||
| 
						 | 
					df7ea9e7b4 | ||
| 
						 | 
					34824abe0d | ||
| 
						 | 
					ae00c100ac | ||
| 
						 | 
					61d1c864c5 | ||
| 
						 | 
					8d25044ce5 | ||
| 
						 | 
					c3c719b978 | ||
| 
						 | 
					9ee3760493 | ||
| 
						 | 
					344185b1bd | ||
| 
						 | 
					fcf61e9e02 | ||
| 
						 | 
					9f236c4b91 | ||
| 
						 | 
					00249f3c80 | ||
| 
						 | 
					925b4de298 | ||
| 
						 | 
					48ea69d778 | ||
| 
						 | 
					80d0613bf2 | ||
| 
						 | 
					4ab688c5e8 | ||
| 
						 | 
					2e93129877 | ||
| 
						 | 
					94148c37f5 | ||
| 
						 | 
					f25be28ab8 | ||
| 
						 | 
					fae7bd1bb7 | ||
| 
						 | 
					0556aa1901 | ||
| 
						 | 
					48698f14a2 | ||
| 
						 | 
					8e6db769ac | ||
| 
						 | 
					8a041373bb | ||
| 
						 | 
					37c8699f34 | ||
| 
						 | 
					788b3002d8 | ||
| 
						 | 
					beb9f65dc8 | ||
| 
						 | 
					62865f7e19 | ||
| 
						 | 
					a7dda1b28c | ||
| 
						 | 
					cba5a2579f | ||
| 
						 | 
					a2479bb906 | ||
| 
						 | 
					17589534d0 | ||
| 
						 | 
					ea26fd2840 | ||
| 
						 | 
					45d3e6aa91 | ||
| 
						 | 
					0bd3fb88b2 | ||
| 
						 | 
					c34b91d8dd | ||
| 
						 | 
					56da86b4f4 | ||
| 
						 | 
					ea8a2bf1fc | ||
| 
						 | 
					1b349b05d5 | ||
| 
						 | 
					4c5b439992 | 
							
								
								
									
										4
									
								
								.clang_complete
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								.clang_complete
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
			
		||||
-I./src
 | 
			
		||||
-I./src/ipaddr
 | 
			
		||||
-I./src/portab
 | 
			
		||||
-I./src/tool
 | 
			
		||||
							
								
								
									
										42
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										42
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,4 +1,5 @@
 | 
			
		||||
Makefile
 | 
			
		||||
Makefile.am
 | 
			
		||||
Makefile.in
 | 
			
		||||
aclocal.m4
 | 
			
		||||
ansi2knr.1
 | 
			
		||||
@@ -7,12 +8,15 @@ ansi2knr.h
 | 
			
		||||
ar-lib
 | 
			
		||||
autom4te.cache
 | 
			
		||||
build-stamp-ngircd*
 | 
			
		||||
build+*
 | 
			
		||||
compile
 | 
			
		||||
config.cache
 | 
			
		||||
config.log
 | 
			
		||||
config.status
 | 
			
		||||
configure
 | 
			
		||||
configure.ac
 | 
			
		||||
configure.lineno
 | 
			
		||||
cov-int
 | 
			
		||||
cscope.out
 | 
			
		||||
debian
 | 
			
		||||
depcomp
 | 
			
		||||
@@ -22,3 +26,41 @@ ngircd.dest
 | 
			
		||||
.deps
 | 
			
		||||
*.a
 | 
			
		||||
*.o
 | 
			
		||||
doc/sample-ngircd.conf
 | 
			
		||||
doc/src/html
 | 
			
		||||
man/ngircd.8
 | 
			
		||||
man/ngircd.conf.5
 | 
			
		||||
src/config.h
 | 
			
		||||
src/config.h.in
 | 
			
		||||
src/config.h.in~
 | 
			
		||||
src/stamp-h1
 | 
			
		||||
src/ngircd/check-help
 | 
			
		||||
src/ngircd/check-version
 | 
			
		||||
src/ngircd/ngircd
 | 
			
		||||
src/ngircd/ngircd.exe
 | 
			
		||||
src/portab/portabtest
 | 
			
		||||
src/portab/portabtest.exe
 | 
			
		||||
src/testsuite/*.e_
 | 
			
		||||
src/testsuite/channel-test
 | 
			
		||||
src/testsuite/connect-test
 | 
			
		||||
src/testsuite/invite-test
 | 
			
		||||
src/testsuite/join-test
 | 
			
		||||
src/testsuite/kick-test
 | 
			
		||||
src/testsuite/logs
 | 
			
		||||
src/testsuite/message-test
 | 
			
		||||
src/testsuite/misc-test
 | 
			
		||||
src/testsuite/mode-test
 | 
			
		||||
src/testsuite/ngircd-test1.log
 | 
			
		||||
src/testsuite/ngircd-test1.motd
 | 
			
		||||
src/testsuite/ngircd-test2.log
 | 
			
		||||
src/testsuite/ngircd-test2.motd
 | 
			
		||||
src/testsuite/opless-channel-test
 | 
			
		||||
src/testsuite/server-link-test
 | 
			
		||||
src/testsuite/T-ngircd1
 | 
			
		||||
src/testsuite/T-ngircd1.exe
 | 
			
		||||
src/testsuite/T-ngircd2
 | 
			
		||||
src/testsuite/T-ngircd2.exe
 | 
			
		||||
src/testsuite/tests
 | 
			
		||||
src/testsuite/tests-skipped.lst
 | 
			
		||||
src/testsuite/who-test
 | 
			
		||||
src/testsuite/whois-test
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										12
									
								
								.mailmap
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								.mailmap
									
									
									
									
									
								
							@@ -1,4 +1,14 @@
 | 
			
		||||
# mailmap file for git-[short]log and git-blame
 | 
			
		||||
# use "git shortlog -se" to see the list of all authors.
 | 
			
		||||
 | 
			
		||||
Alexander Barton <alex@barton.de> <anonymous>
 | 
			
		||||
Alexander Barton <alex@barton.de> <alex@kfreebsd.barton.de>
 | 
			
		||||
 | 
			
		||||
Alexander Barton <anonymous>
 | 
			
		||||
Ali Shemiran <ashemira@ucsd.edu>
 | 
			
		||||
 | 
			
		||||
Dana Dahlstrom <dana+ngIRCd@cs.ucsd.edu> <dana@cs.ucsd.edu>
 | 
			
		||||
Dana Dahlstrom <dana+ngIRCd@cs.ucsd.edu> <dana+70@cs.ucsd.edu>
 | 
			
		||||
 | 
			
		||||
DNS <dns@rbose.org>
 | 
			
		||||
 | 
			
		||||
LucentW <lucent@zebes.info> <LucentW@users.noreply.github.com>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										18
									
								
								AUTHORS
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								AUTHORS
									
									
									
									
									
								
							@@ -2,16 +2,18 @@
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
                           http://ngircd.barton.de/
 | 
			
		||||
 | 
			
		||||
               (c)2001-2013 Alexander Barton and Contributors.
 | 
			
		||||
               (c)2001-2015 Alexander Barton and Contributors.
 | 
			
		||||
               ngIRCd is free software and published under the
 | 
			
		||||
                   terms of the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
                       -- AUTHORS and CONTRIBUTORS --
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Note: If you have critics, patches or something else, please feel free to
 | 
			
		||||
post a mail to the ngIRCd mailing list: <ngircd-ml@arthur.barton.de> (please
 | 
			
		||||
see <http://ngircd.barton.de/#ml> for details).
 | 
			
		||||
Note:
 | 
			
		||||
If you have comments, patches or something else, please feel free to post
 | 
			
		||||
a mail to the ngIRCd mailing list: <ngircd-ml@ngircd.barton.de> (please see
 | 
			
		||||
<http://ngircd.barton.de/support.php> for details) or join the ngIRCd IRC
 | 
			
		||||
channel: <irc://irc.barton.de/ngircd>.
 | 
			
		||||
 | 
			
		||||
Don't mail the people listed here directly, if possible!
 | 
			
		||||
 | 
			
		||||
@@ -39,15 +41,23 @@ Eric Grunow <egrunow@ucsd.edu>
 | 
			
		||||
Federico G. Schwindt <fgsch@lodoss.net>
 | 
			
		||||
Gabor Adam Toth <tg@tgbit.net>
 | 
			
		||||
Goetz Hoffart <goetz@hoffart.de>
 | 
			
		||||
Ian Chard <ian@chard.org>
 | 
			
		||||
Ilja Osthoff <i.osthoff@gmx.net>
 | 
			
		||||
Jari Aalto <jari.aalto@cante.net>
 | 
			
		||||
LucentW <lucent@zebes.info>
 | 
			
		||||
Mantas Mikulėnas <grawity@gmail.com>
 | 
			
		||||
Neale Pickett <neale@woozle.org>
 | 
			
		||||
Peter Powell <petpow@saberuk.com>
 | 
			
		||||
Rolf Eike Beer <eike@sf-mail.de>
 | 
			
		||||
Roy Sindre Norangshol <roy.sindre@norangshol.no>
 | 
			
		||||
Scott Perry <scperry@ucsd.edu>
 | 
			
		||||
Sean Reifschneider <jafo-rpms@tummy.com>
 | 
			
		||||
Sebastian Köhler <sebkoehler@whoami.org.uk>
 | 
			
		||||
Tassilo Schweyer <dev@welterde.de>
 | 
			
		||||
Tom Ryder <tom@sanctum.geek.nz>
 | 
			
		||||
Unit 193 <unit193@ubuntu.com>
 | 
			
		||||
William Pitcock <nenolod@dereferenced.org>
 | 
			
		||||
Yecheng Fu <cofyc.jackson@gmail.com>
 | 
			
		||||
xor <xorboy@gmail.com>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										310
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										310
									
								
								ChangeLog
									
									
									
									
									
								
							@@ -2,15 +2,269 @@
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
                           http://ngircd.barton.de/
 | 
			
		||||
 | 
			
		||||
               (c)2001-2013 Alexander Barton and Contributors.
 | 
			
		||||
               (c)2001-2015 Alexander Barton and Contributors.
 | 
			
		||||
               ngIRCd is free software and published under the
 | 
			
		||||
                   terms of the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
                               -- ChangeLog --
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ngIRCd 21~rc1 (2013-10-05)
 | 
			
		||||
ngIRCd 23
 | 
			
		||||
 | 
			
		||||
  ngIRCd 23~rc1 (2015-09-06)
 | 
			
		||||
  - Add ".clang_complete" file, which is used by the "linter-clang" package
 | 
			
		||||
    of the Atom editor, for example.
 | 
			
		||||
  - Make server-to-server protocol more robust: ngIRCd now catches more
 | 
			
		||||
    errors on the server-to-server (S2S) protocol that could crash the
 | 
			
		||||
    daemon before. This hasn't been a real problem because the IRC S2S
 | 
			
		||||
    protocol is "trusted" by design, but the behavior is much better now.
 | 
			
		||||
    Thanks to wowaname on #ngircd for pointing this out!
 | 
			
		||||
  - Make platformtest.sh, autogen.sh, and ngircd.init more portable.
 | 
			
		||||
  - Enables "reproducible builds" for ngIRCd: Use the optional BIRTHTIME
 | 
			
		||||
    constant while building ngIRCd, which contains a time stamp for the
 | 
			
		||||
    "Birth Date" information, in seconds since the epoch.
 | 
			
		||||
    See <https://wiki.debian.org/ReproducibleBuilds>.
 | 
			
		||||
  - Update "contrib/ngircd.service" file for systemd.
 | 
			
		||||
  - INSTALL: Add deprecation notice for "PredefChannelsOnly" variable.
 | 
			
		||||
  - Use "NOTICE *" before registration instead of "NOTICE AUTH". "AUTH" is
 | 
			
		||||
    a valid nickname so sending notices to it is probably not a good idea.
 | 
			
		||||
    Use "*" as the target instead as done with numerics when the nick is not
 | 
			
		||||
    available. This mimics the behaviour in Charybdis, IRCD-Hybrid, InspIRCd
 | 
			
		||||
    2.2, Plexus 4, etc. Closes #217.
 | 
			
		||||
    The "NoticeAuth" configuration variable (ngircd.conf) has been renamed
 | 
			
		||||
    to "NoticeBeforeRegistration" accordingly, but the old name is still
 | 
			
		||||
    supported for compatibility reasons.
 | 
			
		||||
  - Implement new channel mode "N" (regular users can't change their nick
 | 
			
		||||
    name while on this channel). Closes #214.
 | 
			
		||||
  - README, AUTHORS: Update mailing list and issue tracker URLs.
 | 
			
		||||
  - Remove doc/GIT.txt (it is outdated), update doc/Contributing.txt:
 | 
			
		||||
    ngIRCd uses GitHub, and Git itself is quite common today. So don't
 | 
			
		||||
    include an own Git "mini HowTo" any longer.
 | 
			
		||||
  - Specify session context for OpenSSL clients. This enables some OpenSSL
 | 
			
		||||
    clients, including Pidgin and stunnel 5.06, to reuse a session.
 | 
			
		||||
    Patch by Tom Ryder <tom@sanctum.geek.nz>, thanks! Closes #182.
 | 
			
		||||
  - Keep track of who placed bans, invites, and excepts.
 | 
			
		||||
    Idee and implementation by LucentW, Thanks! Closes #203.
 | 
			
		||||
  - Make setgroups(3) function optional: For example, Interix is missing
 | 
			
		||||
    this function, which prevented ngIRCd to build on this platform. When
 | 
			
		||||
    setgroups(3) isn't available, a warning message is issued on startup.
 | 
			
		||||
  - Implement numeric RPL_LISTSTART(321). lightIRC and other clients
 | 
			
		||||
    expecting RPL_LISTSTART should now behave correctly.
 | 
			
		||||
    Idee and implementation by LucentW, Thanks! Closes #207.
 | 
			
		||||
  - Update ngircd.conf.5: "CloadUserToNick" hides user _and_ real name.
 | 
			
		||||
    This closes #208.
 | 
			
		||||
  - Fix case insensitive pattern matching: Up to now, only the the input
 | 
			
		||||
    string became lowercased and was then compared to the pattern -- which
 | 
			
		||||
    failed when the pattern itself wasn't all lowercase!
 | 
			
		||||
  - Streamline the effect of "MorePrivacy" option: Update documentation
 | 
			
		||||
    in ngircd.conf(5); don't hide channels for IRC Ops on LIST and don't
 | 
			
		||||
    hide IP addresses/hostnames on WHOIS when "MorePrivacy" is in effect.
 | 
			
		||||
    This closes #198.
 | 
			
		||||
  - IRC operators now can kick anyone when "OperCanMode" is set.
 | 
			
		||||
    Idee and implementation by LucentW, Thanks! Closes #202.
 | 
			
		||||
  - Implement user mode "I": Hide channels on WHOIS: this mode prevents
 | 
			
		||||
    ngIRCd from showing channels on WHOIS (IRC Operators can always see
 | 
			
		||||
    the channel list).
 | 
			
		||||
    Idee and implementation by LucentW, Thanks! Closes #197.
 | 
			
		||||
  - INVITE command: Implement ERR_USERNOTONSERV(504) numeric and make sure
 | 
			
		||||
    that the target user is on the same server when inviting other users
 | 
			
		||||
    to local ("&") channels.
 | 
			
		||||
    Idea by Cahata, thanks! Closes #183.
 | 
			
		||||
  - INVITE command: Enforce 1 second penalty time, which prevents flooding
 | 
			
		||||
    of the target client.
 | 
			
		||||
    This closes #186. Reported by Cahata, thanks!
 | 
			
		||||
  - MODE command: Always report channel creation time. Up to now when
 | 
			
		||||
    receiving a MODE command, ngIRCd only reported the channel creation
 | 
			
		||||
    time to clients that were members of the channel. This patch reports
 | 
			
		||||
    the channel creation time to all clients, regardless if they are joined
 | 
			
		||||
    to that channel or not. At least ircd-seven behaves like this.
 | 
			
		||||
    This closes #188. Reported by Cahata, thanks!
 | 
			
		||||
  - Update Xcode project for latest Xcode version (6.3).
 | 
			
		||||
 | 
			
		||||
ngIRCd 22.1 (2015-04-06)
 | 
			
		||||
 | 
			
		||||
  - Update doc/Platforms.txt and doc/FAQ.txt.
 | 
			
		||||
  - Fix spelling of RPL_WHOISBOT message text.
 | 
			
		||||
  - Don't send nick name as default PART reason: No other IRC daemon seems
 | 
			
		||||
    to do this (today?). Closes #185.
 | 
			
		||||
    Reported by Cahata in #ngircd, thanks!
 | 
			
		||||
  - Fix "WHO #<chan>" showing invisible users and hiding all visible, the
 | 
			
		||||
    logic was reversed! This bug has been introduced by commit c74115f2,
 | 
			
		||||
    "Simplify mode checking on channels and users within a channel", ngIRCd
 | 
			
		||||
    releases 21, 21.1, and 22 are affected :-( Problem reported by Cahata
 | 
			
		||||
    in #ngircd, Thanks!
 | 
			
		||||
  - Fix typo in src/testsuite/README
 | 
			
		||||
  - Auth PING: Fix our information text for manual sending of "PONG". Up to
 | 
			
		||||
    now, ngIRCd doesn't send a valid IRC command at all, oops!
 | 
			
		||||
  - Auth PING: Fix internal time stamp conversion and don't send a prefix in
 | 
			
		||||
    our PING command. The prefix confuses WeeChat, at least, which doesn't
 | 
			
		||||
    send an appropriate PONG in the case ...
 | 
			
		||||
    Debugging and patch by "wowaname" on #ngircd, thanks!
 | 
			
		||||
  - Fix syntax of ERR_LISTFULL_MSG(478) numeric. Pointed out by "wowaname"
 | 
			
		||||
    in #ngircd, thanks!
 | 
			
		||||
  - Enhance debug messages while sending CHANINFO commands.
 | 
			
		||||
  - Reset "last try" timer when enabling a passive server. This results in
 | 
			
		||||
    a new connection attempt as soon as possible.
 | 
			
		||||
  - Change log message for "Can't resolve address" and for IP address
 | 
			
		||||
    forgeries.
 | 
			
		||||
  - doc/HowToRelease.txt: Add note about the bug tracker.
 | 
			
		||||
  - Update "CipherList" to not enable SSLv3 by default. Idea, initial patch,
 | 
			
		||||
    and testing by Christoph Biedl <ngircd.anoy@manchmal.in-ulm.de>.
 | 
			
		||||
  - Change ngIRCd test suite not to use DNS lookups: Different operating
 | 
			
		||||
    systems do behave quite differently when doing DNS lookups, for example
 | 
			
		||||
    "127.0.0.1" sometimes resolves to "localhost" and sometimes to
 | 
			
		||||
    "localhost.localdomain" (for example OpenBSD). And other OS resolve
 | 
			
		||||
    "localhost" to the real host name (for example Cygwin). So not using
 | 
			
		||||
    DNS at all makes the test site much more portable.
 | 
			
		||||
 | 
			
		||||
ngIRCd 22 (2014-10-11)
 | 
			
		||||
 | 
			
		||||
  - Match all list patterns case-insensitive: this affects the invite-,
 | 
			
		||||
    ban-, and except lists, as well as G-Lines an K-Lines.
 | 
			
		||||
    Problem pointed out by "wowaname" on #ngircd, thanks!
 | 
			
		||||
 | 
			
		||||
  ngIRCd 22~rc1 (2014-09-29)
 | 
			
		||||
  - Sync "except lists" between servers: Up to now, ban, invite, and G-Line
 | 
			
		||||
    lists have been synced between servers while linking -- but obviously
 | 
			
		||||
    nobody noticed that except list have been missing ever since. Until now.
 | 
			
		||||
    Thanks to "j4jackj", who reported this issue in #ngircd.
 | 
			
		||||
  - Allow longer user names (up to 63 characters) for authentication.
 | 
			
		||||
  - Correctly check that a server has a valid hostname and port, thanks to
 | 
			
		||||
    David Binderman <dcb314@hotmail.com> who reported this bug.
 | 
			
		||||
  - Fix the function which generates complete "IRC masks" from user input,
 | 
			
		||||
    don't destroy the source buffer and use all provided parts (nick, user,
 | 
			
		||||
    host name). This fixes GLINEs/KLINEs from not working in some situations.
 | 
			
		||||
  - Increase MAX_SERVERS from 16 to 64: There are installations out there
 | 
			
		||||
    that would like to configure more than 16 links per server, so increase
 | 
			
		||||
    this limit. Best would be to get rid of MAX_SERVERS altogether and make
 | 
			
		||||
    if fully dynamic, but start with this quick and dirty hack ...
 | 
			
		||||
  - Debian: Don't adjust path names that are correct by default and correctly
 | 
			
		||||
    set and use "docdir".
 | 
			
		||||
  - Update config.guess and config.sub to recent versions.
 | 
			
		||||
  - Test suite/platformtest.sh: Detect when tests have been skipped.
 | 
			
		||||
  - doc/Bopm.txt: Update "connregex" and "kline" for current ngIRCd.
 | 
			
		||||
  - Allow "DefaultUserModes" to set all possible modes, including modes only
 | 
			
		||||
    settable by IRC Operators.
 | 
			
		||||
  - Spoofed prefixes: Really kill connection on non-server links.
 | 
			
		||||
  - Implement user mode "F": "relaxed flood protection". Clients with mode
 | 
			
		||||
    "F" set are allowed to rapidly send data to the daemon. This mode is only
 | 
			
		||||
    settable by IRC Operators and can cause problems in the network -- so be
 | 
			
		||||
    careful and only set it on "trusted" clients!
 | 
			
		||||
    User mode "F" is used by Bahamut for this purpose, for example.
 | 
			
		||||
  - Handle "throttling" in a single function: ngIRCd implements "command
 | 
			
		||||
    throttling" and "bps throttling" (bytes per second). The states are
 | 
			
		||||
    detected in different functions, Conn_Handler() and Read_Request(), but
 | 
			
		||||
    handle the actual "throttling" in a common function: this enables us to
 | 
			
		||||
    guarantee consistent behavior and to disable throttling for special
 | 
			
		||||
    connections in only one place
 | 
			
		||||
  - Use server password when PAM is compiled in but disabled.
 | 
			
		||||
  - Streamline punctuation of log messages.
 | 
			
		||||
  - Return ISUPPORT(005) numerics on "VERSION". This is how ircd-seven,
 | 
			
		||||
    Charybdis, Hybrid, and InspIRCd behave, for example.
 | 
			
		||||
  - configure: Only link "contrib/Debian" if it exists, which isn't the case
 | 
			
		||||
    on "VPATH builds", for example.
 | 
			
		||||
  - Show the account name in WHOIS. This uses the same numeric as Charybdis
 | 
			
		||||
    and ircu families: WHOISLOGGEDIN(330).
 | 
			
		||||
  - Pattern matching: Remove "range matching" in our pattern matching code
 | 
			
		||||
    using the "[...]" syntax, because [ and ] are valid characters in nick
 | 
			
		||||
    names and one has to quote them currently using the "\" character, which
 | 
			
		||||
    is quite unexpected for users.
 | 
			
		||||
  - platformtest.sh: New option "-x", don't regenerate build system and
 | 
			
		||||
    allow using separate source and build trees.
 | 
			
		||||
  - Test suite: explicitly enable glibc memory checking.
 | 
			
		||||
  - Make "MODE -k" handling more robust and compatible, send "fake '*' key"
 | 
			
		||||
    in all replies.
 | 
			
		||||
  - Update configure.ng: ngIRCd requires GNU autoconf 2.61 for generating its
 | 
			
		||||
    build system, so update the build system accordingly and implement all
 | 
			
		||||
    changes that autoupdate(1) suggests: Update AC_PREREQ and AC_INIT, use
 | 
			
		||||
    AC_LINK_IFELSE, AC_RUN_IFELSE, and AC_COMPILE_IFELSE, and remove
 | 
			
		||||
    AC_TYPE_SIGNAL (we don't use RETSIGTYPE).
 | 
			
		||||
  - portabtest: Actually test the functions snprintf(), strlcpy(), strlcat(),
 | 
			
		||||
    and vsnprintf() for correctness, not only existence (which was quite
 | 
			
		||||
    useless, because if they weren't available, the program could not have
 | 
			
		||||
    been linked at all ...).
 | 
			
		||||
  - Implement new configuration option "Network": it is used to set the
 | 
			
		||||
    (completely optional) "network name", to which this instance of the
 | 
			
		||||
    daemon belongs. When set, this name is used in the ISUPPORT(005) numeric
 | 
			
		||||
    which is sent to all clients connecting to the server after logging in.
 | 
			
		||||
  - Update doc/Platforms.txt.
 | 
			
		||||
  - Various code cleanups, remove unused code, streamline error handling.
 | 
			
		||||
    Remove all imp.h and exp.h header files, support non-standard vsnprintf()
 | 
			
		||||
    return codes, and fix some K&R C portability issues. Streamline
 | 
			
		||||
    DEBUG_ARRAY, DEBUG_BUFFER, DEBUG_IO, DEBUG_ZIP definitions.
 | 
			
		||||
  - Increase penalty time to 10 seconds when handling OPER commands with an
 | 
			
		||||
    invalid password.
 | 
			
		||||
 | 
			
		||||
ngIRCd 21.1 (2014-03-25)
 | 
			
		||||
 | 
			
		||||
  - Don't ignore but use the server password when PAM is compiled in but
 | 
			
		||||
    disabled. Thanks to Roy Sindre Norangshol <roy.sindre@norangshol.no>!
 | 
			
		||||
  - doc/Platforms.txt: Update from master branch.
 | 
			
		||||
  - Really kill connections that send "spoofed prefixes" on non-server links.
 | 
			
		||||
    This fixes commit 6cbe1308 which only killed the connection when the
 | 
			
		||||
    spoofed prefix itself belonged to a non-server client.
 | 
			
		||||
  - CHARCONV command: Fix handling conversion errors, don't overwrite already
 | 
			
		||||
    converted text!
 | 
			
		||||
  - doc/Services.txt: Update information for Anope 2.x.
 | 
			
		||||
  - Correctly use cloaked IRC masks on "INVITE nickname": The cloaked IRC mask
 | 
			
		||||
    of a user is his visible mask, so the daemon has to use it for generating
 | 
			
		||||
    the "one time" entries for the invite list of the given channel, and not
 | 
			
		||||
    the "real" mask which will never match while the target client is "+x", and
 | 
			
		||||
    even worse, will disclose the real mask on "MODE #channel +I" commands :-/
 | 
			
		||||
    Bug reported by Cahata on #ngircd, thanks!
 | 
			
		||||
  - configure: Only link "contrib/Debian" if it exists. This isn't the case on
 | 
			
		||||
    "VPATH builds", for example.
 | 
			
		||||
  - Use $(MKDIR_P) instead of $(mkinstalldirs) in Makefile's and test for
 | 
			
		||||
    "mkdir -p" using AC_PROG_MKDIR_P in "configure".
 | 
			
		||||
  - Fix configure script and "make check" for TCP Wrappers (problems spotted on
 | 
			
		||||
    OpenBSD): add missing #include's and static variables, and add libwrap at
 | 
			
		||||
    the end of the configure run because if libwrap becomes added earlier,
 | 
			
		||||
    other tests may fail.
 | 
			
		||||
  - configure: add support for the LDFLAGS_END and LIBS_END variables to add
 | 
			
		||||
    linker flags and libraries at the end of the configure run (CFLAGS_END has
 | 
			
		||||
    been implemented already).
 | 
			
		||||
  - platformtest.sh and Makefile.am: Don't use "test -e", it isn't portable.
 | 
			
		||||
  - Update Copyright notices for 2014 :-)
 | 
			
		||||
  - Fix permanent {G|K}LINES (with a timeout of 0 seconds).
 | 
			
		||||
  - WEBIRC: Don't set the hostname received by the WEBIRC command when DNS
 | 
			
		||||
    lookups are disabled, but use the IP address instead.
 | 
			
		||||
    Reported by Toni Spets <toni.spets@iki.fi>, thanks!
 | 
			
		||||
  - Check for working getaddrinfo() function: At least AIX 4.3.3 and 5.1 have a
 | 
			
		||||
    broken implementation of getaddrinfo() which doesn't handle "0" as numeric
 | 
			
		||||
    service correctly. This patch adds a configure check for this case and
 | 
			
		||||
    changes all calling functions to only use getaddrinfo() if it "works".
 | 
			
		||||
    See <http://www.stacken.kth.se/lists/heimdal-discuss/2004-05/msg00059.html>
 | 
			
		||||
  - Only use the unsetenv() function when it is available (AIX 4.3 doesn't
 | 
			
		||||
    support it, for example).
 | 
			
		||||
  - Make sure that the source code is still compatible with the "ansi2knr" tool
 | 
			
		||||
    and builds using non-ANSI K&R C compilers. Tested with Apple C on A/UX.
 | 
			
		||||
  - Fix building ngIRCd without support for ZLIB compression.  Reported by
 | 
			
		||||
    "der_baer" on #ngircd, thanks!
 | 
			
		||||
 | 
			
		||||
ngIRCd 21 (2013-10-30)
 | 
			
		||||
 | 
			
		||||
  - ./contrib/Debian/ngircd.init: Make sure no stale PID file is left over
 | 
			
		||||
    when (re-)starting ngIRCd.
 | 
			
		||||
  - Change ./contrib/platformtest.sh and update ./doc/Platforms.txt to
 | 
			
		||||
    allow user names up to 8 characters.
 | 
			
		||||
  - Call arc4random_stir() in forked subprocesses, when available. This
 | 
			
		||||
    is required by FreeBSD <10 and current NetBSD at least to correctly
 | 
			
		||||
    initialize the "arc4" random number generator on these platforms.
 | 
			
		||||
  - Update our own Debian package configuration and fix the default path
 | 
			
		||||
    of the "HelpFile" of the "full" package variants.
 | 
			
		||||
 | 
			
		||||
  ngIRCd 21~rc2 (2013-10-20)
 | 
			
		||||
  - Report the correct configuration file name on configuration errors,
 | 
			
		||||
    support longer configuration lines, and warn when lines are truncated.
 | 
			
		||||
  - Use arc4random() function to generate "random" numbers, when available.
 | 
			
		||||
  - platformtest.sh: Detect clang compiler, and clean up GIT source tree
 | 
			
		||||
    before building (when possible).
 | 
			
		||||
  - Update (date of) manual pages.
 | 
			
		||||
  - Update "Upgrade Information" in INSTALL file, add more systems to
 | 
			
		||||
    doc/Platforms.txt, and fix spelling in NEWS and ChangeLog files =:)
 | 
			
		||||
  - Fix remaining compiler warnings on OpenBSD.
 | 
			
		||||
 | 
			
		||||
  ngIRCd 21~rc1 (2013-10-05)
 | 
			
		||||
  - Actually KILL clients on GLINE/KLINE. (Closes bug #156)
 | 
			
		||||
  - Adjust log messages for invalid and spoofed prefixes, which cleans up
 | 
			
		||||
    logging of commands related to already KILL'ed clients. And don't
 | 
			
		||||
@@ -18,10 +272,10 @@ ngIRCd 21~rc1 (2013-10-05)
 | 
			
		||||
    unnecessary duplicates.
 | 
			
		||||
  - Add support to show all user links using the "STATS L" (uppercase)
 | 
			
		||||
    command (restricted to IRC Operators).
 | 
			
		||||
  - Fixed blocking of server reconnects in some error confitions.
 | 
			
		||||
  - Fixed blocking of server reconnects in some error configurations.
 | 
			
		||||
  - Don't ignore SSL-related errors during startup any more: abort startup
 | 
			
		||||
    when SSL is requested by the configuration but can't be initialized and
 | 
			
		||||
    don't continue only listening on plain text communicaiton ports.
 | 
			
		||||
    don't continue only listening on plain text communication ports.
 | 
			
		||||
    (Closes bug #163)
 | 
			
		||||
  - Implement configurable SSL cipher list selection for GnuTLS and OpenSSL
 | 
			
		||||
    using the new configuration option "CipherList". In addition, this
 | 
			
		||||
@@ -31,8 +285,8 @@ ngIRCd 21~rc1 (2013-10-05)
 | 
			
		||||
    is "syntax error") when there are too many parameters.
 | 
			
		||||
  - Clean up lots of permission and parameter checks in functions handling
 | 
			
		||||
    IRC commands; and more consistently add penalty times on errors.
 | 
			
		||||
  - Fix error numeric of WHOIS when no nick namename has been provided:
 | 
			
		||||
    as per RFC it shoud be ERR_NONICKNAMEGIVEN(431).
 | 
			
		||||
  - Fix error numeric of WHOIS when no nick name has been provided:
 | 
			
		||||
    as per RFC it should be ERR_NONICKNAMEGIVEN(431).
 | 
			
		||||
  - Only log "IDENT ... no result" messages when an IDENT looked took place
 | 
			
		||||
    and didn't return any data, not when IDENT has been disabled.
 | 
			
		||||
  - Show connection flag "s" (SSL) in RPL_TRACE{LINK|SERVER} messages: now
 | 
			
		||||
@@ -59,7 +313,7 @@ ngIRCd 21~rc1 (2013-10-05)
 | 
			
		||||
    If set to the empty string, local clients can't create new channels at
 | 
			
		||||
    all, which equals the old "PredefChannelsOnly = yes" setting.
 | 
			
		||||
    This change deprecates the "PredefChannelsOnly" variable, too, but it is
 | 
			
		||||
    still supported and translated to the apropriate "AllowedChannelTypes"
 | 
			
		||||
    still supported and translated to the appropriate "AllowedChannelTypes"
 | 
			
		||||
    setting. When the old "PredefChannelsOnly" variable is processed, a
 | 
			
		||||
    warning message is logged. (Closes bug #152)
 | 
			
		||||
  - Add support for "client certificate fingerprinting". When a client
 | 
			
		||||
@@ -87,7 +341,7 @@ ngIRCd 21~rc1 (2013-10-05)
 | 
			
		||||
  - OS X PackageMaker: use relative path names in project files and package
 | 
			
		||||
    with correct file permissions (requires root privileges on "make").
 | 
			
		||||
  - Add Travis-CI configuration file (".travis.yml") to project.
 | 
			
		||||
  - Look for possible cloaked Masks in Lists. Users with +x usermode can
 | 
			
		||||
  - Look for possible cloaked Masks in Lists. Users with +x user mode can
 | 
			
		||||
    be banned with their cloaked hostname now.
 | 
			
		||||
  - Don't read SSL client data before DNS resolver is finished which could
 | 
			
		||||
    have resulted in discarding the resolved client hostname and IDENT
 | 
			
		||||
@@ -125,7 +379,7 @@ ngIRCd 21~rc1 (2013-10-05)
 | 
			
		||||
    InspIRCd, for example -- but as usual, other numerics are in use, too,
 | 
			
		||||
    like 613 in UltimateIRCd ...
 | 
			
		||||
    Please note that neither the Operator (+o) not the "bot status" (+B)
 | 
			
		||||
    of an IRC service id displayed in the output.
 | 
			
		||||
    of an IRC service is displayed in the output.
 | 
			
		||||
  - Exit message: use singular & plural :-)
 | 
			
		||||
  - autogen.sh: Check for autoconf/automake wrapper scripts
 | 
			
		||||
  - Add missing punctuation marks in log messages, adjust some severity
 | 
			
		||||
@@ -352,7 +606,7 @@ ngIRCd 20 (2012-12-17)
 | 
			
		||||
    the hash function. When "CloakHostSalt" is not set (the default), a
 | 
			
		||||
    random salt will be generated after each server restart. (Closes #133)
 | 
			
		||||
 | 
			
		||||
ngIRCd Release 19.2 (2012-06-19)
 | 
			
		||||
ngIRCd 19.2 (2012-06-19)
 | 
			
		||||
 | 
			
		||||
  - doc/Capabilities.txt: document "multi-prefix" capability
 | 
			
		||||
 | 
			
		||||
@@ -382,7 +636,7 @@ ngIRCd Release 19.2 (2012-06-19)
 | 
			
		||||
  - Fix: Don't ignore "permission denied" errors when enabling chroot.
 | 
			
		||||
  - FAQ: enhance description of chroot setup.
 | 
			
		||||
 | 
			
		||||
ngIRCd Release 19.1 (2012-03-19)
 | 
			
		||||
ngIRCd 19.1 (2012-03-19)
 | 
			
		||||
 | 
			
		||||
  - Fix gcc warning (v4.6.3), initialize "list" variable to NULL.
 | 
			
		||||
  - Fix typos: "recieved" -> "received", "Please not" -> "Please note",
 | 
			
		||||
@@ -392,7 +646,7 @@ ngIRCd Release 19.1 (2012-03-19)
 | 
			
		||||
  - getpid.sh: Fix test case error for Debian using sbuild(1).
 | 
			
		||||
  - Don't log "ngIRCd hello message" two times when starting up.
 | 
			
		||||
 | 
			
		||||
ngIRCd Release 19 (2012-02-29)
 | 
			
		||||
ngIRCd 19 (2012-02-29)
 | 
			
		||||
 | 
			
		||||
  - Update build system: bump config.guess and config.sub files used by
 | 
			
		||||
    GNU autoconf/automake to recent versions.
 | 
			
		||||
@@ -542,7 +796,7 @@ ngIRCd Release 19 (2012-02-29)
 | 
			
		||||
    asynchronous nature of the IRC protocol. So don't break server-
 | 
			
		||||
    links, only log a message and ignore the command. (Closes #113)
 | 
			
		||||
 | 
			
		||||
ngIRCd Release 18 (2011-07-10)
 | 
			
		||||
ngIRCd 18 (2011-07-10)
 | 
			
		||||
 | 
			
		||||
  - Update timestamp of ngircd(8) manual page.
 | 
			
		||||
  - Add preliminary ngIRCd protocol module for Anope 1.9 to contrib/Anope/.
 | 
			
		||||
@@ -652,7 +906,7 @@ ngIRCd Release 18 (2011-07-10)
 | 
			
		||||
    only relevant when a trusted server on a server-server link sends invalid
 | 
			
		||||
    commands).
 | 
			
		||||
 | 
			
		||||
ngIRCd Release 17.1 (2010-12-19)
 | 
			
		||||
ngIRCd 17.1 (2010-12-19)
 | 
			
		||||
 | 
			
		||||
  - --configtest: remember if MOTD is configured by file or phrase
 | 
			
		||||
  - Enhance log messages when establishing server links a little bit
 | 
			
		||||
@@ -668,7 +922,7 @@ ngIRCd Release 17.1 (2010-12-19)
 | 
			
		||||
  - New numeric 329: get channel creation time on "MODE #chan" commands
 | 
			
		||||
  - Save channel creation time; new function Channel_CreationTime()
 | 
			
		||||
 | 
			
		||||
ngIRCd Release 17 (2010-11-07)
 | 
			
		||||
ngIRCd 17 (2010-11-07)
 | 
			
		||||
 | 
			
		||||
  - doc: change path names in sample-ngircd.conf depending on sysconfdir
 | 
			
		||||
  - Fix up generation and distribution of sample-ngircd.conf
 | 
			
		||||
@@ -749,7 +1003,7 @@ ngIRCd Release 17 (2010-11-07)
 | 
			
		||||
  - Fix "beeing" typo ...
 | 
			
		||||
  - SSL/TLS: fix bogus "socket closed" error message.
 | 
			
		||||
 | 
			
		||||
ngIRCd Release 16 (2010-05-02)
 | 
			
		||||
ngIRCd 16 (2010-05-02)
 | 
			
		||||
 | 
			
		||||
  - doc/SSL: remove line continuation marker
 | 
			
		||||
 | 
			
		||||
@@ -789,7 +1043,7 @@ ngIRCd Release 16 (2010-05-02)
 | 
			
		||||
    every channel, and c) remote clients using a server not supporting this
 | 
			
		||||
    mode are not checked either and therefore always allowed to join.
 | 
			
		||||
 | 
			
		||||
ngIRCd Release 15 (2009-11-07)
 | 
			
		||||
ngIRCd 15 (2009-11-07)
 | 
			
		||||
 | 
			
		||||
  - "ngircd --configtest": print SSL configuration options even when unset.
 | 
			
		||||
 | 
			
		||||
@@ -815,7 +1069,7 @@ ngIRCd Release 15 (2009-11-07)
 | 
			
		||||
  - Fix a few error handling glitches for SSL/TLS connections.
 | 
			
		||||
  - Minor fixes to manual pages and documentation.
 | 
			
		||||
 | 
			
		||||
ngIRCd Release 14.1 (2009-05-05)
 | 
			
		||||
ngIRCd 14.1 (2009-05-05)
 | 
			
		||||
 | 
			
		||||
  - Security: fix remotely triggerable crash in SSL/TLS code.
 | 
			
		||||
  - BSD start script contrib/ngircd.sh has been renamed to ngircd-bsd.sh.
 | 
			
		||||
@@ -828,7 +1082,7 @@ ngIRCd Release 14.1 (2009-05-05)
 | 
			
		||||
  - Fix server list announcement.
 | 
			
		||||
  - Do not remove host names from info text.
 | 
			
		||||
 | 
			
		||||
ngIRCd Release 14 (2009-04-20)
 | 
			
		||||
ngIRCd 14 (2009-04-20)
 | 
			
		||||
 | 
			
		||||
  - Display IPv6 addresses as "[<addr>]" when accepting connections.
 | 
			
		||||
 | 
			
		||||
@@ -852,7 +1106,7 @@ ngIRCd Release 14 (2009-04-20)
 | 
			
		||||
  - Fix handling of channels containing dots.
 | 
			
		||||
    (closes ug #93, reported by Gonosz Csiga)
 | 
			
		||||
 | 
			
		||||
ngIRCd Release 13 (2008-12-25)
 | 
			
		||||
ngIRCd 13 (2008-12-25)
 | 
			
		||||
 | 
			
		||||
  - Updated documentation, especially doc/Services.txt and doc/SSL.txt.
 | 
			
		||||
  - Make the test suite work on OpenSolaris.
 | 
			
		||||
@@ -943,7 +1197,7 @@ ngIRCd 0.11.0 (2008-01-15)
 | 
			
		||||
  ngIRCd 0.11.0-pre2 (2008-01-07)
 | 
			
		||||
  - SECURITY: IRC_PART could reference invalid memory, causing
 | 
			
		||||
    ngircd to crash [from HEAD]. (CVE-2008-0285)
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  ngIRCd 0.11.0-pre1 (2008-01-02)
 | 
			
		||||
  - Use dotted-decimal IP address if host name is >= 64.
 | 
			
		||||
  - Add support for /STAT u (server uptime) command.
 | 
			
		||||
@@ -977,7 +1231,7 @@ ngIRCd 0.10.4 (2008-01-07)
 | 
			
		||||
 | 
			
		||||
  - SECURITY: IRC_PART could reference invalid memory, causing
 | 
			
		||||
    ngircd to crash [from HEAD]. (CVE-2008-0285)
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.10.3 (2007-08-01)
 | 
			
		||||
 | 
			
		||||
  - SECURITY: Fixed a severe bug in handling JOIN commands, which could
 | 
			
		||||
@@ -1283,7 +1537,7 @@ ngIRCd 0.7.0 (2003-05-01)
 | 
			
		||||
  - Documentation is now installed in $(datadir)/doc/ngircd.
 | 
			
		||||
  - Enhanced handling of NJOIN in case of nick collisions.
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.6.1, 2003-01-21
 | 
			
		||||
ngIRCd 0.6.1 (2003-01-21)
 | 
			
		||||
 | 
			
		||||
  - Fixed KILL: you can't crash the server by killing yourself any more,
 | 
			
		||||
    ngIRCd no longer sends a QUIT to other servers after the KILL, and you
 | 
			
		||||
@@ -1304,15 +1558,15 @@ ngIRCd 0.6.1, 2003-01-21
 | 
			
		||||
 | 
			
		||||
Older changes (sorry, only available in german language):
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.6.0, 2002-12-24
 | 
			
		||||
ngIRCd 0.6.0, 24.12.2002
 | 
			
		||||
 | 
			
		||||
  ngIRCd 0.6.0-pre2, 2002-12-23
 | 
			
		||||
  ngIRCd 0.6.0-pre2, 23.12.2002
 | 
			
		||||
  - neuer Numeric 005 ("Features") beim Connect.
 | 
			
		||||
  - LUSERS erweitert: nun wird die maximale Anzahl der lokalen und globalen
 | 
			
		||||
    Clients, die dem Server bzw. im Netzwerk seit dem letzten (Re-)Start
 | 
			
		||||
    dem Server gleichzeitig bekannt waren, angezeigt.
 | 
			
		||||
 | 
			
		||||
  ngIRCd 0.6.0-pre1, 2002-12-18
 | 
			
		||||
  ngIRCd 0.6.0-pre1, 18.12.2002
 | 
			
		||||
  - beim Schliessen einer Verbindung zeigt der Server nun vor dem ERROR
 | 
			
		||||
    noch eine Statistik ueber die empfangene und gesendete Datenmenge an.
 | 
			
		||||
  - der Server wartet bei einer eingehenden Verbindung nun laenger auf den
 | 
			
		||||
@@ -1363,7 +1617,7 @@ ngIRCd 0.6.0, 2002-12-24
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.5.4, 24.11.2002
 | 
			
		||||
 | 
			
		||||
  - Fehler-Handling von connect() gefixed: der Server kann sich nun auch   
 | 
			
		||||
  - Fehler-Handling von connect() gefixed: der Server kann sich nun auch
 | 
			
		||||
    unter A/UX wieder zu anderen verbinden.
 | 
			
		||||
  - in den Konfigurationsvariablen ServerUID und ServerGID kann nun nicht
 | 
			
		||||
    nur die numerische ID, sondern auch der Name des Users bzw. der Gruppe
 | 
			
		||||
@@ -1475,7 +1729,7 @@ ngIRCd 0.5.0, 20.09.2002
 | 
			
		||||
  - ADMIN-Befehl implementiert. Die Daten hierzu werden in der Konfig-Datei
 | 
			
		||||
    im [Global]-Abschnitt mit den Variablen "AdminInfo1", "AdminInfo2" und
 | 
			
		||||
    "AdminEMail" konfiguriert.
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.4.3, 11.06.2002
 | 
			
		||||
 | 
			
		||||
  - Bei PRIVMSG und NOTICE hat der ngIRCd nicht ueberpruft, ob das Ziel
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										47
									
								
								INSTALL
									
									
									
									
									
								
							
							
						
						
									
										47
									
								
								INSTALL
									
									
									
									
									
								
							@@ -2,7 +2,7 @@
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
                           http://ngircd.barton.de/
 | 
			
		||||
 | 
			
		||||
               (c)2001-2013 Alexander Barton and Contributors.
 | 
			
		||||
               (c)2001-2015 Alexander Barton and Contributors.
 | 
			
		||||
               ngIRCd is free software and published under the
 | 
			
		||||
                   terms of the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
@@ -12,12 +12,33 @@
 | 
			
		||||
I. Upgrade Information
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Differences to previous version 
 | 
			
		||||
Differences to version 22.x
 | 
			
		||||
 | 
			
		||||
- The "NoticeAuth" ngircd.conf configuration variable has been renamed to
 | 
			
		||||
  "NoticeBeforeRegistration". The old "NoticeAuth" variable still works but
 | 
			
		||||
  is deprecated now.
 | 
			
		||||
 | 
			
		||||
- The default value of the SSL "CipherList" variable has been changed to
 | 
			
		||||
  "HIGH:!aNULL:@STRENGTH:!SSLv3" (OpenSSL) and "SECURE128:-VERS-SSL3.0"
 | 
			
		||||
  (GnuTLS) to disable the old SSLv3 protocol by default.
 | 
			
		||||
  To enable connections of clients still requiring the weak SSLv3 protocol,
 | 
			
		||||
  the "CipherList" must be set to its old value (not recommended!), which
 | 
			
		||||
  was "HIGH:!aNULL:@STRENGTH" (OpenSSL) and "SECURE128" (GnuTLS), see below.
 | 
			
		||||
 | 
			
		||||
Differences to version 20.x
 | 
			
		||||
 | 
			
		||||
- Starting with ngIRCd 21, the ciphers used by SSL are configurable and
 | 
			
		||||
  default to HIGH:!aNULL:@STRENGTH (OpenSSL) or SECURE128 (GnuTLS).
 | 
			
		||||
  Previous version were using the OpenSSL or GnuTLS defaults, DEFAULT
 | 
			
		||||
  and NORMAL respectively.
 | 
			
		||||
  default to "HIGH:!aNULL:@STRENGTH" (OpenSSL) or "SECURE128" (GnuTLS).
 | 
			
		||||
  Previous version were using the OpenSSL or GnuTLS defaults, "DEFAULT"
 | 
			
		||||
  and "NORMAL" respectively.
 | 
			
		||||
 | 
			
		||||
- When adding GLINE's or KLINE's to ngIRCd 21 (or newer), all clients matching
 | 
			
		||||
  the new mask will be KILL'ed. This was not the case with earlier versions
 | 
			
		||||
  that only added the mask but didn't kill already connected users.
 | 
			
		||||
 | 
			
		||||
- The "PredefChannelsOnly" configuration variable has been superseeded by the
 | 
			
		||||
  new "AllowedChannelTypes" variable. It is still supported and translated to
 | 
			
		||||
  the apropriate "AllowedChannelTypes" setting but is deprecated now.
 | 
			
		||||
 | 
			
		||||
Differences to version 19.x
 | 
			
		||||
 | 
			
		||||
@@ -27,7 +48,7 @@ Differences to version 19.x
 | 
			
		||||
  set mode +x. This prevents regular users from changing their hostmask to
 | 
			
		||||
  the name of the IRC server itself, which confused quite a few people ;-)
 | 
			
		||||
 | 
			
		||||
Differences to version 17
 | 
			
		||||
Differences to version 17.x
 | 
			
		||||
 | 
			
		||||
- Support for ZeroConf/Bonjour/Rendezvous service registration has been
 | 
			
		||||
  removed. The configuration option "NoZeroconf" is no longer available.
 | 
			
		||||
@@ -64,7 +85,7 @@ Differences to version 17
 | 
			
		||||
  You should adjust your ngircd.conf and run "ngircd --configtest" to make
 | 
			
		||||
  sure that your settings are correct and up to date!
 | 
			
		||||
 | 
			
		||||
Differences to version 16
 | 
			
		||||
Differences to version 16.x
 | 
			
		||||
 | 
			
		||||
- Changes to the "MotdFile" specified in ngircd.conf now require a ngircd
 | 
			
		||||
  configuration reload to take effect (HUP signal, REHASH command).
 | 
			
		||||
@@ -166,7 +187,7 @@ autogen.sh produces the Makefile.in's, which are necessary for the configure
 | 
			
		||||
script itself, and some more files for make. To run autogen.sh you'll need
 | 
			
		||||
GNU autoconf and GNU automake: at least autoconf 2.61 and automake 1.10 are
 | 
			
		||||
requird, newer is better. But don't use automake 1.12 or newer for creating
 | 
			
		||||
distribution archives: it will work but lack "de-ANSI-fucation" support in the
 | 
			
		||||
distribution archives: it will work but lack "de-ANSI-fication" support in the
 | 
			
		||||
generated Makefile's! Stick with automake 1.11.x for this purpose ...
 | 
			
		||||
So automake 1.11.x and autoconf 2.67+ is recommended.
 | 
			
		||||
 | 
			
		||||
@@ -222,7 +243,7 @@ which will be used to search for the required libraries and header files in
 | 
			
		||||
the given paths ("<path>/lib/...", "<path>/include/...") in addition to the
 | 
			
		||||
standard locations.
 | 
			
		||||
 | 
			
		||||
* Syslog Logging (autodetected by default): 
 | 
			
		||||
* Syslog Logging (autodetected by default):
 | 
			
		||||
  --with-syslog[=<path>] / --without-syslog
 | 
			
		||||
 | 
			
		||||
  Enable (disable) support for logging to "syslog", which should be
 | 
			
		||||
@@ -233,13 +254,13 @@ standard locations.
 | 
			
		||||
 | 
			
		||||
  Enable (disable) support for compressed server-server links.
 | 
			
		||||
  The Z compression library ("libz") is required for this option.
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
* IO Backend (autodetected by default):
 | 
			
		||||
  --with-select[=<path>] / --without-select
 | 
			
		||||
  --with-poll[=<path>] / --without-poll
 | 
			
		||||
  --with-devpoll[=<path>] / --without-devpoll
 | 
			
		||||
  --with-epoll[=<path>] / --without-epoll
 | 
			
		||||
  --with-kqueue[=<path>] / --without-kqueue  
 | 
			
		||||
  --with-kqueue[=<path>] / --without-kqueue
 | 
			
		||||
 | 
			
		||||
  ngIRCd can use different IO "backends": the "old school" select() and poll()
 | 
			
		||||
  API which should be supported by most UNIX-like operating systems, or the
 | 
			
		||||
@@ -257,7 +278,7 @@ standard locations.
 | 
			
		||||
  required for this option.
 | 
			
		||||
 | 
			
		||||
* TCP-Wrappers:
 | 
			
		||||
  --with-tcp-wrappers[=<path>] 
 | 
			
		||||
  --with-tcp-wrappers[=<path>]
 | 
			
		||||
 | 
			
		||||
  Include support for Wietse Venemas "TCP Wrappers" to limit client access
 | 
			
		||||
  to the daemon, for example by using "/etc/hosts.{allow|deny}".
 | 
			
		||||
@@ -314,7 +335,7 @@ IRC operators of this server are defined in [Operator] blocks, remote
 | 
			
		||||
servers are configured in [Server] sections, and [Channel] blocks are
 | 
			
		||||
used to configure pre-defined ("persistent") IRC channels.
 | 
			
		||||
 | 
			
		||||
The meaning of the variables in the configuration file is explained in the 
 | 
			
		||||
The meaning of the variables in the configuration file is explained in the
 | 
			
		||||
"doc/sample-ngircd.conf", which is used as sample configuration file in
 | 
			
		||||
/usr/local/etc after running "make install" (if you don't already have one)
 | 
			
		||||
and in the ngircd.conf(5) manual page.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
# Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors
 | 
			
		||||
# Copyright (c)2001-2015 Alexander Barton (alex@barton.de) and Contributors
 | 
			
		||||
#
 | 
			
		||||
# 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,7 +13,7 @@ AUTOMAKE_OPTIONS = gnu
 | 
			
		||||
 | 
			
		||||
SUBDIRS = doc src man contrib
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST = autogen.sh configure.ng .mailmap
 | 
			
		||||
EXTRA_DIST = autogen.sh configure.ng .clang_complete .mailmap
 | 
			
		||||
 | 
			
		||||
clean-local: osxpkg-clean
 | 
			
		||||
	rm -f build-stamp*
 | 
			
		||||
@@ -69,7 +69,7 @@ osxpkg: have-packagemaker osxpkg-dest
 | 
			
		||||
	make osxpkg-clean
 | 
			
		||||
 | 
			
		||||
osxpkg-clean:
 | 
			
		||||
	[ ! -e ngircd.dest ] || sudo -n rm -rf ngircd.dest
 | 
			
		||||
	[ ! -r ngircd.dest ] || sudo -n rm -rf ngircd.dest
 | 
			
		||||
	rm -rf ngircd.dest $(distdir).mpkg
 | 
			
		||||
 | 
			
		||||
osxpkg-dest: have-xcodebuild osxpkg-clean clean
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										161
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										161
									
								
								NEWS
									
									
									
									
									
								
							@@ -2,15 +2,142 @@
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
                           http://ngircd.barton.de/
 | 
			
		||||
 | 
			
		||||
               (c)2001-2013 Alexander Barton and Contributors.
 | 
			
		||||
               (c)2001-2015 Alexander Barton and Contributors.
 | 
			
		||||
               ngIRCd is free software and published under the
 | 
			
		||||
                   terms of the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
                                  -- NEWS --
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ngIRCd 21~rc1 (2013-10-05)
 | 
			
		||||
ngIRCd 23
 | 
			
		||||
 | 
			
		||||
  ngIRCd 23~rc1 (2015-09-06)
 | 
			
		||||
  - Use "NOTICE *" before registration instead of "NOTICE AUTH". "AUTH" is
 | 
			
		||||
    a valid nickname so sending notices to it is probably not a good idea.
 | 
			
		||||
    Use "*" as the target instead as done with numerics when the nick is not
 | 
			
		||||
    available. This mimics the behaviour in Charybdis, IRCD-Hybrid, InspIRCd
 | 
			
		||||
    2.2, Plexus 4, etc. Closes #217.
 | 
			
		||||
    The "NoticeAuth" configuration variable (ngircd.conf) has been renamed
 | 
			
		||||
    to "NoticeBeforeRegistration" accordingly, but the old name is still
 | 
			
		||||
    supported for compatibility reasons.
 | 
			
		||||
  - Implement new channel mode "N" (regular users can't change their nick
 | 
			
		||||
    name while on this channel). Closes #214.
 | 
			
		||||
  - Keep track of who placed bans, invites, and excepts.
 | 
			
		||||
    Idee and implementation by LucentW, Thanks! Closes #203.
 | 
			
		||||
  - Implement numeric RPL_LISTSTART(321). lightIRC and other clients
 | 
			
		||||
    expecting RPL_LISTSTART should now behave correctly.
 | 
			
		||||
    Idee and implementation by LucentW, Thanks! Closes #207.
 | 
			
		||||
  - Streamline the effect of "MorePrivacy" option: Update documentation
 | 
			
		||||
    in ngircd.conf(5); don't hide channels for IRC Ops on LIST and don't
 | 
			
		||||
    hide IP addresses/hostnames on WHOIS when "MorePrivacy" is in effect.
 | 
			
		||||
    This closes #198.
 | 
			
		||||
  - IRC operators now can kick anyone when "OperCanMode" is set.
 | 
			
		||||
    Idee and implementation by LucentW, Thanks! Closes #202.
 | 
			
		||||
  - Implement user mode "I": Hide channels on WHOIS: this mode prevents
 | 
			
		||||
    ngIRCd from showing channels on WHOIS (IRC Operators can always see
 | 
			
		||||
    the channel list).
 | 
			
		||||
    Idee and implementation by LucentW, Thanks! Closes #197.
 | 
			
		||||
  - INVITE command: Implement ERR_USERNOTONSERV(504) numeric and make sure
 | 
			
		||||
    that the target user is on the same server when inviting other users
 | 
			
		||||
    to local ("&") channels.
 | 
			
		||||
    Idea by Cahata, thanks! Closes #183.
 | 
			
		||||
  - MODE command: Always report channel creation time. Up to now when
 | 
			
		||||
    receiving a MODE command, ngIRCd only reported the channel creation
 | 
			
		||||
    time to clients that were members of the channel. This patch reports
 | 
			
		||||
    the channel creation time to all clients, regardless if they are joined
 | 
			
		||||
    to that channel or not. At least ircd-seven behaves like this.
 | 
			
		||||
    This closes #188. Reported by Cahata, thanks!
 | 
			
		||||
 | 
			
		||||
ngIRCd 22.1 (2015-04-06)
 | 
			
		||||
 | 
			
		||||
  - Update "CipherList" to not enable SSLv3 by default. Idea, initial patch,
 | 
			
		||||
    and testing by Christoph Biedl <ngircd.anoy@manchmal.in-ulm.de>.
 | 
			
		||||
  - Change ngIRCd test suite not to use DNS lookups: Different operating
 | 
			
		||||
    systems do behave quite differently when doing DNS lookups, for example
 | 
			
		||||
    "127.0.0.1" sometimes resolves to "localhost" and sometimes to
 | 
			
		||||
    "localhost.localdomain" (for example OpenBSD). And other OS resolve
 | 
			
		||||
    "localhost" to the real host name (for example Cygwin). So not using
 | 
			
		||||
    DNS at all makes the test site much more portable.
 | 
			
		||||
 | 
			
		||||
ngIRCd 22 (2014-10-11)
 | 
			
		||||
 | 
			
		||||
  - Match all list patterns case-insensitive: this affects the invite-,
 | 
			
		||||
    ban-, and except lists, as well as G-Lines an K-Lines.
 | 
			
		||||
    Problem pointed out by "wowaname" on #ngircd, thanks!
 | 
			
		||||
 | 
			
		||||
  ngIRCd 22~rc1 (2014-09-29)
 | 
			
		||||
  - Sync "except lists" between servers: Up to now, ban, invite, and G-Line
 | 
			
		||||
    lists have been synced between servers while linking -- but obviously
 | 
			
		||||
    nobody noticed that except list have been missing ever since. Until now.
 | 
			
		||||
    Thanks to "j4jackj", who reported this issue in #ngircd.
 | 
			
		||||
  - Allow longer user names (up to 63 characters) for authentication.
 | 
			
		||||
  - Increase MAX_SERVERS from 16 to 64: There are installations out there
 | 
			
		||||
    that would like to configure more than 16 links per server, so increase
 | 
			
		||||
    this limit. Best would be to get rid of MAX_SERVERS altogether and make
 | 
			
		||||
    if fully dynamic, but start with this quick and dirty hack ...
 | 
			
		||||
  - Test suite/platformtest.sh: Detect when tests have been skipped.
 | 
			
		||||
  - Allow "DefaultUserModes" to set all possible modes, including modes only
 | 
			
		||||
    settable by IRC Operators.
 | 
			
		||||
  - Implement user mode "F": "relaxed flood protection". Clients with mode
 | 
			
		||||
    "F" set are allowed to rapidly send data to the daemon. This mode is only
 | 
			
		||||
    settable by IRC Operators and can cause problems in the network -- so be
 | 
			
		||||
    careful and only set it on "trusted" clients!
 | 
			
		||||
    User mode "F" is used by Bahamut for this purpose, for example.
 | 
			
		||||
  - Use server password when PAM is compiled in but disabled.
 | 
			
		||||
  - Streamline punctuation of log messages.
 | 
			
		||||
  - Return ISUPPORT(005) numerics on "VERSION". This is how ircd-seven,
 | 
			
		||||
    Charybdis, Hybrid, and InspIRCd behave, for example.
 | 
			
		||||
  - configure: Only link "contrib/Debian" if it exists, which isn't the case
 | 
			
		||||
    on "VPATH builds", for example.
 | 
			
		||||
  - Show the account name in WHOIS. This uses the same numeric as Charybdis
 | 
			
		||||
    and ircu families: WHOISLOGGEDIN(330).
 | 
			
		||||
  - Pattern matching: Remove "range matching" in our pattern matching code
 | 
			
		||||
    using the "[...]" syntax, because [ and ] are valid characters in nick
 | 
			
		||||
    names and one has to quote them currently using the "\" character, which
 | 
			
		||||
    is quite unexpected for users.
 | 
			
		||||
  - platformtest.sh: New option "-x", don't regenerate build system and
 | 
			
		||||
    allow using separate source and build trees.
 | 
			
		||||
  - Test suite: explicitly enable glibc memory checking.
 | 
			
		||||
  - Make "MODE -k" handling more robust and compatible, send "fake '*' key"
 | 
			
		||||
    in all replies.
 | 
			
		||||
  - portabtest: Actually test the functions snprintf(), strlcpy(), strlcat(),
 | 
			
		||||
    and vsnprintf() for correctness, not only existence (which was quite
 | 
			
		||||
    useless, because if they weren't available, the program could not have
 | 
			
		||||
    been linked at all ...).
 | 
			
		||||
  - Implement new configuration option "Network": it is used to set the
 | 
			
		||||
    (completely optional) "network name", to which this instance of the
 | 
			
		||||
    daemon belongs. When set, this name is used in the ISUPPORT(005) numeric
 | 
			
		||||
    which is sent to all clients connecting to the server after logging in.
 | 
			
		||||
  - Update doc/Platforms.txt.
 | 
			
		||||
  - Various code cleanups, remove unused code, streamline error handling.
 | 
			
		||||
    Remove all imp.h and exp.h header files, support non-standard vsnprintf()
 | 
			
		||||
    return codes, and fix some K&R C portability issues. Streamline
 | 
			
		||||
    DEBUG_ARRAY, DEBUG_BUFFER, DEBUG_IO, DEBUG_ZIP definitions.
 | 
			
		||||
  - Increase penalty time to 10 seconds when handling OPER commands with an
 | 
			
		||||
    invalid password.
 | 
			
		||||
 | 
			
		||||
ngIRCd 21.1 (2014-03-25)
 | 
			
		||||
 | 
			
		||||
  - Don't ignore but use the server password when PAM is compiled in but
 | 
			
		||||
    disabled. Thanks to Roy Sindre Norangshol <roy.sindre@norangshol.no>!
 | 
			
		||||
  - doc/Platforms.txt: Update from master branch.
 | 
			
		||||
  - doc/Services.txt: Update information for Anope 2.x.
 | 
			
		||||
  - configure: add support for the LDFLAGS_END and LIBS_END variables to add
 | 
			
		||||
    linker flags and libraries at the end of the configure run (CFLAGS_END has
 | 
			
		||||
    been implemented already).
 | 
			
		||||
  - Update Copyright notices for 2014 :-)
 | 
			
		||||
 | 
			
		||||
ngIRCd 21 (2013-10-30)
 | 
			
		||||
 | 
			
		||||
  - Call arc4random_stir() in forked subprocesses, when available. This
 | 
			
		||||
    is required by FreeBSD <10 and current NetBSD at least to correctly
 | 
			
		||||
    initialize the "arc4" random number generator on these platforms.
 | 
			
		||||
 | 
			
		||||
  ngIRCd 21~rc2 (2013-10-20)
 | 
			
		||||
  - Report the correct configuration file name on configuration errors,
 | 
			
		||||
    support longer configuration lines, and warn when lines are truncated.
 | 
			
		||||
 | 
			
		||||
  ngIRCd 21~rc1 (2013-10-05)
 | 
			
		||||
  - Actually KILL clients on GLINE/KLINE. (Closes bug #156)
 | 
			
		||||
  - Add support to show all user links using the "STATS L" (uppercase)
 | 
			
		||||
    command (restricted to IRC Operators).
 | 
			
		||||
@@ -36,7 +163,7 @@ ngIRCd 21~rc1 (2013-10-05)
 | 
			
		||||
    If set to the empty string, local clients can't create new channels at
 | 
			
		||||
    all, which equals the old "PredefChannelsOnly = yes" setting.
 | 
			
		||||
    This change deprecates the "PredefChannelsOnly" variable, too, but it is
 | 
			
		||||
    still supported and translated to the apropriate "AllowedChannelTypes"
 | 
			
		||||
    still supported and translated to the appropriate "AllowedChannelTypes"
 | 
			
		||||
    setting. When the old "PredefChannelsOnly" variable is processed, a
 | 
			
		||||
    warning message is logged. (Closes bug #152)
 | 
			
		||||
  - Add support for "client certificate fingerprinting". When a client
 | 
			
		||||
@@ -72,7 +199,7 @@ ngIRCd 21~rc1 (2013-10-05)
 | 
			
		||||
    InspIRCd, for example -- but as usual, other numerics are in use, too,
 | 
			
		||||
    like 613 in UltimateIRCd ...
 | 
			
		||||
    Please note that neither the Operator (+o) not the "bot status" (+B)
 | 
			
		||||
    of an IRC service id displayed in the output.
 | 
			
		||||
    of an IRC service is displayed in the output.
 | 
			
		||||
  - Update systemd(8) example configuration files in ./contrib/ directory:
 | 
			
		||||
    the "ngircd.service" file now uses the "forking" service type which
 | 
			
		||||
    enhances the log messages shown by "systemctl status ngircd.service",
 | 
			
		||||
@@ -188,7 +315,7 @@ ngIRCd 20 (2012-12-17)
 | 
			
		||||
    the hash function. When "CloakHostSalt" is not set (the default), a
 | 
			
		||||
    random salt will be generated after each server restart.
 | 
			
		||||
 | 
			
		||||
ngIRCd Release 19.2 (2012-06-19)
 | 
			
		||||
ngIRCd 19.2 (2012-06-19)
 | 
			
		||||
 | 
			
		||||
  ngIRCd 19.2~rc1 (2012-06-13)
 | 
			
		||||
  - New configuration option "CloakHostModeX" to configure the hostname
 | 
			
		||||
@@ -200,12 +327,12 @@ ngIRCd Release 19.2 (2012-06-19)
 | 
			
		||||
    and capablity "multi-prefix" which allows both the NAME and	WHO command
 | 
			
		||||
    handlers to return more than one "class prefix" to the client.
 | 
			
		||||
 | 
			
		||||
ngIRCd Release 19.1 (2012-03-19)
 | 
			
		||||
ngIRCd 19.1 (2012-03-19)
 | 
			
		||||
 | 
			
		||||
  - Really include _all_ patches to build the Anope module into the
 | 
			
		||||
    distribution archive ... ooops!
 | 
			
		||||
 | 
			
		||||
ngIRCd Release 19 (2012-02-29)
 | 
			
		||||
ngIRCd 19 (2012-02-29)
 | 
			
		||||
 | 
			
		||||
  ngIRCd 19~rc1 (2012-02-12)
 | 
			
		||||
  - Update preliminary ngIRCd protocol module for Anope 1.9.6, which now
 | 
			
		||||
@@ -273,7 +400,7 @@ ngIRCd Release 19 (2012-02-29)
 | 
			
		||||
    argument. Like unknown user and channel modes, these modes are saved
 | 
			
		||||
    and forwarded to other servers, but ignored otherwise.
 | 
			
		||||
 | 
			
		||||
ngIRCd Release 18 (2011-07-10)
 | 
			
		||||
ngIRCd 18 (2011-07-10)
 | 
			
		||||
 | 
			
		||||
  - Add preliminary ngIRCd protocol module for Anope 1.9 to contrib/Anope/.
 | 
			
		||||
 | 
			
		||||
@@ -348,13 +475,13 @@ ngIRCd Release 18 (2011-07-10)
 | 
			
		||||
    vice-versa). The defaults are adjusted accordingly and the old variables
 | 
			
		||||
    in [Global] are still accepted, so there is no functional change.
 | 
			
		||||
 | 
			
		||||
ngIRCd Release 17.1 (2010-12-19)
 | 
			
		||||
ngIRCd 17.1 (2010-12-19)
 | 
			
		||||
 | 
			
		||||
  - Don't log critical (or worse) messages to stderr
 | 
			
		||||
  - Remove "error file" when compiled with debug code enabled
 | 
			
		||||
  - New numeric 329: get channel creation time on "MODE #chan" commands
 | 
			
		||||
 | 
			
		||||
ngIRCd Release 17 (2010-11-07)
 | 
			
		||||
ngIRCd 17 (2010-11-07)
 | 
			
		||||
 | 
			
		||||
  - doc: change path names in sample-ngircd.conf depending on sysconfdir
 | 
			
		||||
 | 
			
		||||
@@ -392,7 +519,7 @@ ngIRCd Release 17 (2010-11-07)
 | 
			
		||||
    this new mode requires the user to be an IRC operator.
 | 
			
		||||
  - Show SSL status in WHOIS output, numeric 275.
 | 
			
		||||
 | 
			
		||||
ngIRCd Release 16 (2010-05-02)
 | 
			
		||||
ngIRCd 16 (2010-05-02)
 | 
			
		||||
 | 
			
		||||
  ngIRCd 16~rc2 (2010-04-25)
 | 
			
		||||
  - Enhace connection statistics counters: display total number of served
 | 
			
		||||
@@ -412,7 +539,7 @@ ngIRCd Release 16 (2010-05-02)
 | 
			
		||||
    every channel, and c) remote clients using a server not supporting this
 | 
			
		||||
    mode are not checked either and therefore always allowed to join.
 | 
			
		||||
 | 
			
		||||
ngIRCd Release 15 (2009-11-07)
 | 
			
		||||
ngIRCd 15 (2009-11-07)
 | 
			
		||||
 | 
			
		||||
  ngIRCd 15~rc1 (2009-10-15)
 | 
			
		||||
  - Do not add default listening port (6667) if SSL ports were specified, so
 | 
			
		||||
@@ -426,13 +553,13 @@ ngIRCd Release 15 (2009-11-07)
 | 
			
		||||
    a throttling scheme: an IRC client can send up to 3 commands or 256 bytes
 | 
			
		||||
    per second before a one second pause is enforced.
 | 
			
		||||
 | 
			
		||||
ngIRCd Release 14.1 (2009-05-05)
 | 
			
		||||
ngIRCd 14.1 (2009-05-05)
 | 
			
		||||
 | 
			
		||||
  - Security: fix remotely triggerable crash in SSL/TLS code.
 | 
			
		||||
  - Debian: build ngircd-full-dbg package.
 | 
			
		||||
  - Allow ping timeout quit messages to show the timeout value.
 | 
			
		||||
 | 
			
		||||
ngIRCd Release 14 (2009-04-20)
 | 
			
		||||
ngIRCd 14 (2009-04-20)
 | 
			
		||||
 | 
			
		||||
  ngIRCd 14~rc1 (2009-03-29)
 | 
			
		||||
  - Allow creation of persistent modeless channels.
 | 
			
		||||
@@ -443,7 +570,7 @@ ngIRCd Release 14 (2009-04-20)
 | 
			
		||||
    individual channel keys for different users.
 | 
			
		||||
  - Remove limit on maximum number of predefined channels in ngircd.conf.
 | 
			
		||||
 | 
			
		||||
ngIRCd Release 13 (2008-12-25)
 | 
			
		||||
ngIRCd 13 (2008-12-25)
 | 
			
		||||
 | 
			
		||||
  ngIRCd 13~rc1 (2008-11-21):
 | 
			
		||||
  - New version number scheme :-)
 | 
			
		||||
@@ -575,7 +702,7 @@ ngIRCd 0.7.5 (2003-07-11)
 | 
			
		||||
    (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.
 | 
			
		||||
@@ -602,7 +729,7 @@ ngIRCd 0.7.0 (2003-05-01)
 | 
			
		||||
 | 
			
		||||
Older news (sorry, only available in german language):
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.6.0, 2002-12-24
 | 
			
		||||
ngIRCd 0.6.0, 24.12.2002
 | 
			
		||||
 | 
			
		||||
  - beim Schliessen einer Verbindung zeigt der Server nun vor dem ERROR
 | 
			
		||||
    noch eine Statistik ueber die empfangene und gesendete Datenmenge an.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								README
									
									
									
									
									
								
							@@ -2,7 +2,7 @@
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
                           http://ngircd.barton.de/
 | 
			
		||||
 | 
			
		||||
               (c)2001-2013 Alexander Barton and Contributors.
 | 
			
		||||
               (c)2001-2015 Alexander Barton and Contributors.
 | 
			
		||||
               ngIRCd is free software and published under the
 | 
			
		||||
                   terms of the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
@@ -74,7 +74,7 @@ releases there.
 | 
			
		||||
If you are interested in the latest development versions (which are not
 | 
			
		||||
always stable), then please read the section about "GIT" on the homepage and
 | 
			
		||||
the file "doc/GIT.txt" which describes the use of GIT, the version control
 | 
			
		||||
system used by ngIRCd (homepage: http://git-scm.com/).
 | 
			
		||||
system used by ngIRCd (homepage: <http://git-scm.com/>).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
VI. Bugs
 | 
			
		||||
@@ -83,11 +83,11 @@ VI. Bugs
 | 
			
		||||
If you find bugs in the ngIRCd (which might be there :-), please report
 | 
			
		||||
them at the following URL:
 | 
			
		||||
 | 
			
		||||
<http://ngircd.barton.de/bugtracker.php>
 | 
			
		||||
<https://github.com/ngircd/ngircd/issues>
 | 
			
		||||
 | 
			
		||||
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 the ngIRCd mailing list: <ngircd-ml@arthur.barton.de> (please see
 | 
			
		||||
<http://ngircd.barton.de/support.php#ml> for details) or join the ngIRCd
 | 
			
		||||
IRC channel: <irc://irc.barton.de/ngircd>.
 | 
			
		||||
If you have comments, patches or something else, please feel free to post
 | 
			
		||||
a mail to the ngIRCd mailing list: <ngircd-ml@ngircd.barton.de> (please see
 | 
			
		||||
<http://ngircd.barton.de/support.php> for details) or join the ngIRCd IRC
 | 
			
		||||
channel: <irc://irc.barton.de/ngircd>.
 | 
			
		||||
 
 | 
			
		||||
@@ -109,8 +109,8 @@ Notfound()
 | 
			
		||||
 | 
			
		||||
Run()
 | 
			
		||||
{
 | 
			
		||||
	[ "$VERBOSE" = "1" ] && echo " - running \"$@\" ..."
 | 
			
		||||
	$@
 | 
			
		||||
	[ "$VERBOSE" = "1" ] && echo " - running \"$*\" ..."
 | 
			
		||||
	"$@"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Reset locale settings to suppress warning messages of Perl
 | 
			
		||||
@@ -157,7 +157,7 @@ AUTOMAKE_VERSION=`echo $AUTOMAKE | cut -d'-' -f2-`
 | 
			
		||||
	&& export AUTOMAKE_VERSION || unset AUTOMAKE_VERSION
 | 
			
		||||
[ "$VERBOSE" = "1" ] && echo " - AUTOMAKE_VERSION=$AUTOMAKE_VERSION"
 | 
			
		||||
 | 
			
		||||
[ $# -gt 0 ] && CONFIGURE_ARGS=" $@" || CONFIGURE_ARGS=""
 | 
			
		||||
[ $# -gt 0 ] && CONFIGURE_ARGS=" $*" || CONFIGURE_ARGS=""
 | 
			
		||||
[ -z "$GO" -a -n "$CONFIGURE_ARGS" ] && GO=1
 | 
			
		||||
 | 
			
		||||
# Verify that all tools have been found
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										331
									
								
								config.guess
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										331
									
								
								config.guess
									
									
									
									
										vendored
									
									
								
							@@ -1,14 +1,12 @@
 | 
			
		||||
#! /bin/sh
 | 
			
		||||
# Attempt to guess a canonical system name.
 | 
			
		||||
#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
 | 
			
		||||
#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
 | 
			
		||||
#   2011, 2012 Free Software Foundation, Inc.
 | 
			
		||||
#   Copyright 1992-2014 Free Software Foundation, Inc.
 | 
			
		||||
 | 
			
		||||
timestamp='2012-08-14'
 | 
			
		||||
timestamp='2014-03-23'
 | 
			
		||||
 | 
			
		||||
# 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
 | 
			
		||||
# the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
# the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
# (at your option) any later version.
 | 
			
		||||
#
 | 
			
		||||
# This program is distributed in the hope that it will be useful, but
 | 
			
		||||
@@ -22,19 +20,17 @@ timestamp='2012-08-14'
 | 
			
		||||
# As a special exception to the GNU General Public License, if you
 | 
			
		||||
# distribute this file as part of a program that contains a
 | 
			
		||||
# configuration script generated by Autoconf, you may include it under
 | 
			
		||||
# the same distribution terms that you use for the rest of that program.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Originally written by Per Bothner.  Please send patches (context
 | 
			
		||||
# diff format) to <config-patches@gnu.org> and include a ChangeLog
 | 
			
		||||
# entry.
 | 
			
		||||
# the same distribution terms that you use for the rest of that
 | 
			
		||||
# program.  This Exception is an additional permission under section 7
 | 
			
		||||
# of the GNU General Public License, version 3 ("GPLv3").
 | 
			
		||||
#
 | 
			
		||||
# This script attempts to guess a canonical system name similar to
 | 
			
		||||
# config.sub.  If it succeeds, it prints the system name on stdout, and
 | 
			
		||||
# exits with 0.  Otherwise, it exits with 1.
 | 
			
		||||
# Originally written by Per Bothner.
 | 
			
		||||
#
 | 
			
		||||
# You can get the latest version of this script from:
 | 
			
		||||
# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
 | 
			
		||||
#
 | 
			
		||||
# Please send patches with a ChangeLog entry to config-patches@gnu.org.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
me=`echo "$0" | sed -e 's,.*/,,'`
 | 
			
		||||
 | 
			
		||||
@@ -54,9 +50,7 @@ version="\
 | 
			
		||||
GNU config.guess ($timestamp)
 | 
			
		||||
 | 
			
		||||
Originally written by Per Bothner.
 | 
			
		||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
 | 
			
		||||
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
 | 
			
		||||
Free Software Foundation, Inc.
 | 
			
		||||
Copyright 1992-2014 Free Software Foundation, Inc.
 | 
			
		||||
 | 
			
		||||
This is free software; see the source for copying conditions.  There is NO
 | 
			
		||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
 | 
			
		||||
@@ -138,6 +132,27 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
 | 
			
		||||
UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
 | 
			
		||||
UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
 | 
			
		||||
 | 
			
		||||
case "${UNAME_SYSTEM}" in
 | 
			
		||||
Linux|GNU|GNU/*)
 | 
			
		||||
	# If the system lacks a compiler, then just pick glibc.
 | 
			
		||||
	# We could probably try harder.
 | 
			
		||||
	LIBC=gnu
 | 
			
		||||
 | 
			
		||||
	eval $set_cc_for_build
 | 
			
		||||
	cat <<-EOF > $dummy.c
 | 
			
		||||
	#include <features.h>
 | 
			
		||||
	#if defined(__UCLIBC__)
 | 
			
		||||
	LIBC=uclibc
 | 
			
		||||
	#elif defined(__dietlibc__)
 | 
			
		||||
	LIBC=dietlibc
 | 
			
		||||
	#else
 | 
			
		||||
	LIBC=gnu
 | 
			
		||||
	#endif
 | 
			
		||||
	EOF
 | 
			
		||||
	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
 | 
			
		||||
	;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
# Note: order is significant - the case branches are not exclusive.
 | 
			
		||||
 | 
			
		||||
case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 | 
			
		||||
@@ -306,7 +321,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 | 
			
		||||
    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
 | 
			
		||||
	echo arm-acorn-riscix${UNAME_RELEASE}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    arm:riscos:*:*|arm:RISCOS:*:*)
 | 
			
		||||
    arm*:riscos:*:*|arm*:RISCOS:*:*)
 | 
			
		||||
	echo arm-unknown-riscos
 | 
			
		||||
	exit ;;
 | 
			
		||||
    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
 | 
			
		||||
@@ -811,7 +826,7 @@ EOF
 | 
			
		||||
    *:MINGW*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-pc-mingw32
 | 
			
		||||
	exit ;;
 | 
			
		||||
    i*:MSYS*:*)
 | 
			
		||||
    *:MSYS*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-pc-msys
 | 
			
		||||
	exit ;;
 | 
			
		||||
    i*:windows32*:*)
 | 
			
		||||
@@ -859,21 +874,21 @@ EOF
 | 
			
		||||
	exit ;;
 | 
			
		||||
    *:GNU:*:*)
 | 
			
		||||
	# the GNU system
 | 
			
		||||
	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
 | 
			
		||||
	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
 | 
			
		||||
	exit ;;
 | 
			
		||||
    *: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
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    i*86:Minix:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-pc-minix
 | 
			
		||||
	exit ;;
 | 
			
		||||
    aarch64:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-gnu
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    aarch64_be:Linux:*:*)
 | 
			
		||||
	UNAME_MACHINE=aarch64_be
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-gnu
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    alpha:Linux:*:*)
 | 
			
		||||
	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
 | 
			
		||||
@@ -886,59 +901,54 @@ EOF
 | 
			
		||||
	  EV68*) UNAME_MACHINE=alphaev68 ;;
 | 
			
		||||
	esac
 | 
			
		||||
	objdump --private-headers /bin/sh | grep -q ld.so.1
 | 
			
		||||
	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
 | 
			
		||||
	if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    arc:Linux:*:* | arceb:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    arm*:Linux:*:*)
 | 
			
		||||
	eval $set_cc_for_build
 | 
			
		||||
	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
 | 
			
		||||
	    | grep -q __ARM_EABI__
 | 
			
		||||
	then
 | 
			
		||||
	    echo ${UNAME_MACHINE}-unknown-linux-gnu
 | 
			
		||||
	    echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 | 
			
		||||
	else
 | 
			
		||||
	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
 | 
			
		||||
		| grep -q __ARM_PCS_VFP
 | 
			
		||||
	    then
 | 
			
		||||
		echo ${UNAME_MACHINE}-unknown-linux-gnueabi
 | 
			
		||||
		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
 | 
			
		||||
	    else
 | 
			
		||||
		echo ${UNAME_MACHINE}-unknown-linux-gnueabihf
 | 
			
		||||
		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
 | 
			
		||||
	    fi
 | 
			
		||||
	fi
 | 
			
		||||
	exit ;;
 | 
			
		||||
    avr32*:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-gnu
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    cris:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-axis-linux-gnu
 | 
			
		||||
	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    crisv32:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-axis-linux-gnu
 | 
			
		||||
	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    frv:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-gnu
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    hexagon:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-gnu
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    i*86:Linux:*:*)
 | 
			
		||||
	LIBC=gnu
 | 
			
		||||
	eval $set_cc_for_build
 | 
			
		||||
	sed 's/^	//' << EOF >$dummy.c
 | 
			
		||||
	#ifdef __dietlibc__
 | 
			
		||||
	LIBC=dietlibc
 | 
			
		||||
	#endif
 | 
			
		||||
EOF
 | 
			
		||||
	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
 | 
			
		||||
	echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
 | 
			
		||||
	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    ia64:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-gnu
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    m32r*:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-gnu
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    m68*:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-gnu
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    mips:Linux:*:* | mips64:Linux:*:*)
 | 
			
		||||
	eval $set_cc_for_build
 | 
			
		||||
@@ -957,54 +967,63 @@ EOF
 | 
			
		||||
	#endif
 | 
			
		||||
EOF
 | 
			
		||||
	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
 | 
			
		||||
	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
 | 
			
		||||
	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
 | 
			
		||||
	;;
 | 
			
		||||
    or32:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-gnu
 | 
			
		||||
    openrisc*:Linux:*:*)
 | 
			
		||||
	echo or1k-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    or32:Linux:*:* | or1k*:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    padre:Linux:*:*)
 | 
			
		||||
	echo sparc-unknown-linux-gnu
 | 
			
		||||
	echo sparc-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    parisc64:Linux:*:* | hppa64:Linux:*:*)
 | 
			
		||||
	echo hppa64-unknown-linux-gnu
 | 
			
		||||
	echo hppa64-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    parisc:Linux:*:* | hppa:Linux:*:*)
 | 
			
		||||
	# Look for CPU level
 | 
			
		||||
	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
 | 
			
		||||
	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
 | 
			
		||||
	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
 | 
			
		||||
	  *)    echo hppa-unknown-linux-gnu ;;
 | 
			
		||||
	  PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
 | 
			
		||||
	  PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
 | 
			
		||||
	  *)    echo hppa-unknown-linux-${LIBC} ;;
 | 
			
		||||
	esac
 | 
			
		||||
	exit ;;
 | 
			
		||||
    ppc64:Linux:*:*)
 | 
			
		||||
	echo powerpc64-unknown-linux-gnu
 | 
			
		||||
	echo powerpc64-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    ppc:Linux:*:*)
 | 
			
		||||
	echo powerpc-unknown-linux-gnu
 | 
			
		||||
	echo powerpc-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    ppc64le:Linux:*:*)
 | 
			
		||||
	echo powerpc64le-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    ppcle:Linux:*:*)
 | 
			
		||||
	echo powerpcle-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    s390:Linux:*:* | s390x:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-ibm-linux
 | 
			
		||||
	echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    sh64*:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-gnu
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    sh*:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-gnu
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    sparc:Linux:*:* | sparc64:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-gnu
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    tile*:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-gnu
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    vax:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-dec-linux-gnu
 | 
			
		||||
	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    x86_64:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-gnu
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    xtensa*:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-gnu
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    i*86:DYNIX/ptx:4*:*)
 | 
			
		||||
	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
 | 
			
		||||
@@ -1237,19 +1256,31 @@ EOF
 | 
			
		||||
	exit ;;
 | 
			
		||||
    *:Darwin:*:*)
 | 
			
		||||
	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
 | 
			
		||||
	case $UNAME_PROCESSOR in
 | 
			
		||||
	    i386)
 | 
			
		||||
		eval $set_cc_for_build
 | 
			
		||||
		if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
 | 
			
		||||
		  if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
 | 
			
		||||
		      (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
 | 
			
		||||
		      grep IS_64BIT_ARCH >/dev/null
 | 
			
		||||
		  then
 | 
			
		||||
		      UNAME_PROCESSOR="x86_64"
 | 
			
		||||
		  fi
 | 
			
		||||
		fi ;;
 | 
			
		||||
	    unknown) UNAME_PROCESSOR=powerpc ;;
 | 
			
		||||
	esac
 | 
			
		||||
	eval $set_cc_for_build
 | 
			
		||||
	if test "$UNAME_PROCESSOR" = unknown ; then
 | 
			
		||||
	    UNAME_PROCESSOR=powerpc
 | 
			
		||||
	fi
 | 
			
		||||
	if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
 | 
			
		||||
	    if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
 | 
			
		||||
		if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
 | 
			
		||||
		    (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
 | 
			
		||||
		    grep IS_64BIT_ARCH >/dev/null
 | 
			
		||||
		then
 | 
			
		||||
		    case $UNAME_PROCESSOR in
 | 
			
		||||
			i386) UNAME_PROCESSOR=x86_64 ;;
 | 
			
		||||
			powerpc) UNAME_PROCESSOR=powerpc64 ;;
 | 
			
		||||
		    esac
 | 
			
		||||
		fi
 | 
			
		||||
	    fi
 | 
			
		||||
	elif test "$UNAME_PROCESSOR" = i386 ; then
 | 
			
		||||
	    # Avoid executing cc on OS X 10.9, as it ships with a stub
 | 
			
		||||
	    # that puts up a graphical alert prompting to install
 | 
			
		||||
	    # developer tools.  Any system running Mac OS X 10.7 or
 | 
			
		||||
	    # later (Darwin 11 and later) is required to have a 64-bit
 | 
			
		||||
	    # processor. This is not true of the ARM version of Darwin
 | 
			
		||||
	    # that Apple uses in portable devices.
 | 
			
		||||
	    UNAME_PROCESSOR=x86_64
 | 
			
		||||
	fi
 | 
			
		||||
	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    *:procnto*:*:* | *:QNX:[0123456789]*:*)
 | 
			
		||||
@@ -1340,154 +1371,6 @@ EOF
 | 
			
		||||
	exit ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
eval $set_cc_for_build
 | 
			
		||||
cat >$dummy.c <<EOF
 | 
			
		||||
#ifdef _SEQUENT_
 | 
			
		||||
# include <sys/types.h>
 | 
			
		||||
# include <sys/utsname.h>
 | 
			
		||||
#endif
 | 
			
		||||
main ()
 | 
			
		||||
{
 | 
			
		||||
#if defined (sony)
 | 
			
		||||
#if defined (MIPSEB)
 | 
			
		||||
  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
 | 
			
		||||
     I don't know....  */
 | 
			
		||||
  printf ("mips-sony-bsd\n"); exit (0);
 | 
			
		||||
#else
 | 
			
		||||
#include <sys/param.h>
 | 
			
		||||
  printf ("m68k-sony-newsos%s\n",
 | 
			
		||||
#ifdef NEWSOS4
 | 
			
		||||
	"4"
 | 
			
		||||
#else
 | 
			
		||||
	""
 | 
			
		||||
#endif
 | 
			
		||||
	); exit (0);
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined (__arm) && defined (__acorn) && defined (__unix)
 | 
			
		||||
  printf ("arm-acorn-riscix\n"); exit (0);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined (hp300) && !defined (hpux)
 | 
			
		||||
  printf ("m68k-hp-bsd\n"); exit (0);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined (NeXT)
 | 
			
		||||
#if !defined (__ARCHITECTURE__)
 | 
			
		||||
#define __ARCHITECTURE__ "m68k"
 | 
			
		||||
#endif
 | 
			
		||||
  int version;
 | 
			
		||||
  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
 | 
			
		||||
  if (version < 4)
 | 
			
		||||
    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
 | 
			
		||||
  else
 | 
			
		||||
    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
 | 
			
		||||
  exit (0);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined (MULTIMAX) || defined (n16)
 | 
			
		||||
#if defined (UMAXV)
 | 
			
		||||
  printf ("ns32k-encore-sysv\n"); exit (0);
 | 
			
		||||
#else
 | 
			
		||||
#if defined (CMU)
 | 
			
		||||
  printf ("ns32k-encore-mach\n"); exit (0);
 | 
			
		||||
#else
 | 
			
		||||
  printf ("ns32k-encore-bsd\n"); exit (0);
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined (__386BSD__)
 | 
			
		||||
  printf ("i386-pc-bsd\n"); exit (0);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined (sequent)
 | 
			
		||||
#if defined (i386)
 | 
			
		||||
  printf ("i386-sequent-dynix\n"); exit (0);
 | 
			
		||||
#endif
 | 
			
		||||
#if defined (ns32000)
 | 
			
		||||
  printf ("ns32k-sequent-dynix\n"); exit (0);
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined (_SEQUENT_)
 | 
			
		||||
    struct utsname un;
 | 
			
		||||
 | 
			
		||||
    uname(&un);
 | 
			
		||||
 | 
			
		||||
    if (strncmp(un.version, "V2", 2) == 0) {
 | 
			
		||||
	printf ("i386-sequent-ptx2\n"); exit (0);
 | 
			
		||||
    }
 | 
			
		||||
    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
 | 
			
		||||
	printf ("i386-sequent-ptx1\n"); exit (0);
 | 
			
		||||
    }
 | 
			
		||||
    printf ("i386-sequent-ptx\n"); exit (0);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined (vax)
 | 
			
		||||
# if !defined (ultrix)
 | 
			
		||||
#  include <sys/param.h>
 | 
			
		||||
#  if defined (BSD)
 | 
			
		||||
#   if BSD == 43
 | 
			
		||||
      printf ("vax-dec-bsd4.3\n"); exit (0);
 | 
			
		||||
#   else
 | 
			
		||||
#    if BSD == 199006
 | 
			
		||||
      printf ("vax-dec-bsd4.3reno\n"); exit (0);
 | 
			
		||||
#    else
 | 
			
		||||
      printf ("vax-dec-bsd\n"); exit (0);
 | 
			
		||||
#    endif
 | 
			
		||||
#   endif
 | 
			
		||||
#  else
 | 
			
		||||
    printf ("vax-dec-bsd\n"); exit (0);
 | 
			
		||||
#  endif
 | 
			
		||||
# else
 | 
			
		||||
    printf ("vax-dec-ultrix\n"); exit (0);
 | 
			
		||||
# endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined (alliant) && defined (i860)
 | 
			
		||||
  printf ("i860-alliant-bsd\n"); exit (0);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  exit (1);
 | 
			
		||||
}
 | 
			
		||||
EOF
 | 
			
		||||
 | 
			
		||||
$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
 | 
			
		||||
	{ echo "$SYSTEM_NAME"; exit; }
 | 
			
		||||
 | 
			
		||||
# Apollos put the system type in the environment.
 | 
			
		||||
 | 
			
		||||
test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
 | 
			
		||||
 | 
			
		||||
# Convex versions that predate uname can use getsysinfo(1)
 | 
			
		||||
 | 
			
		||||
if [ -x /usr/convex/getsysinfo ]
 | 
			
		||||
then
 | 
			
		||||
    case `getsysinfo -f cpu_type` in
 | 
			
		||||
    c1*)
 | 
			
		||||
	echo c1-convex-bsd
 | 
			
		||||
	exit ;;
 | 
			
		||||
    c2*)
 | 
			
		||||
	if getsysinfo -f scalar_acc
 | 
			
		||||
	then echo c32-convex-bsd
 | 
			
		||||
	else echo c2-convex-bsd
 | 
			
		||||
	fi
 | 
			
		||||
	exit ;;
 | 
			
		||||
    c34*)
 | 
			
		||||
	echo c34-convex-bsd
 | 
			
		||||
	exit ;;
 | 
			
		||||
    c38*)
 | 
			
		||||
	echo c38-convex-bsd
 | 
			
		||||
	exit ;;
 | 
			
		||||
    c4*)
 | 
			
		||||
	echo c4-convex-bsd
 | 
			
		||||
	exit ;;
 | 
			
		||||
    esac
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
cat >&2 <<EOF
 | 
			
		||||
$0: unable to guess system type
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										94
									
								
								config.sub
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										94
									
								
								config.sub
									
									
									
									
										vendored
									
									
								
							@@ -1,24 +1,18 @@
 | 
			
		||||
#! /bin/sh
 | 
			
		||||
# Configuration validation subroutine script.
 | 
			
		||||
#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
 | 
			
		||||
#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
 | 
			
		||||
#   2011, 2012 Free Software Foundation, Inc.
 | 
			
		||||
#   Copyright 1992-2014 Free Software Foundation, Inc.
 | 
			
		||||
 | 
			
		||||
timestamp='2012-08-18'
 | 
			
		||||
timestamp='2014-05-01'
 | 
			
		||||
 | 
			
		||||
# This file is (in principle) common to ALL GNU software.
 | 
			
		||||
# The presence of a machine in this file suggests that SOME GNU software
 | 
			
		||||
# can handle that machine.  It does not imply ALL GNU software can.
 | 
			
		||||
#
 | 
			
		||||
# 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
 | 
			
		||||
# the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
# 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
 | 
			
		||||
# the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
# (at your option) any later version.
 | 
			
		||||
#
 | 
			
		||||
# This program is distributed in the hope that it will be useful,
 | 
			
		||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
# GNU General Public License for more details.
 | 
			
		||||
# This program is distributed in the hope that it will be useful, but
 | 
			
		||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
# General Public License for more details.
 | 
			
		||||
#
 | 
			
		||||
# You should have received a copy of the GNU General Public License
 | 
			
		||||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
@@ -26,11 +20,12 @@ timestamp='2012-08-18'
 | 
			
		||||
# As a special exception to the GNU General Public License, if you
 | 
			
		||||
# distribute this file as part of a program that contains a
 | 
			
		||||
# configuration script generated by Autoconf, you may include it under
 | 
			
		||||
# the same distribution terms that you use for the rest of that program.
 | 
			
		||||
# the same distribution terms that you use for the rest of that
 | 
			
		||||
# program.  This Exception is an additional permission under section 7
 | 
			
		||||
# of the GNU General Public License, version 3 ("GPLv3").
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Please send patches to <config-patches@gnu.org>.  Submit a context
 | 
			
		||||
# diff and a properly formatted GNU ChangeLog entry.
 | 
			
		||||
# Please send patches with a ChangeLog entry to config-patches@gnu.org.
 | 
			
		||||
#
 | 
			
		||||
# Configuration subroutine to validate and canonicalize a configuration type.
 | 
			
		||||
# Supply the specified configuration type as an argument.
 | 
			
		||||
@@ -73,9 +68,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, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
 | 
			
		||||
Free Software Foundation, Inc.
 | 
			
		||||
Copyright 1992-2014 Free Software Foundation, Inc.
 | 
			
		||||
 | 
			
		||||
This is free software; see the source for copying conditions.  There is NO
 | 
			
		||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
 | 
			
		||||
@@ -156,7 +149,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 | -knuth | -cray | -microblaze)
 | 
			
		||||
	-apple | -axis | -knuth | -cray | -microblaze*)
 | 
			
		||||
		os=
 | 
			
		||||
		basic_machine=$1
 | 
			
		||||
		;;
 | 
			
		||||
@@ -259,10 +252,12 @@ case $basic_machine in
 | 
			
		||||
	| 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 | avr32 \
 | 
			
		||||
        | be32 | be64 \
 | 
			
		||||
	| arc | arceb \
 | 
			
		||||
	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
 | 
			
		||||
	| avr | avr32 \
 | 
			
		||||
	| be32 | be64 \
 | 
			
		||||
	| bfin \
 | 
			
		||||
	| c4x | clipper \
 | 
			
		||||
	| c4x | c8051 | clipper \
 | 
			
		||||
	| d10v | d30v | dlx | dsp16xx \
 | 
			
		||||
	| epiphany \
 | 
			
		||||
	| fido | fr30 | frv \
 | 
			
		||||
@@ -270,10 +265,11 @@ case $basic_machine in
 | 
			
		||||
	| hexagon \
 | 
			
		||||
	| i370 | i860 | i960 | ia64 \
 | 
			
		||||
	| ip2k | iq2000 \
 | 
			
		||||
	| k1om \
 | 
			
		||||
	| le32 | le64 \
 | 
			
		||||
	| lm32 \
 | 
			
		||||
	| m32c | m32r | m32rle | m68000 | m68k | m88k \
 | 
			
		||||
	| maxq | mb | microblaze | mcore | mep | metag \
 | 
			
		||||
	| maxq | mb | microblaze | microblazeel | mcore | mep | metag \
 | 
			
		||||
	| mips | mipsbe | mipseb | mipsel | mipsle \
 | 
			
		||||
	| mips16 \
 | 
			
		||||
	| mips64 | mips64el \
 | 
			
		||||
@@ -287,20 +283,22 @@ case $basic_machine in
 | 
			
		||||
	| mips64vr5900 | mips64vr5900el \
 | 
			
		||||
	| mipsisa32 | mipsisa32el \
 | 
			
		||||
	| mipsisa32r2 | mipsisa32r2el \
 | 
			
		||||
	| mipsisa32r6 | mipsisa32r6el \
 | 
			
		||||
	| mipsisa64 | mipsisa64el \
 | 
			
		||||
	| mipsisa64r2 | mipsisa64r2el \
 | 
			
		||||
	| mipsisa64r6 | mipsisa64r6el \
 | 
			
		||||
	| mipsisa64sb1 | mipsisa64sb1el \
 | 
			
		||||
	| mipsisa64sr71k | mipsisa64sr71kel \
 | 
			
		||||
	| mipsr5900 | mipsr5900el \
 | 
			
		||||
	| mipstx39 | mipstx39el \
 | 
			
		||||
	| mn10200 | mn10300 \
 | 
			
		||||
	| moxie \
 | 
			
		||||
	| mt \
 | 
			
		||||
	| msp430 \
 | 
			
		||||
	| nds32 | nds32le | nds32be \
 | 
			
		||||
	| nios | nios2 \
 | 
			
		||||
	| nios | nios2 | nios2eb | nios2el \
 | 
			
		||||
	| ns16k | ns32k \
 | 
			
		||||
	| open8 \
 | 
			
		||||
	| or32 \
 | 
			
		||||
	| open8 | or1k | or1knd | or32 \
 | 
			
		||||
	| pdp10 | pdp11 | pj | pjl \
 | 
			
		||||
	| powerpc | powerpc64 | powerpc64le | powerpcle \
 | 
			
		||||
	| pyramid \
 | 
			
		||||
@@ -328,7 +326,7 @@ case $basic_machine in
 | 
			
		||||
	c6x)
 | 
			
		||||
		basic_machine=tic6x-unknown
 | 
			
		||||
		;;
 | 
			
		||||
	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
 | 
			
		||||
	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
 | 
			
		||||
		basic_machine=$basic_machine-unknown
 | 
			
		||||
		os=-none
 | 
			
		||||
		;;
 | 
			
		||||
@@ -370,13 +368,13 @@ case $basic_machine in
 | 
			
		||||
	| aarch64-* | aarch64_be-* \
 | 
			
		||||
	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
 | 
			
		||||
	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
 | 
			
		||||
	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
 | 
			
		||||
	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
 | 
			
		||||
	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
 | 
			
		||||
	| avr-* | avr32-* \
 | 
			
		||||
	| be32-* | be64-* \
 | 
			
		||||
	| bfin-* | bs2000-* \
 | 
			
		||||
	| c[123]* | c30-* | [cjt]90-* | c4x-* \
 | 
			
		||||
	| clipper-* | craynv-* | cydra-* \
 | 
			
		||||
	| c8051-* | clipper-* | craynv-* | cydra-* \
 | 
			
		||||
	| d10v-* | d30v-* | dlx-* \
 | 
			
		||||
	| elxsi-* \
 | 
			
		||||
	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
 | 
			
		||||
@@ -385,11 +383,13 @@ case $basic_machine in
 | 
			
		||||
	| hexagon-* \
 | 
			
		||||
	| i*86-* | i860-* | i960-* | ia64-* \
 | 
			
		||||
	| ip2k-* | iq2000-* \
 | 
			
		||||
	| k1om-* \
 | 
			
		||||
	| le32-* | le64-* \
 | 
			
		||||
	| lm32-* \
 | 
			
		||||
	| m32c-* | m32r-* | m32rle-* \
 | 
			
		||||
	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
 | 
			
		||||
	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
 | 
			
		||||
	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
 | 
			
		||||
	| microblaze-* | microblazeel-* \
 | 
			
		||||
	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
 | 
			
		||||
	| mips16-* \
 | 
			
		||||
	| mips64-* | mips64el-* \
 | 
			
		||||
@@ -403,18 +403,22 @@ case $basic_machine in
 | 
			
		||||
	| mips64vr5900-* | mips64vr5900el-* \
 | 
			
		||||
	| mipsisa32-* | mipsisa32el-* \
 | 
			
		||||
	| mipsisa32r2-* | mipsisa32r2el-* \
 | 
			
		||||
	| mipsisa32r6-* | mipsisa32r6el-* \
 | 
			
		||||
	| mipsisa64-* | mipsisa64el-* \
 | 
			
		||||
	| mipsisa64r2-* | mipsisa64r2el-* \
 | 
			
		||||
	| mipsisa64r6-* | mipsisa64r6el-* \
 | 
			
		||||
	| mipsisa64sb1-* | mipsisa64sb1el-* \
 | 
			
		||||
	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
 | 
			
		||||
	| mipsr5900-* | mipsr5900el-* \
 | 
			
		||||
	| mipstx39-* | mipstx39el-* \
 | 
			
		||||
	| mmix-* \
 | 
			
		||||
	| mt-* \
 | 
			
		||||
	| msp430-* \
 | 
			
		||||
	| nds32-* | nds32le-* | nds32be-* \
 | 
			
		||||
	| nios-* | nios2-* \
 | 
			
		||||
	| nios-* | nios2-* | nios2eb-* | nios2el-* \
 | 
			
		||||
	| none-* | np1-* | ns16k-* | ns32k-* \
 | 
			
		||||
	| open8-* \
 | 
			
		||||
	| or1k*-* \
 | 
			
		||||
	| orion-* \
 | 
			
		||||
	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
 | 
			
		||||
	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
 | 
			
		||||
@@ -788,7 +792,7 @@ case $basic_machine in
 | 
			
		||||
		basic_machine=ns32k-utek
 | 
			
		||||
		os=-sysv
 | 
			
		||||
		;;
 | 
			
		||||
	microblaze)
 | 
			
		||||
	microblaze*)
 | 
			
		||||
		basic_machine=microblaze-xilinx
 | 
			
		||||
		;;
 | 
			
		||||
	mingw64)
 | 
			
		||||
@@ -796,7 +800,7 @@ case $basic_machine in
 | 
			
		||||
		os=-mingw64
 | 
			
		||||
		;;
 | 
			
		||||
	mingw32)
 | 
			
		||||
		basic_machine=i386-pc
 | 
			
		||||
		basic_machine=i686-pc
 | 
			
		||||
		os=-mingw32
 | 
			
		||||
		;;
 | 
			
		||||
	mingw32ce)
 | 
			
		||||
@@ -832,7 +836,7 @@ case $basic_machine in
 | 
			
		||||
		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
 | 
			
		||||
		;;
 | 
			
		||||
	msys)
 | 
			
		||||
		basic_machine=i386-pc
 | 
			
		||||
		basic_machine=i686-pc
 | 
			
		||||
		os=-msys
 | 
			
		||||
		;;
 | 
			
		||||
	mvs)
 | 
			
		||||
@@ -1023,7 +1027,11 @@ case $basic_machine in
 | 
			
		||||
		basic_machine=i586-unknown
 | 
			
		||||
		os=-pw32
 | 
			
		||||
		;;
 | 
			
		||||
	rdos)
 | 
			
		||||
	rdos | rdos64)
 | 
			
		||||
		basic_machine=x86_64-pc
 | 
			
		||||
		os=-rdos
 | 
			
		||||
		;;
 | 
			
		||||
	rdos32)
 | 
			
		||||
		basic_machine=i386-pc
 | 
			
		||||
		os=-rdos
 | 
			
		||||
		;;
 | 
			
		||||
@@ -1350,7 +1358,7 @@ case $os in
 | 
			
		||||
	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
 | 
			
		||||
	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
 | 
			
		||||
	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
 | 
			
		||||
	      | -sym* | -kopensolaris* \
 | 
			
		||||
	      | -sym* | -kopensolaris* | -plan9* \
 | 
			
		||||
	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
 | 
			
		||||
	      | -aos* | -aros* \
 | 
			
		||||
	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
 | 
			
		||||
@@ -1372,7 +1380,7 @@ case $os in
 | 
			
		||||
	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
 | 
			
		||||
	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
 | 
			
		||||
	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
 | 
			
		||||
	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
 | 
			
		||||
	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*)
 | 
			
		||||
	# Remember, each alternative MUST END IN *, to match a version number.
 | 
			
		||||
		;;
 | 
			
		||||
	-qnx*)
 | 
			
		||||
@@ -1496,9 +1504,6 @@ case $os in
 | 
			
		||||
	-aros*)
 | 
			
		||||
		os=-aros
 | 
			
		||||
		;;
 | 
			
		||||
	-kaos*)
 | 
			
		||||
		os=-kaos
 | 
			
		||||
		;;
 | 
			
		||||
	-zvmoe)
 | 
			
		||||
		os=-zvmoe
 | 
			
		||||
		;;
 | 
			
		||||
@@ -1547,6 +1552,9 @@ case $basic_machine in
 | 
			
		||||
	c4x-* | tic4x-*)
 | 
			
		||||
		os=-coff
 | 
			
		||||
		;;
 | 
			
		||||
	c8051-*)
 | 
			
		||||
		os=-elf
 | 
			
		||||
		;;
 | 
			
		||||
	hexagon-*)
 | 
			
		||||
		os=-elf
 | 
			
		||||
		;;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										106
									
								
								configure.ng
									
									
									
									
									
								
							
							
						
						
									
										106
									
								
								configure.ng
									
									
									
									
									
								
							@@ -1,6 +1,6 @@
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
# Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors
 | 
			
		||||
# Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors
 | 
			
		||||
#
 | 
			
		||||
# 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
 | 
			
		||||
@@ -23,8 +23,7 @@ m4_ifdef([AM_SILENT_RULES],
 | 
			
		||||
# -- Initialisation --
 | 
			
		||||
 | 
			
		||||
AC_PREREQ([2.61])
 | 
			
		||||
AC_INIT([ngIRCd], VERSION_ID,
 | 
			
		||||
	[ngircd-ml@ngircd.barton.de], [ngircd], [http://ngircd.barton.de/])
 | 
			
		||||
AC_INIT([ngIRCd],[VERSION_ID],[ngircd-ml@ngircd.barton.de],[ngircd],[http://ngircd.barton.de/])
 | 
			
		||||
 | 
			
		||||
AC_CONFIG_SRCDIR([src/ngircd/ngircd.c])
 | 
			
		||||
AC_CONFIG_HEADER([src/config.h])
 | 
			
		||||
@@ -67,6 +66,7 @@ AC_PROG_AWK
 | 
			
		||||
AC_PROG_INSTALL
 | 
			
		||||
AC_PROG_LN_S
 | 
			
		||||
AC_PROG_MAKE_SET
 | 
			
		||||
AC_PROG_MKDIR_P
 | 
			
		||||
AC_PROG_RANLIB
 | 
			
		||||
 | 
			
		||||
# -- Compiler Features --
 | 
			
		||||
@@ -75,23 +75,57 @@ AC_C_CONST
 | 
			
		||||
AC_C_INLINE
 | 
			
		||||
__ng_PROTOTYPES__
 | 
			
		||||
 | 
			
		||||
# -- Hard coded system and compiler dependencies/features/options ... --
 | 
			
		||||
# -- Function Definitions --
 | 
			
		||||
 | 
			
		||||
AC_DEFUN([GCC_STACK_PROTECT_CC],[
 | 
			
		||||
  ssp_cc=yes
 | 
			
		||||
  # we use -fstack-protector-all for the test to enfoce the use of the guard variable 
 | 
			
		||||
  AC_MSG_CHECKING([whether ${CC} accepts -fstack-protector])
 | 
			
		||||
  ssp_old_cflags="$CFLAGS"
 | 
			
		||||
  CFLAGS="$CFLAGS -fstack-protector-all"
 | 
			
		||||
  AC_TRY_LINK(,,, ssp_cc=no)
 | 
			
		||||
  echo $ssp_cc
 | 
			
		||||
  CFLAGS="$ssp_old_cflags"
 | 
			
		||||
  if test "X$ssp_cc" = "Xyes"; then
 | 
			
		||||
      CFLAGS="$CFLAGS -fstack-protector"
 | 
			
		||||
      AC_DEFINE([ENABLE_SSP_CC], 1, [Define if SSP C support is enabled.])
 | 
			
		||||
  fi
 | 
			
		||||
	ssp_cc=yes
 | 
			
		||||
	# Use -fstack-protector-all for the test to enfoce the use of the
 | 
			
		||||
	# guard variable
 | 
			
		||||
	AC_MSG_CHECKING([whether ${CC} accepts -fstack-protector])
 | 
			
		||||
	ssp_old_cflags="$CFLAGS"
 | 
			
		||||
	CFLAGS="$CFLAGS -fstack-protector-all"
 | 
			
		||||
	AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],[],[ssp_cc=no])
 | 
			
		||||
	echo $ssp_cc
 | 
			
		||||
	CFLAGS="$ssp_old_cflags"
 | 
			
		||||
	if test "X$ssp_cc" = "Xyes"; then
 | 
			
		||||
		CFLAGS="$CFLAGS -fstack-protector"
 | 
			
		||||
		AC_DEFINE([ENABLE_SSP_CC], 1, [Define if SSP C support is enabled.])
 | 
			
		||||
	fi
 | 
			
		||||
])
 | 
			
		||||
 | 
			
		||||
AC_DEFUN([WORKING_GETADDRINFO],[
 | 
			
		||||
	AC_CHECK_FUNCS([getaddrinfo],[
 | 
			
		||||
		AC_MSG_CHECKING([whether getaddrinfo() works])
 | 
			
		||||
		AC_RUN_IFELSE([AC_LANG_SOURCE([[
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/socket.h>
 | 
			
		||||
#include <netdb.h>
 | 
			
		||||
int
 | 
			
		||||
main(int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
	struct addrinfo hints, *ai;
 | 
			
		||||
	memset(&hints, 0, sizeof(hints));
 | 
			
		||||
	hints.ai_flags = AI_PASSIVE;
 | 
			
		||||
	hints.ai_socktype = SOCK_STREAM;
 | 
			
		||||
	hints.ai_family = PF_UNSPEC;
 | 
			
		||||
	if(getaddrinfo(NULL, "0", &hints, &ai) != 0)
 | 
			
		||||
		return 1;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
		]])],[
 | 
			
		||||
		AC_DEFINE([HAVE_WORKING_GETADDRINFO], 1, [getaddrinfo(0)])
 | 
			
		||||
		AC_MSG_RESULT(yes)
 | 
			
		||||
		],[
 | 
			
		||||
		AC_MSG_RESULT(no)
 | 
			
		||||
		],[
 | 
			
		||||
		AC_MSG_RESULT(no)
 | 
			
		||||
		])
 | 
			
		||||
	])
 | 
			
		||||
])
 | 
			
		||||
 | 
			
		||||
# -- Hard coded system and compiler dependencies/features/options ... --
 | 
			
		||||
 | 
			
		||||
if test "$GCC" = "yes"; then
 | 
			
		||||
	# We are using the GNU C compiler. Good!
 | 
			
		||||
	CFLAGS="$CFLAGS -pipe -W -Wall -Wpointer-arith -Wstrict-prototypes"
 | 
			
		||||
@@ -121,7 +155,7 @@ AC_HEADER_TIME
 | 
			
		||||
# Required header files
 | 
			
		||||
AC_CHECK_HEADERS([ \
 | 
			
		||||
	fcntl.h netdb.h netinet/in.h stdlib.h string.h \
 | 
			
		||||
	strings.h sys/socket.h sys/time.h unistd.h \
 | 
			
		||||
	strings.h sys/socket.h sys/time.h sys/types.h unistd.h \
 | 
			
		||||
	],,AC_MSG_ERROR([required C header missing!]))
 | 
			
		||||
 | 
			
		||||
# Optional header files
 | 
			
		||||
@@ -133,20 +167,19 @@ AC_CHECK_HEADERS_ONCE([ \
 | 
			
		||||
# -- Datatypes --
 | 
			
		||||
 | 
			
		||||
AC_MSG_CHECKING(whether socklen_t exists)
 | 
			
		||||
AC_TRY_COMPILE([
 | 
			
		||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/socket.h>
 | 
			
		||||
	],[
 | 
			
		||||
	]],[[
 | 
			
		||||
	socklen_t a, b;
 | 
			
		||||
	a = 2; b = 4; a += b;
 | 
			
		||||
	],[
 | 
			
		||||
	]])],[
 | 
			
		||||
	AC_DEFINE(HAVE_socklen_t) AC_MSG_RESULT(yes)
 | 
			
		||||
	],[
 | 
			
		||||
	AC_MSG_RESULT(no)
 | 
			
		||||
])
 | 
			
		||||
 | 
			
		||||
AC_TYPE_PID_T
 | 
			
		||||
AC_TYPE_SIGNAL
 | 
			
		||||
AC_TYPE_SIZE_T
 | 
			
		||||
AC_TYPE_SSIZE_T
 | 
			
		||||
AC_TYPE_UID_T
 | 
			
		||||
@@ -186,9 +219,12 @@ AC_CHECK_FUNCS([ \
 | 
			
		||||
	AC_MSG_ERROR([required function missing!]))
 | 
			
		||||
 | 
			
		||||
# Optional functions
 | 
			
		||||
AC_CHECK_FUNCS_ONCE([ \
 | 
			
		||||
	gai_strerror getaddrinfo getnameinfo inet_aton sigaction sigprocmask \
 | 
			
		||||
	snprintf vsnprintf strdup strndup strlcpy strlcat strtok_r waitpid])
 | 
			
		||||
AC_CHECK_FUNCS_ONCE([
 | 
			
		||||
	arc4random arc4random_stir gai_strerror getnameinfo inet_aton \
 | 
			
		||||
	setgroups sigaction sigprocmask snprintf strdup strlcat strlcpy \
 | 
			
		||||
	strndup strtok_r unsetenv vsnprintf waitpid])
 | 
			
		||||
 | 
			
		||||
WORKING_GETADDRINFO
 | 
			
		||||
 | 
			
		||||
# -- Configuration options --
 | 
			
		||||
 | 
			
		||||
@@ -431,14 +467,18 @@ AC_ARG_WITH(tcp-wrappers,
 | 
			
		||||
				LDFLAGS="-L$withval/lib $LDFLAGS"
 | 
			
		||||
			fi
 | 
			
		||||
			AC_MSG_CHECKING(for hosts_access)
 | 
			
		||||
			saved_LIBS="$LIBS"
 | 
			
		||||
			LIBS="-lwrap $LIBS"
 | 
			
		||||
			AC_TRY_LINK([
 | 
			
		||||
			LIBS_END="-lwrap $LIBS_END"
 | 
			
		||||
			AC_LINK_IFELSE([AC_LANG_PROGRAM([[
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/socket.h>
 | 
			
		||||
#include <tcpd.h>
 | 
			
		||||
int allow_severity = 0;
 | 
			
		||||
int deny_severity = 0;
 | 
			
		||||
				],[
 | 
			
		||||
				]],[[
 | 
			
		||||
				tcpd_warn("link test");
 | 
			
		||||
				],[
 | 
			
		||||
				]])],[
 | 
			
		||||
				AC_MSG_RESULT(yes)
 | 
			
		||||
				AC_DEFINE(TCPWRAP, 1)
 | 
			
		||||
				x_tcpwrap_on=yes
 | 
			
		||||
@@ -446,6 +486,7 @@ int deny_severity = 0;
 | 
			
		||||
				AC_MSG_RESULT(no)
 | 
			
		||||
				AC_MSG_ERROR([Can't enable TCP wrappers!])
 | 
			
		||||
			])
 | 
			
		||||
			LIBS="$saved_LIBS"
 | 
			
		||||
		fi
 | 
			
		||||
	]
 | 
			
		||||
)
 | 
			
		||||
@@ -601,9 +642,12 @@ AC_DEFINE_UNQUOTED(HOST_CPU, "$host_cpu" )
 | 
			
		||||
AC_DEFINE_UNQUOTED(HOST_VENDOR, "$host_vendor" )
 | 
			
		||||
AC_DEFINE_UNQUOTED(HOST_OS, "$host_os" )
 | 
			
		||||
 | 
			
		||||
# Add additional CFLAGS, eventually specified on the command line, but after
 | 
			
		||||
# running this configure script. Useful for "-Werror" for example.
 | 
			
		||||
# Add additional CFLAGS, LDFLAGS and LIBS which were specified on the command
 | 
			
		||||
# line or by some tests from above, but after running this script. Useful for
 | 
			
		||||
# adding "-Werror", for example:
 | 
			
		||||
test -n "$CFLAGS_END" && CFLAGS="$CFLAGS $CFLAGS_END"
 | 
			
		||||
test -n "$LDFLAGS_END" && LDFLAGS="$LDFLAGS $LDFLAGS_END"
 | 
			
		||||
test -n "$LIBS_END" && LIBS="$LIBS $LIBS_END"
 | 
			
		||||
 | 
			
		||||
# -- Generate files --
 | 
			
		||||
 | 
			
		||||
@@ -632,7 +676,9 @@ 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
 | 
			
		||||
	if test ! -f debian/rules -a -f contrib/Debian/rules; then
 | 
			
		||||
		ln -s contrib/Debian debian
 | 
			
		||||
	fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# -- Result --
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,66 @@
 | 
			
		||||
ngircd (23~rc1-0ab1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * New "upstream" release candidate 1 for ngIRCd Release 23.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@arthur.barton.de>  Sun, 06 Sep 2015 16:55:23 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (22.1-0ab1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * New "upstream" release: ngIRCd 22.1.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Mon, 06 Apr 2015 14:34:50 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (22-0ab1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * New "upstream" release: ngIRCd 22.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Sat, 11 Oct 2014 20:29:03 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (22~rc1-0ab1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * New "upstream" release candidate 1 for ngIRCd Release 22.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Mon, 29 Sep 2014 17:07:55 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (21.1-0ab2) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Use correct package name in pathname to "HelpFile" (Command.txt)
 | 
			
		||||
    in "ngircd-full" and "ngircd-full-dbg" packages.
 | 
			
		||||
  * Don't adjust path names that are correct by default.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Mon, 14 Jul 2014 11:20:17 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (21.1-0ab1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * New "upstream" release: ngIRCd 21.1.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Tue, 25 Mar 2014 14:44:59 +0100
 | 
			
		||||
 | 
			
		||||
ngircd (21-0ab1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * New "upstream" release: ngIRCd 21.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Wed, 30 Oct 2013 22:13:55 +0100
 | 
			
		||||
 | 
			
		||||
ngircd (21~rc2-0ab3) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Fix sed(1) rules adjusting "ngircd-full" package, error introduced
 | 
			
		||||
    by last commit :-/
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Sun, 20 Oct 2013 18:31:16 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (21~rc2-0ab2) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Fix default "HelpFile" file name in ngircd.conf for "full" packages.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Sun, 20 Oct 2013 17:18:28 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (21~rc2-0ab1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * New "upstream" release candidate 2 for ngIRCd Release 21.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Sun, 20 Oct 2013 15:50:03 +0200
 | 
			
		||||
 | 
			
		||||
ngircd (21~rc1-0ab1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * New "upstream" release candidate 1 for ngIRCd Release 21.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd start and stop script for Debian-based systems
 | 
			
		||||
# Copyright 2008-2013 Alexander Barton <alex@barton.de>
 | 
			
		||||
# Copyright 2008-2015 Alexander Barton <alex@barton.de>
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
### BEGIN INIT INFO
 | 
			
		||||
@@ -37,7 +37,7 @@ log_daemon_msg() {
 | 
			
		||||
	echo -n "$*"
 | 
			
		||||
}
 | 
			
		||||
log_end_msg() {
 | 
			
		||||
	[ "$1" == "0" ] && echo "." || echo " failed!"
 | 
			
		||||
	[ "$1" = "0" ] && echo "." || echo " failed!"
 | 
			
		||||
}
 | 
			
		||||
log_failure_msg() {
 | 
			
		||||
	echo "$*"
 | 
			
		||||
@@ -84,6 +84,7 @@ Do_Start() {
 | 
			
		||||
		log_warning_msg "$NAME seems to be already running, nothing to do."
 | 
			
		||||
		exit 0
 | 
			
		||||
	fi
 | 
			
		||||
	rm -f "$PIDFILE"
 | 
			
		||||
	start-stop-daemon --start \
 | 
			
		||||
		--quiet --exec $DAEMON -- $PARAMS
 | 
			
		||||
	sleep $STARTTIME
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
#!/usr/bin/make -f
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
# Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors
 | 
			
		||||
# Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors
 | 
			
		||||
#
 | 
			
		||||
# 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
 | 
			
		||||
@@ -42,6 +42,7 @@ configure-ngircd: configure
 | 
			
		||||
	  --prefix=/usr \
 | 
			
		||||
	  --sysconfdir=/etc/ngircd \
 | 
			
		||||
	  --mandir=\$${prefix}/share/man \
 | 
			
		||||
	  --docdir=\$${prefix}/share/doc/ngircd \
 | 
			
		||||
	  --with-syslog --with-zlib
 | 
			
		||||
 | 
			
		||||
configure-ngircd-full: configure
 | 
			
		||||
@@ -52,6 +53,7 @@ configure-ngircd-full: configure
 | 
			
		||||
	  --prefix=/usr \
 | 
			
		||||
	  --sysconfdir=/etc/ngircd \
 | 
			
		||||
	  --mandir=\$${prefix}/share/man \
 | 
			
		||||
	  --docdir=\$${prefix}/share/doc/ngircd-full \
 | 
			
		||||
	  --with-syslog --with-zlib \
 | 
			
		||||
	  --with-gnutls --with-iconv --with-ident --with-tcp-wrappers \
 | 
			
		||||
	  --with-pam \
 | 
			
		||||
@@ -65,6 +67,7 @@ configure-ngircd-full-dbg: configure
 | 
			
		||||
	  --prefix=/usr \
 | 
			
		||||
	  --sysconfdir=/etc/ngircd \
 | 
			
		||||
	  --mandir=\$${prefix}/share/man \
 | 
			
		||||
	  --docdir=\$${prefix}/share/doc/ngircd-full-dbg \
 | 
			
		||||
	  --enable-debug --enable-sniffer \
 | 
			
		||||
	  --with-syslog --with-zlib \
 | 
			
		||||
	  --with-gnutls --with-iconv --with-ident --with-tcp-wrappers \
 | 
			
		||||
@@ -139,10 +142,9 @@ install-ngircd: build-ngircd
 | 
			
		||||
	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" \
 | 
			
		||||
	 sed -e "s|;ServerUID = 65534|ServerUID = irc|g" | \
 | 
			
		||||
	 sed -e "s|;ServerGID = 65534|ServerGID = irc|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
 | 
			
		||||
 | 
			
		||||
@@ -153,16 +155,13 @@ install-ngircd-full: build-ngircd-full
 | 
			
		||||
 | 
			
		||||
	# 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
 | 
			
		||||
	rm $(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd-full/INSTALL*
 | 
			
		||||
	rm $(CURDIR)/debian/ngircd-full/usr/share/doc/ngircd-full/COPYING*
 | 
			
		||||
	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" \
 | 
			
		||||
	 sed -e "s|;ServerUID = 65534|ServerUID = irc|g" | \
 | 
			
		||||
	 sed -e "s|;ServerGID = 65534|ServerGID = irc|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
 | 
			
		||||
	mkdir -p $(CURDIR)/debian/ngircd-full/etc/pam.d
 | 
			
		||||
@@ -175,16 +174,13 @@ install-ngircd-full-dbg: build-ngircd-full-dbg
 | 
			
		||||
 | 
			
		||||
	# Add here commands to install the "full" package into debian/ngircd-full:
 | 
			
		||||
	$(MAKE) install DESTDIR=$(CURDIR)/debian/ngircd-full-dbg
 | 
			
		||||
	rm $(CURDIR)/debian/ngircd-full-dbg/usr/share/doc/ngircd/INSTALL*
 | 
			
		||||
	rm $(CURDIR)/debian/ngircd-full-dbg/usr/share/doc/ngircd/COPYING*
 | 
			
		||||
	mv $(CURDIR)/debian/ngircd-full-dbg/usr/share/doc/ngircd \
 | 
			
		||||
	 $(CURDIR)/debian/ngircd-full-dbg/usr/share/doc/ngircd-full-dbg
 | 
			
		||||
	rm $(CURDIR)/debian/ngircd-full-dbg/usr/share/doc/ngircd-full-dbg/INSTALL*
 | 
			
		||||
	rm $(CURDIR)/debian/ngircd-full-dbg/usr/share/doc/ngircd-full-dbg/COPYING*
 | 
			
		||||
	mkdir -p $(CURDIR)/debian/ngircd-full-dbg/var/run/ircd
 | 
			
		||||
	cat $(CURDIR)/debian/ngircd-full-dbg/usr/share/doc/ngircd-full-dbg/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" \
 | 
			
		||||
	 sed -e "s|;ServerUID = 65534|ServerUID = irc|g" | \
 | 
			
		||||
	 sed -e "s|;ServerGID = 65534|ServerGID = irc|g" | \
 | 
			
		||||
	 sed -e "s|;PidFile = /var/run/ngircd/ngircd.pid|PidFile = /var/run/ircd/ngircd.pid|g" \
 | 
			
		||||
	 >$(CURDIR)/debian/ngircd-full-dbg/etc/ngircd/ngircd.conf
 | 
			
		||||
	touch $(CURDIR)/debian/ngircd-full-dbg/etc/ngircd/ngircd.motd
 | 
			
		||||
	mkdir -p $(CURDIR)/debian/ngircd-full-dbg/etc/pam.d
 | 
			
		||||
 
 | 
			
		||||
@@ -105,6 +105,8 @@
 | 
			
		||||
#define HAVE_INET_ATON 1
 | 
			
		||||
/* Define to 1 if you have the `getaddrinfo' function. */
 | 
			
		||||
#define HAVE_GETADDRINFO 1
 | 
			
		||||
/* getaddrinfo(0) */
 | 
			
		||||
#define HAVE_WORKING_GETADDRINFO 1
 | 
			
		||||
/* Define to 1 if you have the `getnameinfo' function. */
 | 
			
		||||
#define HAVE_GETNAMEINFO 1
 | 
			
		||||
/* Define to 1 if you have the `sigaction' function. */
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\qc\pardirnatural
 | 
			
		||||
 | 
			
		||||
\f0\i\fs24 \cf0 ngIRCd -- The Next Generation IRC Daemon\
 | 
			
		||||
Copyright (c)2001-2013 Alexander Barton and Contributors.\
 | 
			
		||||
Copyright (c)2001-2014 Alexander Barton and Contributors.\
 | 
			
		||||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural
 | 
			
		||||
 | 
			
		||||
\i0 \cf0 \
 | 
			
		||||
 
 | 
			
		||||
@@ -84,7 +84,7 @@
 | 
			
		||||
		FA2D564811EA158B00D37A35 /* pam.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pam.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA2D564911EA158B00D37A35 /* pam.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pam.c; sourceTree = "<group>"; };
 | 
			
		||||
		FA2D567A11EA1AB300D37A35 /* libpam.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libpam.dylib; path = usr/lib/libpam.dylib; sourceTree = SDKROOT; };
 | 
			
		||||
		FA322BBA0CEF72E4001761B3 /* ngIRCd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; name = ngIRCd; path = ngircd; sourceTree = BUILT_PRODUCTS_DIR; };
 | 
			
		||||
		FA322BBA0CEF72E4001761B3 /* ngircd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ngircd; sourceTree = BUILT_PRODUCTS_DIR; };
 | 
			
		||||
		FA322CD60CEF74B1001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CD90CEF74B1001761B3 /* array.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = array.c; sourceTree = "<group>"; };
 | 
			
		||||
		FA322CDA0CEF74B1001761B3 /* array.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = array.h; sourceTree = "<group>"; };
 | 
			
		||||
@@ -138,8 +138,6 @@
 | 
			
		||||
		FA322D0D0CEF74B1001761B3 /* resolve.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = resolve.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D100CEF74B1001761B3 /* ansi2knr.1 */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.man; path = ansi2knr.1; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D110CEF74B1001761B3 /* ansi2knr.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = ansi2knr.c; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D120CEF74B1001761B3 /* exp.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = exp.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D130CEF74B1001761B3 /* imp.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = imp.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D150CEF74B1001761B3 /* portab.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = portab.h; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D160CEF74B1001761B3 /* portabtest.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = portabtest.c; sourceTree = "<group>"; };
 | 
			
		||||
		FA322D170CEF74B1001761B3 /* splint.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = splint.h; sourceTree = "<group>"; };
 | 
			
		||||
@@ -312,7 +310,7 @@
 | 
			
		||||
		1AB674ADFE9D54B511CA2CBB /* Products */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
				FA322BBA0CEF72E4001761B3 /* ngIRCd */,
 | 
			
		||||
				FA322BBA0CEF72E4001761B3 /* ngircd */,
 | 
			
		||||
			);
 | 
			
		||||
			name = Products;
 | 
			
		||||
			sourceTree = "<group>";
 | 
			
		||||
@@ -423,8 +421,6 @@
 | 
			
		||||
				FA18A64716CEE14900132F66 /* Makefile.ng */,
 | 
			
		||||
				FA322D100CEF74B1001761B3 /* ansi2knr.1 */,
 | 
			
		||||
				FA322D110CEF74B1001761B3 /* ansi2knr.c */,
 | 
			
		||||
				FA322D120CEF74B1001761B3 /* exp.h */,
 | 
			
		||||
				FA322D130CEF74B1001761B3 /* imp.h */,
 | 
			
		||||
				FA322D150CEF74B1001761B3 /* portab.h */,
 | 
			
		||||
				FA322D160CEF74B1001761B3 /* portabtest.c */,
 | 
			
		||||
				FA322D170CEF74B1001761B3 /* splint.h */,
 | 
			
		||||
@@ -630,7 +626,7 @@
 | 
			
		||||
			name = ngIRCd;
 | 
			
		||||
			productInstallPath = "$(HOME)/bin";
 | 
			
		||||
			productName = ngIRCd;
 | 
			
		||||
			productReference = FA322BBA0CEF72E4001761B3 /* ngIRCd */;
 | 
			
		||||
			productReference = FA322BBA0CEF72E4001761B3 /* ngircd */;
 | 
			
		||||
			productType = "com.apple.product-type.tool";
 | 
			
		||||
		};
 | 
			
		||||
/* End PBXNativeTarget section */
 | 
			
		||||
@@ -639,7 +635,7 @@
 | 
			
		||||
		08FB7793FE84155DC02AAC07 /* Project object */ = {
 | 
			
		||||
			isa = PBXProject;
 | 
			
		||||
			attributes = {
 | 
			
		||||
				LastUpgradeCheck = 0430;
 | 
			
		||||
				LastUpgradeCheck = 0630;
 | 
			
		||||
			};
 | 
			
		||||
			buildConfigurationList = 1DEB928908733DD80010E9CD /* Build configuration list for PBXProject "ngIRCd" */;
 | 
			
		||||
			compatibilityVersion = "Xcode 3.2";
 | 
			
		||||
@@ -746,7 +742,6 @@
 | 
			
		||||
		1DEB928B08733DD80010E9CD /* Default */ = {
 | 
			
		||||
			isa = XCBuildConfiguration;
 | 
			
		||||
			buildSettings = {
 | 
			
		||||
				ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
 | 
			
		||||
				CODE_SIGN_IDENTITY = "";
 | 
			
		||||
				GCC_VERSION = "";
 | 
			
		||||
				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 | 
			
		||||
@@ -759,7 +754,6 @@
 | 
			
		||||
		FAB0570C105D917F006AF9E2 /* Debug */ = {
 | 
			
		||||
			isa = XCBuildConfiguration;
 | 
			
		||||
			buildSettings = {
 | 
			
		||||
				ARCHS = "$(NATIVE_ARCH_ACTUAL)";
 | 
			
		||||
				GCC_DEBUGGING_SYMBOLS = full;
 | 
			
		||||
				GCC_OPTIMIZATION_LEVEL = 0;
 | 
			
		||||
				GCC_VERSION = "";
 | 
			
		||||
 
 | 
			
		||||
@@ -4,8 +4,19 @@ After=network.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Type=forking
 | 
			
		||||
User=irc
 | 
			
		||||
Group=irc
 | 
			
		||||
CapabilityBoundingSet=CAP_SETUID CAP_SETGID CAP_SYS_CHROOT CAP_NET_BIND_SERVICE
 | 
			
		||||
PrivateTmp=yes
 | 
			
		||||
PrivateDevices=yes
 | 
			
		||||
ProtectSystem=full
 | 
			
		||||
ProtectHome=true
 | 
			
		||||
NoNewPrivileges=true
 | 
			
		||||
RuntimeDirectory=ircd
 | 
			
		||||
RuntimeDirectoryMode=750
 | 
			
		||||
ExecStart=/usr/sbin/ngircd
 | 
			
		||||
ExecReload=/bin/kill -HUP $MAINPID
 | 
			
		||||
Restart=on-failure
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
%define name    ngircd
 | 
			
		||||
%define version 21~rc1
 | 
			
		||||
%define version 23~rc1
 | 
			
		||||
%define release 1
 | 
			
		||||
%define prefix  %{_prefix}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
# Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors
 | 
			
		||||
# Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors
 | 
			
		||||
#
 | 
			
		||||
# 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
 | 
			
		||||
@@ -16,6 +16,7 @@
 | 
			
		||||
 | 
			
		||||
NAME=`basename "$0"`
 | 
			
		||||
VERBOSE=
 | 
			
		||||
CLEAN=1
 | 
			
		||||
 | 
			
		||||
PLATFORM=
 | 
			
		||||
COMPILER="unknown"
 | 
			
		||||
@@ -26,8 +27,12 @@ COMMENT=
 | 
			
		||||
R_CONFIGURE=
 | 
			
		||||
R_MAKE=
 | 
			
		||||
R_CHECK=
 | 
			
		||||
R_CHECK_Y="?"
 | 
			
		||||
R_RUN=
 | 
			
		||||
 | 
			
		||||
SRC_D=`dirname "$0"`
 | 
			
		||||
MY_D="$PWD"
 | 
			
		||||
 | 
			
		||||
[ -n "$MAKE" ] || MAKE="make"
 | 
			
		||||
export MAKE CC
 | 
			
		||||
 | 
			
		||||
@@ -36,33 +41,56 @@ while [ $# -gt 0 ]; do
 | 
			
		||||
		"-v")
 | 
			
		||||
			VERBOSE=1
 | 
			
		||||
			;;
 | 
			
		||||
		"-x")
 | 
			
		||||
			CLEAN=
 | 
			
		||||
			;;
 | 
			
		||||
		*)
 | 
			
		||||
			echo "Usage: $NAME [-v]"
 | 
			
		||||
			echo "Usage: $NAME [-v] [-x]"
 | 
			
		||||
			echo
 | 
			
		||||
			echo "  -v   Verbose output"
 | 
			
		||||
			echo "  -x   Don't regenerate build system, even when possible"
 | 
			
		||||
			echo
 | 
			
		||||
			exit 2
 | 
			
		||||
	esac
 | 
			
		||||
	shift
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
echo "$NAME: Checking ngIRCd base source directory ..."
 | 
			
		||||
grep "ngIRCd" ./ChangeLog >/dev/null 2>&1
 | 
			
		||||
grep "ngIRCd" "$SRC_D/ChangeLog" >/dev/null 2>&1
 | 
			
		||||
if [ $? -ne 0 ]; then
 | 
			
		||||
	grep "ngIRCd" ../ChangeLog >/dev/null 2>&1
 | 
			
		||||
	grep "ngIRCd" "$SRC_D/../ChangeLog" >/dev/null 2>&1
 | 
			
		||||
	if [ $? -ne 0 ]; then
 | 
			
		||||
		echo "$NAME: ngIRCd base source directory not found!?"
 | 
			
		||||
		exit 1
 | 
			
		||||
	fi
 | 
			
		||||
	cd ..
 | 
			
		||||
	SRC_D="$SRC_D/.."
 | 
			
		||||
fi
 | 
			
		||||
echo "$NAME:  - source directory: $SRC_D"
 | 
			
		||||
echo "$NAME:  - working directory: $MY_D"
 | 
			
		||||
 | 
			
		||||
echo "$NAME: Checking for GIT tree ..."
 | 
			
		||||
if [ -d "$SRC_D/.git" ]; then
 | 
			
		||||
	echo "$NAME: Checking for \"git\" command ..."
 | 
			
		||||
	git version >/dev/null 2>&1
 | 
			
		||||
	if [ $? -eq 0 -a -n "$CLEAN" ]; then
 | 
			
		||||
		echo "$NAME: Running \"git clean\" ..."
 | 
			
		||||
		cd "$SRC_D" || exit 1
 | 
			
		||||
		[ -n "$VERBOSE" ] && git clean -dxf || git clean -dxf >/dev/null
 | 
			
		||||
		cd "$MY_D" || exit 1
 | 
			
		||||
	fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
echo "$NAME: Checking for \"./configure\" script ..."
 | 
			
		||||
if [ ! -e ./configure ]; then
 | 
			
		||||
	echo "$NAME: Running \"./autogen.sh\" ..."
 | 
			
		||||
echo "$NAME: Checking for \"$SRC_D/configure\" script ..."
 | 
			
		||||
if [ ! -r "$SRC_D/configure" ]; then
 | 
			
		||||
	echo "$NAME: Running \"$SRC_D/autogen.sh\" ..."
 | 
			
		||||
	cd "$SRC_D" || exit 1
 | 
			
		||||
	[ -n "$VERBOSE" ] && ./autogen.sh || ./autogen.sh >/dev/null
 | 
			
		||||
	cd "$MY_D" || exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ -r ./configure ]; then
 | 
			
		||||
	echo "$NAME: Running \"./configure\" script ..."
 | 
			
		||||
	[ -n "$VERBOSE" ] && ./configure || ./configure >/dev/null
 | 
			
		||||
if [ -r "$SRC_D/configure" ]; then
 | 
			
		||||
	echo "$NAME: Running \"$SRC_D/configure\" script ..."
 | 
			
		||||
	[ -n "$VERBOSE" ] && "$SRC_D/configure" -C || "$SRC_D/configure" -C >/dev/null
 | 
			
		||||
	if [ $? -eq 0 -a -r ./Makefile ]; then
 | 
			
		||||
		R_CONFIGURE=1
 | 
			
		||||
		echo "$NAME: Running \"$MAKE\" ..."
 | 
			
		||||
@@ -74,6 +102,8 @@ if [ -r ./configure ]; then
 | 
			
		||||
			if [ $? -eq 0 ]; then
 | 
			
		||||
				R_CHECK=1
 | 
			
		||||
				R_RUN=$R_CHECK
 | 
			
		||||
				[ -r ./src/testsuite/tests-skipped.lst ] \
 | 
			
		||||
					&& R_CHECK_Y="y" || R_CHECK_Y="Y"
 | 
			
		||||
			else
 | 
			
		||||
				./src/ngircd/ngircd --help 2>/dev/null \
 | 
			
		||||
				 | grep "^ngIRCd" >/dev/null
 | 
			
		||||
@@ -99,6 +129,7 @@ if [ -r "Makefile" ]; then
 | 
			
		||||
	CC=$(grep "^CC = " Makefile | cut -d' ' -f3)
 | 
			
		||||
	$CC --version 2>&1 | grep -i "GCC" >/dev/null
 | 
			
		||||
	if [ $? -eq 0 ]; then
 | 
			
		||||
		# GCC, or compiler that mimics GCC
 | 
			
		||||
		$CC --version 2>&1 | grep -i "Open64" >/dev/null
 | 
			
		||||
		if [ $? -eq 0 ]; then
 | 
			
		||||
			COMPILER="Open64"
 | 
			
		||||
@@ -108,57 +139,73 @@ if [ -r "Makefile" ]; then
 | 
			
		||||
			COMPILER="gcc $COMPILER"
 | 
			
		||||
		fi
 | 
			
		||||
	else
 | 
			
		||||
		case "$CC" in
 | 
			
		||||
		  gcc*)
 | 
			
		||||
		# Non-GCC compiler
 | 
			
		||||
		$CC --version 2>&1 | grep -i "clang" >/dev/null
 | 
			
		||||
		if [ $? -eq 0 ]; then
 | 
			
		||||
			COMPILER=$($CC --version 2>/dev/null | head -1 \
 | 
			
		||||
			  | cut -d'(' -f1 | cut -d'-' -f1 \
 | 
			
		||||
			  | sed -e 's/version //g' | sed -e 's/Apple /A-/g' \
 | 
			
		||||
			  | sed -e 's/Debian //g' | sed -e 's/LLVM /clang /g')
 | 
			
		||||
		fi
 | 
			
		||||
		$CC -version 2>&1 | grep -i "tcc" >/dev/null
 | 
			
		||||
		if [ $? -eq 0 ]; then
 | 
			
		||||
			COMPILER=$($CC -version 2>/dev/null | head -1 \
 | 
			
		||||
			  | cut -d'(' -f1 | sed -e 's/version //g')
 | 
			
		||||
		fi
 | 
			
		||||
		if [ "$COMPILER" = "unknown" ]; then
 | 
			
		||||
			v="`$CC --version 2>/dev/null | head -1`"
 | 
			
		||||
			[ -n "$v" ] && COMPILER="gcc $v"
 | 
			
		||||
			;;
 | 
			
		||||
		esac
 | 
			
		||||
			[ -z "$v" ] && v="`$CC -version 2>/dev/null | head -1`"
 | 
			
		||||
			[ -n "$v" ] && COMPILER="$v"
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Get ngIRCd version information
 | 
			
		||||
eval $(grep "^VERSION = " Makefile | sed -e 's/ //g')
 | 
			
		||||
eval "$(grep "^VERSION = " Makefile | sed -e 's/ //g')"
 | 
			
		||||
case "$VERSION" in
 | 
			
		||||
	*-*-*)
 | 
			
		||||
		VERSION=`echo "$VERSION" | cut -d'-' -f3 | cut -b2-`
 | 
			
		||||
	*~*-*)
 | 
			
		||||
		VERSION=`echo "$VERSION" | cut -b1-10`
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
[ -n "$VERSION" ] || VERSION="unknown"
 | 
			
		||||
 | 
			
		||||
# Get IO interface information
 | 
			
		||||
if [ "$OS" = "linux-gnu" ]; then
 | 
			
		||||
	COMMENT="(1)"
 | 
			
		||||
	COMMENT="1"
 | 
			
		||||
else
 | 
			
		||||
	grep "^#define HAVE_SYS_DEVPOLL_H 1" src/config.h >/dev/null 2>&1
 | 
			
		||||
	[ $? -eq 0 ] && COMMENT="(4)"
 | 
			
		||||
	[ $? -eq 0 ] && COMMENT="4"
 | 
			
		||||
	grep "^#define HAVE_EPOLL_CREATE 1" src/config.h >/dev/null 2>&1
 | 
			
		||||
	[ $? -eq 0 ] && COMMENT="(5)"
 | 
			
		||||
	[ $? -eq 0 ] && COMMENT="5"
 | 
			
		||||
	grep "^#define HAVE_KQUEUE 1" src/config.h >/dev/null 2>&1
 | 
			
		||||
	[ $? -eq 0 ] && COMMENT="(3)"
 | 
			
		||||
	[ $? -eq 0 ] && COMMENT="3"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
[ -n "$R_CONFIGURE" ] && C="Y" || C="N"
 | 
			
		||||
[ -n "$R_MAKE" ] && M="Y" || M="N"
 | 
			
		||||
[ -n "$R_CHECK" ] && T="Y" || T="N"
 | 
			
		||||
[ -n "$R_CHECK" ] && T="$R_CHECK_Y" || T="N"
 | 
			
		||||
[ -n "$R_RUN" ] && R="Y" || R="N"
 | 
			
		||||
[ -n "$COMMENT" ] && COMMENT=" $COMMENT"
 | 
			
		||||
 | 
			
		||||
echo
 | 
			
		||||
echo "                              the executable works (\"runs\") as expected --+"
 | 
			
		||||
echo "                                tests run successfully (\"make check\") --+ |"
 | 
			
		||||
echo "                                           ngIRCd compiles (\"make\") --+ | |"
 | 
			
		||||
echo "                                                ./configure works --+ | | |"
 | 
			
		||||
echo "                                                                    | | | |"
 | 
			
		||||
echo "Platform                    Compiler     ngIRCd     Date     Tester C M T R See"
 | 
			
		||||
echo "--------------------------- ------------ ---------- -------- ------ - - - - ---"
 | 
			
		||||
echo "                                the executable works (\"runs\") as expected --+"
 | 
			
		||||
echo "                                  tests run successfully (\"make check\") --+ |"
 | 
			
		||||
echo "                                             ngIRCd compiles (\"make\") --+ | |"
 | 
			
		||||
echo "                                                  ./configure works --+ | | |"
 | 
			
		||||
echo "                                                                      | | | |"
 | 
			
		||||
echo "Platform                    Compiler     ngIRCd     Date     Tester   C M T R *"
 | 
			
		||||
echo "--------------------------- ------------ ---------- -------- -------- - - - - -"
 | 
			
		||||
type printf >/dev/null 2>&1
 | 
			
		||||
if [ $? -eq 0 ]; then
 | 
			
		||||
	printf "%-27s %-12s %-10s %s %-6s %s %s %s %s%s" \
 | 
			
		||||
	printf "%-27s %-12s %-10s %s %-8s %s %s %s %s%s\n" \
 | 
			
		||||
	 "$PLATFORM" "$COMPILER" "$VERSION" "$DATE" "$USER" \
 | 
			
		||||
	 "$C" "$M" "$T" "$R" "$COMMENT"
 | 
			
		||||
else
 | 
			
		||||
	echo "$PLATFORM $COMPILER $VERSION $DATE $USER" \
 | 
			
		||||
	 "$C" "$M" "$T" "$R" "$COMMENT"
 | 
			
		||||
fi
 | 
			
		||||
echo; echo
 | 
			
		||||
echo
 | 
			
		||||
if [ "$R_CHECK_Y" = "y" ]; then
 | 
			
		||||
	echo "$NAME: Warning: Some tests have been skipped!"
 | 
			
		||||
	echo
 | 
			
		||||
fi
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								doc/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								doc/.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1 +0,0 @@
 | 
			
		||||
sample-ngircd.conf
 | 
			
		||||
							
								
								
									
										16
									
								
								doc/Bopm.txt
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								doc/Bopm.txt
									
									
									
									
									
								
							@@ -1,9 +1,8 @@
 | 
			
		||||
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
                           http://ngircd.barton.de/
 | 
			
		||||
 | 
			
		||||
                        (c)2001-2010 Alexander Barton,
 | 
			
		||||
                    alex@barton.de, http://www.barton.de/
 | 
			
		||||
 | 
			
		||||
               (c)2001-2014 Alexander Barton and Contributors.
 | 
			
		||||
               ngIRCd is free software and published under the
 | 
			
		||||
                   terms of the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
@@ -18,7 +17,7 @@ monitor, designed for use with hybrid-based ircds, although it can be used
 | 
			
		||||
with slight modification on any server which has the ability to show connects
 | 
			
		||||
to opers and that supports KLINEs."
 | 
			
		||||
 | 
			
		||||
And starting with Release 17, ngIRCd supports all required log messages that
 | 
			
		||||
Starting with Release 17, ngIRCd supports all required log messages that
 | 
			
		||||
BOPM requires to be useful.
 | 
			
		||||
 | 
			
		||||
II. Installation
 | 
			
		||||
@@ -37,11 +36,12 @@ a) BOPM "IRC" section:
 | 
			
		||||
  3) change "mode" to "+ci" or "+c".
 | 
			
		||||
 | 
			
		||||
  4) Set "connregex" to the following string, everything in one line(!):
 | 
			
		||||
     "\\*\\*\\* Notice -- Client connecting: ([^ ]+) \\(([^@]+)@([^\\)]+)\\) \\[([0-9\\.]+)\\].*";
 | 
			
		||||
     and comment all the other "connregex" examples (prepend a "#" character).
 | 
			
		||||
     "Client connecting: ([^ ]+) \\(([^@]+)@([^\\)]+)\\) \\[([0-9\\.]+)\\].*";
 | 
			
		||||
     and comment out all the other "connregex" examples (that is, prepend a
 | 
			
		||||
     "#" character).
 | 
			
		||||
 | 
			
		||||
  5) Set "kline" to "KILL %n :Open proxy found on your host!"; for example,
 | 
			
		||||
     and comment all the other "kline" examples.
 | 
			
		||||
  5) Set "kline" to "GLINE *@%h :Open proxy found on your host!";
 | 
			
		||||
     and comment out all the other "kline" examples.
 | 
			
		||||
 | 
			
		||||
b) BOPM "scanner" section:
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@ This document lists and describes the "IRC capabilities" that ngIRCd supports
 | 
			
		||||
and can be requested by a IRC/IRCv3 client that supports the "CAP" command.
 | 
			
		||||
 | 
			
		||||
ngIRCd implements the "IRC Client Capabilities Extension" as described here:
 | 
			
		||||
<http://www.leeh.co.uk/draft-mitchell-irc-capabilities-02.html>
 | 
			
		||||
<http://ircv3.net/specs/core/capability-negotiation-3.1.html>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
I. Supported Capabilities
 | 
			
		||||
@@ -25,4 +25,4 @@ I. Supported Capabilities
 | 
			
		||||
   server to send all possible prefixes which apply to a user in NAMES and
 | 
			
		||||
   WHO output.
 | 
			
		||||
 | 
			
		||||
   See <http://ircv3.atheme.org/extensions/multi-prefix-3.1>.
 | 
			
		||||
   See <http://ircv3.net/specs/extensions/multi-prefix-3.1.html>.
 | 
			
		||||
 
 | 
			
		||||
@@ -78,7 +78,7 @@ Connection Handling Commands
 | 
			
		||||
	like this: "CAP REQ :capability1 capability2 capability3" for example.
 | 
			
		||||
 | 
			
		||||
	References:
 | 
			
		||||
	 - <http://ircv3.atheme.org/specification/capability-negotiation-3.1>
 | 
			
		||||
	 - <http://ircv3.net/specs/core/capability-negotiation-3.1.html>
 | 
			
		||||
	 - <http://ngircd.barton.de/doc/Capabilities.txt>
 | 
			
		||||
	 - doc/Capabilities.txt
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
                           http://ngircd.barton.de/
 | 
			
		||||
 | 
			
		||||
               (c)2001-2011 Alexander Barton and Contributors.
 | 
			
		||||
               (c)2001-2015 Alexander Barton and Contributors.
 | 
			
		||||
               ngIRCd is free software and published under the
 | 
			
		||||
                   terms of the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
@@ -52,3 +52,9 @@ get an idea of how to do it the best :-)
 | 
			
		||||
 | 
			
		||||
   And this is open source, your work must not be 100% finished and perfect,
 | 
			
		||||
   work in progress is interesting, too: "release early, release often"!
 | 
			
		||||
 | 
			
		||||
- Use GitHub to create "Pull Requests"
 | 
			
		||||
 | 
			
		||||
  ngIRCd is hosted on GitHub (<https://github.com/ngircd>), so please use the
 | 
			
		||||
  tools available there and open issues (comment!) and create pull requests!
 | 
			
		||||
  See <https://help.github.com/articles/using-pull-requests/> for details.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										13
									
								
								doc/FAQ.txt
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								doc/FAQ.txt
									
									
									
									
									
								
							@@ -89,16 +89,21 @@ A: You need to set 'OperCanUseMode = yes' in ngircd.conf, then IRC operators
 | 
			
		||||
   can use the MODE command for changing modes even when they are not joined
 | 
			
		||||
   to the specific channel.
 | 
			
		||||
 | 
			
		||||
Q: How can I "auto-op" users in channels?
 | 
			
		||||
A: ngIRCd can't do this: you would have to use some "IRC Services", like
 | 
			
		||||
   Atheme (<http://atheme.net/atheme.html>) or Anope (<http://www.anope.org>).
 | 
			
		||||
   See "doc/Services.txt" for setup instructions.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
IV. Bugs!?
 | 
			
		||||
~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Q: Is there a list of known bugs and desired feature enhancements?
 | 
			
		||||
A: Yes. Have a look at the bug tracking system (Bugzilla) for ngIRCd located
 | 
			
		||||
   at <http://ngircd.barton.de/bugzilla/index.cgi>. There you can file bug
 | 
			
		||||
A: Yes. Have a look at the bug tracking system (Github issues) for ngIRCd located
 | 
			
		||||
   at <https://github.com/ngircd/ngircd/issues>. There you can file bug
 | 
			
		||||
   reports and feature requests as well as search the bug database.
 | 
			
		||||
 | 
			
		||||
Q: What should I do if I found a bug?
 | 
			
		||||
A: Please file a bug report at <http://ngircd.barton.de/bugzilla/index.cgi>!
 | 
			
		||||
   The author of the particular component will be notified automagically :-)
 | 
			
		||||
A: Please file a bug report at <https://github.com/ngircd/ngircd/issues/new>!
 | 
			
		||||
   The author will be notified automagically :-)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										65
									
								
								doc/GIT.txt
									
									
									
									
									
								
							
							
						
						
									
										65
									
								
								doc/GIT.txt
									
									
									
									
									
								
							@@ -1,65 +0,0 @@
 | 
			
		||||
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
                           http://ngircd.barton.de/
 | 
			
		||||
 | 
			
		||||
               (c)2001-2011 Alexander Barton and Contributors.
 | 
			
		||||
               ngIRCd is free software and published under the
 | 
			
		||||
                   terms of the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
                                 -- GIT.txt --
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
The source code of ngIRCd is maintained using GIT, an distributed version
 | 
			
		||||
control system. Homepage including documentation: <http://git-scm.com/>.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
I. Viewing the source code online
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
The ngIRCd "GITweb" interface allows you to browse the GIT repository and
 | 
			
		||||
to see all individual files, tags, branches, commits etc.:
 | 
			
		||||
 | 
			
		||||
 <http://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd.git>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
II. Getting the source code
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
To access (copy, clone) the source tree repository anonymously, run:
 | 
			
		||||
 | 
			
		||||
 $ git clone git://ngircd.barton.de/ngircd.git
 | 
			
		||||
 | 
			
		||||
Thereby a new folder "ngircd" will be created containing all the individual
 | 
			
		||||
source files.
 | 
			
		||||
 | 
			
		||||
The newly created directory ("ngircd") is the "working directory", all
 | 
			
		||||
GIT commands will be executed from within this directory in the future.
 | 
			
		||||
 | 
			
		||||
Please note: When checking out a fresh copy of ngIRCd using GIT, the
 | 
			
		||||
configure script doesn't exist; you have to run the autogen.sh shell script
 | 
			
		||||
(which is included in the source tree) to generate it. This requires you to
 | 
			
		||||
have GNU automake and GNU autoconf installed on your system. Please see the
 | 
			
		||||
file INSTALL for details!
 | 
			
		||||
 | 
			
		||||
To update the local GIT repository:
 | 
			
		||||
 | 
			
		||||
 $ git pull
 | 
			
		||||
 | 
			
		||||
This retrieves all changes and merges them into the current branch.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
III. Contributing
 | 
			
		||||
~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Patches should be sent to the ngircd mailing list. List homepage:
 | 
			
		||||
http://arthur.barton.de/mailman/listinfo/ngircd-ml
 | 
			
		||||
 | 
			
		||||
If you do not want to send them to the list, you can also mail them
 | 
			
		||||
to Alex Barton, <alex@barton.de>.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
IV. Write Access
 | 
			
		||||
~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
If you want to contribute a couple of patches and write access to the GIT
 | 
			
		||||
repository would be handy, please contact Alex Barton, <alex@barton.de>.
 | 
			
		||||
@@ -37,6 +37,7 @@ II. How to prepare a new ngIRCd release?
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
a) Make sure the source tree is in a releasable state ;-)
 | 
			
		||||
    - is the AUTHORS file up to date?
 | 
			
		||||
 | 
			
		||||
b) Make sure you have working versions of GNU autoconf and GNU automake
 | 
			
		||||
   installed on the system you use for generating the release:
 | 
			
		||||
@@ -74,4 +75,6 @@ l) Upload and distribute the newly generated ngIRCd release archive(s)
 | 
			
		||||
 | 
			
		||||
m) Write an announcement to the mailing list, freshmeat, Twitter, ...
 | 
			
		||||
 | 
			
		||||
n) Relax :-)
 | 
			
		||||
n) Update the list of releases in our bug tracker.
 | 
			
		||||
 | 
			
		||||
o) Relax :-)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
# Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors
 | 
			
		||||
# Copyright (c)2001-2015 Alexander Barton (alex@barton.de) and Contributors
 | 
			
		||||
#
 | 
			
		||||
# 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
 | 
			
		||||
@@ -23,7 +23,6 @@ static_docs = \
 | 
			
		||||
	Commands.txt \
 | 
			
		||||
	Contributing.txt \
 | 
			
		||||
	FAQ.txt \
 | 
			
		||||
	GIT.txt \
 | 
			
		||||
	HowToRelease.txt \
 | 
			
		||||
	Modes.txt \
 | 
			
		||||
	PAM.txt \
 | 
			
		||||
@@ -54,11 +53,11 @@ maintainer-clean-local:
 | 
			
		||||
all: $(generated_docs)
 | 
			
		||||
 | 
			
		||||
install-data-hook: $(static_docs) $(toplevel_docs) $(generated_docs)
 | 
			
		||||
	$(mkinstalldirs) $(DESTDIR)$(sysconfdir)
 | 
			
		||||
	$(MKDIR_P) -m 755 $(DESTDIR)$(sysconfdir)
 | 
			
		||||
	@if [ ! -f $(DESTDIR)$(sysconfdir)/ngircd.conf ]; then \
 | 
			
		||||
	  make install-config; \
 | 
			
		||||
	 fi
 | 
			
		||||
	$(mkinstalldirs) $(DESTDIR)$(docdir)
 | 
			
		||||
	$(MKDIR_P) -m 755 $(DESTDIR)$(docdir)
 | 
			
		||||
	for f in $(static_docs) $(toplevel_docs); do \
 | 
			
		||||
	  $(INSTALL) -m 644 -c $(srcdir)/$$f $(DESTDIR)$(docdir)/; \
 | 
			
		||||
	 done
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
                           http://ngircd.barton.de/
 | 
			
		||||
 | 
			
		||||
               (c)2001-2012 Alexander Barton and Contributors.
 | 
			
		||||
               (c)2001-2015 Alexander Barton and Contributors.
 | 
			
		||||
               ngIRCd is free software and published under the
 | 
			
		||||
                   terms of the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
@@ -26,7 +26,9 @@ channels he is using at the moment.
 | 
			
		||||
  B	20	User is flagged as a "bot".
 | 
			
		||||
  c	17	IRC operator wants to receive connect/disconnect NOTICEs.
 | 
			
		||||
  C	19	Only users that share a channel are allowed to send messages.
 | 
			
		||||
  F	22	Relaxed flood protection (only settable by IRC Operators).
 | 
			
		||||
  i	0.0.1	User is "invisible".
 | 
			
		||||
  I	23	No channels are shown on WHOIS (IRC Ops can always see those).
 | 
			
		||||
  o	0.0.1	User is IRC operator.
 | 
			
		||||
  q	20	User is protected, can not be kicked from a channel.
 | 
			
		||||
  r	0.0.1	User is restricted.
 | 
			
		||||
@@ -54,6 +56,7 @@ users to lists (e.g. "invite list", "ban list"), others have parameters
 | 
			
		||||
  m	0.3.0	Channel is moderated, only "voiced" users can send messages.
 | 
			
		||||
  M	20	Only registered users (and IRC Ops) can send messages.
 | 
			
		||||
  n	0.3.0	Channel doesn't allow messages of users not being members.
 | 
			
		||||
  N     23      Users can't change their nickname while on this channel.
 | 
			
		||||
  O	18	Only IRC operators are allowed to join this channel.
 | 
			
		||||
  P	0.5.0	Channel is "persistent".
 | 
			
		||||
  Q	20	Nobody can be kicked from the channel.
 | 
			
		||||
 
 | 
			
		||||
@@ -9,80 +9,110 @@
 | 
			
		||||
                              -- 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.
 | 
			
		||||
This file lists the status of all platforms on which ngIRCd has been tested.
 | 
			
		||||
Included is the date and version of the last test and the name of the tester
 | 
			
		||||
or 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!
 | 
			
		||||
If you successfully compiled and tested ngIRCd on a platform that isn't listed
 | 
			
		||||
here, please write to the mailing list so that this list can be updated.  The
 | 
			
		||||
script "./contrib/platformtest.sh" should output a summary that is suitable
 | 
			
		||||
for inclusion here. Thanks for your help!
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                              the executable works ("runs") as expected --+
 | 
			
		||||
                                tests run successfully ("make check") --+ |
 | 
			
		||||
                                           ngIRCd compiles ("make") --+ | |
 | 
			
		||||
                                                ./configure works --+ | | |
 | 
			
		||||
                                                                    | | | |
 | 
			
		||||
Platform                    Compiler     ngIRCd     Date     Tester C M T R See
 | 
			
		||||
--------------------------- ------------ ---------- -------- ------ - - - - ---
 | 
			
		||||
alpha/unknown/netbsd3.0     gcc 3.3.3    CVSHEAD    06-05-07 fw     Y Y Y Y (3)
 | 
			
		||||
armv6l/unkn./linux-gnueabi  gcc 4.7.2    20.2       13-03-08 goetz  Y Y Y Y (5)
 | 
			
		||||
armv7l/unkn./linux-gnueabi  gcc 4.4.3    19.1       12-04-29 goetz  Y Y Y Y (5)
 | 
			
		||||
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    13~rc1     08-12-02 alex   Y Y Y Y
 | 
			
		||||
hppa2.0w-hp-hpux11.11       gcc 4.2.3    14.1       09-07-22 goetz  Y Y Y Y
 | 
			
		||||
i386/apple/darwin9.7.0      gcc 4.0.1    14.1       09-08-04 alex   Y Y Y Y (3)
 | 
			
		||||
i386/apple/darwin10.8.0     gcc 4.2.1    19         12-02-26 alex   Y Y Y Y (3)
 | 
			
		||||
i386/apple/darwin11.3.0     gcc 4.2.1    19         12-02-26 alex   Y Y Y Y (3)
 | 
			
		||||
i386/pc/solaris2.9          gcc 3.2.2    CVSHEAD    04-02-24 alex   Y Y Y Y
 | 
			
		||||
i386/pc/solaris2.11         gcc 3.4.3    19         12-02-26 alex   Y Y N Y (4)
 | 
			
		||||
i386/pc/solaris2.11         gcc 4.2.3    19.1       12-05-29 goetz  Y Y Y Y (4)
 | 
			
		||||
i386/unknown/freebsd5.2.1   gcc 3.3.3    0.8.0      04-05-30 alex   Y Y Y Y
 | 
			
		||||
i386/unknown/freebsd6.2     gcc 3.4.6    20~rc1     12-11-13 alex   Y Y Y Y (3)
 | 
			
		||||
i386/unknown/freebsd7.3     gcc 4.2.1    20~rc1     12-11-13 alex   Y Y Y Y (3)
 | 
			
		||||
i686/unknown/gnu0.3         gcc 4.4.5    19         12-02-29 alex   Y Y Y Y
 | 
			
		||||
i686/unkn./kfreebsd7.2-gnu  gcc 4.3.4    15         09-12-02 alex   Y Y Y Y (3)
 | 
			
		||||
i386/unknown/netbsdelf1.6.2 gcc 2.95.3   18         11-07-10 goetz  Y Y Y Y
 | 
			
		||||
i386/unknown/netbsdelf3.0.1 gcc 3.3.3    0.10.0-p1  06-08-30 alex   Y Y Y Y (3)
 | 
			
		||||
i386/unknown/netbsdelf4.0   gcc 4.1.2    19         12-02-29 alex   Y Y Y Y (3)
 | 
			
		||||
i386/unknown/netbsdelf5.0.2 gcc 4.1.3    19         12-02-26 alex   Y Y Y Y (3)
 | 
			
		||||
i386/unknown/openbsd3.9     gcc 3.3.5    0.10.0-p1  06-08-30 alex   Y Y Y Y (3)
 | 
			
		||||
i386/unknown/openbsd4.1     gcc 3.3.5    16         10-04-11 alex   Y Y Y Y (3)
 | 
			
		||||
i586/pc/haiku               gcc 2.95.3   19.2~138   12-10-11 user   Y Y N N
 | 
			
		||||
i586/pc/interix3.5          gcc 3.3      19         12-02-29 alex   Y Y N Y
 | 
			
		||||
i686/pc/cygwin              gcc 3.3.1    0.8.0      04-05-30 alex   Y Y N Y
 | 
			
		||||
i686/pc/linux-gnu           gcc 2.7.2    19.1       12-05-30 goetz  Y Y Y Y (1)
 | 
			
		||||
i686/pc/linux-gnu           gcc 2.95.4   0.8.0      04-05-30 alex   Y Y Y Y (1)
 | 
			
		||||
i686/pc/linux-gnu           gcc 3.3.5    14.1       09-08-04 alex   Y Y Y Y (1)
 | 
			
		||||
i386/pc/linux-gnu           gcc 4.1.2    13~rc1     08-12-05 alex   Y Y Y Y (1)
 | 
			
		||||
i686/pc/linux-gnu           gcc 4.3.2    14.1       09-08-04 alex   Y Y Y Y (1)
 | 
			
		||||
m68k/apple/aux3.0.1         gcc 2.7.2    17         10-11-07 alex   Y Y N Y
 | 
			
		||||
m68k/apple/aux3.0.1         Orig. A/UX   17         10-11-07 alex   Y Y N Y (2)
 | 
			
		||||
m68k/apple/aux3.1.1         gcc 2.7.2    19         12-02-26 alex   Y Y N Y
 | 
			
		||||
m68k/apple/aux3.1.1         Orig. A/UX   19         12-02-26 alex   Y Y N 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 ? ?
 | 
			
		||||
mipsel/unknown/linux-gnu    gcc 4.1.2    18         11-07-05 goetz  Y Y N Y (1)
 | 
			
		||||
mipsel/unknown/linux-gnu    gcc 4.4.5    18         11-07-30 goetz  Y Y Y Y (1)
 | 
			
		||||
powerpc/apple/darwin6.5     gcc 3.1      0.7.x-CVS  03-04-23 alex   Y Y Y Y
 | 
			
		||||
powerpc/apple/darwin7.9.0   gcc 3.3      19.1       12-05-22 goetz  Y Y Y Y (3)
 | 
			
		||||
powerpc/apple/darwin8.11.0  gcc 4.0.1    18         11-07-02 goetz  Y Y Y Y (3)
 | 
			
		||||
powerpc/unknown/linux-gnu   gcc 3.3.3    0.8.0      04-05-30 alex   Y Y Y Y
 | 
			
		||||
powerpc/unknown/openbsd3.6  gcc 2.95.3   0.10.0     06-10-08 alex   Y Y N Y
 | 
			
		||||
sparc/sun/solaris2.6        gcc 2.95.3   0.7.x-CVS  03-04-22 alex   Y Y Y Y
 | 
			
		||||
sparc/sun/solaris2.7        gcc 3.3      0.8.0      04-05-30 alex   Y Y Y Y
 | 
			
		||||
sparc/unkn./netbsdelf1.6.1  gcc 2.95.3   0.8.0      04-05-30 alex   Y Y Y Y
 | 
			
		||||
x86_64/apple/darwin12.3.0   gcc 4.2.1    20.2       13-04-01 alex   Y Y Y Y (3)
 | 
			
		||||
x86_64/unknown/freebsd8.1   gcc 4.2.1    20~rc1     12-11-13 alex   Y Y Y Y (3)
 | 
			
		||||
x86_64/unkn./freebsd8.1-gnu gcc 4.4.5    19         12-02-26 alex   Y Y Y Y (3)
 | 
			
		||||
x86_64/unknown/linux-gnu    gcc 4.4.5    20.2       13-04-01 alex   Y Y Y Y (1)
 | 
			
		||||
x86_64/unknown/openbsd4.7   gcc 3.3.5    20~rc1     12-02-26 alex   Y Y Y Y (3)
 | 
			
		||||
x86_64/unknown/openbsd4.8   gcc 4.2.1    20~rc1     12-11-13 alex   Y Y Y Y (3)
 | 
			
		||||
                                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 *
 | 
			
		||||
--------------------------- ------------ ---------- -------- -------- - - - - -
 | 
			
		||||
alpha/unknown/netbsd3.0     gcc 3.3.3    CVSHEAD    06-05-07 fw       Y Y Y Y 3
 | 
			
		||||
armv6l/unk./linux-gnueabi   gcc 4.7.2    20.2       13-03-08 goetz    Y Y Y Y 5
 | 
			
		||||
armv6l/unk./linux-gnueabihf gcc 4.6.3    21~rc2     13-10-26 pi       Y Y Y Y 5
 | 
			
		||||
armv7l/unk./linux-gnueabi   gcc 4.4.3    19.1       12-04-29 goetz    Y Y Y Y 5
 | 
			
		||||
armv7l/unk./linux-gnueabihf gcc 4.6.3    22~rc1-3   14-10-10 alex     Y Y Y Y 5
 | 
			
		||||
armv7l/unk./linux-gnueabihf gcc 4.8.2    21.1       14-07-15 goetz    Y Y Y Y 5
 | 
			
		||||
hppa/unknown/openbsd3.5     gcc 2.95.3   CVSHEAD    04-05-25 alex     Y Y Y Y
 | 
			
		||||
hppa/unknown/openbsd5.4     gcc 4.2.1    22~rc1-3   14-10-10 alex     Y Y y Y 3
 | 
			
		||||
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    13~rc1     08-12-02 alex     Y Y Y Y
 | 
			
		||||
hppa2.0w-hp-hpux11.11       gcc 4.2.3    14.1       09-07-22 goetz    Y Y Y Y
 | 
			
		||||
i386/apple/darwin9.7.0      gcc 4.0.1    14.1       09-08-04 alex     Y Y Y Y 3
 | 
			
		||||
i386/apple/darwin10.8.0     gcc 4.2.1    19         12-02-26 alex     Y Y Y Y 3
 | 
			
		||||
i386/apple/darwin11.3.0     gcc 4.2.1    19         12-02-26 alex     Y Y Y Y 3
 | 
			
		||||
i386/pc/solaris2.9          gcc 3.2.2    CVSHEAD    04-02-24 alex     Y Y Y Y
 | 
			
		||||
i386/pc/solaris2.11         gcc 4.5.2    21~rc2     13-10-27 alex     Y Y N Y 4
 | 
			
		||||
i386/unknown/freebsd5.2.1   gcc 3.3.3    0.8.0      04-05-30 alex     Y Y Y Y
 | 
			
		||||
i386/unknown/freebsd6.2     gcc 3.4.6    20~rc1     12-11-13 alex     Y Y Y Y 3
 | 
			
		||||
i386/unknown/freebsd7.3     gcc 4.2.1    20~rc1     12-11-13 alex     Y Y Y Y 3
 | 
			
		||||
i686/pc/minix               gcc 4.4.6    21~rc2     13-10-27 alex     Y Y N N
 | 
			
		||||
i686/unknown/gnu0.3         gcc 4.4.5    19         12-02-29 alex     Y Y Y Y
 | 
			
		||||
i686/unknown/gnu0.5         gcc 4.9.1    22~rc1-3   14-10-11 alex     Y Y Y Y
 | 
			
		||||
i686/unkn./kfreebsd7.2-gnu  gcc 4.3.4    15         09-12-02 alex     Y Y Y Y 3
 | 
			
		||||
i386/unknown/netbsdelf1.5.2 egcs-1.1.2   21         13-11-25 goetz    Y Y N Y
 | 
			
		||||
i386/unknown/netbsdelf1.6.2 gcc 2.95.3   18         11-07-10 goetz    Y Y Y Y
 | 
			
		||||
i386/unknown/netbsdelf3.0.1 gcc 3.3.3    0.10.0-p1  06-08-30 alex     Y Y Y Y 3
 | 
			
		||||
i386/unknown/netbsdelf4.0   gcc 4.1.2    19         12-02-29 alex     Y Y Y Y 3
 | 
			
		||||
i386/unknown/netbsdelf5.0.2 gcc 4.1.3    19         12-02-26 alex     Y Y Y Y 3
 | 
			
		||||
i386/unknown/openbsd3.5     gcc 2.95.3   21         13-11-17 goetz    Y Y Y Y 3
 | 
			
		||||
i386/unknown/openbsd3.9     gcc 3.3.5    0.10.0-p1  06-08-30 alex     Y Y Y Y 3
 | 
			
		||||
i386/unknown/openbsd4.1     gcc 3.3.5    16         10-04-11 alex     Y Y Y Y 3
 | 
			
		||||
i386/unknown/openbsd5.3     gcc 4.2.1    21         13-11-28 goetz    Y Y Y Y 3
 | 
			
		||||
i386/unknown/openbsd5.4     gcc 4.2.1    21         13-11-28 goetz    Y Y Y Y 3
 | 
			
		||||
i586/pc/haiku               gcc 2.95.3   19.2~138   12-10-11 user     Y Y N N
 | 
			
		||||
i586/pc/interix3.5          gcc 3.3      19         12-02-29 alex     Y Y N Y
 | 
			
		||||
i686/pc/cygwin              gcc 4.8.3    22~rc1-3   14-10-10 alex     Y Y N Y
 | 
			
		||||
i686/pc/linux-gnu           gcc 2.7.2    21~38      14-01-06 goetz    Y Y Y Y 1
 | 
			
		||||
i686/pc/linux-gnu           gcc 2.95.4   0.8.0      04-05-30 alex     Y Y Y Y 1
 | 
			
		||||
i686/pc/linux-gnu           gcc 3.3.5    14.1       09-08-04 alex     Y Y Y Y 1
 | 
			
		||||
i386/pc/linux-gnu           gcc 4.1.2    13~rc1     08-12-05 alex     Y Y Y Y 1
 | 
			
		||||
i386/pc/linux-gnu           gcc 4.4.5    22~rc1-3   14-10-10 alex     Y Y Y Y 1
 | 
			
		||||
i686/pc/linux-gnu           gcc 4.3.2    14.1       09-08-04 alex     Y Y Y Y 1
 | 
			
		||||
m68k/apple/aux3.0.1         gcc 2.7.2    17         10-11-07 alex     Y Y N Y
 | 
			
		||||
m68k/apple/aux3.0.1         Orig. A/UX   17         10-11-07 alex     Y Y N Y 2
 | 
			
		||||
m68k/apple/aux3.1.1         gcc 2.7.2    19         12-02-26 alex     Y Y N Y
 | 
			
		||||
m68k/apple/aux3.1.1         Orig. A/UX   19         12-02-26 alex     Y Y N 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 ? ?
 | 
			
		||||
mipsel/unknown/linux-gnu    gcc 4.1.2    18         11-07-05 goetz    Y Y N Y 1
 | 
			
		||||
mipsel/unknown/linux-gnu    gcc 4.4.5    21         13-11-24 goetz    Y Y Y Y 1
 | 
			
		||||
powerpc/apple/darwin6.8     gcc 3.1      21         14-01-03 goetz    Y Y Y Y
 | 
			
		||||
powerpc/apple/darwin7.9.0   gcc 3.3      22         15-03-22 goetz    Y Y Y Y 3
 | 
			
		||||
powerpc/apple/darwin8.11.0  gcc 4.0.1    18         11-07-02 goetz    Y Y Y Y 3
 | 
			
		||||
powerpc/apple/darwin9.8.0   gcc 4.0.1    21         14-01-04 goetz    Y Y Y Y 3
 | 
			
		||||
powerpc/unknown/linux-gnu   gcc 3.3.3    0.8.0      04-05-30 alex     Y Y Y Y
 | 
			
		||||
powerpc/unknown/openbsd3.6  gcc 2.95.3   0.10.0     06-10-08 alex     Y Y N Y
 | 
			
		||||
sparc/sun/solaris2.6        gcc 2.95.3   0.7.x-CVS  03-04-22 alex     Y Y Y Y
 | 
			
		||||
sparc/sun/solaris2.7        gcc 3.3      0.8.0      04-05-30 alex     Y Y Y Y
 | 
			
		||||
sparc/unkn./netbsdelf1.6.1  gcc 2.95.3   0.8.0      04-05-30 alex     Y Y Y Y
 | 
			
		||||
sparc/unknown/openbsd5.5    gcc 4.2.1    21.1       14-05-03 goetz    Y Y Y Y 3
 | 
			
		||||
x86_64/apple/darwin10.8.0   gcc 4.2.1    21~rc2     13-10-30 alex     Y Y Y Y 3
 | 
			
		||||
x86_64/apple/darwin12.3.0   gcc 4.2.1    20.2       13-04-01 alex     Y Y Y Y 3
 | 
			
		||||
x86_64/apple/darwin13.0.0   A-clang 5.0  21         14-01-02 alex     Y Y Y Y 3
 | 
			
		||||
x86_64/apple/darwin14.0.0   A-clang 6.0  22~rc1-3   14-10-10 alex     Y Y Y Y 3
 | 
			
		||||
x86_64/unknown/dragonfly3.4 gcc 4.7.2    21         13-11-12 goetz    Y Y N Y 3
 | 
			
		||||
x86_64/unknown/freebsd8.4   gcc 4.2.1    22~rc1-3   14-10-10 alex     Y Y y Y 3
 | 
			
		||||
x86_64/unknown/freebsd9.2   gcc 4.2.1    22~rc1-3   14-10-10 alex     Y Y Y Y 3
 | 
			
		||||
x86_64/unknown/freebsd10.0  F-clang 3.3  22~rc1-3   14-10-10 alex     Y Y Y Y 3
 | 
			
		||||
x86_64/unkn./freebsd8.1-gnu gcc 4.4.5    19         12-02-26 alex     Y Y Y Y 3
 | 
			
		||||
x86_64/unknown/linux-gnu    clang 3.3    21         14-01-07 alex     Y Y Y Y 1
 | 
			
		||||
x86_64/unknown/linux-gnu    clang 3.4    22~rc1-3   14-10-11 alex     Y Y Y Y 1
 | 
			
		||||
x86_64/unknown/linux-gnu    gcc 4.4.5    22~rc1-3   14-10-10 alex     Y Y Y Y 1
 | 
			
		||||
x86_64/unknown/linux-gnu    gcc 4.7.2    22~rc1-3   14-10-10 alex     Y Y Y Y 1
 | 
			
		||||
x86_64/unknown/linux-gnu    gcc 4.8.2    21         13-12-29 alex     Y Y Y Y 1
 | 
			
		||||
x86_64/unknown/linux-gnu    gcc 4.9.1    22~rc1-3   14-10-10 alex     Y Y Y Y 1
 | 
			
		||||
x86_64/unknown/linux-gnu    nwcc 0.8.2   21         13-12-01 goetz    Y Y Y Y 1
 | 
			
		||||
x86_64/unknown/linux-gnu    Open64       21.1       14-03-27 goetz    Y Y Y Y 1
 | 
			
		||||
x86_64/unknown/linux-gnu    Sun C 5.12   21.1       14-03-27 goetz    Y Y Y Y 1
 | 
			
		||||
x86_64/unknown/linux-gnu    tcc 0.9.25   21.1       14-03-27 goetz    Y Y Y Y 1
 | 
			
		||||
x86_64/unknown/openbsd4.7   gcc 3.3.5    20~rc1     12-02-26 alex     Y Y Y Y 3
 | 
			
		||||
x86_64/unknown/openbsd4.8   gcc 4.2.1    22~rc1-3   14-10-10 alex     Y Y y Y 3
 | 
			
		||||
x86_64/unknown/openbsd5.1   gcc 4.2.1    21         13-12-28 alex     Y Y Y Y 3
 | 
			
		||||
x86_64/unknown/openbsd5.5   gcc 4.2.1    22~rc1-3   14-10-10 alex     Y Y Y Y 3
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Notes
 | 
			
		||||
~~~~~
 | 
			
		||||
* Notes
 | 
			
		||||
~~~~~~~
 | 
			
		||||
 | 
			
		||||
(1) */*/linux-gnu (Linux platforms):
 | 
			
		||||
    ngIRCd has been tested with various Linux distributions, such as SuSE,
 | 
			
		||||
 
 | 
			
		||||
@@ -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.barton.de/pub/unix/aux/tools/sed-3.02.tar.gz
 | 
			
		||||
   http://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.
 | 
			
		||||
@@ -34,7 +34,7 @@ The following software packages are needed:
 | 
			
		||||
 - libUTIL.a
 | 
			
		||||
   Source:
 | 
			
		||||
   ftp://ftp.mayn.de/pub/really_old_stuff/apple/apple_unix/Sys_stuff/libUTIL-2.1.tar.gz>
 | 
			
		||||
   ftp://arthur.barton.de/pub/unix/aux/libraries/libUTIL-2.1.tar.gz
 | 
			
		||||
   http://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() and 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.barton.de/pub/unix/aux/tools/fileutils-4.0.tar.gz
 | 
			
		||||
   http://arthur.barton.de/pub/unix/aux/tools/fileutils-4.0.tar.gz
 | 
			
		||||
 | 
			
		||||
 - The precompiled binary of the old 'bash' shouldn't be installed within
 | 
			
		||||
   /bin (better do this in /usr/local/bin) because 'configure' would
 | 
			
		||||
 
 | 
			
		||||
@@ -41,8 +41,8 @@ Example:
 | 
			
		||||
     ServiceMask = *Serv
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Setting up Anope 1.9.x
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
Setting up Anope 1.9.x & 2.x
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Anope 1.9.8 or later (<http://www.anope.org/>) can be used with ngIRCd using
 | 
			
		||||
the "ngircd" protocol module.
 | 
			
		||||
@@ -66,20 +66,28 @@ In conf/services.conf:
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  # Load ngIRCd protocol module
 | 
			
		||||
  module { name = "ngircd" }
 | 
			
		||||
  module
 | 
			
		||||
  {
 | 
			
		||||
	name = "ngircd"
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  networkinfo
 | 
			
		||||
  {
 | 
			
		||||
	# Must be set to the "MaxNickLength" setting of ngIRCd!
 | 
			
		||||
	nicklen = 9
 | 
			
		||||
 | 
			
		||||
	# When not using "strict mode", which is the default:
 | 
			
		||||
	userlen = 20
 | 
			
		||||
 | 
			
		||||
	chanlen = 50
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
In conf/nickserv.conf:
 | 
			
		||||
 | 
			
		||||
  nickserv
 | 
			
		||||
  module
 | 
			
		||||
  {
 | 
			
		||||
	name = "nickserv"
 | 
			
		||||
 | 
			
		||||
	# not required if you are running ngIRCd with a higher nickname limit
 | 
			
		||||
	# ("MaxNickLength") than 11 characters, but REQUIRED by default!
 | 
			
		||||
	guestnickprefix = "G-"
 | 
			
		||||
@@ -115,7 +123,7 @@ Please note that versions up to and including 5.1.3 contain a bug that
 | 
			
		||||
sometimes causes IRC Services to hang on startup. There are two workarounds:
 | 
			
		||||
 a) send the services process a HUP signal ("killall -HUP ircservices")
 | 
			
		||||
 b) apply this patch to the IRC Services source tree:
 | 
			
		||||
    <ftp://ngircd.barton.de/ngircd/contrib/IRCServices513-FlushBuffer.patch>
 | 
			
		||||
    <http://arthur.barton.de/pub/ngircd/contrib/IRCServices513-FlushBuffer.patch>
 | 
			
		||||
 | 
			
		||||
At least the following settings have to be tweaked, in addition to all the
 | 
			
		||||
settings marked as required by IRC Services:
 | 
			
		||||
 
 | 
			
		||||
@@ -54,6 +54,12 @@
 | 
			
		||||
	# A simple Phrase (<256 chars) if you don't want to use a motd file.
 | 
			
		||||
	;MotdPhrase = "Hello world!"
 | 
			
		||||
 | 
			
		||||
	# The name of the IRC network to which this server belongs. This name
 | 
			
		||||
	# is optional, should only contain ASCII characters, and can't contain
 | 
			
		||||
	# spaces. It is only used to inform clients. The default is empty,
 | 
			
		||||
	# so no network name is announced to clients.
 | 
			
		||||
	;Network = aIRCnetwork
 | 
			
		||||
 | 
			
		||||
	# Global password for all users needed to connect to the server.
 | 
			
		||||
	# (Default: not set)
 | 
			
		||||
	;Password = abc
 | 
			
		||||
@@ -166,8 +172,8 @@
 | 
			
		||||
	;ConnectIPv4 = yes
 | 
			
		||||
 | 
			
		||||
	# Default user mode(s) to set on new local clients. Please note that
 | 
			
		||||
	# only modes can be set that the client could set on itself, you can't
 | 
			
		||||
	# set "a" (away) or "o" (IRC Op), for example! Default: none.
 | 
			
		||||
	# only modes can be set that the client could set using regular MODE
 | 
			
		||||
	# commands, you can't set "a" (away) for example! Default: none.
 | 
			
		||||
	;DefaultUserModes = i
 | 
			
		||||
 | 
			
		||||
	# Do DNS lookups when a client connects to the server.
 | 
			
		||||
@@ -187,9 +193,9 @@
 | 
			
		||||
	;MorePrivacy = no
 | 
			
		||||
 | 
			
		||||
	# Normally ngIRCd doesn't send any messages to a client until it is
 | 
			
		||||
	# registered. Enable this option to let the daemon send "NOTICE AUTH"
 | 
			
		||||
	# registered. Enable this option to let the daemon send "NOTICE *"
 | 
			
		||||
	# messages to clients while connecting.
 | 
			
		||||
	;NoticeAuth = no
 | 
			
		||||
	;NoticeBeforeRegistration = no
 | 
			
		||||
 | 
			
		||||
	# Should IRC Operators be allowed to use the MODE command even if
 | 
			
		||||
	# they are not(!) channel-operators?
 | 
			
		||||
@@ -253,9 +259,9 @@
 | 
			
		||||
	# See 'man 1ssl ciphers' (OpenSSL) or 'man 3 gnutls_priority_init'
 | 
			
		||||
	# (GnuTLS) for details.
 | 
			
		||||
	# For OpenSSL:
 | 
			
		||||
	;CipherList = HIGH:!aNULL:@STRENGTH
 | 
			
		||||
	;CipherList = HIGH:!aNULL:@STRENGTH:!SSLv3
 | 
			
		||||
	# For GnuTLS:
 | 
			
		||||
	;CipherList = SECURE128
 | 
			
		||||
	;CipherList = SECURE128:-VERS-SSL3.0
 | 
			
		||||
 | 
			
		||||
	# Diffie-Hellman parameters
 | 
			
		||||
	;DHFile = :ETCDIR:/ssl/dhparams.pem
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								doc/src/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								doc/src/.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1 +0,0 @@
 | 
			
		||||
html
 | 
			
		||||
							
								
								
									
										2
									
								
								man/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								man/.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,2 +0,0 @@
 | 
			
		||||
ngircd.8
 | 
			
		||||
ngircd.conf.5
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
.\"
 | 
			
		||||
.\" ngircd(8) manual page template
 | 
			
		||||
.\"
 | 
			
		||||
.TH ngircd 8 "Jul 2013" ngIRCd "ngIRCd Manual"
 | 
			
		||||
.TH ngircd 8 "Oct 2013" ngIRCd "ngIRCd Manual"
 | 
			
		||||
.SH NAME
 | 
			
		||||
ngIRCd \- the "next generation" IRC daemon
 | 
			
		||||
.SH SYNOPSIS
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
.\"
 | 
			
		||||
.\" ngircd.conf(5) manual page template
 | 
			
		||||
.\"
 | 
			
		||||
.TH ngircd.conf 5 "May 2013" ngIRCd "ngIRCd Manual"
 | 
			
		||||
.TH ngircd.conf 5 "Oct 2014" ngIRCd "ngIRCd Manual"
 | 
			
		||||
.SH NAME
 | 
			
		||||
ngircd.conf \- configuration file of ngIRCd
 | 
			
		||||
.SH SYNOPSIS
 | 
			
		||||
@@ -60,7 +60,7 @@ The main configuration of the server is stored in the
 | 
			
		||||
section, like the server name, administrative information and the ports on
 | 
			
		||||
which the server should be listening. The variables in this section have to be
 | 
			
		||||
adjusted to the local requirements most of the time, whereas all the variables
 | 
			
		||||
in the other sections can be left on there defaults very often.
 | 
			
		||||
in the other sections can be left on their defaults very often.
 | 
			
		||||
.PP
 | 
			
		||||
Options in the
 | 
			
		||||
.I [Limits]
 | 
			
		||||
@@ -82,12 +82,13 @@ sections. And
 | 
			
		||||
blocks are used to configure pre-defined ("persistent") IRC channels.
 | 
			
		||||
.PP
 | 
			
		||||
There can be more than one [Operator], [Server] and [Channel] section per
 | 
			
		||||
configuration file (one for each operator, server, and channel), but only
 | 
			
		||||
exactly one [Global], one [Limits], one [Options], and one [SSL] section.
 | 
			
		||||
configuration file, one for each operator, server, and channel. [Global],
 | 
			
		||||
[Limits], [Options], and [SSL] sections can occure multiple times, too, but
 | 
			
		||||
each variable overwrites itself, only the last assignment is relevant.
 | 
			
		||||
.SH [GLOBAL]
 | 
			
		||||
The
 | 
			
		||||
.I [Global]
 | 
			
		||||
section of this file is used to define the main configuration of the server,
 | 
			
		||||
section is used to define the main configuration of the server,
 | 
			
		||||
like the server name and the ports on which the server should be listening.
 | 
			
		||||
These settings depend on your personal preferences, so you should make sure
 | 
			
		||||
that they correspond to your installation and setup!
 | 
			
		||||
@@ -126,6 +127,12 @@ configuration file.
 | 
			
		||||
\fBMotdPhrase\fR (string)
 | 
			
		||||
A simple Phrase (<256 chars) if you don't want to use a MOTD file.
 | 
			
		||||
.TP
 | 
			
		||||
\fBNetwork\fR (string)
 | 
			
		||||
The name of the IRC network to which this server belongs. This name is
 | 
			
		||||
optional, should only contain ASCII characters, and can't contain spaces.
 | 
			
		||||
It is only used to inform clients. The default is empty, so no network
 | 
			
		||||
name is announced to clients.
 | 
			
		||||
.TP
 | 
			
		||||
\fBPassword\fR (string)
 | 
			
		||||
Global password for all users needed to connect to the server. The default is
 | 
			
		||||
empty, so no password is required. Please note: This feature is not available
 | 
			
		||||
@@ -133,16 +140,16 @@ if ngIRCd is using PAM!
 | 
			
		||||
.TP
 | 
			
		||||
\fBPidFile\fR (string)
 | 
			
		||||
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, e.g. the directory
 | 
			
		||||
the pidfile resides in must be writable by the ngIRCd user and exist in the
 | 
			
		||||
chroot directory (if configured, see above).
 | 
			
		||||
"PID file" is written AFTER chroot and switching the user ID, therefore the
 | 
			
		||||
directory the file resides in must be writable by the ngIRCd user and exist
 | 
			
		||||
in the chroot directory (if configured, see above).
 | 
			
		||||
.TP
 | 
			
		||||
\fBPorts\fR (list of numbers)
 | 
			
		||||
Ports on which the server should listen for unencrypted connections. There
 | 
			
		||||
may be more than one port, separated with commas (","). Default: 6667.
 | 
			
		||||
Port number(s) on which the server should listen for unencrypted connections.
 | 
			
		||||
There may be more than one port, separated with commas (","). Default: 6667.
 | 
			
		||||
.TP
 | 
			
		||||
\fBServerGID\fR (string or number)
 | 
			
		||||
Group ID under which the ngIRCd should run; you can use the name of the
 | 
			
		||||
Group ID under which the ngIRCd daemon should run; you can use the name of the
 | 
			
		||||
group or the numerical ID.
 | 
			
		||||
.PP
 | 
			
		||||
.RS
 | 
			
		||||
@@ -152,8 +159,8 @@ For this to work the server must have been started with root privileges!
 | 
			
		||||
.RE
 | 
			
		||||
.TP
 | 
			
		||||
\fBServerUID\fR (string or number)
 | 
			
		||||
User ID under which the server should run; you can use the name of the user
 | 
			
		||||
or the numerical ID.
 | 
			
		||||
User ID under which the ngIRCd daemon should run; you can use the name of the
 | 
			
		||||
user or the numerical ID.
 | 
			
		||||
.PP
 | 
			
		||||
.RS
 | 
			
		||||
.B Attention:
 | 
			
		||||
@@ -163,8 +170,8 @@ addition, the configuration and MOTD files must be readable by this user,
 | 
			
		||||
otherwise RESTART and REHASH won't work!
 | 
			
		||||
.RE
 | 
			
		||||
.SH [LIMITS]
 | 
			
		||||
Define some limits and timeouts for this ngIRCd instance. Default values
 | 
			
		||||
should be safe, but it is wise to double-check :-)
 | 
			
		||||
This section is used to define some limits and timeouts for this ngIRCd
 | 
			
		||||
instance. Default values should be safe, but it is wise to double-check :-)
 | 
			
		||||
.TP
 | 
			
		||||
\fBConnectRetry\fR (number)
 | 
			
		||||
The server tries every <ConnectRetry> seconds to establish a link to not yet
 | 
			
		||||
@@ -206,8 +213,8 @@ If a client fails to answer a PING with a PONG within <PongTimeout>
 | 
			
		||||
seconds, it will be disconnected by the server. Default: 20.
 | 
			
		||||
.SH [OPTIONS]
 | 
			
		||||
Optional features and configuration options to further tweak the behavior of
 | 
			
		||||
ngIRCd. If you want to get started quickly, you most probably don't have to
 | 
			
		||||
make changes here -- they are all optional.
 | 
			
		||||
ngIRCd are configured in this section. If you want to get started quickly, you
 | 
			
		||||
most probably don't have to make changes here -- they are all optional.
 | 
			
		||||
.TP
 | 
			
		||||
\fBAllowedChannelTypes\fR (string)
 | 
			
		||||
List of allowed channel types (channel prefixes) for newly created channels
 | 
			
		||||
@@ -216,9 +223,9 @@ Set this variable to the empty string to disallow creation of new channels
 | 
			
		||||
by local clients at all. Default: #&+
 | 
			
		||||
.TP
 | 
			
		||||
\fBAllowRemoteOper\fR (boolean)
 | 
			
		||||
Are IRC operators connected to remote servers allowed to control this server,
 | 
			
		||||
e.g. are they allowed to use administrative commands like CONNECT, DIE,
 | 
			
		||||
SQUIT, ... that affect this server? Default: no.
 | 
			
		||||
If this option is active, IRC operators connected to remote servers are allowed
 | 
			
		||||
to control this local server using administrative commands, for example like
 | 
			
		||||
CONNECT, DIE, SQUIT etc. Default: no.
 | 
			
		||||
.TP
 | 
			
		||||
\fBChrootDir\fR (string)
 | 
			
		||||
A directory to chroot in when everything is initialized. It doesn't need
 | 
			
		||||
@@ -245,8 +252,8 @@ The Salt for cloaked hostname hashing. When undefined a random hash is
 | 
			
		||||
generated after each server start.
 | 
			
		||||
.TP
 | 
			
		||||
\fBCloakUserToNick\fR (boolean)
 | 
			
		||||
Set every clients' user name to their nickname and hide the one supplied
 | 
			
		||||
by the IRC client. Default: no.
 | 
			
		||||
Set every clients' user name and real name to their nickname and hide the one
 | 
			
		||||
supplied by the IRC client. Default: no.
 | 
			
		||||
.TP
 | 
			
		||||
\fBConnectIPv4\fR (boolean)
 | 
			
		||||
Set this to no if you do not want ngIRCd to connect to other IRC servers using
 | 
			
		||||
@@ -260,8 +267,8 @@ Default: yes.
 | 
			
		||||
.TP
 | 
			
		||||
\fBDefaultUserModes\fR (string)
 | 
			
		||||
Default user mode(s) to set on new local clients. Please note that only modes
 | 
			
		||||
can be set that the client could set on itself, you can't set "a" (away) or
 | 
			
		||||
"o" (IRC Op), for example!
 | 
			
		||||
can be set that the client could set using regular MODE commands, you can't
 | 
			
		||||
set "a" (away) for example!
 | 
			
		||||
Default: none.
 | 
			
		||||
.TP
 | 
			
		||||
\fBDNS\fR (boolean)
 | 
			
		||||
@@ -277,23 +284,24 @@ Users identified using IDENT are registered without the "~" character
 | 
			
		||||
prepended to their user name.
 | 
			
		||||
Default: yes.
 | 
			
		||||
.TP
 | 
			
		||||
.TP
 | 
			
		||||
\fBIncludeDir\fR (string)
 | 
			
		||||
Directory containing configuration snippets (*.conf), that should be read in
 | 
			
		||||
after parsing the current configuration file.
 | 
			
		||||
Default: none.
 | 
			
		||||
.TP
 | 
			
		||||
\fBMorePrivacy\fR (boolean)
 | 
			
		||||
This will cause ngIRCd to censor user idle time, logon time as well as the
 | 
			
		||||
part/quit messages (that are sometimes used to inform everyone about which
 | 
			
		||||
client software is being used). WHOWAS requests are also silently ignored.
 | 
			
		||||
PART/QUIT messages (that are sometimes used to inform everyone about which
 | 
			
		||||
client software is being used). WHOWAS requests are also silently ignored,
 | 
			
		||||
and NAMES output doesn't list any clients for non-members.
 | 
			
		||||
This option is most useful when ngIRCd is being used together with
 | 
			
		||||
anonymizing software such as TOR or I2P and one does not wish to make it
 | 
			
		||||
too easy to collect statistics on the users.
 | 
			
		||||
Default: no.
 | 
			
		||||
.TP
 | 
			
		||||
\fBNoticeAuth\fR (boolean)
 | 
			
		||||
\fBNoticeBeforeRegistration\fR (boolean)
 | 
			
		||||
Normally ngIRCd doesn't send any messages to a client until it is registered.
 | 
			
		||||
Enable this option to let the daemon send "NOTICE AUTH" messages to clients
 | 
			
		||||
Enable this option to let the daemon send "NOTICE *" messages to clients
 | 
			
		||||
while connecting. Default: no.
 | 
			
		||||
.TP
 | 
			
		||||
\fBOperCanUseMode\fR (boolean)
 | 
			
		||||
@@ -368,7 +376,7 @@ SSL Certificate file of the private server key.
 | 
			
		||||
.TP
 | 
			
		||||
\fBCipherList\fR (string)
 | 
			
		||||
Select cipher suites allowed for SSL/TLS connections.  This defaults to
 | 
			
		||||
"HIGH:!aNULL:@STRENGTH" (OpenSSL) or "SECURE128" (GnuTLS).
 | 
			
		||||
"HIGH:!aNULL:@STRENGTH:!SSLv3" (OpenSSL) or "SECURE128:-VERS-SSL3.0" (GnuTLS).
 | 
			
		||||
Please see 'man 1ssl ciphers' (OpenSSL) and 'man 3 gnutls_priority_init'
 | 
			
		||||
(GnuTLS) for details.
 | 
			
		||||
.TP
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								src/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								src/.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,4 +0,0 @@
 | 
			
		||||
config.h
 | 
			
		||||
config.h.in
 | 
			
		||||
config.h.in~
 | 
			
		||||
stamp-h1
 | 
			
		||||
							
								
								
									
										1
									
								
								src/ipaddr/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								src/ipaddr/.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1 +0,0 @@
 | 
			
		||||
Makefile.am
 | 
			
		||||
@@ -23,7 +23,7 @@
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
ng_ipaddr_init(ng_ipaddr_t *addr, const char *ip_str, UINT16 port)
 | 
			
		||||
{
 | 
			
		||||
#ifdef HAVE_GETADDRINFO
 | 
			
		||||
#ifdef HAVE_WORKING_GETADDRINFO
 | 
			
		||||
	int ret;
 | 
			
		||||
	char portstr[64];
 | 
			
		||||
	struct addrinfo *res0;
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@
 | 
			
		||||
 | 
			
		||||
#ifndef NG_IPADDR_HDR
 | 
			
		||||
#define NG_IPADDR_HDR
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -12,6 +13,7 @@
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <sys/socket.h>
 | 
			
		||||
#include <netinet/in.h>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								src/ngircd/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								src/ngircd/.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,5 +0,0 @@
 | 
			
		||||
Makefile.am
 | 
			
		||||
check-help
 | 
			
		||||
check-version
 | 
			
		||||
ngircd
 | 
			
		||||
ngircd.exe
 | 
			
		||||
@@ -14,16 +14,19 @@
 | 
			
		||||
 * Functions to dynamically allocate arrays.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Additionan debug messages related to array handling: 0=off / 1=on */
 | 
			
		||||
#define DEBUG_ARRAY 0
 | 
			
		||||
 | 
			
		||||
#include "array.h"
 | 
			
		||||
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
#include "log.h"
 | 
			
		||||
 | 
			
		||||
/* Enable more Debug messages in alloc / append / memmove code. */
 | 
			
		||||
/* #define DEBUG_ARRAY */
 | 
			
		||||
#if DEBUG_ARRAY
 | 
			
		||||
# include "log.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define array_UNUSABLE(x)	( !(x)->mem )
 | 
			
		||||
 | 
			
		||||
@@ -64,7 +67,7 @@ array_alloc(array * a, size_t size, size_t pos)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	if (a->allocated < alloc) {
 | 
			
		||||
#ifdef DEBUG_ARRAY
 | 
			
		||||
#if DEBUG_ARRAY
 | 
			
		||||
		Log(LOG_DEBUG, "array_alloc(): changing size from %u to %u bytes.",
 | 
			
		||||
		    a->allocated, alloc);
 | 
			
		||||
#endif
 | 
			
		||||
@@ -165,7 +168,7 @@ array_catb(array * dest, const char *src, size_t len)
 | 
			
		||||
 | 
			
		||||
	assert(ptr != NULL);
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG_ARRAY
 | 
			
		||||
#if DEBUG_ARRAY
 | 
			
		||||
	Log(LOG_DEBUG,
 | 
			
		||||
	    "array_catb(): appending %u bytes to array (now %u bytes in array).",
 | 
			
		||||
	    len, tmp);
 | 
			
		||||
@@ -245,7 +248,7 @@ void
 | 
			
		||||
array_free(array * a)
 | 
			
		||||
{
 | 
			
		||||
	assert(a != NULL);
 | 
			
		||||
#ifdef DEBUG_ARRAY
 | 
			
		||||
#if DEBUG_ARRAY
 | 
			
		||||
	Log(LOG_DEBUG,
 | 
			
		||||
	    "array_free(): %u bytes free'd (%u bytes still used at time of free()).",
 | 
			
		||||
	    a->allocated, a->used);
 | 
			
		||||
@@ -311,7 +314,7 @@ array_moveleft(array * a, size_t membersize, size_t pos)
 | 
			
		||||
	if (!bytepos)
 | 
			
		||||
		return;	/* nothing to do */
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG_ARRAY
 | 
			
		||||
#if DEBUG_ARRAY
 | 
			
		||||
	Log(LOG_DEBUG,
 | 
			
		||||
	    "array_moveleft(): %u bytes used in array, starting at position %u.",
 | 
			
		||||
	    a->used, bytepos);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -18,41 +18,32 @@
 | 
			
		||||
 * Channel management
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <strings.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "conn-func.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include "irc-write.h"
 | 
			
		||||
#include "conf.h"
 | 
			
		||||
#include "hash.h"
 | 
			
		||||
#include "lists.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "messages.h"
 | 
			
		||||
#include "match.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define REMOVE_PART 0
 | 
			
		||||
#define REMOVE_QUIT 1
 | 
			
		||||
#define REMOVE_KICK 2
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static CHANNEL *My_Channels;
 | 
			
		||||
static CL2CHAN *My_Cl2Chan;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static CL2CHAN *Get_Cl2Chan PARAMS(( CHANNEL *Chan, CLIENT *Client ));
 | 
			
		||||
static CL2CHAN *Add_Client PARAMS(( CHANNEL *Chan, CLIENT *Client ));
 | 
			
		||||
static bool Remove_Client PARAMS(( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, const char *Reason, bool InformServer ));
 | 
			
		||||
@@ -361,14 +352,19 @@ Channel_Kick(CLIENT *Peer, CLIENT *Target, CLIENT *Origin, const char *Name,
 | 
			
		||||
		    !Channel_UserHasMode(chan, Target, 'q') &&
 | 
			
		||||
		    !Channel_UserHasMode(chan, Target, 'a'))
 | 
			
		||||
			can_kick = true;
 | 
			
		||||
			
 | 
			
		||||
		/* Half Op can't kick owner | admin | op */ 
 | 
			
		||||
 | 
			
		||||
		/* Half Op can't kick owner | admin | op */
 | 
			
		||||
		else if (Channel_UserHasMode(chan, Peer, 'h') &&
 | 
			
		||||
		    !Channel_UserHasMode(chan, Target, 'q') &&
 | 
			
		||||
		    !Channel_UserHasMode(chan, Target, 'a') &&
 | 
			
		||||
		    !Channel_UserHasMode(chan, Target, 'o'))
 | 
			
		||||
			can_kick = true;
 | 
			
		||||
 | 
			
		||||
		/* IRC operators & IRCd with OperCanMode enabled
 | 
			
		||||
		 * can kick anyways regardless of privilege */
 | 
			
		||||
		else if(Client_HasMode(Origin, 'o') && Conf_OperCanMode)
 | 
			
		||||
		    can_kick = true;
 | 
			
		||||
 | 
			
		||||
		if(!can_kick) {
 | 
			
		||||
			IRC_WriteErrClient(Origin, ERR_CHANOPPRIVTOOLOW_MSG,
 | 
			
		||||
					   Client_ID(Origin), Name);
 | 
			
		||||
@@ -1048,7 +1044,7 @@ Remove_Client( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, const ch
 | 
			
		||||
	switch( Type )
 | 
			
		||||
	{
 | 
			
		||||
		case REMOVE_QUIT:
 | 
			
		||||
			/* QUIT: other servers have already been notified, 
 | 
			
		||||
			/* QUIT: other servers have already been notified,
 | 
			
		||||
			 * see Client_Destroy(); so only inform other clients
 | 
			
		||||
			 * in same channel. */
 | 
			
		||||
			assert( InformServer == false );
 | 
			
		||||
@@ -1102,29 +1098,29 @@ Remove_Client( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, const ch
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Channel_AddBan(CHANNEL *c, const char *mask )
 | 
			
		||||
Channel_AddBan(CHANNEL *c, const char *mask, const char *who )
 | 
			
		||||
{
 | 
			
		||||
	struct list_head *h = Channel_GetListBans(c);
 | 
			
		||||
	LogDebug("Adding \"%s\" to \"%s\" ban list", mask, Channel_Name(c));
 | 
			
		||||
	return Lists_Add(h, mask, false, NULL);
 | 
			
		||||
	return Lists_Add(h, mask, time(NULL), who, false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Channel_AddExcept(CHANNEL *c, const char *mask )
 | 
			
		||||
Channel_AddExcept(CHANNEL *c, const char *mask, const char *who )
 | 
			
		||||
{
 | 
			
		||||
	struct list_head *h = Channel_GetListExcepts(c);
 | 
			
		||||
	LogDebug("Adding \"%s\" to \"%s\" exception list", mask, Channel_Name(c));
 | 
			
		||||
	return Lists_Add(h, mask, false, NULL);
 | 
			
		||||
	return Lists_Add(h, mask, time(NULL), who, false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Channel_AddInvite(CHANNEL *c, const char *mask, bool onlyonce)
 | 
			
		||||
Channel_AddInvite(CHANNEL *c, const char *mask, bool onlyonce, const char *who )
 | 
			
		||||
{
 | 
			
		||||
	struct list_head *h = Channel_GetListInvites(c);
 | 
			
		||||
	LogDebug("Adding \"%s\" to \"%s\" invite list", mask, Channel_Name(c));
 | 
			
		||||
	return Lists_Add(h, mask, onlyonce, NULL);
 | 
			
		||||
	return Lists_Add(h, mask, time(NULL), who, onlyonce);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -1141,7 +1137,9 @@ ShowChannelList(struct list_head *head, CLIENT *Client, CHANNEL *Channel,
 | 
			
		||||
	while (e) {
 | 
			
		||||
		if (!IRC_WriteStrClient(Client, msg, Client_ID(Client),
 | 
			
		||||
					Channel_Name(Channel),
 | 
			
		||||
					Lists_GetMask(e)))
 | 
			
		||||
					Lists_GetMask(e),
 | 
			
		||||
					Lists_GetReason(e),
 | 
			
		||||
					Lists_GetValidity(e)))
 | 
			
		||||
			return DISCONNECTED;
 | 
			
		||||
		e = Lists_GetNext(e);
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -127,10 +127,10 @@ GLOBAL char *Channel_TopicWho PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
GLOBAL unsigned int Channel_CreationTime PARAMS(( CHANNEL *Chan ));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
GLOBAL bool Channel_AddBan PARAMS((CHANNEL *c, const char *Mask));
 | 
			
		||||
GLOBAL bool Channel_AddExcept PARAMS((CHANNEL *c, const char *Mask));
 | 
			
		||||
GLOBAL bool Channel_AddBan PARAMS((CHANNEL *c, const char *Mask, const char *who));
 | 
			
		||||
GLOBAL bool Channel_AddExcept PARAMS((CHANNEL *c, const char *Mask, const char *who));
 | 
			
		||||
GLOBAL bool Channel_AddInvite PARAMS((CHANNEL *c, const char *Mask,
 | 
			
		||||
				      bool OnlyOnce));
 | 
			
		||||
				      bool OnlyOnce, const char *who));
 | 
			
		||||
 | 
			
		||||
GLOBAL bool Channel_ShowBans PARAMS((CLIENT *client, CHANNEL *c));
 | 
			
		||||
GLOBAL bool Channel_ShowExcepts PARAMS((CLIENT *client, CHANNEL *c));
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -16,19 +16,13 @@
 | 
			
		||||
 * User class management.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "array.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "client.h"
 | 
			
		||||
#include "lists.h"
 | 
			
		||||
#include "match.h"
 | 
			
		||||
#include "stdio.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "class.h"
 | 
			
		||||
 | 
			
		||||
struct list_head My_Classes[CLASS_COUNT];
 | 
			
		||||
@@ -50,11 +44,13 @@ Class_Exit(void)
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Class_GetMemberReason(const int Class, CLIENT *Client, char *reason, size_t len)
 | 
			
		||||
{
 | 
			
		||||
	char str[COMMAND_LEN] = "listed";
 | 
			
		||||
	char str[COMMAND_LEN];
 | 
			
		||||
 | 
			
		||||
	assert(Class < CLASS_COUNT);
 | 
			
		||||
	assert(Client != NULL);
 | 
			
		||||
 | 
			
		||||
	strlcpy(str, "listed", sizeof(str));
 | 
			
		||||
 | 
			
		||||
	if (!Lists_CheckReason(&My_Classes[Class], Client, str, sizeof(str)))
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
@@ -109,7 +105,7 @@ Class_AddMask(const int Class, const char *Pattern, time_t ValidUntil,
 | 
			
		||||
 | 
			
		||||
	Lists_MakeMask(Pattern, mask, sizeof(mask));
 | 
			
		||||
	return Lists_Add(&My_Classes[Class], mask,
 | 
			
		||||
			 ValidUntil, Reason);
 | 
			
		||||
			 ValidUntil, Reason, false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GLOBAL void
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -18,15 +18,11 @@
 | 
			
		||||
 * Functions to deal with IRC Capabilities
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "client.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "client-cap.h"
 | 
			
		||||
 | 
			
		||||
GLOBAL int
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -18,22 +18,16 @@
 | 
			
		||||
 * Client management.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <strings.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
#include <netdb.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "client.h"
 | 
			
		||||
 | 
			
		||||
#include <imp.h>
 | 
			
		||||
#include "ngircd.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
#include "conf.h"
 | 
			
		||||
@@ -44,8 +38,6 @@
 | 
			
		||||
#include "match.h"
 | 
			
		||||
#include "messages.h"
 | 
			
		||||
 | 
			
		||||
#include <exp.h>
 | 
			
		||||
 | 
			
		||||
#define GETID_LEN (CLIENT_NICK_LEN-1) + 1 + (CLIENT_USER_LEN-1) + 1 + (CLIENT_HOST_LEN-1) + 1
 | 
			
		||||
 | 
			
		||||
static CLIENT *This_Server, *My_Clients;
 | 
			
		||||
@@ -80,7 +72,7 @@ GLOBAL void
 | 
			
		||||
Client_Init( void )
 | 
			
		||||
{
 | 
			
		||||
	struct hostent *h;
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	This_Server = New_Client_Struct( );
 | 
			
		||||
	if( ! This_Server )
 | 
			
		||||
	{
 | 
			
		||||
@@ -106,7 +98,7 @@ Client_Init( void )
 | 
			
		||||
	Client_SetInfo( This_Server, Conf_ServerInfo );
 | 
			
		||||
 | 
			
		||||
	My_Clients = This_Server;
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	memset( &My_Whowas, 0, sizeof( My_Whowas ));
 | 
			
		||||
} /* Client_Init */
 | 
			
		||||
 | 
			
		||||
@@ -119,7 +111,7 @@ Client_Exit( void )
 | 
			
		||||
 | 
			
		||||
	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;
 | 
			
		||||
	while(c) {
 | 
			
		||||
@@ -236,9 +228,9 @@ GLOBAL void
 | 
			
		||||
Client_Destroy( CLIENT *Client, const char *LogMsg, const char *FwdMsg, bool SendQuit )
 | 
			
		||||
{
 | 
			
		||||
	/* remove a client */
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	CLIENT *last, *c;
 | 
			
		||||
	char msg[LINE_LEN];
 | 
			
		||||
	char msg[COMMAND_LEN];
 | 
			
		||||
	const char *txt;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
@@ -345,7 +337,7 @@ Client_SetHostname( CLIENT *Client, const char *Hostname )
 | 
			
		||||
	assert(Client != NULL);
 | 
			
		||||
	assert(Hostname != NULL);
 | 
			
		||||
 | 
			
		||||
	if (strlen(Conf_CloakHost)) {
 | 
			
		||||
	if (Conf_CloakHost[0]) {
 | 
			
		||||
		char cloak[GETID_LEN];
 | 
			
		||||
 | 
			
		||||
		strlcpy(cloak, Hostname, GETID_LEN);
 | 
			
		||||
@@ -389,7 +381,7 @@ Client_SetID( CLIENT *Client, const char *ID )
 | 
			
		||||
{
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( ID != NULL );
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	strlcpy( Client->id, ID, sizeof( Client->id ));
 | 
			
		||||
 | 
			
		||||
	if (Conf_CloakUserToNick) {
 | 
			
		||||
@@ -435,7 +427,7 @@ Client_SetOrigUser(CLIENT UNUSED *Client, const char UNUSED *User)
 | 
			
		||||
	assert(Client != NULL);
 | 
			
		||||
	assert(User != NULL);
 | 
			
		||||
 | 
			
		||||
#if defined(PAM) && defined(IDENTAUTH)
 | 
			
		||||
#if defined(PAM)
 | 
			
		||||
	strlcpy(Client->orig_user, User, sizeof(Client->orig_user));
 | 
			
		||||
#endif
 | 
			
		||||
} /* Client_SetOrigUser */
 | 
			
		||||
@@ -706,7 +698,7 @@ Client_ID( CLIENT *Client )
 | 
			
		||||
	if(Client->type == CLIENT_USER)
 | 
			
		||||
		assert(strlen(Client->id) < Conf_MaxNickLength);
 | 
			
		||||
#endif
 | 
			
		||||
						   
 | 
			
		||||
 | 
			
		||||
	if( Client->id[0] ) return Client->id;
 | 
			
		||||
	else return "*";
 | 
			
		||||
} /* Client_ID */
 | 
			
		||||
@@ -739,15 +731,7 @@ Client_User( CLIENT *Client )
 | 
			
		||||
 */
 | 
			
		||||
GLOBAL char *
 | 
			
		||||
Client_OrigUser(CLIENT *Client) {
 | 
			
		||||
#ifndef IDENTAUTH
 | 
			
		||||
	char *user = Client->user;
 | 
			
		||||
 | 
			
		||||
	if (user[0] == '~')
 | 
			
		||||
		user++;
 | 
			
		||||
	return user;
 | 
			
		||||
#else
 | 
			
		||||
	return Client->orig_user;
 | 
			
		||||
#endif
 | 
			
		||||
} /* Client_OrigUser */
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -52,8 +52,9 @@ typedef struct _CLIENT
 | 
			
		||||
	char *cloaked;			/* cloaked hostname of the client */
 | 
			
		||||
	char *ipa_text;			/* textual representaton of IP address */
 | 
			
		||||
	char user[CLIENT_USER_LEN];	/* user name ("login") */
 | 
			
		||||
#if defined(PAM) && defined(IDENTAUTH)
 | 
			
		||||
	char orig_user[CLIENT_USER_LEN];/* user name supplied by USER command */
 | 
			
		||||
#if defined(PAM)
 | 
			
		||||
	char orig_user[CLIENT_AUTHUSER_LEN];
 | 
			
		||||
					/* original user name supplied by USER command */
 | 
			
		||||
#endif
 | 
			
		||||
	char info[CLIENT_INFO_LEN];	/* long user name (user) / info text (server) */
 | 
			
		||||
	char modes[CLIENT_MODE_LEN];	/* client modes */
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,7 @@ struct ConnSSL_State {
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
bool	ConnSSL_InitLibrary(void);
 | 
			
		||||
GLOBAL bool ConnSSL_InitLibrary PARAMS((void));
 | 
			
		||||
 | 
			
		||||
#endif /* conf_ssl_h */
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -16,9 +16,7 @@
 | 
			
		||||
 * Configuration management (reading, parsing & validation)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#ifdef PROTOTYPES
 | 
			
		||||
#	include <stdarg.h>
 | 
			
		||||
@@ -29,23 +27,19 @@
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <strings.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <pwd.h>
 | 
			
		||||
#include <grp.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <dirent.h>
 | 
			
		||||
 | 
			
		||||
#include "array.h"
 | 
			
		||||
#include "ngircd.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "match.h"
 | 
			
		||||
#include "tool.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "conf.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -94,10 +88,10 @@ static void Init_Server_Struct PARAMS(( CONF_SERVER *Server ));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_LIBSSL
 | 
			
		||||
#define DEFAULT_CIPHERS		"HIGH:!aNULL:@STRENGTH"
 | 
			
		||||
#define DEFAULT_CIPHERS		"HIGH:!aNULL:@STRENGTH:!SSLv3"
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef HAVE_LIBGNUTLS
 | 
			
		||||
#define DEFAULT_CIPHERS		"SECURE128"
 | 
			
		||||
#define DEFAULT_CIPHERS		"SECURE128:-VERS-SSL3.0"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SSL_SUPPORT
 | 
			
		||||
@@ -216,7 +210,7 @@ ports_puts(array *a)
 | 
			
		||||
 * Parse a comma separated string into an array of port numbers (integers).
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
ports_parse(array *a, int Line, char *Arg)
 | 
			
		||||
ports_parse(array *a, const char *File, int Line, char *Arg)
 | 
			
		||||
{
 | 
			
		||||
	char *ptr;
 | 
			
		||||
	int port;
 | 
			
		||||
@@ -232,10 +226,10 @@ ports_parse(array *a, int Line, char *Arg)
 | 
			
		||||
			port16 = (UINT16) port;
 | 
			
		||||
			if (!array_catb(a, (char*)&port16, sizeof port16))
 | 
			
		||||
				Config_Error(LOG_ERR, "%s, line %d Could not add port number %ld: %s",
 | 
			
		||||
							NGIRCd_ConfFile, Line, port, strerror(errno));
 | 
			
		||||
					     File, Line, port, strerror(errno));
 | 
			
		||||
		} else {
 | 
			
		||||
			Config_Error( LOG_ERR, "%s, line %d (section \"Global\"): Illegal port number %ld!",
 | 
			
		||||
									NGIRCd_ConfFile, Line, port );
 | 
			
		||||
				     File, Line, port );
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		ptr = strtok( NULL, "," );
 | 
			
		||||
@@ -369,9 +363,9 @@ Conf_Test( void )
 | 
			
		||||
		printf("  MotdPhrase = %s\n", array_bytes(&Conf_Motd)
 | 
			
		||||
		       ? (const char*) array_start(&Conf_Motd) : "");
 | 
			
		||||
	}
 | 
			
		||||
#ifndef PAM
 | 
			
		||||
	printf("  Password = %s\n", Conf_ServerPwd);
 | 
			
		||||
#endif
 | 
			
		||||
	printf("  Network = %s\n", Conf_Network);
 | 
			
		||||
	if (!Conf_PAM)
 | 
			
		||||
		printf("  Password = %s\n", Conf_ServerPwd);
 | 
			
		||||
	printf("  PidFile = %s\n", Conf_PidFile);
 | 
			
		||||
	printf("  Ports = ");
 | 
			
		||||
	ports_puts(&Conf_ListenPorts);
 | 
			
		||||
@@ -418,7 +412,7 @@ Conf_Test( void )
 | 
			
		||||
#endif
 | 
			
		||||
	printf("  IncludeDir = %s\n", Conf_IncludeDir);
 | 
			
		||||
	printf("  MorePrivacy = %s\n", yesno_to_str(Conf_MorePrivacy));
 | 
			
		||||
	printf("  NoticeAuth = %s\n", yesno_to_str(Conf_NoticeAuth));
 | 
			
		||||
	printf("  NoticeBeforeRegistration = %s\n", yesno_to_str(Conf_NoticeBeforeRegistration));
 | 
			
		||||
	printf("  OperCanUseMode = %s\n", yesno_to_str(Conf_OperCanMode));
 | 
			
		||||
	printf("  OperChanPAutoOp = %s\n", yesno_to_str(Conf_OperChanPAutoOp));
 | 
			
		||||
	printf("  OperServerMode = %s\n", yesno_to_str(Conf_OperServerMode));
 | 
			
		||||
@@ -533,7 +527,11 @@ Conf_UnsetServer( CONN_ID Idx )
 | 
			
		||||
				/* "Short" connection, enforce "ConnectRetry"
 | 
			
		||||
				 * but randomize it a little bit: 15 seconds. */
 | 
			
		||||
				Conf_Server[i].lasttry =
 | 
			
		||||
#ifdef HAVE_ARC4RANDOM
 | 
			
		||||
					t + (arc4random() % 15);
 | 
			
		||||
#else
 | 
			
		||||
					t + rand() / (RAND_MAX / 15);
 | 
			
		||||
#endif
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -620,6 +618,7 @@ Conf_EnablePassiveServer(const char *Name)
 | 
			
		||||
		    && (Conf_Server[i].port > 0)) {
 | 
			
		||||
			/* BINGO! Enable server */
 | 
			
		||||
			Conf_Server[i].flags &= ~CONF_SFLAG_DISABLED;
 | 
			
		||||
			Conf_Server[i].lasttry = 0;
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -745,6 +744,7 @@ Set_Defaults(bool InitServers)
 | 
			
		||||
	strcpy(Conf_ServerAdminMail, "");
 | 
			
		||||
	snprintf(Conf_ServerInfo, sizeof Conf_ServerInfo, "%s %s",
 | 
			
		||||
		 PACKAGE_NAME, PACKAGE_VERSION);
 | 
			
		||||
	strcpy(Conf_Network, "");
 | 
			
		||||
	free(Conf_ListenAddress);
 | 
			
		||||
	Conf_ListenAddress = NULL;
 | 
			
		||||
	array_free(&Conf_ListenPorts);
 | 
			
		||||
@@ -797,7 +797,7 @@ Set_Defaults(bool InitServers)
 | 
			
		||||
#endif
 | 
			
		||||
	strcpy(Conf_IncludeDir, "");
 | 
			
		||||
	Conf_MorePrivacy = false;
 | 
			
		||||
	Conf_NoticeAuth = false;
 | 
			
		||||
	Conf_NoticeBeforeRegistration = false;
 | 
			
		||||
	Conf_OperCanMode = false;
 | 
			
		||||
	Conf_OperChanPAutoOp = true;
 | 
			
		||||
	Conf_OperServerMode = false;
 | 
			
		||||
@@ -807,8 +807,8 @@ Set_Defaults(bool InitServers)
 | 
			
		||||
	Conf_PAM = false;
 | 
			
		||||
#endif
 | 
			
		||||
	Conf_PAMIsOptional = false;
 | 
			
		||||
#ifdef SYSLOG
 | 
			
		||||
	Conf_ScrubCTCP = false;
 | 
			
		||||
#ifdef SYSLOG
 | 
			
		||||
#ifdef LOG_LOCAL5
 | 
			
		||||
	Conf_SyslogFacility = LOG_LOCAL5;
 | 
			
		||||
#else
 | 
			
		||||
@@ -1048,9 +1048,13 @@ Read_Config(bool TestOnly, bool IsStarting)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ...
 | 
			
		||||
 * Read in and handle a configuration file.
 | 
			
		||||
 *
 | 
			
		||||
 * @param File Name of the configuration file.
 | 
			
		||||
 * @param fd File descriptor already opened for reading.
 | 
			
		||||
 */
 | 
			
		||||
static void Read_Config_File(const char *File, FILE *fd)
 | 
			
		||||
static void
 | 
			
		||||
Read_Config_File(const char *File, FILE *fd)
 | 
			
		||||
{
 | 
			
		||||
	char section[LINE_LEN], str[LINE_LEN], *var, *arg, *ptr;
 | 
			
		||||
	int i, line = 0;
 | 
			
		||||
@@ -1059,7 +1063,7 @@ static void Read_Config_File(const char *File, FILE *fd)
 | 
			
		||||
	/* Read configuration file */
 | 
			
		||||
	section[0] = '\0';
 | 
			
		||||
	while (true) {
 | 
			
		||||
		if (!fgets(str, LINE_LEN, fd))
 | 
			
		||||
		if (!fgets(str, sizeof(str), fd))
 | 
			
		||||
			break;
 | 
			
		||||
		ngt_TrimStr(str);
 | 
			
		||||
		line++;
 | 
			
		||||
@@ -1068,6 +1072,12 @@ static void Read_Config_File(const char *File, FILE *fd)
 | 
			
		||||
		if (str[0] == ';' || str[0] == '#' || str[0] == '\0')
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
		if (strlen(str) >= sizeof(str) - 1) {
 | 
			
		||||
			Config_Error(LOG_WARNING, "%s, line %d too long!",
 | 
			
		||||
				     File, line);
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Is this the beginning of a new section? */
 | 
			
		||||
		if ((str[0] == '[') && (str[strlen(str) - 1] == ']')) {
 | 
			
		||||
			strlcpy(section, str, sizeof(section));
 | 
			
		||||
@@ -1137,7 +1147,7 @@ static void Read_Config_File(const char *File, FILE *fd)
 | 
			
		||||
 | 
			
		||||
			Config_Error(LOG_ERR,
 | 
			
		||||
				     "%s, line %d: Unknown section \"%s\"!",
 | 
			
		||||
				     NGIRCd_ConfFile, line, section);
 | 
			
		||||
				     File, line, section);
 | 
			
		||||
			section[0] = 0x1;
 | 
			
		||||
		}
 | 
			
		||||
		if (section[0] == 0x1)
 | 
			
		||||
@@ -1147,7 +1157,7 @@ static void Read_Config_File(const char *File, FILE *fd)
 | 
			
		||||
		ptr = strchr(str, '=');
 | 
			
		||||
		if (!ptr) {
 | 
			
		||||
			Config_Error(LOG_ERR, "%s, line %d: Syntax error!",
 | 
			
		||||
				     NGIRCd_ConfFile, line);
 | 
			
		||||
				     File, line);
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
		*ptr = '\0';
 | 
			
		||||
@@ -1175,7 +1185,7 @@ static void Read_Config_File(const char *File, FILE *fd)
 | 
			
		||||
		else
 | 
			
		||||
			Config_Error(LOG_ERR,
 | 
			
		||||
				     "%s, line %d: Variable \"%s\" outside section!",
 | 
			
		||||
				     NGIRCd_ConfFile, line, var);
 | 
			
		||||
				     File, line, var);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1207,7 +1217,7 @@ Check_ArgIsTrue(const char *Arg)
 | 
			
		||||
 * @returns	New configured maximum nickname length.
 | 
			
		||||
 */
 | 
			
		||||
static unsigned int
 | 
			
		||||
Handle_MaxNickLength(int Line, const char *Arg)
 | 
			
		||||
Handle_MaxNickLength(const char *File, int Line, const char *Arg)
 | 
			
		||||
{
 | 
			
		||||
	unsigned new;
 | 
			
		||||
 | 
			
		||||
@@ -1215,13 +1225,13 @@ Handle_MaxNickLength(int Line, const char *Arg)
 | 
			
		||||
	if (new > CLIENT_NICK_LEN) {
 | 
			
		||||
		Config_Error(LOG_WARNING,
 | 
			
		||||
			     "%s, line %d: Value of \"MaxNickLength\" exceeds %u!",
 | 
			
		||||
			     NGIRCd_ConfFile, Line, CLIENT_NICK_LEN - 1);
 | 
			
		||||
			     File, Line, CLIENT_NICK_LEN - 1);
 | 
			
		||||
		return CLIENT_NICK_LEN;
 | 
			
		||||
	}
 | 
			
		||||
	if (new < 2) {
 | 
			
		||||
		Config_Error(LOG_WARNING,
 | 
			
		||||
			     "%s, line %d: Value of \"MaxNickLength\" must be at least 1!",
 | 
			
		||||
			     NGIRCd_ConfFile, Line);
 | 
			
		||||
			     File, Line);
 | 
			
		||||
		return 2;
 | 
			
		||||
	}
 | 
			
		||||
	return new;
 | 
			
		||||
@@ -1231,14 +1241,14 @@ Handle_MaxNickLength(int Line, const char *Arg)
 | 
			
		||||
 * Output a warning messages if IDENT is configured but not compiled in.
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
WarnIdent(int UNUSED Line)
 | 
			
		||||
WarnIdent(const char UNUSED *File, int UNUSED Line)
 | 
			
		||||
{
 | 
			
		||||
#ifndef IDENTAUTH
 | 
			
		||||
	if (Conf_Ident) {
 | 
			
		||||
		/* user has enabled ident lookups explicitly, but ... */
 | 
			
		||||
		Config_Error(LOG_WARNING,
 | 
			
		||||
			"%s: line %d: \"Ident = yes\", but ngircd was built without IDENT support!",
 | 
			
		||||
			NGIRCd_ConfFile, Line);
 | 
			
		||||
			File, Line);
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
@@ -1247,14 +1257,14 @@ WarnIdent(int UNUSED Line)
 | 
			
		||||
 * Output a warning messages if IPv6 is configured but not compiled in.
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
WarnIPv6(int UNUSED Line)
 | 
			
		||||
WarnIPv6(const char UNUSED *File, int UNUSED Line)
 | 
			
		||||
{
 | 
			
		||||
#ifndef WANT_IPV6
 | 
			
		||||
	if (Conf_ConnectIPv6) {
 | 
			
		||||
		/* user has enabled IPv6 explicitly, but ... */
 | 
			
		||||
		Config_Error(LOG_WARNING,
 | 
			
		||||
			"%s: line %d: \"ConnectIPv6 = yes\", but ngircd was built without IPv6 support!",
 | 
			
		||||
			NGIRCd_ConfFile, Line);
 | 
			
		||||
			File, Line);
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
@@ -1263,13 +1273,13 @@ WarnIPv6(int UNUSED Line)
 | 
			
		||||
 * Output a warning messages if PAM is configured but not compiled in.
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
WarnPAM(int UNUSED Line)
 | 
			
		||||
WarnPAM(const char UNUSED *File, int UNUSED Line)
 | 
			
		||||
{
 | 
			
		||||
#ifndef PAM
 | 
			
		||||
	if (Conf_PAM) {
 | 
			
		||||
		Config_Error(LOG_WARNING,
 | 
			
		||||
			"%s: line %d: \"PAM = yes\", but ngircd was built without PAM support!",
 | 
			
		||||
			NGIRCd_ConfFile, Line);
 | 
			
		||||
			File, Line);
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
@@ -1399,6 +1409,7 @@ Handle_GLOBAL(const char *File, int Line, char *Var, char *Arg )
 | 
			
		||||
	struct group *grp;
 | 
			
		||||
	size_t len;
 | 
			
		||||
	const char *section;
 | 
			
		||||
	char *ptr;
 | 
			
		||||
 | 
			
		||||
	assert(File != NULL);
 | 
			
		||||
	assert(Line > 0);
 | 
			
		||||
@@ -1470,17 +1481,30 @@ Handle_GLOBAL(const char *File, int Line, char *Var, char *Arg )
 | 
			
		||||
		len = strlen(Arg);
 | 
			
		||||
		if (len == 0)
 | 
			
		||||
			return;
 | 
			
		||||
		if (len >= LINE_LEN) {
 | 
			
		||||
		if (len >= 127) {
 | 
			
		||||
			Config_Error_TooLong(File, Line, Var);
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		if (!array_copyb(&Conf_Motd, Arg, len + 1))
 | 
			
		||||
			Config_Error(LOG_WARNING,
 | 
			
		||||
				     "%s, line %d: Could not append MotdPhrase: %s",
 | 
			
		||||
				     NGIRCd_ConfFile, Line, strerror(errno));
 | 
			
		||||
				     File, Line, strerror(errno));
 | 
			
		||||
		Using_MotdFile = false;
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if (strcasecmp(Var, "Network") == 0) {
 | 
			
		||||
		len = strlcpy(Conf_Network, Arg, sizeof(Conf_Network));
 | 
			
		||||
		if (len >= sizeof(Conf_Network))
 | 
			
		||||
			Config_Error_TooLong(File, Line, Var);
 | 
			
		||||
		ptr = strchr(Conf_Network, ' ');
 | 
			
		||||
		if (ptr) {
 | 
			
		||||
			Config_Error(LOG_WARNING,
 | 
			
		||||
				     "%s, line %d: \"Network\" can't contain spaces!",
 | 
			
		||||
				     File, Line);
 | 
			
		||||
			*ptr = '\0';
 | 
			
		||||
		}
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if(strcasecmp(Var, "Password") == 0) {
 | 
			
		||||
		len = strlcpy(Conf_ServerPwd, Arg, sizeof(Conf_ServerPwd));
 | 
			
		||||
		if (len >= sizeof(Conf_ServerPwd))
 | 
			
		||||
@@ -1494,7 +1518,7 @@ Handle_GLOBAL(const char *File, int Line, char *Var, char *Arg )
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if (strcasecmp(Var, "Ports") == 0) {
 | 
			
		||||
		ports_parse(&Conf_ListenPorts, Line, Arg);
 | 
			
		||||
		ports_parse(&Conf_ListenPorts, File, Line, Arg);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if (strcasecmp(Var, "ServerGID") == 0) {
 | 
			
		||||
@@ -1506,7 +1530,7 @@ Handle_GLOBAL(const char *File, int Line, char *Var, char *Arg )
 | 
			
		||||
			if (!Conf_GID && strcmp(Arg, "0"))
 | 
			
		||||
				Config_Error(LOG_WARNING,
 | 
			
		||||
					     "%s, line %d: Value of \"%s\" is not a valid group name or ID!",
 | 
			
		||||
					     NGIRCd_ConfFile, Line, Var);
 | 
			
		||||
					     File, Line, Var);
 | 
			
		||||
		}
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
@@ -1519,7 +1543,7 @@ Handle_GLOBAL(const char *File, int Line, char *Var, char *Arg )
 | 
			
		||||
			if (!Conf_UID && strcmp(Arg, "0"))
 | 
			
		||||
				Config_Error(LOG_WARNING,
 | 
			
		||||
					     "%s, line %d: Value of \"%s\" is not a valid user name or ID!",
 | 
			
		||||
					     NGIRCd_ConfFile, Line, Var);
 | 
			
		||||
					     File, Line, Var);
 | 
			
		||||
		}
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
@@ -1530,11 +1554,11 @@ Handle_GLOBAL(const char *File, int Line, char *Var, char *Arg )
 | 
			
		||||
		 * after marking it "deprecated"). */
 | 
			
		||||
		Config_Error(LOG_WARNING,
 | 
			
		||||
			     "%s, line %d (section \"Global\"): \"No\"-Prefix is deprecated, use \"%s = %s\" in [Options] section!",
 | 
			
		||||
			     NGIRCd_ConfFile, Line, NoNo(Var), InvertArg(Arg));
 | 
			
		||||
			     File, Line, NoNo(Var), InvertArg(Arg));
 | 
			
		||||
		if (strcasecmp(Var, "NoIdent") == 0)
 | 
			
		||||
			WarnIdent(Line);
 | 
			
		||||
			WarnIdent(File, Line);
 | 
			
		||||
		else if (strcasecmp(Var, "NoPam") == 0)
 | 
			
		||||
			WarnPAM(Line);
 | 
			
		||||
			WarnPAM(File, Line);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if ((section = CheckLegacyGlobalOption(File, Line, Var, Arg))) {
 | 
			
		||||
@@ -1544,12 +1568,12 @@ Handle_GLOBAL(const char *File, int Line, char *Var, char *Arg )
 | 
			
		||||
		if (strncasecmp(Var, "SSL", 3) == 0) {
 | 
			
		||||
			Config_Error(LOG_WARNING,
 | 
			
		||||
				     "%s, line %d (section \"Global\"): \"%s\" is deprecated here, move it to %s and rename to \"%s\"!",
 | 
			
		||||
				     NGIRCd_ConfFile, Line, Var, section,
 | 
			
		||||
				     File, Line, Var, section,
 | 
			
		||||
				     Var + 3);
 | 
			
		||||
		} else {
 | 
			
		||||
			Config_Error(LOG_WARNING,
 | 
			
		||||
				     "%s, line %d (section \"Global\"): \"%s\" is deprecated here, move it to %s!",
 | 
			
		||||
				     NGIRCd_ConfFile, Line, Var, section);
 | 
			
		||||
				     File, Line, Var, section);
 | 
			
		||||
		}
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
@@ -1577,7 +1601,7 @@ Handle_LIMITS(const char *File, int Line, char *Var, char *Arg)
 | 
			
		||||
		if (Conf_ConnectRetry < 5) {
 | 
			
		||||
			Config_Error(LOG_WARNING,
 | 
			
		||||
				     "%s, line %d: Value of \"ConnectRetry\" too low!",
 | 
			
		||||
				     NGIRCd_ConfFile, Line);
 | 
			
		||||
				     File, Line);
 | 
			
		||||
			Conf_ConnectRetry = 5;
 | 
			
		||||
		}
 | 
			
		||||
		return;
 | 
			
		||||
@@ -1607,7 +1631,7 @@ Handle_LIMITS(const char *File, int Line, char *Var, char *Arg)
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if (strcasecmp(Var, "MaxNickLength") == 0) {
 | 
			
		||||
		Conf_MaxNickLength = Handle_MaxNickLength(Line, Arg);
 | 
			
		||||
		Conf_MaxNickLength = Handle_MaxNickLength(File, Line, Arg);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if (strcasecmp(Var, "MaxListSize") == 0) {
 | 
			
		||||
@@ -1621,7 +1645,7 @@ Handle_LIMITS(const char *File, int Line, char *Var, char *Arg)
 | 
			
		||||
		if (Conf_PingTimeout < 5) {
 | 
			
		||||
			Config_Error(LOG_WARNING,
 | 
			
		||||
				     "%s, line %d: Value of \"PingTimeout\" too low!",
 | 
			
		||||
				     NGIRCd_ConfFile, Line);
 | 
			
		||||
				     File, Line);
 | 
			
		||||
			Conf_PingTimeout = 5;
 | 
			
		||||
		}
 | 
			
		||||
		return;
 | 
			
		||||
@@ -1631,7 +1655,7 @@ Handle_LIMITS(const char *File, int Line, char *Var, char *Arg)
 | 
			
		||||
		if (Conf_PongTimeout < 5) {
 | 
			
		||||
			Config_Error(LOG_WARNING,
 | 
			
		||||
				     "%s, line %d: Value of \"PongTimeout\" too low!",
 | 
			
		||||
				     NGIRCd_ConfFile, Line);
 | 
			
		||||
				     File, Line);
 | 
			
		||||
			Conf_PongTimeout = 5;
 | 
			
		||||
		}
 | 
			
		||||
		return;
 | 
			
		||||
@@ -1716,7 +1740,7 @@ Handle_OPTIONS(const char *File, int Line, char *Var, char *Arg)
 | 
			
		||||
	}
 | 
			
		||||
	if (strcasecmp(Var, "ConnectIPv6") == 0) {
 | 
			
		||||
		Conf_ConnectIPv6 = Check_ArgIsTrue(Arg);
 | 
			
		||||
		WarnIPv6(Line);
 | 
			
		||||
		WarnIPv6(File, Line);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if (strcasecmp(Var, "ConnectIPv4") == 0) {
 | 
			
		||||
@@ -1753,7 +1777,7 @@ Handle_OPTIONS(const char *File, int Line, char *Var, char *Arg)
 | 
			
		||||
	}
 | 
			
		||||
	if (strcasecmp(Var, "Ident") == 0) {
 | 
			
		||||
		Conf_Ident = Check_ArgIsTrue(Arg);
 | 
			
		||||
		WarnIdent(Line);
 | 
			
		||||
		WarnIdent(File, Line);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if (strcasecmp(Var, "IncludeDir") == 0) {
 | 
			
		||||
@@ -1773,7 +1797,19 @@ Handle_OPTIONS(const char *File, int Line, char *Var, char *Arg)
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if (strcasecmp(Var, "NoticeAuth") == 0) {
 | 
			
		||||
		Conf_NoticeAuth = Check_ArgIsTrue(Arg);
 | 
			
		||||
		/*
 | 
			
		||||
		 * TODO: This section and support for "NoticeAuth" variable
 | 
			
		||||
		 * could be removed starting with ngIRCd release 24 (one
 | 
			
		||||
		 * release after marking it "deprecated") ...
 | 
			
		||||
		 */
 | 
			
		||||
		Config_Error(LOG_WARNING,
 | 
			
		||||
			     "%s, line %d (section \"Options\"): \"%s\" is deprecated, please use \"NoticeBeforeRegistration\"!",
 | 
			
		||||
			     File, Line, Var);
 | 
			
		||||
		Conf_NoticeBeforeRegistration = Check_ArgIsTrue(Arg);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if (strcasecmp(Var, "NoticeBeforeRegistration") == 0) {
 | 
			
		||||
		Conf_NoticeBeforeRegistration = Check_ArgIsTrue(Arg);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if (strcasecmp(Var, "OperCanUseMode") == 0) {
 | 
			
		||||
@@ -1790,7 +1826,7 @@ Handle_OPTIONS(const char *File, int Line, char *Var, char *Arg)
 | 
			
		||||
	}
 | 
			
		||||
	if (strcasecmp(Var, "PAM") == 0) {
 | 
			
		||||
		Conf_PAM = Check_ArgIsTrue(Arg);
 | 
			
		||||
		WarnPAM(Line);
 | 
			
		||||
		WarnPAM(File, Line);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if (strcasecmp(Var, "PAMIsOptional") == 0 ) {
 | 
			
		||||
@@ -1881,7 +1917,7 @@ Handle_SSL(const char *File, int Line, char *Var, char *Arg)
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if (strcasecmp(Var, "Ports") == 0) {
 | 
			
		||||
		ports_parse(&Conf_SSLOptions.ListenPorts, Line, Arg);
 | 
			
		||||
		ports_parse(&Conf_SSLOptions.ListenPorts, File, Line, Arg);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if (strcasecmp(Var, "CipherList") == 0) {
 | 
			
		||||
@@ -1982,15 +2018,15 @@ Handle_SERVER(const char *File, int Line, char *Var, char *Arg )
 | 
			
		||||
			return;
 | 
			
		||||
 | 
			
		||||
		Config_Error(LOG_ERR, "%s, line %d (section \"Server\"): Can't parse IP address \"%s\"",
 | 
			
		||||
				NGIRCd_ConfFile, Line, Arg);
 | 
			
		||||
			     File, Line, Arg);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if( strcasecmp( Var, "MyPassword" ) == 0 ) {
 | 
			
		||||
		/* Password of this server which is sent to the peer */
 | 
			
		||||
		if (*Arg == ':') {
 | 
			
		||||
			Config_Error(LOG_ERR,
 | 
			
		||||
				"%s, line %d (section \"Server\"): MyPassword must not start with ':'!",
 | 
			
		||||
										NGIRCd_ConfFile, Line);
 | 
			
		||||
				     "%s, line %d (section \"Server\"): MyPassword must not start with ':'!",
 | 
			
		||||
				     File, Line);
 | 
			
		||||
		}
 | 
			
		||||
		len = strlcpy( New_Server.pwd_in, Arg, sizeof( New_Server.pwd_in ));
 | 
			
		||||
		if (len >= sizeof( New_Server.pwd_in ))
 | 
			
		||||
@@ -2011,8 +2047,8 @@ Handle_SERVER(const char *File, int Line, char *Var, char *Arg )
 | 
			
		||||
			New_Server.port = (UINT16)port;
 | 
			
		||||
		else
 | 
			
		||||
			Config_Error(LOG_ERR,
 | 
			
		||||
				"%s, line %d (section \"Server\"): Illegal port number %ld!",
 | 
			
		||||
				NGIRCd_ConfFile, Line, port );
 | 
			
		||||
				     "%s, line %d (section \"Server\"): Illegal port number %ld!",
 | 
			
		||||
				     File, Line, port );
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
#ifdef SSL_SUPPORT
 | 
			
		||||
@@ -2233,7 +2269,7 @@ Validate_Config(bool Configtest, bool Rehash)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#ifdef PAM
 | 
			
		||||
	if (Conf_ServerPwd[0])
 | 
			
		||||
	if (Conf_PAM && Conf_ServerPwd[0])
 | 
			
		||||
		Config_Error(LOG_ERR,
 | 
			
		||||
			     "This server uses PAM, \"Password\" in [Global] section will be ignored!");
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -109,6 +109,9 @@ GLOBAL char Conf_ServerAdmin1[CLIENT_INFO_LEN];
 | 
			
		||||
GLOBAL char Conf_ServerAdmin2[CLIENT_INFO_LEN];
 | 
			
		||||
GLOBAL char Conf_ServerAdminMail[CLIENT_INFO_LEN];
 | 
			
		||||
 | 
			
		||||
/** Network name (optional, no spaces allowed) */
 | 
			
		||||
GLOBAL char Conf_Network[CLIENT_INFO_LEN];
 | 
			
		||||
 | 
			
		||||
/** Message of the day (MOTD) of this server */
 | 
			
		||||
GLOBAL array Conf_Motd;
 | 
			
		||||
 | 
			
		||||
@@ -191,8 +194,8 @@ GLOBAL bool Conf_Ident;
 | 
			
		||||
/** Enable "more privacy" mode and "censor" some user-related information */
 | 
			
		||||
GLOBAL bool Conf_MorePrivacy;
 | 
			
		||||
 | 
			
		||||
/** Enable NOTICE AUTH messages on connect */
 | 
			
		||||
GLOBAL bool Conf_NoticeAuth;
 | 
			
		||||
/** Enable "NOTICE *" messages on connect */
 | 
			
		||||
GLOBAL bool Conf_NoticeBeforeRegistration;
 | 
			
		||||
 | 
			
		||||
/** Enable all usage of PAM, even when compiled with support for it */
 | 
			
		||||
GLOBAL bool Conf_PAM;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -20,25 +20,21 @@
 | 
			
		||||
 * Functions to deal with character encodings and conversions
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <strings.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "conn-encoding.h"
 | 
			
		||||
 | 
			
		||||
#ifdef ICONV
 | 
			
		||||
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "conn-encoding.h"
 | 
			
		||||
 | 
			
		||||
char Encoding_Buffer[COMMAND_LEN];
 | 
			
		||||
 | 
			
		||||
char *Convert_Message PARAMS((iconv_t Handle, char *Message));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Set client character encoding on a connection.
 | 
			
		||||
 *
 | 
			
		||||
@@ -125,7 +121,7 @@ Convert_Message(iconv_t Handle, char *Message)
 | 
			
		||||
	if (iconv(Handle, &Message, &in_left, &out, &out_left) == (size_t)(-1)) {
 | 
			
		||||
		/* An error occurred! */
 | 
			
		||||
		LogDebug("Error converting message encoding!");
 | 
			
		||||
		strlcpy(Encoding_Buffer, Message, sizeof(Encoding_Buffer));
 | 
			
		||||
		strlcpy(out, Message, sizeof(Encoding_Buffer));
 | 
			
		||||
		iconv(Handle, NULL, NULL, NULL, NULL);
 | 
			
		||||
	} else
 | 
			
		||||
		*out = '\0';
 | 
			
		||||
@@ -133,7 +129,7 @@ Convert_Message(iconv_t Handle, char *Message)
 | 
			
		||||
	return Encoding_Buffer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
#endif /* ICONV */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Convert encoding of a message received from a connection.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2008 Alexander Barton (alex@barton.de)
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -18,18 +18,16 @@
 | 
			
		||||
 * Connection management: Global functions
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include <time.h>
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
# include "log.h"
 | 
			
		||||
#endif
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "client.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "conn-func.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Update "idle timestamp", the time of the last visible user action
 | 
			
		||||
 * (e. g. like sending messages, joining or leaving channels).
 | 
			
		||||
@@ -73,7 +71,6 @@ Conn_GetIdle( CONN_ID Idx )
 | 
			
		||||
	return time( NULL ) - My_Connections[Idx].lastprivmsg;
 | 
			
		||||
} /* Conn_GetIdle */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL time_t
 | 
			
		||||
Conn_LastPing( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
@@ -81,7 +78,6 @@ Conn_LastPing( CONN_ID Idx )
 | 
			
		||||
	return My_Connections[Idx].lastping;
 | 
			
		||||
} /* Conn_LastPing */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Add "penalty time" for a connection.
 | 
			
		||||
 *
 | 
			
		||||
@@ -116,7 +112,6 @@ Conn_SetPenalty(CONN_ID Idx, time_t Seconds)
 | 
			
		||||
#endif
 | 
			
		||||
} /* Conn_SetPenalty */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Conn_ClearFlags( void )
 | 
			
		||||
{
 | 
			
		||||
@@ -125,7 +120,6 @@ Conn_ClearFlags( void )
 | 
			
		||||
	for( i = 0; i < Pool_Size; i++ ) My_Connections[i].flag = 0;
 | 
			
		||||
} /* Conn_ClearFlags */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL int
 | 
			
		||||
Conn_Flag( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
@@ -133,7 +127,6 @@ Conn_Flag( CONN_ID Idx )
 | 
			
		||||
	return My_Connections[Idx].flag;
 | 
			
		||||
} /* Conn_Flag */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Conn_SetFlag( CONN_ID Idx, int Flag )
 | 
			
		||||
{
 | 
			
		||||
@@ -141,12 +134,11 @@ Conn_SetFlag( CONN_ID Idx, int Flag )
 | 
			
		||||
	My_Connections[Idx].flag = Flag;
 | 
			
		||||
} /* Conn_SetFlag */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CONN_ID
 | 
			
		||||
Conn_First( void )
 | 
			
		||||
{
 | 
			
		||||
	CONN_ID i;
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	for( i = 0; i < Pool_Size; i++ )
 | 
			
		||||
	{
 | 
			
		||||
		if( My_Connections[i].sock != NONE ) return i;
 | 
			
		||||
@@ -154,14 +146,13 @@ Conn_First( void )
 | 
			
		||||
	return NONE;
 | 
			
		||||
} /* Conn_First */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL CONN_ID
 | 
			
		||||
Conn_Next( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
	CONN_ID i = NONE;
 | 
			
		||||
 | 
			
		||||
	assert( Idx > NONE );
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	for( i = Idx + 1; i < Pool_Size; i++ )
 | 
			
		||||
	{
 | 
			
		||||
		if( My_Connections[i].sock != NONE ) return i;
 | 
			
		||||
@@ -169,7 +160,6 @@ Conn_Next( CONN_ID Idx )
 | 
			
		||||
	return NONE;
 | 
			
		||||
} /* Conn_Next */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL UINT16
 | 
			
		||||
Conn_Options( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
@@ -177,7 +167,6 @@ Conn_Options( CONN_ID Idx )
 | 
			
		||||
	return My_Connections[Idx].options;
 | 
			
		||||
} /* Conn_Options */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Set connection option.
 | 
			
		||||
 */
 | 
			
		||||
@@ -188,7 +177,6 @@ Conn_SetOption(CONN_ID Idx, int Option)
 | 
			
		||||
	Conn_OPTION_ADD(&My_Connections[Idx], Option);
 | 
			
		||||
} /* Conn_SetOption */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Get the start time of the connection.
 | 
			
		||||
 * The result is the start time in seconds since 1970-01-01, as reported
 | 
			
		||||
@@ -224,7 +212,6 @@ Conn_SendQ( CONN_ID Idx )
 | 
			
		||||
	return array_bytes(&My_Connections[Idx].wbuf);
 | 
			
		||||
} /* Conn_SendQ */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * return number of messages sent on this connection so far
 | 
			
		||||
 */
 | 
			
		||||
@@ -236,7 +223,6 @@ Conn_SendMsg( CONN_ID Idx )
 | 
			
		||||
	return My_Connections[Idx].msg_out;
 | 
			
		||||
} /* Conn_SendMsg */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * return number of (uncompressed) bytes sent
 | 
			
		||||
 * on this connection so far
 | 
			
		||||
@@ -248,7 +234,6 @@ Conn_SendBytes( CONN_ID Idx )
 | 
			
		||||
	return My_Connections[Idx].bytes_out;
 | 
			
		||||
} /* Conn_SendBytes */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * return number of bytes pending in read buffer
 | 
			
		||||
 */
 | 
			
		||||
@@ -264,7 +249,6 @@ Conn_RecvQ( CONN_ID Idx )
 | 
			
		||||
	return array_bytes(&My_Connections[Idx].rbuf);
 | 
			
		||||
} /* Conn_RecvQ */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * return number of messages received on this connection so far
 | 
			
		||||
 */
 | 
			
		||||
@@ -275,7 +259,6 @@ Conn_RecvMsg( CONN_ID Idx )
 | 
			
		||||
	return My_Connections[Idx].msg_in;
 | 
			
		||||
} /* Conn_RecvMsg */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * return number of (uncompressed) bytes received on this
 | 
			
		||||
 * connection so far
 | 
			
		||||
@@ -297,19 +280,16 @@ Conn_IPA(CONN_ID Idx)
 | 
			
		||||
	return ng_ipaddr_tostr(&My_Connections[Idx].addr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL void
 | 
			
		||||
Conn_ResetWCounter( void )
 | 
			
		||||
{
 | 
			
		||||
	WCounter = 0;
 | 
			
		||||
} /* Conn_ResetWCounter */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL long
 | 
			
		||||
Conn_WCounter( void )
 | 
			
		||||
{
 | 
			
		||||
	return WCounter;
 | 
			
		||||
} /* Conn_WCounter */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* -eof- */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,13 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c) 2005-2008 Florian Westphal <fw@strlen.de>
 | 
			
		||||
 * Copyright (c)2005-2008 Florian Westphal (fw@strlen.de).
 | 
			
		||||
 * Copyright (c)2008-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
@@ -10,7 +17,6 @@
 | 
			
		||||
 * SSL wrapper functions
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include "conf-ssl.h"
 | 
			
		||||
 | 
			
		||||
#ifdef SSL_SUPPORT
 | 
			
		||||
@@ -29,7 +35,6 @@
 | 
			
		||||
#include "conn-ssl.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
 | 
			
		||||
extern struct SSLOptions Conf_SSLOptions;
 | 
			
		||||
@@ -312,6 +317,7 @@ ConnSSL_InitLibrary( void )
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	SSL_CTX_set_session_id_context(newctx, (unsigned char *)"ngircd", 6);
 | 
			
		||||
	SSL_CTX_set_options(newctx, SSL_OP_SINGLE_DH_USE|SSL_OP_NO_SSLv2);
 | 
			
		||||
	SSL_CTX_set_mode(newctx, SSL_MODE_ENABLE_PARTIAL_WRITE);
 | 
			
		||||
	SSL_CTX_set_verify(newctx, SSL_VERIFY_PEER|SSL_VERIFY_CLIENT_ONCE,
 | 
			
		||||
@@ -739,7 +745,7 @@ ConnSSL_InitCertFp( CONNECTION *c )
 | 
			
		||||
		gnutls_x509_crt_deinit(cert);
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	if (gnutls_x509_crt_import(cert, &cert_list[0],
 | 
			
		||||
				   GNUTLS_X509_FMT_DER) != GNUTLS_E_SUCCESS) {
 | 
			
		||||
		gnutls_x509_crt_deinit(cert);
 | 
			
		||||
@@ -906,5 +912,3 @@ ConnSSL_InitLibrary(void)
 | 
			
		||||
 | 
			
		||||
#endif /* SSL_SUPPORT */
 | 
			
		||||
/* -eof- */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2007 Alexander Barton (alex@barton.de)
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -9,6 +9,8 @@
 | 
			
		||||
 * Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define CONN_MODULE
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -16,14 +18,11 @@
 | 
			
		||||
 * Connection compression using ZLIB
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define CONN_MODULE
 | 
			
		||||
/* Additionan debug messages related to ZIP compression: 0=off / 1=on */
 | 
			
		||||
#define DEBUG_ZIP 0
 | 
			
		||||
 | 
			
		||||
#ifdef ZLIB
 | 
			
		||||
 | 
			
		||||
/* enable more zlib related debug messages: */
 | 
			
		||||
/* #define DEBUG_ZLIB */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <zlib.h>
 | 
			
		||||
@@ -31,9 +30,8 @@
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "conn-func.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
 | 
			
		||||
#include "array.h"
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
 | 
			
		||||
#include "conn-zip.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -143,7 +141,7 @@ Zip_Flush( CONN_ID Idx )
 | 
			
		||||
	out->next_out = zipbuf;
 | 
			
		||||
	out->avail_out = (uInt)sizeof zipbuf;
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG_ZIP
 | 
			
		||||
#if DEBUG_ZIP
 | 
			
		||||
	Log(LOG_DEBUG, "out->avail_in %d, out->avail_out %d",
 | 
			
		||||
		out->avail_in, out->avail_out);
 | 
			
		||||
#endif
 | 
			
		||||
@@ -166,7 +164,7 @@ Zip_Flush( CONN_ID Idx )
 | 
			
		||||
	assert(out->avail_out <= WRITEBUFFER_SLINK_LEN);
 | 
			
		||||
 | 
			
		||||
	zipbuf_used = WRITEBUFFER_SLINK_LEN - out->avail_out;
 | 
			
		||||
#ifdef DEBUG_ZIP
 | 
			
		||||
#if DEBUG_ZIP
 | 
			
		||||
	Log(LOG_DEBUG, "zipbuf_used: %d", zipbuf_used);
 | 
			
		||||
#endif
 | 
			
		||||
	if (!array_catb(&My_Connections[Idx].wbuf,
 | 
			
		||||
@@ -177,7 +175,7 @@ Zip_Flush( CONN_ID Idx )
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	My_Connections[Idx].bytes_out += zipbuf_used;
 | 
			
		||||
	My_Connections[Idx].zip.bytes_out += array_bytes(&My_Connections[Idx].zip.wbuf); 
 | 
			
		||||
	My_Connections[Idx].zip.bytes_out += array_bytes(&My_Connections[Idx].zip.wbuf);
 | 
			
		||||
	array_trunc(&My_Connections[Idx].zip.wbuf);
 | 
			
		||||
 | 
			
		||||
	return true;
 | 
			
		||||
@@ -200,7 +198,7 @@ Unzip_Buffer( CONN_ID Idx )
 | 
			
		||||
	int unzipbuf_used = 0;
 | 
			
		||||
	unsigned int z_rdatalen;
 | 
			
		||||
	unsigned int in_len;
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	z_stream *in;
 | 
			
		||||
 | 
			
		||||
	assert( Idx > NONE );
 | 
			
		||||
@@ -218,7 +216,7 @@ Unzip_Buffer( CONN_ID Idx )
 | 
			
		||||
	in->next_out = unzipbuf;
 | 
			
		||||
	in->avail_out = (uInt)sizeof unzipbuf;
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG_ZIP
 | 
			
		||||
#if DEBUG_ZIP
 | 
			
		||||
	Log(LOG_DEBUG, "in->avail_in %d, in->avail_out %d",
 | 
			
		||||
		in->avail_in, in->avail_out);
 | 
			
		||||
#endif
 | 
			
		||||
@@ -233,7 +231,7 @@ Unzip_Buffer( CONN_ID Idx )
 | 
			
		||||
	assert(z_rdatalen >= in->avail_in);
 | 
			
		||||
	in_len = z_rdatalen - in->avail_in;
 | 
			
		||||
	unzipbuf_used = READBUFFER_LEN - in->avail_out;
 | 
			
		||||
#ifdef DEBUG_ZIP
 | 
			
		||||
#if DEBUG_ZIP
 | 
			
		||||
	Log(LOG_DEBUG, "unzipbuf_used: %d - %d = %d", READBUFFER_LEN,
 | 
			
		||||
		in->avail_out, unzipbuf_used);
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -36,7 +36,7 @@
 | 
			
		||||
/* Generic buffer sizes */
 | 
			
		||||
 | 
			
		||||
/** Max. length of a line in the configuration file. */
 | 
			
		||||
#define LINE_LEN 256
 | 
			
		||||
#define LINE_LEN 1024
 | 
			
		||||
 | 
			
		||||
/** Max. length of a log message. */
 | 
			
		||||
#define MAX_LOG_MSG_LEN 256
 | 
			
		||||
@@ -53,7 +53,7 @@
 | 
			
		||||
/* Size of structures */
 | 
			
		||||
 | 
			
		||||
/** Max. count of configurable servers. */
 | 
			
		||||
#define MAX_SERVERS 16
 | 
			
		||||
#define MAX_SERVERS 64
 | 
			
		||||
 | 
			
		||||
/** Max. number of WHOWAS list items that can be stored. */
 | 
			
		||||
#define MAX_WHOWAS 64
 | 
			
		||||
@@ -109,6 +109,10 @@
 | 
			
		||||
#else
 | 
			
		||||
# define CLIENT_USER_LEN 10
 | 
			
		||||
#endif
 | 
			
		||||
/** Max. length of user names saved for authentication (used by PAM) */
 | 
			
		||||
#ifdef PAM
 | 
			
		||||
# define CLIENT_AUTHUSER_LEN 64
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/** Max. length of "real names" (including NULL). */
 | 
			
		||||
#define CLIENT_NAME_LEN 32
 | 
			
		||||
@@ -173,7 +177,7 @@
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/** Supported user modes. */
 | 
			
		||||
#define USERMODES "abBcCioqrRswx"
 | 
			
		||||
#define USERMODES "abBcCFiIoqrRswx"
 | 
			
		||||
 | 
			
		||||
/** Supported channel modes. */
 | 
			
		||||
#define CHANMODES "abehiIklmMnoOPqQrRstvVz"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2010 Alexander Barton (alex@barton.de)
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -16,14 +16,12 @@
 | 
			
		||||
 * Hash calculation
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "tool.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "hash.h"
 | 
			
		||||
 | 
			
		||||
static UINT32 jenkins_hash PARAMS((UINT8 *k, UINT32 length, UINT32 initval));
 | 
			
		||||
@@ -37,7 +35,7 @@ static UINT32 jenkins_hash PARAMS((UINT8 *k, UINT32 length, UINT32 initval));
 | 
			
		||||
GLOBAL UINT32
 | 
			
		||||
Hash( const char *String )
 | 
			
		||||
{
 | 
			
		||||
	char buffer[LINE_LEN];
 | 
			
		||||
	char buffer[COMMAND_LEN];
 | 
			
		||||
 | 
			
		||||
	strlcpy(buffer, String, sizeof(buffer));
 | 
			
		||||
	return jenkins_hash((UINT8 *)ngt_LowerStr(buffer),
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,13 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2005-2006 Florian Westphal (westphal@foo.fh-furtwangen.de)
 | 
			
		||||
 * Copyright (c)2006-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2005 Florian Westphal (westphal@foo.fh-furtwangen.de)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
@@ -15,21 +17,20 @@
 | 
			
		||||
 * I/O abstraction interface.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Extra debug messages in event add/delete/callback code: 0=off / 1=on */
 | 
			
		||||
#define DEBUG_IO 0
 | 
			
		||||
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <sys/time.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
 | 
			
		||||
#include "array.h"
 | 
			
		||||
#include "io.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
 | 
			
		||||
/* Enables extra debug messages in event add/delete/callback code. */
 | 
			
		||||
/* #define DEBUG_IO */
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
#ifdef PROTOTYPES
 | 
			
		||||
 void (*callback)(int, short);
 | 
			
		||||
@@ -119,6 +120,7 @@ static bool io_event_change_devpoll(int fd, short what);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef IO_USE_SELECT
 | 
			
		||||
#include <sys/time.h>
 | 
			
		||||
#include "defines.h"	/* for conn.h */
 | 
			
		||||
#include "proc.h"	/* for PROC_STAT (needed by conf.h) */
 | 
			
		||||
#include "conn.h"	/* for CONN_ID (needed by conf.h) */
 | 
			
		||||
@@ -142,7 +144,7 @@ static array io_events;
 | 
			
		||||
 | 
			
		||||
static void io_docallback PARAMS((int fd, short what));
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG_IO
 | 
			
		||||
#if DEBUG_IO
 | 
			
		||||
static void
 | 
			
		||||
io_debug(const char *s, int fd, int what)
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -16,22 +16,19 @@
 | 
			
		||||
 * Handler for IRC capability ("CAP") commands
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <strings.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
#include "client-cap.h"
 | 
			
		||||
#include "irc-macros.h"
 | 
			
		||||
#include "irc-write.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "login.h"
 | 
			
		||||
#include "messages.h"
 | 
			
		||||
#include "parse.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "irc-cap.h"
 | 
			
		||||
 | 
			
		||||
/* Local functions */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2015 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -16,13 +16,11 @@
 | 
			
		||||
 * IRC channel commands
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
#include "conn-func.h"
 | 
			
		||||
@@ -37,7 +35,6 @@
 | 
			
		||||
#include "irc-write.h"
 | 
			
		||||
#include "conf.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "irc-channel.h"
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -323,11 +320,9 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	channame = strtok_r(channame, ",", &lastchan);
 | 
			
		||||
 | 
			
		||||
	/* Make sure that "channame" is not the empty string ("JOIN :") */
 | 
			
		||||
	if (!channame) {
 | 
			
		||||
		IRC_SetPenalty(Client, 2);
 | 
			
		||||
	if (!channame)
 | 
			
		||||
		return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
					  Client_ID(Client), Req->command);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while (channame) {
 | 
			
		||||
		flags = NULL;
 | 
			
		||||
@@ -447,15 +442,13 @@ IRC_PART(CLIENT * Client, REQUEST * Req)
 | 
			
		||||
	chan = strtok(Req->argv[0], ",");
 | 
			
		||||
 | 
			
		||||
	/* Make sure that "chan" is not the empty string ("PART :") */
 | 
			
		||||
	if (!chan) {
 | 
			
		||||
		IRC_SetPenalty(Client, 2);
 | 
			
		||||
	if (!chan)
 | 
			
		||||
		return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
					  Client_ID(Client), Req->command);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while (chan) {
 | 
			
		||||
		Channel_Part(target, Client, chan,
 | 
			
		||||
			     Req->argc > 1 ? Req->argv[1] : Client_ID(target));
 | 
			
		||||
			     Req->argc > 1 ? Req->argv[1] : "");
 | 
			
		||||
		chan = strtok(NULL, ",");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -484,8 +477,6 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty(Client, 1);
 | 
			
		||||
 | 
			
		||||
	_IRC_GET_SENDER_OR_RETURN_(from, Req, Client)
 | 
			
		||||
 | 
			
		||||
	chan = Channel_Search(Req->argv[0]);
 | 
			
		||||
@@ -582,8 +573,6 @@ IRC_LIST( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	assert(Client != NULL);
 | 
			
		||||
	assert(Req != NULL);
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty(Client, 2);
 | 
			
		||||
 | 
			
		||||
	_IRC_GET_SENDER_OR_RETURN_(from, Req, Client)
 | 
			
		||||
 | 
			
		||||
	if (Req->argc > 0)
 | 
			
		||||
@@ -608,6 +597,10 @@ IRC_LIST( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Send list head */
 | 
			
		||||
	if (!IRC_WriteStrClient(from, RPL_LISTSTART_MSG, Client_ID(from)))
 | 
			
		||||
		return DISCONNECTED;
 | 
			
		||||
 | 
			
		||||
	while (pattern) {
 | 
			
		||||
		/* Loop through all the channels */
 | 
			
		||||
		if (Req->argc > 0)
 | 
			
		||||
@@ -619,9 +612,7 @@ IRC_LIST( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
				/* Gotcha! */
 | 
			
		||||
				if (!Channel_HasMode(chan, 's')
 | 
			
		||||
				    || Channel_IsMemberOf(chan, from)
 | 
			
		||||
				    || (!Conf_MorePrivacy
 | 
			
		||||
					&& Client_HasMode(Client, 'o')
 | 
			
		||||
					&& Client_Conn(Client) > NONE))
 | 
			
		||||
				    || Client_HasMode(from, 'o'))
 | 
			
		||||
				{
 | 
			
		||||
					if ((Conf_MaxListSize > 0)
 | 
			
		||||
					    && IRC_CheckListTooBig(from, count,
 | 
			
		||||
@@ -669,11 +660,9 @@ IRC_CHANINFO( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
 | 
			
		||||
	/* Bad number of parameters? */
 | 
			
		||||
	if (Req->argc < 2 || Req->argc == 4 || Req->argc > 5) {
 | 
			
		||||
		IRC_SetPenalty(Client, 2);
 | 
			
		||||
	if (Req->argc < 2 || Req->argc == 4 || Req->argc > 5)
 | 
			
		||||
		return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
					  Client_ID(Client), Req->command);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Compatibility kludge */
 | 
			
		||||
	if (Req->argc == 5)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -16,7 +16,8 @@
 | 
			
		||||
 * IRC encoding commands
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#ifdef ICONV
 | 
			
		||||
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
@@ -28,11 +29,8 @@
 | 
			
		||||
#include "parse.h"
 | 
			
		||||
#include "tool.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "irc-encoding.h"
 | 
			
		||||
 | 
			
		||||
#ifdef ICONV
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Handler for the IRC+ "CHARCONV" command.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -16,13 +16,12 @@
 | 
			
		||||
 * IRC info commands
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <strings.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
 | 
			
		||||
#include "ngircd.h"
 | 
			
		||||
#include "conn-func.h"
 | 
			
		||||
@@ -30,12 +29,9 @@
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
#include "class.h"
 | 
			
		||||
#include "conf.h"
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "lists.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "messages.h"
 | 
			
		||||
#include "match.h"
 | 
			
		||||
#include "tool.h"
 | 
			
		||||
#include "parse.h"
 | 
			
		||||
#include "irc.h"
 | 
			
		||||
#include "irc-macros.h"
 | 
			
		||||
@@ -43,7 +39,6 @@
 | 
			
		||||
#include "client-cap.h"
 | 
			
		||||
#include "op.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "irc-info.h"
 | 
			
		||||
 | 
			
		||||
/* Local functions */
 | 
			
		||||
@@ -152,8 +147,6 @@ IRC_WHO_Channel(CLIENT *Client, CHANNEL *Chan, bool OnlyOps)
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Chan != NULL );
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty(Client, 1);
 | 
			
		||||
 | 
			
		||||
	is_member = Channel_IsMemberOf(Chan, Client);
 | 
			
		||||
 | 
			
		||||
	/* Secret channel? */
 | 
			
		||||
@@ -169,7 +162,7 @@ IRC_WHO_Channel(CLIENT *Client, CHANNEL *Chan, bool OnlyOps)
 | 
			
		||||
		if (OnlyOps && !is_ircop)
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
		is_visible = Client_HasMode(c, 'i');
 | 
			
		||||
		is_visible = !Client_HasMode(c, 'i');
 | 
			
		||||
		if (is_member || is_visible) {
 | 
			
		||||
			memset(flags, 0, sizeof(flags));
 | 
			
		||||
 | 
			
		||||
@@ -191,7 +184,7 @@ IRC_WHO_Channel(CLIENT *Client, CHANNEL *Chan, bool OnlyOps)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* If there are a lot of clients, augment penalty a bit */
 | 
			
		||||
	/* If there are a lot of clients, increase the penalty a bit */
 | 
			
		||||
	if (count > MAX_RPL_WHO)
 | 
			
		||||
		IRC_SetPenalty(Client, 1);
 | 
			
		||||
 | 
			
		||||
@@ -320,48 +313,50 @@ IRC_WHOIS_SendReply(CLIENT *Client, CLIENT *from, CLIENT *c)
 | 
			
		||||
				Client_Info(Client_Introducer(c))))
 | 
			
		||||
		return DISCONNECTED;
 | 
			
		||||
 | 
			
		||||
	/* Channels */
 | 
			
		||||
	snprintf(str, sizeof(str), RPL_WHOISCHANNELS_MSG,
 | 
			
		||||
		 Client_ID(from), Client_ID(c));
 | 
			
		||||
	cl2chan = Channel_FirstChannelOf(c);
 | 
			
		||||
	while (cl2chan) {
 | 
			
		||||
		chan = Channel_GetChannel(cl2chan);
 | 
			
		||||
		assert(chan != NULL);
 | 
			
		||||
	/* Channels, show only if client has no +I or if from is oper */
 | 
			
		||||
	if(!(Client_HasMode(c, 'I')) || Client_HasMode(from, 'o'))  {
 | 
			
		||||
		snprintf(str, sizeof(str), RPL_WHOISCHANNELS_MSG,
 | 
			
		||||
			 Client_ID(from), Client_ID(c));
 | 
			
		||||
		cl2chan = Channel_FirstChannelOf(c);
 | 
			
		||||
		while (cl2chan) {
 | 
			
		||||
			chan = Channel_GetChannel(cl2chan);
 | 
			
		||||
			assert(chan != NULL);
 | 
			
		||||
 | 
			
		||||
		/* next */
 | 
			
		||||
		cl2chan = Channel_NextChannelOf(c, cl2chan);
 | 
			
		||||
			/* next */
 | 
			
		||||
			cl2chan = Channel_NextChannelOf(c, cl2chan);
 | 
			
		||||
 | 
			
		||||
		/* Secret channel? */
 | 
			
		||||
		if (Channel_HasMode(chan, 's')
 | 
			
		||||
		    && !Channel_IsMemberOf(chan, Client))
 | 
			
		||||
			continue;
 | 
			
		||||
			/* Secret channel? */
 | 
			
		||||
			if (Channel_HasMode(chan, 's')
 | 
			
		||||
			    && !Channel_IsMemberOf(chan, Client))
 | 
			
		||||
				continue;
 | 
			
		||||
 | 
			
		||||
		/* Local channel and request is not from a user? */
 | 
			
		||||
		if (Client_Type(Client) == CLIENT_SERVER
 | 
			
		||||
		    && Channel_IsLocal(chan))
 | 
			
		||||
			continue;
 | 
			
		||||
			/* Local channel and request is not from a user? */
 | 
			
		||||
			if (Client_Type(Client) == CLIENT_SERVER
 | 
			
		||||
			    && Channel_IsLocal(chan))
 | 
			
		||||
				continue;
 | 
			
		||||
 | 
			
		||||
		/* Concatenate channel names */
 | 
			
		||||
		if (str[strlen(str) - 1] != ':')
 | 
			
		||||
			strlcat(str, " ", sizeof(str));
 | 
			
		||||
			/* Concatenate channel names */
 | 
			
		||||
			if (str[strlen(str) - 1] != ':')
 | 
			
		||||
				strlcat(str, " ", sizeof(str));
 | 
			
		||||
 | 
			
		||||
		who_flags_qualifier(Client, Channel_UserModes(chan, c),
 | 
			
		||||
				    str, sizeof(str));
 | 
			
		||||
		strlcat(str, Channel_Name(chan), sizeof(str));
 | 
			
		||||
			who_flags_qualifier(Client, Channel_UserModes(chan, c),
 | 
			
		||||
			                    str, sizeof(str));
 | 
			
		||||
			strlcat(str, Channel_Name(chan), sizeof(str));
 | 
			
		||||
 | 
			
		||||
		if (strlen(str) > (COMMAND_LEN - CHANNEL_NAME_LEN - 4)) {
 | 
			
		||||
			/* Line becomes too long: send it! */
 | 
			
		||||
			if (strlen(str) > (COMMAND_LEN - CHANNEL_NAME_LEN - 4)) {
 | 
			
		||||
				/* Line becomes too long: send it! */
 | 
			
		||||
				if (!IRC_WriteStrClient(Client, "%s", str))
 | 
			
		||||
					return DISCONNECTED;
 | 
			
		||||
				snprintf(str, sizeof(str), RPL_WHOISCHANNELS_MSG,
 | 
			
		||||
					 Client_ID(from), Client_ID(c));
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if(str[strlen(str) - 1] != ':') {
 | 
			
		||||
			/* There is data left to send: */
 | 
			
		||||
			if (!IRC_WriteStrClient(Client, "%s", str))
 | 
			
		||||
				return DISCONNECTED;
 | 
			
		||||
			snprintf(str, sizeof(str), RPL_WHOISCHANNELS_MSG,
 | 
			
		||||
				 Client_ID(from), Client_ID(c));
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if(str[strlen(str) - 1] != ':') {
 | 
			
		||||
		/* There is data left to send: */
 | 
			
		||||
		if (!IRC_WriteStrClient(Client, "%s", str))
 | 
			
		||||
			return DISCONNECTED;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* IRC-Services? */
 | 
			
		||||
	if (Client_Type(c) == CLIENT_SERVICE &&
 | 
			
		||||
@@ -403,9 +398,16 @@ IRC_WHOIS_SendReply(CLIENT *Client, CLIENT *from, CLIENT *c)
 | 
			
		||||
				Client_ID(from), Client_ID(c)))
 | 
			
		||||
		return DISCONNECTED;
 | 
			
		||||
 | 
			
		||||
	/* Account name metadata? */
 | 
			
		||||
	if (Client_AccountName(c) &&
 | 
			
		||||
	    !IRC_WriteStrClient(from, RPL_WHOISLOGGEDIN_MSG,
 | 
			
		||||
				Client_ID(from), Client_ID(c),
 | 
			
		||||
				Client_AccountName(c)))
 | 
			
		||||
		return DISCONNECTED;
 | 
			
		||||
 | 
			
		||||
	/* Local client and requester is the user itself or an IRC Op? */
 | 
			
		||||
	if (Client_Conn(c) > NONE &&
 | 
			
		||||
	    (from == c || (!Conf_MorePrivacy && Client_HasMode(from, 'o')))) {
 | 
			
		||||
	    (from == c || Client_HasMode(from, 'o'))) {
 | 
			
		||||
		/* Client hostname */
 | 
			
		||||
		if (!IRC_WriteStrClient(from, RPL_WHOISHOST_MSG,
 | 
			
		||||
					Client_ID(from), Client_ID(c),
 | 
			
		||||
@@ -500,8 +502,6 @@ IRC_ADMIN(CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty(Client, 1);
 | 
			
		||||
 | 
			
		||||
	_IRC_GET_SENDER_OR_RETURN_(prefix, Req, Client)
 | 
			
		||||
	_IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, prefix)
 | 
			
		||||
 | 
			
		||||
@@ -544,8 +544,6 @@ IRC_INFO(CLIENT * Client, REQUEST * Req)
 | 
			
		||||
	assert(Client != NULL);
 | 
			
		||||
	assert(Req != NULL);
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty(Client, 2);
 | 
			
		||||
 | 
			
		||||
	_IRC_GET_SENDER_OR_RETURN_(prefix, Req, Client)
 | 
			
		||||
	_IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, prefix)
 | 
			
		||||
 | 
			
		||||
@@ -560,7 +558,15 @@ IRC_INFO(CLIENT * Client, REQUEST * Req)
 | 
			
		||||
				NGIRCd_Version))
 | 
			
		||||
		return DISCONNECTED;
 | 
			
		||||
 | 
			
		||||
#if defined(__DATE__) && defined(__TIME__)
 | 
			
		||||
#if defined(BIRTHDATE)
 | 
			
		||||
	char t_str[60];
 | 
			
		||||
	time_t t = BIRTHDATE;
 | 
			
		||||
	(void)strftime(t_str, sizeof(t_str), "%a %b %d %Y at %H:%M:%S (%Z)",
 | 
			
		||||
			localtime(&t));
 | 
			
		||||
	snprintf(msg, sizeof(msg), "Birth Date: %s", t_str);
 | 
			
		||||
	if (!IRC_WriteStrClient(Client, RPL_INFO_MSG, Client_ID(prefix), msg))
 | 
			
		||||
		return DISCONNECTED;
 | 
			
		||||
#elif defined(__DATE__) && defined(__TIME__)
 | 
			
		||||
	snprintf(msg, sizeof(msg), "Birth Date: %s at %s", __DATE__, __TIME__);
 | 
			
		||||
	if (!IRC_WriteStrClient(Client, RPL_INFO_MSG, Client_ID(prefix), msg))
 | 
			
		||||
		return DISCONNECTED;
 | 
			
		||||
@@ -631,8 +637,6 @@ IRC_LINKS(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
	assert(Client != NULL);
 | 
			
		||||
	assert(Req != NULL);
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty(Client, 1);
 | 
			
		||||
 | 
			
		||||
	_IRC_GET_SENDER_OR_RETURN_(from, Req, Client)
 | 
			
		||||
 | 
			
		||||
	/* Get pointer to server mask or "*", if none given */
 | 
			
		||||
@@ -685,8 +689,6 @@ IRC_LUSERS( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty(Client, 1);
 | 
			
		||||
 | 
			
		||||
	_IRC_GET_SENDER_OR_RETURN_(from, Req, Client)
 | 
			
		||||
	_IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 1, from)
 | 
			
		||||
 | 
			
		||||
@@ -716,8 +718,6 @@ IRC_SERVLIST(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
	assert(Client != NULL);
 | 
			
		||||
	assert(Req != NULL);
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty(Client, 1);
 | 
			
		||||
 | 
			
		||||
	if (Req->argc < 2 || strcmp(Req->argv[1], "0") == 0) {
 | 
			
		||||
		for (c = Client_First(); c!= NULL; c = Client_Next(c)) {
 | 
			
		||||
			if (Client_Type(c) != CLIENT_SERVICE)
 | 
			
		||||
@@ -753,8 +753,6 @@ IRC_MOTD( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty(Client, 3);
 | 
			
		||||
 | 
			
		||||
	_IRC_GET_SENDER_OR_RETURN_(from, Req, Client)
 | 
			
		||||
	_IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, from)
 | 
			
		||||
 | 
			
		||||
@@ -785,8 +783,6 @@ IRC_NAMES( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty(Client, 1);
 | 
			
		||||
 | 
			
		||||
	_IRC_GET_SENDER_OR_RETURN_(from, Req, Client)
 | 
			
		||||
	_IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 1, from)
 | 
			
		||||
 | 
			
		||||
@@ -871,8 +867,6 @@ IRC_STATS( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	assert(Client != NULL);
 | 
			
		||||
	assert(Req != NULL);
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty(Client, 2);
 | 
			
		||||
 | 
			
		||||
	_IRC_GET_SENDER_OR_RETURN_(from, Req, Client)
 | 
			
		||||
	_IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 1, from)
 | 
			
		||||
 | 
			
		||||
@@ -1013,8 +1007,6 @@ IRC_TIME( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	assert(Client != NULL);
 | 
			
		||||
	assert(Req != NULL);
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty(Client, 1);
 | 
			
		||||
 | 
			
		||||
	_IRC_GET_SENDER_OR_RETURN_(from, Req, Client)
 | 
			
		||||
	_IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, from)
 | 
			
		||||
 | 
			
		||||
@@ -1048,8 +1040,6 @@ IRC_USERHOST(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
	assert(Client != NULL);
 | 
			
		||||
	assert(Req != NULL);
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty(Client, 1);
 | 
			
		||||
 | 
			
		||||
	if (Req->argc > 5)
 | 
			
		||||
		max = 5;
 | 
			
		||||
	else
 | 
			
		||||
@@ -1110,8 +1100,6 @@ IRC_VERSION( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty(Client, 1);
 | 
			
		||||
 | 
			
		||||
	_IRC_GET_SENDER_OR_RETURN_(prefix, Req, Client)
 | 
			
		||||
	_IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, prefix)
 | 
			
		||||
 | 
			
		||||
@@ -1123,10 +1111,19 @@ IRC_VERSION( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* send version information */
 | 
			
		||||
	return IRC_WriteStrClient(Client, RPL_VERSION_MSG, Client_ID(prefix),
 | 
			
		||||
				  PACKAGE_NAME, PACKAGE_VERSION,
 | 
			
		||||
				  NGIRCd_DebugLevel, Conf_ServerName,
 | 
			
		||||
				  NGIRCd_VersionAddition);
 | 
			
		||||
	if (!IRC_WriteStrClient(Client, RPL_VERSION_MSG, Client_ID(prefix),
 | 
			
		||||
				PACKAGE_NAME, PACKAGE_VERSION,
 | 
			
		||||
				NGIRCd_DebugLevel, Conf_ServerName,
 | 
			
		||||
				NGIRCd_VersionAddition))
 | 
			
		||||
		return DISCONNECTED;
 | 
			
		||||
 | 
			
		||||
#ifndef STRICT_RFC
 | 
			
		||||
	/* send RPL_ISUPPORT(005) numerics */
 | 
			
		||||
	if (!IRC_Send_ISUPPORT(prefix))
 | 
			
		||||
		return DISCONNECTED;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	return CONNECTED;
 | 
			
		||||
} /* IRC_VERSION */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -1145,15 +1142,12 @@ IRC_WHO(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
	assert (Client != NULL);
 | 
			
		||||
	assert (Req != NULL);
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty(Client, 1);
 | 
			
		||||
 | 
			
		||||
	only_ops = false;
 | 
			
		||||
	if (Req->argc == 2) {
 | 
			
		||||
		if (strcmp(Req->argv[1], "o") == 0)
 | 
			
		||||
			only_ops = true;
 | 
			
		||||
#ifdef STRICT_RFC
 | 
			
		||||
		else {
 | 
			
		||||
			IRC_SetPenalty(Client, 2);
 | 
			
		||||
			return IRC_WriteErrClient(Client,
 | 
			
		||||
						  ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
						  Client_ID(Client),
 | 
			
		||||
@@ -1177,7 +1171,6 @@ IRC_WHO(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* No channel or (valid) mask given */
 | 
			
		||||
	IRC_SetPenalty(Client, 2);
 | 
			
		||||
	return IRC_WHO_Mask(Client, NULL, only_ops);
 | 
			
		||||
} /* IRC_WHO */
 | 
			
		||||
 | 
			
		||||
@@ -1200,8 +1193,6 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty(Client, 1);
 | 
			
		||||
 | 
			
		||||
	/* Wrong number of parameters? */
 | 
			
		||||
	if (Req->argc < 1)
 | 
			
		||||
		return IRC_WriteErrClient(Client, ERR_NONICKNAMEGIVEN_MSG,
 | 
			
		||||
@@ -1263,6 +1254,7 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
		got_wildcard = true;
 | 
			
		||||
		/* Increase penalty for wildcard queries */
 | 
			
		||||
		IRC_SetPenalty(Client, 3);
 | 
			
		||||
 | 
			
		||||
		for (c = Client_First(); c; c = Client_Next(c)) {
 | 
			
		||||
@@ -1568,6 +1560,10 @@ IRC_Send_NAMES(CLIENT * Client, CHANNEL * Chan)
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_Send_ISUPPORT(CLIENT * Client)
 | 
			
		||||
{
 | 
			
		||||
	if (Conf_Network[0] && !IRC_WriteStrClient(Client, RPL_ISUPPORTNET_MSG,
 | 
			
		||||
						   Client_ID(Client),
 | 
			
		||||
						   Conf_Network))
 | 
			
		||||
		return DISCONNECTED;
 | 
			
		||||
	if (!IRC_WriteStrClient(Client, RPL_ISUPPORT1_MSG, Client_ID(Client),
 | 
			
		||||
				CHANTYPES, CHANTYPES, Conf_MaxJoins))
 | 
			
		||||
		return DISCONNECTED;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2015 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -16,15 +16,14 @@
 | 
			
		||||
 * Login and logout
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <strings.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
 | 
			
		||||
#include "conn-func.h"
 | 
			
		||||
#include "class.h"
 | 
			
		||||
#include "conf.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
@@ -32,11 +31,9 @@
 | 
			
		||||
#include "messages.h"
 | 
			
		||||
#include "parse.h"
 | 
			
		||||
#include "irc.h"
 | 
			
		||||
#include "irc-info.h"
 | 
			
		||||
#include "irc-macros.h"
 | 
			
		||||
#include "irc-write.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "irc-login.h"
 | 
			
		||||
 | 
			
		||||
static void Change_Nick PARAMS((CLIENT * Origin, CLIENT * Target, char *NewNick,
 | 
			
		||||
@@ -80,7 +77,6 @@ IRC_PASS( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	} else if (Client_Type(Client) == CLIENT_UNKNOWN ||
 | 
			
		||||
		   Client_Type(Client) == CLIENT_UNKNOWNSERVER) {
 | 
			
		||||
		/* Unregistered connection, but wrong number of arguments: */
 | 
			
		||||
		IRC_SetPenalty(Client, 2);
 | 
			
		||||
		return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
					  Client_ID(Client), Req->command);
 | 
			
		||||
	} else {
 | 
			
		||||
@@ -176,6 +172,7 @@ GLOBAL bool
 | 
			
		||||
IRC_NICK( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *intr_c, *target, *c;
 | 
			
		||||
	CHANNEL *chan;
 | 
			
		||||
	char *nick, *user, *hostname, *modes, *info;
 | 
			
		||||
	int token, hops;
 | 
			
		||||
 | 
			
		||||
@@ -199,6 +196,7 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
 | 
			
		||||
		/* Search "target" client */
 | 
			
		||||
		if (Client_Type(Client) == CLIENT_SERVER) {
 | 
			
		||||
			_IRC_REQUIRE_PREFIX_OR_RETURN_(Client, Req)
 | 
			
		||||
			target = Client_Search(Req->prefix);
 | 
			
		||||
			if (!target)
 | 
			
		||||
				return IRC_WriteErrClient(Client,
 | 
			
		||||
@@ -242,8 +240,12 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
 | 
			
		||||
#ifndef STRICT_RFC
 | 
			
		||||
			if (Conf_AuthPing) {
 | 
			
		||||
#ifdef HAVE_ARC4RANDOM
 | 
			
		||||
				Conn_SetAuthPing(Client_Conn(Client), arc4random());
 | 
			
		||||
#else
 | 
			
		||||
				Conn_SetAuthPing(Client_Conn(Client), rand());
 | 
			
		||||
				IRC_WriteStrClient(Client, "PING :%ld",
 | 
			
		||||
#endif
 | 
			
		||||
				Conn_WriteStr(Client_Conn(Client), "PING :%ld",
 | 
			
		||||
					Conn_GetAuthPing(Client_Conn(Client)));
 | 
			
		||||
				LogDebug("Connection %d: sent AUTH PING %ld ...",
 | 
			
		||||
					Client_Conn(Client),
 | 
			
		||||
@@ -259,6 +261,22 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
				Client_SetType( Client, CLIENT_GOTNICK );
 | 
			
		||||
		} else {
 | 
			
		||||
			/* Nickname change */
 | 
			
		||||
 | 
			
		||||
			/* Check that the user isn't on any channels set +N */
 | 
			
		||||
			if(Client_Type(Client) == CLIENT_USER &&
 | 
			
		||||
			   !Client_HasMode(Client, 'o')) {
 | 
			
		||||
				chan = Channel_First();
 | 
			
		||||
				while (chan) {
 | 
			
		||||
					if(Channel_HasMode(chan, 'N') &&
 | 
			
		||||
					   Channel_IsMemberOf(chan, Client))
 | 
			
		||||
						return IRC_WriteErrClient(Client,
 | 
			
		||||
									  ERR_NONICKCHANGE_MSG,
 | 
			
		||||
									  Client_ID(Client),
 | 
			
		||||
									  Channel_Name(chan));
 | 
			
		||||
					chan = Channel_Next(chan);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			Change_Nick(Client, target, Req->argv[0],
 | 
			
		||||
				    Client_Type(Client) == CLIENT_USER ? true : false);
 | 
			
		||||
			IRC_SetPenalty(target, 2);
 | 
			
		||||
@@ -270,11 +288,9 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
		/* Server or service introduces new client */
 | 
			
		||||
 | 
			
		||||
		/* Bad number of parameters? */
 | 
			
		||||
		if (Req->argc != 2 && Req->argc != 7) {
 | 
			
		||||
			IRC_SetPenalty(Client, 2);
 | 
			
		||||
		if (Req->argc != 2 && Req->argc != 7)
 | 
			
		||||
			return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
						  Client_ID(Client), Req->command);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (Req->argc >= 7) {
 | 
			
		||||
			/* RFC 2813 compatible syntax */
 | 
			
		||||
@@ -364,6 +380,8 @@ IRC_SVSNICK(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
	assert(Client != NULL);
 | 
			
		||||
	assert(Req != NULL);
 | 
			
		||||
 | 
			
		||||
	_IRC_REQUIRE_PREFIX_OR_RETURN_(Client, Req)
 | 
			
		||||
 | 
			
		||||
	/* Search the originator */
 | 
			
		||||
	from = Client_Search(Req->prefix);
 | 
			
		||||
	if (!from)
 | 
			
		||||
@@ -371,10 +389,9 @@ IRC_SVSNICK(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
 | 
			
		||||
	/* Search the target */
 | 
			
		||||
	target = Client_Search(Req->argv[0]);
 | 
			
		||||
	if (!target || Client_Type(target) != CLIENT_USER) {
 | 
			
		||||
	if (!target || Client_Type(target) != CLIENT_USER)
 | 
			
		||||
		return IRC_WriteErrClient(Client, ERR_NOSUCHNICK_MSG,
 | 
			
		||||
					  Client_ID(Client), Req->argv[0]);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (Client_Conn(target) <= NONE) {
 | 
			
		||||
		/* We have to forward the message to the server handling
 | 
			
		||||
@@ -467,6 +484,7 @@ IRC_USER(CLIENT * Client, REQUEST * Req)
 | 
			
		||||
		   Client_Type(Client) == CLIENT_SERVICE) {
 | 
			
		||||
		/* Server/service updating an user */
 | 
			
		||||
		_IRC_ARGC_EQ_OR_RETURN_(Client, Req, 4)
 | 
			
		||||
		_IRC_REQUIRE_PREFIX_OR_RETURN_(Client, Req)
 | 
			
		||||
 | 
			
		||||
		c = Client_Search(Req->prefix);
 | 
			
		||||
		if (!c)
 | 
			
		||||
@@ -609,7 +627,10 @@ IRC_WEBIRC(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
 | 
			
		||||
	Client_SetUser(Client, Req->argv[1], true);
 | 
			
		||||
	Client_SetOrigUser(Client, Req->argv[1]);
 | 
			
		||||
	Client_SetHostname(Client, Req->argv[2]);
 | 
			
		||||
	if (Conf_DNS)
 | 
			
		||||
		Client_SetHostname(Client, Req->argv[2]);
 | 
			
		||||
	else
 | 
			
		||||
		Client_SetHostname(Client, Req->argv[3]);
 | 
			
		||||
	Client_SetIPAText(Client, Req->argv[3]);
 | 
			
		||||
 | 
			
		||||
	return CONNECTED;
 | 
			
		||||
@@ -626,7 +647,7 @@ GLOBAL bool
 | 
			
		||||
IRC_QUIT( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	CLIENT *target;
 | 
			
		||||
	char quitmsg[LINE_LEN];
 | 
			
		||||
	char quitmsg[COMMAND_LEN];
 | 
			
		||||
 | 
			
		||||
	assert(Client != NULL);
 | 
			
		||||
	assert(Req != NULL);
 | 
			
		||||
@@ -636,6 +657,8 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
 | 
			
		||||
	if (Client_Type(Client) == CLIENT_SERVER) {
 | 
			
		||||
		/* Server */
 | 
			
		||||
		_IRC_REQUIRE_PREFIX_OR_RETURN_(Client, Req)
 | 
			
		||||
 | 
			
		||||
		target = Client_Search(Req->prefix);
 | 
			
		||||
		if (!target) {
 | 
			
		||||
			Log(LOG_WARNING,
 | 
			
		||||
@@ -724,9 +747,10 @@ IRC_PING(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
 | 
			
		||||
		if (target != Client_ThisServer()) {
 | 
			
		||||
			/* Ok, we have to forward the PING */
 | 
			
		||||
			if (Client_Type(Client) == CLIENT_SERVER)
 | 
			
		||||
			if (Client_Type(Client) == CLIENT_SERVER) {
 | 
			
		||||
				_IRC_REQUIRE_PREFIX_OR_RETURN_(Client, Req)
 | 
			
		||||
				from = Client_Search(Req->prefix);
 | 
			
		||||
			else
 | 
			
		||||
			} else
 | 
			
		||||
				from = Client;
 | 
			
		||||
			if (!from)
 | 
			
		||||
				return IRC_WriteErrClient(Client,
 | 
			
		||||
@@ -798,6 +822,8 @@ IRC_PONG(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
 | 
			
		||||
	/* Forward? */
 | 
			
		||||
	if (Req->argc == 2 && Client_Type(Client) == CLIENT_SERVER) {
 | 
			
		||||
		_IRC_REQUIRE_PREFIX_OR_RETURN_(Client, Req)
 | 
			
		||||
 | 
			
		||||
		target = Client_Search(Req->argv[0]);
 | 
			
		||||
		if (!target)
 | 
			
		||||
			return IRC_WriteErrClient(Client, ERR_NOSUCHSERVER_MSG,
 | 
			
		||||
@@ -832,14 +858,14 @@ IRC_PONG(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
	if (auth_ping) {
 | 
			
		||||
		LogDebug("AUTH PONG: waiting for token \"%ld\", got \"%s\" ...",
 | 
			
		||||
			 auth_ping, Req->argv[0]);
 | 
			
		||||
		if (auth_ping == atoi(Req->argv[0])) {
 | 
			
		||||
		if (auth_ping == atol(Req->argv[0])) {
 | 
			
		||||
			Conn_SetAuthPing(conn, 0);
 | 
			
		||||
			if (Client_Type(Client) == CLIENT_WAITAUTHPING)
 | 
			
		||||
				Login_User(Client);
 | 
			
		||||
		} else
 | 
			
		||||
			if (!IRC_WriteStrClient(Client,
 | 
			
		||||
					"To connect, type /QUOTE PONG %ld",
 | 
			
		||||
					auth_ping))
 | 
			
		||||
					"NOTICE %s :To connect, type /QUOTE PONG %ld",
 | 
			
		||||
					Client_ID(Client), auth_ping))
 | 
			
		||||
				return DISCONNECTED;
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2015 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -25,8 +25,7 @@
 | 
			
		||||
 */
 | 
			
		||||
#define _IRC_ARGC_EQ_OR_RETURN_(Client, Req, Count) \
 | 
			
		||||
if (Req->argc != Count) { \
 | 
			
		||||
	IRC_SetPenalty(Client, 2); \
 | 
			
		||||
	return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, \
 | 
			
		||||
	return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, \
 | 
			
		||||
				  Client_ID(Client), Req->command); \
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -38,8 +37,7 @@ if (Req->argc != Count) { \
 | 
			
		||||
 */
 | 
			
		||||
#define _IRC_ARGC_LE_OR_RETURN_(Client, Req, Max) \
 | 
			
		||||
if (Req->argc > Max) { \
 | 
			
		||||
	IRC_SetPenalty(Client, 2); \
 | 
			
		||||
	return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, \
 | 
			
		||||
	return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, \
 | 
			
		||||
				  Client_ID(Client), Req->command); \
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -51,8 +49,7 @@ if (Req->argc > Max) { \
 | 
			
		||||
 */
 | 
			
		||||
#define _IRC_ARGC_GE_OR_RETURN_(Client, Req, Min) \
 | 
			
		||||
if (Req->argc < Min) { \
 | 
			
		||||
	IRC_SetPenalty(Client, 2); \
 | 
			
		||||
	return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, \
 | 
			
		||||
	return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, \
 | 
			
		||||
				  Client_ID(Client), Req->command); \
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -64,8 +61,19 @@ if (Req->argc < Min) { \
 | 
			
		||||
 */
 | 
			
		||||
#define _IRC_ARGC_BETWEEN_OR_RETURN_(Client, Req, Min, Max) \
 | 
			
		||||
if (Req->argc < Min || Req->argc > Max) { \
 | 
			
		||||
	IRC_SetPenalty(Client, 2); \
 | 
			
		||||
	return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, \
 | 
			
		||||
	return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, \
 | 
			
		||||
				  Client_ID(Client), Req->command); \
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Make sure that the command has a prefix.
 | 
			
		||||
 *
 | 
			
		||||
 * If there is no prefix, send an error to the client and return from
 | 
			
		||||
 * the function.
 | 
			
		||||
 */
 | 
			
		||||
#define _IRC_REQUIRE_PREFIX_OR_RETURN_(Client, Req) \
 | 
			
		||||
if (!Req->prefix) { \
 | 
			
		||||
	return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, \
 | 
			
		||||
				  Client_ID(Client), Req->command); \
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -77,13 +85,17 @@ if (Req->argc < Min || Req->argc > Max) { \
 | 
			
		||||
 * send an error to the client and return from the function.
 | 
			
		||||
 */
 | 
			
		||||
#define _IRC_GET_SENDER_OR_RETURN_(Sender, Req, Client) \
 | 
			
		||||
	if (Client_Type(Client) == CLIENT_SERVER) \
 | 
			
		||||
	if (Client_Type(Client) == CLIENT_SERVER) { \
 | 
			
		||||
		if (!Req->prefix) \
 | 
			
		||||
			return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, \
 | 
			
		||||
						  Client_ID(Client), Req->command); \
 | 
			
		||||
		Sender = Client_Search(Req->prefix); \
 | 
			
		||||
	else \
 | 
			
		||||
	} else \
 | 
			
		||||
		Sender = Client; \
 | 
			
		||||
	if (!Sender) \
 | 
			
		||||
		return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, \
 | 
			
		||||
					  Client_ID(Client), Req->prefix);
 | 
			
		||||
		return IRC_WriteErrClient(Client, ERR_NOSUCHNICK_MSG, \
 | 
			
		||||
					  Client_ID(Client), \
 | 
			
		||||
					  Req->prefix ? Req->prefix : "(none)");
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Get target of an IRC command and make sure that it is a server.
 | 
			
		||||
@@ -101,7 +113,7 @@ if (Req->argc < Min || Req->argc > Max) { \
 | 
			
		||||
		if (!Target) \
 | 
			
		||||
			Target = Client_SearchServer(Req->argv[Argc]); \
 | 
			
		||||
		if (!Target) \
 | 
			
		||||
			return IRC_WriteStrClient(From, ERR_NOSUCHSERVER_MSG, \
 | 
			
		||||
			return IRC_WriteErrClient(From, ERR_NOSUCHSERVER_MSG, \
 | 
			
		||||
					  Client_ID(From), Req->argv[Argc]); \
 | 
			
		||||
		if (Client_Type(Target) != CLIENT_SERVER) \
 | 
			
		||||
			Target = Client_Introducer(Target); \
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2015 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -18,21 +18,18 @@
 | 
			
		||||
 * IRC metadata commands
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <strings.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
#include "conn-func.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
#include "conn-encoding.h"
 | 
			
		||||
#include "irc-macros.h"
 | 
			
		||||
#include "irc-write.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "messages.h"
 | 
			
		||||
#include "parse.h"
 | 
			
		||||
#include "tool.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "irc-metadata.h"
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -51,6 +48,8 @@ IRC_METADATA(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
	assert(Client != NULL);
 | 
			
		||||
	assert(Req != NULL);
 | 
			
		||||
 | 
			
		||||
	_IRC_REQUIRE_PREFIX_OR_RETURN_(Client, Req)
 | 
			
		||||
 | 
			
		||||
	prefix = Client_Search(Req->prefix);
 | 
			
		||||
	if (!prefix)
 | 
			
		||||
		return IRC_WriteErrClient(Client, ERR_NOSUCHNICK_MSG,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -16,13 +16,11 @@
 | 
			
		||||
 * IRC commands for mode changes (like MODE, AWAY, etc.)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
#include "irc-macros.h"
 | 
			
		||||
@@ -33,7 +31,6 @@
 | 
			
		||||
#include "messages.h"
 | 
			
		||||
#include "conf.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "irc-mode.h"
 | 
			
		||||
 | 
			
		||||
static bool Client_Mode PARAMS((CLIENT *Client, REQUEST *Req, CLIENT *Origin,
 | 
			
		||||
@@ -71,6 +68,13 @@ IRC_MODE( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
 | 
			
		||||
	_IRC_GET_SENDER_OR_RETURN_(origin, Req, Client)
 | 
			
		||||
 | 
			
		||||
	/* Test for "fake" MODE commands injected by this local instance,
 | 
			
		||||
	 * for example when handling the "DefaultUserModes" settings.
 | 
			
		||||
	 * This doesn't harm real commands, because prefixes of regular
 | 
			
		||||
	 * clients are checked in Validate_Prefix() and can't be faked. */
 | 
			
		||||
	if (Req->prefix && Client_Search(Req->prefix) == Client_ThisServer())
 | 
			
		||||
		Client = Client_Search(Req->prefix);
 | 
			
		||||
 | 
			
		||||
	/* Channel or user mode? */
 | 
			
		||||
	cl = NULL; chan = NULL;
 | 
			
		||||
	if (Client_IsValidNick(Req->argv[0]))
 | 
			
		||||
@@ -202,6 +206,7 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
 | 
			
		||||
		case 'b': /* Block private msgs */
 | 
			
		||||
		case 'C': /* Only messages from clients sharing a channel */
 | 
			
		||||
		case 'i': /* Invisible */
 | 
			
		||||
		case 'I': /* Hide channel list from WHOIS */
 | 
			
		||||
		case 's': /* Server messages */
 | 
			
		||||
		case 'w': /* Wallops messages */
 | 
			
		||||
			x[0] = *mode_ptr;
 | 
			
		||||
@@ -225,6 +230,7 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
 | 
			
		||||
			break;
 | 
			
		||||
		case 'c': /* Receive connect notices */
 | 
			
		||||
		case 'q': /* KICK-protected user */
 | 
			
		||||
		case 'F': /* disable flood protection */
 | 
			
		||||
			  /* (only settable by IRC operators!) */
 | 
			
		||||
			if (!set || Client_Type(Client) == CLIENT_SERVER
 | 
			
		||||
			    || Client_HasMode(Origin, 'o'))
 | 
			
		||||
@@ -357,7 +363,6 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
 | 
			
		||||
			 Client_Modes(Target));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty(Client, 1);
 | 
			
		||||
	return ok;
 | 
			
		||||
} /* Client_Mode */
 | 
			
		||||
 | 
			
		||||
@@ -374,37 +379,44 @@ Channel_Mode_Answer_Request(CLIENT *Origin, CHANNEL *Channel)
 | 
			
		||||
	char the_modes[COMMAND_LEN], the_args[COMMAND_LEN], argadd[CLIENT_PASS_LEN];
 | 
			
		||||
	const char *mode_ptr;
 | 
			
		||||
 | 
			
		||||
	/* Member or not? -- That's the question! */
 | 
			
		||||
	if (!Channel_IsMemberOf(Channel, Origin))
 | 
			
		||||
		return IRC_WriteStrClient(Origin, RPL_CHANNELMODEIS_MSG,
 | 
			
		||||
			Client_ID(Origin), Channel_Name(Channel), Channel_Modes(Channel));
 | 
			
		||||
	if (!Channel_IsMemberOf(Channel, Origin)) {
 | 
			
		||||
		/* Not a member: "simple" mode reply */
 | 
			
		||||
		if (!IRC_WriteStrClient(Origin, RPL_CHANNELMODEIS_MSG,
 | 
			
		||||
					Client_ID(Origin), Channel_Name(Channel),
 | 
			
		||||
					Channel_Modes(Channel)))
 | 
			
		||||
			return DISCONNECTED;
 | 
			
		||||
	} else {
 | 
			
		||||
		/* The sender is a member: generate extended reply */
 | 
			
		||||
		strlcpy(the_modes, Channel_Modes(Channel), sizeof(the_modes));
 | 
			
		||||
		mode_ptr = the_modes;
 | 
			
		||||
		the_args[0] = '\0';
 | 
			
		||||
 | 
			
		||||
	/* The sender is a member: generate extended reply */
 | 
			
		||||
	strlcpy(the_modes, Channel_Modes(Channel), sizeof(the_modes));
 | 
			
		||||
	mode_ptr = the_modes;
 | 
			
		||||
	the_args[0] = '\0';
 | 
			
		||||
 | 
			
		||||
	while(*mode_ptr) {
 | 
			
		||||
		switch(*mode_ptr) {
 | 
			
		||||
		case 'l':
 | 
			
		||||
			snprintf(argadd, sizeof(argadd), " %lu", Channel_MaxUsers(Channel));
 | 
			
		||||
			strlcat(the_args, argadd, sizeof(the_args));
 | 
			
		||||
			break;
 | 
			
		||||
		case 'k':
 | 
			
		||||
			strlcat(the_args, " ", sizeof(the_args));
 | 
			
		||||
			strlcat(the_args, Channel_Key(Channel), sizeof(the_args));
 | 
			
		||||
			break;
 | 
			
		||||
		while(*mode_ptr) {
 | 
			
		||||
			switch(*mode_ptr) {
 | 
			
		||||
			case 'l':
 | 
			
		||||
				snprintf(argadd, sizeof(argadd), " %lu",
 | 
			
		||||
					 Channel_MaxUsers(Channel));
 | 
			
		||||
				strlcat(the_args, argadd, sizeof(the_args));
 | 
			
		||||
				break;
 | 
			
		||||
			case 'k':
 | 
			
		||||
				strlcat(the_args, " ", sizeof(the_args));
 | 
			
		||||
				strlcat(the_args, Channel_Key(Channel),
 | 
			
		||||
					sizeof(the_args));
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
			mode_ptr++;
 | 
			
		||||
		}
 | 
			
		||||
		mode_ptr++;
 | 
			
		||||
	}
 | 
			
		||||
	if (the_args[0])
 | 
			
		||||
		strlcat(the_modes, the_args, sizeof(the_modes));
 | 
			
		||||
		if (the_args[0])
 | 
			
		||||
			strlcat(the_modes, the_args, sizeof(the_modes));
 | 
			
		||||
 | 
			
		||||
		if (!IRC_WriteStrClient(Origin, RPL_CHANNELMODEIS_MSG,
 | 
			
		||||
					Client_ID(Origin), Channel_Name(Channel),
 | 
			
		||||
					the_modes))
 | 
			
		||||
			return DISCONNECTED;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!IRC_WriteStrClient(Origin, RPL_CHANNELMODEIS_MSG,
 | 
			
		||||
				Client_ID(Origin), Channel_Name(Channel),
 | 
			
		||||
				the_modes))
 | 
			
		||||
		return DISCONNECTED;
 | 
			
		||||
#ifndef STRICT_RFC
 | 
			
		||||
	/* Channel creation time */
 | 
			
		||||
	if (!IRC_WriteStrClient(Origin, RPL_CREATIONTIME_MSG,
 | 
			
		||||
				  Client_ID(Origin), Channel_Name(Channel),
 | 
			
		||||
				  Channel_CreationTime(Channel)))
 | 
			
		||||
@@ -568,6 +580,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
 | 
			
		||||
		case 'M': /* Only identified nicks can write */
 | 
			
		||||
		case 'm': /* Moderated */
 | 
			
		||||
		case 'n': /* Only members can write */
 | 
			
		||||
		case 'N': /* Can't change nick while on this channel */
 | 
			
		||||
		case 'Q': /* No kicks */
 | 
			
		||||
		case 't': /* Topic locked */
 | 
			
		||||
			if(is_oper || is_machine || is_owner ||
 | 
			
		||||
@@ -583,9 +596,13 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
 | 
			
		||||
				goto chan_exit;
 | 
			
		||||
			if (!set) {
 | 
			
		||||
				if (is_oper || is_machine || is_owner ||
 | 
			
		||||
				    is_admin || is_op || is_halfop)
 | 
			
		||||
				    is_admin || is_op || is_halfop) {
 | 
			
		||||
					x[0] = *mode_ptr;
 | 
			
		||||
				else
 | 
			
		||||
					if (Channel_HasMode(Channel, 'k'))
 | 
			
		||||
						strlcpy(argadd, "*", sizeof(argadd));
 | 
			
		||||
					if (arg_arg > mode_arg)
 | 
			
		||||
						arg_arg++;
 | 
			
		||||
				} else
 | 
			
		||||
					connected = IRC_WriteErrClient(Origin,
 | 
			
		||||
						ERR_CHANOPRIVSNEEDED_MSG,
 | 
			
		||||
						Client_ID(Origin),
 | 
			
		||||
@@ -613,7 +630,6 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
 | 
			
		||||
#ifdef STRICT_RFC
 | 
			
		||||
				/* Only send error message in "strict" mode,
 | 
			
		||||
				 * this is how ircd2.11 and others behave ... */
 | 
			
		||||
				IRC_SetPenalty(Origin, 2);
 | 
			
		||||
				connected = IRC_WriteErrClient(Origin,
 | 
			
		||||
					ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
					Client_ID(Origin), Req->command);
 | 
			
		||||
@@ -658,7 +674,6 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
 | 
			
		||||
#ifdef STRICT_RFC
 | 
			
		||||
				/* Only send error message in "strict" mode,
 | 
			
		||||
				 * this is how ircd2.11 and others behave ... */
 | 
			
		||||
				IRC_SetPenalty(Origin, 2);
 | 
			
		||||
				connected = IRC_WriteErrClient(Origin,
 | 
			
		||||
					ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
					Client_ID(Origin), Req->command);
 | 
			
		||||
@@ -760,7 +775,6 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
 | 
			
		||||
				 * mode, because most other servers don't do
 | 
			
		||||
				 * it as well and some clients send "wired"
 | 
			
		||||
				 * MODE commands like "MODE #chan -ooo nick". */
 | 
			
		||||
				IRC_SetPenalty(Origin, 2);
 | 
			
		||||
				connected = IRC_WriteErrClient(Origin,
 | 
			
		||||
					ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
					Client_ID(Origin), Req->command);
 | 
			
		||||
@@ -921,7 +935,6 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty(Client, 1);
 | 
			
		||||
	return connected;
 | 
			
		||||
} /* Channel_Mode */
 | 
			
		||||
 | 
			
		||||
@@ -1005,15 +1018,15 @@ Add_To_List(char what, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel,
 | 
			
		||||
 | 
			
		||||
	switch (what) {
 | 
			
		||||
		case 'I':
 | 
			
		||||
			if (!Channel_AddInvite(Channel, mask, false))
 | 
			
		||||
			if (!Channel_AddInvite(Channel, mask, false, Client_ID(Client)))
 | 
			
		||||
				return CONNECTED;
 | 
			
		||||
			break;
 | 
			
		||||
		case 'b':
 | 
			
		||||
			if (!Channel_AddBan(Channel, mask))
 | 
			
		||||
			if (!Channel_AddBan(Channel, mask, Client_ID(Client)))
 | 
			
		||||
				return CONNECTED;
 | 
			
		||||
			break;
 | 
			
		||||
		case 'e':
 | 
			
		||||
			if (!Channel_AddExcept(Channel, mask))
 | 
			
		||||
			if (!Channel_AddExcept(Channel, mask, Client_ID(Client)))
 | 
			
		||||
				return CONNECTED;
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -16,12 +16,9 @@
 | 
			
		||||
 * Channel operator commands
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
#include "irc-macros.h"
 | 
			
		||||
@@ -31,7 +28,6 @@
 | 
			
		||||
#include "messages.h"
 | 
			
		||||
#include "parse.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "irc-op.h"
 | 
			
		||||
 | 
			
		||||
/* Local functions */
 | 
			
		||||
@@ -122,7 +118,6 @@ IRC_KICK(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
			nickCount--;
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		IRC_SetPenalty(Client, 2);
 | 
			
		||||
		return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
					Client_ID(Client), Req->command);
 | 
			
		||||
	}
 | 
			
		||||
@@ -155,6 +150,14 @@ IRC_INVITE(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
		return IRC_WriteErrClient(from, ERR_NOSUCHNICK_MSG,
 | 
			
		||||
					  Client_ID(Client), Req->argv[0]);
 | 
			
		||||
 | 
			
		||||
	if (Req->argv[1][0] == '&') {
 | 
			
		||||
		/* Local channel. Make sure the target user is on this server! */
 | 
			
		||||
		if (Client_Conn(target) == NONE)
 | 
			
		||||
			return IRC_WriteErrClient(from, ERR_USERNOTONSERV_MSG,
 | 
			
		||||
						  Client_ID(Client),
 | 
			
		||||
						  Req->argv[0]);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	chan = Channel_Search(Req->argv[1]);
 | 
			
		||||
	if (chan) {
 | 
			
		||||
		/* Channel exists. Is the user a valid member of the channel? */
 | 
			
		||||
@@ -171,7 +174,8 @@ IRC_INVITE(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
 | 
			
		||||
		/* Is the channel "invite-only"? */
 | 
			
		||||
		if (Channel_HasMode(chan, 'i')) {
 | 
			
		||||
			/* Yes. The user must be channel owner/admin/operator/halfop! */
 | 
			
		||||
			/* Yes. The user issuing the INVITE command must be
 | 
			
		||||
			 * channel owner/admin/operator/halfop! */
 | 
			
		||||
			if (!Channel_UserHasMode(chan, from, 'q') &&
 | 
			
		||||
			    !Channel_UserHasMode(chan, from, 'a') &&
 | 
			
		||||
			    !Channel_UserHasMode(chan, from, 'o') &&
 | 
			
		||||
@@ -195,7 +199,8 @@ IRC_INVITE(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
 | 
			
		||||
		if (remember) {
 | 
			
		||||
			/* We must remember this invite */
 | 
			
		||||
			if (!Channel_AddInvite(chan, Client_Mask(target), true))
 | 
			
		||||
			if (!Channel_AddInvite(chan, Client_MaskCloaked(target),
 | 
			
		||||
						true, Client_ID(from)))
 | 
			
		||||
				return CONNECTED;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -204,21 +209,22 @@ IRC_INVITE(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
		 Req->argv[0], Req->argv[1]);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * RFC 2812 says:
 | 
			
		||||
	 * 'There is no requirement that the channel [..] must exist or be a valid channel'
 | 
			
		||||
	 * The problem with this is that this allows the "channel" to contain spaces,
 | 
			
		||||
	 * in which case we must prefix its name with a colon to make it clear that
 | 
			
		||||
	 * it is only a single argument.
 | 
			
		||||
	 * RFC 2812 states:
 | 
			
		||||
	 * 'There is no requirement that the channel [..] must exist or be a
 | 
			
		||||
	 * valid channel'. The problem with this is that this allows the
 | 
			
		||||
	 * "channel" to contain spaces, in which case we must prefix its name
 | 
			
		||||
	 * with a colon to make it clear that it is only a single argument.
 | 
			
		||||
	 */
 | 
			
		||||
	colon_if_necessary = strchr(Req->argv[1], ' ') ? ":":"";
 | 
			
		||||
	/* Inform target client */
 | 
			
		||||
	IRC_WriteStrClientPrefix(target, from, "INVITE %s %s%s", Req->argv[0],
 | 
			
		||||
					colon_if_necessary, Req->argv[1]);
 | 
			
		||||
				  colon_if_necessary, Req->argv[1]);
 | 
			
		||||
 | 
			
		||||
	if (Client_Conn(target) > NONE) {
 | 
			
		||||
		/* The target user is local, so we have to send the status code */
 | 
			
		||||
		if (!IRC_WriteStrClientPrefix(from, target, RPL_INVITING_MSG,
 | 
			
		||||
			Client_ID(from), Req->argv[0], colon_if_necessary, Req->argv[1]))
 | 
			
		||||
					       Client_ID(from), Req->argv[0],
 | 
			
		||||
					       colon_if_necessary, Req->argv[1]))
 | 
			
		||||
			return DISCONNECTED;
 | 
			
		||||
 | 
			
		||||
		if (Client_HasMode(target, 'a') &&
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2015 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -16,12 +16,12 @@
 | 
			
		||||
 * IRC operator commands
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <signal.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
 | 
			
		||||
#include "ngircd.h"
 | 
			
		||||
#include "conn-func.h"
 | 
			
		||||
@@ -38,7 +38,6 @@
 | 
			
		||||
#include "messages.h"
 | 
			
		||||
#include "op.h"
 | 
			
		||||
 | 
			
		||||
#include <exp.h>
 | 
			
		||||
#include "irc-oper.h"
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -48,9 +47,11 @@
 | 
			
		||||
static bool
 | 
			
		||||
Bad_OperPass(CLIENT *Client, char *errtoken, char *errmsg)
 | 
			
		||||
{
 | 
			
		||||
	Log(LOG_WARNING, "Got invalid OPER from \"%s\": \"%s\" -- %s",
 | 
			
		||||
	Log(LOG_WARNING, "Got invalid OPER from \"%s\": \"%s\" -- %s!",
 | 
			
		||||
	    Client_Mask(Client), errtoken, errmsg);
 | 
			
		||||
	return IRC_WriteErrClient(Client, ERR_PASSWDMISMATCH_MSG,
 | 
			
		||||
	/* Increase penalty to slow down possible brute force attacks */
 | 
			
		||||
	IRC_SetPenalty(Client, 10);
 | 
			
		||||
	return IRC_WriteStrClient(Client, ERR_PASSWDMISMATCH_MSG,
 | 
			
		||||
				  Client_ID(Client));
 | 
			
		||||
} /* Bad_OperPass */
 | 
			
		||||
 | 
			
		||||
@@ -208,18 +209,14 @@ IRC_CONNECT(CLIENT * Client, REQUEST * Req)
 | 
			
		||||
 | 
			
		||||
	/* Bad number of parameters? */
 | 
			
		||||
	if (Req->argc != 1 && Req->argc != 2 && Req->argc != 3 &&
 | 
			
		||||
	    Req->argc != 5 && Req->argc != 6) {
 | 
			
		||||
		IRC_SetPenalty(Client, 2);
 | 
			
		||||
	    Req->argc != 5 && Req->argc != 6)
 | 
			
		||||
		return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
					  Client_ID(Client), Req->command);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Invalid port number? */
 | 
			
		||||
	if ((Req->argc > 1) && atoi(Req->argv[1]) < 1) {
 | 
			
		||||
		IRC_SetPenalty(Client, 2);
 | 
			
		||||
	if ((Req->argc > 1) && atoi(Req->argv[1]) < 1)
 | 
			
		||||
		return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
					  Client_ID(Client), Req->command);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (Client_Type(Client) != CLIENT_SERVER
 | 
			
		||||
	    && !Client_HasMode(Client, 'o'))
 | 
			
		||||
@@ -362,6 +359,7 @@ IRC_WALLOPS( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
		from = Client;
 | 
			
		||||
		break;
 | 
			
		||||
	case CLIENT_SERVER:
 | 
			
		||||
		_IRC_REQUIRE_PREFIX_OR_RETURN_(Client, Req)
 | 
			
		||||
		from = Client_Search(Req->prefix);
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
@@ -389,17 +387,16 @@ IRC_xLINE(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
	CLIENT *from, *c, *c_next;
 | 
			
		||||
	char reason[COMMAND_LEN], class_c;
 | 
			
		||||
	struct list_head *list;
 | 
			
		||||
	time_t timeout;
 | 
			
		||||
	int class;
 | 
			
		||||
 | 
			
		||||
	assert(Client != NULL);
 | 
			
		||||
	assert(Req != NULL);
 | 
			
		||||
 | 
			
		||||
	/* Bad number of parameters? */
 | 
			
		||||
	if (Req->argc != 1 && Req->argc != 3) {
 | 
			
		||||
		IRC_SetPenalty(Client, 2);
 | 
			
		||||
	if (Req->argc != 1 && Req->argc != 3)
 | 
			
		||||
		return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
					  Client_ID(Client), Req->command);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	from = Op_Check(Client, Req);
 | 
			
		||||
	if (!from)
 | 
			
		||||
@@ -435,8 +432,11 @@ IRC_xLINE(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		/* Add new mask to list */
 | 
			
		||||
		timeout = atol(Req->argv[1]);
 | 
			
		||||
		if (timeout > 0)
 | 
			
		||||
			timeout += time(NULL);
 | 
			
		||||
		if (Class_AddMask(class, Req->argv[0],
 | 
			
		||||
				  time(NULL) + atol(Req->argv[1]),
 | 
			
		||||
				  timeout,
 | 
			
		||||
				  Req->argv[2])) {
 | 
			
		||||
			Log(LOG_NOTICE|LOG_snotice,
 | 
			
		||||
			    "\"%s\" added \"%s\" to %c-Line list: \"%s\" (%ld seconds).",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -16,31 +16,25 @@
 | 
			
		||||
 * IRC commands for server links
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <strings.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "conn-func.h"
 | 
			
		||||
#include "conn-zip.h"
 | 
			
		||||
#include "conf.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
#include "lists.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "messages.h"
 | 
			
		||||
#include "parse.h"
 | 
			
		||||
#include "numeric.h"
 | 
			
		||||
#include "ngircd.h"
 | 
			
		||||
#include "irc-info.h"
 | 
			
		||||
#include "irc-macros.h"
 | 
			
		||||
#include "irc-write.h"
 | 
			
		||||
#include "op.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "irc-server.h"
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -53,7 +47,7 @@
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_SERVER( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
{
 | 
			
		||||
	char str[LINE_LEN];
 | 
			
		||||
	char str[100];
 | 
			
		||||
	CLIENT *from, *c;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
@@ -72,12 +66,10 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
		LogDebug("Connection %d: got SERVER command (new server link) ...",
 | 
			
		||||
			Client_Conn(Client));
 | 
			
		||||
 | 
			
		||||
		if (Req->argc != 2 && Req->argc != 3) {
 | 
			
		||||
			IRC_SetPenalty(Client, 2);
 | 
			
		||||
		if (Req->argc != 2 && Req->argc != 3)
 | 
			
		||||
			return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
						  Client_ID(Client),
 | 
			
		||||
						  Req->command);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Get configuration index of new remote server ... */
 | 
			
		||||
		for (i = 0; i < MAX_SERVERS; i++)
 | 
			
		||||
@@ -185,11 +177,9 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	{
 | 
			
		||||
		/* New server is being introduced to the network */
 | 
			
		||||
 | 
			
		||||
		if (Req->argc != 4) {
 | 
			
		||||
			IRC_SetPenalty(Client, 2);
 | 
			
		||||
		if (Req->argc != 4)
 | 
			
		||||
			return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
						  Client_ID(Client), Req->command);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* check for existing server with same ID */
 | 
			
		||||
		if (!Client_CheckID(Client, Req->argv[0]))
 | 
			
		||||
@@ -235,11 +225,9 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
					  Client_MyToken(c), Client_Info(c));
 | 
			
		||||
 | 
			
		||||
		return CONNECTED;
 | 
			
		||||
	} else {
 | 
			
		||||
		IRC_SetPenalty(Client, 2);
 | 
			
		||||
	} else
 | 
			
		||||
		return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
					  Client_ID(Client), Req->command);
 | 
			
		||||
	}
 | 
			
		||||
} /* IRC_SERVER */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -16,7 +16,6 @@
 | 
			
		||||
 * Sending IRC commands over the network
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#ifdef PROTOTYPES
 | 
			
		||||
#	include <stdarg.h>
 | 
			
		||||
@@ -24,13 +23,10 @@
 | 
			
		||||
#	include <varargs.h>
 | 
			
		||||
#endif
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "conn-func.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "irc-write.h"
 | 
			
		||||
 | 
			
		||||
#define SEND_TO_USER 1
 | 
			
		||||
@@ -70,7 +66,7 @@ va_dcl
 | 
			
		||||
#else
 | 
			
		||||
	va_start(ap);
 | 
			
		||||
#endif
 | 
			
		||||
	vsnprintf(buffer, 1000, Format, ap);
 | 
			
		||||
	vsnprintf(buffer, sizeof(buffer), Format, ap);
 | 
			
		||||
	va_end(ap);
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty(Client, 2);
 | 
			
		||||
@@ -107,7 +103,7 @@ va_dcl
 | 
			
		||||
#else
 | 
			
		||||
	va_start(ap);
 | 
			
		||||
#endif
 | 
			
		||||
	vsnprintf(buffer, 1000, Format, ap);
 | 
			
		||||
	vsnprintf(buffer, sizeof(buffer), Format, ap);
 | 
			
		||||
	va_end(ap);
 | 
			
		||||
 | 
			
		||||
	return IRC_WriteStrClientPrefix(Client, Client_ThisServer(),
 | 
			
		||||
@@ -148,7 +144,7 @@ va_dcl
 | 
			
		||||
#else
 | 
			
		||||
	va_start( ap );
 | 
			
		||||
#endif
 | 
			
		||||
	vsnprintf( buffer, 1000, Format, ap );
 | 
			
		||||
	vsnprintf(buffer, sizeof(buffer), Format, ap);
 | 
			
		||||
	va_end( ap );
 | 
			
		||||
 | 
			
		||||
	return Conn_WriteStr(Client_Conn(Client_NextHop(Client)), ":%s %s",
 | 
			
		||||
@@ -190,7 +186,7 @@ va_dcl
 | 
			
		||||
#else
 | 
			
		||||
	va_start( ap );
 | 
			
		||||
#endif
 | 
			
		||||
	vsnprintf( buffer, 1000, Format, ap );
 | 
			
		||||
	vsnprintf(buffer, sizeof(buffer), Format, ap);
 | 
			
		||||
	va_end( ap );
 | 
			
		||||
 | 
			
		||||
	IRC_WriteStrChannelPrefix(Client, Chan, Client_ThisServer(),
 | 
			
		||||
@@ -239,7 +235,7 @@ va_dcl
 | 
			
		||||
#else
 | 
			
		||||
	va_start( ap  );
 | 
			
		||||
#endif
 | 
			
		||||
	vsnprintf( buffer, 1000, Format, ap );
 | 
			
		||||
	vsnprintf(buffer, sizeof(buffer), Format, ap);
 | 
			
		||||
	va_end( ap );
 | 
			
		||||
 | 
			
		||||
	Conn_ClearFlags( );
 | 
			
		||||
@@ -296,7 +292,7 @@ va_dcl
 | 
			
		||||
#else
 | 
			
		||||
	va_start( ap );
 | 
			
		||||
#endif
 | 
			
		||||
	vsnprintf( buffer, 1000, Format, ap );
 | 
			
		||||
	vsnprintf(buffer, sizeof(buffer), Format, ap);
 | 
			
		||||
	va_end( ap );
 | 
			
		||||
 | 
			
		||||
	IRC_WriteStrServersPrefix(ExceptOf, Client_ThisServer(), "%s", buffer);
 | 
			
		||||
@@ -333,7 +329,7 @@ va_dcl
 | 
			
		||||
#else
 | 
			
		||||
	va_start( ap );
 | 
			
		||||
#endif
 | 
			
		||||
	vsnprintf( buffer, 1000, Format, ap );
 | 
			
		||||
	vsnprintf(buffer, sizeof(buffer), Format, ap);
 | 
			
		||||
	va_end( ap );
 | 
			
		||||
 | 
			
		||||
	IRC_WriteStrServersPrefixFlag( ExceptOf, Prefix, '\0', "%s", buffer );
 | 
			
		||||
@@ -373,7 +369,7 @@ va_dcl
 | 
			
		||||
#else
 | 
			
		||||
	va_start( ap );
 | 
			
		||||
#endif
 | 
			
		||||
	vsnprintf( buffer, 1000, Format, ap );
 | 
			
		||||
	vsnprintf(buffer, sizeof(buffer), Format, ap);
 | 
			
		||||
	va_end( ap );
 | 
			
		||||
 | 
			
		||||
	IRC_WriteStrServersPrefixFlag_CB(ExceptOf, Prefix, Flag,
 | 
			
		||||
@@ -451,7 +447,7 @@ va_dcl
 | 
			
		||||
#else
 | 
			
		||||
	va_start( ap );
 | 
			
		||||
#endif
 | 
			
		||||
	vsnprintf( buffer, 1000, Format, ap );
 | 
			
		||||
	vsnprintf(buffer, sizeof(buffer), Format, ap);
 | 
			
		||||
	va_end( ap );
 | 
			
		||||
 | 
			
		||||
	Conn_ClearFlags( );
 | 
			
		||||
@@ -513,7 +509,7 @@ va_dcl
 | 
			
		||||
#else
 | 
			
		||||
	va_start(ap);
 | 
			
		||||
#endif
 | 
			
		||||
	vsnprintf(msg, 1000, Format, ap);
 | 
			
		||||
	vsnprintf(msg, sizeof(msg), Format, ap);
 | 
			
		||||
	va_end(ap);
 | 
			
		||||
 | 
			
		||||
	for (to=Client_First(); to != NULL; to=Client_Next(to)) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2015 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -16,17 +16,19 @@
 | 
			
		||||
 * IRC commands
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <strings.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
 | 
			
		||||
#include "ngircd.h"
 | 
			
		||||
#include "conn-func.h"
 | 
			
		||||
#include "conf.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
#include "conn-encoding.h"
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#ifdef ICONV
 | 
			
		||||
# include "conn-encoding.h"
 | 
			
		||||
#endif
 | 
			
		||||
#include "irc-macros.h"
 | 
			
		||||
#include "irc-write.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
@@ -34,9 +36,7 @@
 | 
			
		||||
#include "messages.h"
 | 
			
		||||
#include "parse.h"
 | 
			
		||||
#include "op.h"
 | 
			
		||||
#include "tool.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "irc.h"
 | 
			
		||||
 | 
			
		||||
static char *Option_String PARAMS((CONN_ID Idx));
 | 
			
		||||
@@ -224,8 +224,6 @@ IRC_TRACE(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
	assert(Client != NULL);
 | 
			
		||||
	assert(Req != NULL);
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty(Client, 3);
 | 
			
		||||
 | 
			
		||||
	_IRC_GET_SENDER_OR_RETURN_(from, Req, Client)
 | 
			
		||||
	_IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, from)
 | 
			
		||||
 | 
			
		||||
@@ -301,8 +299,6 @@ IRC_HELP(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
	assert(Client != NULL);
 | 
			
		||||
	assert(Req != NULL);
 | 
			
		||||
 | 
			
		||||
	IRC_SetPenalty(Client, 2);
 | 
			
		||||
 | 
			
		||||
	if ((Req->argc == 0 && array_bytes(&Conf_Helptext) > 0)
 | 
			
		||||
	    || (Req->argc >= 1 && strcasecmp(Req->argv[0], "Commands") != 0)) {
 | 
			
		||||
		/* Help text available and requested */
 | 
			
		||||
@@ -478,9 +474,7 @@ Option_String(UNUSED CONN_ID Idx)
 | 
			
		||||
#endif
 | 
			
		||||
{
 | 
			
		||||
	static char option_txt[8];
 | 
			
		||||
#ifdef ZLIB
 | 
			
		||||
	UINT16 options;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	assert(Idx != NONE);
 | 
			
		||||
 | 
			
		||||
@@ -528,12 +522,11 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
 | 
			
		||||
	if (Req->argc > 2) {
 | 
			
		||||
		if (!SendErrors)
 | 
			
		||||
			return CONNECTED;
 | 
			
		||||
		IRC_SetPenalty(Client, 2);
 | 
			
		||||
		return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
					  Client_ID(Client), Req->command);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (Client_Type(Client) == CLIENT_SERVER)
 | 
			
		||||
	if (Client_Type(Client) == CLIENT_SERVER && Req->prefix)
 | 
			
		||||
		from = Client_Search(Req->prefix);
 | 
			
		||||
	else
 | 
			
		||||
		from = Client;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -16,29 +16,24 @@
 | 
			
		||||
 * Management of IRC lists: ban, invite, etc.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "match.h"
 | 
			
		||||
#include "messages.h"
 | 
			
		||||
#include "irc-write.h"
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <strings.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "match.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "lists.h"
 | 
			
		||||
 | 
			
		||||
struct list_elem {
 | 
			
		||||
	struct list_elem *next;	/** pointer to next list element */
 | 
			
		||||
	char mask[MASK_LEN];	/** IRC mask */
 | 
			
		||||
	char *reason;		/** Optional "reason" text */
 | 
			
		||||
	time_t valid_until;	/** 0: unlimited; 1: once; t(>1): until t */
 | 
			
		||||
	time_t valid_until;	/** 0: unlimited; t(>0): until t */
 | 
			
		||||
	bool onlyonce;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -71,7 +66,7 @@ Lists_GetReason(const struct list_elem *e)
 | 
			
		||||
 * Get "validity" value stored in list element.
 | 
			
		||||
 *
 | 
			
		||||
 * @param list_elem List element.
 | 
			
		||||
 * @return Validity: 0=unlimited, 1=once, >1 until this time stamp.
 | 
			
		||||
 * @return Validity: 0=unlimited, >0 until this time stamp.
 | 
			
		||||
 */
 | 
			
		||||
GLOBAL time_t
 | 
			
		||||
Lists_GetValidity(const struct list_elem *e)
 | 
			
		||||
@@ -80,6 +75,19 @@ Lists_GetValidity(const struct list_elem *e)
 | 
			
		||||
	return e->valid_until;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Get "onlyonce" value stored in list element.
 | 
			
		||||
 *
 | 
			
		||||
 * @param list_elem List element.
 | 
			
		||||
 * @return True if the element was stored for single use, false otherwise.
 | 
			
		||||
 */
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Lists_GetOnlyOnce(const struct list_elem *e)
 | 
			
		||||
{
 | 
			
		||||
	assert(e != NULL);
 | 
			
		||||
	return e->onlyonce;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Get first list element of a list.
 | 
			
		||||
 *
 | 
			
		||||
@@ -117,7 +125,7 @@ Lists_GetNext(const struct list_elem *e)
 | 
			
		||||
 */
 | 
			
		||||
bool
 | 
			
		||||
Lists_Add(struct list_head *h, const char *Mask, time_t ValidUntil,
 | 
			
		||||
	  const char *Reason)
 | 
			
		||||
	  const char *Reason, bool OnlyOnce)
 | 
			
		||||
{
 | 
			
		||||
	struct list_elem *e, *newelem;
 | 
			
		||||
 | 
			
		||||
@@ -154,6 +162,7 @@ Lists_Add(struct list_head *h, const char *Mask, time_t ValidUntil,
 | 
			
		||||
	else
 | 
			
		||||
		newelem->reason = NULL;
 | 
			
		||||
	newelem->valid_until = ValidUntil;
 | 
			
		||||
	newelem->onlyonce = OnlyOnce;
 | 
			
		||||
	newelem->next = e;
 | 
			
		||||
	h->first = newelem;
 | 
			
		||||
 | 
			
		||||
@@ -291,6 +300,7 @@ Lists_MakeMask(const char *Pattern, char *mask, size_t len)
 | 
			
		||||
		strlcpy(mask, Pattern, len - 5);
 | 
			
		||||
		strlcat(mask, "!*@", len);
 | 
			
		||||
		strlcat(mask, at, len);
 | 
			
		||||
		at--; *at = '@';
 | 
			
		||||
	} else {
 | 
			
		||||
		/* All parts (nick, user and domain name) are given */
 | 
			
		||||
		strlcpy(mask, Pattern, len);
 | 
			
		||||
@@ -331,10 +341,10 @@ Lists_CheckReason(struct list_head *h, CLIENT *Client, char *reason, size_t len)
 | 
			
		||||
 | 
			
		||||
	while (e) {
 | 
			
		||||
		next = e->next;
 | 
			
		||||
		if (Match(e->mask, Client_MaskCloaked(Client))) {
 | 
			
		||||
		if (MatchCaseInsensitive(e->mask, Client_MaskCloaked(Client))) {
 | 
			
		||||
			if (len && e->reason)
 | 
			
		||||
				strlcpy(reason, e->reason, len);
 | 
			
		||||
			if (e->valid_until == 1) {
 | 
			
		||||
			if (e->onlyonce) {
 | 
			
		||||
				/* Entry is valid only once, delete it */
 | 
			
		||||
				LogDebug("Deleted \"%s\" from list (used).",
 | 
			
		||||
					 e->mask);
 | 
			
		||||
@@ -368,7 +378,7 @@ Lists_Expire(struct list_head *h, const char *ListName)
 | 
			
		||||
 | 
			
		||||
	while (e) {
 | 
			
		||||
		next = e->next;
 | 
			
		||||
		if (e->valid_until > 1 && e->valid_until < now) {
 | 
			
		||||
		if (e->valid_until > 0 && e->valid_until < now) {
 | 
			
		||||
			/* Entry is expired, delete it */
 | 
			
		||||
			if (e->reason)
 | 
			
		||||
				Log(LOG_INFO,
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,8 @@ GLOBAL struct list_elem *Lists_CheckDupeMask PARAMS((const struct list_head *hea
 | 
			
		||||
					const char *mask));
 | 
			
		||||
 | 
			
		||||
GLOBAL bool Lists_Add PARAMS((struct list_head *h, const char *Mask,
 | 
			
		||||
			      time_t ValidUntil, const char *Reason));
 | 
			
		||||
			      time_t ValidUntil, const char *Reason,
 | 
			
		||||
			      bool OnlyOnce));
 | 
			
		||||
GLOBAL void Lists_Del PARAMS((struct list_head *head, const char *Mask));
 | 
			
		||||
GLOBAL unsigned long Lists_Count PARAMS((struct list_head *h));
 | 
			
		||||
 | 
			
		||||
@@ -46,6 +47,7 @@ GLOBAL void Lists_MakeMask PARAMS((const char *Pattern, char *mask, size_t len))
 | 
			
		||||
GLOBAL const char *Lists_GetMask PARAMS((const struct list_elem *e));
 | 
			
		||||
GLOBAL const char *Lists_GetReason PARAMS((const struct list_elem *e));
 | 
			
		||||
GLOBAL time_t Lists_GetValidity PARAMS((const struct list_elem *e));
 | 
			
		||||
GLOBAL bool Lists_GetOnlyOnce PARAMS((const struct list_elem *e));
 | 
			
		||||
 | 
			
		||||
GLOBAL void Lists_Expire PARAMS((struct list_head *h, const char *ListName));
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2012 Alexander Barton (alex@barton.de)
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -16,34 +16,29 @@
 | 
			
		||||
 * Logging functions
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#ifdef PROTOTYPES
 | 
			
		||||
#	include <stdarg.h>
 | 
			
		||||
# include <stdarg.h>
 | 
			
		||||
#else
 | 
			
		||||
#	include <varargs.h>
 | 
			
		||||
# include <varargs.h>
 | 
			
		||||
#endif
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
#ifdef SYSLOG
 | 
			
		||||
#include <syslog.h>
 | 
			
		||||
# include <syslog.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "ngircd.h"
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
#include "irc-write.h"
 | 
			
		||||
#include "conf.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static bool Is_Daemon;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -16,36 +16,34 @@
 | 
			
		||||
 * Functions to deal with client logins
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <strings.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "class.h"
 | 
			
		||||
#include "client.h"
 | 
			
		||||
#include "client-cap.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
#include "conf.h"
 | 
			
		||||
#include "io.h"
 | 
			
		||||
#include "parse.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "messages.h"
 | 
			
		||||
#include "ngircd.h"
 | 
			
		||||
#include "pam.h"
 | 
			
		||||
#include "irc-info.h"
 | 
			
		||||
#include "irc-mode.h"
 | 
			
		||||
#include "irc-write.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "login.h"
 | 
			
		||||
 | 
			
		||||
#ifdef PAM
 | 
			
		||||
 | 
			
		||||
#include "io.h"
 | 
			
		||||
#include "pam.h"
 | 
			
		||||
 | 
			
		||||
static void cb_Read_Auth_Result PARAMS((int r_fd, UNUSED short events));
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -91,13 +89,12 @@ Login_User(CLIENT * Client)
 | 
			
		||||
 | 
			
		||||
#ifdef PAM
 | 
			
		||||
	if (!Conf_PAM) {
 | 
			
		||||
		/* Don't do any PAM authentication at all, instead emulate
 | 
			
		||||
		 * the behavior of the daemon compiled without PAM support:
 | 
			
		||||
		 * because there can't be any "server password", all
 | 
			
		||||
		 * passwords supplied are classified as "wrong". */
 | 
			
		||||
		if(Conn_Password(conn)[0] == '\0')
 | 
			
		||||
		/* Don't do any PAM authentication at all if PAM is not
 | 
			
		||||
		 * enabled, instead emulate the behavior of the daemon
 | 
			
		||||
		 * compiled without PAM support. */
 | 
			
		||||
		if (strcmp(Conn_Password(conn), Conf_ServerPwd) == 0)
 | 
			
		||||
			return Login_User_PostAuth(Client);
 | 
			
		||||
		Client_Reject(Client, "Non-empty password", false);
 | 
			
		||||
		Client_Reject(Client, "Bad server password", false);
 | 
			
		||||
		return DISCONNECTED;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -111,25 +108,27 @@ Login_User(CLIENT * Client)
 | 
			
		||||
		return Login_User_PostAuth(Client);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Fork child process for PAM authentication; and make sure that the
 | 
			
		||||
	 * process timeout is set higher than the login timeout! */
 | 
			
		||||
	pid = Proc_Fork(Conn_GetProcStat(conn), pipefd,
 | 
			
		||||
			cb_Read_Auth_Result, Conf_PongTimeout + 1);
 | 
			
		||||
	if (pid > 0) {
 | 
			
		||||
		LogDebug("Authenticator for connection %d created (PID %d).",
 | 
			
		||||
			 conn, pid);
 | 
			
		||||
		return CONNECTED;
 | 
			
		||||
	} else {
 | 
			
		||||
		/* Sub process */
 | 
			
		||||
		Log_Init_Subprocess("Auth");
 | 
			
		||||
		Conn_CloseAllSockets(NONE);
 | 
			
		||||
		result = PAM_Authenticate(Client);
 | 
			
		||||
		if (write(pipefd[1], &result, sizeof(result)) != sizeof(result))
 | 
			
		||||
			Log_Subprocess(LOG_ERR,
 | 
			
		||||
				       "Failed to pipe result to parent!");
 | 
			
		||||
		Log_Exit_Subprocess("Auth");
 | 
			
		||||
		exit(0);
 | 
			
		||||
	}
 | 
			
		||||
	if (Conf_PAM) {
 | 
			
		||||
		/* Fork child process for PAM authentication; and make sure that the
 | 
			
		||||
		 * process timeout is set higher than the login timeout! */
 | 
			
		||||
		pid = Proc_Fork(Conn_GetProcStat(conn), pipefd,
 | 
			
		||||
				cb_Read_Auth_Result, Conf_PongTimeout + 1);
 | 
			
		||||
		if (pid > 0) {
 | 
			
		||||
			LogDebug("Authenticator for connection %d created (PID %d).",
 | 
			
		||||
				 conn, pid);
 | 
			
		||||
			return CONNECTED;
 | 
			
		||||
		} else {
 | 
			
		||||
			/* Sub process */
 | 
			
		||||
			Log_Init_Subprocess("Auth");
 | 
			
		||||
			Conn_CloseAllSockets(NONE);
 | 
			
		||||
			result = PAM_Authenticate(Client);
 | 
			
		||||
			if (write(pipefd[1], &result, sizeof(result)) != sizeof(result))
 | 
			
		||||
				Log_Subprocess(LOG_ERR,
 | 
			
		||||
					       "Failed to pipe result to parent!");
 | 
			
		||||
			Log_Exit_Subprocess("Auth");
 | 
			
		||||
			exit(0);
 | 
			
		||||
		}
 | 
			
		||||
	} else return CONNECTED;
 | 
			
		||||
#else
 | 
			
		||||
	/* Check global server password ... */
 | 
			
		||||
	if (strcmp(Conn_Password(conn), Conf_ServerPwd) != 0) {
 | 
			
		||||
@@ -193,7 +192,7 @@ Login_User_PostAuth(CLIENT *Client)
 | 
			
		||||
	/* Set default user modes */
 | 
			
		||||
	if (Conf_DefaultUserModes[0]) {
 | 
			
		||||
		snprintf(modes, sizeof(modes), "+%s", Conf_DefaultUserModes);
 | 
			
		||||
		Req.prefix = Client_ThisServer();
 | 
			
		||||
		Req.prefix = Client_ID(Client_ThisServer());
 | 
			
		||||
		Req.command = "MODE";
 | 
			
		||||
		Req.argc = 2;
 | 
			
		||||
		Req.argv[0] = Client_ID(Client);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -16,15 +16,13 @@
 | 
			
		||||
 * Wildcard pattern matching
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "match.h"
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "tool.h"
 | 
			
		||||
 | 
			
		||||
#include "match.h"
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * The pattern matching functions [Matche(), Matche_After_Star()] are based
 | 
			
		||||
@@ -32,11 +30,9 @@
 | 
			
		||||
 * "public domain": <http://c.snippets.org/snip_lister.php?fname=match.c>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int Matche PARAMS(( const char *p, const char *t ));
 | 
			
		||||
static int Matche_After_Star PARAMS(( const char *p, const char *t ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define MATCH_PATTERN	6	/**< bad pattern */
 | 
			
		||||
#define MATCH_LITERAL	5	/**< match failure on literal match */
 | 
			
		||||
#define MATCH_RANGE	4	/**< match failure on [..] construct */
 | 
			
		||||
@@ -44,7 +40,6 @@ static int Matche_After_Star PARAMS(( const char *p, const char *t ));
 | 
			
		||||
#define MATCH_END	2	/**< premature end of pattern string */
 | 
			
		||||
#define MATCH_VALID	1	/**< valid match */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Match string with pattern.
 | 
			
		||||
 *
 | 
			
		||||
@@ -55,11 +50,12 @@ static int Matche_After_Star PARAMS(( const char *p, const char *t ));
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Match( const char *Pattern, const char *String )
 | 
			
		||||
{
 | 
			
		||||
	if( Matche( Pattern, String ) == MATCH_VALID ) return true;
 | 
			
		||||
	else return false;
 | 
			
		||||
	if (Matche(Pattern, String) == MATCH_VALID)
 | 
			
		||||
		return true;
 | 
			
		||||
	else
 | 
			
		||||
		return false;
 | 
			
		||||
} /* Match */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Match string with pattern case-insensitive.
 | 
			
		||||
 *
 | 
			
		||||
@@ -70,12 +66,13 @@ Match( const char *Pattern, const char *String )
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
MatchCaseInsensitive(const char *Pattern, const char *String)
 | 
			
		||||
{
 | 
			
		||||
	char haystack[COMMAND_LEN];
 | 
			
		||||
	char needle[COMMAND_LEN], haystack[COMMAND_LEN];
 | 
			
		||||
 | 
			
		||||
	strlcpy(needle, Pattern, sizeof(needle));
 | 
			
		||||
	strlcpy(haystack, String, sizeof(haystack));
 | 
			
		||||
	return Match(Pattern, ngt_LowerStr(haystack));
 | 
			
		||||
} /* MatchCaseInsensitive */
 | 
			
		||||
 | 
			
		||||
	return Match(ngt_LowerStr(needle), ngt_LowerStr(haystack));
 | 
			
		||||
} /* MatchCaseInsensitive */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Match string with pattern case-insensitive.
 | 
			
		||||
@@ -89,31 +86,23 @@ GLOBAL bool
 | 
			
		||||
MatchCaseInsensitiveList(const char *Pattern, const char *String,
 | 
			
		||||
		     const char *Separator)
 | 
			
		||||
{
 | 
			
		||||
	char tmp_pattern[COMMAND_LEN], haystack[COMMAND_LEN], *ptr;
 | 
			
		||||
	char tmp_pattern[COMMAND_LEN], *ptr;
 | 
			
		||||
 | 
			
		||||
	strlcpy(tmp_pattern, Pattern, sizeof(tmp_pattern));
 | 
			
		||||
	strlcpy(haystack, String, sizeof(haystack));
 | 
			
		||||
	ngt_LowerStr(haystack);
 | 
			
		||||
 | 
			
		||||
	ptr = strtok(tmp_pattern, Separator);
 | 
			
		||||
	while (ptr) {
 | 
			
		||||
		ngt_TrimStr(ptr);
 | 
			
		||||
		if (Match(ptr, haystack))
 | 
			
		||||
		if (MatchCaseInsensitive(ptr, String))
 | 
			
		||||
			return true;
 | 
			
		||||
		ptr = strtok(NULL, Separator);
 | 
			
		||||
	}
 | 
			
		||||
	return false;
 | 
			
		||||
} /* MatchCaseInsensitive */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
Matche( const char *p, const char *t )
 | 
			
		||||
{
 | 
			
		||||
	register char range_start, range_end;
 | 
			
		||||
	bool invert;
 | 
			
		||||
	bool member_match;
 | 
			
		||||
	bool loop;
 | 
			
		||||
 | 
			
		||||
	for( ; *p; p++, t++ )
 | 
			
		||||
	{
 | 
			
		||||
		/* if this is the end of the text then this is the end of the match */
 | 
			
		||||
@@ -131,118 +120,7 @@ Matche( const char *p, const char *t )
 | 
			
		||||
			case '*':	/* multiple any character match */
 | 
			
		||||
				return Matche_After_Star( p, t );
 | 
			
		||||
 | 
			
		||||
			case '[':	/* [..] construct, single member/exclusion character match */
 | 
			
		||||
				/* move to beginning of range */
 | 
			
		||||
				p++;
 | 
			
		||||
 | 
			
		||||
				/* check if this is a member match or exclusion match */
 | 
			
		||||
				invert = false;
 | 
			
		||||
				if( *p == '!' || *p == '^' )
 | 
			
		||||
				{
 | 
			
		||||
					invert = true;
 | 
			
		||||
					p++;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				/* if closing bracket here or at range start then we have a malformed pattern */
 | 
			
		||||
				if ( *p == ']' ) return MATCH_PATTERN;
 | 
			
		||||
 | 
			
		||||
				member_match = false;
 | 
			
		||||
				loop = true;
 | 
			
		||||
 | 
			
		||||
				while( loop )
 | 
			
		||||
				{
 | 
			
		||||
					/* if end of construct then loop is done */
 | 
			
		||||
					if( *p == ']' )
 | 
			
		||||
					{
 | 
			
		||||
						loop = false;
 | 
			
		||||
						continue;
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					/* matching a '!', '^', '-', '\' or a ']' */
 | 
			
		||||
					if( *p == '\\' ) range_start = range_end = *++p;
 | 
			
		||||
					else  range_start = range_end = *p;
 | 
			
		||||
 | 
			
		||||
					/* if end of pattern then bad pattern (Missing ']') */
 | 
			
		||||
					if( ! *p ) return MATCH_PATTERN;
 | 
			
		||||
 | 
			
		||||
					/* check for range bar */
 | 
			
		||||
					if( *++p == '-' )
 | 
			
		||||
					{
 | 
			
		||||
						/* get the range end */
 | 
			
		||||
						range_end = *++p;
 | 
			
		||||
 | 
			
		||||
						/* if end of pattern or construct then bad pattern */
 | 
			
		||||
						if( range_end == '\0' || range_end == ']' ) return MATCH_PATTERN;
 | 
			
		||||
 | 
			
		||||
						/* special character range end */
 | 
			
		||||
						if( range_end == '\\' )
 | 
			
		||||
						{
 | 
			
		||||
							range_end = *++p;
 | 
			
		||||
 | 
			
		||||
							/* if end of text then we have a bad pattern */
 | 
			
		||||
							if ( ! range_end ) return MATCH_PATTERN;
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
						/* move just beyond this range */
 | 
			
		||||
						p++;
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					/* if the text character is in range then match found. make sure the range
 | 
			
		||||
					 * letters have the proper relationship to one another before comparison */
 | 
			
		||||
					if( range_start < range_end )
 | 
			
		||||
					{
 | 
			
		||||
						if( *t >= range_start && *t <= range_end )
 | 
			
		||||
						{
 | 
			
		||||
							member_match = true;
 | 
			
		||||
							loop = false;
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
					else
 | 
			
		||||
					{
 | 
			
		||||
						if( *t >= range_end && *t <= range_start )
 | 
			
		||||
						{
 | 
			
		||||
							member_match = true;
 | 
			
		||||
							loop = false;
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				/* if there was a match in an exclusion set then no match */
 | 
			
		||||
				/* if there was no match in a member set then no match */
 | 
			
		||||
				if(( invert && member_match ) || ! ( invert || member_match )) return MATCH_RANGE;
 | 
			
		||||
 | 
			
		||||
				/* if this is not an exclusion then skip the rest of the [...]
 | 
			
		||||
				 * construct that already matched. */
 | 
			
		||||
				if( member_match )
 | 
			
		||||
				{
 | 
			
		||||
					while( *p != ']' )
 | 
			
		||||
					{
 | 
			
		||||
						/* bad pattern (Missing ']') */
 | 
			
		||||
						if( ! *p ) return MATCH_PATTERN;
 | 
			
		||||
 | 
			
		||||
						/* skip exact match */
 | 
			
		||||
						if( *p == '\\' )
 | 
			
		||||
						{
 | 
			
		||||
							p++;
 | 
			
		||||
 | 
			
		||||
							/* if end of text then we have a bad pattern */
 | 
			
		||||
							if( ! *p ) return MATCH_PATTERN;
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
						/* move to next pattern char */
 | 
			
		||||
						p++;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				break;
 | 
			
		||||
			case '\\':	/* next character is quoted and must match exactly */
 | 
			
		||||
				/* move pattern pointer to quoted char and fall through */
 | 
			
		||||
				p++;
 | 
			
		||||
 | 
			
		||||
				/* if end of text then we have a bad pattern */
 | 
			
		||||
				if( ! *p ) return MATCH_PATTERN;
 | 
			
		||||
 | 
			
		||||
				/* must match this character exactly */
 | 
			
		||||
			default:
 | 
			
		||||
			default:	/* must match this character exactly */
 | 
			
		||||
				if( *p != *t ) return MATCH_LITERAL;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -252,7 +130,6 @@ Matche( const char *p, const char *t )
 | 
			
		||||
	else return MATCH_VALID;
 | 
			
		||||
} /* Matche */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
Matche_After_Star( const char *p, const char *t )
 | 
			
		||||
{
 | 
			
		||||
@@ -302,5 +179,4 @@ Matche_After_Star( const char *p, const char *t )
 | 
			
		||||
	return match;
 | 
			
		||||
} /* Matche_After_Star */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* -eof- */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -21,6 +21,7 @@
 | 
			
		||||
#define RPL_YOURHOST_MSG		"002 %s :Your host is %s, running version ngircd-%s (%s/%s/%s)"
 | 
			
		||||
#define RPL_CREATED_MSG			"003 %s :This server has been started %s"
 | 
			
		||||
#define RPL_MYINFO_MSG			"004 %s %s ngircd-%s %s %s"
 | 
			
		||||
#define RPL_ISUPPORTNET_MSG		"005 %s NETWORK=%s :is my network name"
 | 
			
		||||
#define RPL_ISUPPORT1_MSG		"005 %s RFC2812 IRCD=ngIRCd CHARSET=UTF-8 CASEMAPPING=ascii PREFIX=(qaohv)~&@%%+ CHANTYPES=%s CHANMODES=beI,k,l,imMnOPQRstVz CHANLIMIT=%s:%d :are supported on this server"
 | 
			
		||||
#define RPL_ISUPPORT2_MSG		"005 %s CHANNELLEN=%d NICKLEN=%d TOPICLEN=%d AWAYLEN=%d KICKLEN=%d MODES=%d MAXLIST=beI:%d EXCEPTS=e INVEX=I PENALTY :are supported on this server"
 | 
			
		||||
 | 
			
		||||
@@ -66,18 +67,20 @@
 | 
			
		||||
#define RPL_WHOISIDLE_MSG		"317 %s %s %lu %lu :seconds idle, signon time"
 | 
			
		||||
#define RPL_ENDOFWHOIS_MSG		"318 %s %s :End of WHOIS list"
 | 
			
		||||
#define RPL_WHOISCHANNELS_MSG		"319 %s %s :"
 | 
			
		||||
#define RPL_LISTSTART_MSG		"321 %s Channel :Users  Name"
 | 
			
		||||
#define RPL_LIST_MSG			"322 %s %s %ld :%s"
 | 
			
		||||
#define RPL_LISTEND_MSG			"323 %s :End of LIST"
 | 
			
		||||
#define RPL_CHANNELMODEIS_MSG		"324 %s %s +%s"
 | 
			
		||||
#define RPL_CREATIONTIME_MSG		"329 %s %s %ld"
 | 
			
		||||
#define RPL_WHOISLOGGEDIN_MSG		"330 %s %s %s :is logged in as"
 | 
			
		||||
#define RPL_NOTOPIC_MSG			"331 %s %s :No topic is set"
 | 
			
		||||
#define RPL_TOPIC_MSG			"332 %s %s :%s"
 | 
			
		||||
#define RPL_TOPICSETBY_MSG		"333 %s %s %s %u"
 | 
			
		||||
#define RPL_WHOISBOT_MSG		"335 %s %s :is a IRC Bot"
 | 
			
		||||
#define RPL_WHOISBOT_MSG		"335 %s %s :is an IRC Bot"
 | 
			
		||||
#define RPL_INVITING_MSG		"341 %s %s %s%s"
 | 
			
		||||
#define RPL_INVITELIST_MSG		"346 %s %s %s"
 | 
			
		||||
#define RPL_INVITELIST_MSG		"346 %s %s %s %s %d"
 | 
			
		||||
#define RPL_ENDOFINVITELIST_MSG		"347 %s %s :End of channel invite list"
 | 
			
		||||
#define RPL_EXCEPTLIST_MSG		"348 %s %s %s"
 | 
			
		||||
#define RPL_EXCEPTLIST_MSG		"348 %s %s %s %s %d"
 | 
			
		||||
#define RPL_ENDOFEXCEPTLIST_MSG		"349 %s %s :End of channel exception list"
 | 
			
		||||
#define RPL_VERSION_MSG			"351 %s %s-%s.%s %s :%s"
 | 
			
		||||
#define RPL_WHOREPLY_MSG		"352 %s %s %s %s %s %s %s :%d %s"
 | 
			
		||||
@@ -85,7 +88,7 @@
 | 
			
		||||
#define RPL_LINKS_MSG			"364 %s %s %s :%d %s"
 | 
			
		||||
#define RPL_ENDOFLINKS_MSG		"365 %s %s :End of LINKS list"
 | 
			
		||||
#define RPL_ENDOFNAMES_MSG		"366 %s %s :End of NAMES list"
 | 
			
		||||
#define RPL_BANLIST_MSG			"367 %s %s %s"
 | 
			
		||||
#define RPL_BANLIST_MSG			"367 %s %s %s %s %d"
 | 
			
		||||
#define RPL_ENDOFBANLIST_MSG		"368 %s %s :End of channel ban list"
 | 
			
		||||
#define RPL_ENDOFWHOWAS_MSG		"369 %s %s :End of WHOWAS list"
 | 
			
		||||
#define RPL_INFO_MSG    		"371 %s :%s"
 | 
			
		||||
@@ -124,6 +127,7 @@
 | 
			
		||||
#define ERR_USERONCHANNEL_MSG		"443 %s %s %s :is already on channel"
 | 
			
		||||
#define ERR_SUMMONDISABLED_MSG		"445 %s :SUMMON has been disabled"
 | 
			
		||||
#define ERR_USERSDISABLED_MSG		"446 %s :USERS has been disabled"
 | 
			
		||||
#define ERR_NONICKCHANGE_MSG		"447 %s :Cannot change nickname while on %s(+N)"
 | 
			
		||||
#define ERR_NOTREGISTERED_MSG		"451 %s :Connection not registered"
 | 
			
		||||
#define ERR_NOTREGISTEREDSERVER_MSG	"451 %s :Connection not registered as server link"
 | 
			
		||||
#define ERR_NEEDMOREPARAMS_MSG		"461 %s %s :Syntax error"
 | 
			
		||||
@@ -139,7 +143,7 @@
 | 
			
		||||
#define ERR_BADCHANNELKEY_MSG		"475 %s %s :Cannot join channel (+k) -- Wrong channel key"
 | 
			
		||||
#define ERR_NOCHANMODES_MSG		"477 %s %s :Channel doesn't support modes"
 | 
			
		||||
#define ERR_NEEDREGGEDNICK_MSG		"477 %s %s :Cannot send to channel (+M) -- You need to be identified to a registered account to message this channel"
 | 
			
		||||
#define ERR_LISTFULL_MSG		"478 %s %s %s: Channel list is full (%d)"
 | 
			
		||||
#define ERR_LISTFULL_MSG		"478 %s %s %s :Channel list is full (%d)"
 | 
			
		||||
#define ERR_NOPRIVILEGES_MSG		"481 %s :Permission denied"
 | 
			
		||||
#define ERR_CHANOPRIVSNEEDED_MSG	"482 %s %s :You are not channel operator"
 | 
			
		||||
#define ERR_CHANOPPRIVTOOLOW_MSG	"482 %s %s :Your privileges are too low"
 | 
			
		||||
@@ -154,6 +158,7 @@
 | 
			
		||||
#define ERR_UMODEUNKNOWNFLAG_MSG	"501 %s :Unknown mode"
 | 
			
		||||
#define ERR_UMODEUNKNOWNFLAG2_MSG	"501 %s :Unknown mode \"%c%c\""
 | 
			
		||||
#define ERR_USERSDONTMATCH_MSG		"502 %s :Can't set/get mode for other users"
 | 
			
		||||
#define ERR_USERNOTONSERV_MSG		"504 %s %s :User is not on this server"
 | 
			
		||||
#define ERR_NOINVITE_MSG		"518 %s :Cannot invite to %s (+V)"
 | 
			
		||||
 | 
			
		||||
#ifdef ZLIB
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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,12 +17,10 @@
 | 
			
		||||
 * by the loader of the operating system.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <signal.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
@@ -36,23 +34,16 @@
 | 
			
		||||
#include <mcheck.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "class.h"
 | 
			
		||||
#include "conf-ssl.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
#include "conf.h"
 | 
			
		||||
#include "lists.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "parse.h"
 | 
			
		||||
#include "sighandlers.h"
 | 
			
		||||
#include "io.h"
 | 
			
		||||
#include "irc.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "ngircd.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void Show_Version PARAMS(( void ));
 | 
			
		||||
static void Show_Help PARAMS(( void ));
 | 
			
		||||
 | 
			
		||||
@@ -297,10 +288,10 @@ main(int argc, const char *argv[])
 | 
			
		||||
			 PROTOVER, PROTOIRCPLUS, PACKAGE_NAME, PACKAGE_VERSION,
 | 
			
		||||
			 IRCPLUSFLAGS);
 | 
			
		||||
#ifdef ZLIB
 | 
			
		||||
		strcat(NGIRCd_ProtoID, "Z");
 | 
			
		||||
		strlcat(NGIRCd_ProtoID, "Z", sizeof NGIRCd_ProtoID);
 | 
			
		||||
#endif
 | 
			
		||||
		if (Conf_OperCanMode)
 | 
			
		||||
			strcat(NGIRCd_ProtoID, "o");
 | 
			
		||||
			strlcat(NGIRCd_ProtoID, "o", sizeof NGIRCd_ProtoID);
 | 
			
		||||
#else /* IRCPLUS */
 | 
			
		||||
		snprintf(NGIRCd_ProtoID, sizeof NGIRCd_ProtoID, "%s%s %s|%s",
 | 
			
		||||
			 PROTOVER, PROTOIRC, PACKAGE_NAME, PACKAGE_VERSION);
 | 
			
		||||
@@ -460,7 +451,7 @@ static void
 | 
			
		||||
Show_Version( void )
 | 
			
		||||
{
 | 
			
		||||
	puts( NGIRCd_Version );
 | 
			
		||||
	puts( "Copyright (c)2001-2013 Alexander Barton (<alex@barton.de>) and Contributors." );
 | 
			
		||||
	puts( "Copyright (c)2001-2014 Alexander Barton (<alex@barton.de>) and Contributors." );
 | 
			
		||||
	puts( "Homepage: <http://ngircd.barton.de/>\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." );
 | 
			
		||||
@@ -539,7 +530,7 @@ Pidfile_Create(pid_t pid)
 | 
			
		||||
		close(pidfd);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	if (write(pidfd, pidbuf, (size_t)len) != (ssize_t)len)
 | 
			
		||||
		Log(LOG_ERR, "Can't write PID file (%s): %s!", Conf_PidFile,
 | 
			
		||||
		    strerror(errno));
 | 
			
		||||
@@ -613,6 +604,13 @@ NGIRCd_getNobodyID(uid_t *uid, gid_t *gid )
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_ARC4RANDOM
 | 
			
		||||
static void
 | 
			
		||||
Random_Init(void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
static bool
 | 
			
		||||
Random_Init_Kern(const char *file)
 | 
			
		||||
{
 | 
			
		||||
@@ -642,6 +640,7 @@ Random_Init(void)
 | 
			
		||||
		return;
 | 
			
		||||
	srand(rand() ^ (unsigned)getpid() ^ (unsigned)time(NULL));
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -722,9 +721,10 @@ NGIRCd_Init(bool NGIRCd_NoDaemon)
 | 
			
		||||
			Log(LOG_ERR, "Can't change group ID to %s(%u): %s!",
 | 
			
		||||
			    grp ? grp->gr_name : "?", Conf_GID,
 | 
			
		||||
			    strerror(real_errno));
 | 
			
		||||
			if (real_errno != EPERM) 
 | 
			
		||||
			if (real_errno != EPERM)
 | 
			
		||||
				goto out;
 | 
			
		||||
		}
 | 
			
		||||
#ifdef HAVE_SETGROUPS
 | 
			
		||||
		if (setgroups(0, NULL) != 0) {
 | 
			
		||||
			real_errno = errno;
 | 
			
		||||
			Log(LOG_ERR, "Can't drop supplementary group IDs: %s!",
 | 
			
		||||
@@ -732,6 +732,10 @@ NGIRCd_Init(bool NGIRCd_NoDaemon)
 | 
			
		||||
			if (real_errno != EPERM)
 | 
			
		||||
				goto out;
 | 
			
		||||
		}
 | 
			
		||||
#else
 | 
			
		||||
		Log(LOG_WARNING,
 | 
			
		||||
		    "Can't drop supplementary group IDs: setgroups(3) missing!");
 | 
			
		||||
#endif
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2008 Alexander Barton (alex@barton.de)
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -16,29 +16,23 @@
 | 
			
		||||
 * Handlers for IRC numerics sent to the server
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "conf.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "conn-func.h"
 | 
			
		||||
#include "conf.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
#include "class.h"
 | 
			
		||||
#include "irc-write.h"
 | 
			
		||||
#include "lists.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "messages.h"
 | 
			
		||||
#include "parse.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "numeric.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Announce a channel and its users in the network.
 | 
			
		||||
 */
 | 
			
		||||
@@ -47,7 +41,7 @@ Announce_Channel(CLIENT *Client, CHANNEL *Chan)
 | 
			
		||||
{
 | 
			
		||||
	CL2CHAN *cl2chan;
 | 
			
		||||
	CLIENT *cl;
 | 
			
		||||
	char str[LINE_LEN], *ptr;
 | 
			
		||||
	char str[COMMAND_LEN], *ptr;
 | 
			
		||||
	bool njoin, xop;
 | 
			
		||||
 | 
			
		||||
	/* Check features of remote server */
 | 
			
		||||
@@ -82,7 +76,7 @@ Announce_Channel(CLIENT *Client, CHANNEL *Chan)
 | 
			
		||||
			strlcat(str, Client_ID(cl), sizeof(str));
 | 
			
		||||
 | 
			
		||||
			/* Send the data if the buffer is "full" */
 | 
			
		||||
			if (strlen(str) > (LINE_LEN - CLIENT_NICK_LEN - 8)) {
 | 
			
		||||
			if (strlen(str) > (sizeof(str) - CLIENT_NICK_LEN - 8)) {
 | 
			
		||||
				if (!IRC_WriteStrClient(Client, "%s", str))
 | 
			
		||||
					return DISCONNECTED;
 | 
			
		||||
				snprintf(str, sizeof(str), "NJOIN %s :",
 | 
			
		||||
@@ -117,7 +111,6 @@ Announce_Channel(CLIENT *Client, CHANNEL *Chan)
 | 
			
		||||
	return CONNECTED;
 | 
			
		||||
} /* Announce_Channel */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Announce new server in the network
 | 
			
		||||
 * @param Client New server
 | 
			
		||||
@@ -149,11 +142,30 @@ Announce_Server(CLIENT * Client, CLIENT * Server)
 | 
			
		||||
		Client_MyToken(Server), Client_Info(Server));
 | 
			
		||||
} /* Announce_Server */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef IRCPLUS
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Synchronize invite, ban, G- and K-Line lists between servers.
 | 
			
		||||
 * Send a specific list to a remote server.
 | 
			
		||||
 */
 | 
			
		||||
static bool
 | 
			
		||||
Send_List(CLIENT *Client, CHANNEL *Chan, struct list_head *Head, char Type)
 | 
			
		||||
{
 | 
			
		||||
	struct list_elem *elem;
 | 
			
		||||
 | 
			
		||||
	elem = Lists_GetFirst(Head);
 | 
			
		||||
	while (elem) {
 | 
			
		||||
		if (!IRC_WriteStrClient(Client, "MODE %s +%c %s",
 | 
			
		||||
					Channel_Name(Chan), Type,
 | 
			
		||||
					Lists_GetMask(elem))) {
 | 
			
		||||
			return DISCONNECTED;
 | 
			
		||||
		}
 | 
			
		||||
		elem = Lists_GetNext(elem);
 | 
			
		||||
	}
 | 
			
		||||
	return CONNECTED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Synchronize invite, ban, except, and G-Line lists between servers.
 | 
			
		||||
 *
 | 
			
		||||
 * @param Client New server.
 | 
			
		||||
 * @return CONNECTED or DISCONNECTED.
 | 
			
		||||
@@ -181,36 +193,17 @@ Synchronize_Lists(CLIENT * Client)
 | 
			
		||||
 | 
			
		||||
	c = Channel_First();
 | 
			
		||||
	while (c) {
 | 
			
		||||
		/* ban list */
 | 
			
		||||
		head = Channel_GetListBans(c);
 | 
			
		||||
		elem = Lists_GetFirst(head);
 | 
			
		||||
		while (elem) {
 | 
			
		||||
			if (!IRC_WriteStrClient(Client, "MODE %s +b %s",
 | 
			
		||||
						Channel_Name(c),
 | 
			
		||||
						Lists_GetMask(elem))) {
 | 
			
		||||
				return DISCONNECTED;
 | 
			
		||||
			}
 | 
			
		||||
			elem = Lists_GetNext(elem);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* invite list */
 | 
			
		||||
		head = Channel_GetListInvites(c);
 | 
			
		||||
		elem = Lists_GetFirst(head);
 | 
			
		||||
		while (elem) {
 | 
			
		||||
			if (!IRC_WriteStrClient(Client, "MODE %s +I %s",
 | 
			
		||||
						Channel_Name(c),
 | 
			
		||||
						Lists_GetMask(elem))) {
 | 
			
		||||
				return DISCONNECTED;
 | 
			
		||||
			}
 | 
			
		||||
			elem = Lists_GetNext(elem);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (!Send_List(Client, c, Channel_GetListExcepts(c), 'e'))
 | 
			
		||||
			return DISCONNECTED;
 | 
			
		||||
		if (!Send_List(Client, c, Channel_GetListBans(c), 'b'))
 | 
			
		||||
			return DISCONNECTED;
 | 
			
		||||
		if (!Send_List(Client, c, Channel_GetListInvites(c), 'I'))
 | 
			
		||||
			return DISCONNECTED;
 | 
			
		||||
		c = Channel_Next(c);
 | 
			
		||||
	}
 | 
			
		||||
	return CONNECTED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Send CHANINFO commands to a new server (inform it about existing channels).
 | 
			
		||||
 * @param Client New server
 | 
			
		||||
@@ -223,7 +216,8 @@ Send_CHANINFO(CLIENT * Client, CHANNEL * Chan)
 | 
			
		||||
	bool has_k, has_l;
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
	Log(LOG_DEBUG, "Sending CHANINFO commands ...");
 | 
			
		||||
	Log(LOG_DEBUG, "Sending CHANINFO commands for \"%s\" ...",
 | 
			
		||||
	    Channel_Name(Chan));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	modes = Channel_Modes(Chan);
 | 
			
		||||
@@ -255,7 +249,6 @@ Send_CHANINFO(CLIENT * Client, CHANNEL * Chan)
 | 
			
		||||
 | 
			
		||||
#endif /* IRCPLUS */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Handle ENDOFMOTD (376) numeric and login remote server.
 | 
			
		||||
 * The peer is either an IRC server (no IRC+ protocol), or we got the
 | 
			
		||||
@@ -349,7 +342,6 @@ IRC_Num_ENDOFMOTD(CLIENT * Client, UNUSED REQUEST * Req)
 | 
			
		||||
	return CONNECTED;
 | 
			
		||||
} /* IRC_Num_ENDOFMOTD */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Handle ISUPPORT (005) numeric.
 | 
			
		||||
 */
 | 
			
		||||
@@ -385,5 +377,4 @@ IRC_Num_ISUPPORT(CLIENT * Client, REQUEST * Req)
 | 
			
		||||
	return CONNECTED;
 | 
			
		||||
} /* IRC_Num_ISUPPORT */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* -eof- */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -16,9 +16,7 @@
 | 
			
		||||
 * IRC operator functions
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
@@ -28,10 +26,8 @@
 | 
			
		||||
#include "messages.h"
 | 
			
		||||
#include "irc-write.h"
 | 
			
		||||
 | 
			
		||||
#include <exp.h>
 | 
			
		||||
#include "op.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Return and log a "no privileges" message.
 | 
			
		||||
 */
 | 
			
		||||
@@ -44,19 +40,18 @@ Op_NoPrivileges(CLIENT * Client, REQUEST * Req)
 | 
			
		||||
		from = Client_Search(Req->prefix);
 | 
			
		||||
 | 
			
		||||
	if (from) {
 | 
			
		||||
		Log(LOG_NOTICE, "No privileges: client \"%s\" (%s), command \"%s\"",
 | 
			
		||||
		Log(LOG_NOTICE, "No privileges: client \"%s\" (%s), command \"%s\"!",
 | 
			
		||||
		    Req->prefix, Client_Mask(Client), Req->command);
 | 
			
		||||
		return IRC_WriteErrClient(from, ERR_NOPRIVILEGES_MSG,
 | 
			
		||||
					  Client_ID(from));
 | 
			
		||||
	} else {
 | 
			
		||||
		Log(LOG_NOTICE, "No privileges: client \"%s\", command \"%s\"",
 | 
			
		||||
		Log(LOG_NOTICE, "No privileges: client \"%s\", command \"%s\"!",
 | 
			
		||||
		    Client_Mask(Client), Req->command);
 | 
			
		||||
		return IRC_WriteErrClient(Client, ERR_NOPRIVILEGES_MSG,
 | 
			
		||||
					  Client_ID(Client));
 | 
			
		||||
	}
 | 
			
		||||
} /* Op_NoPrivileges */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Check that the originator of a request is an IRC operator and allowed
 | 
			
		||||
 * to administer this server.
 | 
			
		||||
@@ -94,5 +89,4 @@ Op_Check(CLIENT * Client, REQUEST * Req)
 | 
			
		||||
	return c;
 | 
			
		||||
} /* Op_Check */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* -eof- */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2010 Alexander Barton (alex@barton.de).
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -18,26 +18,21 @@
 | 
			
		||||
 * PAM User Authentication
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#ifdef HAVE_SECURITY_PAM_APPL_H
 | 
			
		||||
# include <security/pam_appl.h>
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef HAVE_PAM_PAM_APPL_H
 | 
			
		||||
# include <pam/pam_appl.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "client.h"
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_SECURITY_PAM_APPL_H
 | 
			
		||||
#include <security/pam_appl.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_PAM_PAM_APPL_H
 | 
			
		||||
#include <pam/pam_appl.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "pam.h"
 | 
			
		||||
 | 
			
		||||
static char *password;
 | 
			
		||||
@@ -87,7 +82,7 @@ static struct pam_conv conv = {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Authenticate a connectiong client using PAM.
 | 
			
		||||
 * Authenticate a connecting client using PAM.
 | 
			
		||||
 * @param Client The client to authenticate.
 | 
			
		||||
 * @return true when authentication succeeded, false otherwise.
 | 
			
		||||
 */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2015 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -16,29 +16,26 @@
 | 
			
		||||
 * IRC command parser and validator.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <strings.h>
 | 
			
		||||
 | 
			
		||||
#include "ngircd.h"
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "conn-func.h"
 | 
			
		||||
#include "conf.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "messages.h"
 | 
			
		||||
#include "tool.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "parse.h"
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include "irc.h"
 | 
			
		||||
#include "irc-cap.h"
 | 
			
		||||
#include "irc-channel.h"
 | 
			
		||||
#include "irc-encoding.h"
 | 
			
		||||
#ifdef ICONV
 | 
			
		||||
# include "irc-encoding.h"
 | 
			
		||||
#endif
 | 
			
		||||
#include "irc-info.h"
 | 
			
		||||
#include "irc-login.h"
 | 
			
		||||
#include "irc-metadata.h"
 | 
			
		||||
@@ -49,9 +46,6 @@
 | 
			
		||||
#include "irc-write.h"
 | 
			
		||||
#include "numeric.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "conf.h"
 | 
			
		||||
 | 
			
		||||
struct _NUMERIC {
 | 
			
		||||
	int numeric;
 | 
			
		||||
	bool (*function) PARAMS(( CLIENT *Client, REQUEST *Request ));
 | 
			
		||||
@@ -60,78 +54,81 @@ struct _NUMERIC {
 | 
			
		||||
 | 
			
		||||
static COMMAND My_Commands[] =
 | 
			
		||||
{
 | 
			
		||||
	{ "ADMIN", IRC_ADMIN, CLIENT_USER|CLIENT_SERVER, 0, 1, 0, 0, 0 },
 | 
			
		||||
	{ "AWAY", IRC_AWAY, CLIENT_USER, 0, 1, 0, 0, 0 },
 | 
			
		||||
	{ "CAP", IRC_CAP, CLIENT_ANY, 1, 2, 0, 0, 0 },
 | 
			
		||||
	{ "CONNECT", IRC_CONNECT, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 },
 | 
			
		||||
#define _CMD(name, func, type, min, max, penalty) \
 | 
			
		||||
    { (name), (func), (type), (min), (max), (penalty), 0, 0, 0 }
 | 
			
		||||
	_CMD("ADMIN", IRC_ADMIN, CLIENT_USER|CLIENT_SERVER, 0, 1, 1),
 | 
			
		||||
	_CMD("AWAY", IRC_AWAY, CLIENT_USER, 0, 1, 0),
 | 
			
		||||
	_CMD("CAP", IRC_CAP, CLIENT_ANY, 1, 2, 0),
 | 
			
		||||
	_CMD("CONNECT", IRC_CONNECT, CLIENT_USER|CLIENT_SERVER, 0, -1, 0),
 | 
			
		||||
#ifdef STRICT_RFC
 | 
			
		||||
	{ "DIE", IRC_DIE, CLIENT_USER, 0, 0, 0, 0, 0 },
 | 
			
		||||
	_CMD("DIE", IRC_DIE, CLIENT_USER, 0, 0, 0),
 | 
			
		||||
#else
 | 
			
		||||
	{ "DIE", IRC_DIE, CLIENT_USER, 0, 1, 0, 0, 0 },
 | 
			
		||||
	_CMD("DIE", IRC_DIE, CLIENT_USER, 0, 1, 0),
 | 
			
		||||
#endif
 | 
			
		||||
	{ "DISCONNECT", IRC_DISCONNECT, CLIENT_USER, 1, 1, 0, 0, 0 },
 | 
			
		||||
	{ "ERROR", IRC_ERROR, CLIENT_ANY, 0, -1, 0, 0, 0 },
 | 
			
		||||
	{ "GLINE", IRC_xLINE, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 },
 | 
			
		||||
	{ "HELP", IRC_HELP, CLIENT_USER, 0, 1, 0, 0, 0 },
 | 
			
		||||
	{ "INFO", IRC_INFO, CLIENT_USER|CLIENT_SERVER, 0, 1, 0, 0, 0 },
 | 
			
		||||
	{ "INVITE", IRC_INVITE, CLIENT_USER|CLIENT_SERVER, 2, 2, 0, 0, 0 },
 | 
			
		||||
	{ "ISON", IRC_ISON, CLIENT_USER, 1, -1, 0, 0, 0 },
 | 
			
		||||
	{ "JOIN", IRC_JOIN, CLIENT_USER|CLIENT_SERVER, 1, 2, 0, 0, 0 },
 | 
			
		||||
	{ "KICK", IRC_KICK, CLIENT_USER|CLIENT_SERVER, 2, 3, 0, 0, 0 },
 | 
			
		||||
	{ "KILL", IRC_KILL, CLIENT_USER|CLIENT_SERVER, 2, 2, 0, 0, 0 },
 | 
			
		||||
	{ "KLINE", IRC_xLINE, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 },
 | 
			
		||||
	{ "LINKS", IRC_LINKS, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 },
 | 
			
		||||
	{ "LIST", IRC_LIST, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 },
 | 
			
		||||
	{ "LUSERS", IRC_LUSERS, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 },
 | 
			
		||||
	{ "METADATA", IRC_METADATA, CLIENT_SERVER, 3, 3, 0, 0, 0 },
 | 
			
		||||
	{ "MODE", IRC_MODE, CLIENT_USER|CLIENT_SERVER, 1, -1, 0, 0, 0 },
 | 
			
		||||
	{ "MOTD", IRC_MOTD, CLIENT_USER|CLIENT_SERVER, 0, 1, 0, 0, 0 },
 | 
			
		||||
	{ "NAMES", IRC_NAMES, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 },
 | 
			
		||||
	{ "NICK", IRC_NICK, CLIENT_ANY, 0, -1, 0, 0, 0 },
 | 
			
		||||
	{ "NJOIN", IRC_NJOIN, CLIENT_SERVER, 2, 2, 0, 0, 0 },
 | 
			
		||||
	{ "NOTICE", IRC_NOTICE, CLIENT_ANY, 0, -1, 0, 0, 0 },
 | 
			
		||||
	{ "OPER", IRC_OPER, CLIENT_USER, 2, 2, 0, 0, 0 },
 | 
			
		||||
	{ "PART", IRC_PART, CLIENT_USER|CLIENT_SERVER, 1, 2, 0, 0, 0 },
 | 
			
		||||
	{ "PASS", IRC_PASS, CLIENT_ANY, 0, -1, 0, 0, 0 },
 | 
			
		||||
	{ "PING", IRC_PING, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 },
 | 
			
		||||
	{ "PONG", IRC_PONG, CLIENT_ANY, 0, -1, 0, 0, 0 },
 | 
			
		||||
	{ "PRIVMSG", IRC_PRIVMSG, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 },
 | 
			
		||||
	{ "QUIT", IRC_QUIT, CLIENT_ANY, 0, 1, 0, 0, 0 },
 | 
			
		||||
	{ "REHASH", IRC_REHASH, CLIENT_USER, 0, 0, 0, 0, 0 },
 | 
			
		||||
	{ "RESTART", IRC_RESTART, CLIENT_USER, 0, 0, 0, 0, 0 },
 | 
			
		||||
	{ "SERVER", IRC_SERVER, CLIENT_ANY, 0, -1, 0, 0, 0 },
 | 
			
		||||
	{ "SERVICE", IRC_SERVICE, CLIENT_ANY, 6, 6, 0, 0, 0 },
 | 
			
		||||
	{ "SERVLIST", IRC_SERVLIST, CLIENT_USER, 0, 2, 0, 0, 0 },
 | 
			
		||||
	{ "SQUERY", IRC_SQUERY, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 },
 | 
			
		||||
	{ "SQUIT", IRC_SQUIT, CLIENT_USER|CLIENT_SERVER, 2, 2, 0, 0, 0 },
 | 
			
		||||
	{ "STATS", IRC_STATS, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 },
 | 
			
		||||
	{ "SVSNICK", IRC_SVSNICK, CLIENT_SERVER, 2, 2, 0, 0, 0 },
 | 
			
		||||
	{ "SUMMON", IRC_SUMMON, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 },
 | 
			
		||||
	{ "TIME", IRC_TIME, CLIENT_USER|CLIENT_SERVER, 0, 1, 0, 0, 0 },
 | 
			
		||||
	{ "TOPIC", IRC_TOPIC, CLIENT_USER|CLIENT_SERVER, 1, 2, 0, 0, 0 },
 | 
			
		||||
	{ "TRACE", IRC_TRACE, CLIENT_USER|CLIENT_SERVER, 0, 1, 0, 0, 0 },
 | 
			
		||||
	{ "USER", IRC_USER, CLIENT_ANY, 0, -1, 0, 0, 0 },
 | 
			
		||||
	{ "USERHOST", IRC_USERHOST, CLIENT_USER, 1, -1, 0, 0, 0 },
 | 
			
		||||
	{ "USERS", IRC_USERS, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 },
 | 
			
		||||
	{ "VERSION", IRC_VERSION, CLIENT_USER|CLIENT_SERVER, 0, 1, 0, 0, 0 },
 | 
			
		||||
	{ "WALLOPS", IRC_WALLOPS, CLIENT_USER|CLIENT_SERVER, 1, 1, 0, 0, 0 },
 | 
			
		||||
	{ "WEBIRC", IRC_WEBIRC, CLIENT_UNKNOWN, 4, 4, 0, 0, 0 },
 | 
			
		||||
	{ "WHO", IRC_WHO, CLIENT_USER, 0, 2, 0, 0, 0 },
 | 
			
		||||
	{ "WHOIS", IRC_WHOIS, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 },
 | 
			
		||||
	{ "WHOWAS", IRC_WHOWAS, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 },
 | 
			
		||||
	_CMD("DISCONNECT", IRC_DISCONNECT, CLIENT_USER, 1, 1, 0),
 | 
			
		||||
	_CMD("ERROR", IRC_ERROR, CLIENT_ANY, 0, -1, 0),
 | 
			
		||||
	_CMD("GLINE", IRC_xLINE, CLIENT_USER|CLIENT_SERVER, 0, -1, 0),
 | 
			
		||||
	_CMD("HELP", IRC_HELP, CLIENT_USER, 0, 1, 2),
 | 
			
		||||
	_CMD("INFO", IRC_INFO, CLIENT_USER|CLIENT_SERVER, 0, 1, 2),
 | 
			
		||||
	_CMD("INVITE", IRC_INVITE, CLIENT_USER|CLIENT_SERVER, 2, 2, 1),
 | 
			
		||||
	_CMD("ISON", IRC_ISON, CLIENT_USER, 1, -1, 0),
 | 
			
		||||
	_CMD("JOIN", IRC_JOIN, CLIENT_USER|CLIENT_SERVER, 1, 2, 0),
 | 
			
		||||
	_CMD("KICK", IRC_KICK, CLIENT_USER|CLIENT_SERVER, 2, 3, 0),
 | 
			
		||||
	_CMD("KILL", IRC_KILL, CLIENT_USER|CLIENT_SERVER, 2, 2, 0),
 | 
			
		||||
	_CMD("KLINE", IRC_xLINE, CLIENT_USER|CLIENT_SERVER, 0, -1, 0),
 | 
			
		||||
	_CMD("LINKS", IRC_LINKS, CLIENT_USER|CLIENT_SERVER, 0, 2, 1),
 | 
			
		||||
	_CMD("LIST", IRC_LIST, CLIENT_USER|CLIENT_SERVER, 0, 2, 2),
 | 
			
		||||
	_CMD("LUSERS", IRC_LUSERS, CLIENT_USER|CLIENT_SERVER, 0, 2, 1),
 | 
			
		||||
	_CMD("METADATA", IRC_METADATA, CLIENT_SERVER, 3, 3, 0),
 | 
			
		||||
	_CMD("MODE", IRC_MODE, CLIENT_USER|CLIENT_SERVER, 1, -1, 1),
 | 
			
		||||
	_CMD("MOTD", IRC_MOTD, CLIENT_USER|CLIENT_SERVER, 0, 1, 3),
 | 
			
		||||
	_CMD("NAMES", IRC_NAMES, CLIENT_USER|CLIENT_SERVER, 0, 2, 1),
 | 
			
		||||
	_CMD("NICK", IRC_NICK, CLIENT_ANY, 0, -1, 0),
 | 
			
		||||
	_CMD("NJOIN", IRC_NJOIN, CLIENT_SERVER, 2, 2, 0),
 | 
			
		||||
	_CMD("NOTICE", IRC_NOTICE, CLIENT_ANY, 0, -1, 0),
 | 
			
		||||
	_CMD("OPER", IRC_OPER, CLIENT_USER, 2, 2, 0),
 | 
			
		||||
	_CMD("PART", IRC_PART, CLIENT_USER|CLIENT_SERVER, 1, 2, 0),
 | 
			
		||||
	_CMD("PASS", IRC_PASS, CLIENT_ANY, 0, -1, 0),
 | 
			
		||||
	_CMD("PING", IRC_PING, CLIENT_USER|CLIENT_SERVER, 0, -1, 0),
 | 
			
		||||
	_CMD("PONG", IRC_PONG, CLIENT_ANY, 0, -1, 0),
 | 
			
		||||
	_CMD("PRIVMSG", IRC_PRIVMSG, CLIENT_USER|CLIENT_SERVER, 0, 2, 0),
 | 
			
		||||
	_CMD("QUIT", IRC_QUIT, CLIENT_ANY, 0, 1, 0),
 | 
			
		||||
	_CMD("REHASH", IRC_REHASH, CLIENT_USER, 0, 0, 0),
 | 
			
		||||
	_CMD("RESTART", IRC_RESTART, CLIENT_USER, 0, 0, 0),
 | 
			
		||||
	_CMD("SERVER", IRC_SERVER, CLIENT_ANY, 0, -1, 0),
 | 
			
		||||
	_CMD("SERVICE", IRC_SERVICE, CLIENT_ANY, 6, 6, 0),
 | 
			
		||||
	_CMD("SERVLIST", IRC_SERVLIST, CLIENT_USER, 0, 2, 1),
 | 
			
		||||
	_CMD("SQUERY", IRC_SQUERY, CLIENT_USER|CLIENT_SERVER, 0, 2, 0),
 | 
			
		||||
	_CMD("SQUIT", IRC_SQUIT, CLIENT_USER|CLIENT_SERVER, 2, 2, 0),
 | 
			
		||||
	_CMD("STATS", IRC_STATS, CLIENT_USER|CLIENT_SERVER, 0, 2, 2),
 | 
			
		||||
	_CMD("SVSNICK", IRC_SVSNICK, CLIENT_SERVER, 2, 2, 0),
 | 
			
		||||
	_CMD("SUMMON", IRC_SUMMON, CLIENT_USER|CLIENT_SERVER, 0, -1, 0),
 | 
			
		||||
	_CMD("TIME", IRC_TIME, CLIENT_USER|CLIENT_SERVER, 0, 1, 1),
 | 
			
		||||
	_CMD("TOPIC", IRC_TOPIC, CLIENT_USER|CLIENT_SERVER, 1, 2, 1),
 | 
			
		||||
	_CMD("TRACE", IRC_TRACE, CLIENT_USER|CLIENT_SERVER, 0, 1, 3),
 | 
			
		||||
	_CMD("USER", IRC_USER, CLIENT_ANY, 0, -1, 0),
 | 
			
		||||
	_CMD("USERHOST", IRC_USERHOST, CLIENT_USER, 1, -1, 1),
 | 
			
		||||
	_CMD("USERS", IRC_USERS, CLIENT_USER|CLIENT_SERVER, 0, -1, 0),
 | 
			
		||||
	_CMD("VERSION", IRC_VERSION, CLIENT_USER|CLIENT_SERVER, 0, 1, 1),
 | 
			
		||||
	_CMD("WALLOPS", IRC_WALLOPS, CLIENT_USER|CLIENT_SERVER, 1, 1, 0),
 | 
			
		||||
	_CMD("WEBIRC", IRC_WEBIRC, CLIENT_UNKNOWN, 4, 4, 0),
 | 
			
		||||
	_CMD("WHO", IRC_WHO, CLIENT_USER, 0, 2, 1),
 | 
			
		||||
	_CMD("WHOIS", IRC_WHOIS, CLIENT_USER|CLIENT_SERVER, 0, -1, 1),
 | 
			
		||||
	_CMD("WHOWAS", IRC_WHOWAS, CLIENT_USER|CLIENT_SERVER, 0, -1, 0),
 | 
			
		||||
 | 
			
		||||
#ifdef IRCPLUS
 | 
			
		||||
	{ "CHANINFO", IRC_CHANINFO, CLIENT_SERVER, 0, -1, 0, 0, 0 },
 | 
			
		||||
	_CMD("CHANINFO", IRC_CHANINFO, CLIENT_SERVER, 0, -1, 0),
 | 
			
		||||
# ifdef ICONV
 | 
			
		||||
	{ "CHARCONV", IRC_CHARCONV, CLIENT_USER, 1, 1, 0, 0, 0 },
 | 
			
		||||
	_CMD("CHARCONV", IRC_CHARCONV, CLIENT_USER, 1, 1, 0),
 | 
			
		||||
# endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef STRICT_RFC
 | 
			
		||||
	{ "GET",  IRC_QUIT_HTTP, CLIENT_UNKNOWN, 0, -1, 0, 0, 0 },
 | 
			
		||||
	{ "POST", IRC_QUIT_HTTP, CLIENT_UNKNOWN, 0, -1, 0, 0, 0 },
 | 
			
		||||
	_CMD("GET",  IRC_QUIT_HTTP, CLIENT_UNKNOWN, 0, -1, 0),
 | 
			
		||||
	_CMD("POST", IRC_QUIT_HTTP, CLIENT_UNKNOWN, 0, -1, 0),
 | 
			
		||||
#endif
 | 
			
		||||
	{ NULL, NULL, 0x0, 0, 0, 0, 0, 0 } /* End-Mark */
 | 
			
		||||
	_CMD(NULL, NULL, 0, 0, 0, 0) /* End-Mark */
 | 
			
		||||
#undef _CMD
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void Init_Request PARAMS(( REQUEST *Req ));
 | 
			
		||||
@@ -159,7 +156,7 @@ Parse_GetCommandStruct( void )
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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 assume that this is a valid IRC command and
 | 
			
		||||
 * try to do something useful with it :-)
 | 
			
		||||
@@ -345,7 +342,7 @@ Validate_Prefix( CONN_ID Idx, REQUEST *Req, bool *Closed )
 | 
			
		||||
	/* check if the client named in the prefix is expected
 | 
			
		||||
	 * to come from that direction */
 | 
			
		||||
	if (Client_NextHop(c) != client) {
 | 
			
		||||
		if (Client_Type(c) != CLIENT_SERVER) {
 | 
			
		||||
		if (Client_Type(client) != CLIENT_SERVER) {
 | 
			
		||||
			Log(LOG_ERR,
 | 
			
		||||
			    "Spoofed prefix \"%s\" from \"%s\" (connection %d, command \"%s\"), closing connection!",
 | 
			
		||||
			    Req->prefix, Client_ID(client), Idx, Req->command);
 | 
			
		||||
@@ -423,7 +420,7 @@ Handle_Numeric(CLIENT *client, REQUEST *Req)
 | 
			
		||||
		{ 376, IRC_Num_ENDOFMOTD }
 | 
			
		||||
	};
 | 
			
		||||
	int i, num;
 | 
			
		||||
	char str[LINE_LEN];
 | 
			
		||||
	char str[COMMAND_LEN];
 | 
			
		||||
	CLIENT *prefix, *target = NULL;
 | 
			
		||||
 | 
			
		||||
	/* Determine target */
 | 
			
		||||
@@ -464,10 +461,10 @@ Handle_Numeric(CLIENT *client, REQUEST *Req)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Determine source */
 | 
			
		||||
	if (! Req->prefix[0]) {
 | 
			
		||||
		/* Oops, no prefix!? */
 | 
			
		||||
		Log(LOG_WARNING, "Got status code %s from \"%s\" without prefix!?",
 | 
			
		||||
						Req->command, Client_ID(client));
 | 
			
		||||
	if (!Req->prefix) {
 | 
			
		||||
		Log(LOG_WARNING,
 | 
			
		||||
		    "Got status code %s from \"%s\" without prefix!?",
 | 
			
		||||
		    Req->command, Client_ID(client));
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -530,12 +527,13 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
 | 
			
		||||
						Client_ID(client));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (cmd->penalty)
 | 
			
		||||
			IRC_SetPenalty(client, cmd->penalty);
 | 
			
		||||
 | 
			
		||||
		if (Req->argc < cmd->min_argc ||
 | 
			
		||||
		    (cmd->max_argc != -1 && Req->argc > cmd->max_argc)) {
 | 
			
		||||
			IRC_SetPenalty(client, 2);
 | 
			
		||||
			return IRC_WriteStrClient(client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
		    (cmd->max_argc != -1 && Req->argc > cmd->max_argc))
 | 
			
		||||
			return IRC_WriteErrClient(client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
						  Client_ID(client), Req->command);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Command is allowed for this client: call it and count
 | 
			
		||||
		 * generated bytes in output */
 | 
			
		||||
 
 | 
			
		||||
@@ -37,6 +37,7 @@ typedef struct _COMMAND
 | 
			
		||||
	CLIENT_TYPE type;		/**< Valid client types (bit mask) */
 | 
			
		||||
	int min_argc;			/**< Min parameters */
 | 
			
		||||
	int max_argc;			/**< Max parameters */
 | 
			
		||||
	int penalty;			/**< Penalty for this command */
 | 
			
		||||
	long lcount, rcount;		/**< Number of local and remote calls */
 | 
			
		||||
	long bytes;			/**< Number of bytes created */
 | 
			
		||||
} COMMAND;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -16,20 +16,19 @@
 | 
			
		||||
 * Process management
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <signal.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "io.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "sighandlers.h"
 | 
			
		||||
 | 
			
		||||
#include "proc.h"
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -50,7 +49,9 @@ GLOBAL pid_t
 | 
			
		||||
Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short), int timeout)
 | 
			
		||||
{
 | 
			
		||||
	pid_t pid;
 | 
			
		||||
#ifndef HAVE_ARC4RANDOM
 | 
			
		||||
	unsigned int seed;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	assert(proc != NULL);
 | 
			
		||||
	assert(pipefds != NULL);
 | 
			
		||||
@@ -62,7 +63,9 @@ Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short), int timeout
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#ifndef HAVE_ARC4RANDOM
 | 
			
		||||
	seed = (unsigned int)rand();
 | 
			
		||||
#endif
 | 
			
		||||
	pid = fork();
 | 
			
		||||
	switch (pid) {
 | 
			
		||||
	case -1:
 | 
			
		||||
@@ -73,7 +76,12 @@ Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short), int timeout
 | 
			
		||||
		return -1;
 | 
			
		||||
	case 0:
 | 
			
		||||
		/* New child process: */
 | 
			
		||||
#ifdef HAVE_ARC4RANDOM_STIR
 | 
			
		||||
		arc4random_stir();
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef HAVE_ARC4RANDOM
 | 
			
		||||
		srand(seed ^ (unsigned int)time(NULL) ^ getpid());
 | 
			
		||||
#endif
 | 
			
		||||
		Signals_Exit();
 | 
			
		||||
		signal(SIGTERM, Proc_GenericSignalHandler);
 | 
			
		||||
		signal(SIGALRM, Proc_GenericSignalHandler);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -18,16 +18,16 @@
 | 
			
		||||
 * Asynchronous resolver
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/socket.h>
 | 
			
		||||
#include <netinet/in.h>
 | 
			
		||||
#include <netdb.h>
 | 
			
		||||
#include <signal.h>
 | 
			
		||||
 | 
			
		||||
#ifdef IDENTAUTH
 | 
			
		||||
#ifdef HAVE_IDENT_H
 | 
			
		||||
@@ -35,17 +35,12 @@
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "array.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "conf.h"
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "ng_ipaddr.h"
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
#include "resolve.h"
 | 
			
		||||
#include "io.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void Do_ResolveAddr PARAMS(( const ng_ipaddr_t *Addr, int Sock, int w_fd ));
 | 
			
		||||
static void Do_ResolveName PARAMS(( const char *Host, int w_fd ));
 | 
			
		||||
@@ -222,8 +217,8 @@ ReverseLookup(const ng_ipaddr_t *IpAddr, char *resbuf, size_t reslen)
 | 
			
		||||
	assert(reslen >= NG_INET_ADDRSTRLEN);
 | 
			
		||||
	ng_ipaddr_tostr_r(IpAddr, tmp_ip_str);
 | 
			
		||||
 | 
			
		||||
	Log_Subprocess(LOG_WARNING, "%s: Can't resolve address \"%s\": %s",
 | 
			
		||||
				funcname, tmp_ip_str, errmsg);
 | 
			
		||||
	Log_Subprocess(LOG_WARNING, "Can't resolve address \"%s\": %s [%s].",
 | 
			
		||||
		       tmp_ip_str, errmsg, funcname);
 | 
			
		||||
	strlcpy(resbuf, tmp_ip_str, reslen);
 | 
			
		||||
	return false;
 | 
			
		||||
}
 | 
			
		||||
@@ -242,7 +237,7 @@ ForwardLookup(const char *hostname, array *IpAddr, int af)
 | 
			
		||||
{
 | 
			
		||||
	ng_ipaddr_t addr;
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_GETADDRINFO
 | 
			
		||||
#ifdef HAVE_WORKING_GETADDRINFO
 | 
			
		||||
	int res;
 | 
			
		||||
	struct addrinfo *a, *ai_results;
 | 
			
		||||
	static struct addrinfo hints;
 | 
			
		||||
@@ -339,14 +334,16 @@ static void
 | 
			
		||||
Log_Forgery_NoIP(const char *ip, const char *host)
 | 
			
		||||
{
 | 
			
		||||
	Log_Subprocess(LOG_WARNING,
 | 
			
		||||
		"Possible forgery: %s resolved to %s (which has no ip address)", ip, host);
 | 
			
		||||
		"Possible forgery: %s resolved to \"%s\", which has no IP address!",
 | 
			
		||||
		ip, host);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
Log_Forgery_WrongIP(const char *ip, const char *host)
 | 
			
		||||
{
 | 
			
		||||
	Log_Subprocess(LOG_WARNING,
 | 
			
		||||
		"Possible forgery: %s resolved to %s (which points to different address)", ip, host);
 | 
			
		||||
		"Possible forgery: %s resolved to \"%s\", which points to a different address!",
 | 
			
		||||
		ip, host);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -24,15 +24,15 @@
 | 
			
		||||
#include <signal.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/wait.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "conf-ssl.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
#include "conf.h"
 | 
			
		||||
#include "io.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "ngircd.h"
 | 
			
		||||
 | 
			
		||||
#include "sighandlers.h"
 | 
			
		||||
 | 
			
		||||
static int signalpipe[2];
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								src/portab/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								src/portab/.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,3 +0,0 @@
 | 
			
		||||
Makefile.am
 | 
			
		||||
portabtest
 | 
			
		||||
portabtest.exe
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
# Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors
 | 
			
		||||
# Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors
 | 
			
		||||
#
 | 
			
		||||
# 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
 | 
			
		||||
@@ -25,7 +25,7 @@ portabtest_LDFLAGS = -L.
 | 
			
		||||
 | 
			
		||||
portabtest_LDADD = -lngportab
 | 
			
		||||
 | 
			
		||||
noinst_HEADERS = imp.h exp.h portab.h splint.h
 | 
			
		||||
noinst_HEADERS = portab.h splint.h
 | 
			
		||||
 | 
			
		||||
maintainer-clean-local:
 | 
			
		||||
	rm -f Makefile Makefile.in Makefile.am
 | 
			
		||||
 
 | 
			
		||||
@@ -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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * "Export Header" which makes sure, that global functions are not "extern".
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#undef GLOBAL
 | 
			
		||||
#define GLOBAL
 | 
			
		||||
 | 
			
		||||
/* -eof- */
 | 
			
		||||
@@ -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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * "Import Header" which makes sure that global functions are defined "extern".
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#undef GLOBAL
 | 
			
		||||
#define GLOBAL extern
 | 
			
		||||
 | 
			
		||||
/* -eof- */
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -23,28 +23,6 @@
 | 
			
		||||
# 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 */
 | 
			
		||||
 | 
			
		||||
#if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 7))
 | 
			
		||||
@@ -63,9 +41,24 @@
 | 
			
		||||
# endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* datatypes */
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_STDDEF_H
 | 
			
		||||
# include <stddef.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
 | 
			
		||||
 | 
			
		||||
#ifndef PROTOTYPES
 | 
			
		||||
# ifndef signed
 | 
			
		||||
#  define signed
 | 
			
		||||
@@ -84,55 +77,55 @@ typedef unsigned short UINT16;
 | 
			
		||||
typedef unsigned int UINT32;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef HAVE_STDBOOL_H
 | 
			
		||||
#ifdef HAVE_STDBOOL_H
 | 
			
		||||
# include <stdbool.h>
 | 
			
		||||
#else
 | 
			
		||||
typedef unsigned char bool;
 | 
			
		||||
#define true (bool)1
 | 
			
		||||
#define false (bool)0
 | 
			
		||||
# define true (bool)1
 | 
			
		||||
# define false (bool)0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef NULL
 | 
			
		||||
#ifdef PROTOTYPES
 | 
			
		||||
# define NULL (void *)0
 | 
			
		||||
#else
 | 
			
		||||
# define NULL 0L
 | 
			
		||||
#endif
 | 
			
		||||
# ifdef PROTOTYPES
 | 
			
		||||
#  define NULL (void *)0
 | 
			
		||||
# else
 | 
			
		||||
#  define NULL 0L
 | 
			
		||||
# endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef NeXT
 | 
			
		||||
#define S_IRUSR 0000400		/* read permission, owner */
 | 
			
		||||
#define S_IWUSR 0000200		/* write permission, owner */
 | 
			
		||||
#define S_IRGRP 0000040		/* read permission, group */
 | 
			
		||||
#define S_IROTH 0000004		/* read permission, other */
 | 
			
		||||
#define ssize_t int
 | 
			
		||||
# define S_IRUSR 0000400		/* read permission, owner */
 | 
			
		||||
# define S_IWUSR 0000200		/* write permission, owner */
 | 
			
		||||
# define S_IRGRP 0000040		/* read permission, group */
 | 
			
		||||
# define S_IROTH 0000004		/* read permission, other */
 | 
			
		||||
# define ssize_t int
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#undef GLOBAL
 | 
			
		||||
#define GLOBAL
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* SPLint */
 | 
			
		||||
 | 
			
		||||
#ifdef S_SPLINT_S
 | 
			
		||||
#include "splint.h"
 | 
			
		||||
# include "splint.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* target constants  */
 | 
			
		||||
 | 
			
		||||
#ifndef HOST_OS
 | 
			
		||||
#define HOST_OS "unknown"
 | 
			
		||||
# define HOST_OS "unknown"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef HOST_CPU
 | 
			
		||||
#define HOST_CPU "unknown"
 | 
			
		||||
# define HOST_CPU "unknown"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef HOST_VENDOR
 | 
			
		||||
#define HOST_VENDOR "unknown"
 | 
			
		||||
# define HOST_VENDOR "unknown"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef __HAIKU__
 | 
			
		||||
#define SINGLE_USER_OS
 | 
			
		||||
# define SINGLE_USER_OS
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* configure options */
 | 
			
		||||
@@ -171,19 +164,17 @@ extern int vsnprintf PARAMS(( char *str, size_t count, const char *fmt, va_list
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef HAVE_GAI_STRERROR
 | 
			
		||||
#define gai_strerror(r) "unknown error"
 | 
			
		||||
# define gai_strerror(r) "unknown error"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef PACKAGE_NAME
 | 
			
		||||
#define PACKAGE_NAME PACKAGE
 | 
			
		||||
# define PACKAGE_NAME PACKAGE
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef PACKAGE_VERSION
 | 
			
		||||
#define PACKAGE_VERSION VERSION
 | 
			
		||||
# define PACKAGE_VERSION VERSION
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* -eof- */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -16,48 +16,188 @@
 | 
			
		||||
 * Test program for portab.h and friends ;-)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <stdarg.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void Panic PARAMS (( char *Reason, int Code ));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL int
 | 
			
		||||
main( void )
 | 
			
		||||
{
 | 
			
		||||
	/* validate datatypes */
 | 
			
		||||
	if( false != 0 ) Panic( "false", 1 );
 | 
			
		||||
	if( true != 1 ) Panic( "true", 1 );
 | 
			
		||||
	if( sizeof( UINT8 ) != 1 ) Panic( "UINT8", 1 );
 | 
			
		||||
	if( sizeof( UINT16 ) != 2 ) Panic( "UINT16", 1 );
 | 
			
		||||
	if( sizeof( UINT32 ) != 4 ) Panic( "UINT32", 1 );
 | 
			
		||||
 | 
			
		||||
#ifdef PROTOTYPES
 | 
			
		||||
	/* check functions */
 | 
			
		||||
	if( ! snprintf ) Panic( "snprintf", 2 );
 | 
			
		||||
	if( ! vsnprintf ) Panic( "vsnprintf", 2 );
 | 
			
		||||
	if( ! strlcpy ) Panic( "strlcpy", 2 );
 | 
			
		||||
	if( ! strlcat ) Panic( "strlcat", 2 );
 | 
			
		||||
#endif
 | 
			
		||||
	
 | 
			
		||||
	/* ok, no error */
 | 
			
		||||
	return 0;
 | 
			
		||||
} /* portab_check_types */
 | 
			
		||||
 | 
			
		||||
int allow_severity = 0, deny_severity = 0;
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
Panic( char *Reason, int Code )
 | 
			
		||||
Panic(char *Reason)
 | 
			
		||||
{
 | 
			
		||||
	/* Oops, something failed!? */
 | 
			
		||||
	fprintf( stderr, "Oops, test for %s failed!?", Reason );
 | 
			
		||||
	exit( Code );
 | 
			
		||||
	fprintf(stderr, "Oops, test for %s failed!?\n", Reason);
 | 
			
		||||
	exit(1);
 | 
			
		||||
} /* Panic */
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
Check_snprintf(void)
 | 
			
		||||
{
 | 
			
		||||
	char str[5];
 | 
			
		||||
 | 
			
		||||
	snprintf(str, sizeof(str), "%s", "1234567890");
 | 
			
		||||
	if (str[4] != '\0')
 | 
			
		||||
		Panic("snprintf NULL byte");
 | 
			
		||||
	if (strlen(str) != 4)
 | 
			
		||||
		Panic("snprintf string length");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
Check_strdup(void)
 | 
			
		||||
{
 | 
			
		||||
	char *ptr;
 | 
			
		||||
 | 
			
		||||
	ptr = strdup("1234567890");
 | 
			
		||||
	if (!ptr)
 | 
			
		||||
		Panic("strdup");
 | 
			
		||||
	if (ptr[10] != '\0')
 | 
			
		||||
		Panic("strdup NULL byte");
 | 
			
		||||
	if (strlen(ptr) != 10)
 | 
			
		||||
		Panic("strdup string length");
 | 
			
		||||
	free(ptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
Check_strndup(void)
 | 
			
		||||
{
 | 
			
		||||
	char *ptr;
 | 
			
		||||
 | 
			
		||||
	ptr = strndup("1234567890", 5);
 | 
			
		||||
	if (!ptr)
 | 
			
		||||
		Panic("strndup");
 | 
			
		||||
	if (ptr[5] != '\0')
 | 
			
		||||
		Panic("strndup NULL byte");
 | 
			
		||||
	if (strlen(ptr) != 5)
 | 
			
		||||
		Panic("strndup string length");
 | 
			
		||||
	free(ptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
Check_strlcpy(void)
 | 
			
		||||
{
 | 
			
		||||
	char str[5];
 | 
			
		||||
 | 
			
		||||
	if (strlcpy(str, "1234567890", sizeof(str)) != 10)
 | 
			
		||||
		Panic("strlcpy return code");
 | 
			
		||||
	if (str[4] != '\0')
 | 
			
		||||
		Panic("strlcpy NULL byte");
 | 
			
		||||
	if (strlen(str) != 4)
 | 
			
		||||
		Panic("strlcpy string length");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
Check_strlcat(void)
 | 
			
		||||
{
 | 
			
		||||
	char str[5];
 | 
			
		||||
 | 
			
		||||
	if (strlcpy(str, "12", sizeof(str)) != 2)
 | 
			
		||||
		Panic("strlcpy for strlcat");
 | 
			
		||||
	if (strlcat(str, "1234567890", sizeof(str)) != 12)
 | 
			
		||||
		Panic("strlcat return code");
 | 
			
		||||
	if (str[4] != '\0')
 | 
			
		||||
		Panic("strlcat NULL byte");
 | 
			
		||||
	if (strlen(str) != 4)
 | 
			
		||||
		Panic("strlcat string length");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
Check_strtok_r(void)
 | 
			
		||||
{
 | 
			
		||||
	char *ptr, *last;
 | 
			
		||||
 | 
			
		||||
	ptr = strdup("12,abc");
 | 
			
		||||
 | 
			
		||||
	ptr = strtok_r(ptr, ",", &last);
 | 
			
		||||
	if (!ptr)
 | 
			
		||||
		Panic("strtok_r result #1");
 | 
			
		||||
	if (strcmp(ptr, "12") != 0)
 | 
			
		||||
		Panic("strtok_r token #1");
 | 
			
		||||
 | 
			
		||||
	ptr = strtok_r(NULL, ",", &last);
 | 
			
		||||
	if (!ptr)
 | 
			
		||||
		Panic("strtok_r result #2");
 | 
			
		||||
	if (strcmp(ptr, "abc") != 0)
 | 
			
		||||
		Panic("strtok_r token #2");
 | 
			
		||||
 | 
			
		||||
	ptr = strtok_r(NULL, ",", &last);
 | 
			
		||||
	if (ptr)
 | 
			
		||||
		Panic("strtok_r result #3");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef PROTOTYPES
 | 
			
		||||
static void
 | 
			
		||||
Check_vsnprintf(const int Len, const char *Format, ...)
 | 
			
		||||
#else
 | 
			
		||||
static void
 | 
			
		||||
Check_vsnprintf(Len, Format, va_alist)
 | 
			
		||||
const int Len;
 | 
			
		||||
const char *Format;
 | 
			
		||||
va_dcl
 | 
			
		||||
#endif
 | 
			
		||||
{
 | 
			
		||||
	char str[5];
 | 
			
		||||
	va_list ap;
 | 
			
		||||
	int r;
 | 
			
		||||
 | 
			
		||||
#ifdef PROTOTYPES
 | 
			
		||||
	va_start(ap, Format);
 | 
			
		||||
#else
 | 
			
		||||
	va_start(ap);
 | 
			
		||||
#endif
 | 
			
		||||
	r = vsnprintf(str, sizeof(str), Format, ap);
 | 
			
		||||
	va_end(ap);
 | 
			
		||||
	if (r != Len) {
 | 
			
		||||
		/* C99 states that vsnprintf() "returns the number of
 | 
			
		||||
		 * characters that would have been printed if the n were
 | 
			
		||||
		 * unlimited", but according to the Linux manual page "glibc
 | 
			
		||||
		 * until 2.0.6 would return -1 when the output was truncated",
 | 
			
		||||
		 * and other implementations (libUTIL on A/UX) even return the
 | 
			
		||||
		 * number of characters processed ... so we only test our own
 | 
			
		||||
		 * implementation and warn on errors otherwise :-/ */
 | 
			
		||||
#ifdef HAVE_VSNPRINTF
 | 
			
		||||
		fprintf(stderr,
 | 
			
		||||
			"\n ** WARNING: The vsnprintf() function of this system isn't standard\n");
 | 
			
		||||
		fprintf(stderr,
 | 
			
		||||
			" ** conformant and returns a WRONG result: %d (should be %d)! The test\n",
 | 
			
		||||
			r, Len);
 | 
			
		||||
		fprintf(stderr,
 | 
			
		||||
			" ** result has been ignored but may lead to errors during execution!\n\n");
 | 
			
		||||
#else
 | 
			
		||||
		Panic("vsnprintf return code");
 | 
			
		||||
#endif
 | 
			
		||||
	}
 | 
			
		||||
	if (str[4] != '\0')
 | 
			
		||||
		Panic("vsnprintf NULL byte");
 | 
			
		||||
	if (strlen(str) != 4)
 | 
			
		||||
		Panic("vsnprintf string length");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GLOBAL int
 | 
			
		||||
main(void)
 | 
			
		||||
{
 | 
			
		||||
	/* validate datatypes */
 | 
			
		||||
	if (false != 0)
 | 
			
		||||
		Panic("false");
 | 
			
		||||
	if (true != 1)
 | 
			
		||||
		Panic("true");
 | 
			
		||||
	if (sizeof(UINT8) != 1)
 | 
			
		||||
		Panic("UINT8");
 | 
			
		||||
	if (sizeof(UINT16) != 2)
 | 
			
		||||
		Panic("UINT16");
 | 
			
		||||
	if (sizeof(UINT32) != 4)
 | 
			
		||||
		Panic("UINT32");
 | 
			
		||||
 | 
			
		||||
	/* check functions */
 | 
			
		||||
	Check_snprintf();
 | 
			
		||||
	Check_strdup();
 | 
			
		||||
	Check_strndup();
 | 
			
		||||
	Check_strlcpy();
 | 
			
		||||
	Check_strlcat();
 | 
			
		||||
	Check_strtok_r();
 | 
			
		||||
	Check_vsnprintf(2+10, "%s%s", "ab", "1234567890");
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* -eof- */
 | 
			
		||||
 
 | 
			
		||||
@@ -11,26 +11,24 @@
 | 
			
		||||
 | 
			
		||||
#ifndef HAVE_STRDUP
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
 | 
			
		||||
GLOBAL char *
 | 
			
		||||
strdup( const char *s )
 | 
			
		||||
strdup(const char *s)
 | 
			
		||||
{
 | 
			
		||||
 char *dup;
 | 
			
		||||
 size_t len = strlen( s );
 | 
			
		||||
 size_t alloc = len + 1;
 | 
			
		||||
	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 );
 | 
			
		||||
	if (len >= alloc)
 | 
			
		||||
		return NULL;
 | 
			
		||||
	dup = malloc(alloc);
 | 
			
		||||
	if (dup)
 | 
			
		||||
		strlcpy(dup, s, alloc );
 | 
			
		||||
 | 
			
		||||
return dup;
 | 
			
		||||
	return dup;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2005 Alexander Barton (alex@barton.de)
 | 
			
		||||
 * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -22,13 +22,9 @@
 | 
			
		||||
 * <http://cvs.samba.org/cgi-bin/cvsweb/rsync/lib/compat.c>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef HAVE_STRLCAT
 | 
			
		||||
 | 
			
		||||
GLOBAL size_t
 | 
			
		||||
@@ -52,7 +48,6 @@ strlcat( char *dst, const char *src, size_t size )
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef HAVE_STRLCPY
 | 
			
		||||
 | 
			
		||||
GLOBAL size_t
 | 
			
		||||
@@ -74,5 +69,4 @@ strlcpy( char *dst, const char *src, size_t size )
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* -eof- */
 | 
			
		||||
 
 | 
			
		||||
@@ -11,13 +11,10 @@
 | 
			
		||||
 | 
			
		||||
#ifndef HAVE_STRNDUP
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
 | 
			
		||||
#include "exp.h"
 | 
			
		||||
 | 
			
		||||
GLOBAL char *
 | 
			
		||||
strndup(const char *s, size_t maxlen)
 | 
			
		||||
{
 | 
			
		||||
@@ -30,8 +27,8 @@ strndup(const char *s, size_t maxlen)
 | 
			
		||||
	dup = malloc(len);
 | 
			
		||||
	if (dup)
 | 
			
		||||
		strlcpy(dup, s, len);
 | 
			
		||||
 | 
			
		||||
	return dup;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user