mirror of
				https://github.com/osmarks/ngircd.git
				synced 2025-11-03 23:43:00 +00:00 
			
		
		
		
	Compare commits
	
		
			151 Commits
		
	
	
		
			rel-22-rc1
			...
			rel-24-rc1
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					479d7d99c1 | ||
| 
						 | 
					181da30997 | ||
| 
						 | 
					bfebdaece8 | ||
| 
						 | 
					d2a134b79c | ||
| 
						 | 
					74f021fb44 | ||
| 
						 | 
					8e09180295 | ||
| 
						 | 
					f0532c98cd | ||
| 
						 | 
					9e0e955daf | ||
| 
						 | 
					3e44738416 | ||
| 
						 | 
					02c8887543 | ||
| 
						 | 
					77861f6fe2 | ||
| 
						 | 
					e9e3df27b7 | ||
| 
						 | 
					0dc3c13469 | ||
| 
						 | 
					d0d4de4980 | ||
| 
						 | 
					85df414907 | ||
| 
						 | 
					f5ff22d98f | ||
| 
						 | 
					995bbfd627 | ||
| 
						 | 
					dd6d75d37d | ||
| 
						 | 
					daa88b7651 | ||
| 
						 | 
					2924b3d52a | ||
| 
						 | 
					a335e480c5 | ||
| 
						 | 
					dde89b1267 | ||
| 
						 | 
					455f073687 | ||
| 
						 | 
					804c240320 | ||
| 
						 | 
					fb99d7c92e | ||
| 
						 | 
					1d06ed02ce | ||
| 
						 | 
					c283b52a78 | ||
| 
						 | 
					b708c95173 | ||
| 
						 | 
					722afc1b81 | ||
| 
						 | 
					86a64ce6aa | ||
| 
						 | 
					e84000f7b8 | ||
| 
						 | 
					a93247d32f | ||
| 
						 | 
					a673a6e3af | ||
| 
						 | 
					0ab4e7bffd | ||
| 
						 | 
					8f0d24c831 | ||
| 
						 | 
					0a6e284582 | ||
| 
						 | 
					2254e92e60 | ||
| 
						 | 
					7cda2f13f4 | ||
| 
						 | 
					7dba1a0766 | ||
| 
						 | 
					055d6e8056 | ||
| 
						 | 
					432a9297f8 | ||
| 
						 | 
					4dcd5f1225 | ||
| 
						 | 
					6a5569c27d | ||
| 
						 | 
					49ab79d0e6 | ||
| 
						 | 
					cedba36965 | ||
| 
						 | 
					40bea95c08 | ||
| 
						 | 
					7c7d03b730 | ||
| 
						 | 
					4693226d69 | ||
| 
						 | 
					afb59ab8e5 | ||
| 
						 | 
					d90f0323e5 | ||
| 
						 | 
					01e590b007 | ||
| 
						 | 
					7b7ee6a3ca | ||
| 
						 | 
					46838510ab | ||
| 
						 | 
					0903343f85 | ||
| 
						 | 
					182bfac855 | ||
| 
						 | 
					1e386fb7ac | ||
| 
						 | 
					52ccba5d1e | ||
| 
						 | 
					98e9467c85 | ||
| 
						 | 
					e8dacb68dc | ||
| 
						 | 
					398022631a | ||
| 
						 | 
					f2cef85fde | ||
| 
						 | 
					6ed59a8548 | ||
| 
						 | 
					49acb68584 | ||
| 
						 | 
					d8aba40f07 | ||
| 
						 | 
					87887bc632 | ||
| 
						 | 
					cb3a4321a2 | ||
| 
						 | 
					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 | ||
| 
						 | 
					3f807e1045 | 
							
								
								
									
										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
 | 
			
		||||
							
								
								
									
										20
									
								
								.editorconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								.editorconfig
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
# Copyright (c)2001-2016 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.
 | 
			
		||||
 | 
			
		||||
# .editorconfig: Editor settings, see <http://editorconfig.org>.
 | 
			
		||||
 | 
			
		||||
root = true
 | 
			
		||||
 | 
			
		||||
[*]
 | 
			
		||||
indent_style = tab
 | 
			
		||||
indent_size = 8
 | 
			
		||||
end_of_line = lf
 | 
			
		||||
charset = utf-8
 | 
			
		||||
trim_trailing_whitespace = true
 | 
			
		||||
insert_final_newline = true
 | 
			
		||||
							
								
								
									
										41
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										41
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,4 +1,5 @@
 | 
			
		||||
Makefile
 | 
			
		||||
Makefile.am
 | 
			
		||||
Makefile.in
 | 
			
		||||
aclocal.m4
 | 
			
		||||
ansi2knr.1
 | 
			
		||||
@@ -7,6 +8,7 @@ ansi2knr.h
 | 
			
		||||
ar-lib
 | 
			
		||||
autom4te.cache
 | 
			
		||||
build-stamp-ngircd*
 | 
			
		||||
build+*
 | 
			
		||||
compile
 | 
			
		||||
config.cache
 | 
			
		||||
config.log
 | 
			
		||||
@@ -24,3 +26,42 @@ 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/server-login-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>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								.travis.yml
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								.travis.yml
									
									
									
									
									
								
							@@ -1,7 +1,15 @@
 | 
			
		||||
language: c
 | 
			
		||||
before_install:
 | 
			
		||||
  - sudo apt-get update -qq
 | 
			
		||||
  - sudo apt-get install -qq libident-dev libpam0g-dev libssl-dev libwrap0-dev zlib1g-dev expect telnet
 | 
			
		||||
sudo: false
 | 
			
		||||
addons:
 | 
			
		||||
  apt:
 | 
			
		||||
    packages:
 | 
			
		||||
    - libident-dev
 | 
			
		||||
    - libpam0g-dev
 | 
			
		||||
    - libssl-dev
 | 
			
		||||
    - libwrap0-dev
 | 
			
		||||
    - zlib1g-dev
 | 
			
		||||
    - expect
 | 
			
		||||
    - telnet
 | 
			
		||||
compiler:
 | 
			
		||||
  - gcc
 | 
			
		||||
  - clang
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										25
									
								
								AUTHORS
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								AUTHORS
									
									
									
									
									
								
							@@ -2,16 +2,18 @@
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
                           http://ngircd.barton.de/
 | 
			
		||||
 | 
			
		||||
               (c)2001-2014 Alexander Barton and Contributors.
 | 
			
		||||
               (c)2001-2016 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!
 | 
			
		||||
 | 
			
		||||
@@ -31,28 +33,37 @@ Brandon Beresini <beresini@google.com>
 | 
			
		||||
Brett Smith <brett@w3.org>
 | 
			
		||||
Brian Collins <bricollins@gmail.com>
 | 
			
		||||
Bryan Caldwell <bcaldwel@ucsd.edu>
 | 
			
		||||
Christian Aistleitner <christian@quelltextlich.at>
 | 
			
		||||
Christoph Biedl <ngircd.anoy@manchmal.in-ulm.de>
 | 
			
		||||
DNS <dns@rbose.org>
 | 
			
		||||
Dana Dahlstrom <dana+ngIRCd@cs.ucsd.edu>
 | 
			
		||||
David Kingston <deathking1337@aim.com>
 | 
			
		||||
DNS <dns@rbose.org>
 | 
			
		||||
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>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Code snippets
 | 
			
		||||
~~~~~~~~~~~~~
 | 
			
		||||
J. Kercheval: pattern matching functions
 | 
			
		||||
Patrick Powell <papowell@astart.com>: snprintf()-function
 | 
			
		||||
Andrew Tridgell & Martin Pool: strl{cpy|cat}()-functions
 | 
			
		||||
John Kercheval: pattern matching functions
 | 
			
		||||
Patrick Powell <papowell@astart.com>: snprintf()-function
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										218
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										218
									
								
								ChangeLog
									
									
									
									
									
								
							@@ -2,14 +2,196 @@
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
                           http://ngircd.barton.de/
 | 
			
		||||
 | 
			
		||||
               (c)2001-2014 Alexander Barton and Contributors.
 | 
			
		||||
               (c)2001-2016 Alexander Barton and Contributors.
 | 
			
		||||
               ngIRCd is free software and published under the
 | 
			
		||||
                   terms of the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
                               -- ChangeLog --
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ngIRCd 22
 | 
			
		||||
ngIRCd 24
 | 
			
		||||
 | 
			
		||||
  ngIRCd 24~rc1 (2017-01-07)
 | 
			
		||||
  - Enhance systemd service file, and install it in Debian package.
 | 
			
		||||
  - Update configuration of Debian package.
 | 
			
		||||
  - Log privilege violations and failed OPER request with log level "error"
 | 
			
		||||
    and send it to the "&SERVER" channel, too.
 | 
			
		||||
  - Immediately shut down connection when receiving an "ERROR" command,
 | 
			
		||||
    don't wait for the peer to close the connection. This allows the daemon
 | 
			
		||||
    to forward the received "ERROR" message in the network, instead of the
 | 
			
		||||
    very generic "client closed connection" message.
 | 
			
		||||
  - Fix sending of entry duration (no negative values!) when synchronizing
 | 
			
		||||
    "x-lines" (G-LINES).
 | 
			
		||||
  - List expiration (G-LINES): use same log level as when setting, and log
 | 
			
		||||
    this event to the &SERVER channel, too.
 | 
			
		||||
  - Explicitly forbid remote servers to modify "x-lines" (G-LINES) when the
 | 
			
		||||
    "AllowRemoteOper" configuration option isn't set, even when the command
 | 
			
		||||
    seems to originate from the remote server itself: this prevents GLINE's
 | 
			
		||||
    to become set during server handshake in this case (what wouldn't be
 | 
			
		||||
    possible during regular runtime when a remote IRC Op sends the command)
 | 
			
		||||
    and what can't be undone by IRC Ops later on (because of the missing
 | 
			
		||||
    "AllowRemoteOper" option) ...
 | 
			
		||||
  - Make scripts and init-files in ./contrib executable.
 | 
			
		||||
  - Fix building ngIRCd with OpenSSL 1.1. Thanks to Christoph Biedl
 | 
			
		||||
    <ngircd.anoy@manchmal.in-ulm.de> for the patch!
 | 
			
		||||
  - Fix code indentation warnings of gcc 6.2.
 | 
			
		||||
  - Update config.guess (2016-04-02) and config.sub (2016-03-30) files.
 | 
			
		||||
  - Fix warnings of the "shellcheck" linter in autogen.sh, contrib/ngindent
 | 
			
		||||
    and contrib/platformtest.sh.
 | 
			
		||||
  - Update Xcode project for latest Xcode version (8.0), and fix "duplicate
 | 
			
		||||
    symbols" error messages when building (linking) the binary.
 | 
			
		||||
  - Add "Documentation" variables to systemd configuration files.
 | 
			
		||||
  - Make sure that SYSCONFDIR is always set, which can be handy when
 | 
			
		||||
    using source code linters when ./configure hasn't been run already.
 | 
			
		||||
  - Add the new "PAMServiceName" configuration option to specify the name
 | 
			
		||||
    used as PAM service name. This setting allows to run multiple ngIRCd
 | 
			
		||||
    instances with different PAM configurations for each instance.
 | 
			
		||||
    Thanks to Christian Aistleitner <christian@quelltextlich.at> for the
 | 
			
		||||
    patch, closes #226.
 | 
			
		||||
  - Add an ".editorconfig" file to the project.
 | 
			
		||||
  - Travis-CI: use "container-based infrastructure".
 | 
			
		||||
  - Limit the number of message targets, and suppress duplicates: This
 | 
			
		||||
    prevents an user from flooding the server using commands like this:
 | 
			
		||||
    "PRIVMSG nick1,nick1,nick1,...".
 | 
			
		||||
    Duplicate targets are suppressed silently (channels and clients).
 | 
			
		||||
    In addition, the maximum number of targets per PRIVMSG, NOTICE, ...
 | 
			
		||||
    command are limited to MAX_HNDL_TARGETS (25). If there are more, the
 | 
			
		||||
    daemon sends the new 407 (ERR_TOOMANYTARGETS_MSG) numeric, containing
 | 
			
		||||
    the first target that hasn't been handled any more. Closes #187.
 | 
			
		||||
  - Test suite: Add new test for server-server logins.
 | 
			
		||||
  - contrib/ngindent: Fix shebang line.
 | 
			
		||||
  - Make contrib/platformtest.sh script more portable, and only show
 | 
			
		||||
    "runs=Y" when the test suite really has been passed successfully.
 | 
			
		||||
  - Code cleanup in the NJON handler and the function killing clients as
 | 
			
		||||
    well as the function sending messages to a "mask" (cleaner code, more
 | 
			
		||||
    fault tolerant, better code comments).
 | 
			
		||||
  - Update and enhance documentation: README file, doc/Platforms.txt,
 | 
			
		||||
    doc/Modes.txt, doc/Commands.txt, doc/PAM.txt.
 | 
			
		||||
  - Fix NJOIN not propagating "half ops" status: ngIRCd tested for the wrong
 | 
			
		||||
    prefix of "half ops" when processing NJOIN commands and therefore never
 | 
			
		||||
    classified a remote user as "half op".
 | 
			
		||||
    Thanks to wowaname for pointing this out on #ngircd!
 | 
			
		||||
 | 
			
		||||
ngIRCd 23 (2015-11-16)
 | 
			
		||||
 | 
			
		||||
  - Explicitly cast time_t to long when printing it out: this prevents
 | 
			
		||||
    wrong sized data types on platforms where time_t doesn't equal a
 | 
			
		||||
    long any more, for example on OpenBSD (which would result in garbled
 | 
			
		||||
    output on those platforms).
 | 
			
		||||
  - contrib/Debian/changelog: Fix email address.
 | 
			
		||||
  - Documentation: Spelling fixes; update doc/Platforms.txt.
 | 
			
		||||
 | 
			
		||||
  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 behavior 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.
 | 
			
		||||
    Idea 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.
 | 
			
		||||
    Idea and implementation by LucentW, Thanks! Closes #207.
 | 
			
		||||
  - Update ngircd.conf.5: "CloakUserToNick" 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.
 | 
			
		||||
    Idea 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).
 | 
			
		||||
    Idea 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
 | 
			
		||||
@@ -34,10 +216,10 @@ ngIRCd 22
 | 
			
		||||
  - 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 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!
 | 
			
		||||
  - 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
 | 
			
		||||
@@ -518,7 +700,7 @@ ngIRCd 19.2 (2012-06-19)
 | 
			
		||||
    "CC=xxx MAKE=yyy ./platformtest.sh" calling convention.
 | 
			
		||||
  - Add instructions for setting up Atheme IRC services.
 | 
			
		||||
  - Implement support for IRC capability handling, the new "CAP" command,
 | 
			
		||||
    and capablity "multi-prefix" which allows both the NAME and	WHO command
 | 
			
		||||
    and capability "multi-prefix" which allows both the NAME and WHO command
 | 
			
		||||
    handlers to return more than one "class prefix" to the client.
 | 
			
		||||
  - Update Xcode project files: reference missing documentation files.
 | 
			
		||||
  - Fix: Don't ignore "permission denied" errors when enabling chroot.
 | 
			
		||||
@@ -818,7 +1000,7 @@ ngIRCd 17 (2010-11-07)
 | 
			
		||||
  - contrib/platformtest.sh: make command name quoting consistent
 | 
			
		||||
 | 
			
		||||
  ngIRCd 17~rc3 (2010-10-27)
 | 
			
		||||
  - Xcode builds: detect version number correctly, updateed project file
 | 
			
		||||
  - Xcode builds: detect version number correctly, updated project file
 | 
			
		||||
    to use the Mac OS X 10.5.x SDK, disable pam_fail_delay() because it
 | 
			
		||||
    is only available starting with Mac OS X 10.6, and generate a default
 | 
			
		||||
    PAM configuration for the Mac OS X Installer.app package of ngIRCd.
 | 
			
		||||
@@ -830,7 +1012,7 @@ ngIRCd 17 (2010-11-07)
 | 
			
		||||
  ngIRCd 17~rc2 (2010-10-25)
 | 
			
		||||
  - ZeroConf: include header files missing since commit a988bbc86a.
 | 
			
		||||
  - Generate ngIRCd version number from GIT tag.
 | 
			
		||||
  - Make sourcecode compatible with ansi2knr again. This allows to compile
 | 
			
		||||
  - Make source code compatible with ansi2knr again. This allows to compile
 | 
			
		||||
    ngIRCd using a pre-ANSI K&R C compiler again.
 | 
			
		||||
  - ./configure: check if C compiler can compile ISO Standard C.
 | 
			
		||||
  - ./configure: check support for C prototypes again.
 | 
			
		||||
