Browse Source

Import upstream version 19.1

Alexander Barton 9 years ago
parent
commit
5536f8b7ed
29 changed files with 900 additions and 33 deletions
  1. 10 0
      ChangeLog
  2. 5 0
      NEWS
  3. 10 10
      configure
  4. 128 0
      contrib/Anope/0003-Update-ngIRCd-protocol-module-for-current-Anope-1.9.patch
  5. 93 0
      contrib/Anope/0004-ngircd-Do-PING-PONG-on-server-burst-to-sync-servers.patch
  6. 29 0
      contrib/Anope/0005-ngircd-always-prefix-modes-in-CHANINFO-with.patch
  7. 47 0
      contrib/Anope/0006-ngircd-support-user-mode-R-and-channel-mode-R.patch
  8. 96 0
      contrib/Anope/0007-ngircd-Fix-handling-of-JOIN-commands.patch
  9. 38 0
      contrib/Anope/0008-ngircd-Allow-setting-modes-by-clients-on-burst.patch
  10. 143 0
      contrib/Anope/0009-ngircd-Update-protocol-module-for-current-Anope-1.9.patch
  11. 57 0
      contrib/Anope/0010-ngircd-Add-ProtongIRCd.patch
  12. 29 0
      contrib/Anope/0011-ngircd-Update-protocol-module-for-current-Anope-1.9.patch
  13. 25 0
      contrib/Anope/0012-ngircd-Channel-mode-r-is-supported-now.patch
  14. 28 0
      contrib/Anope/0013-ngircd-Update-copyright-notice.patch
  15. 35 0
      contrib/Anope/0014-ngircd-set-unset-GLINE-s-on-AKILL-commands.patch
  16. 27 0
      contrib/Anope/0015-ngircd-ngIRCd-supports-channel-mode-e-now.patch
  17. 35 0
      contrib/Anope/0016-ngircd-support-SQUERY-command.patch
  18. 15 1
      contrib/Anope/Makefile.am
  19. 15 1
      contrib/Anope/Makefile.in
  20. 6 0
      contrib/Debian/changelog
  21. 1 1
      contrib/MacOSX/ngIRCd.pmdoc/index.xml
  22. 1 1
      contrib/ngircd.spec
  23. 3 3
      man/ngircd.8.tmpl
  24. 1 1
      man/ngircd.conf.5.tmpl
  25. 11 8
      src/ngircd/conf.c
  26. 2 2
      src/ngircd/conn.c
  27. 2 2
      src/ngircd/irc-mode.c
  28. 6 3
      src/ngircd/log.c
  29. 2 0
      src/testsuite/getpid.sh

+ 10 - 0
ChangeLog

@@ -9,6 +9,16 @@
                                -- ChangeLog --
 
 
+ngIRCd Release 19.1 (2012-03-19)
+
+  - Fix gcc warning (v4.6.3), initialize "list" variable to NULL.
+  - Fix typos: "recieved" -> "received", "Please not" -> "Please note",
+    and fix lintian(1) warning ""hyphen-used-as-minus-sign", too.
+  - Really include _all_ patchtes to build the Anope module into the
+    distribution archive ... ooops!
+  - getpid.sh: Fix testcase error for Debian using sbuild(1).
+  - Don't log "ngIRCd hello message" two times when starting up.
+
 ngIRCd Release 19 (2012-02-29)
 
   - Update build system: bump config.guess and config.sub files used by

+ 5 - 0
NEWS

@@ -9,6 +9,11 @@
                                   -- NEWS --
 
 
+ngIRCd Release 19.1 (2012-03-19)
+
+  - Really include _all_ patchtes to build the Anope module into the
+    distribution archive ... ooops!
+
 ngIRCd Release 19 (2012-02-29)
 
   ngIRCd 19~rc1 (2012-02-12)

+ 10 - 10
configure

@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.67 for ngircd 19.
+# Generated by GNU Autoconf 2.67 for ngircd 19.1.
 #
 #
 # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -549,8 +549,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='ngircd'
 PACKAGE_TARNAME='ngircd'
-PACKAGE_VERSION='19'
-PACKAGE_STRING='ngircd 19'
+PACKAGE_VERSION='19.1'
+PACKAGE_STRING='ngircd 19.1'
 PACKAGE_BUGREPORT=''
 PACKAGE_URL=''
 
