diff --git a/configure.ac b/configure.ac index 50e1549..3cd47ee 100644 --- a/configure.ac +++ b/configure.ac @@ -434,6 +434,12 @@ AC_ARG_ENABLE([slow-tests], [ --enable-slow-tests : build and run slow tests. ], [ default="no" ]) +if test x"$with_check" = xyes; then +AC_ARG_ENABLE([syslog-tests], + [ --enable-syslog-tests : build and run syslog tests. ], + [ default="no" ]) +fi + AC_ARG_WITH([socket-dir], [ --with-socket-dir=DIR : socket dir. ], [ SOCKETDIR="$withval" ], @@ -514,6 +520,12 @@ if test "x${enable_slow_tests}" = xyes ; then fi AM_CONDITIONAL(HAVE_SLOW_TESTS, [test "x${enable_slow_tests}" = xyes]) AC_SUBST(HAVE_SLOW_TESTS) +if test "x${enable_syslog_tests}" = xyes ; then + AC_DEFINE([HAVE_SYSLOG_TESTS], 1,[have syslog tests]) + AC_MSG_NOTICE([Enabling syslog tests]) +fi +AM_CONDITIONAL(HAVE_SYSLOG_TESTS, [test "x${enable_syslog_tests}" = xyes]) +AC_SUBST(HAVE_SYSLOG_TESTS) # --- callsite sections --- if test "x${GCC}" = xyes; then diff --git a/include/qb/qblog.h b/include/qb/qblog.h index 870cbae..0abb90e 100644 --- a/include/qb/qblog.h +++ b/include/qb/qblog.h @@ -420,6 +420,7 @@ enum qb_log_conf { QB_LOG_CONF_STATE_GET, QB_LOG_CONF_FILE_SYNC, QB_LOG_CONF_EXTENDED, + QB_LOG_CONF_IDENT, }; enum qb_log_filter_type { @@ -504,6 +505,30 @@ void qb_log_callsites_dump(void); */ int32_t qb_log_ctl(int32_t target, enum qb_log_conf conf_type, int32_t arg); +typedef union { + int32_t i32; + const char *s; +} qb_log_ctl2_arg_t; + +/** + * Extension of main logging control function accepting also strings. + * + * @param arg for QB_LOG_CONF_IDENT, 's' member as new identifier to openlog(), + * for all original qb_log_ctl-compatible configuration directives, + * 'i32' member is assumed (although a preferred way is to use + * that original function directly as it allows for more type safety) + * @see qb_log_ctl + * + * @note You can use QB_LOG_CTL2_I32 and QB_LOG_CTL2_S + * macros for a convenient on-the-fly construction of the object + * to be passed as an arg argument. + */ +int32_t qb_log_ctl2(int32_t target, enum qb_log_conf conf_type, + qb_log_ctl2_arg_t arg); + +#define QB_LOG_CTL2_I32(a) ((qb_log_ctl2_arg_t) { .i32 = (a) }) +#define QB_LOG_CTL2_S(a) ((qb_log_ctl2_arg_t) { .s = (a) }) + /** * This allows you modify the 'tags' and 'targets' callsite fields at runtime. */ diff --git a/lib/log.c b/lib/log.c index b6eb3ce..e851d89 100644 --- a/lib/log.c +++ b/lib/log.c @@ -1060,11 +1060,15 @@ _log_target_disable(struct qb_log_target *t) } int32_t -qb_log_ctl(int32_t t, enum qb_log_conf c, int32_t arg) +qb_log_ctl2(int32_t t, enum qb_log_conf c, qb_log_ctl2_arg_t arg_not4directuse) { int32_t rc = 0; int32_t need_reload = QB_FALSE; + /* extract the constants and do not touch the origin anymore */ + const int32_t arg_i32 = arg_not4directuse.i32; + const char * const arg_s = arg_not4directuse.s; + if (!logger_inited) { return -EINVAL; } @@ -1074,7 +1078,7 @@ qb_log_ctl(int32_t t, enum qb_log_conf c, int32_t arg) } switch (c) { case QB_LOG_CONF_ENABLED: - if (arg) { + if (arg_i32) { rc = _log_target_enable(&conf[t]); } else { _log_target_disable(&conf[t]); @@ -1084,33 +1088,39 @@ qb_log_ctl(int32_t t, enum qb_log_conf c, int32_t arg) rc = conf[t].state; break; case QB_LOG_CONF_FACILITY: - conf[t].facility = arg; + conf[t].facility = arg_i32; + if (t == QB_LOG_SYSLOG) { + need_reload = QB_TRUE; + } + break; + case QB_LOG_CONF_IDENT: + (void)strlcpy(conf[t].name, arg_s, PATH_MAX); if (t == QB_LOG_SYSLOG) { need_reload = QB_TRUE; } break; case QB_LOG_CONF_FILE_SYNC: - conf[t].file_sync = arg; + conf[t].file_sync = arg_i32; break; case QB_LOG_CONF_PRIORITY_BUMP: - conf[t].priority_bump = arg; + conf[t].priority_bump = arg_i32; break; case QB_LOG_CONF_SIZE: if (t == QB_LOG_BLACKBOX) { - if (arg <= 0) { + if (arg_i32 <= 0) { return -EINVAL; } - conf[t].size = arg; + conf[t].size = arg_i32; need_reload = QB_TRUE; } else { return -ENOSYS; } break; case QB_LOG_CONF_THREADED: - conf[t].threaded = arg; + conf[t].threaded = arg_i32; break; case QB_LOG_CONF_EXTENDED: - conf[t].extended = arg; + conf[t].extended = arg_i32; break; default: @@ -1123,3 +1133,9 @@ qb_log_ctl(int32_t t, enum qb_log_conf c, int32_t arg) } return rc; } + +int32_t +qb_log_ctl(int32_t t, enum qb_log_conf c, int32_t arg) +{ + return qb_log_ctl2(t, c, QB_LOG_CTL2_I32(arg)); +} diff --git a/tests/Makefile.am b/tests/Makefile.am index aaeb415..807ae2e 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -147,6 +147,13 @@ ipc_test_LDADD = $(top_builddir)/lib/libqb.la @CHECK_LIBS@ log_test_SOURCES = check_log.c $(top_builddir)/include/qb/qblog.h log_test_CFLAGS = @CHECK_CFLAGS@ -I$(top_srcdir)/include log_test_LDADD = $(top_builddir)/lib/libqb.la @CHECK_LIBS@ +if HAVE_SYSLOG_TESTS +log_test_LDADD += _syslog_override.la + +lib_LTLIBRARIES = _syslog_override.la +_syslog_override_la_SOURCES = _syslog_override.c +_syslog_override_la_LDFLAGS = -module +endif util_test_SOURCES = check_util.c $(top_builddir)/include/qb/qbutil.h util_test_CFLAGS = @CHECK_CFLAGS@ -I$(top_srcdir)/include diff --git a/tests/_syslog_override.c b/tests/_syslog_override.c new file mode 100644 index 0000000..0c3a809 --- /dev/null +++ b/tests/_syslog_override.c @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2016 Red Hat, Inc. + * + * All rights reserved. + * + * Author: Jan Pokorny + * + * This file is part of libqb. + * + * libqb 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 2.1 of the License, or + * (at your option) any later version. + * + * libqb 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 libqb. If not, see . + */ + +#include "_syslog_override.h" + +#include +#include + +int _syslog_opened = 0; +int _syslog_option = 0; +int _syslog_facility = 0; +char _syslog_ident[PATH_MAX] = ""; + +void openlog(const char *ident, int option, int facility); + +void +openlog(const char *ident, int option, int facility) +{ + _syslog_opened = 1; + _syslog_option = option; + _syslog_facility = facility; + strncpy(_syslog_ident, ident, sizeof(_syslog_ident)); +} + +void syslog(int priority, const char *format, ...); + +void +syslog(int priority, const char *format, ...) +{ + _syslog_opened = 1; +} + +void closelog(void); + +void +closelog(void) +{ + _syslog_opened = 0; + _syslog_option = -1; + _syslog_facility = -1; + _syslog_ident[0] = '\0'; +} diff --git a/tests/_syslog_override.h b/tests/_syslog_override.h new file mode 100644 index 0000000..7b254ae --- /dev/null +++ b/tests/_syslog_override.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2016 Red Hat, Inc. + * + * All rights reserved. + * + * Author: Jan Pokorny + * + * This file is part of libqb. + * + * libqb 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 2.1 of the License, or + * (at your option) any later version. + * + * libqb 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 libqb. If not, see . + */ + +#ifndef QB_SYSLOG_OVERRIDE_H_DEFINED +#define QB_SYSLOG_OVERRIDE_H_DEFINED + +#include + +extern int _syslog_opened; +extern int _syslog_option; +extern int _syslog_facility; +extern char _syslog_ident[PATH_MAX]; + +#endif diff --git a/tests/check_log.c b/tests/check_log.c index 56c9305..d7ac70b 100644 --- a/tests/check_log.c +++ b/tests/check_log.c @@ -29,6 +29,10 @@ #include #include +#ifdef HAVE_SYSLOG_TESTS +#include "_syslog_override.h" +#endif + extern size_t qb_vsnprintf_serialize(char *serialize, size_t max_len, const char *fmt, va_list ap); extern size_t qb_vsnprintf_deserialize(char *string, size_t strlen, const char *buf); @@ -765,6 +769,25 @@ START_TEST(test_extended_information) } END_TEST +#ifdef HAVE_SYSLOG_TESTS +START_TEST(test_syslog) +{ + qb_log_init("flip", LOG_USER, LOG_INFO); + qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_ENABLED, QB_TRUE); + + qb_log(LOG_ERR, "first as flip"); + ck_assert_int_eq(_syslog_opened, 1); + ck_assert_str_eq(_syslog_ident, "flip"); + + qb_log_ctl2(QB_LOG_SYSLOG, QB_LOG_CONF_IDENT, QB_LOG_CTL2_S("flop")); + qb_log(LOG_ERR, "second as flop"); + ck_assert_str_eq(_syslog_ident, "flop"); + + qb_log_fini(); +} +END_TEST +#endif + static Suite * log_suite(void) { @@ -812,6 +835,12 @@ log_suite(void) tcase_add_test(tc, test_extended_information); suite_add_tcase(s, tc); +#ifdef HAVE_SYSLOG_TESTS + tc = tcase_create("syslog"); + tcase_add_test(tc, test_syslog); + suite_add_tcase(s, tc); +#endif + return s; }