@@ -846,7 +1028,7 @@ ngIRCd 17 (2010-11-07)
 | 
			
		||||
    Howl, Avahi or on Mac OS X).
 | 
			
		||||
  - New configuration option "SyslogFacility" to define the syslog "facility"
 | 
			
		||||
    (the "target"), to which ngIRCd should send its log messages.
 | 
			
		||||
    Possible values are system dependant, but most probably "auth", "daemon",
 | 
			
		||||
    Possible values are system dependent, but most probably "auth", "daemon",
 | 
			
		||||
    "user" and "local1" through "local7" are possible values; see syslog(3).
 | 
			
		||||
    Default is "local5" for historical reasons.
 | 
			
		||||
  - Dump the "internal server state" (configured servers, established
 | 
			
		||||
@@ -867,7 +1049,7 @@ ngIRCd 17 (2010-11-07)
 | 
			
		||||
  - Make configure switch "--docdir" work (closes: #108).
 | 
			
		||||
  - Reformat and update FAQ.txt a little bit.
 | 
			
		||||
  - INSTALL: mention SSL, IPv6, and changed handling of MotdFile.
 | 
			
		||||
  - Change MOTD file handling: ngIRCd now caches the contens of the MOTD
 | 
			
		||||
  - Change MOTD file handling: ngIRCd now caches the contents of the MOTD
 | 
			
		||||
    file, so the daemon now requires a HUP signal or REHASH command to
 | 
			
		||||
    re-read the MOTD file when its content changed.
 | 
			
		||||
  - Startup: open /dev/null before chroot'ing the daemon.
 | 
			
		||||
@@ -903,14 +1085,14 @@ ngIRCd 16 (2010-05-02)
 | 
			
		||||
  - Include netinet/{in.h, in_systm.h} when checking for netinet/ip.h
 | 
			
		||||
  - Only include <netinet/in_systm.h> if it exists
 | 
			
		||||
  - Updated doc/Platforms.txt
 | 
			
		||||
  - Enhace connection statistics counters: display total number of served
 | 
			
		||||
  - Enhance connection statistics counters: display total number of served
 | 
			
		||||
    connections on daemon shutdown and when a new client connects using
 | 
			
		||||
    the new numeric RPL_STATSCONN (250).
 | 
			
		||||
 | 
			
		||||
  ngIRCd 16~rc1 (2010-03-25)
 | 
			
		||||
  - Various fixes to the build system and code cleanups.
 | 
			
		||||
  - contrib/platformtest.sh: Only show latest commit.
 | 
			
		||||
  - Updatet doc/Platforms.txt, added new README-Interix.txt documenting
 | 
			
		||||
  - Updated doc/Platforms.txt, added new README-Interix.txt documenting
 | 
			
		||||
    how to tun ngIRCd on Microsoft Services for UNIX (MS SFU, MS SUA).
 | 
			
		||||
  - Updated links to the ngIRCd homepage (bug tracker, mailing list).
 | 
			
		||||
  - Added missing modes to USERMODES #define
 | 
			
		||||
@@ -938,7 +1120,7 @@ ngIRCd 15 (2009-11-07)
 | 
			
		||||
  ngIRCd 15~rc1 (2009-10-15)
 | 
			
		||||
  - Do not add default listening port (6667) if SSL ports were specified, so
 | 
			
		||||
    ngIRCd can be configured to only accept SSL-encrypted connections now.
 | 
			
		||||
  - Enable IRC operators to use the IRC command SQUIT (insted of the already
 | 
			
		||||
  - Enable IRC operators to use the IRC command SQUIT (instead of the already
 | 
			
		||||
    implemented but non-standard DISCONNECT command).
 | 
			
		||||
  - New configuration option "AllowRemoteOper" (disabled by default) that
 | 
			
		||||
    enables remote IRC operators to use the IRC commands SQUIT and CONNECT
 | 
			
		||||
@@ -992,7 +1174,7 @@ ngIRCd 14 (2009-04-20)
 | 
			
		||||
  - Fix memory leak when a encrypted and compressed server link goes down.
 | 
			
		||||
    (closes bug #95, reported by Christoph, fiesh@fiesh.homeip.net)
 | 
			
		||||
  - Fix handling of channels containing dots.
 | 
			
		||||
    (closes ug #93, reported by Gonosz Csiga)
 | 
			
		||||
    (closes bug #93, reported by Gonosz Csiga)
 | 
			
		||||
 | 
			
		||||
ngIRCd 13 (2008-12-25)
 | 
			
		||||
 | 
			
		||||
@@ -1222,7 +1404,7 @@ ngIRCd 0.9.0 (2005-07-24)
 | 
			
		||||
  - Fixed ./configure test for TCP Wrappers: now it runs on Mac OS X as well.
 | 
			
		||||
  - Enhanced configure script: now you can pass an (optional) search path
 | 
			
		||||
    to all --with-XXX parameters, e. g. "--with-ident=/opt/ident".
 | 
			
		||||
  - Removed typedefs for the native C datatypes.
 | 
			
		||||
  - Removed typedefs for the native C data types.
 | 
			
		||||
    Use stdbool.h / inttypes.h if available.
 | 
			
		||||
  - New configuration option "OperServerMode" to enable a workaround needed
 | 
			
		||||
    when running an network with ircd2 servers and "OperCanUseMode" enabled
 | 
			
		||||
@@ -1403,7 +1585,7 @@ ngIRCd 0.7.0 (2003-05-01)
 | 
			
		||||
    to add a new server (ngIRCd tries to connect new servers only once!).
 | 
			
		||||
  - Added DISCONNECT command ("DISCONNECT <name>") to disable servers.
 | 
			
		||||
  - Restructured the documentation: Now the main language is English. The
 | 
			
		||||
    german documentation has been removed (until there is a maintainer).
 | 
			
		||||
    German documentation has been removed (until there is a maintainer).
 | 
			
		||||
  - Enhanced killing of users caused by a nickname collision.
 | 
			
		||||
  - Better error detection for status code ("numerics") forwarding.
 | 
			
		||||
  - Moved tool functions to own library: "libngtool".
 | 
			
		||||
@@ -1444,7 +1626,7 @@ ngIRCd 0.6.1 (2003-01-21)
 | 
			
		||||
    member when changing his channel user modes which could crash ngIRCd.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Older changes (sorry, only available in german language):
 | 
			
		||||
Older changes (sorry, only available in German language):
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.6.0, 24.12.2002
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										33
									
								
								INSTALL
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								INSTALL
									
									
									
									
									
								
							@@ -2,7 +2,7 @@
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
                           http://ngircd.barton.de/
 | 
			
		||||
 | 
			
		||||
               (c)2001-2014 Alexander Barton and Contributors.
 | 
			
		||||
               (c)2001-2016 Alexander Barton and Contributors.
 | 
			
		||||
               ngIRCd is free software and published under the
 | 
			
		||||
                   terms of the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
@@ -12,17 +12,34 @@
 | 
			
		||||
I. Upgrade Information
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
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 superseded by the
 | 
			
		||||
  new "AllowedChannelTypes" variable. It is still supported and translated to
 | 
			
		||||
  the appropriate "AllowedChannelTypes" setting but is deprecated now.
 | 
			
		||||
 | 
			
		||||
Differences to version 19.x
 | 
			
		||||
 | 
			
		||||
- Starting with ngIRCd 20, users can "cloak" their hostname only when the
 | 
			
		||||
@@ -31,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.
 | 
			
		||||
@@ -68,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).
 | 
			
		||||
@@ -145,7 +162,7 @@ If you are using one of the "big" operating systems or Linux distributions,
 | 
			
		||||
you can use the following commands to install all the required packages to
 | 
			
		||||
build the sources including all optional features and to run the test suite:
 | 
			
		||||
 | 
			
		||||
* RedHat / Fedora based distributions:
 | 
			
		||||
* Red Hat / Fedora based distributions:
 | 
			
		||||
 | 
			
		||||
  yum install \
 | 
			
		||||
    autoconf automake expect gcc glibc-devel gnutls-devel \
 | 
			
		||||
@@ -169,7 +186,7 @@ This step is therefore only interesting for developers.
 | 
			
		||||
autogen.sh produces the Makefile.in's, which are necessary for the configure
 | 
			
		||||
script itself, and some more files for make. To run autogen.sh you'll need
 | 
			
		||||
GNU autoconf and GNU automake: 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
 | 
			
		||||
required, newer is better. But don't use automake 1.12 or newer for creating
 | 
			
		||||
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.
 | 
			
		||||
 
 | 
			
		||||
@@ -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*
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										118
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										118
									
								
								NEWS
									
									
									
									
									
								
							@@ -2,14 +2,106 @@
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
                           http://ngircd.barton.de/
 | 
			
		||||
 | 
			
		||||
               (c)2001-2014 Alexander Barton and Contributors.
 | 
			
		||||
               (c)2001-2016 Alexander Barton and Contributors.
 | 
			
		||||
               ngIRCd is free software and published under the
 | 
			
		||||
                   terms of the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
                                  -- NEWS --
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ngIRCd 22
 | 
			
		||||
ngIRCd 24
 | 
			
		||||
 | 
			
		||||
  ngIRCd 24~rc1 (2017-01-07)
 | 
			
		||||
  - Log privilege violations and failed OPER request with log level "error"
 | 
			
		||||
    and send it to the "&SERVER" channel, too.
 | 
			
		||||
  - Immediately shut down connection when receiving an "ERROR" command,
 | 
			
		||||
    don't wait for the peer to close the connection. This allows the daemon
 | 
			
		||||
    to forward the received "ERROR" message in the network, instead of the
 | 
			
		||||
    very generic "client closed connection" message.
 | 
			
		||||
  - Explicitly forbid remote servers to modify "x-lines" (G-LINES) when the
 | 
			
		||||
    "AllowRemoteOper" configuration option isn't set, even when the command
 | 
			
		||||
    seems to originate from the remote server itself: this prevents GLINE's
 | 
			
		||||
    to become set during server handshake in this case (what wouldn't be
 | 
			
		||||
    possible during regular runtime when a remote IRC Op sends the command)
 | 
			
		||||
    and what can't be undone by IRC Ops later on (because of the missing
 | 
			
		||||
    "AllowRemoteOper" option) ...
 | 
			
		||||
  - Update Xcode project for latest Xcode version (8.0), and fix "duplicate
 | 
			
		||||
    symbols" error messages when building (linking) the binary.
 | 
			
		||||
  - Add "Documentation" variables to systemd configuration files.
 | 
			
		||||
  - Make sure that SYSCONFDIR is always set, which can be handy when
 | 
			
		||||
    using source code linters when ./configure hasn't been run already.
 | 
			
		||||
  - Add the new "PAMServiceName" configuration option to specify the name
 | 
			
		||||
    used as PAM service name. This setting allows to run multiple ngIRCd
 | 
			
		||||
    instances with different PAM configurations for each instance.
 | 
			
		||||
    Thanks to Christian Aistleitner <christian@quelltextlich.at> for the
 | 
			
		||||
    patch, closes #226.
 | 
			
		||||
  - Add an ".editorconfig" file to the project.
 | 
			
		||||
  - Limit the number of message target, and suppress duplicates: This
 | 
			
		||||
    prevents an user from flooding the server using commands like this:
 | 
			
		||||
    "PRIVMSG nick1,nick1,nick1,...".
 | 
			
		||||
    Duplicate targets are suppressed silently (channels and clients).
 | 
			
		||||
    In addition, the maximum number of targets per PRIVMSG, NOTICE, ...
 | 
			
		||||
    command are limited to MAX_HNDL_TARGETS (25). If there are more, the
 | 
			
		||||
    daemon sends the new 407 (ERR_TOOMANYTARGETS_MSG) numeric, containing
 | 
			
		||||
    the first target that hasn't been handled any more. Closes #187.
 | 
			
		||||
  - Make contrib/platformtest.sh script more portable, and only show
 | 
			
		||||
    "runs=Y" when the test suite really has been passed successfully.
 | 
			
		||||
 | 
			
		||||
ngIRCd 23 (2015-11-16)
 | 
			
		||||
 | 
			
		||||
  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 behavior 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.
 | 
			
		||||
    Idea and implementation by LucentW, Thanks! Closes #203.
 | 
			
		||||
  - Implement numeric RPL_LISTSTART(321). lightIRC and other clients
 | 
			
		||||
    expecting RPL_LISTSTART should now behave correctly.
 | 
			
		||||
    Idea 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.
 | 
			
		||||
    Idea 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).
 | 
			
		||||
    Idea 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
 | 
			
		||||
@@ -24,10 +116,10 @@ ngIRCd 22
 | 
			
		||||
  - 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 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!
 | 
			
		||||
  - 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.
 | 
			
		||||
@@ -270,7 +362,7 @@ ngIRCd 19.2 (2012-06-19)
 | 
			
		||||
    which still is the default when "CloakHostModeX" isn't set.
 | 
			
		||||
  - Add instructions for setting up Atheme IRC services.
 | 
			
		||||
  - Implement support for IRC capability handling, the new "CAP" command,
 | 
			
		||||
    and capablity "multi-prefix" which allows both the NAME and	WHO command
 | 
			
		||||
    and capability "multi-prefix" which allows both the NAME and WHO command
 | 
			
		||||
    handlers to return more than one "class prefix" to the client.
 | 
			
		||||
 | 
			
		||||
ngIRCd 19.1 (2012-03-19)
 | 
			
		||||
@@ -433,7 +525,7 @@ ngIRCd 17 (2010-11-07)
 | 
			
		||||
 | 
			
		||||
  ngIRCd 17~rc2 (2010-10-25)
 | 
			
		||||
  - Generate ngIRCd version number from GIT tag.
 | 
			
		||||
  - Make sourcecode compatible with ansi2knr again. This allows to compile
 | 
			
		||||
  - Make source code compatible with ansi2knr again. This allows to compile
 | 
			
		||||
    ngIRCd using a pre-ANSI K&R C compiler again.
 | 
			
		||||
 | 
			
		||||
  ngIRCd 17~rc1 (2010-10-11)
 | 
			
		||||
@@ -442,7 +534,7 @@ ngIRCd 17 (2010-11-07)
 | 
			
		||||
    Howl, Avahi or on Mac OS X).
 | 
			
		||||
  - New configuration option "SyslogFacility" to define the syslog "facility"
 | 
			
		||||
    (the "target"), to which ngIRCd should send its log messages.
 | 
			
		||||
    Possible values are system dependant, but most probably "auth", "daemon",
 | 
			
		||||
    Possible values are system dependent, but most probably "auth", "daemon",
 | 
			
		||||
    "user" and "local1" through "local7" are possible values; see syslog(3).
 | 
			
		||||
    Default is "local5" for historical reasons.
 | 
			
		||||
  - Dump the "internal server state" (configured servers, established
 | 
			
		||||
@@ -452,7 +544,7 @@ ngIRCd 17 (2010-11-07)
 | 
			
		||||
    signal SIGUSR1, when debug code is compiled in, not only on startup
 | 
			
		||||
    using the command line parameters.
 | 
			
		||||
  - Implement user mode "x": host name cloaking (closes: #102).
 | 
			
		||||
  - Change MOTD file handling: ngIRCd now caches the contens of the MOTD
 | 
			
		||||
  - Change MOTD file handling: ngIRCd now caches the contents of the MOTD
 | 
			
		||||
    file, so the daemon now requires a HUP signal or REHASH command to
 | 
			
		||||
    re-read the MOTD file when its content changed.
 | 
			
		||||
  - Allow IRC ops to change channel modes even without OperServerMode set.
 | 
			
		||||
@@ -468,7 +560,7 @@ ngIRCd 17 (2010-11-07)
 | 
			
		||||
ngIRCd 16 (2010-05-02)
 | 
			
		||||
 | 
			
		||||
  ngIRCd 16~rc2 (2010-04-25)
 | 
			
		||||
  - Enhace connection statistics counters: display total number of served
 | 
			
		||||
  - Enhance connection statistics counters: display total number of served
 | 
			
		||||
    connections on daemon shutdown and when a new client connects using
 | 
			
		||||
    the new numeric RPL_STATSCONN (250).
 | 
			
		||||
 | 
			
		||||
@@ -490,7 +582,7 @@ ngIRCd 15 (2009-11-07)
 | 
			
		||||
  ngIRCd 15~rc1 (2009-10-15)
 | 
			
		||||
  - Do not add default listening port (6667) if SSL ports were specified, so
 | 
			
		||||
    ngIRCd can be configured to only accept SSL-encrypted connections now.
 | 
			
		||||
  - Enable IRC operators to use the IRC command SQUIT (insted of the already
 | 
			
		||||
  - Enable IRC operators to use the IRC command SQUIT (instead of the already
 | 
			
		||||
    implemented but non-standard DISCONNECT command).
 | 
			
		||||
  - New configuration option "AllowRemoteOper" (disabled by default) that
 | 
			
		||||
    enables remote IRC operators to use the IRC commands SQUIT and CONNECT
 | 
			
		||||
@@ -673,7 +765,7 @@ ngIRCd 0.7.0 (2003-05-01)
 | 
			
		||||
  - Documentation is now installed in $(datadir)/doc/ngircd.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Older news (sorry, only available in german language):
 | 
			
		||||
Older news (sorry, only available in German language):
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.6.0, 24.12.2002
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										68
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										68
									
								
								README
									
									
									
									
									
								
							@@ -2,7 +2,7 @@
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
                           http://ngircd.barton.de/
 | 
			
		||||
 | 
			
		||||
               (c)2001-2014 Alexander Barton and Contributors.
 | 
			
		||||
               (c)2001-2016 Alexander Barton and Contributors.
 | 
			
		||||
               ngIRCd is free software and published under the
 | 
			
		||||
                   terms of the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
@@ -28,31 +28,26 @@ Please see the INSTALL document for installation and upgrade information!
 | 
			
		||||
II. Status
 | 
			
		||||
~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
It is not the goal of ngIRCd to implement all the nasty behaviours of the
 | 
			
		||||
ngIRCd should be quite feature complete and stable to be used as daemon in
 | 
			
		||||
real world IRC networks.
 | 
			
		||||
 | 
			
		||||
It is not the goal of ngIRCd to implement all the nasty behaviors of the
 | 
			
		||||
original ircd, but to implement most of the useful commands and semantics
 | 
			
		||||
specified by the RFCs.
 | 
			
		||||
specified by the RFCs that are used by existing clients.
 | 
			
		||||
 | 
			
		||||
In the meantime ngIRCd should be quite feature complete and stable to be
 | 
			
		||||
used in real IRC networks.
 | 
			
		||||
 | 
			
		||||
Implemented IRC-commands are:
 | 
			
		||||
 | 
			
		||||
ADMIN, AWAY, CHANINFO, CONNECT, DIE, DISCONNECT, ERROR, GLINE, HELP, INFO,
 | 
			
		||||
INVITE, ISON, JOIN, KICK, KILL, KLINE, LINKS, LIST, LUSERS, MODE, MOTD,
 | 
			
		||||
NAMES, NICK, NJOIN, NOTICE, OPER, PART, PASS, PING, PONG, PRIVMSG, QUIT,
 | 
			
		||||
REHASH, RESTART, SERVER, SERVICE, SERVLIST, SQUERY, SQUIT, STATS, SUMMON,
 | 
			
		||||
TIME, TOPIC, TRACE, USER, USERHOST, USERS, VERSION, WALLOPS, WEBIRC, WHO,
 | 
			
		||||
WHOIS, WHOWAS.
 | 
			
		||||
 | 
			
		||||
III. Features (or: why use ngIRCd?)
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
- well arranged (lean) configuration file
 | 
			
		||||
- simple to build/install, configure and maintain
 | 
			
		||||
- supports IPv6 and SSL
 | 
			
		||||
- no problems with servers that have dynamic IP addresses
 | 
			
		||||
- freely available, modern, portable and tidy C-source
 | 
			
		||||
- wide field of supported platforms, including AIX, A/UX, FreeBSD, HP-UX,
 | 
			
		||||
- Well arranged (lean) configuration file.
 | 
			
		||||
- Simple to build, install, configure, and maintain.
 | 
			
		||||
- Supports IPv6 and SSL.
 | 
			
		||||
- Can use PAM for user authentication.
 | 
			
		||||
- Lots of popular user and channel modes are implemented.
 | 
			
		||||
- Supports "cloaking" of users.
 | 
			
		||||
- No problems with servers that have dynamic IP addresses.
 | 
			
		||||
- Freely available, modern, portable and tidy C source.
 | 
			
		||||
- Wide field of supported platforms, including AIX, A/UX, FreeBSD, HP-UX,
 | 
			
		||||
  IRIX, Linux, Mac OS X, NetBSD, OpenBSD, Solaris, and Windows with Cygwin.
 | 
			
		||||
- ngIRCd is being actively developed since 2001.
 | 
			
		||||
 | 
			
		||||
@@ -61,33 +56,34 @@ IV. Documentation
 | 
			
		||||
~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
More documentation can be found in the "doc/" directory and the homepage of
 | 
			
		||||
the ngIRCd: <http://ngircd.barton.de/>.
 | 
			
		||||
ngIRCd: <http://ngircd.barton.de/>.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
V. Download
 | 
			
		||||
~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
The homepage of the ngIRCd is: <http://ngircd.barton.de/>; you will find
 | 
			
		||||
The homepage of the ngIRCd is <http://ngircd.barton.de/>; you will find
 | 
			
		||||
the newest information about the ngIRCd and the most recent ("stable")
 | 
			
		||||
releases there.
 | 
			
		||||
 | 
			
		||||
If you are interested in the latest development versions (which are not
 | 
			
		||||
always stable), then please read the section 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/).
 | 
			
		||||
Visit our source code repository at GitHub if you are interested in the
 | 
			
		||||
latest development version: <https://github.com/ngircd/ngircd>.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
VI. Bugs
 | 
			
		||||
~~~~~~~~
 | 
			
		||||
VI. Problems, Bugs, Patches
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
If you find bugs in the ngIRCd (which might be there :-), please report
 | 
			
		||||
them at the following URL:
 | 
			
		||||
Please don't hesitate to contact us if you encounter problems:
 | 
			
		||||
 | 
			
		||||
<http://ngircd.barton.de/bugtracker.php>
 | 
			
		||||
- On IRC: <irc://irc.barton.de/ngircd>
 | 
			
		||||
- Via the mailing list: <ngircd-ml@ngircd.barton.de>
 | 
			
		||||
 | 
			
		||||
See <http://ngircd.barton.de/support.php> for details.
 | 
			
		||||
 | 
			
		||||
If you find bugs in ngIRCd (which will be there most probably ...), please
 | 
			
		||||
report them to our issue tracker at GitHub:
 | 
			
		||||
 | 
			
		||||
- Bug tracker: <https://github.com/ngircd/ngircd/issues>
 | 
			
		||||
- Patches, "pull requests": <https://github.com/ngircd/ngircd/pulls>
 | 
			
		||||
 | 
			
		||||
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>.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										43
									
								
								autogen.sh
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								autogen.sh
									
									
									
									
									
								
							@@ -1,7 +1,7 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#
 | 
			
		||||
# 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
 | 
			
		||||
@@ -95,7 +95,7 @@ Search()
 | 
			
		||||
				return 0
 | 
			
		||||
			fi
 | 
			
		||||
		done
 | 
			
		||||
		minor=`expr $minor - 1`
 | 
			
		||||
		minor=$(expr $minor - 1)
 | 
			
		||||
	done
 | 
			
		||||
	return 1
 | 
			
		||||
}
 | 
			
		||||
@@ -109,8 +109,8 @@ Notfound()
 | 
			
		||||
 | 
			
		||||
Run()
 | 
			
		||||
{
 | 
			
		||||
	[ "$VERBOSE" = "1" ] && echo " - running \"$@\" ..."
 | 
			
		||||
	$@
 | 
			
		||||
	[ "$VERBOSE" = "1" ] && echo " - running \"$*\" ..."
 | 
			
		||||
	"$@"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Reset locale settings to suppress warning messages of Perl
 | 
			
		||||
@@ -139,26 +139,26 @@ fi
 | 
			
		||||
# Try to detect the needed tools when no environment variable already
 | 
			
		||||
# specifies one:
 | 
			
		||||
echo "Searching for required tools ..."
 | 
			
		||||
[ -z "$ACLOCAL" ] && ACLOCAL=`Search aclocal 1`
 | 
			
		||||
[ -z "$ACLOCAL" ] && ACLOCAL=$(Search aclocal 1)
 | 
			
		||||
[ "$VERBOSE" = "1" ] && echo " - ACLOCAL=$ACLOCAL"
 | 
			
		||||
[ -z "$AUTOHEADER" ] && AUTOHEADER=`Search autoheader 2`
 | 
			
		||||
[ -z "$AUTOHEADER" ] && AUTOHEADER=$(Search autoheader 2)
 | 
			
		||||
[ "$VERBOSE" = "1" ] && echo " - AUTOHEADER=$AUTOHEADER"
 | 
			
		||||
[ -z "$AUTOMAKE" ] && AUTOMAKE=`Search automake 1`
 | 
			
		||||
[ -z "$AUTOMAKE" ] && AUTOMAKE=$(Search automake 1)
 | 
			
		||||
[ "$VERBOSE" = "1" ] && echo " - AUTOMAKE=$AUTOMAKE"
 | 
			
		||||
[ -z "$AUTOCONF" ] && AUTOCONF=`Search autoconf 2`
 | 
			
		||||
[ -z "$AUTOCONF" ] && AUTOCONF=$(Search autoconf 2)
 | 
			
		||||
[ "$VERBOSE" = "1" ] && echo " - AUTOCONF=$AUTOCONF"
 | 
			
		||||
 | 
			
		||||
AUTOCONF_VERSION=`echo $AUTOCONF | cut -d'-' -f2-`
 | 
			
		||||
[ -n "$AUTOCONF_VERSION" -a "$AUTOCONF_VERSION" != "autoconf" ] \
 | 
			
		||||
AUTOCONF_VERSION=$(echo "$AUTOCONF" | cut -d'-' -f2-)
 | 
			
		||||
[ -n "$AUTOCONF_VERSION" ] && [ "$AUTOCONF_VERSION" != "autoconf" ] \
 | 
			
		||||
	&& export AUTOCONF_VERSION || unset AUTOCONF_VERSION
 | 
			
		||||
[ "$VERBOSE" = "1" ] && echo " - AUTOCONF_VERSION=$AUTOCONF_VERSION"
 | 
			
		||||
AUTOMAKE_VERSION=`echo $AUTOMAKE | cut -d'-' -f2-`
 | 
			
		||||
[ -n "$AUTOMAKE_VERSION" -a "$AUTOMAKE_VERSION" != "automake" ] \
 | 
			
		||||
AUTOMAKE_VERSION=$(echo $AUTOMAKE | cut -d'-' -f2-)
 | 
			
		||||
[ -n "$AUTOMAKE_VERSION" ] && [ "$AUTOMAKE_VERSION" != "automake" ] \
 | 
			
		||||
	&& export AUTOMAKE_VERSION || unset AUTOMAKE_VERSION
 | 
			
		||||
[ "$VERBOSE" = "1" ] && echo " - AUTOMAKE_VERSION=$AUTOMAKE_VERSION"
 | 
			
		||||
 | 
			
		||||
[ $# -gt 0 ] && CONFIGURE_ARGS=" $@" || CONFIGURE_ARGS=""
 | 
			
		||||
[ -z "$GO" -a -n "$CONFIGURE_ARGS" ] && GO=1
 | 
			
		||||
[ $# -gt 0 ] && CONFIGURE_ARGS=" $*" || CONFIGURE_ARGS=""
 | 
			
		||||
[ -z "$GO" ] && [ -n "$CONFIGURE_ARGS" ] && GO=1
 | 
			
		||||
 | 
			
		||||
# Verify that all tools have been found
 | 
			
		||||
[ -z "$ACLOCAL" ] && Notfound aclocal
 | 
			
		||||
@@ -166,15 +166,15 @@ AUTOMAKE_VERSION=`echo $AUTOMAKE | cut -d'-' -f2-`
 | 
			
		||||
[ -z "$AUTOMAKE" ] && Notfound automake
 | 
			
		||||
[ -z "$AUTOCONF" ] && Notfound autoconf
 | 
			
		||||
 | 
			
		||||
AM_VERSION=`$AUTOMAKE --version | head -n 1 | sed -e 's/.* //g'`
 | 
			
		||||
AM_VERSION=$($AUTOMAKE --version | head -n 1 | sed -e 's/.* //g')
 | 
			
		||||
ifs=$IFS; IFS="."; set $AM_VERSION; IFS=$ifs
 | 
			
		||||
AM_MAJOR="$1"; AM_MINOR="$2"; AM_PATCHLEVEL="$3"
 | 
			
		||||
AM_MAJOR="$1"; AM_MINOR="$2"
 | 
			
		||||
echo "Detected automake $AM_VERSION ..."
 | 
			
		||||
 | 
			
		||||
AM_MAKEFILES="src/ipaddr/Makefile.ng src/ngircd/Makefile.ng src/testsuite/Makefile.ng src/tool/Makefile.ng"
 | 
			
		||||
 | 
			
		||||
# De-ANSI-fication?
 | 
			
		||||
if [ "$AM_MAJOR" -eq "1" -a "$AM_MINOR" -lt "12" ]; then
 | 
			
		||||
if [ "$AM_MAJOR" -eq "1" ] && [ "$AM_MINOR" -lt "12" ]; then
 | 
			
		||||
	# automake < 1.12 => automatic de-ANSI-fication support available
 | 
			
		||||
	echo " - Enabling de-ANSI-fication support."
 | 
			
		||||
	sed -e "s|^__ng_PROTOTYPES__|AM_C_PROTOTYPES|g" configure.ng >configure.ac
 | 
			
		||||
@@ -188,19 +188,20 @@ else
 | 
			
		||||
	DEANSI_END=" (disabled by ./autogen.sh script)"
 | 
			
		||||
fi
 | 
			
		||||
# Serial test harness?
 | 
			
		||||
if [ "$AM_MAJOR" -eq "1" -a "$AM_MINOR" -ge "13" ]; then
 | 
			
		||||
if [ "$AM_MAJOR" -eq "1" ] && [ "$AM_MINOR" -ge "13" ]; then
 | 
			
		||||
	# automake >= 1.13 => enforce "serial test harness"
 | 
			
		||||
	echo " - Enforcing serial test harness."
 | 
			
		||||
	SERIAL_TESTS="serial-tests"
 | 
			
		||||
else
 | 
			
		||||
	# automake < 1.13 => no new test harness, nothing to do
 | 
			
		||||
	# shellcheck disable=SC2034
 | 
			
		||||
	SERIAL_TEST=""
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
sed -e "s|^__ng_Makefile_am_template__|AUTOMAKE_OPTIONS = ${SERIAL_TESTS} ${DEANSI_START}ansi2knr${DEANSI_END}|g" \
 | 
			
		||||
	src/portab/Makefile.ng >src/portab/Makefile.am
 | 
			
		||||
for makefile_ng in $AM_MAKEFILES; do
 | 
			
		||||
	makefile_am=`echo "$makefile_ng" | sed -e "s|\.ng\$|\.am|g"`
 | 
			
		||||
	makefile_am=$(echo "$makefile_ng" | sed -e "s|\.ng\$|\.am|g")
 | 
			
		||||
	sed -e "s|^__ng_Makefile_am_template__|AUTOMAKE_OPTIONS = ${SERIAL_TESTS} ${DEANSI_START}../portab/ansi2knr${DEANSI_END}|g" \
 | 
			
		||||
		$makefile_ng >$makefile_am
 | 
			
		||||
done
 | 
			
		||||
@@ -214,10 +215,10 @@ Run $ACLOCAL && \
 | 
			
		||||
	Run $AUTOHEADER && \
 | 
			
		||||
	Run $AUTOMAKE --add-missing --no-force
 | 
			
		||||
 | 
			
		||||
if [ $? -eq 0 -a -x ./configure ]; then
 | 
			
		||||
if [ $? -eq 0 ] && [ -x ./configure ]; then
 | 
			
		||||
	# Success: if we got some parameters we call ./configure and pass
 | 
			
		||||
	# all of them to it.
 | 
			
		||||
	NAME=`grep PACKAGE_STRING= configure | cut -d"'" -f2`
 | 
			
		||||
	NAME=$(grep PACKAGE_STRING= configure | cut -d"'" -f2)
 | 
			
		||||
	if [ "$GO" = "1" ]; then
 | 
			
		||||
		[ -n "$PREFIX" ] && p=" --prefix=$PREFIX" || p=""
 | 
			
		||||
		c="./configure${p}${CONFIGURE_ARGS}"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										152
									
								
								config.guess
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										152
									
								
								config.guess
									
									
									
									
										vendored
									
									
								
							@@ -1,8 +1,8 @@
 | 
			
		||||
#! /bin/sh
 | 
			
		||||
# Attempt to guess a canonical system name.
 | 
			
		||||
#   Copyright 1992-2014 Free Software Foundation, Inc.
 | 
			
		||||
#   Copyright 1992-2016 Free Software Foundation, Inc.
 | 
			
		||||
 | 
			
		||||
timestamp='2014-03-23'
 | 
			
		||||
timestamp='2016-04-02'
 | 
			
		||||
 | 
			
		||||
# 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
 | 
			
		||||
@@ -24,12 +24,12 @@ timestamp='2014-03-23'
 | 
			
		||||
# program.  This Exception is an additional permission under section 7
 | 
			
		||||
# of the GNU General Public License, version 3 ("GPLv3").
 | 
			
		||||
#
 | 
			
		||||
# Originally written by Per Bothner.
 | 
			
		||||
# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
 | 
			
		||||
#
 | 
			
		||||
# 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
 | 
			
		||||
# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
 | 
			
		||||
#
 | 
			
		||||
# Please send patches with a ChangeLog entry to config-patches@gnu.org.
 | 
			
		||||
# Please send patches to <config-patches@gnu.org>.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
me=`echo "$0" | sed -e 's,.*/,,'`
 | 
			
		||||
@@ -50,7 +50,7 @@ version="\
 | 
			
		||||
GNU config.guess ($timestamp)
 | 
			
		||||
 | 
			
		||||
Originally written by Per Bothner.
 | 
			
		||||
Copyright 1992-2014 Free Software Foundation, Inc.
 | 
			
		||||
Copyright 1992-2016 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."
 | 
			
		||||
@@ -168,20 +168,27 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 | 
			
		||||
	# Note: NetBSD doesn't particularly care about the vendor
 | 
			
		||||
	# portion of the name.  We always set it to "unknown".
 | 
			
		||||
	sysctl="sysctl -n hw.machine_arch"
 | 
			
		||||
	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
 | 
			
		||||
	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
 | 
			
		||||
	UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
 | 
			
		||||
	    /sbin/$sysctl 2>/dev/null || \
 | 
			
		||||
	    /usr/sbin/$sysctl 2>/dev/null || \
 | 
			
		||||
	    echo unknown)`
 | 
			
		||||
	case "${UNAME_MACHINE_ARCH}" in
 | 
			
		||||
	    armeb) machine=armeb-unknown ;;
 | 
			
		||||
	    arm*) machine=arm-unknown ;;
 | 
			
		||||
	    sh3el) machine=shl-unknown ;;
 | 
			
		||||
	    sh3eb) machine=sh-unknown ;;
 | 
			
		||||
	    sh5el) machine=sh5le-unknown ;;
 | 
			
		||||
	    earmv*)
 | 
			
		||||
		arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
 | 
			
		||||
		endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'`
 | 
			
		||||
		machine=${arch}${endian}-unknown
 | 
			
		||||
		;;
 | 
			
		||||
	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
 | 
			
		||||
	esac
 | 
			
		||||
	# The Operating System including object format, if it has switched
 | 
			
		||||
	# to ELF recently, or will in the future.
 | 
			
		||||
	case "${UNAME_MACHINE_ARCH}" in
 | 
			
		||||
	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
 | 
			
		||||
	    arm*|earm*|i386|m68k|ns32k|sh3*|sparc|vax)
 | 
			
		||||
		eval $set_cc_for_build
 | 
			
		||||
		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
 | 
			
		||||
			| grep -q __ELF__
 | 
			
		||||
@@ -197,6 +204,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 | 
			
		||||
		os=netbsd
 | 
			
		||||
		;;
 | 
			
		||||
	esac
 | 
			
		||||
	# Determine ABI tags.
 | 
			
		||||
	case "${UNAME_MACHINE_ARCH}" in
 | 
			
		||||
	    earm*)
 | 
			
		||||
		expr='s/^earmv[0-9]/-eabi/;s/eb$//'
 | 
			
		||||
		abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"`
 | 
			
		||||
		;;
 | 
			
		||||
	esac
 | 
			
		||||
	# The OS release
 | 
			
		||||
	# Debian GNU/NetBSD machines have a different userland, and
 | 
			
		||||
	# thus, need a distinct triplet. However, they do not need
 | 
			
		||||
@@ -207,13 +221,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 | 
			
		||||
		release='-gnu'
 | 
			
		||||
		;;
 | 
			
		||||
	    *)
 | 
			
		||||
		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
 | 
			
		||||
		release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2`
 | 
			
		||||
		;;
 | 
			
		||||
	esac
 | 
			
		||||
	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
 | 
			
		||||
	# contains redundant information, the shorter form:
 | 
			
		||||
	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
 | 
			
		||||
	echo "${machine}-${os}${release}"
 | 
			
		||||
	echo "${machine}-${os}${release}${abi}"
 | 
			
		||||
	exit ;;
 | 
			
		||||
    *:Bitrig:*:*)
 | 
			
		||||
	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
 | 
			
		||||
@@ -223,6 +237,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 | 
			
		||||
	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
 | 
			
		||||
	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    *:LibertyBSD:*:*)
 | 
			
		||||
	UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
 | 
			
		||||
	echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    *:ekkoBSD:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
 | 
			
		||||
	exit ;;
 | 
			
		||||
@@ -235,6 +253,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 | 
			
		||||
    *:MirBSD:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    *:Sortix:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-sortix
 | 
			
		||||
	exit ;;
 | 
			
		||||
    alpha:OSF1:*:*)
 | 
			
		||||
	case $UNAME_RELEASE in
 | 
			
		||||
	*4.0)
 | 
			
		||||
@@ -251,42 +272,42 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 | 
			
		||||
	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
 | 
			
		||||
	case "$ALPHA_CPU_TYPE" in
 | 
			
		||||
	    "EV4 (21064)")
 | 
			
		||||
		UNAME_MACHINE="alpha" ;;
 | 
			
		||||
		UNAME_MACHINE=alpha ;;
 | 
			
		||||
	    "EV4.5 (21064)")
 | 
			
		||||
		UNAME_MACHINE="alpha" ;;
 | 
			
		||||
		UNAME_MACHINE=alpha ;;
 | 
			
		||||
	    "LCA4 (21066/21068)")
 | 
			
		||||
		UNAME_MACHINE="alpha" ;;
 | 
			
		||||
		UNAME_MACHINE=alpha ;;
 | 
			
		||||
	    "EV5 (21164)")
 | 
			
		||||
		UNAME_MACHINE="alphaev5" ;;
 | 
			
		||||
		UNAME_MACHINE=alphaev5 ;;
 | 
			
		||||
	    "EV5.6 (21164A)")
 | 
			
		||||
		UNAME_MACHINE="alphaev56" ;;
 | 
			
		||||
		UNAME_MACHINE=alphaev56 ;;
 | 
			
		||||
	    "EV5.6 (21164PC)")
 | 
			
		||||
		UNAME_MACHINE="alphapca56" ;;
 | 
			
		||||
		UNAME_MACHINE=alphapca56 ;;
 | 
			
		||||
	    "EV5.7 (21164PC)")
 | 
			
		||||
		UNAME_MACHINE="alphapca57" ;;
 | 
			
		||||
		UNAME_MACHINE=alphapca57 ;;
 | 
			
		||||
	    "EV6 (21264)")
 | 
			
		||||
		UNAME_MACHINE="alphaev6" ;;
 | 
			
		||||
		UNAME_MACHINE=alphaev6 ;;
 | 
			
		||||
	    "EV6.7 (21264A)")
 | 
			
		||||
		UNAME_MACHINE="alphaev67" ;;
 | 
			
		||||
		UNAME_MACHINE=alphaev67 ;;
 | 
			
		||||
	    "EV6.8CB (21264C)")
 | 
			
		||||
		UNAME_MACHINE="alphaev68" ;;
 | 
			
		||||
		UNAME_MACHINE=alphaev68 ;;
 | 
			
		||||
	    "EV6.8AL (21264B)")
 | 
			
		||||
		UNAME_MACHINE="alphaev68" ;;
 | 
			
		||||
		UNAME_MACHINE=alphaev68 ;;
 | 
			
		||||
	    "EV6.8CX (21264D)")
 | 
			
		||||
		UNAME_MACHINE="alphaev68" ;;
 | 
			
		||||
		UNAME_MACHINE=alphaev68 ;;
 | 
			
		||||
	    "EV6.9A (21264/EV69A)")
 | 
			
		||||
		UNAME_MACHINE="alphaev69" ;;
 | 
			
		||||
		UNAME_MACHINE=alphaev69 ;;
 | 
			
		||||
	    "EV7 (21364)")
 | 
			
		||||
		UNAME_MACHINE="alphaev7" ;;
 | 
			
		||||
		UNAME_MACHINE=alphaev7 ;;
 | 
			
		||||
	    "EV7.9 (21364A)")
 | 
			
		||||
		UNAME_MACHINE="alphaev79" ;;
 | 
			
		||||
		UNAME_MACHINE=alphaev79 ;;
 | 
			
		||||
	esac
 | 
			
		||||
	# A Pn.n version is a patched version.
 | 
			
		||||
	# A Vn.n version is a released version.
 | 
			
		||||
	# A Tn.n version is a released field test version.
 | 
			
		||||
	# A Xn.n version is an unreleased experimental baselevel.
 | 
			
		||||
	# 1.2 uses "1.2" for uname -r.
 | 
			
		||||
	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
 | 
			
		||||
	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
 | 
			
		||||
	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
 | 
			
		||||
	exitcode=$?
 | 
			
		||||
	trap '' 0
 | 
			
		||||
@@ -359,16 +380,16 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 | 
			
		||||
	exit ;;
 | 
			
		||||
    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
 | 
			
		||||
	eval $set_cc_for_build
 | 
			
		||||
	SUN_ARCH="i386"
 | 
			
		||||
	SUN_ARCH=i386
 | 
			
		||||
	# If there is a compiler, see if it is configured for 64-bit objects.
 | 
			
		||||
	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
 | 
			
		||||
	# This test works for both compilers.
 | 
			
		||||
	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
 | 
			
		||||
	if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
 | 
			
		||||
	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
 | 
			
		||||
		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
 | 
			
		||||
		(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
 | 
			
		||||
		grep IS_64BIT_ARCH >/dev/null
 | 
			
		||||
	    then
 | 
			
		||||
		SUN_ARCH="x86_64"
 | 
			
		||||
		SUN_ARCH=x86_64
 | 
			
		||||
	    fi
 | 
			
		||||
	fi
 | 
			
		||||
	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
 | 
			
		||||
@@ -393,7 +414,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 | 
			
		||||
	exit ;;
 | 
			
		||||
    sun*:*:4.2BSD:*)
 | 
			
		||||
	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
 | 
			
		||||
	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
 | 
			
		||||
	test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3
 | 
			
		||||
	case "`/bin/arch`" in
 | 
			
		||||
	    sun3)
 | 
			
		||||
		echo m68k-sun-sunos${UNAME_RELEASE}
 | 
			
		||||
@@ -579,8 +600,9 @@ EOF
 | 
			
		||||
	else
 | 
			
		||||
		IBM_ARCH=powerpc
 | 
			
		||||
	fi
 | 
			
		||||
	if [ -x /usr/bin/oslevel ] ; then
 | 
			
		||||
		IBM_REV=`/usr/bin/oslevel`
 | 
			
		||||
	if [ -x /usr/bin/lslpp ] ; then
 | 
			
		||||
		IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
 | 
			
		||||
			   awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
 | 
			
		||||
	else
 | 
			
		||||
		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
 | 
			
		||||
	fi
 | 
			
		||||
@@ -617,13 +639,13 @@ EOF
 | 
			
		||||
		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
 | 
			
		||||
		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
 | 
			
		||||
		    case "${sc_cpu_version}" in
 | 
			
		||||
		      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
 | 
			
		||||
		      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
 | 
			
		||||
		      523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
 | 
			
		||||
		      528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
 | 
			
		||||
		      532)                      # CPU_PA_RISC2_0
 | 
			
		||||
			case "${sc_kernel_bits}" in
 | 
			
		||||
			  32) HP_ARCH="hppa2.0n" ;;
 | 
			
		||||
			  64) HP_ARCH="hppa2.0w" ;;
 | 
			
		||||
			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
 | 
			
		||||
			  32) HP_ARCH=hppa2.0n ;;
 | 
			
		||||
			  64) HP_ARCH=hppa2.0w ;;
 | 
			
		||||
			  '') HP_ARCH=hppa2.0 ;;   # HP-UX 10.20
 | 
			
		||||
			esac ;;
 | 
			
		||||
		    esac
 | 
			
		||||
		fi
 | 
			
		||||
@@ -662,11 +684,11 @@ EOF
 | 
			
		||||
		    exit (0);
 | 
			
		||||
		}
 | 
			
		||||
EOF
 | 
			
		||||
		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
 | 
			
		||||
		    (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
 | 
			
		||||
		    test -z "$HP_ARCH" && HP_ARCH=hppa
 | 
			
		||||
		fi ;;
 | 
			
		||||
	esac
 | 
			
		||||
	if [ ${HP_ARCH} = "hppa2.0w" ]
 | 
			
		||||
	if [ ${HP_ARCH} = hppa2.0w ]
 | 
			
		||||
	then
 | 
			
		||||
	    eval $set_cc_for_build
 | 
			
		||||
 | 
			
		||||
@@ -679,12 +701,12 @@ EOF
 | 
			
		||||
	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
 | 
			
		||||
	    # => hppa64-hp-hpux11.23
 | 
			
		||||
 | 
			
		||||
	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
 | 
			
		||||
	    if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
 | 
			
		||||
		grep -q __LP64__
 | 
			
		||||
	    then
 | 
			
		||||
		HP_ARCH="hppa2.0w"
 | 
			
		||||
		HP_ARCH=hppa2.0w
 | 
			
		||||
	    else
 | 
			
		||||
		HP_ARCH="hppa64"
 | 
			
		||||
		HP_ARCH=hppa64
 | 
			
		||||
	    fi
 | 
			
		||||
	fi
 | 
			
		||||
	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
 | 
			
		||||
@@ -789,14 +811,14 @@ EOF
 | 
			
		||||
	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
 | 
			
		||||
	exit ;;
 | 
			
		||||
    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
 | 
			
		||||
	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
 | 
			
		||||
	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
 | 
			
		||||
	FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
 | 
			
		||||
	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
 | 
			
		||||
	FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
 | 
			
		||||
	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
 | 
			
		||||
	exit ;;
 | 
			
		||||
    5000:UNIX_System_V:4.*:*)
 | 
			
		||||
	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
 | 
			
		||||
	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
 | 
			
		||||
	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
 | 
			
		||||
	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
 | 
			
		||||
	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
 | 
			
		||||
	exit ;;
 | 
			
		||||
    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
 | 
			
		||||
@@ -878,7 +900,7 @@ EOF
 | 
			
		||||
	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/[-(].*//'`-${LIBC}
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    i*86:Minix:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-pc-minix
 | 
			
		||||
@@ -901,7 +923,7 @@ EOF
 | 
			
		||||
	  EV68*) UNAME_MACHINE=alphaev68 ;;
 | 
			
		||||
	esac
 | 
			
		||||
	objdump --private-headers /bin/sh | grep -q ld.so.1
 | 
			
		||||
	if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
 | 
			
		||||
	if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    arc:Linux:*:* | arceb:Linux:*:*)
 | 
			
		||||
