From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:48574) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QzXe2-0000Il-7D for qemu-devel@nongnu.org; Fri, 02 Sep 2011 13:35:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QzXe0-0001zO-Vy for qemu-devel@nongnu.org; Fri, 02 Sep 2011 13:35:10 -0400 Received: from cpe-70-123-132-139.austin.res.rr.com ([70.123.132.139]:35472 helo=localhost6.localdomain6) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QzXe0-0001yt-NN for qemu-devel@nongnu.org; Fri, 02 Sep 2011 13:35:08 -0400 From: Anthony Liguori Date: Fri, 2 Sep 2011 12:34:45 -0500 Message-Id: <1314984898-19141-3-git-send-email-aliguori@us.ibm.com> In-Reply-To: <1314984898-19141-1-git-send-email-aliguori@us.ibm.com> References: <1314984898-19141-1-git-send-email-aliguori@us.ibm.com> Subject: [Qemu-devel] [PATCH 02/15] qerror: add qerror_report_err() (v2) List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , Anthony Liguori , Michael Roth , Luiz Capitulino 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 --- 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 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