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
-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
+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
+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
+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 omjournal
+ module documentation for a more in-depth description.
+
+-SysSock.Use (imuxsock) [on/off]
+-do NOT listen for the local log socket. This is most useful if you run multiple
++SysSock.Use (imuxsock) [on/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.
+
+ SysSock.Name <name-of-socket>
+@@ -259,7 +259,7 @@ the default of "127.0.0.1" is used.
+ $InputUnixListenSocketUseSysTimeStamp [on/off] equivalent to: UseSysTimeStamp .
+ $SystemLogSocketIgnoreMsgTimestamp [on/off]
+ equivalent to: SysSock.IgnoreTimestamp.
+-$OmitLocalLogging (imuxsock) [on/off] equivalent to: SysSock.Use
++$OmitLocalLogging (imuxsock) [on/off] - The inverse of: SysSock.Use.
+ $SystemLogSocketName <name-of-socket> equivalent to: SysSock.Name
+ $SystemLogFlowControl [on/off] - equivalent to: SysSock.FlowControl.
+ $SystemLogUsePIDFromSystem [on/off] - 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
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#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
+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
+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
+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
+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
+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
+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)
+ native support for sending
+ mail messages (first seen in 3.17.0)
+-support for (plain) tcp based syslog - much better
++support for (plain) TCP based syslog - much better
+ reliability
+ support for sending and receiving compressed syslog messages
+ 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
+ future of RFC 3195 in rsyslog.
+
+-To see when each feature was added, see the
+-rsyslog
+-change log (online only).
+
+ [manual index]
+ [rsyslog.conf]
+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.
+-
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
++
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
+ rsyslog mailing list
+ also offers excellent advise.
+
Don't like to post your question in a public place? Well, then you should
+-consider purchasing rsyslog professional support.
++consider purchasing rsyslog professional support.
+ 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.
<
+ January, 2nd 2008, 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.
On January, 31st 2008
+ 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.
+
+
Be sure to visit Rainer's syslog blog
+-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
+ rsyslog forums.
+-Some useful links
+-
+