@@ -932,6 +954,9 @@ EOF
 | 
			
		||||
    crisv32:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    e2k:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    frv:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
@@ -944,6 +969,9 @@ EOF
 | 
			
		||||
    ia64:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    k1om:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    m32r*:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
@@ -1020,7 +1048,7 @@ EOF
 | 
			
		||||
	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    x86_64:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 | 
			
		||||
	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    xtensa*:Linux:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 | 
			
		||||
@@ -1099,7 +1127,7 @@ EOF
 | 
			
		||||
	# uname -m prints for DJGPP always 'pc', but it prints nothing about
 | 
			
		||||
	# the processor, so we play safe by assuming i586.
 | 
			
		||||
	# Note: whatever this is, it MUST be the same as what config.sub
 | 
			
		||||
	# prints for the "djgpp" host, or else GDB configury will decide that
 | 
			
		||||
	# prints for the "djgpp" host, or else GDB configure will decide that
 | 
			
		||||
	# this is a cross-build.
 | 
			
		||||
	echo i586-pc-msdosdjgpp
 | 
			
		||||
	exit ;;
 | 
			
		||||
@@ -1248,6 +1276,9 @@ EOF
 | 
			
		||||
    SX-8R:SUPER-UX:*:*)
 | 
			
		||||
	echo sx8r-nec-superux${UNAME_RELEASE}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    SX-ACE:SUPER-UX:*:*)
 | 
			
		||||
	echo sxace-nec-superux${UNAME_RELEASE}
 | 
			
		||||
	exit ;;
 | 
			
		||||
    Power*:Rhapsody:*:*)
 | 
			
		||||
	echo powerpc-apple-rhapsody${UNAME_RELEASE}
 | 
			
		||||
	exit ;;
 | 
			
		||||
@@ -1261,9 +1292,9 @@ EOF
 | 
			
		||||
	    UNAME_PROCESSOR=powerpc
 | 
			
		||||
	fi
 | 
			
		||||
	if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
 | 
			
		||||
	    if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; 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) | \
 | 
			
		||||
		    (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
 | 
			
		||||
		    grep IS_64BIT_ARCH >/dev/null
 | 
			
		||||
		then
 | 
			
		||||
		    case $UNAME_PROCESSOR in
 | 
			
		||||
@@ -1285,7 +1316,7 @@ EOF
 | 
			
		||||
	exit ;;
 | 
			
		||||
    *:procnto*:*:* | *:QNX:[0123456789]*:*)
 | 
			
		||||
	UNAME_PROCESSOR=`uname -p`
 | 
			
		||||
	if test "$UNAME_PROCESSOR" = "x86"; then
 | 
			
		||||
	if test "$UNAME_PROCESSOR" = x86; then
 | 
			
		||||
		UNAME_PROCESSOR=i386
 | 
			
		||||
		UNAME_MACHINE=pc
 | 
			
		||||
	fi
 | 
			
		||||
@@ -1316,7 +1347,7 @@ EOF
 | 
			
		||||
	# "uname -m" is not consistent, so use $cputype instead. 386
 | 
			
		||||
	# is converted to i386 for consistency with other x86
 | 
			
		||||
	# operating systems.
 | 
			
		||||
	if test "$cputype" = "386"; then
 | 
			
		||||
	if test "$cputype" = 386; then
 | 
			
		||||
	    UNAME_MACHINE=i386
 | 
			
		||||
	else
 | 
			
		||||
	    UNAME_MACHINE="$cputype"
 | 
			
		||||
@@ -1358,7 +1389,7 @@ EOF
 | 
			
		||||
	echo i386-pc-xenix
 | 
			
		||||
	exit ;;
 | 
			
		||||
    i*86:skyos:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
 | 
			
		||||
	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'`
 | 
			
		||||
	exit ;;
 | 
			
		||||
    i*86:rdos:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-pc-rdos
 | 
			
		||||
@@ -1369,6 +1400,9 @@ EOF
 | 
			
		||||
    x86_64:VMkernel:*:*)
 | 
			
		||||
	echo ${UNAME_MACHINE}-unknown-esx
 | 
			
		||||
	exit ;;
 | 
			
		||||
    amd64:Isilon\ OneFS:*:*)
 | 
			
		||||
	echo x86_64-unknown-onefs
 | 
			
		||||
	exit ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
cat >&2 <<EOF
 | 
			
		||||
@@ -1378,9 +1412,9 @@ This script, last modified $timestamp, has failed to recognize
 | 
			
		||||
the operating system you are using. It is advised that you
 | 
			
		||||
download the most up to date version of the config scripts from
 | 
			
		||||
 | 
			
		||||
  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
 | 
			
		||||
  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
 | 
			
		||||
and
 | 
			
		||||
  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
 | 
			
		||||
  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
 | 
			
		||||
 | 
			
		||||
If the version you run ($0) is already up to date, please
 | 
			
		||||
send the following data and any information you think might be
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										55
									
								
								config.sub
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										55
									
								
								config.sub
									
									
									
									
										vendored
									
									
								
							@@ -1,8 +1,8 @@
 | 
			
		||||
#! /bin/sh
 | 
			
		||||
# Configuration validation subroutine script.
 | 
			
		||||
#   Copyright 1992-2014 Free Software Foundation, Inc.
 | 
			
		||||
#   Copyright 1992-2016 Free Software Foundation, Inc.
 | 
			
		||||
 | 
			
		||||
timestamp='2014-05-01'
 | 
			
		||||
timestamp='2016-03-30'
 | 
			
		||||
 | 
			
		||||
# 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
 | 
			
		||||
@@ -25,7 +25,7 @@ timestamp='2014-05-01'
 | 
			
		||||
# of the GNU General Public License, version 3 ("GPLv3").
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Please send patches with a ChangeLog entry to config-patches@gnu.org.
 | 
			
		||||
# Please send patches to <config-patches@gnu.org>.
 | 
			
		||||
#
 | 
			
		||||
# Configuration subroutine to validate and canonicalize a configuration type.
 | 
			
		||||
# Supply the specified configuration type as an argument.
 | 
			
		||||
@@ -33,7 +33,7 @@ timestamp='2014-05-01'
 | 
			
		||||
# Otherwise, we print the canonical config type on stdout and succeed.
 | 
			
		||||
 | 
			
		||||
# You can get the latest version of this script from:
 | 
			
		||||
# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
 | 
			
		||||
# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
 | 
			
		||||
 | 
			
		||||
# This file is supposed to be the same for all GNU packages
 | 
			
		||||
# and recognize all the CPU types, system types and aliases
 | 
			
		||||
@@ -53,8 +53,7 @@ timestamp='2014-05-01'
 | 
			
		||||
me=`echo "$0" | sed -e 's,.*/,,'`
 | 
			
		||||
 | 
			
		||||
usage="\
 | 
			
		||||
Usage: $0 [OPTION] CPU-MFR-OPSYS
 | 
			
		||||
       $0 [OPTION] ALIAS
 | 
			
		||||
Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
 | 
			
		||||
 | 
			
		||||
Canonicalize a configuration name.
 | 
			
		||||
 | 
			
		||||
@@ -68,7 +67,7 @@ Report bugs and patches to <config-patches@gnu.org>."
 | 
			
		||||
version="\
 | 
			
		||||
GNU config.sub ($timestamp)
 | 
			
		||||
 | 
			
		||||
Copyright 1992-2014 Free Software Foundation, Inc.
 | 
			
		||||
Copyright 1992-2016 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."
 | 
			
		||||
@@ -117,7 +116,7 @@ maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 | 
			
		||||
case $maybe_os in
 | 
			
		||||
  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
 | 
			
		||||
  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
 | 
			
		||||
  knetbsd*-gnu* | netbsd*-gnu* | \
 | 
			
		||||
  knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
 | 
			
		||||
  kopensolaris*-gnu* | \
 | 
			
		||||
  storm-chaos* | os2-emx* | rtmk-nova*)
 | 
			
		||||
    os=-$maybe_os
 | 
			
		||||
@@ -255,12 +254,13 @@ case $basic_machine in
 | 
			
		||||
	| arc | arceb \
 | 
			
		||||
	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
 | 
			
		||||
	| avr | avr32 \
 | 
			
		||||
	| ba \
 | 
			
		||||
	| be32 | be64 \
 | 
			
		||||
	| bfin \
 | 
			
		||||
	| c4x | c8051 | clipper \
 | 
			
		||||
	| d10v | d30v | dlx | dsp16xx \
 | 
			
		||||
	| epiphany \
 | 
			
		||||
	| fido | fr30 | frv \
 | 
			
		||||
	| e2k | epiphany \
 | 
			
		||||
	| fido | fr30 | frv | ft32 \
 | 
			
		||||
	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
 | 
			
		||||
	| hexagon \
 | 
			
		||||
	| i370 | i860 | i960 | ia64 \
 | 
			
		||||
@@ -302,9 +302,10 @@ case $basic_machine in
 | 
			
		||||
	| pdp10 | pdp11 | pj | pjl \
 | 
			
		||||
	| powerpc | powerpc64 | powerpc64le | powerpcle \
 | 
			
		||||
	| pyramid \
 | 
			
		||||
	| riscv32 | riscv64 \
 | 
			
		||||
	| rl78 | rx \
 | 
			
		||||
	| score \
 | 
			
		||||
	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
 | 
			
		||||
	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
 | 
			
		||||
	| sh64 | sh64le \
 | 
			
		||||
	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
 | 
			
		||||
	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
 | 
			
		||||
@@ -312,6 +313,7 @@ case $basic_machine in
 | 
			
		||||
	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
 | 
			
		||||
	| ubicom32 \
 | 
			
		||||
	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
 | 
			
		||||
	| visium \
 | 
			
		||||
	| we32k \
 | 
			
		||||
	| x86 | xc16x | xstormy16 | xtensa \
 | 
			
		||||
	| z8k | z80)
 | 
			
		||||
@@ -326,6 +328,9 @@ case $basic_machine in
 | 
			
		||||
	c6x)
 | 
			
		||||
		basic_machine=tic6x-unknown
 | 
			
		||||
		;;
 | 
			
		||||
	leon|leon[3-9])
 | 
			
		||||
		basic_machine=sparc-$basic_machine
 | 
			
		||||
		;;
 | 
			
		||||
	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
 | 
			
		||||
		basic_machine=$basic_machine-unknown
 | 
			
		||||
		os=-none
 | 
			
		||||