@@ -1267,7 +1267,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures ngircd 19 to adapt to many kinds of systems.
+\`configure' configures ngircd 19.1 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1338,7 +1338,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of ngircd 19:";;
+     short | recursive ) echo "Configuration of ngircd 19.1:";;
    esac
   cat <<\_ACEOF
 
@@ -1448,7 +1448,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-ngircd configure 19
+ngircd configure 19.1
 generated by GNU Autoconf 2.67
 
 Copyright (C) 2010 Free Software Foundation, Inc.
@@ -1924,7 +1924,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by ngircd $as_me 19, which was
+It was created by ngircd $as_me 19.1, which was
 generated by GNU Autoconf 2.67.  Invocation command line was
 
   $ $0 $@
@@ -2850,7 +2850,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='ngircd'
- VERSION='19'
+ VERSION='19.1'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -7475,7 +7475,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by ngircd $as_me 19, which was
+This file was extended by ngircd $as_me 19.1, which was
 generated by GNU Autoconf 2.67.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -7541,7 +7541,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-ngircd config.status 19
+ngircd config.status 19.1
 configured by $0, generated by GNU Autoconf 2.67,
   with options \\"\$ac_cs_config\\"
 

+ 128 - 0
contrib/Anope/0003-Update-ngIRCd-protocol-module-for-current-Anope-1.9.patch

@@ -0,0 +1,128 @@
+From d8eddbeaadc7d161865b5342d59748b80266533c Mon Sep 17 00:00:00 2001
+From: DukePyrolator <DukePyrolator@anope.org>
+Date: Mon, 22 Aug 2011 14:53:37 +0200
+Subject: [PATCH 03/16] Update ngIRCd protocol module for current Anope 1.9
+ GIT
+
+---
+ modules/protocol/ngircd.cpp |   37 ++++++++++++++++++-------------------
+ 1 files changed, 18 insertions(+), 19 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index e546d05..790b8f4 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -11,6 +11,8 @@
+ 
+ #include "services.h"
+ #include "modules.h"
++#include "nickserv.h"
++#include "oper.h"
+ 
+ IRCDVar myIrcd[] = {
+ 	{"ngIRCd",	/* ircd name */
+@@ -45,14 +47,7 @@ class ngIRCdProto : public IRCDProto
+ {
+ 	void SendAkill(User *u, const XLine *x)
+ 	{
+-		if (SGLine && u == NULL)
+-			for (Anope::insensitive_map<User *>::iterator it = UserListByNick.begin(); it != UserListByNick.end();)
+-			{
+-				u = it->second;
+-				++it;
+-				if (SGLine->Check(u) != NULL)
+-					break;
+-			}
++		// TODO: ADD SOME CODE
+ 	}
+ 
+ 	void SendAkillDel(const XLine*) { }
+@@ -62,13 +57,16 @@ class ngIRCdProto : public IRCDProto
+ 		send_cmd(source ? source->nick : Config->ServerName, "WALLOPS :%s", buf.c_str());
+ 	}
+ 
+-	void SendJoin(BotInfo *user, Channel *c, const ChannelStatus *status)
++	void SendJoin(User *user, Channel *c, const ChannelStatus *status)
+ 	{
+ 		send_cmd(user->nick, "JOIN %s", c->name.c_str());
+ 		if (status)
++		{
++			BotInfo *setter = findbot(user->nick);
+ 			for (unsigned i = 0; i < ModeManager::ChannelModes.size(); ++i)
+ 				if (status->HasFlag(ModeManager::ChannelModes[i]->Name))
+-					c->SetMode(user, ModeManager::ChannelModes[i], user->nick, false);
++					c->SetMode(setter, ModeManager::ChannelModes[i], user->nick, false);
++		}
+ 	}
+ 
+ 	void SendSVSKillInternal(const BotInfo *source, const User *user, const Anope::string &buf)
+@@ -84,7 +82,7 @@ class ngIRCdProto : public IRCDProto
+ 
+ 	void SendConnect()
+ 	{
+-		send_cmd("", "PASS %s 0210-IRC+ Anope|%s:CLHSo P", uplink_server->password.c_str(), Anope::VersionShort().c_str());
++		send_cmd("", "PASS %s 0210-IRC+ Anope|%s:CLHSo P", Config->Uplinks[CurrentUplink]->password.c_str(), Anope::VersionShort().c_str());
+ 		/* Make myself known to myself in the serverlist */
+ 		SendServer(Me);
+ 		/* finish the enhanced server handshake and register the connection */
+@@ -92,9 +90,11 @@ class ngIRCdProto : public IRCDProto
+ 	}
+ 
+ 	// Received: :dev.anope.de NICK DukeP 1 ~DukePyro p57ABF9C9.dip.t-dialin.net 1 +i :DukePyrolator
+-	void SendClientIntroduction(const User *u, const Anope::string &modes)
++	void SendClientIntroduction(const User *u)
+ 	{
+-		EnforceQlinedNick(u->nick, "");
++		Anope::string modes = "+" + u->GetModes();
++		XLine x(u->nick, "Reserved for services");
++		ircdproto->SendSQLine(NULL, &x);
+ 		send_cmd(Config->ServerName, "NICK %s 1 %s %s 1 %s :%s", u->nick.c_str(), u->GetIdent().c_str(), u->host.c_str(), modes.c_str(), u->realname.c_str());
+ 	}
+ 
+@@ -126,7 +126,7 @@ class ngIRCdProto : public IRCDProto
+ 
+ 	void SendNoticeChanopsInternal(const BotInfo *source, const Channel *dest, const Anope::string &buf)
+ 	{
+-		send_cmd(source ? source->nick : Config->s_ChanServ, "NOTICE @%s :%s", dest->name.c_str(), buf.c_str());
++		send_cmd(source->nick, "NOTICE @%s :%s", dest->name.c_str(), buf.c_str());
+ 	}
+ 
+ 	/* INVITE */
+@@ -196,8 +196,8 @@ class ngIRCdIRCdMessage : public IRCdMessage
+ 		{
+ 			// a new user is connecting to the network
+ 			User *user = do_nick("", params[0], params[2], params[3], source, params[6], Anope::CurTime, "", "", "", params[5]);
+-			if (user)
+-				validate_user(user);
++			if (user && nickserv)
++				nickserv->Validate(user);
+ 		}
+ 		else
+ 		{
+@@ -433,7 +433,7 @@ class ProtongIRCd : public Module
+ 		ModeManager::AddUserMode(new UserMode(UMODE_CLOAK, 'x'));
+ 
+ 		/* b/e/I */
+-		ModeManager::AddChannelMode(new ChannelModeBan(CMODE_BAN, 'b'));
++		ModeManager::AddChannelMode(new ChannelModeList(CMODE_BAN, 'b'));
+ 		ModeManager::AddChannelMode(new ChannelModeList(CMODE_INVITEOVERRIDE, 'I'));
+ 
+ 		/* v/h/o/a/q */
+@@ -454,13 +454,12 @@ class ProtongIRCd : public Module
+ 	}
+ 
+  public:
+-	ProtongIRCd(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator),
++	ProtongIRCd(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PROTOCOL),
+ 		message_kick("KICK", event_kick), message_pass("PASS", event_pass),
+ 		message_njoin("NJOIN", event_njoin), message_chaninfo("CHANINFO", event_chaninfo),
+ 		message_005("005", event_005), message_442("442", event_442), message_376("376", event_376)
+ 	{
+ 		this->SetAuthor("Anope");
+-		this->SetType(PROTOCOL);
+ 
+ 		Capab.SetFlag(CAPAB_QS);
+ 
+-- 
+1.7.8.3
+

+ 93 - 0
contrib/Anope/0004-ngircd-Do-PING-PONG-on-server-burst-to-sync-servers.patch

@@ -0,0 +1,93 @@
+From 88b2b14a76b8ee053b1f6ea64139350260590043 Mon Sep 17 00:00:00 2001
+From: DukePyrolator <DukePyrolator@anope.org>
+Date: Mon, 22 Aug 2011 14:55:07 +0200
+Subject: [PATCH 04/16] ngircd: Do PING-PONG on server burst to "sync servers"
+
+Imagine we had three servers, A, B & C linked like so: A<->B<->C:
+
+If Anope is linked to A and B splits from A and then reconnects B
+introduces itself, introduces C, sends EOS for C, introduces B's clients
+introduces C's clients, sends EOS for B. This causes all of C's clients
+to be introduced with their server "not syncing".
+
+We now send a PING immediately when receiving a new server and then
+finish sync once we get a pong back from that server.
+---
+ modules/protocol/ngircd.cpp |   28 ++++++++++++++++++++++++++--
+ 1 files changed, 26 insertions(+), 2 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index 790b8f4..89aecfd 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -108,11 +108,13 @@ class ngIRCdProto : public IRCDProto
+ 
+ 	void SendModeInternal(const BotInfo *bi, const Channel *dest, const Anope::string &buf)
+ 	{
++Log(LOG_DEBUG) << "SendModeInternal 1";
+ 		send_cmd(bi ? bi->nick : Config->ServerName, "MODE %s %s", dest->name.c_str(), buf.c_str());
+ 	}
+ 
+ 	void SendModeInternal(const BotInfo *bi, const User *u, const Anope::string &buf)
+ 	{
++Log(LOG_DEBUG) << "SendModeInternal 2";
+ 		send_cmd(bi ? bi->nick : Config->ServerName, "MODE %s %s", u->nick.c_str(), buf.c_str());
+ 	}
+ 
+@@ -212,6 +214,8 @@ class ngIRCdIRCdMessage : public IRCdMessage
+ 			do_server("", params[0], 0, params[2], params[1]);
+ 		else
+ 			do_server(source, params[0], params[1].is_pos_number_only() ? convertTo<unsigned>(params[1]) : 0, params[3], params[2]);
++
++		ircdproto->SendPing(Config->ServerName, params[0]);
+ 		return true;
+ 	}
+ 
+@@ -253,6 +257,25 @@ class ngIRCdIRCdMessage : public IRCdMessage
+ 	}
+ };
+ 
++/** This is here because:
++ *
++ * If we had three servers, A, B & C linked like so: A<->B<->C
++ * If Anope is linked to A and B splits from A and then reconnects
++ * B introduces itself, introduces C, sends EOS for C, introduces Bs clients
++ * introduces Cs clients, sends EOS for B. This causes all of Cs clients to be introduced
++ * with their server "not syncing". We now send a PING immediately when receiving a new server
++ * and then finish sync once we get a pong back from that server.
++ */
++bool event_pong(const Anope::string &source, const std::vector<Anope::string> &params)
++{
++	Server *s = Server::Find(source);
++	if (s && !s->IsSynced())
++		s->Sync(false);
++	return true;
++}
++
++
++
+ /*
+  * CHANINFO <chan> +<modes>
+  * CHANINFO <chan> +<modes> :<topic>
+@@ -416,7 +439,7 @@ bool event_376(const Anope::string &source, const std::vector<Anope::string> &pa
+ class ProtongIRCd : public Module
+ {
+ 	Message message_kick, message_pass, message_njoin, message_chaninfo, message_005,
+-		message_442, message_376;
++		message_442, message_376, message_pong;
+ 
+ 	ngIRCdProto ircd_proto;
+ 	ngIRCdIRCdMessage ircd_message;
+@@ -457,7 +480,8 @@ class ProtongIRCd : public Module
+ 	ProtongIRCd(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PROTOCOL),
+ 		message_kick("KICK", event_kick), message_pass("PASS", event_pass),
+ 		message_njoin("NJOIN", event_njoin), message_chaninfo("CHANINFO", event_chaninfo),
+-		message_005("005", event_005), message_442("442", event_442), message_376("376", event_376)
++		message_005("005", event_005), message_442("442", event_442), message_376("376", event_376),
++		message_pong("PONG", event_pong)
+ 	{
+ 		this->SetAuthor("Anope");
+ 
+-- 
+1.7.8.3
+

+ 29 - 0
contrib/Anope/0005-ngircd-always-prefix-modes-in-CHANINFO-with.patch

@@ -0,0 +1,29 @@
+From 0d83f8f9ca0de651d664eca6f467f36df0417f7d Mon Sep 17 00:00:00 2001
+From: Alexander Barton <alex@barton.de>
+Date: Mon, 22 Aug 2011 14:59:49 +0200
+Subject: [PATCH 05/16] ngircd: always prefix modes in CHANINFO with "+"
+
+---
+ modules/protocol/ngircd.cpp |    6 ++----
+ 1 files changed, 2 insertions(+), 4 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index 89aecfd..3e5beb3 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -139,10 +139,8 @@ Log(LOG_DEBUG) << "SendModeInternal 2";
+ 
+ 	void SendChannel(Channel *c)
+ 	{
+-		Anope::string mlock_modes = get_mlock_modes(c->ci, true);
+-		if (mlock_modes.empty())
+-			mlock_modes = "+";
+-		send_cmd(Config->ServerName, "CHANINFO %s %s", c->name.c_str(), mlock_modes.c_str());
++		Anope::string modes = c->GetModes(true, true);
++		send_cmd(Config->ServerName, "CHANINFO %s +%s", c->name.c_str(), modes.c_str());
+ 	}
+ 	void SendTopic(BotInfo *bi, Channel *c)
+ 	{
+-- 
+1.7.8.3
+

+ 47 - 0
contrib/Anope/0006-ngircd-support-user-mode-R-and-channel-mode-R.patch

@@ -0,0 +1,47 @@
+From 1914a36b83b1fc6b4678ef261a1a06eefab9a0ca Mon Sep 17 00:00:00 2001
+From: Alexander Barton <alex@barton.de>
+Date: Fri, 26 Aug 2011 17:51:37 +0200
+Subject: [PATCH 06/16] ngircd: support user mode "R" and channel mode "R"
+
+---
+ modules/protocol/ngircd.cpp |    7 ++++---
+ 1 files changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index 3e5beb3..7f4186e 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -449,26 +449,27 @@ class ProtongIRCd : public Module
+ 		ModeManager::AddUserMode(new UserMode(UMODE_INVIS, 'i'));
+ 		ModeManager::AddUserMode(new UserMode(UMODE_OPER, 'o'));
+ 		ModeManager::AddUserMode(new UserMode(UMODE_RESTRICTED, 'r'));
++		ModeManager::AddUserMode(new UserMode(UMODE_REGISTERED, 'R'));
+ 		ModeManager::AddUserMode(new UserMode(UMODE_SNOMASK, 's'));
+ 		ModeManager::AddUserMode(new UserMode(UMODE_WALLOPS, 'w'));
+ 		ModeManager::AddUserMode(new UserMode(UMODE_CLOAK, 'x'));
+ 
+-		/* b/e/I */
++		/* Add modes for ban and invite lists */
+ 		ModeManager::AddChannelMode(new ChannelModeList(CMODE_BAN, 'b'));
+ 		ModeManager::AddChannelMode(new ChannelModeList(CMODE_INVITEOVERRIDE, 'I'));
+ 
+-		/* v/h/o/a/q */
++		/* Add channel user modes */
+ 		ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, 'v', '+'));
+ 		ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, 'o', '@'));
+ 
+ 		/* Add channel modes */
+-		// channel modes: biIklmnoPstvz
+ 		ModeManager::AddChannelMode(new ChannelMode(CMODE_INVITE, 'i'));
+ 		ModeManager::AddChannelMode(new ChannelModeKey('k'));
+ 		ModeManager::AddChannelMode(new ChannelModeParam(CMODE_LIMIT, 'l'));
+ 		ModeManager::AddChannelMode(new ChannelMode(CMODE_MODERATED, 'm'));
+ 		ModeManager::AddChannelMode(new ChannelMode(CMODE_NOEXTERNAL, 'n'));
+ 		ModeManager::AddChannelMode(new ChannelMode(CMODE_PERM, 'P'));
++		ModeManager::AddChannelMode(new ChannelMode(CMODE_REGISTEREDONLY, 'R'));
+ 		ModeManager::AddChannelMode(new ChannelMode(CMODE_SECRET, 's'));
+ 		ModeManager::AddChannelMode(new ChannelMode(CMODE_TOPIC, 't'));
+ 		ModeManager::AddChannelMode(new ChannelMode(CMODE_SSL, 'z'));
+-- 
+1.7.8.3
+

+ 96 - 0
contrib/Anope/0007-ngircd-Fix-handling-of-JOIN-commands.patch

@@ -0,0 +1,96 @@
+From 4c9300ede35310ee5642f34e5ac227bd96fc7384 Mon Sep 17 00:00:00 2001
+From: DukePyrolator <DukePyrolator@anope.org>
+Date: Sun, 4 Sep 2011 15:08:55 +0200
+Subject: [PATCH 07/16] ngircd: Fix handling of JOIN commands
+
+---
+ modules/protocol/ngircd.cpp |   60 +++++++++++++++++++++++++++++++++++++++---
+ 1 files changed, 55 insertions(+), 5 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index 7f4186e..3024fdd 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -240,16 +240,58 @@ class ngIRCdIRCdMessage : public IRCdMessage
+ 	{
+ 		if (!params.empty())
+ 		{
++			Anope::string channel, mode;
+ 			size_t pos = params[0].find('\7');
+ 			if (pos != Anope::string::npos)
+ 			{
+-				Anope::string channel = params[0].substr(0, pos);
+-				Anope::string mode = '+' + params[0].substr(pos, params[0].length()) + " " + source;
+-				do_join(source, channel, "");
+-				do_cmode(source, channel, mode, "");
++				channel = params[0].substr(0, pos);
++				mode = '+' + params[0].substr(pos+1, params[0].length()) + " " + source;
+ 			}
+ 			else
+-				do_join(source, params[0], "");
++				channel = params[0];
++
++			Channel *c = findchan(channel);
++
++			if (!c)
++			{
++				c = new Channel(channel, Anope::CurTime);
++				c->SetFlag(CH_SYNCING);
++			}
++
++			User *u = finduser(source);
++
++			if (!u)
++			{
++				Log(LOG_DEBUG) << "JOIN for nonexistant user " << source << " on " << channel;
++				return false;
++			}
++
++			EventReturn MOD_RESULT;
++			FOREACH_RESULT(I_OnPreJoinChannel, OnPreJoinChannel(u, c));
++
++			/* Add the user to the channel */
++			c->JoinUser(u);
++
++			/* set the usermodes to the channel */
++			do_cmode(source, channel, mode, "");
++
++			/* Now set whatever modes this user is allowed to have on the channel */
++			chan_set_correct_modes(u, c, 1);
++
++			/* Check to see if modules want the user to join, if they do
++			 * check to see if they are allowed to join (CheckKick will kick/ban them)
++			 * Don't trigger OnJoinChannel event then as the user will be destroyed
++			 */
++			if (MOD_RESULT != EVENT_STOP && c->ci && c->ci->CheckKick(u))
++				return false;
++
++			FOREACH_MOD(I_OnJoinChannel, OnJoinChannel(u, c));
++
++			if (c->HasFlag(CH_SYNCING))
++			{
++				c->UnsetFlag(CH_SYNCING);
++				c->Sync();
++			}
+ 		}
+ 		return true;
+ 	}
+@@ -491,7 +533,15 @@ class ProtongIRCd : public Module
+ 		pmodule_ircd_message(&this->ircd_message);
+ 
+ 		this->AddModes();
++
++		ModuleManager::Attach(I_OnUserNickChange, this);
+ 	}
++
++	void OnUserNickChange(User *u, const Anope::string &)
++	{
++		u->RemoveModeInternal(ModeManager::FindUserModeByName(UMODE_REGISTERED));
++	}
++
+ };
+ 
+ MODULE_INIT(ProtongIRCd)
+-- 
+1.7.8.3
+

+ 38 - 0
contrib/Anope/0008-ngircd-Allow-setting-modes-by-clients-on-burst.patch

@@ -0,0 +1,38 @@
+From d363ebd841ea7e1db3c62730023759d69520e0d8 Mon Sep 17 00:00:00 2001
+From: Alexander Barton <alex@barton.de>
+Date: Tue, 27 Sep 2011 15:08:09 +0200
+Subject: [PATCH 08/16] ngircd: Allow setting modes by clients on burst
+
+This change is required by commit 43201ead9575a for the ngIRCd protocol
+module as well.
+---
+ modules/protocol/ngircd.cpp |    7 +++++--
+ 1 files changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index 3024fdd..2774168 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -57,14 +57,17 @@ class ngIRCdProto : public IRCDProto
+ 		send_cmd(source ? source->nick : Config->ServerName, "WALLOPS :%s", buf.c_str());
+ 	}
+ 
+-	void SendJoin(User *user, Channel *c, const ChannelStatus *status)
++	void SendJoin(User *user, Channel *c, ChannelStatus *status)
+ 	{
+ 		send_cmd(user->nick, "JOIN %s", c->name.c_str());
+ 		if (status)
+ 		{
++			ChannelStatus cs = *status;
++			status->ClearFlags();
++
+ 			BotInfo *setter = findbot(user->nick);
+ 			for (unsigned i = 0; i < ModeManager::ChannelModes.size(); ++i)
+-				if (status->HasFlag(ModeManager::ChannelModes[i]->Name))
++				if (cs.HasFlag(ModeManager::ChannelModes[i]->Name))
+ 					c->SetMode(setter, ModeManager::ChannelModes[i], user->nick, false);
+ 		}
+ 	}
+-- 
+1.7.8.3
+

+ 143 - 0
contrib/Anope/0009-ngircd-Update-protocol-module-for-current-Anope-1.9.patch

@@ -0,0 +1,143 @@
+From e74a5303f2357f4a9915bb91038a2e326323db3c Mon Sep 17 00:00:00 2001
+From: Alexander Barton <alex@barton.de>
+Date: Fri, 25 Nov 2011 19:16:37 +0100
+Subject: [PATCH 09/16] ngircd: Update protocol module for current Anope 1.9
+ GIT
+
+This changes are rquired by:
+
+ - b14f5ea88: Fixed accidentally clearing botmodes when joins are sent
+ - cef3eb78d: Remove send_cmd and replace it with a stringstream
+ - ddc3c2f38: Added options:nonicknameownership config option
+---
+ modules/protocol/ngircd.cpp |   54 ++++++++++++++++++++++--------------------
+ 1 files changed, 28 insertions(+), 26 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index 2774168..55cb8d7 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -54,16 +54,22 @@ class ngIRCdProto : public IRCDProto
+ 
+ 	void SendGlobopsInternal(const BotInfo *source, const Anope::string &buf)
+ 	{
+-		send_cmd(source ? source->nick : Config->ServerName, "WALLOPS :%s", buf.c_str());
++		UplinkSocket::Message(source ? source->nick : Config->ServerName) << "WALLOPS :" << buf;
+ 	}
+ 
+-	void SendJoin(User *user, Channel *c, ChannelStatus *status)
++	void SendJoin(User *user, Channel *c, const ChannelStatus *status)
+ 	{
+-		send_cmd(user->nick, "JOIN %s", c->name.c_str());
++		UplinkSocket::Message(user->nick) << "JOIN " << c->name;
+ 		if (status)
+ 		{
++			/* First save the channel status incase uc->Status == status */
+ 			ChannelStatus cs = *status;
+-			status->ClearFlags();
++			/* If the user is internally on the channel with flags, kill them so that
++			 * the stacker will allow this.
++			 */
++			UserContainer *uc = c->FindUser(user);
++			if (uc != NULL)
++				uc->Status->ClearFlags();
+ 
+ 			BotInfo *setter = findbot(user->nick);
+ 			for (unsigned i = 0; i < ModeManager::ChannelModes.size(); ++i)
+@@ -74,18 +80,18 @@ class ngIRCdProto : public IRCDProto
+ 
+ 	void SendSVSKillInternal(const BotInfo *source, const User *user, const Anope::string &buf)
+ 	{
+-		send_cmd(source ? source->nick : Config->ServerName, "KILL %s :%s", user->nick.c_str(), buf.c_str());
++		UplinkSocket::Message(source ? source->nick : Config->ServerName) << "KILL " << user->nick << " :" << buf;
+ 	}
+ 
+ 	/* SERVER name hop descript */
+ 	void SendServer(const Server *server)
+ 	{
+-		send_cmd("", "SERVER %s %d :%s", server->GetName().c_str(), server->GetHops(), server->GetDescription().c_str());
++		UplinkSocket::Message() << "SERVER " << server->GetName() << " " << server->GetHops() << " :" << server->GetDescription();
+ 	}
+ 
+ 	void SendConnect()
+ 	{
+-		send_cmd("", "PASS %s 0210-IRC+ Anope|%s:CLHSo P", Config->Uplinks[CurrentUplink]->password.c_str(), Anope::VersionShort().c_str());
++		UplinkSocket::Message() << "PASS " << Config->Uplinks[CurrentUplink]->password << " 0210-IRC+ Anope|" << Anope::VersionShort() << ":CLHSo P";
+ 		/* Make myself known to myself in the serverlist */
+ 		SendServer(Me);
+ 		/* finish the enhanced server handshake and register the connection */
+@@ -98,56 +104,52 @@ class ngIRCdProto : public IRCDProto
+ 		Anope::string modes = "+" + u->GetModes();
+ 		XLine x(u->nick, "Reserved for services");
+ 		ircdproto->SendSQLine(NULL, &x);
+-		send_cmd(Config->ServerName, "NICK %s 1 %s %s 1 %s :%s", u->nick.c_str(), u->GetIdent().c_str(), u->host.c_str(), modes.c_str(), u->realname.c_str());
++		UplinkSocket::Message(Config->ServerName) << "NICK " << u->nick << " 1 " << u->GetIdent() << " " << u->host << " 1 " << modes << " :" << u->realname;
+ 	}
+ 
+ 	void SendPartInternal(const BotInfo *bi, const Channel *chan, const Anope::string &buf)
+ 	{
+ 		if (!buf.empty())
+-			send_cmd(bi->nick, "PART %s :%s", chan->name.c_str(), buf.c_str());
++			UplinkSocket::Message(bi->nick) << "PART " << chan->name << " :" << buf;
+ 		else
+-			send_cmd(bi->nick, "PART %s", chan->name.c_str());
++			UplinkSocket::Message(bi->nick) << "PART " << chan->name;
+ 	}
+ 
+ 	void SendModeInternal(const BotInfo *bi, const Channel *dest, const Anope::string &buf)
+ 	{
+-Log(LOG_DEBUG) << "SendModeInternal 1";
+-		send_cmd(bi ? bi->nick : Config->ServerName, "MODE %s %s", dest->name.c_str(), buf.c_str());
++		UplinkSocket::Message(bi ? bi->nick : Config->ServerName) << "MODE " << dest->name << " " << buf;
+ 	}
+ 
+ 	void SendModeInternal(const BotInfo *bi, const User *u, const Anope::string &buf)
+ 	{
+-Log(LOG_DEBUG) << "SendModeInternal 2";
+-		send_cmd(bi ? bi->nick : Config->ServerName, "MODE %s %s", u->nick.c_str(), buf.c_str());
++		UplinkSocket::Message(bi ? bi->nick : Config->ServerName) << "MODE " << u->nick << " " << buf;
+ 	}
+ 
+ 	void SendKickInternal(const BotInfo *bi, const Channel *chan, const User *user, const Anope::string &buf)
+ 	{
+ 		if (!buf.empty())
+-			send_cmd(bi->nick, "KICK %s %s :%s", chan->name.c_str(), user->nick.c_str(), buf.c_str());
++			UplinkSocket::Message(bi->nick) << "KICK " << chan->name << " " << user->nick << " :" << buf;
+ 		else
+-			send_cmd(bi->nick, "KICK %s %s", chan->name.c_str(), user->nick.c_str());
++			UplinkSocket::Message(bi->nick) << "KICK " << chan->name << " " << user->nick;
+ 	}
+ 
+-	void SendNoticeChanopsInternal(const BotInfo *source, const Channel *dest, const Anope::string &buf)
++	void SendChannel(Channel *c)
+ 	{
+-		send_cmd(source->nick, "NOTICE @%s :%s", dest->name.c_str(), buf.c_str());
++		Anope::string modes = c->GetModes(true, true);
++		UplinkSocket::Message(Config->ServerName) << "CHANINFO " << c->name << " +" << modes;
+ 	}
+ 
+-	/* INVITE */
+-	void SendInvite(BotInfo *source, const Anope::string &chan, const Anope::string &nick)
++	void SendTopic(BotInfo *bi, Channel *c)
+ 	{
+-		send_cmd(source->nick, "INVITE %s %s", nick.c_str(), chan.c_str());
++		UplinkSocket::Message(bi->nick) << "TOPIC " << c->name << " :" << c->topic;
+ 	}
+ 
+-	void SendChannel(Channel *c)
++	void SendLogin(User *u)
+ 	{
+-		Anope::string modes = c->GetModes(true, true);
+-		send_cmd(Config->ServerName, "CHANINFO %s +%s", c->name.c_str(), modes.c_str());
+ 	}
+-	void SendTopic(BotInfo *bi, Channel *c)
++
++	void SendLogout(User *u)
+ 	{
+-		send_cmd(bi->nick, "TOPIC %s :%s", c->name.c_str(), c->topic.c_str());
+ 	}
+ };
+ 
+-- 
+1.7.8.3
+

+ 57 - 0
contrib/Anope/0010-ngircd-Add-ProtongIRCd.patch

@@ -0,0 +1,57 @@
+From d2c45d7c578ec684d3b471020f631847316de196 Mon Sep 17 00:00:00 2001
+From: Alexander Barton <alex@barton.de>
+Date: Fri, 25 Nov 2011 19:17:19 +0100
+Subject: [PATCH 10/16] ngircd: Add ~ProtongIRCd()
+
+---
+ modules/protocol/ngircd.cpp |   13 ++++++++-----
+ 1 files changed, 8 insertions(+), 5 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index 55cb8d7..5fd62db 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -302,8 +302,7 @@ class ngIRCdIRCdMessage : public IRCdMessage
+ 	}
+ };
+ 
+-/** This is here because:
+- *
++/*
+  * If we had three servers, A, B & C linked like so: A<->B<->C
+  * If Anope is linked to A and B splits from A and then reconnects
+  * B introduces itself, introduces C, sends EOS for C, introduces Bs clients
+@@ -319,8 +318,6 @@ bool event_pong(const Anope::string &source, const std::vector<Anope::string> &p
+ 	return true;
+ }
+ 
+-
+-
+ /*
+  * CHANINFO <chan> +<modes>
+  * CHANINFO <chan> +<modes> :<topic>
+@@ -480,7 +477,6 @@ bool event_376(const Anope::string &source, const std::vector<Anope::string> &pa
+ 	return true;
+ }
+ 
+-
+ class ProtongIRCd : public Module
+ {
+ 	Message message_kick, message_pass, message_njoin, message_chaninfo, message_005,
+@@ -542,6 +538,13 @@ class ProtongIRCd : public Module
+ 		ModuleManager::Attach(I_OnUserNickChange, this);
+ 	}
+ 
++        ~ProtongIRCd()
++        {
++                pmodule_ircd_var(NULL);
++                pmodule_ircd_proto(NULL);
++                pmodule_ircd_message(NULL);
++        }
++
+ 	void OnUserNickChange(User *u, const Anope::string &)
+ 	{
+ 		u->RemoveModeInternal(ModeManager::FindUserModeByName(UMODE_REGISTERED));
+-- 
+1.7.8.3
+

+ 29 - 0
contrib/Anope/0011-ngircd-Update-protocol-module-for-current-Anope-1.9.patch

@@ -0,0 +1,29 @@
+From 4dc5a3d3e2fbb218461d9459bff1c0a392a75881 Mon Sep 17 00:00:00 2001
+From: Alexander Barton <alex@barton.de>
+Date: Sat, 31 Dec 2011 16:12:52 +0100
+Subject: [PATCH 11/16] ngircd: Update protocol module for current Anope 1.9
+ GIT
+
+This changes are rquired by:
+
+ - 150831c1a: Made capab management a bit simplier
+---
+ modules/protocol/ngircd.cpp |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index 5fd62db..9c26ec8 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -527,7 +527,7 @@ class ProtongIRCd : public Module
+ 	{
+ 		this->SetAuthor("Anope");
+ 
+-		Capab.SetFlag(CAPAB_QS);
++		Capab.insert("QS");
+ 
+ 		pmodule_ircd_var(myIrcd);
+ 		pmodule_ircd_proto(&this->ircd_proto);
+-- 
+1.7.8.3
+

+ 25 - 0
contrib/Anope/0012-ngircd-Channel-mode-r-is-supported-now.patch

@@ -0,0 +1,25 @@
+From 99c18cafdee28bfb17fad5f0526b3ed5d1f5f312 Mon Sep 17 00:00:00 2001
+From: Alexander Barton <alex@barton.de>
+Date: Sat, 31 Dec 2011 16:17:50 +0100
+Subject: [PATCH 12/16] ngircd: let Anope know that channel mode "r" is
+ supported
+
+---
+ modules/protocol/ngircd.cpp |    1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index 9c26ec8..6155667 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -512,6 +512,7 @@ class ProtongIRCd : public Module
+ 		ModeManager::AddChannelMode(new ChannelMode(CMODE_MODERATED, 'm'));
+ 		ModeManager::AddChannelMode(new ChannelMode(CMODE_NOEXTERNAL, 'n'));
+ 		ModeManager::AddChannelMode(new ChannelMode(CMODE_PERM, 'P'));
++		ModeManager::AddChannelMode(new ChannelModeRegistered('r'));
+ 		ModeManager::AddChannelMode(new ChannelMode(CMODE_REGISTEREDONLY, 'R'));
+ 		ModeManager::AddChannelMode(new ChannelMode(CMODE_SECRET, 's'));
+ 		ModeManager::AddChannelMode(new ChannelMode(CMODE_TOPIC, 't'));
+-- 
+1.7.8.3
+

+ 28 - 0
contrib/Anope/0013-ngircd-Update-copyright-notice.patch

@@ -0,0 +1,28 @@
+From 5a19b69f0daceb5b12ec751bc919519a7f712f2d Mon Sep 17 00:00:00 2001
+From: Alexander Barton <alex@barton.de>
+Date: Sun, 15 Jan 2012 13:36:14 +0100
+Subject: [PATCH 13/16] ngircd: Update copyright notice
+
+---
+ modules/protocol/ngircd.cpp |    7 ++++---
+ 1 files changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index 6155667..024c61d 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -1,7 +1,8 @@
+-/* ngIRCd IRCD functions
++/*
++ * ngIRCd Protocol module for Anope IRC Services
+  *
+- * (C) 2003-2011 Anope Team
+- * Contact us at team@anope.org
++ * (C) 2011-2012 Alexander Barton <alex@barton.de>
++ * (C) 2011 Anope Team <team@anope.org>
+  *
+  * Please read COPYING and README for further details.
+  *
+-- 
+1.7.8.3
+

+ 35 - 0
contrib/Anope/0014-ngircd-set-unset-GLINE-s-on-AKILL-commands.patch

@@ -0,0 +1,35 @@
+From acc24a7f4488f6ef0fb240a76766db4220b62d53 Mon Sep 17 00:00:00 2001
+From: Alexander Barton <alex@barton.de>
+Date: Sun, 22 Jan 2012 19:05:28 +0100
+Subject: [PATCH 14/16] ngircd: set/unset GLINE's on AKILL commands
+
+---
+ modules/protocol/ngircd.cpp |   10 ++++++++--
+ 1 files changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index 024c61d..3bc3812 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -48,10 +48,16 @@ class ngIRCdProto : public IRCDProto
+ {
+ 	void SendAkill(User *u, const XLine *x)
+ 	{
+-		// TODO: ADD SOME CODE
++		// Calculate the time left before this would expire, capping it at 2 days
++		time_t timeleft = x->Expires - Anope::CurTime;
++		if (timeleft > 172800 || !x->Expires)
++			timeleft = 172800;
++		UplinkSocket::Message(Config->ServerName) << "GLINE " << x->Mask << " " << timeleft << " :" << x->Reason << " (" << x->By << ")";
+ 	}
+ 
+-	void SendAkillDel(const XLine*) { }
++	void SendAkillDel(const XLine *x) {
++		UplinkSocket::Message(Config->ServerName) << "GLINE " << x->Mask;
++	}
+ 
+ 	void SendGlobopsInternal(const BotInfo *source, const Anope::string &buf)
+ 	{
+-- 
+1.7.8.3
+

+ 27 - 0
contrib/Anope/0015-ngircd-ngIRCd-supports-channel-mode-e-now.patch

@@ -0,0 +1,27 @@
+From 3a61b190db79848d4519296432ebb2ab714c42b7 Mon Sep 17 00:00:00 2001
+From: Alexander Barton <alex@barton.de>
+Date: Sun, 22 Jan 2012 19:06:34 +0100
+Subject: [PATCH 15/16] ngircd: ngIRCd supports channel mode 'e' now
+
+---
+ modules/protocol/ngircd.cpp |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index 3bc3812..0f87cbd 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -504,8 +504,9 @@ class ProtongIRCd : public Module
+ 		ModeManager::AddUserMode(new UserMode(UMODE_WALLOPS, 'w'));
+ 		ModeManager::AddUserMode(new UserMode(UMODE_CLOAK, 'x'));
+ 
+-		/* Add modes for ban and invite lists */
++		/* Add modes for ban, exception, and invite lists */
+ 		ModeManager::AddChannelMode(new ChannelModeList(CMODE_BAN, 'b'));
++		ModeManager::AddChannelMode(new ChannelModeList(CMODE_EXCEPT, 'e'));
+ 		ModeManager::AddChannelMode(new ChannelModeList(CMODE_INVITEOVERRIDE, 'I'));
+ 
+ 		/* Add channel user modes */
+-- 
+1.7.8.3
+

+ 35 - 0
contrib/Anope/0016-ngircd-support-SQUERY-command.patch

@@ -0,0 +1,35 @@
+From a7c48fcf47af757cf1b4eeaa6bcc96f4ae1f7410 Mon Sep 17 00:00:00 2001
+From: Alexander Barton <alex@barton.de>
+Date: Sat, 4 Feb 2012 11:13:36 +0100
+Subject: [PATCH 16/16] ngircd: support SQUERY command
+
+Thanks to DukePyrolator for explaining these changes to me.
+---
+ modules/protocol/ngircd.cpp |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index 0f87cbd..530686e 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -487,7 +487,7 @@ bool event_376(const Anope::string &source, const std::vector<Anope::string> &pa
+ class ProtongIRCd : public Module
+ {
+ 	Message message_kick, message_pass, message_njoin, message_chaninfo, message_005,
+-		message_442, message_376, message_pong;
++		message_442, message_376, message_pong, message_squery;
+ 
+ 	ngIRCdProto ircd_proto;
+ 	ngIRCdIRCdMessage ircd_message;
+@@ -532,7 +532,7 @@ class ProtongIRCd : public Module
+ 		message_kick("KICK", event_kick), message_pass("PASS", event_pass),
+ 		message_njoin("NJOIN", event_njoin), message_chaninfo("CHANINFO", event_chaninfo),
+ 		message_005("005", event_005), message_442("442", event_442), message_376("376", event_376),
+-		message_pong("PONG", event_pong)
++		message_pong("PONG", event_pong), message_squery("SQUERY", ::OnPrivmsg)
+ 	{
+ 		this->SetAuthor("Anope");
+ 
+-- 
+1.7.8.3
+

+ 15 - 1
contrib/Anope/Makefile.am

@@ -12,7 +12,21 @@
 EXTRA_DIST = \
 	README \
 	0001-Revert-Removed-ngircd.patch \
-	0002-ngircd-whitespace-fixes.patch
+	0002-ngircd-whitespace-fixes.patch \
+	0003-Update-ngIRCd-protocol-module-for-current-Anope-1.9.patch \
+	0004-ngircd-Do-PING-PONG-on-server-burst-to-sync-servers.patch \
+	0005-ngircd-always-prefix-modes-in-CHANINFO-with.patch \
+	0006-ngircd-support-user-mode-R-and-channel-mode-R.patch \
+	0007-ngircd-Fix-handling-of-JOIN-commands.patch \
+	0008-ngircd-Allow-setting-modes-by-clients-on-burst.patch \
+	0009-ngircd-Update-protocol-module-for-current-Anope-1.9.patch \
+	0010-ngircd-Add-ProtongIRCd.patch \
+	0011-ngircd-Update-protocol-module-for-current-Anope-1.9.patch \
+	0012-ngircd-Channel-mode-r-is-supported-now.patch \
+	0013-ngircd-Update-copyright-notice.patch \
+	0014-ngircd-set-unset-GLINE-s-on-AKILL-commands.patch \
+	0015-ngircd-ngIRCd-supports-channel-mode-e-now.patch \
+	0016-ngircd-support-SQUERY-command.patch
 
 maintainer-clean-local:
 	rm -f Makefile Makefile.in

+ 15 - 1
contrib/Anope/Makefile.in

@@ -169,7 +169,21 @@ top_srcdir = @top_srcdir@
 EXTRA_DIST = \
 	README \
 	0001-Revert-Removed-ngircd.patch \
-	0002-ngircd-whitespace-fixes.patch
+	0002-ngircd-whitespace-fixes.patch \
+	0003-Update-ngIRCd-protocol-module-for-current-Anope-1.9.patch \
+	0004-ngircd-Do-PING-PONG-on-server-burst-to-sync-servers.patch \
+	0005-ngircd-always-prefix-modes-in-CHANINFO-with.patch \
+	0006-ngircd-support-user-mode-R-and-channel-mode-R.patch \
+	0007-ngircd-Fix-handling-of-JOIN-commands.patch \
+	0008-ngircd-Allow-setting-modes-by-clients-on-burst.patch \
+	0009-ngircd-Update-protocol-module-for-current-Anope-1.9.patch \
+	0010-ngircd-Add-ProtongIRCd.patch \
+	0011-ngircd-Update-protocol-module-for-current-Anope-1.9.patch \
+	0012-ngircd-Channel-mode-r-is-supported-now.patch \
+	0013-ngircd-Update-copyright-notice.patch \
+	0014-ngircd-set-unset-GLINE-s-on-AKILL-commands.patch \
+	0015-ngircd-ngIRCd-supports-channel-mode-e-now.patch \
+	0016-ngircd-support-SQUERY-command.patch
 
 all: all-am
 

+ 6 - 0
contrib/Debian/changelog

@@ -1,3 +1,9 @@
+ngircd (19.1-0ab1) unstable; urgency=low
+
+  * New "upstream" release: ngIRCd 19.1.
+
+ -- Alexander Barton <alex@barton.de>  Mon, 19 Mar 2012 19:18:28 +0100
+
 ngircd (19-0ab1) unstable; urgency=low
 
   * New "upstream" release: ngIRCd 19.

+ 1 - 1
contrib/MacOSX/ngIRCd.pmdoc/index.xml

@@ -156,7 +156,7 @@ Each version is given a distinguishing version number.  If the Program specifies
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural
 
-\f0\fs26 \cf0 Please not:\
+\f0\fs26 \cf0 Please note:\
 \
 \pard\tx260\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li260\fi-260\ql\qnatural\pardirnatural
 \cf0 \'95	You 

+ 1 - 1
contrib/ngircd.spec

@@ -1,5 +1,5 @@
 %define name    ngircd
-%define version 19
+%define version 19.1
 %define release 1
 %define prefix  %{_prefix}
 

+ 3 - 3
man/ngircd.8.tmpl

@@ -1,7 +1,7 @@
 .\"
 .\" ngircd(8) manual page template
 .\"
-.TH ngircd 8 "Jul 2011" ngircd "ngIRCd Manual"
+.TH ngircd 8 "Mar 2012" ngircd "ngIRCd Manual"
 .SH NAME
 ngIRCd \- the next generation IRC daemon
 .SH SYNOPSIS
@@ -78,7 +78,7 @@ It's wise to use "ngircd \-\-configtest" to validate the configuration file
 after changing it.
 .SH DEBUGGING
 When ngIRCd is compiled with debug code, that is, its source code has
-been ./configure'd with "--enable-debug" and/or "--enable-sniffer" (witch
+been ./configure'd with "\-\-enable\-debug" and/or "\-\-enable\-sniffer" (witch
 enables debug mode automatically as well), you can use two more command
 line options and two more signals to debug problems with the daemon itself
 or IRC clients:
@@ -91,7 +91,7 @@ Enable debug mode and log extra messages.
 \fB\-s\fR, \fB\-\-sniffer\fR
 Enable IRC protocol sniffer, which logs all sent and received IRC commands to
 the console/syslog. This option requires that ngIRCd has been ./configure'd
-with "--enable-sniffer" and enables debug mode automatically, too.
+with "\-\-enable\-sniffer" and enables debug mode automatically, too.
 .PP
 \fBSignals:\fR
 .TP

+ 1 - 1
man/ngircd.conf.5.tmpl

@@ -1,7 +1,7 @@
 .\"
 .\" ngircd.conf(5) manual page template
 .\"
-.TH ngircd.conf 5 "Jun 2011" ngircd "ngIRCd Manual"
+.TH ngircd.conf 5 "Mar 2012" ngircd "ngIRCd Manual"
 .SH NAME
 ngircd.conf \- configuration file of ngIRCd
 .SH SYNOPSIS

+ 11 - 8
src/ngircd/conf.c

@@ -58,7 +58,7 @@ static int New_Server_Idx;
 static char Conf_MotdFile[FNAME_LEN];
 
 static void Set_Defaults PARAMS(( bool InitServers ));
-static bool Read_Config PARAMS(( bool ngircd_starting ));
+static bool Read_Config PARAMS(( bool TestOnly, bool IsStarting ));
 static bool Validate_Config PARAMS(( bool TestOnly, bool Rehash ));
 
 static void Handle_GLOBAL PARAMS(( int Line, char *Var, char *Arg ));
@@ -206,7 +206,7 @@ ports_parse(array *a, int Line, char *Arg)
 GLOBAL void
 Conf_Init( void )
 {
-	Read_Config( true );
+	Read_Config(false, true);
 	Validate_Config(false, false);
 }
 
@@ -218,7 +218,7 @@ Conf_Init( void )
 GLOBAL bool
 Conf_Rehash( void )
 {
-	if (!Read_Config(false))
+	if (!Read_Config(false, false))
 		return false;
 	Validate_Config(false, true);
 
@@ -299,7 +299,7 @@ Conf_Test( void )
 
 	Use_Log = false;
 
-	if (! Read_Config(true))
+	if (!Read_Config(true, true))
 		return 1;
 
 	config_valid = Validate_Config(true, false);
@@ -778,7 +778,7 @@ Read_Motd(const char *filename)
  *				successfully; false otherwise.
  */
 static bool
-Read_Config( bool ngircd_starting )
+Read_Config(bool TestOnly, bool IsStarting)
 {
 	char section[LINE_LEN], str[LINE_LEN], *var, *arg, *ptr;
 	const UINT16 defaultport = 6667;
@@ -792,16 +792,19 @@ Read_Config( bool ngircd_starting )
 		/* No configuration file found! */
 		Config_Error( LOG_ALERT, "Can't read configuration \"%s\": %s",
 					NGIRCd_ConfFile, strerror( errno ));
-		if (!ngircd_starting)
+		if (!IsStarting)
 			return false;
 		Config_Error( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME );
 		exit( 1 );
 	}
 
 	opers_free();
-	Set_Defaults( ngircd_starting );
+	Set_Defaults(IsStarting);
 
-	Config_Error( LOG_INFO, "Reading configuration from \"%s\" ...", NGIRCd_ConfFile );
+	if (TestOnly)
+		Config_Error(LOG_INFO,
+			     "Reading configuration from \"%s\" ...",
+			     NGIRCd_ConfFile );
 
 	/* Clean up server configuration structure: mark all already
 	 * configured servers as "once" so that they are deleted

+ 2 - 2
src/ngircd/conn.c

@@ -1589,7 +1589,7 @@ Read_Request( CONN_ID Idx )
 		if (!array_catb(&My_Connections[Idx].zip.rbuf, readbuf,
 				(size_t) len)) {
 			Log(LOG_ERR,
-			    "Could not append recieved data to zip input buffer (connection %d): %d bytes!",
+			    "Could not append received data to zip input buffer (connection %d): %d bytes!",
 			    Idx, len);
 			Conn_Close(Idx, "Receive buffer space exhausted", NULL,
 				   false);
@@ -1600,7 +1600,7 @@ Read_Request( CONN_ID Idx )
 	{
 		if (!array_catb( &My_Connections[Idx].rbuf, readbuf, len)) {
 			Log(LOG_ERR,
-			    "Could not append recieved data to input buffer (connection %d): %d bytes!",
+			    "Could not append received data to input buffer (connection %d): %d bytes!",
 			    Idx, len);
 			Conn_Close(Idx, "Receive buffer space exhausted", NULL, false );
 		}

+ 2 - 2
src/ngircd/irc-mode.c

@@ -856,7 +856,7 @@ Add_To_List(char what, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel,
 	    const char *Pattern)
 {
 	const char *mask;
-	struct list_head *list;
+	struct list_head *list = NULL;
 	long int current_count;
 
 	assert(Client != NULL);
@@ -923,7 +923,7 @@ Del_From_List(char what, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel,
 	      const char *Pattern)
 {
 	const char *mask;
-	struct list_head *list;
+	struct list_head *list = NULL;
 
 	assert(Client != NULL);
 	assert(Channel != NULL);

+ 6 - 3
src/ngircd/log.c

@@ -79,10 +79,12 @@ Log_Init(bool Daemon_Mode)
 #ifndef LOG_CONS     /* Kludge: mips-dec-ultrix4.5 has no LOG_CONS */
 #define LOG_CONS 0
 #endif
-	openlog(PACKAGE_NAME, LOG_CONS|LOG_PID, Conf_SyslogFacility);
+#ifdef LOG_DAEMON
+	openlog(PACKAGE_NAME, LOG_CONS|LOG_PID, LOG_DAEMON);
+#else
+	openlog(PACKAGE_NAME, LOG_CONS|LOG_PID, 0);
+#endif
 #endif
-
-	Log(LOG_NOTICE, "%s started.", NGIRCd_Version);
 } /* Log_Init */
 
 
@@ -100,6 +102,7 @@ Log_ReInit(void)
 	openlog(PACKAGE_NAME, LOG_CONS|LOG_PID, Conf_SyslogFacility);
 #endif
 	Log(LOG_NOTICE, "%s started.", NGIRCd_Version);
+	Log(LOG_INFO, "Using configuration file \"%s\" ...", NGIRCd_ConfFile);
 }
 
 

+ 2 - 0
src/testsuite/getpid.sh

@@ -13,6 +13,8 @@ elif [ $UNAME = "A/UX" ]; then
   PS_FLAGS="-ae"; PS_PIDCOL="1"; HEAD_FLAGS="-1"
 elif [ $UNAME = "GNU" ]; then
   PS_FLAGS="-ax"; PS_PIDCOL="2"; HEAD_FLAGS="-n 1"
+elif [ $UNAME = "Linux" ]; then
+  PS_FLAGS="ax"; PS_PIDCOL="1"; HEAD_FLAGS="-n 1"
 elif [ $UNAME = "SunOS" ]; then
   PS_FLAGS="-af"; PS_PIDCOL=2; HEAD_FLAGS="-n 1"
 else