mirror of https://github.com/proxmox/mirror_qemu
error: De-duplicate code creating Error objects
Duplicated when commitmaster680d16d
added error_set_errno(), and again when commit20840d4
added error_set_win32(). Make the original copy in error_set() reusable by factoring out error_setv(), then rewrite error_set_errno() and error_set_win32() on top of it. Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com>
parent
fc04a730b7
commit
552375088a
68
util/error.c
68
util/error.c
|
@ -22,10 +22,10 @@ struct Error
|
||||||
|
|
||||||
Error *error_abort;
|
Error *error_abort;
|
||||||
|
|
||||||
void error_set(Error **errp, ErrorClass err_class, const char *fmt, ...)
|
static void error_setv(Error **errp, ErrorClass err_class,
|
||||||
|
const char *fmt, va_list ap)
|
||||||
{
|
{
|
||||||
Error *err;
|
Error *err;
|
||||||
va_list ap;
|
|
||||||
int saved_errno = errno;
|
int saved_errno = errno;
|
||||||
|
|
||||||
if (errp == NULL) {
|
if (errp == NULL) {
|
||||||
|
@ -34,10 +34,7 @@ void error_set(Error **errp, ErrorClass err_class, const char *fmt, ...)
|
||||||
assert(*errp == NULL);
|
assert(*errp == NULL);
|
||||||
|
|
||||||
err = g_malloc0(sizeof(*err));
|
err = g_malloc0(sizeof(*err));
|
||||||
|
|
||||||
va_start(ap, fmt);
|
|
||||||
err->msg = g_strdup_vprintf(fmt, ap);
|
err->msg = g_strdup_vprintf(fmt, ap);
|
||||||
va_end(ap);
|
|
||||||
err->err_class = err_class;
|
err->err_class = err_class;
|
||||||
|
|
||||||
if (errp == &error_abort) {
|
if (errp == &error_abort) {
|
||||||
|
@ -50,39 +47,36 @@ void error_set(Error **errp, ErrorClass err_class, const char *fmt, ...)
|
||||||
errno = saved_errno;
|
errno = saved_errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void error_set(Error **errp, ErrorClass err_class, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
error_setv(errp, err_class, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
|
||||||
void error_set_errno(Error **errp, int os_errno, ErrorClass err_class,
|
void error_set_errno(Error **errp, int os_errno, ErrorClass err_class,
|
||||||
const char *fmt, ...)
|
const char *fmt, ...)
|
||||||
{
|
{
|
||||||
Error *err;
|
|
||||||
char *msg1;
|
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
char *msg;
|
||||||
int saved_errno = errno;
|
int saved_errno = errno;
|
||||||
|
|
||||||
if (errp == NULL) {
|
if (errp == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
assert(*errp == NULL);
|
|
||||||
|
|
||||||
err = g_malloc0(sizeof(*err));
|
|
||||||
|
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
msg1 = g_strdup_vprintf(fmt, ap);
|
error_setv(errp, err_class, fmt, ap);
|
||||||
if (os_errno != 0) {
|
|
||||||
err->msg = g_strdup_printf("%s: %s", msg1, strerror(os_errno));
|
|
||||||
g_free(msg1);
|
|
||||||
} else {
|
|
||||||
err->msg = msg1;
|
|
||||||
}
|
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
err->err_class = err_class;
|
|
||||||
|
|
||||||
if (errp == &error_abort) {
|
if (os_errno != 0) {
|
||||||
error_report_err(err);
|
msg = (*errp)->msg;
|
||||||
abort();
|
(*errp)->msg = g_strdup_printf("%s: %s", msg, strerror(os_errno));
|
||||||
|
g_free(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
*errp = err;
|
|
||||||
|
|
||||||
errno = saved_errno;
|
errno = saved_errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,37 +90,25 @@ void error_setg_file_open(Error **errp, int os_errno, const char *filename)
|
||||||
void error_set_win32(Error **errp, int win32_err, ErrorClass err_class,
|
void error_set_win32(Error **errp, int win32_err, ErrorClass err_class,
|
||||||
const char *fmt, ...)
|
const char *fmt, ...)
|
||||||
{
|
{
|
||||||
Error *err;
|
|
||||||
char *msg1;
|
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
char *msg1, *msg2;
|
||||||
|
|
||||||
if (errp == NULL) {
|
if (errp == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
assert(*errp == NULL);
|
|
||||||
|
|
||||||
err = g_malloc0(sizeof(*err));
|
|
||||||
|
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
msg1 = g_strdup_vprintf(fmt, ap);
|
error_setv(errp, err_class, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
if (win32_err != 0) {
|
if (win32_err != 0) {
|
||||||
char *msg2 = g_win32_error_message(win32_err);
|
msg1 = (*errp)->msg;
|
||||||
err->msg = g_strdup_printf("%s: %s (error: %x)", msg1, msg2,
|
msg2 = g_win32_error_message(win32_err);
|
||||||
(unsigned)win32_err);
|
(*errp)->msg = g_strdup_printf("%s: %s (error: %x)", msg1, msg2,
|
||||||
|
(unsigned)win32_err);
|
||||||
g_free(msg2);
|
g_free(msg2);
|
||||||
g_free(msg1);
|
g_free(msg1);
|
||||||
} else {
|
|
||||||
err->msg = msg1;
|
|
||||||
}
|
}
|
||||||
va_end(ap);
|
|
||||||
err->err_class = err_class;
|
|
||||||
|
|
||||||
if (errp == &error_abort) {
|
|
||||||
error_report_err(err);
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
*errp = err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue