aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--qerror.c33
-rw-r--r--qerror.h2
2 files changed, 35 insertions, 0 deletions
diff --git a/qerror.c b/qerror.c
index c591a5443c..68998d4bab 100644
--- a/qerror.c
+++ b/qerror.c
@@ -482,6 +482,39 @@ void qerror_report_internal(const char *file, int linenr, const char *func,
}
}
+/* Evil... */
+struct Error
+{
+ QDict *obj;
+ const char *fmt;
+ char *msg;
+};
+
+void qerror_report_err(Error *err)
+{
+ QError *qerr;
+ int i;
+
+ qerr = qerror_new();
+ loc_save(&qerr->loc);
+ QINCREF(err->obj);
+ qerr->error = err->obj;
+
+ for (i = 0; qerror_table[i].error_fmt; i++) {
+ if (strcmp(qerror_table[i].error_fmt, err->fmt) == 0) {
+ qerr->entry = &qerror_table[i];
+ break;
+ }
+ }
+
+ if (monitor_cur_is_qmp()) {
+ monitor_set_error(cur_mon, qerr);
+ } else {
+ qerror_print(qerr);
+ QDECREF(qerr);
+ }
+}
+
/**
* qobject_to_qerror(): Convert a QObject into a QError
*/
diff --git a/qerror.h b/qerror.h
index d4070015f7..d4bfcfd167 100644
--- a/qerror.h
+++ b/qerror.h
@@ -15,6 +15,7 @@
#include "qdict.h"
#include "qstring.h"
#include "qemu-error.h"
+#include "error.h"
#include <stdarg.h>
typedef struct QErrorStringTable {
@@ -39,6 +40,7 @@ QString *qerror_human(const QError *qerror);
void qerror_print(QError *qerror);
void qerror_report_internal(const char *file, int linenr, const char *func,
const char *fmt, ...) GCC_FMT_ATTR(4, 5);
+void qerror_report_err(Error *err);
QString *qerror_format(const char *fmt, QDict *error);
#define qerror_report(fmt, ...) \
qerror_report_internal(__FILE__, __LINE__, __func__, fmt, ## __VA_ARGS__)