@@ -371,12 +376,13 @@ case $basic_machine in
 | 
			
		||||
	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
 | 
			
		||||
	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
 | 
			
		||||
	| avr-* | avr32-* \
 | 
			
		||||
	| ba-* \
 | 
			
		||||
	| be32-* | be64-* \
 | 
			
		||||
	| bfin-* | bs2000-* \
 | 
			
		||||
	| c[123]* | c30-* | [cjt]90-* | c4x-* \
 | 
			
		||||
	| c8051-* | clipper-* | craynv-* | cydra-* \
 | 
			
		||||
	| d10v-* | d30v-* | dlx-* \
 | 
			
		||||
	| elxsi-* \
 | 
			
		||||
	| e2k-* | elxsi-* \
 | 
			
		||||
	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
 | 
			
		||||
	| h8300-* | h8500-* \
 | 
			
		||||
	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
 | 
			
		||||
@@ -423,12 +429,13 @@ case $basic_machine in
 | 
			
		||||
	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
 | 
			
		||||
	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
 | 
			
		||||
	| pyramid-* \
 | 
			
		||||
	| riscv32-* | riscv64-* \
 | 
			
		||||
	| rl78-* | romp-* | rs6000-* | rx-* \
 | 
			
		||||
	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
 | 
			
		||||
	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
 | 
			
		||||
	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
 | 
			
		||||
	| sparclite-* \
 | 
			
		||||
	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
 | 
			
		||||
	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
 | 
			
		||||
	| tahoe-* \
 | 
			
		||||
	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
 | 
			
		||||
	| tile*-* \
 | 
			
		||||
@@ -436,6 +443,7 @@ case $basic_machine in
 | 
			
		||||
	| ubicom32-* \
 | 
			
		||||
	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
 | 
			
		||||
	| vax-* \
 | 
			
		||||
	| visium-* \
 | 
			
		||||
	| we32k-* \
 | 
			
		||||
	| x86-* | x86_64-* | xc16x-* | xps100-* \
 | 
			
		||||
	| xstormy16-* | xtensa*-* \
 | 
			
		||||
@@ -512,6 +520,9 @@ case $basic_machine in
 | 
			
		||||
		basic_machine=i386-pc
 | 
			
		||||
		os=-aros
 | 
			
		||||
		;;
 | 
			
		||||
	asmjs)
 | 
			
		||||
		basic_machine=asmjs-unknown
 | 
			
		||||
		;;
 | 
			
		||||
	aux)
 | 
			
		||||
		basic_machine=m68k-apple
 | 
			
		||||
		os=-aux
 | 
			
		||||
@@ -773,6 +784,9 @@ case $basic_machine in
 | 
			
		||||
		basic_machine=m68k-isi
 | 
			
		||||
		os=-sysv
 | 
			
		||||
		;;
 | 
			
		||||
	leon-*|leon[3-9]-*)
 | 
			
		||||
		basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'`
 | 
			
		||||
		;;
 | 
			
		||||
	m68knommu)
 | 
			
		||||
		basic_machine=m68k-unknown
 | 
			
		||||
		os=-linux
 | 
			
		||||
@@ -828,6 +842,10 @@ case $basic_machine in
 | 
			
		||||
		basic_machine=powerpc-unknown
 | 
			
		||||
		os=-morphos
 | 
			
		||||
		;;
 | 
			
		||||
	moxiebox)
 | 
			
		||||
		basic_machine=moxie-unknown
 | 
			
		||||
		os=-moxiebox
 | 
			
		||||
		;;
 | 
			
		||||
	msdos)
 | 
			
		||||
		basic_machine=i386-pc
 | 
			
		||||
		os=-msdos
 | 
			
		||||
@@ -1360,11 +1378,11 @@ case $os in
 | 
			
		||||
	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
 | 
			
		||||
	      | -sym* | -kopensolaris* | -plan9* \
 | 
			
		||||
	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
 | 
			
		||||
	      | -aos* | -aros* \
 | 
			
		||||
	      | -aos* | -aros* | -cloudabi* | -sortix* \
 | 
			
		||||
	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
 | 
			
		||||
	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
 | 
			
		||||
	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
 | 
			
		||||
	      | -bitrig* | -openbsd* | -solidbsd* \
 | 
			
		||||
	      | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \
 | 
			
		||||
	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
 | 
			
		||||
	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
 | 
			
		||||
	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
 | 
			
		||||
@@ -1373,14 +1391,15 @@ case $os in
 | 
			
		||||
	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
 | 
			
		||||
	      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
 | 
			
		||||
	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
 | 
			
		||||
	      | -uxpv* | -beos* | -mpeix* | -udk* \
 | 
			
		||||
	      | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
 | 
			
		||||
	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
 | 
			
		||||
	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
 | 
			
		||||
	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
 | 
			
		||||
	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
 | 
			
		||||
	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
 | 
			
		||||
	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
 | 
			
		||||
	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*)
 | 
			
		||||
	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \
 | 
			
		||||
	      | -onefs* | -tirtos*)
 | 
			
		||||
	# Remember, each alternative MUST END IN *, to match a version number.
 | 
			
		||||
		;;
 | 
			
		||||
	-qnx*)
 | 
			
		||||
@@ -1512,6 +1531,8 @@ case $os in
 | 
			
		||||
		;;
 | 
			
		||||
	-nacl*)
 | 
			
		||||
		;;
 | 
			
		||||
	-ios)
 | 
			
		||||
		;;
 | 
			
		||||
	-none)
 | 
			
		||||
		;;
 | 
			
		||||
	*)
 | 
			
		||||
 
 | 
			
		||||
@@ -221,8 +221,8 @@ AC_CHECK_FUNCS([ \
 | 
			
		||||
# Optional functions
 | 
			
		||||
AC_CHECK_FUNCS_ONCE([
 | 
			
		||||
	arc4random arc4random_stir gai_strerror getnameinfo inet_aton \
 | 
			
		||||
	sigaction sigprocmask snprintf vsnprintf strdup strndup strlcpy strlcat \
 | 
			
		||||
	strtok_r unsetenv waitpid])
 | 
			
		||||
	setgroups sigaction sigprocmask snprintf strdup strlcat strlcpy \
 | 
			
		||||
	strndup strtok_r unsetenv vsnprintf waitpid])
 | 
			
		||||
 | 
			
		||||
WORKING_GETADDRINFO
 | 
			
		||||
 | 
			
		||||
