* [PATCH] xl: make "xl list -l" proper JSON
@ 2012-08-15 16:03 Ian Campbell
2012-08-23 18:13 ` Ian Jackson
0 siblings, 1 reply; 2+ messages in thread
From: Ian Campbell @ 2012-08-15 16:03 UTC (permalink / raw)
To: xen-devel; +Cc: waldi, ian.jackson
# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1345046605 -3600
# Node ID add1552b607e014717f9e48bff61606bc62ff269
# Parent 7cec0543f67cefe3755bbad0c2262fa2e820d746
xl: make "xl list -l" proper JSON
Bastian Blank reports that the output of this command is just multiple
JSON objects concatenated and is not a single properly formed JSON
object.
Fix this by wrapping in an array. This turned out to be a bit more
intrusive than I was expecting due to the requirement to keep
supporting the SXP output mode.
Python's json module is happy to parse the result...
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
diff -r 7cec0543f67c -r add1552b607e tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c Wed Aug 15 16:58:21 2012 +0100
+++ b/tools/libxl/xl_cmdimpl.c Wed Aug 15 17:03:25 2012 +0100
@@ -320,23 +320,10 @@ static void dolog(const char *file, int
free(s);
}
-static void printf_info(enum output_format output_format,
- int domid,
- libxl_domain_config *d_config)
-{
- if (output_format == OUTPUT_FORMAT_SXP)
- return printf_info_sexp(domid, d_config);
-
- const char *buf;
- libxl_yajl_length len = 0;
+static yajl_gen_status printf_info_one_json(yajl_gen hand, int domid,
+ libxl_domain_config *d_config)
+{
yajl_gen_status s;
- yajl_gen hand;
-
- hand = libxl_yajl_gen_alloc(NULL);
- if (!hand) {
- fprintf(stderr, "unable to allocate JSON generator\n");
- return;
- }
s = yajl_gen_map_open(hand);
if (s != yajl_gen_status_ok)
@@ -365,6 +352,31 @@ static void printf_info(enum output_form
if (s != yajl_gen_status_ok)
goto out;
+out:
+ return s;
+}
+static void printf_info(enum output_format output_format,
+ int domid,
+ libxl_domain_config *d_config)
+{
+ if (output_format == OUTPUT_FORMAT_SXP)
+ return printf_info_sexp(domid, d_config);
+
+ const char *buf;
+ libxl_yajl_length len = 0;
+ yajl_gen_status s;
+ yajl_gen hand;
+
+ hand = libxl_yajl_gen_alloc(NULL);
+ if (!hand) {
+ fprintf(stderr, "unable to allocate JSON generator\n");
+ return;
+ }
+
+ s = printf_info_one_json(hand, domid, d_config);
+ if (s != yajl_gen_status_ok)
+ goto out;
+
s = yajl_gen_get_buf(hand, (const unsigned char **)&buf, &len);
if (s != yajl_gen_status_ok)
goto out;
@@ -2679,6 +2691,24 @@ static void list_domains_details(const l
uint8_t *data;
int i, len, rc;
+ yajl_gen hand;
+ yajl_gen_status s;
+ const char *buf;
+ libxl_yajl_length yajl_len = 0;
+
+ if (default_output_format == OUTPUT_FORMAT_JSON) {
+ hand = libxl_yajl_gen_alloc(NULL);
+ if (!hand) {
+ fprintf(stderr, "unable to allocate JSON generator\n");
+ return;
+ }
+
+ s = yajl_gen_array_open(hand);
+ if (s != yajl_gen_status_ok)
+ goto out;
+ } else
+ s = yajl_gen_status_ok;
+
for (i = 0; i < nb_domain; i++) {
/* no detailed info available on dom0 */
if (info[i].domid == 0)
@@ -2689,10 +2719,35 @@ static void list_domains_details(const l
CHK_ERRNO(asprintf(&config_source, "<domid %d data>", info[i].domid));
libxl_domain_config_init(&d_config);
parse_config_data(config_source, (char *)data, len, &d_config, NULL);
- printf_info(default_output_format, info[i].domid, &d_config);
+ if (default_output_format == OUTPUT_FORMAT_SXP)
+ printf_info_sexp(domid, &d_config);
+ else
+ s = printf_info_one_json(hand, info[i].domid, &d_config);
libxl_domain_config_dispose(&d_config);
free(data);
free(config_source);
+ if (s != yajl_gen_status_ok)
+ goto out;
+ }
+
+ if (default_output_format == OUTPUT_FORMAT_JSON) {
+ s = yajl_gen_array_close(hand);
+ if (s != yajl_gen_status_ok)
+ goto out;
+
+ s = yajl_gen_get_buf(hand, (const unsigned char **)&buf, &yajl_len);
+ if (s != yajl_gen_status_ok)
+ goto out;
+
+ puts(buf);
+ }
+
+out:
+ if (default_output_format == OUTPUT_FORMAT_JSON) {
+ yajl_gen_free(hand);
+ if (s != yajl_gen_status_ok)
+ fprintf(stderr,
+ "unable to format domain config as JSON (YAJL:%d)\n", s);
}
}
^ permalink raw reply [flat|nested] 2+ messages in thread* Re: [PATCH] xl: make "xl list -l" proper JSON
2012-08-15 16:03 [PATCH] xl: make "xl list -l" proper JSON Ian Campbell
@ 2012-08-23 18:13 ` Ian Jackson
0 siblings, 0 replies; 2+ messages in thread
From: Ian Jackson @ 2012-08-23 18:13 UTC (permalink / raw)
To: Ian Campbell; +Cc: waldi@debian.org, xen-devel@lists.xen.org
Ian Campbell writes ("[PATCH] xl: make "xl list -l" proper JSON"):
> xl: make "xl list -l" proper JSON
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
Although ...
> + yajl_gen_status s;
...
> + if (default_output_format == OUTPUT_FORMAT_JSON) {
...
> + s = yajl_gen_array_open(hand);
> + if (s != yajl_gen_status_ok)
> + goto out;
> + } else
> + s = yajl_gen_status_ok;
... I found that bit rather confusing (the handling of s) and had to
go and double-check the context. It looks right though.
Ian.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2012-08-23 18:13 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-08-15 16:03 [PATCH] xl: make "xl list -l" proper JSON Ian Campbell
2012-08-23 18:13 ` Ian Jackson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).