A visible improvement is that "filename" is now included in the output if it's valid.
Reviewed-by: Eric Blake <ebl...@redhat.com> Signed-off-by: Fam Zheng <f...@redhat.com> --- qemu-img.c | 34 ++++++++++------ tests/qemu-iotests/122.out | 96 ++++++++++++++++++++++++++-------------------- 2 files changed, 77 insertions(+), 53 deletions(-) diff --git a/qemu-img.c b/qemu-img.c index 1d19c86..fccddc0 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -25,6 +25,8 @@ #include "qapi/qmp-output-visitor.h" #include "qapi/qmp/qerror.h" #include "qapi/qmp/qjson.h" +#include "qapi/qmp/qint.h" +#include "qapi/qmp/qbool.h" #include "qemu-common.h" #include "qemu/option.h" #include "qemu/error-report.h" @@ -2136,10 +2138,14 @@ static int img_info(int argc, char **argv) static void dump_map_entry(OutputFormat output_format, MapEntry *e, MapEntry *next) { + QString *str; + QObject *obj; + QmpOutputVisitor *ov; + switch (output_format) { case OFORMAT_HUMAN: if (e->data && !e->has_offset) { - error_report("File contains external, encrypted or compressed clusters."); + error_report("File contains encrypted or compressed clusters."); exit(1); } if (e->data && !e->zero) { @@ -2157,20 +2163,26 @@ static void dump_map_entry(OutputFormat output_format, MapEntry *e, } break; case OFORMAT_JSON: - printf("%s{ \"start\": %"PRId64", \"length\": %"PRId64"," - " \"depth\": %"PRId64", \"zero\": %s, \"data\": %s", - (e->start == 0 ? "[" : ",\n"), - e->start, e->length, e->depth, - e->zero ? "true" : "false", - e->data ? "true" : "false"); - if (e->has_offset) { - printf(", \"offset\": %"PRId64"", e->offset); - } - putchar('}'); + ov = qmp_output_visitor_new(); + visit_type_MapEntry(qmp_output_get_visitor(ov), + &e, NULL, &error_abort); + obj = qmp_output_get_qobject(ov); + str = qobject_to_json(obj); + assert(str != NULL); + if (e->start == 0) { + printf("["); + } else { + printf(","); + } + printf("%s\n", qstring_get_str(str)); if (!next) { printf("]\n"); } + + qobject_decref(obj); + qmp_output_visitor_cleanup(ov); + QDECREF(str); break; } } diff --git a/tests/qemu-iotests/122.out b/tests/qemu-iotests/122.out index 0068e96..760759e 100644 --- a/tests/qemu-iotests/122.out +++ b/tests/qemu-iotests/122.out @@ -49,12 +49,13 @@ read 65536/65536 bytes at offset 4194304 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 65536/65536 bytes at offset 8388608 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -[{ "start": 0, "length": 65536, "depth": 0, "zero": false, "data": true}, -{ "start": 65536, "length": 4128768, "depth": 0, "zero": true, "data": false}, -{ "start": 4194304, "length": 65536, "depth": 0, "zero": false, "data": true}, -{ "start": 4259840, "length": 4128768, "depth": 0, "zero": true, "data": false}, -{ "start": 8388608, "length": 65536, "depth": 0, "zero": false, "data": true}, -{ "start": 8454144, "length": 4128768, "depth": 0, "zero": true, "data": false}] +[{"length": 65536, "start": 0, "zero": false, "depth": 0, "data": true} +,{"length": 4128768, "start": 65536, "zero": true, "depth": 0, "data": false} +,{"length": 65536, "start": 4194304, "zero": false, "depth": 0, "data": true} +,{"length": 4128768, "start": 4259840, "zero": true, "depth": 0, "data": false} +,{"length": 65536, "start": 8388608, "zero": false, "depth": 0, "data": true} +,{"length": 4128768, "start": 8454144, "zero": true, "depth": 0, "data": false} +] read 65536/65536 bytes at offset 0 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 65536/65536 bytes at offset 4194304 @@ -76,12 +77,13 @@ wrote 1024/1024 bytes at offset 1046528 1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) wrote 1024/1024 bytes at offset 0 1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -[{ "start": 0, "length": 65536, "depth": 0, "zero": false, "data": true}, -{ "start": 65536, "length": 65536, "depth": 0, "zero": true, "data": false}, -{ "start": 131072, "length": 196608, "depth": 0, "zero": false, "data": true}, -{ "start": 327680, "length": 655360, "depth": 0, "zero": true, "data": false}, -{ "start": 983040, "length": 65536, "depth": 0, "zero": false, "data": true}, -{ "start": 1048576, "length": 1046528, "depth": 0, "zero": true, "data": false}] +[{"length": 65536, "start": 0, "zero": false, "depth": 0, "data": true} +,{"length": 65536, "start": 65536, "zero": true, "depth": 0, "data": false} +,{"length": 196608, "start": 131072, "zero": false, "depth": 0, "data": true} +,{"length": 655360, "start": 327680, "zero": true, "depth": 0, "data": false} +,{"length": 65536, "start": 983040, "zero": false, "depth": 0, "data": true} +,{"length": 1046528, "start": 1048576, "zero": true, "depth": 0, "data": false} +] read 16384/16384 bytes at offset 0 16 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 16384/16384 bytes at offset 16384 @@ -112,16 +114,18 @@ read 3145728/3145728 bytes at offset 0 3 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 63963136/63963136 bytes at offset 3145728 61 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -[{ "start": 0, "length": 6291456, "depth": 0, "zero": false, "data": true, "offset": 327680}, -{ "start": 6291456, "length": 60817408, "depth": 0, "zero": true, "data": false}] +[{"length": 6291456, "start": 0, "zero": false, "offset": 327680, "filename": "TEST_DIR/t.IMGFMT.orig", "depth": 0, "data": true} +,{"length": 60817408, "start": 6291456, "zero": true, "filename": "TEST_DIR/t.IMGFMT.orig", "depth": 0, "data": false} +] convert -c -S 0: read 3145728/3145728 bytes at offset 0 3 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 63963136/63963136 bytes at offset 3145728 61 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -[{ "start": 0, "length": 6291456, "depth": 0, "zero": false, "data": true}, -{ "start": 6291456, "length": 60817408, "depth": 0, "zero": true, "data": false}] +[{"length": 6291456, "start": 0, "zero": false, "depth": 0, "data": true} +,{"length": 60817408, "start": 6291456, "zero": true, "depth": 0, "data": false} +] Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=67108864 wrote 33554432/33554432 bytes at offset 0 32 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) @@ -136,7 +140,8 @@ read 30408704/30408704 bytes at offset 3145728 29 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 33554432/33554432 bytes at offset 33554432 32 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -[{ "start": 0, "length": 67108864, "depth": 0, "zero": false, "data": true, "offset": 327680}] +[{"length": 67108864, "start": 0, "zero": false, "offset": 327680, "filename": "TEST_DIR/t.IMGFMT.orig", "depth": 0, "data": true} +] convert -c -S 0 with source backing file: read 3145728/3145728 bytes at offset 0 @@ -145,7 +150,8 @@ read 30408704/30408704 bytes at offset 3145728 29 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 33554432/33554432 bytes at offset 33554432 32 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -[{ "start": 0, "length": 67108864, "depth": 0, "zero": false, "data": true}] +[{"length": 67108864, "start": 0, "zero": false, "depth": 0, "data": true} +] convert -S 0 -B ... read 3145728/3145728 bytes at offset 0 @@ -154,7 +160,8 @@ read 30408704/30408704 bytes at offset 3145728 29 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 33554432/33554432 bytes at offset 33554432 32 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -[{ "start": 0, "length": 67108864, "depth": 0, "zero": false, "data": true, "offset": 327680}] +[{"length": 67108864, "start": 0, "zero": false, "offset": 327680, "filename": "TEST_DIR/t.IMGFMT.orig", "depth": 0, "data": true} +] convert -c -S 0 -B ... read 3145728/3145728 bytes at offset 0 @@ -163,7 +170,8 @@ read 30408704/30408704 bytes at offset 3145728 29 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 33554432/33554432 bytes at offset 33554432 32 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -[{ "start": 0, "length": 67108864, "depth": 0, "zero": false, "data": true}] +[{"length": 67108864, "start": 0, "zero": false, "depth": 0, "data": true} +] === Non-zero -S === @@ -178,32 +186,36 @@ wrote 1024/1024 bytes at offset 17408 1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) convert -S 4k -[{ "start": 0, "length": 1024, "depth": 0, "zero": false, "data": true, "offset": 8192}, -{ "start": 1024, "length": 7168, "depth": 0, "zero": true, "data": false}, -{ "start": 8192, "length": 1024, "depth": 0, "zero": false, "data": true, "offset": 9216}, -{ "start": 9216, "length": 8192, "depth": 0, "zero": true, "data": false}, -{ "start": 17408, "length": 1024, "depth": 0, "zero": false, "data": true, "offset": 10240}, -{ "start": 18432, "length": 67090432, "depth": 0, "zero": true, "data": false}] +[{"length": 1024, "start": 0, "zero": false, "offset": 8192, "filename": "TEST_DIR/t.IMGFMT.orig", "depth": 0, "data": true} +,{"length": 7168, "start": 1024, "zero": true, "filename": "TEST_DIR/t.IMGFMT.orig", "depth": 0, "data": false} +,{"length": 1024, "start": 8192, "zero": false, "offset": 9216, "filename": "TEST_DIR/t.IMGFMT.orig", "depth": 0, "data": true} +,{"length": 8192, "start": 9216, "zero": true, "filename": "TEST_DIR/t.IMGFMT.orig", "depth": 0, "data": false} +,{"length": 1024, "start": 17408, "zero": false, "offset": 10240, "filename": "TEST_DIR/t.IMGFMT.orig", "depth": 0, "data": true} +,{"length": 67090432, "start": 18432, "zero": true, "filename": "TEST_DIR/t.IMGFMT.orig", "depth": 0, "data": false} +] convert -c -S 4k -[{ "start": 0, "length": 1024, "depth": 0, "zero": false, "data": true}, -{ "start": 1024, "length": 7168, "depth": 0, "zero": true, "data": false}, -{ "start": 8192, "length": 1024, "depth": 0, "zero": false, "data": true}, -{ "start": 9216, "length": 8192, "depth": 0, "zero": true, "data": false}, -{ "start": 17408, "length": 1024, "depth": 0, "zero": false, "data": true}, -{ "start": 18432, "length": 67090432, "depth": 0, "zero": true, "data": false}] +[{"length": 1024, "start": 0, "zero": false, "depth": 0, "data": true} +,{"length": 7168, "start": 1024, "zero": true, "depth": 0, "data": false} +,{"length": 1024, "start": 8192, "zero": false, "depth": 0, "data": true} +,{"length": 8192, "start": 9216, "zero": true, "depth": 0, "data": false} +,{"length": 1024, "start": 17408, "zero": false, "depth": 0, "data": true} +,{"length": 67090432, "start": 18432, "zero": true, "depth": 0, "data": false} +] convert -S 8k -[{ "start": 0, "length": 9216, "depth": 0, "zero": false, "data": true, "offset": 8192}, -{ "start": 9216, "length": 8192, "depth": 0, "zero": true, "data": false}, -{ "start": 17408, "length": 1024, "depth": 0, "zero": false, "data": true, "offset": 17408}, -{ "start": 18432, "length": 67090432, "depth": 0, "zero": true, "data": false}] +[{"length": 9216, "start": 0, "zero": false, "offset": 8192, "filename": "TEST_DIR/t.IMGFMT.orig", "depth": 0, "data": true} +,{"length": 8192, "start": 9216, "zero": true, "filename": "TEST_DIR/t.IMGFMT.orig", "depth": 0, "data": false} +,{"length": 1024, "start": 17408, "zero": false, "offset": 17408, "filename": "TEST_DIR/t.IMGFMT.orig", "depth": 0, "data": true} +,{"length": 67090432, "start": 18432, "zero": true, "filename": "TEST_DIR/t.IMGFMT.orig", "depth": 0, "data": false} +] convert -c -S 8k -[{ "start": 0, "length": 1024, "depth": 0, "zero": false, "data": true}, -{ "start": 1024, "length": 7168, "depth": 0, "zero": true, "data": false}, -{ "start": 8192, "length": 1024, "depth": 0, "zero": false, "data": true}, -{ "start": 9216, "length": 8192, "depth": 0, "zero": true, "data": false}, -{ "start": 17408, "length": 1024, "depth": 0, "zero": false, "data": true}, -{ "start": 18432, "length": 67090432, "depth": 0, "zero": true, "data": false}] +[{"length": 1024, "start": 0, "zero": false, "depth": 0, "data": true} +,{"length": 7168, "start": 1024, "zero": true, "depth": 0, "data": false} +,{"length": 1024, "start": 8192, "zero": false, "depth": 0, "data": true} +,{"length": 8192, "start": 9216, "zero": true, "depth": 0, "data": false} +,{"length": 1024, "start": 17408, "zero": false, "depth": 0, "data": true} +,{"length": 67090432, "start": 18432, "zero": true, "depth": 0, "data": false} +] *** done -- 2.4.3