summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2014-06-04 22:22:48 +0200
committerMichael Biebl <biebl@debian.org>2014-06-04 22:22:48 +0200
commit7e740a53d3c2eeab4045d55b215a8c1a545203c9 (patch)
tree83db8224788a9fd57e998a645445a59d5d642345
parent7693d4302df6ac2ffef2e085857f44530f8d9705 (diff)
parentdaeb0d03d4a65fa118ad25b34958fb9cacbbd6f4 (diff)
downloadrsyslog-7e740a53d3c2eeab4045d55b215a8c1a545203c9.tar.gz
Merge tag 'upstream/8.2.2' into experimental
Upstream version 8.2.2
-rw-r--r--ChangeLog19
-rw-r--r--aclocal.m415
-rwxr-xr-xconfig.guess151
-rw-r--r--config.h.in9
-rwxr-xr-xconfig.sub30
-rwxr-xr-xconfigure82
-rw-r--r--configure.ac39
-rw-r--r--grammar/grammar.c397
-rw-r--r--grammar/grammar.h8
-rw-r--r--grammar/grammar.y58
-rw-r--r--grammar/lexer.c242
-rw-r--r--grammar/lexer.l28
-rw-r--r--grammar/parserif.h20
-rw-r--r--grammar/rainerscript.c2
-rw-r--r--grammar/rainerscript.h18
-rw-r--r--plugins/imdiag/imdiag.c10
-rw-r--r--plugins/imptcp/imptcp.c1
-rw-r--r--plugins/imudp/imudp.c1
-rw-r--r--plugins/mmrfc5424addhmac/mmrfc5424addhmac.c16
-rw-r--r--plugins/mmsnmptrapd/mmsnmptrapd.c10
-rw-r--r--plugins/omgssapi/omgssapi.c24
-rw-r--r--plugins/omhdfs/omhdfs.c43
-rw-r--r--plugins/ommysql/Makefile.am2
-rw-r--r--plugins/ommysql/Makefile.in2
-rw-r--r--plugins/ommysql/ommysql.c1
-rw-r--r--plugins/ommysql/ommysql.h31
-rw-r--r--plugins/omrabbitmq/omrabbitmq.c23
-rw-r--r--plugins/omstdout/omstdout.c2
-rw-r--r--plugins/omzmq3/omzmq3.c96
-rw-r--r--runtime/libgcry.c8
-rw-r--r--runtime/module-template.h30
-rw-r--r--runtime/net.c6
-rw-r--r--runtime/nspoll.c34
-rw-r--r--runtime/nspoll.h28
-rw-r--r--runtime/nssel.c3
-rw-r--r--runtime/queue.c2
-rw-r--r--runtime/ratelimit.c2
-rw-r--r--runtime/stream.c10
-rw-r--r--tcps_sess.c6
-rwxr-xr-xtests/killrsyslog.sh2
-rwxr-xr-xtests/omod-if-array.sh4
-rwxr-xr-xtests/validation-run.sh6
-rw-r--r--tools/Makefile.am1
-rw-r--r--tools/Makefile.in31
-rw-r--r--tools/gethostn.c27
-rw-r--r--tools/iminternal.c27
-rw-r--r--tools/iminternal.h27
-rw-r--r--tools/logctl.c27
-rw-r--r--tools/pmrfc3164.c29
-rw-r--r--tools/pmrfc3164.h27
-rw-r--r--tools/pmrfc5424.c29
-rw-r--r--tools/pmrfc5424.h29
-rw-r--r--tools/rsyslogd.c1328
-rw-r--r--tools/smfile.c29
-rw-r--r--tools/smfile.h29
-rw-r--r--tools/smfwd.c29
-rw-r--r--tools/smfwd.h29
-rw-r--r--tools/smtradfile.c29
-rw-r--r--tools/smtradfile.h29
-rw-r--r--tools/smtradfwd.c29
-rw-r--r--tools/smtradfwd.h29
-rw-r--r--tools/syslogd.c1624
62 files changed, 2428 insertions, 2531 deletions
diff --git a/ChangeLog b/ChangeLog
index ae84b35..aa84482 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,19 @@
---------------------------------------------------------------------------
+Version 8.2.2 [v8-stable] 2014-06-02
+- made the missing (contributed) modules build under v8
+ Note that we could do this to the stable, because there is NO regression
+ chance at all: only the modules themselves were changed, and they did
+ NOT work at all previously. Please also note that most of these modules
+ did not yet receive real testing. As we don't have the necessary
+ environments (easily enough available), we depend on users submitting
+ error reports and helping to iron out any issues that may arise.
+ Modules:
+ * mmrfc5424addhmac
+ * omrabbitmq
+ * omgssapi
+ * omhdfs
+ * omzmq3
+---------------------------------------------------------------------------
Version 8.2.1 [v8-stable] 2014-04-17
- permits to build against json-c 0.12
Unfortunately, json-c had an ABI breakage, so this is necessary. Note
@@ -217,6 +232,9 @@ Version 8.1.0 [experimental] 2013-11-15
just explicitely be given.
---------------------------------------------------------------------------
Version 7.6.4 [v7.6-stable] 2014-03-??
+- removed obsolete --disable-fsstnd configure option
+ Thanks to Thomas D. for alerting us.
+ Closes: https://github.com/rsyslog/rsyslog/issues/72
- permits to build against json-c 0.12
Unfortunately, json-c had an ABI breakage, so this is necessary. Note
that versions prior to 0.12 had security issues (CVE-2013-6370,
@@ -235,6 +253,7 @@ Version 7.6.4 [v7.6-stable] 2014-03-??
* dirgroup
* dirgroupnum
Thanks to Karol Jurak for the patch.
+- bugfix: memory leak in TCP TLS mode
- bugfix: using UUID property could cause segfault
- bugfix: mmutf8fix did not detect two invalid sequences
Thanks to Axel Rau for the patch.
diff --git a/aclocal.m4 b/aclocal.m4
index d8da44d..9f593eb 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -220,6 +220,21 @@ m4_popdef([pkg_default])
m4_popdef([pkg_description])
]) dnl PKG_NOARCH_INSTALLDIR
+
+# PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE,
+# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# -------------------------------------------
+# Retrieves the value of the pkg-config variable for the given module.
+AC_DEFUN([PKG_CHECK_VAR],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl
+
+_PKG_CONFIG([$1], [variable="][$3]["], [$2])
+AS_VAR_COPY([$1], [pkg_cv_][$1])
+
+AS_VAR_IF([$1], [""], [$5], [$4])dnl
+])# PKG_CHECK_VAR
+
# Copyright (C) 2002-2013 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
diff --git a/config.guess b/config.guess
index b79252d..1804e9f 100755
--- a/config.guess
+++ b/config.guess
@@ -1,8 +1,10 @@
#! /bin/sh
# Attempt to guess a canonical system name.
-# Copyright 1992-2013 Free Software Foundation, Inc.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+# 2011, 2012, 2013 Free Software Foundation, Inc.
-timestamp='2013-06-10'
+timestamp='2012-12-29'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -24,7 +26,7 @@ timestamp='2013-06-10'
# program. This Exception is an additional permission under section 7
# of the GNU General Public License, version 3 ("GPLv3").
#
-# Originally written by Per Bothner.
+# Originally written by Per Bothner.
#
# You can get the latest version of this script from:
# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
@@ -50,7 +52,9 @@ version="\
GNU config.guess ($timestamp)
Originally written by Per Bothner.
-Copyright 1992-2013 Free Software Foundation, Inc.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
+2012, 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -132,27 +136,6 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
-case "${UNAME_SYSTEM}" in
-Linux|GNU|GNU/*)
- # If the system lacks a compiler, then just pick glibc.
- # We could probably try harder.
- LIBC=gnu
-
- eval $set_cc_for_build
- cat <<-EOF > $dummy.c
- #include <features.h>
- #if defined(__UCLIBC__)
- LIBC=uclibc
- #elif defined(__dietlibc__)
- LIBC=dietlibc
- #else
- LIBC=gnu
- #endif
- EOF
- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
- ;;
-esac
-
# Note: order is significant - the case branches are not exclusive.
case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
@@ -874,21 +857,21 @@ EOF
exit ;;
*:GNU:*:*)
# the GNU system
- echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
exit ;;
*:GNU/*:*:*)
# other systems with GNU libc and userland
- echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
+ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
exit ;;
i*86:Minix:*:*)
echo ${UNAME_MACHINE}-pc-minix
exit ;;
aarch64:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
aarch64_be:Linux:*:*)
UNAME_MACHINE=aarch64_be
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
alpha:Linux:*:*)
case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
@@ -901,54 +884,59 @@ EOF
EV68*) UNAME_MACHINE=alphaev68 ;;
esac
objdump --private-headers /bin/sh | grep -q ld.so.1
- if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- arc:Linux:*:* | arceb:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+ echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
exit ;;
arm*:Linux:*:*)
eval $set_cc_for_build
if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
| grep -q __ARM_EABI__
then
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
else
if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
| grep -q __ARM_PCS_VFP
then
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
+ echo ${UNAME_MACHINE}-unknown-linux-gnueabi
else
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
+ echo ${UNAME_MACHINE}-unknown-linux-gnueabihf
fi
fi
exit ;;
avr32*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
cris:Linux:*:*)
- echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+ echo ${UNAME_MACHINE}-axis-linux-gnu
exit ;;
crisv32:Linux:*:*)
- echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+ echo ${UNAME_MACHINE}-axis-linux-gnu
exit ;;
frv:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
hexagon:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
i*86:Linux:*:*)
- echo ${UNAME_MACHINE}-pc-linux-${LIBC}
+ LIBC=gnu
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #ifdef __dietlibc__
+ LIBC=dietlibc
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+ echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
exit ;;
ia64:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
m32r*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
m68*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
mips:Linux:*:* | mips64:Linux:*:*)
eval $set_cc_for_build
@@ -967,63 +955,54 @@ EOF
#endif
EOF
eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
- test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
;;
- or1k:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
or32:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
padre:Linux:*:*)
- echo sparc-unknown-linux-${LIBC}
+ echo sparc-unknown-linux-gnu
exit ;;
parisc64:Linux:*:* | hppa64:Linux:*:*)
- echo hppa64-unknown-linux-${LIBC}
+ echo hppa64-unknown-linux-gnu
exit ;;
parisc:Linux:*:* | hppa:Linux:*:*)
# Look for CPU level
case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
- PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
- PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
- *) echo hppa-unknown-linux-${LIBC} ;;
+ PA7*) echo hppa1.1-unknown-linux-gnu ;;
+ PA8*) echo hppa2.0-unknown-linux-gnu ;;
+ *) echo hppa-unknown-linux-gnu ;;
esac
exit ;;
ppc64:Linux:*:*)
- echo powerpc64-unknown-linux-${LIBC}
+ echo powerpc64-unknown-linux-gnu
exit ;;
ppc:Linux:*:*)
- echo powerpc-unknown-linux-${LIBC}
- exit ;;
- ppc64le:Linux:*:*)
- echo powerpc64le-unknown-linux-${LIBC}
- exit ;;
- ppcle:Linux:*:*)
- echo powerpcle-unknown-linux-${LIBC}
+ echo powerpc-unknown-linux-gnu
exit ;;
s390:Linux:*:* | s390x:Linux:*:*)
- echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
+ echo ${UNAME_MACHINE}-ibm-linux
exit ;;
sh64*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
sh*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
sparc:Linux:*:* | sparc64:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
tile*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
vax:Linux:*:*)
- echo ${UNAME_MACHINE}-dec-linux-${LIBC}
+ echo ${UNAME_MACHINE}-dec-linux-gnu
exit ;;
x86_64:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
xtensa*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
i*86:DYNIX/ptx:4*:*)
# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
@@ -1256,21 +1235,19 @@ EOF
exit ;;
*:Darwin:*:*)
UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
- eval $set_cc_for_build
- if test "$UNAME_PROCESSOR" = unknown ; then
- UNAME_PROCESSOR=powerpc
- fi
- if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
- if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
- (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
- grep IS_64BIT_ARCH >/dev/null
- then
- case $UNAME_PROCESSOR in
- i386) UNAME_PROCESSOR=x86_64 ;;
- powerpc) UNAME_PROCESSOR=powerpc64 ;;
- esac
- fi
- fi
+ case $UNAME_PROCESSOR in
+ i386)
+ eval $set_cc_for_build
+ if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+ if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ UNAME_PROCESSOR="x86_64"
+ fi
+ fi ;;
+ unknown) UNAME_PROCESSOR=powerpc ;;
+ esac
echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
exit ;;
*:procnto*:*:* | *:QNX:[0123456789]*:*)
diff --git a/config.h.in b/config.h.in
index 580c9b8..a4b217d 100644
--- a/config.h.in
+++ b/config.h.in
@@ -15,9 +15,6 @@
/* Regular expressions support enabled. */
#undef FEATURE_REGEXP
-/* Description */
-#undef FSSTND
-
/* Define to 1 if you have the `alarm' function. */
#undef HAVE_ALARM
@@ -100,6 +97,12 @@
/* set define */
#undef HAVE_GLOB_NOMAGIC
+/* Define to 1 if you have the <hadoop/hdfs.h> header file. */
+#undef HAVE_HADOOP_HDFS_H
+
+/* Define to 1 if you have the <hdfs.h> header file. */
+#undef HAVE_HDFS_H
+
/* Define to 1 if you have the `inotify_init' function. */
#undef HAVE_INOTIFY_INIT
diff --git a/config.sub b/config.sub
index c765b34..52f04bc 100755
--- a/config.sub
+++ b/config.sub
@@ -1,8 +1,10 @@
#! /bin/sh
# Configuration validation subroutine script.
-# Copyright 1992-2013 Free Software Foundation, Inc.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+# 2011, 2012, 2013 Free Software Foundation, Inc.
-timestamp='2013-04-24'
+timestamp='2012-12-29'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -68,7 +70,9 @@ Report bugs and patches to <config-patches@gnu.org>."
version="\
GNU config.sub ($timestamp)
-Copyright 1992-2013 Free Software Foundation, Inc.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
+2012, 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -252,7 +256,7 @@ case $basic_machine in
| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
| am33_2.0 \
- | arc | arceb \
+ | arc \
| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
| avr | avr32 \
| be32 | be64 \
@@ -286,17 +290,16 @@ case $basic_machine in
| mipsisa64r2 | mipsisa64r2el \
| mipsisa64sb1 | mipsisa64sb1el \
| mipsisa64sr71k | mipsisa64sr71kel \
- | mipsr5900 | mipsr5900el \
| mipstx39 | mipstx39el \
| mn10200 | mn10300 \
| moxie \
| mt \
| msp430 \
| nds32 | nds32le | nds32be \
- | nios | nios2 | nios2eb | nios2el \
+ | nios | nios2 \
| ns16k | ns32k \
| open8 \
- | or1k | or32 \
+ | or32 \
| pdp10 | pdp11 | pj | pjl \
| powerpc | powerpc64 | powerpc64le | powerpcle \
| pyramid \
@@ -366,7 +369,7 @@ case $basic_machine in
| aarch64-* | aarch64_be-* \
| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
- | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
| arm-* | armbe-* | armle-* | armeb-* | armv*-* \
| avr-* | avr32-* \
| be32-* | be64-* \
@@ -404,13 +407,12 @@ case $basic_machine in
| mipsisa64r2-* | mipsisa64r2el-* \
| mipsisa64sb1-* | mipsisa64sb1el-* \
| mipsisa64sr71k-* | mipsisa64sr71kel-* \
- | mipsr5900-* | mipsr5900el-* \
| mipstx39-* | mipstx39el-* \
| mmix-* \
| mt-* \
| msp430-* \
| nds32-* | nds32le-* | nds32be-* \
- | nios-* | nios2-* | nios2eb-* | nios2el-* \
+ | nios-* | nios2-* \
| none-* | np1-* | ns16k-* | ns32k-* \
| open8-* \
| orion-* \
@@ -1352,7 +1354,7 @@ case $os in
-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
| -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
- | -sym* | -kopensolaris* | -plan9* \
+ | -sym* | -kopensolaris* \
| -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
| -aos* | -aros* \
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
@@ -1498,6 +1500,9 @@ case $os in
-aros*)
os=-aros
;;
+ -kaos*)
+ os=-kaos
+ ;;
-zvmoe)
os=-zvmoe
;;
@@ -1589,9 +1594,6 @@ case $basic_machine in
mips*-*)
os=-elf
;;
- or1k-*)
- os=-elf
- ;;
or32-*)
os=-coff
;;
diff --git a/configure b/configure
index 107d9b5..3800544 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for rsyslog 8.2.1.
+# Generated by GNU Autoconf 2.69 for rsyslog 8.2.2.
#
# Report bugs to <rsyslog@lists.adiscon.com>.
#
@@ -590,8 +590,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='rsyslog'
PACKAGE_TARNAME='rsyslog'
-PACKAGE_VERSION='8.2.1'
-PACKAGE_STRING='rsyslog 8.2.1'
+PACKAGE_VERSION='8.2.2'
+PACKAGE_STRING='rsyslog 8.2.2'
PACKAGE_BUGREPORT='rsyslog@lists.adiscon.com'
PACKAGE_URL=''
@@ -985,7 +985,6 @@ enable_kmsg
enable_imjournal
enable_inet
enable_jemalloc
-enable_fsstnd
enable_unlimited_select
with_systemdsystemunitdir
enable_debug
@@ -1636,7 +1635,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures rsyslog 8.2.1 to adapt to many kinds of systems.
+\`configure' configures rsyslog 8.2.2 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1706,7 +1705,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of rsyslog 8.2.1:";;
+ short | recursive ) echo "Configuration of rsyslog 8.2.2:";;
esac
cat <<\_ACEOF
@@ -1735,7 +1734,6 @@ Optional Features:
--enable-imjournal Systemd journal message import [default=no]
--enable-inet Enable networking support [default=yes]
--enable-jemalloc Enable jemalloc support [default=no]
- --disable-fsstnd Disable support for FSSTND
--enable-unlimited-select
Enable unlimited select() syscall [default=no]
--enable-debug Enable debug mode [default=no]
@@ -1964,7 +1962,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-rsyslog configure 8.2.1
+rsyslog configure 8.2.2
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2544,7 +2542,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by rsyslog $as_me 8.2.1, which was
+It was created by rsyslog $as_me 8.2.2, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -3407,7 +3405,7 @@ fi
# Define the identity of the package.
PACKAGE='rsyslog'
- VERSION='8.2.1'
+ VERSION='8.2.2'
cat >>confdefs.h <<_ACEOF
@@ -16598,39 +16596,6 @@ fi
fi
-#
-# The following define determines whether the package adheres to the
-# file system standard.
-#
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FSSTND support" >&5
-$as_echo_n "checking for FSSTND support... " >&6; }
-# Check whether --enable-fsstnd was given.
-if test "${enable_fsstnd+set}" = set; then :
- enableval=$enable_fsstnd;
- if test "x${enableval}" = "xyes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-$as_echo "#define FSSTND 1" >>confdefs.h
-
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
-
-else
-
- # enabled by default
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-$as_echo "#define FSSTND 1" >>confdefs.h
-
-
-fi
-
-
-
# support for unlimited select() syscall
# Check whether --enable-unlimited_select was given.
if test "${enable_unlimited_select+set}" = set; then :
@@ -18329,11 +18294,9 @@ fi
-# imdiag support (so far we do not need a library, but we need to turn this on and off)
-# note that we enable this be default, because an important point is to make
-# it available to users who do not know much about how to handle things. It
-# would complicate things if we first needed to tell them how to enable imdiag.
-# rgerhards, 2008-07-25
+# imdiag support
+# This is a core testbench tool. You need to enable it if you want to
+# use not only a small subset of the testbench.
# Check whether --enable-imdiag was given.
if test "${enable_imdiag+set}" = set; then :
enableval=$enable_imdiag; case "${enableval}" in
@@ -19764,10 +19727,21 @@ else
fi
-#
-# you may want to do some library checks here - see snmp, mysql, pgsql modules
-# for samples
-#
+if test "x$enable_omhdfs"; then
+ for ac_header in hdfs.h hadoop/hdfs.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+fi
if test x$enable_omhdfs = xyes; then
ENABLE_OMHDFS_TRUE=
ENABLE_OMHDFS_FALSE='#'
@@ -21364,7 +21338,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by rsyslog $as_me 8.2.1, which was
+This file was extended by rsyslog $as_me 8.2.2, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -21430,7 +21404,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-rsyslog config.status 8.2.1
+rsyslog config.status 8.2.2
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
diff --git a/configure.ac b/configure.ac
index 5eaeb85..86602fe 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2,7 +2,7 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.61)
-AC_INIT([rsyslog],[8.2.1],[rsyslog@lists.adiscon.com])
+AC_INIT([rsyslog],[8.2.2],[rsyslog@lists.adiscon.com])
AM_INIT_AUTOMAKE([subdir-objects])
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
@@ -401,28 +401,6 @@ if test "$enable_jemalloc" = "yes"; then
fi
-#
-# The following define determines whether the package adheres to the
-# file system standard.
-#
-AC_MSG_CHECKING(for FSSTND support)
-AC_ARG_ENABLE([fsstnd],
- [AS_HELP_STRING([--disable-fsstnd], [Disable support for FSSTND])],
- [
- if test "x${enableval}" = "xyes"; then
- AC_MSG_RESULT([yes])
- AC_DEFINE([FSSTND], [1], [Description])
- else
- AC_MSG_RESULT([no])
- fi
- ],
- [
- # enabled by default
- AC_MSG_RESULT([yes])
- AC_DEFINE([FSSTND], [1], [Description])
- ])
-
-
# support for unlimited select() syscall
AC_ARG_ENABLE(unlimited_select,
[AS_HELP_STRING([--enable-unlimited-select],[Enable unlimited select() syscall @<:@default=no@:>@])],
@@ -923,11 +901,9 @@ AC_ARG_ENABLE(mail,
AM_CONDITIONAL(ENABLE_MAIL, test x$enable_mail = xyes)
-# imdiag support (so far we do not need a library, but we need to turn this on and off)
-# note that we enable this be default, because an important point is to make
-# it available to users who do not know much about how to handle things. It
-# would complicate things if we first needed to tell them how to enable imdiag.
-# rgerhards, 2008-07-25
+# imdiag support
+# This is a core testbench tool. You need to enable it if you want to
+# use not only a small subset of the testbench.
AC_ARG_ENABLE(imdiag,
[AS_HELP_STRING([--enable-imdiag],[Enable imdiag @<:@default=no@:>@])],
[case "${enableval}" in
@@ -1421,10 +1397,9 @@ AC_ARG_ENABLE(omhdfs,
esac],
[enable_omhdfs=no]
)
-#
-# you may want to do some library checks here - see snmp, mysql, pgsql modules
-# for samples
-#
+if test "x$enable_omhdfs"; then
+ AC_CHECK_HEADERS([hdfs.h hadoop/hdfs.h])
+fi
AM_CONDITIONAL(ENABLE_OMHDFS, test x$enable_omhdfs = xyes)
diff --git a/grammar/grammar.c b/grammar/grammar.c
index e28ba33..6704bab 100644
--- a/grammar/grammar.c
+++ b/grammar/grammar.c
@@ -1,4 +1,4 @@
-/* A Bison parser, made by GNU Bison 2.6.4. */
+/* A Bison parser, made by GNU Bison 2.7. */
/* Bison implementation for Yacc-like parsers in C
@@ -44,7 +44,7 @@
#define YYBISON 1
/* Bison version. */
-#define YYBISON_VERSION "2.6.4"
+#define YYBISON_VERSION "2.7"
/* Skeleton name. */
#define YYSKELETON_NAME "yacc.c"
@@ -62,8 +62,8 @@
/* Copy the first part of user declarations. */
-/* Line 358 of yacc.c */
-#line 31 "grammar.y"
+/* Line 371 of yacc.c */
+#line 29 "grammar.y"
#include "config.h"
#include <stdio.h>
@@ -77,7 +77,7 @@ extern int yylineno;
extern int yylex(void);
extern int yyerror(char*);
-/* Line 358 of yacc.c */
+/* Line 371 of yacc.c */
#line 82 "grammar.c"
# ifndef YY_NULL
@@ -203,8 +203,8 @@ extern int yydebug;
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef union YYSTYPE
{
-/* Line 374 of yacc.c */
-#line 45 "grammar.y"
+/* Line 387 of yacc.c */
+#line 43 "grammar.y"
char *s;
long long n;
@@ -220,7 +220,7 @@ typedef union YYSTYPE
struct cnffparamlst *fparams;
-/* Line 374 of yacc.c */
+/* Line 387 of yacc.c */
#line 225 "grammar.c"
} YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1
@@ -248,7 +248,7 @@ int yyparse ();
/* Copy the second part of user declarations. */
-/* Line 377 of yacc.c */
+/* Line 390 of yacc.c */
#line 253 "grammar.c"
#ifdef short
@@ -570,14 +570,14 @@ static const yytype_int8 yyrhs[] =
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
static const yytype_uint8 yyrline[] =
{
- 0, 123, 123, 124, 125, 126, 127, 128, 129, 130,
- 131, 135, 139, 140, 141, 142, 143, 144, 145, 146,
- 147, 148, 149, 150, 151, 152, 156, 160, 161, 162,
- 163, 164, 165, 166, 167, 169, 170, 171, 172, 173,
- 174, 175, 176, 177, 178, 179, 180, 181, 182, 183,
- 184, 185, 186, 187, 188, 189, 190, 191, 192, 193,
- 194, 195, 196, 197, 198, 199, 200, 201, 202, 203,
- 204, 205
+ 0, 121, 121, 122, 123, 124, 125, 126, 127, 128,
+ 129, 133, 137, 138, 139, 140, 141, 142, 143, 144,
+ 145, 146, 147, 148, 149, 150, 154, 158, 159, 160,
+ 161, 162, 163, 164, 165, 167, 168, 169, 170, 171,
+ 172, 173, 174, 175, 176, 177, 178, 179, 180, 181,
+ 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
+ 192, 193, 194, 195, 196, 197, 198, 199, 200, 201,
+ 202, 203
};
#endif
@@ -841,47 +841,18 @@ do \
} \
while (YYID (0))
-
+/* Error token number */
#define YYTERROR 1
#define YYERRCODE 256
-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
- If N is 0, then set CURRENT to the empty location which ends
- the previous symbol: RHS[0] (always defined). */
-
-#ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(Current, Rhs, N) \
- do \
- if (YYID (N)) \
- { \
- (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
- (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
- (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
- (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
- } \
- else \
- { \
- (Current).first_line = (Current).last_line = \
- YYRHSLOC (Rhs, 0).last_line; \
- (Current).first_column = (Current).last_column = \
- YYRHSLOC (Rhs, 0).last_column; \
- } \
- while (YYID (0))
-#endif
-
-#define YYRHSLOC(Rhs, K) ((Rhs)[K])
-
-
/* This macro is provided for backward compatibility. */
-
#ifndef YY_LOCATION_PRINT
# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
#endif
/* YYLEX -- calling `yylex' with the right arguments. */
-
#ifdef YYLEX_PARAM
# define YYLEX yylex (YYLEX_PARAM)
#else
@@ -944,7 +915,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep)
switch (yytype)
{
default:
- break;
+ break;
}
}
@@ -1186,7 +1157,6 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
{
YYSIZE_T yysize0 = yytnamerr (YY_NULL, yytname[yytoken]);
YYSIZE_T yysize = yysize0;
- YYSIZE_T yysize1;
enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
/* Internationalized format string. */
const char *yyformat = YY_NULL;
@@ -1249,11 +1219,13 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
break;
}
yyarg[yycount++] = yytname[yyx];
- yysize1 = yysize + yytnamerr (YY_NULL, yytname[yyx]);
- if (! (yysize <= yysize1
- && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
- return 2;
- yysize = yysize1;
+ {
+ YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULL, yytname[yyx]);
+ if (! (yysize <= yysize1
+ && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+ return 2;
+ yysize = yysize1;
+ }
}
}
}
@@ -1273,10 +1245,12 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
# undef YYCASE_
}
- yysize1 = yysize + yystrlen (yyformat);
- if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
- return 2;
- yysize = yysize1;
+ {
+ YYSIZE_T yysize1 = yysize + yystrlen (yyformat);
+ if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+ return 2;
+ yysize = yysize1;
+ }
if (*yymsg_alloc < yysize)
{
@@ -1336,7 +1310,7 @@ yydestruct (yymsg, yytype, yyvaluep)
{
default:
- break;
+ break;
}
}
@@ -1347,16 +1321,16 @@ yydestruct (yymsg, yytype, yyvaluep)
int yychar;
-#ifndef YYLVAL_INITIALIZE
-# define YYLVAL_INITIALIZE()
-#endif
#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
# define YY_IGNORE_MAYBE_UNINITIALIZED_END
#endif
+#ifndef YY_INITIAL_VALUE
+# define YY_INITIAL_VALUE(Value) /* Nothing. */
+#endif
/* The semantic value of the lookahead symbol. */
-YYSTYPE yylval;
+YYSTYPE yylval YY_INITIAL_VALUE(yyval_default);
/* Number of syntax errors so far. */
int yynerrs;
@@ -1432,8 +1406,8 @@ yyparse ()
Keep to zero when no symbol should be popped. */
int yylen = 0;
- yyss = yyssa;
- yyvs = yyvsa;
+ yyssp = yyss = yyssa;
+ yyvsp = yyvs = yyvsa;
yystacksize = YYINITDEPTH;
YYDPRINTF ((stderr, "Starting parse\n"));
@@ -1442,15 +1416,6 @@ yyparse ()
yyerrstatus = 0;
yynerrs = 0;
yychar = YYEMPTY; /* Cause a token to be read. */
-
- /* Initialize stack pointers.
- Waste one element of value and location stack
- so that they stay on the same level as the state stack.
- The wasted elements are never initialized. */
- yyssp = yyss;
- yyvsp = yyvs;
-
- YYLVAL_INITIALIZE ();
goto yysetstate;
/*------------------------------------------------------------.
@@ -1630,144 +1595,144 @@ yyreduce:
switch (yyn)
{
case 3:
-/* Line 1813 of yacc.c */
-#line 124 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 122 "grammar.y"
{ cnfDoObj((yyvsp[(2) - (2)].obj)); }
break;
case 4:
-/* Line 1813 of yacc.c */
-#line 125 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 123 "grammar.y"
{ cnfDoScript((yyvsp[(2) - (2)].stmt)); }
break;
case 5:
-/* Line 1813 of yacc.c */
-#line 126 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 124 "grammar.y"
{ cnfDoCfsysline((yyvsp[(2) - (2)].s)); }
break;
case 6:
-/* Line 1813 of yacc.c */
-#line 127 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 125 "grammar.y"
{ cnfDoBSDTag((yyvsp[(2) - (2)].s)); }
break;
case 7:
-/* Line 1813 of yacc.c */
-#line 128 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 126 "grammar.y"
{ cnfDoBSDHost((yyvsp[(2) - (2)].s)); }
break;
case 8:
-/* Line 1813 of yacc.c */
-#line 129 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 127 "grammar.y"
{ (yyval.obj) = cnfobjNew((yyvsp[(1) - (3)].objType), (yyvsp[(2) - (3)].nvlst)); }
break;
case 9:
-/* Line 1813 of yacc.c */
-#line 130 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 128 "grammar.y"
{ (yyval.obj) = cnfobjNew(CNFOBJ_TPL, (yyvsp[(2) - (3)].nvlst)); }
break;
case 10:
-/* Line 1813 of yacc.c */
-#line 132 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 130 "grammar.y"
{ (yyval.obj) = cnfobjNew(CNFOBJ_TPL, (yyvsp[(2) - (6)].nvlst));
(yyval.obj)->subobjs = (yyvsp[(5) - (6)].objlst);
}
break;
case 11:
-/* Line 1813 of yacc.c */
-#line 136 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 134 "grammar.y"
{ (yyval.obj) = cnfobjNew(CNFOBJ_RULESET, (yyvsp[(2) - (6)].nvlst));
(yyval.obj)->script = (yyvsp[(5) - (6)].stmt);
}
break;
case 12:
-/* Line 1813 of yacc.c */
-#line 139 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 137 "grammar.y"
{ (yyval.objlst) = NULL; }
break;
case 13:
-/* Line 1813 of yacc.c */
-#line 140 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 138 "grammar.y"
{ (yyval.objlst) = objlstAdd((yyvsp[(1) - (2)].objlst), (yyvsp[(2) - (2)].obj)); }
break;
case 14:
-/* Line 1813 of yacc.c */
-#line 141 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 139 "grammar.y"
{ (yyval.objlst) = objlstAdd((yyvsp[(1) - (2)].objlst), (yyvsp[(2) - (2)].obj)); }
break;
case 15:
-/* Line 1813 of yacc.c */
-#line 142 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 140 "grammar.y"
{ (yyval.obj) = cnfobjNew(CNFOBJ_PROPERTY, (yyvsp[(2) - (3)].nvlst)); }
break;
case 16:
-/* Line 1813 of yacc.c */
-#line 143 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 141 "grammar.y"
{ (yyval.obj) = cnfobjNew(CNFOBJ_CONSTANT, (yyvsp[(2) - (3)].nvlst)); }
break;
case 17:
-/* Line 1813 of yacc.c */
-#line 144 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 142 "grammar.y"
{ (yyval.nvlst) = NULL; }
break;
case 18:
-/* Line 1813 of yacc.c */
-#line 145 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 143 "grammar.y"
{ (yyvsp[(2) - (2)].nvlst)->next = (yyvsp[(1) - (2)].nvlst); (yyval.nvlst) = (yyvsp[(2) - (2)].nvlst); }
break;
case 19:
-/* Line 1813 of yacc.c */
-#line 146 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 144 "grammar.y"
{ (yyval.nvlst) = nvlstSetName((yyvsp[(3) - (3)].nvlst), (yyvsp[(1) - (3)].estr)); }
break;
case 20:
-/* Line 1813 of yacc.c */
-#line 147 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 145 "grammar.y"
{ (yyval.nvlst) = nvlstNewStr((yyvsp[(1) - (1)].estr)); }
break;
case 21:
-/* Line 1813 of yacc.c */
-#line 148 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 146 "grammar.y"
{ (yyval.nvlst) = nvlstNewArray((yyvsp[(1) - (1)].arr)); }
break;
case 22:
-/* Line 1813 of yacc.c */
-#line 149 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 147 "grammar.y"
{ (yyval.stmt) = (yyvsp[(1) - (1)].stmt); }
break;
case 23:
-/* Line 1813 of yacc.c */
-#line 150 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 148 "grammar.y"
{ (yyval.stmt) = scriptAddStmt((yyvsp[(1) - (2)].stmt), (yyvsp[(2) - (2)].stmt)); }
break;
case 24:
-/* Line 1813 of yacc.c */
-#line 151 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 149 "grammar.y"
{ (yyval.stmt) = (yyvsp[(1) - (1)].stmt); }
break;
case 25:
-/* Line 1813 of yacc.c */
-#line 152 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 150 "grammar.y"
{ (yyval.stmt) = cnfstmtNew(S_IF);
(yyval.stmt)->d.s_if.expr = (yyvsp[(2) - (4)].expr);
(yyval.stmt)->d.s_if.t_then = (yyvsp[(4) - (4)].stmt);
@@ -1775,8 +1740,8 @@ yyreduce:
break;
case 26:
-/* Line 1813 of yacc.c */
-#line 156 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 154 "grammar.y"
{ (yyval.stmt) = cnfstmtNew(S_IF);
(yyval.stmt)->d.s_if.expr = (yyvsp[(2) - (6)].expr);
(yyval.stmt)->d.s_if.t_then = (yyvsp[(4) - (6)].stmt);
@@ -1784,278 +1749,278 @@ yyreduce:
break;
case 27:
-/* Line 1813 of yacc.c */
-#line 160 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 158 "grammar.y"
{ (yyval.stmt) = cnfstmtNewSet((yyvsp[(2) - (5)].s), (yyvsp[(4) - (5)].expr)); }
break;
case 28:
-/* Line 1813 of yacc.c */
-#line 161 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 159 "grammar.y"
{ (yyval.stmt) = cnfstmtNewUnset((yyvsp[(2) - (3)].s)); }
break;
case 29:
-/* Line 1813 of yacc.c */
-#line 162 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 160 "grammar.y"
{ (yyval.stmt) = cnfstmtNewPRIFILT((yyvsp[(1) - (2)].s), (yyvsp[(2) - (2)].stmt)); }
break;
case 30:
-/* Line 1813 of yacc.c */
-#line 163 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 161 "grammar.y"
{ (yyval.stmt) = cnfstmtNewPROPFILT((yyvsp[(1) - (2)].s), (yyvsp[(2) - (2)].stmt)); }
break;
case 31:
-/* Line 1813 of yacc.c */
-#line 164 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 162 "grammar.y"
{ (yyval.stmt) = (yyvsp[(1) - (1)].stmt); }
break;
case 32:
-/* Line 1813 of yacc.c */
-#line 165 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 163 "grammar.y"
{ (yyval.stmt) = (yyvsp[(2) - (3)].stmt); }
break;
case 33:
-/* Line 1813 of yacc.c */
-#line 166 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 164 "grammar.y"
{ (yyval.stmt) = (yyvsp[(1) - (1)].stmt); }
break;
case 34:
-/* Line 1813 of yacc.c */
-#line 167 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 165 "grammar.y"
{ (yyval.stmt) = scriptAddStmt((yyvsp[(1) - (3)].stmt), (yyvsp[(3) - (3)].stmt)); }
break;
case 35:
-/* Line 1813 of yacc.c */
-#line 169 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 167 "grammar.y"
{ (yyval.stmt) = cnfstmtNewAct((yyvsp[(2) - (3)].nvlst)); }
break;
case 36:
-/* Line 1813 of yacc.c */
-#line 170 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 168 "grammar.y"
{ (yyval.stmt) = cnfstmtNewLegaAct((yyvsp[(1) - (1)].s)); }
break;
case 37:
-/* Line 1813 of yacc.c */
-#line 171 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 169 "grammar.y"
{ (yyval.stmt) = cnfstmtNew(S_STOP); }
break;
case 38:
-/* Line 1813 of yacc.c */
-#line 172 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 170 "grammar.y"
{ (yyval.stmt) = cnfstmtNewCall((yyvsp[(2) - (2)].estr)); }
break;
case 39:
-/* Line 1813 of yacc.c */
-#line 173 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 171 "grammar.y"
{ (yyval.stmt) = cnfstmtNewContinue(); }
break;
case 40:
-/* Line 1813 of yacc.c */
-#line 174 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 172 "grammar.y"
{ (yyval.expr) = cnfexprNew(AND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); }
break;
case 41:
-/* Line 1813 of yacc.c */
-#line 175 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 173 "grammar.y"
{ (yyval.expr) = cnfexprNew(OR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); }
break;
case 42:
-/* Line 1813 of yacc.c */
-#line 176 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 174 "grammar.y"
{ (yyval.expr) = cnfexprNew(NOT, NULL, (yyvsp[(2) - (2)].expr)); }
break;
case 43:
-/* Line 1813 of yacc.c */
-#line 177 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 175 "grammar.y"
{ (yyval.expr) = cnfexprNew(CMP_EQ, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); }
break;
case 44:
-/* Line 1813 of yacc.c */
-#line 178 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 176 "grammar.y"
{ (yyval.expr) = cnfexprNew(CMP_NE, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); }
break;
case 45:
-/* Line 1813 of yacc.c */
-#line 179 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 177 "grammar.y"
{ (yyval.expr) = cnfexprNew(CMP_LE, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); }
break;
case 46:
-/* Line 1813 of yacc.c */
-#line 180 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 178 "grammar.y"
{ (yyval.expr) = cnfexprNew(CMP_GE, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); }
break;
case 47:
-/* Line 1813 of yacc.c */
-#line 181 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 179 "grammar.y"
{ (yyval.expr) = cnfexprNew(CMP_LT, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); }
break;
case 48:
-/* Line 1813 of yacc.c */
-#line 182 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 180 "grammar.y"
{ (yyval.expr) = cnfexprNew(CMP_GT, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); }
break;
case 49:
-/* Line 1813 of yacc.c */
-#line 183 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 181 "grammar.y"
{ (yyval.expr) = cnfexprNew(CMP_CONTAINS, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); }
break;
case 50:
-/* Line 1813 of yacc.c */
-#line 184 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 182 "grammar.y"
{ (yyval.expr) = cnfexprNew(CMP_CONTAINSI, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); }
break;
case 51:
-/* Line 1813 of yacc.c */
-#line 185 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 183 "grammar.y"
{ (yyval.expr) = cnfexprNew(CMP_STARTSWITH, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); }
break;
case 52:
-/* Line 1813 of yacc.c */
-#line 186 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 184 "grammar.y"
{ (yyval.expr) = cnfexprNew(CMP_STARTSWITHI, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); }
break;
case 53:
-/* Line 1813 of yacc.c */
-#line 187 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 185 "grammar.y"
{ (yyval.expr) = cnfexprNew('&', (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); }
break;
case 54:
-/* Line 1813 of yacc.c */
-#line 188 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 186 "grammar.y"
{ (yyval.expr) = cnfexprNew('+', (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); }
break;
case 55:
-/* Line 1813 of yacc.c */
-#line 189 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 187 "grammar.y"
{ (yyval.expr) = cnfexprNew('-', (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); }
break;
case 56:
-/* Line 1813 of yacc.c */
-#line 190 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 188 "grammar.y"
{ (yyval.expr) = cnfexprNew('*', (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); }
break;
case 57:
-/* Line 1813 of yacc.c */
-#line 191 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 189 "grammar.y"
{ (yyval.expr) = cnfexprNew('/', (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); }
break;
case 58:
-/* Line 1813 of yacc.c */
-#line 192 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 190 "grammar.y"
{ (yyval.expr) = cnfexprNew('%', (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); }
break;
case 59:
-/* Line 1813 of yacc.c */
-#line 193 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 191 "grammar.y"
{ (yyval.expr) = (yyvsp[(2) - (3)].expr); }
break;
case 60:
-/* Line 1813 of yacc.c */
-#line 194 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 192 "grammar.y"
{ (yyval.expr) = cnfexprNew('M', NULL, (yyvsp[(2) - (2)].expr)); }
break;
case 61:
-/* Line 1813 of yacc.c */
-#line 195 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 193 "grammar.y"
{ (yyval.expr) = (struct cnfexpr*) cnffuncNew((yyvsp[(1) - (3)].estr), NULL); }
break;
case 62:
-/* Line 1813 of yacc.c */
-#line 196 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 194 "grammar.y"
{ (yyval.expr) = (struct cnfexpr*) cnffuncNew((yyvsp[(1) - (4)].estr), (yyvsp[(3) - (4)].fparams)); }
break;
case 63:
-/* Line 1813 of yacc.c */
-#line 197 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 195 "grammar.y"
{ (yyval.expr) = (struct cnfexpr*) cnfnumvalNew((yyvsp[(1) - (1)].n)); }
break;
case 64:
-/* Line 1813 of yacc.c */
-#line 198 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 196 "grammar.y"
{ (yyval.expr) = (struct cnfexpr*) cnfstringvalNew((yyvsp[(1) - (1)].estr)); }
break;
case 65:
-/* Line 1813 of yacc.c */
-#line 199 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 197 "grammar.y"
{ (yyval.expr) = (struct cnfexpr*) cnfvarNew((yyvsp[(1) - (1)].s)); }
break;
case 66:
-/* Line 1813 of yacc.c */
-#line 200 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 198 "grammar.y"
{ (yyval.expr) = (struct cnfexpr*) (yyvsp[(1) - (1)].arr); }
break;
case 67:
-/* Line 1813 of yacc.c */
-#line 201 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 199 "grammar.y"
{ (yyval.fparams) = cnffparamlstNew((yyvsp[(1) - (1)].expr), NULL); }
break;
case 68:
-/* Line 1813 of yacc.c */
-#line 202 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 200 "grammar.y"
{ (yyval.fparams) = cnffparamlstNew((yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].fparams)); }
break;
case 69:
-/* Line 1813 of yacc.c */
-#line 203 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 201 "grammar.y"
{ (yyval.arr) = (yyvsp[(2) - (3)].arr); }
break;
case 70:
-/* Line 1813 of yacc.c */
-#line 204 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 202 "grammar.y"
{ (yyval.arr) = cnfarrayNew((yyvsp[(1) - (1)].estr)); }
break;
case 71:
-/* Line 1813 of yacc.c */
-#line 205 "grammar.y"
+/* Line 1792 of yacc.c */
+#line 203 "grammar.y"
{ (yyval.arr) = cnfarrayAdd((yyvsp[(1) - (3)].arr), (yyvsp[(3) - (3)].estr)); }
break;
-/* Line 1813 of yacc.c */
-#line 2059 "grammar.c"
+/* Line 1792 of yacc.c */
+#line 2024 "grammar.c"
default: break;
}
/* User semantic actions sometimes alter yychar, and that requires
@@ -2286,8 +2251,8 @@ yyreturn:
}
-/* Line 2076 of yacc.c */
-#line 207 "grammar.y"
+/* Line 2055 of yacc.c */
+#line 205 "grammar.y"
/*
int yyerror(char *s)
diff --git a/grammar/grammar.h b/grammar/grammar.h
index 9ff8183..3ee2b26 100644
--- a/grammar/grammar.h
+++ b/grammar/grammar.h
@@ -1,4 +1,4 @@
-/* A Bison parser, made by GNU Bison 2.6.4. */
+/* A Bison parser, made by GNU Bison 2.7. */
/* Bison interface for Yacc-like parsers in C
@@ -135,8 +135,8 @@ extern int yydebug;
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef union YYSTYPE
{
-/* Line 2077 of yacc.c */
-#line 45 "grammar.y"
+/* Line 2058 of yacc.c */
+#line 43 "grammar.y"
char *s;
long long n;
@@ -152,7 +152,7 @@ typedef union YYSTYPE
struct cnffparamlst *fparams;
-/* Line 2077 of yacc.c */
+/* Line 2058 of yacc.c */
#line 157 "grammar.h"
} YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1
diff --git a/grammar/grammar.y b/grammar/grammar.y
index a198db0..488d332 100644
--- a/grammar/grammar.y
+++ b/grammar/grammar.y
@@ -1,33 +1,31 @@
- /* Bison file for rsyslog config format v2 (RainerScript).
- * Please note: this file introduces the new config format, but maintains
- * backward compatibility. In order to do so, the grammar is not 100% clean,
- * but IMHO still sufficiently easy both to understand for programmers
- * maitaining the code as well as users writing the config file. Users are,
- * of course, encouraged to use new constructs only. But it needs to be noted
- * that some of the legacy constructs (specifically the in-front-of-action
- * PRI filter) are very hard to beat in ease of use, at least for simpler
- * cases.
- *
- * Copyright 2011-2014 Rainer Gerhards and Adiscon GmbH.
- *
- * This file is part of the rsyslog runtime library.
- *
- * The rsyslog runtime library is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The rsyslog runtime library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with the rsyslog runtime library. If not, see <http://www.gnu.org/licenses/>.
- *
- * A copy of the GPL can be found in the file "COPYING" in this distribution.
- * A copy of the LGPL can be found in the file "COPYING.LESSER" in this distribution.
- */
+/* Bison file for rsyslog config format v2 (RainerScript).
+ * Please note: this file introduces the new config format, but maintains
+ * backward compatibility. In order to do so, the grammar is not 100% clean,
+ * but IMHO still sufficiently easy both to understand for programmers
+ * maitaining the code as well as users writing the config file. Users are,
+ * of course, encouraged to use new constructs only. But it needs to be noted
+ * that some of the legacy constructs (specifically the in-front-of-action
+ * PRI filter) are very hard to beat in ease of use, at least for simpler
+ * cases.
+ *
+ * Copyright 2011-2014 Rainer Gerhards and Adiscon GmbH.
+ *
+ * This file is part of the rsyslog runtime library.
+ *
+ * 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 <stdio.h>
diff --git a/grammar/lexer.c b/grammar/lexer.c
index 2c96807..9dba6f2 100644
--- a/grammar/lexer.c
+++ b/grammar/lexer.c
@@ -1434,23 +1434,21 @@ char *yytext;
*
* This file is part of the rsyslog runtime library.
*
-* The rsyslog runtime library is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* The rsyslog runtime library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with the rsyslog runtime library. If not, see <http://www.gnu.org/licenses/>.
-*
-* A copy of the GPL can be found in the file "COPYING" in this distribution.
-* A copy of the LGPL can be found in the file "COPYING.LESSER" in this distribution.
+* 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.
*/
-#line 34 "lexer.l"
+#line 32 "lexer.l"
#include "config.h"
/*%option noyywrap nodefault case-insensitive */
/* avoid compiler warning: `yyunput' defined but not used */
@@ -1477,7 +1475,7 @@ char *yytext;
* wrote this ugly, but the price needed to pay in order to remain
* compatible to the previous format.
*/
-#line 67 "lexer.l"
+#line 65 "lexer.l"
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
@@ -1510,7 +1508,7 @@ extern int yydebug;
int fileno(FILE *stream);
#endif
-#line 1514 "lexer.c"
+#line 1512 "lexer.c"
#define INITIAL 0
#define INOBJ 1
@@ -1699,11 +1697,11 @@ YY_DECL
register char *yy_cp, *yy_bp;
register int yy_act;
-#line 101 "lexer.l"
+#line 99 "lexer.l"
/* keywords */
-#line 1707 "lexer.c"
+#line 1705 "lexer.c"
if ( !(yy_init) )
{
@@ -1799,131 +1797,131 @@ do_action: /* This label is used only to access EOF actions. */
case 1:
YY_RULE_SETUP
-#line 104 "lexer.l"
+#line 102 "lexer.l"
{ BEGIN EXPR; return IF; }
YY_BREAK
case 2:
YY_RULE_SETUP
-#line 105 "lexer.l"
+#line 103 "lexer.l"
{ BEGIN INITIAL; return THEN; }
YY_BREAK
case 3:
YY_RULE_SETUP
-#line 106 "lexer.l"
+#line 104 "lexer.l"
{ BEGIN INITIAL; return ';'; }
YY_BREAK
case 4:
YY_RULE_SETUP
-#line 107 "lexer.l"
+#line 105 "lexer.l"
{ return OR; }
YY_BREAK
case 5:
YY_RULE_SETUP
-#line 108 "lexer.l"
+#line 106 "lexer.l"
{ return AND; }
YY_BREAK
case 6:
YY_RULE_SETUP
-#line 109 "lexer.l"
+#line 107 "lexer.l"
{ return NOT; }
YY_BREAK
case 7:
-#line 111 "lexer.l"
+#line 109 "lexer.l"
case 8:
-#line 112 "lexer.l"
+#line 110 "lexer.l"
case 9:
-#line 113 "lexer.l"
+#line 111 "lexer.l"
case 10:
-#line 114 "lexer.l"
+#line 112 "lexer.l"
case 11:
-#line 115 "lexer.l"
+#line 113 "lexer.l"
case 12:
-#line 116 "lexer.l"
+#line 114 "lexer.l"
case 13:
-#line 117 "lexer.l"
+#line 115 "lexer.l"
case 14:
-#line 118 "lexer.l"
+#line 116 "lexer.l"
case 15:
-#line 119 "lexer.l"
+#line 117 "lexer.l"
case 16:
-#line 120 "lexer.l"
+#line 118 "lexer.l"
case 17:
-#line 121 "lexer.l"
+#line 119 "lexer.l"
case 18:
YY_RULE_SETUP
-#line 121 "lexer.l"
+#line 119 "lexer.l"
{ return yytext[0]; }
YY_BREAK
case 19:
YY_RULE_SETUP
-#line 122 "lexer.l"
+#line 120 "lexer.l"
{ return CMP_EQ; }
YY_BREAK
case 20:
YY_RULE_SETUP
-#line 123 "lexer.l"
+#line 121 "lexer.l"
{ return CMP_LE; }
YY_BREAK
case 21:
YY_RULE_SETUP
-#line 124 "lexer.l"
+#line 122 "lexer.l"
{ return CMP_GE; }
YY_BREAK
case 22:
-#line 126 "lexer.l"
+#line 124 "lexer.l"
case 23:
YY_RULE_SETUP
-#line 126 "lexer.l"
+#line 124 "lexer.l"
{ return CMP_NE; }
YY_BREAK
case 24:
YY_RULE_SETUP
-#line 127 "lexer.l"
+#line 125 "lexer.l"
{ return CMP_LT; }
YY_BREAK
case 25:
YY_RULE_SETUP
-#line 128 "lexer.l"
+#line 126 "lexer.l"
{ return CMP_GT; }
YY_BREAK
case 26:
YY_RULE_SETUP
-#line 129 "lexer.l"
+#line 127 "lexer.l"
{ return CMP_CONTAINS; }
YY_BREAK
case 27:
YY_RULE_SETUP
-#line 130 "lexer.l"
+#line 128 "lexer.l"
{ return CMP_CONTAINSI; }
YY_BREAK
case 28:
YY_RULE_SETUP
-#line 131 "lexer.l"
+#line 129 "lexer.l"
{ return CMP_STARTSWITH; }
YY_BREAK
case 29:
YY_RULE_SETUP
-#line 132 "lexer.l"
+#line 130 "lexer.l"
{ return CMP_STARTSWITHI; }
YY_BREAK
case 30:
-#line 134 "lexer.l"
+#line 132 "lexer.l"
case 31:
-#line 135 "lexer.l"
+#line 133 "lexer.l"
case 32:
YY_RULE_SETUP
-#line 135 "lexer.l"
+#line 133 "lexer.l"
{ yylval.n = strtoll(yytext, NULL, 0); return NUMBER; }
YY_BREAK
case 33:
YY_RULE_SETUP
-#line 136 "lexer.l"
+#line 134 "lexer.l"
{ yylval.s = strdup(yytext+1); return VAR; }
YY_BREAK
case 34:
/* rule 34 can match eol */
YY_RULE_SETUP
-#line 137 "lexer.l"
+#line 135 "lexer.l"
{
yytext[yyleng-1] = '\0';
unescapeStr((uchar*)yytext+1, yyleng-2);
@@ -1933,7 +1931,7 @@ YY_RULE_SETUP
case 35:
/* rule 35 can match eol */
YY_RULE_SETUP
-#line 142 "lexer.l"
+#line 140 "lexer.l"
{
yytext[yyleng-1] = '\0';
unescapeStr((uchar*)yytext+1, yyleng-2);
@@ -1943,18 +1941,18 @@ YY_RULE_SETUP
case 36:
/* rule 36 can match eol */
YY_RULE_SETUP
-#line 147 "lexer.l"
+#line 145 "lexer.l"
YY_BREAK
case 37:
YY_RULE_SETUP
-#line 148 "lexer.l"
+#line 146 "lexer.l"
{ yylval.estr = es_newStrFromCStr(yytext, yyleng);
return FUNC; }
YY_BREAK
case 38:
YY_RULE_SETUP
-#line 150 "lexer.l"
+#line 148 "lexer.l"
{ parser_errmsg("invalid character '%s' in expression "
"- is there an invalid escape sequence somewhere?",
yytext); }
@@ -1962,66 +1960,66 @@ YY_RULE_SETUP
case 39:
/* rule 39 can match eol */
YY_RULE_SETUP
-#line 153 "lexer.l"
+#line 151 "lexer.l"
YY_BREAK
case 40:
YY_RULE_SETUP
-#line 154 "lexer.l"
+#line 152 "lexer.l"
{ parser_errmsg("invalid character '%s' in 'call' statement"
"- is there an invalid escape sequence somewhere?",
yytext); }
YY_BREAK
case 41:
YY_RULE_SETUP
-#line 157 "lexer.l"
+#line 155 "lexer.l"
{ yylval.estr = es_newStrFromCStr(yytext, yyleng);
BEGIN INITIAL;
return NAME; }
YY_BREAK
case 42:
YY_RULE_SETUP
-#line 160 "lexer.l"
+#line 158 "lexer.l"
{ return '&'; }
YY_BREAK
case 43:
YY_RULE_SETUP
-#line 161 "lexer.l"
+#line 159 "lexer.l"
{ return '{'; }
YY_BREAK
case 44:
YY_RULE_SETUP
-#line 162 "lexer.l"
+#line 160 "lexer.l"
{ return '}'; }
YY_BREAK
case 45:
YY_RULE_SETUP
-#line 163 "lexer.l"
+#line 161 "lexer.l"
{ return STOP; }
YY_BREAK
case 46:
YY_RULE_SETUP
-#line 164 "lexer.l"
+#line 162 "lexer.l"
{ return ELSE; }
YY_BREAK
case 47:
YY_RULE_SETUP
-#line 165 "lexer.l"
+#line 163 "lexer.l"
{ BEGIN INCALL; return CALL; }
YY_BREAK
case 48:
YY_RULE_SETUP
-#line 166 "lexer.l"
+#line 164 "lexer.l"
{ BEGIN EXPR; return SET; }
YY_BREAK
case 49:
YY_RULE_SETUP
-#line 167 "lexer.l"
+#line 165 "lexer.l"
{ BEGIN EXPR; return UNSET; }
YY_BREAK
case 50:
YY_RULE_SETUP
-#line 168 "lexer.l"
+#line 166 "lexer.l"
{ return CONTINUE; }
YY_BREAK
/* line number support because the "preprocessor" combines lines and so needs
@@ -2029,23 +2027,23 @@ YY_RULE_SETUP
*/
case 51:
YY_RULE_SETUP
-#line 172 "lexer.l"
+#line 170 "lexer.l"
{ BEGIN LINENO; }
YY_BREAK
case 52:
YY_RULE_SETUP
-#line 173 "lexer.l"
+#line 171 "lexer.l"
{ yylineno = atoi(yytext) - 1; }
YY_BREAK
case 53:
YY_RULE_SETUP
-#line 174 "lexer.l"
+#line 172 "lexer.l"
{ BEGIN INITIAL; }
YY_BREAK
case 54:
/* rule 54 can match eol */
YY_RULE_SETUP
-#line 175 "lexer.l"
+#line 173 "lexer.l"
YY_BREAK
/* $IncludeConfig must be detected as part of CFSYSLINE, because this is
@@ -2054,12 +2052,12 @@ YY_RULE_SETUP
case 55:
/* rule 55 can match eol */
YY_RULE_SETUP
-#line 179 "lexer.l"
+#line 177 "lexer.l"
YY_BREAK
case 56:
YY_RULE_SETUP
-#line 180 "lexer.l"
+#line 178 "lexer.l"
{ if(cnfDoInclude(yytext) != 0)
yyterminate();
BEGIN INITIAL; }
@@ -2067,76 +2065,76 @@ YY_RULE_SETUP
case 57:
/* rule 57 can match eol */
YY_RULE_SETUP
-#line 183 "lexer.l"
+#line 181 "lexer.l"
{ yylval.objType = CNFOBJ_MAINQ;
BEGIN INOBJ; return BEGINOBJ; }
YY_BREAK
case 58:
/* rule 58 can match eol */
YY_RULE_SETUP
-#line 185 "lexer.l"
+#line 183 "lexer.l"
{ yylval.objType = CNFOBJ_GLOBAL;
BEGIN INOBJ; return BEGINOBJ; }
YY_BREAK
case 59:
/* rule 59 can match eol */
YY_RULE_SETUP
-#line 187 "lexer.l"
+#line 185 "lexer.l"
{ yylval.objType = CNFOBJ_TPL;
BEGIN INOBJ; return BEGIN_TPL; }
YY_BREAK
case 60:
/* rule 60 can match eol */
YY_RULE_SETUP
-#line 189 "lexer.l"
+#line 187 "lexer.l"
{ yylval.objType = CNFOBJ_RULESET;
BEGIN INOBJ; return BEGIN_RULESET; }
YY_BREAK
case 61:
/* rule 61 can match eol */
YY_RULE_SETUP
-#line 191 "lexer.l"
+#line 189 "lexer.l"
{ yylval.objType = CNFOBJ_PROPERTY;
BEGIN INOBJ; return BEGIN_PROPERTY; }
YY_BREAK
case 62:
/* rule 62 can match eol */
YY_RULE_SETUP
-#line 193 "lexer.l"
+#line 191 "lexer.l"
{ yylval.objType = CNFOBJ_CONSTANT;
BEGIN INOBJ; return BEGIN_CONSTANT; }
YY_BREAK
case 63:
/* rule 63 can match eol */
YY_RULE_SETUP
-#line 195 "lexer.l"
+#line 193 "lexer.l"
{ yylval.objType = CNFOBJ_INPUT;
BEGIN INOBJ; return BEGINOBJ; }
YY_BREAK
case 64:
/* rule 64 can match eol */
YY_RULE_SETUP
-#line 197 "lexer.l"
+#line 195 "lexer.l"
{ yylval.objType = CNFOBJ_MODULE;
BEGIN INOBJ; return BEGINOBJ; }
YY_BREAK
case 65:
/* rule 65 can match eol */
YY_RULE_SETUP
-#line 199 "lexer.l"
+#line 197 "lexer.l"
{ yylval.objType = CNFOBJ_LOOKUP_TABLE;
BEGIN INOBJ; return BEGINOBJ; }
YY_BREAK
case 66:
/* rule 66 can match eol */
YY_RULE_SETUP
-#line 201 "lexer.l"
+#line 199 "lexer.l"
{ BEGIN INOBJ; return BEGIN_ACTION; }
YY_BREAK
case 67:
/* rule 67 can match eol */
YY_RULE_SETUP
-#line 202 "lexer.l"
+#line 200 "lexer.l"
{
yylval.s = strdup(rmLeadingSpace(yytext));
dbgprintf("lexer: propfilt is '%s'\n", yylval.s);
@@ -2145,57 +2143,57 @@ YY_RULE_SETUP
YY_BREAK
case 68:
YY_RULE_SETUP
-#line 207 "lexer.l"
+#line 205 "lexer.l"
{ yylval.s = strdup(rmLeadingSpace(yytext)); return PRIFILT; }
YY_BREAK
case 69:
-#line 209 "lexer.l"
+#line 207 "lexer.l"
case 70:
-#line 210 "lexer.l"
+#line 208 "lexer.l"
case 71:
/* rule 71 can match eol */
-#line 211 "lexer.l"
+#line 209 "lexer.l"
case 72:
/* rule 72 can match eol */
-#line 212 "lexer.l"
+#line 210 "lexer.l"
case 73:
/* rule 73 can match eol */
-#line 213 "lexer.l"
+#line 211 "lexer.l"
case 74:
/* rule 74 can match eol */
-#line 214 "lexer.l"
+#line 212 "lexer.l"
case 75:
/* rule 75 can match eol */
YY_RULE_SETUP
-#line 214 "lexer.l"
+#line 212 "lexer.l"
{ yylval.s = yytext; return LEGACY_ACTION; }
YY_BREAK
case 76:
YY_RULE_SETUP
-#line 215 "lexer.l"
+#line 213 "lexer.l"
{ BEGIN INITIAL; return ENDOBJ; }
YY_BREAK
case 77:
YY_RULE_SETUP
-#line 216 "lexer.l"
+#line 214 "lexer.l"
{ yylval.estr = es_newStrFromCStr(yytext, yyleng);
return NAME; }
YY_BREAK
case 78:
-#line 219 "lexer.l"
+#line 217 "lexer.l"
case 79:
-#line 220 "lexer.l"
+#line 218 "lexer.l"
case 80:
-#line 221 "lexer.l"
+#line 219 "lexer.l"
case 81:
YY_RULE_SETUP
-#line 221 "lexer.l"
+#line 219 "lexer.l"
{ return(yytext[0]); }
YY_BREAK
case 82:
/* rule 82 can match eol */
YY_RULE_SETUP
-#line 222 "lexer.l"
+#line 220 "lexer.l"
{
yytext[yyleng-1] = '\0';
unescapeStr((uchar*)yytext+1, yyleng-2);
@@ -2206,28 +2204,28 @@ YY_RULE_SETUP
return VALUE; }*/
case 83:
YY_RULE_SETUP
-#line 229 "lexer.l"
+#line 227 "lexer.l"
{ preCommentState = YY_START; BEGIN COMMENT; }
YY_BREAK
case 84:
YY_RULE_SETUP
-#line 230 "lexer.l"
+#line 228 "lexer.l"
{ preCommentState = YY_START; BEGIN COMMENT; }
YY_BREAK
case 85:
YY_RULE_SETUP
-#line 231 "lexer.l"
+#line 229 "lexer.l"
{ preCommentState = YY_START; BEGIN COMMENT; }
YY_BREAK
case 86:
YY_RULE_SETUP
-#line 232 "lexer.l"
+#line 230 "lexer.l"
{ BEGIN preCommentState; }
YY_BREAK
case 87:
/* rule 87 can match eol */
YY_RULE_SETUP
-#line 233 "lexer.l"
+#line 231 "lexer.l"
YY_BREAK
case 88:
@@ -2235,18 +2233,18 @@ case 88:
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 234 "lexer.l"
+#line 232 "lexer.l"
/* skip comments in input */
YY_BREAK
case 89:
/* rule 89 can match eol */
YY_RULE_SETUP
-#line 235 "lexer.l"
+#line 233 "lexer.l"
YY_BREAK
case 90:
YY_RULE_SETUP
-#line 236 "lexer.l"
+#line 234 "lexer.l"
{ parser_errmsg("invalid character '%s' in object definition "
"- is there an invalid escape sequence somewhere?",
yytext); }
@@ -2256,7 +2254,7 @@ case 91:
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 239 "lexer.l"
+#line 237 "lexer.l"
{ /* see comment on $IncludeConfig above */
if(!strncasecmp(yytext, "$includeconfig ", 14)) {
yyless(14);
@@ -2274,7 +2272,7 @@ case 92:
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 250 "lexer.l"
+#line 248 "lexer.l"
{ yylval.s = strdup(yytext); return BSD_TAG_SELECTOR; }
YY_BREAK
case 93:
@@ -2283,7 +2281,7 @@ case 93:
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 251 "lexer.l"
+#line 249 "lexer.l"
{ yylval.s = strdup(yytext); return BSD_HOST_SELECTOR; }
YY_BREAK
case 94:
@@ -2292,7 +2290,7 @@ case 94:
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 252 "lexer.l"
+#line 250 "lexer.l"
{ yylval.s = strdup(yytext); return BSD_HOST_SELECTOR; }
YY_BREAK
case 95:
@@ -2300,24 +2298,24 @@ case 95:
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 253 "lexer.l"
+#line 251 "lexer.l"
{ yylval.s = strdup(yytext); return BSD_HOST_SELECTOR; }
YY_BREAK
case 96:
/* rule 96 can match eol */
YY_RULE_SETUP
-#line 254 "lexer.l"
+#line 252 "lexer.l"
/* skip comments in input */
YY_BREAK
case 97:
/* rule 97 can match eol */
YY_RULE_SETUP
-#line 255 "lexer.l"
+#line 253 "lexer.l"
/* drop whitespace */
YY_BREAK
case 98:
YY_RULE_SETUP
-#line 256 "lexer.l"
+#line 254 "lexer.l"
{ parser_errmsg("invalid character '%s' "
"- is there an invalid escape sequence somewhere?",
yytext); }
@@ -2329,15 +2327,15 @@ case YY_STATE_EOF(INCL):
case YY_STATE_EOF(LINENO):
case YY_STATE_EOF(INCALL):
case YY_STATE_EOF(EXPR):
-#line 259 "lexer.l"
+#line 257 "lexer.l"
{ if(popfile() != 0) yyterminate(); }
YY_BREAK
case 99:
YY_RULE_SETUP
-#line 261 "lexer.l"
+#line 259 "lexer.l"
YY_FATAL_ERROR( "flex scanner jammed" );
YY_BREAK
-#line 2341 "lexer.c"
+#line 2339 "lexer.c"
case YY_END_OF_BUFFER:
{
@@ -3302,7 +3300,7 @@ void yyfree (void * ptr )
#define YYTABLES_NAME "yytables"
-#line 261 "lexer.l"
+#line 259 "lexer.l"
int
diff --git a/grammar/lexer.l b/grammar/lexer.l
index d264d6e..48dba22 100644
--- a/grammar/lexer.l
+++ b/grammar/lexer.l
@@ -13,21 +13,19 @@
*
* This file is part of the rsyslog runtime library.
*
- * The rsyslog runtime library is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The rsyslog runtime library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with the rsyslog runtime library. If not, see <http://www.gnu.org/licenses/>.
- *
- * A copy of the GPL can be found in the file "COPYING" in this distribution.
- * A copy of the LGPL can be found in the file "COPYING.LESSER" in this distribution.
+ * 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.
*/
%{
diff --git a/grammar/parserif.h b/grammar/parserif.h
index 21da095..b66023d 100644
--- a/grammar/parserif.h
+++ b/grammar/parserif.h
@@ -1,3 +1,21 @@
+/* rsyslog parser interface.
+ *
+ * Copyright 2011-2014 Rainer Gerhards
+ *
+ * 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.
+ */
#ifndef PARSERIF_H_DEFINED
#define PARSERIF_H_DEFINED
#include "rainerscript.h"
@@ -20,4 +38,4 @@ void cnfDoScript(struct cnfstmt *script);
void cnfDoCfsysline(char *ln);
void cnfDoBSDTag(char *ln);
void cnfDoBSDHost(char *ln);
-#endif
+ #endif
diff --git a/grammar/rainerscript.c b/grammar/rainerscript.c
index de0d1bd..d508f91 100644
--- a/grammar/rainerscript.c
+++ b/grammar/rainerscript.c
@@ -1385,7 +1385,7 @@ doFunc_re_extract(struct cnffunc *func, struct var *ret, void* usrptr)
matchnbr = (short) var2Number(&r[2], NULL);
submatchnbr = (size_t) var2Number(&r[3], NULL);
if(submatchnbr >= sizeof(pmatch)/sizeof(regmatch_t)) {
- DBGPRINTF("re_extract() submatch %d is too large\n", submatchnbr);
+ DBGPRINTF("re_extract() submatch %zd is too large\n", submatchnbr);
bHadNoMatch = 1;
goto finalize_it;
}
diff --git a/grammar/rainerscript.h b/grammar/rainerscript.h
index c813264..63a0bb4 100644
--- a/grammar/rainerscript.h
+++ b/grammar/rainerscript.h
@@ -1,3 +1,21 @@
+/* rsyslog rainerscript definitions
+ *
+ * Copyright 2011-2014 Rainer Gerhards
+ *
+ * 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.
+ */
#ifndef INC_UTILS_H
#define INC_UTILS_H
#include <stdio.h>
diff --git a/plugins/imdiag/imdiag.c b/plugins/imdiag/imdiag.c
index 5fdc6ef..0532b5b 100644
--- a/plugins/imdiag/imdiag.c
+++ b/plugins/imdiag/imdiag.c
@@ -1,13 +1,11 @@
/* imdiag.c
- * This is a diagnostics module, primarily meant for troubleshooting
- * and information about the runtime state of rsyslog. It is implemented
- * as an input plugin, because that interface best suits our needs
- * and also enables us to inject test messages (something not yet
- * implemented).
+ * This is a testbench tool. It started out with a broader scope,
+ * but we dropped this idea. To learn about rsyslog runtime statistics
+ * have a look at impstats.
*
* File begun on 2008-07-25 by RGerhards
*
- * Copyright 2008-2012 Adiscon GmbH.
+ * Copyright 2008-2014 Adiscon GmbH.
*
* This file is part of rsyslog.
*
diff --git a/plugins/imptcp/imptcp.c b/plugins/imptcp/imptcp.c
index 920d876..9dc965b 100644
--- a/plugins/imptcp/imptcp.c
+++ b/plugins/imptcp/imptcp.c
@@ -1720,6 +1720,7 @@ BEGINactivateCnfPrePrivDrop
instanceConf_t *inst;
CODESTARTactivateCnfPrePrivDrop
iMaxLine = glbl.GetMaxLine(); /* get maximum size we currently support */
+ DBGPRINTF("imptcp: config params iMaxLine %d\n", iMaxLine);
runModConf = pModConf;
for(inst = runModConf->root ; inst != NULL ; inst = inst->next) {
diff --git a/plugins/imudp/imudp.c b/plugins/imudp/imudp.c
index 180c45f..61dfc58 100644
--- a/plugins/imudp/imudp.c
+++ b/plugins/imudp/imudp.c
@@ -1042,6 +1042,7 @@ CODESTARTactivateCnf
# ifdef HAVE_RECVMMSG
lenRcvBuf *= runModConf->batchSize;
# endif
+ DBGPRINTF("imudp: config params iMaxLine %d, lenRcvBuf %d\n", iMaxLine, lenRcvBuf);
for(i = 0 ; i < runModConf->wrkrMax ; ++i) {
# ifdef HAVE_RECVMMSG
CHKmalloc(wrkrInfo[i].recvmsg_iov = MALLOC(runModConf->batchSize * sizeof(struct iovec)));
diff --git a/plugins/mmrfc5424addhmac/mmrfc5424addhmac.c b/plugins/mmrfc5424addhmac/mmrfc5424addhmac.c
index 959a8ba..3a58edd 100644
--- a/plugins/mmrfc5424addhmac/mmrfc5424addhmac.c
+++ b/plugins/mmrfc5424addhmac/mmrfc5424addhmac.c
@@ -80,6 +80,10 @@ typedef struct _instanceData {
const EVP_MD *algo;
} instanceData;
+typedef struct wrkrInstanceData {
+ instanceData *pData;
+} wrkrInstanceData_t;
+
struct modConfData_s {
rsconf_t *pConf; /* our overall config object */
};
@@ -129,6 +133,11 @@ CODESTARTcreateInstance
ENDcreateInstance
+BEGINcreateWrkrInstance
+CODESTARTcreateWrkrInstance
+ENDcreateWrkrInstance
+
+
BEGINisCompatibleWithFeature
CODESTARTisCompatibleWithFeature
ENDisCompatibleWithFeature
@@ -139,6 +148,11 @@ CODESTARTfreeInstance
ENDfreeInstance
+BEGINfreeWrkrInstance
+CODESTARTfreeWrkrInstance
+ENDfreeWrkrInstance
+
+
static inline void
setInstParamDefaults(instanceData *pData)
{
@@ -322,6 +336,7 @@ hashMsg(instanceData *pData, msg_t *pMsg)
BEGINdoAction
+ instanceData *pData = pWrkrData->pData;
msg_t *pMsg;
CODESTARTdoAction
pMsg = (msg_t*) ppString[0];
@@ -364,6 +379,7 @@ BEGINqueryEtryPt
CODESTARTqueryEtryPt
CODEqueryEtryPt_STD_OMOD_QUERIES
CODEqueryEtryPt_STD_CONF2_OMOD_QUERIES
+CODEqueryEtryPt_STD_OMOD8_QUERIES
CODEqueryEtryPt_STD_CONF2_QUERIES
ENDqueryEtryPt
diff --git a/plugins/mmsnmptrapd/mmsnmptrapd.c b/plugins/mmsnmptrapd/mmsnmptrapd.c
index 3547dcf..456eb79 100644
--- a/plugins/mmsnmptrapd/mmsnmptrapd.c
+++ b/plugins/mmsnmptrapd/mmsnmptrapd.c
@@ -68,8 +68,8 @@ struct severMap_s {
typedef struct _instanceData {
uchar *pszTagName;
- uchar *pszTagID; /* chaced: name plus trailing shlash (for compares) */
- int lenTagID; /* cached length of tag ID, for performance reasons */
+ uchar *pszTagID; /* cached: name plus trailing shlash (for compares) */
+ int lenTagID; /* cached: length of tag ID, for performance reasons */
struct severMap_s *severMap;
} instanceData;
@@ -202,7 +202,6 @@ getTagComponent(uchar *tag, uchar *dst, int *lenDst)
++i;
}
dst[i] = '\0';
-dbgprintf("XXXX: getTagComponent dst on output: '%s', len %d\n", dst, i);
*lenDst = i;
done:
return i;
@@ -241,7 +240,6 @@ BEGINdoAction
CODESTARTdoAction
pData = pWrkrData->pData;
pMsg = (msg_t*) ppString[0];
- dbgprintf("XXXX: mmsnmptrapd called with pMsg %p\n", pMsg);
getTAG(pMsg, &pszTag, &lenTAG);
if(strncmp((char*)pszTag, (char*)pData->pszTagID, pData->lenTagID)) {
DBGPRINTF("tag '%s' not matching, mmsnmptrapd ignoring this message\n",
@@ -250,18 +248,16 @@ CODESTARTdoAction
}
lenSever = sizeof(pszSever);
-dbgprintf("XXXX: pszTag: '%s', lenID %d\n", pszTag, pData->lenTagID);
getTagComponent(pszTag+pData->lenTagID-1, pszSever, &lenSever);
lenHost = sizeof(pszHost);
getTagComponent(pszTag+pData->lenTagID+lenSever, pszHost, &lenHost);
- dbgprintf("XXXX: mmsnmptrapd sever '%s'(%d), host '%s'(%d)\n", pszSever, lenSever, pszHost,lenHost);
+ DBGPRINTF("mmsnmptrapd: sever '%s'(%d), host '%s'(%d)\n", pszSever, lenSever, pszHost,lenHost);
if(pszHost[lenHost-1] == ':') {
pszHost[lenHost-1] = '\0';
--lenHost;
}
sevCode = lookupSeverityCode(pData, pszSever);
-dbgprintf("XXXX: severity for message is %d\n", sevCode);
/* now apply new settings */
MsgSetTAG(pMsg, pData->pszTagName, pData->lenTagID);
MsgSetHOSTNAME(pMsg, pszHost, lenHost);
diff --git a/plugins/omgssapi/omgssapi.c b/plugins/omgssapi/omgssapi.c
index 818a7cf..25400c7 100644
--- a/plugins/omgssapi/omgssapi.c
+++ b/plugins/omgssapi/omgssapi.c
@@ -4,7 +4,7 @@
* NOTE: read comments in module-template.h to understand how this file
* works!
*
- * Copyright 2007, 2008 Rainer Gerhards and Adiscon GmbH.
+ * Copyright 2007-2014 Rainer Gerhards and Adiscon GmbH.
*
* This file is part of rsyslog.
*
@@ -88,6 +88,10 @@ typedef struct _instanceData {
OM_uint32 gss_flags;
} instanceData;
+typedef struct wrkrInstanceData {
+ instanceData *pData;
+} wrkrInstanceData_t;
+
/* config data */
typedef enum gss_mode_e {
@@ -101,6 +105,7 @@ static struct configSettings_s {
gss_mode_t gss_mode;
} cs;
+static pthread_mutex_t mutDoAct = PTHREAD_MUTEX_INITIALIZER;
/* get the syslog forward port from selector_t. The passed in
* struct must be one that is setup for forwarding.
@@ -122,6 +127,11 @@ CODESTARTcreateInstance
ENDcreateInstance
+BEGINcreateWrkrInstance
+CODESTARTcreateWrkrInstance
+ENDcreateWrkrInstance
+
+
BEGINisCompatibleWithFeature
CODESTARTisCompatibleWithFeature
if(eFeat == sFEATURERepeatedMsgReduction)
@@ -163,6 +173,9 @@ CODESTARTfreeInstance
free(pData->f_hname);
ENDfreeInstance
+BEGINfreeWrkrInstance
+CODESTARTfreeWrkrInstance
+ENDfreeWrkrInstance
BEGINdbgPrintInstInfo
CODESTARTdbgPrintInstInfo
@@ -379,14 +392,19 @@ static rsRetVal doTryResume(instanceData *pData)
BEGINtryResume
CODESTARTtryResume
- iRet = doTryResume(pData);
+ pthread_mutex_lock(&mutDoAct);
+ iRet = doTryResume(pWrkrData->pData);
+ pthread_mutex_unlock(&mutDoAct);
ENDtryResume
BEGINdoAction
char *psz = NULL; /* temporary buffering */
register unsigned l;
int iMaxLine;
+ instanceData *pData;
CODESTARTdoAction
+ pthread_mutex_lock(&mutDoAct);
+ pData = pWrkrData->pData;
switch (pData->eDestState) {
case eDestFORW_SUSP:
dbgprintf("internal error in omgssapi.c, eDestFORW_SUSP in doAction()!\n");
@@ -465,6 +483,7 @@ finalize_it:
free(psz);
}
# endif
+ pthread_mutex_unlock(&mutDoAct);
ENDdoAction
@@ -656,6 +675,7 @@ ENDmodExit
BEGINqueryEtryPt
CODESTARTqueryEtryPt
CODEqueryEtryPt_STD_OMOD_QUERIES
+CODEqueryEtryPt_STD_OMOD8_QUERIES
ENDqueryEtryPt
diff --git a/plugins/omhdfs/omhdfs.c b/plugins/omhdfs/omhdfs.c
index f8a7e73..e173fb3 100644
--- a/plugins/omhdfs/omhdfs.c
+++ b/plugins/omhdfs/omhdfs.c
@@ -4,7 +4,7 @@
* NOTE: read comments in module-template.h to understand how this file
* works!
*
- * Copyright 2010 Rainer Gerhards and Adiscon GmbH.
+ * Copyright 2010-2014 Rainer Gerhards and Adiscon GmbH.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -36,7 +36,12 @@
#include <unistd.h>
#include <sys/file.h>
#include <pthread.h>
-#include <hdfs.h>
+#ifdef HAVE_HDFS_H
+# include <hdfs.h>
+#endif
+#ifdef HAVE_HADOOP_HDFS_H
+# include <hadoop/hdfs.h>
+#endif
#include "syslogd-types.h"
#include "srUtils.h"
@@ -51,7 +56,7 @@
MODULE_TYPE_OUTPUT
MODULE_TYPE_NOKEEP
-MODULE_CNFNAME("omhdfs")
+/* MODULE_CNFNAME("omhdfs") we need this only when we convert the module to v2 config system */
/* internal structures
*/
@@ -60,6 +65,7 @@ DEFobjCurrIf(errmsg)
/* global data */
static struct hashtable *files; /* holds all file objects that we know */
+static pthread_mutex_t mutDoAct = PTHREAD_MUTEX_INITIALIZER;
typedef struct configSettings_s {
uchar *fileName;
@@ -69,11 +75,6 @@ typedef struct configSettings_s {
} configSettings_t;
static configSettings_t cs;
-
-BEGINinitConfVars /* (re)set config variables to default values */
-CODESTARTinitConfVars
-ENDinitConfVars
-
typedef struct {
uchar *name;
hdfsFS fs;
@@ -91,6 +92,10 @@ typedef struct _instanceData {
unsigned offsBuf;
} instanceData;
+typedef struct wrkrInstanceData {
+ instanceData *pData;
+} wrkrInstanceData_t;
+
/* forward definitions (down here, need data types) */
static inline rsRetVal fileClose(file_t *pFile);
@@ -387,6 +392,11 @@ CODESTARTcreateInstance
ENDcreateInstance
+BEGINcreateWrkrInstance
+CODESTARTcreateWrkrInstance
+ENDcreateWrkrInstance
+
+
BEGINfreeInstance
CODESTARTfreeInstance
if(pData->pFile != NULL)
@@ -394,8 +404,15 @@ CODESTARTfreeInstance
ENDfreeInstance
+BEGINfreeWrkrInstance
+CODESTARTfreeWrkrInstance
+ENDfreeWrkrInstance
+
+
BEGINtryResume
+ instanceData *pData = pWrkrData->pData;
CODESTARTtryResume
+ pthread_mutex_lock(&mutDoAct);
fileClose(pData->pFile);
fileOpen(pData->pFile);
if(pData->pFile->fh == NULL){
@@ -403,6 +420,7 @@ CODESTARTtryResume
pData->pFile->name);
iRet = RS_RET_SUSPENDED;
}
+ pthread_mutex_unlock(&mutDoAct);
ENDtryResume
@@ -413,20 +431,26 @@ ENDbeginTransaction
BEGINdoAction
+ instanceData *pData = pWrkrData->pData;
CODESTARTdoAction
DBGPRINTF("omhdfs: action to to write to %s\n", pData->pFile->name);
+ pthread_mutex_lock(&mutDoAct);
iRet = addData(pData, ppString[0]);
-dbgprintf("omhdfs: done doAction\n");
+ DBGPRINTF("omhdfs: done doAction\n");
+ pthread_mutex_unlock(&mutDoAct);
ENDdoAction
BEGINendTransaction
+ instanceData *pData = pWrkrData->pData;
CODESTARTendTransaction
dbgprintf("omhdfs: endTransaction\n");
+ pthread_mutex_lock(&mutDoAct);
if(pData->offsBuf != 0) {
DBGPRINTF("omhdfs: data unwritten at end of transaction, persisting...\n");
iRet = fileWrite(pData->pFile, pData->ioBuf, &pData->offsBuf);
}
+ pthread_mutex_unlock(&mutDoAct);
ENDendTransaction
@@ -526,6 +550,7 @@ BEGINqueryEtryPt
CODESTARTqueryEtryPt
CODEqueryEtryPt_STD_OMOD_QUERIES
CODEqueryEtryPt_TXIF_OMOD_QUERIES /* we support the transactional interface! */
+CODEqueryEtryPt_STD_OMOD8_QUERIES
CODEqueryEtryPt_doHUP
ENDqueryEtryPt
diff --git a/plugins/ommysql/Makefile.am b/plugins/ommysql/Makefile.am
index e253b9d..f621a1b 100644
--- a/plugins/ommysql/Makefile.am
+++ b/plugins/ommysql/Makefile.am
@@ -1,6 +1,6 @@
pkglib_LTLIBRARIES = ommysql.la
-ommysql_la_SOURCES = ommysql.c ommysql.h
+ommysql_la_SOURCES = ommysql.c
ommysql_la_CPPFLAGS = $(RSRT_CFLAGS) $(MYSQL_CFLAGS) $(PTHREADS_CFLAGS)
ommysql_la_LDFLAGS = -module -avoid-version
ommysql_la_LIBADD = $(MYSQL_LIBS)
diff --git a/plugins/ommysql/Makefile.in b/plugins/ommysql/Makefile.in
index 794736a..86efbad 100644
--- a/plugins/ommysql/Makefile.in
+++ b/plugins/ommysql/Makefile.in
@@ -384,7 +384,7 @@ top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
pkglib_LTLIBRARIES = ommysql.la
-ommysql_la_SOURCES = ommysql.c ommysql.h
+ommysql_la_SOURCES = ommysql.c
ommysql_la_CPPFLAGS = $(RSRT_CFLAGS) $(MYSQL_CFLAGS) $(PTHREADS_CFLAGS)
ommysql_la_LDFLAGS = -module -avoid-version
ommysql_la_LIBADD = $(MYSQL_LIBS)
diff --git a/plugins/ommysql/ommysql.c b/plugins/ommysql/ommysql.c
index c004d1c..d63297d 100644
--- a/plugins/ommysql/ommysql.c
+++ b/plugins/ommysql/ommysql.c
@@ -38,7 +38,6 @@
#include "syslogd-types.h"
#include "srUtils.h"
#include "template.h"
-#include "ommysql.h"
#include "module-template.h"
#include "errmsg.h"
#include "cfsysline.h"
diff --git a/plugins/ommysql/ommysql.h b/plugins/ommysql/ommysql.h
deleted file mode 100644
index d807578..0000000
--- a/plugins/ommysql/ommysql.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* omusrmsg.c
- * These are the definitions for the build-in MySQL output module.
- *
- * File begun on 2007-07-13 by RGerhards (extracted from syslogd.c)
- *
- * Copyright 2007 Rainer Gerhards and Adiscon GmbH.
- *
- * This file is part of rsyslog.
- *
- * Rsyslog is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Rsyslog is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Rsyslog. If not, see <http://www.gnu.org/licenses/>.
- *
- * A copy of the GPL can be found in the file "COPYING" in this distribution.
- */
-#ifndef OMMYSQL_H_INCLUDED
-#define OMMYSQL_H_INCLUDED 1
-
-#endif /* #ifndef OMMYSQL_H_INCLUDED */
-/*
- * vi:set ai:
- */
diff --git a/plugins/omrabbitmq/omrabbitmq.c b/plugins/omrabbitmq/omrabbitmq.c
index 7ea7793..8ea7e62 100644
--- a/plugins/omrabbitmq/omrabbitmq.c
+++ b/plugins/omrabbitmq/omrabbitmq.c
@@ -3,6 +3,7 @@
* This output plugin enables rsyslog to send messages to the RabbitMQ.
*
* Copyright 2012-2013 Vaclav Tomec
+ * Copyright 2014 Rainer Gerhards
*
* This program is free software: you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
@@ -52,6 +53,7 @@ MODULE_CNFNAME("omrabbitmq")
DEF_OMOD_STATIC_DATA
DEFobjCurrIf(errmsg)
+static pthread_mutex_t mutDoAct = PTHREAD_MUTEX_INITIALIZER;
typedef struct _instanceData {
/* here you need to define all action-specific data. A record of type
@@ -72,6 +74,10 @@ typedef struct _instanceData {
uchar *tplName;
} instanceData;
+typedef struct wrkrInstanceData {
+ instanceData *pData;
+} wrkrInstanceData_t;
+
/* tables for interfacing with the v6 config system */
/* action (instance) parameters */
@@ -226,6 +232,11 @@ CODESTARTcreateInstance
ENDcreateInstance
+BEGINcreateWrkrInstance
+CODESTARTcreateWrkrInstance
+ENDcreateWrkrInstance
+
+
BEGINisCompatibleWithFeature
CODESTARTisCompatibleWithFeature
/* use this to specify if select features are supported by this
@@ -254,6 +265,10 @@ CODESTARTfreeInstance
ENDfreeInstance
+BEGINfreeWrkrInstance
+CODESTARTfreeWrkrInstance
+ENDfreeWrkrInstance
+
BEGINdbgPrintInstInfo
CODESTARTdbgPrintInstInfo
/* permits to spit out some debug info */
@@ -270,6 +285,7 @@ ENDdbgPrintInstInfo
BEGINtryResume
+ instanceData *pData = pWrkrData->pData;
CODESTARTtryResume
/* this is called when an action has been suspended and the
* rsyslog core tries to resume it. The action must then
@@ -293,14 +309,17 @@ CODESTARTtryResume
* not always be the case.
*/
+ pthread_mutex_lock(&mutDoAct);
if (pData->conn == NULL) {
iRet = initRabbitMQ(pData);
}
+ pthread_mutex_unlock(&mutDoAct);
ENDtryResume
BEGINdoAction
+ instanceData *pData = pWrkrData->pData;
CODESTARTdoAction
/* this is where you receive the message and need to carry out the
* action. Data is provided in ppString[i] where 0 <= i <= num of strings
@@ -315,6 +334,7 @@ CODESTARTdoAction
amqp_bytes_t body_bytes;
+ pthread_mutex_lock(&mutDoAct);
if (pData->conn == NULL) {
CHKiRet(initRabbitMQ(pData));
}
@@ -330,7 +350,7 @@ CODESTARTdoAction
}
finalize_it:
-
+ pthread_mutex_unlock(&mutDoAct);
ENDdoAction
@@ -455,6 +475,7 @@ BEGINqueryEtryPt
CODESTARTqueryEtryPt
CODEqueryEtryPt_STD_OMOD_QUERIES
CODEqueryEtryPt_STD_CONF2_OMOD_QUERIES
+ CODEqueryEtryPt_STD_OMOD8_QUERIES
ENDqueryEtryPt
diff --git a/plugins/omstdout/omstdout.c b/plugins/omstdout/omstdout.c
index 210b016..5e63ed7 100644
--- a/plugins/omstdout/omstdout.c
+++ b/plugins/omstdout/omstdout.c
@@ -156,7 +156,7 @@ CODESTARTdoAction
* needs to be more solid. -- rgerhards, 2012-11-28
*/
if((r = write(1, toWrite, len)) != (int) len) { /* 1 is stdout! */
- DBGPRINTF("omstdout: error %d writing to stdout[%d]: %s\n",
+ DBGPRINTF("omstdout: error %d writing to stdout[%zd]: %s\n",
r, len, toWrite);
}
if(pWrkrData->pData->bEnsureLFEnding && toWrite[len-1] != '\n') {
diff --git a/plugins/omzmq3/omzmq3.c b/plugins/omzmq3/omzmq3.c
index c8552f1..4eb4a37 100644
--- a/plugins/omzmq3/omzmq3.c
+++ b/plugins/omzmq3/omzmq3.c
@@ -2,26 +2,25 @@
* Copyright 2012 Talksum, Inc
* Using the czmq interface to zeromq, we output
* to a zmq socket.
-
-
-*
-* This program is free software: you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public License
-* as published by the Free Software Foundation, either version 3 of
-* the License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful, but
-* WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this program. If not, see
-* <http://www.gnu.org/licenses/>.
-*
-* Author: David Kelly
-* <davidk@talksum.com>
-*/
+ * Copyright (C) 2014 Rainer Gerhards
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Author: David Kelly
+ * <davidk@talksum.com>
+ */
#include "config.h"
@@ -51,6 +50,8 @@ MODULE_CNFNAME("omzmq3")
DEF_OMOD_STATIC_DATA
DEFobjCurrIf(errmsg)
+static pthread_mutex_t mutDoAct = PTHREAD_MUTEX_INITIALIZER;
+
/* convienent symbols to denote a socket we want to bind
vs one we want to just connect to
*/
@@ -97,6 +98,10 @@ typedef struct _instanceData {
uchar* tplName;
} instanceData;
+typedef struct wrkrInstanceData {
+ instanceData *pData;
+} wrkrInstanceData_t;
+
/* ----------------------------------------------------------------------------
* Static definitions/initializations
@@ -309,6 +314,11 @@ BEGINcreateInstance
CODESTARTcreateInstance
ENDcreateInstance
+
+BEGINcreateWrkrInstance
+CODESTARTcreateWrkrInstance
+ENDcreateWrkrInstance
+
BEGINisCompatibleWithFeature
CODESTARTisCompatibleWithFeature
if(eFeat == sFEATURERepeatedMsgReduction)
@@ -328,15 +338,26 @@ CODESTARTfreeInstance
free(pData->identity);
ENDfreeInstance
+
+BEGINfreeWrkrInstance
+CODESTARTfreeWrkrInstance
+ENDfreeWrkrInstance
+
+
BEGINtryResume
CODESTARTtryResume
- if(NULL == pData->socket)
- iRet = initZMQ(pData);
+ pthread_mutex_lock(&mutDoAct);
+ if(NULL == pWrkrData->pData->socket)
+ iRet = initZMQ(pWrkrData->pData);
+ pthread_mutex_unlock(&mutDoAct);
ENDtryResume
BEGINdoAction
+ instanceData *pData = pWrkrData->pData;
CODESTARTdoAction
-iRet = writeZMQ(ppString[0], pData);
+ pthread_mutex_lock(&mutDoAct);
+ iRet = writeZMQ(ppString[0], pData);
+ pthread_mutex_unlock(&mutDoAct);
ENDdoAction
@@ -348,10 +369,10 @@ CODESTARTnewActInst
ABORT_FINALIZE(RS_RET_MISSING_CNFPARAMS);
}
-CHKiRet(createInstance(&pData));
-setInstParamDefaults(pData);
+ CHKiRet(createInstance(&pData));
+ setInstParamDefaults(pData);
-CODE_STD_STRING_REQUESTnewActInst(1)
+ CODE_STD_STRING_REQUESTnewActInst(1)
for (i = 0; i < actpblk.nParams; ++i) {
if (!pvals[i].bUsed)
continue;
@@ -423,26 +444,25 @@ CODE_STD_STRING_REQUESTnewActInst(1)
ABORT_FINALIZE(RS_RET_CONFIG_ERROR);
}
-CODE_STD_FINALIZERnewActInst
+ CODE_STD_FINALIZERnewActInst
cnfparamvalsDestruct(pvals, &actpblk);
ENDnewActInst
BEGINparseSelectorAct
CODESTARTparseSelectorAct
-
-/* tell the engine we only want one template string */
-CODE_STD_STRING_REQUESTparseSelectorAct(1)
+ /* tell the engine we only want one template string */
+ CODE_STD_STRING_REQUESTparseSelectorAct(1)
if(!strncmp((char*) p, ":omzmq3:", sizeof(":omzmq3:") - 1))
errmsg.LogError(0, RS_RET_LEGA_ACT_NOT_SUPPORTED,
"omzmq3 supports only v6 config format, use: "
"action(type=\"omzmq3\" serverport=...)");
ABORT_FINALIZE(RS_RET_CONFLINE_UNPROCESSED);
-CODE_STD_FINALIZERparseSelectorAct
+ CODE_STD_FINALIZERparseSelectorAct
ENDparseSelectorAct
BEGINinitConfVars /* (re)set config variables to defaults */
CODESTARTinitConfVars
-s_workerThreads = -1;
+ s_workerThreads = -1;
ENDinitConfVars
BEGINmodExit
@@ -456,8 +476,9 @@ ENDmodExit
BEGINqueryEtryPt
CODESTARTqueryEtryPt
-CODEqueryEtryPt_STD_OMOD_QUERIES
-CODEqueryEtryPt_STD_CONF2_OMOD_QUERIES
+ CODEqueryEtryPt_STD_OMOD_QUERIES
+ CODEqueryEtryPt_STD_CONF2_OMOD_QUERIES
+ CODEqueryEtryPt_STD_OMOD8_QUERIES
ENDqueryEtryPt
BEGINmodInit()
@@ -468,9 +489,6 @@ CODEmodInit_QueryRegCFSLineHdlr
INITChkCoreFeature(bCoreSupportsBatching, CORE_FEATURE_BATCHING);
DBGPRINTF("omzmq3: module compiled with rsyslog version %s.\n", VERSION);
-INITLegCnfVars
-CHKiRet(omsdRegCFSLineHdlr((uchar *)"omzmq3workerthreads", 0, eCmdHdlrInt, NULL, &s_workerThreads, STD_LOADABLE_MODULE_ID));
+ INITLegCnfVars
+ CHKiRet(omsdRegCFSLineHdlr((uchar *)"omzmq3workerthreads", 0, eCmdHdlrInt, NULL, &s_workerThreads, STD_LOADABLE_MODULE_ID));
ENDmodInit
-
-
-
diff --git a/runtime/libgcry.c b/runtime/libgcry.c
index 4772cf4..9dabf5f 100644
--- a/runtime/libgcry.c
+++ b/runtime/libgcry.c
@@ -154,7 +154,7 @@ eiCheckFiletype(gcryfile gf)
close(gf->fd);
gf->fd = -1;
}
- DBGPRINTF("eiCheckFiletype read %d bytes: '%s'\n", didRead, hdrBuf);
+ DBGPRINTF("eiCheckFiletype read %zd bytes: '%s'\n", didRead, hdrBuf);
if( didRead != toRead
|| strncmp(hdrBuf, "FILETYPE:" RSGCRY_FILETYPE_NAME "\n", toRead))
iRet = RS_RET_EI_INVLD_FILE;
@@ -213,7 +213,7 @@ eiGetIV(gcryfile gf, uchar *iv, size_t leniv)
}
valueLen = strlen(value);
if(valueLen/2 != leniv) {
- DBGPRINTF("length of IV is %d, expected %d\n",
+ DBGPRINTF("length of IV is %zd, expected %zd\n",
valueLen/2, leniv);
ABORT_FINALIZE(RS_RET_ERR);
}
@@ -322,7 +322,7 @@ eiClose(gcryfile gf, off64_t offsLogfile)
return;
if(gf->openMode == 'w') {
/* 2^64 is 20 digits, so the snprintf buffer is large enough */
- len = snprintf(offs, sizeof(offs), "%lld", offsLogfile);
+ len = snprintf(offs, sizeof(offs), "%lld", (long long) offsLogfile);
eiWriteRec(gf, "END:", 4, offs, len);
}
gcry_cipher_close(gf->chd);
@@ -429,7 +429,7 @@ addPadding(gcryfile pF, uchar *buf, size_t *plen)
unsigned i;
size_t nPad;
nPad = (pF->blkLength - *plen % pF->blkLength) % pF->blkLength;
- DBGPRINTF("libgcry: addPadding %d chars, blkLength %d, mod %d, pad %d\n",
+ DBGPRINTF("libgcry: addPadding %zd chars, blkLength %zd, mod %zd, pad %zd\n",
*plen, pF->blkLength, *plen % pF->blkLength, nPad);
for(i = 0 ; i < nPad ; ++i)
buf[(*plen)+i] = 0x00;
diff --git a/runtime/module-template.h b/runtime/module-template.h
index 19b0ca3..95c35b4 100644
--- a/runtime/module-template.h
+++ b/runtime/module-template.h
@@ -4,25 +4,23 @@
*
* File begun on 2007-07-25 by RGerhards
*
- * Copyright 2007-2012 Adiscon GmbH. This is Adiscon-exclusive code without any other
- * contributions. *** GPLv3 ***
+ * Copyright 2007-2012 Adiscon GmbH.
*
* This file is part of the rsyslog runtime library.
*
- * Rsyslog is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Rsyslog is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Rsyslog. If not, see <http://www.gnu.org/licenses/>.
- *
- * A copy of the GPL can be found in the file "COPYING" in this distribution.
+ * 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.
*/
#ifndef MODULE_TEMPLATE_H_INCLUDED
#define MODULE_TEMPLATE_H_INCLUDED 1
diff --git a/runtime/net.c b/runtime/net.c
index 7c180b1..4d272f1 100644
--- a/runtime/net.c
+++ b/runtime/net.c
@@ -1318,14 +1318,14 @@ int *create_udp_socket(uchar *hostname, uchar *pszPort, int bIsServer, int rcvbu
if(Debug || rcvbuf != 0) {
optlen = sizeof(actrcvbuf);
if(getsockopt(*s, SOL_SOCKET, SO_RCVBUF, &actrcvbuf, &optlen) == 0) {
- dbgprintf("socket %d, actual rcvbuf size %d\n", *s, actrcvbuf);
+ dbgprintf("socket %d, actual os socket rcvbuf size %d\n", *s, actrcvbuf);
if(rcvbuf != 0 && actrcvbuf/2 != rcvbuf) {
errmsg.LogError(errno, NO_ERRCODE,
- "cannot set rcvbuf size %d for socket %d, value now is %d",
+ "cannot set os socket rcvbuf size %d for socket %d, value now is %d",
rcvbuf, *s, actrcvbuf/2);
}
} else {
- dbgprintf("could not obtain rcvbuf size for socket %d: %s\n",
+ dbgprintf("could not obtain os socket rcvbuf size for socket %d: %s\n",
*s, rs_strerror_r(errno, errStr, sizeof(errStr)));
}
}
diff --git a/runtime/nspoll.c b/runtime/nspoll.c
index 43631f4..94fba03 100644
--- a/runtime/nspoll.c
+++ b/runtime/nspoll.c
@@ -6,25 +6,21 @@
*
* Work on this module begun 2009-11-18 by Rainer Gerhards.
*
- * Copyright 2009 Rainer Gerhards and Adiscon GmbH.
+ * Copyright 2009-2014 Rainer Gerhards and Adiscon GmbH.
*
- * This file is part of the rsyslog runtime library.
- *
- * The rsyslog runtime library is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The rsyslog runtime library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with the rsyslog runtime library. If not, see <http://www.gnu.org/licenses/>.
- *
- * A copy of the GPL can be found in the file "COPYING" in this distribution.
- * A copy of the LGPL can be found in the file "COPYING.LESSER" in this distribution.
+ * 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"
@@ -66,6 +62,7 @@ loadDrvr(nspoll_t *pThis)
uchar szDrvrName[48]; /* 48 shall be large enough */
pBaseDrvrName = pThis->pBaseDrvrName;
+ if(pBaseDrvrName == NULL) /* if no drvr name is set, use system default */
pBaseDrvrName = glbl.GetDfltNetstrmDrvr();
if(snprintf((char*)szDrvrName, sizeof(szDrvrName), "lmnsdpoll_%s", pBaseDrvrName) == sizeof(szDrvrName))
ABORT_FINALIZE(RS_RET_DRVRNAME_TOO_LONG);
@@ -105,6 +102,7 @@ CODESTARTobjDestruct(nspoll)
* a driver name string as load indicator (because we also need that string
* to release the driver
*/
+ free(pThis->pBaseDrvrName);
if(pThis->pDrvrName != NULL) {
obj.ReleaseObj(__FILE__, pThis->pDrvrName+2, DONT_LOAD_LIB, (void*) &pThis->Drvr);
free(pThis->pDrvrName);
diff --git a/runtime/nspoll.h b/runtime/nspoll.h
index 3a6e060..a9e9eb0 100644
--- a/runtime/nspoll.h
+++ b/runtime/nspoll.h
@@ -4,21 +4,19 @@
*
* This file is part of the rsyslog runtime library.
*
- * The rsyslog runtime library is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The rsyslog runtime library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with the rsyslog runtime library. If not, see <http://www.gnu.org/licenses/>.
- *
- * A copy of the GPL can be found in the file "COPYING" in this distribution.
- * A copy of the LGPL can be found in the file "COPYING.LESSER" in this distribution.
+ * 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.
*/
#ifndef INCLUDED_NSPOLL_H
diff --git a/runtime/nssel.c b/runtime/nssel.c
index 6ca0f26..533d92b 100644
--- a/runtime/nssel.c
+++ b/runtime/nssel.c
@@ -9,7 +9,7 @@
*
* Work on this module begun 2008-04-22 by Rainer Gerhards.
*
- * Copyright 2008-2012 Adiscon GmbH.
+ * Copyright 2008-2014 Adiscon GmbH.
*
* This file is part of the rsyslog runtime library.
*
@@ -107,6 +107,7 @@ CODESTARTobjDestruct(nssel)
* a driver name string as load indicator (because we also need that string
* to release the driver
*/
+ free(pThis->pBaseDrvrName);
if(pThis->pDrvrName != NULL) {
obj.ReleaseObj(__FILE__, pThis->pDrvrName+2, DONT_LOAD_LIB, (void*) &pThis->Drvr);
free(pThis->pDrvrName);
diff --git a/runtime/queue.c b/runtime/queue.c
index 4664010..e1d46d5 100644
--- a/runtime/queue.c
+++ b/runtime/queue.c
@@ -1479,7 +1479,7 @@ DoDeleteBatchFromQStore(qqueue_t *pThis, int nElem)
if(bytesDel != 0) {
pThis->tVars.disk.sizeOnDisk -= bytesDel;
DBGOPRINT((obj_t*) pThis, "doDeleteBatch: a %lld octet file has been deleted, now %lld octets disk "
- "space used\n", bytesDel, pThis->tVars.disk.sizeOnDisk);
+ "space used\n", (long long) bytesDel, pThis->tVars.disk.sizeOnDisk);
/* awake possibly waiting enq process */
pthread_cond_signal(&pThis->notFull); /* we hold the mutex while we are in here! */
}
diff --git a/runtime/ratelimit.c b/runtime/ratelimit.c
index 016fd3c..22e9375 100644
--- a/runtime/ratelimit.c
+++ b/runtime/ratelimit.c
@@ -301,6 +301,8 @@ ratelimitNew(ratelimit_t **ppThis, char *modname, char *dynname)
}
/* pThis->severity == 0 - all messages are ratelimited */
pThis->bReduceRepeatMsgs = loadConf->globals.bReduceRepeatMsgs;
+ DBGPRINTF("ratelimit:%s:new ratelimiter:bReduceRepeatMsgs %d\n",
+ pThis->name, pThis->bReduceRepeatMsgs);
*ppThis = pThis;
finalize_it:
RETiRet;
diff --git a/runtime/stream.c b/runtime/stream.c
index 223ee93..1bf1c47 100644
--- a/runtime/stream.c
+++ b/runtime/stream.c
@@ -301,9 +301,11 @@ CheckFileChange(strm_t *pThis)
if(stat((char*) pThis->pszCurrFName, &statName) == -1)
ABORT_FINALIZE(RS_RET_IO_ERROR);
DBGPRINTF("stream/after deserialize checking for file change on '%s', "
- "inode %u/%u, size/currOffs %llu/%llu\n",
- pThis->pszCurrFName, (unsigned) pThis->inode,
- (unsigned) statName.st_ino, statName.st_size, pThis->iCurrOffs);
+ "inode %u/%u, size/currOffs %llu/%llu\n",
+ pThis->pszCurrFName, (unsigned) pThis->inode,
+ (unsigned) statName.st_ino,
+ (long long unsigned) statName.st_size,
+ (long long unsigned) pThis->iCurrOffs);
if(pThis->inode != statName.st_ino || statName.st_size < pThis->iCurrOffs) {
DBGPRINTF("stream: file %s has changed\n", pThis->pszCurrFName);
pThis->iCurrOffs = 0;
@@ -1460,7 +1462,7 @@ static rsRetVal strmSeek(strm_t *pThis, off64_t offs)
DBGOPRINT((obj_t*) pThis, "file %d seek, pos %llu\n", pThis->fd, (long long unsigned) offs);
i = lseek64(pThis->fd, offs, SEEK_SET);
if(i != offs) {
- DBGPRINTF("strmSeek: error %lld seeking to offset %lld\n", i, offs);
+ DBGPRINTF("strmSeek: error %lld seeking to offset %lld\n", i, (long long) offs);
ABORT_FINALIZE(RS_RET_IO_ERROR);
}
pThis->iCurrOffs = offs; /* we are now at *this* offset */
diff --git a/tcps_sess.c b/tcps_sess.c
index 1adf585..4d18b01 100644
--- a/tcps_sess.c
+++ b/tcps_sess.c
@@ -59,8 +59,6 @@ DEFobjCurrIf(netstrm)
DEFobjCurrIf(prop)
DEFobjCurrIf(datetime)
-static int iMaxLine; /* maximum size of a single message */
-
/* forward definitions */
static rsRetVal Close(tcps_sess_t *pThis);
@@ -72,7 +70,7 @@ BEGINobjConstruct(tcps_sess) /* be sure to specify the object type also in END m
pThis->bAtStrtOfFram = 1; /* indicate frame header expected */
pThis->eFraming = TCP_FRAMING_OCTET_STUFFING; /* just make sure... */
/* now allocate the message reception buffer */
- CHKmalloc(pThis->pMsg = (uchar*) MALLOC(sizeof(uchar) * iMaxLine + 1));
+ CHKmalloc(pThis->pMsg = (uchar*) MALLOC(sizeof(uchar) * glbl.GetMaxLine() + 1));
finalize_it:
ENDobjConstruct(tcps_sess)
@@ -358,6 +356,7 @@ processDataRcvd(tcps_sess_t *pThis, char c, struct syslogTime *stTime, time_t tt
{
DEFiRet;
ISOBJ_TYPE_assert(pThis, tcps_sess);
+ int iMaxLine = glbl.GetMaxLine();
if(pThis->inputState == eAtStrtFram) {
if(pThis->bSuppOctetFram && c >= '0' && c <= '9') {
@@ -547,7 +546,6 @@ BEGINObjClassInit(tcps_sess, 1, OBJ_IS_CORE_MODULE) /* class, version - CHANGE c
CHKiRet(objUse(prop, CORE_COMPONENT));
CHKiRet(objUse(glbl, CORE_COMPONENT));
- iMaxLine = glbl.GetMaxLine(); /* get maximum size we currently support */
objRelease(glbl, CORE_COMPONENT);
/* set our own handlers */
diff --git a/tests/killrsyslog.sh b/tests/killrsyslog.sh
index aac2490..9edf773 100755
--- a/tests/killrsyslog.sh
+++ b/tests/killrsyslog.sh
@@ -4,10 +4,12 @@ then
echo rsyslog.pid exists, trying to shut down rsyslogd process `cat rsyslog.pid`.
kill -9 `cat rsyslog.pid`
sleep 1
+ rm rsyslog.pid
fi
if [ -e "rsyslog2.pid" ]
then
echo rsyslog2.pid exists, trying to shut down rsyslogd process `cat rsyslog2.pid`.
kill -9 `cat rsyslog2.pid`
sleep 1
+ rm rsyslog2.pid
fi
diff --git a/tests/omod-if-array.sh b/tests/omod-if-array.sh
index 4e916f1..3e0409e 100755
--- a/tests/omod-if-array.sh
+++ b/tests/omod-if-array.sh
@@ -1,4 +1,8 @@
echo \[omod-if-array.sh\]: test omod-if-array via udp
+echo NOTE: the interface checked with this test is currently NOT
+echo supported. We may support it again in the future. So for now\,
+echo we just skip this test and do not remove it.
+exit 77
$srcdir/killrsyslog.sh # kill rsyslogd if it runs for some reason
./nettester -tomod-if-array -iudp -p4711
diff --git a/tests/validation-run.sh b/tests/validation-run.sh
index a68ee8a..2250e12 100755
--- a/tests/validation-run.sh
+++ b/tests/validation-run.sh
@@ -23,19 +23,19 @@
#set -x
echo \[validation-run.sh\]: testing configuraton validation
echo "testing a failed configuration verification run"
-../tools/rsyslogd -dn -u2 -c4 -N1 -f$srcdir/testsuites/invalid.conf -M../runtime/.libs:../.libs
+../tools/rsyslogd -u2 -N1 -f$srcdir/testsuites/invalid.conf -M../runtime/.libs:../.libs
if [ $? -ne 1 ]; then
echo "after test 1: return code ne 1"
exit 1
fi
echo testing a valid config verification run
-../tools/rsyslogd -u2 -c4 -N1 -f$srcdir/testsuites/valid.conf -M../runtime/.libs:../.libs
+../tools/rsyslogd -u2 -N1 -f$srcdir/testsuites/valid.conf -M../runtime/.libs:../.libs
if [ $? -ne 0 ]; then
echo "after test 2: return code ne 0"
exit 1
fi
echo testing empty config file
-../tools/rsyslogd -u2 -c4 -N1 -f/dev/null -M../runtime/.libs:../.libs
+../tools/rsyslogd -u2 -N1 -f/dev/null -M../runtime/.libs:../.libs
if [ $? -ne 1 ]; then
echo "after test 3: return code ne 1"
exit 1
diff --git a/tools/Makefile.am b/tools/Makefile.am
index 8f30a2c..253cd5f 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -7,6 +7,7 @@ man_MANS = rsyslogd.8 rsyslog.conf.5
sbin_PROGRAMS += rsyslogd
rsyslogd_SOURCES = \
syslogd.c \
+ rsyslogd.c \
syslogd.h \
omshell.c \
omshell.h \
diff --git a/tools/Makefile.in b/tools/Makefile.in
index a2693d8..54bb6ba 100644
--- a/tools/Makefile.in
+++ b/tools/Makefile.in
@@ -142,13 +142,14 @@ am__rsyslog_diag_hostname_SOURCES_DIST = gethostn.c
rsyslog_diag_hostname_OBJECTS = $(am_rsyslog_diag_hostname_OBJECTS)
rsyslog_diag_hostname_LDADD = $(LDADD)
am_rsyslogd_OBJECTS = rsyslogd-syslogd.$(OBJEXT) \
- rsyslogd-omshell.$(OBJEXT) rsyslogd-omusrmsg.$(OBJEXT) \
- rsyslogd-omfwd.$(OBJEXT) rsyslogd-omfile.$(OBJEXT) \
- rsyslogd-ompipe.$(OBJEXT) rsyslogd-omdiscard.$(OBJEXT) \
- rsyslogd-pmrfc5424.$(OBJEXT) rsyslogd-pmrfc3164.$(OBJEXT) \
- rsyslogd-smtradfile.$(OBJEXT) rsyslogd-smfile.$(OBJEXT) \
- rsyslogd-smfwd.$(OBJEXT) rsyslogd-smtradfwd.$(OBJEXT) \
- rsyslogd-iminternal.$(OBJEXT) rsyslogd-pidfile.$(OBJEXT)
+ rsyslogd-rsyslogd.$(OBJEXT) rsyslogd-omshell.$(OBJEXT) \
+ rsyslogd-omusrmsg.$(OBJEXT) rsyslogd-omfwd.$(OBJEXT) \
+ rsyslogd-omfile.$(OBJEXT) rsyslogd-ompipe.$(OBJEXT) \
+ rsyslogd-omdiscard.$(OBJEXT) rsyslogd-pmrfc5424.$(OBJEXT) \
+ rsyslogd-pmrfc3164.$(OBJEXT) rsyslogd-smtradfile.$(OBJEXT) \
+ rsyslogd-smfile.$(OBJEXT) rsyslogd-smfwd.$(OBJEXT) \
+ rsyslogd-smtradfwd.$(OBJEXT) rsyslogd-iminternal.$(OBJEXT) \
+ rsyslogd-pidfile.$(OBJEXT)
rsyslogd_OBJECTS = $(am_rsyslogd_OBJECTS)
rsyslogd_DEPENDENCIES = ../grammar/libgrammar.la \
../runtime/librsyslog.la $(am__DEPENDENCIES_1) \
@@ -454,6 +455,7 @@ man1_MANS = $(am__append_4) $(am__append_8)
man_MANS = rsyslogd.8 rsyslog.conf.5
rsyslogd_SOURCES = \
syslogd.c \
+ rsyslogd.c \
syslogd.h \
omshell.c \
omshell.h \
@@ -689,6 +691,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rsyslogd-pidfile.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rsyslogd-pmrfc3164.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rsyslogd-pmrfc5424.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rsyslogd-rsyslogd.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rsyslogd-smfile.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rsyslogd-smfwd.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rsyslogd-smtradfile.Po@am__quote@
@@ -776,6 +779,20 @@ rsyslogd-syslogd.obj: syslogd.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(rsyslogd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rsyslogd-syslogd.obj `if test -f 'syslogd.c'; then $(CYGPATH_W) 'syslogd.c'; else $(CYGPATH_W) '$(srcdir)/syslogd.c'; fi`
+rsyslogd-rsyslogd.o: rsyslogd.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(rsyslogd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rsyslogd-rsyslogd.o -MD -MP -MF $(DEPDIR)/rsyslogd-rsyslogd.Tpo -c -o rsyslogd-rsyslogd.o `test -f 'rsyslogd.c' || echo '$(srcdir)/'`rsyslogd.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rsyslogd-rsyslogd.Tpo $(DEPDIR)/rsyslogd-rsyslogd.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rsyslogd.c' object='rsyslogd-rsyslogd.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(rsyslogd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rsyslogd-rsyslogd.o `test -f 'rsyslogd.c' || echo '$(srcdir)/'`rsyslogd.c
+
+rsyslogd-rsyslogd.obj: rsyslogd.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(rsyslogd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rsyslogd-rsyslogd.obj -MD -MP -MF $(DEPDIR)/rsyslogd-rsyslogd.Tpo -c -o rsyslogd-rsyslogd.obj `if test -f 'rsyslogd.c'; then $(CYGPATH_W) 'rsyslogd.c'; else $(CYGPATH_W) '$(srcdir)/rsyslogd.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rsyslogd-rsyslogd.Tpo $(DEPDIR)/rsyslogd-rsyslogd.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rsyslogd.c' object='rsyslogd-rsyslogd.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(rsyslogd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rsyslogd-rsyslogd.obj `if test -f 'rsyslogd.c'; then $(CYGPATH_W) 'rsyslogd.c'; else $(CYGPATH_W) '$(srcdir)/rsyslogd.c'; fi`
+
rsyslogd-omshell.o: omshell.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(rsyslogd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rsyslogd-omshell.o -MD -MP -MF $(DEPDIR)/rsyslogd-omshell.Tpo -c -o rsyslogd-omshell.o `test -f 'omshell.c' || echo '$(srcdir)/'`omshell.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rsyslogd-omshell.Tpo $(DEPDIR)/rsyslogd-omshell.Po
diff --git a/tools/gethostn.c b/tools/gethostn.c
index df7ce38..be7f678 100644
--- a/tools/gethostn.c
+++ b/tools/gethostn.c
@@ -8,20 +8,19 @@
*
* This file is part of rsyslog.
*
- * Rsyslog is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Rsyslog is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Rsyslog. If not, see <http://www.gnu.org/licenses/>.
- *
- * A copy of the GPL can be found in the file "COPYING" in this distribution.
+ * 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"
diff --git a/tools/iminternal.c b/tools/iminternal.c
index 167e2b2..ebfd8f5 100644
--- a/tools/iminternal.c
+++ b/tools/iminternal.c
@@ -10,20 +10,19 @@
*
* This file is part of rsyslog.
*
- * Rsyslog is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Rsyslog is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Rsyslog. If not, see <http://www.gnu.org/licenses/>.
- *
- * A copy of the GPL can be found in the file "COPYING" in this distribution.
+ * 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"
diff --git a/tools/iminternal.h b/tools/iminternal.h
index 8a9e250..fac48df 100644
--- a/tools/iminternal.h
+++ b/tools/iminternal.h
@@ -8,20 +8,19 @@
*
* This file is part of rsyslog.
*
- * Rsyslog is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Rsyslog is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Rsyslog. If not, see <http://www.gnu.org/licenses/>.
- *
- * A copy of the GPL can be found in the file "COPYING" in this distribution.
+ * 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.
*/
#ifndef IMINTERNAL_H_INCLUDED
diff --git a/tools/logctl.c b/tools/logctl.c
index 1ab8ead..b583c68 100644
--- a/tools/logctl.c
+++ b/tools/logctl.c
@@ -26,20 +26,19 @@
*
* This file is part of rsyslog.
*
- * Rsyslog is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Rsyslog is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Rsyslog. If not, see <http://www.gnu.org/licenses/>.
- *
- * A copy of the GPL can be found in the file "COPYING" in this distribution.
+ * 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 <stdio.h>
diff --git a/tools/pmrfc3164.c b/tools/pmrfc3164.c
index 2596470..9bae2b3 100644
--- a/tools/pmrfc3164.c
+++ b/tools/pmrfc3164.c
@@ -6,24 +6,23 @@
*
* File begun on 2009-11-04 by RGerhards
*
- * Copyright 2007, 2009 Rainer Gerhards and Adiscon GmbH.
+ * Copyright 2007-2014 Rainer Gerhards and Adiscon GmbH.
*
* This file is part of rsyslog.
*
- * Rsyslog is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Rsyslog is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Rsyslog. If not, see <http://www.gnu.org/licenses/>.
- *
- * A copy of the GPL can be found in the file "COPYING" in this distribution.
+ * 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"
diff --git a/tools/pmrfc3164.h b/tools/pmrfc3164.h
index 2430409..81987a4 100644
--- a/tools/pmrfc3164.h
+++ b/tools/pmrfc3164.h
@@ -7,20 +7,19 @@
*
* This file is part of rsyslog.
*
- * Rsyslog is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Rsyslog is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Rsyslog. If not, see <http://www.gnu.org/licenses/>.
- *
- * A copy of the GPL can be found in the file "COPYING" in this distribution.
+ * 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.
*/
#ifndef PMRFC3164_H_INCLUDED
#define PMRFC3164_H_INCLUDED 1
diff --git a/tools/pmrfc5424.c b/tools/pmrfc5424.c
index 8e9510f..18dc846 100644
--- a/tools/pmrfc5424.c
+++ b/tools/pmrfc5424.c
@@ -6,24 +6,23 @@
*
* File begun on 2009-11-03 by RGerhards
*
- * Copyright 2007, 2009 Rainer Gerhards and Adiscon GmbH.
+ * Copyright 2007-2014 Rainer Gerhards and Adiscon GmbH.
*
* This file is part of rsyslog.
*
- * Rsyslog is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Rsyslog is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Rsyslog. If not, see <http://www.gnu.org/licenses/>.
- *
- * A copy of the GPL can be found in the file "COPYING" in this distribution.
+ * 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"
diff --git a/tools/pmrfc5424.h b/tools/pmrfc5424.h
index df2a1c8..036fd30 100644
--- a/tools/pmrfc5424.h
+++ b/tools/pmrfc5424.h
@@ -3,24 +3,23 @@
*
* File begun on 2009-11-03 by RGerhards
*
- * Copyright 2009 Rainer Gerhards and Adiscon GmbH.
+ * Copyright 2009-2014 Rainer Gerhards and Adiscon GmbH.
*
* This file is part of rsyslog.
*
- * Rsyslog is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Rsyslog is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Rsyslog. If not, see <http://www.gnu.org/licenses/>.
- *
- * A copy of the GPL can be found in the file "COPYING" in this distribution.
+ * 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.
*/
#ifndef PMRFC54254_H_INCLUDED
#define PMRFC54254_H_INCLUDED 1
diff --git a/tools/rsyslogd.c b/tools/rsyslogd.c
new file mode 100644
index 0000000..3b12b09
--- /dev/null
+++ b/tools/rsyslogd.c
@@ -0,0 +1,1328 @@
+/* This is the main rsyslogd file.
+ * It contains code * that is known to be validly under ASL 2.0,
+ * because it was either written from scratch by me (rgerhards) or
+ * contributors who agreed to ASL 2.0.
+ *
+ * Copyright 2004-2014 Rainer Gerhards and Adiscon
+ *
+ * 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 <signal.h>
+#include <liblogging/stdlog.h>
+#ifdef OS_SOLARIS
+# include <errno.h>
+#else
+# include <sys/errno.h>
+#endif
+#include "sd-daemon.h"
+
+#include "wti.h"
+#include "ratelimit.h"
+#include "parser.h"
+#include "linkedlist.h"
+#include "ruleset.h"
+#include "action.h"
+#include "iminternal.h"
+#include "errmsg.h"
+#include "threads.h"
+#include "dnscache.h"
+#include "prop.h"
+#include "unicode-helper.h"
+#include "net.h"
+#include "errmsg.h"
+#include "glbl.h"
+#include "debug.h"
+#include "srUtils.h"
+#include "rsconf.h"
+#include "cfsysline.h"
+#include "datetime.h"
+#include "dirty.h"
+
+DEFobjCurrIf(obj)
+DEFobjCurrIf(prop)
+DEFobjCurrIf(parser)
+DEFobjCurrIf(ruleset)
+DEFobjCurrIf(net)
+DEFobjCurrIf(errmsg)
+DEFobjCurrIf(rsconf)
+DEFobjCurrIf(module)
+DEFobjCurrIf(datetime)
+DEFobjCurrIf(glbl)
+
+/* imports from syslogd.c, these should go away over time (as we
+ * migrate/replace more and more code to ASL 2.0).
+ */
+extern int bHadHUP;
+extern int bFinished;
+extern int doFork;
+extern pid_t ppid;
+extern char *PidFile;
+
+extern int realMain(int argc, char **argv);
+extern rsRetVal queryLocalHostname(void);
+void syslogdInit(void);
+void syslogd_die(void);
+void syslogd_releaseClassPointers(void);
+void syslogd_sighup_handler();
+char **syslogd_crunch_list(char *list);
+void syslogd_printVersion(void);
+rsRetVal syslogd_doGlblProcessInit(void);
+rsRetVal syslogd_obtainClassPointers(void);
+/* end syslogd.c imports */
+extern int yydebug; /* interface to flex */
+
+
+/* forward definitions */
+void rsyslogd_submitErrMsg(const int severity, const int iErr, const uchar *msg);
+
+
+/* global data items */
+rsconf_t *ourConf = NULL; /* our config object */
+int MarkInterval = 20 * 60; /* interval between marks in seconds - read-only after startup */
+ratelimit_t *dflt_ratelimiter = NULL; /* ratelimiter for submits without explicit one */
+uchar *ConfFile = (uchar*) "/etc/rsyslog.conf";
+int bHaveMainQueue = 0;/* set to 1 if the main queue - in queueing mode - is available
+ * If the main queue is either not yet ready or not running in
+ * queueing mode (mode DIRECT!), then this is set to 0.
+ */
+qqueue_t *pMsgQueue = NULL; /* default main message queue */
+prop_t *pInternalInputName = NULL; /* there is only one global inputName for all internally-generated messages */
+ratelimit_t *internalMsg_ratelimiter = NULL; /* ratelimiter for rsyslog-own messages */
+int send_to_all = 0; /* send message to all IPv4/IPv6 addresses */
+
+static struct queuefilenames_s {
+ struct queuefilenames_s *next;
+ uchar *name;
+} *queuefilenames = NULL;
+
+
+void
+rsyslogd_usage(void)
+{
+ fprintf(stderr, "usage: rsyslogd [options]\n"
+ "use \"man rsyslogd\" for details. To run rsyslog "
+ "interactively, use \"rsyslogd -n\""
+ "to run it in debug mode use \"rsyslogd -dn\"\n"
+ "For further information see http://www.rsyslog.com/doc\n");
+ exit(1); /* "good" exit - done to terminate usage() */
+}
+
+/* This is a support function for imdiag. It returns back the approximate
+ * current number of messages in the main message queue
+ * This number includes the messages that reside in an associated DA queue (if
+ * it exists) -- rgerhards, 2009-10-14
+ * Note that this is imprecise, but needed for the testbench. It should not be used
+ * for any other purpose -- impstats is the right tool for all other cases.
+ */
+rsRetVal
+diagGetMainMsgQSize(int *piSize)
+{
+ DEFiRet;
+ assert(piSize != NULL);
+ *piSize = (pMsgQueue->pqDA != NULL) ? pMsgQueue->pqDA->iQueueSize : 0;
+ *piSize += pMsgQueue->iQueueSize;
+ RETiRet;
+}
+
+
+void
+rsyslogd_sigttin_handler()
+{
+ /* this is just a dummy to care for our sigttin input
+ * module cancel interface. The important point is that
+ * it actually does *nothing*.
+ */
+}
+
+rsRetVal
+rsyslogd_InitStdRatelimiters(void)
+{
+ DEFiRet;
+ CHKiRet(ratelimitNew(&dflt_ratelimiter, "rsyslogd", "dflt"));
+ /* TODO: add linux-type limiting capability */
+ CHKiRet(ratelimitNew(&internalMsg_ratelimiter, "rsyslogd", "internal_messages"));
+ ratelimitSetLinuxLike(internalMsg_ratelimiter, 5, 500);
+ /* TODO: make internalMsg ratelimit settings configurable */
+finalize_it:
+ RETiRet;
+}
+
+
+/* Method to initialize all global classes and use the objects that we need.
+ * rgerhards, 2008-01-04
+ * rgerhards, 2008-04-16: the actual initialization is now carried out by the runtime
+ */
+rsRetVal
+rsyslogd_InitGlobalClasses(void)
+{
+ DEFiRet;
+ char *pErrObj; /* tells us which object failed if that happens (useful for troubleshooting!) */
+
+ /* Intialize the runtime system */
+ pErrObj = "rsyslog runtime"; /* set in case the runtime errors before setting an object */
+ CHKiRet(rsrtInit(&pErrObj, &obj));
+ rsrtSetErrLogger(rsyslogd_submitErrMsg);
+
+ /* Now tell the system which classes we need ourselfs */
+ pErrObj = "glbl";
+ CHKiRet(objUse(glbl, CORE_COMPONENT));
+ pErrObj = "errmsg";
+ CHKiRet(objUse(errmsg, CORE_COMPONENT));
+ pErrObj = "module";
+ CHKiRet(objUse(module, CORE_COMPONENT));
+ pErrObj = "datetime";
+ CHKiRet(objUse(datetime, CORE_COMPONENT));
+ pErrObj = "ruleset";
+ CHKiRet(objUse(ruleset, CORE_COMPONENT));
+ /*pErrObj = "conf";
+ CHKiRet(objUse(conf, CORE_COMPONENT));*/
+ pErrObj = "prop";
+ CHKiRet(objUse(prop, CORE_COMPONENT));
+ pErrObj = "parser";
+ CHKiRet(objUse(parser, CORE_COMPONENT));
+ pErrObj = "rsconf";
+ CHKiRet(objUse(rsconf, CORE_COMPONENT));
+
+ /* intialize some dummy classes that are not part of the runtime */
+ pErrObj = "action";
+ CHKiRet(actionClassInit());
+ pErrObj = "template";
+ CHKiRet(templateInit());
+
+ /* TODO: the dependency on net shall go away! -- rgerhards, 2008-03-07 */
+ pErrObj = "net";
+ CHKiRet(objUse(net, LM_NET_FILENAME));
+
+ dnscacheInit();
+ initRainerscript();
+ ratelimitModInit();
+
+ /* we need to create the inputName property (only once during our lifetime) */
+ CHKiRet(prop.Construct(&pInternalInputName));
+ CHKiRet(prop.SetString(pInternalInputName, UCHAR_CONSTANT("rsyslogd"), sizeof("rsyslogd") - 1));
+ CHKiRet(prop.ConstructFinalize(pInternalInputName));
+
+finalize_it:
+ if(iRet != RS_RET_OK) {
+ /* we know we are inside the init sequence, so we can safely emit
+ * messages to stderr. -- rgerhards, 2008-04-02
+ */
+ fprintf(stderr, "Error during class init for object '%s' - failing...\n", pErrObj);
+ fprintf(stderr, "rsyslogd initializiation failed - global classes could not be initialized.\n"
+ "Did you do a \"make install\"?\n"
+ "Suggested action: run rsyslogd with -d -n options to see what exactly "
+ "fails.\n");
+ }
+
+ RETiRet;
+}
+
+/* preprocess a batch of messages, that is ready them for actual processing. This is done
+ * as a first stage and totally in parallel to any other worker active in the system. So
+ * it helps us keep up the overall concurrency level.
+ * rgerhards, 2010-06-09
+ */
+static inline rsRetVal
+preprocessBatch(batch_t *pBatch, int *pbShutdownImmediate) {
+ prop_t *ip;
+ prop_t *fqdn;
+ prop_t *localName;
+ prop_t *propFromHost = NULL;
+ prop_t *propFromHostIP = NULL;
+ int bIsPermitted;
+ msg_t *pMsg;
+ int i;
+ rsRetVal localRet;
+ DEFiRet;
+
+ for(i = 0 ; i < pBatch->nElem && !*pbShutdownImmediate ; i++) {
+ pMsg = pBatch->pElem[i].pMsg;
+ if((pMsg->msgFlags & NEEDS_ACLCHK_U) != 0) {
+ DBGPRINTF("msgConsumer: UDP ACL must be checked for message (hostname-based)\n");
+ if(net.cvthname(pMsg->rcvFrom.pfrominet, &localName, &fqdn, &ip) != RS_RET_OK)
+ continue;
+ bIsPermitted = net.isAllowedSender2((uchar*)"UDP",
+ (struct sockaddr *)pMsg->rcvFrom.pfrominet, (char*)propGetSzStr(fqdn), 1);
+ if(!bIsPermitted) {
+ DBGPRINTF("Message from '%s' discarded, not a permitted sender host\n",
+ propGetSzStr(fqdn));
+ pBatch->eltState[i] = BATCH_STATE_DISC;
+ } else {
+ /* save some of the info we obtained */
+ MsgSetRcvFrom(pMsg, localName);
+ CHKiRet(MsgSetRcvFromIP(pMsg, ip));
+ pMsg->msgFlags &= ~NEEDS_ACLCHK_U;
+ }
+ }
+ if((pMsg->msgFlags & NEEDS_PARSING) != 0) {
+ if((localRet = parser.ParseMsg(pMsg)) != RS_RET_OK) {
+ DBGPRINTF("Message discarded, parsing error %d\n", localRet);
+ pBatch->eltState[i] = BATCH_STATE_DISC;
+ }
+ }
+ }
+
+finalize_it:
+ if(propFromHost != NULL)
+ prop.Destruct(&propFromHost);
+ if(propFromHostIP != NULL)
+ prop.Destruct(&propFromHostIP);
+ RETiRet;
+}
+
+
+/* The consumer of dequeued messages. This function is called by the
+ * queue engine on dequeueing of a message. It runs on a SEPARATE
+ * THREAD. It receives an array of pointers, which it must iterate
+ * over. We do not do any further batching, as this is of no benefit
+ * for the main queue.
+ */
+static rsRetVal
+msgConsumer(void __attribute__((unused)) *notNeeded, batch_t *pBatch, wti_t *pWti)
+{
+ DEFiRet;
+ assert(pBatch != NULL);
+ preprocessBatch(pBatch, pWti->pbShutdownImmediate);
+ ruleset.ProcessBatch(pBatch, pWti);
+//TODO: the BATCH_STATE_COMM must be set somewhere down the road, but we
+//do not have this yet and so we emulate -- 2010-06-10
+int i;
+ for(i = 0 ; i < pBatch->nElem && !*pWti->pbShutdownImmediate ; i++) {
+ pBatch->eltState[i] = BATCH_STATE_COMM;
+ }
+ RETiRet;
+}
+
+
+/* create a main message queue, now also used for ruleset queues. This function
+ * needs to be moved to some other module, but it is considered acceptable for
+ * the time being (remember that we want to restructure config processing at large!).
+ * rgerhards, 2009-10-27
+ */
+rsRetVal createMainQueue(qqueue_t **ppQueue, uchar *pszQueueName, struct nvlst *lst)
+{
+ struct queuefilenames_s *qfn;
+ uchar *qfname = NULL;
+ static int qfn_renamenum = 0;
+ uchar qfrenamebuf[1024];
+ DEFiRet;
+
+ /* create message queue */
+ CHKiRet_Hdlr(qqueueConstruct(ppQueue, ourConf->globals.mainQ.MainMsgQueType, ourConf->globals.mainQ.iMainMsgQueueNumWorkers, ourConf->globals.mainQ.iMainMsgQueueSize, msgConsumer)) {
+ /* no queue is fatal, we need to give up in that case... */
+ errmsg.LogError(0, iRet, "could not create (ruleset) main message queue"); \
+ }
+ /* name our main queue object (it's not fatal if it fails...) */
+ obj.SetName((obj_t*) (*ppQueue), pszQueueName);
+
+ if(lst == NULL) { /* use legacy parameters? */
+ /* ... set some properties ... */
+ # define setQPROP(func, directive, data) \
+ CHKiRet_Hdlr(func(*ppQueue, data)) { \
+ errmsg.LogError(0, NO_ERRCODE, "Invalid " #directive ", error %d. Ignored, running with default setting", iRet); \
+ }
+ # define setQPROPstr(func, directive, data) \
+ CHKiRet_Hdlr(func(*ppQueue, data, (data == NULL)? 0 : strlen((char*) data))) { \
+ errmsg.LogError(0, NO_ERRCODE, "Invalid " #directive ", error %d. Ignored, running with default setting", iRet); \
+ }
+
+ if(ourConf->globals.mainQ.pszMainMsgQFName != NULL) {
+ /* check if the queue file name is unique, else emit an error */
+ for(qfn = queuefilenames ; qfn != NULL ; qfn = qfn->next) {
+ dbgprintf("check queue file name '%s' vs '%s'\n", qfn->name, ourConf->globals.mainQ.pszMainMsgQFName );
+ if(!ustrcmp(qfn->name, ourConf->globals.mainQ.pszMainMsgQFName)) {
+ snprintf((char*)qfrenamebuf, sizeof(qfrenamebuf), "%d-%s-%s",
+ ++qfn_renamenum, ourConf->globals.mainQ.pszMainMsgQFName,
+ (pszQueueName == NULL) ? "NONAME" : (char*)pszQueueName);
+ qfname = ustrdup(qfrenamebuf);
+ errmsg.LogError(0, NO_ERRCODE, "Error: queue file name '%s' already in use "
+ " - using '%s' instead", ourConf->globals.mainQ.pszMainMsgQFName, qfname);
+ break;
+ }
+ }
+ if(qfname == NULL)
+ qfname = ustrdup(ourConf->globals.mainQ.pszMainMsgQFName);
+ qfn = malloc(sizeof(struct queuefilenames_s));
+ qfn->name = qfname;
+ qfn->next = queuefilenames;
+ queuefilenames = qfn;
+ }
+
+ setQPROP(qqueueSetMaxFileSize, "$MainMsgQueueFileSize", ourConf->globals.mainQ.iMainMsgQueMaxFileSize);
+ setQPROP(qqueueSetsizeOnDiskMax, "$MainMsgQueueMaxDiskSpace", ourConf->globals.mainQ.iMainMsgQueMaxDiskSpace);
+ setQPROP(qqueueSetiDeqBatchSize, "$MainMsgQueueDequeueBatchSize", ourConf->globals.mainQ.iMainMsgQueDeqBatchSize);
+ setQPROPstr(qqueueSetFilePrefix, "$MainMsgQueueFileName", qfname);
+ setQPROP(qqueueSetiPersistUpdCnt, "$MainMsgQueueCheckpointInterval", ourConf->globals.mainQ.iMainMsgQPersistUpdCnt);
+ setQPROP(qqueueSetbSyncQueueFiles, "$MainMsgQueueSyncQueueFiles", ourConf->globals.mainQ.bMainMsgQSyncQeueFiles);
+ setQPROP(qqueueSettoQShutdown, "$MainMsgQueueTimeoutShutdown", ourConf->globals.mainQ.iMainMsgQtoQShutdown );
+ setQPROP(qqueueSettoActShutdown, "$MainMsgQueueTimeoutActionCompletion", ourConf->globals.mainQ.iMainMsgQtoActShutdown);
+ setQPROP(qqueueSettoWrkShutdown, "$MainMsgQueueWorkerTimeoutThreadShutdown", ourConf->globals.mainQ.iMainMsgQtoWrkShutdown);
+ setQPROP(qqueueSettoEnq, "$MainMsgQueueTimeoutEnqueue", ourConf->globals.mainQ.iMainMsgQtoEnq);
+ setQPROP(qqueueSetiHighWtrMrk, "$MainMsgQueueHighWaterMark", ourConf->globals.mainQ.iMainMsgQHighWtrMark);
+ setQPROP(qqueueSetiLowWtrMrk, "$MainMsgQueueLowWaterMark", ourConf->globals.mainQ.iMainMsgQLowWtrMark);
+ setQPROP(qqueueSetiDiscardMrk, "$MainMsgQueueDiscardMark", ourConf->globals.mainQ.iMainMsgQDiscardMark);
+ setQPROP(qqueueSetiDiscardSeverity, "$MainMsgQueueDiscardSeverity", ourConf->globals.mainQ.iMainMsgQDiscardSeverity);
+ setQPROP(qqueueSetiMinMsgsPerWrkr, "$MainMsgQueueWorkerThreadMinimumMessages", ourConf->globals.mainQ.iMainMsgQWrkMinMsgs);
+ setQPROP(qqueueSetbSaveOnShutdown, "$MainMsgQueueSaveOnShutdown", ourConf->globals.mainQ.bMainMsgQSaveOnShutdown);
+ setQPROP(qqueueSetiDeqSlowdown, "$MainMsgQueueDequeueSlowdown", ourConf->globals.mainQ.iMainMsgQDeqSlowdown);
+ setQPROP(qqueueSetiDeqtWinFromHr, "$MainMsgQueueDequeueTimeBegin", ourConf->globals.mainQ.iMainMsgQueueDeqtWinFromHr);
+ setQPROP(qqueueSetiDeqtWinToHr, "$MainMsgQueueDequeueTimeEnd", ourConf->globals.mainQ.iMainMsgQueueDeqtWinToHr);
+
+ # undef setQPROP
+ # undef setQPROPstr
+ } else { /* use new style config! */
+ qqueueSetDefaultsRulesetQueue(*ppQueue);
+ qqueueApplyCnfParam(*ppQueue, lst);
+ }
+ RETiRet;
+}
+
+rsRetVal
+startMainQueue(qqueue_t *pQueue)
+{
+ DEFiRet;
+ CHKiRet_Hdlr(qqueueStart(pQueue)) {
+ /* no queue is fatal, we need to give up in that case... */
+ errmsg.LogError(0, iRet, "could not start (ruleset) main message queue"); \
+ }
+ RETiRet;
+}
+
+
+/* this is a special function used to submit an error message. This
+ * function is also passed to the runtime library as the generic error
+ * message handler. -- rgerhards, 2008-04-17
+ */
+void
+rsyslogd_submitErrMsg(const int severity, const int iErr, const uchar *msg)
+{
+ logmsgInternal(iErr, LOG_SYSLOG|(severity & 0x07), msg, 0);
+}
+
+static inline rsRetVal
+submitMsgWithDfltRatelimiter(msg_t *pMsg)
+{
+ return ratelimitAddMsg(dflt_ratelimiter, NULL, pMsg);
+}
+
+
+/* This function logs a message to rsyslog itself, using its own
+ * internal structures. This means external programs (like the
+ * system journal) will never see this message.
+ */
+static rsRetVal
+logmsgInternalSelf(const int iErr, const int pri, const size_t lenMsg,
+ const char *__restrict__ const msg, int flags)
+{
+ uchar pszTag[33];
+ msg_t *pMsg;
+ DEFiRet;
+
+ CHKiRet(msgConstruct(&pMsg));
+ MsgSetInputName(pMsg, pInternalInputName);
+ MsgSetRawMsg(pMsg, (char*)msg, lenMsg);
+ MsgSetHOSTNAME(pMsg, glbl.GetLocalHostName(), ustrlen(glbl.GetLocalHostName()));
+ MsgSetRcvFrom(pMsg, glbl.GetLocalHostNameProp());
+ MsgSetRcvFromIP(pMsg, glbl.GetLocalHostIP());
+ MsgSetMSGoffs(pMsg, 0);
+ /* check if we have an error code associated and, if so,
+ * adjust the tag. -- rgerhards, 2008-06-27
+ */
+ if(iErr == NO_ERRCODE) {
+ MsgSetTAG(pMsg, UCHAR_CONSTANT("rsyslogd:"), sizeof("rsyslogd:") - 1);
+ } else {
+ size_t len = snprintf((char*)pszTag, sizeof(pszTag), "rsyslogd%d:", iErr);
+ pszTag[32] = '\0'; /* just to make sure... */
+ MsgSetTAG(pMsg, pszTag, len);
+ }
+ pMsg->iFacility = LOG_FAC(pri);
+ pMsg->iSeverity = LOG_PRI(pri);
+ flags |= INTERNAL_MSG;
+ pMsg->msgFlags = flags;
+
+ if(bHaveMainQueue == 0) { /* not yet in queued mode */
+ iminternalAddMsg(pMsg);
+ } else {
+ /* we have the queue, so we can simply provide the
+ * message to the queue engine.
+ */
+ ratelimitAddMsg(internalMsg_ratelimiter, NULL, pMsg);
+ }
+finalize_it:
+ RETiRet;
+}
+
+
+
+/* rgerhards 2004-11-09: the following is a function that can be used
+ * to log a message orginating from the syslogd itself.
+ */
+rsRetVal
+logmsgInternal(int iErr, int pri, const uchar *const msg, int flags)
+{
+ size_t lenMsg;
+ unsigned i;
+ char *bufModMsg = NULL; /* buffer for modified message, should we need to modify */
+ DEFiRet;
+
+ /* we first do a path the remove control characters that may have accidently
+ * introduced (program error!). This costs performance, but we do not expect
+ * to be called very frequently in any case ;) -- rgerhards, 2013-12-19.
+ */
+ lenMsg = ustrlen(msg);
+ for(i = 0 ; i < lenMsg ; ++i) {
+ if(msg[i] < 0x20 || msg[i] == 0x7f) {
+ if(bufModMsg == NULL) {
+ CHKmalloc(bufModMsg = strdup((char*) msg));
+ }
+ bufModMsg[i] = ' ';
+ }
+ }
+
+ if(bProcessInternalMessages) {
+ CHKiRet(logmsgInternalSelf(iErr, pri, lenMsg,
+ (bufModMsg == NULL) ? (char*)msg : bufModMsg,
+ flags));
+ } else {
+ stdlog_log(stdlog_hdl, LOG_PRI(pri), "%s",
+ (bufModMsg == NULL) ? (char*)msg : bufModMsg);
+ }
+
+ /* we now check if we should print internal messages out to stderr. This was
+ * suggested by HKS as a way to help people troubleshoot rsyslog configuration
+ * (by running it interactively. This makes an awful lot of sense, so I add
+ * it here. -- rgerhards, 2008-07-28
+ * Note that error messages can not be disabled during a config verify. This
+ * permits us to process unmodified config files which otherwise contain a
+ * supressor statement.
+ */
+ if(((Debug == DEBUG_FULL || !doFork) && ourConf->globals.bErrMsgToStderr) || iConfigVerify) {
+ if(LOG_PRI(pri) == LOG_ERR)
+ fprintf(stderr, "rsyslogd: %s\n", (bufModMsg == NULL) ? (char*)msg : bufModMsg);
+ }
+
+finalize_it:
+ free(bufModMsg);
+ RETiRet;
+}
+
+rsRetVal
+submitMsg(msg_t *pMsg)
+{
+ return submitMsgWithDfltRatelimiter(pMsg);
+}
+
+/* submit a message to the main message queue. This is primarily
+ * a hook to prevent the need for callers to know about the main message queue
+ * rgerhards, 2008-02-13
+ */
+rsRetVal
+submitMsg2(msg_t *pMsg)
+{
+ qqueue_t *pQueue;
+ ruleset_t *pRuleset;
+ DEFiRet;
+
+ ISOBJ_TYPE_assert(pMsg, msg);
+
+ pRuleset = MsgGetRuleset(pMsg);
+ pQueue = (pRuleset == NULL) ? pMsgQueue : ruleset.GetRulesetQueue(pRuleset);
+
+ /* if a plugin logs a message during shutdown, the queue may no longer exist */
+ if(pQueue == NULL) {
+ DBGPRINTF("submitMsg2() could not submit message - "
+ "queue does (no longer?) exist - ignored\n");
+ FINALIZE;
+ }
+
+ qqueueEnqMsg(pQueue, pMsg->flowCtlType, pMsg);
+
+finalize_it:
+ RETiRet;
+}
+
+/* submit multiple messages at once, very similar to submitMsg, just
+ * for multi_submit_t. All messages need to go into the SAME queue!
+ * rgerhards, 2009-06-16
+ */
+rsRetVal
+multiSubmitMsg2(multi_submit_t *pMultiSub)
+{
+ qqueue_t *pQueue;
+ ruleset_t *pRuleset;
+ DEFiRet;
+ assert(pMultiSub != NULL);
+
+ if(pMultiSub->nElem == 0)
+ FINALIZE;
+
+ pRuleset = MsgGetRuleset(pMultiSub->ppMsgs[0]);
+ pQueue = (pRuleset == NULL) ? pMsgQueue : ruleset.GetRulesetQueue(pRuleset);
+
+ /* if a plugin logs a message during shutdown, the queue may no longer exist */
+ if(pQueue == NULL) {
+ DBGPRINTF("multiSubmitMsg() could not submit message - "
+ "queue does (no longer?) exist - ignored\n");
+ FINALIZE;
+ }
+
+ iRet = pQueue->MultiEnq(pQueue, pMultiSub);
+ pMultiSub->nElem = 0;
+
+finalize_it:
+ RETiRet;
+}
+rsRetVal
+multiSubmitMsg(multi_submit_t *pMultiSub) /* backward compat. level */
+{
+ return multiSubmitMsg2(pMultiSub);
+}
+
+
+/* flush multiSubmit, e.g. at end of read records */
+rsRetVal
+multiSubmitFlush(multi_submit_t *pMultiSub)
+{
+ DEFiRet;
+ if(pMultiSub->nElem > 0) {
+ iRet = multiSubmitMsg2(pMultiSub);
+ }
+ RETiRet;
+}
+
+
+/* some support for command line option parsing. Any non-trivial options must be
+ * buffered until the complete command line has been parsed. This is necessary to
+ * prevent dependencies between the options. That, in turn, means we need to have
+ * something that is capable of buffering options and there values. The follwing
+ * functions handle that.
+ * rgerhards, 2008-04-04
+ */
+typedef struct bufOpt {
+ struct bufOpt *pNext;
+ char optchar;
+ char *arg;
+} bufOpt_t;
+static bufOpt_t *bufOptRoot = NULL;
+static bufOpt_t *bufOptLast = NULL;
+
+/* add option buffer */
+static rsRetVal
+bufOptAdd(char opt, char *arg)
+{
+ DEFiRet;
+ bufOpt_t *pBuf;
+
+ if((pBuf = MALLOC(sizeof(bufOpt_t))) == NULL)
+ ABORT_FINALIZE(RS_RET_OUT_OF_MEMORY);
+
+ pBuf->optchar = opt;
+ pBuf->arg = arg;
+ pBuf->pNext = NULL;
+
+ if(bufOptLast == NULL) {
+ bufOptRoot = pBuf; /* then there is also no root! */
+ } else {
+ bufOptLast->pNext = pBuf;
+ }
+ bufOptLast = pBuf;
+
+finalize_it:
+ RETiRet;
+}
+
+
+/* remove option buffer from top of list, return values and destruct buffer itself.
+ * returns RS_RET_END_OF_LINKEDLIST when no more options are present.
+ * (we use int *opt instead of char *opt to keep consistent with getopt())
+ */
+static rsRetVal
+bufOptRemove(int *opt, char **arg)
+{
+ DEFiRet;
+ bufOpt_t *pBuf;
+
+ if(bufOptRoot == NULL)
+ ABORT_FINALIZE(RS_RET_END_OF_LINKEDLIST);
+ pBuf = bufOptRoot;
+
+ *opt = pBuf->optchar;
+ *arg = pBuf->arg;
+
+ bufOptRoot = pBuf->pNext;
+ free(pBuf);
+
+finalize_it:
+ RETiRet;
+}
+
+
+rsRetVal
+rsyslogdInit(void)
+{
+ char bufStartUpMsg[512];
+ struct sigaction sigAct;
+ DEFiRet;
+
+ memset(&sigAct, 0, sizeof (sigAct));
+ sigemptyset(&sigAct.sa_mask);
+ sigAct.sa_handler = syslogd_sighup_handler;
+ sigaction(SIGHUP, &sigAct, NULL);
+
+ CHKiRet(rsconf.Activate(ourConf));
+ DBGPRINTF(" started.\n");
+
+ if(ourConf->globals.bLogStatusMsgs) {
+ snprintf(bufStartUpMsg, sizeof(bufStartUpMsg)/sizeof(char),
+ " [origin software=\"rsyslogd\" " "swVersion=\"" VERSION \
+ "\" x-pid=\"%d\" x-info=\"http://www.rsyslog.com\"] start",
+ (int) glblGetOurPid());
+ logmsgInternal(NO_ERRCODE, LOG_SYSLOG|LOG_INFO, (uchar*)bufStartUpMsg, 0);
+ }
+
+finalize_it:
+ RETiRet;
+}
+
+
+/* This is the main entry point into rsyslogd. Over time, we should try to
+ * modularize it a bit more...
+ */
+void
+initAll(int argc, char **argv)
+{
+ rsRetVal localRet;
+ int ch;
+ extern int optind;
+ extern char *optarg;
+ int bEOptionWasGiven = 0;
+ int iHelperUOpt;
+ int bChDirRoot = 1; /* change the current working directory to "/"? */
+ char *arg; /* for command line option processing */
+ char cwdbuf[128]; /* buffer to obtain/display current working directory */
+ DEFiRet;
+
+ /* first, parse the command line options. We do not carry out any actual work, just
+ * see what we should do. This relieves us from certain anomalies and we can process
+ * the parameters down below in the correct order. For example, we must know the
+ * value of -M before we can do the init, but at the same time we need to have
+ * the base classes init before we can process most of the options. Now, with the
+ * split of functionality, this is no longer a problem. Thanks to varmofekoj for
+ * suggesting this algo.
+ * Note: where we just need to set some flags and can do so without knowledge
+ * of other options, we do this during the inital option processing.
+ * rgerhards, 2008-04-04
+ */
+ while((ch = getopt(argc, argv, "46a:Ac:dDef:g:hi:l:m:M:nN:op:qQr::s:S:t:T:u:vwx")) != EOF) {
+ switch((char)ch) {
+ case '4':
+ case '6':
+ case 'A':
+ case 'a':
+ case 'f': /* configuration file */
+ case 'h':
+ case 'i': /* pid file name */
+ case 'l':
+ case 'm': /* mark interval */
+ case 'n': /* don't fork */
+ case 'N': /* enable config verify mode */
+ case 'o':
+ case 'p':
+ case 'q': /* add hostname if DNS resolving has failed */
+ case 'Q': /* dont resolve hostnames in ACL to IPs */
+ case 's':
+ case 'S': /* Source IP for local client to be used on multihomed host */
+ case 'T': /* chroot on startup (primarily for testing) */
+ case 'u': /* misc user settings */
+ case 'w': /* disable disallowed host warnings */
+ case 'x': /* disable dns for remote messages */
+ case 'g': /* enable tcp gssapi logging */
+ case 'r': /* accept remote messages */
+ case 't': /* enable tcp logging */
+ CHKiRet(bufOptAdd(ch, optarg));
+ break;
+ case 'c': /* compatibility mode */
+ fprintf(stderr, "rsyslogd: error: option -c is no longer supported - ignored\n");
+ break;
+ case 'd': /* debug - must be handled now, so that debug is active during init! */
+ debugging_on = 1;
+ Debug = 1;
+ yydebug = 1;
+ break;
+ case 'D': /* BISON debug */
+ yydebug = 1;
+ break;
+ case 'e': /* log every message (no repeat message supression) */
+ bEOptionWasGiven = 1;
+ break;
+ case 'M': /* default module load path -- this MUST be carried out immediately! */
+ glblModPath = (uchar*) optarg;
+ break;
+ case 'v': /* MUST be carried out immediately! */
+ syslogd_printVersion();
+ exit(0); /* exit for -v option - so this is a "good one" */
+ case '?':
+ default:
+ rsyslogd_usage();
+ }
+ }
+
+ if(argc - optind)
+ rsyslogd_usage();
+
+ DBGPRINTF("rsyslogd %s startup, module path '%s', cwd:%s\n",
+ VERSION, glblModPath == NULL ? "" : (char*)glblModPath,
+ getcwd(cwdbuf, sizeof(cwdbuf)));
+
+ /* we are done with the initial option parsing and processing. Now we init the system. */
+
+ ppid = getpid();
+
+ CHKiRet(rsyslogd_InitGlobalClasses());
+ CHKiRet(syslogd_obtainClassPointers());
+
+ /* doing some core initializations */
+
+ /* get our host and domain names - we need to do this early as we may emit
+ * error log messages, which need the correct hostname. -- rgerhards, 2008-04-04
+ */
+ queryLocalHostname();
+
+ /* initialize the objects */
+ if((iRet = modInitIminternal()) != RS_RET_OK) {
+ fprintf(stderr, "fatal error: could not initialize errbuf object (error code %d).\n",
+ iRet);
+ exit(1); /* "good" exit, leaving at init for fatal error */
+ }
+
+
+ /* END core initializations - we now come back to carrying out command line options*/
+
+ while((iRet = bufOptRemove(&ch, &arg)) == RS_RET_OK) {
+ DBGPRINTF("deque option %c, optarg '%s'\n", ch, (arg == NULL) ? "" : arg);
+ switch((char)ch) {
+ case '4':
+ glbl.SetDefPFFamily(PF_INET);
+ break;
+ case '6':
+ glbl.SetDefPFFamily(PF_INET6);
+ break;
+ case 'A':
+ send_to_all++;
+ break;
+ case 'a':
+ fprintf(stderr, "rsyslogd: error -a is no longer supported, use module imuxsock instead");
+ break;
+ case 'S': /* Source IP for local client to be used on multihomed host */
+ if(glbl.GetSourceIPofLocalClient() != NULL) {
+ fprintf (stderr, "rsyslogd: Only one -S argument allowed, the first one is taken.\n");
+ } else {
+ glbl.SetSourceIPofLocalClient((uchar*)arg);
+ }
+ break;
+ case 'f': /* configuration file */
+ ConfFile = (uchar*) arg;
+ break;
+ case 'g': /* enable tcp gssapi logging */
+ fprintf(stderr, "rsyslogd: -g option no longer supported - ignored\n");
+ case 'h':
+ fprintf(stderr, "rsyslogd: error -h is no longer supported - ignored");
+ break;
+ case 'i': /* pid file name */
+ PidFile = arg;
+ break;
+ case 'l':
+ if(glbl.GetLocalHosts() != NULL) {
+ fprintf (stderr, "rsyslogd: Only one -l argument allowed, the first one is taken.\n");
+ } else {
+ glbl.SetLocalHosts(syslogd_crunch_list(arg));
+ }
+ break;
+ case 'm': /* mark interval */
+ fprintf(stderr, "rsyslogd: error -m is no longer supported - use immark instead");
+ break;
+ case 'n': /* don't fork */
+ doFork = 0;
+ break;
+ case 'N': /* enable config verify mode */
+ iConfigVerify = atoi(arg);
+ break;
+ case 'o':
+ fprintf(stderr, "error -o is no longer supported, use module imuxsock instead");
+ break;
+ case 'p':
+ fprintf(stderr, "error -p is no longer supported, use module imuxsock instead");
+ break;
+ case 'q': /* add hostname if DNS resolving has failed */
+ *(net.pACLAddHostnameOnFail) = 1;
+ break;
+ case 'Q': /* dont resolve hostnames in ACL to IPs */
+ *(net.pACLDontResolve) = 1;
+ break;
+ case 'r': /* accept remote messages */
+ fprintf(stderr, "rsyslogd: error option -r is no longer supported - ignored");
+ break;
+ case 's':
+ if(glbl.GetStripDomains() != NULL) {
+ fprintf (stderr, "rsyslogd: Only one -s argument allowed, the first one is taken.\n");
+ } else {
+ glbl.SetStripDomains(syslogd_crunch_list(arg));
+ }
+ break;
+ case 't': /* enable tcp logging */
+ fprintf(stderr, "rsyslogd: error option -t is no longer supported - ignored");
+ break;
+ case 'T':/* chroot() immediately at program startup, but only for testing, NOT security yet */
+ if(chroot(arg) != 0) {
+ perror("chroot");
+ exit(1);
+ }
+ break;
+ case 'u': /* misc user settings */
+ iHelperUOpt = atoi(arg);
+ if(iHelperUOpt & 0x01)
+ glbl.SetParseHOSTNAMEandTAG(0);
+ if(iHelperUOpt & 0x02)
+ bChDirRoot = 0;
+ break;
+ case 'w': /* disable disallowed host warnigs */
+ glbl.SetOption_DisallowWarning(0);
+ break;
+ case 'x': /* disable dns for remote messages */
+ glbl.SetDisableDNS(1);
+ break;
+ case '?':
+ default:
+ rsyslogd_usage();
+ }
+ }
+
+ if(iRet != RS_RET_END_OF_LINKEDLIST)
+ FINALIZE;
+
+ if(iConfigVerify) {
+ fprintf(stderr, "rsyslogd: version %s, config validation run (level %d), master config %s\n",
+ VERSION, iConfigVerify, ConfFile);
+ }
+
+ localRet = rsconf.Load(&ourConf, ConfFile);
+
+ syslogdInit();
+
+ if(localRet == RS_RET_NONFATAL_CONFIG_ERR) {
+ if(loadConf->globals.bAbortOnUncleanConfig) {
+ fprintf(stderr, "rsyslogd: $AbortOnUncleanConfig is set, and config is not clean.\n"
+ "Check error log for details, fix errors and restart. As a last\n"
+ "resort, you may want to remove $AbortOnUncleanConfig to permit a\n"
+ "startup with a dirty config.\n");
+ exit(2);
+ }
+ if(iConfigVerify) {
+ /* a bit dirty, but useful... */
+ exit(1);
+ }
+ localRet = RS_RET_OK;
+ }
+ CHKiRet(localRet);
+
+ CHKiRet(rsyslogd_InitStdRatelimiters());
+
+ if(bChDirRoot) {
+ if(chdir("/") != 0)
+ fprintf(stderr, "Can not do 'cd /' - still trying to run\n");
+ }
+
+ /* process compatibility mode settings */
+ if(bEOptionWasGiven) {
+ errmsg.LogError(0, NO_ERRCODE, "WARNING: \"message repeated n times\" feature MUST be turned on in "
+ "rsyslog.conf - CURRENTLY EVERY MESSAGE WILL BE LOGGED. Visit "
+ "http://www.rsyslog.com/rptdmsgreduction to learn "
+ "more and cast your vote if you want us to keep this feature.");
+ }
+
+ if(!iConfigVerify)
+ CHKiRet(syslogd_doGlblProcessInit());
+
+ /* Send a signal to the parent so it can terminate. */
+ if(glblGetOurPid() != ppid)
+ kill(ppid, SIGTERM);
+
+ CHKiRet(rsyslogdInit());
+
+ if(Debug && debugging_on) {
+ dbgprintf("Debugging enabled, SIGUSR1 to turn off debugging.\n");
+ }
+
+ /* END OF INTIALIZATION */
+ DBGPRINTF("initialization completed, transitioning to regular run mode\n");
+
+ /* close stderr and stdout if they are kept open during a fork. Note that this
+ * may introduce subtle security issues: if we are in a jail, one may break out of
+ * it via these descriptors. But if I close them earlier, error messages will (once
+ * again) not be emitted to the user that starts the daemon. As root jail support
+ * is still in its infancy (and not really done), we currently accept this issue.
+ * rgerhards, 2009-06-29
+ */
+ if(doFork) {
+ close(1);
+ close(2);
+ ourConf->globals.bErrMsgToStderr = 0;
+ }
+
+finalize_it:
+ if(iRet == RS_RET_VALIDATION_RUN) {
+ fprintf(stderr, "rsyslogd: End of config validation run. Bye.\n");
+ exit(0);
+ } else if(iRet != RS_RET_OK) {
+ fprintf(stderr, "rsyslogd: run failed with error %d (see rsyslog.h "
+ "or try http://www.rsyslog.com/e/%d to learn what that number means)\n", iRet, iRet*-1);
+ exit(1);
+ }
+
+ ENDfunc
+}
+
+void
+rsyslogdDebugSwitch()
+{
+ time_t tTime;
+ struct tm tp;
+ struct sigaction sigAct;
+
+ datetime.GetTime(&tTime);
+ localtime_r(&tTime, &tp);
+ if(debugging_on == 0) {
+ debugging_on = 1;
+ dbgprintf("\n");
+ dbgprintf("\n");
+ dbgprintf("********************************************************************************\n");
+ dbgprintf("Switching debugging_on to true at %2.2d:%2.2d:%2.2d\n",
+ tp.tm_hour, tp.tm_min, tp.tm_sec);
+ dbgprintf("********************************************************************************\n");
+ } else {
+ dbgprintf("********************************************************************************\n");
+ dbgprintf("Switching debugging_on to false at %2.2d:%2.2d:%2.2d\n",
+ tp.tm_hour, tp.tm_min, tp.tm_sec);
+ dbgprintf("********************************************************************************\n");
+ dbgprintf("\n");
+ dbgprintf("\n");
+ debugging_on = 0;
+ }
+
+ memset(&sigAct, 0, sizeof (sigAct));
+ sigemptyset(&sigAct.sa_mask);
+ sigAct.sa_handler = rsyslogdDebugSwitch;
+ sigaction(SIGUSR1, &sigAct, NULL);
+}
+
+
+/* this function pulls all internal messages from the buffer
+ * and puts them into the processing engine.
+ * We can only do limited error handling, as this would not
+ * really help us. TODO: add error messages?
+ * rgerhards, 2007-08-03
+ */
+static inline void processImInternal(void)
+{
+ msg_t *pMsg;
+
+ while(iminternalRemoveMsg(&pMsg) == RS_RET_OK) {
+ ratelimitAddMsg(dflt_ratelimiter, NULL, pMsg);
+ }
+}
+
+
+/* This takes a received message that must be decoded and submits it to
+ * the main message queue. This is a legacy function which is being provided
+ * to aid older input plugins that do not support message creation via
+ * the new interfaces themselves. It is not recommended to use this
+ * function for new plugins. -- rgerhards, 2009-10-12
+ */
+rsRetVal
+parseAndSubmitMessage(uchar *hname, uchar *hnameIP, uchar *msg, int len, int flags, flowControl_t flowCtlType,
+ prop_t *pInputName, struct syslogTime *stTime, time_t ttGenTime, ruleset_t *pRuleset)
+{
+ prop_t *pProp = NULL;
+ msg_t *pMsg;
+ DEFiRet;
+
+ /* we now create our own message object and submit it to the queue */
+ if(stTime == NULL) {
+ CHKiRet(msgConstruct(&pMsg));
+ } else {
+ CHKiRet(msgConstructWithTime(&pMsg, stTime, ttGenTime));
+ }
+ if(pInputName != NULL)
+ MsgSetInputName(pMsg, pInputName);
+ MsgSetRawMsg(pMsg, (char*)msg, len);
+ MsgSetFlowControlType(pMsg, flowCtlType);
+ MsgSetRuleset(pMsg, pRuleset);
+ pMsg->msgFlags = flags | NEEDS_PARSING;
+
+ MsgSetRcvFromStr(pMsg, hname, ustrlen(hname), &pProp);
+ CHKiRet(prop.Destruct(&pProp));
+ CHKiRet(MsgSetRcvFromIPStr(pMsg, hnameIP, ustrlen(hnameIP), &pProp));
+ CHKiRet(prop.Destruct(&pProp));
+ CHKiRet(submitMsg2(pMsg));
+
+finalize_it:
+ RETiRet;
+}
+
+
+/* helper to doHUP(), this "HUPs" each action. The necessary locking
+ * is done inside the action class and nothing we need to take care of.
+ * rgerhards, 2008-10-22
+ */
+DEFFUNC_llExecFunc(doHUPActions)
+{
+ BEGINfunc
+ actionCallHUPHdlr((action_t*) pData);
+ ENDfunc
+ return RS_RET_OK; /* we ignore errors, we can not do anything either way */
+}
+
+
+/* This function processes a HUP after one has been detected. Note that this
+ * is *NOT* the sighup handler. The signal is recorded by the handler, that record
+ * detected inside the mainloop and then this function is called to do the
+ * real work. -- rgerhards, 2008-10-22
+ * Note: there is a VERY slim chance of a data race when the hostname is reset.
+ * We prefer to take this risk rather than sync all accesses, because to the best
+ * of my analysis it can not really hurt (the actual property is reference-counted)
+ * but the sync would require some extra CPU for *each* message processed.
+ * rgerhards, 2012-04-11
+ */
+static inline void
+doHUP(void)
+{
+ char buf[512];
+
+ if(ourConf->globals.bLogStatusMsgs) {
+ snprintf(buf, sizeof(buf) / sizeof(char),
+ " [origin software=\"rsyslogd\" " "swVersion=\"" VERSION
+ "\" x-pid=\"%d\" x-info=\"http://www.rsyslog.com\"] rsyslogd was HUPed",
+ (int) glblGetOurPid());
+ errno = 0;
+ logmsgInternal(NO_ERRCODE, LOG_SYSLOG|LOG_INFO, (uchar*)buf, 0);
+ }
+
+ queryLocalHostname(); /* re-read our name */
+ ruleset.IterateAllActions(ourConf, doHUPActions, NULL);
+ lookupDoHUP();
+}
+
+/* rsyslogdDoDie() is a signal handler. If called, it sets the bFinished variable
+ * to indicate the program should terminate. However, it does not terminate
+ * it itself, because that causes issues with multi-threading. The actual
+ * termination is then done on the main thread. This solution might introduce
+ * a minimal delay, but it is much cleaner than the approach of doing everything
+ * inside the signal handler.
+ * rgerhards, 2005-10-26
+ * Note:
+ * - we do not call DBGPRINTF() as this may cause us to block in case something
+ * with the threading is wrong.
+ * - we do not really care about the return state of write(), but we need this
+ * strange check we do to silence compiler warnings (thanks, Ubuntu!)
+ */
+void
+rsyslogdDoDie(int sig)
+{
+# define MSG1 "DoDie called.\n"
+# define MSG2 "DoDie called 5 times - unconditional exit\n"
+ static int iRetries = 0; /* debug aid */
+ dbgprintf(MSG1);
+ if(Debug == DEBUG_FULL) {
+ if(write(1, MSG1, sizeof(MSG1) - 1)) {}
+ }
+ if(iRetries++ == 4) {
+ if(Debug == DEBUG_FULL) {
+ if(write(1, MSG2, sizeof(MSG2) - 1)) {}
+ }
+ abort();
+ }
+ bFinished = sig;
+ if(glblDebugOnShutdown) {
+ /* kind of hackish - set to 0, so that debug_swith will enable
+ * and AND emit the "start debug log" message.
+ */
+ debugging_on = 0;
+ rsyslogdDebugSwitch();
+ }
+# undef MSG1
+# undef MSG2
+}
+
+
+/* This is the main processing loop. It is called after successful initialization.
+ * When it returns, the syslogd terminates.
+ * Its sole function is to provide some housekeeping things. The real work is done
+ * by the other threads spawned.
+ */
+static void
+mainloop(void)
+{
+ struct timeval tvSelectTimeout;
+
+ BEGINfunc
+ /* first check if we have any internal messages queued and spit them out. We used
+ * to do that on any loop iteration, but that is no longer necessry. The reason
+ * is that once we reach this point here, we always run on multiple threads and
+ * thus the main queue is properly initialized. -- rgerhards, 2008-06-09
+ */
+ processImInternal();
+
+ while(!bFinished){
+ /* this is now just a wait - please note that we do use a near-"eternal"
+ * timeout of 1 day. This enables us to help safe the environment
+ * by not unnecessarily awaking rsyslog on a regular tick (just think
+ * powertop, for example). In that case, we primarily wait for a signal,
+ * but a once-a-day wakeup should be quite acceptable. -- rgerhards, 2008-06-09
+ */
+ tvSelectTimeout.tv_sec = 86400 /*1 day*/;
+ tvSelectTimeout.tv_usec = 0;
+ select(1, NULL, NULL, NULL, &tvSelectTimeout);
+ if(bFinished)
+ break; /* exit as quickly as possible */
+
+ if(bHadHUP) {
+ doHUP();
+ bHadHUP = 0;
+ continue;
+ }
+ }
+ ENDfunc
+}
+
+
+/* Finalize and destruct all actions.
+ */
+void
+rsyslogd_destructAllActions(void)
+{
+ ruleset.DestructAllActions(runConf);
+ bHaveMainQueue = 0; /* flag that internal messages need to be temporarily stored */
+}
+
+
+/* de-initialize everything, make ready for termination */
+static void
+deinitAll(void)
+{
+ char buf[256];
+
+ DBGPRINTF("exiting on signal %d\n", bFinished);
+
+ /* IMPORTANT: we should close the inputs first, and THEN send our termination
+ * message. If we do it the other way around, logmsgInternal() may block on
+ * a full queue and the inputs still fill up that queue. Depending on the
+ * scheduling order, we may end up with logmsgInternal being held for a quite
+ * long time. When the inputs are terminated first, that should not happen
+ * because the queue is drained in parallel. The situation could only become
+ * an issue with extremely long running actions in a queue full environment.
+ * However, such actions are at least considered poorly written, if not
+ * outright wrong. So we do not care about this very remote problem.
+ * rgerhards, 2008-01-11
+ */
+
+ /* close the inputs */
+ DBGPRINTF("Terminating input threads...\n");
+ glbl.SetGlobalInputTermination();
+ thrdTerminateAll();
+
+ /* and THEN send the termination log message (see long comment above) */
+ if(bFinished && runConf->globals.bLogStatusMsgs) {
+ (void) snprintf(buf, sizeof(buf) / sizeof(char),
+ " [origin software=\"rsyslogd\" " "swVersion=\"" VERSION \
+ "\" x-pid=\"%d\" x-info=\"http://www.rsyslog.com\"]" " exiting on signal %d.",
+ (int) glblGetOurPid(), bFinished);
+ errno = 0;
+ logmsgInternal(NO_ERRCODE, LOG_SYSLOG|LOG_INFO, (uchar*)buf, 0);
+ }
+ /* we sleep for 50ms to give the queue a chance to pick up the exit message;
+ * otherwise we have seen cases where the message did not make it to log
+ * files, even on idle systems.
+ */
+ srSleep(0, 50);
+
+ /* drain queue (if configured so) and stop main queue worker thread pool */
+ DBGPRINTF("Terminating main queue...\n");
+ qqueueDestruct(&pMsgQueue);
+ pMsgQueue = NULL;
+
+ /* Free ressources and close connections. This includes flushing any remaining
+ * repeated msgs.
+ */
+ DBGPRINTF("Terminating outputs...\n");
+ rsyslogd_destructAllActions();
+
+ DBGPRINTF("all primary multi-thread sources have been terminated - now doing aux cleanup...\n");
+
+ DBGPRINTF("destructing current config...\n");
+ rsconf.Destruct(&runConf);
+
+ modExitIminternal();
+
+ if(pInternalInputName != NULL)
+ prop.Destruct(&pInternalInputName);
+
+ /* the following line cleans up CfSysLineHandlers that were not based on loadable
+ * modules. As such, they are not yet cleared. */
+ unregCfSysLineHdlrs();
+
+ /*dbgPrintAllDebugInfo(); / * this is the last spot where this can be done - below output modules are unloaded! */
+
+ syslogd_releaseClassPointers();
+
+ parserClassExit();
+ rsconfClassExit();
+ strExit();
+ ratelimitModExit();
+ dnscacheDeinit();
+ thrdExit();
+
+ module.UnloadAndDestructAll(eMOD_LINK_ALL);
+
+ rsrtExit(); /* runtime MUST always be deinitialized LAST (except for debug system) */
+ DBGPRINTF("Clean shutdown completed, bye\n");
+
+ /* dbgClassExit MUST be the last one, because it de-inits the debug system */
+ dbgClassExit();
+
+ /* NO CODE HERE - dbgClassExit() must be the last thing before exit()! */
+ syslogd_die();
+}
+
+/* This is the main entry point into rsyslogd. This must be a function in its own
+ * right in order to intialize the debug system in a portable way (otherwise we would
+ * need to have a statement before variable definitions.
+ * rgerhards, 20080-01-28
+ */
+int
+main(int argc, char **argv)
+{
+ dbgClassInit();
+ initAll(argc, argv);
+ sd_notify(0, "READY=1");
+
+ mainloop();
+ deinitAll();
+ return 0;
+}
diff --git a/tools/smfile.c b/tools/smfile.c
index e1e8c01..71f3d8b 100644
--- a/tools/smfile.c
+++ b/tools/smfile.c
@@ -12,24 +12,23 @@
*
* File begun on 2010-06-01 by RGerhards
*
- * Copyright 2010-2013 Rainer Gerhards and Adiscon GmbH.
+ * Copyright 2010-2014 Rainer Gerhards and Adiscon GmbH.
*
* This file is part of rsyslog.
*
- * Rsyslog is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Rsyslog is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Rsyslog. If not, see <http://www.gnu.org/licenses/>.
- *
- * A copy of the GPL can be found in the file "COPYING" in this distribution.
+ * 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"
diff --git a/tools/smfile.h b/tools/smfile.h
index 10946db..893a951 100644
--- a/tools/smfile.h
+++ b/tools/smfile.h
@@ -3,24 +3,23 @@
*
* File begun on 2010-06-04 by RGerhards
*
- * Copyright 2010 Rainer Gerhards and Adiscon GmbH.
+ * Copyright 2010-2014 Rainer Gerhards and Adiscon GmbH.
*
* This file is part of rsyslog.
*
- * Rsyslog is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Rsyslog is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Rsyslog. If not, see <http://www.gnu.org/licenses/>.
- *
- * A copy of the GPL can be found in the file "COPYING" in this distribution.
+ * 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.
*/
#ifndef SMFILE_H_INCLUDED
#define SMFILE_H_INCLUDED 1
diff --git a/tools/smfwd.c b/tools/smfwd.c
index e9b30ac..62bf7fe 100644
--- a/tools/smfwd.c
+++ b/tools/smfwd.c
@@ -9,24 +9,23 @@
*
* File begun on 2010-06-01 by RGerhards
*
- * Copyright 2010-2013 Rainer Gerhards and Adiscon GmbH.
+ * Copyright 2010-2014 Rainer Gerhards and Adiscon GmbH.
*
* This file is part of rsyslog.
*
- * Rsyslog is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Rsyslog is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Rsyslog. If not, see <http://www.gnu.org/licenses/>.
- *
- * A copy of the GPL can be found in the file "COPYING" in this distribution.
+ * 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"
diff --git a/tools/smfwd.h b/tools/smfwd.h
index 191a6bf..78bb1e3 100644
--- a/tools/smfwd.h
+++ b/tools/smfwd.h
@@ -2,24 +2,23 @@
*
* File begun on 2010-06-04 by RGerhards
*
- * Copyright 2010 Rainer Gerhards and Adiscon GmbH.
+ * Copyright 2010-2014 Rainer Gerhards and Adiscon GmbH.
*
* This file is part of rsyslog.
*
- * Rsyslog is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Rsyslog is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Rsyslog. If not, see <http://www.gnu.org/licenses/>.
- *
- * A copy of the GPL can be found in the file "COPYING" in this distribution.
+ * 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.
*/
#ifndef SMFWD_H_INCLUDED
#define SMFWD_H_INCLUDED 1
diff --git a/tools/smtradfile.c b/tools/smtradfile.c
index 5239f93..35072aa 100644
--- a/tools/smtradfile.c
+++ b/tools/smtradfile.c
@@ -9,24 +9,23 @@
*
* File begun on 2010-06-01 by RGerhards
*
- * Copyright 2010-2013 Rainer Gerhards and Adiscon GmbH.
+ * Copyright 2010-2014 Rainer Gerhards and Adiscon GmbH.
*
* This file is part of rsyslog.
*
- * Rsyslog is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Rsyslog is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Rsyslog. If not, see <http://www.gnu.org/licenses/>.
- *
- * A copy of the GPL can be found in the file "COPYING" in this distribution.
+ * 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"
diff --git a/tools/smtradfile.h b/tools/smtradfile.h
index afc737e..7f61fdb 100644
--- a/tools/smtradfile.h
+++ b/tools/smtradfile.h
@@ -3,24 +3,23 @@
*
* File begun on 2010-06-01 by RGerhards
*
- * Copyright 2010 Rainer Gerhards and Adiscon GmbH.
+ * Copyright 2010-2014 Rainer Gerhards and Adiscon GmbH.
*
* This file is part of rsyslog.
*
- * Rsyslog is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Rsyslog is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Rsyslog. If not, see <http://www.gnu.org/licenses/>.
- *
- * A copy of the GPL can be found in the file "COPYING" in this distribution.
+ * 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.
*/
#ifndef SMTRADFILE_H_INCLUDED
#define SMTRADFILE_H_INCLUDED 1
diff --git a/tools/smtradfwd.c b/tools/smtradfwd.c
index 284b703..6ffab9b 100644
--- a/tools/smtradfwd.c
+++ b/tools/smtradfwd.c
@@ -9,24 +9,23 @@
*
* File begun on 2010-06-01 by RGerhards
*
- * Copyright 2010-2013 Rainer Gerhards and Adiscon GmbH.
+ * Copyright 2010-2014 Rainer Gerhards and Adiscon GmbH.
*
* This file is part of rsyslog.
*
- * Rsyslog is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Rsyslog is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Rsyslog. If not, see <http://www.gnu.org/licenses/>.
- *
- * A copy of the GPL can be found in the file "COPYING" in this distribution.
+ * 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"
diff --git a/tools/smtradfwd.h b/tools/smtradfwd.h
index 9ff0ab5..7ac6dea 100644
--- a/tools/smtradfwd.h
+++ b/tools/smtradfwd.h
@@ -2,24 +2,23 @@
*
* File begun on 2010-06-04 by RGerhards
*
- * Copyright 2010 Rainer Gerhards and Adiscon GmbH.
+ * Copyright 2010-2014 Rainer Gerhards and Adiscon GmbH.
*
* This file is part of rsyslog.
*
- * Rsyslog is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Rsyslog is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Rsyslog. If not, see <http://www.gnu.org/licenses/>.
- *
- * A copy of the GPL can be found in the file "COPYING" in this distribution.
+ * 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.
*/
#ifndef SMTRADFWD_H_INCLUDED
#define SMTRADFWD_H_INCLUDED 1
diff --git a/tools/syslogd.c b/tools/syslogd.c
index 94ec71e..ec0beb7 100644
--- a/tools/syslogd.c
+++ b/tools/syslogd.c
@@ -1,10 +1,16 @@
/**
- * \brief This is the main file of the rsyslogd daemon.
+ * main rsyslog file with GPLv3 content.
*
- * Please visit the rsyslog project at
+ * *********************** NOTE ************************
+ * * Do no longer patch this file. If there is hard *
+ * * need to, talk to Rainer as to how we can make any *
+ * * patch be licensed under ASL 2.0. *
+ * * THIS FILE WILL GO AWAY. The new main file is *
+ * * rsyslogd.c. *
+ * *****************************************************
*
+ * Please visit the rsyslog project at
* http://www.rsyslog.com
- *
* to learn more about it and discuss any questions you may have.
*
* rsyslog had initially been forked from the sysklogd project.
@@ -18,8 +24,6 @@
* This Project was intiated and is maintained by
* Rainer Gerhards <rgerhards@hq.adiscon.com>.
*
- * For further information, please see http://www.rsyslog.com
- *
* rsyslog - An Enhanced syslogd Replacement.
* Copyright 2003-2014 Rainer Gerhards and Adiscon GmbH.
*
@@ -43,8 +47,6 @@
#include "config.h"
#include "rsyslog.h"
-#define DEFUPRI (LOG_USER|LOG_NOTICE)
-
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
@@ -82,18 +84,11 @@
#endif
#include <signal.h>
-#include <liblogging/stdlog.h>
#if HAVE_PATHS_H
#include <paths.h>
#endif
-#ifdef USE_NETZIP
-#include <zlib.h>
-#endif
-
-extern int yydebug; /* interface to flex */
-
#include <netdb.h>
#include "pidfile.h"
@@ -105,179 +100,82 @@ extern int yydebug; /* interface to flex */
#include "syslogd.h"
#include "msg.h"
-#include "modules.h"
-#include "action.h"
#include "iminternal.h"
-#include "cfsysline.h"
#include "threads.h"
-#include "wti.h"
-#include "queue.h"
-#include "stream.h"
-#include "conf.h"
-#include "errmsg.h"
-#include "datetime.h"
#include "parser.h"
-#include "batch.h"
#include "unicode-helper.h"
-#include "ruleset.h"
#include "net.h"
-#include "prop.h"
-#include "rsconf.h"
#include "dnscache.h"
#include "sd-daemon.h"
-#include "rainerscript.h"
#include "ratelimit.h"
/* definitions for objects we access */
DEFobjCurrIf(obj)
DEFobjCurrIf(glbl)
-DEFobjCurrIf(datetime) /* TODO: make go away! */
-DEFobjCurrIf(conf)
-DEFobjCurrIf(module)
-DEFobjCurrIf(errmsg)
-DEFobjCurrIf(ruleset)
-DEFobjCurrIf(prop)
-DEFobjCurrIf(parser)
-DEFobjCurrIf(rsconf)
DEFobjCurrIf(net) /* TODO: make go away! */
/* forward definitions */
-static rsRetVal GlobalClassExit(void);
-static rsRetVal queryLocalHostname(void);
+rsRetVal queryLocalHostname(void);
+
+/* forward defintions from rsyslogd.c (ASL 2.0 code) */
+extern ratelimit_t *internalMsg_ratelimiter;
+extern uchar *ConfFile;
+extern ratelimit_t *dflt_ratelimiter;
+extern void rsyslogd_usage(void);
+extern rsRetVal rsyslogdInit(void);
+extern void rsyslogd_destructAllActions(void);
+extern void rsyslogd_sigttin_handler();
+void rsyslogd_submitErrMsg(const int severity, const int iErr, const uchar *msg);
+rsRetVal rsyslogd_InitGlobalClasses(void);
+rsRetVal rsyslogd_InitStdRatelimiters(void);
+rsRetVal rsyslogdInit(void);
+void rsyslogdDebugSwitch();
+void rsyslogdDoDie(int sig);
-#ifndef _PATH_LOGCONF
-#define _PATH_LOGCONF "/etc/rsyslog.conf"
-#endif
-
-#ifndef _PATH_MODDIR
-# if defined(__FreeBSD__)
-# define _PATH_MODDIR "/usr/local/lib/rsyslog/"
-# else
-# define _PATH_MODDIR "/lib/rsyslog/"
-# endif
-#endif
-
#if defined(SYSLOGD_PIDNAME)
# undef _PATH_LOGPID
-# if defined(FSSTND)
-# ifdef OS_BSD
-# define _PATH_VARRUN "/var/run/"
-# endif
-# if defined(__sun) || defined(__hpux)
-# define _PATH_VARRUN "/var/run/"
-# endif
-# define _PATH_LOGPID _PATH_VARRUN SYSLOGD_PIDNAME
-# else
-# define _PATH_LOGPID "/etc/" SYSLOGD_PIDNAME
-# endif
+# define _PATH_LOGPID "/etc/" SYSLOGD_PIDNAME
#else
# ifndef _PATH_LOGPID
-# if defined(__sun) || defined(__hpux)
-# define _PATH_VARRUN "/var/run/"
-# endif
-# if defined(FSSTND)
-# define _PATH_LOGPID _PATH_VARRUN "rsyslogd.pid"
-# else
-# define _PATH_LOGPID "/etc/rsyslogd.pid"
-# endif
+# define _PATH_LOGPID "/etc/rsyslogd.pid"
# endif
#endif
#ifndef _PATH_TTY
# define _PATH_TTY "/dev/tty"
#endif
+char *PidFile = _PATH_LOGPID; /* read-only after startup */
-rsconf_t *ourConf; /* our config object */
-
-static prop_t *pInternalInputName = NULL; /* there is only one global inputName for all internally-generated messages */
-static uchar *ConfFile = (uchar*) _PATH_LOGCONF; /* read-only after startup */
-static char *PidFile = _PATH_LOGPID; /* read-only after startup */
-
-/* mypid is read-only after the initial fork() */
-static int bHadHUP = 0; /* did we have a HUP? */
-
-static int bFinished = 0; /* used by termination signal handler, read-only except there
- * is either 0 or the number of the signal that requested the
- * termination.
- */
+int bHadHUP = 0; /* did we have a HUP? */
+int bFinished = 0; /* used by termination signal handler, read-only except there
+ * is either 0 or the number of the signal that requested the
+ * termination.
+ */
int iConfigVerify = 0; /* is this just a config verify run? */
-
-#define LIST_DELIMITER ':' /* delimiter between two hosts */
-
-static pid_t ppid; /* This is a quick and dirty hack used for spliting main/startup thread */
-
-struct queuefilenames_s {
- struct queuefilenames_s *next;
- uchar *name;
-} *queuefilenames = NULL;
-
-
-static ratelimit_t *dflt_ratelimiter = NULL; /* ratelimiter for submits without explicit one */
-static ratelimit_t *internalMsg_ratelimiter = NULL; /* ratelimiter for rsyslog-own messages */
-int MarkInterval = 20 * 60; /* interval between marks in seconds - read-only after startup */
-int send_to_all = 0; /* send message to all IPv4/IPv6 addresses */
-static int doFork = 1; /* fork - run in daemon mode - read-only after startup */
-int bHaveMainQueue = 0;/* set to 1 if the main queue - in queueing mode - is available
- * If the main queue is either not yet ready or not running in
- * queueing mode (mode DIRECT!), then this is set to 0.
- */
-
-extern int errno;
-
-/* main message queue and its configuration parameters */
-qqueue_t *pMsgQueue = NULL; /* the main message queue */
+pid_t ppid; /* This is a quick and dirty hack used for spliting main/startup thread */
+int doFork = 1; /* fork - run in daemon mode - read-only after startup */
/* up to the next comment, prototypes that should be removed by reordering */
/* Function prototypes. */
-static char **crunch_list(char *list);
static void reapchild();
-static void debug_switch();
-static void sighup_handler();
-
-
-static int usage(void)
-{
- fprintf(stderr, "usage: rsyslogd [-46AdnqQvwx] [-l<hostlist>] [-s<domainlist>]\n"
- " [-f<conffile>] [-i<pidfile>] [-N<level>] [-M<module load path>]\n"
- " [-u<number>]\n"
- "For further information see http://www.rsyslog.com/doc\n");
- exit(1); /* "good" exit - done to terminate usage() */
-}
-
-
-/* ------------------------------ some support functions for imdiag ------------------------------ *
- * This is a bit dirty, but the only way to do it, at least with reasonable effort.
- * rgerhards, 2009-05-25
- */
-
-/* return back the approximate current number of messages in the main message queue
- * This number includes the messages that reside in an associated DA queue (if
- * it exists) -- rgerhards, 2009-10-14
- */
-rsRetVal
-diagGetMainMsgQSize(int *piSize)
-{
- DEFiRet;
- assert(piSize != NULL);
- *piSize = (pMsgQueue->pqDA != NULL) ? pMsgQueue->pqDA->iQueueSize : 0;
- *piSize += pMsgQueue->iQueueSize;
- RETiRet;
-}
-
-
-/* ------------------------------ end support functions for imdiag ------------------------------ */
+#define LIST_DELIMITER ':' /* delimiter between two hosts */
/* rgerhards, 2005-10-24: crunch_list is called only during option processing. So
* it is never called once rsyslogd is running. This code
* contains some exits, but they are considered safe because they only happen
* during startup. Anyhow, when we review the code here, we might want to
* reconsider the exit()s.
+ * Note: this stems back to sysklogd, so we cannot put it under ASL 2.0. But
+ * we may want to check if the code inside the BSD sources is exactly the same
+ * (remember that sysklogd forked the BSD sources). If so, the BSD license applies
+ * and permits us to move to ASL 2.0 (but we need to check the fine details).
+ * Probably it is best just to rewrite this code.
*/
-static char **crunch_list(char *list)
+char **syslogd_crunch_list(char *list)
{
int count, i;
char *p, *q;
@@ -330,15 +228,11 @@ static char **crunch_list(char *list)
strcpy(result[count],p);
result[++count] = NULL;
-#if 0
- count=0;
- while (result[count])
- DBGPRINTF("#%d: %s\n", count, StripDomains[count++]);
-#endif
return result;
}
+/* also stems back to sysklogd in whole */
void untty(void)
#ifdef HAVE_SETSID
{
@@ -353,11 +247,13 @@ void untty(void)
pid_t pid;
if(!Debug) {
+ /* Peng Haitao <penght@cn.fujitsu.com> contribution */
pid = getpid();
if (setpgid(pid, pid) < 0) {
perror("setpgid");
exit(1);
}
+ /* end Peng Haitao <penght@cn.fujitsu.com> contribution */
i = open(_PATH_TTY, O_RDWR|O_CLOEXEC);
if (i >= 0) {
@@ -375,324 +271,7 @@ void untty(void)
}
#endif
-
-/* This takes a received message that must be decoded and submits it to
- * the main message queue. This is a legacy function which is being provided
- * to aid older input plugins that do not support message creation via
- * the new interfaces themselves. It is not recommended to use this
- * function for new plugins. -- rgerhards, 2009-10-12
- */
-rsRetVal
-parseAndSubmitMessage(uchar *hname, uchar *hnameIP, uchar *msg, int len, int flags, flowControl_t flowCtlType,
- prop_t *pInputName, struct syslogTime *stTime, time_t ttGenTime, ruleset_t *pRuleset)
-{
- prop_t *pProp = NULL;
- msg_t *pMsg;
- DEFiRet;
-
- /* we now create our own message object and submit it to the queue */
- if(stTime == NULL) {
- CHKiRet(msgConstruct(&pMsg));
- } else {
- CHKiRet(msgConstructWithTime(&pMsg, stTime, ttGenTime));
- }
- if(pInputName != NULL)
- MsgSetInputName(pMsg, pInputName);
- MsgSetRawMsg(pMsg, (char*)msg, len);
- MsgSetFlowControlType(pMsg, flowCtlType);
- MsgSetRuleset(pMsg, pRuleset);
- pMsg->msgFlags = flags | NEEDS_PARSING;
-
- MsgSetRcvFromStr(pMsg, hname, ustrlen(hname), &pProp);
- CHKiRet(prop.Destruct(&pProp));
- CHKiRet(MsgSetRcvFromIPStr(pMsg, hnameIP, ustrlen(hnameIP), &pProp));
- CHKiRet(prop.Destruct(&pProp));
- CHKiRet(submitMsg2(pMsg));
-
-finalize_it:
- RETiRet;
-}
-
-
-/* this is a special function used to submit an error message. This
- * function is also passed to the runtime library as the generic error
- * message handler. -- rgerhards, 2008-04-17
- */
-void
-submitErrMsg(const int severity, const int iErr, const uchar *msg)
-{
- logmsgInternal(iErr, LOG_SYSLOG|(severity & 0x07), msg, 0);
-}
-
-
-static inline rsRetVal
-submitMsgWithDfltRatelimiter(msg_t *pMsg)
-{
- return ratelimitAddMsg(dflt_ratelimiter, NULL, pMsg);
-}
-
-/* This function logs a message to rsyslog itself, using its own
- * internal structures. This means external programs (like the
- * system journal) will never see this message.
- */
-static rsRetVal
-logmsgInternalSelf(const int iErr, const int pri, const size_t lenMsg,
- const char *__restrict__ const msg, int flags)
-{
- uchar pszTag[33];
- msg_t *pMsg;
- DEFiRet;
-
- CHKiRet(msgConstruct(&pMsg));
- MsgSetInputName(pMsg, pInternalInputName);
- MsgSetRawMsg(pMsg, (char*)msg, lenMsg);
- MsgSetHOSTNAME(pMsg, glbl.GetLocalHostName(), ustrlen(glbl.GetLocalHostName()));
- MsgSetRcvFrom(pMsg, glbl.GetLocalHostNameProp());
- MsgSetRcvFromIP(pMsg, glbl.GetLocalHostIP());
- MsgSetMSGoffs(pMsg, 0);
- /* check if we have an error code associated and, if so,
- * adjust the tag. -- rgerhards, 2008-06-27
- */
- if(iErr == NO_ERRCODE) {
- MsgSetTAG(pMsg, UCHAR_CONSTANT("rsyslogd:"), sizeof("rsyslogd:") - 1);
- } else {
- size_t len = snprintf((char*)pszTag, sizeof(pszTag), "rsyslogd%d:", iErr);
- pszTag[32] = '\0'; /* just to make sure... */
- MsgSetTAG(pMsg, pszTag, len);
- }
- pMsg->iFacility = LOG_FAC(pri);
- pMsg->iSeverity = LOG_PRI(pri);
- flags |= INTERNAL_MSG;
- pMsg->msgFlags = flags;
-
- if(bHaveMainQueue == 0) { /* not yet in queued mode */
- iminternalAddMsg(pMsg);
- } else {
- /* we have the queue, so we can simply provide the
- * message to the queue engine.
- */
- ratelimitAddMsg(internalMsg_ratelimiter, NULL, pMsg);
- }
-finalize_it:
- RETiRet;
-}
-
-
-/* rgerhards 2004-11-09: the following is a function that can be used
- * to log a message orginating from the syslogd itself.
- */
-rsRetVal
-logmsgInternal(int iErr, int pri, const uchar *const msg, int flags)
-{
- size_t lenMsg;
- unsigned i;
- char *bufModMsg = NULL; /* buffer for modified message, should we need to modify */
- DEFiRet;
-
- /* we first do a path the remove control characters that may have accidently
- * introduced (program error!). This costs performance, but we do not expect
- * to be called very frequently in any case ;) -- rgerhards, 2013-12-19.
- */
- lenMsg = ustrlen(msg);
- for(i = 0 ; i < lenMsg ; ++i) {
- if(msg[i] < 0x20 || msg[i] == 0x7f) {
- if(bufModMsg == NULL) {
- CHKmalloc(bufModMsg = strdup((char*) msg));
- }
- bufModMsg[i] = ' ';
- }
- }
-
- if(bProcessInternalMessages) {
- CHKiRet(logmsgInternalSelf(iErr, pri, lenMsg,
- (bufModMsg == NULL) ? (char*)msg : bufModMsg,
- flags));
- } else {
- stdlog_log(stdlog_hdl, LOG_PRI(pri), "%s",
- (bufModMsg == NULL) ? (char*)msg : bufModMsg);
- }
-
- /* we now check if we should print internal messages out to stderr. This was
- * suggested by HKS as a way to help people troubleshoot rsyslog configuration
- * (by running it interactively. This makes an awful lot of sense, so I add
- * it here. -- rgerhards, 2008-07-28
- * Note that error messages can not be disabled during a config verify. This
- * permits us to process unmodified config files which otherwise contain a
- * supressor statement.
- */
- if(((Debug == DEBUG_FULL || !doFork) && ourConf->globals.bErrMsgToStderr) || iConfigVerify) {
- if(LOG_PRI(pri) == LOG_ERR)
- fprintf(stderr, "rsyslogd: %s\n", (bufModMsg == NULL) ? (char*)msg : bufModMsg);
- }
-
-finalize_it:
- free(bufModMsg);
- RETiRet;
-}
-
-
-/* preprocess a batch of messages, that is ready them for actual processing. This is done
- * as a first stage and totally in parallel to any other worker active in the system. So
- * it helps us keep up the overall concurrency level.
- * rgerhards, 2010-06-09
- */
-static inline rsRetVal
-preprocessBatch(batch_t *pBatch, int *pbShutdownImmediate) {
- prop_t *ip;
- prop_t *fqdn;
- prop_t *localName;
- prop_t *propFromHost = NULL;
- prop_t *propFromHostIP = NULL;
- int bIsPermitted;
- msg_t *pMsg;
- int i;
- rsRetVal localRet;
- DEFiRet;
-
- for(i = 0 ; i < pBatch->nElem && !*pbShutdownImmediate ; i++) {
- pMsg = pBatch->pElem[i].pMsg;
- if((pMsg->msgFlags & NEEDS_ACLCHK_U) != 0) {
- DBGPRINTF("msgConsumer: UDP ACL must be checked for message (hostname-based)\n");
- if(net.cvthname(pMsg->rcvFrom.pfrominet, &localName, &fqdn, &ip) != RS_RET_OK)
- continue;
- bIsPermitted = net.isAllowedSender2((uchar*)"UDP",
- (struct sockaddr *)pMsg->rcvFrom.pfrominet, (char*)propGetSzStr(fqdn), 1);
- if(!bIsPermitted) {
- DBGPRINTF("Message from '%s' discarded, not a permitted sender host\n",
- propGetSzStr(fqdn));
- pBatch->eltState[i] = BATCH_STATE_DISC;
- } else {
- /* save some of the info we obtained */
- MsgSetRcvFrom(pMsg, localName);
- CHKiRet(MsgSetRcvFromIP(pMsg, ip));
- pMsg->msgFlags &= ~NEEDS_ACLCHK_U;
- }
- }
- if((pMsg->msgFlags & NEEDS_PARSING) != 0) {
- if((localRet = parser.ParseMsg(pMsg)) != RS_RET_OK) {
- DBGPRINTF("Message discarded, parsing error %d\n", localRet);
- pBatch->eltState[i] = BATCH_STATE_DISC;
- }
- }
- }
-
-finalize_it:
- if(propFromHost != NULL)
- prop.Destruct(&propFromHost);
- if(propFromHostIP != NULL)
- prop.Destruct(&propFromHostIP);
- RETiRet;
-}
-
-/* The consumer of dequeued messages. This function is called by the
- * queue engine on dequeueing of a message. It runs on a SEPARATE
- * THREAD. It receives an array of pointers, which it must iterate
- * over. We do not do any further batching, as this is of no benefit
- * for the main queue.
- */
-static rsRetVal
-msgConsumer(void __attribute__((unused)) *notNeeded, batch_t *pBatch, wti_t *pWti)
-{
- DEFiRet;
- assert(pBatch != NULL);
- preprocessBatch(pBatch, pWti->pbShutdownImmediate);
- ruleset.ProcessBatch(pBatch, pWti);
-//TODO: the BATCH_STATE_COMM must be set somewhere down the road, but we
-//do not have this yet and so we emulate -- 2010-06-10
-int i;
- for(i = 0 ; i < pBatch->nElem && !*pWti->pbShutdownImmediate ; i++) {
- pBatch->eltState[i] = BATCH_STATE_COMM;
- }
- RETiRet;
-}
-
-
-/* submit a message to the main message queue. This is primarily
- * a hook to prevent the need for callers to know about the main message queue
- * rgerhards, 2008-02-13
- */
-rsRetVal
-submitMsg2(msg_t *pMsg)
-{
- qqueue_t *pQueue;
- ruleset_t *pRuleset;
- DEFiRet;
-
- ISOBJ_TYPE_assert(pMsg, msg);
-
- pRuleset = MsgGetRuleset(pMsg);
- pQueue = (pRuleset == NULL) ? pMsgQueue : ruleset.GetRulesetQueue(pRuleset);
-
- /* if a plugin logs a message during shutdown, the queue may no longer exist */
- if(pQueue == NULL) {
- DBGPRINTF("submitMsg2() could not submit message - "
- "queue does (no longer?) exist - ignored\n");
- FINALIZE;
- }
-
- qqueueEnqMsg(pQueue, pMsg->flowCtlType, pMsg);
-
-finalize_it:
- RETiRet;
-}
-
-rsRetVal
-submitMsg(msg_t *pMsg)
-{
- return submitMsgWithDfltRatelimiter(pMsg);
-}
-
-
-/* submit multiple messages at once, very similar to submitMsg, just
- * for multi_submit_t. All messages need to go into the SAME queue!
- * rgerhards, 2009-06-16
- */
-rsRetVal
-multiSubmitMsg2(multi_submit_t *pMultiSub)
-{
- qqueue_t *pQueue;
- ruleset_t *pRuleset;
- DEFiRet;
- assert(pMultiSub != NULL);
-
- if(pMultiSub->nElem == 0)
- FINALIZE;
-
- pRuleset = MsgGetRuleset(pMultiSub->ppMsgs[0]);
- pQueue = (pRuleset == NULL) ? pMsgQueue : ruleset.GetRulesetQueue(pRuleset);
-
- /* if a plugin logs a message during shutdown, the queue may no longer exist */
- if(pQueue == NULL) {
- DBGPRINTF("multiSubmitMsg() could not submit message - "
- "queue does (no longer?) exist - ignored\n");
- FINALIZE;
- }
-
- iRet = pQueue->MultiEnq(pQueue, pMultiSub);
- pMultiSub->nElem = 0;
-
-finalize_it:
- RETiRet;
-}
-rsRetVal
-multiSubmitMsg(multi_submit_t *pMultiSub) /* backward compat. level */
-{
- return multiSubmitMsg2(pMultiSub);
-}
-
-
-/* flush multiSubmit, e.g. at end of read records */
-rsRetVal
-multiSubmitFlush(multi_submit_t *pMultiSub)
-{
- DEFiRet;
- if(pMultiSub->nElem > 0) {
- iRet = multiSubmitMsg2(pMultiSub);
- }
- RETiRet;
-}
-
-
+/* function stems back to sysklogd */
static void
reapchild()
{
@@ -709,185 +288,12 @@ reapchild()
}
-static void debug_switch()
-{
- time_t tTime;
- struct tm tp;
- struct sigaction sigAct;
-
- datetime.GetTime(&tTime);
- localtime_r(&tTime, &tp);
- if(debugging_on == 0) {
- debugging_on = 1;
- dbgprintf("\n");
- dbgprintf("\n");
- dbgprintf("********************************************************************************\n");
- dbgprintf("Switching debugging_on to true at %2.2d:%2.2d:%2.2d\n",
- tp.tm_hour, tp.tm_min, tp.tm_sec);
- dbgprintf("********************************************************************************\n");
- } else {
- dbgprintf("********************************************************************************\n");
- dbgprintf("Switching debugging_on to false at %2.2d:%2.2d:%2.2d\n",
- tp.tm_hour, tp.tm_min, tp.tm_sec);
- dbgprintf("********************************************************************************\n");
- dbgprintf("\n");
- dbgprintf("\n");
- debugging_on = 0;
- }
- memset(&sigAct, 0, sizeof (sigAct));
- sigemptyset(&sigAct.sa_mask);
- sigAct.sa_handler = debug_switch;
- sigaction(SIGUSR1, &sigAct, NULL);
-}
-
-
-/* doDie() is a signal handler. If called, it sets the bFinished variable
- * to indicate the program should terminate. However, it does not terminate
- * it itself, because that causes issues with multi-threading. The actual
- * termination is then done on the main thread. This solution might introduce
- * a minimal delay, but it is much cleaner than the approach of doing everything
- * inside the signal handler.
- * rgerhards, 2005-10-26
- * Note:
- * - we do not call DBGPRINTF() as this may cause us to block in case something
- * with the threading is wrong.
- * - we do not really care about the return state of write(), but we need this
- * strange check we do to silence compiler warnings (thanks, Ubuntu!)
- */
-static void doDie(int sig)
-{
-# define MSG1 "DoDie called.\n"
-# define MSG2 "DoDie called 5 times - unconditional exit\n"
- static int iRetries = 0; /* debug aid */
- dbgprintf(MSG1);
- if(Debug == DEBUG_FULL) {
- if(write(1, MSG1, sizeof(MSG1) - 1)) {}
- }
- if(iRetries++ == 4) {
- if(Debug == DEBUG_FULL) {
- if(write(1, MSG2, sizeof(MSG2) - 1)) {}
- }
- abort();
- }
- bFinished = sig;
- if(glblDebugOnShutdown) {
- /* kind of hackish - set to 0, so that debug_swith will enable
- * and AND emit the "start debug log" message.
- */
- debugging_on = 0;
- debug_switch();
- }
-# undef MSG1
-# undef MSG2
-}
-
-
-/* Finalize and destruct all actions.
- */
-static inline void
-destructAllActions(void)
-{
- ruleset.DestructAllActions(runConf);
- bHaveMainQueue = 0; // flag that internal messages need to be temporarily stored
-}
-
-
-/* die() is called when the program shall end. This typically only occurs
- * during sigterm or during the initialization.
- * As die() is intended to shutdown rsyslogd, it is
- * safe to call exit() here. Just make sure that die() itself is not called
- * at inapropriate places. As a general rule of thumb, it is a bad idea to add
- * any calls to die() in new code!
- * rgerhards, 2005-10-24
- */
-static void
-die(int sig)
+/* GPL code - maybe check BSD sources? */
+void
+syslogd_die(void)
{
- char buf[256];
-
- DBGPRINTF("exiting on signal %d\n", sig);
-
- /* IMPORTANT: we should close the inputs first, and THEN send our termination
- * message. If we do it the other way around, logmsgInternal() may block on
- * a full queue and the inputs still fill up that queue. Depending on the
- * scheduling order, we may end up with logmsgInternal being held for a quite
- * long time. When the inputs are terminated first, that should not happen
- * because the queue is drained in parallel. The situation could only become
- * an issue with extremely long running actions in a queue full environment.
- * However, such actions are at least considered poorly written, if not
- * outright wrong. So we do not care about this very remote problem.
- * rgerhards, 2008-01-11
- */
-
- /* close the inputs */
- DBGPRINTF("Terminating input threads...\n");
- glbl.SetGlobalInputTermination();
- thrdTerminateAll();
-
- /* and THEN send the termination log message (see long comment above) */
- if(sig && runConf->globals.bLogStatusMsgs) {
- (void) snprintf(buf, sizeof(buf) / sizeof(char),
- " [origin software=\"rsyslogd\" " "swVersion=\"" VERSION \
- "\" x-pid=\"%d\" x-info=\"http://www.rsyslog.com\"]" " exiting on signal %d.",
- (int) glblGetOurPid(), sig);
- errno = 0;
- logmsgInternal(NO_ERRCODE, LOG_SYSLOG|LOG_INFO, (uchar*)buf, 0);
- }
- /* we sleep for 50ms to give the queue a chance to pick up the exit message;
- * otherwise we have seen cases where the message did not make it to log
- * files, even on idle systems.
- */
- srSleep(0, 50);
-
- /* drain queue (if configured so) and stop main queue worker thread pool */
- DBGPRINTF("Terminating main queue...\n");
- qqueueDestruct(&pMsgQueue);
- pMsgQueue = NULL;
-
- /* Free ressources and close connections. This includes flushing any remaining
- * repeated msgs.
- */
- DBGPRINTF("Terminating outputs...\n");
- destructAllActions();
-
- DBGPRINTF("all primary multi-thread sources have been terminated - now doing aux cleanup...\n");
-
- DBGPRINTF("destructing current config...\n");
- rsconf.Destruct(&runConf);
-
- /* rger 2005-02-22
- * now clean up the in-memory structures. OK, the OS
- * would also take care of that, but if we do it
- * ourselfs, this makes finding memory leaks a lot
- * easier.
- */
- /* de-init some modules */
- modExitIminternal();
-
- /*dbgPrintAllDebugInfo(); / * this is the last spot where this can be done - below output modules are unloaded! */
-
- /* the following line cleans up CfSysLineHandlers that were not based on loadable
- * modules. As such, they are not yet cleared.
- */
- unregCfSysLineHdlrs();
-
- /* destruct our global properties */
- if(pInternalInputName != NULL)
- prop.Destruct(&pInternalInputName);
-
- /* terminate the remaining classes */
- GlobalClassExit();
-
- module.UnloadAndDestructAll(eMOD_LINK_ALL);
-
- DBGPRINTF("Clean shutdown completed, bye\n");
- /* dbgClassExit MUST be the last one, because it de-inits the debug system */
- dbgClassExit();
-
- /* NO CODE HERE - dbgClassExit() must be the last thing before exit()! */
remove_pid(PidFile);
- exit(0); /* "good" exit, this is the terminator function for rsyslog [die()] */
}
/*
@@ -900,323 +306,6 @@ static void doexit()
exit(0); /* "good" exit, only during child-creation */
}
-#if 0 /* TODO: re-enable, currently not used */
-/* helper to generateConfigDAG, to print out all actions via
- * the llExecFunc() facility.
- * rgerhards, 2007-08-02
- */
-struct dag_info {
- FILE *fp; /* output file */
- int iActUnit; /* current action unit number */
- int iAct; /* current action in unit */
- int bDiscarded; /* message discarded (config error) */
- };
-DEFFUNC_llExecFunc(generateConfigDAGAction)
-{
- action_t *pAction;
- uchar *pszModName;
- uchar *pszVertexName;
- struct dag_info *pDagInfo;
- DEFiRet;
-
- pDagInfo = (struct dag_info*) pParam;
- pAction = (action_t*) pData;
-
- pszModName = module.GetStateName(pAction->pMod);
-
- /* vertex */
- if(pAction->pszName == NULL) {
- if(!strcmp((char*)pszModName, "builtin-discard"))
- pszVertexName = (uchar*)"discard";
- else
- pszVertexName = pszModName;
- } else {
- pszVertexName = pAction->pszName;
- }
-
- fprintf(pDagInfo->fp, "\tact%d_%d\t\t[label=\"%s\"%s%s]\n",
- pDagInfo->iActUnit, pDagInfo->iAct, pszVertexName,
- pDagInfo->bDiscarded ? " style=dotted color=red" : "",
- (pAction->pQueue->qType == QUEUETYPE_DIRECT) ? "" : " shape=hexagon"
- );
-
- /* edge */
- if(pDagInfo->iAct == 0) {
- } else {
- fprintf(pDagInfo->fp, "\tact%d_%d -> act%d_%d[%s%s]\n",
- pDagInfo->iActUnit, pDagInfo->iAct - 1,
- pDagInfo->iActUnit, pDagInfo->iAct,
- pDagInfo->bDiscarded ? " style=dotted color=red" : "",
- pAction->bExecWhenPrevSusp ? " label=\"only if\\nsuspended\"" : "" );
- }
-
- /* check for discard */
- if(!strcmp((char*) pszModName, "builtin-discard")) {
- fprintf(pDagInfo->fp, "\tact%d_%d\t\t[shape=box]\n",
- pDagInfo->iActUnit, pDagInfo->iAct);
- pDagInfo->bDiscarded = 1;
- }
-
-
- ++pDagInfo->iAct;
-
- RETiRet;
-}
-
-
-/* create config DAG
- * This functions takes a rsyslog config and produces a .dot file for use
- * with graphviz (http://www.graphviz.org). This is done in an effort to
- * document, and also potentially troubleshoot, configurations. Plus, I
- * consider it a nice feature to explain some concepts. Note that the
- * current version only produces a graph with relatively little information.
- * This is a foundation that may be later expanded (if it turns out to be
- * useful enough).
- * rgerhards, 2009-05-11
- */
-static rsRetVal
-generateConfigDAG(uchar *pszDAGFile)
-{
- //rule_t *f;
- FILE *fp;
- int iActUnit = 1;
- //int bHasFilter = 0; /* filter associated with this action unit? */
- //int bHadFilter;
- //int i;
- struct dag_info dagInfo;
- //char *pszFilterName;
- char szConnectingNode[64];
- DEFiRet;
-
- assert(pszDAGFile != NULL);
-
- logmsgInternal(NO_ERRCODE, LOG_SYSLOG|LOG_INFO, (uchar*)
- "Configuration graph generation is unfortunately disabled "
- "in the current code base.", 0);
- ABORT_FINALIZE(RS_RET_FILENAME_INVALID);
-
- if((fp = fopen((char*) pszDAGFile, "w")) == NULL) {
- logmsgInternal(NO_ERRCODE, LOG_SYSLOG|LOG_INFO, (uchar*)
- "configuraton graph output file could not be opened, none generated", 0);
- ABORT_FINALIZE(RS_RET_FILENAME_INVALID);
- }
-
- dagInfo.fp = fp;
-
- /* from here on, we assume writes go well. This here is a really
- * unimportant utility function and if something goes wrong, it has
- * almost no effect. So let's not overdo this...
- */
- fprintf(fp, "# graph created by rsyslog " VERSION "\n\n"
- "# use the dot tool from http://www.graphviz.org to visualize!\n"
- "digraph rsyslogConfig {\n"
- "\tinputs [shape=tripleoctagon]\n"
- "\tinputs -> act0_0\n"
- "\tact0_0 [label=\"main\\nqueue\" shape=hexagon]\n"
- /*"\tmainq -> act1_0\n"*/
- );
- strcpy(szConnectingNode, "act0_0");
- dagInfo.bDiscarded = 0;
-
-/* TODO: re-enable! */
-#if 0
- for(f = Files; f != NULL ; f = f->f_next) {
- /* BSD-Style filters are currently ignored */
- bHadFilter = bHasFilter;
- if(f->f_filter_type == FILTER_PRI) {
- bHasFilter = 0;
- for (i = 0; i <= LOG_NFACILITIES; i++)
- if (f->f_filterData.f_pmask[i] != 0xff) {
- bHasFilter = 1;
- break;
- }
- } else {
- bHasFilter = 1;
- }
-
- /* we know we have a filter, so it can be false */
- switch(f->f_filter_type) {
- case FILTER_PRI:
- pszFilterName = "pri filter";
- break;
- case FILTER_PROP:
- pszFilterName = "property filter";
- break;
- case FILTER_EXPR:
- pszFilterName = "script filter";
- break;
- }
-
- /* write action unit node */
- if(bHasFilter) {
- fprintf(fp, "\t%s -> act%d_end\t[label=\"%s:\\nfalse\"]\n",
- szConnectingNode, iActUnit, pszFilterName);
- fprintf(fp, "\t%s -> act%d_0\t[label=\"%s:\\ntrue\"]\n",
- szConnectingNode, iActUnit, pszFilterName);
- fprintf(fp, "\tact%d_end\t\t\t\t[shape=point]\n", iActUnit);
- snprintf(szConnectingNode, sizeof(szConnectingNode), "act%d_end", iActUnit);
- } else {
- fprintf(fp, "\t%s -> act%d_0\t[label=\"no filter\"]\n",
- szConnectingNode, iActUnit);
- snprintf(szConnectingNode, sizeof(szConnectingNode), "act%d_0", iActUnit);
- }
-
- /* draw individual nodes */
- dagInfo.iActUnit = iActUnit;
- dagInfo.iAct = 0;
- dagInfo.bDiscarded = 0;
- llExecFunc(&f->llActList, generateConfigDAGAction, &dagInfo); /* actions */
-
- /* finish up */
- if(bHasFilter && !dagInfo.bDiscarded) {
- fprintf(fp, "\tact%d_%d -> %s\n",
- iActUnit, dagInfo.iAct - 1, szConnectingNode);
- }
-
- ++iActUnit;
- }
-#endif
-
- fprintf(fp, "\t%s -> act%d_0\n", szConnectingNode, iActUnit);
- fprintf(fp, "\tact%d_0\t\t[label=discard shape=box]\n"
- "}\n", iActUnit);
- fclose(fp);
-
-finalize_it:
- RETiRet;
-}
-#endif
-
-
-/* create a main message queue, now also used for ruleset queues. This function
- * needs to be moved to some other module, but it is considered acceptable for
- * the time being (remember that we want to restructure config processing at large!).
- * rgerhards, 2009-10-27
- */
-rsRetVal createMainQueue(qqueue_t **ppQueue, uchar *pszQueueName, struct nvlst *lst)
-{
- struct queuefilenames_s *qfn;
- uchar *qfname = NULL;
- static int qfn_renamenum = 0;
- uchar qfrenamebuf[1024];
- DEFiRet;
-
- /* create message queue */
- CHKiRet_Hdlr(qqueueConstruct(ppQueue, ourConf->globals.mainQ.MainMsgQueType, ourConf->globals.mainQ.iMainMsgQueueNumWorkers, ourConf->globals.mainQ.iMainMsgQueueSize, msgConsumer)) {
- /* no queue is fatal, we need to give up in that case... */
- errmsg.LogError(0, iRet, "could not create (ruleset) main message queue"); \
- }
- /* name our main queue object (it's not fatal if it fails...) */
- obj.SetName((obj_t*) (*ppQueue), pszQueueName);
-
- if(lst == NULL) { /* use legacy parameters? */
- /* ... set some properties ... */
- # define setQPROP(func, directive, data) \
- CHKiRet_Hdlr(func(*ppQueue, data)) { \
- errmsg.LogError(0, NO_ERRCODE, "Invalid " #directive ", error %d. Ignored, running with default setting", iRet); \
- }
- # define setQPROPstr(func, directive, data) \
- CHKiRet_Hdlr(func(*ppQueue, data, (data == NULL)? 0 : strlen((char*) data))) { \
- errmsg.LogError(0, NO_ERRCODE, "Invalid " #directive ", error %d. Ignored, running with default setting", iRet); \
- }
-
- if(ourConf->globals.mainQ.pszMainMsgQFName != NULL) {
- /* check if the queue file name is unique, else emit an error */
- for(qfn = queuefilenames ; qfn != NULL ; qfn = qfn->next) {
- dbgprintf("check queue file name '%s' vs '%s'\n", qfn->name, ourConf->globals.mainQ.pszMainMsgQFName );
- if(!ustrcmp(qfn->name, ourConf->globals.mainQ.pszMainMsgQFName)) {
- snprintf((char*)qfrenamebuf, sizeof(qfrenamebuf), "%d-%s-%s",
- ++qfn_renamenum, ourConf->globals.mainQ.pszMainMsgQFName,
- (pszQueueName == NULL) ? "NONAME" : (char*)pszQueueName);
- qfname = ustrdup(qfrenamebuf);
- errmsg.LogError(0, NO_ERRCODE, "Error: queue file name '%s' already in use "
- " - using '%s' instead", ourConf->globals.mainQ.pszMainMsgQFName, qfname);
- break;
- }
- }
- if(qfname == NULL)
- qfname = ustrdup(ourConf->globals.mainQ.pszMainMsgQFName);
- qfn = malloc(sizeof(struct queuefilenames_s));
- qfn->name = qfname;
- qfn->next = queuefilenames;
- queuefilenames = qfn;
- }
-
- setQPROP(qqueueSetMaxFileSize, "$MainMsgQueueFileSize", ourConf->globals.mainQ.iMainMsgQueMaxFileSize);
- setQPROP(qqueueSetsizeOnDiskMax, "$MainMsgQueueMaxDiskSpace", ourConf->globals.mainQ.iMainMsgQueMaxDiskSpace);
- setQPROP(qqueueSetiDeqBatchSize, "$MainMsgQueueDequeueBatchSize", ourConf->globals.mainQ.iMainMsgQueDeqBatchSize);
- setQPROPstr(qqueueSetFilePrefix, "$MainMsgQueueFileName", qfname);
- setQPROP(qqueueSetiPersistUpdCnt, "$MainMsgQueueCheckpointInterval", ourConf->globals.mainQ.iMainMsgQPersistUpdCnt);
- setQPROP(qqueueSetbSyncQueueFiles, "$MainMsgQueueSyncQueueFiles", ourConf->globals.mainQ.bMainMsgQSyncQeueFiles);
- setQPROP(qqueueSettoQShutdown, "$MainMsgQueueTimeoutShutdown", ourConf->globals.mainQ.iMainMsgQtoQShutdown );
- setQPROP(qqueueSettoActShutdown, "$MainMsgQueueTimeoutActionCompletion", ourConf->globals.mainQ.iMainMsgQtoActShutdown);
- setQPROP(qqueueSettoWrkShutdown, "$MainMsgQueueWorkerTimeoutThreadShutdown", ourConf->globals.mainQ.iMainMsgQtoWrkShutdown);
- setQPROP(qqueueSettoEnq, "$MainMsgQueueTimeoutEnqueue", ourConf->globals.mainQ.iMainMsgQtoEnq);
- setQPROP(qqueueSetiHighWtrMrk, "$MainMsgQueueHighWaterMark", ourConf->globals.mainQ.iMainMsgQHighWtrMark);
- setQPROP(qqueueSetiLowWtrMrk, "$MainMsgQueueLowWaterMark", ourConf->globals.mainQ.iMainMsgQLowWtrMark);
- setQPROP(qqueueSetiDiscardMrk, "$MainMsgQueueDiscardMark", ourConf->globals.mainQ.iMainMsgQDiscardMark);
- setQPROP(qqueueSetiDiscardSeverity, "$MainMsgQueueDiscardSeverity", ourConf->globals.mainQ.iMainMsgQDiscardSeverity);
- setQPROP(qqueueSetiMinMsgsPerWrkr, "$MainMsgQueueWorkerThreadMinimumMessages", ourConf->globals.mainQ.iMainMsgQWrkMinMsgs);
- setQPROP(qqueueSetbSaveOnShutdown, "$MainMsgQueueSaveOnShutdown", ourConf->globals.mainQ.bMainMsgQSaveOnShutdown);
- setQPROP(qqueueSetiDeqSlowdown, "$MainMsgQueueDequeueSlowdown", ourConf->globals.mainQ.iMainMsgQDeqSlowdown);
- setQPROP(qqueueSetiDeqtWinFromHr, "$MainMsgQueueDequeueTimeBegin", ourConf->globals.mainQ.iMainMsgQueueDeqtWinFromHr);
- setQPROP(qqueueSetiDeqtWinToHr, "$MainMsgQueueDequeueTimeEnd", ourConf->globals.mainQ.iMainMsgQueueDeqtWinToHr);
-
- # undef setQPROP
- # undef setQPROPstr
- } else { /* use new style config! */
- qqueueSetDefaultsRulesetQueue(*ppQueue);
- qqueueApplyCnfParam(*ppQueue, lst);
- }
- RETiRet;
-}
-
-rsRetVal
-startMainQueue(qqueue_t *pQueue)
-{
- DEFiRet;
- CHKiRet_Hdlr(qqueueStart(pQueue)) {
- /* no queue is fatal, we need to give up in that case... */
- errmsg.LogError(0, iRet, "could not start (ruleset) main message queue"); \
- }
- RETiRet;
-}
-
-
-/* INIT -- Initialize syslogd
- * Note that if iConfigVerify is set, only the config file is verified but nothing
- * else happens. -- rgerhards, 2008-07-28
- */
-static rsRetVal
-init(void)
-{
- char bufStartUpMsg[512];
- struct sigaction sigAct;
- DEFiRet;
-
- memset(&sigAct, 0, sizeof (sigAct));
- sigemptyset(&sigAct.sa_mask);
- sigAct.sa_handler = sighup_handler;
- sigaction(SIGHUP, &sigAct, NULL);
-
- CHKiRet(rsconf.Activate(ourConf));
- DBGPRINTF(" started.\n");
-
- /* we now generate the startup message. It now includes everything to
- * identify this instance. -- rgerhards, 2005-08-17
- */
- if(ourConf->globals.bLogStatusMsgs) {
- snprintf(bufStartUpMsg, sizeof(bufStartUpMsg)/sizeof(char),
- " [origin software=\"rsyslogd\" " "swVersion=\"" VERSION \
- "\" x-pid=\"%d\" x-info=\"http://www.rsyslog.com\"] start",
- (int) glblGetOurPid());
- logmsgInternal(NO_ERRCODE, LOG_SYSLOG|LOG_INFO, (uchar*)bufStartUpMsg, 0);
- }
-
-finalize_it:
- RETiRet;
-}
-
/*
* The following function is resposible for handling a SIGHUP signal. Since
@@ -1224,7 +313,7 @@ finalize_it:
* doing this during a signal handler. Instead this function simply sets
* a flag variable which will tells the main loop to do "the right thing".
*/
-void sighup_handler()
+void syslogd_sighup_handler()
{
struct sigaction sigAct;
@@ -1232,116 +321,13 @@ void sighup_handler()
memset(&sigAct, 0, sizeof (sigAct));
sigemptyset(&sigAct.sa_mask);
- sigAct.sa_handler = sighup_handler;
+ sigAct.sa_handler = syslogd_sighup_handler;
sigaction(SIGHUP, &sigAct, NULL);
}
-void sigttin_handler()
-{
-}
-
-/* this function pulls all internal messages from the buffer
- * and puts them into the processing engine.
- * We can only do limited error handling, as this would not
- * really help us. TODO: add error messages?
- * rgerhards, 2007-08-03
- */
-static inline void processImInternal(void)
-{
- msg_t *pMsg;
-
- while(iminternalRemoveMsg(&pMsg) == RS_RET_OK) {
- submitMsgWithDfltRatelimiter(pMsg);
- }
-}
-
-
-/* helper to doHUP(), this "HUPs" each action. The necessary locking
- * is done inside the action class and nothing we need to take care of.
- * rgerhards, 2008-10-22
- */
-DEFFUNC_llExecFunc(doHUPActions)
-{
- BEGINfunc
- actionCallHUPHdlr((action_t*) pData);
- ENDfunc
- return RS_RET_OK; /* we ignore errors, we can not do anything either way */
-}
-
-
-/* This function processes a HUP after one has been detected. Note that this
- * is *NOT* the sighup handler. The signal is recorded by the handler, that record
- * detected inside the mainloop and then this function is called to do the
- * real work. -- rgerhards, 2008-10-22
- * Note: there is a VERY slim chance of a data race when the hostname is reset.
- * We prefer to take this risk rather than sync all accesses, because to the best
- * of my analysis it can not really hurt (the actual property is reference-counted)
- * but the sync would require some extra CPU for *each* message processed.
- * rgerhards, 2012-04-11
- */
-static inline void
-doHUP(void)
-{
- char buf[512];
-
- if(ourConf->globals.bLogStatusMsgs) {
- snprintf(buf, sizeof(buf) / sizeof(char),
- " [origin software=\"rsyslogd\" " "swVersion=\"" VERSION
- "\" x-pid=\"%d\" x-info=\"http://www.rsyslog.com\"] rsyslogd was HUPed",
- (int) glblGetOurPid());
- errno = 0;
- logmsgInternal(NO_ERRCODE, LOG_SYSLOG|LOG_INFO, (uchar*)buf, 0);
- }
-
- queryLocalHostname(); /* re-read our name */
- ruleset.IterateAllActions(ourConf, doHUPActions, NULL);
- lookupDoHUP();
-}
-
-
-/* This is the main processing loop. It is called after successful initialization.
- * When it returns, the syslogd terminates.
- * Its sole function is to provide some housekeeping things. The real work is done
- * by the other threads spawned.
- */
-static void
-mainloop(void)
-{
- struct timeval tvSelectTimeout;
-
- BEGINfunc
- /* first check if we have any internal messages queued and spit them out. We used
- * to do that on any loop iteration, but that is no longer necessry. The reason
- * is that once we reach this point here, we always run on multiple threads and
- * thus the main queue is properly initialized. -- rgerhards, 2008-06-09
- */
- processImInternal();
-
- while(!bFinished){
- /* this is now just a wait - please note that we do use a near-"eternal"
- * timeout of 1 day. This enables us to help safe the environment
- * by not unnecessarily awaking rsyslog on a regular tick (just think
- * powertop, for example). In that case, we primarily wait for a signal,
- * but a once-a-day wakeup should be quite acceptable. -- rgerhards, 2008-06-09
- */
- tvSelectTimeout.tv_sec = 86400 /*1 day*/;
- tvSelectTimeout.tv_usec = 0;
- select(1, NULL, NULL, NULL, &tvSelectTimeout);
- if(bFinished)
- break; /* exit as quickly as possible */
-
- if(bHadHUP) {
- doHUP();
- bHadHUP = 0;
- continue;
- }
- }
- ENDfunc
-}
-
/* print version and compile-time setting information.
*/
-static void printVersion(void)
+void syslogd_printVersion(void)
{
printf("rsyslogd %s, ", VERSION);
printf("compiled with:\n");
@@ -1350,7 +336,9 @@ static void printVersion(void)
#else
printf("\tFEATURE_REGEXP:\t\t\t\tNo\n");
#endif
+/* Yann Droneaud <yann@droneaud.fr> contribution */
#if defined(_LARGE_FILES) || (defined (_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS >= 64)
+/* end Yann Droneaud <yann@droneaud.fr> contribution */
printf("\tFEATURE_LARGEFILE:\t\t\tYes\n");
#else
printf("\tFEATURE_LARGEFILE:\t\t\tNo\n");
@@ -1370,7 +358,9 @@ static void printVersion(void)
#else
printf("\t32bit Atomic operations supported:\tNo\n");
#endif
+/* mono_matsuko <aiueov@hotmail.co.jp> contribution */
#ifdef HAVE_ATOMIC_BUILTINS_64BIT
+/* end mono_matsuko <aiueov@hotmail.co.jp> contribution */
printf("\t64bit Atomic operations supported:\tYes\n");
#else
printf("\t64bit Atomic operations supported:\tNo\n");
@@ -1399,110 +389,46 @@ static void printVersion(void)
}
-/* Method to initialize all global classes and use the objects that we need.
- * rgerhards, 2008-01-04
- * rgerhards, 2008-04-16: the actual initialization is now carried out by the runtime
- */
-static rsRetVal
-InitGlobalClasses(void)
+/* obtain ptrs to all clases we need. */
+rsRetVal
+syslogd_obtainClassPointers(void)
{
DEFiRet;
char *pErrObj; /* tells us which object failed if that happens (useful for troubleshooting!) */
- /* Intialize the runtime system */
- pErrObj = "rsyslog runtime"; /* set in case the runtime errors before setting an object */
- CHKiRet(rsrtInit(&pErrObj, &obj));
- rsrtSetErrLogger(submitErrMsg);
+ CHKiRet(objGetObjInterface(&obj)); /* this provides the root pointer for all other queries */
/* Now tell the system which classes we need ourselfs */
pErrObj = "glbl";
CHKiRet(objUse(glbl, CORE_COMPONENT));
- pErrObj = "errmsg";
- CHKiRet(objUse(errmsg, CORE_COMPONENT));
- pErrObj = "module";
- CHKiRet(objUse(module, CORE_COMPONENT));
- pErrObj = "datetime";
- CHKiRet(objUse(datetime, CORE_COMPONENT));
- pErrObj = "ruleset";
- CHKiRet(objUse(ruleset, CORE_COMPONENT));
- pErrObj = "conf";
- CHKiRet(objUse(conf, CORE_COMPONENT));
- pErrObj = "prop";
- CHKiRet(objUse(prop, CORE_COMPONENT));
- pErrObj = "parser";
- CHKiRet(objUse(parser, CORE_COMPONENT));
- pErrObj = "rsconf";
- CHKiRet(objUse(rsconf, CORE_COMPONENT));
-
- /* intialize some dummy classes that are not part of the runtime */
- pErrObj = "action";
- CHKiRet(actionClassInit());
- pErrObj = "template";
- CHKiRet(templateInit());
/* TODO: the dependency on net shall go away! -- rgerhards, 2008-03-07 */
pErrObj = "net";
CHKiRet(objUse(net, LM_NET_FILENAME));
- dnscacheInit();
- initRainerscript();
- ratelimitModInit();
finalize_it:
if(iRet != RS_RET_OK) {
/* we know we are inside the init sequence, so we can safely emit
* messages to stderr. -- rgerhards, 2008-04-02
*/
- fprintf(stderr, "Error during class init for object '%s' - failing...\n", pErrObj);
+ fprintf(stderr, "Error obtaining object '%s' - failing...\n", pErrObj);
}
RETiRet;
}
-/* Method to exit all global classes. We do not do any error checking here,
- * because that wouldn't help us at all. So better try to deinit blindly
- * as much as succeeds (which usually means everything will). We just must
- * be careful to do the de-init in the opposite order of the init, because
- * of the dependencies. However, its not as important this time, because
- * we have reference counting.
- * rgerhards, 2008-03-10
- */
-static rsRetVal
-GlobalClassExit(void)
+void
+syslogd_releaseClassPointers(void)
{
- DEFiRet;
-
- /* first, release everything we used ourself */
objRelease(net, LM_NET_FILENAME);/* TODO: the dependency on net shall go away! -- rgerhards, 2008-03-07 */
- objRelease(prop, CORE_COMPONENT);
- objRelease(conf, CORE_COMPONENT);
- objRelease(ruleset, CORE_COMPONENT);
- parserClassExit(); /* this is hack, currently core_modules do not get this automatically called */
- rsconfClassExit(); /* this is hack, currently core_modules do not get this automatically called */
- objRelease(datetime, CORE_COMPONENT);
-
- /* TODO: implement the rest of the deinit */
- /* dummy "classes */
- strExit();
- ratelimitModExit();
-
-#if 0
- CHKiRet(objGetObjInterface(&obj)); /* this provides the root pointer for all other queries */
- /* the following classes were intialized by objClassInit() */
- CHKiRet(objUse(errmsg, CORE_COMPONENT));
- CHKiRet(objUse(module, CORE_COMPONENT));
-#endif
- dnscacheDeinit();
- rsrtExit(); /* *THIS* *MUST/SHOULD?* always be the first class initilizer being called (except debug)! */
-
- RETiRet;
}
/* query our host and domain names - we need to do this early as we may emit
* rgerhards, 2012-04-11
*/
-static rsRetVal
+rsRetVal
queryLocalHostname(void)
{
uchar *LocalHostName;
@@ -1567,8 +493,10 @@ queryLocalHostname(void)
}
}
+ /* Marius Tomaschewski <mt@suse.com> contribution */
/* LocalDomain is "" or part of LocalHostName, allocate a new string */
CHKmalloc(LocalDomain = (uchar*)strdup((char*)LocalDomain));
+ /* Marius Tomaschewski <mt@suse.com> contribution */
/* Convert to lower case to recognize the correct domain laterly */
for(p = LocalDomain ; *p ; p++)
@@ -1581,90 +509,24 @@ queryLocalHostname(void)
glbl.SetLocalHostName(LocalHostName);
glbl.SetLocalDomain(LocalDomain);
+ /* Canonical contribution - ASL 2.0 fine (email exchange 2014-05-27) */
if ( strlen((char*)LocalDomain) ) {
CHKmalloc(LocalFQDNName = (uchar*)malloc(strlen((char*)LocalDomain)+strlen((char*)LocalHostName)+2));/* one for dot, one for NUL! */
if ( sprintf((char*)LocalFQDNName,"%s.%s",(char*)LocalHostName,(char*)LocalDomain) )
glbl.SetLocalFQDNName(LocalFQDNName);
}
+ /* end canonical contrib */
glbl.GenerateLocalHostNameProperty(); /* must be redone after conf processing, FQDN setting may have changed */
finalize_it:
RETiRet;
}
-
-/* some support for command line option parsing. Any non-trivial options must be
- * buffered until the complete command line has been parsed. This is necessary to
- * prevent dependencies between the options. That, in turn, means we need to have
- * something that is capable of buffering options and there values. The follwing
- * functions handle that.
- * rgerhards, 2008-04-04
- */
-typedef struct bufOpt {
- struct bufOpt *pNext;
- char optchar;
- char *arg;
-} bufOpt_t;
-static bufOpt_t *bufOptRoot = NULL;
-static bufOpt_t *bufOptLast = NULL;
-
-/* add option buffer */
-static rsRetVal
-bufOptAdd(char opt, char *arg)
-{
- DEFiRet;
- bufOpt_t *pBuf;
-
- if((pBuf = MALLOC(sizeof(bufOpt_t))) == NULL)
- ABORT_FINALIZE(RS_RET_OUT_OF_MEMORY);
-
- pBuf->optchar = opt;
- pBuf->arg = arg;
- pBuf->pNext = NULL;
-
- if(bufOptLast == NULL) {
- bufOptRoot = pBuf; /* then there is also no root! */
- } else {
- bufOptLast->pNext = pBuf;
- }
- bufOptLast = pBuf;
-
-finalize_it:
- RETiRet;
-}
-
-
-
-/* remove option buffer from top of list, return values and destruct buffer itself.
- * returns RS_RET_END_OF_LINKEDLIST when no more options are present.
- * (we use int *opt instead of char *opt to keep consistent with getopt())
- */
-static rsRetVal
-bufOptRemove(int *opt, char **arg)
-{
- DEFiRet;
- bufOpt_t *pBuf;
-
- if(bufOptRoot == NULL)
- ABORT_FINALIZE(RS_RET_END_OF_LINKEDLIST);
- pBuf = bufOptRoot;
-
- *opt = pBuf->optchar;
- *arg = pBuf->arg;
-
- bufOptRoot = pBuf->pNext;
- free(pBuf);
-
-finalize_it:
- RETiRet;
-}
-
-
/* global initialization, to be done only once and before the mainloop is started.
* rgerhards, 2008-07-28 (extracted from realMain())
*/
-static rsRetVal
-doGlblProcessInit(void)
+rsRetVal
+syslogd_doGlblProcessInit(void)
{
struct sigaction sigAct;
int num_fds;
@@ -1682,8 +544,10 @@ doGlblProcessInit(void)
sigAct.sa_handler = doexit;
sigaction(SIGTERM, &sigAct, NULL);
+ /* RH contribution */
/* stop writing debug messages to stdout (if debugging is on) */
stddbg = -1;
+ /* end RH contribution */
dbgprintf("ready for forking\n");
if (fork()) {
@@ -1767,7 +631,8 @@ doGlblProcessInit(void)
}
else
{
- fputs("Pidfile (and pid) already exist.\n", stderr);
+ fprintf(stderr, "rsyslogd: pidfile '%s' and pid %d already exist.\n",
+ PidFile, getpid());
exit(1); /* exit during startup - questionable */
}
glblSetOurPid(getpid());
@@ -1779,16 +644,16 @@ doGlblProcessInit(void)
sigaction(SIGSEGV, &sigAct, NULL);
sigAct.sa_handler = sigsegvHdlr;
sigaction(SIGABRT, &sigAct, NULL);
- sigAct.sa_handler = doDie;
+ sigAct.sa_handler = rsyslogdDoDie;
sigaction(SIGTERM, &sigAct, NULL);
- sigAct.sa_handler = Debug ? doDie : SIG_IGN;
+ sigAct.sa_handler = Debug ? rsyslogdDoDie : SIG_IGN;
sigaction(SIGINT, &sigAct, NULL);
sigaction(SIGQUIT, &sigAct, NULL);
sigAct.sa_handler = reapchild;
sigaction(SIGCHLD, &sigAct, NULL);
- sigAct.sa_handler = Debug ? debug_switch : SIG_IGN;
+ sigAct.sa_handler = Debug ? rsyslogdDebugSwitch : SIG_IGN;
sigaction(SIGUSR1, &sigAct, NULL);
- sigAct.sa_handler = sigttin_handler;
+ sigAct.sa_handler = rsyslogd_sigttin_handler;
sigaction(SIGTTIN, &sigAct, NULL); /* (ab)used to interrupt input threads */
sigAct.sa_handler = SIG_IGN;
sigaction(SIGPIPE, &sigAct, NULL);
@@ -1798,335 +663,10 @@ doGlblProcessInit(void)
}
-/* This is the main entry point into rsyslogd. Over time, we should try to
- * modularize it a bit more...
- */
-int realMain(int argc, char **argv)
+void
+syslogdInit(void)
{
- rsRetVal localRet;
- int ch;
- extern int optind;
- extern char *optarg;
- int bEOptionWasGiven = 0;
- int iHelperUOpt;
- int bChDirRoot = 1; /* change the current working directory to "/"? */
- char *arg; /* for command line option processing */
- char cwdbuf[128]; /* buffer to obtain/display current working directory */
- DEFiRet;
-
- /* first, parse the command line options. We do not carry out any actual work, just
- * see what we should do. This relieves us from certain anomalies and we can process
- * the parameters down below in the correct order. For example, we must know the
- * value of -M before we can do the init, but at the same time we need to have
- * the base classes init before we can process most of the options. Now, with the
- * split of functionality, this is no longer a problem. Thanks to varmofekoj for
- * suggesting this algo.
- * Note: where we just need to set some flags and can do so without knowledge
- * of other options, we do this during the inital option processing.
- * rgerhards, 2008-04-04
- */
- while((ch = getopt(argc, argv, "46a:Ac:dDef:g:hi:l:m:M:nN:op:qQr::s:S:t:T:u:vwx")) != EOF) {
- switch((char)ch) {
- case '4':
- case '6':
- case 'A':
- case 'a':
- case 'f': /* configuration file */
- case 'h':
- case 'i': /* pid file name */
- case 'l':
- case 'm': /* mark interval */
- case 'n': /* don't fork */
- case 'N': /* enable config verify mode */
- case 'o':
- case 'p':
- case 'q': /* add hostname if DNS resolving has failed */
- case 'Q': /* dont resolve hostnames in ACL to IPs */
- case 's':
- case 'S': /* Source IP for local client to be used on multihomed host */
- case 'T': /* chroot on startup (primarily for testing) */
- case 'u': /* misc user settings */
- case 'w': /* disable disallowed host warnings */
- case 'x': /* disable dns for remote messages */
- case 'g': /* enable tcp gssapi logging */
- case 'r': /* accept remote messages */
- case 't': /* enable tcp logging */
- CHKiRet(bufOptAdd(ch, optarg));
- break;
- case 'c': /* compatibility mode */
- fprintf(stderr, "rsyslogd: error: option -c is no longer supported - ignored\n");
- break;
- case 'd': /* debug - must be handled now, so that debug is active during init! */
- debugging_on = 1;
- Debug = 1;
- yydebug = 1;
- break;
- case 'D': /* BISON debug */
- yydebug = 1;
- break;
- case 'e': /* log every message (no repeat message supression) */
- bEOptionWasGiven = 1;
- break;
- case 'M': /* default module load path -- this MUST be carried out immediately! */
- glblModPath = (uchar*) optarg;
- break;
- case 'v': /* MUST be carried out immediately! */
- printVersion();
- exit(0); /* exit for -v option - so this is a "good one" */
- case '?':
- default:
- usage();
- }
- }
-
- if(argc - optind)
- usage();
-
- DBGPRINTF("rsyslogd %s startup, module path '%s', cwd:%s\n",
- VERSION, glblModPath == NULL ? "" : (char*)glblModPath,
- getcwd(cwdbuf, sizeof(cwdbuf)));
-
- /* we are done with the initial option parsing and processing. Now we init the system. */
-
- ppid = getpid();
-
- CHKiRet_Hdlr(InitGlobalClasses()) {
- fprintf(stderr, "rsyslogd initializiation failed - global classes could not be initialized.\n"
- "Did you do a \"make install\"?\n"
- "Suggested action: run rsyslogd with -d -n options to see what exactly "
- "fails.\n");
- FINALIZE;
- }
-
- /* doing some core initializations */
-
- /* we need to create the inputName property (only once during our lifetime) */
- CHKiRet(prop.Construct(&pInternalInputName));
- CHKiRet(prop.SetString(pInternalInputName, UCHAR_CONSTANT("rsyslogd"), sizeof("rsyslogd") - 1));
- CHKiRet(prop.ConstructFinalize(pInternalInputName));
-
- /* get our host and domain names - we need to do this early as we may emit
- * error log messages, which need the correct hostname. -- rgerhards, 2008-04-04
- */
- queryLocalHostname();
-
- /* initialize the objects */
- if((iRet = modInitIminternal()) != RS_RET_OK) {
- fprintf(stderr, "fatal error: could not initialize errbuf object (error code %d).\n",
- iRet);
- exit(1); /* "good" exit, leaving at init for fatal error */
- }
-
-
- /* END core initializations - we now come back to carrying out command line options*/
-
- while((iRet = bufOptRemove(&ch, &arg)) == RS_RET_OK) {
- DBGPRINTF("deque option %c, optarg '%s'\n", ch, (arg == NULL) ? "" : arg);
- switch((char)ch) {
- case '4':
- glbl.SetDefPFFamily(PF_INET);
- break;
- case '6':
- glbl.SetDefPFFamily(PF_INET6);
- break;
- case 'A':
- send_to_all++;
- break;
- case 'a':
- fprintf(stderr, "rsyslogd: error -a is no longer supported, use module imuxsock instead");
- break;
- case 'S': /* Source IP for local client to be used on multihomed host */
- if(glbl.GetSourceIPofLocalClient() != NULL) {
- fprintf (stderr, "rsyslogd: Only one -S argument allowed, the first one is taken.\n");
- } else {
- glbl.SetSourceIPofLocalClient((uchar*)arg);
- }
- break;
- case 'f': /* configuration file */
- ConfFile = (uchar*) arg;
- break;
- case 'g': /* enable tcp gssapi logging */
- fprintf(stderr, "rsyslogd: -g option no longer supported - ignored\n");
- case 'h':
- fprintf(stderr, "rsyslogd: error -h is no longer supported - ignored");
- break;
- case 'i': /* pid file name */
- PidFile = arg;
- break;
- case 'l':
- if(glbl.GetLocalHosts() != NULL) {
- fprintf (stderr, "rsyslogd: Only one -l argument allowed, the first one is taken.\n");
- } else {
- glbl.SetLocalHosts(crunch_list(arg));
- }
- break;
- case 'm': /* mark interval */
- fprintf(stderr, "rsyslogd: error -m is no longer supported - use immark instead");
- break;
- case 'n': /* don't fork */
- doFork = 0;
- break;
- case 'N': /* enable config verify mode */
- iConfigVerify = atoi(arg);
- break;
- case 'o':
- fprintf(stderr, "error -o is no longer supported, use module imuxsock instead");
- break;
- case 'p':
- fprintf(stderr, "error -p is no longer supported, use module imuxsock instead");
- break;
- case 'q': /* add hostname if DNS resolving has failed */
- *(net.pACLAddHostnameOnFail) = 1;
- break;
- case 'Q': /* dont resolve hostnames in ACL to IPs */
- *(net.pACLDontResolve) = 1;
- break;
- case 'r': /* accept remote messages */
- fprintf(stderr, "rsyslogd: error option -r is no longer supported - ignored");
- break;
- case 's':
- if(glbl.GetStripDomains() != NULL) {
- fprintf (stderr, "rsyslogd: Only one -s argument allowed, the first one is taken.\n");
- } else {
- glbl.SetStripDomains(crunch_list(arg));
- }
- break;
- case 't': /* enable tcp logging */
- fprintf(stderr, "rsyslogd: error option -t is no longer supported - ignored");
- break;
- case 'T':/* chroot() immediately at program startup, but only for testing, NOT security yet */
- if(chroot(arg) != 0) {
- perror("chroot");
- exit(1);
- }
- break;
- case 'u': /* misc user settings */
- iHelperUOpt = atoi(arg);
- if(iHelperUOpt & 0x01)
- glbl.SetParseHOSTNAMEandTAG(0);
- if(iHelperUOpt & 0x02)
- bChDirRoot = 0;
- break;
- case 'w': /* disable disallowed host warnigs */
- glbl.SetOption_DisallowWarning(0);
- break;
- case 'x': /* disable dns for remote messages */
- glbl.SetDisableDNS(1);
- break;
- case '?':
- default:
- usage();
- }
- }
-
- if(iRet != RS_RET_END_OF_LINKEDLIST)
- FINALIZE;
-
- if(iConfigVerify) {
- fprintf(stderr, "rsyslogd: version %s, config validation run (level %d), master config %s\n",
- VERSION, iConfigVerify, ConfFile);
- }
-
- localRet = rsconf.Load(&ourConf, ConfFile);
+ /* oxpa <iippolitov@gmail.com> contribution, need to check ASL 2.0 */
queryLocalHostname(); /* need to re-query to pick up a changed hostname due to config */
-
- if(localRet == RS_RET_NONFATAL_CONFIG_ERR) {
- if(loadConf->globals.bAbortOnUncleanConfig) {
- fprintf(stderr, "rsyslogd: $AbortOnUncleanConfig is set, and config is not clean.\n"
- "Check error log for details, fix errors and restart. As a last\n"
- "resort, you may want to remove $AbortOnUncleanConfig to permit a\n"
- "startup with a dirty config.\n");
- exit(2);
- }
- if(iConfigVerify) {
- /* a bit dirty, but useful... */
- exit(1);
- }
- localRet = RS_RET_OK;
- }
- CHKiRet(localRet);
-
- CHKiRet(ratelimitNew(&dflt_ratelimiter, "rsyslogd", "dflt"));
- /* TODO: add linux-type limiting capability */
- CHKiRet(ratelimitNew(&internalMsg_ratelimiter, "rsyslogd", "internal_messages"));
- ratelimitSetLinuxLike(internalMsg_ratelimiter, 5, 500);
- /* TODO: make internalMsg ratelimit settings configurable */
-
- if(bChDirRoot) {
- if(chdir("/") != 0)
- fprintf(stderr, "Can not do 'cd /' - still trying to run\n");
- }
-
- /* process compatibility mode settings */
- if(bEOptionWasGiven) {
- errmsg.LogError(0, NO_ERRCODE, "WARNING: \"message repeated n times\" feature MUST be turned on in "
- "rsyslog.conf - CURRENTLY EVERY MESSAGE WILL BE LOGGED. Visit "
- "http://www.rsyslog.com/rptdmsgreduction to learn "
- "more and cast your vote if you want us to keep this feature.");
- }
-
- if(!iConfigVerify)
- CHKiRet(doGlblProcessInit());
-
- /* Send a signal to the parent so it can terminate. */
- if(glblGetOurPid() != ppid)
- kill(ppid, SIGTERM);
-
- CHKiRet(init());
-
- if(Debug && debugging_on) {
- dbgprintf("Debugging enabled, SIGUSR1 to turn off debugging.\n");
- }
-
- /* END OF INTIALIZATION */
- DBGPRINTF("initialization completed, transitioning to regular run mode\n");
-
- /* close stderr and stdout if they are kept open during a fork. Note that this
- * may introduce subtle security issues: if we are in a jail, one may break out of
- * it via these descriptors. But if I close them earlier, error messages will (once
- * again) not be emitted to the user that starts the daemon. As root jail support
- * is still in its infancy (and not really done), we currently accept this issue.
- * rgerhards, 2009-06-29
- */
- if(doFork) {
- close(1);
- close(2);
- ourConf->globals.bErrMsgToStderr = 0;
- }
-
- sd_notify(0, "READY=1");
-
- mainloop();
-
- /* do any de-init's that need to be done AFTER this comment */
-
- die(bFinished);
-
- thrdExit();
-
-finalize_it:
- if(iRet == RS_RET_VALIDATION_RUN) {
- fprintf(stderr, "rsyslogd: End of config validation run. Bye.\n");
- } else if(iRet != RS_RET_OK) {
- fprintf(stderr, "rsyslogd: run failed with error %d (see rsyslog.h "
- "or try http://www.rsyslog.com/e/%d to learn what that number means)\n", iRet, iRet*-1);
- exit(1);
- }
-
- ENDfunc
- return 0;
+ /* end oxpa */
}
-
-
-/* This is the main entry point into rsyslogd. This must be a function in its own
- * right in order to intialize the debug system in a portable way (otherwise we would
- * need to have a statement before variable definitions.
- * rgerhards, 20080-01-28
- */
-int main(int argc, char **argv)
-{
- dbgClassInit();
- return realMain(argc, argv);
-}
-/* vim:set ai:
- */