From 7d57e3844af6aec97aef0757c85a4b82e999f199 Mon Sep 17 00:00:00 2001 From: Artur Paszkiewicz Date: Wed, 8 May 2019 11:08:36 +0200 Subject: [PATCH] fix the _ledmon_status() function Remove a wrong strncat() usage and simplify the whole function while at it. Don't print an exit message when the parent is exiting - it always exits immediately after fork with status = EXIT_SUCCESS. Signed-off-by: Artur Paszkiewicz --- src/ledmon.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/ledmon.c b/src/ledmon.c index b775e6f..bbe04fc 100644 --- a/src/ledmon.c +++ b/src/ledmon.c @@ -178,34 +178,31 @@ static void _ledmon_fini(int __attribute__ ((unused)) status, void *program_name * * @param[in] status Status given in the last call to exit() * function. - * @param[in] ignore Pointer to placeholder where ignore flag is - * stored. If flag is set 0 then parent process - * is exiting, otherwise a child is exiting. - * This argument must not be NULL pointer. + * @param[in] arg Argument passed to on_exit(). * * @return The function does not return a value. */ -static void _ledmon_status(int status, void *ignore) +static void _ledmon_status(int status, void *arg) { - struct log_level_info *lli; int log_level; char message[4096]; + int ignore = *((int *)arg); - memset(message, 0, 4096); - if (*((int *)ignore) != 0) { + if (ignore) + return; + + if (status == STATUS_SUCCESS) log_level = LOG_LEVEL_INFO; - } else if (status != STATUS_SUCCESS) { + else log_level = LOG_LEVEL_ERROR; - snprintf(message, sizeof(message), "parent "); - } else - return; - strncat(message, "exit status is", sizeof(message)); - lli = &log_level_infos[log_level]; + snprintf(message, sizeof(message), "exit status is %s.", + strstatus(status)); + if (get_log_fd() >= 0) - _log(log_level, "%s %s.", message, strstatus(status)); + _log(log_level, message); else - syslog(lli->priority, "%s %s.", message, strstatus(status)); + syslog(log_level_infos[log_level].priority, message); } /** @@ -854,13 +851,14 @@ static void _close_parent_fds(void) int main(int argc, char *argv[]) { status_t status = STATUS_SUCCESS; + int ignore = 0; setup_options(&longopt, &shortopt, possible_params, possible_params_size); set_invocation_name(argv[0]); openlog(progname, LOG_PID | LOG_PERROR, LOG_DAEMON); - if (on_exit(_ledmon_status, &terminate)) + if (on_exit(_ledmon_status, &ignore)) return STATUS_ONEXIT_ERROR; if (_cmdline_parse_non_daemonise(argc, argv) != STATUS_SUCCESS) @@ -900,8 +898,10 @@ int main(int argc, char *argv[]) log_debug("main(): fork() failed (errno=%d).", errno); exit(EXIT_FAILURE); } - if (pid > 0) + if (pid > 0) { + ignore = 1; /* parent: don't print exit status */ exit(EXIT_SUCCESS); + } pid_t sid = setsid(); -- 2.20.1