提交 5fa5cc37 编写于 作者: P Peter Krempa

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: NPeter Krempa <pkrempa@redhat.com>
ACKed-by: NMichal Privoznik <mprivozn@redhat.com>
上级 3203681e
......@@ -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
......
......@@ -1832,6 +1832,7 @@ virErrorPreserveLast;
virErrorRestore;
virErrorSetErrnoFromLastError;
virLastErrorIsSystemErrno;
virLastErrorPrefixMessage;
virRaiseErrorFull;
virRaiseErrorObject;
virReportErrorHelper;
......
......@@ -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;
}
......@@ -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);
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册