5972203174
logmsg() takes printf like arguments, but because it's not a built in, the compiler won't generate warnings if the format string and parameters don't match. Enable those by using the format attribute. Strictly speaking this is a gcc extension, but I believe it is also supported by some other common compilers. We already use some other attributes in various places. For now, just use it and we can worry about compilers that don't support it if it comes up. This exposes some warnings from existing callers, both in gcc and in clang-tidy: - Some are straight out bugs, which we correct - It's occasionally useful to invoke the logging functions with an empty string, which gcc objects to, so disable that specific warning in the Makefile - Strictly speaking the C standard requires that the parameter for a %p be a (void *), not some other pointer type. That's only likely to cause problems in practice on weird architectures with different sized representations for pointers to different types. Nonetheless add the casts to make it happy. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
44 lines
1.2 KiB
C
44 lines
1.2 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later
|
|
* Copyright (c) 2022 Red Hat GmbH
|
|
* Author: Stefano Brivio <sbrivio@redhat.com>
|
|
*/
|
|
|
|
#ifndef LOG_H
|
|
#define LOG_H
|
|
|
|
#include <syslog.h>
|
|
|
|
#define LOGFILE_SIZE_DEFAULT (1024 * 1024UL)
|
|
#define LOGFILE_CUT_RATIO 30 /* When full, cut ~30% size */
|
|
#define LOGFILE_SIZE_MIN (5UL * MAX(BUFSIZ, PAGE_SIZE))
|
|
|
|
void logmsg(int pri, const char *format, ...)
|
|
__attribute__((format(printf, 2, 3)));
|
|
|
|
#define err(...) logmsg(LOG_ERR, __VA_ARGS__)
|
|
#define warn(...) logmsg(LOG_WARNING, __VA_ARGS__)
|
|
#define info(...) logmsg(LOG_INFO, __VA_ARGS__)
|
|
#define debug(...) logmsg(LOG_DEBUG, __VA_ARGS__)
|
|
|
|
#define die(...) \
|
|
do { \
|
|
err(__VA_ARGS__); \
|
|
exit(EXIT_FAILURE); \
|
|
} while (0)
|
|
|
|
extern int log_trace;
|
|
extern int log_to_stdout;
|
|
void trace_init(int enable);
|
|
#define trace(...) \
|
|
do { \
|
|
if (log_trace) \
|
|
debug(__VA_ARGS__); \
|
|
} while (0)
|
|
|
|
void __openlog(const char *ident, int option, int facility);
|
|
void logfile_init(const char *name, const char *path, size_t size);
|
|
void passt_vsyslog(int pri, const char *format, va_list ap);
|
|
void logfile_write(int pri, const char *format, va_list ap);
|
|
void __setlogmask(int mask);
|
|
|
|
#endif /* LOG_H */
|