From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41096) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VJIJN-0007yp-5R for qemu-devel@nongnu.org; Tue, 10 Sep 2013 03:24:39 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VJIJH-0006yI-06 for qemu-devel@nongnu.org; Tue, 10 Sep 2013 03:24:33 -0400 Received: from mx1.redhat.com ([209.132.183.28]:16587) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VJIJG-0006y7-Ob for qemu-devel@nongnu.org; Tue, 10 Sep 2013 03:24:26 -0400 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r8A7OQno020764 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 10 Sep 2013 03:24:26 -0400 Message-ID: <522EC927.1030101@redhat.com> Date: Tue, 10 Sep 2013 09:24:23 +0200 From: Max Reitz MIME-Version: 1.0 References: <1378473154-30057-1-git-send-email-mreitz@redhat.com> <1378473154-30057-4-git-send-email-mreitz@redhat.com> <20130910040457.GB8016@T430s.nay.redhat.com> In-Reply-To: <20130910040457.GB8016@T430s.nay.redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v2 3/6] block/qapi: Human-readable ImageInfoSpecific dump List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: famz@redhat.com Cc: Kevin Wolf , qemu-devel@nongnu.org, Stefan Hajnoczi On 2013-09-10 06:04, Fam Zheng wrote: > On Fri, 09/06 15:12, Max Reitz wrote: >> Add a function for generically dumping the ImageInfoSpecific information >> in a human-readable format to block/qapi.c. >> >> Use this function in bdrv_image_info_dump and qemu-io-cmds.c:info_f to >> allow qemu-img info resp. qemu-io -c info to print that format specific >> information. >> >> Signed-off-by: Max Reitz >> --- >> block/qapi.c | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++ >> include/block/qapi.h | 2 + >> qemu-io-cmds.c | 3 ++ >> 3 files changed, 126 insertions(+) >> >> diff --git a/block/qapi.c b/block/qapi.c >> index f13fbd5..4fe45d5 100644 >> --- a/block/qapi.c >> +++ b/block/qapi.c >> @@ -25,6 +25,9 @@ >> #include "block/qapi.h" >> #include "block/block_int.h" >> #include "qmp-commands.h" >> +#include "qapi-visit.h" >> +#include "qapi/qmp-output-visitor.h" >> +#include "qapi/qmp/types.h" >> >> /* >> * Returns 0 on success, with *p_list either set to describe snapshot >> @@ -401,6 +404,119 @@ void bdrv_snapshot_dump(fprintf_function func_fprintf, void *f, >> } >> } >> >> +static void dump_qdict(fprintf_function func_fprintf, void *f, int indentation, >> + QDict *dict); >> +static void dump_qlist(fprintf_function func_fprintf, void *f, int indentation, >> + QList *list); >> + >> +static void dump_qobject(fprintf_function func_fprintf, void *f, >> + int comp_indent, QObject *obj) >> +{ >> + switch (qobject_type(obj)) { >> + case QTYPE_QINT: { >> + QInt *value = qobject_to_qint(obj); >> + func_fprintf(f, "%" PRId64, qint_get_int(value)); >> + break; >> + } >> + case QTYPE_QSTRING: { >> + QString *value = qobject_to_qstring(obj); >> + func_fprintf(f, "%s", qstring_get_str(value)); >> + break; >> + } >> + case QTYPE_QDICT: { >> + QDict *value = qobject_to_qdict(obj); >> + dump_qdict(func_fprintf, f, comp_indent, value); >> + break; >> + } >> + case QTYPE_QLIST: { >> + QList *value = qobject_to_qlist(obj); >> + dump_qlist(func_fprintf, f, comp_indent, value); >> + break; >> + } >> + case QTYPE_QFLOAT: { >> + QFloat *value = qobject_to_qfloat(obj); >> + func_fprintf(f, "%g", qfloat_get_double(value)); >> + break; >> + } >> + case QTYPE_QBOOL: { >> + QBool *value = qobject_to_qbool(obj); >> + func_fprintf(f, "%s", qbool_get_int(value) ? "true" : "false"); >> + break; >> + } >> + case QTYPE_QERROR: { >> + QString *value = qerror_human((QError *)obj); >> + func_fprintf(f, "%s", qstring_get_str(value)); >> + break; >> + } >> + case QTYPE_NONE: >> + break; >> + case QTYPE_MAX: >> + default: >> + abort(); >> + } >> +} >> + >> +static void dump_qlist(fprintf_function func_fprintf, void *f, int indentation, >> + QList *list) >> +{ >> + const QListEntry *entry; >> + int i = 0; >> + >> + for (entry = qlist_first(list); entry; entry = qlist_next(entry), i++) { >> + qtype_code type = qobject_type(entry->value); >> + bool composite = (type == QTYPE_QDICT || type == QTYPE_QLIST); >> + const char *format = composite ? "%*s[%i]:\n" : "%*s[%i]: "; >> + >> + func_fprintf(f, format, indentation * 4, "", i); >> + dump_qobject(func_fprintf, f, indentation + 1, entry->value); >> + if (!composite) { >> + func_fprintf(f, "\n"); >> + } >> + } >> +} >> + >> +static void dump_qdict(fprintf_function func_fprintf, void *f, int indentation, >> + QDict *dict) >> +{ >> + const QDictEntry *entry; >> + >> + for (entry = qdict_first(dict); entry; entry = qdict_next(dict, entry)) { >> + qtype_code type = qobject_type(entry->value); >> + bool composite = (type == QTYPE_QDICT || type == QTYPE_QLIST); >> + const char *format = composite ? "%*s%s:\n" : "%*s%s: "; >> + char key[strlen(entry->key) + 1]; >> + int i; >> + >> + /* replace dashes with spaces in key (variable) names */ >> + for (i = 0; entry->key[i]; i++) { >> + key[i] = entry->key[i] == '-' ? ' ' : entry->key[i]; >> + } >> + key[i] = 0; >> + >> + func_fprintf(f, format, indentation * 4, "", key); >> + dump_qobject(func_fprintf, f, indentation + 1, entry->value); >> + if (!composite) { >> + func_fprintf(f, "\n"); >> + } >> + } >> +} >> + >> +void bdrv_image_info_specific_dump(fprintf_function func_fprintf, void *f, >> + ImageInfoSpecific *info_spec) >> +{ >> + Error *local_err = NULL; >> + QmpOutputVisitor *ov = qmp_output_visitor_new(); >> + QObject *obj, *data; >> + >> + visit_type_ImageInfoSpecific(qmp_output_get_visitor(ov), &info_spec, NULL, >> + &local_err); >> + obj = qmp_output_get_qobject(ov); >> + assert(qobject_type(obj) == QTYPE_QDICT); >> + data = qdict_get(qobject_to_qdict(obj), "data"); >> + dump_qobject(func_fprintf, f, 0, data); >> + qmp_output_visitor_cleanup(ov); >> +} >> + >> void bdrv_image_info_dump(fprintf_function func_fprintf, void *f, >> ImageInfo *info) >> { >> @@ -471,4 +587,9 @@ void bdrv_image_info_dump(fprintf_function func_fprintf, void *f, >> func_fprintf(f, "\n"); >> } >> } >> + >> + if (info->has_format_specific) { >> + func_fprintf(f, "Format specific information:\n"); >> + bdrv_image_info_specific_dump(func_fprintf, f, info->format_specific); >> + } >> } >> diff --git a/include/block/qapi.h b/include/block/qapi.h >> index 0496cc9..9518ee4 100644 >> --- a/include/block/qapi.h >> +++ b/include/block/qapi.h >> @@ -42,6 +42,8 @@ BlockStats *bdrv_query_stats(const BlockDriverState *bs); >> >> void bdrv_snapshot_dump(fprintf_function func_fprintf, void *f, >> QEMUSnapshotInfo *sn); >> +void bdrv_image_info_specific_dump(fprintf_function func_fprintf, void *f, >> + ImageInfoSpecific *info_spec); >> void bdrv_image_info_dump(fprintf_function func_fprintf, void *f, >> ImageInfo *info); >> #endif >> diff --git a/qemu-io-cmds.c b/qemu-io-cmds.c >> index 563dd40..d90ae4a 100644 >> --- a/qemu-io-cmds.c >> +++ b/qemu-io-cmds.c >> @@ -10,6 +10,7 @@ >> >> #include "qemu-io.h" >> #include "block/block_int.h" >> +#include "block/qapi.h" >> #include "qemu/main-loop.h" >> >> #define CMD_NOFILE_OK 0x01 >> @@ -1700,6 +1701,8 @@ static int info_f(BlockDriverState *bs, int argc, char **argv) >> printf("vm state offset: %s\n", s2); >> >> if (bdi.format_specific) { >> + puts("Format specific information:"); > Could use printf for more consistence. Since I'll be resubmitting this series because of patch 2 anyway - I'll change it. > Fam > >> + bdrv_image_info_specific_dump(fprintf, stdout, bdi.format_specific); >> qapi_free_ImageInfoSpecific(bdi.format_specific); >> } >> >> -- >> 1.8.3.1 >> >> Max