From patchwork Wed Aug 24 18:42:56 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anthony Liguori X-Patchwork-Id: 111398 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id CA571B6F00 for ; Thu, 25 Aug 2011 04:43:51 +1000 (EST) Received: from localhost ([::1]:54398 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QwIQV-0000AF-Op for incoming@patchwork.ozlabs.org; Wed, 24 Aug 2011 14:43:47 -0400 Received: from eggs.gnu.org ([140.186.70.92]:46463) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QwIQL-00008r-GT for qemu-devel@nongnu.org; Wed, 24 Aug 2011 14:43:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QwIQJ-0006Mi-E0 for qemu-devel@nongnu.org; Wed, 24 Aug 2011 14:43:37 -0400 Received: from e6.ny.us.ibm.com ([32.97.182.146]:46554) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QwIQJ-0006MQ-Aa for qemu-devel@nongnu.org; Wed, 24 Aug 2011 14:43:35 -0400 Received: from d01relay03.pok.ibm.com (d01relay03.pok.ibm.com [9.56.227.235]) by e6.ny.us.ibm.com (8.14.4/8.13.1) with ESMTP id p7OIJBsx021336 for ; Wed, 24 Aug 2011 14:19:11 -0400 Received: from d01av02.pok.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by d01relay03.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id p7OIhKJB251334 for ; Wed, 24 Aug 2011 14:43:20 -0400 Received: from d01av02.pok.ibm.com (loopback [127.0.0.1]) by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id p7OIhKvN009940 for ; Wed, 24 Aug 2011 15:43:20 -0300 Received: from titi.austin.rr.com (sig-9-48-61-239.mts.ibm.com [9.48.61.239]) by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id p7OIhHuT009550; Wed, 24 Aug 2011 15:43:19 -0300 From: Anthony Liguori To: qemu-devel@nongnu.org Date: Wed, 24 Aug 2011 13:42:56 -0500 Message-Id: <1314211389-28915-2-git-send-email-aliguori@us.ibm.com> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1314211389-28915-1-git-send-email-aliguori@us.ibm.com> References: <1314211389-28915-1-git-send-email-aliguori@us.ibm.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6, seldom 2.4 (older, 4) X-Received-From: 32.97.182.146 Cc: Kevin Wolf , Anthony Liguori , Michael Roth , Luiz Capitulino Subject: [Qemu-devel] [PATCH 01/14] qerror: add qerror_report_err() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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 --- qerror.c | 33 +++++++++++++++++++++++++++++++++ qerror.h | 2 ++ 2 files changed, 35 insertions(+), 0 deletions(-) diff --git a/qerror.c b/qerror.c index 3d64b80..fa647a6 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]; + return; + } + } + + 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__)