aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2016-03-16 11:09:36 +0000
committerPeter Maydell <peter.maydell@linaro.org>2016-03-16 11:09:36 +0000
commit6aeda86890a6c36e0538004e378cb647b51035f0 (patch)
treeb8db8a58eae41fab8346ff00c147a9424bf9c73a
parentcad0b273e58842fa9d06f5b53d588fbe5e146852 (diff)
parent20e2dec14954568848ad74e73aee9b3aeedd6584 (diff)
Merge remote-tracking branch 'remotes/armbru/tags/pull-error-2016-03-16' into staging
Error reporting patches for 2016-03-16 # gpg: Signature made Wed 16 Mar 2016 09:57:00 GMT using RSA key ID EB918653 # gpg: Good signature from "Markus Armbruster <armbru@redhat.com>" # gpg: aka "Markus Armbruster <armbru@pond.sub.org>" * remotes/armbru/tags/pull-error-2016-03-16: error: ensure errno detail is printed with error_abort Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
-rw-r--r--util/error.c40
1 files changed, 19 insertions, 21 deletions
diff --git a/util/error.c b/util/error.c
index 471b8b3c1e..47f93afe5f 100644
--- a/util/error.c
+++ b/util/error.c
@@ -44,7 +44,8 @@ static void error_handle_fatal(Error **errp, Error *err)
static void error_setv(Error **errp,
const char *src, int line, const char *func,
- ErrorClass err_class, const char *fmt, va_list ap)
+ ErrorClass err_class, const char *fmt, va_list ap,
+ const char *suffix)
{
Error *err;
int saved_errno = errno;
@@ -56,6 +57,11 @@ static void error_setv(Error **errp,
err = g_malloc0(sizeof(*err));
err->msg = g_strdup_vprintf(fmt, ap);
+ if (suffix) {
+ char *msg = err->msg;
+ err->msg = g_strdup_printf("%s: %s", msg, suffix);
+ g_free(msg);
+ }
err->err_class = err_class;
err->src = src;
err->line = line;
@@ -74,7 +80,7 @@ void error_set_internal(Error **errp,
va_list ap;
va_start(ap, fmt);
- error_setv(errp, src, line, func, err_class, fmt, ap);
+ error_setv(errp, src, line, func, err_class, fmt, ap, NULL);
va_end(ap);
}
@@ -85,7 +91,7 @@ void error_setg_internal(Error **errp,
va_list ap;
va_start(ap, fmt);
- error_setv(errp, src, line, func, ERROR_CLASS_GENERIC_ERROR, fmt, ap);
+ error_setv(errp, src, line, func, ERROR_CLASS_GENERIC_ERROR, fmt, ap, NULL);
va_end(ap);
}
@@ -94,7 +100,6 @@ void error_setg_errno_internal(Error **errp,
int os_errno, const char *fmt, ...)
{
va_list ap;
- char *msg;
int saved_errno = errno;
if (errp == NULL) {
@@ -102,15 +107,10 @@ void error_setg_errno_internal(Error **errp,
}
va_start(ap, fmt);
- error_setv(errp, src, line, func, ERROR_CLASS_GENERIC_ERROR, fmt, ap);
+ error_setv(errp, src, line, func, ERROR_CLASS_GENERIC_ERROR, fmt, ap,
+ os_errno != 0 ? strerror(os_errno) : NULL);
va_end(ap);
- if (os_errno != 0) {
- msg = (*errp)->msg;
- (*errp)->msg = g_strdup_printf("%s: %s", msg, strerror(os_errno));
- g_free(msg);
- }
-
errno = saved_errno;
}
@@ -174,24 +174,22 @@ void error_setg_win32_internal(Error **errp,
int win32_err, const char *fmt, ...)
{
va_list ap;
- char *msg1, *msg2;
+ char *suffix = NULL;
if (errp == NULL) {
return;
}
+ if (win32_err != 0) {
+ suffix = g_win32_error_message(win32_err);
+ }
+
va_start(ap, fmt);
- error_setv(errp, src, line, func, ERROR_CLASS_GENERIC_ERROR, fmt, ap);
+ error_setv(errp, src, line, func, ERROR_CLASS_GENERIC_ERROR,
+ fmt, ap, suffix);
va_end(ap);
- if (win32_err != 0) {
- msg1 = (*errp)->msg;
- msg2 = g_win32_error_message(win32_err);
- (*errp)->msg = g_strdup_printf("%s: %s (error: %x)", msg1, msg2,
- (unsigned)win32_err);
- g_free(msg2);
- g_free(msg1);
- }
+ g_free(suffix);
}
#endif