From mboxrd@z Thu Jan 1 00:00:00 1970 Received: by passt.top (Postfix, from userid 1000) id EF7EA5A0268; Wed, 15 Feb 2023 12:55:29 +0100 (CET) From: Stefano Brivio To: passt-dev@passt.top Subject: [PATCH] log: Don't duplicate messages on stderr before daemonising Date: Wed, 15 Feb 2023 12:55:29 +0100 Message-Id: <20230215115529.2157137-1-sbrivio@redhat.com> X-Mailer: git-send-email 2.35.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Message-ID-Hash: PJCRAOHLGE7CR6FP5NXRWKVMFNQXPEO3 X-Message-ID-Hash: PJCRAOHLGE7CR6FP5NXRWKVMFNQXPEO3 X-MailFrom: sbrivio@passt.top X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Laine Stump X-Mailman-Version: 3.3.3 Precedence: list List-Id: Development discussion and patches for passt Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Now that logging functions force printing messages to stderr before passt forks to background, we'll have duplicate messages when running from an interactive terminal, or if --stderr is passed, because at some point we set LOG_PERROR in our __openlog() wrapper. We could defer setting LOG_PERROR, but that would change option semantics in other, unexpected ways. We could force calling passt_vsyslog() as long as the mask is set to LOG_EMERG, but that complicates the logic in logging functions even further. Go the easy way for now: don't force printing to stderr with LOG_EMERG if LOG_PERROR is already set. We should seriously consider a rework of those logging functions at this point. Signed-off-by: Stefano Brivio --- This applies on top of Laine's series. log.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/log.c b/log.c index 785bc36..f23e8ef 100644 --- a/log.c +++ b/log.c @@ -44,6 +44,8 @@ static char log_header[BUFSIZ]; /* File header, written back on cuts */ static time_t log_start; /* Start timestamp */ int log_trace; /* --trace mode enabled */ +#define BEFORE_DAEMON (setlogmask(0) == LOG_MASK(LOG_EMERG)) + #define logfn(name, level, doexit) \ void name(const char *format, ...) { \ struct timespec tp; \ @@ -56,8 +58,7 @@ void name(const char *format, ...) { \ tp.tv_nsec / (100L * 1000)); \ } \ \ - if ((LOG_MASK(LOG_PRI(level)) & log_mask) || \ - setlogmask(0) == LOG_MASK(LOG_EMERG)) { \ + if ((LOG_MASK(LOG_PRI(level)) & log_mask) || BEFORE_DAEMON) { \ va_start(args, format); \ if (log_file != -1) \ logfile_write(level, format, args); \ @@ -67,7 +68,7 @@ void name(const char *format, ...) { \ } \ \ if ((setlogmask(0) & LOG_MASK(LOG_DEBUG) && log_file == -1) || \ - setlogmask(0) == LOG_MASK(LOG_EMERG)) { \ + (BEFORE_DAEMON && !(log_opt & LOG_PERROR))) { \ va_start(args, format); \ (void)vfprintf(stderr, format, args); \ va_end(args); \ -- 2.35.1