diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 17e5eff511..424f086c21 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -809,11 +809,13 @@ virLogMessage; virLogParseDefaultPriority; virLogParseFilters; virLogParseOutputs; +virLogPriorityFromSyslog; virLogReset; virLogSetBufferSize; virLogSetDefaultPriority; virLogSetFromEnv; virLogUnlock; +virLogVMessage; # memory.h diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c index ba17010b99..818bd08f20 100644 --- a/src/node_device/node_device_udev.c +++ b/src/node_device/node_device_udev.c @@ -350,15 +350,36 @@ static int udevGenerateDeviceName(struct udev_device *device, } -static void udevLogFunction(struct udev *udev ATTRIBUTE_UNUSED, - int priority ATTRIBUTE_UNUSED, - const char *file, - int line, - const char *fn, - const char *fmt, - va_list args) +typedef void (*udevLogFunctionPtr)(struct udev *udev, + int priority, + const char *file, + int line, + const char *fn, + const char *format, + va_list args); + +static void +ATTRIBUTE_FMT_PRINTF(6,0) +udevLogFunction(struct udev *udev ATTRIBUTE_UNUSED, + int priority, + const char *file, + int line, + const char *fn, + const char *fmt, + va_list args) { - VIR_ERROR_INT(file, fn, line, fmt, args); + virBuffer buf = VIR_BUFFER_INITIALIZER; + const char *format = NULL; + + virBufferAdd(&buf, fmt, -1); + virBufferTrim(&buf, "\n", -1); + + format = virBufferContentAndReset(&buf); + + virLogVMessage(file, virLogPriorityFromSyslog(priority), + fn, line, 0, format ? format : fmt, args); + + VIR_FREE(format); } @@ -1662,7 +1683,8 @@ static int udevDeviceMonitorStartup(int privileged ATTRIBUTE_UNUSED) * its return value. */ udev = udev_new(); - udev_set_log_fn(udev, udevLogFunction); + /* cast to get rid of missing-format-attribute warning */ + udev_set_log_fn(udev, (udevLogFunctionPtr) udevLogFunction); priv->udev_monitor = udev_monitor_new_from_netlink(udev, "udev"); if (priv->udev_monitor == NULL) { diff --git a/src/util/logging.c b/src/util/logging.c index cdaf86ebfc..ae631a95d7 100644 --- a/src/util/logging.c +++ b/src/util/logging.c @@ -919,6 +919,31 @@ static int virLogAddOutputToSyslog(int priority, const char *ident) { } return 0; } + +int virLogPriorityFromSyslog(int priority) +{ + switch (priority) { + case LOG_EMERG: + case LOG_ALERT: + case LOG_CRIT: + case LOG_ERR: + return VIR_LOG_ERROR; + case LOG_WARNING: + case LOG_NOTICE: + return VIR_LOG_WARN; + case LOG_INFO: + return VIR_LOG_INFO; + case LOG_DEBUG: + return VIR_LOG_DEBUG; + } + return VIR_LOG_ERROR; +} + +#else /* HAVE_SYSLOG_H */ +int virLogPriorityFromSyslog(int priority ATTRIBUTE_UNUSED) +{ + return VIR_LOG_ERROR; +} #endif /* HAVE_SYSLOG_H */ #define IS_SPACE(cur) \ diff --git a/src/util/logging.h b/src/util/logging.h index 256e81699b..bc1355b38b 100644 --- a/src/util/logging.h +++ b/src/util/logging.h @@ -137,6 +137,7 @@ extern int virLogReset(void); extern int virLogParseDefaultPriority(const char *priority); extern int virLogParseFilters(const char *filters); extern int virLogParseOutputs(const char *output); +extern int virLogPriorityFromSyslog(int priority); extern void virLogMessage(const char *category, int priority, const char *funcname, long long linenr, unsigned int flags,