#include "qemu-common.h"
#include "qapi/error.h"
-#include "qapi/qmp/qjson.h"
-#include "qapi/qmp/qdict.h"
-#include "qapi-types.h"
-#include "qapi/qmp/qerror.h"
+#include "qemu/error-report.h"
struct Error
{
ErrorClass err_class;
};
+Error *error_abort;
+
void error_set(Error **errp, ErrorClass err_class, const char *fmt, ...)
{
Error *err;
va_list ap;
+ int saved_errno = errno;
if (errp == NULL) {
return;
va_end(ap);
err->err_class = err_class;
+ if (errp == &error_abort) {
+ error_report_err(err);
+ abort();
+ }
+
*errp = err;
+
+ errno = saved_errno;
}
void error_set_errno(Error **errp, int os_errno, ErrorClass err_class,
Error *err;
char *msg1;
va_list ap;
+ int saved_errno = errno;
if (errp == NULL) {
return;
va_end(ap);
err->err_class = err_class;
+ if (errp == &error_abort) {
+ error_report_err(err);
+ abort();
+ }
+
*errp = err;
+
+ errno = saved_errno;
}
void error_setg_file_open(Error **errp, int os_errno, const char *filename)
va_end(ap);
err->err_class = err_class;
+ if (errp == &error_abort) {
+ error_report_err(err);
+ abort();
+ }
+
*errp = err;
}
return err_new;
}
-bool error_is_set(Error **errp)
-{
- return (errp && *errp);
-}
-
ErrorClass error_get_class(const Error *err)
{
return err->err_class;
return err->msg;
}
+void error_report_err(Error *err)
+{
+ error_report("%s", error_get_pretty(err));
+ error_free(err);
+}
+
void error_free(Error *err)
{
if (err) {
}
}
-void error_propagate(Error **dst_err, Error *local_err)
+void error_propagate(Error **dst_errp, Error *local_err)
{
- if (dst_err && !*dst_err) {
- *dst_err = local_err;
+ if (local_err && dst_errp == &error_abort) {
+ error_report_err(local_err);
+ abort();
+ } else if (dst_errp && !*dst_errp) {
+ *dst_errp = local_err;
} else if (local_err) {
error_free(local_err);
}