log: Add _perror() logging function variants

In many places, we have direct perror() calls, which completely bypass
logging functions and log files.

They are definitely convenient: offer similar convenience with
_perror() logging variants, so that we can drop those direct perror()
calls.

Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
Stefano Brivio 2024-06-15 00:25:23 +02:00
parent afd9cdc9bb
commit c1140df889
2 changed files with 39 additions and 4 deletions

22
log.c
View file

@ -78,6 +78,11 @@ void vlogmsg(int pri, const char *format, va_list ap)
} }
} }
/**
* logmsg() - vlogmsg() wrapper for variable argument lists
* @pri: Facility and level map, same as priority for vsyslog()
* @format: Message
*/
void logmsg(int pri, const char *format, ...) void logmsg(int pri, const char *format, ...)
{ {
va_list ap; va_list ap;
@ -87,6 +92,23 @@ void logmsg(int pri, const char *format, ...)
va_end(ap); va_end(ap);
} }
/**
* logmsg_perror() - vlogmsg() wrapper with perror()-like functionality
* @pri: Facility and level map, same as priority for vsyslog()
* @format: Message
*/
void logmsg_perror(int pri, const char *format, ...)
{
int errno_copy = errno;
va_list ap;
va_start(ap, format);
vlogmsg(pri, format, ap);
va_end(ap);
logmsg(pri, ": %s", strerror(errno_copy));
}
/* Prefixes for log file messages, indexed by priority */ /* Prefixes for log file messages, indexed by priority */
const char *logfile_prefix[] = { const char *logfile_prefix[] = {
NULL, NULL, NULL, /* Unused: LOG_EMERG, LOG_ALERT, LOG_CRIT */ NULL, NULL, NULL, /* Unused: LOG_EMERG, LOG_ALERT, LOG_CRIT */

13
log.h
View file

@ -16,18 +16,31 @@
void vlogmsg(int pri, const char *format, va_list ap); void vlogmsg(int pri, const char *format, va_list ap);
void logmsg(int pri, const char *format, ...) void logmsg(int pri, const char *format, ...)
__attribute__((format(printf, 2, 3))); __attribute__((format(printf, 2, 3)));
void logmsg_perror(int pri, const char *format, ...)
__attribute__((format(printf, 2, 3)));
#define err(...) logmsg( LOG_ERR, __VA_ARGS__) #define err(...) logmsg( LOG_ERR, __VA_ARGS__)
#define warn(...) logmsg( LOG_WARNING, __VA_ARGS__) #define warn(...) logmsg( LOG_WARNING, __VA_ARGS__)
#define info(...) logmsg( LOG_INFO, __VA_ARGS__) #define info(...) logmsg( LOG_INFO, __VA_ARGS__)
#define debug(...) logmsg( LOG_DEBUG, __VA_ARGS__) #define debug(...) logmsg( LOG_DEBUG, __VA_ARGS__)
#define err_perror(...) logmsg_perror( LOG_ERR, __VA_ARGS__)
#define warn_perror(...) logmsg_perror( LOG_WARNING, __VA_ARGS__)
#define info_perror(...) logmsg_perror( LOG_INFO, __VA_ARGS__)
#define debug_perror(...) logmsg_perror( LOG_DEBUG, __VA_ARGS__)
#define die(...) \ #define die(...) \
do { \ do { \
err(__VA_ARGS__); \ err(__VA_ARGS__); \
exit(EXIT_FAILURE); \ exit(EXIT_FAILURE); \
} while (0) } while (0)
#define die_perror(...) \
do { \
err_perror(__VA_ARGS__); \
exit(EXIT_FAILURE); \
} while (0)
extern int log_trace; extern int log_trace;
extern bool log_conf_parsed; extern bool log_conf_parsed;
extern bool log_runtime; extern bool log_runtime;