log: Send identifier string in log messages, openlog() won't work for us

openlog() can be used to set "ident" and have all the log messages
prefixed by it, but only if we call syslog() -- this is implemented
by C libraries.

We don't log messages with syslog(), though, as we have a custom
implementation to ensure we don't need dynamic memory allocation.
This means that it's perfectly useless to call openlog(), and that we
have to prefix every message we log by the identifier on our own.

Reported-by: Andrea Bolognani <abologna@redhat.com>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Tested-by: Andrea Bolognani <abologna@redhat.com>
Reviewed-by: Andrea Bolognani <abologna@redhat.com>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
Stefano Brivio 2023-02-23 18:32:20 +01:00
parent bad2526872
commit 834b9a3049

12
log.c
View file

@ -106,7 +106,7 @@ void trace_init(int enable)
} }
/** /**
* __openlog() - Non-optional openlog() wrapper, to allow custom vsyslog() * __openlog() - Non-optional openlog() implementation, for custom vsyslog()
* @ident: openlog() identity (program name) * @ident: openlog() identity (program name)
* @option: openlog() options * @option: openlog() options
* @facility: openlog() facility (LOG_DAEMON) * @facility: openlog() facility (LOG_DAEMON)
@ -136,8 +136,6 @@ void __openlog(const char *ident, int option, int facility)
log_mask |= facility; log_mask |= facility;
strncpy(log_ident, ident, sizeof(log_ident) - 1); strncpy(log_ident, ident, sizeof(log_ident) - 1);
log_opt = option; log_opt = option;
openlog(ident, option, facility);
} }
/** /**
@ -158,11 +156,11 @@ void __setlogmask(int mask)
*/ */
void passt_vsyslog(int pri, const char *format, va_list ap) void passt_vsyslog(int pri, const char *format, va_list ap)
{ {
int prefix_len, n;
char buf[BUFSIZ]; char buf[BUFSIZ];
int n;
/* Send without name and timestamp, the system logger should add them */ /* Send without timestamp, the system logger should add it */
n = snprintf(buf, BUFSIZ, "<%i> ", pri); n = prefix_len = snprintf(buf, BUFSIZ, "<%i> %s: ", pri, log_ident);
n += vsnprintf(buf + n, BUFSIZ - n, format, ap); n += vsnprintf(buf + n, BUFSIZ - n, format, ap);
@ -170,7 +168,7 @@ void passt_vsyslog(int pri, const char *format, va_list ap)
n += snprintf(buf + n, BUFSIZ - n, "\n"); n += snprintf(buf + n, BUFSIZ - n, "\n");
if (log_opt & LOG_PERROR) if (log_opt & LOG_PERROR)
fprintf(stderr, "%s", buf + sizeof("<0>")); fprintf(stderr, "%s", buf + prefix_len);
if (send(log_sock, buf, n, 0) != n) if (send(log_sock, buf, n, 0) != n)
fprintf(stderr, "Failed to send %i bytes to syslog\n", n); fprintf(stderr, "Failed to send %i bytes to syslog\n", n);