aboutsummaryrefslogtreecommitdiff
path: root/qerror.c
diff options
context:
space:
mode:
authorAnthony Liguori <aliguori@us.ibm.com>2011-09-02 12:34:45 -0500
committerLuiz Capitulino <lcapitulino@redhat.com>2011-10-04 11:00:46 -0300
commit2a82d936a2bda9cb01d05fc91845e82001b78632 (patch)
tree06618c6cc2a367fd98063a2c822b35efd24b8b19 /qerror.c
parentacceb4d99fcdabded6ba432402365adb63205196 (diff)
qerror: add qerror_report_err()
This provides a bridge between Error (new error mechanism) and QError (old error mechanism). Errors can be propagated whereas QError cannot. The minor evilness avoids layering violations. Since QError should go away RSN, it seems like a reasonable hack. Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
Diffstat (limited to 'qerror.c')
-rw-r--r--qerror.c33
1 files changed, 33 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
*/