summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Mohr <alexander.m.mohr@mercedes-benz.com>2022-10-05 10:32:15 +0200
committerGitHub <noreply@github.com>2022-10-05 10:32:15 +0200
commit5b80a4c92c9aa9ef45ce1da599b401ba631a86ed (patch)
treea8fa737aa20b222808a643516857cd9c5e2d23ac
parent34471d85fca14a5ec359d2d06a8d7018cb23beb2 (diff)
downloadDLT-daemon-5b80a4c92c9aa9ef45ce1da599b401ba631a86ed.tar.gz
internal-logging: Fix issues with file logging (#378)
This commit fixes the following issues if access to the internal log file is not possible (logging_mode = DLT_LOG_TO_FILE) * dlt_log_free tried to call fclose on a nullptr Added a nullcheck for this * Access to log file might be denied but access to logs is still wanted Add a new CMake option WITH_DLT_FILE_LOGGING_SYSLOG_FALLBACK If this is set to ON and the logging moe is set to file, the dlt-daemon will fall back to syslog if opening the internal log file failed Signed-off-by: Alexander Mohr <alexander.m.mohr@mercedes-benz.com>
-rw-r--r--CMakeLists.txt6
-rw-r--r--include/dlt/dlt_common.h2
-rw-r--r--src/daemon/dlt-daemon.c22
-rw-r--r--src/daemon/dlt.conf2
-rw-r--r--src/shared/dlt_common.c10
5 files changed, 35 insertions, 7 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2bcad1f..8022852 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -74,6 +74,7 @@ option(WITH_DLT_DBUS "Set to ON to build src/dbus binaries"
option(WITH_DLT_TESTS "Set to ON to build src/test binaries" ON)
option(WITH_DLT_UNIT_TESTS "Set to ON to build gtest framework and tests/binaries" OFF)
option(WITH_DLT_QNX_SYSTEM "Set to ON to build QNX system binary dlt-qnx-system" OFF)
+option(WITH_DLT_FILE_LOGGING_SYSLOG_FALLBACK "Set to ON to enable fallback to syslog if dlt logging to file fails" OFF)
set(DLT_IPC "FIFO" CACHE STRING "UNIX_SOCKET,FIFO")
set(DLT_USER "genivi" CACHE STRING "Set user for process not run as root")
@@ -171,6 +172,10 @@ if(WITH_DLT_QNX_SYSTEM AND NOT "${CMAKE_C_COMPILER}" MATCHES "nto-qnx|qcc")
message(FATAL_ERROR "Can only compile for QNX with a QNX compiler.")
endif()
+if (WITH_DLT_FILE_LOGGING_SYSLOG_FALLBACK)
+ add_definitions(-DWITH_DLT_FILE_LOGGING_SYSLOG_FALLBACK)
+endif()
+
if(WITH_GPROF)
add_compile_options(-pg)
endif()
@@ -345,6 +350,7 @@ message(STATUS "WITH_LIB_SHORT_VERSION = ${WITH_LIB_SHORT_VERSION}")
message(STATUS "WITH_LEGACY_INCLUDE_PATH = ${WITH_LEGACY_INCLUDE_PATH}")
message(STATUS "WITH_EXTENDED_FILTERING = ${WITH_EXTENDED_FILTERING}")
message(STATUS "WITH_DLT_DISABLE_MACRO = ${WITH_DLT_DISABLE_MACRO}")
+message(STATUS "WITH_DLT_FILE_LOGGING_SYSLOG_FALLBACK = ${WITH_DLT_FILE_LOGGING_SYSLOG_FALLBACK}" )
message(STATUS "Change a value with: cmake -D<Variable>=<Value>")
message(STATUS "-------------------------------------------------------------------------------")
message(STATUS)
diff --git a/include/dlt/dlt_common.h b/include/dlt/dlt_common.h
index 9a99fce..100a481 100644
--- a/include/dlt/dlt_common.h
+++ b/include/dlt/dlt_common.h
@@ -1195,7 +1195,7 @@ void dlt_print_with_attributes(bool state);
* Initialize (external) logging facility
* @param mode positive, 0 = log to stdout, 1 = log to syslog, 2 = log to file, 3 = log to stderr
*/
-void dlt_log_init(int mode);
+DltReturnValue dlt_log_init(int mode);
/**
* Print with variable arguments to specified file descriptor by DLT_LOG_MODE environment variable (like fprintf)
* @param format format string for message
diff --git a/src/daemon/dlt-daemon.c b/src/daemon/dlt-daemon.c
index 35fb024..2c9ff6a 100644
--- a/src/daemon/dlt-daemon.c
+++ b/src/daemon/dlt-daemon.c
@@ -940,7 +940,25 @@ int main(int argc, char *argv[])
/* Initialize internal logging facility */
dlt_log_set_filename(daemon_local.flags.loggingFilename);
dlt_log_set_level(daemon_local.flags.loggingLevel);
- dlt_log_init(daemon_local.flags.loggingMode);
+ DltReturnValue log_init_result =
+ dlt_log_init(daemon_local.flags.loggingMode);
+
+ if (log_init_result != DLT_RETURN_OK) {
+ fprintf(stderr, "Failed to init internal logging\n");
+
+#if WITH_DLT_FILE_LOGGING_SYSLOG_FALLBACK
+ if (daemon_local.flags.loggingMode == DLT_LOG_TO_FILE) {
+ fprintf(stderr, "Falling back to syslog mode\n");
+
+ daemon_local.flags.loggingMode = DLT_LOG_TO_SYSLOG;
+ log_init_result = dlt_log_init(daemon_local.flags.loggingMode);
+ if (log_init_result != DLT_RETURN_OK) {
+ fprintf(stderr, "Failed to setup syslog logging, internal logs will "
+ "not be available\n");
+ }
+ }
+#endif
+ }
/* Print version information */
dlt_get_version(version, DLT_DAEMON_TEXTBUFSIZE);
@@ -955,7 +973,7 @@ int main(int argc, char *argv[])
if (dlt_mkdir_recursive(dltFifoBaseDir) != 0) {
dlt_vlog(LOG_ERR, "Base dir %s cannot be created!\n", dltFifoBaseDir);
return -1;
- }
+ }
#else
if (dlt_mkdir_recursive(DLT_USER_IPC_PATH) != 0) {
diff --git a/src/daemon/dlt.conf b/src/daemon/dlt.conf
index 7e19817..777aa82 100644
--- a/src/daemon/dlt.conf
+++ b/src/daemon/dlt.conf
@@ -46,6 +46,8 @@ LoggingMode = 0
LoggingLevel = 6
# The logging filename if internal logging mode is log to file (Default: /tmp/dlt.log)
+# If access to the file is not possible, the daemon will fall back to syslog
+# if WITH_DLT_FILE_LOGGING_SYSLOG_FALLBACK is set as compile flag
LoggingFilename = /tmp/dlt.log
# Timeout on send to client (sec)
diff --git a/src/shared/dlt_common.c b/src/shared/dlt_common.c
index adda5db..57455fa 100644
--- a/src/shared/dlt_common.c
+++ b/src/shared/dlt_common.c
@@ -1814,11 +1814,11 @@ void dlt_print_with_attributes(bool state)
print_with_attributes = state;
}
-void dlt_log_init(int mode)
+DltReturnValue dlt_log_init(int mode)
{
if ((mode < DLT_LOG_TO_CONSOLE) || (mode > DLT_LOG_DROPPED)) {
dlt_vlog(LOG_WARNING, "Wrong parameter for mode: %d\n", mode);
- return;
+ return DLT_RETURN_WRONG_PARAMETER;
}
logging_mode = mode;
@@ -1829,14 +1829,16 @@ void dlt_log_init(int mode)
if (logging_handle == NULL) {
dlt_user_printf("Internal log file %s cannot be opened!\n", logging_filename);
- return;
+ return DLT_RETURN_ERROR;
}
}
+
+ return DLT_RETURN_OK;
}
void dlt_log_free(void)
{
- if (logging_mode == DLT_LOG_TO_FILE)
+ if (logging_mode == DLT_LOG_TO_FILE && logging_handle)
fclose(logging_handle);
}