From 5fa5cc37feb70c21aebc9ee77ade5eb369adea32 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Tue, 11 Jun 2019 11:23:48 +0200 Subject: [PATCH] util: error: Add API for prefixing last set error with a string In some cases we report a low level error message which does not have enough information to see what the problem is. To allow improving on this add an API which will prefix the error message with another error message string which can be used to describe where the error comes from. Signed-off-by: Peter Krempa ACKed-by: Michal Privoznik --- cfg.mk | 1 + src/libvirt_private.syms | 1 + src/util/virerror.c | 38 ++++++++++++++++++++++++++++++++++++++ src/util/virerror.h | 3 +++ 4 files changed, 43 insertions(+) diff --git a/cfg.mk b/cfg.mk index c0c240b2c0..f59cfd6e29 100644 --- a/cfg.mk +++ b/cfg.mk @@ -614,6 +614,7 @@ msg_gen_function += virReportError msg_gen_function += virReportErrorHelper msg_gen_function += virReportSystemError msg_gen_function += xenapiSessionErrorHandler +msg_gen_function += virLastErrorPrefixMessage # Uncomment the following and run "make syntax-check" to see diagnostics # that are not yet marked for translation, but that need to be rewritten diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index c06fa67d6a..48df6bce08 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1832,6 +1832,7 @@ virErrorPreserveLast; virErrorRestore; virErrorSetErrnoFromLastError; virLastErrorIsSystemErrno; +virLastErrorPrefixMessage; virRaiseErrorFull; virRaiseErrorObject; virReportErrorHelper; diff --git a/src/util/virerror.c b/src/util/virerror.c index 67e2bc984e..dfba8c5712 100644 --- a/src/util/virerror.c +++ b/src/util/virerror.c @@ -1461,3 +1461,41 @@ bool virLastErrorIsSystemErrno(int errnum) return false; return true; } + + +/** + * virLastErrorPrefixMessage: + * @fmt: printf-style formatting string + * @...: Arguments for @fmt + * + * Prefixes last error reported with message formatted from @fmt. This is useful + * if the low level error message does not convey enough information to describe + * the problem. + */ +void +virLastErrorPrefixMessage(const char *fmt, ...) +{ + int save_errno = errno; + virErrorPtr err = virGetLastError(); + VIR_AUTOFREE(char *) fmtmsg = NULL; + VIR_AUTOFREE(char *) newmsg = NULL; + va_list args; + + if (!err) + return; + + va_start(args, fmt); + + if (virVasprintfQuiet(&fmtmsg, fmt, args) < 0) + goto cleanup; + + if (virAsprintfQuiet(&newmsg, "%s: %s", fmtmsg, err->message) < 0) + goto cleanup; + + VIR_FREE(err->message); + VIR_STEAL_PTR(err->message, newmsg); + + cleanup: + va_end(args); + errno = save_errno; +} diff --git a/src/util/virerror.h b/src/util/virerror.h index 4cfb0c18dd..fa88217b27 100644 --- a/src/util/virerror.h +++ b/src/util/virerror.h @@ -205,4 +205,7 @@ bool virLastErrorIsSystemErrno(int errnum); void virErrorPreserveLast(virErrorPtr *saveerr); void virErrorRestore(virErrorPtr *savederr); +void virLastErrorPrefixMessage(const char *fmt, ...) + ATTRIBUTE_FMT_PRINTF(1, 2); + VIR_DEFINE_AUTOPTR_FUNC(virError, virFreeError); -- GitLab