@@ -418,8 +418,8 @@ AC_ARG_WITH(openssl,
 | 
			
		||||
				LDFLAGS="-L$withval/lib $LDFLAGS"
 | 
			
		||||
			fi
 | 
			
		||||
			AC_CHECK_LIB(crypto, BIO_s_mem)
 | 
			
		||||
			AC_CHECK_LIB(ssl, SSL_library_init)
 | 
			
		||||
			AC_CHECK_FUNCS(SSL_library_init, x_ssl_openssl=yes,
 | 
			
		||||
			AC_CHECK_LIB(ssl, SSL_new)
 | 
			
		||||
			AC_CHECK_FUNCS(SSL_new, x_ssl_openssl=yes,
 | 
			
		||||
				AC_MSG_ERROR([Can't enable openssl])
 | 
			
		||||
			)
 | 
			
		||||
		fi
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								contrib/Debian/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								contrib/Debian/.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -4,10 +4,13 @@
 | 
			
		||||
files
 | 
			
		||||
ngircd/
 | 
			
		||||
ngircd-full/
 | 
			
		||||
ngircd.service
 | 
			
		||||
ngircd-full.default
 | 
			
		||||
ngircd-full.init
 | 
			
		||||
ngircd-full.postinst
 | 
			
		||||
ngircd-full.service
 | 
			
		||||
ngircd-full-dbg/
 | 
			
		||||
ngircd-full-dbg.default
 | 
			
		||||
ngircd-full-dbg.init
 | 
			
		||||
ngircd-full-dbg.postinst
 | 
			
		||||
ngircd-full-dbg.service
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,33 @@
 | 
			
		||||
ngircd (24~rc1-0ab1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * New "upstream" release candidate 1 for ngIRCd Release 24.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Sat, 07 Jan 2017 18:58:02 +0100
 | 
			
		||||
 | 
			
		||||
ngircd (23-0ab1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * New "upstream" release: ngIRCd 23.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Mon, 16 Nov 2015 21:27:03 +0100
 | 
			
		||||
 | 
			
		||||
ngircd (23~rc1-0ab1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * New "upstream" release candidate 1 for ngIRCd Release 23.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@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.
 | 
			
		||||
 
 | 
			
		||||
@@ -1 +1 @@
 | 
			
		||||
4
 | 
			
		||||
9
 | 
			
		||||
 
 | 
			
		||||
@@ -2,13 +2,14 @@ Source: ngircd
 | 
			
		||||
Section: net
 | 
			
		||||
Priority: optional
 | 
			
		||||
Maintainer: Alexander Barton <alex@barton.de>
 | 
			
		||||
Build-Depends: debhelper (>> 4.0.0),
 | 
			
		||||
Build-Depends: debhelper (>> 9.0.0),
 | 
			
		||||
    autotools-dev,
 | 
			
		||||
    dh-systemd (>= 1.5),
 | 
			
		||||
    expect,
 | 
			
		||||
    libz-dev,
 | 
			
		||||
    libwrap0-dev,
 | 
			
		||||
    libident-dev,
 | 
			
		||||
    libgnutls-dev,
 | 
			
		||||
    libgnutls28-dev,
 | 
			
		||||
    libpam0g-dev,
 | 
			
		||||
    telnet | telnet-ssl,
 | 
			
		||||
Standards-Version: 3.9.1
 | 
			
		||||
 
 | 
			
		||||
@@ -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 "$*"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,6 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#
 | 
			
		||||
# Debian post-installation script
 | 
			
		||||
# $Id: ngircd.postinst,v 1.2 2006/12/26 14:44:40 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
set -e
 | 
			
		||||
@@ -12,6 +11,7 @@ case "$1" in
 | 
			
		||||
			# make sure that the configuration file is not
 | 
			
		||||
			# world-readable, it contains passwords!
 | 
			
		||||
			chmod o= /etc/ngircd/ngircd.conf
 | 
			
		||||
			chgrp irc /etc/ngircd/ngircd.conf
 | 
			
		||||
		fi
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
#!/usr/bin/make -f
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
# Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors
 | 
			
		||||
# Copyright (c)2001-2016 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
 | 
			
		||||
@@ -75,7 +75,7 @@ configure-ngircd-full-dbg: configure
 | 
			
		||||
	  --enable-ipv6
 | 
			
		||||
 | 
			
		||||
build:
 | 
			
		||||
	dh_clean -k
 | 
			
		||||
	dh_prep
 | 
			
		||||
 | 
			
		||||
build-ngircd: build-stamp-ngircd
 | 
			
		||||
build-stamp-ngircd: configure-ngircd
 | 
			
		||||
@@ -111,12 +111,15 @@ clean:
 | 
			
		||||
	dh_testdir
 | 
			
		||||
	dh_testroot
 | 
			
		||||
	rm -f build-stamp*
 | 
			
		||||
	rm -f $(CURDIR)/debian/ngircd.service
 | 
			
		||||
	rm -f $(CURDIR)/debian/ngircd-full.default
 | 
			
		||||
	rm -f $(CURDIR)/debian/ngircd-full.init
 | 
			
		||||
	rm -f $(CURDIR)/debian/ngircd-full.postinst
 | 
			
		||||
	rm -f $(CURDIR)/debian/ngircd-full.service
 | 
			
		||||
	rm -f $(CURDIR)/debian/ngircd-full-dbg.default
 | 
			
		||||
	rm -f $(CURDIR)/debian/ngircd-full-dbg.postinst
 | 
			
		||||
	rm -f $(CURDIR)/debian/ngircd-full-dbg.init
 | 
			
		||||
	rm -f $(CURDIR)/debian/ngircd-full-dbg.service
 | 
			
		||||
 | 
			
		||||
	# Add here commands to clean up after the build process:
 | 
			
		||||
	[ ! -f Makefile ] || $(MAKE) distclean
 | 
			
		||||
@@ -140,7 +143,6 @@ install-ngircd: build-ngircd
 | 
			
		||||
	$(MAKE) install DESTDIR=$(CURDIR)/debian/ngircd
 | 
			
		||||
	rm $(CURDIR)/debian/ngircd/usr/share/doc/ngircd/INSTALL*
 | 
			
		||||
	rm $(CURDIR)/debian/ngircd/usr/share/doc/ngircd/COPYING*
 | 
			
		||||
	mkdir -p $(CURDIR)/debian/ngircd/var/run/ircd
 | 
			
		||||
	cat $(CURDIR)/debian/ngircd/usr/share/doc/ngircd/sample-ngircd.conf | \
 | 
			
		||||
	 sed -e "s|;ServerUID = 65534|ServerUID = irc|g" | \
 | 
			
		||||
	 sed -e "s|;ServerGID = 65534|ServerGID = irc|g" | \
 | 
			
		||||
@@ -157,7 +159,6 @@ install-ngircd-full: build-ngircd-full
 | 
			
		||||
	$(MAKE) install DESTDIR=$(CURDIR)/debian/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" | \
 | 
			
		||||
@@ -176,7 +177,6 @@ install-ngircd-full-dbg: build-ngircd-full-dbg
 | 
			
		||||
	$(MAKE) install DESTDIR=$(CURDIR)/debian/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" | \
 | 
			
		||||
@@ -192,12 +192,18 @@ binary-indep:
 | 
			
		||||
 | 
			
		||||
# Build architecture-dependent files here.
 | 
			
		||||
binary-arch: build install
 | 
			
		||||
	ln -s $(CURDIR)/contrib/ngircd.service \
 | 
			
		||||
	 $(CURDIR)/debian/ngircd.service
 | 
			
		||||
 | 
			
		||||
	ln -s $(CURDIR)/debian/ngircd.default \
 | 
			
		||||
	 $(CURDIR)/debian/ngircd-full.default
 | 
			
		||||
	ln -s $(CURDIR)/debian/ngircd.init \
 | 
			
		||||
	 $(CURDIR)/debian/ngircd-full.init
 | 
			
		||||
	ln -s $(CURDIR)/debian/ngircd.postinst \
 | 
			
		||||
	 $(CURDIR)/debian/ngircd-full.postinst
 | 
			
		||||
	cp $(CURDIR)/contrib/ngircd.service \
 | 
			
		||||
	 $(CURDIR)/debian/ngircd-full.service
 | 
			
		||||
	echo "Alias=ngircd.service" >>$(CURDIR)/debian/ngircd-full.service
 | 
			
		||||
 | 
			
		||||
	ln -s $(CURDIR)/debian/ngircd.default \
 | 
			
		||||
	 $(CURDIR)/debian/ngircd-full-dbg.default
 | 
			
		||||
@@ -205,12 +211,17 @@ binary-arch: build install
 | 
			
		||||
	 $(CURDIR)/debian/ngircd-full-dbg.init
 | 
			
		||||
	ln -s $(CURDIR)/debian/ngircd.postinst \
 | 
			
		||||
	 $(CURDIR)/debian/ngircd-full-dbg.postinst
 | 
			
		||||
	cp $(CURDIR)/contrib/ngircd.service \
 | 
			
		||||
	 $(CURDIR)/debian/ngircd-full-dbg.service
 | 
			
		||||
	echo "Alias=ngircd.service" >>$(CURDIR)/debian/ngircd-full-dbg.service
 | 
			
		||||
 | 
			
		||||
	dh_testdir
 | 
			
		||||
	dh_testroot
 | 
			
		||||
	dh_installchangelogs -a -A ChangeLog
 | 
			
		||||
	dh_installdocs -a
 | 
			
		||||
	dh_systemd_enable -a
 | 
			
		||||
	dh_installinit -a
 | 
			
		||||
	dh_systemd_start -a
 | 
			
		||||
	dh_strip -a --no-package=ngircd-full-dbg
 | 
			
		||||
	dh_compress -a -XCommands.txt
 | 
			
		||||
	dh_fixperms -a
 | 
			
		||||
@@ -222,6 +233,6 @@ binary-arch: build install
 | 
			
		||||
 | 
			
		||||
binary: binary-indep binary-arch
 | 
			
		||||
 | 
			
		||||
.PHONY: build clean binary-indep binary-arch binary install 
 | 
			
		||||
.PHONY: build clean binary-indep binary-arch binary install
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
 
 | 
			
		||||
@@ -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>"; };
 | 
			
		||||
@@ -310,7 +310,7 @@
 | 
			
		||||
		1AB674ADFE9D54B511CA2CBB /* Products */ = {
 | 
			
		||||
			isa = PBXGroup;
 | 
			
		||||
			children = (
 | 
			
		||||
				FA322BBA0CEF72E4001761B3 /* ngIRCd */,
 | 
			
		||||
				FA322BBA0CEF72E4001761B3 /* ngircd */,
 | 
			
		||||
			);
 | 
			
		||||
			name = Products;
 | 
			
		||||
			sourceTree = "<group>";
 | 
			
		||||
@@ -626,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 */
 | 
			
		||||
@@ -635,7 +635,7 @@
 | 
			
		||||
		08FB7793FE84155DC02AAC07 /* Project object */ = {
 | 
			
		||||
			isa = PBXProject;
 | 
			
		||||
			attributes = {
 | 
			
		||||
				LastUpgradeCheck = 0430;
 | 
			
		||||
				LastUpgradeCheck = 0800;
 | 
			
		||||
			};
 | 
			
		||||
			buildConfigurationList = 1DEB928908733DD80010E9CD /* Build configuration list for PBXProject "ngIRCd" */;
 | 
			
		||||
			compatibilityVersion = "Xcode 3.2";
 | 
			
		||||
@@ -742,10 +742,25 @@
 | 
			
		||||
		1DEB928B08733DD80010E9CD /* Default */ = {
 | 
			
		||||
			isa = XCBuildConfiguration;
 | 
			
		||||
			buildSettings = {
 | 
			
		||||
				ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
 | 
			
		||||
				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
 | 
			
		||||
				CLANG_WARN_BOOL_CONVERSION = YES;
 | 
			
		||||
				CLANG_WARN_CONSTANT_CONVERSION = YES;
 | 
			
		||||
				CLANG_WARN_EMPTY_BODY = YES;
 | 
			
		||||
				CLANG_WARN_ENUM_CONVERSION = YES;
 | 
			
		||||
				CLANG_WARN_INFINITE_RECURSION = YES;
 | 
			
		||||
				CLANG_WARN_INT_CONVERSION = YES;
 | 
			
		||||
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
 | 
			
		||||
				CLANG_WARN_UNREACHABLE_CODE = YES;
 | 
			
		||||
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 | 
			
		||||
				CODE_SIGN_IDENTITY = "";
 | 
			
		||||
				ENABLE_STRICT_OBJC_MSGSEND = YES;
 | 
			
		||||
				GCC_NO_COMMON_BLOCKS = NO;
 | 
			
		||||
				GCC_VERSION = "";
 | 
			
		||||
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
 | 
			
		||||
				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 | 
			
		||||
				GCC_WARN_UNDECLARED_SELECTOR = YES;
 | 
			
		||||
				GCC_WARN_UNINITIALIZED_AUTOS = YES;
 | 
			
		||||
				GCC_WARN_UNUSED_FUNCTION = YES;
 | 
			
		||||
				GCC_WARN_UNUSED_VARIABLE = YES;
 | 
			
		||||
				MACOSX_DEPLOYMENT_TARGET = 10.6;
 | 
			
		||||
				SDKROOT = "";
 | 
			
		||||
@@ -755,11 +770,27 @@
 | 
			
		||||
		FAB0570C105D917F006AF9E2 /* Debug */ = {
 | 
			
		||||
			isa = XCBuildConfiguration;
 | 
			
		||||
			buildSettings = {
 | 
			
		||||
				ARCHS = "$(NATIVE_ARCH_ACTUAL)";
 | 
			
		||||
				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
 | 
			
		||||
				CLANG_WARN_BOOL_CONVERSION = YES;
 | 
			
		||||
				CLANG_WARN_CONSTANT_CONVERSION = YES;
 | 
			
		||||
				CLANG_WARN_EMPTY_BODY = YES;
 | 
			
		||||
				CLANG_WARN_ENUM_CONVERSION = YES;
 | 
			
		||||
				CLANG_WARN_INFINITE_RECURSION = YES;
 | 
			
		||||
				CLANG_WARN_INT_CONVERSION = YES;
 | 
			
		||||
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
 | 
			
		||||
				CLANG_WARN_UNREACHABLE_CODE = YES;
 | 
			
		||||
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 | 
			
		||||
				ENABLE_STRICT_OBJC_MSGSEND = YES;
 | 
			
		||||
				ENABLE_TESTABILITY = YES;
 | 
			
		||||
				GCC_DEBUGGING_SYMBOLS = full;
 | 
			
		||||
				GCC_NO_COMMON_BLOCKS = NO;
 | 
			
		||||
				GCC_OPTIMIZATION_LEVEL = 0;
 | 
			
		||||
				GCC_VERSION = "";
 | 
			
		||||
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
 | 
			
		||||
				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 | 
			
		||||
				GCC_WARN_UNDECLARED_SELECTOR = YES;
 | 
			
		||||
				GCC_WARN_UNINITIALIZED_AUTOS = YES;
 | 
			
		||||
				GCC_WARN_UNUSED_FUNCTION = YES;
 | 
			
		||||
				GCC_WARN_UNUSED_VARIABLE = YES;
 | 
			
		||||
				MACOSX_DEPLOYMENT_TARGET = 10.6;
 | 
			
		||||
				ONLY_ACTIVE_ARCH = YES;
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@
 | 
			
		||||
Debian/
 | 
			
		||||
 - Various files for building Debian GNU/Linux packages (".deb's").
 | 
			
		||||
	- ngircd.init; ngircd.default: init script for Debian-based systems.
 | 
			
		||||
	- ngircd.pam: example PAM configuraton.
 | 
			
		||||
	- ngircd.pam: example PAM configuration.
 | 
			
		||||
 | 
			
		||||
MacOSX/
 | 
			
		||||
 - Project files for XCode, the "project builder" of Apple Mac OS X.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,17 +1,17 @@
 | 
			
		||||
#/bin/sh
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
 | 
			
		||||
INDENTARGS="-kr -i8 -ts8 -l80 -c3 -cd41 -ss -ncs -psl"
 | 
			
		||||
 | 
			
		||||
# check if indent(1) is available
 | 
			
		||||
type indent >/dev/null 2>&1 && INDENT="indent"
 | 
			
		||||
type gindent >/dev/null 2>&1 && INDENT="gindent"
 | 
			
		||||
type gnuindent >/dev/null 2>&1 && INDENT="gnuindent"
 | 
			
		||||
command -v indent >/dev/null 2>&1 && INDENT="indent"
 | 
			
		||||
command -v gindent >/dev/null 2>&1 && INDENT="gindent"
 | 
			
		||||
command -v gnuindent >/dev/null 2>&1 && INDENT="gnuindent"
 | 
			
		||||
 | 
			
		||||
if [ -z "$INDENT" ]; then
 | 
			
		||||
	echo "Error: GNU \"indent\" not found!"
 | 
			
		||||
	exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
$INDENT -v $INDENTARGS $*
 | 
			
		||||
$INDENT -v $INDENTARGS "$@"
 | 
			
		||||
 | 
			
		||||
# -eof-
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										0
									
								
								contrib/ngircd-bsd.sh
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										0
									
								
								contrib/ngircd-bsd.sh
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
								
								
									
										0
									
								
								contrib/ngircd-redhat.init
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										0
									
								
								contrib/ngircd-redhat.init
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							@@ -1,11 +1,43 @@
 | 
			
		||||
# ngIRCd systemd service unit.
 | 
			
		||||
# See systemd(1), systemd.unit(5), systemd.service(5), systemd.exec(5).
 | 
			
		||||
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Next Generation IRC Daemon
 | 
			
		||||
Documentation=man:ngircd(8) man:ngircd.conf(5) https://ngircd.barton.de
 | 
			
		||||
After=network.target
 | 
			
		||||
Wants=anope.service atheme.service irc-services.service
 | 
			
		||||
Wants=bopm.service
 | 
			
		||||
Before=anope.service atheme.service irc-services.service
 | 
			
		||||
Before=bopm.service
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Type=forking
 | 
			
		||||
ExecStart=/usr/sbin/ngircd
 | 
			
		||||
User=irc
 | 
			
		||||
Group=irc
 | 
			
		||||
# Settings & limits:
 | 
			
		||||
CapabilityBoundingSet=CAP_SYS_CHROOT CAP_NET_BIND_SERVICE
 | 
			
		||||
MemoryDenyWriteExecute=yes
 | 
			
		||||
NoNewPrivileges=yes
 | 
			
		||||
PrivateDevices=yes
 | 
			
		||||
PrivateTmp=yes
 | 
			
		||||
ProtectControlGroups=yes
 | 
			
		||||
ProtectHome=yes
 | 
			
		||||
ProtectKernelModules=yes
 | 
			
		||||
ProtectKernelTunables=yes
 | 
			
		||||
ProtectSystem=full
 | 
			
		||||
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
 | 
			
		||||
RestrictRealtime=yes
 | 
			
		||||
RuntimeDirectory=ircd
 | 
			
		||||
RuntimeDirectoryMode=750
 | 
			
		||||
# Try to load "default files" from any Debian package variant to keep this
 | 
			
		||||
# unit generic.
 | 
			
		||||
EnvironmentFile=-/etc/default/ngircd
 | 
			
		||||
EnvironmentFile=-/etc/default/ngircd-full
 | 
			
		||||
EnvironmentFile=-/etc/default/ngircd-full-dbg
 | 
			
		||||
# Start ngIRCd. Note: systemd doesn't allow to use $DAEMON here!
 | 
			
		||||
ExecStart=/usr/sbin/ngircd $PARAMS
 | 
			
		||||
ExecReload=/bin/kill -HUP $MAINPID
 | 
			
		||||
Restart=on-failure
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Next Generation IRC Daemon (Socket)
 | 
			
		||||
Documentation=man:ngircd(8) man:ngircd.conf(5)
 | 
			
		||||
 | 
			
		||||
[Socket]
 | 
			
		||||
BindIPv6Only=ipv6-only
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
%define name    ngircd
 | 
			
		||||
%define version 22~rc1
 | 
			
		||||
%define version 24~rc1
 | 
			
		||||
%define release 1
 | 
			
		||||
%define prefix  %{_prefix}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#
 | 
			
		||||
# ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
# Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors
 | 
			
		||||
# Copyright (c)2001-2016 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
 | 
			
		||||
@@ -14,14 +14,14 @@
 | 
			
		||||
# suitable for inclusion in doc/Platforms.txt -- please send reports
 | 
			
		||||
# to the ngIRCd mailing list: <ngircd-ml@ngircd.barton.de>.
 | 
			
		||||
 | 
			
		||||
NAME=`basename "$0"`
 | 
			
		||||
NAME=$(basename "$0")
 | 
			
		||||
VERBOSE=
 | 
			
		||||
CLEAN=1
 | 
			
		||||
 | 
			
		||||
PLATFORM=
 | 
			
		||||
COMPILER="unknown"
 | 
			
		||||
VERSION="unknown"
 | 
			
		||||
DATE=`date "+%y-%m-%d"`
 | 
			
		||||
DATE=$(date "+%y-%m-%d")
 | 
			
		||||
COMMENT=
 | 
			
		||||
 | 
			
		||||
R_CONFIGURE=
 | 
			
		||||
@@ -30,7 +30,7 @@ R_CHECK=
 | 
			
		||||
R_CHECK_Y="?"
 | 
			
		||||
R_RUN=
 | 
			
		||||
 | 
			
		||||
SRC_D=`dirname "$0"`
 | 
			
		||||
SRC_D=$(dirname "$0")
 | 
			
		||||
MY_D="$PWD"
 | 
			
		||||
 | 
			
		||||
[ -n "$MAKE" ] || MAKE="make"
 | 
			
		||||
@@ -55,6 +55,11 @@ while [ $# -gt 0 ]; do
 | 
			
		||||
	shift
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
for cmd in telnet expect; do
 | 
			
		||||
	command -v "$cmd" >/dev/null 2>&1 \
 | 
			
		||||
		|| echo "$NAME: WARNING: $cmd(1) not found, \"make check\" won't run all tests!"
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
echo "$NAME: Checking ngIRCd base source directory ..."
 | 
			
		||||
grep "ngIRCd" "$SRC_D/ChangeLog" >/dev/null 2>&1
 | 
			
		||||
if [ $? -ne 0 ]; then
 | 
			
		||||
@@ -72,10 +77,14 @@ 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
 | 
			
		||||
	if [ $? -eq 0 ] && [ -n "$CLEAN" ]; then
 | 
			
		||||
		echo "$NAME: Running \"git clean\" ..."
 | 
			
		||||
		cd "$SRC_D" || exit 1
 | 
			
		||||
		[ -n "$VERBOSE" ] && git clean -dxf || git clean -dxf >/dev/null
 | 
			
		||||
		if [ -n "$VERBOSE" ]; then
 | 
			
		||||
			git clean -dxf
 | 
			
		||||
		else
 | 
			
		||||
			git clean -dxf >/dev/null
 | 
			
		||||
		fi
 | 
			
		||||
		cd "$MY_D" || exit 1
 | 
			
		||||
	fi
 | 
			
		||||
fi
 | 
			
		||||
@@ -84,21 +93,38 @@ 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
 | 
			
		||||
	if [ -n "$VERBOSE" ]; then
 | 
			
		||||
		./autogen.sh
 | 
			
		||||
	else
 | 
			
		||||
		./autogen.sh >/dev/null
 | 
			
		||||
	fi
 | 
			
		||||
	cd "$MY_D" || exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
	if [ -n "$VERBOSE" ]; then
 | 
			
		||||
		"$SRC_D/configure" -C
 | 
			
		||||
	else
 | 
			
		||||
		"$SRC_D/configure" -C >/dev/null
 | 
			
		||||
	fi
 | 
			
		||||
	if [ $? -eq 0 ] && [ -r ./Makefile ]; then
 | 
			
		||||
		R_CONFIGURE=1
 | 
			
		||||
		rm -f "src/ngircd/ngircd"
 | 
			
		||||
		echo "$NAME: Running \"$MAKE\" ..."
 | 
			
		||||
		[ -n "$VERBOSE" ] && "$MAKE" || "$MAKE" >/dev/null
 | 
			
		||||
		if [ $? -eq 0 -a -x src/ngircd/ngircd ]; then
 | 
			
		||||
		if [ -n "$VERBOSE" ]; then
 | 
			
		||||
			"$MAKE"
 | 
			
		||||
		else
 | 
			
		||||
			"$MAKE" >/dev/null
 | 
			
		||||
		fi
 | 
			
		||||
		if [ $? -eq 0 ] && [ -x src/ngircd/ngircd ]; then
 | 
			
		||||
			R_MAKE=1
 | 
			
		||||
			echo "$NAME: Running \"$MAKE check\" ..."
 | 
			
		||||
			[ -n "$VERBOSE" ] && "$MAKE" check || "$MAKE" check >/dev/null
 | 
			
		||||
			if [ -n "$VERBOSE" ]; then
 | 
			
		||||
				"$MAKE" check
 | 
			
		||||
			else
 | 
			
		||||
				"$MAKE" check >/dev/null
 | 
			
		||||
			fi
 | 
			
		||||
			if [ $? -eq 0 ]; then
 | 
			
		||||
				R_CHECK=1
 | 
			
		||||
				R_RUN=$R_CHECK
 | 
			
		||||
@@ -115,13 +141,13 @@ fi
 | 
			
		||||
 | 
			
		||||
# Get target platform information
 | 
			
		||||
if [ -r "src/config.h" ]; then
 | 
			
		||||
	CPU=`grep "HOST_CPU" "src/config.h" | cut -d'"' -f2`
 | 
			
		||||
	OS=`grep "HOST_OS" "src/config.h" | cut -d'"' -f2`
 | 
			
		||||
	VENDOR=`grep "HOST_VENDOR" "src/config.h" | cut -d'"' -f2`
 | 
			
		||||
	CPU=$(grep "HOST_CPU" "src/config.h" | cut -d'"' -f2)
 | 
			
		||||
	OS=$(grep "HOST_OS" "src/config.h" | cut -d'"' -f2)
 | 
			
		||||
	VENDOR=$(grep "HOST_VENDOR" "src/config.h" | cut -d'"' -f2)
 | 
			
		||||
	PLATFORM="$CPU/$VENDOR/$OS"
 | 
			
		||||
fi
 | 
			
		||||
if [ -z "$PLATFORM" ]; then
 | 
			
		||||
	PLATFORM="`uname 2>/dev/null` `uname -r 2>/dev/null`, `uname -m 2>/dev/null`"
 | 
			
		||||
	PLATFORM="$(uname 2>/dev/null) $(uname -r 2>/dev/null), $(uname -m 2>/dev/null)"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Get compiler information
 | 
			
		||||
@@ -153,18 +179,18 @@ if [ -r "Makefile" ]; then
 | 
			
		||||
			  | cut -d'(' -f1 | sed -e 's/version //g')
 | 
			
		||||
		fi
 | 
			
		||||
		if [ "$COMPILER" = "unknown" ]; then
 | 
			
		||||
			v="`$CC --version 2>/dev/null | head -1`"
 | 
			
		||||
			[ -z "$v" ] && v="`$CC -version 2>/dev/null | head -1`"
 | 
			
		||||
			v="$($CC --version 2>/dev/null | head -1)"
 | 
			
		||||
			[ -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 -b1-10`
 | 
			
		||||
		VERSION=$(echo "$VERSION" | cut -b1-10)
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
[ -n "$VERSION" ] || VERSION="unknown"
 | 
			
		||||
@@ -184,7 +210,12 @@ fi
 | 
			
		||||
[ -n "$R_CONFIGURE" ] && C="Y" || C="N"
 | 
			
		||||
[ -n "$R_MAKE" ] && M="Y" || M="N"
 | 
			
		||||
[ -n "$R_CHECK" ] && T="$R_CHECK_Y" || T="N"
 | 
			
		||||
[ -n "$R_RUN" ] && R="Y" || R="N"
 | 
			
		||||
if [ -n "$R_RUN" ]; then
 | 
			
		||||
	# Mark "runs" with "Y" only when the test suite succeeded:
 | 
			
		||||
	[ "$T" = "N" ] && R="?" || R="Y"
 | 
			
		||||
else
 | 
			
		||||
	R="N"
 | 
			
		||||
fi
 | 
			
		||||
[ -n "$COMMENT" ] && COMMENT=" $COMMENT"
 | 
			
		||||
 | 
			
		||||
echo
 | 
			
		||||
@@ -195,17 +226,29 @@ echo "                                                  ./configure works --+ |
 | 
			
		||||
echo "                                                                      | | | |"
 | 
			
		||||
echo "Platform                    Compiler     ngIRCd     Date     Tester   C M T R *"
 | 
			
		||||
echo "--------------------------- ------------ ---------- -------- -------- - - - - -"
 | 
			
		||||
type printf >/dev/null 2>&1
 | 
			
		||||
command -v printf >/dev/null 2>&1
 | 
			
		||||
if [ $? -eq 0 ]; then
 | 
			
		||||
	printf "%-27s %-12s %-10s %s %-8s %s %s %s %s%s\n" \
 | 
			
		||||
	 "$PLATFORM" "$COMPILER" "$VERSION" "$DATE" "$USER" \
 | 
			
		||||
	 "$PLATFORM" "$COMPILER" "$VERSION" "$DATE" "$LOGNAME" \
 | 
			
		||||
	 "$C" "$M" "$T" "$R" "$COMMENT"
 | 
			
		||||
else
 | 
			
		||||
	echo "$PLATFORM $COMPILER $VERSION $DATE $USER" \
 | 
			
		||||
	echo "$PLATFORM $COMPILER $VERSION $DATE $LOGNAME" \
 | 
			
		||||
	 "$C" "$M" "$T" "$R" "$COMMENT"
 | 
			
		||||
fi
 | 
			
		||||
echo
 | 
			
		||||
 | 
			
		||||
double_check() {
 | 
			
		||||
	echo "Please double check that the ngIRCd daemon starts up, runs and handles IRC"
 | 
			
		||||
	echo "connections successfully!"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if [ "$R_CHECK_Y" = "y" ]; then
 | 
			
		||||
	echo "$NAME: Warning: Some tests have been skipped!"
 | 
			
		||||
	echo "WARNING: Some tests have been skipped!"
 | 
			
		||||
	double_check
 | 
			
		||||
	echo
 | 
			
		||||
fi
 | 
			
		||||
if [ "$R" = "?" ]; then
 | 
			
		||||
	echo "WARNING: The resulting binary passed simple tests, but the test suite failed!"
 | 
			
		||||
	double_check
 | 
			
		||||
	echo
 | 
			
		||||
fi
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								doc/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								doc/.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1 +0,0 @@
 | 
			
		||||
sample-ngircd.conf
 | 
			
		||||
@@ -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
 | 
			
		||||
 | 
			
		||||
@@ -324,7 +324,7 @@ General Commands
 | 
			
		||||
	In addition, IRC Ops can use these two forms to specify the <target>:
 | 
			
		||||
	.
 | 
			
		||||
	 - #<hostmask>
 | 
			
		||||
	 - #<servermask>
 | 
			
		||||
	 - $<servermask>
 | 
			
		||||
	.
 | 
			
		||||
	The <mask> can contain the wildcard characters "*" and "?", but must
 | 
			
		||||
	contain at least one dot (".") and no wildcard after the last one.
 | 
			
		||||
@@ -380,7 +380,7 @@ Status and Informational Commands
 | 
			
		||||
 | 
			
		||||
	Please note that "all" IRC daemons even parse separate nicknames in
 | 
			
		||||
	a single parameter (like ":nick1 nick2"), and therefore ngIRCd
 | 
			
		||||
	implements this behaviour, too.
 | 
			
		||||
	implements this behavior, too.
 | 
			
		||||
 | 
			
		||||
	References:
 | 
			
		||||
	 - RFC 2812, 4.9 "Ison message"
 | 
			
		||||
 
 | 
			
		||||
@@ -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.
 | 
			
		||||
 | 
			
		||||
@@ -15,7 +15,7 @@ get an idea of how to do it the best :-)
 | 
			
		||||
 - Use GIT
 | 
			
		||||
 | 
			
		||||
   The source code of ngIRCd is maintained using GIT, see doc/GIT.txt. So if
 | 
			
		||||
   remotely possible, use GIT for your work, too. It makes your and our lifes
 | 
			
		||||
   remotely possible, use GIT for your work, too. It makes your and our lives
 | 
			
		||||
   much easier ;-)
 | 
			
		||||
 | 
			
		||||
 - Don't forget to include documentation
 | 
			
		||||
@@ -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 \
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
                           http://ngircd.barton.de/
 | 
			
		||||
 | 
			
		||||
               (c)2001-2014 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.
 | 
			
		||||
 | 
			
		||||
@@ -28,6 +28,7 @@ channels he is using at the moment.
 | 
			
		||||
  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.
 | 
			
		||||
@@ -55,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.
 | 
			
		||||
@@ -73,17 +75,21 @@ channel of which he is a member.
 | 
			
		||||
 | 
			
		||||
  mode	since	description
 | 
			
		||||
 | 
			
		||||
  q	20	User is channel owner can only be set by a service, other
 | 
			
		||||
		owner and irc op. Can promote other users to q, a, o, h, v.
 | 
			
		||||
  a	20	User is channel admin and can promote other users to v, h, o
 | 
			
		||||
  q	20	User is channel owner. This mode can only be set by an IRC
 | 
			
		||||
		service, other owner or IRC operator. Channel owners can
 | 
			
		||||
		promote other users to all levels: q, a, o, h, v. Prefix: "~".
 | 
			
		||||
  a	20	User is channel admin and can promote other users to v, h, o.
 | 
			
		||||
		Prefix: "&".
 | 
			
		||||
  o	0.2.0	User is channel operator and can op/kick/... other members.
 | 
			
		||||
		Prefix: "@".
 | 
			
		||||
  h	20	User is half op and can set channel modes imntvIbek and kick
 | 
			
		||||
		voiced and normal users.
 | 
			
		||||
		voiced and normal users. Prefix: "%".
 | 
			
		||||
  v	0.2.0	User is "voiced" and can speak even if channel is moderated.
 | 
			
		||||
		Prefix: "+".
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Notes
 | 
			
		||||
~~~~~
 | 
			
		||||
 | 
			
		||||
(1) This mode is not set by ngIRCd itself but by services. ngIRCd handles
 | 
			
		||||
    the mode transparently and possibly adjusts its behaviour.
 | 
			
		||||
    the mode transparently and possibly adjusts its behavior.
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,10 @@ A very simple -- and quite useless ;-) -- example would be:
 | 
			
		||||
Here the "pam_debug" module will be called each time a client connects to
 | 
			
		||||
the ngIRCd and has sent its PASS, NICK, and USER commands.
 | 
			
		||||
 | 
			
		||||
The PAM library used by the ngIRCd daemon must be able to access its
 | 
			
		||||
configuration file, so don't forget to check permissions and run something
 | 
			
		||||
like this: "chmod 644 /etc/pam.d/ngircd".
 | 
			
		||||
 | 
			
		||||
Please note ONE VERY IMPORTANT THING:
 | 
			
		||||
 | 
			
		||||
All the PAM modules are executed with the privileges of the user ngIRCd
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
                     ngIRCd - Next Generation IRC Server
 | 
			
		||||
                           http://ngircd.barton.de/
 | 
			
		||||
 | 
			
		||||
               (c)2001-2013 Alexander Barton and Contributors.
 | 
			
		||||
               (c)2001-2016 Alexander Barton and Contributors.
 | 
			
		||||
               ngIRCd is free software and published under the
 | 
			
		||||
                   terms of the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
@@ -30,42 +30,48 @@ 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
 | 
			
		||||
armv7l/unk./linux-gnueabihf gcc 4.9.2    23         16-01-10 alex     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    21         13-11-10 alex     Y Y Y Y 3
 | 
			
		||||
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/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
 | 
			
		||||
i386/pc/minix               clang 3.4    23         16-01-06 goetz    Y Y N Y
 | 
			
		||||
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/pc/solaris2.11         gcc 4.8.2    23         16-02-07 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/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.8.2    21         14-02-09 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.5     gcc 2.95.3   23         15-11-27 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.2    21         14-01-02 alex     Y Y N Y
 | 
			
		||||
i686/pc/linux-gnu           gcc 2.7.2    21~38      14-01-06 goetz    Y Y Y Y 1
 | 
			
		||||
i586/pc/interix3.5          gcc 3.3      23         16-01-29 alex     Y Y N Y
 | 
			
		||||
i686/pc/cygwin              gcc 4.9.3    23         16-01-06 alex     Y Y Y Y
 | 
			
		||||
i686/pc/linux-gnu           gcc 2.6.3    23         16-01-06 goetz    Y Y y Y 1
 | 
			
		||||
i686/pc/linux-gnu           gcc 2.7.2.1  23         15-11-30 goetz    Y Y N Y 1
 | 
			
		||||
i686/pc/linux-gnu           gcc 2.95.2   23         15-12-23 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
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
@@ -75,7 +81,7 @@ 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      21.1       14-04-14 goetz    Y Y Y Y 3
 | 
			
		||||
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
 | 
			
		||||
@@ -87,20 +93,30 @@ 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  21.1       14-07-25 goetz    Y Y Y Y 3
 | 
			
		||||
x86_64/apple/darwin14.5.0   A-clang 6.1  23~rc1     15-09-06 alex     Y Y Y Y 3
 | 
			
		||||
x86_64/apple/darwin15.6.0   A-clang 8.0  23~38-g455 16-11-04 alex     Y Y Y Y 3
 | 
			
		||||
x86_64/apple/darwin16.3.0   A-clang 8.0  23~55-g8e0 17-01-06 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    21         14-01-02 alex     Y Y Y Y 3
 | 
			
		||||
x86_64/unknown/freebsd9.1   gcc 4.2.1    21         14-01-02 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/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/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    23~rc1-3   15-11-15 alex     Y Y Y Y 1
 | 
			
		||||
x86_64/unknown/linux-gnu    gcc 4.7.2    23~rc1-3   15-11-15 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/pc/linux-gnu         gcc 4.9.2    23~55-g8e0 17-01-06 alex     Y Y Y Y 1
 | 
			
		||||
x86_64/unknown/linux-gnu    gcc 5.3.0    23         15-12-14 goetz    Y Y Y Y 1
 | 
			
		||||
x86_64/pc/linux-gnu         gcc 6.2.1    23~44-g995 16-12-06 alex     Y Y Y Y 1
 | 
			
		||||
x86_64/unknown/linux-gnu    icc 16       23         16-01-13 goetz    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    21         13-12-28 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
 | 
			
		||||
 
 | 
			
		||||
@@ -193,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?
 | 
			
		||||
@@ -226,6 +226,15 @@
 | 
			
		||||
	# character prepended to their respective user names!
 | 
			
		||||
	;PAMIsOptional = no
 | 
			
		||||
 | 
			
		||||
	# When PAM is enabled, this value determines the used PAM
 | 
			
		||||
	# configuration.
 | 
			
		||||
	# This setting allows to run multiple ngIRCd instances with
 | 
			
		||||
	# different PAM configurations on each instance.
 | 
			
		||||
	# If you set it to "ngircd-foo", PAM will use
 | 
			
		||||
	# /etc/pam.d/ngircd-foo instead of the default
 | 
			
		||||
	# /etc/pam.d/ngircd.
 | 
			
		||||
	;PAMServiceName = ngircd
 | 
			
		||||
 | 
			
		||||
	# Let ngIRCd send an "authentication PING" when a new client connects,
 | 
			
		||||
	# and register this client only after receiving the corresponding
 | 
			
		||||
	# "PONG" reply.
 | 
			
		||||
@@ -259,9 +268,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 "Oct 2013" ngIRCd "ngIRCd Manual"
 | 
			
		||||
.TH ngircd 8 "Jan 2016" 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 "Jan 2014" ngIRCd "ngIRCd Manual"
 | 
			
		||||
.TH ngircd.conf 5 "Jan 2016" ngIRCd "ngIRCd Manual"
 | 
			
		||||
.SH NAME
 | 
			
		||||
ngircd.conf \- configuration file of ngIRCd
 | 
			
		||||
.SH SYNOPSIS
 | 
			
		||||
@@ -83,7 +83,7 @@ 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. [Global],
 | 
			
		||||
[Limits], [Options], and [SSL] sections can occure multiple times, too, but
 | 
			
		||||
[Limits], [Options], and [SSL] sections can occur multiple times, too, but
 | 
			
		||||
each variable overwrites itself, only the last assignment is relevant.
 | 
			
		||||
.SH [GLOBAL]
 | 
			
		||||
The
 | 
			
		||||
@@ -252,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
 | 
			
		||||
@@ -291,16 +291,17 @@ 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)
 | 
			
		||||
@@ -338,6 +339,14 @@ able to distinguish between Ident'ified and PAM-authenticated users: both
 | 
			
		||||
don't have a "~" character prepended to their respective user names!
 | 
			
		||||
Default: no.
 | 
			
		||||
.TP
 | 
			
		||||
\fBPAMServiceName\fR (string)
 | 
			
		||||
When PAM is enabled, this value determines the used PAM configuration.
 | 
			
		||||
This setting allows to run multiple ngIRCd instances with different
 | 
			
		||||
PAM configurations on each instance. If you set it to "ngircd-foo",
 | 
			
		||||
PAM will use /etc/pam.d/ngircd-foo instead of the default
 | 
			
		||||
/etc/pam.d/ngircd.
 | 
			
		||||
Default: ngircd.
 | 
			
		||||
.TP
 | 
			
		||||
\fBRequireAuthPing\fR (boolean)
 | 
			
		||||
Let ngIRCd send an "authentication PING" when a new client connects, and
 | 
			
		||||
register this client only after receiving the corresponding "PONG" reply.
 | 
			
		||||
@@ -375,7 +384,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
 | 
			
		||||
							
								
								
									
										5
									
								
								src/ngircd/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								src/ngircd/.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,5 +0,0 @@
 | 
			
		||||
Makefile.am
 | 
			
		||||
check-help
 | 
			
		||||
check-version
 | 
			
		||||
ngircd
 | 
			
		||||
ngircd.exe
 | 
			
		||||
@@ -352,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);
 | 
			
		||||
@@ -1039,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 );
 | 
			
		||||
@@ -1093,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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -1132,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));
 | 
			
		||||
 
 | 
			
		||||
@@ -105,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
 | 
			
		||||
 
 | 
			
		||||
@@ -72,7 +72,7 @@ GLOBAL void
 | 
			
		||||
Client_Init( void )
 | 
			
		||||
{
 | 
			
		||||
	struct hostent *h;
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	This_Server = New_Client_Struct( );
 | 
			
		||||
	if( ! This_Server )
 | 
			
		||||
	{
 | 
			
		||||
@@ -98,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 */
 | 
			
		||||
 | 
			
		||||
@@ -111,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) {
 | 
			
		||||
@@ -228,7 +228,7 @@ GLOBAL void
 | 
			
		||||
Client_Destroy( CLIENT *Client, const char *LogMsg, const char *FwdMsg, bool SendQuit )
 | 
			
		||||
{
 | 
			
		||||
	/* remove a client */
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	CLIENT *last, *c;
 | 
			
		||||
	char msg[COMMAND_LEN];
 | 
			
		||||
	const char *txt;
 | 
			
		||||
@@ -381,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) {
 | 
			
		||||
@@ -698,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 */
 | 
			
		||||
 
 | 
			
		||||
@@ -88,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
 | 
			
		||||
@@ -364,7 +364,7 @@ Conf_Test( void )
 | 
			
		||||
		       ? (const char*) array_start(&Conf_Motd) : "");
 | 
			
		||||
	}
 | 
			
		||||
	printf("  Network = %s\n", Conf_Network);
 | 
			
		||||
	if (!Conf_PAM) 
 | 
			
		||||
	if (!Conf_PAM)
 | 
			
		||||
		printf("  Password = %s\n", Conf_ServerPwd);
 | 
			
		||||
	printf("  PidFile = %s\n", Conf_PidFile);
 | 
			
		||||
	printf("  Ports = ");
 | 
			
		||||
@@ -412,13 +412,14 @@ 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));
 | 
			
		||||
#ifdef PAM
 | 
			
		||||
	printf("  PAM = %s\n", yesno_to_str(Conf_PAM));
 | 
			
		||||
	printf("  PAMIsOptional = %s\n", yesno_to_str(Conf_PAMIsOptional));
 | 
			
		||||
	printf("  PAMServiceName = %s\n", Conf_PAMServiceName);
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef STRICT_RFC
 | 
			
		||||
	printf("  RequireAuthPing = %s\n", yesno_to_str(Conf_AuthPing));
 | 
			
		||||
@@ -618,6 +619,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;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -796,7 +798,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;
 | 
			
		||||
@@ -806,6 +808,7 @@ Set_Defaults(bool InitServers)
 | 
			
		||||
	Conf_PAM = false;
 | 
			
		||||
#endif
 | 
			
		||||
	Conf_PAMIsOptional = false;
 | 
			
		||||
	strcpy(Conf_PAMServiceName, "ngircd");
 | 
			
		||||
	Conf_ScrubCTCP = false;
 | 
			
		||||
#ifdef SYSLOG
 | 
			
		||||
#ifdef LOG_LOCAL5
 | 
			
		||||
@@ -1796,7 +1799,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) {
 | 
			
		||||
@@ -1820,6 +1835,12 @@ Handle_OPTIONS(const char *File, int Line, char *Var, char *Arg)
 | 
			
		||||
		Conf_PAMIsOptional = Check_ArgIsTrue(Arg);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if (strcasecmp(Var, "PAMServiceName") == 0) {
 | 
			
		||||
		len = strlcpy(Conf_PAMServiceName, Arg, sizeof(Conf_PAMServiceName));
 | 
			
		||||
		if (len >= sizeof(Conf_PAMServiceName))
 | 
			
		||||
			Config_Error_TooLong(File, Line, Var);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	if (strcasecmp(Var, "PredefChannelsOnly") == 0) {
 | 
			
		||||
		/*
 | 
			
		||||
		 * TODO: This section and support for "PredefChannelsOnly"
 | 
			
		||||
 
 | 
			
		||||
@@ -194,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;
 | 
			
		||||
@@ -203,6 +203,9 @@ GLOBAL bool Conf_PAM;
 | 
			
		||||
/** Don't require all clients to send a password an to be PAM authenticated */
 | 
			
		||||
GLOBAL bool Conf_PAMIsOptional;
 | 
			
		||||
 | 
			
		||||
/** The service name to use for PAM */
 | 
			
		||||
GLOBAL char Conf_PAMServiceName[MAX_PAM_SERVICE_NAME_LEN];
 | 
			
		||||
 | 
			
		||||
/** Disable all CTCP commands except for /me ? */
 | 
			
		||||
GLOBAL bool Conf_ScrubCTCP;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -138,7 +138,7 @@ GLOBAL CONN_ID
 | 
			
		||||
Conn_First( void )
 | 
			
		||||
{
 | 
			
		||||
	CONN_ID i;
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	for( i = 0; i < Pool_Size; i++ )
 | 
			
		||||
	{
 | 
			
		||||
		if( My_Connections[i].sock != NONE ) return i;
 | 
			
		||||
@@ -152,7 +152,7 @@ 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;
 | 
			
		||||
 
 | 
			
		||||
@@ -283,10 +283,12 @@ ConnSSL_InitLibrary( void )
 | 
			
		||||
#ifdef HAVE_LIBSSL
 | 
			
		||||
	SSL_CTX *newctx;
 | 
			
		||||
 | 
			
		||||
#if OPENSSL_API_COMPAT < 0x10100000L
 | 
			
		||||
	if (!ssl_ctx) {
 | 
			
		||||
		SSL_library_init();
 | 
			
		||||
		SSL_load_error_strings();
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	if (!RAND_status()) {
 | 
			
		||||
		Log(LOG_ERR, "OpenSSL PRNG not seeded: /dev/urandom missing?");
 | 
			
		||||
@@ -317,6 +319,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,
 | 
			
		||||
@@ -744,7 +747,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);
 | 
			
		||||
@@ -911,5 +914,3 @@ ConnSSL_InitLibrary(void)
 | 
			
		||||
 | 
			
		||||
#endif /* SSL_SUPPORT */
 | 
			
		||||
/* -eof- */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -175,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;
 | 
			
		||||
@@ -198,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 );
 | 
			
		||||
 
 | 
			
		||||
@@ -328,7 +328,7 @@ Conn_Init( void )
 | 
			
		||||
		array_bytes(&My_ConnArray));
 | 
			
		||||
 | 
			
		||||
	assert(array_length(&My_ConnArray, sizeof(CONNECTION)) >= (size_t)Pool_Size);
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	array_free( &My_Listeners );
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < Pool_Size; i++)
 | 
			
		||||
@@ -796,7 +796,7 @@ Conn_Handler(void)
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Conn_WriteStr(CONN_ID Idx, const char *Format, ...)
 | 
			
		||||
#else
 | 
			
		||||
GLOBAL bool 
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
Conn_WriteStr(Idx, Format, va_alist)
 | 
			
		||||
CONN_ID Idx;
 | 
			
		||||
const char *Format;
 | 
			
		||||
@@ -829,7 +829,7 @@ va_dcl
 | 
			
		||||
		 * IRC_WriteXXX() functions when the prefix of this server had
 | 
			
		||||
		 * to be added to an already "quite long" command line which
 | 
			
		||||
		 * has been received from a regular IRC client, for example.
 | 
			
		||||
		 * 
 | 
			
		||||
		 *
 | 
			
		||||
		 * We are not allowed to send such "oversized" messages to
 | 
			
		||||
		 * other servers and clients, see RFC 2812 2.3 and 2813 3.3
 | 
			
		||||
		 * ("these messages SHALL NOT exceed 512 characters in length,
 | 
			
		||||
@@ -1487,16 +1487,16 @@ Conn_StartLogin(CONN_ID Idx)
 | 
			
		||||
		ident_sock = My_Connections[Idx].sock;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	if (Conf_NoticeAuth) {
 | 
			
		||||
		/* Send "NOTICE AUTH" messages to the client */
 | 
			
		||||
	if (Conf_NoticeBeforeRegistration) {
 | 
			
		||||
		/* Send "NOTICE *" messages to the client */
 | 
			
		||||
#ifdef IDENTAUTH
 | 
			
		||||
		if (Conf_Ident)
 | 
			
		||||
			(void)Conn_WriteStr(Idx,
 | 
			
		||||
				"NOTICE AUTH :*** Looking up your hostname and checking ident");
 | 
			
		||||
				"NOTICE * :*** Looking up your hostname and checking ident");
 | 
			
		||||
		else
 | 
			
		||||
#endif
 | 
			
		||||
			(void)Conn_WriteStr(Idx,
 | 
			
		||||
				"NOTICE AUTH :*** Looking up your hostname");
 | 
			
		||||
				"NOTICE * :*** Looking up your hostname");
 | 
			
		||||
		/* Send buffered data to the client, but break on errors
 | 
			
		||||
		 * because Handle_Write() would have closed the connection
 | 
			
		||||
		 * again in this case! */
 | 
			
		||||
@@ -1583,7 +1583,7 @@ Read_Request( CONN_ID Idx )
 | 
			
		||||
	if (len == 0) {
 | 
			
		||||
		LogDebug("Client \"%s:%u\" is closing connection %d ...",
 | 
			
		||||
			 My_Connections[Idx].host,
 | 
			
		||||
			 ng_ipaddr_tostr(&My_Connections[Idx].addr), Idx);
 | 
			
		||||
			 ng_ipaddr_getport(&My_Connections[Idx].addr), Idx);
 | 
			
		||||
		Conn_Close(Idx, NULL, "Client closed connection", false);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
@@ -2265,9 +2265,9 @@ cb_Read_Resolver_Result( int r_fd, UNUSED short events )
 | 
			
		||||
		strlcpy(My_Connections[i].host, readbuf,
 | 
			
		||||
			sizeof(My_Connections[i].host));
 | 
			
		||||
		Client_SetHostname(c, readbuf);
 | 
			
		||||
		if (Conf_NoticeAuth)
 | 
			
		||||
		if (Conf_NoticeBeforeRegistration)
 | 
			
		||||
			(void)Conn_WriteStr(i,
 | 
			
		||||
					"NOTICE AUTH :*** Found your hostname: %s",
 | 
			
		||||
					"NOTICE * :*** Found your hostname: %s",
 | 
			
		||||
					My_Connections[i].host);
 | 
			
		||||
#ifdef IDENTAUTH
 | 
			
		||||
		++identptr;
 | 
			
		||||
@@ -2291,22 +2291,22 @@ cb_Read_Resolver_Result( int r_fd, UNUSED short events )
 | 
			
		||||
				    i, identptr);
 | 
			
		||||
				Client_SetUser(c, identptr, true);
 | 
			
		||||
			}
 | 
			
		||||
			if (Conf_NoticeAuth) {
 | 
			
		||||
			if (Conf_NoticeBeforeRegistration) {
 | 
			
		||||
				(void)Conn_WriteStr(i,
 | 
			
		||||
					"NOTICE AUTH :*** Got %sident response%s%s",
 | 
			
		||||
					"NOTICE * :*** Got %sident response%s%s",
 | 
			
		||||
					*ptr ? "invalid " : "",
 | 
			
		||||
					*ptr ? "" : ": ",
 | 
			
		||||
					*ptr ? "" : identptr);
 | 
			
		||||
			}
 | 
			
		||||
		} else if(Conf_Ident) {
 | 
			
		||||
			Log(LOG_INFO, "IDENT lookup for connection %d: no result.", i);
 | 
			
		||||
			if (Conf_NoticeAuth)
 | 
			
		||||
			if (Conf_NoticeBeforeRegistration)
 | 
			
		||||
				(void)Conn_WriteStr(i,
 | 
			
		||||
					"NOTICE AUTH :*** No ident response");
 | 
			
		||||
					"NOTICE * :*** No ident response");
 | 
			
		||||
		}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
		if (Conf_NoticeAuth) {
 | 
			
		||||
		if (Conf_NoticeBeforeRegistration) {
 | 
			
		||||
			/* Send buffered data to the client, but break on
 | 
			
		||||
			 * errors because Handle_Write() would have closed
 | 
			
		||||
			 * the connection again in this case! */
 | 
			
		||||
@@ -2364,7 +2364,7 @@ Simple_Message(int Sock, const char *Msg)
 | 
			
		||||
 * @returns	Pointer to CLIENT structure.
 | 
			
		||||
 */
 | 
			
		||||
GLOBAL CLIENT *
 | 
			
		||||
Conn_GetClient( CONN_ID Idx ) 
 | 
			
		||||
Conn_GetClient( CONN_ID Idx )
 | 
			
		||||
{
 | 
			
		||||
	CONNECTION *c;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -61,6 +61,9 @@
 | 
			
		||||
/** Size of default connection pool. */
 | 
			
		||||
#define CONNECTION_POOL 100
 | 
			
		||||
 | 
			
		||||
/** Size of buffer for PAM service name. */
 | 
			
		||||
#define MAX_PAM_SERVICE_NAME_LEN 64
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Hard-coded (default) options */
 | 
			
		||||
 | 
			
		||||
@@ -177,7 +180,7 @@
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/** Supported user modes. */
 | 
			
		||||
#define USERMODES "abBcCFioqrRswx"
 | 
			
		||||
#define USERMODES "abBcCFiIoqrRswx"
 | 
			
		||||
 | 
			
		||||
/** Supported channel modes. */
 | 
			
		||||
#define CHANMODES "abehiIklmMnoOPqQrRstvVz"
 | 
			
		||||
@@ -206,6 +209,9 @@
 | 
			
		||||
/** Max. number of channel modes with arguments per MODE command. */
 | 
			
		||||
#define MAX_HNDL_MODES_ARG 5
 | 
			
		||||
 | 
			
		||||
/** Max. number of targets per PRIVMSG/NOTICE/... command. */
 | 
			
		||||
#define MAX_HNDL_TARGETS 25
 | 
			
		||||
 | 
			
		||||
/** Max. number of WHO replies. */
 | 
			
		||||
#define MAX_RPL_WHO 25
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2014 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
 | 
			
		||||
@@ -448,7 +448,7 @@ IRC_PART(CLIENT * Client, REQUEST * Req)
 | 
			
		||||
 | 
			
		||||
	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, ",");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -597,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)
 | 
			
		||||
@@ -608,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,
 | 
			
		||||
 
 | 
			
		||||
@@ -162,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));
 | 
			
		||||
 | 
			
		||||
@@ -313,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 &&
 | 
			
		||||
@@ -405,7 +407,7 @@ IRC_WHOIS_SendReply(CLIENT *Client, CLIENT *from, CLIENT *c)
 | 
			
		||||
 | 
			
		||||
	/* 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),
 | 
			
		||||
@@ -556,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;
 | 
			
		||||
@@ -884,16 +894,16 @@ IRC_STATS( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
			list = Class_GetList(CLASS_GLINE);
 | 
			
		||||
		else
 | 
			
		||||
			list = Class_GetList(CLASS_KLINE);
 | 
			
		||||
			list_item = Lists_GetFirst(list);
 | 
			
		||||
			while (list_item) {
 | 
			
		||||
				if (!IRC_WriteStrClient(from, RPL_STATSXLINE_MSG,
 | 
			
		||||
		list_item = Lists_GetFirst(list);
 | 
			
		||||
		while (list_item) {
 | 
			
		||||
			if (!IRC_WriteStrClient(from, RPL_STATSXLINE_MSG,
 | 
			
		||||
						Client_ID(from), query,
 | 
			
		||||
						Lists_GetMask(list_item),
 | 
			
		||||
						Lists_GetValidity(list_item),
 | 
			
		||||
						Lists_GetReason(list_item)))
 | 
			
		||||
					return DISCONNECTED;
 | 
			
		||||
				list_item = Lists_GetNext(list_item);
 | 
			
		||||
			}
 | 
			
		||||
				return DISCONNECTED;
 | 
			
		||||
			list_item = Lists_GetNext(list_item);
 | 
			
		||||
		}
 | 
			
		||||
		break;
 | 
			
		||||
	case 'L':	/* Link status (servers and user links) */
 | 
			
		||||
		if (!Op_Check(from, Req))
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2014 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
 | 
			
		||||
@@ -172,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;
 | 
			
		||||
 | 
			
		||||
@@ -195,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,
 | 
			
		||||
@@ -243,7 +245,7 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
#else
 | 
			
		||||
				Conn_SetAuthPing(Client_Conn(Client), rand());
 | 
			
		||||
#endif
 | 
			
		||||
				IRC_WriteStrClient(Client, "PING :%ld",
 | 
			
		||||
				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);
 | 
			
		||||
@@ -362,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)
 | 
			
		||||
@@ -464,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)
 | 
			
		||||
@@ -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
 | 
			
		||||
@@ -847,13 +873,14 @@ IRC_PONG(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
	if (Client_Type(Client) == CLIENT_SERVER && Conn_LastPing(conn) == 0) {
 | 
			
		||||
		Log(LOG_INFO,
 | 
			
		||||
		    "Synchronization with \"%s\" done (connection %d): %ld second%s [%ld users, %ld channels].",
 | 
			
		||||
		    Client_ID(Client), conn, time(NULL) - Conn_GetSignon(conn),
 | 
			
		||||
		    Client_ID(Client), conn,
 | 
			
		||||
		    (long)(time(NULL) - Conn_GetSignon(conn)),
 | 
			
		||||
		    time(NULL) - Conn_GetSignon(conn) == 1 ? "" : "s",
 | 
			
		||||
		    Client_UserCount(), Channel_CountVisible(NULL));
 | 
			
		||||
		Conn_UpdatePing(conn);
 | 
			
		||||
	} else
 | 
			
		||||
		LogDebug("Connection %d: received PONG. Lag: %ld seconds.",
 | 
			
		||||
			 conn, time(NULL) - Conn_LastPing(conn));
 | 
			
		||||
			 conn, (long)(time(NULL) - Conn_LastPing(conn)));
 | 
			
		||||
 | 
			
		||||
	return CONNECTED;
 | 
			
		||||
} /* IRC_PONG */
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
@@ -65,6 +65,18 @@ if (Req->argc < Min || Req->argc > Max) { \
 | 
			
		||||
				  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); \
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Get sender of an IRC command.
 | 
			
		||||
 *
 | 
			
		||||
@@ -73,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_WriteErrClient(Client, ERR_NOSUCHNICK_MSG, \
 | 
			
		||||
					  Client_ID(Client), Req->prefix);
 | 
			
		||||
					  Client_ID(Client), \
 | 
			
		||||
					  Req->prefix ? Req->prefix : "(none)");
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Get target of an IRC command and make sure that it is a server.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2014 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
 | 
			
		||||
@@ -24,6 +24,7 @@
 | 
			
		||||
 | 
			
		||||
#include "conn-func.h"
 | 
			
		||||
#include "channel.h"
 | 
			
		||||
#include "irc-macros.h"
 | 
			
		||||
#include "irc-write.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "messages.h"
 | 
			
		||||
@@ -47,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,
 | 
			
		||||
 
 | 
			
		||||
@@ -206,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;
 | 
			
		||||
@@ -378,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)))
 | 
			
		||||
@@ -572,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 ||
 | 
			
		||||
@@ -1009,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;
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -150,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? */
 | 
			
		||||
@@ -192,7 +200,7 @@ IRC_INVITE(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
		if (remember) {
 | 
			
		||||
			/* We must remember this invite */
 | 
			
		||||
			if (!Channel_AddInvite(chan, Client_MaskCloaked(target),
 | 
			
		||||
						true))
 | 
			
		||||
						true, Client_ID(from)))
 | 
			
		||||
				return CONNECTED;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2014 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
 | 
			
		||||
@@ -30,6 +30,7 @@
 | 
			
		||||
#include "class.h"
 | 
			
		||||
#include "parse.h"
 | 
			
		||||
#include "irc.h"
 | 
			
		||||
#include "irc-macros.h"
 | 
			
		||||
#include "irc-write.h"
 | 
			
		||||
#include "lists.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
@@ -46,7 +47,7 @@
 | 
			
		||||
static bool
 | 
			
		||||
Bad_OperPass(CLIENT *Client, char *errtoken, char *errmsg)
 | 
			
		||||
{
 | 
			
		||||
	Log(LOG_WARNING, "Got invalid OPER from \"%s\": \"%s\" -- %s!",
 | 
			
		||||
	Log(LOG_ERR|LOG_snotice, "Got invalid OPER from \"%s\": \"%s\" -- %s!",
 | 
			
		||||
	    Client_Mask(Client), errtoken, errmsg);
 | 
			
		||||
	/* Increase penalty to slow down possible brute force attacks */
 | 
			
		||||
	IRC_SetPenalty(Client, 10);
 | 
			
		||||
@@ -358,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:
 | 
			
		||||
@@ -396,7 +398,16 @@ IRC_xLINE(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
		return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG,
 | 
			
		||||
					  Client_ID(Client), Req->command);
 | 
			
		||||
 | 
			
		||||
	from = Op_Check(Client, Req);
 | 
			
		||||
	if (!Conf_AllowRemoteOper && Client_Type(Client) == CLIENT_SERVER) {
 | 
			
		||||
		/* Explicitely forbid remote servers to modify "x-lines" when
 | 
			
		||||
		 * the "AllowRemoteOper" configuration option isn't set, even
 | 
			
		||||
		 * when the command seems to originate from the remote server
 | 
			
		||||
		 * itself: this prevents GLINE's to become set during server
 | 
			
		||||
		 * handshake in this case (what wouldn't be possible during
 | 
			
		||||
		 * regular runtime when a remote IRC Op sends the command). */
 | 
			
		||||
		from = NULL;
 | 
			
		||||
	} else
 | 
			
		||||
		from = Op_Check(Client, Req);
 | 
			
		||||
	if (!from)
 | 
			
		||||
		return Op_NoPrivileges(Client, Req);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -31,6 +31,7 @@
 | 
			
		||||
#include "parse.h"
 | 
			
		||||
#include "numeric.h"
 | 
			
		||||
#include "ngircd.h"
 | 
			
		||||
#include "irc.h"
 | 
			
		||||
#include "irc-info.h"
 | 
			
		||||
#include "irc-write.h"
 | 
			
		||||
#include "op.h"
 | 
			
		||||
@@ -245,66 +246,96 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	CHANNEL *chan;
 | 
			
		||||
	CLIENT *c;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
	assert(Client != NULL);
 | 
			
		||||
	assert(Req != NULL);
 | 
			
		||||
 | 
			
		||||
	strlcpy( nick_in, Req->argv[1], sizeof( nick_in ));
 | 
			
		||||
	strcpy( nick_out, "" );
 | 
			
		||||
	strlcpy(nick_in, Req->argv[1], sizeof(nick_in));
 | 
			
		||||
	strcpy(nick_out, "");
 | 
			
		||||
 | 
			
		||||
	channame = Req->argv[0];
 | 
			
		||||
	ptr = strtok( nick_in, "," );
 | 
			
		||||
	while( ptr )
 | 
			
		||||
	{
 | 
			
		||||
 | 
			
		||||
	ptr = strtok(nick_in, ",");
 | 
			
		||||
	while (ptr) {
 | 
			
		||||
		is_owner = is_chanadmin = is_op = is_halfop = is_voiced = false;
 | 
			
		||||
 | 
			
		||||
		/* cut off prefixes */
 | 
			
		||||
		while(( *ptr == '~') || ( *ptr == '&' ) || ( *ptr == '@' ) ||
 | 
			
		||||
			( *ptr == '%') || ( *ptr == '+' ))
 | 
			
		||||
		{
 | 
			
		||||
			if( *ptr == '~' ) is_owner = true;
 | 
			
		||||
			if( *ptr == '&' ) is_chanadmin = true;
 | 
			
		||||
			if( *ptr == '@' ) is_op = true;
 | 
			
		||||
			if( *ptr == 'h' ) is_halfop = true;
 | 
			
		||||
			if( *ptr == '+' ) is_voiced = true;
 | 
			
		||||
		while ((*ptr == '~') || (*ptr == '&') || (*ptr == '@') ||
 | 
			
		||||
		       (*ptr == '%') || (*ptr == '+')) {
 | 
			
		||||
			if (*ptr == '~')
 | 
			
		||||
				is_owner = true;
 | 
			
		||||
			if (*ptr == '&')
 | 
			
		||||
				is_chanadmin = true;
 | 
			
		||||
			if (*ptr == '@')
 | 
			
		||||
				is_op = true;
 | 
			
		||||
			if (*ptr == '%')
 | 
			
		||||
				is_halfop = true;
 | 
			
		||||
			if (*ptr == '+')
 | 
			
		||||
				is_voiced = true;
 | 
			
		||||
			ptr++;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		c = Client_Search( ptr );
 | 
			
		||||
		if( c )
 | 
			
		||||
		{
 | 
			
		||||
			Channel_Join( c, channame );
 | 
			
		||||
			chan = Channel_Search( channame );
 | 
			
		||||
			assert( chan != NULL );
 | 
			
		||||
 | 
			
		||||
			if( is_owner ) Channel_UserModeAdd( chan, c, 'q' );
 | 
			
		||||
			if( is_chanadmin ) Channel_UserModeAdd( chan, c, 'a' );
 | 
			
		||||
			if( is_op ) Channel_UserModeAdd( chan, c, 'o' );
 | 
			
		||||
			if( is_halfop ) Channel_UserModeAdd( chan, c, 'h' );
 | 
			
		||||
			if( is_voiced ) Channel_UserModeAdd( chan, c, 'v' );
 | 
			
		||||
 | 
			
		||||
			/* announce to channel... */
 | 
			
		||||
			IRC_WriteStrChannelPrefix( Client, chan, c, false, "JOIN :%s", channame );
 | 
			
		||||
 | 
			
		||||
			/* set Channel-User-Modes */
 | 
			
		||||
			strlcpy( modes, Channel_UserModes( chan, c ), sizeof( modes ));
 | 
			
		||||
			if( modes[0] )
 | 
			
		||||
			{
 | 
			
		||||
				/* send modes to channel */
 | 
			
		||||
				IRC_WriteStrChannelPrefix( Client, chan, Client, false, "MODE %s +%s %s", channame, modes, Client_ID( c ));
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if( nick_out[0] != '\0' ) strlcat( nick_out, ",", sizeof( nick_out ));
 | 
			
		||||
			if( is_owner ) strlcat( nick_out, "~", sizeof( nick_out ));
 | 
			
		||||
			if( is_chanadmin ) strlcat( nick_out, "&", sizeof( nick_out ));
 | 
			
		||||
			if( is_op ) strlcat( nick_out, "@", sizeof( nick_out ));
 | 
			
		||||
			if( is_halfop ) strlcat( nick_out, "%", sizeof( nick_out ));
 | 
			
		||||
			if( is_voiced ) strlcat( nick_out, "+", sizeof( nick_out ));
 | 
			
		||||
			strlcat( nick_out, ptr, sizeof( nick_out ));
 | 
			
		||||
		c = Client_Search(ptr);
 | 
			
		||||
		if (!c) {
 | 
			
		||||
			/* Client not found? */
 | 
			
		||||
			Log(LOG_ERR,
 | 
			
		||||
			    "Got NJOIN for unknown nick \"%s\" for channel \"%s\"!",
 | 
			
		||||
			    ptr, channame);
 | 
			
		||||
			goto skip_njoin;
 | 
			
		||||
		}
 | 
			
		||||
		else Log( LOG_ERR, "Got NJOIN for unknown nick \"%s\" for channel \"%s\"!", ptr, channame );
 | 
			
		||||
 | 
			
		||||
		/* search for next Nick */
 | 
			
		||||
		ptr = strtok( NULL, "," );
 | 
			
		||||
		if (!Channel_Join(c, channame)) {
 | 
			
		||||
			/* Failed to join channel. Ooops!? */
 | 
			
		||||
			Log(LOG_ALERT,
 | 
			
		||||
			    "Failed to join client \"%s\" to channel \"%s\" (NJOIN): killing it!",
 | 
			
		||||
			    ptr, channame);
 | 
			
		||||
			IRC_KillClient(NULL, NULL, ptr, "Internal NJOIN error!");
 | 
			
		||||
			Log(LOG_DEBUG, "... done.");
 | 
			
		||||
			goto skip_njoin;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		chan = Channel_Search(channame);
 | 
			
		||||
		assert(chan != NULL);
 | 
			
		||||
 | 
			
		||||
		if (is_owner)
 | 
			
		||||
			Channel_UserModeAdd(chan, c, 'q');
 | 
			
		||||
		if (is_chanadmin)
 | 
			
		||||
			Channel_UserModeAdd(chan, c, 'a');
 | 
			
		||||
		if (is_op)
 | 
			
		||||
			Channel_UserModeAdd(chan, c, 'o');
 | 
			
		||||
		if (is_halfop)
 | 
			
		||||
			Channel_UserModeAdd(chan, c, 'h');
 | 
			
		||||
		if (is_voiced)
 | 
			
		||||
			Channel_UserModeAdd(chan, c, 'v');
 | 
			
		||||
 | 
			
		||||
		/* Announce client to the channel */
 | 
			
		||||
		IRC_WriteStrChannelPrefix(Client, chan, c, false,
 | 
			
		||||
					  "JOIN :%s", channame);
 | 
			
		||||
 | 
			
		||||
		/* Announce "channel user modes" to the channel, if any */
 | 
			
		||||
		strlcpy(modes, Channel_UserModes(chan, c), sizeof(modes));
 | 
			
		||||
		if (modes[0])
 | 
			
		||||
			IRC_WriteStrChannelPrefix(Client, chan, Client, false,
 | 
			
		||||
						  "MODE %s +%s %s", channame,
 | 
			
		||||
						  modes, Client_ID(c));
 | 
			
		||||
 | 
			
		||||
		/* Build nick list for forwarding command */
 | 
			
		||||
		if (nick_out[0] != '\0')
 | 
			
		||||
			strlcat(nick_out, ",", sizeof(nick_out));
 | 
			
		||||
		if (is_owner)
 | 
			
		||||
			strlcat(nick_out, "~", sizeof(nick_out));
 | 
			
		||||
		if (is_chanadmin)
 | 
			
		||||
			strlcat(nick_out, "&", sizeof(nick_out));
 | 
			
		||||
		if (is_op)
 | 
			
		||||
			strlcat(nick_out, "@", sizeof(nick_out));
 | 
			
		||||
		if (is_halfop)
 | 
			
		||||
			strlcat(nick_out, "%", sizeof(nick_out));
 | 
			
		||||
		if (is_voiced)
 | 
			
		||||
			strlcat(nick_out, "+", sizeof(nick_out));
 | 
			
		||||
		strlcat(nick_out, ptr, sizeof(nick_out));
 | 
			
		||||
 | 
			
		||||
	      skip_njoin:
 | 
			
		||||
		/* Get next nick, if any ... */
 | 
			
		||||
		ptr = strtok(NULL, ",");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* forward to other servers */
 | 
			
		||||
 
 | 
			
		||||
@@ -521,12 +521,12 @@ va_dcl
 | 
			
		||||
			if (Client_HasMode(to, 'w'))
 | 
			
		||||
				IRC_WriteStrClientPrefix(to, From,
 | 
			
		||||
							 "WALLOPS :%s", msg);
 | 
			
		||||
				break;
 | 
			
		||||
			break;
 | 
			
		||||
		case CLIENT_SERVER:
 | 
			
		||||
			if (to != Client)
 | 
			
		||||
				IRC_WriteStrClientPrefix(to, From,
 | 
			
		||||
							 "WALLOPS :%s", msg);
 | 
			
		||||
				break;
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
} /* IRC_SendWallops */
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										102
									
								
								src/ngircd/irc.c
									
									
									
									
									
								
							
							
						
						
									
										102
									
								
								src/ngircd/irc.c
									
									
									
									
									
								
							@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2014 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
 | 
			
		||||
@@ -85,6 +85,8 @@ IRC_CheckListTooBig(CLIENT *From, const int Count, const int Limit,
 | 
			
		||||
GLOBAL bool
 | 
			
		||||
IRC_ERROR(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
{
 | 
			
		||||
	char *msg;
 | 
			
		||||
 | 
			
		||||
	assert( Client != NULL );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
 | 
			
		||||
@@ -99,12 +101,20 @@ IRC_ERROR(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
		return CONNECTED;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (Req->argc < 1)
 | 
			
		||||
	if (Req->argc < 1) {
 | 
			
		||||
		msg = "Got ERROR command";
 | 
			
		||||
		Log(LOG_NOTICE, "Got ERROR from \"%s\"!",
 | 
			
		||||
		    Client_Mask(Client));
 | 
			
		||||
	else
 | 
			
		||||
	} else {
 | 
			
		||||
		msg = Req->argv[0];
 | 
			
		||||
		Log(LOG_NOTICE, "Got ERROR from \"%s\": \"%s\"!",
 | 
			
		||||
		    Client_Mask(Client), Req->argv[0]);
 | 
			
		||||
		    Client_Mask(Client), msg);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (Client_Conn(Client) != NONE) {
 | 
			
		||||
		Client_Destroy(Client, NULL, msg, false);
 | 
			
		||||
		return DISCONNECTED;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return CONNECTED;
 | 
			
		||||
} /* IRC_ERROR */
 | 
			
		||||
@@ -240,7 +250,7 @@ IRC_TRACE(CLIENT *Client, REQUEST *Req)
 | 
			
		||||
					PACKAGE_VERSION, Client_ID(target),
 | 
			
		||||
					Client_ID(Client_NextHop(target)),
 | 
			
		||||
					Option_String(idx2),
 | 
			
		||||
					time(NULL) - Conn_StartTime(idx2),
 | 
			
		||||
					(long)(time(NULL) - Conn_StartTime(idx2)),
 | 
			
		||||
					Conn_SendQ(idx), Conn_SendQ(idx2)))
 | 
			
		||||
			return DISCONNECTED;
 | 
			
		||||
 | 
			
		||||
@@ -339,9 +349,12 @@ GLOBAL bool
 | 
			
		||||
IRC_KillClient(CLIENT *Client, CLIENT *From, const char *Nick, const char *Reason)
 | 
			
		||||
{
 | 
			
		||||
	const char *msg;
 | 
			
		||||
	CONN_ID my_conn, conn;
 | 
			
		||||
	CONN_ID my_conn = NONE, conn;
 | 
			
		||||
	CLIENT *c;
 | 
			
		||||
 | 
			
		||||
	assert(Nick != NULL);
 | 
			
		||||
	assert(Reason != NULL);
 | 
			
		||||
 | 
			
		||||
	/* Do we know such a client in the network? */
 | 
			
		||||
	c = Client_Search(Nick);
 | 
			
		||||
	if (!c) {
 | 
			
		||||
@@ -376,7 +389,8 @@ IRC_KillClient(CLIENT *Client, CLIENT *From, const char *Nick, const char *Reaso
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Save ID of this connection */
 | 
			
		||||
	my_conn = Client_Conn(Client);
 | 
			
		||||
	if (Client)
 | 
			
		||||
		my_conn = Client_Conn(Client);
 | 
			
		||||
 | 
			
		||||
	/* Kill the client NOW:
 | 
			
		||||
	 *  - Close the local connection (if there is one),
 | 
			
		||||
@@ -489,11 +503,22 @@ Option_String(UNUSED CONN_ID Idx)
 | 
			
		||||
	if(options & CONN_ZIP)		/* zlib compression enabled */
 | 
			
		||||
		strlcat(option_txt, "z", sizeof(option_txt));
 | 
			
		||||
#endif
 | 
			
		||||
	LogDebug(" *** %d: %d = %s", Idx, options, option_txt);
 | 
			
		||||
 | 
			
		||||
	return option_txt;
 | 
			
		||||
} /* Option_String */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Send a message to target(s).
 | 
			
		||||
 *
 | 
			
		||||
 * This function is used by IRC_{PRIVMSG|NOTICE|SQUERY} to actualy
 | 
			
		||||
 * send the message(s).
 | 
			
		||||
 *
 | 
			
		||||
 * @param Client The client from which this command has been received.
 | 
			
		||||
 * @param Req Request structure with prefix and all parameters.
 | 
			
		||||
 * @param ForceType Required type of the destination of the message(s).
 | 
			
		||||
 * @param SendErrors Whether to report errors back to the client or not.
 | 
			
		||||
 * @return CONNECTED or DISCONNECTED.
 | 
			
		||||
 */
 | 
			
		||||
static bool
 | 
			
		||||
Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
 | 
			
		||||
{
 | 
			
		||||
@@ -501,8 +526,10 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
 | 
			
		||||
	CL2CHAN *cl2chan;
 | 
			
		||||
	CHANNEL *chan;
 | 
			
		||||
	char *currentTarget = Req->argv[0];
 | 
			
		||||
	char *lastCurrentTarget = NULL;
 | 
			
		||||
	char *strtok_last = NULL;
 | 
			
		||||
	char *message = NULL;
 | 
			
		||||
	char *targets[MAX_HNDL_TARGETS];
 | 
			
		||||
	int i, target_nr = 0;
 | 
			
		||||
 | 
			
		||||
	assert(Client != NULL);
 | 
			
		||||
	assert(Req != NULL);
 | 
			
		||||
@@ -526,7 +553,7 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
 | 
			
		||||
					  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;
 | 
			
		||||
@@ -542,10 +569,19 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
 | 
			
		||||
		message = Req->argv[1];
 | 
			
		||||
 | 
			
		||||
	/* handle msgtarget = msgto *("," msgto) */
 | 
			
		||||
	currentTarget = strtok_r(currentTarget, ",", &lastCurrentTarget);
 | 
			
		||||
	currentTarget = strtok_r(currentTarget, ",", &strtok_last);
 | 
			
		||||
	ngt_UpperStr(Req->command);
 | 
			
		||||
 | 
			
		||||
	/* Please note that "currentTarget" is NULL when the target contains
 | 
			
		||||
	 * the separator character only, e. g. "," or ",,,," etc.! */
 | 
			
		||||
	while (currentTarget) {
 | 
			
		||||
		/* Make sure that there hasn't been such a target already: */
 | 
			
		||||
		targets[target_nr++] = currentTarget;
 | 
			
		||||
		for(i = 0; i < target_nr - 1; i++) {
 | 
			
		||||
			if (strcasecmp(currentTarget, targets[i]) == 0)
 | 
			
		||||
				goto send_next_target;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Check for and handle valid <msgto> of form:
 | 
			
		||||
		 * RFC 2812 2.3.1:
 | 
			
		||||
		 *   msgto =  channel / ( user [ "%" host ] "@" servername )
 | 
			
		||||
@@ -689,14 +725,14 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
 | 
			
		||||
				return DISCONNECTED;
 | 
			
		||||
		} else if (ForceType != CLIENT_SERVICE
 | 
			
		||||
			   && (chan = Channel_Search(currentTarget))) {
 | 
			
		||||
			/* Target is a channel */
 | 
			
		||||
			if (!Channel_Write(chan, from, Client, Req->command,
 | 
			
		||||
					   SendErrors, message))
 | 
			
		||||
					return DISCONNECTED;
 | 
			
		||||
		} else if (ForceType != CLIENT_SERVICE
 | 
			
		||||
			/* $#: server/target mask, RFC 2812, sec. 3.3.1 */
 | 
			
		||||
			   && strchr("$#", currentTarget[0])
 | 
			
		||||
			   && strchr(currentTarget, '.')) {
 | 
			
		||||
			/* targetmask */
 | 
			
		||||
			/* $#: server/host mask, RFC 2812, sec. 3.3.1 */
 | 
			
		||||
			if (!Send_Message_Mask(from, Req->command, currentTarget,
 | 
			
		||||
					       message, SendErrors))
 | 
			
		||||
				return DISCONNECTED;
 | 
			
		||||
@@ -709,14 +745,35 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	send_next_target:
 | 
			
		||||
		currentTarget = strtok_r(NULL, ",", &lastCurrentTarget);
 | 
			
		||||
		if (currentTarget)
 | 
			
		||||
			Conn_SetPenalty(Client_Conn(Client), 1);
 | 
			
		||||
		currentTarget = strtok_r(NULL, ",", &strtok_last);
 | 
			
		||||
		if (!currentTarget)
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		Conn_SetPenalty(Client_Conn(Client), 1);
 | 
			
		||||
 | 
			
		||||
		if (target_nr >= MAX_HNDL_TARGETS) {
 | 
			
		||||
			/* Too many targets given! */
 | 
			
		||||
			return IRC_WriteErrClient(Client,
 | 
			
		||||
						  ERR_TOOMANYTARGETS_MSG,
 | 
			
		||||
						  currentTarget);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return CONNECTED;
 | 
			
		||||
} /* Send_Message */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Send a message to "target mask" target(s).
 | 
			
		||||
 *
 | 
			
		||||
 * See RFC 2812, sec. 3.3.1 for details.
 | 
			
		||||
 *
 | 
			
		||||
 * @param from The client from which this command has been received.
 | 
			
		||||
 * @param command The command to use (PRIVMSG, NOTICE, ...).
 | 
			
		||||
 * @param targetMask The "target mask" (will be verified by this function).
 | 
			
		||||
 * @param message The message to send.
 | 
			
		||||
 * @param SendErrors Whether to report errors back to the client or not.
 | 
			
		||||
 * @return CONNECTED or DISCONNECTED.
 | 
			
		||||
 */
 | 
			
		||||
static bool
 | 
			
		||||
Send_Message_Mask(CLIENT * from, char * command, char * targetMask,
 | 
			
		||||
		  char * message, bool SendErrors)
 | 
			
		||||
@@ -740,17 +797,15 @@ Send_Message_Mask(CLIENT * from, char * command, char * targetMask,
 | 
			
		||||
	 * dot (".") and no wildcards ("*", "?") following the last one.
 | 
			
		||||
	 */
 | 
			
		||||
	check_wildcards = strrchr(targetMask, '.');
 | 
			
		||||
	assert(check_wildcards != NULL);
 | 
			
		||||
	if (check_wildcards &&
 | 
			
		||||
		check_wildcards[strcspn(check_wildcards, "*?")])
 | 
			
		||||
	{
 | 
			
		||||
	if (!check_wildcards || check_wildcards[strcspn(check_wildcards, "*?")]) {
 | 
			
		||||
		if (!SendErrors)
 | 
			
		||||
			return true;
 | 
			
		||||
		return IRC_WriteErrClient(from, ERR_WILDTOPLEVEL, targetMask);
 | 
			
		||||
		return IRC_WriteErrClient(from, ERR_WILDTOPLEVEL_MSG,
 | 
			
		||||
					  targetMask);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* #: hostmask, see RFC 2812, sec. 3.3.1 */
 | 
			
		||||
	if (targetMask[0] == '#') {
 | 
			
		||||
		/* #: hostmask, see RFC 2812, sec. 3.3.1 */
 | 
			
		||||
		for (cl = Client_First(); cl != NULL; cl = Client_Next(cl)) {
 | 
			
		||||
			if (Client_Type(cl) != CLIENT_USER)
 | 
			
		||||
				continue;
 | 
			
		||||
@@ -761,7 +816,8 @@ Send_Message_Mask(CLIENT * from, char * command, char * targetMask,
 | 
			
		||||
					return false;
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		assert(targetMask[0] == '$'); /* $: server mask, see RFC 2812, sec. 3.3.1 */
 | 
			
		||||
		/* $: server mask, see RFC 2812, sec. 3.3.1 */
 | 
			
		||||
		assert(targetMask[0] == '$');
 | 
			
		||||
		for (cl = Client_First(); cl != NULL; cl = Client_Next(cl)) {
 | 
			
		||||
			if (Client_Type(cl) != CLIENT_USER)
 | 
			
		||||
				continue;
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,8 @@ 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;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -65,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)
 | 
			
		||||
@@ -74,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.
 | 
			
		||||
 *
 | 
			
		||||
@@ -111,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;
 | 
			
		||||
 | 
			
		||||
@@ -148,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;
 | 
			
		||||
 | 
			
		||||
@@ -326,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);
 | 
			
		||||
@@ -363,14 +378,14 @@ 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,
 | 
			
		||||
				Log(LOG_NOTICE|LOG_snotice,
 | 
			
		||||
				    "Deleted \"%s\" (\"%s\") from %s list (expired).",
 | 
			
		||||
				    e->mask, e->reason, ListName);
 | 
			
		||||
			else
 | 
			
		||||
				Log(LOG_INFO,
 | 
			
		||||
				Log(LOG_NOTICE|LOG_snotice,
 | 
			
		||||
				    "Deleted \"%s\" from %s list (expired).",
 | 
			
		||||
				    e->mask, ListName);
 | 
			
		||||
			Lists_Unlink(h, last, e);
 | 
			
		||||
 
 | 
			
		||||
@@ -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));
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -92,7 +92,7 @@ Login_User(CLIENT * Client)
 | 
			
		||||
		/* 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) 
 | 
			
		||||
		if (strcmp(Conn_Password(conn), Conf_ServerPwd) == 0)
 | 
			
		||||
			return Login_User_PostAuth(Client);
 | 
			
		||||
		Client_Reject(Client, "Bad server password", false);
 | 
			
		||||
		return DISCONNECTED;
 | 
			
		||||
 
 | 
			
		||||
@@ -50,8 +50,10 @@ 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 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -64,10 +66,12 @@ 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));
 | 
			
		||||
 | 
			
		||||
	return Match(ngt_LowerStr(needle), ngt_LowerStr(haystack));
 | 
			
		||||
} /* MatchCaseInsensitive */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -82,16 +86,14 @@ 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);
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
@@ -67,6 +67,7 @@
 | 
			
		||||
#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"
 | 
			
		||||
@@ -75,11 +76,11 @@
 | 
			
		||||
#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"
 | 
			
		||||
@@ -87,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"
 | 
			
		||||
@@ -109,11 +110,12 @@
 | 
			
		||||
#define ERR_CANNOTSENDTOCHAN_MSG	"404 %s %s :Cannot send to channel"
 | 
			
		||||
#define ERR_TOOMANYCHANNELS_MSG		"405 %s %s :You have joined too many channels"
 | 
			
		||||
#define ERR_WASNOSUCHNICK_MSG		"406 %s %s :There was no such nickname"
 | 
			
		||||
#define ERR_TOOMANYTARGETS_MSG		"407 %s :Too many recipients"
 | 
			
		||||
#define ERR_NOORIGIN_MSG		"409 %s :No origin specified"
 | 
			
		||||
#define ERR_INVALIDCAP_MSG		"410 %s %s :Invalid CAP subcommand"
 | 
			
		||||
#define ERR_NORECIPIENT_MSG		"411 %s :No recipient given (%s)"
 | 
			
		||||
#define ERR_NOTEXTTOSEND_MSG		"412 %s :No text to send"
 | 
			
		||||
#define ERR_WILDTOPLEVEL		"414 %s :Wildcard in toplevel domain"
 | 
			
		||||
#define ERR_WILDTOPLEVEL_MSG		"414 %s :Wildcard in toplevel domain"
 | 
			
		||||
#define ERR_UNKNOWNCOMMAND_MSG		"421 %s %s :Unknown command"
 | 
			
		||||
#define ERR_NOMOTD_MSG			"422 %s :MOTD file is missing"
 | 
			
		||||
#define ERR_NONICKNAMEGIVEN_MSG		"431 %s :No nickname given"
 | 
			
		||||
@@ -126,6 +128,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"
 | 
			
		||||
@@ -141,7 +144,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"
 | 
			
		||||
@@ -156,6 +159,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-2014 Alexander Barton (alex@barton.de) and Contributors.
 | 
			
		||||
 * Copyright (c)2001-2016 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
 | 
			
		||||
@@ -451,7 +451,7 @@ static void
 | 
			
		||||
Show_Version( void )
 | 
			
		||||
{
 | 
			
		||||
	puts( NGIRCd_Version );
 | 
			
		||||
	puts( "Copyright (c)2001-2014 Alexander Barton (<alex@barton.de>) and Contributors." );
 | 
			
		||||
	puts( "Copyright (c)2001-2016 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." );
 | 
			
		||||
@@ -530,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));
 | 
			
		||||
@@ -721,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!",
 | 
			
		||||
@@ -731,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-2014 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
 | 
			
		||||
@@ -176,6 +176,7 @@ Synchronize_Lists(CLIENT * Client)
 | 
			
		||||
	CHANNEL *c;
 | 
			
		||||
	struct list_head *head;
 | 
			
		||||
	struct list_elem *elem;
 | 
			
		||||
	time_t t;
 | 
			
		||||
 | 
			
		||||
	assert(Client != NULL);
 | 
			
		||||
 | 
			
		||||
@@ -183,9 +184,10 @@ Synchronize_Lists(CLIENT * Client)
 | 
			
		||||
	head = Class_GetList(CLASS_GLINE);
 | 
			
		||||
	elem = Lists_GetFirst(head);
 | 
			
		||||
	while (elem) {
 | 
			
		||||
		t = Lists_GetValidity(elem) - time(NULL);
 | 
			
		||||
		if (!IRC_WriteStrClient(Client, "GLINE %s %ld :%s",
 | 
			
		||||
					Lists_GetMask(elem),
 | 
			
		||||
					Lists_GetValidity(elem) - time(NULL),
 | 
			
		||||
					t > 0 ? (long)t : 0,
 | 
			
		||||
					Lists_GetReason(elem)))
 | 
			
		||||
			return DISCONNECTED;
 | 
			
		||||
		elem = Lists_GetNext(elem);
 | 
			
		||||
@@ -216,7 +218,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);
 | 
			
		||||
 
 | 
			
		||||
@@ -40,12 +40,14 @@ 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_ERR|LOG_snotice,
 | 
			
		||||
		    "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_ERR|LOG_snotice,
 | 
			
		||||
		    "No privileges: client \"%s\", command \"%s\"!",
 | 
			
		||||
		    Client_Mask(Client), Req->command);
 | 
			
		||||
		return IRC_WriteErrClient(Client, ERR_NOPRIVILEGES_MSG,
 | 
			
		||||
					  Client_ID(Client));
 | 
			
		||||
 
 | 
			
		||||
@@ -32,6 +32,7 @@
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "client.h"
 | 
			
		||||
#include "conf.h"
 | 
			
		||||
 | 
			
		||||
#include "pam.h"
 | 
			
		||||
 | 
			
		||||
@@ -101,7 +102,7 @@ PAM_Authenticate(CLIENT *Client) {
 | 
			
		||||
	conv.appdata_ptr = Conn_Password(Client_Conn(Client));
 | 
			
		||||
 | 
			
		||||
	/* Initialize PAM */
 | 
			
		||||
	retval = pam_start("ngircd", Client_OrigUser(Client), &conv, &pam);
 | 
			
		||||
	retval = pam_start(Conf_PAMServiceName, Client_OrigUser(Client), &conv, &pam);
 | 
			
		||||
	if (retval != PAM_SUCCESS) {
 | 
			
		||||
		Log(LOG_ERR, "PAM: Failed to create authenticator! (%d)", retval);
 | 
			
		||||
		return false;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ngIRCd -- The Next Generation IRC Daemon
 | 
			
		||||
 * Copyright (c)2001-2014 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
 | 
			
		||||
@@ -70,7 +70,7 @@ static COMMAND My_Commands[] =
 | 
			
		||||
	_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, 0),
 | 
			
		||||
	_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),
 | 
			
		||||
@@ -156,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 :-)
 | 
			
		||||
@@ -461,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;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -217,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;
 | 
			
		||||
}
 | 
			
		||||
@@ -334,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-2014 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
 | 
			
		||||
@@ -48,7 +48,11 @@ Dump_State(void)
 | 
			
		||||
{
 | 
			
		||||
	Log(LOG_DEBUG, "--- Internal server state: %s ---",
 | 
			
		||||
	    Client_ID(Client_ThisServer()));
 | 
			
		||||
	Log(LOG_DEBUG, "time()=%ld", time(NULL));
 | 
			
		||||
#ifdef HAVE_LONG_LONG
 | 
			
		||||
	Log(LOG_DEBUG, "time()=%llu", (unsigned long long)time(NULL));
 | 
			
		||||
#else
 | 
			
		||||
	Log(LOG_DEBUG, "time()=%lu", (unsigned long)time(NULL));
 | 
			
		||||
#endif
 | 
			
		||||
	Conf_DebugDump();
 | 
			
		||||
	Conn_DebugDump();
 | 
			
		||||
	Client_DebugDump();
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								src/portab/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								src/portab/.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,3 +0,0 @@
 | 
			
		||||
Makefile.am
 | 
			
		||||
portabtest
 | 
			
		||||
portabtest.exe
 | 
			
		||||
@@ -175,6 +175,10 @@ extern int vsnprintf PARAMS(( char *str, size_t count, const char *fmt, va_list
 | 
			
		||||
# define PACKAGE_VERSION VERSION
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef SYSCONFDIR
 | 
			
		||||
# define SYSCONFDIR "/etc"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* -eof- */
 | 
			
		||||
 
 | 
			
		||||
@@ -196,7 +196,7 @@ main(void)
 | 
			
		||||
	Check_strlcat();
 | 
			
		||||
	Check_strtok_r();
 | 
			
		||||
	Check_vsnprintf(2+10, "%s%s", "ab", "1234567890");
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -50,9 +50,9 @@
 | 
			
		||||
 *  original. Also, there is now a builtin-test, just compile with:
 | 
			
		||||
 *    gcc -DTEST_SNPRINTF -o snprintf snprintf.c -lm
 | 
			
		||||
 *  and run snprintf for results.
 | 
			
		||||
 * 
 | 
			
		||||
 *
 | 
			
		||||
 * Thomas Roessler <roessler@guug.de> 01/27/98 for mutt 0.89i
 | 
			
		||||
 *  The PGP code was using unsigned hexadecimal formats. 
 | 
			
		||||
 *  The PGP code was using unsigned hexadecimal formats.
 | 
			
		||||
 *  Unfortunately, unsigned formats simply didn't work.
 | 
			
		||||
 *
 | 
			
		||||
 * Michael Elkins <me@cs.hmc.edu> 03/05/98 for mutt 0.90.8
 | 
			
		||||
@@ -165,21 +165,21 @@ dopr(char *buffer, size_t maxlen, const char *format, va_list args)
 | 
			
		||||
	int flags;
 | 
			
		||||
	int cflags;
 | 
			
		||||
	size_t currlen;
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	state = DP_S_DEFAULT;
 | 
			
		||||
	currlen = flags = cflags = min = 0;
 | 
			
		||||
	max = -1;
 | 
			
		||||
	ch = *format++;
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	while (state != DP_S_DONE) {
 | 
			
		||||
		if (ch == '\0') 
 | 
			
		||||
		if (ch == '\0')
 | 
			
		||||
			state = DP_S_DONE;
 | 
			
		||||
 | 
			
		||||
		switch(state) {
 | 
			
		||||
		case DP_S_DEFAULT:
 | 
			
		||||
			if (ch == '%') 
 | 
			
		||||
			if (ch == '%')
 | 
			
		||||
				state = DP_S_FLAGS;
 | 
			
		||||
			else 
 | 
			
		||||
			else
 | 
			
		||||
				dopr_outch (buffer, &currlen, maxlen, ch);
 | 
			
		||||
			ch = *format++;
 | 
			
		||||
			break;
 | 
			
		||||
@@ -226,7 +226,7 @@ dopr(char *buffer, size_t maxlen, const char *format, va_list args)
 | 
			
		||||
			if (ch == '.') {
 | 
			
		||||
				state = DP_S_MAX;
 | 
			
		||||
				ch = *format++;
 | 
			
		||||
			} else { 
 | 
			
		||||
			} else {
 | 
			
		||||
				state = DP_S_MOD;
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
@@ -271,7 +271,7 @@ dopr(char *buffer, size_t maxlen, const char *format, va_list args)
 | 
			
		||||
			switch (ch) {
 | 
			
		||||
			case 'd':
 | 
			
		||||
			case 'i':
 | 
			
		||||
				if (cflags == DP_C_SHORT) 
 | 
			
		||||
				if (cflags == DP_C_SHORT)
 | 
			
		||||
					value = va_arg (args, int);
 | 
			
		||||
				else if (cflags == DP_C_LONG)
 | 
			
		||||
					value = va_arg (args, long int);
 | 
			
		||||
@@ -401,12 +401,12 @@ dopr(char *buffer, size_t maxlen, const char *format, va_list args)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if (maxlen != 0) {
 | 
			
		||||
		if (currlen < maxlen - 1) 
 | 
			
		||||
		if (currlen < maxlen - 1)
 | 
			
		||||
			buffer[currlen] = '\0';
 | 
			
		||||
		else if (maxlen > 0) 
 | 
			
		||||
		else if (maxlen > 0)
 | 
			
		||||
			buffer[maxlen - 1] = '\0';
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	return currlen;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -426,11 +426,11 @@ fmtstr(char *buffer, size_t *currlen, size_t maxlen, char *value, int flags,
 | 
			
		||||
 | 
			
		||||
	for (strln = 0; value[strln]; ++strln); /* strlen */
 | 
			
		||||
	padlen = min - strln;
 | 
			
		||||
	if (padlen < 0) 
 | 
			
		||||
	if (padlen < 0)
 | 
			
		||||
		padlen = 0;
 | 
			
		||||
	if (flags & DP_F_MINUS) 
 | 
			
		||||
	if (flags & DP_F_MINUS)
 | 
			
		||||
		padlen = -padlen; /* Left Justify */
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	while ((padlen > 0) && (cnt < max)) {
 | 
			
		||||
		dopr_outch (buffer, currlen, maxlen, ' ');
 | 
			
		||||
		--padlen;
 | 
			
		||||
@@ -460,12 +460,12 @@ fmtint(char *buffer, size_t *currlen, size_t maxlen, long value, int base,
 | 
			
		||||
	int spadlen = 0; /* amount to space pad */
 | 
			
		||||
	int zpadlen = 0; /* amount to zero pad */
 | 
			
		||||
	int caps = 0;
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	if (max < 0)
 | 
			
		||||
		max = 0;
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	uvalue = value;
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	if(!(flags & DP_F_UNSIGNED)) {
 | 
			
		||||
		if( value < 0 ) {
 | 
			
		||||
			signvalue = '-';
 | 
			
		||||
@@ -477,7 +477,7 @@ fmtint(char *buffer, size_t *currlen, size_t maxlen, long value, int base,
 | 
			
		||||
				signvalue = ' ';
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
	if (flags & DP_F_UP) caps = 1; /* Should characters be upper case? */
 | 
			
		||||
 | 
			
		||||
	do {
 | 
			
		||||
@@ -497,7 +497,7 @@ fmtint(char *buffer, size_t *currlen, size_t maxlen, long value, int base,
 | 
			
		||||
		zpadlen = MAX(zpadlen, spadlen);
 | 
			
		||||
		spadlen = 0;
 | 
			
		||||
	}
 | 
			
		||||
	if (flags & DP_F_MINUS) 
 | 
			
		||||
	if (flags & DP_F_MINUS)
 | 
			
		||||
		spadlen = -spadlen; /* Left Justifty */
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG_SNPRINTF
 | 
			
		||||
@@ -512,7 +512,7 @@ fmtint(char *buffer, size_t *currlen, size_t maxlen, long value, int base,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Sign */
 | 
			
		||||
	if (signvalue) 
 | 
			
		||||
	if (signvalue)
 | 
			
		||||
		dopr_outch (buffer, currlen, maxlen, signvalue);
 | 
			
		||||
 | 
			
		||||
	/* Zeros */
 | 
			
		||||
@@ -524,9 +524,9 @@ fmtint(char *buffer, size_t *currlen, size_t maxlen, long value, int base,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Digits */
 | 
			
		||||
	while (place > 0) 
 | 
			
		||||
	while (place > 0)
 | 
			
		||||
		dopr_outch (buffer, currlen, maxlen, convert[--place]);
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
	/* Left Justified spaces */
 | 
			
		||||
	while (spadlen < 0) {
 | 
			
		||||
		dopr_outch (buffer, currlen, maxlen, ' ');
 | 
			
		||||
@@ -541,7 +541,7 @@ abs_val(LDOUBLE value)
 | 
			
		||||
 | 
			
		||||
	if (value < 0)
 | 
			
		||||
		result = -value;
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -549,12 +549,12 @@ static LDOUBLE
 | 
			
		||||
POW10(int exp)
 | 
			
		||||
{
 | 
			
		||||
	LDOUBLE result = 1;
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	while (exp) {
 | 
			
		||||
		result *= 10;
 | 
			
		||||
		exp--;
 | 
			
		||||
	}
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -566,7 +566,7 @@ ROUND(LDOUBLE value)
 | 
			
		||||
	intpart = (LLONG)value;
 | 
			
		||||
	value = value - intpart;
 | 
			
		||||
	if (value >= 0.5) intpart++;
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	return intpart;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -600,7 +600,7 @@ my_modf(double x0, double *iptr)
 | 
			
		||||
		ret = my_modf(x0-l*f, &i2);
 | 
			
		||||
		(*iptr) = l*f + i2;
 | 
			
		||||
		return ret;
 | 
			
		||||
	} 
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	(*iptr) = l;
 | 
			
		||||
	return x - (*iptr);
 | 
			
		||||
@@ -618,14 +618,14 @@ fmtfp (char *buffer, size_t *currlen, size_t maxlen, LDOUBLE fvalue,
 | 
			
		||||
	int iplace = 0;
 | 
			
		||||
	int fplace = 0;
 | 
			
		||||
	int padlen = 0; /* amount to pad */
 | 
			
		||||
	int zpadlen = 0; 
 | 
			
		||||
	int zpadlen = 0;
 | 
			
		||||
	int caps = 0;
 | 
			
		||||
	int index;
 | 
			
		||||
	double intpart;
 | 
			
		||||
	double fracpart;
 | 
			
		||||
	double temp;
 | 
			
		||||
  
 | 
			
		||||
	/* 
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * AIX manpage says the default is 0, but Solaris says the default
 | 
			
		||||
	 * is 6, and sprintf on AIX defaults to 6
 | 
			
		||||
	 */
 | 
			
		||||
@@ -645,8 +645,8 @@ fmtfp (char *buffer, size_t *currlen, size_t maxlen, LDOUBLE fvalue,
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* 
 | 
			
		||||
	 * Sorry, we only support 16 digits past the decimal because of our 
 | 
			
		||||
	/*
 | 
			
		||||
	 * Sorry, we only support 16 digits past the decimal because of our
 | 
			
		||||
	 * conversion method
 | 
			
		||||
	 */
 | 
			
		||||
	if (max > 16)
 | 
			
		||||
@@ -660,7 +660,7 @@ fmtfp (char *buffer, size_t *currlen, size_t maxlen, LDOUBLE fvalue,
 | 
			
		||||
	my_modf(temp, &intpart);
 | 
			
		||||
 | 
			
		||||
	fracpart = ROUND((POW10(max)) * (ufvalue - intpart));
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	if (fracpart >= POW10(max)) {
 | 
			
		||||
		intpart++;
 | 
			
		||||
		fracpart -= POW10(max);
 | 
			
		||||
@@ -697,16 +697,16 @@ fmtfp (char *buffer, size_t *currlen, size_t maxlen, LDOUBLE fvalue,
 | 
			
		||||
		if (fplace == 311) fplace--;
 | 
			
		||||
	}
 | 
			
		||||
	fconvert[fplace] = 0;
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
	/* -1 for decimal point, another -1 if we are printing a sign */
 | 
			
		||||
	padlen = min - iplace - max - 1 - ((signvalue) ? 1 : 0); 
 | 
			
		||||
	padlen = min - iplace - max - 1 - ((signvalue) ? 1 : 0);
 | 
			
		||||
	zpadlen = max - fplace;
 | 
			
		||||
	if (zpadlen < 0) zpadlen = 0;
 | 
			
		||||
	if (padlen < 0) 
 | 
			
		||||
	if (padlen < 0)
 | 
			
		||||
		padlen = 0;
 | 
			
		||||
	if (flags & DP_F_MINUS) 
 | 
			
		||||
	if (flags & DP_F_MINUS)
 | 
			
		||||
		padlen = -padlen; /* Left Justifty */
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	if ((flags & DP_F_ZERO) && (padlen > 0)) {
 | 
			
		||||
		if (signvalue) {
 | 
			
		||||
			dopr_outch (buffer, currlen, maxlen, signvalue);
 | 
			
		||||
@@ -722,10 +722,10 @@ fmtfp (char *buffer, size_t *currlen, size_t maxlen, LDOUBLE fvalue,
 | 
			
		||||
		dopr_outch (buffer, currlen, maxlen, ' ');
 | 
			
		||||
		--padlen;
 | 
			
		||||
	}
 | 
			
		||||
	if (signvalue) 
 | 
			
		||||
	if (signvalue)
 | 
			
		||||
		dopr_outch (buffer, currlen, maxlen, signvalue);
 | 
			
		||||
	
 | 
			
		||||
	while (iplace > 0) 
 | 
			
		||||
 | 
			
		||||
	while (iplace > 0)
 | 
			
		||||
		dopr_outch (buffer, currlen, maxlen, iconvert[--iplace]);
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG_SNPRINTF
 | 
			
		||||
@@ -738,11 +738,11 @@ fmtfp (char *buffer, size_t *currlen, size_t maxlen, LDOUBLE fvalue,
 | 
			
		||||
	 */
 | 
			
		||||
	if (max > 0) {
 | 
			
		||||
		dopr_outch (buffer, currlen, maxlen, '.');
 | 
			
		||||
		
 | 
			
		||||
		while (fplace > 0) 
 | 
			
		||||
 | 
			
		||||
		while (fplace > 0)
 | 
			
		||||
			dopr_outch (buffer, currlen, maxlen, fconvert[--fplace]);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	while (zpadlen > 0) {
 | 
			
		||||
		dopr_outch (buffer, currlen, maxlen, '0');
 | 
			
		||||
		--zpadlen;
 | 
			
		||||
@@ -786,7 +786,7 @@ va_dcl
 | 
			
		||||
{
 | 
			
		||||
	size_t ret;
 | 
			
		||||
	va_list ap;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
	va_start(ap, fmt);
 | 
			
		||||
	ret = vsnprintf(str, count, fmt, ap);
 | 
			
		||||
	va_end(ap);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										24
									
								
								src/testsuite/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								src/testsuite/.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,24 +0,0 @@
 | 
			
		||||
Makefile.am
 | 
			
		||||
T-ngircd1
 | 
			
		||||
T-ngircd1.exe
 | 
			
		||||
T-ngircd2
 | 
			
		||||
T-ngircd2.exe
 | 
			
		||||
channel-test
 | 
			
		||||
connect-test
 | 
			
		||||
invite-test
 | 
			
		||||
join-test
 | 
			
		||||
kick-test
 | 
			
		||||
message-test
 | 
			
		||||
misc-test
 | 
			
		||||
mode-test
 | 
			
		||||
opless-channel-test
 | 
			
		||||
server-link-test
 | 
			
		||||
who-test
 | 
			
		||||
whois-test
 | 
			
		||||
ngircd-test1.log
 | 
			
		||||
ngircd-test2.log
 | 
			
		||||
ngircd-test1.motd
 | 
			
		||||
ngircd-test2.motd
 | 
			
		||||
logs
 | 
			
		||||
tests
 | 
			
		||||
tests-skipped.lst
 | 
			
		||||
@@ -21,6 +21,7 @@ EXTRA_DIST = \
 | 
			
		||||
	join-test.e kick-test.e message-test.e misc-test.e mode-test.e \
 | 
			
		||||
	opless-channel-test.e server-link-test.e who-test.e whois-test.e \
 | 
			
		||||
	stress-A.e stress-B.e \
 | 
			
		||||
	server-login-test.e \
 | 
			
		||||
	start-server1 stop-server1 ngircd-test1.conf \
 | 
			
		||||
	start-server2 stop-server2 ngircd-test2.conf
 | 
			
		||||
 | 
			
		||||
@@ -81,6 +82,10 @@ server-link-test: tests.sh
 | 
			
		||||
	rm -f server-link-test
 | 
			
		||||
	ln -s $(srcdir)/tests.sh server-link-test
 | 
			
		||||
 | 
			
		||||
server-login-test: tests.sh
 | 
			
		||||
	rm -f server-login-test
 | 
			
		||||
	ln -s $(srcdir)/tests.sh server-login-test
 | 
			
		||||
 | 
			
		||||
who-test: tests.sh
 | 
			
		||||
	rm -f who-test
 | 
			
		||||
	ln -s $(srcdir)/tests.sh who-test
 | 
			
		||||
@@ -103,6 +108,7 @@ TESTS = start-server1 \
 | 
			
		||||
	who-test \
 | 
			
		||||
	whois-test \
 | 
			
		||||
	server-link-test \
 | 
			
		||||
	server-login-test \
 | 
			
		||||
	stop-server2 \
 | 
			
		||||
	stress-server.sh \
 | 
			
		||||
	stop-server1
 | 
			
		||||
 
 | 
			
		||||
@@ -50,7 +50,7 @@ start-server.sh [<id>]
 | 
			
		||||
	and that no other instance of the test binary is already running.
 | 
			
		||||
	The exit code is 0 if the test binary could be started.
 | 
			
		||||
 | 
			
		||||
stop-server.sha [<id>]
 | 
			
		||||
stop-server.sh [<id>]
 | 
			
		||||
 | 
			
		||||
	This script uses getpid.sh to detect a running test binary
 | 
			
		||||
	"T-ngircd<id>" and then shuts it down using the TERM signal.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
# ngIRCd test suite
 | 
			
		||||
# Channel test
 | 
			
		||||
 | 
			
		||||
spawn telnet localhost 6789
 | 
			
		||||
spawn telnet 127.0.0.1 6789
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
	"Connected"
 | 
			
		||||
@@ -64,10 +64,10 @@ expect {
 | 
			
		||||
	"323 nick :End of LIST"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
send "part #channel\r"
 | 
			
		||||
send "part #channel :bye bye\r"
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
	"@* PART #channel :nick"
 | 
			
		||||
	"@* PART #channel :bye bye"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
send "join #channel\r"
 | 
			
		||||
@@ -93,11 +93,11 @@ expect {
 | 
			
		||||
send "join 0\r"
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
	"@* PART #channel2 :nick"
 | 
			
		||||
	"@* PART #channel2 :"
 | 
			
		||||
}
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
	"@* PART #channel :nick"
 | 
			
		||||
	"@* PART #channel :"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
send "quit\r"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
# ngIRCd test suite
 | 
			
		||||
# Idle test
 | 
			
		||||
 | 
			
		||||
spawn telnet localhost 6789
 | 
			
		||||
spawn telnet 127.0.0.1 6789
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
	"Connected"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
# ngIRCd test suite
 | 
			
		||||
# Server connect test
 | 
			
		||||
 | 
			
		||||
spawn telnet localhost 6789
 | 
			
		||||
spawn telnet 127.0.0.1 6789
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
	"Connected"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
# ngIRCd test suite
 | 
			
		||||
# INVITE test
 | 
			
		||||
 | 
			
		||||
spawn telnet localhost 6789
 | 
			
		||||
spawn telnet 127.0.0.1 6789
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
	"Connected"
 | 
			
		||||
@@ -82,7 +82,7 @@ expect {
 | 
			
		||||
send "part #channel\r"
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1}
 | 
			
		||||
	-re "PART #channel :?nick"
 | 
			
		||||
	"@* PART #channel :"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
send "invite nick :parameter with spaces\r"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
# ngIRCd test suite
 | 
			
		||||
# JOIN test
 | 
			
		||||
 | 
			
		||||
spawn telnet localhost 6789
 | 
			
		||||
spawn telnet 127.0.0.1 6789
 | 
			
		||||
expect {
 | 
			
		||||
       timeout { exit 1 }
 | 
			
		||||
       "Connected"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
# ngIRCd test suite
 | 
			
		||||
# KICK test
 | 
			
		||||
 | 
			
		||||
spawn telnet localhost 6789
 | 
			
		||||
spawn telnet 127.0.0.1 6789
 | 
			
		||||
expect {
 | 
			
		||||
       timeout { exit 1 }
 | 
			
		||||
       "Connected"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
# ngIRCd test suite
 | 
			
		||||
# PRIVMSG and NOTICE test
 | 
			
		||||
 | 
			
		||||
spawn telnet localhost 6789
 | 
			
		||||
spawn telnet 127.0.0.1 6789
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
	"Connected"
 | 
			
		||||
@@ -35,13 +35,24 @@ expect {
 | 
			
		||||
send "privmsg nick,nick :test\r"
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
	"@* PRIVMSG nick :test\r*@* PRIVMSG nick :test"
 | 
			
		||||
	"@* PRIVMSG nick :test"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
send "privmsg ,,,, :dummy\r"
 | 
			
		||||
send "privmsg ,,,nick,,&server,,, :test\r"
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
	"@* PRIVMSG nick :test"
 | 
			
		||||
}
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
	"404"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
send "privmsg Nick,#testChannel,nick :test\r"
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
	"@* PRIVMSG nick :test\r*401*@* PRIVMSG nick :test"
 | 
			
		||||
	"@* PRIVMSG nick :test\r*401"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
send "privmsg doesnotexist :test\r"
 | 
			
		||||
@@ -72,24 +83,17 @@ expect {
 | 
			
		||||
	"MODE nick :-b"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# The following two tests using "localhost" as host name
 | 
			
		||||
# had to be disabled, because there are operating systems
 | 
			
		||||
# out there, that use "localhost.<domain>" as host name
 | 
			
		||||
# for 127.0.0.1 instead of just "localhost".
 | 
			
		||||
# (for example OpenBSD 4, OpenSolaris, ...)
 | 
			
		||||
#
 | 
			
		||||
#send "privmsg ~user\%localhost :test\r"
 | 
			
		||||
#expect {
 | 
			
		||||
#	timeout { exit 1 }
 | 
			
		||||
#	"@* PRIVMSG nick :test"
 | 
			
		||||
#}
 | 
			
		||||
#
 | 
			
		||||
#send "privmsg Nick!~User@LocalHost :test\r"
 | 
			
		||||
#expect {
 | 
			
		||||
#	timeout { exit 1 }
 | 
			
		||||
#	"@* PRIVMSG nick :test"
 | 
			
		||||
#	"401"
 | 
			
		||||
#}
 | 
			
		||||
send "privmsg ~user\%127.0.0.1 :test\r"
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
	"@* PRIVMSG nick :test"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
send "privmsg Nick!~User@127.0.0.1 :test\r"
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
	"@* PRIVMSG nick :test"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
send "away :away\r"
 | 
			
		||||
expect {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
# ngIRCd test suite
 | 
			
		||||
# Misc test
 | 
			
		||||
 | 
			
		||||
spawn telnet localhost 6789
 | 
			
		||||
spawn telnet 127.0.0.1 6789
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
	"Connected"
 | 
			
		||||
@@ -130,7 +130,7 @@ expect {
 | 
			
		||||
send "userhost nick\r"
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
	-re ":ngircd.test.server 302 nick :?nick=+.*@(localhos.*|127.0.0.1)"
 | 
			
		||||
	-re ":ngircd.test.server 302 nick :?nick=+.*@127.0.0.1"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
send "userhost doesnotexist\r"
 | 
			
		||||
@@ -142,7 +142,7 @@ expect {
 | 
			
		||||
send "userhost nick doesnotexist nick doesnotexist\r"
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
	-re ":ngircd.test.server 302 nick :nick=+.*@(localhos.*|127.0.0.1) nick=+.*@(localhos.*|127.0.0.1)"
 | 
			
		||||
	-re ":ngircd.test.server 302 nick :nick=+.*@127.0.0.1 nick=+.*@127.0.0.1"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
send "away :testing\r"
 | 
			
		||||
@@ -154,7 +154,7 @@ expect {
 | 
			
		||||
send "userhost nick nick nick nick nick nick\r"
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
	-re ":ngircd.test.server 302 nick :nick=-.*@(localhos.*|127.0.0.1) nick=-.*@(localhos.*|127.0.0.1) nick=-.*@(localhos.*|127.0.0.1) nick=-.*@(localhos.*|127.0.0.1) nick=-.*@(localhos.*|127.0.0.1)\r"
 | 
			
		||||
	-re ":ngircd.test.server 302 nick :nick=-.*@127.0.0.1 nick=-.*@127.0.0.1 nick=-.*@127.0.0.1 nick=-.*@127.0.0.1 nick=-.*@127.0.0.1\r"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
send "quit\r"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
# ngIRCd test suite
 | 
			
		||||
# MODE test
 | 
			
		||||
 | 
			
		||||
spawn telnet localhost 6789
 | 
			
		||||
spawn telnet 127.0.0.1 6789
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
	"Connected"
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user