[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 02/15] qerror: add qerror_report_err() (v2)
From: |
Anthony Liguori |
Subject: |
[Qemu-devel] [PATCH 02/15] qerror: add qerror_report_err() (v2) |
Date: |
Fri, 2 Sep 2011 12:34:45 -0500 |
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 <address@hidden>
---
v1 -> v2
- Fix propagation of error to the monitor (Luiz)
---
qerror.c | 33 +++++++++++++++++++++++++++++++++
qerror.h | 2 ++
2 files changed, 35 insertions(+), 0 deletions(-)
diff --git a/qerror.c b/qerror.c
index 3d64b80..c2823ac 100644
--- a/qerror.c
+++ b/qerror.c
@@ -478,6 +478,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 8058456..4fe24aa 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__)
--
1.7.4.1
- [Qemu-devel] [PATCH 00/15] Convert commands to QAPI (batch 1) (v2), Anthony Liguori, 2011/09/02
- [Qemu-devel] [PATCH 01/15] error: let error_is_type take a NULL error, Anthony Liguori, 2011/09/02
- [Qemu-devel] [PATCH 02/15] qerror: add qerror_report_err() (v2),
Anthony Liguori <=
- [Qemu-devel] [PATCH 03/15] qapi: add code generation support for middle mode, Anthony Liguori, 2011/09/02
- [Qemu-devel] [PATCH 04/15] qapi: use middle mode in QMP server (v2), Anthony Liguori, 2011/09/02
- [Qemu-devel] [PATCH 05/15] qapi: convert query-name, Anthony Liguori, 2011/09/02
- [Qemu-devel] [PATCH 07/15] monitor: expose readline state, Anthony Liguori, 2011/09/02
- [Qemu-devel] [PATCH 08/15] qerror: add additional parameter to QERR_DEVICE_ENCRYPTED, Anthony Liguori, 2011/09/02
- [Qemu-devel] [PATCH 06/15] block: add unsafe_probe, Anthony Liguori, 2011/09/02
- [Qemu-devel] [PATCH 09/15] qapi: convert eject (qmp and hmp) to QAPI, Anthony Liguori, 2011/09/02
- [Qemu-devel] [PATCH 10/15] qapi: convert block_passwd and add set-blockdev-password, Anthony Liguori, 2011/09/02
- [Qemu-devel] [PATCH 11/15] qapi: add change-vnc-password (v2), Anthony Liguori, 2011/09/02