diff options
62 files changed, 2428 insertions, 2531 deletions
@@ -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. @@ -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 @@ -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 ;; @@ -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: - */ |