From 77e595e7c613c495714d04ce63fb9bce263c29ae Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Mon, 7 Dec 2009 21:37:16 +0100 Subject: QMP: add human-readable description to error response Signed-off-by: Markus Armbruster Signed-off-by: Anthony Liguori --- QMP/qmp-spec.txt | 5 ++++- monitor.c | 1 + qerror.c | 21 ++++++++++++++++----- qerror.h | 2 ++ 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/QMP/qmp-spec.txt b/QMP/qmp-spec.txt index 8429789a9c..1cbd21cd45 100644 --- a/QMP/qmp-spec.txt +++ b/QMP/qmp-spec.txt @@ -102,13 +102,16 @@ completed because of an error condition. The format is: -{ "error": { "class": json-string, "data": json-value }, "id": json-value } +{ "error": { "class": json-string, "data": json-value, "desc": json-string }, + "id": json-value } Where, - The "class" member contains the error class name (eg. "ServiceUnavailable") - The "data" member contains specific error data and is defined in a per-command basis, it will be an empty json-object if the error has no data +- The "desc" member is a human-readable error message. Clients should + not attempt to parse this message. - The "id" member contains the transaction identification associated with the command execution (if issued by the Client) diff --git a/monitor.c b/monitor.c index 16d611e5aa..a38a103e42 100644 --- a/monitor.c +++ b/monitor.c @@ -305,6 +305,7 @@ static void monitor_protocol_emitter(Monitor *mon, QObject *data) } } else { /* error response */ + qdict_put(mon->error->error, "desc", qerror_human(mon->error)); qdict_put(qmp, "error", mon->error->error); QINCREF(mon->error->error); QDECREF(mon->error); diff --git a/qerror.c b/qerror.c index 8ffe4f673b..5f8fc5dec5 100644 --- a/qerror.c +++ b/qerror.c @@ -283,13 +283,11 @@ static const char *append_field(QString *outstr, const QError *qerror, } /** - * qerror_print(): Print QError data + * qerror_human(): Format QError data into human-readable string. * - * This function will print the member 'desc' of the specified QError object, - * it uses qemu_error() for this, so that the output is routed to the right - * place (ie. stderr or Monitor's device). + * Formats according to member 'desc' of the specified QError object. */ -void qerror_print(const QError *qerror) +QString *qerror_human(const QError *qerror) { const char *p; QString *qstring; @@ -309,6 +307,19 @@ void qerror_print(const QError *qerror) } } + return qstring; +} + +/** + * qerror_print(): Print QError data + * + * This function will print the member 'desc' of the specified QError object, + * it uses qemu_error() for this, so that the output is routed to the right + * place (ie. stderr or Monitor's device). + */ +void qerror_print(const QError *qerror) +{ + QString *qstring = qerror_human(qerror); qemu_error("%s\n", qstring_get_str(qstring)); QDECREF(qstring); } diff --git a/qerror.h b/qerror.h index 9462d5cb9d..09e32b9a39 100644 --- a/qerror.h +++ b/qerror.h @@ -13,6 +13,7 @@ #define QERROR_H #include "qdict.h" +#include "qstring.h" #include typedef struct QErrorStringTable { @@ -32,6 +33,7 @@ typedef struct QError { QError *qerror_new(void); QError *qerror_from_info(const char *file, int linenr, const char *func, const char *fmt, va_list *va); +QString *qerror_human(const QError *qerror); void qerror_print(const QError *qerror); QError *qobject_to_qerror(const QObject *obj); -- cgit v1.2.1