diff --git a/SOURCES/rsyslog-7.4.1-sd-service.patch b/SOURCES/rsyslog-7.4.1-sd-service.patch
index 69114ed..a9de3a3 100644
--- a/SOURCES/rsyslog-7.4.1-sd-service.patch
+++ b/SOURCES/rsyslog-7.4.1-sd-service.patch
@@ -1,13 +1,15 @@
 diff -up rsyslog-7.4.1/rsyslog.service.in.orig rsyslog-7.4.1/rsyslog.service.in
 --- rsyslog-7.4.1/rsyslog.service.in.orig	2013-06-17 15:28:54.430023493 +0200
 +++ rsyslog-7.4.1/rsyslog.service.in	2013-06-17 15:30:05.874378084 +0200
-@@ -4,7 +4,8 @@ Requires=syslog.socket
+@@ -4,7 +4,10 @@ Requires=syslog.socket
  
  [Service]
  Type=notify
 -ExecStart=@sbindir@/rsyslogd -n
 +EnvironmentFile=-/etc/sysconfig/rsyslog
 +ExecStart=@sbindir@/rsyslogd -n $SYSLOGD_OPTIONS
++Restart=on-failure
++UMask=0066
  StandardOutput=null
  
  [Install]
diff --git a/SOURCES/rsyslog-7.4.7-bz1053669-imuxsock-wrn.patch b/SOURCES/rsyslog-7.4.7-bz1053669-imuxsock-wrn.patch
deleted file mode 100644
index 9974cf6..0000000
--- a/SOURCES/rsyslog-7.4.7-bz1053669-imuxsock-wrn.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 8e0ac9576056a71dd7ad69157a94d56d433afbf6 Mon Sep 17 00:00:00 2001
-From: Tomas Heinrich <theinric@redhat.com>
-Date: Mon, 20 Jan 2014 16:23:17 +0100
-Subject: [PATCH] imuxsock: don't issue a warning if there are no sockets
- configured
-
----
- plugins/imuxsock/imuxsock.c | 8 ++++++++
- 1 file changed, 8 insertions(+)
-
-diff --git a/plugins/imuxsock/imuxsock.c b/plugins/imuxsock/imuxsock.c
-index df504dd..aadb853 100644
---- a/plugins/imuxsock/imuxsock.c
-+++ b/plugins/imuxsock/imuxsock.c
-@@ -1291,6 +1291,10 @@ CODESTARTactivateCnfPrePrivDrop
- 	for(inst = runModConf->root ; inst != NULL ; inst = inst->next) {
- 		addListner(inst);
- 	}
-+	if(runModConf->bOmitLocalLogging && nfd == 1) {
-+		/* No sockets were configured, no reason to run. */
-+		ABORT_FINALIZE(RS_RET_OK);
-+	}
- 	CHKiRet(activateListeners());
- finalize_it:
- ENDactivateCnfPrePrivDrop
-@@ -1329,6 +1333,10 @@ BEGINrunInput
- #endif
- 
- CODESTARTrunInput
-+	if(runModConf->bOmitLocalLogging && nfd == 1) {
-+		/* No sockets were configured, no reason to run. */
-+		ABORT_FINALIZE(RS_RET_OK);
-+	}
- 	/* this is an endless loop - it is terminated when the thread is
- 	 * signalled to do so. This, however, is handled by the framework,
- 	 * right into the sleep below.
--- 
-1.8.4.3
-
diff --git a/SOURCES/rsyslog-7.4.7-bz1254511-ppc64le_bug.patch b/SOURCES/rsyslog-7.4.7-bz1254511-ppc64le_bug.patch
new file mode 100644
index 0000000..ee9cbf2
--- /dev/null
+++ b/SOURCES/rsyslog-7.4.7-bz1254511-ppc64le_bug.patch
@@ -0,0 +1,13 @@
+diff -up ./config.guess.ppc64le_bug ./config.guess
+--- ./config.guess.ppc64le_bug	2015-08-18 16:19:31.354030831 +0200
++++ ./config.guess	2015-08-18 16:20:38.573473606 +0200
+@@ -972,6 +972,9 @@ EOF
+     ppc64:Linux:*:*)
+ 	echo powerpc64-unknown-linux-gnu
+ 	exit ;;
++    ppc64le:Linux:*:*)
++        echo powerpc64le-unknown-linux-gnu
++        exit ;;
+     ppc:Linux:*:*)
+ 	echo powerpc-unknown-linux-gnu
+ 	exit ;;
diff --git a/SOURCES/rsyslog-7.4.7-rhbz1078878-division-by-zero.patch b/SOURCES/rsyslog-7.4.7-rhbz1078878-division-by-zero.patch
new file mode 100644
index 0000000..834452e
--- /dev/null
+++ b/SOURCES/rsyslog-7.4.7-rhbz1078878-division-by-zero.patch
@@ -0,0 +1,75 @@
+From 0e95414ab2705649cea323115a618b558c30397f Mon Sep 17 00:00:00 2001
+From: Tomas Heinrich <theinric@redhat.com>
+Date: Wed, 2 Jul 2014 17:01:09 +0200
+Subject: [PATCH] bugfix: prevent division by zero
+
+The result is set to 0 in that case. Might be better to do something
+else in the future, but at least it'll stop crashing for now.
+---
+ grammar/rainerscript.c | 29 +++++++++++++++++++++++++----
+ 1 file changed, 25 insertions(+), 4 deletions(-)
+
+diff --git a/grammar/rainerscript.c b/grammar/rainerscript.c
+index 25d9c9a..c3365b1 100644
+--- a/grammar/rainerscript.c
++++ b/grammar/rainerscript.c
+@@ -1560,6 +1560,17 @@ evalStrArrayCmp(es_str_t *estr_l, struct cnfarray* ar, int cmpop)
+ 	ret->d.n = var2Number(&l, &convok_l) x var2Number(&r, &convok_r); \
+ 	FREE_BOTH_RET
+ 
++#define COMP_NUM_BINOP_DIV(x) \
++	cnfexprEval(expr->l, &l, usrptr); \
++	cnfexprEval(expr->r, &r, usrptr); \
++	ret->datatype = 'N'; \
++	if((ret->d.n = var2Number(&r, &convok_r)) == 0) { \
++		/* division by zero */ \
++	} else { \
++		ret->d.n = var2Number(&l, &convok_l) x ret->d.n; \
++	} \
++	FREE_BOTH_RET
++
+ /* NOTE: array as right-hand argument MUST be handled by user */
+ #define PREP_TWO_STRINGS \
+ 		cnfexprEval(expr->l, &l, usrptr); \
+@@ -1965,10 +1976,10 @@ cnfexprEval(struct cnfexpr *expr, struct var *ret, void* usrptr)
+ 		COMP_NUM_BINOP(*);
+ 		break;
+ 	case '/':
+-		COMP_NUM_BINOP(/);
++		COMP_NUM_BINOP_DIV(/);
+ 		break;
+ 	case '%':
+-		COMP_NUM_BINOP(%);
++		COMP_NUM_BINOP_DIV(%);
+ 		break;
+ 	case 'M':
+ 		cnfexprEval(expr->r, &r, usrptr);
+@@ -2907,13 +2918,23 @@ cnfexprOptimize(struct cnfexpr *expr)
+ 	case '/':
+ 		if(getConstNumber(expr, &ln, &rn))  {
+ 			expr->nodetype = 'N';
+-			((struct cnfnumval*)expr)->val = ln / rn;
++			if(rn == 0) {
++				/* division by zero */
++				((struct cnfnumval*)expr)->val = 0;
++			} else {
++				((struct cnfnumval*)expr)->val = ln / rn;
++			}
+ 		}
+ 		break;
+ 	case '%':
+ 		if(getConstNumber(expr, &ln, &rn))  {
+ 			expr->nodetype = 'N';
+-			((struct cnfnumval*)expr)->val = ln % rn;
++			if(rn == 0) {
++				/* division by zero */
++				((struct cnfnumval*)expr)->val = 0;
++			} else {
++				((struct cnfnumval*)expr)->val = ln % rn;
++			}
+ 		}
+ 		break;
+ 	case CMP_NE:
+-- 
+1.9.3
+
diff --git a/SOURCES/rsyslog-7.4.7-rhbz1101602-imjournal-zero-bytes.patch b/SOURCES/rsyslog-7.4.7-rhbz1101602-imjournal-zero-bytes.patch
new file mode 100644
index 0000000..c73d8c5
--- /dev/null
+++ b/SOURCES/rsyslog-7.4.7-rhbz1101602-imjournal-zero-bytes.patch
@@ -0,0 +1,175 @@
+From 3d7abc2131bcf4dd2dc21428ea2c7fee6dd7be94 Mon Sep 17 00:00:00 2001
+From: Tomas Heinrich <theinric@redhat.com>
+Date: Fri, 1 Aug 2014 13:58:10 +0200
+Subject: [PATCH] imjournal: escape zero bytes in fields' values
+
+---
+ plugins/imjournal/imjournal.c | 86 +++++++++++++++++++++++--------------------
+ 1 file changed, 46 insertions(+), 40 deletions(-)
+
+diff --git a/plugins/imjournal/imjournal.c b/plugins/imjournal/imjournal.c
+index b0b034c..b6910e8 100755
+--- a/plugins/imjournal/imjournal.c
++++ b/plugins/imjournal/imjournal.c
+@@ -135,6 +135,31 @@ static rsRetVal facilityHdlr(uchar **pp, void *pVal)
+ }
+ 
+ 
++/* Currently just replaces '\0' with ' '. Not doing so would cause
++ * the value to be truncated. New space is allocated for the resulting
++ * string.
++ */
++static rsRetVal
++sanitizeValue(const char *in, size_t len, char **out)
++{
++	char *buf, *p;
++	DEFiRet;
++
++	CHKmalloc(p = buf = malloc(len + 1));
++	memcpy(buf, in, len);
++	buf[len] = '\0';
++
++	while ((p = memchr(p, '\0', len + buf - p)) != NULL) {
++		*p++ = ' ';
++	}
++
++	*out = buf;
++
++finalize_it:
++	RETiRet;
++}
++
++
+ /* enqueue the the journal message into the message queue.
+  * The provided msg string is not freed - thus must be done
+  * by the caller.
+@@ -195,10 +220,9 @@ readjournal() {
+ 	int r;
+ 
+ 	/* Information from messages */
+-	char *message;
+-	char *sys_pid;
++	char *message = NULL;
+ 	char *sys_iden;
+-	char *sys_iden_help;
++	char *sys_iden_help = NULL;
+ 
+ 	const void *get;
+ 	const void *pidget;
+@@ -208,8 +232,6 @@ readjournal() {
+ 
+ 	const void *equal_sign;
+ 	struct json_object *jval;
+-	char *data;
+-	char *name;
+ 	size_t l;
+ 
+ 	long prefixlen = 0;
+@@ -221,11 +243,7 @@ readjournal() {
+ 	if (sd_journal_get_data(j, "MESSAGE", &get, &length) < 0) {
+ 		message = strdup("");
+ 	} else {
+-		message = strndup(get+8, length-8);
+-		if (message == NULL) {
+-			iRet = RS_RET_OUT_OF_MEMORY;
+-			goto ret;
+-		}
++		CHKiRet(sanitizeValue(((const char *)get) + 8, length - 8, &message));
+ 	}
+ 
+ 	/* Get message severity ("priority" in journald's terminology) */
+@@ -264,43 +282,36 @@ readjournal() {
+ 
+ 	/* Get message identifier, client pid and add ':' */
+ 	if (sd_journal_get_data(j, "SYSLOG_IDENTIFIER", &get, &length) >= 0) {
+-		sys_iden = strndup(get+18, length-18);
++		CHKiRet(sanitizeValue(((const char *)get) + 18, length - 18, &sys_iden));
+ 	} else {
+-		sys_iden = strdup("journal");
+-	}
+-	if (sys_iden == NULL) {
+-		iRet = RS_RET_OUT_OF_MEMORY;
+-		goto free_message;
++		CHKmalloc(sys_iden = strdup("journal"));
+ 	}
+ 
+ 	if (sd_journal_get_data(j, "SYSLOG_PID", &pidget, &pidlength) >= 0) {
+-		sys_pid = strndup(pidget+11, pidlength-11);
+-		if (sys_pid == NULL) {
+-			iRet = RS_RET_OUT_OF_MEMORY;
++		char *sys_pid;
++
++		CHKiRet_Hdlr(sanitizeValue(((const char *)pidget) + 11, pidlength - 11, &sys_pid)) {
+ 			free (sys_iden);
+-			goto free_message;
++			FINALIZE;
+ 		}
+-	} else {
+-		sys_pid = NULL;
+-	}
+-
+-	if (sys_pid) {
+ 		r = asprintf(&sys_iden_help, "%s[%s]:", sys_iden, sys_pid);
++		free (sys_pid);
+ 	} else {
+ 		r = asprintf(&sys_iden_help, "%s:", sys_iden);
+ 	}
+ 
+ 	free (sys_iden);
+-	free (sys_pid);
+ 
+ 	if (-1 == r) {
+-		iRet = RS_RET_OUT_OF_MEMORY;
+-		goto finalize_it;
++		ABORT_FINALIZE(RS_RET_OUT_OF_MEMORY);
+ 	}
+ 
+ 	json = json_object_new_object();
+ 
+ 	SD_JOURNAL_FOREACH_DATA(j, get, l) {
++		char *data;
++		char *name;
++
+ 		/* locate equal sign, this is always present */
+ 		equal_sign = memchr(get, '=', l);
+ 
+@@ -372,18 +383,13 @@ readjournal() {
+ 			break;
+ 		}
+ 
+-		if (name == NULL) {
+-			iRet = RS_RET_OUT_OF_MEMORY;
+-			goto ret;
+-		}
++		CHKmalloc(name);
+ 
+ 		prefixlen++; /* remove '=' */
+ 
+-		data = strndup(get + prefixlen, l - prefixlen);
+-		if (data == NULL) {
+-			iRet = RS_RET_OUT_OF_MEMORY;
++		CHKiRet_Hdlr(sanitizeValue(((const char *)get) + prefixlen, l - prefixlen, &data)) {
+ 			free (name);
+-			goto ret;
++			FINALIZE;
+ 		}
+ 
+ 		/* and save them to json object */
+@@ -403,10 +409,10 @@ readjournal() {
+ 	enqMsg((uchar *)message, (uchar *) sys_iden_help, facility, severity, &tv, json);
+ 
+ finalize_it:
+-	free(sys_iden_help);
+-free_message:
+-	free(message);
+-ret:
++	if (sys_iden_help != NULL)
++		free(sys_iden_help);
++	if (message != NULL)
++		free(message);
+ 	RETiRet;
+ }
+ 
+-- 
+1.9.3
+
diff --git a/SOURCES/rsyslog-7.4.7-rhbz1143846-clarify-SysSock.Use.patch b/SOURCES/rsyslog-7.4.7-rhbz1143846-clarify-SysSock.Use.patch
new file mode 100644
index 0000000..19762fd
--- /dev/null
+++ b/SOURCES/rsyslog-7.4.7-rhbz1143846-clarify-SysSock.Use.patch
@@ -0,0 +1,36 @@
+From 9ee4d67c9c833e746ec8b2e5abff03a184eb6b4c Mon Sep 17 00:00:00 2001
+From: Tomas Heinrich <theinric@redhat.com>
+Date: Tue, 21 Jul 2015 17:50:22 +0200
+Subject: [PATCH] Clarify usage of the SysSock.Use option
+
+---
+ doc/imuxsock.html | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/doc/imuxsock.html b/doc/imuxsock.html
+index 123771f..c70f720 100644
+--- a/doc/imuxsock.html
++++ b/doc/imuxsock.html
+@@ -71,8 +71,8 @@ is no reason to receive messages from ourselfs. This setting is vital
+ when writing messages to the Linux journal. See <a href="omjournal.html">omjournal</a>
+ module documentation for a more in-depth description.
+ </li>
+-<li><b>SysSock.Use</b> (imuxsock) [on/<b>off</b>] 
+-do NOT listen for the local log socket. This is most useful if you run multiple
++<li><b>SysSock.Use</b> (imuxsock) [<b>on</b>/off] 
++Listen on the local log socket. This is most useful if you run multiple
+ instances of rsyslogd where only one shall handle the system log socket.
+ </li>
+ <li><b>SysSock.Name</b> &lt;name-of-socket&gt; 
+@@ -259,7 +259,7 @@ the default of "127.0.0.1" is used.
+ <li><b>$InputUnixListenSocketUseSysTimeStamp</b> [<b>on</b>/off] equivalent to: UseSysTimeStamp .<br>
+ <li><b>$SystemLogSocketIgnoreMsgTimestamp</b> [<b>on</b>/off]<br>
+ equivalent to: SysSock.IgnoreTimestamp.</li>
+-<li><b>$OmitLocalLogging</b> (imuxsock) [on/<b>off</b>] equivalent to: SysSock.Use</li>
++<li><b>$OmitLocalLogging</b> (imuxsock) [on/<b>off</b>] - The <b>inverse</b> of: SysSock.Use.</li>
+ <li><b>$SystemLogSocketName</b> &lt;name-of-socket&gt; equivalent to: SysSock.Name</li>
+ <li><b>$SystemLogFlowControl</b> [on/<b>off</b>] - equivalent to: SysSock.FlowControl.</li>
+ <li><b>$SystemLogUsePIDFromSystem</b> [on/<b>off</b>] - equivalent to: SysSock.UsePIDFromSystem.
+-- 
+1.9.3
+
diff --git a/SOURCES/rsyslog-7.4.7-rhbz1151037-add-mmcount.patch b/SOURCES/rsyslog-7.4.7-rhbz1151037-add-mmcount.patch
new file mode 100644
index 0000000..dbb6ce1
--- /dev/null
+++ b/SOURCES/rsyslog-7.4.7-rhbz1151037-add-mmcount.patch
@@ -0,0 +1,1179 @@
+diff -Npru a/Makefile.in b/Makefile.in
+--- a/Makefile.in	2015-07-07 15:45:08.144516940 +0200
++++ b/Makefile.in	2015-07-07 15:42:47.027059036 +0200
+@@ -85,8 +85,9 @@ sbin_PROGRAMS =
+ @ENABLE_MMJSONPARSE_TRUE@am__append_42 = plugins/mmjsonparse
+ @ENABLE_MMAUDIT_TRUE@am__append_43 = plugins/mmaudit
+ @ENABLE_MMANON_TRUE@am__append_44 = plugins/mmanon
+-@ENABLE_ORACLE_TRUE@am__append_45 = plugins/omoracle
+-@ENABLE_GUI_TRUE@am__append_46 = java
++@ENABLE_MMCOUNT_TRUE@am__append_45 = plugins/mmcount
++@ENABLE_ORACLE_TRUE@am__append_46 = plugins/omoracle
++@ENABLE_GUI_TRUE@am__append_47 = java
+ subdir = .
+ DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
+ 	$(srcdir)/Makefile.in $(srcdir)/config.h.in \
+@@ -231,7 +232,7 @@ DIST_SUBDIRS = doc compat runtime gramma
+ 	plugins/imptcp plugins/imttcp plugins/imdiag plugins/ommail \
+ 	plugins/omprog plugins/im3195 plugins/mmnormalize \
+ 	plugins/mmjsonparse plugins/mmaudit plugins/mmanon \
+-	plugins/omoracle java tests
++	plugins/mmcount plugins/omoracle java tests
+ DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ distdir = $(PACKAGE)-$(VERSION)
+ top_distdir = $(distdir)
+@@ -532,7 +533,7 @@ SUBDIRS = doc compat runtime grammar . p
+ 	$(am__append_37) $(am__append_38) $(am__append_39) \
+ 	$(am__append_40) $(am__append_41) $(am__append_42) \
+ 	$(am__append_43) $(am__append_44) $(am__append_45) \
+-	$(am__append_46) tests
++	$(am__append_46) $(am__append_47) tests
+ 
+ # make sure "make distcheck" tries to build all modules. This means that
+ # a developer must always have an environment where every supporting library
+diff -Npru a/configure b/configure
+--- a/configure	2015-07-07 15:45:08.149516991 +0200
++++ b/configure	2015-07-07 15:42:47.036059129 +0200
+@@ -690,6 +690,8 @@ ENABLE_RELP_FALSE
+ ENABLE_RELP_TRUE
+ RELP_LIBS
+ RELP_CFLAGS
++ENABLE_MMCOUNT_FALSE
++ENABLE_MMCOUNT_TRUE
+ ENABLE_MMANON_FALSE
+ ENABLE_MMANON_TRUE
+ ENABLE_MMAUDIT_FALSE
+@@ -977,6 +979,7 @@ enable_mmnormalize
+ enable_mmjsonparse
+ enable_mmaudit
+ enable_mmanon
++enable_mmcount
+ enable_relp
+ enable_guardtime
+ enable_cached_man_pages
+@@ -1722,6 +1725,7 @@ Optional Features:
+   --enable-mmjsonparse    Enable building mmjsonparse support [default=no]
+   --enable-mmaudit        Enable building mmaudit support [default=no]
+   --enable-mmanon         Enable building mmanon support [default=no]
++  --enable-mmcount        Enable message counting [default=no]
+   --enable-relp           Enable RELP support [default=no]
+   --enable-guardtime      Enable log file signing support (via GuardTime)
+                           [default=no]
+@@ -18311,6 +18315,29 @@ fi
+ 
+ 
+ 
++# mmcount
++# Check whether --enable-mmcount was given.
++if test "${enable_mmcount+set}" = set; then :
++  enableval=$enable_mmcount; case "${enableval}" in
++         yes) enable_mmcount="yes" ;;
++          no) enable_mmcount="no" ;;
++           *) as_fn_error $? "bad value ${enableval} for --enable-mmcount" "$LINENO" 5 ;;
++         esac
++else
++  enable_mmcount=no
++
++fi
++
++ if test x$enable_mmcount = xyes; then
++  ENABLE_MMCOUNT_TRUE=
++  ENABLE_MMCOUNT_FALSE='#'
++else
++  ENABLE_MMCOUNT_TRUE='#'
++  ENABLE_MMCOUNT_FALSE=
++fi
++
++
++
+ # RELP support
+ # Check whether --enable-relp was given.
+ if test "${enable_relp+set}" = set; then :
+@@ -19974,7 +20001,7 @@ fi
+ 
+ # END HIREDIS SUPPORT
+ 
+-ac_config_files="$ac_config_files Makefile runtime/Makefile compat/Makefile grammar/Makefile tools/Makefile doc/Makefile plugins/imudp/Makefile plugins/imtcp/Makefile plugins/im3195/Makefile plugins/imgssapi/Makefile plugins/imuxsock/Makefile plugins/imjournal/Makefile plugins/immark/Makefile plugins/imklog/Makefile plugins/imkmsg/Makefile plugins/omhdfs/Makefile plugins/omprog/Makefile plugins/omstdout/Makefile plugins/omjournal/Makefile plugins/pmrfc3164sd/Makefile plugins/pmlastmsg/Makefile plugins/pmcisconames/Makefile plugins/pmsnare/Makefile plugins/pmaixforwardedfrom/Makefile plugins/omruleset/Makefile plugins/omuxsock/Makefile plugins/imfile/Makefile plugins/imsolaris/Makefile plugins/imptcp/Makefile plugins/imttcp/Makefile plugins/impstats/Makefile plugins/imrelp/Makefile plugins/imdiag/Makefile plugins/imzmq3/Makefile plugins/omtesting/Makefile plugins/omgssapi/Makefile plugins/ommysql/Makefile plugins/ompgsql/Makefile plugins/omrelp/Makefile plugins/omlibdbi/Makefile plugins/ommail/Makefile plugins/omsnmp/Makefile plugins/omoracle/Makefile plugins/omudpspoof/Makefile plugins/ommongodb/Makefile plugins/omhiredis/Makefile plugins/omzmq3/Makefile plugins/omrabbitmq/Makefile plugins/mmnormalize/Makefile plugins/mmjsonparse/Makefile plugins/mmaudit/Makefile plugins/mmanon/Makefile plugins/omelasticsearch/Makefile plugins/sm_cust_bindcdr/Makefile plugins/mmsnmptrapd/Makefile java/Makefile tests/Makefile"
++ac_config_files="$ac_config_files Makefile runtime/Makefile compat/Makefile grammar/Makefile tools/Makefile doc/Makefile plugins/imudp/Makefile plugins/imtcp/Makefile plugins/im3195/Makefile plugins/imgssapi/Makefile plugins/imuxsock/Makefile plugins/imjournal/Makefile plugins/immark/Makefile plugins/imklog/Makefile plugins/imkmsg/Makefile plugins/omhdfs/Makefile plugins/omprog/Makefile plugins/omstdout/Makefile plugins/omjournal/Makefile plugins/pmrfc3164sd/Makefile plugins/pmlastmsg/Makefile plugins/pmcisconames/Makefile plugins/pmsnare/Makefile plugins/pmaixforwardedfrom/Makefile plugins/omruleset/Makefile plugins/omuxsock/Makefile plugins/imfile/Makefile plugins/imsolaris/Makefile plugins/imptcp/Makefile plugins/imttcp/Makefile plugins/impstats/Makefile plugins/imrelp/Makefile plugins/imdiag/Makefile plugins/imzmq3/Makefile plugins/omtesting/Makefile plugins/omgssapi/Makefile plugins/ommysql/Makefile plugins/ompgsql/Makefile plugins/omrelp/Makefile plugins/omlibdbi/Makefile plugins/ommail/Makefile plugins/omsnmp/Makefile plugins/omoracle/Makefile plugins/omudpspoof/Makefile plugins/ommongodb/Makefile plugins/omhiredis/Makefile plugins/omzmq3/Makefile plugins/omrabbitmq/Makefile plugins/mmnormalize/Makefile plugins/mmjsonparse/Makefile plugins/mmaudit/Makefile plugins/mmanon/Makefile plugins/omelasticsearch/Makefile plugins/sm_cust_bindcdr/Makefile plugins/mmsnmptrapd/Makefile plugins/mmcount/Makefile java/Makefile tests/Makefile"
+ 
+ cat >confcache <<\_ACEOF
+ # This file is a shell script that caches the results of configure
+@@ -20241,6 +20291,10 @@ if test -z "${ENABLE_MMANON_TRUE}" && te
+   as_fn_error $? "conditional \"ENABLE_MMANON\" was never defined.
+ Usually this means the macro was only invoked conditionally." "$LINENO" 5
+ fi
++if test -z "${ENABLE_MMCOUNT_TRUE}" && test -z "${ENABLE_MMCOUNT_FALSE}"; then
++  as_fn_error $? "conditional \"ENABLE_MMCOUNT\" was never defined.
++Usually this means the macro was only invoked conditionally." "$LINENO" 5
++fi
+ if test -z "${ENABLE_RELP_TRUE}" && test -z "${ENABLE_RELP_FALSE}"; then
+   as_fn_error $? "conditional \"ENABLE_RELP\" was never defined.
+ Usually this means the macro was only invoked conditionally." "$LINENO" 5
+@@ -21296,6 +21327,7 @@ do
+     "plugins/omelasticsearch/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/omelasticsearch/Makefile" ;;
+     "plugins/sm_cust_bindcdr/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/sm_cust_bindcdr/Makefile" ;;
+     "plugins/mmsnmptrapd/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/mmsnmptrapd/Makefile" ;;
++    "plugins/mmcount/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/mmcount/Makefile" ;;
+     "java/Makefile") CONFIG_FILES="$CONFIG_FILES java/Makefile" ;;
+     "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
+ 
+@@ -22673,6 +22705,7 @@ echo "    uuid support enabled:
+ echo "    Log file signing support:                 $enable_guardtime"
+ echo "    Log file encryption support:              $enable_libgcrypt"
+ echo "    anonymization support enabled:            $enable_mmanon"
++echo "    message counting support enabled:         $enable_mmcount"
+ echo
+ echo "---{ input plugins }---"
+ echo "    Klog functionality enabled:               $enable_klog ($os_type)"
+diff -Npru a/plugins/mmcount/Makefile.in b/plugins/mmcount/Makefile.in
+--- a/plugins/mmcount/Makefile.in	1970-01-01 01:00:00.000000000 +0100
++++ b/plugins/mmcount/Makefile.in	2015-07-07 15:42:47.057059346 +0200
+@@ -0,0 +1,702 @@
++# Makefile.in generated by automake 1.13.4 from Makefile.am.
++# @configure_input@
++
++# Copyright (C) 1994-2013 Free Software Foundation, Inc.
++
++# This Makefile.in is free software; the Free Software Foundation
++# gives unlimited permission to copy and/or distribute it,
++# with or without modifications, as long as this notice is preserved.
++
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
++# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
++# PARTICULAR PURPOSE.
++
++@SET_MAKE@
++
++VPATH = @srcdir@
++am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
++am__make_running_with_option = \
++  case $${target_option-} in \
++      ?) ;; \
++      *) echo "am__make_running_with_option: internal error: invalid" \
++              "target option '$${target_option-}' specified" >&2; \
++         exit 1;; \
++  esac; \
++  has_opt=no; \
++  sane_makeflags=$$MAKEFLAGS; \
++  if $(am__is_gnu_make); then \
++    sane_makeflags=$$MFLAGS; \
++  else \
++    case $$MAKEFLAGS in \
++      *\\[\ \	]*) \
++        bs=\\; \
++        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
++          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
++    esac; \
++  fi; \
++  skip_next=no; \
++  strip_trailopt () \
++  { \
++    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
++  }; \
++  for flg in $$sane_makeflags; do \
++    test $$skip_next = yes && { skip_next=no; continue; }; \
++    case $$flg in \
++      *=*|--*) continue;; \
++        -*I) strip_trailopt 'I'; skip_next=yes;; \
++      -*I?*) strip_trailopt 'I';; \
++        -*O) strip_trailopt 'O'; skip_next=yes;; \
++      -*O?*) strip_trailopt 'O';; \
++        -*l) strip_trailopt 'l'; skip_next=yes;; \
++      -*l?*) strip_trailopt 'l';; \
++      -[dEDm]) skip_next=yes;; \
++      -[JT]) skip_next=yes;; \
++    esac; \
++    case $$flg in \
++      *$$target_option*) has_opt=yes; break;; \
++    esac; \
++  done; \
++  test $$has_opt = yes
++am__make_dryrun = (target_option=n; $(am__make_running_with_option))
++am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
++pkgdatadir = $(datadir)/@PACKAGE@
++pkgincludedir = $(includedir)/@PACKAGE@
++pkglibdir = $(libdir)/@PACKAGE@
++pkglibexecdir = $(libexecdir)/@PACKAGE@
++am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
++install_sh_DATA = $(install_sh) -c -m 644
++install_sh_PROGRAM = $(install_sh) -c
++install_sh_SCRIPT = $(install_sh) -c
++INSTALL_HEADER = $(INSTALL_DATA)
++transform = $(program_transform_name)
++NORMAL_INSTALL = :
++PRE_INSTALL = :
++POST_INSTALL = :
++NORMAL_UNINSTALL = :
++PRE_UNINSTALL = :
++POST_UNINSTALL = :
++build_triplet = @build@
++host_triplet = @host@
++subdir = plugins/mmcount
++DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
++	$(top_srcdir)/depcomp
++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
++am__aclocal_m4_deps = $(top_srcdir)/m4/atomic_operations.m4 \
++	$(top_srcdir)/m4/atomic_operations_64bit.m4 \
++	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
++	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
++	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
++am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
++	$(ACLOCAL_M4)
++mkinstalldirs = $(install_sh) -d
++CONFIG_HEADER = $(top_builddir)/config.h
++CONFIG_CLEAN_FILES =
++CONFIG_CLEAN_VPATH_FILES =
++am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
++am__vpath_adj = case $$p in \
++    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
++    *) f=$$p;; \
++  esac;
++am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
++am__install_max = 40
++am__nobase_strip_setup = \
++  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
++am__nobase_strip = \
++  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
++am__nobase_list = $(am__nobase_strip_setup); \
++  for p in $$list; do echo "$$p $$p"; done | \
++  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
++  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
++    if (++n[$$2] == $(am__install_max)) \
++      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
++    END { for (dir in files) print dir, files[dir] }'
++am__base_list = \
++  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
++  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
++am__uninstall_files_from_dir = { \
++  test -z "$$files" \
++    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
++    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
++         $(am__cd) "$$dir" && rm -f $$files; }; \
++  }
++am__installdirs = "$(DESTDIR)$(pkglibdir)"
++LTLIBRARIES = $(pkglib_LTLIBRARIES)
++mmcount_la_DEPENDENCIES =
++am_mmcount_la_OBJECTS = mmcount_la-mmcount.lo
++mmcount_la_OBJECTS = $(am_mmcount_la_OBJECTS)
++AM_V_lt = $(am__v_lt_@AM_V@)
++am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
++am__v_lt_0 = --silent
++am__v_lt_1 = 
++mmcount_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
++	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
++	$(mmcount_la_LDFLAGS) $(LDFLAGS) -o $@
++AM_V_P = $(am__v_P_@AM_V@)
++am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
++am__v_P_0 = false
++am__v_P_1 = :
++AM_V_GEN = $(am__v_GEN_@AM_V@)
++am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
++am__v_GEN_0 = @echo "  GEN     " $@;
++am__v_GEN_1 = 
++AM_V_at = $(am__v_at_@AM_V@)
++am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
++am__v_at_0 = @
++am__v_at_1 = 
++DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
++depcomp = $(SHELL) $(top_srcdir)/depcomp
++am__depfiles_maybe = depfiles
++am__mv = mv -f
++COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
++	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
++LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
++	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
++	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
++	$(AM_CFLAGS) $(CFLAGS)
++AM_V_CC = $(am__v_CC_@AM_V@)
++am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
++am__v_CC_0 = @echo "  CC      " $@;
++am__v_CC_1 = 
++CCLD = $(CC)
++LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
++	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
++	$(AM_LDFLAGS) $(LDFLAGS) -o $@
++AM_V_CCLD = $(am__v_CCLD_@AM_V@)
++am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
++am__v_CCLD_0 = @echo "  CCLD    " $@;
++am__v_CCLD_1 = 
++SOURCES = $(mmcount_la_SOURCES)
++DIST_SOURCES = $(mmcount_la_SOURCES)
++am__can_run_installinfo = \
++  case $$AM_UPDATE_INFO_DIR in \
++    n|no|NO) false;; \
++    *) (install-info --version) >/dev/null 2>&1;; \
++  esac
++am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
++# Read a list of newline-separated strings from the standard input,
++# and print each of them once, without duplicates.  Input order is
++# *not* preserved.
++am__uniquify_input = $(AWK) '\
++  BEGIN { nonempty = 0; } \
++  { items[$$0] = 1; nonempty = 1; } \
++  END { if (nonempty) { for (i in items) print i; }; } \
++'
++# Make sure the list of sources is unique.  This is necessary because,
++# e.g., the same source file might be shared among _SOURCES variables
++# for different programs/libraries.
++am__define_uniq_tagged_files = \
++  list='$(am__tagged_files)'; \
++  unique=`for i in $$list; do \
++    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
++  done | $(am__uniquify_input)`
++ETAGS = etags
++CTAGS = ctags
++DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
++ACLOCAL = @ACLOCAL@
++AMTAR = @AMTAR@
++AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
++AR = @AR@
++AUTOCONF = @AUTOCONF@
++AUTOHEADER = @AUTOHEADER@
++AUTOMAKE = @AUTOMAKE@
++AWK = @AWK@
++CC = @CC@
++CCDEPMODE = @CCDEPMODE@
++CFLAGS = @CFLAGS@
++CPP = @CPP@
++CPPFLAGS = @CPPFLAGS@
++CURL_CFLAGS = @CURL_CFLAGS@
++CURL_LIBS = @CURL_LIBS@
++CYGPATH_W = @CYGPATH_W@
++CZMQ_CFLAGS = @CZMQ_CFLAGS@
++CZMQ_LIBS = @CZMQ_LIBS@
++DEFS = @DEFS@
++DEPDIR = @DEPDIR@
++DLLTOOL = @DLLTOOL@
++DL_LIBS = @DL_LIBS@
++DSYMUTIL = @DSYMUTIL@
++DUMPBIN = @DUMPBIN@
++ECHO_C = @ECHO_C@
++ECHO_N = @ECHO_N@
++ECHO_T = @ECHO_T@
++EGREP = @EGREP@
++EXEEXT = @EXEEXT@
++FGREP = @FGREP@
++GNUTLS_CFLAGS = @GNUTLS_CFLAGS@
++GNUTLS_LIBS = @GNUTLS_LIBS@
++GREP = @GREP@
++GSS_LIBS = @GSS_LIBS@
++GUARDTIME_CFLAGS = @GUARDTIME_CFLAGS@
++GUARDTIME_LIBS = @GUARDTIME_LIBS@
++HAVE_LIBGCRYPT_CONFIG = @HAVE_LIBGCRYPT_CONFIG@
++HAVE_MYSQL_CONFIG = @HAVE_MYSQL_CONFIG@
++HAVE_ORACLE_CONFIG = @HAVE_ORACLE_CONFIG@
++HAVE_PGSQL_CONFIG = @HAVE_PGSQL_CONFIG@
++HIREDIS_CFLAGS = @HIREDIS_CFLAGS@
++HIREDIS_LIBS = @HIREDIS_LIBS@
++IMUDP_LIBS = @IMUDP_LIBS@
++INSTALL = @INSTALL@
++INSTALL_DATA = @INSTALL_DATA@
++INSTALL_PROGRAM = @INSTALL_PROGRAM@
++INSTALL_SCRIPT = @INSTALL_SCRIPT@
++INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
++JSON_C_CFLAGS = @JSON_C_CFLAGS@
++JSON_C_LIBS = @JSON_C_LIBS@
++LD = @LD@
++LDFLAGS = @LDFLAGS@
++LEX = @LEX@
++LEXLIB = @LEXLIB@
++LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
++LIBDBI_CFLAGS = @LIBDBI_CFLAGS@
++LIBDBI_LIBS = @LIBDBI_LIBS@
++LIBEE_CFLAGS = @LIBEE_CFLAGS@
++LIBEE_LIBS = @LIBEE_LIBS@
++LIBESTR_CFLAGS = @LIBESTR_CFLAGS@
++LIBESTR_LIBS = @LIBESTR_LIBS@
++LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
++LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
++LIBLOGGING_CFLAGS = @LIBLOGGING_CFLAGS@
++LIBLOGGING_LIBS = @LIBLOGGING_LIBS@
++LIBLOGNORM_CFLAGS = @LIBLOGNORM_CFLAGS@
++LIBLOGNORM_LIBS = @LIBLOGNORM_LIBS@
++LIBM = @LIBM@
++LIBMONGO_CLIENT_CFLAGS = @LIBMONGO_CLIENT_CFLAGS@
++LIBMONGO_CLIENT_LIBS = @LIBMONGO_CLIENT_LIBS@
++LIBOBJS = @LIBOBJS@
++LIBS = @LIBS@
++LIBSYSTEMD_JOURNAL_CFLAGS = @LIBSYSTEMD_JOURNAL_CFLAGS@
++LIBSYSTEMD_JOURNAL_LIBS = @LIBSYSTEMD_JOURNAL_LIBS@
++LIBTOOL = @LIBTOOL@
++LIBUUID_CFLAGS = @LIBUUID_CFLAGS@
++LIBUUID_LIBS = @LIBUUID_LIBS@
++LIPO = @LIPO@
++LN_S = @LN_S@
++LTLIBOBJS = @LTLIBOBJS@
++MAKEINFO = @MAKEINFO@
++MANIFEST_TOOL = @MANIFEST_TOOL@
++MKDIR_P = @MKDIR_P@
++MYSQL_CFLAGS = @MYSQL_CFLAGS@
++MYSQL_LIBS = @MYSQL_LIBS@
++NM = @NM@
++NMEDIT = @NMEDIT@
++OBJDUMP = @OBJDUMP@
++OBJEXT = @OBJEXT@
++ORACLE_CFLAGS = @ORACLE_CFLAGS@
++ORACLE_LIBS = @ORACLE_LIBS@
++OTOOL = @OTOOL@
++OTOOL64 = @OTOOL64@
++PACKAGE = @PACKAGE@
++PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
++PACKAGE_NAME = @PACKAGE_NAME@
++PACKAGE_STRING = @PACKAGE_STRING@
++PACKAGE_TARNAME = @PACKAGE_TARNAME@
++PACKAGE_URL = @PACKAGE_URL@
++PACKAGE_VERSION = @PACKAGE_VERSION@
++PATH_SEPARATOR = @PATH_SEPARATOR@
++PGSQL_CFLAGS = @PGSQL_CFLAGS@
++PGSQL_LIBS = @PGSQL_LIBS@
++PKG_CONFIG = @PKG_CONFIG@
++PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
++PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
++PTHREADS_CFLAGS = @PTHREADS_CFLAGS@
++PTHREADS_LIBS = @PTHREADS_LIBS@
++RABBITMQ_CFLAGS = @RABBITMQ_CFLAGS@
++RABBITMQ_LIBS = @RABBITMQ_LIBS@
++RANLIB = @RANLIB@
++RELP_CFLAGS = @RELP_CFLAGS@
++RELP_LIBS = @RELP_LIBS@
++RSRT_CFLAGS = @RSRT_CFLAGS@
++RSRT_CFLAGS1 = @RSRT_CFLAGS1@
++RSRT_LIBS = @RSRT_LIBS@
++RSRT_LIBS1 = @RSRT_LIBS1@
++RST2MAN = @RST2MAN@
++RT_LIBS = @RT_LIBS@
++SED = @SED@
++SET_MAKE = @SET_MAKE@
++SHELL = @SHELL@
++SNMP_CFLAGS = @SNMP_CFLAGS@
++SNMP_LIBS = @SNMP_LIBS@
++SOL_LIBS = @SOL_LIBS@
++STRIP = @STRIP@
++UDPSPOOF_CFLAGS = @UDPSPOOF_CFLAGS@
++UDPSPOOF_LIBS = @UDPSPOOF_LIBS@
++VERSION = @VERSION@
++YACC = @YACC@
++YFLAGS = @YFLAGS@
++ZLIB_LIBS = @ZLIB_LIBS@
++abs_builddir = @abs_builddir@
++abs_srcdir = @abs_srcdir@
++abs_top_builddir = @abs_top_builddir@
++abs_top_srcdir = @abs_top_srcdir@
++ac_ct_AR = @ac_ct_AR@
++ac_ct_CC = @ac_ct_CC@
++ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
++am__include = @am__include@
++am__leading_dot = @am__leading_dot@
++am__quote = @am__quote@
++am__tar = @am__tar@
++am__untar = @am__untar@
++bindir = @bindir@
++build = @build@
++build_alias = @build_alias@
++build_cpu = @build_cpu@
++build_os = @build_os@
++build_vendor = @build_vendor@
++builddir = @builddir@
++datadir = @datadir@
++datarootdir = @datarootdir@
++docdir = @docdir@
++dvidir = @dvidir@
++exec_prefix = @exec_prefix@
++have_valgrind = @have_valgrind@
++host = @host@
++host_alias = @host_alias@
++host_cpu = @host_cpu@
++host_os = @host_os@
++host_vendor = @host_vendor@
++htmldir = @htmldir@
++includedir = @includedir@
++infodir = @infodir@
++install_sh = @install_sh@
++libdir = @libdir@
++libexecdir = @libexecdir@
++localedir = @localedir@
++localstatedir = @localstatedir@
++mandir = @mandir@
++mkdir_p = @mkdir_p@
++moddirs = @moddirs@
++oldincludedir = @oldincludedir@
++pdfdir = @pdfdir@
++prefix = @prefix@
++program_transform_name = @program_transform_name@
++psdir = @psdir@
++sbindir = @sbindir@
++sharedstatedir = @sharedstatedir@
++srcdir = @srcdir@
++sysconfdir = @sysconfdir@
++systemdsystemunitdir = @systemdsystemunitdir@
++target_alias = @target_alias@
++top_build_prefix = @top_build_prefix@
++top_builddir = @top_builddir@
++top_srcdir = @top_srcdir@
++pkglib_LTLIBRARIES = mmcount.la
++mmcount_la_SOURCES = mmcount.c
++mmcount_la_CPPFLAGS = $(RSRT_CFLAGS) $(PTHREADS_CFLAGS)
++mmcount_la_LDFLAGS = -module -avoid-version
++mmcount_la_LIBADD = 
++EXTRA_DIST = 
++all: all-am
++
++.SUFFIXES:
++.SUFFIXES: .c .lo .o .obj
++.PRECIOUS: Makefile
++Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
++	@case '$?' in \
++	  *config.status*) \
++	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
++	  *) \
++	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
++	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
++	esac;
++
++$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
++	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
++
++$(top_srcdir)/configure:  $(am__configure_deps)
++	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
++$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
++	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
++$(am__aclocal_m4_deps):
++
++install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
++	@$(NORMAL_INSTALL)
++	@list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
++	list2=; for p in $$list; do \
++	  if test -f $$p; then \
++	    list2="$$list2 $$p"; \
++	  else :; fi; \
++	done; \
++	test -z "$$list2" || { \
++	  echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \
++	  $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \
++	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \
++	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \
++	}
++
++uninstall-pkglibLTLIBRARIES:
++	@$(NORMAL_UNINSTALL)
++	@list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
++	for p in $$list; do \
++	  $(am__strip_dir) \
++	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
++	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
++	done
++
++clean-pkglibLTLIBRARIES:
++	-test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
++	@list='$(pkglib_LTLIBRARIES)'; \
++	locs=`for p in $$list; do echo $$p; done | \
++	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
++	      sort -u`; \
++	test -z "$$locs" || { \
++	  echo rm -f $${locs}; \
++	  rm -f $${locs}; \
++	}
++
++mmcount.la: $(mmcount_la_OBJECTS) $(mmcount_la_DEPENDENCIES) $(EXTRA_mmcount_la_DEPENDENCIES) 
++	$(AM_V_CCLD)$(mmcount_la_LINK) -rpath $(pkglibdir) $(mmcount_la_OBJECTS) $(mmcount_la_LIBADD) $(LIBS)
++
++mostlyclean-compile:
++	-rm -f *.$(OBJEXT)
++
++distclean-compile:
++	-rm -f *.tab.c
++
++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mmcount_la-mmcount.Plo@am__quote@
++
++.c.o:
++@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
++@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
++@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
++@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
++@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c $<
++
++.c.obj:
++@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
++@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
++@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
++@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
++@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
++
++.c.lo:
++@am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
++@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
++@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
++@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
++@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
++
++mmcount_la-mmcount.lo: mmcount.c
++@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mmcount_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mmcount_la-mmcount.lo -MD -MP -MF $(DEPDIR)/mmcount_la-mmcount.Tpo -c -o mmcount_la-mmcount.lo `test -f 'mmcount.c' || echo '$(srcdir)/'`mmcount.c
++@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/mmcount_la-mmcount.Tpo $(DEPDIR)/mmcount_la-mmcount.Plo
++@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='mmcount.c' object='mmcount_la-mmcount.lo' libtool=yes @AMDEPBACKSLASH@
++@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
++@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mmcount_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mmcount_la-mmcount.lo `test -f 'mmcount.c' || echo '$(srcdir)/'`mmcount.c
++
++mostlyclean-libtool:
++	-rm -f *.lo
++
++clean-libtool:
++	-rm -rf .libs _libs
++
++ID: $(am__tagged_files)
++	$(am__define_uniq_tagged_files); mkid -fID $$unique
++tags: tags-am
++TAGS: tags
++
++tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
++	set x; \
++	here=`pwd`; \
++	$(am__define_uniq_tagged_files); \
++	shift; \
++	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
++	  test -n "$$unique" || unique=$$empty_fix; \
++	  if test $$# -gt 0; then \
++	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
++	      "$$@" $$unique; \
++	  else \
++	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
++	      $$unique; \
++	  fi; \
++	fi
++ctags: ctags-am
++
++CTAGS: ctags
++ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
++	$(am__define_uniq_tagged_files); \
++	test -z "$(CTAGS_ARGS)$$unique" \
++	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
++	     $$unique
++
++GTAGS:
++	here=`$(am__cd) $(top_builddir) && pwd` \
++	  && $(am__cd) $(top_srcdir) \
++	  && gtags -i $(GTAGS_ARGS) "$$here"
++cscopelist: cscopelist-am
++
++cscopelist-am: $(am__tagged_files)
++	list='$(am__tagged_files)'; \
++	case "$(srcdir)" in \
++	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
++	  *) sdir=$(subdir)/$(srcdir) ;; \
++	esac; \
++	for i in $$list; do \
++	  if test -f "$$i"; then \
++	    echo "$(subdir)/$$i"; \
++	  else \
++	    echo "$$sdir/$$i"; \
++	  fi; \
++	done >> $(top_builddir)/cscope.files
++
++distclean-tags:
++	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
++
++distdir: $(DISTFILES)
++	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
++	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
++	list='$(DISTFILES)'; \
++	  dist_files=`for file in $$list; do echo $$file; done | \
++	  sed -e "s|^$$srcdirstrip/||;t" \
++	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
++	case $$dist_files in \
++	  */*) $(MKDIR_P) `echo "$$dist_files" | \
++			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
++			   sort -u` ;; \
++	esac; \
++	for file in $$dist_files; do \
++	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
++	  if test -d $$d/$$file; then \
++	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
++	    if test -d "$(distdir)/$$file"; then \
++	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
++	    fi; \
++	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
++	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
++	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
++	    fi; \
++	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
++	  else \
++	    test -f "$(distdir)/$$file" \
++	    || cp -p $$d/$$file "$(distdir)/$$file" \
++	    || exit 1; \
++	  fi; \
++	done
++check-am: all-am
++check: check-am
++all-am: Makefile $(LTLIBRARIES)
++installdirs:
++	for dir in "$(DESTDIR)$(pkglibdir)"; do \
++	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
++	done
++install: install-am
++install-exec: install-exec-am
++install-data: install-data-am
++uninstall: uninstall-am
++
++install-am: all-am
++	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
++
++installcheck: installcheck-am
++install-strip:
++	if test -z '$(STRIP)'; then \
++	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
++	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
++	      install; \
++	else \
++	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
++	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
++	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
++	fi
++mostlyclean-generic:
++
++clean-generic:
++
++distclean-generic:
++	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
++	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
++
++maintainer-clean-generic:
++	@echo "This command is intended for maintainers to use"
++	@echo "it deletes files that may require special tools to rebuild."
++clean: clean-am
++
++clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \
++	mostlyclean-am
++
++distclean: distclean-am
++	-rm -rf ./$(DEPDIR)
++	-rm -f Makefile
++distclean-am: clean-am distclean-compile distclean-generic \
++	distclean-tags
++
++dvi: dvi-am
++
++dvi-am:
++
++html: html-am
++
++html-am:
++
++info: info-am
++
++info-am:
++
++install-data-am:
++
++install-dvi: install-dvi-am
++
++install-dvi-am:
++
++install-exec-am: install-pkglibLTLIBRARIES
++
++install-html: install-html-am
++
++install-html-am:
++
++install-info: install-info-am
++
++install-info-am:
++
++install-man:
++
++install-pdf: install-pdf-am
++
++install-pdf-am:
++
++install-ps: install-ps-am
++
++install-ps-am:
++
++installcheck-am:
++
++maintainer-clean: maintainer-clean-am
++	-rm -rf ./$(DEPDIR)
++	-rm -f Makefile
++maintainer-clean-am: distclean-am maintainer-clean-generic
++
++mostlyclean: mostlyclean-am
++
++mostlyclean-am: mostlyclean-compile mostlyclean-generic \
++	mostlyclean-libtool
++
++pdf: pdf-am
++
++pdf-am:
++
++ps: ps-am
++
++ps-am:
++
++uninstall-am: uninstall-pkglibLTLIBRARIES
++
++.MAKE: install-am install-strip
++
++.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
++	clean-libtool clean-pkglibLTLIBRARIES cscopelist-am ctags \
++	ctags-am distclean distclean-compile distclean-generic \
++	distclean-libtool distclean-tags distdir dvi dvi-am html \
++	html-am info info-am install install-am install-data \
++	install-data-am install-dvi install-dvi-am install-exec \
++	install-exec-am install-html install-html-am install-info \
++	install-info-am install-man install-pdf install-pdf-am \
++	install-pkglibLTLIBRARIES install-ps install-ps-am \
++	install-strip installcheck installcheck-am installdirs \
++	maintainer-clean maintainer-clean-generic mostlyclean \
++	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
++	pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
++	uninstall-pkglibLTLIBRARIES
++
++
++# Tell versions [3.59,3.63) of GNU make to not export all variables.
++# Otherwise a system limit (for SysV at least) may be exceeded.
++.NOEXPORT:
+diff -Npru a/plugins/mmcount/mmcount.c b/plugins/mmcount/mmcount.c
+--- a/plugins/mmcount/mmcount.c	1970-01-01 01:00:00.000000000 +0100
++++ b/plugins/mmcount/mmcount.c	2015-07-07 15:42:47.057059346 +0200
+@@ -0,0 +1,342 @@
++/* mmcount.c
++ * count messages by priority or json property of given app-name.
++ *
++ * Copyright 2013 Red Hat Inc.
++ *
++ * This file is part of rsyslog.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ * 
++ *       http://www.apache.org/licenses/LICENSE-2.0
++ *       -or-
++ *       see COPYING.ASL20 in the source distribution
++ * 
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++#include "config.h"
++#include "rsyslog.h"
++#include <stdio.h>
++#include <stdarg.h>
++#include <stdlib.h>
++#include <string.h>
++#include <assert.h>
++#include <signal.h>
++#include <errno.h>
++#include <unistd.h>
++#include <stdint.h>
++#include <json.h>
++#include "conf.h"
++#include "syslogd-types.h"
++#include "srUtils.h"
++#include "template.h"
++#include "module-template.h"
++#include "errmsg.h"
++#include "hashtable.h"
++
++#define JSON_COUNT_NAME "!mmcount"
++#define SEVERITY_COUNT 8
++
++MODULE_TYPE_OUTPUT
++MODULE_TYPE_NOKEEP
++MODULE_CNFNAME("mmcount")
++
++
++DEFobjCurrIf(errmsg);
++DEF_OMOD_STATIC_DATA
++
++/* config variables */
++
++typedef struct _instanceData {
++	char *pszAppName;
++	int severity[SEVERITY_COUNT];
++	char *pszKey;
++	char *pszValue;
++	int valueCounter;
++	struct hashtable *ht;
++} instanceData;
++
++struct modConfData_s {
++	rsconf_t *pConf;	/* our overall config object */
++};
++static modConfData_t *loadModConf = NULL;/* modConf ptr to use for the current load process */
++static modConfData_t *runModConf = NULL;/* modConf ptr to use for the current exec process */
++
++
++/* tables for interfacing with the v6 config system */
++/* action (instance) parameters */
++static struct cnfparamdescr actpdescr[] = {
++	{ "appname", eCmdHdlrGetWord, 0 },
++	{ "key", eCmdHdlrGetWord, 0 },
++	{ "value", eCmdHdlrGetWord, 0 },
++};
++static struct cnfparamblk actpblk =
++	{ CNFPARAMBLK_VERSION,
++	  sizeof(actpdescr)/sizeof(struct cnfparamdescr),
++	  actpdescr
++	};
++
++BEGINbeginCnfLoad
++CODESTARTbeginCnfLoad
++	loadModConf = pModConf;
++	pModConf->pConf = pConf;
++ENDbeginCnfLoad
++
++BEGINendCnfLoad
++CODESTARTendCnfLoad
++ENDendCnfLoad
++
++BEGINcheckCnf
++CODESTARTcheckCnf
++ENDcheckCnf
++
++BEGINactivateCnf
++CODESTARTactivateCnf
++	runModConf = pModConf;
++ENDactivateCnf
++
++BEGINfreeCnf
++CODESTARTfreeCnf
++ENDfreeCnf
++
++
++BEGINcreateInstance
++CODESTARTcreateInstance
++ENDcreateInstance
++
++
++BEGINisCompatibleWithFeature
++CODESTARTisCompatibleWithFeature
++ENDisCompatibleWithFeature
++
++
++BEGINfreeInstance
++CODESTARTfreeInstance
++ENDfreeInstance
++
++
++static inline void
++setInstParamDefaults(instanceData *pData)
++{
++	int i;
++
++	pData->pszAppName = NULL;
++	for (i = 0; i < SEVERITY_COUNT; i++)
++	        pData->severity[i] = 0;
++	pData->pszKey = NULL;
++	pData->pszValue = NULL;
++	pData->valueCounter = 0;
++	pData->ht = NULL;
++}
++
++static unsigned int
++hash_from_key_fn(void *k)
++{
++	return *(unsigned int *)k;
++}
++
++static int
++key_equals_fn(void *k1, void *k2)
++{
++	return (*(unsigned int *)k1 == *(unsigned int *)k2);
++}
++
++BEGINnewActInst
++	struct cnfparamvals *pvals;
++	int i;
++CODESTARTnewActInst
++	DBGPRINTF("newActInst (mmcount)\n");
++	if((pvals = nvlstGetParams(lst, &actpblk, NULL)) == NULL) {
++		ABORT_FINALIZE(RS_RET_MISSING_CNFPARAMS);
++	}
++
++	CODE_STD_STRING_REQUESTnewActInst(1)
++	CHKiRet(OMSRsetEntry(*ppOMSR, 0, NULL, OMSR_TPL_AS_MSG));
++	CHKiRet(createInstance(&pData));
++	setInstParamDefaults(pData);
++
++	for(i = 0 ; i < actpblk.nParams ; ++i) {
++		if(!pvals[i].bUsed)
++			continue;
++		if(!strcmp(actpblk.descr[i].name, "appname")) {
++			pData->pszAppName = es_str2cstr(pvals[i].val.d.estr, NULL);
++			continue;
++		}
++		if(!strcmp(actpblk.descr[i].name, "key")) {
++			pData->pszKey = es_str2cstr(pvals[i].val.d.estr, NULL);
++			continue;
++		}
++		if(!strcmp(actpblk.descr[i].name, "value")) {
++			pData->pszValue = es_str2cstr(pvals[i].val.d.estr, NULL);
++			continue;
++		}
++		dbgprintf("mmcount: program error, non-handled "
++			  "param '%s'\n", actpblk.descr[i].name);
++	}
++
++	if(pData->pszAppName == NULL) {
++		dbgprintf("mmcount: action requires a appname");
++		ABORT_FINALIZE(RS_RET_MISSING_CNFPARAMS);
++	}
++
++	if(pData->pszKey != NULL && pData->pszValue == NULL) {
++		if(NULL == (pData->ht = create_hashtable(100, hash_from_key_fn, key_equals_fn, NULL))) {
++			DBGPRINTF("mmcount: error creating hash table!\n");
++			ABORT_FINALIZE(RS_RET_ERR);
++		}
++	}
++CODE_STD_FINALIZERnewActInst
++	cnfparamvalsDestruct(pvals, &actpblk);
++ENDnewActInst
++
++
++BEGINdbgPrintInstInfo
++CODESTARTdbgPrintInstInfo
++ENDdbgPrintInstInfo
++
++
++BEGINtryResume
++CODESTARTtryResume
++ENDtryResume
++
++static int *
++getCounter(struct hashtable *ht, char *str) {
++	unsigned int key;
++	int *pCounter;
++	unsigned int *pKey;
++
++	/* we dont store str as key, instead we store hash of the str
++	   as key to reduce memory usage */
++	key = hash_from_string(str);
++	pCounter = hashtable_search(ht, &key);
++	if(pCounter) {
++		return pCounter;
++	}
++
++	/* counter is not found for the str, so add new entry and
++	   return the counter */
++	if(NULL == (pKey = (unsigned int*)malloc(sizeof(unsigned int)))) {
++		DBGPRINTF("mmcount: memory allocation for key failed\n");
++		return NULL;
++	}
++	*pKey = key;
++
++	if(NULL == (pCounter = (int*)malloc(sizeof(int)))) {
++		DBGPRINTF("mmcount: memory allocation for value failed\n");
++		free(pKey);
++		return NULL;
++	}
++	*pCounter = 0;
++
++	if(!hashtable_insert(ht, pKey, pCounter)) {
++		DBGPRINTF("mmcount: inserting element into hashtable failed\n");
++		free(pKey);
++		free(pCounter);
++		return NULL;
++	}
++	return pCounter;
++}
++
++BEGINdoAction
++	msg_t *pMsg;
++	char *appname;
++	struct json_object *json = NULL;
++	es_str_t *estr = NULL;
++	struct json_object *keyjson = NULL;
++	char *pszValue;
++	int *pCounter;
++CODESTARTdoAction
++	pMsg = (msg_t*) ppString[0];
++	appname = getAPPNAME(pMsg, LOCK_MUTEX);
++
++	if(0 != strcmp(appname, pData->pszAppName)) {
++		/* we are not working for this appname. nothing to do */
++		ABORT_FINALIZE(RS_RET_OK);
++	}
++
++	if(!pData->pszKey) {
++		/* no key given for count, so we count severity */
++		if(pMsg->iSeverity < SEVERITY_COUNT) {
++			pData->severity[pMsg->iSeverity]++;
++			json = json_object_new_int(pData->severity[pMsg->iSeverity]);
++		}
++		ABORT_FINALIZE(RS_RET_OK);
++	}
++
++	/* key is given, so get the property json */
++	estr = es_newStrFromBuf(pData->pszKey, strlen(pData->pszKey));
++	if(msgGetCEEPropJSON(pMsg, estr, &keyjson) != RS_RET_OK) {
++		/* key not found in the message. nothing to do */
++		ABORT_FINALIZE(RS_RET_OK);
++	}
++
++	/* key found, so get the value */
++	pszValue = (char*)json_object_get_string(keyjson);
++
++	if(pData->pszValue) {
++		/* value also given for count */
++		if(!strcmp(pszValue, pData->pszValue)) {
++			/* count for (value and key and appname) matched */
++			pData->valueCounter++;
++			json = json_object_new_int(pData->valueCounter);
++		}
++		ABORT_FINALIZE(RS_RET_OK);
++	}
++
++	/* value is not given, so we count for each value of given key */
++	pCounter = getCounter(pData->ht, pszValue);
++	if(pCounter) {
++		(*pCounter)++;
++		json = json_object_new_int(*pCounter);
++	}
++finalize_it:
++	if(estr) {
++		es_deleteStr(estr);
++	}
++
++	if(json) {
++		msgAddJSON(pMsg, (uchar *)JSON_COUNT_NAME, json);
++	}
++ENDdoAction
++
++
++BEGINparseSelectorAct
++CODESTARTparseSelectorAct
++CODE_STD_STRING_REQUESTparseSelectorAct(1)
++	if(strncmp((char*) p, ":mmcount:", sizeof(":mmcount:") - 1)) {
++		errmsg.LogError(0, RS_RET_LEGA_ACT_NOT_SUPPORTED,
++			"mmcount supports only v6+ config format, use: "
++			"action(type=\"mmcount\" ...)");
++	}
++	ABORT_FINALIZE(RS_RET_CONFLINE_UNPROCESSED);
++CODE_STD_FINALIZERparseSelectorAct
++ENDparseSelectorAct
++
++
++BEGINmodExit
++CODESTARTmodExit
++	objRelease(errmsg, CORE_COMPONENT);
++ENDmodExit
++
++
++BEGINqueryEtryPt
++CODESTARTqueryEtryPt
++CODEqueryEtryPt_STD_OMOD_QUERIES
++CODEqueryEtryPt_STD_CONF2_OMOD_QUERIES
++CODEqueryEtryPt_STD_CONF2_QUERIES
++ENDqueryEtryPt
++
++
++
++BEGINmodInit()
++CODESTARTmodInit
++	*ipIFVersProvided = CURR_MOD_IF_VERSION; /* we only support the current interface specification */
++CODEmodInit_QueryRegCFSLineHdlr
++	DBGPRINTF("mmcount: module compiled with rsyslog version %s.\n", VERSION);
++	CHKiRet(objUse(errmsg, CORE_COMPONENT));
++ENDmodInit
diff --git a/SOURCES/rsyslog-7.4.7-rhbz1151041-imuxsock-socket-limit.patch b/SOURCES/rsyslog-7.4.7-rhbz1151041-imuxsock-socket-limit.patch
new file mode 100644
index 0000000..13d9490
--- /dev/null
+++ b/SOURCES/rsyslog-7.4.7-rhbz1151041-imuxsock-socket-limit.patch
@@ -0,0 +1,372 @@
+From 85f48d11900ade931cc667750b8dd69e7fa656ef Mon Sep 17 00:00:00 2001
+From: Tomas Heinrich <theinric@redhat.com>
+Date: Thu, 23 Jul 2015 17:28:50 +0200
+Subject: [PATCH] imuxsock: handle unlimited number of listeners
+
+---
+ plugins/imuxsock/imuxsock.c | 258 ++++++++++++++++++++++----------------------
+ 1 file changed, 130 insertions(+), 128 deletions(-)
+
+diff --git a/plugins/imuxsock/imuxsock.c b/plugins/imuxsock/imuxsock.c
+index 8fda133..eca9a34 100644
+--- a/plugins/imuxsock/imuxsock.c
++++ b/plugins/imuxsock/imuxsock.c
+@@ -62,7 +62,6 @@ MODULE_TYPE_NOKEEP
+ MODULE_CNFNAME("imuxsock")
+ 
+ /* defines */
+-#define MAXFUNIX	50
+ #ifndef _PATH_LOG
+ #ifdef BSD
+ #define _PATH_LOG	"/var/run/log"
+@@ -148,7 +147,7 @@ typedef struct lstn_s {
+ 	sbool bUseSysTimeStamp;	/* use timestamp from system (instead of from message) */
+ 	sbool bUnlink;		/* unlink&re-create socket at start and end of processing */
+ } lstn_t;
+-static lstn_t listeners[MAXFUNIX];
++static lstn_t *listeners;
+ 
+ static prop_t *pLocalHostIP = NULL;	/* there is only one global IP for all internally-generated messages */
+ static prop_t *pInputName = NULL;	/* our inputName currently is always "imudp", and this will hold it */
+@@ -360,12 +359,7 @@ finalize_it:
+ }
+ 
+ 
+-/* add an additional listen socket. Socket names are added
+- * until the array is filled up. It is never reset, only at
+- * module unload.
+- * TODO: we should change the array to a list so that we
+- * can support any number of listen socket names.
+- * rgerhards, 2007-12-20
++/* add an additional listen socket. 
+  * added capability to specify hostname for socket -- rgerhards, 2008-08-01
+  */
+ static rsRetVal
+@@ -373,66 +367,70 @@ addListner(instanceConf_t *inst)
+ {
+ 	DEFiRet;
+ 
+-	if(nfd < MAXFUNIX) {
+-		if(*inst->sockName == ':') {
+-			listeners[nfd].bParseHost = 1;
+-		} else {
+-			listeners[nfd].bParseHost = 0;
+-		}
+-		if(inst->pLogHostName == NULL) {
+-			listeners[nfd].hostName = NULL;
+-		} else {
+-			CHKiRet(prop.Construct(&(listeners[nfd].hostName)));
+-			CHKiRet(prop.SetString(listeners[nfd].hostName, inst->pLogHostName, ustrlen(inst->pLogHostName)));
+-			CHKiRet(prop.ConstructFinalize(listeners[nfd].hostName));
+-		}
+-		if(inst->ratelimitInterval > 0) {
+-			if((listeners[nfd].ht = create_hashtable(100, hash_from_key_fn, key_equals_fn,
+-				(void(*)(void*))ratelimitDestruct)) == NULL) {
+-				/* in this case, we simply turn off rate-limiting */
+-				DBGPRINTF("imuxsock: turning off rate limiting because we could not "
+-					  "create hash table\n");
+-				inst->ratelimitInterval = 0;
+-			}
++	if(*inst->sockName == ':') {
++		listeners[nfd].bParseHost = 1;
++	} else {
++		listeners[nfd].bParseHost = 0;
++	}
++	if(inst->pLogHostName == NULL) {
++		listeners[nfd].hostName = NULL;
++	} else {
++		CHKiRet(prop.Construct(&(listeners[nfd].hostName)));
++		CHKiRet(prop.SetString(listeners[nfd].hostName, inst->pLogHostName, ustrlen(inst->pLogHostName)));
++		CHKiRet(prop.ConstructFinalize(listeners[nfd].hostName));
++	}
++	if(inst->ratelimitInterval > 0) {
++		if((listeners[nfd].ht = create_hashtable(100, hash_from_key_fn, key_equals_fn,
++			(void(*)(void*))ratelimitDestruct)) == NULL) {
++			/* in this case, we simply turn off rate-limiting */
++			DBGPRINTF("imuxsock: turning off rate limiting because we could not "
++				  "create hash table\n");
++			inst->ratelimitInterval = 0;
+ 		}
+-		listeners[nfd].ratelimitInterval = inst->ratelimitInterval;
+-		listeners[nfd].ratelimitBurst = inst->ratelimitBurst;
+-		listeners[nfd].ratelimitSev = inst->ratelimitSeverity;
+-		listeners[nfd].flowCtl = inst->bUseFlowCtl ? eFLOWCTL_LIGHT_DELAY : eFLOWCTL_NO_DELAY;
+-		listeners[nfd].flags = inst->bIgnoreTimestamp ? IGNDATE : NOFLAG;
+-		listeners[nfd].bCreatePath = inst->bCreatePath;
+-		listeners[nfd].sockName = ustrdup(inst->sockName);
+-		listeners[nfd].bUseCreds = (inst->bDiscardOwnMsgs || inst->bWritePid || inst->ratelimitInterval || inst->bAnnotate || inst->bUseSysTimeStamp) ? 1 : 0;
+-		listeners[nfd].bAnnotate = inst->bAnnotate;
+-		listeners[nfd].bParseTrusted = inst->bParseTrusted;
+-		listeners[nfd].bDiscardOwnMsgs = inst->bDiscardOwnMsgs;
+-		listeners[nfd].bUnlink = inst->bUnlink;
+-		listeners[nfd].bWritePid = inst->bWritePid;
+-		listeners[nfd].bUseSysTimeStamp = inst->bUseSysTimeStamp;
+-		CHKiRet(ratelimitNew(&listeners[nfd].dflt_ratelimiter, "imuxsock", NULL));
+-		ratelimitSetLinuxLike(listeners[nfd].dflt_ratelimiter,
+-				      listeners[nfd].ratelimitInterval,
+-				      listeners[nfd].ratelimitBurst);
+-		ratelimitSetSeverity(listeners[nfd].dflt_ratelimiter,
+-				     listeners[nfd].ratelimitSev);
+-		nfd++;
+ 	} else {
+-		errmsg.LogError(0, NO_ERRCODE, "Out of unix socket name descriptors, ignoring %s\n",
+-			 inst->sockName);
++		listeners[nfd].ht = NULL;
+ 	}
++	listeners[nfd].ratelimitInterval = inst->ratelimitInterval;
++	listeners[nfd].ratelimitBurst = inst->ratelimitBurst;
++	listeners[nfd].ratelimitSev = inst->ratelimitSeverity;
++	listeners[nfd].flowCtl = inst->bUseFlowCtl ? eFLOWCTL_LIGHT_DELAY : eFLOWCTL_NO_DELAY;
++	listeners[nfd].flags = inst->bIgnoreTimestamp ? IGNDATE : NOFLAG;
++	listeners[nfd].bCreatePath = inst->bCreatePath;
++	listeners[nfd].sockName = ustrdup(inst->sockName);
++	listeners[nfd].bUseCreds = (inst->bDiscardOwnMsgs || inst->bWritePid || inst->ratelimitInterval || inst->bAnnotate || runModConf->bUseSysTimeStamp) ? 1 : 0;
++	listeners[nfd].bAnnotate = inst->bAnnotate;
++	listeners[nfd].bParseTrusted = inst->bParseTrusted;
++	listeners[nfd].bDiscardOwnMsgs = inst->bDiscardOwnMsgs;
++	listeners[nfd].bUnlink = inst->bUnlink;
++	listeners[nfd].bWritePid = inst->bWritePid;
++	listeners[nfd].bUseSysTimeStamp = inst->bUseSysTimeStamp;
++	CHKiRet(ratelimitNew(&listeners[nfd].dflt_ratelimiter, "imuxsock", NULL));
++	ratelimitSetLinuxLike(listeners[nfd].dflt_ratelimiter,
++			      listeners[nfd].ratelimitInterval,
++			      listeners[nfd].ratelimitBurst);
++	ratelimitSetSeverity(listeners[nfd].dflt_ratelimiter,
++			     listeners[nfd].ratelimitSev);
++	nfd++;
+ 
+ finalize_it:
+ 	RETiRet;
+ }
+ 
+ 
+-/* discard/Destruct all log sockets except for "socket" 0. Data for it comes from
+- * the constant memory pool - and if not, it is freeed via some other pointer.
+- */
+ static rsRetVal discardLogSockets(void)
+ {
+ 	int i;
+ 
++	/* Check whether the system socket is in use */
++	if(startIndexUxLocalSockets == 0) {
++		/* Clean up rate limiting data for the system socket */
++		if(listeners[0].ht != NULL) {
++			hashtable_destroy(listeners[0].ht, 1); /* 1 => free all values automatically */
++		}
++		ratelimitDestruct(listeners[0].dflt_ratelimiter);
++	}
++
++	/* Clean up all other sockets */
+         for (i = 1; i < nfd; i++) {
+ 		if(listeners[i].sockName != NULL) {
+ 			free(listeners[i].sockName);
+@@ -1033,50 +1031,51 @@ activateListeners()
+ 	int actSocks;
+ 	DEFiRet;
+ 
+-	/* first apply some config settings */
+-#	ifdef OS_SOLARIS
+-		/* under solaris, we must NEVER process the local log socket, because
+-		 * it is implemented there differently. If we used it, we would actually
+-		 * delete it and render the system partly unusable. So don't do that.
+-		 * rgerhards, 2010-03-26
+-		 */
+-		startIndexUxLocalSockets = 1;
+-#	else
+-		startIndexUxLocalSockets = runModConf->bOmitLocalLogging ? 1 : 0;
+-#	endif
+-	if(runModConf->pLogSockName != NULL)
+-		listeners[0].sockName = runModConf->pLogSockName;
+-	else if(sd_booted()) {
+-		struct stat st;
+-		if(stat(SYSTEMD_PATH_LOG, &st) != -1 && S_ISSOCK(st.st_mode)) {
+-			listeners[0].sockName = (uchar*) SYSTEMD_PATH_LOG;
++	/* Initialize the system socket only if it's in use */
++	if(startIndexUxLocalSockets == 0) {
++		/* first apply some config settings */
++		listeners[0].sockName = UCHAR_CONSTANT(_PATH_LOG);
++		if(runModConf->pLogSockName != NULL)
++			listeners[0].sockName = runModConf->pLogSockName;
++		else if(sd_booted()) {
++			struct stat st;
++			if(stat(SYSTEMD_PATH_LOG, &st) != -1 && S_ISSOCK(st.st_mode)) {
++				listeners[0].sockName = (uchar*) SYSTEMD_PATH_LOG;
++			}
+ 		}
+-	}
+-	if(runModConf->ratelimitIntervalSysSock > 0) {
+-		if((listeners[0].ht = create_hashtable(100, hash_from_key_fn, key_equals_fn, NULL)) == NULL) {
+-			/* in this case, we simply turn of rate-limiting */
+-			errmsg.LogError(0, NO_ERRCODE, "imuxsock: turning off rate limiting because we could not "
+-				  "create hash table\n");
+-			runModConf->ratelimitIntervalSysSock = 0;
++		if(runModConf->ratelimitIntervalSysSock > 0) {
++			if((listeners[0].ht = create_hashtable(100, hash_from_key_fn, key_equals_fn, NULL)) == NULL) {
++				/* in this case, we simply turn of rate-limiting */
++				errmsg.LogError(0, NO_ERRCODE, "imuxsock: turning off rate limiting because we could not "
++						"create hash table\n");
++				runModConf->ratelimitIntervalSysSock = 0;
++			}
++		} else {
++			listeners[0].ht = NULL;
+ 		}
+-	}
+-	listeners[0].ratelimitInterval = runModConf->ratelimitIntervalSysSock;
+-	listeners[0].ratelimitBurst = runModConf->ratelimitBurstSysSock;
+-	listeners[0].ratelimitSev = runModConf->ratelimitSeveritySysSock;
+-	listeners[0].bUseCreds = (runModConf->bWritePidSysSock || runModConf->ratelimitIntervalSysSock || runModConf->bAnnotateSysSock || runModConf->bDiscardOwnMsgs || runModConf->bUseSysTimeStamp) ? 1 : 0;
+-	listeners[0].bWritePid = runModConf->bWritePidSysSock;
+-	listeners[0].bAnnotate = runModConf->bAnnotateSysSock;
+-	listeners[0].bParseTrusted = runModConf->bParseTrusted;
+-	listeners[0].bDiscardOwnMsgs = runModConf->bDiscardOwnMsgs;
+-	listeners[0].bUnlink = runModConf->bUnlink;
+-	listeners[0].bUseSysTimeStamp = runModConf->bUseSysTimeStamp;
+-	listeners[0].flags = runModConf->bIgnoreTimestamp ? IGNDATE : NOFLAG;
+-	listeners[0].flowCtl = runModConf->bUseFlowCtl ? eFLOWCTL_LIGHT_DELAY : eFLOWCTL_NO_DELAY;
+-	CHKiRet(ratelimitNew(&listeners[0].dflt_ratelimiter, "imuxsock", NULL));
++		listeners[0].fd = -1;
++		listeners[0].hostName = NULL;
++		listeners[0].bParseHost = 0;
++		listeners[0].bCreatePath = 0;
++		listeners[0].ratelimitInterval = runModConf->ratelimitIntervalSysSock;
++		listeners[0].ratelimitBurst = runModConf->ratelimitBurstSysSock;
++		listeners[0].ratelimitSev = runModConf->ratelimitSeveritySysSock;
++		listeners[0].bUseCreds = (runModConf->bWritePidSysSock || runModConf->ratelimitIntervalSysSock || runModConf->bAnnotateSysSock || runModConf->bDiscardOwnMsgs || runModConf->bUseSysTimeStamp) ? 1 : 0;
++		listeners[0].bWritePid = runModConf->bWritePidSysSock;
++		listeners[0].bAnnotate = runModConf->bAnnotateSysSock;
++		listeners[0].bParseTrusted = runModConf->bParseTrusted;
++		listeners[0].bDiscardOwnMsgs = runModConf->bDiscardOwnMsgs;
++		listeners[0].bUnlink = runModConf->bUnlink;
++		listeners[0].bUseSysTimeStamp = runModConf->bUseSysTimeStamp;
++		listeners[0].flags = runModConf->bIgnoreTimestamp ? IGNDATE : NOFLAG;
++		listeners[0].flowCtl = runModConf->bUseFlowCtl ? eFLOWCTL_LIGHT_DELAY : eFLOWCTL_NO_DELAY;
++		CHKiRet(ratelimitNew(&listeners[0].dflt_ratelimiter, "imuxsock", NULL));
++
+ 		ratelimitSetLinuxLike(listeners[0].dflt_ratelimiter,
+-		listeners[0].ratelimitInterval,
+-		listeners[0].ratelimitBurst);
+-	ratelimitSetSeverity(listeners[0].dflt_ratelimiter,listeners[0].ratelimitSev);
++				      listeners[0].ratelimitInterval,
++				      listeners[0].ratelimitBurst);
++		ratelimitSetSeverity(listeners[0].dflt_ratelimiter,listeners[0].ratelimitSev);
++	}
+ 
+ 	sd_fds = sd_listen_fds(0);
+ 	if(sd_fds < 0) {
+@@ -1286,12 +1284,39 @@ ENDcheckCnf
+ 
+ BEGINactivateCnfPrePrivDrop
+ 	instanceConf_t *inst;
++	int nLstn;
++	int i;
+ CODESTARTactivateCnfPrePrivDrop
+ 	runModConf = pModConf;
++#	ifdef OS_SOLARIS
++		/* under solaris, we must NEVER process the local log socket, because
++		 * it is implemented there differently. If we used it, we would actually
++		 * delete it and render the system partly unusable. So don't do that.
++		 * rgerhards, 2010-03-26
++		 */
++		startIndexUxLocalSockets = 1;
++#	else
++		startIndexUxLocalSockets = runModConf->bOmitLocalLogging ? 1 : 0;
++#	endif
++	/* we first calculate the number of listeners so that we can
++	 * appropriately size the listener array.
++	 */
++	nLstn = 0;
+ 	for(inst = runModConf->root ; inst != NULL ; inst = inst->next) {
+-		addListner(inst);
++		++nLstn;
++	}
++	if(nLstn > 0 || startIndexUxLocalSockets == 0) {
++		DBGPRINTF("imuxsock: allocating memory for %d listeners\n", nLstn);
++		CHKmalloc(listeners = realloc(listeners, (1+nLstn)*sizeof(lstn_t)));
++		for(i = 1 ; i < nLstn ; ++i) {
++			listeners[i].sockName = NULL;
++			listeners[i].fd  = -1;
++		}
++		for(inst = runModConf->root ; inst != NULL ; inst = inst->next) {
++			addListner(inst);
++		}
++		CHKiRet(activateListeners());
+ 	}
+-	CHKiRet(activateListeners());
+ finalize_it:
+ ENDactivateCnfPrePrivDrop
+ 
+@@ -1329,6 +1354,11 @@ BEGINrunInput
+ #endif
+ 
+ CODESTARTrunInput
++	CHKmalloc(pReadfds);
++	if(startIndexUxLocalSockets == 1 && nfd == 1) {
++		/* No sockets were configured, no reason to run. */
++		ABORT_FINALIZE(RS_RET_OK);
++	}
+ 	/* this is an endless loop - it is terminated when the thread is
+ 	 * signalled to do so. This, however, is handled by the framework,
+ 	 * right into the sleep below.
+@@ -1364,7 +1394,7 @@ CODESTARTrunInput
+ 		if(glbl.GetGlobalInputTermState() == 1)
+ 			break; /* terminate input! */
+ 
+-		for (i = 0; i < nfd && nfds > 0; i++) {
++		for (i = startIndexUxLocalSockets; i < nfd && nfds > 0; i++) {
+ 			if(glbl.GetGlobalInputTermState() == 1)
+ 				ABORT_FINALIZE(RS_RET_FORCE_TERM); /* terminate input! */
+ 			if ((fd = listeners[i].fd) != -1 && FD_ISSET(fd, pReadfds)) {
+@@ -1419,6 +1449,7 @@ ENDafterRun
+ 
+ BEGINmodExit
+ CODESTARTmodExit
++	free(listeners);
+ 	if(pInputName != NULL)
+ 		prop.Destruct(&pInputName);
+ 
+@@ -1481,7 +1512,6 @@ static rsRetVal resetConfigVariables(uchar __attribute__((unused)) *pp, void __a
+ 
+ 
+ BEGINmodInit()
+-	int i;
+ CODESTARTmodInit
+ 	*ipIFVersProvided = CURR_MOD_IF_VERSION; /* we only support the current interface specification */
+ CODEmodInit_QueryRegCFSLineHdlr
+@@ -1511,34 +1541,6 @@ CODEmodInit_QueryRegCFSLineHdlr
+ 	 */
+ 	pLocalHostIP = glbl.GetLocalHostIP();
+ 
+-	/* init system log socket settings */
+-	listeners[0].flags = IGNDATE;
+-	listeners[0].sockName = UCHAR_CONSTANT(_PATH_LOG);
+-	listeners[0].hostName = NULL;
+-	listeners[0].flowCtl = eFLOWCTL_NO_DELAY;
+-	listeners[0].fd = -1;
+-	listeners[0].bParseHost = 0;
+-	listeners[0].bUseCreds = 0;
+-	listeners[0].bAnnotate = 0;
+-	listeners[0].bParseTrusted = 0;
+-	listeners[0].bDiscardOwnMsgs = 1;
+-	listeners[0].bUnlink = 1;
+-	listeners[0].bCreatePath = 0;
+-	listeners[0].bUseSysTimeStamp = 1;
+-	if((listeners[0].ht = create_hashtable(100, hash_from_key_fn, key_equals_fn,
+-		(void(*)(void*))ratelimitDestruct)) == NULL) {
+-		/* in this case, we simply turn off rate-limiting */
+-		DBGPRINTF("imuxsock: turning off rate limiting for system socket "
+-			  "because we could not create hash table\n");
+-		listeners[0].ratelimitInterval = 0;
+-	}
+-
+-	/* initialize socket names */
+-	for(i = 1 ; i < MAXFUNIX ; ++i) {
+-		listeners[i].sockName = NULL;
+-		listeners[i].fd  = -1;
+-	}
+-
+ 	/* register config file handlers */
+ 	CHKiRet(omsdRegCFSLineHdlr((uchar *)"inputunixlistensocketignoremsgtimestamp", 0, eCmdHdlrBinary,
+ 		NULL, &cs.bIgnoreTimestamp, STD_LOADABLE_MODULE_ID));
+-- 
+1.9.3
+
diff --git a/SOURCES/rsyslog-7.4.7-rhbz1184402-imuxsock-hostname.patch b/SOURCES/rsyslog-7.4.7-rhbz1184402-imuxsock-hostname.patch
new file mode 100644
index 0000000..4c4971d
--- /dev/null
+++ b/SOURCES/rsyslog-7.4.7-rhbz1184402-imuxsock-hostname.patch
@@ -0,0 +1,28 @@
+From d989a9a24c5749c9e30ed33a5443cd659f56109e Mon Sep 17 00:00:00 2001
+From: Tomas Heinrich <theinric@redhat.com>
+Date: Wed, 22 Apr 2015 14:13:34 +0200
+Subject: [PATCH] imuxsock: fix a crash when setting a hostname
+
+Setting a hostname via the legacy directive would lead to a crash
+during shutdown caused by a double-free.
+---
+ plugins/imuxsock/imuxsock.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/plugins/imuxsock/imuxsock.c b/plugins/imuxsock/imuxsock.c
+index eca9a34..90fc49e 100644
+--- a/plugins/imuxsock/imuxsock.c
++++ b/plugins/imuxsock/imuxsock.c
+@@ -350,8 +350,7 @@ static rsRetVal addInstance(void __attribute__((unused)) *pVal, uchar *pNewVal)
+ 	inst->bParseTrusted = cs.bParseTrusted;
+ 	inst->next = NULL;
+ 
+-	/* some legacy conf processing */
+-	free(cs.pLogHostName); /* reset hostname for next socket */
++	/* reset hostname for next socket */
+ 	cs.pLogHostName = NULL;
+ 
+ finalize_it:
+-- 
+1.9.3
+
diff --git a/SOURCES/rsyslog-7.4.7-rhbz1184410-imuxsock-create-path.patch b/SOURCES/rsyslog-7.4.7-rhbz1184410-imuxsock-create-path.patch
new file mode 100644
index 0000000..79bd6a1
--- /dev/null
+++ b/SOURCES/rsyslog-7.4.7-rhbz1184410-imuxsock-create-path.patch
@@ -0,0 +1,63 @@
+From cd5fccc6a3534d06b9a0a4d8c2669c48f9cede6a Mon Sep 17 00:00:00 2001
+From: Andy Goldstein <andy.goldstein@gmail.com>
+Date: Mon, 13 Jan 2014 12:46:54 -0700
+Subject: [PATCH] Fix instance configuration
+
+Correct typo in newInpInst so it uses inppblk instead of modpblk when
+configuring the instance.
+---
+ plugins/imuxsock/imuxsock.c | 26 +++++++++++++-------------
+ 1 file changed, 13 insertions(+), 13 deletions(-)
+
+diff --git a/plugins/imuxsock/imuxsock.c b/plugins/imuxsock/imuxsock.c
+index df504dd..8fda133 100644
+--- a/plugins/imuxsock/imuxsock.c
++++ b/plugins/imuxsock/imuxsock.c
+@@ -1216,31 +1216,31 @@ CODESTARTnewInpInst
+ 			continue;
+ 		if(!strcmp(inppblk.descr[i].name, "socket")) {
+ 			inst->sockName = (uchar*)es_str2cstr(pvals[i].val.d.estr, NULL);
+-		} else if(!strcmp(modpblk.descr[i].name, "createpath")) {
++		} else if(!strcmp(inppblk.descr[i].name, "createpath")) {
+ 			inst->bCreatePath = (int) pvals[i].val.d.n;
+-		} else if(!strcmp(modpblk.descr[i].name, "parsetrusted")) {
++		} else if(!strcmp(inppblk.descr[i].name, "parsetrusted")) {
+ 			inst->bParseTrusted = (int) pvals[i].val.d.n;
+-		} else if(!strcmp(modpblk.descr[i].name, "ignoreownmessages")) {
++		} else if(!strcmp(inppblk.descr[i].name, "ignoreownmessages")) {
+ 			inst->bDiscardOwnMsgs = (int) pvals[i].val.d.n;
+-		} else if(!strcmp(modpblk.descr[i].name, "unlink")) {
++		} else if(!strcmp(inppblk.descr[i].name, "unlink")) {
+ 			inst->bUnlink = (int) pvals[i].val.d.n;
+-		} else if(!strcmp(modpblk.descr[i].name, "hostname")) {
++		} else if(!strcmp(inppblk.descr[i].name, "hostname")) {
+ 			inst->pLogHostName = (uchar*)es_str2cstr(pvals[i].val.d.estr, NULL);
+-		} else if(!strcmp(modpblk.descr[i].name, "ignoretimestamp")) {
++		} else if(!strcmp(inppblk.descr[i].name, "ignoretimestamp")) {
+ 			inst->bIgnoreTimestamp = (int) pvals[i].val.d.n;
+-		} else if(!strcmp(modpblk.descr[i].name, "flowcontrol")) {
++		} else if(!strcmp(inppblk.descr[i].name, "flowcontrol")) {
+ 			inst->bUseFlowCtl = (int) pvals[i].val.d.n;
+-		} else if(!strcmp(modpblk.descr[i].name, "usesystimestamp")) {
++		} else if(!strcmp(inppblk.descr[i].name, "usesystimestamp")) {
+ 			inst->bUseSysTimeStamp = (int) pvals[i].val.d.n;
+-		} else if(!strcmp(modpblk.descr[i].name, "annotate")) {
++		} else if(!strcmp(inppblk.descr[i].name, "annotate")) {
+ 			inst->bAnnotate = (int) pvals[i].val.d.n;
+-		} else if(!strcmp(modpblk.descr[i].name, "usepidfromsystem")) {
++		} else if(!strcmp(inppblk.descr[i].name, "usepidfromsystem")) {
+ 			inst->bWritePid = (int) pvals[i].val.d.n;
+-		} else if(!strcmp(modpblk.descr[i].name, "ratelimit.interval")) {
++		} else if(!strcmp(inppblk.descr[i].name, "ratelimit.interval")) {
+ 			inst->ratelimitInterval = (int) pvals[i].val.d.n;
+-		} else if(!strcmp(modpblk.descr[i].name, "ratelimit.burst")) {
++		} else if(!strcmp(inppblk.descr[i].name, "ratelimit.burst")) {
+ 			inst->ratelimitBurst = (int) pvals[i].val.d.n;
+-		} else if(!strcmp(modpblk.descr[i].name, "ratelimit.severity")) {
++		} else if(!strcmp(inppblk.descr[i].name, "ratelimit.severity")) {
+ 			inst->ratelimitSeverity = (int) pvals[i].val.d.n;
+ 		} else {
+ 			dbgprintf("imuxsock: program error, non-handled "
+-- 
+1.9.3
+
diff --git a/SOURCES/rsyslog-7.4.7-rhbz1188503-imjournal-default-tag.patch b/SOURCES/rsyslog-7.4.7-rhbz1188503-imjournal-default-tag.patch
new file mode 100644
index 0000000..a87ac18
--- /dev/null
+++ b/SOURCES/rsyslog-7.4.7-rhbz1188503-imjournal-default-tag.patch
@@ -0,0 +1,161 @@
+From 4d68698ecaa4b13927352ce6bff74a0b6767abca Mon Sep 17 00:00:00 2001
+From: Tomas Heinrich <theinric@redhat.com>
+Date: Fri, 24 Apr 2015 23:51:20 +0200
+Subject: [PATCH] imjournal: enable setting a default message tag
+
+---
+ plugins/imjournal/imjournal.c | 62 ++++++++++++++++++++++++++++++-------------
+ 1 file changed, 43 insertions(+), 19 deletions(-)
+
+diff --git a/plugins/imjournal/imjournal.c b/plugins/imjournal/imjournal.c
+index b6910e8..cd22c3a 100755
+--- a/plugins/imjournal/imjournal.c
++++ b/plugins/imjournal/imjournal.c
+@@ -72,6 +72,7 @@ static struct configSettings_s {
+ 	int bIgnorePrevious;
+ 	int iDfltSeverity;
+ 	int iDfltFacility;
++	char *dfltTag;
+ } cs;
+ 
+ static rsRetVal facilityHdlr(uchar **pp, void *pVal);
+@@ -84,7 +85,8 @@ static struct cnfparamdescr modpdescr[] = {
+ 	{ "persiststateinterval", eCmdHdlrInt, 0 },
+ 	{ "ignorepreviousmessages", eCmdHdlrBinary, 0 },
+ 	{ "defaultseverity", eCmdHdlrSeverity, 0 },
+-	{ "defaultfacility", eCmdHdlrString, 0 }
++	{ "defaultfacility", eCmdHdlrString, 0 },
++	{ "defaulttag", eCmdHdlrGetWord, 0 },
+ };
+ static struct cnfparamblk modpblk =
+ 	{ CNFPARAMBLK_VERSION,
+@@ -95,6 +97,7 @@ static struct cnfparamblk modpblk =
+ #define DFLT_persiststateinterval 10
+ #define DFLT_SEVERITY LOG_PRI(LOG_NOTICE)
+ #define DFLT_FACILITY LOG_FAC(LOG_USER)
++#define DFLT_TAG "journal"
+ 
+ static int bLegacyCnfModGlobalsPermitted = 1;/* are legacy module-global config parameters permitted? */
+ 
+@@ -183,8 +186,13 @@ enqMsg(uchar *msg, uchar *pszTag, int iFacility, int iSeverity, struct timeval *
+ 	}
+ 	MsgSetFlowControlType(pMsg, eFLOWCTL_LIGHT_DELAY);
+ 	MsgSetInputName(pMsg, pInputName);
++	/* Recalculating the message length shouldn't cause problems as all
++	 * potential zero-bytes have been escaped in sanitizeValue(). */
+ 	len = strlen((char*)msg);
+ 	MsgSetRawMsg(pMsg, (char*)msg, len);
++	/* NB: SanitizeMsg() only touches the raw message and its
++	 * length which only contain the msg part. Thus the TAG and
++	 * other fields are not sanitized. */
+ 	if(len > 0)
+ 		parser.SanitizeMsg(pMsg);
+ 	MsgSetMSGoffs(pMsg, 0);	/* we do not have a header... */
+@@ -221,7 +229,7 @@ readjournal() {
+ 
+ 	/* Information from messages */
+ 	char *message = NULL;
+-	char *sys_iden;
++	char *sys_iden = NULL;
+ 	char *sys_iden_help = NULL;
+ 
+ 	const void *get;
+@@ -283,27 +291,37 @@ readjournal() {
+ 	/* Get message identifier, client pid and add ':' */
+ 	if (sd_journal_get_data(j, "SYSLOG_IDENTIFIER", &get, &length) >= 0) {
+ 		CHKiRet(sanitizeValue(((const char *)get) + 18, length - 18, &sys_iden));
+-	} else {
+-		CHKmalloc(sys_iden = strdup("journal"));
+ 	}
+ 
+-	if (sd_journal_get_data(j, "SYSLOG_PID", &pidget, &pidlength) >= 0) {
+-		char *sys_pid;
++	if (sys_iden == NULL && !cs.dfltTag[0]) {
++		/* This is a special case: if no tag was obtained from
++		 * the message and the user has set the default tag to
++		 * an empty string, nothing is inserted.
++		 */
++		CHKmalloc(sys_iden_help = calloc(1, 1));
++	} else {
++		if (sys_iden == NULL) {
++			/* Use a predefined tag if it can't be obtained from the message */
++			CHKmalloc(sys_iden = strdup(cs.dfltTag));
++		}
++		if (sd_journal_get_data(j, "SYSLOG_PID", &pidget, &pidlength) >= 0) {
++			char *sys_pid;
+ 
+-		CHKiRet_Hdlr(sanitizeValue(((const char *)pidget) + 11, pidlength - 11, &sys_pid)) {
+-			free (sys_iden);
+-			FINALIZE;
++			CHKiRet_Hdlr(sanitizeValue(((const char *)pidget) + 11, pidlength - 11, &sys_pid)) {
++				free (sys_iden);
++				FINALIZE;
++			}
++			r = asprintf(&sys_iden_help, "%s[%s]:", sys_iden, sys_pid);
++			free (sys_pid);
++		} else {
++			r = asprintf(&sys_iden_help, "%s:", sys_iden);
+ 		}
+-		r = asprintf(&sys_iden_help, "%s[%s]:", sys_iden, sys_pid);
+-		free (sys_pid);
+-	} else {
+-		r = asprintf(&sys_iden_help, "%s:", sys_iden);
+-	}
+ 
+-	free (sys_iden);
++		free (sys_iden);
+ 
+-	if (-1 == r) {
+-		ABORT_FINALIZE(RS_RET_OUT_OF_MEMORY);
++		if (-1 == r) {
++			ABORT_FINALIZE(RS_RET_OUT_OF_MEMORY);
++		}
+ 	}
+ 
+ 	json = json_object_new_object();
+@@ -628,11 +646,14 @@ CODESTARTbeginCnfLoad
+ 	cs.ratelimitInterval = 600;
+ 	cs.iDfltSeverity = DFLT_SEVERITY;
+ 	cs.iDfltFacility = DFLT_FACILITY;
++	cs.dfltTag = NULL;
+ ENDbeginCnfLoad
+ 
+ 
+ BEGINendCnfLoad
+ CODESTARTendCnfLoad
++	if (cs.dfltTag == NULL)
++		cs.dfltTag = strdup(DFLT_TAG);
+ ENDendCnfLoad
+ 
+ 
+@@ -648,6 +669,7 @@ ENDactivateCnf
+ 
+ BEGINfreeCnf
+ CODESTARTfreeCnf
++	free(cs.dfltTag);
+ ENDfreeCnf
+ 
+ /* open journal */
+@@ -728,6 +750,8 @@ CODESTARTsetModCnf
+ 			fac = p = es_str2cstr(pvals[i].val.d.estr, NULL);
+ 			facilityHdlr((uchar **) &p, (void *) &cs.iDfltFacility);
+ 			free(fac);
++		} else if (!strcmp(modpblk.descr[i].name, "defaulttag")) {
++			cs.dfltTag = (char *)es_str2cstr(pvals[i].val.d.estr, NULL);
+ 		} else {
+ 			dbgprintf("imjournal: program error, non-handled "
+ 				"param '%s' in beginCnfLoad\n", modpblk.descr[i].name);
+@@ -786,8 +810,8 @@ CODEmodInit_QueryRegCFSLineHdlr
+ 		NULL, &cs.iDfltSeverity, STD_LOADABLE_MODULE_ID));
+ 	CHKiRet(omsdRegCFSLineHdlr((uchar *)"imjournaldefaultfacility", 0, eCmdHdlrCustomHandler,
+ 		facilityHdlr, &cs.iDfltFacility, STD_LOADABLE_MODULE_ID));
+-
+-
++	CHKiRet(omsdRegCFSLineHdlr((uchar *)"imjournaldefaulttag", 0, eCmdHdlrGetWord,
++		NULL, &cs.dfltTag, STD_LOADABLE_MODULE_ID));
+ ENDmodInit
+ /* vim:set ai:
+  */
+-- 
+1.9.3
+
diff --git a/SOURCES/rsyslog-7.4.7-rhbz1202489-path-creation-race.patch b/SOURCES/rsyslog-7.4.7-rhbz1202489-path-creation-race.patch
new file mode 100644
index 0000000..de11ba4
--- /dev/null
+++ b/SOURCES/rsyslog-7.4.7-rhbz1202489-path-creation-race.patch
@@ -0,0 +1,55 @@
+From 625f4b9aacfa7fa226949c8d5a36c298196432ea Mon Sep 17 00:00:00 2001
+From: Tomas Heinrich <theinric@redhat.com>
+Date: Wed, 8 Jul 2015 17:16:46 +0200
+Subject: [PATCH] Fix race-condition detection in path-creation code
+
+The affected code is used to detect a race condition in between
+testing for the existence of a directory and creating it if it didn't
+exist.  The variable tracking the number of attempts wasn't reset for
+subsequent elements in the path, thus limiting the number of
+reattempts to one per the whole path, instead of one per each path
+element.
+
+It appears the detection never actually worked due to wrong error
+checking. errno needs to be checked to determin the reason for the
+failure.
+---
+ runtime/srutils.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/runtime/srutils.c b/runtime/srutils.c
+index 6a509b4..e66c1cd 100644
+--- a/runtime/srutils.c
++++ b/runtime/srutils.c
+@@ -195,7 +195,6 @@ int makeFileParentDirs(uchar *szFile, size_t lenFile, mode_t mode,
+         uchar *p;
+         uchar *pszWork;
+         size_t len;
+-	int err;
+ 	int iTry = 0;
+ 	int bErr = 0;
+ 
+@@ -210,9 +209,10 @@ int makeFileParentDirs(uchar *szFile, size_t lenFile, mode_t mode,
+                 if(*p == '/') {
+ 			/* temporarily terminate string, create dir and go on */
+                         *p = '\0';
++			iTry = 0;
+ again:
+                         if(access((char*)pszWork, F_OK)) {
+-                                if((err = mkdir((char*)pszWork, mode)) == 0) {
++                                if(mkdir((char*)pszWork, mode) == 0) {
+ 					if(uid != (uid_t) -1 || gid != (gid_t) -1) {
+ 						/* we need to set owner/group */
+ 						if(chown((char*)pszWork, uid, gid) != 0)
+@@ -223,7 +223,7 @@ again:
+ 							 */
+ 					}
+ 				} else {
+-					if(err == EEXIST && iTry == 0) {
++					if(errno == EEXIST && iTry == 0) {
+ 						iTry = 1;
+ 						goto again;
+ 						}
+-- 
+1.9.3
+
diff --git a/SOURCES/rsyslog-7.4.7-rhbz1238713-html-docs.patch b/SOURCES/rsyslog-7.4.7-rhbz1238713-html-docs.patch
new file mode 100644
index 0000000..8a67345
--- /dev/null
+++ b/SOURCES/rsyslog-7.4.7-rhbz1238713-html-docs.patch
@@ -0,0 +1,432 @@
+From 6a1d227e4ee199bea2c8ba5bc01b7ece6da5e75b Mon Sep 17 00:00:00 2001
+From: Tomas Heinrich <theinric@redhat.com>
+Date: Thu, 23 Jul 2015 11:30:13 +0200
+Subject: [PATCH] Various corrections to the HTML documentation
+
+Provided by Stephen Wadeley.
+---
+ doc/features.html             |  5 +--
+ doc/free_support.html         | 12 +++---
+ doc/history.html              |  8 +---
+ doc/index.html                | 29 +++++++-------
+ doc/manual.html               | 89 ++++++++++++++++++-------------------------
+ doc/rsyslog_conf_actions.html |  2 +-
+ doc/troubleshoot.html         | 20 +++++-----
+ doc/version_naming.html       |  8 ++--
+ 8 files changed, 76 insertions(+), 97 deletions(-)
+
+diff --git a/doc/features.html b/doc/features.html
+index 626ff65..8fc2802 100644
+--- a/doc/features.html
++++ b/doc/features.html
+@@ -28,7 +28,7 @@ OpenTDS (MS SQL, Sybase), SQLLite, Ingres, Oracle, and mSQL via libdbi,
+ a database abstraction layer (almost as good as native)</li>
+ <li>native support for <a href="ommail.html">sending
+ mail messages</a> (first seen in 3.17.0)</li>
+-<li>support for (plain) tcp based syslog - much better
++<li>support for (plain) TCP based syslog - much better
+ reliability</li>
+ <li>support for sending and receiving compressed syslog messages</li>
+ <li>support for on-demand on-disk spooling of messages that can
+@@ -141,9 +141,6 @@ large number of applications. You may also read my blog post on the
+ future of liblogging, which contains interesting information about the <a href="http://rgerhards.blogspot.com/2007/09/where-is-liblogging-heading-to.html">
+ future of RFC 3195 in rsyslog</a>.</li>
+ </ul>
+-<p>To see when each feature was added, see the
+-<a href="http://www.rsyslog.com/Topic4.phtml">rsyslog
+-change log</a> (online only).</p>
+ 
+ <p>[<a href="manual.html">manual index</a>]
+ [<a href="rsyslog_conf.html">rsyslog.conf</a>]
+diff --git a/doc/free_support.html b/doc/free_support.html
+index 182a82c..4e33102 100644
+--- a/doc/free_support.html
++++ b/doc/free_support.html
+@@ -16,16 +16,16 @@ system forward.
+ with a solution (but rather a link to this page ;)). I hope this does not offend you. The
+ reason is quite simple: If I do personal support, you gain some advantage without
+ contributing something back. Think about it: if you ask your question on the public
+-forum or mailing list, other with the same problem can you and, most importantly, even
++forum or mailing list, others with the same problem can help you and, most importantly, even
+ years later find your post (and the answer) and get the problem solved. So by
+-solving your issue in public, you help create a great community ressource and also
++solving your issue in public, you help create a great community resources and also
+ help your fellow users finding solutions quicker. In the long term, this
+ also contributes to improved code because the more questions users can find
+ solutions to themselves, the fewer I need to look at.
+-<p>But it comes even better: the rsyslog community is much broader than Rainer ;) - there
+-are helpful other members hanging around at the public places. They often answer
++<p>But it becomes even better: the rsyslog community is much broader than Rainer ;) - there
++are other helpful members hanging around at the public places. They often answer
+ questions, so that I do not need to look at them (btw, once again a big "thank you", folks!).
+-And, more important, those folks have different background than me. So they often
++And, more important, those folks have a different background than me. So they often
+ either know better how to solve your problem (e.g. because it is distro-specific)
+ or they know how to better phrase it (after all, I like abstract terms and concepts ;)).
+ So you do yourself a favor if you use the public places.
+@@ -36,7 +36,7 @@ mailing lists, the
+ <a href="http://lists.adiscon.net/mailman/listinfo/rsyslog">rsyslog mailing list</a>
+ also offers excellent advise.
+ <p><b>Don't like to post your question in a public place?</b> Well, then you should
+-consider purchasing <a href="professional_support.html">rsyslog professional support</a>.
++consider purchasing <a href="http://www.rsyslog.com/professional-services/">rsyslog professional support</a>.
+ The fees are very low and help fund the project. If you use rsyslog seriously inside
+ a corporate environment, there is no excuse for not getting one of the support
+ packages ;)
+diff --git a/doc/history.html b/doc/history.html
+index 57b6400..e3c12e3 100644
+--- a/doc/history.html
++++ b/doc/history.html
+@@ -105,7 +105,7 @@ resulting in loadable input modules, now running on a separate thread each.</p><
+ <b>January, 2nd 2008</b>, rsyslog 1.21.2 is re-released as rsyslog v2.0.0 
+ stable. This is a major milestone as far as the stable build is concerned. v3 is 
+ not yet officially announced. Other than the stable v2 build, v3 will not be 
+-backwards compatibile (including missing compatibility to stock sysklogd) for 
++backwards compatible (including missing compatibility to stock sysklogd) for 
+ quite a while. Config file changes are required and some command line options do 
+ no longer work due to the new design.</p><p>On <span style="font-weight: bold;">January, 31st 2008</span>
+ the new massively-multithreaded queue engine was released for the first
+@@ -137,11 +137,7 @@ namely anonymization support, as well as log file signing and
+ encryption capabilities.
+ 
+ <p>Be sure to visit Rainer's <a href="http://rgerhards.blogspot.com/">syslog blog</a>
+-to get some more insight into the development and futures of rsyslog and syslog in general. 
++to get some more insight into the development and features of rsyslog and syslog in general. 
+ Don't be shy to post to either the blog or the
+ <a href="http://www.rsyslog.com/PNphpBB2.phtml">rsyslog forums</a>.</p>
+-<h2>Some useful links</h2>
+-<ul>
+-	<li><a href="http://www.rsyslog.com/Topic4.phtml">the rsyslog change log</a></li>
+-</ul>
+ </body></html>
+diff --git a/doc/index.html b/doc/index.html
+index d753e2e..c8172f3 100644
+--- a/doc/index.html
++++ b/doc/index.html
+@@ -6,26 +6,27 @@
+ is an enhanced syslogd suitable both for small systems as
+ well as large enterprises.</b>
+ <p>This page provide a few quick pointers which hopefully make your
+-experience with rsyslog a pleasant one. These are
++experience with rsyslog a pleasant one. These are:
+ <ul>
+-<li><b>Most importantly, the <a href="manual.html">rsyslog manual</a></b> - this points to locally
++<li>The <a href="manual.html">rsyslog manual</a> - this points to locally
+ installed documentation which exactly matches the version you have installed.
+ It is highly suggested to at least briefly look over these files.
+-<li>The <a href="http://www.rsyslog.com">rsyslog web site</a> which offers
+-probably every information you'll ever need (ok, just kidding...).
+-<li>The <a href="http://www.rsyslog.com/status">project status page</a> provides
+-information on current releases
+-<li>and the <a href="troubleshoot.html">troubleshooting guide</a> hopefully helps if
+-things do not immediately work out
++<li>The <a href="http://www.rsyslog.com">rsyslog web site</a>, which offers
++information for different versions of rsyslog.
++<li>The <a href="troubleshoot.html">troubleshooting guide</a> hopefully helps if
++things do not immediately work out.
+ </ul>
+ <p>In general, rsyslog supports plain old syslog.conf format, except that the
+ config file is now called rsyslog.conf. This should help you get started
+-quickly.
+-To do the really cool things, though,
+-you need to learn a bit about its new features.
++quickly.</p>
++<pa>
+ The man pages offer a bare minimum of information (and are still quite long). Read the 
+-<a href="manual.html">html documentation</a> instead.
++built-in <a href="manual.html">html documentation</a> instead.
+ When you change the configuration, remember to restart rsyslogd, because otherwise
+-it will not use your new settings (and you'll end up totally puzzled why this great
+-config of yours does not even work a bit...;))
++it will not use your new settings.</p>
++<p>The built-in <a href="history.html">rsyslog history</a>
++page is for you if you would like to learn a little more
++on why there is an rsyslog at all. If you are interested why you should
++care about rsyslog at all, you may want to read Rainer's essay on "<a href="http://rgerhards.blogspot.com/2007/08/why-does-world-need-another-syslogd.html">why
++the world needs another syslogd</a>".</p>
+ </body></html>
+diff --git a/doc/manual.html b/doc/manual.html
+index f0fffa8..ecf8cae 100644
+--- a/doc/manual.html
++++ b/doc/manual.html
+@@ -2,11 +2,11 @@
+ <html><head><title>rsyslog documentation</title></head>
+ <body>
+ <h1>RSyslog - Documentation</h1>
+-<p><b><a href="http://www.rsyslog.com/">Rsyslog</a>
+-is an enhanced syslogd
++<p><a href="http://www.rsyslog.com/">Rsyslog</a>
++is an enhanced <b>syslogd</b>
+ supporting, among others, <a href="rsyslog_mysql.html">MySQL</a>,
+ PostgreSQL, <a href="http://wiki.rsyslog.com/index.php/FailoverSyslogServer">failover
+-log destinations</a>, syslog/tcp, fine grain output format
++log destinations</a>, syslog over TCP, fine grain output format
+ control, high precision timestamps, queued operations and the ability to filter on any message
+ part.</b>
+ It is quite compatible to stock sysklogd and can be used as a drop-in
+@@ -16,48 +16,37 @@ relay chains while at the same time being very easy to setup for the
+ novice user. And as we know what enterprise users really need, there are
+ also <a href="http://www.rsyslog.com/professional-services"> rsyslog
+ professional services</a> available directly from the source!</p>
+-<p><b>Please visit the <a href="http://www.rsyslog.com/sponsors">rsyslog sponsor's page</a>
++<p>Please visit the <a href="http://www.rsyslog.com/sponsors">rsyslog sponsor's page</a>
+ to honor the project sponsors or become one yourself!</b> We are very grateful for any help towards the
+ project goals.</p>
+-<p><b>This documentation is for version 7.4.7 (v7.4-stable branch) of rsyslog.</b>
+-Visit the <i><a href="http://www.rsyslog.com/status">rsyslog status page</a></i></b>
+-to obtain current version information and project status.
+-</p><p><b>If you like rsyslog, you might
+-want to lend us a helping hand. </b>It doesn't require a lot of
++<p><b>This documentation is for version 7.4.7 (v7.4-stable branch) of rsyslog.</b> If you use an older
++version, be sure to use the doc that came with it.</p>
++<p>If you like rsyslog, you might
++want to lend us a helping hand. It doesn't require a lot of
+ time - even a single mouse click helps. Learn <a href="how2help.html">how to help the rsyslog project</a>.
+ Due to popular demand, there is now a <a href="rsyslog_ng_comparison.html">side-by-side comparison
+ between rsyslog and syslog-ng</a>.</p>
+-<p>If you are upgrading from rsyslog v2 or stock sysklogd,
+-<a href="v3compatibility.html">be sure to read the rsyslog v3 compatibility notes</a>,
+-and if you are upgrading from v3, read the
+-<a href="v4compatibility.html">rsyslog v4 compatibility notes</a>,
+-if you upgrade from v4, read the
+-<a href="v5compatibility.html">rsyslog v5 compatibility notes</a>, and
+-if you upgrade from v5, read the
+-<a href="v6compatibility.html">rsyslog v6 compatibility notes</a>.
+-if you upgrade from v6, read the
+-<a href="v7compatibility.html">rsyslog v7 compatibility notes</a>.
+-<p>Rsyslog will work even
+-if you do not read the doc, but doing so will definitely improve your experience.</p>
+-<p><b>Follow the links below for the</b></p>
++<p><b>If you are upgrading</b>
+ <ul>
+-<li><a href="troubleshoot.html">troubleshooting rsyslog problems</a></li>
+-<li><a href="rsyslog_conf.html">configuration file format (rsyslog.conf)</a></li>
+-<li><a href="http://www.rsyslog.com/tool-regex">a regular expression checker/generator tool for rsyslog</a></li>
+-<li> <a href="property_replacer.html">property replacer, an important core component</a></li>
+-<li><a href="bugs.html">rsyslog bug list</a></li>
++<li>from rsyslog v2 or stock sysklogd,
++<a href="v3compatibility.html">be sure to read the rsyslog v3 compatibility notes</a>,</li>
++<li>if you are upgrading from v3, read the
++<a href="v4compatibility.html">rsyslog v4 compatibility notes</a>,</li>
++<li>if you are upgrading from v4, read the
++<a href="v5compatibility.html">rsyslog v5 compatibility notes</a>,</li>
++<li>if you are upgrading from v5, read the
++<a href="v6compatibility.html">rsyslog v6 compatibility notes</a>, and </li>
++<li>if you are upgrading from v6, read the
++<a href="v7compatibility.html">rsyslog v7 compatibility notes</a>.</li>
++</ul>
++<p><b>The built-in Docs</b></p>
++<ul>
++<li><a href="rsyslog_conf.html">The rsyslog.conf file format and its configuration</a></li>
++<li><a href="property_replacer.html">property replacer, an important core component</a></li>
+ <li><a href="messageparser.html">understanding rsyslog message parsers</a></li>
+ <li><a href="generic_design.html">backgrounder on generic syslog application design</a></li>
+ <li><a href="modules.html">description of rsyslog modules</a></li>
+-<li><a href="rsyslog_packages.html">rsyslog packages</a></li>
+-</ul>
+-<p><b>To keep current on rsyslog development, follow
+-<a href="http://twitter.com/rgerhards">Rainer's twitter feed</a>.</b></p>
+-<p><b>We have some in-depth papers on</b></p>
+-<ul>
+-<li><a href="install.html">installing rsyslog</a></li>
+-<li><a href="build_from_repo.html">obtaining rsyslog from the source repository</a></li>
+-<li><a href="ipv6.html">rsyslog and IPv6</a> (which is fully supported)</li>
++<li><a href="ipv6.html">rsyslog and IPv6</a></li>
+ <li><a href="rsyslog_secure_tls.html">native TLS encryption for syslog</a></li>
+ <li><a href="multi_ruleset.html">using multiple rule sets in rsyslog</a></li>
+ <li><a href="rsyslog_stunnel.html">ssl-encrypting syslog with stunnel</a></li>
+@@ -69,36 +58,31 @@ if you do not read the doc, but doing so will definitely improve your experience
+ php-syslog-ng with rsyslog</a></li>
+ <li><a href="rsyslog_recording_pri.html">recording
+ the syslog priority (severity and facility) to the log file</a></li>
+-<li><a href="http://www.rsyslog.com/Article19.phtml">preserving
+-syslog sender over NAT</a> (online only)</li>
+ <li><a href="gssapi.html">an overview and howto of rsyslog gssapi support</a></li>
+ <li><a href="debug.html">debug support in rsyslog</a></li>
++<li><a href="troubleshoot.html">troubleshooting rsyslog problems</a></li>
++<li><a href="bugs.html">rsyslog bug list</a></li>
+ <li>Developer Documentation
+   <ul>
++  <li><a href="rsyslog_packages.html">rsyslog packages</a></li>
++  <li><a href="install.html">installing rsyslog</a></li>
++  <li><a href="build_from_repo.html">obtaining rsyslog from the source repository</a></li>
+   <li><a href="build_from_repo.html">building rsyslog from the source repository</a></li>
+   <li><a href="dev_oplugins.html">writing rsyslog output plugins</a></li>
+   <li><a href="dev_queue.html">the rsyslog message queue object (developer's view)</a></li>
+   </ul></li>
+ </ul>
+-<p>Our <a href="history.html">rsyslog history</a>
+-page is for you if you would like to learn a little more
+-on why there is an rsyslog at all. If you are interested why you should
+-care about rsyslog at all, you may want to read Rainer's essay on "<a href="http://rgerhards.blogspot.com/2007/08/why-does-world-need-another-syslogd.html">why
+-the world needs another syslogd</a>".</p>
+-<p>Documentation is added continuously. Please note that the
+-documentation here
+-matches only the current version of rsyslog. If you use an older
+-version, be sure to use the doc that came with it.</p>
++
+ <p><b>You can also browse the following online resources:</b></p>
+ <ul>
++<li><a href="http://www.rsyslog.com/Article19.phtml">preserving
++syslog sender over NAT</a></li>
++<li><a href="http://www.rsyslog.com/tool-regex">a regular expression checker/generator tool for rsyslog</a></li>
+ <li>the <a href="http://wiki.rsyslog.com/">rsyslog
+ wiki</a>, a community resource which&nbsp;includes <a href="http://wiki.rsyslog.com/index.php/Configuration_Samples">rsyslog configuration examples</a></li>
+-<li><a href="http://www.rsyslog.com/module-Static_Docs-view-f-manual.html.phtml">rsyslog
+-online documentation (most current version only)</a></li>
+ 
+ <li><a href="http://kb.monitorware.com/rsyslog-f40.html">rsyslog discussion forum - use this for technical support</a></li>
+ <li><a href="http://www.rsyslog.com/Topic8.phtml">rsyslog video tutorials</a></li>
+-<li><a href="http://www.rsyslog.com/Topic4.phtml">rsyslog change log</a></li>
+ <li><a href="http://www.rsyslog.com/Topic3.phtml">rsyslog FAQ</a></li> 
+ <li><a href="http://www.monitorware.com/en/syslog-enabled-products/">syslog device configuration guide</a> (off-site)</li>
+ <li><a href="http://www.rsyslog.com/PNphpBB2.phtml">rsyslog discussion forum - use this for technical support</a></li>
+@@ -111,7 +95,8 @@ may find
+ <a href="http://blog.gerhards.net/">blog</a> an
+ interesting read (filter on syslog and rsyslog tags).
+ Or meet <a href="http://www.facebook.com/people/Rainer-Gerhards/1349393098">Rainer Gerhards at Facebook</a>
+-or <a href="https://plus.google.com/112402185904751517878/posts">Google+</a>.
++or <a href="https://plus.google.com/112402185904751517878/posts">Google+</a>.</p>
++<pa>
+ If you would like to use rsyslog source code inside your open source project, you can do that without
+ any restriction as long as your license is GPLv3 compatible. If your license is incompatible to GPLv3,
+ you may even be still permitted to use rsyslog source code. However, then you need to look at the way
+@@ -119,5 +104,5 @@ you may even be still permitted to use rsyslog source code. However, then you ne
+ <p>Feedback is always welcome, but if you have a support question, please do not
+ mail Rainer directly (<a href="free_support.html">why not?</a>) - use the
+ <a href="http://lists.adiscon.net/mailman/listinfo/rsyslog">rsyslog mailing list</a>
+-or <a href="http://kb.monitorware.com/rsyslog-f40.html">rsyslog formum</a> instead.
++or <a href="http://kb.monitorware.com/rsyslog-f40.html">rsyslog forum</a> instead.
+ </body></html>
+diff --git a/doc/rsyslog_conf_actions.html b/doc/rsyslog_conf_actions.html
+index 50b13a0..c0c29c7 100644
+--- a/doc/rsyslog_conf_actions.html
++++ b/doc/rsyslog_conf_actions.html
+@@ -5,7 +5,7 @@
+ <a href="rsyslog_conf.html">back</a>
+ <h2>Actions</h2>
+ Action object describe what is to be done with a message. They are
+-implemented via <a href="rsyslog_conf_modules.html#om">outpout modules</a>.
++implemented via <a href="rsyslog_conf_modules.html#om">output modules</a>.
+ <p>The action object has different parameters:
+ <ul>
+ <li>those that apply to all actions and are action specific. These
+diff --git a/doc/troubleshoot.html b/doc/troubleshoot.html
+index a0303a2..ef3a4b1 100644
+--- a/doc/troubleshoot.html
++++ b/doc/troubleshoot.html
+@@ -4,8 +4,8 @@
+ <h2>troubleshooting rsyslog</h2>
+ <p><b>Having trouble with <a href="http://www.rsyslog.com">rsyslog</a>?</b>
+ This page provides some tips on where to look for help and what to do
+-if you need to ask for assistance. This page is continously being expanded.
+-<p>Useful troubleshooting ressources are:
++if you need to ask for assistance. This page is continuously being expanded.
++<p>Useful troubleshooting resources are:
+ <ul>
+ <li>The <a href="http://www.rsyslog.com/doc">rsyslog documentation</a> - note that the online version always covers
+ the most recent development version. However, there is a version-specific
+@@ -19,7 +19,7 @@ is a rsyslog-doc package, that often needs to be installed separately.
+ <p>A common trouble source are <a href="syslog_parsing.html">ill-formed syslog messages</a>, which
+ lead to to all sorts of interesting problems, including malformed hostnames and dates.
+ Read the quoted guide to find relief. A common symptom is that the %HOSTNAME% property is
+-used for generating dynafile names, but some glibberish shows up. This is caused by the
++used for generating dynafile names, but some gibberish shows up. This is caused by the
+ malformed syslog messages, so be sure to read the 
+ <a href="syslog_parsing.html">guide</a> if you face that problem. Just let me add that the
+ common work-around is to use %FROMHOST% or %FROMHOST-IP% instead. These do not take the
+@@ -28,7 +28,7 @@ the socket layer). Of course, this does not work over NAT or relay chains, where
+ only cure is to make sure senders emit well-formed messages.
+ <p><b>Configuration Problems</b>
+ <p>Rsyslog 3.21.1 and above has been enhanced to support extended configuration checking.
+-It offers a special command line switch (-N1) that puts it into "config verfication mode".
++It offers a special command line switch (-N1) that puts it into "config verification mode".
+ In that mode, it interprets and check the configuration file, but does not startup. This
+ mode can be used in parallel to a running instance of rsyslogd.
+ <p>To enable it, run rsyslog interactively as follows:
+@@ -56,7 +56,7 @@ The mailing list is probably a good place for complex questions.
+ </ul>
+ <p><b>Debug Log</b>
+ <p>If you ask for help, there are chances that we need to ask for an rsyslog debug log.
+-The debug log is a detailled report of what rsyslog does during processing. As such, it may
++The debug log is a detailed report of what rsyslog does during processing. As such, it may
+ even be useful for your very own troubleshooting. People have seen things inside their debug
+ log that enabled them to find problems they did not see before. So having a look at the
+ debug log, even before asking for help, may be useful.
+@@ -89,7 +89,7 @@ meaningless value. <b>Do not delete the lines</b>, as this renders the debug log
+ unusable (and makes Rainer quite angry for wasted time, aka significantly reduces the chance
+ he will remain motivated to look at your problem ;)). For the same reason, make sure
+ whatever you change is changed consistently. Really!
+-<p>While most debug log files are moderately large, some can get quite to extremly large.
++<p>While most debug log files are moderately large, some can get quite to extremely large.
+ For those on the larger side, it is a good idea to zip them. If the file is less than
+ around 100KiB, it's probably not necessary.
+ <p>A good place to post your debug log is at the
+@@ -99,9 +99,9 @@ various common formats, but rejects others for security reasons. The zip, txt, a
+ are definitely permitted, so it probably is a good idea to use one of them. For others, please
+ simply try and revert to another format if the forum doesn't like what you used.
+ <p>
+-Please note that all information in your debug file is publically visiable.
++Please note that all information in your debug file is publicly visible.
+ If this is not acceptable for you, you are probably a
+-candidate for a <a href="professional_support.html">commercial support contract</a>. Free support
++candidate for a <a href="http://www.rsyslog.com/professional-services/">commercial support contract</a>. Free support
+ comes without any guarantees, include no guarantee on confidentiality
+ [aka "we don't want to be sued for work were are not even paid for ;)].
+ <b>So if you submit debug logs, do so at your sole risk</b>. By submitting them, you accept
+@@ -115,11 +115,11 @@ you may see a serious problem during deployments in demanding, non-standard, env
+ (hopefully not with a stable version, but chances are good you'll run into troubles with
+ the development versions).
+ <p>Active support from the user base is very important to help us track down those things.
+-Most often, serious problems are the result of some memory misadressing. During development,
++Most often, serious problems are the result of some memory misaddressing. During development,
+ we routinely use valgrind, a very well and capable memory debugger. This helps us to create
+ pretty clean code. But valgrind can not detect everything, most importantly not code pathes 
+ that are never executed. So of most use for us is information about aborts and abort locations.
+-<p>Unforutnately, faults rooted in adressing errors typically show up only later, so the
++<p>Unfortunately, faults rooted in addressing errors typically show up only later, so the
+ actual abort location is in an unrelated spot. To help track down the original spot,
+ <a href="http://www.gnu.org/software/hello/manual/libc/Heap-Consistency-Checking.html">libc
+ later than 5.4.23 offers support</a> for finding, and possible temporary relief from it,
+diff --git a/doc/version_naming.html b/doc/version_naming.html
+index 3bfa19b..fe59d19 100644
+--- a/doc/version_naming.html
++++ b/doc/version_naming.html
+@@ -23,7 +23,7 @@ maybe around once a year. A major version increment has important
+ implications from the support side: without support contracts, the
+ current major version's last stable release and the last stable release
+ of the version immediately below it are supported (Adiscon, the rsyslog
+-sponsor, offers <a href="professional_support.html">support contracts</a> covering all other versions).</p>
++sponsor, offers <a href="http://www.rsyslog.com/professional-services/">support contracts</a> covering all other versions).</p>
+ <p>The <span style="font-weight: bold;">minor</span> version is
+ incremented whenever a non-trivial new feature is planned to be added.
+ Triviality of a feature is simply determined by time estimated to
+@@ -57,7 +57,7 @@ more if someone has asked for the feature). So we do not like to wait
+ for the original focus feature to be ready (what could take maybe three
+ more weeks). As a result, we release the new features. But that version
+ will also include partial code of the focus feature. Typically this
+-doesn't hurt as long as noone tries to use it (what of course would
++doesn't hurt as long as no one tries to use it (what of course would
+ miserably fail). But still, part of the new code is already in it. When
+ we release such a "minor-feature enhanced" but "focus-feature not yet
+ completed" version, we need a way to flag it. In current thinking, that
+@@ -85,14 +85,14 @@ the next minor development version while the previous minor version is
+ still a -rc because it is not yet considered sufficiently stable.</p><p>Note: <span style="font-weight: bold;">the
+ absence of the -devstate part indicates that a release is stable.
+ Following the same logic, any release with a -devstate part is unstable.</span></p><p>A quick sample:&nbsp;</p><p>4.0.0
+-is the stable release. We begin to implement relp, moving to
++is the stable release. We begin to implement RELP, moving to
+ major.minor to 4.1. While we develop it, someone requests a trivial
+ feature, which we implement. We need to release, so we will have
+ 4.1.0-mf0. Another new feature is requested, move to 4.1.0-mf2. A first
+ version of RELP is implemented: 4.1.0-rc0. A new trivial feature is
+ implemented: 4.1.0-rc1. Relp is being enhanced: 4.1.0-rc2. We now feel
+ RELP is good enough for the time being and begin to implement TLS on
+-plain /Tcp syslog: logical increment to 4.2. Now another new feature in
++plain TCP syslog: logical increment to 4.2. Now another new feature in
+ that tree: 4.2.0-mf0. Note that we now have 4.0.0 (stable) and
+ 4.1.0-rc2 and 4.1.0-mf0 (both devel). We find a big bug in RELP coding.
+ Two new releases: 4.1.0-rc3, 4.2.0-mf1 (the bug fix acts like a
+-- 
+1.9.3
+
diff --git a/SOURCES/rsyslog-7.4.7-rhbz1249907-imjournal-default-tag.patch b/SOURCES/rsyslog-7.4.7-rhbz1249907-imjournal-default-tag.patch
deleted file mode 100644
index b91cbe7..0000000
--- a/SOURCES/rsyslog-7.4.7-rhbz1249907-imjournal-default-tag.patch
+++ /dev/null
@@ -1,264 +0,0 @@
-From 9c8beb13cb0d584fb4dc8561c42fa4ae73c841a7 Mon Sep 17 00:00:00 2001
-From: Tomas Heinrich <theinric@redhat.com>
-Date: Thu, 22 Oct 2015 11:56:27 +0200
-Subject: [PATCH] imjournal: enable setting a default message TAG
-
-Also escape zero bytes in fields' values.
----
- plugins/imjournal/imjournal.c | 129 +++++++++++++++++++++++++-----------------
- 1 file changed, 77 insertions(+), 52 deletions(-)
-
-diff --git a/plugins/imjournal/imjournal.c b/plugins/imjournal/imjournal.c
-index 7d42b84..0795e07 100755
---- a/plugins/imjournal/imjournal.c
-+++ b/plugins/imjournal/imjournal.c
-@@ -70,6 +70,7 @@ static struct configSettings_s {
- 	int bIgnorePrevious;
- 	int iDfltSeverity;
- 	int iDfltFacility;
-+	char *dfltTag;
- } cs;
- 
- static rsRetVal facilityHdlr(uchar **pp, void *pVal);
-@@ -82,7 +83,8 @@ static struct cnfparamdescr modpdescr[] = {
- 	{ "persiststateinterval", eCmdHdlrInt, 0 },
- 	{ "ignorepreviousmessages", eCmdHdlrBinary, 0 },
- 	{ "defaultseverity", eCmdHdlrSeverity, 0 },
--	{ "defaultfacility", eCmdHdlrString, 0 }
-+	{ "defaultfacility", eCmdHdlrString, 0 },
-+	{ "defaulttag", eCmdHdlrGetWord, 0 },
- };
- static struct cnfparamblk modpblk =
- 	{ CNFPARAMBLK_VERSION,
-@@ -93,6 +95,7 @@ static struct cnfparamblk modpblk =
- #define DFLT_persiststateinterval 10
- #define DFLT_SEVERITY LOG_PRI(LOG_NOTICE)
- #define DFLT_FACILITY LOG_FAC(LOG_USER)
-+#define DFLT_TAG "journal"
- 
- static int bLegacyCnfModGlobalsPermitted = 1;/* are legacy module-global config parameters permitted? */
- 
-@@ -133,6 +136,31 @@ static rsRetVal facilityHdlr(uchar **pp, void *pVal)
- }
- 
- 
-+/* Currently just replaces '\0' with ' '. Not doing so would cause
-+ * the value to be truncated. New space is allocated for the resulting
-+ * string.
-+ */
-+static rsRetVal
-+sanitizeValue(const char *in, size_t len, char **out)
-+{
-+	char *buf, *p;
-+	DEFiRet;
-+
-+	CHKmalloc(p = buf = malloc(len + 1));
-+	memcpy(buf, in, len);
-+	buf[len] = '\0';
-+
-+	while ((p = memchr(p, '\0', len + buf - p)) != NULL) {
-+		*p++ = ' ';
-+	}
-+
-+	*out = buf;
-+
-+finalize_it:
-+	RETiRet;
-+}
-+
-+
- /* enqueue the the journal message into the message queue.
-  * The provided msg string is not freed - thus must be done
-  * by the caller.
-@@ -189,10 +217,9 @@ readjournal() {
- 	int r;
- 
- 	/* Information from messages */
--	char *message;
--	char *sys_pid;
--	char *sys_iden;
--	char *sys_iden_help;
-+	char *message = NULL;
-+	char *sys_iden = NULL;
-+	char *sys_iden_help = NULL;
- 
- 	const void *get;
- 	const void *pidget;
-@@ -202,8 +229,6 @@ readjournal() {
- 
- 	const void *equal_sign;
- 	struct json_object *jval;
--	char *data;
--	char *name;
- 	size_t l;
- 
- 	long prefixlen = 0;
-@@ -215,11 +240,7 @@ readjournal() {
- 	if (sd_journal_get_data(j, "MESSAGE", &get, &length) < 0) {
- 		message = strdup("");
- 	} else {
--		message = strndup(get+8, length-8);
--		if (message == NULL) {
--			iRet = RS_RET_OUT_OF_MEMORY;
--			goto ret;
--		}
-+		CHKiRet(sanitizeValue(((const char *)get) + 8, length - 8, &message));
- 	}
- 
- 	/* Get message severity ("priority" in journald's terminology) */
-@@ -258,43 +279,46 @@ readjournal() {
- 
- 	/* Get message identifier, client pid and add ':' */
- 	if (sd_journal_get_data(j, "SYSLOG_IDENTIFIER", &get, &length) >= 0) {
--		sys_iden = strndup(get+18, length-18);
--	} else {
--		sys_iden = strdup("journal");
--	}
--	if (sys_iden == NULL) {
--		iRet = RS_RET_OUT_OF_MEMORY;
--		goto free_message;
-+		CHKiRet(sanitizeValue(((const char *)get) + 18, length - 18, &sys_iden));
- 	}
- 
--	if (sd_journal_get_data(j, "SYSLOG_PID", &pidget, &pidlength) >= 0) {
--		sys_pid = strndup(pidget+11, pidlength-11);
--		if (sys_pid == NULL) {
--			iRet = RS_RET_OUT_OF_MEMORY;
--			free (sys_iden);
--			goto free_message;
--		}
-+	if (sys_iden == NULL && !cs.dfltTag[0]) {
-+		/* This is a special case: if no tag was obtained from
-+		 * the message and the user has set the default tag to
-+		 * an empty string, nothing is inserted.
-+		 */
-+		CHKmalloc(sys_iden_help = calloc(1, 1));
- 	} else {
--		sys_pid = NULL;
--	}
-+		if (sys_iden == NULL) {
-+			/* Use a predefined tag if it can't be obtained from the message */
-+			CHKmalloc(sys_iden = strdup(cs.dfltTag));
-+		}
-+		if (sd_journal_get_data(j, "SYSLOG_PID", &pidget, &pidlength) >= 0) {
-+			char *sys_pid;
- 
--	if (sys_pid) {
--		r = asprintf(&sys_iden_help, "%s[%s]:", sys_iden, sys_pid);
--	} else {
--		r = asprintf(&sys_iden_help, "%s:", sys_iden);
--	}
-+			CHKiRet_Hdlr(sanitizeValue(((const char *)pidget) + 11, pidlength - 11, &sys_pid)) {
-+				free (sys_iden);
-+				FINALIZE;
-+			}
-+			r = asprintf(&sys_iden_help, "%s[%s]:", sys_iden, sys_pid);
-+			free (sys_pid);
-+		} else {
-+			r = asprintf(&sys_iden_help, "%s:", sys_iden);
-+		}
- 
--	free (sys_iden);
--	free (sys_pid);
-+		free (sys_iden);
- 
--	if (-1 == r) {
--		iRet = RS_RET_OUT_OF_MEMORY;
--		goto finalize_it;
-+		if (-1 == r) {
-+			ABORT_FINALIZE(RS_RET_OUT_OF_MEMORY);
-+		}
- 	}
- 
- 	json = json_object_new_object();
- 
- 	SD_JOURNAL_FOREACH_DATA(j, get, l) {
-+		char *data;
-+		char *name;
-+
- 		/* locate equal sign, this is always present */
- 		equal_sign = memchr(get, '=', l);
- 
-@@ -366,18 +390,13 @@ readjournal() {
- 			break;
- 		}
- 
--		if (name == NULL) {
--			iRet = RS_RET_OUT_OF_MEMORY;
--			goto ret;
--		}
-+		CHKmalloc(name);
- 
- 		prefixlen++; /* remove '=' */
- 
--		data = strndup(get + prefixlen, l - prefixlen);
--		if (data == NULL) {
--			iRet = RS_RET_OUT_OF_MEMORY;
-+		CHKiRet_Hdlr(sanitizeValue(((const char *)get) + prefixlen, l - prefixlen, &data)) {
- 			free (name);
--			goto ret;
-+			FINALIZE;
- 		}
- 
- 		/* and save them to json object */
-@@ -397,10 +416,10 @@ readjournal() {
- 	enqMsg((uchar *)message, (uchar *) sys_iden_help, facility, severity, &tv, json);
- 
- finalize_it:
--	free(sys_iden_help);
--free_message:
--	free(message);
--ret:
-+	if (sys_iden_help != NULL)
-+		free(sys_iden_help);
-+	if (message != NULL)
-+		free(message);
- 	RETiRet;
- }
- 
-@@ -616,11 +635,14 @@ CODESTARTbeginCnfLoad
- 	cs.ratelimitInterval = 600;
- 	cs.iDfltSeverity = DFLT_SEVERITY;
- 	cs.iDfltFacility = DFLT_FACILITY;
-+	cs.dfltTag = NULL;
- ENDbeginCnfLoad
- 
- 
- BEGINendCnfLoad
- CODESTARTendCnfLoad
-+	if (cs.dfltTag == NULL)
-+		cs.dfltTag = strdup(DFLT_TAG);
- ENDendCnfLoad
- 
- 
-@@ -636,6 +658,7 @@ ENDactivateCnf
- 
- BEGINfreeCnf
- CODESTARTfreeCnf
-+	free(cs.dfltTag);
- ENDfreeCnf
- 
- /* open journal */
-@@ -715,6 +738,8 @@ CODESTARTsetModCnf
- 			fac = p = es_str2cstr(pvals[i].val.d.estr, NULL);
- 			facilityHdlr((uchar **) &p, (void *) &cs.iDfltFacility);
- 			free(fac);
-+		} else if (!strcmp(modpblk.descr[i].name, "defaulttag")) {
-+			cs.dfltTag = (char *)es_str2cstr(pvals[i].val.d.estr, NULL);
- 		} else {
- 			dbgprintf("imjournal: program error, non-handled "
- 				"param '%s' in beginCnfLoad\n", modpblk.descr[i].name);
-@@ -772,8 +797,8 @@ CODEmodInit_QueryRegCFSLineHdlr
- 		NULL, &cs.iDfltSeverity, STD_LOADABLE_MODULE_ID));
- 	CHKiRet(omsdRegCFSLineHdlr((uchar *)"imjournaldefaultfacility", 0, eCmdHdlrCustomHandler,
- 		facilityHdlr, &cs.iDfltFacility, STD_LOADABLE_MODULE_ID));
--
--
-+	CHKiRet(omsdRegCFSLineHdlr((uchar *)"imjournaldefaulttag", 0, eCmdHdlrGetWord,
-+		NULL, &cs.dfltTag, STD_LOADABLE_MODULE_ID));
- ENDmodInit
- /* vim:set ai:
-  */
--- 
-1.9.3
-
diff --git a/SOURCES/rsyslog-7.4.7-rhbz743890-imjournal-sanitize-msgs.patch b/SOURCES/rsyslog-7.4.7-rhbz743890-imjournal-sanitize-msgs.patch
new file mode 100644
index 0000000..eb58390
--- /dev/null
+++ b/SOURCES/rsyslog-7.4.7-rhbz743890-imjournal-sanitize-msgs.patch
@@ -0,0 +1,75 @@
+From 177a4863f016fae5640fffd6b6ff8f86b5ffee3a Mon Sep 17 00:00:00 2001
+From: Tomas Heinrich <theinric@redhat.com>
+Date: Mon, 28 Jul 2014 18:39:06 +0200
+Subject: [PATCH] imjournal: sanitize messages as imuxsock does it
+
+This change makes these directives available for imjournal:
+  $ControlCharacterEscapePrefix
+  $DropTrailingLFOnReception
+  $Escape8bitCharactersOnReceive
+  $EscapeControlCharacterTab
+  $EscapeControlCharactersOnReceive
+  $SpaceNLOnReceive
+---
+ plugins/imjournal/imjournal.c | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+diff --git a/plugins/imjournal/imjournal.c b/plugins/imjournal/imjournal.c
+index 7d42b84..b0b034c 100755
+--- a/plugins/imjournal/imjournal.c
++++ b/plugins/imjournal/imjournal.c
+@@ -44,6 +44,7 @@
+ #include "imjournal.h"
+ #include "net.h"
+ #include "glbl.h"
++#include "parser.h"
+ #include "prop.h"
+ #include "errmsg.h"
+ #include "srUtils.h"
+@@ -58,6 +59,7 @@ MODULE_CNFNAME("imjournal")
+ DEF_IMOD_STATIC_DATA
+ DEFobjCurrIf(datetime)
+ DEFobjCurrIf(glbl)
++DEFobjCurrIf(parser)
+ DEFobjCurrIf(prop)
+ DEFobjCurrIf(net)
+ DEFobjCurrIf(errmsg)
+@@ -142,6 +144,7 @@ enqMsg(uchar *msg, uchar *pszTag, int iFacility, int iSeverity, struct timeval *
+ {
+ 	struct syslogTime st;
+ 	msg_t *pMsg;
++	size_t len;
+ 	DEFiRet;
+ 
+ 	assert(msg != NULL);
+@@ -155,7 +158,10 @@ enqMsg(uchar *msg, uchar *pszTag, int iFacility, int iSeverity, struct timeval *
+ 	}
+ 	MsgSetFlowControlType(pMsg, eFLOWCTL_LIGHT_DELAY);
+ 	MsgSetInputName(pMsg, pInputName);
+-	MsgSetRawMsgWOSize(pMsg, (char*)msg);
++	len = strlen((char*)msg);
++	MsgSetRawMsg(pMsg, (char*)msg, len);
++	if(len > 0)
++		parser.SanitizeMsg(pMsg);
+ 	MsgSetMSGoffs(pMsg, 0);	/* we do not have a header... */
+ 	MsgSetRcvFrom(pMsg, glbl.GetLocalHostNameProp());
+ 	MsgSetRcvFromIP(pMsg, pLocalHostIP);
+@@ -670,6 +676,7 @@ CODESTARTmodExit
+ 	objRelease(glbl, CORE_COMPONENT);
+ 	objRelease(net, CORE_COMPONENT);
+ 	objRelease(datetime, CORE_COMPONENT);
++	objRelease(parser, CORE_COMPONENT);
+ 	objRelease(prop, CORE_COMPONENT);
+ 	objRelease(errmsg, CORE_COMPONENT);
+ ENDmodExit
+@@ -750,6 +757,7 @@ CODESTARTmodInit
+ CODEmodInit_QueryRegCFSLineHdlr
+ 	CHKiRet(objUse(datetime, CORE_COMPONENT));
+ 	CHKiRet(objUse(glbl, CORE_COMPONENT));
++	CHKiRet(objUse(parser, CORE_COMPONENT));
+ 	CHKiRet(objUse(prop, CORE_COMPONENT));
+ 	CHKiRet(objUse(net, CORE_COMPONENT));
+ 	CHKiRet(objUse(errmsg, CORE_COMPONENT));
+-- 
+1.9.3
+
diff --git a/SOURCES/rsyslog.log b/SOURCES/rsyslog.log
index 3341f2f..e4b15af 100644
--- a/SOURCES/rsyslog.log
+++ b/SOURCES/rsyslog.log
@@ -4,6 +4,7 @@
 /var/log/secure
 /var/log/spooler
 {
+    missingok
     sharedscripts
     postrotate
 	/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
diff --git a/SPECS/rsyslog.spec b/SPECS/rsyslog.spec
index 12b749e..a9c0ca8 100644
--- a/SPECS/rsyslog.spec
+++ b/SPECS/rsyslog.spec
@@ -1,5 +1,6 @@
 %define rsyslog_statedir %{_sharedstatedir}/rsyslog
 %define rsyslog_pkidir %{_sysconfdir}/pki/rsyslog
+%define rsyslog_docdir %{_docdir}/%{name}-%{version}
 %if 0%{?rhel} >= 7
 %global want_hiredis 0
 %global want_mongodb 0
@@ -13,7 +14,7 @@
 Summary: Enhanced system logging and kernel message trapping daemon
 Name: rsyslog
 Version: 7.4.7
-Release: 7%{?dist}.1
+Release: 12%{?dist}
 License: (GPLv3+ and ASL 2.0)
 Group: System Environment/Daemons
 URL: http://www.rsyslog.com/
@@ -27,8 +28,6 @@ Patch1: rsyslog-7.2.2-manpage-dbg-mode.patch
 # prevent modification of trusted properties (proposed upstream)
 Patch2: rsyslog-7.2.1-msg_c_nonoverwrite_merge.patch
 # sent upstream
-Patch3: rsyslog-7.4.7-bz1053669-imuxsock-wrn.patch
-# sent upstream
 Patch5: rsyslog-7.4.7-bz1030044-remove-ads.patch
 # merged upstream
 Patch6: rsyslog-7.4.7-numeric-uid.patch
@@ -38,7 +37,18 @@ Patch8: rsyslog-7.4.7-bz1052266-dont-link-libee.patch
 Patch9: rsyslog-7.4.7-bz1054171-omjournal-warning.patch
 Patch10: rsyslog-7.4.7-bz1038136-imjournal-message-loss.patch
 Patch11: rsyslog-7.4.7-bz1142373-cve-2014-3634.patch
-Patch12: rsyslog-7.4.7-rhbz1249907-imjournal-default-tag.patch
+Patch12: rsyslog-7.4.7-rhbz1151037-add-mmcount.patch
+Patch13: rsyslog-7.4.7-rhbz743890-imjournal-sanitize-msgs.patch
+Patch14: rsyslog-7.4.7-rhbz1184410-imuxsock-create-path.patch
+Patch15: rsyslog-7.4.7-rhbz1202489-path-creation-race.patch
+Patch16: rsyslog-7.4.7-rhbz1238713-html-docs.patch
+Patch17: rsyslog-7.4.7-rhbz1078878-division-by-zero.patch
+Patch18: rsyslog-7.4.7-rhbz1143846-clarify-SysSock.Use.patch
+Patch19: rsyslog-7.4.7-rhbz1151041-imuxsock-socket-limit.patch
+Patch20: rsyslog-7.4.7-rhbz1101602-imjournal-zero-bytes.patch
+Patch21: rsyslog-7.4.7-rhbz1188503-imjournal-default-tag.patch
+Patch22: rsyslog-7.4.7-rhbz1184402-imuxsock-hostname.patch
+Patch23: rsyslog-7.4.7-bz1254511-ppc64le_bug.patch
 
 BuildRequires: bison
 BuildRequires: flex
@@ -53,6 +63,7 @@ BuildRequires: zlib-devel
 
 Requires: logrotate >= 3.5.2
 Requires: bash >= 2.0
+Requires: libestr >= 0.1.9
 Requires(post): systemd
 Requires(preun): systemd
 Requires(postun): systemd
@@ -67,7 +78,7 @@ Requires: %name = %version-%release
 BuildRequires: libgcrypt-devel
 
 %package doc
-Summary: Documentation for rsyslog
+Summary: HTML Documentation for rsyslog
 Group: Documentation
 
 %package elasticsearch
@@ -150,6 +161,7 @@ BuildRequires: krb5-devel
 Summary: RELP protocol support for rsyslog
 Group: System Environment/Daemons
 Requires: %name = %version-%release
+Requires: librelp >= 1.0.3
 BuildRequires: librelp-devel >= 1.0.3
 
 %package gnutls
@@ -262,7 +274,6 @@ of source ports.
 %patch0 -p1
 %patch1 -p1
 %patch2 -p1
-%patch3 -p1
 %patch5 -p1
 %patch6 -p1
 %patch7 -p1
@@ -271,6 +282,17 @@ of source ports.
 %patch10 -p1
 %patch11 -p1
 %patch12 -p1
+%patch13 -p1
+%patch14 -p1
+%patch15 -p1
+%patch16 -p1
+%patch17 -p1
+%patch18 -p1
+%patch19 -p1
+%patch20 -p1
+%patch21 -p1
+%patch22 -p1
+%patch23 -p1
 
 %build
 %ifarch sparc64
@@ -303,6 +325,7 @@ export HIREDIS_LIBS=-L%{_libdir}
 	--enable-mail \
 	--enable-mmanon \
 	--enable-mmaudit \
+	--enable-mmcount \
 	--enable-mmjsonparse \
 	--enable-mmnormalize \
 	--enable-mmsnmptrapd \
@@ -342,12 +365,16 @@ install -d -m 755 %{buildroot}%{_sysconfdir}/logrotate.d
 install -d -m 755 %{buildroot}%{_sysconfdir}/rsyslog.d
 install -d -m 700 %{buildroot}%{rsyslog_statedir}
 install -d -m 700 %{buildroot}%{rsyslog_pkidir}
+install -d -m 755 %{buildroot}%{rsyslog_docdir}/html
 
 install -p -m 644 %{SOURCE2} %{buildroot}%{_sysconfdir}/rsyslog.conf
 install -p -m 644 %{SOURCE3} %{buildroot}%{_sysconfdir}/sysconfig/rsyslog
 install -p -m 644 %{SOURCE4} %{buildroot}%{_sysconfdir}/logrotate.d/syslog
-
-# get rid of *.la
+install -p -m 644 plugins/ommysql/createDB.sql %{buildroot}%{rsyslog_docdir}/mysql-createDB.sql
+install -p -m 644 plugins/ompgsql/createDB.sql %{buildroot}%{rsyslog_docdir}/pgsql-createDB.sql
+# extract documentation
+cp -r doc/*.{html,jpeg,jpg,png} %{buildroot}%{rsyslog_docdir}/html
+# get rid of libtool libraries
 rm -f %{buildroot}%{_libdir}/rsyslog/*.la
 # get rid of socket activation by default
 sed -i '/^Alias/s/^/;/;/^Requires=syslog.socket/s/^/;/' %{buildroot}%{_unitdir}/rsyslog.service
@@ -371,7 +398,10 @@ done
 
 %files
 %defattr(-,root,root,-)
-%doc AUTHORS COPYING* NEWS README ChangeLog
+%doc AUTHORS COPYING* ChangeLog
+%exclude %{rsyslog_docdir}/html
+%exclude %{rsyslog_docdir}/mysql-createDB.sql
+%exclude %{rsyslog_docdir}/pgsql-createDB.sql
 %dir %{_libdir}/rsyslog
 %dir %{_sysconfdir}/rsyslog.d
 %dir %{rsyslog_statedir}
@@ -404,6 +434,7 @@ done
 %{_libdir}/rsyslog/lmtcpsrv.so
 %{_libdir}/rsyslog/lmzlibw.so
 %{_libdir}/rsyslog/mmanon.so
+%{_libdir}/rsyslog/mmcount.so
 %{_libdir}/rsyslog/omjournal.so
 %{_libdir}/rsyslog/ommail.so
 %{_libdir}/rsyslog/omprog.so
@@ -425,7 +456,7 @@ done
 
 %files doc
 %defattr(-,root,root)
-%doc doc/*html
+%doc %{rsyslog_docdir}/html
 
 %files elasticsearch
 %defattr(-,root,root)
@@ -459,7 +490,7 @@ done
 
 %files mysql
 %defattr(-,root,root)
-%doc plugins/ommysql/createDB.sql
+%doc %{rsyslog_docdir}/mysql-createDB.sql
 %{_libdir}/rsyslog/ommysql.so
 
 %if %{want_mongodb}
@@ -471,7 +502,7 @@ done
 
 %files pgsql
 %defattr(-,root,root)
-%doc plugins/ompgsql/createDB.sql
+%doc %{rsyslog_docdir}/pgsql-createDB.sql
 %{_libdir}/rsyslog/ompgsql.so
 
 %if %{want_rabbitmq}
@@ -504,9 +535,58 @@ done
 %{_libdir}/rsyslog/omudpspoof.so
 
 %changelog
-* Thu Oct 22 2015 Tomas Heinrich <theinric@redhat.com> 7.4.7-7.el7_1.1
+* Fri Aug 28 2015 Tomas Heinrich <theinric@redhat.com> 7.4.7-12
+- amend the patch for rhbz#1151041
+  resolves: rhbz#1257150
+
+* Tue Aug 18 2015 Radovan Sroka <rsroka@redhat.com> 7.4.7-11
+- add patch that resolves config.guess system-recognition on ppc64le architecture
+  resolves: rhbz:1254511
+
+* Mon Aug 03 2015 Tomas Heinrich <theinric@redhat.com> 7.4.7-10
+- add a patch to prevent field truncation in imjournal
+  resolves: rhbz#1101602
 - add a patch to enable setting a default TAG
-  resolves: rhbz#1249907
+  resolves: rhbz#1188503
+- add a patch to fix a nonfunction hostname setting in imuxsock
+  resolves: rhbz#1184402
+
+* Mon Jul 20 2015 Tomas Heinrich <theinric@redhat.com> 7.4.7-9
+- update the patch fixing a race condition in directory creation
+  resolves: rhbz#1202489
+- improve provided documentation
+  - move documentation from all subpackages under a single directory
+  - add missing images
+  - remove doc files without content
+  - add a patch making various corrections to the HTML documentation
+  resolves: rhbz#1238713
+- add a patch to prevent division-by-zero errors
+  resolves: rhbz#1078878
+- add a patch to clarify usage of the SysSock.Use option
+  resolves: rhbz#1143846
+- add a patch to support arbitrary number of listeners in imuxsock
+  - drop patch for rhbz#1053669 as it has been merged into this one
+  resolves: rhbz#1151041
+
+* Fri Jul 03 2015 Tomas Heinrich <theinric@redhat.com> 7.4.7-8
+- modify the service file to automatically restart rsyslog on failure
+  resolves: rhbz#1061322
+- add explicitly versioned dependencies on libraries which do not have
+  correctly versioned sonames
+  resolves: rhbz#1107839
+- make logrotate tolerate missing log files
+  resolves: rhbz#1144465
+- backport the mmcount plugin
+  resolves: rhbz#1151037
+- set the default service umask to 0066
+  resolves: rhbz#1228192
+- add a patch to make imjournal sanitize messages as imuxsock does it
+  resolves: rhbz#743890
+- add a patch to fix a bug preventing certain imuxsock directives from
+  taking effect
+  resolves: rhbz#1184410
+- add a patch to fix a race condition in directory creation
+  resolves: rhbz#1202489
 
 * Tue Oct 07 2014 Tomas Heinrich <theinric@redhat.com> 7.4.7-7
 - fix CVE-2014-3634