Browse Source

Import upstream version 19.1

Alexander Barton 12 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 --
                                -- 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)
 ngIRCd Release 19 (2012-02-29)
 
 
   - Update build system: bump config.guess and config.sub files used by
   - Update build system: bump config.guess and config.sub files used by

+ 5 - 0
NEWS

@@ -9,6 +9,11 @@
                                   -- NEWS --
                                   -- 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 Release 19 (2012-02-29)
 
 
   ngIRCd 19~rc1 (2012-02-12)
   ngIRCd 19~rc1 (2012-02-12)

+ 10 - 10
configure

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

+ 15 - 1
contrib/Anope/Makefile.in

@@ -169,7 +169,21 @@ top_srcdir = @top_srcdir@
 EXTRA_DIST = \
 EXTRA_DIST = \
 	README \
 	README \
 	0001-Revert-Removed-ngircd.patch \
 	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
 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
 ngircd (19-0ab1) unstable; urgency=low
 
 
   * New "upstream" release: ngIRCd 19.
   * 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;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural
 \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
 \pard\tx260\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li260\fi-260\ql\qnatural\pardirnatural
 \cf0 \'95	You 
 \cf0 \'95	You 

+ 1 - 1
contrib/ngircd.spec

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

+ 3 - 3
man/ngircd.8.tmpl

@@ -1,7 +1,7 @@
 .\"
 .\"
 .\" ngircd(8) manual page template
 .\" ngircd(8) manual page template
 .\"
 .\"
-.TH ngircd 8 "Jul 2011" ngircd "ngIRCd Manual"
+.TH ngircd 8 "Mar 2012" ngircd "ngIRCd Manual"
 .SH NAME
 .SH NAME
 ngIRCd \- the next generation IRC daemon
 ngIRCd \- the next generation IRC daemon
 .SH SYNOPSIS
 .SH SYNOPSIS
@@ -78,7 +78,7 @@ It's wise to use "ngircd \-\-configtest" to validate the configuration file
 after changing it.
 after changing it.
 .SH DEBUGGING
 .SH DEBUGGING
 When ngIRCd is compiled with debug code, that is, its source code has
 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
 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
 line options and two more signals to debug problems with the daemon itself
 or IRC clients:
 or IRC clients:
@@ -91,7 +91,7 @@ Enable debug mode and log extra messages.
 \fB\-s\fR, \fB\-\-sniffer\fR
 \fB\-s\fR, \fB\-\-sniffer\fR
 Enable IRC protocol sniffer, which logs all sent and received IRC commands to
 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
 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
 .PP
 \fBSignals:\fR
 \fBSignals:\fR
 .TP
 .TP

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

@@ -1,7 +1,7 @@
 .\"
 .\"
 .\" ngircd.conf(5) manual page template
 .\" 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
 .SH NAME
 ngircd.conf \- configuration file of ngIRCd
 ngircd.conf \- configuration file of ngIRCd
 .SH SYNOPSIS
 .SH SYNOPSIS

+ 11 - 8
src/ngircd/conf.c

@@ -58,7 +58,7 @@ static int New_Server_Idx;
 static char Conf_MotdFile[FNAME_LEN];
 static char Conf_MotdFile[FNAME_LEN];
 
 
 static void Set_Defaults PARAMS(( bool InitServers ));
 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 bool Validate_Config PARAMS(( bool TestOnly, bool Rehash ));
 
 
 static void Handle_GLOBAL PARAMS(( int Line, char *Var, char *Arg ));
 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
 GLOBAL void
 Conf_Init( void )
 Conf_Init( void )
 {
 {
-	Read_Config( true );
+	Read_Config(false, true);
 	Validate_Config(false, false);
 	Validate_Config(false, false);
 }
 }
 
 
@@ -218,7 +218,7 @@ Conf_Init( void )
 GLOBAL bool
 GLOBAL bool
 Conf_Rehash( void )
 Conf_Rehash( void )
 {
 {
-	if (!Read_Config(false))
+	if (!Read_Config(false, false))
 		return false;
 		return false;
 	Validate_Config(false, true);
 	Validate_Config(false, true);
 
 
@@ -299,7 +299,7 @@ Conf_Test( void )
 
 
 	Use_Log = false;
 	Use_Log = false;
 
 
-	if (! Read_Config(true))
+	if (!Read_Config(true, true))
 		return 1;
 		return 1;
 
 
 	config_valid = Validate_Config(true, false);
 	config_valid = Validate_Config(true, false);
@@ -778,7 +778,7 @@ Read_Motd(const char *filename)
  *				successfully; false otherwise.
  *				successfully; false otherwise.
  */
  */
 static bool
 static bool
-Read_Config( bool ngircd_starting )
+Read_Config(bool TestOnly, bool IsStarting)
 {
 {
 	char section[LINE_LEN], str[LINE_LEN], *var, *arg, *ptr;
 	char section[LINE_LEN], str[LINE_LEN], *var, *arg, *ptr;
 	const UINT16 defaultport = 6667;
 	const UINT16 defaultport = 6667;
@@ -792,16 +792,19 @@ Read_Config( bool ngircd_starting )
 		/* No configuration file found! */
 		/* No configuration file found! */
 		Config_Error( LOG_ALERT, "Can't read configuration \"%s\": %s",
 		Config_Error( LOG_ALERT, "Can't read configuration \"%s\": %s",
 					NGIRCd_ConfFile, strerror( errno ));
 					NGIRCd_ConfFile, strerror( errno ));
-		if (!ngircd_starting)
+		if (!IsStarting)
 			return false;
 			return false;
 		Config_Error( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME );
 		Config_Error( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME );
 		exit( 1 );
 		exit( 1 );
 	}
 	}
 
 
 	opers_free();
 	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
 	/* Clean up server configuration structure: mark all already
 	 * configured servers as "once" so that they are deleted
 	 * 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,
 		if (!array_catb(&My_Connections[Idx].zip.rbuf, readbuf,
 				(size_t) len)) {
 				(size_t) len)) {
 			Log(LOG_ERR,
 			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);
 			    Idx, len);
 			Conn_Close(Idx, "Receive buffer space exhausted", NULL,
 			Conn_Close(Idx, "Receive buffer space exhausted", NULL,
 				   false);
 				   false);
@@ -1600,7 +1600,7 @@ Read_Request( CONN_ID Idx )
 	{
 	{
 		if (!array_catb( &My_Connections[Idx].rbuf, readbuf, len)) {
 		if (!array_catb( &My_Connections[Idx].rbuf, readbuf, len)) {
 			Log(LOG_ERR,
 			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);
 			    Idx, len);
 			Conn_Close(Idx, "Receive buffer space exhausted", NULL, false );
 			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 *Pattern)
 {
 {
 	const char *mask;
 	const char *mask;
-	struct list_head *list;
+	struct list_head *list = NULL;
 	long int current_count;
 	long int current_count;
 
 
 	assert(Client != NULL);
 	assert(Client != NULL);
@@ -923,7 +923,7 @@ Del_From_List(char what, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel,
 	      const char *Pattern)
 	      const char *Pattern)
 {
 {
 	const char *mask;
 	const char *mask;
-	struct list_head *list;
+	struct list_head *list = NULL;
 
 
 	assert(Client != NULL);
 	assert(Client != NULL);
 	assert(Channel != 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 */
 #ifndef LOG_CONS     /* Kludge: mips-dec-ultrix4.5 has no LOG_CONS */
 #define LOG_CONS 0
 #define LOG_CONS 0
 #endif
 #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
 #endif
-
-	Log(LOG_NOTICE, "%s started.", NGIRCd_Version);
 } /* Log_Init */
 } /* Log_Init */
 
 
 
 
@@ -100,6 +102,7 @@ Log_ReInit(void)
 	openlog(PACKAGE_NAME, LOG_CONS|LOG_PID, Conf_SyslogFacility);
 	openlog(PACKAGE_NAME, LOG_CONS|LOG_PID, Conf_SyslogFacility);
 #endif
 #endif
 	Log(LOG_NOTICE, "%s started.", NGIRCd_Version);
 	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"
   PS_FLAGS="-ae"; PS_PIDCOL="1"; HEAD_FLAGS="-1"
 elif [ $UNAME = "GNU" ]; then
 elif [ $UNAME = "GNU" ]; then
   PS_FLAGS="-ax"; PS_PIDCOL="2"; HEAD_FLAGS="-n 1"
   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
 elif [ $UNAME = "SunOS" ]; then
   PS_FLAGS="-af"; PS_PIDCOL=2; HEAD_FLAGS="-n 1"
   PS_FLAGS="-af"; PS_PIDCOL=2; HEAD_FLAGS="-n 1"
 else
 else