error: New error_fatal

Similar to error_abort, but doesn't report where the error was
created, and terminates the process with exit(1) rather than abort().

Backports commit a29a37b994ca3c5a1d39fa0e8934f7e0f2cf57ef from qemu
This commit is contained in:
Markus Armbruster 2018-02-20 08:22:25 -05:00 committed by Lioncash
parent c4a06e2d12
commit 91b4e76fef
No known key found for this signature in database
GPG key ID: 4E3C3CC1031BA9C7
2 changed files with 33 additions and 14 deletions

View file

@ -64,6 +64,9 @@
* Call a function aborting on errors: * Call a function aborting on errors:
* foo(arg, &error_abort); * foo(arg, &error_abort);
* *
* Call a function treating errors as fatal:
* foo(arg, &error_fatal);
*
* Receive an error and pass it on to the caller: * Receive an error and pass it on to the caller:
* Error *err = NULL; * Error *err = NULL;
* foo(arg, &err); * foo(arg, &err);
@ -241,4 +244,10 @@ void error_set_internal(Error **errp,
*/ */
extern Error *error_abort; extern Error *error_abort;
/*
* Special error destination to exit(1) on error.
* See error_setg() and error_propagate() for details.
*/
extern Error *error_fatal;
#endif #endif

View file

@ -2,9 +2,11 @@
* QEMU Error Objects * QEMU Error Objects
* *
* Copyright IBM, Corp. 2011 * Copyright IBM, Corp. 2011
* Copyright (C) 2011-2015 Red Hat, Inc.
* *
* Authors: * Authors:
* Anthony Liguori <aliguori@us.ibm.com> * Anthony Liguori <aliguori@us.ibm.com>
* Markus Armbruster <armbru@redhat.com>,
* *
* This work is licensed under the terms of the GNU LGPL, version 2. See * This work is licensed under the terms of the GNU LGPL, version 2. See
* the COPYING.LIB file in the top-level directory. * the COPYING.LIB file in the top-level directory.
@ -23,14 +25,23 @@ struct Error
}; };
Error *error_abort; Error *error_abort;
Error *error_fatal;
static void error_do_abort(Error *err) static void error_handle_fatal(Error **errp, Error *err)
{ {
if (errp == &error_abort) {
fprintf(stderr, "Unexpected error in %s() at %s:%d:\n", fprintf(stderr, "Unexpected error in %s() at %s:%d:\n",
err->func, err->src, err->line); err->func, err->src, err->line);
// UNICORN: Commented out
// error_report_err(err); // Unicorn: commented out
// abort(); //error_report_err(err);
//abort();
}
if (errp == &error_fatal) {
// Unicorn: commented out
//error_report_err(err);
//exit(1);
}
} }
static void error_setv(Error **errp, static void error_setv(Error **errp,
@ -53,10 +64,7 @@ static void error_setv(Error **errp,
err->line = line; err->line = line;
err->func = func; err->func = func;
if (errp == &error_abort) { error_handle_fatal(errp, err);
error_do_abort(err);
}
*errp = err; *errp = err;
errno = saved_errno; errno = saved_errno;
@ -151,11 +159,13 @@ void error_free(Error *err)
void error_propagate(Error **dst_errp, Error *local_err) void error_propagate(Error **dst_errp, Error *local_err)
{ {
if (local_err && dst_errp == &error_abort) { if (!local_err) {
error_do_abort(local_err); return;
} else if (dst_errp && !*dst_errp) { }
error_handle_fatal(dst_errp, local_err);
if (dst_errp && !*dst_errp) {
*dst_errp = local_err; *dst_errp = local_err;
} else if (local_err) { } else {
error_free(local_err); error_free(local_err);
} }
} }